Test suite improvement.
authorNIIBE Yutaka <gniibe@fsij.org>
Wed, 4 Apr 2018 06:09:30 +0000 (15:09 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Wed, 4 Apr 2018 06:10:52 +0000 (15:10 +0900)
tests/card_const.py [new file with mode: 0644]
tests/test_000_empty_card.py
tests/test_001_personalize_card.py
tests/test_002_personalize_reset.py [new file with mode: 0644]
tests/test_002_personalize_reset_card.py [deleted file]
tests/test_003_remove_keys.py [new file with mode: 0644]
tests/test_003_remove_keys_card.py [deleted file]
tests/test_004_reset_pw3.py
tests/test_005_keygen.py [new file with mode: 0644]
tests/test_006_remove_keys.py [new symlink]
tests/test_007_kdf.py [new file with mode: 0644]

diff --git a/tests/card_const.py b/tests/card_const.py
new file mode 100644 (file)
index 0000000..2f9aeb2
--- /dev/null
@@ -0,0 +1,4 @@
+FACTORY_PASSPHRASE_PW1=b"123456"
+FACTORY_PASSPHRASE_PW3=b"12345678"
+KEY_ATTRIBUTES_RSA4K=b"\x01\x10\x00\x00\x20\x00"
+KEY_ATTRIBUTES_RSA2K=b"\x01\x08\x00\x00\x20\x00"
index 0ad498a..b0b644b 100644 (file)
@@ -24,13 +24,11 @@ from binascii import hexlify
 from re import match, DOTALL
 from struct import pack
 from util import *
+from card_const 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)
index c22af93..cc96850 100644 (file)
@@ -24,9 +24,8 @@ from struct import pack
 from re import match, DOTALL
 from util import *
 import rsa_keys
+from card_const import *
 
-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"
diff --git a/tests/test_002_personalize_reset.py b/tests/test_002_personalize_reset.py
new file mode 100644 (file)
index 0000000..4695f1b
--- /dev/null
@@ -0,0 +1,90 @@
+"""
+test_personalize_reset.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
+from card_const import *
+
+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_002_personalize_reset_card.py b/tests/test_002_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_003_remove_keys.py b/tests/test_003_remove_keys.py
new file mode 100644 (file)
index 0000000..32f3a27
--- /dev/null
@@ -0,0 +1,43 @@
+"""
+test_remove_keys.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
+
+from card_const import *
+
+def test_rsa_keyattr_change_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_keyattr_change_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_keyattr_change_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_003_remove_keys_card.py b/tests/test_003_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
index c0a6267..0d72169 100644 (file)
@@ -20,22 +20,22 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-FACTORY_PASSPHRASE_PW1=b"123456"
-FACTORY_PASSPHRASE_PW3=b"12345678"
+from card_const import *
 
 # Gnuk specific feature of clear PW3
-def test_setup_pw3_0(card):
+def test_setup_pw3_null(card):
     r = card.cmd_change_reference_data(3, FACTORY_PASSPHRASE_PW3)
     assert r
 
-def test_verify_pw3_0(card):
+def test_verify_pw3(card):
     v = card.cmd_verify(3, FACTORY_PASSPHRASE_PW3)
     assert v
 
-def test_verify_pw1_0(card):
+# Check PW1 again to see the possiblity of admin-less mode
+def test_verify_pw1(card):
     v = card.cmd_verify(1, FACTORY_PASSPHRASE_PW1)
     assert v
 
-def test_verify_pw1_0_2(card):
+def test_verify_pw1_2(card):
     v = card.cmd_verify(2, FACTORY_PASSPHRASE_PW1)
     assert v
diff --git a/tests/test_005_keygen.py b/tests/test_005_keygen.py
new file mode 100644 (file)
index 0000000..ef1b431
--- /dev/null
@@ -0,0 +1,83 @@
+"""
+test_005_keygen.py - test key generation
+
+Copyright (C) 2018  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
+import rsa_keys
+from card_const import *
+
+def test_keygen_1(card):
+    pk = card.cmd_genkey(1)
+    fpr_date = rsa_keys.calc_fpr(pk[0], pk[1])
+    r = card.cmd_put_data(0x00, 0xc7, fpr_date[0])
+    if r:
+        r = card.cmd_put_data(0x00, 0xce, fpr_date[1])
+    assert r
+
+def test_keygen_2(card):
+    pk = card.cmd_genkey(2)
+    fpr_date = rsa_keys.calc_fpr(pk[0], pk[1])
+    r = card.cmd_put_data(0x00, 0xc8, fpr_date[0])
+    if r:
+        r = card.cmd_put_data(0x00, 0xcf, fpr_date[1])
+    assert r
+
+def test_keygen_3(card):
+    pk = card.cmd_genkey(3)
+    fpr_date = rsa_keys.calc_fpr(pk[0], pk[1])
+    r = card.cmd_put_data(0x00, 0xc9, fpr_date[0])
+    if r:
+        r = card.cmd_put_data(0x00, 0xd0, fpr_date[1])
+    assert r
+
+def test_verify_pw1(card):
+    v = card.cmd_verify(1, FACTORY_PASSPHRASE_PW1)
+    assert v
+
+def test_signature_sigkey(card):
+    msg = b"Sign me please"
+    pk = card.cmd_get_public_key(1)
+    pk_info = (pk[9:9+256], pk[9+256+2:9+256+2+3])
+    digest = rsa_keys.compute_digestinfo(msg)
+    sig = int(hexlify(card.cmd_pso(0x9e, 0x9a, digest)),16)
+    r = rsa_keys.verify_signature(pk_info, digest, sig)
+    assert r
+
+def test_verify_pw1_2(card):
+    v = card.cmd_verify(2, FACTORY_PASSPHRASE_PW1)
+    assert v
+
+def test_decryption(card):
+    msg = b"encrypt me please"
+    pk = card.cmd_get_public_key(2)
+    pk_info = (pk[9:9+256], pk[9+256+2:9+256+2+3])
+    ciphertext = rsa_keys.encrypt_with_pubkey(pk_info, msg)
+    r = card.cmd_pso(0x80, 0x86, ciphertext)
+    assert r == msg
+
+def test_signature_authkey(card):
+    msg = b"Sign me please to authenticate"
+    pk = card.cmd_get_public_key(3)
+    pk_info = (pk[9:9+256], pk[9+256+2:9+256+2+3])
+    digest = rsa_keys.compute_digestinfo(msg)
+    sig = int(hexlify(card.cmd_internal_authenticate(digest)),16)
+    r = rsa_keys.verify_signature(pk_info, digest, sig)
+    assert r
diff --git a/tests/test_006_remove_keys.py b/tests/test_006_remove_keys.py
new file mode 120000 (symlink)
index 0000000..2a388b5
--- /dev/null
@@ -0,0 +1 @@
+test_003_remove_keys.py
\ No newline at end of file
diff --git a/tests/test_007_kdf.py b/tests/test_007_kdf.py
new file mode 100644 (file)
index 0000000..414e640
--- /dev/null
@@ -0,0 +1,22 @@
+"""
+test_007_kdf.py - test KDF data object
+
+Copyright (C) 2018  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/>.
+"""
+