From ed2132480baf93ce78595e016a9dfb06506c2f0e Mon Sep 17 00:00:00 2001 From: oepen Date: Fri, 20 Jan 2012 14:13:58 +0000 Subject: [PATCH] Use the blocklength of the actual cipher to append padding (instead of hardcoded DES-CBC blocklength) git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@682 96b47cad-a561-4643-ad3b-153ac7d7599c --- .../src/vpicc/virtualsmartcard/CryptoUtils.py | 3 +-- .../src/vpicc/virtualsmartcard/SEutils.py | 11 ++++++----- .../src/vpicc/virtualsmartcard/cards/ePass.py | 1 + .../src/vpicc/virtualsmartcard/cards/nPA.py | 2 ++ 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py index 0aef3f5..ff03504 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/CryptoUtils.py @@ -89,13 +89,12 @@ def get_cipher_blocklen(cipherspec): cipher = globals().get(cipherparts[0].upper(), None) return cipher.block_size -def append_padding(cipherspec, data, padding_class=0x01): +def append_padding(blocklen, data, padding_class=0x01): """Append padding to the data. Length of padding depends on length of data and the block size of the specified encryption algorithm. Different types of padding may be selected via the padding_class parameter """ - blocklen = get_cipher_blocklen(cipherspec) if padding_class == 0x01: #ISO padding last_block_length = len(data) % blocklen diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py b/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py index b7a457e..373bbbd 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/SEutils.py @@ -56,6 +56,7 @@ class ControlReferenceTemplate: self.DFref = None self.keylength = None self.algorithm = None + self.blocklength = None self.usage_qualifier = None if config != "": self.parse_SE_config(config) @@ -283,7 +284,7 @@ class Security_Environment(object): if authenticate_header: to_authenticate = inttostring(CAPDU.cla) + inttostring(CAPDU.ins)+\ inttostring(CAPDU.p1) + inttostring(CAPDU.p2) - to_authenticate = vsCrypto.append_padding("DES-CBC", to_authenticate) + to_authenticate = vsCrypto.append_padding(self.cct.blocklength, to_authenticate) else: to_authenticate = "" @@ -366,7 +367,7 @@ class Security_Environment(object): #SM data objects for authentication if tag == SM_Class["CHECKSUM"]: - auth = vsCrypto.append_padding("DES-CBC", to_authenticate) + auth = vsCrypto.append_padding(self.cct.algorithm, to_authenticate) sw, checksum = self.compute_cryptographic_checksum(0x8E, 0x80, auth) @@ -437,9 +438,9 @@ class Security_Environment(object): if sw == SW["NORMAL"]: if self.cct.algorithm == None: raise SwError(SW["CONDITIONSNOTSATISFIED"]) - elif self.cct.algorithm == "CCT": + elif self.cct.algorithm == "CC": tag = SM_Class["CHECKSUM"] - padded = vsCrypto.append_padding("DES-ECB", return_data) + padded = vsCrypto.append_padding(self.cct.blocklength, return_data) sw, auth = self.compute_cryptographic_checksum(0x8E, 0x80, padded) length = len(auth) return_data += pack([(tag, length, auth)]) @@ -638,7 +639,7 @@ class Security_Environment(object): if key == None or algo == None: return SW["ERR_CONDITIONNOTSATISFIED"], "" else: - padded = vsCrypto.append_padding(algo, data) + padded = vsCrypto.append_padding(vsCrypto.get_cipher_blocklen(algo), data) crypted = vsCrypto.encrypt(algo, key, padded, self.ct.iv) return SW["NORMAL"], crypted diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/cards/ePass.py b/virtualsmartcard/src/vpicc/virtualsmartcard/cards/ePass.py index 1b26a4b..43538f5 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/cards/ePass.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/cards/ePass.py @@ -33,6 +33,7 @@ class ePass_SE(Security_Environment): Security_Environment.__init__(self, MF, SAM) self.ssc = ssc self.cct.algorithm = "CC" + self.cct.blocklength = 8 self.ct.algorithm = "DES3-CBC" def compute_cryptographic_checksum(self, p1, p2, data): diff --git a/virtualsmartcard/src/vpicc/virtualsmartcard/cards/nPA.py b/virtualsmartcard/src/vpicc/virtualsmartcard/cards/nPA.py index 29a0445..5e08b42 100644 --- a/virtualsmartcard/src/vpicc/virtualsmartcard/cards/nPA.py +++ b/virtualsmartcard/src/vpicc/virtualsmartcard/cards/nPA.py @@ -67,6 +67,8 @@ class nPA_SE(Security_Environment): def __init__(self, MF, SAM): Security_Environment.__init__(self, MF, SAM) self.at = nPA_AT_CRT() + #This breaks support for 3DES + self.cct.blocklength = 16 self.eac_step = 0 self.sec = None self.eac_ctx = None