def deriveKeys(self, card_challenge):
""" Derive session keys and calculate host_ and card_ cryptograms."""
# session keys derivation
k = DES3.new(self.i & M_BASEKEY and self.base_S_MAC or self.base_KEY,
DES.MODE_CBC, IV=ZERO8)
self.ses_C_MAC = k.encrypt(unhexlify("0101") + self.seqCounter +
ZERO12)
k = DES3.new(self.i & M_BASEKEY and self.base_S_MAC or self.base_KEY,
DES.MODE_CBC, IV=ZERO8)
self.ses_R_MAC = k.encrypt(unhexlify("0102") + self.seqCounter +
ZERO12)
k = DES3.new(self.i & M_BASEKEY and self.base_DEK or self.base_KEY,
DES.MODE_CBC, IV=ZERO8)
self.ses_DEK = k.encrypt(unhexlify("0181") + self.seqCounter + ZERO12)
k = DES3.new(self.i & M_BASEKEY and self.base_S_ENC or self.base_KEY,
DES.MODE_CBC, IV=ZERO8)
self.ses_ENC = k.encrypt(unhexlify("0182") + self.seqCounter + ZERO12)
# key for MAC encryption
if self.i & M_ICV_ENC:
self.k_icv = DES.new(self.ses_C_MAC[:8], DES.MODE_ECB)
# card cryptogram calculation
if self.i & M_PSEUDO:
self.card_challenge = self.calcMAC_1d(self.SD_AID, True)[:6]
else:
assert len(card_challenge) == 6,\
"Wrong length or missing card challenge (mandatory)"
self.card_challenge = card_challenge
self.host_cryptogram = self.calcMAC_3d(self.seqCounter +
self.card_challenge +
self.host_challenge)
self.card_cryptogram = self.calcMAC_3d(self.host_challenge +
self.seqCounter +
self.card_challenge)
评论列表
文章目录