diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py index ff03504..d9b3487 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py @@ -106,7 +106,7 @@ def append_padding(blocklen, data, padding_class=0x01): return data + padding -def strip_padding(cipherspec, data, padding_class=0x01): +def strip_padding(blocklen, data, padding_class=0x01): """ Strip the padding of decrypted data. Returns data without padding """ @@ -214,7 +214,8 @@ def protect_string(string, password, cipherspec=None): cipherspec = "AES-CBC" else: pass #TODO: Sanity check for cipher - paddedString = append_padding(cipherspec, string) + blocklength = get_cipher_blocklen(cipherspec) + paddedString = append_padding(blocklength, string) cryptedString = cipher(True, cipherspec, key, paddedString) hmac = crypto_checksum("HMAC", key, cryptedString) protectedString = "$p5k2$$" + salt + "$" + cryptedString + hmac @@ -253,7 +254,7 @@ def read_protected_string(string, password, cipherspec=None): cipherspec = "AES-CBC" decrypted = cipher(False, cipherspec, key, crypted) - return strip_padding(cipherspec, decrypted) + return strip_padding(get_cipher_blocklen(cipherspec), decrypted) ## ******************************************************************* ## * Cyberflex specific methods * @@ -264,7 +265,7 @@ def calculate_MAC(session_key, message, iv=CYBERFLEX_IV): """ cipher = DES3.new(session_key, DES3.MODE_CBC, iv) - padded = append_padding("DES3", message, 0x01) + padded = append_padding(8, message, 0x01) block_count = len(padded) / cipher.block_size crypted = cipher.encrypt(padded) @@ -606,14 +607,14 @@ def test_pbkdf2(): if __name__ == "__main__": too_short = binascii.a2b_hex("".join("89 45 19 BF".split())) - padded = append_padding("DES3-ECB", too_short) + padded = append_padding(8, too_short) print "Padded data: " + hexdump(padded) - unpadded = strip_padding("DES3-ECB", padded) + unpadded = strip_padding(8, padded) print "Without padding: " + hexdump(unpadded) teststring = "DEADBEEFistatsyksdvhwohfwoehcowc8hw8rogfq8whv75tsgohsav8wress" - foo = append_padding("AES", teststring) - assert(strip_padding("AES", foo) == teststring) + foo = append_padding(16, teststring) + assert(strip_padding(16, foo) == teststring) testpass = "SomeRandomPassphrase" protectedString = protect_string(teststring, testpass) diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py index 373bbbd..33e56ca 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py @@ -361,7 +361,7 @@ class Security_Environment(object): """ padding_indicator = stringtoint(value[0]) sw, plain = self.decipher(tag, 0x80, value[1:]) - plain = vsCrypto.strip_padding(self.ct.algorithm, plain, + plain = vsCrypto.strip_padding(self.ct.blocklength, plain, padding_indicator) return_data.append(plain) diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/cards/ePass.py b/virtualsmartcard/src/vpicc/virtualsmartcard/cards/ePass.py index 43538f5..ce8886b 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/cards/ePass.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/cards/ePass.py @@ -104,7 +104,7 @@ class PassportSAM(SAM): #Receive Mutual Authenticate APDU from terminal #Decrypt data and check MAC Eifd = resp_data[:-8] - padded_Eifd = vsCrypto.append_padding("DES", Eifd) + padded_Eifd = vsCrypto.append_padding(self.current_se.cct.blocklength, Eifd) Mifd = vsCrypto.crypto_checksum("CC", self.KMac, padded_Eifd) #Check the MAC if not Mifd == resp_data[-8:]: @@ -120,7 +120,7 @@ class PassportSAM(SAM): #Generate Answer data = plain[8:16] + plain[:8] + Kicc Eicc = vsCrypto.encrypt("DES3-CBC", self.KEnc, data) - padded_Eicc = vsCrypto.append_padding("DES", Eicc) + padded_Eicc = vsCrypto.append_padding(self.current_se.cct.blocklength, Eicc) Micc = vsCrypto.crypto_checksum("CC", self.KMac, padded_Eicc) #Derive the final keys and set the current SE KSseed = vsCrypto.operation_on_string(Kicc, Kifd, lambda a, b: a^b)