qt: Handle if gpg does not support tofu in test
[gpgme.git] / lang / python / tests / t-keylist-from-data.py
1 #!/usr/bin/env python
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 from __future__ import absolute_import, print_function, unicode_literals
21 del absolute_import, print_function, unicode_literals
22
23 import os
24 import sys
25 import gpg
26 import support
27
28 support.assert_gpg_version((2, 1, 14))
29
30 # Check expration of keys.  This test assumes three subkeys of which
31 # 2 are expired; it is used with the "Whisky" test key.  It has
32 # already been checked that these 3 subkeys are available.
33 def check_whisky(name, key):
34   sub1 = key.subkeys[2]
35   sub2 = key.subkeys[3]
36
37   assert sub1.expired and sub2.expired, \
38       "Subkey of `{}' not flagged as expired".format(name)
39   assert sub1.expires == 1129636886 and sub2.expires == 1129636939, \
40       "Subkey of `{}' has wrong expiration date".format(name)
41
42 keys = [
43     [ "A0FF4590BB6122EDEF6E3C542D727CC768697734", "6AE6D7EE46A871F8",
44       [ [ "Alfa Test", "demo key", "alfa@example.net" ],
45         [ "Alpha Test", "demo key", "alpha@example.net" ],
46         [ "Alice", "demo key", "" ] ], 1 ],
47     [ "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", "5381EA4EE29BA37F",
48       [ [ "Bob", "demo key", "" ],
49         [ "Bravo Test", "demo key", "bravo@example.net" ] ], 1 ],
50     [ "61EE841A2A27EB983B3B3C26413F4AF31AFDAB6C", "E71E72ACBC43DA60",
51       [ [ "Charlie Test", "demo key", "charlie@example.net" ] ], 1 ],
52     [ "6560C59C43D031C54D7C588EEBA9F240EB9DC9E6", "06F22880B0C45424",
53       [ [ "Delta Test", "demo key", "delta@example.net" ] ], 1 ],
54     [ "3531152DE293E26A07F504BC318C1FAEFAEF6D1B", "B5C79E1A7272144D",
55       [ [ "Echelon", "demo key", "" ],
56         [ "Echo Test", "demo key", "echo@example.net" ],
57         [ "Eve", "demo key", "" ] ], 1 ],
58     [ "56D33268F7FE693FBB594762D4BF57F37372E243", "0A32EE79EE45198E",
59       [ [ "Foxtrot Test", "demo key", "foxtrot@example.net" ] ], 1 ],
60     [ "C9C07DCC6621B9FB8D071B1D168410A48FC282E6", "247491CC9DCAD354",
61       [ [ "Golf Test", "demo key", "golf@example.net" ] ], 1 ],
62     [ "9E91CBB11E4D4135583EF90513DB965534C6E3F1", "76E26537D622AD0A",
63       [ [ "Hotel Test", "demo key", "hotel@example.net" ] ], 1 ],
64     [ "CD538D6CC9FB3D745ECDA5201FE8FC6F04259677", "C1C8EFDE61F76C73",
65       [ [ "India Test", "demo key", "india@example.net" ] ], 1 ],
66     [ "F8F1EDC73995AB739AD54B380C820C71D2699313", "BD0B108735F8F136",
67       [ [ "Juliet Test", "demo key", "juliet@example.net" ] ], 1 ],
68     [ "3FD11083779196C2ECDD9594AD1B0FAD43C2D0C7", "86CBB34A9AF64D02",
69       [ [ "Kilo Test", "demo key", "kilo@example.net" ] ], 1 ],
70     [ "1DDD28CEF714F5B03B8C246937CAB51FB79103F8", "0363B449FE56350C",
71       [ [ "Lima Test", "demo key", "lima@example.net" ] ], 1 ],
72     [ "2686AA191A278013992C72EBBE794852BE5CF886", "5F600A834F31EAE8",
73       [ [ "Mallory", "demo key", "" ],
74         [ "Mike Test", "demo key", "mike@example.net" ] ], 1 ],
75     [ "5AB9D6D7BAA1C95B3BAA3D9425B00FD430CEC684", "4C1D63308B70E472",
76       [ [ "November Test", "demo key", "november@example.net" ] ], 1 ],
77     [ "43929E89F8F79381678CAE515F6356BA6D9732AC", "FF0785712681619F",
78       [ [ "Oscar Test", "demo key", "oscar@example.net" ] ], 1 ],
79     [ "6FAA9C201E5E26DCBAEC39FD5D15E01D3FF13206", "2764E18263330D9C",
80       [ [ "Papa test", "demo key", "papa@example.net" ] ], 1 ],
81     [ "A7969DA1C3297AA96D49843F1C67EC133C661C84", "6CDCFC44A029ACF4",
82       [ [ "Quebec Test", "demo key", "quebec@example.net" ] ], 1 ],
83     [ "38FBE1E4BF6A5E1242C8F6A13BDBEDB1777FBED3", "9FAB805A11D102EA",
84       [ [ "Romeo Test", "demo key", "romeo@example.net" ] ], 1 ],
85     [ "045B2334ADD69FC221076841A5E67F7FA3AE3EA1", "93B88B0F0F1B50B4",
86       [ [ "Sierra Test", "demo key", "sierra@example.net" ] ], 1 ],
87     [ "ECAC774F4EEEB0620767044A58CB9A4C85A81F38", "97B60E01101C0402",
88       [ [ "Tango Test", "demo key", "tango@example.net" ] ], 1 ],
89     [ "0DBCAD3F08843B9557C6C4D4A94C0F75653244D6", "93079B915522BDB9",
90       [ [ "Uniform Test", "demo key", "uniform@example.net" ] ], 1 ],
91     [ "E8143C489C8D41124DC40D0B47AF4B6961F04784", "04071FB807287134",
92       [ [ "Victor Test", "demo key", "victor@example.org" ] ], 1 ],
93     [ "E8D6C90B683B0982BD557A99DEF0F7B8EC67DBDE", "D7FBB421FD6E27F6",
94       [ [ "Whisky Test", "demo key", "whisky@example.net" ] ], 3,
95       check_whisky ],
96     [ "04C1DF62EFA0EBB00519B06A8979A6C5567FB34A", "5CC6F87F41E408BE",
97       [ [ "XRay Test", "demo key", "xray@example.net" ] ], 1 ],
98     [ "ED9B316F78644A58D042655A9EEF34CD4B11B25F", "5ADFD255F7B080AD",
99       [ [ "Yankee Test", "demo key", "yankee@example.net" ] ], 1 ],
100     [ "23FD347A419429BACCD5E72D6BC4778054ACD246", "EF9DC276A172C881",
101       [ [ "Zulu Test", "demo key", "zulu@example.net" ] ], 1 ],
102 ]
103
104 def check_global(key, uids, n_subkeys):
105     assert not key.revoked, "Key unexpectedly revoked"
106     assert not key.expired, "Key unexpectedly expired"
107     assert not key.disabled, "Key unexpectedly disabled"
108     assert not key.invalid, "Key unexpectedly invalid"
109     assert key.can_sign, "Key unexpectedly unusable for signing"
110     assert key.can_certify, "Key unexpectedly unusable for certifications"
111     assert not key.secret, "Key unexpectedly secret"
112     assert not key.protocol != gpg.constants.protocol.OpenPGP, \
113         "Key has unexpected protocol: {}".format(key.protocol)
114     assert not key.issuer_serial, \
115         "Key unexpectedly carries issuer serial: {}".format(key.issuer_serial)
116     assert not key.issuer_name, \
117         "Key unexpectedly carries issuer name: {}".format(key.issuer_name)
118     assert not key.chain_id, \
119         "Key unexpectedly carries chain ID: {}".format(key.chain_id)
120     assert key.owner_trust == gpg.constants.validity.UNKNOWN, \
121         "Key has unexpected owner trust: {}".format(key.owner_trust)
122     assert len(key.subkeys) - 1 == n_subkeys, \
123         "Key `{}' has unexpected number of subkeys".format(uids[0][0])
124
125
126 def check_subkey(fpr, which, subkey):
127     assert not subkey.revoked, which + " key unexpectedly revoked"
128     assert not subkey.expired, which + " key unexpectedly expired"
129     assert not subkey.disabled, which + " key unexpectedly disabled"
130     assert not subkey.invalid, which + " key unexpectedly invalid"
131
132     if which == "Primary":
133         assert not subkey.can_encrypt, \
134             which + " key unexpectedly usable for encryption"
135         assert subkey.can_sign, \
136             which + " key unexpectedly unusable for signing"
137         assert subkey.can_certify, \
138             which + " key unexpectedly unusable for certifications"
139     else:
140         assert subkey.can_encrypt, \
141             which + " key unexpectedly unusable for encryption"
142         assert not subkey.can_sign, \
143             which + " key unexpectedly usable for signing"
144         assert not subkey.can_certify, \
145             which + " key unexpectedly usable for certifications"
146
147     assert not subkey.secret, which + " key unexpectedly secret"
148     assert not subkey.is_cardkey, "Public key marked as card key"
149     assert not subkey.card_number, "Public key with card number set"
150     assert not subkey.pubkey_algo != (gpg.constants.pk.DSA if which == "Primary"
151                                       else gpg.constants.pk.ELG_E), \
152         which + " key has unexpected public key algo: {}".\
153             format(subkey.pubkey_algo)
154     assert subkey.length == 1024, \
155         which + " key has unexpected length: {}".format(subkey.length)
156     assert fpr.endswith(subkey.keyid), \
157         which + " key has unexpected key ID: {}".format(subkey.keyid)
158     assert which == "Secondary" or subkey.fpr == fpr, \
159         which + " key has unexpected fingerprint: {}".format(subkey.fpr)
160     assert not subkey.expires, \
161         which + " key unexpectedly expires: {}".format(subkey.expires)
162
163 def check_uid(which, ref, uid):
164     assert not uid.revoked, which + " user ID unexpectedly revoked"
165     assert not uid.invalid, which + " user ID unexpectedly invalid"
166     assert uid.validity == gpg.constants.validity.UNKNOWN, \
167       which + " user ID has unexpected validity: {}".format(uid.validity)
168     assert not uid.signatures, which + " user ID unexpectedly signed"
169     assert uid.name == ref[0], \
170       "Unexpected name in {} user ID: {!r}".format(which.lower(), uid.name)
171     assert uid.comment == ref[1], \
172       "Unexpected comment in {} user ID: {!r}".format(which.lower(),
173                                                       uid.comment)
174     assert uid.email == ref[2], \
175       "Unexpected email in {} user ID: {!r}".format(which.lower(), uid.email)
176
177 # Export all the data from our keyring...
178 key_data = gpg.Data()
179 with gpg.Context() as c:
180   c.op_export_keys([c.get_key(k[0]) for k in keys], 0, key_data)
181
182 # ... rewind the tape...
183 key_data.rewind()
184
185 # ... and feed it into a keylist in an empty context.
186 with support.EphemeralContext() as c:
187     for i, key in enumerate(c.keylist(source=key_data)):
188         try:
189             if len(keys[i]) == 4:
190                 fpr, sec_keyid, uids, n_subkeys = keys[i]
191                 misc_check = None
192             else:
193                 fpr, sec_keyid, uids, n_subkeys, misc_check = keys[i]
194         except IndexError:
195             # There are more keys.  We don't check for that.
196             break
197
198         # Global key flags.
199         check_global(key, uids, n_subkeys)
200         check_subkey(fpr, "Primary", key.subkeys[0])
201         check_subkey(sec_keyid, "Secondary", key.subkeys[1])
202
203         assert len(key.uids) == len(uids)
204         check_uid("First", uids[0], key.uids[0])
205         if len(key.uids) > 1:
206           check_uid("Second", uids[1], key.uids[1])
207         if len(key.uids) > 2:
208           check_uid("Third", uids[2], key.uids[2])
209
210         if misc_check:
211             misc_check (uids[0][0], key)
212
213     assert len(list(c.keylist())) == 0, "Keys were imported"