From 475fad371a4adaeb249a6c23a050ca356274c8d5 Mon Sep 17 00:00:00 2001 From: fabio rodrigues Date: Tue, 18 Aug 2020 13:12:13 +0100 Subject: [PATCH] [vpicc] Python 3 updates and code fixing - Use pycryptodome instead of pycrypto - Fixed some unit tests asserts - fixed some instances that sending message to vpcd the msg is considered a string object instead of byte array - make TLVutils.pack work in python 3 --- .../src/vpicc/virtualsmartcard/SEutils.py | 21 +++++++++---------- .../src/vpicc/virtualsmartcard/TLVutils.py | 8 +++---- .../virtualsmartcard/VirtualSmartcard.py | 5 ++++- .../tests/SmartcardSAM_test.py | 8 +++---- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py index fd89f6c..a37567f 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py @@ -684,8 +684,7 @@ class Security_Environment(object): """ from Crypto.PublicKey import RSA, DSA - from Crypto.Util.randpool import RandomPool - rnd = RandomPool() + from Crypto.Random import get_random_bytes cipher = self.ct.algorithm @@ -694,7 +693,7 @@ class Security_Environment(object): raise SwError(SW["ERR_CONDITIONNOTSATISFIED"]) if p1 & 0x01 == 0x00: # Generate key - PublicKey = c_class.generate(self.dst.keylength, rnd.get_bytes) + PublicKey = c_class.generate(self.dst.keylength) self.dst.key = PublicKey else: pass # Read key @@ -702,23 +701,23 @@ class Security_Environment(object): # Encode keys if cipher == "RSA": # Public key - n = inttostring(PublicKey.__getstate__()['n']) - e = inttostring(PublicKey.__getstate__()['e']) + n = inttostring(PublicKey.n) + e = inttostring(PublicKey.e) pk = ((0x81, len(n), n), (0x82, len(e), e)) result = bertlv_pack(pk) # Private key - d = PublicKey.__getstate__()['d'] + d = PublicKey.d elif cipher == "DSA": # DSAParams - p = inttostring(PublicKey.__getstate__()['p']) - q = inttostring(PublicKey.__getstate__()['q']) - g = inttostring(PublicKey.__getstate__()['g']) + p = inttostring(PublicKey.p) + q = inttostring(PublicKey.q) + g = inttostring(PublicKey.g) # Public key - y = inttostring(PublicKey.__getstate__()['y']) + y = inttostring(PublicKey.y) pk = ((0x81, len(p), p), (0x82, len(q), q), (0x83, len(g), g), (0x84, len(y), y)) # Private key - x = inttostring(PublicKey.__getstate__()['x']) + x = inttostring(PublicKey.x) # Add more algorithms here # elif cipher = "ECDSA": else: diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/TLVutils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/TLVutils.py index eb7be9d..b2971d5 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/TLVutils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/TLVutils.py @@ -114,7 +114,7 @@ def tlv_find_tag(tlv_data, tag, num_results=None): def pack(tlv_data, recalculate_length=False): - result = b"" + result = [] for data in tlv_data: tag, length, value = data[:3] @@ -143,9 +143,9 @@ def pack(tlv_data, recalculate_length=False): assert len(l) < 0x7f l = inttostring(0x80 | len(l)) + l - result = result + t - result = result + l - result = result + value + result.append(t) + result.append(l) + result.append(value) return b"".join(result) diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/VirtualSmartcard.py b/virtualsmartcard/src/vpicc/virtualsmartcard/VirtualSmartcard.py index ccd330e..c4d0f95 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/VirtualSmartcard.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/VirtualSmartcard.py @@ -503,7 +503,10 @@ class VirtualICC(object): def __sendToVPICC(self, msg): """ Send a message to the vpcd """ - self.sock.sendall(struct.pack('!H', len(msg)) + msg) + if isinstance(msg, str): + self.sock.sendall(struct.pack('!H', len(msg)) + msg.encode()) + else: + self.sock.sendall(struct.pack('!H', len(msg)) + msg) def __recvFromVPICC(self): """ Receive a message from the vpcd """ diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/tests/SmartcardSAM_test.py b/virtualsmartcard/src/vpicc/virtualsmartcard/tests/SmartcardSAM_test.py index 9181622..992ed8a 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/tests/SmartcardSAM_test.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/tests/SmartcardSAM_test.py @@ -40,14 +40,14 @@ class TestSmartcardSAM(unittest.TestCase): self.myCard.verify(0x00, 0x00, "3456".encode('ascii')) except SwError as e: pass - self.assertEquals(self.myCard.counter, ctr1 - 1) + self.assertEqual(self.myCard.counter, ctr1 - 1) def test_internal_authenticate(self): sw, challenge = self.myCard.get_challenge(0x00, 0x00, b"") blocklen = vsCrypto.get_cipher_blocklen("DES3-ECB") padded = vsCrypto.append_padding(blocklen, challenge) sw, result_data = self.myCard.internal_authenticate(0x00, 0x00, padded) - self.assertEquals(sw, SW["NORMAL"]) + self.assertEqual(sw, SW["NORMAL"]) def test_external_authenticate(self): sw, challenge = self.myCard.get_challenge(0x00, 0x00, b"") @@ -56,7 +56,7 @@ class TestSmartcardSAM(unittest.TestCase): sw, result_data = self.myCard.internal_authenticate(0x00, 0x00, padded) sw, result_data = self.myCard.external_authenticate(0x00, 0x00, result_data) - self.assertEquals(sw, SW["NORMAL"]) + self.assertEqual(sw, SW["NORMAL"]) def test_security_environment(self): hash = self.secEnv.hash(0x90, 0x80, self.password) @@ -74,7 +74,7 @@ class TestSmartcardSAM(unittest.TestCase): self.secEnv.ct.algorithm = "RSA" self.secEnv.dst.keylength = 1024 sw, pk = self.secEnv.generate_public_key_pair(0x00, 0x00, b"") - self.assertEquals(sw, SW["NORMAL"]) + self.assertEqual(sw, SW["NORMAL"]) if __name__ == "__main__":