e44763b5c27a0f6b1d62c588ef4d73d1d6a10d8f
[gnuk/gnuk.git] / tests / test_000_empty_card.py
1 """
2 test_empty_card.py - test empty card
3
4 Copyright (C) 2016, 2018  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 binascii import hexlify
24 from re import match, DOTALL
25 from struct import pack
26 from util import *
27 from card_const import *
28 import pytest
29
30 EMPTY_60=bytes(60)
31
32 def test_login(card):
33     login = get_data_object(card, 0x5e)
34     assert check_null(login)
35
36 """
37 def test_name(card):
38     name = get_data_object(card, 0x5b)
39     assert check_null(name)
40
41 def test_lang(card):
42     lang = get_data_object(card, 0x5f2d)
43     assert check_null(lang)
44
45 def test_sex(card):
46     sex = get_data_object(card, 0x5f35)
47     assert check_null(sex)
48 """
49
50 def test_name_lang_sex(card):
51     name = b""
52     lang = b""
53     lang_de = b"de"
54     sex = b"9"
55     expected = b'\x5b' + pack('B', len(name)) + name \
56                +  b'\x5f\x2d' + pack('B', len(lang)) + lang \
57                + b'\x5f\x35' + pack('B', len(sex)) + sex
58     expected_de = b'\x5b' + pack('B', len(name)) + name \
59                +  b'\x5f\x2d' + pack('B', len(lang_de)) + lang_de \
60                + b'\x5f\x35' + pack('B', len(sex)) + sex
61     name_lang_sex = get_data_object(card, 0x65)
62     assert name_lang_sex == b'' or name_lang_sex == expected or name_lang_sex == expected_de
63
64 def test_app_data(card):
65     app_data = get_data_object(card, 0x6e)
66     hist_len = app_data[20]
67     # FIXME: parse and check DO of C0, C1, C2, C3, C4, and C6
68     assert app_data[0:8] == b"\x4f\x10\xd2\x76\x00\x01\x24\x01" and \
69            app_data[18:18+2] == b"\x5f\x52"
70
71 def test_url(card):
72     url = get_data_object(card, 0x5f50)
73     assert check_null(url)
74
75 def test_ds_counter(card):
76     c = get_data_object(card, 0x7a)
77     assert c == b'\x93\x03\x00\x00\x00'
78
79 def test_pw1_status(card):
80     s = get_data_object(card, 0xc4)
81     assert match(b'\x00...\x03[\x00\x03]\x03', s, DOTALL)
82
83 def test_fingerprint_0(card):
84     fprlist = get_data_object(card, 0xC5)
85     assert fprlist == None or fprlist == EMPTY_60
86
87 def test_fingerprint_1(card):
88     fpr = get_data_object(card, 0xC7)
89     assert check_null(fpr)
90
91 def test_fingerprint_2(card):
92     fpr = get_data_object(card, 0xC8)
93     assert check_null(fpr)
94
95 def test_fingerprint_3(card):
96     fpr = get_data_object(card, 0xC9)
97     assert check_null(fpr)
98
99 def test_ca_fingerprint_0(card):
100     cafprlist = get_data_object(card, 0xC6)
101     assert cafprlist == None or cafprlist == EMPTY_60
102
103 def test_ca_fingerprint_1(card):
104     cafp = get_data_object(card, 0xCA)
105     assert check_null(cafp)
106
107 def test_ca_fingerprint_2(card):
108     cafp = get_data_object(card, 0xCB)
109     assert check_null(cafp)
110
111 def test_ca_fingerprint_3(card):
112     cafp = get_data_object(card, 0xCC)
113     assert check_null(cafp)
114
115 def test_timestamp_0(card):
116     t = get_data_object(card, 0xCD)
117     assert t == None or t == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
118
119 def test_timestamp_1(card):
120     t = get_data_object(card, 0xCE)
121     assert check_null(t)
122
123 def test_timestamp_2(card):
124     t = get_data_object(card, 0xCF)
125     assert check_null(t)
126
127 def test_timestamp_3(card):
128     t = get_data_object(card, 0xD0)
129     assert check_null(t)
130
131 def test_verify_pw1_1(card):
132     v = card.cmd_verify(1, FACTORY_PASSPHRASE_PW1)
133     assert v
134
135 def test_verify_pw1_2(card):
136     v = card.cmd_verify(2, FACTORY_PASSPHRASE_PW1)
137     assert v
138
139 def test_verify_pw3(card):
140     v = card.cmd_verify(3, FACTORY_PASSPHRASE_PW3)
141     assert v
142
143 def test_historical_bytes(card):
144     h = get_data_object(card, 0x5f52)
145     assert h == b'\x001\xc5s\xc0\x01@\x05\x90\x00' or \
146            h == b'\x00\x31\x84\x73\x80\x01\x80\x00\x90\x00' or \
147            h == b'\x00\x31\x84\x73\x80\x01\x80\x05\x90\x00' or \
148            h == b'\x00\x31\xf5\x73\xc0\x01\x60\x05\x90\x00'
149
150 def test_extended_capabilities(card):
151     a = get_data_object(card, 0xc0)
152     assert a == None or match(b'[\x70\x74\x75]\x00\x00\x20[\x00\x08]\x00\x00\xff\x01\x00', a)
153
154 def test_algorithm_attributes_1(card):
155     a = get_data_object(card, 0xc1)
156     assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
157
158 def test_algorithm_attributes_2(card):
159     a = get_data_object(card, 0xc2)
160     assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
161
162 def test_algorithm_attributes_3(card):
163     a = get_data_object(card, 0xc3)
164     assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
165
166 def test_public_key_1(card):
167     with pytest.raises(Exception) as excinfo:
168         pk = card.cmd_get_public_key(1)
169     assert excinfo.value.args[0] == "6a88"
170
171 def test_public_key_2(card):
172     with pytest.raises(Exception) as excinfo:
173         pk = card.cmd_get_public_key(2)
174     assert excinfo.value.args[0] == "6a88"
175
176 def test_public_key_3(card):
177     with pytest.raises(Exception) as excinfo:
178         pk = card.cmd_get_public_key(3)
179     assert excinfo.value.args[0] == "6a88"
180
181 def test_AID(card):
182     a = get_data_object(card, 0x4f)
183     print()
184     print("OpenPGP card version: %d.%d" % (a[6], a[7]))
185     print("Card Manufacturer:  ", hexlify(a[8:10]).decode("UTF-8"))
186     print("Card serial:    ", hexlify(a[10:14]).decode("UTF-8"))
187     assert match(b'\xd2\x76\x00\x01\\$\x01........\x00\x00', a, DOTALL)