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
This commit is contained in:
oepen
2012-01-20 14:13:58 +00:00
parent 6d94c9e544
commit ed2132480b
4 changed files with 10 additions and 7 deletions

View File

@@ -89,13 +89,12 @@ def get_cipher_blocklen(cipherspec):
cipher = globals().get(cipherparts[0].upper(), None) cipher = globals().get(cipherparts[0].upper(), None)
return cipher.block_size 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. """Append padding to the data.
Length of padding depends on length of data and the block size of the Length of padding depends on length of data and the block size of the
specified encryption algorithm. specified encryption algorithm.
Different types of padding may be selected via the padding_class parameter Different types of padding may be selected via the padding_class parameter
""" """
blocklen = get_cipher_blocklen(cipherspec)
if padding_class == 0x01: #ISO padding if padding_class == 0x01: #ISO padding
last_block_length = len(data) % blocklen last_block_length = len(data) % blocklen

View File

@@ -56,6 +56,7 @@ class ControlReferenceTemplate:
self.DFref = None self.DFref = None
self.keylength = None self.keylength = None
self.algorithm = None self.algorithm = None
self.blocklength = None
self.usage_qualifier = None self.usage_qualifier = None
if config != "": if config != "":
self.parse_SE_config(config) self.parse_SE_config(config)
@@ -283,7 +284,7 @@ class Security_Environment(object):
if authenticate_header: if authenticate_header:
to_authenticate = inttostring(CAPDU.cla) + inttostring(CAPDU.ins)+\ to_authenticate = inttostring(CAPDU.cla) + inttostring(CAPDU.ins)+\
inttostring(CAPDU.p1) + inttostring(CAPDU.p2) 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: else:
to_authenticate = "" to_authenticate = ""
@@ -366,7 +367,7 @@ class Security_Environment(object):
#SM data objects for authentication #SM data objects for authentication
if tag == SM_Class["CHECKSUM"]: 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, sw, checksum = self.compute_cryptographic_checksum(0x8E,
0x80, 0x80,
auth) auth)
@@ -437,9 +438,9 @@ class Security_Environment(object):
if sw == SW["NORMAL"]: if sw == SW["NORMAL"]:
if self.cct.algorithm == None: if self.cct.algorithm == None:
raise SwError(SW["CONDITIONSNOTSATISFIED"]) raise SwError(SW["CONDITIONSNOTSATISFIED"])
elif self.cct.algorithm == "CCT": elif self.cct.algorithm == "CC":
tag = SM_Class["CHECKSUM"] 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) sw, auth = self.compute_cryptographic_checksum(0x8E, 0x80, padded)
length = len(auth) length = len(auth)
return_data += pack([(tag, length, auth)]) return_data += pack([(tag, length, auth)])
@@ -638,7 +639,7 @@ class Security_Environment(object):
if key == None or algo == None: if key == None or algo == None:
return SW["ERR_CONDITIONNOTSATISFIED"], "" return SW["ERR_CONDITIONNOTSATISFIED"], ""
else: 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) crypted = vsCrypto.encrypt(algo, key, padded, self.ct.iv)
return SW["NORMAL"], crypted return SW["NORMAL"], crypted

View File

@@ -33,6 +33,7 @@ class ePass_SE(Security_Environment):
Security_Environment.__init__(self, MF, SAM) Security_Environment.__init__(self, MF, SAM)
self.ssc = ssc self.ssc = ssc
self.cct.algorithm = "CC" self.cct.algorithm = "CC"
self.cct.blocklength = 8
self.ct.algorithm = "DES3-CBC" self.ct.algorithm = "DES3-CBC"
def compute_cryptographic_checksum(self, p1, p2, data): def compute_cryptographic_checksum(self, p1, p2, data):

View File

@@ -67,6 +67,8 @@ class nPA_SE(Security_Environment):
def __init__(self, MF, SAM): def __init__(self, MF, SAM):
Security_Environment.__init__(self, MF, SAM) Security_Environment.__init__(self, MF, SAM)
self.at = nPA_AT_CRT() self.at = nPA_AT_CRT()
#This breaks support for 3DES
self.cct.blocklength = 16
self.eac_step = 0 self.eac_step = 0
self.sec = None self.sec = None
self.eac_ctx = None self.eac_ctx = None