python: Drop superfluous imports and trim public interface.
[gpgme.git] / lang / python / tests / t-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 os
21 import pyme
22 from pyme import core, constants
23 import support
24
25 def fail(msg):
26     raise RuntimeError(msg)
27
28 def check_result(r, typ):
29     if r.invalid_signers:
30         fail("Invalid signer found: {}".format(r.invalid_signers.fpr))
31
32     if len(r.signatures) != 1:
33         fail("Unexpected number of signatures created")
34
35     signature = r.signatures[0]
36     if signature.type != typ:
37         fail("Wrong type of signature created")
38
39     if signature.pubkey_algo != constants.PK_DSA:
40         fail("Wrong pubkey algorithm reported: {}".format(
41             signature.pubkey_algo))
42
43     if signature.hash_algo != constants.MD_SHA1:
44         fail("Wrong hash algorithm reported: {}".format(
45             signature.hash_algo))
46
47     if signature.sig_class != 1:
48         fail("Wrong signature class reported: {}".format(
49             signature.sig_class))
50
51     if signature.fpr != "A0FF4590BB6122EDEF6E3C542D727CC768697734":
52         fail("Wrong fingerprint reported: {}".format(signature.fpr))
53
54
55 support.init_gpgme(constants.PROTOCOL_OpenPGP)
56 c = core.Context()
57 c.set_textmode(True)
58 c.set_armor(True)
59
60 source = core.Data("Hallo Leute\n")
61 sink = core.Data()
62
63 c.op_sign(source, sink, constants.SIG_MODE_NORMAL)
64
65 result = c.op_sign_result()
66 check_result(result, constants.SIG_MODE_NORMAL)
67 support.print_data(sink)
68
69 # Now a detached signature.
70 source.seek(0, os.SEEK_SET)
71 sink = core.Data()
72
73 c.op_sign(source, sink, constants.SIG_MODE_DETACH)
74
75 result = c.op_sign_result()
76 check_result(result, constants.SIG_MODE_DETACH)
77 support.print_data(sink)
78
79 # And finally a cleartext signature.  */
80 source.seek(0, os.SEEK_SET)
81 sink = core.Data()
82
83 c.op_sign(source, sink, constants.SIG_MODE_CLEAR)
84
85 result = c.op_sign_result()
86 check_result(result, constants.SIG_MODE_CLEAR)
87 support.print_data(sink)
88
89 # Idiomatic interface.
90 with pyme.Context(armor=True, textmode=True) as c:
91     message = "Hallo Leute\n".encode()
92     signed, _ = c.sign(message)
93     assert len(signed) > 0
94     assert signed.find(b'BEGIN PGP MESSAGE') > 0, 'Message not found'
95
96     signed, _ = c.sign(message, mode=pyme.constants.SIG_MODE_DETACH)
97     assert len(signed) > 0
98     assert signed.find(b'BEGIN PGP SIGNATURE') > 0, 'Signature not found'
99
100     signed, _ = c.sign(message, mode=pyme.constants.SIG_MODE_CLEAR)
101     assert len(signed) > 0
102     assert signed.find(b'BEGIN PGP SIGNED MESSAGE') > 0, 'Message not found'
103     assert signed.find(message) > 0, 'Message content not found'
104     assert signed.find(b'BEGIN PGP SIGNATURE') > 0, 'Signature not found'
105
106 with pyme.Context() as c:
107     message = "Hallo Leute\n".encode()
108
109     c.signers = [c.get_key(support.sign_only, True)]
110     c.sign(message)
111
112     c.signers = [c.get_key(support.encrypt_only, True)]
113     try:
114         c.sign(message)
115     except pyme.errors.InvalidSigners as e:
116         assert len(e.signers) == 1
117         assert support.encrypt_only.endswith(e.signers[0].fpr)
118     else:
119         assert False, "Expected an InvalidSigners error, got none"