diff options
| author | Ingo Klöcker <[email protected]> | 2025-02-03 09:49:45 +0000 | 
|---|---|---|
| committer | Ingo Klöcker <[email protected]> | 2025-02-03 10:19:09 +0000 | 
| commit | 932caf37d36eca2caec59bf48bc505364a5765bb (patch) | |
| tree | 3a4781c7ce1f36efb3450893782318ee7906c5ed /lang/python/tests | |
| parent | cpp,qt: Remove C++ and Qt bindings (diff) | |
| download | gpgme-932caf37d36eca2caec59bf48bc505364a5765bb.tar.gz gpgme-932caf37d36eca2caec59bf48bc505364a5765bb.zip | |
python: Remove Python bindings
* README: Update.
* configure.ac: Remove checks, variables and file generations related to
the Python bindings. Remove python from available_languages and
default_languages.
* lang/Makefile.am (DIST_SUBDIRS): Remove python.
* lang/python: Remove.
* m4/ax_pkg_swig.m4, m4/ax_python_devel.m4, m4/python.m4: Remove.
--
The Python bindings have been moved to a separate Git repository:
gpgmepy.
GnuPG-bug-id: 7262
Diffstat (limited to 'lang/python/tests')
33 files changed, 0 insertions, 3634 deletions
| diff --git a/lang/python/tests/Makefile.am b/lang/python/tests/Makefile.am deleted file mode 100644 index 40a26e2a..00000000 --- a/lang/python/tests/Makefile.am +++ /dev/null @@ -1,124 +0,0 @@ -# Makefile.am for the tests of the Python bindings. -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -GPG = gpg -GPG_AGENT = gpg-agent - -test_srcdir = $(top_srcdir)/tests/gpg - -GNUPGHOME=$(abs_builddir) -TESTS_ENVIRONMENT = GNUPGHOME=$(GNUPGHOME) \ -	LC_ALL=C GPG_AGENT_INFO= \ -	top_srcdir=$(top_srcdir) \ -	srcdir=$(srcdir) \ -	LD_LIBRARY_PATH="../../../src/.libs:$(LD_LIBRARY_PATH)" - -py_tests ?= t-wrapper.py \ -	t-callbacks.py \ -	t-data.py \ -	t-encrypt.py \ -	t-encrypt-sym.py \ -	t-encrypt-sign.py \ -	t-sign.py \ -	t-signers.py \ -	t-decrypt.py \ -	t-verify.py \ -	t-decrypt-verify.py \ -	t-sig-notation.py \ -	t-export.py \ -	t-import.py \ -	t-edit.py \ -	t-keylist.py \ -	t-keylist-from-data.py \ -	t-wait.py \ -	t-encrypt-large.py \ -	t-file-name.py \ -	t-idiomatic.py \ -	t-protocol-assuan.py \ -	t-quick-key-creation.py \ -	t-quick-subkey-creation.py \ -	t-quick-key-manipulation.py \ -	t-quick-key-signing.py - -XTESTS = initial.py $(py_tests) final.py -EXTRA_DIST = support.py $(XTESTS) encrypt-only.asc sign-only.asc \ -             run-tests.py - -# XXX: Currently, one cannot override automake's 'check' target.  As a -# workaround, we avoid defining 'TESTS', thus automake will not emit -# the 'check' target.  For extra robustness, we merely define a -# dependency on 'xcheck', so this hack should also work even if -# automake would emit the 'check' target, as adding dependencies to -# targets is okay. -check: xcheck - -.PHONY: xcheck - -xcheck:	all -	$(TESTS_ENVIRONMENT) $(PYTHON) $(srcdir)/run-tests.py \ -	  --interpreters="$(PYTHONS)" --srcdir=$(srcdir) $(TESTFLAGS) \ -	  $(XTESTS) - -CLEANFILES = secring.gpg pubring.gpg pubring.kbx trustdb.gpg dirmngr.conf \ -	gpg-agent.conf pubring.kbx~ gpg.conf pubring.gpg~ \ -	random_seed .gpg-v21-migrated tofu.db \ -        pubring-stamp gpg-sample.stamp - -private_keys = \ -        $(test_srcdir)/13CD0F3BDF24BE53FE192D62F18737256FF6E4FD \ -        $(test_srcdir)/76F7E2B35832976B50A27A282D9B87E44577EB66 \ -        $(test_srcdir)/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD \ -        $(test_srcdir)/13CBE3758AFE42B5E5E2AE4CED27AFA455E3F87F \ -        $(test_srcdir)/7A030357C0F253A5BBCD282FFC4E521B37558F5C - -clean-local: -	-$(TESTS_ENVIRONMENT) $(top_srcdir)/tests/start-stop-agent --stop -	-rm -fR -- private-keys-v1.d openpgp-revocs.d S.gpg-agent sshcontrol - - -BUILT_SOURCES = gpg.conf gpg-agent.conf pubring-stamp \ -           gpg-sample.stamp - -gpg-sample.stamp: $(private_keys) -	-$(TESTS_ENVIRONMENT) gpgconf --kill all -	$(MKDIR_P) ./private-keys-v1.d -	for k in $(private_keys); do \ -          cp $$k private-keys-v1.d/$${k#$(test_srcdir)/}.key; \ -        done -	echo x > ./gpg-sample.stamp - -pubring-stamp: $(test_srcdir)/pubdemo.asc gpg-sample.stamp -	$(TESTS_ENVIRONMENT) $(GPG) --batch --no-permission-warning \ -               --import $(test_srcdir)/pubdemo.asc -	-$(TESTS_ENVIRONMENT) $(GPG) --batch --no-permission-warning \ -		--import $(test_srcdir)/secdemo.asc -	-$(TESTS_ENVIRONMENT) gpgconf --kill all -	echo x > ./pubring-stamp - -gpg.conf: -# This is required for t-sig-notations. -	echo no-force-v3-sigs > ./gpg.conf -	echo default-key A0FF4590BB6122EDEF6E3C542D727CC768697734 >> ./gpg.conf - -gpg-agent.conf: -# This is required for gpg2, which does not support command fd. -	echo pinentry-program $(abs_top_srcdir)/tests/gpg/pinentry >$@ -	echo disable-scdaemon >> $@ - - -# end-of-file diff --git a/lang/python/tests/encrypt-only.asc b/lang/python/tests/encrypt-only.asc deleted file mode 100644 index 6e068a0c..00000000 --- a/lang/python/tests/encrypt-only.asc +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN PGP PRIVATE KEY BLOCK----- -Version: GnuPG v2 - -lQPGBFd/jL0BCAD8jfoblIrlHS0shDCbSiO7RFaT6sEa/6tSPkv6XzBba9oXOkuO -FLTkNpIwPb92U8SOS+27j7n9v6U5NW2tyZwIoeLb8lUyKnCBr22IUhTFVXf7fros -zmPugsJaDBi9f7RL0bqiCn4EV3DGKyAukZklk1k1JV4Ec3dEPMAmL9LmnvXreEjU -pQZZN9sJV32ew8CYkZ6AB8foFQwfxn4x0iUoKvj8kW9RsY1KMPucp4YiFhHeMZW1 -5wGAZdEIZYKyWEp4bi/wC9yn/TUR5uNWc0uVJzQvuHwaYjolPW89DinjBkPEJCBr -RwumaOWfbu/hb51wBoUTmUr9diVw93L2ROLPABEBAAH+BwMC1bmUAoPJKI/WBiHm -P6tSNRLdd+7etfjAFvKL7Ob2pNTrc3hbtyOLIQ9tuEaqXEyfnCms/DCg8QdkaFUv -Nkoj0W5+G/MQuR2jIvrq/wyL/4jIw0AFbp9/V1JbSXZh2g1eJLnnykn7uPxCbDFY -FrVeFmkhoxZ3pid6ZQSWlxXsdW+YMvbUfNIIZpbygI/alIBvbDS1YJYEBDCwFZjU -7quE2Ufxo8dm34EHcmbpYpn4r3DUrU5AHQ2fIprLIVqHn4+NUrR8WZS9nCnIeu/z -OaJUZ2lJFRjUC6Gpsbsw6Xwh4Ntwzyt2SsXc+UVZngjozw3yw0VpDifxMBqcd+9x -baSc7dfbOZF2BCZOwnB7/QrFZDaqe5b3n6rTdj1va/CrJMuxbgaNAjvLpdT2EUPZ -fHDAdPAjASofxBREv+HIKwksuPJ9cvavZU6Q4KQA7buo25hd7yjuba4WbLQhp0jH -AT1P7SdakMhk/IFcUKFdB3ZyZZZ1JTTPa2xZn9yDa3Jb1t7IMLYLwY6EFbjvaxH5 -WEGZvOAq2iEa941mxv4miwgf7MQPx6g9u0+dXc7iZApwWs9MNfJo3J25sKhWK5Be -Bu3w7c6nrlg40GtPuDRgaBvYWbVerJcepTA/EPfugEJtRsDJkt7wZq1H9lWHU7Ih -Up6/+XKtBzlCIqYjorzFLnC721pcKFcPhLgvtjjNJvUsLXbr9CwnBub/eTFcfRb2 -ro60H9cOhf0fQSQyvkZWfzq0BN6rG27G1KhyprsJAmpW0fTHHkB4V19788C2sTQv -D93VU3Nd6MWocwAYtPWmtwXPpuOAU9IcwAvVTxBeBJCXxbH3uyx1frwDXA7lf4Pb -a8hMoMMVU+rAG1uepKI5h4seBIKP7qKEKAPloI6/Vtf7/Ump4DKprS1QpfOW+lsX -aR48lgNR6sQXtDdFbmNyeXB0aW9uIE9ubHkgKHRlc3Qga2V5LCBkbyBub3QgdXNl -KSA8ZW9AZXhhbXBsZS5vcmc+iQE3BBMBCAAhBQJXf4y9AhsNBQsJCAcCBhUICQoL -AgQWAgMBAh4BAheAAAoJEJIFcnabn+Gc/KgH/07wzrsBzTqdI5L6cIqQ81Vq8ASj -tsuYoVfFxymB8F/AxpnLMhYRuWQTcoUHQ/olG2yA0C6o4e1JPAmh6LQGwr0eRnc2 -2tr4cbnQAhXpJ8xOR6kH9eE8nGeC7tlEeeV/Wnj3SLZOXOjYjnA9bA3JX9DP3qcz -w1sKQPEHsGkMJuT0ZadnlJ1qw8AnnNKLDlG4kIO9hz3qB8BjxFZf+j5f/nhFNv5I -pnNdMcDwQqHVrwD6WO+Xmmdykab0awL9To0S9DG9ohcXuJiTMa8vtXFSBM0koUDk -BWajEq+QAcDpmdFsQr4/gbzvHkAIVTQb0seJr4gpmXFZu3TMuGVD9j13GaI= -=38ri ------END PGP PRIVATE KEY BLOCK----- diff --git a/lang/python/tests/final.py b/lang/python/tests/final.py deleted file mode 100755 index 4deb57db..00000000 --- a/lang/python/tests/final.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import subprocess -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -subprocess.check_call([ -    os.path.join(os.getenv('top_srcdir'), "tests", "start-stop-agent"), -    "--stop" -]) diff --git a/lang/python/tests/initial.py b/lang/python/tests/initial.py deleted file mode 100755 index c94e47eb..00000000 --- a/lang/python/tests/initial.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import subprocess -import gpg -import support - -del absolute_import, print_function, unicode_literals - -print("Using gpg module from {0!r}.".format(os.path.dirname(gpg.__file__))) - -subprocess.check_call([ -    os.path.join(os.getenv('top_srcdir'), "tests", "start-stop-agent"), -    "--start" -]) - -with gpg.Context() as c: -    alpha = c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False) -    bob = c.get_key("D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", False) - -    # Mark alpha as trusted.  The signature verification tests expect -    # this. -    support.mark_key_trusted(c, alpha) - -    c.op_import(open(support.in_srcdir("encrypt-only.asc"))) -    c.op_import(open(support.in_srcdir("sign-only.asc"))) diff --git a/lang/python/tests/run-tests.py b/lang/python/tests/run-tests.py deleted file mode 100644 index 3a168f4d..00000000 --- a/lang/python/tests/run-tests.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, division -from __future__ import print_function, unicode_literals - -import argparse -import glob -import os -import subprocess -import sys - -del absolute_import, division, print_function, unicode_literals - - -class SplitAndAccumulate(argparse.Action): -    def __call__(self, parser, namespace, values, option_string=None): -        current = getattr(namespace, self.dest, list()) -        current.extend(values.split()) -        setattr(namespace, self.dest, current) - - -parser = argparse.ArgumentParser(description='Run tests.') -parser.add_argument( -    'tests', metavar='TEST', type=str, nargs='+', help='A test to run') -parser.add_argument( -    '-v', '--verbose', action="store_true", default=False, help='Be verbose.') -parser.add_argument( -    '-q', '--quiet', action="store_true", default=False, help='Be quiet.') -parser.add_argument( -    '--interpreters', -    metavar='PYTHON', -    type=str, -    default=[], -    action=SplitAndAccumulate, -    help='Use these interpreters to run the tests, ' + 'separated by spaces.') -parser.add_argument( -    '--srcdir', -    type=str, -    default=os.environ.get("srcdir", ""), -    help='Location of the tests.') -parser.add_argument( -    '--builddir', -    type=str, -    default=os.environ.get("abs_builddir", ""), -    help='Location of the tests.') -parser.add_argument( -    '--python-libdir', -    type=str, -    default=None, -    help='Optional location of the in-tree module lib directory.') -parser.add_argument( -    '--parallel', -    action="store_true", -    default=False, -    help='Ignored.  For compatibility with run-tests.scm.') - -args = parser.parse_args() -if not args.interpreters: -    args.interpreters = [sys.executable] - -out = sys.stdout if args.verbose else None -err = sys.stderr if args.verbose else None - - -def status_to_str(code): -    return {0: "PASS", 77: "SKIP", 99: "ERROR"}.get(code, "FAIL") - - -results = list() -for interpreter in args.interpreters: -    version = subprocess.check_output([ -        interpreter, "-c", -        "import sys; print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1]))" -    ]).strip().decode() - -    if args.python_libdir: -        python_libdir = args.python_libdir -    else: -        pattern = os.path.join(args.builddir, "..", "{0}-gpg".format( -            os.path.basename(interpreter)), "lib*") -        libdirs = glob.glob(pattern) -        if len(libdirs) == 0: -            sys.exit( -                "Build directory matching {0!r} not found.".format(pattern)) -        elif len(libdirs) > 1: -            sys.exit( -                "Multiple build directories matching {0!r} found: {1}".format( -                    pattern, libdirs)) -        python_libdir = libdirs[0] - -    env = dict(os.environ) -    env["PYTHONPATH"] = python_libdir - -    if not args.quiet: -        print("Running tests using {0} ({1})...".format(interpreter, version)) - -    for test in args.tests: -        status = subprocess.call( -            [interpreter, os.path.join(args.srcdir, test)], -            env=env, -            stdout=out, -            stderr=err) -        if not args.quiet: -            print("{0}: {1}".format(status_to_str(status), test)) -        results.append(status) - - -def count(status): -    return len(list(filter(lambda x: x == status, results))) - - -def failed(): -    return len(list(filter(lambda x: x not in (0, 77, 99), results))) - - -if not args.quiet: -    print("{0} tests run, {1} succeeded, {2} failed, {3} skipped.".format( -        len(results), count(0), failed(), count(77))) -    sys.exit(len(results) - count(0) - count(77)) -sys.exit(results[0]) diff --git a/lang/python/tests/sign-only.asc b/lang/python/tests/sign-only.asc deleted file mode 100644 index 6e2a6f3c..00000000 --- a/lang/python/tests/sign-only.asc +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN PGP PRIVATE KEY BLOCK----- -Version: GnuPG v2 - -lQPFBFd/jO8BCADiull4EVJiKmJqclPyU6GhTlbJXw7Ch0zbFAauOWYT3ACmgr1U -KfJlZ2sPe2EezZkVSACxgIjTCzcgKQLh/swXdhO8uEgWEIN8f07WcSVDrcRGYwDS -KFSRsK0bfO/OQQDUsSkNQSHjcOdLnCHCinMrQi1mBZOs+Y/DXOkkEV1zbFFV7q6X -4vX9HSWwTRQTdOV9CFZykbwM+X1YIZlVtpOAKqSNJi3P17uQF7P9zko6HWKKKQ5S -96BfXUOIpBRl82R85/yQgeGrWlvZ2BT2ittscNQlBKqLHJ7LIeDr9ctbKlKZjHTn -Da7NYg+PoMHspbizjSONbEzpcR/9ZUq16oJJABEBAAH+BwMC7hQZNJSmlX/W6sfL -0wakX6kTsiCEMy2vMCRcZ769JKT234avHtkL/g7MBJEzqdG9HSEp7+LHGuOWJhfa -20f61WvPT5ujUIy//QXJ9a8z877jCm+fHKCTDXGYLLfCkJLfr3/GfTRy6gaIGTSw -BqZaRelPvHbMp+eiFqDkf8W/E1LO3/83k87+pXggjz4p0OasyMw8RcDmy+IKBMGG -bzet5WIKHIhpblIzuuucQHOjtwA8vCedub3F4lcRuULe2GW6sNuCB9kjSC9g6D1d -bJ+WYi5GiUUQARGSNXiWVoVPLpEo0i6/2bKJ7vBYGRewNp42ebVQU2bFW7uzhaIq -4itzNTjFNTpcxX3Lo0/mzJpe7pVRJwN+HGahNGT0EtPDsT/nNTFDUq8e8nt0U9/8 -0eekg4MRBJEzE3A+wosIHPjzCkQgu98+nh79rPMbCpZVxNfLb136cTkubmHCWptN -T2MbqK2L4hMcOxHGGOmI9SjFltNeKtTsVtkxh3Vj67UESPdN550centfasJYA0bj -guRQfHWHJXYIfFwblIFkl8xtIVLTeWlQMEvc7oI8jcJOc2ri8Zdjj/55xxv/RvjC -ZKzfjPpdkLYcN1zP/hETLD68u7WmiMAYCr8Eq9YQ3oKklUpWxRMCAAtmgjGGpm5P -QQW+36s96Q3cuG8R0Z4Wo8y89FgWzCEzuAhemCdffoUA8kn0HJQaVndnExJb1Ebz -wp+zsX/JqiOFvcKHJAWCaXkk0oXVi1aIV4tQyCPfhyjnd846K7g8UabAz51IJHvF -CXRAmqJvu26NqjYOfWBJJxZQsPH4FjPfYx+e/MFPZa+UTKCfzaOHClrePHUDHw58 -Ez5ItcORYn51IWW33r+c4tlhW5mrjMD7FcjFOuYT4EIivd5BSnwLP0fjBz8TBVAY -yyFO+YAXTQ+0MVNpZ24gT25seSAodGVzdCBrZXksIGRvIG5vdCB1c2UpIDxzb0Bl -eGFtcGxlLm9yZz6JATcEEwEIACEFAld/jO8CGwMFCwkIBwIGFQgJCgsCBBYCAwEC -HgECF4AACgkQ/tFT8S8Y9F3PAwgAvKav6+luvcAhrpBMO4z/Q8kDMtO5AW1KTEcz -neqpj5eTVJVbYUgDuBlEXbFYtcZmYyYtJC5KQkN3bxPmehVUzGk27UYWMWbPIWyU -riGcFL5BWWQaKSqiWUypzhNVnxYoiWVhHeJ36LICVMpLBaubgcpwCSW/j58yZo/7 -XRwf40OblXr4cevIW4Oq5GSxKOQF+DCErF6BeikC2i+NoqSxwNiIO/1NUxs8QfAI -z8UT/bSUXr62BWLfeCIDGgXutMMPth3tKi4DlvLCzI6eYJrd8E3Rt7iUZm9IH8OQ -Djv2DKnL/E/AP8oITItrOmICqfEWcj+Tk2Xep4pCCMNU+Pa0yg== -=gG5b ------END PGP PRIVATE KEY BLOCK----- diff --git a/lang/python/tests/support.py b/lang/python/tests/support.py deleted file mode 100644 index dc42a361..00000000 --- a/lang/python/tests/support.py +++ /dev/null @@ -1,156 +0,0 @@ -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import contextlib -import shutil -import sys -import os -import re -import tempfile -import time -import gpg - -del absolute_import, print_function, unicode_literals - - -def assert_gpg_version(version=(2, 1, 0)): -    with gpg.Context() as c: -        clean_version = re.match(r'\d+\.\d+\.\d+', -                                 c.engine_info.version).group(0) -        if tuple(map(int, clean_version.split('.'))) < version: -            print("GnuPG too old: have {0}, need {1}.".format( -                c.engine_info.version, '.'.join(map(str, version)))) -            sys.exit(77) - -def is_gpg_version(version): -    with gpg.Context() as c: -        clean_version = re.match(r'\d+\.\d+\.\d+', -                                 c.engine_info.version).group(0) -        return tuple(map(int, clean_version.split('.'))) == version - - -def have_tofu_support(ctx, some_uid): -    keys = list( -        ctx.keylist( -            some_uid, -            mode=(gpg.constants.keylist.mode.LOCAL | -                  gpg.constants.keylist.mode.WITH_TOFU))) -    return len(keys) > 0 - - -# Skip the Python tests for GnuPG < 2.1.12.  Prior versions do not -# understand the command line flags that we assume exist.  C.f. issue -# 3008. -assert_gpg_version((2, 1, 12)) - -# known keys -alpha = "A0FF4590BB6122EDEF6E3C542D727CC768697734" -bob = "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2" -encrypt_only = "F52770D5C4DB41408D918C9F920572769B9FE19C" -sign_only = "7CCA20CCDE5394CEE71C9F0BFED153F12F18F45D" -no_such_key = "A" * 40 - - -def make_filename(name): -    return os.path.join(os.environ['top_srcdir'], 'tests', 'gpg', name) - - -def in_srcdir(name): -    return os.path.join(os.environ['srcdir'], name) - - -verbose = int(os.environ.get('verbose', 0)) > 1 - - -def print_data(data): -    if verbose: -        try: -            # See if it is a file-like object. -            data.seek(0, os.SEEK_SET) -            data = data.read() -        except: -            # Hope for the best. -            pass - -        if hasattr(sys.stdout, "buffer"): -            sys.stdout.buffer.write(data) -        else: -            sys.stdout.write(data) - - -def mark_key_trusted(ctx, key): -    class Editor(object): -        def __init__(self): -            self.steps = ["trust", "save"] - -        def edit(self, status, args, out): -            if args == "keyedit.prompt": -                result = self.steps.pop(0) -            elif args == "edit_ownertrust.value": -                result = "5" -            elif args == "edit_ownertrust.set_ultimate.okay": -                result = "Y" -            elif args == "keyedit.save.okay": -                result = "Y" -            else: -                result = None -            return result - -    with gpg.Data() as sink: -        ctx.op_edit(key, Editor().edit, sink, sink) - - -# Python3.2 and up has tempfile.TemporaryDirectory, but we cannot use -# that, because there shutil.rmtree is used without -# ignore_errors=True, and that races against gpg-agent deleting its -# sockets. -class TemporaryDirectory(object): -    def __enter__(self): -        self.path = tempfile.mkdtemp() -        return self.path - -    def __exit__(self, *args): -        shutil.rmtree(self.path, ignore_errors=True) - - -def EphemeralContext(): -    with TemporaryDirectory() as tmp: -        home = os.environ['GNUPGHOME'] -        shutil.copy(os.path.join(home, "gpg.conf"), tmp) -        shutil.copy(os.path.join(home, "gpg-agent.conf"), tmp) - -        with gpg.Context(home_dir=tmp) as ctx: -            yield ctx - -            # Ask the agent to quit. -            agent_socket = os.path.join(tmp, "S.gpg-agent") -            ctx.protocol = gpg.constants.protocol.ASSUAN -            ctx.set_engine_info(ctx.protocol, file_name=agent_socket) -            try: -                ctx.assuan_transact(["KILLAGENT"]) -            except gpg.errors.GPGMEError as e: -                if e.getcode() == gpg.errors.ASS_CONNECT_FAILED: -                    pass  # the agent was not running -                else: -                    raise - -            # Block until it is really gone. -            while os.path.exists(agent_socket): -                time.sleep(.01) diff --git a/lang/python/tests/t-callbacks.py b/lang/python/tests/t-callbacks.py deleted file mode 100755 index 3a210dd0..00000000 --- a/lang/python/tests/t-callbacks.py +++ /dev/null @@ -1,321 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import platform -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -oops = None -c = gpg.Context() -c.set_pinentry_mode(gpg.constants.PINENTRY_MODE_LOOPBACK) - -source = gpg.Data("Hallo Leute\n") -sink = gpg.Data() - -# Valid passphrases, both as string and bytes. -for passphrase in ('foo', b'foo'): - -    def passphrase_cb(hint, desc, prev_bad, hook=None): -        assert hook == passphrase -        return hook - -    c.set_passphrase_cb(passphrase_cb, passphrase) -    c.op_encrypt([], 0, source, sink) - - -# Returning an invalid type. -def passphrase_cb(hint, desc, prev_bad, hook=None): -    return 0 - - -c.set_passphrase_cb(passphrase_cb, None) -try: -    c.op_encrypt([], 0, source, sink) -except Exception as e: -    assert type(e) == TypeError -    assert str(e) == "expected str or bytes from passphrase callback, got int" -else: -    assert False, "Expected an error, got none" - -# Raising an exception inside callback. -myException = Exception() - - -def passphrase_cb(hint, desc, prev_bad, hook=None): -    raise myException - - -c.set_passphrase_cb(passphrase_cb, None) -try: -    c.op_encrypt([], 0, source, sink) -except Exception as e: -    assert e == myException -else: -    assert False, "Expected an error, got none" - - -# Wrong kind of callback function. -def bad_passphrase_cb(): -    pass - - -c.set_passphrase_cb(bad_passphrase_cb, None) -try: -    c.op_encrypt([], 0, source, sink) -except Exception as e: -    assert type(e) == TypeError -else: -    assert False, "Expected an error, got none" - -# Test the progress callback. -parms = """<GnupgKeyParms format="internal"> -Key-Type: RSA -Key-Length: 1024 -Name-Real: Joe Tester -Name-Comment: with stupid passphrase -Name-Email: [email protected] -Passphrase: Crypt0R0cks -Expire-Date: 2099-12-31 -</GnupgKeyParms> -""" - -prams = """<GnupgKeyParms format="internal"> -Key-Type: RSA -Key-Length: 1024 -Name-Real: Joe Tester -Name-Comment: with stupid passphrase -Name-Email: [email protected] -Passphrase: Crypt0R0cks -Expire-Date: 2037-12-31 -</GnupgKeyParms> -""" - -messages = [] - - -def progress_cb(what, typ, current, total, hook=None): -    assert hook == messages -    messages.append( -        "PROGRESS UPDATE: what = {}, type = {}, current = {}, total = {}" -        .format(what, typ, current, total)) - - -c = gpg.Context() -c.set_progress_cb(progress_cb, messages) -try: -    c.op_genkey(parms, None, None) -except Exception as oops: -    c.op_genkey(prams, None, None) -assert len(messages) > 0 - - -# Test exception handling. -def progress_cb(what, typ, current, total, hook=None): -    raise myException - - -c = gpg.Context() -c.set_progress_cb(progress_cb, None) -try: -    try: -        c.op_genkey(parms, None, None) -    except Exception as oops: -        c.op_genkey(prams, None, None) -except Exception as e: -    assert e == myException -else: -    assert False, "Expected an error, got none" - -# Test the edit callback. -c = gpg.Context() -c.set_pinentry_mode(gpg.constants.PINENTRY_MODE_LOOPBACK) -c.set_passphrase_cb(lambda *args: "abc") -sink = gpg.Data() -alpha = c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False) - -cookie = object() -edit_cb_called = False - -def oops_check(): -    if oops is not None and platform.architecture()[0] != "64bit": -        y2k38_msg = "System appears to be 32-bit and vulnerable to EOL in 2038." -    elif oops is not None and platform.architecture()[0] == "64bit": -        y2k38_msg = "System appears to be 64-bit, but may use 32-bit time." -    else: -        y2k38_msg = "System is 64-bit and/or not susceptible to 2038 EOL." -    return y2k38_msg - - -def edit_cb(status, args, hook): -    global edit_cb_called -    edit_cb_called = True -    assert hook == cookie -    return "quit" if args == "keyedit.prompt" else None - - -c.op_edit(alpha, edit_cb, cookie, sink) -assert edit_cb_called - -# Test exceptions. -c = gpg.Context() -c.set_pinentry_mode(gpg.constants.PINENTRY_MODE_LOOPBACK) -c.set_passphrase_cb(lambda *args: "abc") -sink = gpg.Data() - - -def edit_cb(status, args): -    raise myException - - -try: -    c.op_edit(alpha, edit_cb, None, sink) -except Exception as e: -    assert e == myException -else: -    assert False, "Expected an error, got none" - -# Test the status callback. -source = gpg.Data("Hallo Leute\n") -sink = gpg.Data() - -status_cb_called = False - - -def status_cb(keyword, args, hook=None): -    global status_cb_called -    status_cb_called = True -    assert hook == cookie - - -c = gpg.Context() -c.set_status_cb(status_cb, cookie) -c.set_ctx_flag("full-status", "1") -c.op_encrypt([alpha], gpg.constants.ENCRYPT_ALWAYS_TRUST, source, sink) -assert status_cb_called - -# Test exceptions. -source = gpg.Data("Hallo Leute\n") -sink = gpg.Data() - - -def status_cb(keyword, args): -    raise myException - - -c = gpg.Context() -c.set_status_cb(status_cb, None) -c.set_ctx_flag("full-status", "1") -try: -    c.op_encrypt([alpha], gpg.constants.ENCRYPT_ALWAYS_TRUST, source, sink) -except Exception as e: -    assert e == myException -else: -    assert False, "Expected an error, got none" - - -# Test the data callbacks. -def read_cb(amount, hook=None): -    assert hook == cookie -    return 0 - - -def release_cb(hook=None): -    assert hook == cookie - - -data = gpg.Data(cbs=(read_cb, None, None, release_cb, cookie)) -try: -    data.read() -except Exception as e: -    assert type(e) == TypeError -else: -    assert False, "Expected an error, got none" - - -def read_cb(amount): -    raise myException - - -data = gpg.Data(cbs=(read_cb, None, None, lambda: None)) -try: -    data.read() -except Exception as e: -    assert e == myException -else: -    assert False, "Expected an error, got none" - - -def write_cb(what, hook=None): -    assert hook == cookie -    return "wrong type" - - -data = gpg.Data(cbs=(None, write_cb, None, release_cb, cookie)) -try: -    data.write(b'stuff') -except Exception as e: -    assert type(e) == TypeError -else: -    assert False, "Expected an error, got none" - - -def write_cb(what): -    raise myException - - -data = gpg.Data(cbs=(None, write_cb, None, lambda: None)) -try: -    data.write(b'stuff') -except Exception as e: -    assert e == myException -else: -    assert False, "Expected an error, got none" - - -def seek_cb(offset, whence, hook=None): -    assert hook == cookie -    return "wrong type" - - -data = gpg.Data(cbs=(None, None, seek_cb, release_cb, cookie)) -try: -    data.seek(0, os.SEEK_SET) -except Exception as e: -    assert type(e) == TypeError -else: -    assert False, "Expected an error, got none" - - -def seek_cb(offset, whence): -    raise myException - - -data = gpg.Data(cbs=(None, None, seek_cb, lambda: None)) -try: -    data.seek(0, os.SEEK_SET) -except Exception as e: -    assert e == myException -else: -    assert False, "Expected an error, got none" diff --git a/lang/python/tests/t-data.py b/lang/python/tests/t-data.py deleted file mode 100755 index 1c879f45..00000000 --- a/lang/python/tests/t-data.py +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import io -import os -import tempfile -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -data = gpg.Data('Hello world!') -assert data.read() == b'Hello world!' -assert data.read() == b'' - -data.seek(0, os.SEEK_SET) -assert data.read() == b'Hello world!' -assert data.read() == b'' - -data = gpg.Data(b'Hello world!') -assert data.read() == b'Hello world!' - -data = gpg.Data(b'Hello world!', copy=False) -assert data.read() == b'Hello world!' - -data = gpg.Data() -data.write('Hello world!') -data.seek(0, os.SEEK_SET) -assert data.read() == b'Hello world!' - -data = gpg.Data() -data.write(b'Hello world!') -data.seek(0, os.SEEK_SET) -assert data.read() == b'Hello world!' - -data = gpg.Data() -data.write(b'Hello world!') -# We expect the second argument to default to SEEK_SET -data.seek(0) -assert data.read() == b'Hello world!' - -binjunk = bytes(range(256)) -data = gpg.Data() -data.write(binjunk) -data.seek(0, os.SEEK_SET) -assert data.read() == binjunk - -data = gpg.Data() -data.set_file_name("foobar") -assert data.get_file_name() == "foobar" - -# Test reading from an existing file. -with tempfile.NamedTemporaryFile() as tmp: -    tmp.write(binjunk) -    tmp.flush() -    tmp.seek(0) - -    # Open using name. -    data = gpg.Data(file=tmp.name) -    assert data.read() == binjunk - -    # Open using name, without copying. -    if False: -        # delayed reads are not yet supported -        data = gpg.Data(file=tmp.name, copy=False) -        assert data.read() == binjunk - -    # Open using stream. -    tmp.seek(0) -    data = gpg.Data(file=tmp) -    assert data.read() == binjunk - -    # Open using stream, offset, and length. -    data = gpg.Data(file=tmp, offset=0, length=42) -    assert data.read() == binjunk[:42] - -    # Open using name, offset, and length. -    data = gpg.Data(file=tmp.name, offset=23, length=42) -    assert data.read() == binjunk[23:23 + 42] - - -# Test callbacks. -class DataObject(object): -    def __init__(self): -        self.buffer = io.BytesIO() -        self.released = False - -    def read(self, amount, hook=None): -        assert not self.released -        return self.buffer.read(amount) - -    def write(self, data, hook=None): -        assert not self.released -        return self.buffer.write(data) - -    def seek(self, offset, whence, hook=None): -        assert not self.released -        return self.buffer.seek(offset, whence) - -    def release(self, hook=None): -        assert not self.released -        self.released = True - - -do = DataObject() -cookie = object() -data = gpg.Data(cbs=(do.read, do.write, do.seek, do.release, cookie)) -data.write('Hello world!') -data.seek(0, os.SEEK_SET) -assert data.read() == b'Hello world!' -del data -assert do.released - -# Again, without the cookie. -do = DataObject() -data = gpg.Data(cbs=(do.read, do.write, do.seek, do.release)) -data.write('Hello world!') -data.seek(0, os.SEEK_SET) -assert data.read() == b'Hello world!' -del data -assert do.released diff --git a/lang/python/tests/t-decrypt-verify.py b/lang/python/tests/t-decrypt-verify.py deleted file mode 100755 index 5307da77..00000000 --- a/lang/python/tests/t-decrypt-verify.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support - -del absolute_import, print_function, unicode_literals - - -def check_verify_result(result, summary, fpr, status): -    assert len(result.signatures) == 1, "Unexpected number of signatures" -    sig = result.signatures[0] -    assert sig.summary == summary, "Unexpected signature summary" -    assert sig.fpr == fpr -    assert gpg.errors.GPGMEError(sig.status).getcode() == status -    assert len(sig.notations) == 0 -    assert not sig.wrong_key_usage -    assert sig.validity == gpg.constants.validity.FULL -    assert gpg.errors.GPGMEError( -        sig.validity_reason).getcode() == gpg.errors.NO_ERROR - - -c = gpg.Context() - -source = gpg.Data(file=support.make_filename("cipher-2.asc")) -sink = gpg.Data() - -c.op_decrypt_verify(source, sink) -result = c.op_decrypt_result() -assert not result.unsupported_algorithm, \ -    "Unsupported algorithm: {}".format(result.unsupported_algorithm) - -support.print_data(sink) - -verify_result = c.op_verify_result() -check_verify_result( -    verify_result, gpg.constants.sigsum.VALID | gpg.constants.sigsum.GREEN, -    "A0FF4590BB6122EDEF6E3C542D727CC768697734", gpg.errors.NO_ERROR) - -# Idiomatic interface. -with gpg.Context() as c: -    alpha = c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False) -    bob = c.get_key("D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", False) -    plaintext, _, verify_result = \ -        c.decrypt(open(support.make_filename("cipher-2.asc")), verify=[alpha]) -    assert plaintext.find(b'Wenn Sie dies lesen k') >= 0, \ -        'Plaintext not found' -    check_verify_result( -        verify_result, gpg.constants.sigsum.VALID | gpg.constants.sigsum.GREEN, -        "A0FF4590BB6122EDEF6E3C542D727CC768697734", gpg.errors.NO_ERROR) - -    try: -        c.decrypt( -            open(support.make_filename("cipher-2.asc")), verify=[alpha, bob]) -    except Exception as e: -        assert len(e.missing) == 1 -        assert e.missing[0] == bob -    else: -        assert False, "Expected an error, got none" - -#    plaintext, _, verify_result = c.decrypt(open(support.make_filename("cipher-no-sig.asc"))) -#    assert len(plaintext) > 0 -#    assert len(verify_result.signatures) == 0 -#    assert plaintext.find(b'Viscosity Dispersal Thimble Saturday Flaxseed Deflected') >= 0, \ -#        'unsigned Plaintext was not found' -# -#    plaintext, _, verify_result = c.decrypt(open(support.make_filename("cipher-3.asc"))) -#    assert len(plaintext) > 0 -#    assert len(verify_result.signatures) == 1 -#    assert plaintext.find(b'Reenact Studied Thermos Bonehead Unclasp Opposing') >= 0, \ -#        'second Plaintext not found' diff --git a/lang/python/tests/t-decrypt.py b/lang/python/tests/t-decrypt.py deleted file mode 100755 index 99002749..00000000 --- a/lang/python/tests/t-decrypt.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support - -del absolute_import, print_function, unicode_literals - -c = gpg.Context() - -source = gpg.Data(file=support.make_filename("cipher-1.asc")) -sink = gpg.Data() - -c.op_decrypt(source, sink) -result = c.op_decrypt_result() -assert not result.unsupported_algorithm, \ -    "Unsupported algorithm: {}".format(result.unsupported_algorithm) - -support.print_data(sink) - -# Idiomatic interface. -with gpg.Context() as c: -    plaintext, _, _ = c.decrypt(open(support.make_filename("cipher-1.asc")), verify=False) -    assert len(plaintext) > 0 -    assert plaintext.find(b'Wenn Sie dies lesen k') >= 0, \ -        'Plaintext not found' - -    plaintext, _, _ = c.decrypt(open(support.make_filename("cipher-3.asc")), verify=False) -    assert len(plaintext) > 0 -    assert plaintext.find(b'Reenact Studied Thermos Bonehead Unclasp Opposing') >= 0, \ -        'second Plaintext not found' - -    plaintext, _, _ = c.decrypt(open(support.make_filename("cipher-no-sig.asc")), verify=False) -    assert len(plaintext) > 0 -    assert plaintext.find(b'Viscosity Dispersal Thimble Saturday Flaxseed Deflected') >= 0, \ -        'third Plaintext was not found' diff --git a/lang/python/tests/t-edit.py b/lang/python/tests/t-edit.py deleted file mode 100755 index 48a6887d..00000000 --- a/lang/python/tests/t-edit.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2005 Igor Belyi <[email protected]> -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import sys -import os -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - - -class KeyEditor(object): -    def __init__(self): -        self.steps = ["fpr", "expire", "1", "primary", "quit"] -        self.step = 0 -        self.done = False -        self.verbose = int(os.environ.get('verbose', 0)) > 1 - -    def edit_fnc(self, status, args, out=None): -        if args == "keyedit.prompt": -            result = self.steps[self.step] -            self.step += 1 -        elif args == "keyedit.save.okay": -            result = "Y" -            self.done = self.step == len(self.steps) -        elif args == "keygen.valid": -            result = "0" -        else: -            result = None - -        if self.verbose: -            sys.stderr.write("Code: {}, args: {!r}, Returning: {!r}\n".format( -                status, args, result)) - -        return result - - -c = gpg.Context() -c.set_pinentry_mode(gpg.constants.PINENTRY_MODE_LOOPBACK) -c.set_passphrase_cb(lambda *args: "abc") -c.set_armor(True) - -# The deprecated interface. -editor = KeyEditor() -c.interact( -    c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False), -    editor.edit_fnc) -assert editor.done - -# The deprecated interface. -sink = gpg.Data() -editor = KeyEditor() -c.op_edit( -    c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False), -    editor.edit_fnc, sink, sink) -assert editor.done diff --git a/lang/python/tests/t-encrypt-large.py b/lang/python/tests/t-encrypt-large.py deleted file mode 100755 index f682e8b2..00000000 --- a/lang/python/tests/t-encrypt-large.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import sys -import random -import gpg -import support - -del absolute_import, print_function, unicode_literals - -if len(sys.argv) == 2: -    nbytes = int(sys.argv[1]) -else: -    nbytes = 100000 - -c = gpg.Context() - -ntoread = nbytes - - -def read_cb(amount): -    global ntoread -    chunk = ntoread if ntoread < amount else amount -    ntoread -= chunk -    assert ntoread >= 0 -    assert chunk >= 0 -    return bytes(bytearray(random.randrange(256) for i in range(chunk))) - - -nwritten = 0 - - -def write_cb(data): -    global nwritten -    nwritten += len(data) -    return len(data) - - -source = gpg.Data(cbs=(read_cb, None, None, lambda: None)) -sink = gpg.Data(cbs=(None, write_cb, None, lambda: None)) - -keys = [] -keys.append(c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False)) -keys.append(c.get_key("D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", False)) - -c.op_encrypt(keys, gpg.constants.ENCRYPT_ALWAYS_TRUST, source, sink) -result = c.op_encrypt_result() -assert not result.invalid_recipients, \ -    "Invalid recipient encountered: {}".format(result.invalid_recipients.fpr) -assert ntoread == 0 - -if support.verbose: -    sys.stderr.write("plaintext={} bytes, ciphertext={} bytes\n".format( -        nbytes, nwritten)) diff --git a/lang/python/tests/t-encrypt-sign.py b/lang/python/tests/t-encrypt-sign.py deleted file mode 100755 index d32ed3ad..00000000 --- a/lang/python/tests/t-encrypt-sign.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import sys -import gpg -import support - -del absolute_import, print_function, unicode_literals - -c = gpg.Context() -c.set_armor(True) - - -def check_result(r, typ): -    if r.invalid_signers: -        sys.exit("Invalid signer found: {}".format(r.invalid_signers.fpr)) - -    if len(r.signatures) != 1: -        sys.exit("Unexpected number of signatures created") - -    signature = r.signatures[0] -    if signature.type != typ: -        sys.exit("Wrong type of signature created") - -    if signature.pubkey_algo != gpg.constants.pk.DSA: -        sys.exit("Wrong pubkey algorithm reported: {}".format( -            signature.pubkey_algo)) - -    if signature.hash_algo not in (gpg.constants.md.SHA1, -                                   gpg.constants.md.RMD160): -        sys.exit("Wrong hash algorithm reported: {}".format( -            signature.hash_algo)) - -    if signature.sig_class != 0: -        sys.exit("Wrong signature class reported: {}".format( -            signature.sig_class)) - -    if signature.fpr != "A0FF4590BB6122EDEF6E3C542D727CC768697734": -        sys.exit("Wrong fingerprint reported: {}".format(signature.fpr)) - - -keys = [] -keys.append(c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False)) -keys.append(c.get_key("D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", False)) - -for recipients in (keys, []): -    source = gpg.Data("Hallo Leute\n") -    sink = gpg.Data() - -    c.op_encrypt_sign(recipients, gpg.constants.ENCRYPT_ALWAYS_TRUST, source, -                      sink) -    result = c.op_encrypt_result() -    assert not result.invalid_recipients, \ -        "Invalid recipient encountered: {}".format( -            result.invalid_recipients.fpr) - -    result = c.op_sign_result() -    check_result(result, gpg.constants.sig.mode.NORMAL) - -    support.print_data(sink) - -# Idiomatic interface. -with gpg.Context(armor=True) as c: -    message = "Hallo Leute\n".encode() -    ciphertext, _, sig_result = c.encrypt( -        message, recipients=keys, always_trust=True) -    assert len(ciphertext) > 0 -    assert ciphertext.find(b'BEGIN PGP MESSAGE') > 0, 'Marker not found' -    check_result(sig_result, gpg.constants.sig.mode.NORMAL) - -    c.signers = [c.get_key(support.sign_only, True)] -    c.encrypt(message, recipients=keys, always_trust=True) - -    c.signers = [c.get_key(support.encrypt_only, True)] -    try: -        c.encrypt(message, recipients=keys, always_trust=True) -    except gpg.errors.InvalidSigners as e: -        assert len(e.signers) == 1 -        assert support.encrypt_only.endswith(e.signers[0].fpr) -    else: -        assert False, "Expected an InvalidSigners error, got none" diff --git a/lang/python/tests/t-encrypt-sym.py b/lang/python/tests/t-encrypt-sym.py deleted file mode 100755 index d22e0103..00000000 --- a/lang/python/tests/t-encrypt-sym.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -for passphrase in ("abc", b"abc"): -    c = gpg.Context() -    c.set_armor(True) -    c.set_pinentry_mode(gpg.constants.PINENTRY_MODE_LOOPBACK) - -    source = gpg.Data("Hallo Leute\n") -    cipher = gpg.Data() - -    passphrase_cb_called = 0 - -    def passphrase_cb(hint, desc, prev_bad, hook=None): -        global passphrase_cb_called -        passphrase_cb_called += 1 -        return passphrase - -    c.set_passphrase_cb(passphrase_cb, None) - -    c.op_encrypt([], 0, source, cipher) -    # gpg 2.2.21 has a bug in that for a new passphrase the callback -    # is called twice.  This is fixed in 2.2.22 but a patch was also -    # distributed so that we allow both. -    if support.is_gpg_version((2,2,21)): -        print("Enabling GnuPG 2.2.21 bug 4991 test workaround.") -        assert passphrase_cb_called == 1 or passphrase_cb_called == 2, \ -            "Callback called {} times".format(passphrase_cb_called) -    else: -        assert passphrase_cb_called == 1, \ -            "Callback called {} times".format(passphrase_cb_called) -    support.print_data(cipher) - -    c = gpg.Context() -    c.set_armor(True) -    c.set_pinentry_mode(gpg.constants.PINENTRY_MODE_LOOPBACK) -    c.set_passphrase_cb(passphrase_cb, None) -    plain = gpg.Data() -    cipher.seek(0, os.SEEK_SET) - -    c.op_decrypt(cipher, plain) -    # Seems like the passphrase is cached. -    # assert passphrase_cb_called == 2, \ -    #    "Callback called {} times".format(passphrase_cb_called) -    support.print_data(plain) - -    plain.seek(0, os.SEEK_SET) -    plaintext = plain.read() -    assert plaintext == b"Hallo Leute\n", \ -        "Wrong plaintext {!r}".format(plaintext) - -# Idiomatic interface. -for passphrase in ("abc", b"abc"): -    with gpg.Context(armor=True) as c: -        # Check that the passphrase callback is not altered. -        def f(*args): -            assert False - -        c.set_passphrase_cb(f) - -        message = "Hallo Leute\n".encode() -        ciphertext, _, _ = c.encrypt( -            message, passphrase=passphrase, sign=False) -        assert ciphertext.find(b'BEGIN PGP MESSAGE') > 0, 'Marker not found' - -        plaintext, _, _ = c.decrypt(ciphertext, passphrase=passphrase) -        assert plaintext == message, 'Message body not recovered' - -        assert c._passphrase_cb[1] == f, "Passphrase callback not restored" diff --git a/lang/python/tests/t-encrypt.py b/lang/python/tests/t-encrypt.py deleted file mode 100755 index 0ee100d8..00000000 --- a/lang/python/tests/t-encrypt.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support - -del absolute_import, print_function, unicode_literals - -c = gpg.Context() -c.set_armor(True) - -source = gpg.Data("Hallo Leute\n") -sink = gpg.Data() - -keys = [] -keys.append(c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False)) -keys.append(c.get_key("D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", False)) - -c.op_encrypt(keys, gpg.constants.ENCRYPT_ALWAYS_TRUST, source, sink) -result = c.op_encrypt_result() -assert not result.invalid_recipients, \ -  "Invalid recipients: {}".format(", ".join(r.fpr for r in result.recipients)) -support.print_data(sink) - -# Idiomatic interface. -with gpg.Context(armor=True) as c: -    ciphertext, _, _ = c.encrypt( -        "Hallo Leute\n".encode(), -        recipients=keys, -        sign=False, -        always_trust=True) -    assert len(ciphertext) > 0 -    assert ciphertext.find(b'BEGIN PGP MESSAGE') > 0, 'Marker not found' - -    c.encrypt( -        "Hallo Leute\n".encode(), -        recipients=[c.get_key(support.encrypt_only, False)], -        sign=False, -        always_trust=True) - -    try: -        c.encrypt( -            "Hallo Leute\n".encode(), -            recipients=[c.get_key(support.sign_only, False)], -            sign=False, -            always_trust=True) -    except gpg.errors.InvalidRecipients as e: -        assert len(e.recipients) == 1 -        assert support.sign_only.endswith(e.recipients[0].fpr) -    else: -        assert False, "Expected an InvalidRecipients error, got none" - -    try: -        # People might be tempted to provide strings. -        # We should raise something useful. -        ciphertext, _, _ = c.encrypt( -            "Hallo Leute\n", recipients=keys, sign=False, always_trust=True) -    except TypeError as e: -        # This test is a bit fragile, because the message -        # may very well change. So if the behaviour will change -        # this test can easily be deleted. -        assert "encode" in str(e) diff --git a/lang/python/tests/t-export.py b/lang/python/tests/t-export.py deleted file mode 100755 index 02474e97..00000000 --- a/lang/python/tests/t-export.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support - -del absolute_import, print_function, unicode_literals - -c = gpg.Context() -c.set_armor(True) - -sink = gpg.Data() -c.op_export_ext(['Alpha', 'Bob'], 0, sink) -support.print_data(sink) - -# Again. Now using a key array. -keys = [] -keys.append(c.get_key("0x68697734", False))  # Alpha -keys.append(c.get_key("0xA9E3B0B2", False))  # Bob -sink = gpg.Data() -c.op_export_keys(keys, 0, sink) -support.print_data(sink) diff --git a/lang/python/tests/t-file-name.py b/lang/python/tests/t-file-name.py deleted file mode 100755 index 6daedb16..00000000 --- a/lang/python/tests/t-file-name.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -testname = "abcde12345" - -c = gpg.Context() -c.set_armor(True) - -source = gpg.Data("Hallo Leute\n") -source.set_file_name(testname) -cipher = gpg.Data() -plain = gpg.Data() - -keys = [] -keys.append(c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False)) - -c.op_encrypt(keys, gpg.constants.ENCRYPT_ALWAYS_TRUST, source, cipher) -cipher.seek(0, os.SEEK_SET) -c.op_decrypt(cipher, plain) -result = c.op_decrypt_result() -assert result.file_name == testname diff --git a/lang/python/tests/t-idiomatic.py b/lang/python/tests/t-idiomatic.py deleted file mode 100755 index faa41906..00000000 --- a/lang/python/tests/t-idiomatic.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import sys -import io -import os -import tempfile -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -# Both Context and Data can be used as context manager: -with gpg.Context() as c, gpg.Data() as d: -    c.get_engine_info() -    d.write(b"Halloechen") -    leak_c = c -    leak_d = d - -leak_c.__del__() -leak_d.__del__() -assert leak_c.wrapped is None -assert leak_d.wrapped is None - - -def sign_and_verify(source, signed, sink): -    with gpg.Context() as c: -        c.op_sign(source, signed, gpg.constants.sig.mode.NORMAL) -        signed.seek(0, os.SEEK_SET) -        c.op_verify(signed, None, sink) -        result = c.op_verify_result() - -    assert len(result.signatures) == 1, "Unexpected number of signatures" -    sig = result.signatures[0] -    assert sig.summary == (gpg.constants.sigsum.VALID | -                           gpg.constants.sigsum.GREEN) -    assert gpg.errors.GPGMEError(sig.status).getcode() == gpg.errors.NO_ERROR - -    sink.seek(0, os.SEEK_SET) -    assert sink.read() == b"Hallo Leute\n" - - -# Demonstrate automatic wrapping of file-like objects with 'fileno' -# method. -with tempfile.TemporaryFile() as source, \ -     tempfile.TemporaryFile() as signed, \ -     tempfile.TemporaryFile() as sink: -    source.write(b"Hallo Leute\n") -    source.seek(0, os.SEEK_SET) - -    sign_and_verify(source, signed, sink) - -if sys.version_info[0] == 3: -    # Python2's io.BytesIO does not implement the buffer interface, -    # hence we cannot use it as sink. - -    # XXX: Python's io.BytesIo.truncate does not work as advertised. -    # https://bugs.python.org/issue27261 -    bio = io.BytesIO() -    bio.truncate(1) -    if len(bio.getvalue()) != 1: -        # This version of Python is affected, preallocate buffer. -        preallocate = 128 * b'\x00' -    else: -        preallocate = b'' - -    # Demonstrate automatic wrapping of objects implementing the buffer -    # interface, and the use of data objects with the 'with' statement. -    with io.BytesIO(preallocate) as signed, gpg.Data() as sink: -        sign_and_verify(b"Hallo Leute\n", signed, sink) diff --git a/lang/python/tests/t-import.py b/lang/python/tests/t-import.py deleted file mode 100755 index c32f2d77..00000000 --- a/lang/python/tests/t-import.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 Tobias Mueller <muelli at cryptobitch.de> -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support - -del absolute_import, print_function, unicode_literals - - -def check_result(result, fpr, secret): -    assert result.considered == 1 or (secret and result.considered == 3) -    assert result.no_user_id == 0 -    assert not ((secret and result.imported != 0) or -                (not secret and -                 (result.imported != 0 and result.imported != 1))) -    assert result.imported_rsa == 0 -    assert not ((secret and -                 (result.unchanged != 0 and result.unchanged != 1)) or -                (not secret and -                 ((result.imported == 0 and result.unchanged != 1) or -                  (result.imported == 1 and result.unchanged != 0)))) -    assert result.new_user_ids == 0 -    assert result.new_sub_keys == 0 -    assert not ((secret and ( -        (result.secret_imported == 0 and result.new_signatures != 0) or -        (result.secret_imported == 1 and result.new_signatures > 1))) or -                (not secret and result.new_signatures != 0)) -    assert result.new_revocations == 0 -    assert not ( -        (secret and result.secret_read != 1 and result.secret_read != 3) or -        (not secret and result.secret_read != 0)) -    assert not ( -        (secret and result.secret_imported != 0 and result. -            secret_imported != 1 and result. -            secret_imported != 2) or (not secret and result. -                                      secret_imported != 0)) -    assert not ((secret and -                 ((result.secret_imported == 0 and result. -                   secret_unchanged != 1 and result. -                   secret_unchanged != 2) or (result. -                                              secret_imported == 1 and result. -                                              secret_unchanged != 0))) or -                (not secret and result.secret_unchanged != 0)) -    assert result.not_imported == 0 -    if secret: -        assert not (len(result.imports) in (0, 3)) -    else: -        assert not (len(result.imports) in (0, 2)) - -    assert fpr == result.imports[0].fpr -    assert len(result.imports) == 1 or fpr == result.imports[1].fpr -    assert result.imports[0].result == 0 - - -c = gpg.Context() - -result = c.key_import(open(support.make_filename("pubkey-1.asc"), 'rb').read()) -check_result(result, "ADAB7FCC1F4DE2616ECFA402AF82244F9CD9FD55", False) - -result = c.key_import(open(support.make_filename("seckey-1.asc"), 'rb').read()) -check_result(result, "ADAB7FCC1F4DE2616ECFA402AF82244F9CD9FD55", True) - -try: -    result = c.key_import(b"thisisnotakey") -except ValueError: -    pass -assert result == "IMPORT_PROBLEM" diff --git a/lang/python/tests/t-keylist-from-data.py b/lang/python/tests/t-keylist-from-data.py deleted file mode 100755 index fa6034a3..00000000 --- a/lang/python/tests/t-keylist-from-data.py +++ /dev/null @@ -1,269 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support - -del absolute_import, print_function, unicode_literals - -support.assert_gpg_version((2, 1, 14)) - - -# Check expration of keys.  This test assumes three subkeys of which -# 2 are expired; it is used with the "Whisky" test key.  It has -# already been checked that these 3 subkeys are available. -def check_whisky(name, key): -    sub1 = key.subkeys[2] -    sub2 = key.subkeys[3] - -    assert sub1.expired and sub2.expired, \ -        "Subkey of `{}' not flagged as expired".format(name) -    assert sub1.expires == 1129636886 and sub2.expires == 1129636939, \ -        "Subkey of `{}' has wrong expiration date".format(name) - - -keys = [ -    [ -        "A0FF4590BB6122EDEF6E3C542D727CC768697734", "6AE6D7EE46A871F8", -        [["Alfa Test", "demo key", "[email protected]"], -         ["Alpha Test", "demo key", "[email protected]"], -         ["Alice", "demo key", ""]], 1 -    ], -    [ -        "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", "5381EA4EE29BA37F", -        [["Bob", "demo key", ""], -         ["Bravo Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "61EE841A2A27EB983B3B3C26413F4AF31AFDAB6C", "E71E72ACBC43DA60", -        [["Charlie Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "6560C59C43D031C54D7C588EEBA9F240EB9DC9E6", "06F22880B0C45424", -        [["Delta Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "3531152DE293E26A07F504BC318C1FAEFAEF6D1B", "B5C79E1A7272144D", -        [["Echelon", "demo key", -          ""], ["Echo Test", "demo key", "[email protected]"], -         ["Eve", "demo key", ""]], 1 -    ], -    [ -        "56D33268F7FE693FBB594762D4BF57F37372E243", "0A32EE79EE45198E", -        [["Foxtrot Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "C9C07DCC6621B9FB8D071B1D168410A48FC282E6", "247491CC9DCAD354", -        [["Golf Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "9E91CBB11E4D4135583EF90513DB965534C6E3F1", "76E26537D622AD0A", -        [["Hotel Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "CD538D6CC9FB3D745ECDA5201FE8FC6F04259677", "C1C8EFDE61F76C73", -        [["India Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "F8F1EDC73995AB739AD54B380C820C71D2699313", "BD0B108735F8F136", -        [["Juliet Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "3FD11083779196C2ECDD9594AD1B0FAD43C2D0C7", "86CBB34A9AF64D02", -        [["Kilo Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "1DDD28CEF714F5B03B8C246937CAB51FB79103F8", "0363B449FE56350C", -        [["Lima Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "2686AA191A278013992C72EBBE794852BE5CF886", "5F600A834F31EAE8", -        [["Mallory", "demo key", ""], -         ["Mike Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "5AB9D6D7BAA1C95B3BAA3D9425B00FD430CEC684", "4C1D63308B70E472", -        [["November Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "43929E89F8F79381678CAE515F6356BA6D9732AC", "FF0785712681619F", -        [["Oscar Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "6FAA9C201E5E26DCBAEC39FD5D15E01D3FF13206", "2764E18263330D9C", -        [["Papa test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "A7969DA1C3297AA96D49843F1C67EC133C661C84", "6CDCFC44A029ACF4", -        [["Quebec Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "38FBE1E4BF6A5E1242C8F6A13BDBEDB1777FBED3", "9FAB805A11D102EA", -        [["Romeo Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "045B2334ADD69FC221076841A5E67F7FA3AE3EA1", "93B88B0F0F1B50B4", -        [["Sierra Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "ECAC774F4EEEB0620767044A58CB9A4C85A81F38", "97B60E01101C0402", -        [["Tango Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "0DBCAD3F08843B9557C6C4D4A94C0F75653244D6", "93079B915522BDB9", -        [["Uniform Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "E8143C489C8D41124DC40D0B47AF4B6961F04784", "04071FB807287134", -        [["Victor Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "E8D6C90B683B0982BD557A99DEF0F7B8EC67DBDE", "D7FBB421FD6E27F6", -        [["Whisky Test", "demo key", "[email protected]"]], 3, check_whisky -    ], -    [ -        "04C1DF62EFA0EBB00519B06A8979A6C5567FB34A", "5CC6F87F41E408BE", -        [["XRay Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "ED9B316F78644A58D042655A9EEF34CD4B11B25F", "5ADFD255F7B080AD", -        [["Yankee Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "23FD347A419429BACCD5E72D6BC4778054ACD246", "EF9DC276A172C881", -        [["Zulu Test", "demo key", "[email protected]"]], 1 -    ], -] - - -def check_global(key, uids, n_subkeys): -    assert not key.revoked, "Key unexpectedly revoked" -    assert not key.expired, "Key unexpectedly expired" -    assert not key.disabled, "Key unexpectedly disabled" -    assert not key.invalid, "Key unexpectedly invalid" -    assert key.can_sign, "Key unexpectedly unusable for signing" -    assert key.can_certify, "Key unexpectedly unusable for certifications" -    assert not key.secret, "Key unexpectedly secret" -    assert not key.protocol != gpg.constants.protocol.OpenPGP, \ -        "Key has unexpected protocol: {}".format(key.protocol) -    assert not key.issuer_serial, \ -        "Key unexpectedly carries issuer serial: {}".format(key.issuer_serial) -    assert not key.issuer_name, \ -        "Key unexpectedly carries issuer name: {}".format(key.issuer_name) -    assert not key.chain_id, \ -        "Key unexpectedly carries chain ID: {}".format(key.chain_id) -    assert key.owner_trust == gpg.constants.validity.UNKNOWN, \ -        "Key has unexpected owner trust: {}".format(key.owner_trust) -    assert len(key.subkeys) - 1 == n_subkeys, \ -        "Key `{}' has unexpected number of subkeys".format(uids[0][0]) - - -def check_subkey(fpr, which, subkey): -    assert not subkey.revoked, which + " key unexpectedly revoked" -    assert not subkey.expired, which + " key unexpectedly expired" -    assert not subkey.disabled, which + " key unexpectedly disabled" -    assert not subkey.invalid, which + " key unexpectedly invalid" - -    if which == "Primary": -        assert not subkey.can_encrypt, \ -            which + " key unexpectedly usable for encryption" -        assert subkey.can_sign, \ -            which + " key unexpectedly unusable for signing" -        assert subkey.can_certify, \ -            which + " key unexpectedly unusable for certifications" -    else: -        assert subkey.can_encrypt, \ -            which + " key unexpectedly unusable for encryption" -        assert not subkey.can_sign, \ -            which + " key unexpectedly usable for signing" -        assert not subkey.can_certify, \ -            which + " key unexpectedly usable for certifications" - -    assert not subkey.secret, which + " key unexpectedly secret" -    assert not subkey.is_cardkey, "Public key marked as card key" -    assert not subkey.card_number, "Public key with card number set" -    assert not subkey.pubkey_algo != \ -        (gpg.constants.pk.DSA if which == "Primary" -         else gpg.constants.pk.ELG_E), \ -         which + " key has unexpected public key algo: {}".format(subkey. -                                                                  pubkey_algo) -    assert subkey.length == 1024, \ -        which + " key has unexpected length: {}".format(subkey.length) -    assert fpr.endswith(subkey.keyid), \ -        which + " key has unexpected key ID: {}".format(subkey.keyid) -    assert which == "Secondary" or subkey.fpr == fpr, \ -        which + " key has unexpected fingerprint: {}".format(subkey.fpr) -    assert not subkey.expires, \ -        which + " key unexpectedly expires: {}".format(subkey.expires) - - -def check_uid(which, ref, uid): -    assert not uid.revoked, which + " user ID unexpectedly revoked" -    assert not uid.invalid, which + " user ID unexpectedly invalid" -    assert uid.validity == gpg.constants.validity.UNKNOWN, \ -        which + " user ID has unexpected validity: {}".format(uid.validity) -    assert not uid.signatures, which + " user ID unexpectedly signed" -    assert uid.name == ref[0], \ -        "Unexpected name in {} user ID: {!r}".format(which.lower(), uid.name) -    assert uid.comment == ref[1], \ -        "Unexpected comment in {} user ID: {!r}".format(which.lower(), -                                                        uid.comment) -    assert uid.email == ref[2], \ -        "Unexpected email in {} user ID: {!r}".format(which.lower(), uid.email) - - -# Export all the data from our keyring... -key_data = gpg.Data() -with gpg.Context() as c: -    c.op_export_keys([c.get_key(k[0]) for k in keys], 0, key_data) - -# ... rewind the tape... -key_data.rewind() - -# ... and feed it into a keylist in an empty context. -with support.EphemeralContext() as c: -    for i, key in enumerate(c.keylist(source=key_data)): -        try: -            if len(keys[i]) == 4: -                fpr, sec_keyid, uids, n_subkeys = keys[i] -                misc_check = None -            else: -                fpr, sec_keyid, uids, n_subkeys, misc_check = keys[i] -        except IndexError: -            # There are more keys.  We don't check for that. -            break - -        # Global key flags. -        check_global(key, uids, n_subkeys) -        check_subkey(fpr, "Primary", key.subkeys[0]) -        check_subkey(sec_keyid, "Secondary", key.subkeys[1]) - -        assert len(key.uids) == len(uids) -        check_uid("First", uids[0], key.uids[0]) -        if len(key.uids) > 1: -            check_uid("Second", uids[1], key.uids[1]) -        if len(key.uids) > 2: -            check_uid("Third", uids[2], key.uids[2]) - -        if misc_check: -            misc_check(uids[0][0], key) - -    assert len(list(c.keylist())) == 0, "Keys were imported" diff --git a/lang/python/tests/t-keylist.py b/lang/python/tests/t-keylist.py deleted file mode 100755 index 2aebe9a5..00000000 --- a/lang/python/tests/t-keylist.py +++ /dev/null @@ -1,337 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support - -del absolute_import, print_function, unicode_literals - -c = gpg.Context() - - -# Check expration of keys.  This test assumes three subkeys of which -# 2 are expired; it is used with the "Whisky" test key.  It has -# already been checked that these 3 subkeys are available. -def check_whisky(name, key): -    sub1 = key.subkeys[2] -    sub2 = key.subkeys[3] - -    assert sub1.expired and sub2.expired, \ -        "Subkey of `{}' not flagged as expired".format(name) -    assert sub1.expires == 1129636886 and sub2.expires == 1129636939, \ -        "Subkey of `{}' has wrong expiration date".format(name) - - -keys = [ -    [ -        "A0FF4590BB6122EDEF6E3C542D727CC768697734", "6AE6D7EE46A871F8", -        [["Alfa Test", "demo key", -          "[email protected]"], ["Alpha Test", "demo key", "[email protected]"], -         ["Alice", "demo key", ""]], 1 -    ], -    [ -        "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", "5381EA4EE29BA37F", -        [["Bob", "demo key", ""], -         ["Bravo Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "61EE841A2A27EB983B3B3C26413F4AF31AFDAB6C", "E71E72ACBC43DA60", -        [["Charlie Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "6560C59C43D031C54D7C588EEBA9F240EB9DC9E6", "06F22880B0C45424", -        [["Delta Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "3531152DE293E26A07F504BC318C1FAEFAEF6D1B", "B5C79E1A7272144D", -        [["Echelon", "demo key", -          ""], ["Echo Test", "demo key", "[email protected]"], -         ["Eve", "demo key", ""]], 1 -    ], -    [ -        "56D33268F7FE693FBB594762D4BF57F37372E243", "0A32EE79EE45198E", -        [["Foxtrot Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "C9C07DCC6621B9FB8D071B1D168410A48FC282E6", "247491CC9DCAD354", -        [["Golf Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "9E91CBB11E4D4135583EF90513DB965534C6E3F1", "76E26537D622AD0A", -        [["Hotel Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "CD538D6CC9FB3D745ECDA5201FE8FC6F04259677", "C1C8EFDE61F76C73", -        [["India Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "F8F1EDC73995AB739AD54B380C820C71D2699313", "BD0B108735F8F136", -        [["Juliet Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "3FD11083779196C2ECDD9594AD1B0FAD43C2D0C7", "86CBB34A9AF64D02", -        [["Kilo Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "1DDD28CEF714F5B03B8C246937CAB51FB79103F8", "0363B449FE56350C", -        [["Lima Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "2686AA191A278013992C72EBBE794852BE5CF886", "5F600A834F31EAE8", -        [["Mallory", "demo key", ""], -         ["Mike Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "5AB9D6D7BAA1C95B3BAA3D9425B00FD430CEC684", "4C1D63308B70E472", -        [["November Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "43929E89F8F79381678CAE515F6356BA6D9732AC", "FF0785712681619F", -        [["Oscar Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "6FAA9C201E5E26DCBAEC39FD5D15E01D3FF13206", "2764E18263330D9C", -        [["Papa test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "A7969DA1C3297AA96D49843F1C67EC133C661C84", "6CDCFC44A029ACF4", -        [["Quebec Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "38FBE1E4BF6A5E1242C8F6A13BDBEDB1777FBED3", "9FAB805A11D102EA", -        [["Romeo Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "045B2334ADD69FC221076841A5E67F7FA3AE3EA1", "93B88B0F0F1B50B4", -        [["Sierra Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "ECAC774F4EEEB0620767044A58CB9A4C85A81F38", "97B60E01101C0402", -        [["Tango Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "0DBCAD3F08843B9557C6C4D4A94C0F75653244D6", "93079B915522BDB9", -        [["Uniform Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "E8143C489C8D41124DC40D0B47AF4B6961F04784", "04071FB807287134", -        [["Victor Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "E8D6C90B683B0982BD557A99DEF0F7B8EC67DBDE", "D7FBB421FD6E27F6", -        [["Whisky Test", "demo key", "[email protected]"]], 3, check_whisky -    ], -    [ -        "04C1DF62EFA0EBB00519B06A8979A6C5567FB34A", "5CC6F87F41E408BE", -        [["XRay Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "ED9B316F78644A58D042655A9EEF34CD4B11B25F", "5ADFD255F7B080AD", -        [["Yankee Test", "demo key", "[email protected]"]], 1 -    ], -    [ -        "23FD347A419429BACCD5E72D6BC4778054ACD246", "EF9DC276A172C881", -        [["Zulu Test", "demo key", "[email protected]"]], 1 -    ], -] - - -def check_global(key, uids, n_subkeys): -    assert not key.revoked, "Key unexpectedly revoked" -    assert not key.expired, "Key unexpectedly expired" -    assert not key.disabled, "Key unexpectedly disabled" -    assert not key.invalid, "Key unexpectedly invalid" -    assert key.can_sign, "Key unexpectedly unusable for signing" -    assert key.can_certify, "Key unexpectedly unusable for certifications" -    assert not key.secret, "Key unexpectedly secret" -    assert not key.protocol != gpg.constants.protocol.OpenPGP, \ -        "Key has unexpected protocol: {}".format(key.protocol) -    assert not key.issuer_serial, \ -        "Key unexpectedly carries issuer serial: {}".format(key.issuer_serial) -    assert not key.issuer_name, \ -        "Key unexpectedly carries issuer name: {}".format(key.issuer_name) -    assert not key.chain_id, \ -        "Key unexpectedly carries chain ID: {}".format(key.chain_id) - -    # Only key Alfa is trusted -    assert (key.uids[0].name == 'Alfa Test' -            or key.owner_trust == gpg.constants.validity.UNKNOWN), \ -            "Key has unexpected owner trust: {}".format(key.owner_trust) -    assert (key.uids[0].name != 'Alfa Test' -            or key.owner_trust == gpg.constants.validity.ULTIMATE), \ -            "Key has unexpected owner trust: {}".format(key.owner_trust) - -    assert len(key.subkeys) - 1 == n_subkeys, \ -        "Key `{}' has unexpected number of subkeys".format(uids[0][0]) - - -def check_subkey(fpr, which, subkey): -    assert not subkey.revoked, which + " key unexpectedly revoked" -    assert not subkey.expired, which + " key unexpectedly expired" -    assert not subkey.disabled, which + " key unexpectedly disabled" -    assert not subkey.invalid, which + " key unexpectedly invalid" - -    if which == "Primary": -        assert not subkey.can_encrypt, \ -            which + " key unexpectedly usable for encryption" -        assert subkey.can_sign, \ -            which + " key unexpectedly unusable for signing" -        assert subkey.can_certify, \ -            which + " key unexpectedly unusable for certifications" -    else: -        assert subkey.can_encrypt, \ -            which + " key unexpectedly unusable for encryption" -        assert not subkey.can_sign, \ -            which + " key unexpectedly usable for signing" -        assert not subkey.can_certify, \ -            which + " key unexpectedly usable for certifications" - -    assert not subkey.secret, which + " key unexpectedly secret" -    assert not subkey.is_cardkey, "Public key marked as card key" -    assert not subkey.card_number, "Public key with card number set" -    assert not subkey.pubkey_algo != \ -        (gpg.constants.pk.DSA if which == "Primary" -         else gpg.constants.pk.ELG_E), \ -        which + " key has unexpected public key algo: {}".format(subkey. -                                                             pubkey_algo) -    assert subkey.length == 1024, \ -        which + " key has unexpected length: {}".format(subkey.length) -    assert fpr.endswith(subkey.keyid), \ -        which + " key has unexpected key ID: {}".format(subkey.keyid) -    assert which == "Secondary" or subkey.fpr == fpr, \ -        which + " key has unexpected fingerprint: {}".format(subkey.fpr) -    assert not subkey.expires, \ -        which + " key unexpectedly expires: {}".format(subkey.expires) - - -def check_uid(which, ref, uid): -    assert not uid.revoked, which + " user ID unexpectedly revoked" -    assert not uid.invalid, which + " user ID unexpectedly invalid" -    assert uid.validity == (gpg.constants.validity.UNKNOWN -                            if uid.name.split()[0] -                            not in {'Alfa', 'Alpha', 'Alice'} else -                            gpg.constants.validity.ULTIMATE), \ -        which + " user ID has unexpectedly validity: {}".format(uid.validity) -    assert not uid.signatures, which + " user ID unexpectedly signed" -    assert uid.name == ref[0], \ -        "Unexpected name in {} user ID: {!r}".format(which.lower(), uid.name) -    assert uid.comment == ref[1], \ -        "Unexpected comment in {} user ID: {!r}".\ -        format(which.lower(), uid.comment) -    assert uid.email == ref[2], \ -        "Unexpected email in {} user ID: {!r}".format(which.lower(), uid.email) - - -i = 0 -c.op_keylist_start(None, False) -key = c.op_keylist_next() -while key: -    try: -        if len(keys[i]) == 4: -            fpr, sec_keyid, uids, n_subkeys = keys[i] -            misc_check = None -        else: -            fpr, sec_keyid, uids, n_subkeys, misc_check = keys[i] -    except IndexError: -        # There are more keys.  We don't check for that. -        break - -    # Global key flags. -    check_global(key, uids, n_subkeys) -    check_subkey(fpr, "Primary", key.subkeys[0]) -    check_subkey(sec_keyid, "Secondary", key.subkeys[1]) - -    assert len(key.uids) == len(uids) -    check_uid("First", uids[0], key.uids[0]) -    if len(key.uids) > 1: -        check_uid("Second", uids[1], key.uids[1]) -    if len(key.uids) > 2: -        check_uid("Third", uids[2], key.uids[2]) - -    if misc_check: -        misc_check(uids[0][0], key) -    key = c.op_keylist_next() -    i += 1 - -c.op_keylist_end() -result = c.op_keylist_result() -assert not result.truncated, "Key listing unexpectedly truncated" - -# We test for a parameter-less keylist -keyring_length = len(list(c.op_keylist_all())) -assert keyring_length > 1,\ -                "Expected to find some keys, but got %r" % keyring_length - -# Then we do want to call with a pattern, only -# i.e. without giving secret=0 -alpha_keys = list(c.op_keylist_all(b"Alpha")) -assert len(alpha_keys) == 1, "Expected only one key for 'Alpha', got %r" % len( -    alpha_keys) - -# Check negative result. -assert len(list(c.keylist("no such key in sight"))) == 0 - -for i, key in enumerate(c.keylist()): -    try: -        if len(keys[i]) == 4: -            fpr, sec_keyid, uids, n_subkeys = keys[i] -            misc_check = None -        else: -            fpr, sec_keyid, uids, n_subkeys, misc_check = keys[i] -    except IndexError: -        # There are more keys.  We don't check for that. -        break - -    # Global key flags. -    check_global(key, uids, n_subkeys) -    check_subkey(fpr, "Primary", key.subkeys[0]) -    check_subkey(sec_keyid, "Secondary", key.subkeys[1]) - -    assert len(key.uids) == len(uids) -    check_uid("First", uids[0], key.uids[0]) -    if len(key.uids) > 1: -        check_uid("Second", uids[1], key.uids[1]) -    if len(key.uids) > 2: -        check_uid("Third", uids[2], key.uids[2]) - -    if misc_check: -        misc_check(uids[0][0], key) - -# check get_key() -with gpg.Context() as c: -    c.get_key(support.alpha) -    c.get_key(support.alpha, secret=True) - -    c.get_key(support.bob) -    try: -        c.get_key(support.bob, secret=True) -    except KeyError: -        pass -    else: -        assert False, "Expected KeyError" - -    # Legacy error -    try: -        c.get_key(support.no_such_key) -    except gpg.errors.GPGMEError: -        pass -    else: -        assert False, "Expected GPGMEError" diff --git a/lang/python/tests/t-protocol-assuan.py b/lang/python/tests/t-protocol-assuan.py deleted file mode 100755 index e1491e0a..00000000 --- a/lang/python/tests/t-protocol-assuan.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -with gpg.Context(protocol=gpg.constants.protocol.ASSUAN) as c: -    # Do nothing. -    err = c.assuan_transact('nop') -    assert err is None -    err = c.assuan_transact(b'NOP') -    assert err is None -    err = c.assuan_transact(['NOP']) -    assert err is None - -    err = c.assuan_transact('idontexist') -    assert err.getsource() == gpg.errors.SOURCE_GPGAGENT -    assert err.getcode() == gpg.errors.ASS_UNKNOWN_CMD - -    # Invoke the pinentry to get a confirmation. -    c.assuan_transact(['GET_CONFIRMATION', 'Hello there']) - -    data = [] - -    def data_cb(line): -        data.append(line) - -    err = c.assuan_transact(['GETINFO', 'version'], data_cb=data_cb) -    assert not err -    assert len(data) == 1 - -    data = [] -    err = c.assuan_transact(['GETINFO', 's2k_count'], data_cb=data_cb) -    if not err: -        assert len(data) == 1 -        assert int(data[0]) > 0 - -    # XXX HELP sends status lines if we could use ASSUAN_CONVEY_COMMENTS. - -    status = [] - -    def status_cb(line, args): -        status.append((line, args)) - -    alphas_grip = '76F7E2B35832976B50A27A282D9B87E44577EB66' -    err = c.assuan_transact(['KEYINFO', alphas_grip], status_cb=status_cb) -    if not err: -        assert len(status) == 1 -        line, args = status[0] -        assert line.startswith('KEYINFO') -        assert args.startswith(alphas_grip) - -    # XXX: test these callbacks, e.g. using PRESET_PASSPHRASE -    # XXX: once issue2428 is resolved -    def inq_cb(name, args): -        print("inq_cb", name, args) diff --git a/lang/python/tests/t-quick-key-creation.py b/lang/python/tests/t-quick-key-creation.py deleted file mode 100755 index ca3f32ab..00000000 --- a/lang/python/tests/t-quick-key-creation.py +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2017 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import itertools -import time - -import support -support.assert_gpg_version((2, 1, 2)) - -del absolute_import, print_function, unicode_literals - -alpha = "Alpha <[email protected]>" - -with support.EphemeralContext() as ctx: -    res = ctx.create_key(alpha) - -    keys = list(ctx.keylist()) -    assert len(keys) == 1, "Weird number of keys created" - -    key = keys[0] -    assert key.fpr == res.fpr -    assert len(key.subkeys) == 2, "Expected one primary key and one subkey" -    assert key.subkeys[0].expires > 0, "Expected primary key to expire" - -    # Try to create a key with the same UID -    try: -        ctx.create_key(alpha) -        assert False, "Expected an error but got none" -    except gpg.errors.GpgError as e: -        pass - -    # Try to create a key with the same UID, now with force! -    res2 = ctx.create_key(alpha, force=True) -    assert res.fpr != res2.fpr - -# From here on, we use one context, and create unique UIDs -uid_counter = 0 - - -def make_uid(): -    global uid_counter -    uid_counter += 1 -    return "user{0}@invalid.example.org".format(uid_counter) - - -with support.EphemeralContext() as ctx: -    # Check gpg.constants.create.NOEXPIRE... -    res = ctx.create_key(make_uid(), expires=False) -    key = ctx.get_key(res.fpr, secret=True) -    assert key.fpr == res.fpr -    assert len(key.subkeys) == 2, "Expected one primary key and one subkey" -    assert key.subkeys[0].expires == 0, "Expected primary key not to expire" - -    t = 2 * 24 * 60 * 60 -    slack = 5 * 60 -    res = ctx.create_key(make_uid(), expires_in=t) -    key = ctx.get_key(res.fpr, secret=True) -    assert key.fpr == res.fpr -    assert len(key.subkeys) == 2, "Expected one primary key and one subkey" -    assert abs(time.time() + t - key.subkeys[0].expires) < slack, \ -        "Primary keys expiration time is off" - -    # Check capabilities -    for sign, encrypt, certify, authenticate \ -            in itertools.product([False, True], -                                 [False, True], -                                 [False, True], -                                 [False, True]): -        # Filter some out -        if not (sign or encrypt or certify or authenticate): -            # This triggers the default capabilities tested before. -            continue -        if (sign or encrypt or authenticate) and not certify: -            # The primary key always certifies. -            continue - -        res = ctx.create_key( -            make_uid(), -            algorithm="rsa", -            sign=sign, -            encrypt=encrypt, -            certify=certify, -            authenticate=authenticate) -        key = ctx.get_key(res.fpr, secret=True) -        assert key.fpr == res.fpr -        assert len(key.subkeys) == 1, \ -            "Expected no subkey for non-default capabilities" - -        p = key.subkeys[0] -        assert sign == p.can_sign -        assert encrypt == p.can_encrypt -        assert certify == p.can_certify -        assert authenticate == p.can_authenticate - -    # Check algorithm -    res = ctx.create_key(make_uid(), algorithm="rsa") -    key = ctx.get_key(res.fpr, secret=True) -    assert key.fpr == res.fpr -    for k in key.subkeys: -        assert k.pubkey_algo == 1 - -    # Check algorithm with size -    res = ctx.create_key(make_uid(), algorithm="rsa1024") -    key = ctx.get_key(res.fpr, secret=True) -    assert key.fpr == res.fpr -    for k in key.subkeys: -        assert k.pubkey_algo == 1 -        assert k.length == 1024 - -    # Check algorithm future-default -    ctx.create_key(make_uid(), algorithm="future-default") - -    # Check passphrase protection -    recipient = make_uid() -    passphrase = "streng geheim" -    res = ctx.create_key(recipient, passphrase=passphrase) -    ciphertext, _, _ = ctx.encrypt( -        b"hello there", recipients=[ctx.get_key(res.fpr)]) - -    cb_called = False - -    def cb(*args): -        global cb_called -        cb_called = True -        return passphrase - -    ctx.pinentry_mode = gpg.constants.PINENTRY_MODE_LOOPBACK -    ctx.set_passphrase_cb(cb) - -    plaintext, _, _ = ctx.decrypt(ciphertext) -    assert plaintext == b"hello there" -    assert cb_called diff --git a/lang/python/tests/t-quick-key-manipulation.py b/lang/python/tests/t-quick-key-manipulation.py deleted file mode 100755 index 81da03be..00000000 --- a/lang/python/tests/t-quick-key-manipulation.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2017 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import gpg -import sys - -import support -support.assert_gpg_version((2, 1, 14)) - -del absolute_import, print_function, unicode_literals - -alpha = "Alpha <[email protected]>" -bravo = "Bravo <[email protected]>" - -with support.EphemeralContext() as ctx: -    res = ctx.create_key(alpha, certify=True) -    key = ctx.get_key(res.fpr) -    assert len(key.subkeys) == 1, "Expected one primary key and no subkeys" -    assert len(key.uids) == 1, "Expected exactly one UID" - -    def get_uid(uid): -        key = ctx.get_key(res.fpr) -        for u in key.uids: -            if u.uid == uid: -                return u -        return None - -    # sanity check -    uid = get_uid(alpha) -    assert uid, "UID alpha not found" -    assert uid.revoked == 0 - -    # add bravo -    ctx.key_add_uid(key, bravo) -    uid = get_uid(bravo) -    assert uid, "UID bravo not found" -    assert uid.revoked == 0 - -    # revoke alpha -    ctx.key_revoke_uid(key, alpha) -    uid = get_uid(alpha) -    assert uid, "UID alpha not found" -    assert uid.revoked == 1 -    uid = get_uid(bravo) -    assert uid, "UID bravo not found" -    assert uid.revoked == 0 - -    # try to revoke the last UID -    try: -        ctx.key_revoke_uid(key, alpha) -        # IMHO this should fail.  issue2961. -        # assert False, "Expected an error but got none" -    except gpg.errors.GpgError: -        pass - -    # Everything should be the same -    uid = get_uid(alpha) -    assert uid, "UID alpha not found" -    assert uid.revoked == 1 -    uid = get_uid(bravo) -    assert uid, "UID bravo not found" -    assert uid.revoked == 0 - -    # try to revoke a non-existent UID -    try: -        ctx.key_revoke_uid(key, "i don't exist") -        # IMHO this should fail.  issue2963. -        # assert False, "Expected an error but got none" -    except gpg.errors.GpgError: -        pass - -    # try to add a pre-existent UID -    try: -        ctx.key_add_uid(key, bravo) -        assert False, "Expected an error but got none" -    except gpg.errors.GpgError: -        pass - -    # Check setting the TOFU policy. -    with open(os.path.join(ctx.home_dir, "gpg.conf"), "a") as handle: -        handle.write("trust-model tofu+pgp\n") - -    if not support.have_tofu_support(ctx, bravo): -        print("GnuPG does not support TOFU, skipping TOFU tests.") -        sys.exit() - -    for name, policy in [(name, getattr(gpg.constants.tofu.policy, name)) -                         for name in filter(lambda x: not x.startswith('__'), -                                            dir(gpg.constants.tofu.policy))]: -        if policy == gpg.constants.tofu.policy.NONE: -            # We must not set the policy to NONE. -            continue - -        ctx.key_tofu_policy(key, policy) - -        keys = list( -            ctx.keylist( -                key.uids[0].uid, -                mode=(gpg.constants.keylist.mode.LOCAL | -                      gpg.constants.keylist.mode.WITH_TOFU))) -        assert len(keys) == 1 - -        if policy == gpg.constants.tofu.policy.AUTO: -            # We cannot check that it is set to AUTO. -            continue - -        for uid in keys[0].uids: -            if uid.uid == alpha: -                # TOFU information of revoked UIDs is not updated. -                # XXX: Is that expected? -                continue -            assert uid.tofu[0].policy == policy, \ -                "Expected policy {0} ({1}), got {2}".format(policy, name, -                                                            uid.tofu[0].policy) diff --git a/lang/python/tests/t-quick-key-signing.py b/lang/python/tests/t-quick-key-signing.py deleted file mode 100755 index 8a5f8c36..00000000 --- a/lang/python/tests/t-quick-key-signing.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2017 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import itertools -import time - -import support -support.assert_gpg_version((2, 1, 1)) - -del absolute_import, print_function, unicode_literals - -with support.EphemeralContext() as ctx: -    uid_counter = 0 - -    def make_uid(): -        global uid_counter -        uid_counter += 1 -        return "user{0}@invalid.example.org".format(uid_counter) - -    def make_key(): -        uids = [make_uid() for i in range(3)] -        res = ctx.create_key(uids[0], certify=True) -        key = ctx.get_key(res.fpr) -        for u in uids[1:]: -            ctx.key_add_uid(key, u) -        return key, uids - -    def check_sigs(key, expected_sigs): -        keys = list( -            ctx.keylist( -                key.fpr, -                mode=(gpg.constants.keylist.mode.LOCAL | -                      gpg.constants.keylist.mode.SIGS))) -        assert len(keys) == 1 -        key_uids = { -            uid.uid: [s for s in uid.signatures] -            for uid in keys[0].uids -        } -        expected = list(expected_sigs) - -        while key_uids and expected: -            uid, signing_key, func = expected[0] -            match = False -            for i, s in enumerate(key_uids[uid]): -                if signing_key.fpr.endswith(s.keyid): -                    if func: -                        func(s) -                    match = True -                    break -            if match: -                expected.pop(0) -                key_uids[uid].pop(i) -                if not key_uids[uid]: -                    del key_uids[uid] - -        assert not key_uids, "Superfluous signatures: {0}".format(key_uids) -        assert not expected, "Missing signatures: {0}".format(expected) - -    # Simplest case.  Sign without any options. -    key_a, uids_a = make_key() -    key_b, uids_b = make_key() -    ctx.signers = [key_a] - -    def exportable_non_expiring(s): -        assert s.exportable -        assert s.expires == 0 - -    check_sigs(key_b, -               itertools.product(uids_b, [key_b], [exportable_non_expiring])) -    ctx.key_sign(key_b) -    check_sigs( -        key_b, -        itertools.product(uids_b, [key_b, key_a], [exportable_non_expiring])) - -    # Create a non-exportable signature, and explicitly name all uids. -    key_c, uids_c = make_key() -    ctx.signers = [key_a, key_b] - -    def non_exportable_non_expiring(s): -        assert s.exportable == 0 -        assert s.expires == 0 - -    ctx.key_sign(key_c, local=True, uids=uids_c) -    check_sigs( -        key_c, -        list(itertools.product(uids_c, [key_c], [exportable_non_expiring])) + -        list( -            itertools.product(uids_c, [key_b, key_a], -                              [non_exportable_non_expiring]))) - -    # Create a non-exportable, expiring signature for a single uid. -    key_d, uids_d = make_key() -    ctx.signers = [key_c] -    expires_in = 600 -    slack = 10 - -    def non_exportable_expiring(s): -        assert s.exportable == 0 -        assert abs(time.time() + expires_in - s.expires) < slack - -    ctx.key_sign(key_d, local=True, expires_in=expires_in, uids=uids_d[0]) -    check_sigs( -        key_d, -        list(itertools.product(uids_d, [key_d], [exportable_non_expiring])) + -        list( -            itertools.product(uids_d[:1], [key_c], [non_exportable_expiring]))) - -    # Now sign the second in the same fashion, but use a singleton list. -    ctx.key_sign(key_d, local=True, expires_in=expires_in, uids=uids_d[1:2]) -    check_sigs( -        key_d, -        list(itertools.product(uids_d, [key_d], [exportable_non_expiring])) + -        list( -            itertools.product(uids_d[:2], [key_c], [non_exportable_expiring]))) diff --git a/lang/python/tests/t-quick-subkey-creation.py b/lang/python/tests/t-quick-subkey-creation.py deleted file mode 100755 index e41d7a1f..00000000 --- a/lang/python/tests/t-quick-subkey-creation.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2017 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import itertools -import time - -import support - -del absolute_import, print_function, unicode_literals - -alpha = "Alpha <[email protected]>" -bravo = "Bravo <[email protected]>" - -with support.EphemeralContext() as ctx: -    res = ctx.create_key(alpha, certify=True) -    keys = list(ctx.keylist()) -    assert len(keys) == 1, "Weird number of keys created" -    key = keys[0] -    assert key.fpr == res.fpr -    assert len(key.subkeys) == 1, "Expected one primary key and no subkeys" - -    def get_subkey(fpr): -        k = ctx.get_key(fpr) -        for sk in k.subkeys: -            if sk.fpr == fpr: -                return sk -        return None - -    # Check gpg.constants.create.NOEXPIRE... -    res = ctx.create_subkey(key, expires=False) -    subkey = get_subkey(res.fpr) -    assert subkey.expires == 0, "Expected subkey not to expire" -    assert subkey.can_encrypt, \ -        "Default subkey capabilities do not include encryption" - -    t = 2 * 24 * 60 * 60 -    slack = 5 * 60 -    res = ctx.create_subkey(key, expires_in=t) -    subkey = get_subkey(res.fpr) -    assert abs(time.time() + t - subkey.expires) < slack, \ -        "subkeys expiration time is off" - -    # Check capabilities -    for sign, encrypt, authenticate \ -            in itertools.product([False, True], -                                 [False, True], -                                 [False, True]): -        # Filter some out -        if not (sign or encrypt or authenticate): -            # This triggers the default capabilities tested before. -            continue - -        res = ctx.create_subkey( -            key, sign=sign, encrypt=encrypt, authenticate=authenticate, -            algorithm="rsa") -        subkey = get_subkey(res.fpr) -        assert sign == subkey.can_sign -        assert encrypt == subkey.can_encrypt -        assert authenticate == subkey.can_authenticate - -    # Check algorithm -    res = ctx.create_subkey(key, algorithm="rsa") -    subkey = get_subkey(res.fpr) -    assert subkey.pubkey_algo == 1 - -    # Check algorithm with size -    res = ctx.create_subkey(key, algorithm="rsa1024") -    subkey = get_subkey(res.fpr) -    assert subkey.pubkey_algo == 1 -    assert subkey.length == 1024 - -    # Check algorithm future-default -    ctx.create_subkey(key, algorithm="future-default") - -    # Check passphrase protection.  For this we create a new key -    # so that we have a key with just one encryption subkey. -    bravo_res = ctx.create_key(bravo, certify=True) -    bravo_key = ctx.get_key(bravo_res.fpr) -    assert len( -        bravo_key.subkeys) == 1, "Expected one primary key and no subkeys" - -    passphrase = "streng geheim" -    res = ctx.create_subkey(bravo_key, passphrase=passphrase) -    ciphertext, _, _ = ctx.encrypt( -        b"hello there", recipients=[ctx.get_key(bravo_res.fpr)]) - -    cb_called = False - -    def cb(*args): -        global cb_called -        cb_called = True -        return passphrase - -    ctx.pinentry_mode = gpg.constants.PINENTRY_MODE_LOOPBACK -    ctx.set_passphrase_cb(cb) - -    plaintext, _, _ = ctx.decrypt(ciphertext) -    assert plaintext == b"hello there" -    assert cb_called diff --git a/lang/python/tests/t-sig-notation.py b/lang/python/tests/t-sig-notation.py deleted file mode 100755 index c3d29613..00000000 --- a/lang/python/tests/t-sig-notation.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -expected_notations = { -    "laughing@me": ("Just Squeeze Me", -                    gpg.constants.sig.notation.HUMAN_READABLE), -    "[email protected]": -    ("pgpmime", gpg.constants.sig.notation.HUMAN_READABLE | -     gpg.constants.sig.notation.CRITICAL), -    None: ("https://www.gnu.org/policy/", 0), -} - -# GnuPG prior to 2.1.13 did not report the critical flag correctly. -with gpg.Context() as c: -    version = c.engine_info.version -    have_correct_sig_data = not ( -        version.startswith("1.") or version.startswith("2.0.") or -        (version.startswith("2.1.") and int(version[4:]) < 13)) - - -def check_result(result): -    assert len(result.signatures) == 1, "Unexpected number of signatures" -    sig = result.signatures[0] -    assert len(sig.notations) == len(expected_notations) - -    for r in sig.notations: -        assert 'name_len' not in dir(r) -        assert 'value_len' not in dir(r) -        assert r.name in expected_notations -        value, flags = expected_notations.pop(r.name) - -        assert r.value == value, \ -            "Expected {!r}, got {!r}".format(value, r.value) -        assert r.human_readable \ -            == bool(flags & gpg.constants.sig.notation.HUMAN_READABLE) -        assert r.critical \ -            == (bool(flags & gpg.constants.sig.notation.CRITICAL) -                if have_correct_sig_data else False) - -    assert len(expected_notations) == 0 - - -source = gpg.Data("Hallo Leute\n") -signed = gpg.Data() - -c = gpg.Context() -for name, (value, flags) in expected_notations.items(): -    c.sig_notation_add(name, value, flags) - -c.op_sign(source, signed, gpg.constants.sig.mode.NORMAL) - -signed.seek(0, os.SEEK_SET) -sink = gpg.Data() -c.op_verify(signed, None, sink) -result = c.op_verify_result() -check_result(result) diff --git a/lang/python/tests/t-sign.py b/lang/python/tests/t-sign.py deleted file mode 100755 index 5eefd4db..00000000 --- a/lang/python/tests/t-sign.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import gpg -import support - -del absolute_import, print_function, unicode_literals - - -def fail(msg): -    raise RuntimeError(msg) - - -def check_result(r, typ): -    if r.invalid_signers: -        fail("Invalid signer found: {}".format(r.invalid_signers.fpr)) - -    if len(r.signatures) != 1: -        fail("Unexpected number of signatures created") - -    signature = r.signatures[0] -    if signature.type != typ: -        fail("Wrong type of signature created") - -    if signature.pubkey_algo != gpg.constants.pk.DSA: -        fail("Wrong pubkey algorithm reported: {}".format( -            signature.pubkey_algo)) - -    if signature.hash_algo != gpg.constants.md.SHA1: -        fail("Wrong hash algorithm reported: {}".format(signature.hash_algo)) - -    if signature.sig_class != 1: -        fail("Wrong signature class reported: {}".format(signature.sig_class)) - -    if signature.fpr != "A0FF4590BB6122EDEF6E3C542D727CC768697734": -        fail("Wrong fingerprint reported: {}".format(signature.fpr)) - - -c = gpg.Context() -c.set_textmode(True) -c.set_armor(True) - -source = gpg.Data("Hallo Leute\n") -sink = gpg.Data() - -c.op_sign(source, sink, gpg.constants.sig.mode.NORMAL) - -result = c.op_sign_result() -check_result(result, gpg.constants.sig.mode.NORMAL) -support.print_data(sink) - -# Now a detached signature. -source.seek(0, os.SEEK_SET) -sink = gpg.Data() - -c.op_sign(source, sink, gpg.constants.sig.mode.DETACH) - -result = c.op_sign_result() -check_result(result, gpg.constants.sig.mode.DETACH) -support.print_data(sink) - -# And finally a cleartext signature.  */ -source.seek(0, os.SEEK_SET) -sink = gpg.Data() - -c.op_sign(source, sink, gpg.constants.sig.mode.CLEAR) - -result = c.op_sign_result() -check_result(result, gpg.constants.sig.mode.CLEAR) -support.print_data(sink) - -# Idiomatic interface. -with gpg.Context(armor=True, textmode=True) as c: -    message = "Hallo Leute\n".encode() -    signed, _ = c.sign(message) -    assert len(signed) > 0 -    assert signed.find(b'BEGIN PGP MESSAGE') > 0, 'Message not found' - -    signed, _ = c.sign(message, mode=gpg.constants.sig.mode.DETACH) -    assert len(signed) > 0 -    assert signed.find(b'BEGIN PGP SIGNATURE') > 0, 'Signature not found' - -    signed, _ = c.sign(message, mode=gpg.constants.sig.mode.CLEAR) -    assert len(signed) > 0 -    assert signed.find(b'BEGIN PGP SIGNED MESSAGE') > 0, 'Message not found' -    assert signed.find(message) > 0, 'Message content not found' -    assert signed.find(b'BEGIN PGP SIGNATURE') > 0, 'Signature not found' - -with gpg.Context() as c: -    message = "Hallo Leute\n".encode() - -    c.signers = [c.get_key(support.sign_only, True)] -    c.sign(message) - -    c.signers = [c.get_key(support.encrypt_only, True)] -    try: -        c.sign(message) -    except gpg.errors.InvalidSigners as e: -        assert len(e.signers) == 1 -        assert support.encrypt_only.endswith(e.signers[0].fpr) -    else: -        assert False, "Expected an InvalidSigners error, got none" diff --git a/lang/python/tests/t-signers.py b/lang/python/tests/t-signers.py deleted file mode 100755 index e24e5b52..00000000 --- a/lang/python/tests/t-signers.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import gpg -import support - -del absolute_import, print_function, unicode_literals - - -def fail(msg): -    raise RuntimeError(msg) - - -def check_result(r, typ): -    if r.invalid_signers: -        fail("Invalid signer found: {}".format(r.invalid_signers.fpr)) - -    if len(r.signatures) != 2: -        fail("Unexpected number of signatures created") - -    for signature in r.signatures: -        if signature.type != typ: -            fail("Wrong type of signature created") - -        if signature.pubkey_algo != gpg.constants.pk.DSA: -            fail("Wrong pubkey algorithm reported: {}".format( -                signature.pubkey_algo)) - -        if signature.hash_algo != gpg.constants.md.SHA1: -            fail("Wrong hash algorithm reported: {}".format( -                signature.hash_algo)) - -        if signature.sig_class != 1: -            fail("Wrong signature class reported: got {}, want {}".format( -                signature.sig_class, 1)) - -        if signature.fpr not in ("A0FF4590BB6122EDEF6E3C542D727CC768697734", -                                 "23FD347A419429BACCD5E72D6BC4778054ACD246"): -            fail("Wrong fingerprint reported: {}".format(signature.fpr)) - - -c = gpg.Context() -c.set_textmode(True) -c.set_armor(True) - -keys = [] -c.op_keylist_start('', True) -keys.append(c.op_keylist_next()) -keys.append(c.op_keylist_next()) -c.op_keylist_end() - -c.signers_add(keys[0]) -c.signers_add(keys[1]) - -for mode in (gpg.constants.sig.mode.NORMAL, gpg.constants.sig.mode.DETACH, -             gpg.constants.sig.mode.CLEAR): -    source = gpg.Data("Hallo Leute\n") -    sink = gpg.Data() - -    c.op_sign(source, sink, mode) - -    result = c.op_sign_result() -    check_result(result, mode) -    support.print_data(sink) - -# Idiomatic interface. -with gpg.Context(armor=True, textmode=True, signers=keys) as c: -    message = "Hallo Leute\n".encode() -    signed, result = c.sign(message) -    check_result(result, gpg.constants.sig.mode.NORMAL) -    assert signed.find(b'BEGIN PGP MESSAGE') > 0, 'Message not found' - -    signed, result = c.sign(message, mode=gpg.constants.sig.mode.DETACH) -    check_result(result, gpg.constants.sig.mode.DETACH) -    assert signed.find(b'BEGIN PGP SIGNATURE') > 0, 'Signature not found' - -    signed, result = c.sign(message, mode=gpg.constants.sig.mode.CLEAR) -    check_result(result, gpg.constants.sig.mode.CLEAR) -    assert signed.find(b'BEGIN PGP SIGNED MESSAGE') > 0, 'Message not found' -    assert signed.find(message) > 0, 'Message content not found' -    assert signed.find(b'BEGIN PGP SIGNATURE') > 0, 'Signature not found' diff --git a/lang/python/tests/t-verify.py b/lang/python/tests/t-verify.py deleted file mode 100755 index 688e3ac5..00000000 --- a/lang/python/tests/t-verify.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import sys -import os -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -test_text1 = b"Just GNU it!\n" -test_text1f = b"Just GNU it?\n" -test_sig1 = b"""-----BEGIN PGP SIGNATURE----- - -iN0EABECAJ0FAjoS+i9FFIAAAAAAAwA5YmFyw7bDpMO8w58gZGFzIHdhcmVuIFVt -bGF1dGUgdW5kIGpldHp0IGVpbiBwcm96ZW50JS1aZWljaGVuNRSAAAAAAAgAJGZv -b2Jhci4xdGhpcyBpcyBhIG5vdGF0aW9uIGRhdGEgd2l0aCAyIGxpbmVzGhpodHRw -Oi8vd3d3Lmd1Lm9yZy9wb2xpY3kvAAoJEC1yfMdoaXc0JBIAoIiLlUsvpMDOyGEc -dADGKXF/Hcb+AKCJWPphZCphduxSvrzH0hgzHdeQaA== -=nts1 ------END PGP SIGNATURE----- -""" - -test_sig2 = b"""-----BEGIN PGP MESSAGE----- - -owGbwMvMwCSoW1RzPCOz3IRxjXQSR0lqcYleSUWJTZOvjVdpcYmCu1+oQmaJIleH -GwuDIBMDGysTSIqBi1MApi+nlGGuwDeHao53HBr+FoVGP3xX+kvuu9fCMJvl6IOf -y1kvP4y+8D5a11ang0udywsA -=Crq6 ------END PGP MESSAGE----- -""" - -# A message with a prepended but unsigned plaintext packet. -double_plaintext_sig = b"""-----BEGIN PGP MESSAGE----- - -rDRiCmZvb2Jhci50eHRF4pxNVGhpcyBpcyBteSBzbmVha3kgcGxhaW50ZXh0IG1l -c3NhZ2UKowGbwMvMwCSoW1RzPCOz3IRxTWISa6JebnG666MFD1wzSzJSixQ81XMV -UlITUxTyixRyKxXKE0uSMxQyEosVikvyCwpSU/S4FNCArq6Ce1F+aXJGvoJvYlGF -erFCTmJxiUJ5flFKMVeHGwuDIBMDGysTyA4GLk4BmO036xgWzMgzt9V85jCtfDFn -UqVooWlGXHwNw/xg/fVzt9VNbtjtJ/fhUqYo0/LyCGEA -=6+AK ------END PGP MESSAGE----- -""" - - -def check_result(result, summary, validity, fpr, status, notation): -    assert len(result.signatures) == 1, "Unexpected number of signatures" -    sig = result.signatures[0] -    assert sig.summary == summary, \ -        "Unexpected signature summary: {}, want: {}".format(sig.summary, -                                                            summary) -    assert sig.fpr == fpr -    assert gpg.errors.GPGMEError(sig.status).getcode() == status - -    if notation: -        expected_notations = { -            "bar": (b"\xc3\xb6\xc3\xa4\xc3\xbc\xc3\x9f" + -                    b" das waren Umlaute und jetzt ein prozent%-Zeichen" -                    if sys.version_info[0] < 3 else -                    b"\xc3\xb6\xc3\xa4\xc3\xbc\xc3\x9f".decode() + -                    " das waren Umlaute und jetzt ein prozent%-Zeichen"), -            "foobar.1": -            "this is a notation data with 2 lines", -            None: -            "http://www.gu.org/policy/", -        } -        assert len(sig.notations) == len(expected_notations) - -        for r in sig.notations: -            assert 'name_len' not in dir(r) -            assert 'value_len' not in dir(r) -            assert r.name in expected_notations -            assert r.value == expected_notations[r.name], \ -                "Expected {!r}, got {!r}".format(expected_notations[r.name], -                                                 r.value) -            expected_notations.pop(r.name) - -        assert len(expected_notations) == 0 - -    assert not sig.wrong_key_usage -    assert sig.validity == validity, \ -        "Unexpected signature validity: {}, want: {}".format( -            sig.validity, validity) -    assert gpg.errors.GPGMEError( -        sig.validity_reason).getcode() == gpg.errors.NO_ERROR - - -c = gpg.Context() -c.set_armor(True) - -# Checking a valid message. -text = gpg.Data(test_text1) -sig = gpg.Data(test_sig1) -c.op_verify(sig, text, None) -result = c.op_verify_result() -check_result(result, gpg.constants.sigsum.VALID | gpg.constants.sigsum.GREEN, -             gpg.constants.validity.FULL, -             "A0FF4590BB6122EDEF6E3C542D727CC768697734", gpg.errors.NO_ERROR, -             True) - -# Checking a manipulated message. -text = gpg.Data(test_text1f) -sig.seek(0, os.SEEK_SET) -c.op_verify(sig, text, None) -result = c.op_verify_result() -check_result(result, gpg.constants.sigsum.RED, gpg.constants.validity.UNKNOWN, -             "2D727CC768697734", gpg.errors.BAD_SIGNATURE, False) - -# Checking a normal signature. -text = gpg.Data() -sig = gpg.Data(test_sig2) -c.op_verify(sig, None, text) -result = c.op_verify_result() -check_result(result, gpg.constants.sigsum.VALID | gpg.constants.sigsum.GREEN, -             gpg.constants.validity.FULL, -             "A0FF4590BB6122EDEF6E3C542D727CC768697734", gpg.errors.NO_ERROR, -             False) - -# Checking an invalid message. -text = gpg.Data() -sig = gpg.Data(double_plaintext_sig) -try: -    c.op_verify(sig, None, text) -except Exception as e: -    assert type(e) == gpg.errors.GPGMEError -    assert e.getcode() == gpg.errors.BAD_DATA -else: -    assert False, "Expected an error but got none." - -# Idiomatic interface. -with gpg.Context(armor=True) as c: -    # Checking a valid message. -    _, result = c.verify(test_text1, test_sig1) -    check_result( -        result, gpg.constants.sigsum.VALID | gpg.constants.sigsum.GREEN, -        gpg.constants.validity.FULL, -        "A0FF4590BB6122EDEF6E3C542D727CC768697734", gpg.errors.NO_ERROR, True) - -    # Checking a manipulated message. -    try: -        c.verify(test_text1f, test_sig1) -    except gpg.errors.BadSignatures as e: -        check_result(e.result, gpg.constants.sigsum.RED, -                     gpg.constants.validity.UNKNOWN, "2D727CC768697734", -                     gpg.errors.BAD_SIGNATURE, False) -    else: -        assert False, "Expected an error but got none." - -    # Checking a normal signature. -    sig = gpg.Data(test_sig2) -    data, result = c.verify(test_sig2) -    check_result( -        result, gpg.constants.sigsum.VALID | gpg.constants.sigsum.GREEN, -        gpg.constants.validity.FULL, -        "A0FF4590BB6122EDEF6E3C542D727CC768697734", gpg.errors.NO_ERROR, False) -    assert data == test_text1 - -    # Checking an invalid message. -    try: -        c.verify(double_plaintext_sig) -    except gpg.errors.GPGMEError as e: -        assert e.getcode() == gpg.errors.BAD_DATA -    else: -        assert False, "Expected an error but got none." - -    alpha = c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False) -    bob = c.get_key("D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", False) - -    # Checking a valid message. -    c.verify(test_text1, test_sig1, verify=[alpha]) - -    try: -        c.verify(test_text1, test_sig1, verify=[alpha, bob]) -    except gpg.errors.MissingSignatures as e: -        assert len(e.missing) == 1 -        assert e.missing[0] == bob -    else: -        assert False, "Expected an error, got none" diff --git a/lang/python/tests/t-wait.py b/lang/python/tests/t-wait.py deleted file mode 100755 index 8d05f254..00000000 --- a/lang/python/tests/t-wait.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -from __future__ import absolute_import, print_function, unicode_literals - -import time -import gpg -import support -_ = support  # to appease pyflakes. - -del absolute_import, print_function, unicode_literals - -c = gpg.Context() -c.set_armor(True) - -# Checking a message without a signature. -sig = gpg.Data("foo\n") -text = gpg.Data() -c.op_verify_start(sig, None, text) - -try: -    while True: -        err = c.wait(False) -        if err: -            break -        time.sleep(0.1) -except Exception as e: -    assert e.getcode() == gpg.errors.NO_DATA -else: -    assert False, "Expected an error, got none" diff --git a/lang/python/tests/t-wrapper.py b/lang/python/tests/t-wrapper.py deleted file mode 100755 index 4990c5ed..00000000 --- a/lang/python/tests/t-wrapper.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2016 g10 Code GmbH -# -# This file is part of GPGME. -# -# GPGME is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# GPGME is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -# Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, see <https://www.gnu.org/licenses/>. - -import gpg -import support -_ = support  # to appease pyflakes. - -d0 = gpg.Data() -d0.seek  # trigger on-demand-wrapping -assert d0.seek == d0.seek, "Generated wrapper functions are not cached" -assert hasattr(gpg.Data, 'seek'), "Generated wrapper functions are not shared" | 
