diff options
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" |