diff --git a/.travis.yml b/.travis.yml index b122c90..fb79b88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,8 @@ env: -PREFIX=/tmp/install script: #Build virtualsmartcard - - cd virtualsmartcard && autoreconf -vsi && ./configure && make && cd .. + - cd virtualsmartcard && autoreconf -vsi && ./configure && make + - cd src/vpicc/ && export PYTHONPATH=$PYTHONPATH:`pwd` && python -m unittest discover -s virtualsmartcard.tests -p *_test.py -v && cd $TRAVIS_BUILD_DIR # Build pcsc-relay, which requires libnfc - cd /tmp && git clone https://code.google.com/p/libnfc && cd libnfc && autoreconf -i && ./configure --prefix=$PREFIX && make install && cd $TRAVIS_BUILD_DIR - cd pcsc-relay && autoreconf -vsi && ./configure && make && cd .. diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py index 029d6cc..5b3138e 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py @@ -1,5 +1,5 @@ # -# Copyright (C) 2011 Dominik Oepen +# Copyright (C) 2014 Dominik Oepen # # This file is part of virtualsmartcard. # @@ -604,21 +604,3 @@ def test_pbkdf2(): if result != expected: 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) - - testpass = "SomeRandomPassphrase" - protectedString = protect_string(teststring, testpass) - unprotectedString = read_protected_string(protectedString, testpass) - assert(teststring == unprotectedString) - - #test_pbkdf2() diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/SmartcardSAM.py b/virtualsmartcard/src/vpicc/virtualsmartcard/SmartcardSAM.py index 59048b2..4670951 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/SmartcardSAM.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/SmartcardSAM.py @@ -1,5 +1,5 @@ # -# Copyright (C) 2011 Dominik Oepen +# Copyright (C) 2014 Dominik Oepen # # This file is part of virtualsmartcard. # @@ -355,49 +355,4 @@ class SAM(object): def manage_security_environment(self, p1, p2, data): return self.current_SE.manage_security_environment(p1, p2, data) - -#Unit Tests -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) - - #SE = Security_Environment(None) - #testvektor = "foobar" - #print "Testvektor = %s" % testvektor - #sw, hash = SE.hash(0x90,0x80,testvektor) - #print "SW after hashing = %s" % sw - #print "Hash = %s" % hash - #sw, crypted = SE.encipher(0x00, 0x00, testvektor) - #print "SW after encryption = %s" % sw - #sw, plain = SE.decipher(0x00, 0x00, crypted) - #print "SW after encryption = %s" % sw - #print "Testvektor after en- and deciphering: %s" % plain - #sw, pk = SE.generate_public_key_pair(0x02, 0x00, "") - #print "SW after keygen = %s" % sw - #print "Public Key = %s" % pk - #CF = CryptoflexSE(None) - #print CF.generate_public_key_pair(0x00, 0x80, "\x01\x00\x01\x00") - #print MyCard._get_referenced_key(0x01) diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/tests/CryptoUtils_test.py b/virtualsmartcard/src/vpicc/virtualsmartcard/tests/CryptoUtils_test.py new file mode 100644 index 0000000..05acf1b --- /dev/null +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/tests/CryptoUtils_test.py @@ -0,0 +1,23 @@ +import unittest +from virtualsmartcard.CryptoUtils import * + +class TestCryptoUtils(unittest.TestCase): + + 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/tests/SmartcardSAM_test.py b/virtualsmartcard/src/vpicc/virtualsmartcard/tests/SmartcardSAM_test.py new file mode 100644 index 0000000..0f30241 --- /dev/null +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/tests/SmartcardSAM_test.py @@ -0,0 +1,60 @@ +import unittest +from virtualsmartcard.SmartcardSAM import * + +#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__": + unittest.main() + #SE = Security_Environment(None) + #testvektor = "foobar" + #print "Testvektor = %s" % testvektor + #sw, hash = SE.hash(0x90,0x80,testvektor) + #print "SW after hashing = %s" % sw + #print "Hash = %s" % hash + #sw, crypted = SE.encipher(0x00, 0x00, testvektor) + #print "SW after encryption = %s" % sw + #sw, plain = SE.decipher(0x00, 0x00, crypted) + #print "SW after encryption = %s" % sw + #print "Testvektor after en- and deciphering: %s" % plain + #sw, pk = SE.generate_public_key_pair(0x02, 0x00, "") + #print "SW after keygen = %s" % sw + #print "Public Key = %s" % pk + #CF = CryptoflexSE(None) + #print CF.generate_public_key_pair(0x00, 0x80, "\x01\x00\x01\x00") + #print MyCard._get_referenced_key(0x01) diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/tests/__init__.py b/virtualsmartcard/src/vpicc/virtualsmartcard/tests/__init__.py new file mode 100644 index 0000000..e69de29