Rename tests.
authorNIIBE Yutaka <gniibe@fsij.org>
Tue, 3 Apr 2018 23:48:40 +0000 (08:48 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Tue, 3 Apr 2018 23:48:40 +0000 (08:48 +0900)
tests/test_000_empty_card.py [new file with mode: 0644]
tests/test_001_personalize_card.py [new file with mode: 0644]
tests/test_002_personalize_reset_card.py [new file with mode: 0644]
tests/test_003_remove_keys_card.py [new file with mode: 0644]
tests/test_empty_card.py [deleted file]
tests/test_personalize_card.py [deleted file]
tests/test_personalize_reset_card.py [deleted file]
tests/test_remove_keys_card.py [deleted file]

diff --git a/tests/test_000_empty_card.py b/tests/test_000_empty_card.py
new file mode 100644 (file)
index 0000000..0ad498a
--- /dev/null
@@ -0,0 +1,184 @@
+"""
+test_empty_card.py - test empty card
+
+Copyright (C) 2016  g10 Code GmbH
+Author: NIIBE Yutaka <gniibe@fsij.org>
+
+This file is a part of Gnuk, a GnuPG USB Token implementation.
+
+Gnuk is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Gnuk is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from binascii import hexlify
+from re import match, DOTALL
+from struct import pack
+from util import *
+import pytest
+
+EMPTY_60=bytes(60)
+
+FACTORY_PASSPHRASE_PW1=b"123456"
+FACTORY_PASSPHRASE_PW3=b"12345678"
+
+def test_login(card):
+    login = get_data_object(card, 0x5e)
+    assert check_null(login)
+
+"""
+def test_name(card):
+    name = get_data_object(card, 0x5b)
+    assert check_null(name)
+
+def test_lang(card):
+    lang = get_data_object(card, 0x5f2d)
+    assert check_null(lang)
+
+def test_sex(card):
+    sex = get_data_object(card, 0x5f35)
+    assert check_null(sex)
+"""
+
+def test_name_lang_sex(card):
+    name = b""
+    lang = b""
+    sex = b"9"
+    expected = b'\x5b' + pack('B', len(name)) + name \
+               +  b'\x5f\x2d' + pack('B', len(lang)) + lang \
+               + b'\x5f\x35' + pack('B', len(sex)) + sex
+    name_lang_sex = get_data_object(card, 0x65)
+    assert name_lang_sex == b'' or name_lang_sex == expected
+
+def test_app_data(card):
+    app_data = get_data_object(card, 0x6e)
+    hist_len = app_data[20]
+    # FIXME: parse and check DO of C0, C1, C2, C3, C4, and C6
+    assert app_data[0:8] == b"\x4f\x10\xd2\x76\x00\x01\x24\x01" and \
+           app_data[18:18+2] == b"\x5f\x52"
+
+def test_url(card):
+    url = get_data_object(card, 0x5f50)
+    assert check_null(url)
+
+def test_ds_counter(card):
+    c = get_data_object(card, 0x7a)
+    assert c == b'\x93\x03\x00\x00\x00'
+
+def test_pw1_status(card):
+    s = get_data_object(card, 0xc4)
+    assert match(b'\x00...\x03[\x00\x03]\x03', s, DOTALL)
+
+def test_fingerprint_0(card):
+    fprlist = get_data_object(card, 0xC5)
+    assert fprlist == None or fprlist == EMPTY_60
+
+def test_fingerprint_1(card):
+    fpr = get_data_object(card, 0xC7)
+    assert check_null(fpr)
+
+def test_fingerprint_2(card):
+    fpr = get_data_object(card, 0xC8)
+    assert check_null(fpr)
+
+def test_fingerprint_3(card):
+    fpr = get_data_object(card, 0xC9)
+    assert check_null(fpr)
+
+def test_ca_fingerprint_0(card):
+    cafprlist = get_data_object(card, 0xC6)
+    assert cafprlist == None or cafprlist == EMPTY_60
+
+def test_ca_fingerprint_1(card):
+    cafp = get_data_object(card, 0xCA)
+    assert check_null(cafp)
+
+def test_ca_fingerprint_2(card):
+    cafp = get_data_object(card, 0xCB)
+    assert check_null(cafp)
+
+def test_ca_fingerprint_3(card):
+    cafp = get_data_object(card, 0xCC)
+    assert check_null(cafp)
+
+def test_timestamp_0(card):
+    t = get_data_object(card, 0xCD)
+    assert t == None or t == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+def test_timestamp_1(card):
+    t = get_data_object(card, 0xCE)
+    assert check_null(t)
+
+def test_timestamp_2(card):
+    t = get_data_object(card, 0xCF)
+    assert check_null(t)
+
+def test_timestamp_3(card):
+    t = get_data_object(card, 0xD0)
+    assert check_null(t)
+
+def test_verify_pw1_1(card):
+    v = card.cmd_verify(1, FACTORY_PASSPHRASE_PW1)
+    assert v
+
+def test_verify_pw1_2(card):
+    v = card.cmd_verify(2, FACTORY_PASSPHRASE_PW1)
+    assert v
+
+def test_verify_pw3(card):
+    v = card.cmd_verify(3, FACTORY_PASSPHRASE_PW3)
+    assert v
+
+def test_historical_bytes(card):
+    h = get_data_object(card, 0x5f52)
+    assert h == b'\x001\xc5s\xc0\x01@\x05\x90\x00' or \
+           h == b'\x00\x31\x84\x73\x80\x01\x80\x00\x90\x00' or \
+           h == b'\x00\x31\x84\x73\x80\x01\x80\x05\x90\x00'
+
+def test_extended_capabilities(card):
+    a = get_data_object(card, 0xc0)
+    assert a == None or match(b'[\x70\x74\x75]\x00\x00\x20[\x00\x08]\x00\x00\xff\x01\x00', a)
+
+def test_algorithm_attributes_1(card):
+    a = get_data_object(card, 0xc1)
+    assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
+
+def test_algorithm_attributes_2(card):
+    a = get_data_object(card, 0xc2)
+    assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
+
+def test_algorithm_attributes_3(card):
+    a = get_data_object(card, 0xc3)
+    assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
+
+def test_public_key_1(card):
+    with pytest.raises(Exception) as excinfo:
+        pk = card.cmd_get_public_key(1)
+    assert excinfo.value.args[0] == "6a88"
+
+def test_public_key_2(card):
+    with pytest.raises(Exception) as excinfo:
+        pk = card.cmd_get_public_key(2)
+    assert excinfo.value.args[0] == "6a88"
+
+def test_public_key_3(card):
+    with pytest.raises(Exception) as excinfo:
+        pk = card.cmd_get_public_key(3)
+    assert excinfo.value.args[0] == "6a88"
+
+def test_AID(card):
+    a = get_data_object(card, 0x4f)
+    print()
+    print("OpenPGP card version: %d.%d" % (a[6], a[7]))
+    print("Card Manufacturer:  ", hexlify(a[8:10]).decode("UTF-8"))
+    print("Card serial:    ", hexlify(a[10:14]).decode("UTF-8"))
+    assert match(b'\xd2\x76\x00\x01\\$\x01........\x00\x00', a, DOTALL)
diff --git a/tests/test_001_personalize_card.py b/tests/test_001_personalize_card.py
new file mode 100644 (file)
index 0000000..c22af93
--- /dev/null
@@ -0,0 +1,290 @@
+"""
+test_personalize_card.py - test personalizing card
+
+Copyright (C) 2016  g10 Code GmbH
+Author: NIIBE Yutaka <gniibe@fsij.org>
+
+This file is a part of Gnuk, a GnuPG USB Token implementation.
+
+Gnuk is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Gnuk is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from struct import pack
+from re import match, DOTALL
+from util import *
+import rsa_keys
+
+FACTORY_PASSPHRASE_PW1=b"123456"
+FACTORY_PASSPHRASE_PW3=b"12345678"
+PW1_TEST0=b"another user pass phrase"
+PW1_TEST1=b"PASSPHRASE SHOULD BE LONG"
+PW1_TEST2=b"new user pass phrase"
+PW1_TEST3=b"next user pass phrase"
+PW1_TEST4=b"another user pass phrase"
+PW3_TEST0=b"admin pass phrase"
+PW3_TEST1=b"another admin pass phrase"
+
+RESETCODE_TEST=b"example reset code 000"
+
+def test_setup_pw3_0(card):
+    r = card.cmd_change_reference_data(3, FACTORY_PASSPHRASE_PW3 + PW3_TEST0)
+    assert r
+
+def test_verify_pw3_0(card):
+    v = card.cmd_verify(3, PW3_TEST0)
+    assert v
+
+def test_login_put(card):
+    r = card.cmd_put_data(0x00, 0x5e, b"gpg_user")
+    assert r
+
+def test_name_put(card):
+    r = card.cmd_put_data(0x00, 0x5b, b"GnuPG User")
+    assert r
+
+def test_lang_put(card):
+    r = card.cmd_put_data(0x5f, 0x2d, b"ja")
+    assert r
+
+def test_sex_put(card):
+    r = card.cmd_put_data(0x5f, 0x35, b"1")
+    assert r
+
+def test_url_put(card):
+    r = card.cmd_put_data(0x5f, 0x50, b"https://www.fsij.org/gnuk/")
+    assert r
+
+def test_pw1_status_put(card):
+    r = card.cmd_put_data(0x00, 0xc4, b"\x01")
+    assert r
+
+def test_login(card):
+    login = get_data_object(card, 0x5e)
+    assert login == b"gpg_user"
+
+def test_name_lang_sex(card):
+    name = b"GnuPG User"
+    lang = b"ja"
+    sex = b"1"
+    expected = b'\x5b' + pack('B', len(name)) + name \
+               +  b'\x5f\x2d' + pack('B', len(lang)) + lang \
+               + b'\x5f\x35' + pack('B', len(sex)) + sex
+    name_lang_sex = get_data_object(card, 0x65)
+    assert name_lang_sex == expected
+
+def test_url(card):
+    url = get_data_object(card, 0x5f50)
+    assert url == b"https://www.fsij.org/gnuk/"
+
+def test_pw1_status(card):
+    s = get_data_object(card, 0xc4)
+    assert match(b'\x01...\x03[\x00\x03]\x03', s, DOTALL)
+
+def test_rsa_import_key_1(card):
+    t = rsa_keys.build_privkey_template(1, 0)
+    r = card.cmd_put_data_odd(0x3f, 0xff, t)
+    assert r
+
+def test_rsa_import_key_2(card):
+    t = rsa_keys.build_privkey_template(2, 1)
+    r = card.cmd_put_data_odd(0x3f, 0xff, t)
+    assert r
+
+def test_rsa_import_key_3(card):
+    t = rsa_keys.build_privkey_template(3, 2)
+    r = card.cmd_put_data_odd(0x3f, 0xff, t)
+    assert r
+
+def test_fingerprint_1_put(card):
+    fpr1 = rsa_keys.fpr[0]
+    r = card.cmd_put_data(0x00, 0xc7, fpr1)
+    assert r
+
+def test_fingerprint_2_put(card):
+    fpr2 = rsa_keys.fpr[1]
+    r = card.cmd_put_data(0x00, 0xc8, fpr2)
+    assert r
+
+def test_fingerprint_3_put(card):
+    fpr3 = rsa_keys.fpr[2]
+    r = card.cmd_put_data(0x00, 0xc9, fpr3)
+    assert r
+
+def test_timestamp_1_put(card):
+    timestamp1 = rsa_keys.timestamp[0]
+    r = card.cmd_put_data(0x00, 0xce, timestamp1)
+    assert r
+
+def test_timestamp_2_put(card):
+    timestamp2 = rsa_keys.timestamp[1]
+    r = card.cmd_put_data(0x00, 0xcf, timestamp2)
+    assert r
+
+def test_timestamp_3_put(card):
+    timestamp3 = rsa_keys.timestamp[2]
+    r = card.cmd_put_data(0x00, 0xd0, timestamp3)
+    assert r
+
+def test_ds_counter_0(card):
+    c = get_data_object(card, 0x7a)
+    assert c == b'\x93\x03\x00\x00\x00'
+
+def test_pw1_status(card):
+    s = get_data_object(card, 0xc4)
+    assert match(b'\x01...\x03[\x00\x03]\x03', s, DOTALL)
+
+def test_app_data(card):
+    app_data = get_data_object(card, 0x6e)
+    hist_len = app_data[20]
+    # FIXME: parse and check DO of C0, C1, C2, C3, C4, and C6
+    assert app_data[0:8] == b"\x4f\x10\xd2\x76\x00\x01\x24\x01" and \
+           app_data[18:18+2] == b"\x5f\x52"
+
+def test_public_key_1(card):
+    pk = card.cmd_get_public_key(1)
+    assert rsa_keys.key[0][0] == pk[9:9+256]
+
+def test_public_key_2(card):
+    pk = card.cmd_get_public_key(2)
+    assert rsa_keys.key[1][0] == pk[9:9+256]
+
+def test_public_key_3(card):
+    pk = card.cmd_get_public_key(3)
+    assert rsa_keys.key[2][0] == pk[9:9+256]
+
+def test_setup_pw1_0(card):
+    r = card.cmd_change_reference_data(1, FACTORY_PASSPHRASE_PW1 + PW1_TEST0)
+    assert r
+
+def test_verify_pw1_0(card):
+    v = card.cmd_verify(1, PW1_TEST0)
+    assert v
+
+def test_verify_pw1_0_2(card):
+    v = card.cmd_verify(2, PW1_TEST0)
+    assert v
+
+def test_setup_pw1_1(card):
+    r = card.cmd_change_reference_data(1, PW1_TEST0 + PW1_TEST1)
+    assert r
+
+def test_verify_pw1_1(card):
+    v = card.cmd_verify(1, PW1_TEST1)
+    assert v
+
+def test_verify_pw1_1_2(card):
+    v = card.cmd_verify(2, PW1_TEST1)
+    assert v
+
+def test_setup_reset_code(card):
+    r = card.cmd_put_data(0x00, 0xd3, RESETCODE_TEST)
+    assert r
+
+def test_reset_code(card):
+    r = card.cmd_reset_retry_counter(0, 0x81, RESETCODE_TEST + PW1_TEST2)
+    assert r
+
+def test_verify_pw1_2(card):
+    v = card.cmd_verify(1, PW1_TEST2)
+    assert v
+
+def test_verify_pw1_2_2(card):
+    v = card.cmd_verify(2, PW1_TEST2)
+    assert v
+
+def test_setup_pw3_1(card):
+    r = card.cmd_change_reference_data(3, PW3_TEST0 + PW3_TEST1)
+    assert r
+
+def test_verify_pw3_1(card):
+    v = card.cmd_verify(3, PW3_TEST1)
+    assert v
+
+def test_reset_userpass_admin(card):
+    r = card.cmd_reset_retry_counter(2, 0x81, PW1_TEST3)
+    assert r
+
+def test_verify_pw1_3(card):
+    v = card.cmd_verify(1, PW1_TEST3)
+    assert v
+
+def test_verify_pw1_3_2(card):
+    v = card.cmd_verify(2, PW1_TEST3)
+    assert v
+
+def test_setup_pw1_4(card):
+    r = card.cmd_change_reference_data(1, PW1_TEST3 + PW1_TEST4)
+    assert r
+
+def test_verify_pw1_4(card):
+    v = card.cmd_verify(1, PW1_TEST4)
+    assert v
+
+def test_verify_pw1_4_2(card):
+    v = card.cmd_verify(2, PW1_TEST4)
+    assert v
+
+def test_setup_pw3_2(card):
+    r = card.cmd_change_reference_data(3, PW3_TEST1 + PW3_TEST0)
+    assert r
+
+def test_verify_pw3_2(card):
+    v = card.cmd_verify(3, PW3_TEST0)
+    assert v
+
+PLAIN_TEXT0=b"This is a test message."
+PLAIN_TEXT1=b"RSA decryption is as easy as pie."
+PLAIN_TEXT2=b"This is another test message.\nMultiple lines.\n"
+
+def test_sign_0(card):
+    digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT0)
+    r = card.cmd_pso(0x9e, 0x9a, digestinfo)
+    sig = rsa_keys.compute_signature(0, digestinfo)
+    sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
+    assert r == sig_bytes
+
+def test_sign_1(card):
+    digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT1)
+    r = card.cmd_pso(0x9e, 0x9a, digestinfo)
+    sig = rsa_keys.compute_signature(0, digestinfo)
+    sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
+    assert r == sig_bytes
+
+def test_ds_counter_1(card):
+    c = get_data_object(card, 0x7a)
+    assert c == b'\x93\x03\x00\x00\x02'
+
+def test_sign_auth_0(card):
+    digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT0)
+    r = card.cmd_internal_authenticate(digestinfo)
+    sig = rsa_keys.compute_signature(2, digestinfo)
+    sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
+    assert r == sig_bytes
+
+def test_sign_auth_1(card):
+    digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT1)
+    r = card.cmd_internal_authenticate(digestinfo)
+    sig = rsa_keys.compute_signature(2, digestinfo)
+    sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
+    assert r == sig_bytes
+
+def test_decrypt_0(card):
+    ciphertext = rsa_keys.encrypt(1, PLAIN_TEXT0)
+    r = card.cmd_pso(0x80, 0x86, ciphertext)
+    assert r == PLAIN_TEXT0
+
+def test_decrypt_1(card):
+    ciphertext = rsa_keys.encrypt(1, PLAIN_TEXT1)
+    r = card.cmd_pso(0x80, 0x86, ciphertext)
+    assert r == PLAIN_TEXT1
diff --git a/tests/test_002_personalize_reset_card.py b/tests/test_002_personalize_reset_card.py
new file mode 100644 (file)
index 0000000..ab6828a
--- /dev/null
@@ -0,0 +1,91 @@
+"""
+test_personalize_reset_card.py - test resetting personalization of card
+
+Copyright (C) 2016  g10 Code GmbH
+Author: NIIBE Yutaka <gniibe@fsij.org>
+
+This file is a part of Gnuk, a GnuPG USB Token implementation.
+
+Gnuk is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Gnuk is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from struct import pack
+from re import match, DOTALL
+from util import *
+import rsa_keys
+
+FACTORY_PASSPHRASE_PW1=b"123456"
+FACTORY_PASSPHRASE_PW3=b"12345678"
+PW1_TEST0=b"another user pass phrase"
+PW1_TEST1=b"PASSPHRASE SHOULD BE LONG"
+PW1_TEST2=b"new user pass phrase"
+PW1_TEST3=b"next user pass phrase"
+PW1_TEST4=b"another user pass phrase"
+PW3_TEST0=b"admin pass phrase"
+PW3_TEST1=b"another admin pass phrase"
+
+RESETCODE_TEST=b"example reset code 000"
+
+def test_login_put(card):
+    r = card.cmd_put_data(0x00, 0x5e, b"")
+    assert r
+
+def test_name_put(card):
+    r = card.cmd_put_data(0x00, 0x5b, b"")
+    assert r
+
+def test_lang_put(card):
+    r = card.cmd_put_data(0x5f, 0x2d, b"")
+    assert r
+
+def test_sex_put(card):
+    try:
+        # Gnuk
+        r = card.cmd_put_data(0x5f, 0x35, b"")
+    except ValueError:
+        # OpenPGP card which doesn't allow b""
+        r = card.cmd_put_data(0x5f, 0x35, b"9")
+    assert r
+
+def test_url_put(card):
+    r = card.cmd_put_data(0x5f, 0x50, b"")
+    assert r
+
+def test_pw1_status_put(card):
+    r = card.cmd_put_data(0x00, 0xc4, b"\x00")
+    assert r
+
+def test_setup_pw3_0(card):
+    r = card.cmd_change_reference_data(3, PW3_TEST0 + FACTORY_PASSPHRASE_PW3)
+    assert r
+
+def test_verify_pw3_0(card):
+    v = card.cmd_verify(3, FACTORY_PASSPHRASE_PW3)
+    assert v
+
+def test_setup_pw1_0(card):
+    r = card.cmd_change_reference_data(1, PW1_TEST4 + FACTORY_PASSPHRASE_PW1)
+    assert r
+
+def test_verify_pw1_0(card):
+    v = card.cmd_verify(1, FACTORY_PASSPHRASE_PW1)
+    assert v
+
+def test_verify_pw1_0_2(card):
+    v = card.cmd_verify(2, FACTORY_PASSPHRASE_PW1)
+    assert v
+
+def test_setup_reset_code(card):
+    r = card.cmd_put_data(0x00, 0xd3, b"")
+    assert r
diff --git a/tests/test_003_remove_keys_card.py b/tests/test_003_remove_keys_card.py
new file mode 100644 (file)
index 0000000..c185a26
--- /dev/null
@@ -0,0 +1,44 @@
+"""
+test_remove_keys_card.py - test removing keys on card
+
+Copyright (C) 2016  g10 Code GmbH
+Author: NIIBE Yutaka <gniibe@fsij.org>
+
+This file is a part of Gnuk, a GnuPG USB Token implementation.
+
+Gnuk is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Gnuk is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+# Remove a key material on card by changing algorithm attributes of the key
+
+KEY_ATTRIBUTES_RSA4K=b"\x01\x10\x00\x00\x20\x00"
+KEY_ATTRIBUTES_RSA2K=b"\x01\x08\x00\x00\x20\x00"
+
+def test_rsa_import_key_1(card):
+    r = card.cmd_put_data(0x00, 0xc1, KEY_ATTRIBUTES_RSA4K)
+    if r:
+        r = card.cmd_put_data(0x00, 0xc1, KEY_ATTRIBUTES_RSA2K)
+    assert r
+
+def test_rsa_import_key_2(card):
+    r = card.cmd_put_data(0x00, 0xc2, KEY_ATTRIBUTES_RSA4K)
+    if r:
+        r = card.cmd_put_data(0x00, 0xc2, KEY_ATTRIBUTES_RSA2K)
+    assert r
+
+def test_rsa_import_key_3(card):
+    r = card.cmd_put_data(0x00, 0xc3, KEY_ATTRIBUTES_RSA4K)
+    if r:
+        r = card.cmd_put_data(0x00, 0xc3, KEY_ATTRIBUTES_RSA2K)
+    assert r
diff --git a/tests/test_empty_card.py b/tests/test_empty_card.py
deleted file mode 100644 (file)
index 0ad498a..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-"""
-test_empty_card.py - test empty card
-
-Copyright (C) 2016  g10 Code GmbH
-Author: NIIBE Yutaka <gniibe@fsij.org>
-
-This file is a part of Gnuk, a GnuPG USB Token implementation.
-
-Gnuk is free software: you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Gnuk is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
-License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-
-from binascii import hexlify
-from re import match, DOTALL
-from struct import pack
-from util import *
-import pytest
-
-EMPTY_60=bytes(60)
-
-FACTORY_PASSPHRASE_PW1=b"123456"
-FACTORY_PASSPHRASE_PW3=b"12345678"
-
-def test_login(card):
-    login = get_data_object(card, 0x5e)
-    assert check_null(login)
-
-"""
-def test_name(card):
-    name = get_data_object(card, 0x5b)
-    assert check_null(name)
-
-def test_lang(card):
-    lang = get_data_object(card, 0x5f2d)
-    assert check_null(lang)
-
-def test_sex(card):
-    sex = get_data_object(card, 0x5f35)
-    assert check_null(sex)
-"""
-
-def test_name_lang_sex(card):
-    name = b""
-    lang = b""
-    sex = b"9"
-    expected = b'\x5b' + pack('B', len(name)) + name \
-               +  b'\x5f\x2d' + pack('B', len(lang)) + lang \
-               + b'\x5f\x35' + pack('B', len(sex)) + sex
-    name_lang_sex = get_data_object(card, 0x65)
-    assert name_lang_sex == b'' or name_lang_sex == expected
-
-def test_app_data(card):
-    app_data = get_data_object(card, 0x6e)
-    hist_len = app_data[20]
-    # FIXME: parse and check DO of C0, C1, C2, C3, C4, and C6
-    assert app_data[0:8] == b"\x4f\x10\xd2\x76\x00\x01\x24\x01" and \
-           app_data[18:18+2] == b"\x5f\x52"
-
-def test_url(card):
-    url = get_data_object(card, 0x5f50)
-    assert check_null(url)
-
-def test_ds_counter(card):
-    c = get_data_object(card, 0x7a)
-    assert c == b'\x93\x03\x00\x00\x00'
-
-def test_pw1_status(card):
-    s = get_data_object(card, 0xc4)
-    assert match(b'\x00...\x03[\x00\x03]\x03', s, DOTALL)
-
-def test_fingerprint_0(card):
-    fprlist = get_data_object(card, 0xC5)
-    assert fprlist == None or fprlist == EMPTY_60
-
-def test_fingerprint_1(card):
-    fpr = get_data_object(card, 0xC7)
-    assert check_null(fpr)
-
-def test_fingerprint_2(card):
-    fpr = get_data_object(card, 0xC8)
-    assert check_null(fpr)
-
-def test_fingerprint_3(card):
-    fpr = get_data_object(card, 0xC9)
-    assert check_null(fpr)
-
-def test_ca_fingerprint_0(card):
-    cafprlist = get_data_object(card, 0xC6)
-    assert cafprlist == None or cafprlist == EMPTY_60
-
-def test_ca_fingerprint_1(card):
-    cafp = get_data_object(card, 0xCA)
-    assert check_null(cafp)
-
-def test_ca_fingerprint_2(card):
-    cafp = get_data_object(card, 0xCB)
-    assert check_null(cafp)
-
-def test_ca_fingerprint_3(card):
-    cafp = get_data_object(card, 0xCC)
-    assert check_null(cafp)
-
-def test_timestamp_0(card):
-    t = get_data_object(card, 0xCD)
-    assert t == None or t == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
-
-def test_timestamp_1(card):
-    t = get_data_object(card, 0xCE)
-    assert check_null(t)
-
-def test_timestamp_2(card):
-    t = get_data_object(card, 0xCF)
-    assert check_null(t)
-
-def test_timestamp_3(card):
-    t = get_data_object(card, 0xD0)
-    assert check_null(t)
-
-def test_verify_pw1_1(card):
-    v = card.cmd_verify(1, FACTORY_PASSPHRASE_PW1)
-    assert v
-
-def test_verify_pw1_2(card):
-    v = card.cmd_verify(2, FACTORY_PASSPHRASE_PW1)
-    assert v
-
-def test_verify_pw3(card):
-    v = card.cmd_verify(3, FACTORY_PASSPHRASE_PW3)
-    assert v
-
-def test_historical_bytes(card):
-    h = get_data_object(card, 0x5f52)
-    assert h == b'\x001\xc5s\xc0\x01@\x05\x90\x00' or \
-           h == b'\x00\x31\x84\x73\x80\x01\x80\x00\x90\x00' or \
-           h == b'\x00\x31\x84\x73\x80\x01\x80\x05\x90\x00'
-
-def test_extended_capabilities(card):
-    a = get_data_object(card, 0xc0)
-    assert a == None or match(b'[\x70\x74\x75]\x00\x00\x20[\x00\x08]\x00\x00\xff\x01\x00', a)
-
-def test_algorithm_attributes_1(card):
-    a = get_data_object(card, 0xc1)
-    assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
-
-def test_algorithm_attributes_2(card):
-    a = get_data_object(card, 0xc2)
-    assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
-
-def test_algorithm_attributes_3(card):
-    a = get_data_object(card, 0xc3)
-    assert a == None or a == b'\x01\x08\x00\x00\x20\x00'
-
-def test_public_key_1(card):
-    with pytest.raises(Exception) as excinfo:
-        pk = card.cmd_get_public_key(1)
-    assert excinfo.value.args[0] == "6a88"
-
-def test_public_key_2(card):
-    with pytest.raises(Exception) as excinfo:
-        pk = card.cmd_get_public_key(2)
-    assert excinfo.value.args[0] == "6a88"
-
-def test_public_key_3(card):
-    with pytest.raises(Exception) as excinfo:
-        pk = card.cmd_get_public_key(3)
-    assert excinfo.value.args[0] == "6a88"
-
-def test_AID(card):
-    a = get_data_object(card, 0x4f)
-    print()
-    print("OpenPGP card version: %d.%d" % (a[6], a[7]))
-    print("Card Manufacturer:  ", hexlify(a[8:10]).decode("UTF-8"))
-    print("Card serial:    ", hexlify(a[10:14]).decode("UTF-8"))
-    assert match(b'\xd2\x76\x00\x01\\$\x01........\x00\x00', a, DOTALL)
diff --git a/tests/test_personalize_card.py b/tests/test_personalize_card.py
deleted file mode 100644 (file)
index c22af93..0000000
+++ /dev/null
@@ -1,290 +0,0 @@
-"""
-test_personalize_card.py - test personalizing card
-
-Copyright (C) 2016  g10 Code GmbH
-Author: NIIBE Yutaka <gniibe@fsij.org>
-
-This file is a part of Gnuk, a GnuPG USB Token implementation.
-
-Gnuk is free software: you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Gnuk is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
-License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-
-from struct import pack
-from re import match, DOTALL
-from util import *
-import rsa_keys
-
-FACTORY_PASSPHRASE_PW1=b"123456"
-FACTORY_PASSPHRASE_PW3=b"12345678"
-PW1_TEST0=b"another user pass phrase"
-PW1_TEST1=b"PASSPHRASE SHOULD BE LONG"
-PW1_TEST2=b"new user pass phrase"
-PW1_TEST3=b"next user pass phrase"
-PW1_TEST4=b"another user pass phrase"
-PW3_TEST0=b"admin pass phrase"
-PW3_TEST1=b"another admin pass phrase"
-
-RESETCODE_TEST=b"example reset code 000"
-
-def test_setup_pw3_0(card):
-    r = card.cmd_change_reference_data(3, FACTORY_PASSPHRASE_PW3 + PW3_TEST0)
-    assert r
-
-def test_verify_pw3_0(card):
-    v = card.cmd_verify(3, PW3_TEST0)
-    assert v
-
-def test_login_put(card):
-    r = card.cmd_put_data(0x00, 0x5e, b"gpg_user")
-    assert r
-
-def test_name_put(card):
-    r = card.cmd_put_data(0x00, 0x5b, b"GnuPG User")
-    assert r
-
-def test_lang_put(card):
-    r = card.cmd_put_data(0x5f, 0x2d, b"ja")
-    assert r
-
-def test_sex_put(card):
-    r = card.cmd_put_data(0x5f, 0x35, b"1")
-    assert r
-
-def test_url_put(card):
-    r = card.cmd_put_data(0x5f, 0x50, b"https://www.fsij.org/gnuk/")
-    assert r
-
-def test_pw1_status_put(card):
-    r = card.cmd_put_data(0x00, 0xc4, b"\x01")
-    assert r
-
-def test_login(card):
-    login = get_data_object(card, 0x5e)
-    assert login == b"gpg_user"
-
-def test_name_lang_sex(card):
-    name = b"GnuPG User"
-    lang = b"ja"
-    sex = b"1"
-    expected = b'\x5b' + pack('B', len(name)) + name \
-               +  b'\x5f\x2d' + pack('B', len(lang)) + lang \
-               + b'\x5f\x35' + pack('B', len(sex)) + sex
-    name_lang_sex = get_data_object(card, 0x65)
-    assert name_lang_sex == expected
-
-def test_url(card):
-    url = get_data_object(card, 0x5f50)
-    assert url == b"https://www.fsij.org/gnuk/"
-
-def test_pw1_status(card):
-    s = get_data_object(card, 0xc4)
-    assert match(b'\x01...\x03[\x00\x03]\x03', s, DOTALL)
-
-def test_rsa_import_key_1(card):
-    t = rsa_keys.build_privkey_template(1, 0)
-    r = card.cmd_put_data_odd(0x3f, 0xff, t)
-    assert r
-
-def test_rsa_import_key_2(card):
-    t = rsa_keys.build_privkey_template(2, 1)
-    r = card.cmd_put_data_odd(0x3f, 0xff, t)
-    assert r
-
-def test_rsa_import_key_3(card):
-    t = rsa_keys.build_privkey_template(3, 2)
-    r = card.cmd_put_data_odd(0x3f, 0xff, t)
-    assert r
-
-def test_fingerprint_1_put(card):
-    fpr1 = rsa_keys.fpr[0]
-    r = card.cmd_put_data(0x00, 0xc7, fpr1)
-    assert r
-
-def test_fingerprint_2_put(card):
-    fpr2 = rsa_keys.fpr[1]
-    r = card.cmd_put_data(0x00, 0xc8, fpr2)
-    assert r
-
-def test_fingerprint_3_put(card):
-    fpr3 = rsa_keys.fpr[2]
-    r = card.cmd_put_data(0x00, 0xc9, fpr3)
-    assert r
-
-def test_timestamp_1_put(card):
-    timestamp1 = rsa_keys.timestamp[0]
-    r = card.cmd_put_data(0x00, 0xce, timestamp1)
-    assert r
-
-def test_timestamp_2_put(card):
-    timestamp2 = rsa_keys.timestamp[1]
-    r = card.cmd_put_data(0x00, 0xcf, timestamp2)
-    assert r
-
-def test_timestamp_3_put(card):
-    timestamp3 = rsa_keys.timestamp[2]
-    r = card.cmd_put_data(0x00, 0xd0, timestamp3)
-    assert r
-
-def test_ds_counter_0(card):
-    c = get_data_object(card, 0x7a)
-    assert c == b'\x93\x03\x00\x00\x00'
-
-def test_pw1_status(card):
-    s = get_data_object(card, 0xc4)
-    assert match(b'\x01...\x03[\x00\x03]\x03', s, DOTALL)
-
-def test_app_data(card):
-    app_data = get_data_object(card, 0x6e)
-    hist_len = app_data[20]
-    # FIXME: parse and check DO of C0, C1, C2, C3, C4, and C6
-    assert app_data[0:8] == b"\x4f\x10\xd2\x76\x00\x01\x24\x01" and \
-           app_data[18:18+2] == b"\x5f\x52"
-
-def test_public_key_1(card):
-    pk = card.cmd_get_public_key(1)
-    assert rsa_keys.key[0][0] == pk[9:9+256]
-
-def test_public_key_2(card):
-    pk = card.cmd_get_public_key(2)
-    assert rsa_keys.key[1][0] == pk[9:9+256]
-
-def test_public_key_3(card):
-    pk = card.cmd_get_public_key(3)
-    assert rsa_keys.key[2][0] == pk[9:9+256]
-
-def test_setup_pw1_0(card):
-    r = card.cmd_change_reference_data(1, FACTORY_PASSPHRASE_PW1 + PW1_TEST0)
-    assert r
-
-def test_verify_pw1_0(card):
-    v = card.cmd_verify(1, PW1_TEST0)
-    assert v
-
-def test_verify_pw1_0_2(card):
-    v = card.cmd_verify(2, PW1_TEST0)
-    assert v
-
-def test_setup_pw1_1(card):
-    r = card.cmd_change_reference_data(1, PW1_TEST0 + PW1_TEST1)
-    assert r
-
-def test_verify_pw1_1(card):
-    v = card.cmd_verify(1, PW1_TEST1)
-    assert v
-
-def test_verify_pw1_1_2(card):
-    v = card.cmd_verify(2, PW1_TEST1)
-    assert v
-
-def test_setup_reset_code(card):
-    r = card.cmd_put_data(0x00, 0xd3, RESETCODE_TEST)
-    assert r
-
-def test_reset_code(card):
-    r = card.cmd_reset_retry_counter(0, 0x81, RESETCODE_TEST + PW1_TEST2)
-    assert r
-
-def test_verify_pw1_2(card):
-    v = card.cmd_verify(1, PW1_TEST2)
-    assert v
-
-def test_verify_pw1_2_2(card):
-    v = card.cmd_verify(2, PW1_TEST2)
-    assert v
-
-def test_setup_pw3_1(card):
-    r = card.cmd_change_reference_data(3, PW3_TEST0 + PW3_TEST1)
-    assert r
-
-def test_verify_pw3_1(card):
-    v = card.cmd_verify(3, PW3_TEST1)
-    assert v
-
-def test_reset_userpass_admin(card):
-    r = card.cmd_reset_retry_counter(2, 0x81, PW1_TEST3)
-    assert r
-
-def test_verify_pw1_3(card):
-    v = card.cmd_verify(1, PW1_TEST3)
-    assert v
-
-def test_verify_pw1_3_2(card):
-    v = card.cmd_verify(2, PW1_TEST3)
-    assert v
-
-def test_setup_pw1_4(card):
-    r = card.cmd_change_reference_data(1, PW1_TEST3 + PW1_TEST4)
-    assert r
-
-def test_verify_pw1_4(card):
-    v = card.cmd_verify(1, PW1_TEST4)
-    assert v
-
-def test_verify_pw1_4_2(card):
-    v = card.cmd_verify(2, PW1_TEST4)
-    assert v
-
-def test_setup_pw3_2(card):
-    r = card.cmd_change_reference_data(3, PW3_TEST1 + PW3_TEST0)
-    assert r
-
-def test_verify_pw3_2(card):
-    v = card.cmd_verify(3, PW3_TEST0)
-    assert v
-
-PLAIN_TEXT0=b"This is a test message."
-PLAIN_TEXT1=b"RSA decryption is as easy as pie."
-PLAIN_TEXT2=b"This is another test message.\nMultiple lines.\n"
-
-def test_sign_0(card):
-    digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT0)
-    r = card.cmd_pso(0x9e, 0x9a, digestinfo)
-    sig = rsa_keys.compute_signature(0, digestinfo)
-    sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
-    assert r == sig_bytes
-
-def test_sign_1(card):
-    digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT1)
-    r = card.cmd_pso(0x9e, 0x9a, digestinfo)
-    sig = rsa_keys.compute_signature(0, digestinfo)
-    sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
-    assert r == sig_bytes
-
-def test_ds_counter_1(card):
-    c = get_data_object(card, 0x7a)
-    assert c == b'\x93\x03\x00\x00\x02'
-
-def test_sign_auth_0(card):
-    digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT0)
-    r = card.cmd_internal_authenticate(digestinfo)
-    sig = rsa_keys.compute_signature(2, digestinfo)
-    sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
-    assert r == sig_bytes
-
-def test_sign_auth_1(card):
-    digestinfo = rsa_keys.compute_digestinfo(PLAIN_TEXT1)
-    r = card.cmd_internal_authenticate(digestinfo)
-    sig = rsa_keys.compute_signature(2, digestinfo)
-    sig_bytes = sig.to_bytes(int((sig.bit_length()+7)/8), byteorder='big')
-    assert r == sig_bytes
-
-def test_decrypt_0(card):
-    ciphertext = rsa_keys.encrypt(1, PLAIN_TEXT0)
-    r = card.cmd_pso(0x80, 0x86, ciphertext)
-    assert r == PLAIN_TEXT0
-
-def test_decrypt_1(card):
-    ciphertext = rsa_keys.encrypt(1, PLAIN_TEXT1)
-    r = card.cmd_pso(0x80, 0x86, ciphertext)
-    assert r == PLAIN_TEXT1
diff --git a/tests/test_personalize_reset_card.py b/tests/test_personalize_reset_card.py
deleted file mode 100644 (file)
index ab6828a..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-"""
-test_personalize_reset_card.py - test resetting personalization of card
-
-Copyright (C) 2016  g10 Code GmbH
-Author: NIIBE Yutaka <gniibe@fsij.org>
-
-This file is a part of Gnuk, a GnuPG USB Token implementation.
-
-Gnuk is free software: you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Gnuk is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
-License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-
-from struct import pack
-from re import match, DOTALL
-from util import *
-import rsa_keys
-
-FACTORY_PASSPHRASE_PW1=b"123456"
-FACTORY_PASSPHRASE_PW3=b"12345678"
-PW1_TEST0=b"another user pass phrase"
-PW1_TEST1=b"PASSPHRASE SHOULD BE LONG"
-PW1_TEST2=b"new user pass phrase"
-PW1_TEST3=b"next user pass phrase"
-PW1_TEST4=b"another user pass phrase"
-PW3_TEST0=b"admin pass phrase"
-PW3_TEST1=b"another admin pass phrase"
-
-RESETCODE_TEST=b"example reset code 000"
-
-def test_login_put(card):
-    r = card.cmd_put_data(0x00, 0x5e, b"")
-    assert r
-
-def test_name_put(card):
-    r = card.cmd_put_data(0x00, 0x5b, b"")
-    assert r
-
-def test_lang_put(card):
-    r = card.cmd_put_data(0x5f, 0x2d, b"")
-    assert r
-
-def test_sex_put(card):
-    try:
-        # Gnuk
-        r = card.cmd_put_data(0x5f, 0x35, b"")
-    except ValueError:
-        # OpenPGP card which doesn't allow b""
-        r = card.cmd_put_data(0x5f, 0x35, b"9")
-    assert r
-
-def test_url_put(card):
-    r = card.cmd_put_data(0x5f, 0x50, b"")
-    assert r
-
-def test_pw1_status_put(card):
-    r = card.cmd_put_data(0x00, 0xc4, b"\x00")
-    assert r
-
-def test_setup_pw3_0(card):
-    r = card.cmd_change_reference_data(3, PW3_TEST0 + FACTORY_PASSPHRASE_PW3)
-    assert r
-
-def test_verify_pw3_0(card):
-    v = card.cmd_verify(3, FACTORY_PASSPHRASE_PW3)
-    assert v
-
-def test_setup_pw1_0(card):
-    r = card.cmd_change_reference_data(1, PW1_TEST4 + FACTORY_PASSPHRASE_PW1)
-    assert r
-
-def test_verify_pw1_0(card):
-    v = card.cmd_verify(1, FACTORY_PASSPHRASE_PW1)
-    assert v
-
-def test_verify_pw1_0_2(card):
-    v = card.cmd_verify(2, FACTORY_PASSPHRASE_PW1)
-    assert v
-
-def test_setup_reset_code(card):
-    r = card.cmd_put_data(0x00, 0xd3, b"")
-    assert r
diff --git a/tests/test_remove_keys_card.py b/tests/test_remove_keys_card.py
deleted file mode 100644 (file)
index c185a26..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-"""
-test_remove_keys_card.py - test removing keys on card
-
-Copyright (C) 2016  g10 Code GmbH
-Author: NIIBE Yutaka <gniibe@fsij.org>
-
-This file is a part of Gnuk, a GnuPG USB Token implementation.
-
-Gnuk is free software: you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Gnuk is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
-License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-
-# Remove a key material on card by changing algorithm attributes of the key
-
-KEY_ATTRIBUTES_RSA4K=b"\x01\x10\x00\x00\x20\x00"
-KEY_ATTRIBUTES_RSA2K=b"\x01\x08\x00\x00\x20\x00"
-
-def test_rsa_import_key_1(card):
-    r = card.cmd_put_data(0x00, 0xc1, KEY_ATTRIBUTES_RSA4K)
-    if r:
-        r = card.cmd_put_data(0x00, 0xc1, KEY_ATTRIBUTES_RSA2K)
-    assert r
-
-def test_rsa_import_key_2(card):
-    r = card.cmd_put_data(0x00, 0xc2, KEY_ATTRIBUTES_RSA4K)
-    if r:
-        r = card.cmd_put_data(0x00, 0xc2, KEY_ATTRIBUTES_RSA2K)
-    assert r
-
-def test_rsa_import_key_3(card):
-    r = card.cmd_put_data(0x00, 0xc3, KEY_ATTRIBUTES_RSA4K)
-    if r:
-        r = card.cmd_put_data(0x00, 0xc3, KEY_ATTRIBUTES_RSA2K)
-    assert r