Python 3 port of PyME
[gpgme.git] / lang / py3-pyme / examples / signverify.py
1 #!/usr/bin/env python3
2 # $Id$
3 # Copyright (C) 2004,2008 Igor Belyi <belyi@users.sourceforge.net>
4 #
5 #    This program is free software; you can redistribute it and/or modify
6 #    it under the terms of the GNU General Public License as published by
7 #    the Free Software Foundation; either version 2 of the License, or
8 #    (at your option) any later version.
9 #
10 #    This program is distributed in the hope that it will be useful,
11 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #    GNU General Public License for more details.
14 #
15 #    You should have received a copy of the GNU General Public License
16 #    along with this program; if not, write to the Free Software
17 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
19 # Sample of unattended signing/verifying of a message.
20 # It uses keys for joe@foo.bar generated by genkey.pl script
21
22 import sys
23 from pyme import core, callbacks
24 from pyme.constants.sig import mode
25
26 core.check_version(None)
27
28 plain = core.Data("Test message")
29 sig = core.Data()
30 c = core.Context()
31 user = "joe@foo.bar"
32
33 c.signers_clear()
34 # Add joe@foo.bar's keys in the list of signers
35 for sigkey in c.op_keylist_all(user, 1):
36     if sigkey.can_sign:
37         c.signers_add(sigkey)
38 if not c.signers_enum(0):
39     print("No secret %s's keys suitable for signing!" % user)
40     sys.exit(0)
41
42 # This is a map between signer e-mail and its password
43 passlist = {
44     "<joe@foo.bar>": "abcdabcdfs"
45     }
46     
47 # callback will return password based on the e-mail listed in the hint.
48 c.set_passphrase_cb(lambda x,y,z: passlist[x[x.rindex("<"):]])
49
50 c.op_sign(plain, sig, mode.CLEAR)
51
52 # Print out the signature (don't forget to rewind since signing put sig at EOF)
53 sig.seek(0,0)
54 signedtext = sig.read()
55 print(signedtext)
56
57 # Create Data with signed text.
58 sig2 = core.Data(signedtext)
59 plain2 = core.Data()
60
61 # Verify.
62 c.op_verify(sig2, None, plain2)
63 result = c.op_verify_result()
64
65 # List results for all signatures. Status equal 0 means "Ok".
66 index = 0
67 for sign in result.signatures:
68     index += 1
69     print("signature", index, ":")
70     print("  summary:    ", sign.summary)
71     print("  status:     ", sign.status)
72     print("  timestamp:  ", sign.timestamp)
73     print("  fingerprint:", sign.fpr)
74     print("  uid:        ", c.get_key(sign.fpr, 0).uids[0].uid)
75
76 # Print "unsigned" text. Rewind since verify put plain2 at EOF.
77 plain2.seek(0,0)
78 print("\n", plain2.read())