Fix factory-reset.
[gnuk/gnuk.git] / tests / test_personalize_card.py
1 """
2 test_personalize_card.py - test personalizing card
3
4 Copyright (C) 2016  g10 Code GmbH
5 Author: NIIBE Yutaka <gniibe@fsij.org>
6
7 This file is a part of Gnuk, a GnuPG USB Token implementation.
8
9 Gnuk is free software: you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 Gnuk is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17 License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 """
22
23 from struct import pack
24 from re import match, DOTALL
25 from util import *
26 import rsa_keys
27
28 FACTORY_PASSPHRASE_PW1=b"123456"
29 FACTORY_PASSPHRASE_PW3=b"12345678"
30 PW1_TEST0=b"another user pass phrase"
31 PW1_TEST1=b"PASSPHRASE SHOULD BE LONG"
32 PW1_TEST2=b"new user pass phrase"
33 PW1_TEST3=b"next user pass phrase"
34 PW1_TEST4=b"another user pass phrase"
35 PW3_TEST0=b"admin pass phrase"
36 PW3_TEST1=b"another admin pass phrase"
37
38 RESETCODE_TEST=b"example reset code 000"
39
40 def test_setup_pw3_0(card):
41     r = card.cmd_change_reference_data(3, FACTORY_PASSPHRASE_PW3 + PW3_TEST0)
42     assert r
43
44 def test_verify_pw3_0(card):
45     v = card.cmd_verify(3, PW3_TEST0)
46     assert v
47
48 def test_login_put(card):
49     r = card.cmd_put_data(0x00, 0x5e, b"gpg_user")
50     assert r
51
52 def test_name_put(card):
53     r = card.cmd_put_data(0x00, 0x5b, b"GnuPG User")
54     assert r
55
56 def test_lang_put(card):
57     r = card.cmd_put_data(0x5f, 0x2d, b"ja")
58     assert r
59
60 def test_sex_put(card):
61     r = card.cmd_put_data(0x5f, 0x35, b"1")
62     assert r
63
64 def test_url_put(card):
65     r = card.cmd_put_data(0x5f, 0x50, b"https://www.fsij.org/gnuk/")
66     assert r
67
68 def test_pw1_status_put(card):
69     r = card.cmd_put_data(0x00, 0xc4, b"\x01")
70     assert r
71
72 def test_login(card):
73     login = get_data_object(card, 0x5e)
74     assert login == b"gpg_user"
75
76 def test_name_lang_sex(card):
77     name = b"GnuPG User"
78     lang = b"ja"
79     sex = b"1"
80     expected = b'\x5b' + pack('B', len(name)) + name \
81                +  b'\x5f\x2d' + pack('B', len(lang)) + lang \
82                + b'\x5f\x35' + pack('B', len(sex)) + sex
83     name_lang_sex = get_data_object(card, 0x65)
84     assert name_lang_sex == expected
85
86 def test_url(card):
87     url = get_data_object(card, 0x5f50)
88     assert url == b"https://www.fsij.org/gnuk/"
89
90 def test_pw1_status(card):
91     s = get_data_object(card, 0xc4)
92     assert match(b'\x01...\x03[\x00\x03]\x03', s, DOTALL)
93
94 def test_rsa_import_key_1(card):
95     t = rsa_keys.build_privkey_template(1, 0)
96     r = card.cmd_put_data_odd(0x3f, 0xff, t)
97     assert r
98
99 def test_rsa_import_key_2(card):
100     t = rsa_keys.build_privkey_template(2, 1)
101     r = card.cmd_put_data_odd(0x3f, 0xff, t)
102     assert r
103
104 def test_rsa_import_key_3(card):
105     t = rsa_keys.build_privkey_template(3, 2)
106     r = card.cmd_put_data_odd(0x3f, 0xff, t)
107     assert r
108
109 def test_fingerprint_1_put(card):
110     fpr1 = rsa_keys.fpr[0]
111     r = card.cmd_put_data(0x00, 0xc7, fpr1)
112     assert r
113
114 def test_fingerprint_2_put(card):
115     fpr2 = rsa_keys.fpr[1]
116     r = card.cmd_put_data(0x00, 0xc8, fpr2)
117     assert r
118
119 def test_fingerprint_3_put(card):
120     fpr3 = rsa_keys.fpr[2]
121     r = card.cmd_put_data(0x00, 0xc9, fpr3)
122     assert r
123
124 def test_timestamp_1_put(card):
125     timestamp1 = rsa_keys.timestamp[0]
126     r = card.cmd_put_data(0x00, 0xce, timestamp1)
127     assert r
128
129 def test_timestamp_2_put(card):
130     timestamp2 = rsa_keys.timestamp[1]
131     r = card.cmd_put_data(0x00, 0xcf, timestamp2)
132     assert r
133
134 def test_timestamp_3_put(card):
135     timestamp3 = rsa_keys.timestamp[2]
136     r = card.cmd_put_data(0x00, 0xd0, timestamp3)
137     assert r
138
139 def test_ds_counter_0(card):
140     c = get_data_object(card, 0x7a)
141     assert c == b'\x93\x03\x00\x00\x00'
142
143 def test_pw1_status(card):
144     s = get_data_object(card, 0xc4)
145     assert match(b'\x01...\x03[\x00\x03]\x03', s, DOTALL)
146
147 def test_app_data(card):
148     app_data = get_data_object(card, 0x6e)
149     hist_len = app_data[20]
150     # FIXME: parse and check DO of C0, C1, C2, C3, C4, and C6
151     assert app_data[0:8] == b"\x4f\x10\xd2\x76\x00\x01\x24\x01" and \
152            app_data[18:18+2] == b"\x5f\x52"
153
154 def test_public_key_1(card):
155     pk = card.cmd_get_public_key(1)
156     assert rsa_keys.key[0][0] == pk[9:9+256]
157
158 def test_public_key_2(card):
159     pk = card.cmd_get_public_key(2)
160     assert rsa_keys.key[1][0] == pk[9:9+256]
161
162 def test_public_key_3(card):
163     pk = card.cmd_get_public_key(3)
164     assert rsa_keys.key[2][0] == pk[9:9+256]
165
166 def test_setup_pw1_0(card):
167     r = card.cmd_change_reference_data(1, FACTORY_PASSPHRASE_PW1 + PW1_TEST0)
168     assert r
169
170 def test_verify_pw1_0(card):
171     v = card.cmd_verify(1, PW1_TEST0)
172     assert v
173
174 def test_verify_pw1_0_2(card):
175     v = card.cmd_verify(2, PW1_TEST0)
176     assert v
177
178 def test_setup_pw1_1(card):
179     r = card.cmd_change_reference_data(1, PW1_TEST0 + PW1_TEST1)
180     assert r
181
182 def test_verify_pw1_1(card):
183     v = card.cmd_verify(1, PW1_TEST1)
184     assert v
185
186 def test_verify_pw1_1_2(card):
187     v = card.cmd_verify(2, PW1_TEST1)
188     assert v
189
190 def test_setup_reset_code(card):
191     r = card.cmd_put_data(0x00, 0xd3, RESETCODE_TEST)
192     assert r
193
194 def test_reset_code(card):
195     r = card.cmd_reset_retry_counter(0, 0x81, RESETCODE_TEST + PW1_TEST2)
196     assert r
197
198 def test_verify_pw1_2(card):
199     v = card.cmd_verify(1, PW1_TEST2)
200     assert v
201
202 def test_verify_pw1_2_2(card):
203     v = card.cmd_verify(2, PW1_TEST2)
204     assert v
205
206 def test_setup_pw3_1(card):
207     r = card.cmd_change_reference_data(3, PW3_TEST0 + PW3_TEST1)
208     assert r
209
210 def test_verify_pw3_1(card):
211     v = card.cmd_verify(3, PW3_TEST1)
212     assert v
213
214 def test_reset_userpass_admin(card):
215     r = card.cmd_reset_retry_counter(2, 0x81, PW1_TEST3)
216     assert r
217
218 def test_verify_pw1_3(card):
219     v = card.cmd_verify(1, PW1_TEST3)
220     assert v
221
222 def test_verify_pw1_3_2(card):
223     v = card.cmd_verify(2, PW1_TEST3)
224     assert v
225
226 def test_setup_pw1_4(card):
227     r = card.cmd_change_reference_data(1, PW1_TEST3 + PW1_TEST4)
228     assert r
229
230 def test_verify_pw1_4(card):
231     v = card.cmd_verify(1, PW1_TEST4)
232     assert v
233
234 def test_verify_pw1_4_2(card):
235     v = card.cmd_verify(2, PW1_TEST4)
236     assert v
237
238 def test_setup_pw3_2(card):
239     r = card.cmd_change_reference_data(3, PW3_TEST1 + PW3_TEST0)
240     assert r
241
242 def test_verify_pw3_2(card):
243     v = card.cmd_verify(3, PW3_TEST0)
244     assert v
245
246 PLAIN_TEXT0=b"This is a test message."
247 PLAIN_TEXT1=b"RSA decryption is as easy as pie."
248 PLAIN_TEXT2=b"This is another test message.\nMultiple lines.\n"
249
250 def test_sign_0(card):
251     digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT0)
252     r = card.cmd_pso(0x9e, 0x9a, digestinfo)
253     sig = rsa_keys.compute_signature(0, digestinfo)
254     sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
255     assert r == sig_bytes
256
257 def test_sign_1(card):
258     digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT1)
259     r = card.cmd_pso(0x9e, 0x9a, digestinfo)
260     sig = rsa_keys.compute_signature(0, digestinfo)
261     sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
262     assert r == sig_bytes
263
264 def test_ds_counter_1(card):
265     c = get_data_object(card, 0x7a)
266     assert c == b'\x93\x03\x00\x00\x02'
267
268 def test_sign_auth_0(card):
269     digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT0)
270     r = card.cmd_internal_authenticate(digestinfo)
271     sig = rsa_keys.compute_signature(2, digestinfo)
272     sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
273     assert r == sig_bytes
274
275 def test_sign_auth_1(card):
276     digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT1)
277     r = card.cmd_internal_authenticate(digestinfo)
278     sig = rsa_keys.compute_signature(2, digestinfo)
279     sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
280     assert r == sig_bytes
281
282 def test_decrypt_0(card):
283     ciphertext = rsa_keys.encrypt(1, PLAIN_TEXT0)
284     r = card.cmd_pso(0x80, 0x86, ciphertext)
285     assert r == PLAIN_TEXT0
286
287 def test_decrypt_1(card):
288     ciphertext = rsa_keys.encrypt(1, PLAIN_TEXT1)
289     r = card.cmd_pso(0x80, 0x86, ciphertext)
290     assert r == PLAIN_TEXT1