python: Add an idiomatic interface.
[gpgme.git] / lang / python / tests / t-encrypt-sign.py
1 #!/usr/bin/env python3
2
3 # Copyright (C) 2016 g10 Code GmbH
4 #
5 # This file is part of GPGME.
6 #
7 # GPGME is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11 #
12 # GPGME is distributed in the hope that it will be useful, but WITHOUT
13 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
15 # Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this program; if not, see <http://www.gnu.org/licenses/>.
19
20 import sys
21 import pyme
22 from pyme import core, constants
23 import support
24
25 support.init_gpgme(constants.PROTOCOL_OpenPGP)
26 c = core.Context()
27 c.set_armor(True)
28
29 def check_result(r, typ):
30     if r.invalid_signers:
31         sys.exit("Invalid signer found: {}".format(r.invalid_signers.fpr))
32
33     if len(r.signatures) != 1:
34         sys.exit("Unexpected number of signatures created")
35
36     signature = r.signatures[0]
37     if signature.type != typ:
38         sys.exit("Wrong type of signature created")
39
40     if signature.pubkey_algo != constants.PK_DSA:
41         sys.exit("Wrong pubkey algorithm reported: {}".format(
42             signature.pubkey_algo))
43
44     if signature.hash_algo not in (constants.MD_SHA1, constants.MD_RMD160):
45         sys.exit("Wrong hash algorithm reported: {}".format(
46             signature.hash_algo))
47
48     if signature.sig_class != 0:
49         sys.exit("Wrong signature class reported: {}".format(
50             signature.sig_class))
51
52     if signature.fpr != "A0FF4590BB6122EDEF6E3C542D727CC768697734":
53         sys.exit("Wrong fingerprint reported: {}".format(signature.fpr))
54
55 keys = []
56 keys.append(c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False))
57 keys.append(c.get_key("D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", False))
58
59 for recipients in (keys, []):
60     source = core.Data("Hallo Leute\n")
61     sink = core.Data()
62
63     c.op_encrypt_sign(recipients, constants.ENCRYPT_ALWAYS_TRUST, source, sink)
64     result = c.op_encrypt_result()
65     assert not result.invalid_recipients, \
66         "Invalid recipient encountered: {}".format(
67             result.invalid_recipients.fpr)
68
69     result = c.op_sign_result()
70     check_result(result, constants.SIG_MODE_NORMAL)
71
72     support.print_data(sink)
73
74
75 # Idiomatic interface.
76 with pyme.Context(armor=True) as c:
77     message = "Hallo Leute\n".encode()
78     ciphertext, _, sig_result = c.encrypt(message,
79                                           recipients=keys,
80                                           always_trust=True)
81     assert len(ciphertext) > 0
82     assert ciphertext.find(b'BEGIN PGP MESSAGE') > 0, 'Marker not found'
83     check_result(sig_result, constants.SIG_MODE_NORMAL)
84
85     c.signers = [c.get_key(support.sign_only, True)]
86     c.encrypt(message, recipients=keys, always_trust=True)
87
88     c.signers = [c.get_key(support.encrypt_only, True)]
89     try:
90         c.encrypt(message, recipients=keys, always_trust=True)
91     except pyme.errors.InvalidSigners as e:
92         assert len(e.signers) == 1
93         assert support.encrypt_only.endswith(e.signers[0].fpr)
94     else:
95         assert False, "Expected an InvalidSigners error, got none"