diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py index 029d6cc..f0ccfe7 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU General Public License along with # virtualsmartcard. If not, see . # -import sys, binascii, random, logging +import sys, binascii, random, logging, unittest from Crypto.Cipher import DES3, DES, AES, ARC4#@UnusedImport from struct import pack from binascii import b2a_hex, a2b_hex @@ -605,20 +605,23 @@ def test_pbkdf2(): raise RuntimeError("self-test failed") print "PBKDF2 self test successfull" -if __name__ == "__main__": - too_short = binascii.a2b_hex("".join("89 45 19 BF".split())) - padded = append_padding(8, too_short) - print "Padded data: " + hexdump(padded) - unpadded = strip_padding(8, padded) - print "Without padding: " + hexdump(unpadded) - - teststring = "DEADBEEFistatsyksdvhwohfwoehcowc8hw8rogfq8whv75tsgohsav8wress" - foo = append_padding(16, teststring) - assert(strip_padding(16, foo) == teststring) +class TestCryptoUtils(unittest.TestCase): - testpass = "SomeRandomPassphrase" - protectedString = protect_string(teststring, testpass) - unprotectedString = read_protected_string(protectedString, testpass) - assert(teststring == unprotectedString) - + def setUp(self): + self.teststring = "DEADBEEFistatsyksdvhwohfwoehcowc8hw8rogfq8whv75tsgohsav8wress" + self.testpass = "SomeRandomPassphrase" + + def test_padding(self): + padded = append_padding(16, self.teststring) + unpadded = strip_padding(16, padded) + self.assertEqual(unpadded, self.teststring) + + def test_protect_string(self): + protectedString = protect_string(self.teststring, self.testpass) + unprotectedString = read_protected_string(protectedString, self.testpass) + self.assertEqual(self.teststring, unprotectedString) + + +if __name__ == "__main__": + unittest.main() #test_pbkdf2() diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/SmartcardSAM.py b/virtualsmartcard/src/vpicc/virtualsmartcard/SmartcardSAM.py index 59048b2..88837de 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/SmartcardSAM.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/SmartcardSAM.py @@ -17,7 +17,7 @@ # virtualsmartcard. If not, see . # -import logging +import logging, unittest from pickle import dumps, loads from os import urandom @@ -357,32 +357,45 @@ class SAM(object): return self.current_SE.manage_security_environment(p1, p2, data) #Unit Tests +class TestSmartcardSAM(unittest.TestCase): + + def setUp(self): + self.password = "DUMMYKEYDUMMYKEY" + self.myCard = SAM("1234", "1234567890") + + def test_incorrect_pin(self): + with self.assertRaises(SwError): + self.myCard.verify(0x00, 0x00, "5678") + + def test_counter_decrement(self): + ctr1 = self.myCard.counter + try: + self.myCard.verify(0x00, 0x00, "3456") + except SwError as e: + pass + self.assertEquals(self.myCard.counter, ctr1 - 1) + + def test_internal_authenticate(self): + sw, challenge = self.myCard.get_challenge(0x00, 0x00, "") + print("Before encryption: " + challenge) + blocklen = vsCrypto.get_cipher_blocklen("DES3-ECB") + padded = vsCrypto.append_padding(blocklen, challenge) + sw, result_data = self.myCard.internal_authenticate(0x00, 0x00, padded) + print("Internal Authenticate status code: %x" % sw) + self.assertEquals(sw, SW["NORMAL"]) + + def test_external_authenticate(self): + sw, challenge = self.myCard.get_challenge(0x00, 0x00, "") + print("Before encryption: " + challenge) + blocklen = vsCrypto.get_cipher_blocklen("DES3-ECB") + padded = vsCrypto.append_padding(blocklen, challenge) + sw, result_data = self.myCard.internal_authenticate(0x00, 0x00, padded) + sw, result_data = self.myCard.external_authenticate(0x00, 0x00, result_data) + print ("After external authenticate: " + result_data) + self.assertEquals(sw, SW["NORMAL"]) + if __name__ == "__main__": - - password = "DUMMYKEYDUMMYKEY" - - MyCard = SAM("1234", "1234567890") - try: - print(MyCard.verify(0x00, 0x00, "5678")) - except SwError as e: - print(e.message) - - print("Counter = " + str(MyCard.counter)) - print(MyCard.verify(0x00, 0x00, "1234")) - print("Counter = " + str(MyCard.counter)) - sw, challenge = MyCard.get_challenge(0x00, 0x00, "") - print("Before encryption: " + challenge) - blocklen = vsCrypto.get_cipher_blocklen("DES3-ECB") - padded = vsCrypto.append_padding(blocklen, challenge) - sw, result_data = MyCard.internal_authenticate(0x00, 0x00, padded) - print("Internal Authenticate status code: %x" % sw) - - try: - sw, res = MyCard.external_authenticate(0x00, 0x00, result_data) - except SwError as e: - print(e.message) - sw = e.sw - print("Decryption Status code: %x" % sw) + unittest.main() #SE = Security_Environment(None) #testvektor = "foobar"