# -*- coding: utf-8 -*-
"""
中交金卡个人化
2016/06/29
@author: cheng.wei
"""
from PBOCLib.command import *
from PBOCLib.PBOC import *
import PBOCLib.log_util
pboc=pboc()
def len_Str(str):
Data_Len = (len(str) / 2);
return (''.join('%02x' % Data_Len)).upper()
def len81(str):
Data_Len = (len(str) / 2)
Str_Temp = ''.join('%02x' % Data_Len)
if Data_Len >= 0x80 :
Str_Temp = ('81' + Str_Temp)
return Str_Temp.upper()
def DerivedKey(sMainKey=None, sAppMainAccount=None):
DkeyLeft = blockDesECB(sAppMainAccount, sMainKey, 1)
tempData = not_(sAppMainAccount)
DkeyRight = blockDesECB(tempData, sMainKey, 1)
return (DkeyLeft + DkeyRight)
def GP_SecureChannel(KeyVersion=None):
global SecurityLevel, SKUenc, SKUmac, SKUdek, C_MAC
rand = Randbuf(8)
r1, sw1, sw2 = SendCommand('8050' + KeyVersion + '0008' + rand)
SequenceCounter = r1[24: 28]
Cardcrypto = r1[40 : 56]
Rcard = r1[28 : 40]
# 计算过程密钥
# 计算SKUenc使用CBCTdes,不补80
SKUenc = blockDesCBC('0182'+ SequenceCounter + '000000000000000000000000', K_ENC, 1, True)
# 计算SKUmac使用CBCTdes,不补80
SKUmac = blockDesCBC('0101'+ SequenceCounter + '000000000000000000000000', K_MAC, 1, True)
# 计算SKUdek使用CBCTdes,不补80
SKUdek = blockDesCBC('0181'+ SequenceCounter + '000000000000000000000000', K_DEK, 1, True)
hostCrypto = blockDesCBC(rand + SequenceCounter + Rcard + '8000000000000000', SKUenc, 1)
if hostCrypto != Cardcrypto:
raise showError('主机计算的密文值不等于卡片返回的密文值')
hostCrypto = blockDesCBC(SequenceCounter + Rcard + rand + '8000000000000000', SKUenc, 1)
C_MAC = blockMac('8482' + SecurityLevel + '0010' + hostCrypto, SKUmac, 8)
SendCommand('8482' + SecurityLevel + '0010' + hostCrypto + C_MAC)
def Delete(sP1P2, Aid):
global SecurityLevel, SKUenc, SKUmac, SKUdek, C_MAC
sCmdData = '4F' + len_Str(Aid) + Aid
if SecurityLevel == '00':
sCmdLc = len_Str(sCmdData)
SendCommand('80E4' + sP1P2 + sCmdLc + sCmdData, '6A88/9000')
elif SecurityLevel == '01':
sCmdLc = len_Str(sCmdData + C_MAC)
C_MAC = blockMac(C_MAC + '84E4'+ sP1P2 + sCmdLc + sCmdData, SKUmac, macLen = 8)
SendCommand('84E4' + sP1P2 + sCmdLc + sCmdData + C_MAC, '6A88/9000')
elif SecurityLevel == '03':
sCmdLc = len_Str(sCmdData + C_MAC)
C_MAC = blockMac(C_MAC + '84E4'+ sP1P2 + sCmdLc + sCmdData, SKUmac, macLen = 8)
Desdata = blockDesCBC(sCmdData, SKUenc, 1)
sCmdData = Desdata + C_MAC
sCmdLc = len_Str(sCmdData)
SendCommand('84E4'+ sP1P2 + sCmdLc + sCmdData + C_MAC, '6A88/9000')
#安装应用函数
def Install(sAidPack, sAidMd, sAidInstance, sPri, sPara, sToken):
global SecurityLevel, SKUenc, SKUmac, SKUdek, C_MAC
sPacketLen = len_Str(sAidPack)
sExeLen = len_Str(sAidMd)
sAidLen = len_Str(sAidInstance)
sParaLen = len_Str(sPara)
sTokenLen = len_Str(sToken)
sCmdData = sPacketLen + sAidPack + sExeLen + sAidMd + sAidLen + sAidInstance + '01' + sPri + sParaLen + sPara + sTokenLen + sToken
if SecurityLevel == '00':
sCmdLc = len_Str(sCmdData)
SendCommand('80E60C00' + sCmdLc + sCmdData)
elif SecurityLevel == '01':
sCmdLc = len_Str(sCmdData + C_MAC)
C_MAC = blockMac(C_MAC + '84E60C00'+ sCmdLc + sCmdData, SKUmac, macLen = 8)
SendCommand('84E60C00' + sCmdLc + sCmdData + C_MAC)
elif SecurityLevel == '03':
sCmdLc = len_Str(sCmdData + C_MAC)
C_MAC = blockMac(C_MAC + '84E60C00' + sCmdLc + sCmdData, SKUmac, macLen = 8)
Desdata = blockDesCBC(sCmdData, SKUenc, 1)
sCmdData = Desdata + C_MAC
sCmdLc = len_Str(sCmdData)
SendCommand('84E60C00' + sCmdLc + sCmdData + C_MAC)
def CreateFile(sFid, sSFI, sType, sRecordNum, sRecordLen, sRight, sMACCounter, sAid):
if len_Str(sAid) == '00':
sCmdData = sFid + sSFI+sType + sRecordNum + sRecordLen + sRight + sMACCounter + '00'
else:
sCmdData = sFid + sSFI+sType + sRecordNum + sRecordLen + sRight + sMACCounter + len_Str(sAid) + sAid
sCmdHead = '80E0' + '0000'
sCmdLc = len_Str(sCmdData)
SendCommand(sCmdHead + sCmdLc +sCmdData)
def WriteKey(SJKeyID, DisData, sCLA, sP1, sKeyPara, sKeyExauthState, sKeyVal):
global K_TCK_APP
if len_Str(sKeyVal) == '00':
raise showError('密钥长度错误!')
sKeyType = sKeyPara[0:2]
if sCLA == '80':
if (sKeyType == '0B') or (sKeyType == '12'):
sCmdData = sKeyPara + sKeyExauthState + '030000' + sKeyVal
else:
sCmdData = sKeyPara + sKeyExauthState + '000000' + sKeyVal
sCmdHead = '80D4' + sP1 + '00' + len_Str(sCmdData)
SendCommand(sCmdHead + sCmdData)
else:
ran,sw1,sw2 = SendCommand('0084000008')
#ran = ran + '00000000'
sCmdData = sKeyPara + sKeyExauthState + '000000' + sKeyVal
sCmdData = len_Str(sCmdData) + sCmdData #因为去掉了WriteKey补丁 by Huihh 2017.04.25
#sCmdData = len_Str(sCmdData) + sCmdData
Desdata = blockDesECB(sCmdData, K_TCK_APP, 1)
sCmdHead = '84D4' + sP1 + '00'+ len_Str(Desdata + '00000000')
sCmdMac = blockMac(sCmdHead + Desdata, K_TCK_APP, 4, ran)
SendCommand(sCmdHead + Desdata + sCmdMac)
#外部认证函数
def ExterAuthen(Key, KeyIndex):
rtn, sw1, sw2 = SendCommand('0084000008')
#exterData = rtn + '00000000'
exterData = rtn
enData = blockDesECB(exterData, Key, 1)
SendCommand('0082' + KeyIndex + '00' + len_Str(enData) + enData)
def StoreData(p1, DGI, sData):
global SecurityLevel, SKUenc, SKUmac, SKUdek, C_MAC, BlockNum
p2 = BlockNum
Data_Len = len(sData) / 2
Data_Len_Str = ''.join('%02x' %Data_Len)
# blockNum = Data_Len/235
if len(sData) > 510:
sDGI_TL = DGI + '0' + Data_Len_Str
else:
sDGI_TL = DGI + Data_Len_Str
# sDGI_TL = DGI + Data_Len_Str # DGI长度使用一个字节表示 2014/09/12 by cheng.wei
utemp = int(p1, 16)
if utemp & (1 << 6): # 如果参数P1的第6位为1,则采用加密格式
if utemp & (1 << 5): # 如果参数P1的第5位为1,则采用SKUdek ECB加密
if utemp & (1 << 0): # 如果参数P1的第0位为1,则在DEK-ECB加密时强制填充8000...(即使已经是8的倍数)
Padding_Len = len(sData) % 16
if Padding_Len == 0:
sData = sData + '8000000000000000'
Padding_Len = len(sData) % 16
if Padding_Len != 0:
utemp = utemp | 0x01
sP1 = int_to_hex(utemp)
p1 = sP1
sData = blockDesECB(sData, SKUdek, 1) # blockDes会在数据后补8000…至8的倍数
else: # 如果参数P1的第5位为0,则采用SKUencCBC加密
sData = blockDesCBC(sData, SKUenc, 1, True)
# 判断数据域长度是否超过255字节,超过分两包数据
len_sData = len(sData)/2
if len_sData > 235:
sData_front = sData[0:456]
sData = sData[456 : ]
utemp = int(p1, 16)
# sDGI_TL = DGI +'E4' # DGI长度使用一个字节表示 2014/09/12 by cheng.wei
sCmdData = sDGI_TL + sData_front
utemp = (utemp | 0x02)
sP1_front = int_to_hex(utemp)
if SecurityLevel == '00':
# send_Command(connxn, 0x80, 0xE2, utemp, BlockNum, len(sCmdData), sCmdData);
cla = 0x80
# p1 = utemp
data = hex_string_to_byte_list(sCmdData)
if SecurityLevel == '01':
cla = 0x84
# p1 = utemp
lc = len(sCmdData + C_MAC) /2
lc_str = ''.join('%02x' %lc)
BlockNum_Str = int_to_hex(p2)
C_MAC = blockMac(C_MAC + '84E2'+ sP1_front + BlockNum_Str + lc_str + sCmdData, SKUmac, 8)
data = hex_string_to_byte_list(sCmdData + C_MAC)
# send_Command(connxn, 0x84, 0xE2, utemp, BlockNum, len(sCmdData), sCmdData + C_MAC);
if SecurityLevel == '03':
cla = 0x84
# p1 = utemp
lc = len(sCmdData + C_MAC) /2
lc_str = ''.join('%02x' %lc)
BlockNum_Str = int_to_hex(p2)
C_MAC = blockMac(C_MAC + '84E2'+ sP1_front + BlockNum_Str + lc_str + sCmdData, SKUmac, 8)
Desdata = blockDesCBC(sCmdData, SKUenc, 1, True)
data = hex_string_to_byte_list(Desdata + C_MAC)
# send_Command(connxn, 0x84, 0xE2, utemp, BlockNum, len(sCmdData + C_MAC), Desdata + C_MAC);
scla = ''.join('%02x' %cla)
sp1 = ''.join('%02x' %utemp)
sp2 = ''.join('%02x' %p2)
SendCommand(scla + 'E2' + sp1 + sp2 + len_Str(data) + data)
p2 = p2 + 1
# Data_Len = len(sData) / 2
# Data_Len_Str = ''.join('%02x' %Data_Len)
# sDGI_TL = DGI + Data_Len_Str # DGI长度使用一个字节表示 2014/09/12 by cheng.wei
sCmdData = sDGI_TL + sData
# sCmdData = DGI + '00' + int_to_hex(len(sData)/2) + sData
utemp = int(p1, 16)
if SecurityLevel == '00':
cla = 0x80
# p1 = int(p1, 16)
data = sCmdData
if SecurityLevel == '01':
cla = 0x84
# p1 = utemp
lc = len(sCmdData + C_MAC) /2
lc_str = ''.join('%02x' %lc)
BlockNum_Str = int_to_hex(p2)
C_MAC = blockMac(C_MAC + '84E2'+ int_to_hex(utemp) + BlockNum_Str + lc_str + sCmdData, SKUmac, 8)
data = sCmdData + C_MAC
if SecurityLevel == '03':
cla = 0x84
# p1 = utemp
lc = len(sCmdData + C_MAC) /2
lc_str = ''.join('%02x' %lc)
BlockNum_Str = int_to_hex(p2)
C_MAC = blockMac(C_MAC + '84E2'+ int_to_hex(utemp) + BlockNum_Str + lc_str + sCmdData, SKUmac, 8)
Desdata = blockDesCBC(sCmdData, SKUenc, 1, True)
data = (Desdata + C_MAC)
scla = ''.join('%02x' %cla)
sp1 = ''.join('%02x' %utemp)
sp2 = ''.join('%02x' %p2)
SendCommand(scla + 'E2' + sp1 + sp2 + len_Str(data) + data)
p2 = p2 + 1
BlockNum = p2
def edepCalculateMac(data, key):
randData, sw1, sw2 = SendCommand('0084000008')
#initData = randData + '00000000'
initData = randData
return blockMac(data, key, 4, initData)
def pbocCalculateMac(data, key, atc):
initData = '000000000000' + atc
return blockMac(data, key, 4, initData)
F_TYPE_DF = '06' #目录文件
F_TYPE_EF_TRANSPARENT = '02' #二进制
F_TYPE_EF_LINEARFIXED = '04' #定长记录
F_TYPE_EF_CYCLIC = '03' #循环记录
F_TYPE_EF_LINEARVAR = '05' #变长记录
ZJ_ADF_AID = 'A000000632010105'
ADF_PACKAGE_AID = '4D4F542E49'
ADF_MOD_AID = '4D4F542E494E544552434954593032'
MF_AID = 'D1560000154D5A542E4444463031'
EP_AID = 'A000000632010105' #电子钱包的AID
EP_PACKAGE_AID = '4D4F542E49'
EP_MOD_AID = '4D4F542E494E544552434954593032'
EC_AID = 'A000000632010106' #电子现金的AID
EC_PACKAGE_AID = 'A00000033301'
EC_MOD_AID = 'A0000003330101'
PPSE_AID = '325041592E5359532E4444463031'
PSE_AID = '315041592E6359532E4444463031'
PPSE_PACKAGE_AID = '315041592E'
PPSE_MOD_AID = '315041592E5359532E4444463031'
KEY_DF01_MPK = 'D42D420AAC117FB1532453CD03766E43' #消费密钥
KEY_DF01_MLK = '3902904C1A6A3B39374D7F2A47463E54' #圈存密钥
KEY_DF01_MULK = '775DB0784AC0C7A7BC8BD895B197DD66' #圈提密钥
KEY_DF01_MUK = 'C39D84290201F372FE14A06363A03A1F' #修改透支限额密钥
KEY_DF01_MAPPBLK = '5EEC83EF88C066B2893195D36802B8DE' #应用锁定密钥
KEY_DF01_MAPPUBLK = '6525D35A370AB4CBDF3716F3C1CE4DF4' #应用解锁密钥
#KEY_DF01_MAPPUBLK = '20319EDAF7E34A89E6FBEFA70DD94A04' #应用解锁密钥 #更换后的密钥值 by Huihh 2016.10.14
KEY_DF01_MTK = 'A0FA6F9961ADF219266E289D1A80472B' #TAC密钥
KEY_DF01_MAMK = '834973D3295E76A168926BD580C20473' #应用维护密钥
KEY_DF01_MACK = '58B0FD07C1FD266D6819372645CD67AE'
EP_DF01_FCI_DATA = '6F318408A000000632010105A5259F0801029F0C1E09991001FFFFFFFF02010310622800010000111720150101204012310000'
EP_DF01_EF15_DATA = '03162050FFFFFFFF0201031051109010000003152018071320401231FF00'
EP_DF01_EF16_DATA = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
EP_DF01_EF17_DATA = '000001561900205000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
EP_DF01_EF18_DATA = '0000000000000000000000000000000000000000000000'
EP_DF01_EF05_DATA = '000000010000000000000000FFFFFFFFFFFFFFFFFFFFFFFF'
EP_DF01_EF06_DATA = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
EP_DF01_EF1E_DATA = 'E88BB9620C50F5A68D67F7082301F1EF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029F121A8'
DF01_EF1E_DATA_01 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_02 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_03 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_04 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_05 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_06 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_07 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_08 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_09 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_0A = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_0B = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_0C = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_0D = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_0E = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_0F = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_10 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_11 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_12 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_13 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_14 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_15 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_16 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_17 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_18 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_19 = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_1A = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_1B = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_1C = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_1D = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
DF01_EF1E_DATA_1E = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
# 交通卡应用子密钥分散过程
sAppMainAccount = EP_DF01_EF15_DATA[20:40] #应用主账户
factory2 = '6228000100001117'
#KEY_DF01_DPK = DerivedKey(KEY_DF01_MPK,sAppMainAccount[-16:]) #消费子密钥
#KEY_DF01_DLK = DerivedKey(KEY_DF01_MLK,sAppMainAccount[-16:]) #圈存子密钥
#KEY_DF01_DULK = DerivedKey(KEY_DF01_MULK,sAppMainAccount[-16:]) #圈提子密钥
#KEY_DF01_DUK = DerivedKey(KEY_DF01_MUK,sAppMainAccount[-16:]) #修改透支限额密钥子密钥
#KEY_DF01_DAPPBLK = DerivedKey(KEY_DF01_MAPPBLK,sAppMainAccount[-16:]) #用锁定子密钥
#KEY_DF01_DAPPUBLK = DerivedKey(KEY_DF01_MAPPUBLK,sAppMainAccount[-16:]) #应用解锁子密钥
#KEY_DF01_DTK = DerivedKey(KEY_DF01_MTK,sAppMainAccount[-16:]) #TAC密钥子密钥
#KEY_DF01_DAMK = DerivedKey(KEY_DF01_MAMK,sAppMainAccount[-16:]) #应用维护子密钥
KEY_DF01_DPK = DerivedKey(KEY_DF01_MPK,factory2) #消费子密钥
KEY_DF01_DLK = DerivedKey(KEY_DF01_MLK,factory2) #圈存子密钥
KEY_DF01_DULK = DerivedKey(KEY_DF01_MULK,factory2) #圈提子密钥
KEY_DF01_DUK = DerivedKey(KEY_DF01_MUK,factory2) #修改透支限额密钥子密钥
KEY_DF01_DAPPBLK = DerivedKey(KEY_DF01_MAPPBLK,factory2) #用锁定子密钥
KEY_DF01_DAPPUBLK = DerivedKey(KEY_DF01_MAPPUBLK,factory2) #应用解锁子密钥
KEY_DF01_DTK = DerivedKey(KEY_DF01_MTK,factory2) #TAC密钥子密钥
KEY_DF01_DAMK = DerivedKey(KEY_DF01_MAMK,factory2) #应用维护子密钥
KEY_DF01_DACK = DerivedKey(KEY_DF01_MACK,factory2) #应用维护子密钥
#密钥索引
KEY_INDEX_00 = '00'
KEY_INDEX_01 = '01'
KEY_INDEX_02 = '02'
KEY_INDEX_03 = '03'
KEY_INDEX_04 = '04'
KEY_INDEX_05 = '05'
#算法标识 z
KEY_ALG_DES_ID = '00'
#密钥类型定义
KEY_TYPE_MPK = '00' #消费取现密钥
KEY_TYPE_MLK = '01' #圈存密钥
KEY_TYPE_MTK = '02' #TAC密钥
KEY_TYPE_MULK = '03' #圈提密钥
KEY_TYPE_MUK = '04' #修改透支限额密钥
KEY_TYPE_MPUK = '06' #PIN解锁密钥
KEY_TYPE_MRPK = '07' #PIN重装密钥
KEY_TYPE_GREYUNLOCK = '0C' #联机解扣密钥
KEY_TYPE_APPBLOCK = '0E' #应用锁定密钥
KEY_TYPE_APPUNBLOCK = '0F' #应用解锁密钥
KEY_TYPE_APPUPDATE = '10' #应用下文件更新密钥
KEY_TYPE_PIN_INIT = '0B' #初始化PIN
KEY_TYPE_MACK = '12'#主控密钥(外部认证密钥)
KEY_TYPE_MAMK = '13' #维护密钥, 2组
#密钥版本 , 来自PBOC EDEP送检指南
#密钥版本号: 消费密钥版本01,
#圈存密钥版本02,
#修改透支限额密钥版本04,
#圈提密钥版本05。
#交易中DES 算法标识为“00”
KEY_VERSION_00 = '00'
KEY_VERSION_01 = '01'
KEY_VERSION_02 = '02'
KEY_VERSION_03 = '03'
KEY_VERSION_04 = '04'
#FID
MF_FID = '3F00'
MF_FCI_FID = '0003'
MF_DIR_FID = '0001'
MF_KEY_FID = '0000'
DF01_FID = 'DF01'
DF01_KEY_FID = '0000'
DF01_FCI_FID = '0003'
DF01_EF15_FID = '0015'
DF01_EF16_FID = '0016'
DF01_EF17_FID = '0017'
DF01_EF18_FID = '0018'
DF01_EF05_FID = '0005'
DF01_EF06_FID = '0006'
DF01_EF19_FID = '0019'
DF01_EF1A_FID = '001A'
DF01_EF1E_FID = '001E'
#SFI
MF_SFI = 'FF'
MF_FCI_SFI = '03'
MF_DIR_SFI = '01'
MF_KEY_SFI = '00'
DF01_SFI = 'FF'
DF01_FCI_SFI = '03'
DF01_KEY_SFI = '00'
DF01_EF15_SFI = '15'
DF01_EF16_SFI = '16'
DF01_EF17_SFI = '17'
DF01_EF18_SFI = '18'
DF01_EF05_SFI = '05'
DF01_EF06_SFI = '06'
DF01_EF19_SFI = '19'
DF01_EF1A_SFI = '1A'
DF01_EF1E_SFI = '1E'
#类型
MF_TYPE = F_TYPE_DF
MF_FCI_TYPE = F_TYPE_EF_LINEARVAR
MF_DIR_TYPE = F_TYPE_EF_LINEARVAR
MF_KEY_TYPE = F_TYPE_EF_LINEARVAR
#MF_EF05_TYPE = F_TYPE_EF_TRANSPARENT
#MF_EF16_TYPE = F_TYPE_EF_TRANSPARENT
#MF_EF1A_TYPE = F_TYPE_EF_TRANSPARENT
DF01_TYPE = F_TYPE_DF
DF01_FCI_TYPE = F_TYPE_EF_LINEARVAR
DF01_KEY_TYPE = F_TYPE_EF_LINEARVAR
DF01_EF15_TYPE = F_TYPE_EF_TRANSPARENT
DF01_EF16_TYPE = F_TYPE_EF_TRANSPARENT
DF01_EF17_TYPE = F_TYPE_EF_TRANSPARENT
DF01_EF05_TYPE = F_TYPE_EF_TRANSPARENT
DF01_EF06_TYPE = F_TYPE_EF_TRANSPARENT
DF01_EF18_TYPE = F_TYPE_EF_CYCLIC
DF01_EF19_TYPE = F_TYPE_EF_LINEARVAR
DF01_EF1A_TYPE = F_TYPE_EF_LINEARVAR
DF01_EF1E_TYPE = F_TYPE_EF_CYCLIC
MF_RWE = 'FFFF'
MF_FCI_RWE = 'FFFF'
MF_DIR_RWE = KEY_TYPE_MAMK + KEY_INDEX_00
MF_KEY_RWE = 'FFFF'
DF01_RWE = 'FFFF'
DF01_FCI_RWE = 'FFFF'
DF01_KEY_RWE = 'FFFF'
DF01_EF15_RWE = KEY_TYPE_MAMK + KEY_INDEX_00
DF01_EF16_RWE = KEY_TYPE_MAMK + KEY_INDEX_00
DF01_EF17_RWE = KEY_TYPE_MAMK + KEY_INDEX_00
DF01_EF18_RWE = 'FFFF'
DF01_EF19_RWE = KEY_TYPE_MAMK + KEY_INDEX_01
DF01_EF1A_RWE = KEY_TYPE_MAMK + KEY_INDEX_00
DF01_EF1E_RWE = 'FFFF'
SecurityLevel = "00"
ISD_AID = 'A000000003000000'
K_ENC = '404142434445464748494A4B4C4D4E4F'
K_MAC = '404142434445464748494A4B4C4D4E4F'
K_DEK = '404142434445464748494A4B4C4D4E4F'
SKUenc = ''
SKUmac = ''
SKUdek = ''
C_MAC = ''
K_TCK_APP = ''
g_sAppDisData = ''
BlockNum = 0
#获取记录保护密钥
issuer_ec_capp = '949D580B1F25512F9B1375ADF4F48C16' #发卡机构记录保护密钥
# DEP = '09991001'
# PAN = '03222220711520768888'
# PAN = EP_DF01_EF15_DATA[20:40] #应用主账户
#PAN = '28000100001117'
#PANSN = '01'
#SN = PAN + PANSN
#derivedFactor = SN[-16:]
#EC_Capp_AppendRecord_Key = DerivedKey(issuer_ec_capp, derivedFactor)
def main():
global SecurityLevel, SKUenc, SKUmac, SKUdek, C_MAC, BlockNum
restart() #restart the card
# 认证安全通道
SecurityLevel = "00" # 01:C-MAC 03:C-DECRYPTION and C-MAC
# 选择卡管
select_aid (ISD_AID, '9000')
GP_SecureChannel('00')
#*****删除应用*****
Delete('0000', EC_AID)
Delete('0000', EP_AID)
Delete('0000', PPSE_AID)
Delete('0000', PSE_AID)
#*****安装PSE****
Install(PPSE_PACKAGE_AID, PPSE_MOD_AID, PSE_AID, '00', 'C900', '')
#*****安装PPSE*****
Install(PPSE_PACKAGE_AID, PPSE_MOD_AID, PPSE_AID, '00', 'C900', '')
#*****安装EP*****
Install(EP_PACKAGE_AID, EP_MOD_AID, EP_AID, '10', 'C9020000', '')
#*****安装EC*****
Install(EC_PACKAGE_AID, EC_MOD_AID, EC_AID, '00', 'C908C00100C203011E00', '')
#?
#PSE FCI 文件控制信息
#PSE_AID = 1PAY.cYS.DDF01
select_aid (PSE_AID, '9000')
#SendCommand('80E20000'+'17'+'9102'+'14A5128801015F2D087A68656E667264659F110101')
SendCommand('80E20000'+'1E'+'9102'+'1BA5198801015F2D027A689F110101BF0C0A9F4D020B0ADF4D020C0A')
#SendCommand('80E28001'+'2F'+'0101'+'2C702A61284F08A0000006320101069F120F4341524420494D4147452030303437500A4D4F545F545F43415348')
SendCommand('80E28001'+'20'+'0101'+'1D701B61194F08A000000632010106500A4D4F545F545F43415348870101')
#PPSE FCI
#PPSE_AID = 2PAY.SYS.DDF01
select_aid (PPSE_AID, '9000')
#SendCommand('80E280003C 910239A537BF0C3461194F08A000000632010106500A4D4F545F545F4341534887010161174F08A00000063201010550084D4F545F545F4550870102')
SendCommand('80E28000359102326F30840E325041592E5359532E4444463031A51EBF0C1B61194F08A000000632010106500A4D4F545F545F43415348870101')
#EP个人化
select_aid (EP_AID, '9000')
BlockNum = 0
# #*****建立MF*****
# CreateFile(MF_FID, MF_SFI, MF_TYPE, '0000', '0000', MF_RWE, '00', MF_AID)
# #*****建立MF FCI 文件*****
# CreateFile(MF_FCI_FID, MF_FCI_SFI, MF_FCI_TYPE, '0001', '0000', MF_FCI_RWE, '00', '')
# #*****建立MF dir文件*****
# CreateFile(MF_DIR_FID, MF_DIR_SFI, MF_DIR_TYPE, '0001', '0000', MF_DIR_RWE, '00', '')
# #*****建立MF KEY 文件*****
# CreateFile(MF_KEY_FID, MF_KEY_SFI, MF_KEY_TYPE, '0003', '0000', MF_KEY_RWE, '00', '')
# #*****写MF主控 *****
# WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MACK + KEY_INDEX_00 + KEY_VERSION_00 + KEY_ALG_DES_ID, '00', KEY_DF01_DACK)
# ExterAuthen(KEY_DF01_DACK, KEY_INDEX_00)
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MACK + KEY_INDEX_01 + KEY_VERSION_00 + KEY_ALG_DES_ID, '00', KEY_DF01_DAMK)
#STORE DATA 命令用于个人化时装载应用数据,当收到最后一块的时候,个人化阶段完成。
#WriteKey 用于个人化时装载或修改应用密钥
#*****建立MF DF01文件*****
CreateFile('DF01', DF01_SFI, DF01_TYPE, '0000', '0000', DF01_RWE, '00', ZJ_ADF_AID)
#*****建立DF01 FCI文件*****
CreateFile(DF01_FCI_FID, DF01_FCI_SFI, DF01_FCI_TYPE, '0001', '0000', '0000', 'F0', '')
StoreData('00', MF_FCI_SFI+'00', EP_DF01_FCI_DATA)
#*****建立DF01下的密钥文件*****
CreateFile(DF01_KEY_FID, DF01_KEY_SFI, DF01_KEY_TYPE, '0010', '0000', '0000', 'F0', '')
#*****写DF01应用主控*****
global K_TCK_APP
K_TCK_APP = '7567439E3DAD371F51BF85B638343710'
# WriteKey(SJKeyID, DisData, sCLA, sP1, sKeyPara, sKeyExauthState, sKeyVal)
KEY_DF01_DACK = '7567439E3DAD371F51BF85B638343710'
WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MACK + KEY_INDEX_00 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DACK)
ExterAuthen(KEY_DF01_DACK, KEY_INDEX_00)
#*****写维护密钥0 DAMK*****
KEY_DF01_DAMK = 'C107A77F012398E51AADC1CD1C629E3B'
WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MAMK + KEY_INDEX_00 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DAMK)
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MAMK + KEY_INDEX_00 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DAMK)
#*****写圈存密钥1, DLK1*****
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MLK + KEY_INDEX_01 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DLK)
KEY_DF01_DLK = 'C107A77F012398E51AADC1CD1C629E3B'
WriteKey('00', g_sAppDisData, '84', '00', KEY_TYPE_MLK + KEY_INDEX_01 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DLK)
#*****写圈提密钥, DULK*****
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MULK + KEY_INDEX_01 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DULK)
KEY_DF01_DULK = '590DF08FD06D33B2DB412A166429E730'
WriteKey('00', g_sAppDisData, '84', '00', KEY_TYPE_MULK + KEY_INDEX_01 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DULK)
#*****写消费密钥1, DPK1*****
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MPK + KEY_INDEX_01 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DPK)
KEY_DF01_DPK = 'B958A40DCE9BBC68FD97D92C7CDF07D3'
WriteKey('00', g_sAppDisData, '84', '00', KEY_TYPE_MPK + KEY_INDEX_01 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DPK)
#*****写修改透支限额密钥, DUK*****
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MUK + KEY_INDEX_01 + KEY_VERSION_04 + KEY_ALG_DES_ID, '00', KEY_DF01_DUK)
KEY_DF01_DUK = '780F1CF1D78A8AFE2B88FCD6EED115CB'
WriteKey('00', g_sAppDisData, '84', '00', KEY_TYPE_MUK + KEY_INDEX_01 + KEY_VERSION_04 + KEY_ALG_DES_ID, '00', KEY_DF01_DUK)
#*****写应用解锁密钥, DAPPUBLK*****
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_APPUNBLOCK + KEY_INDEX_00 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DAPPUBLK)
KEY_DF01_DAPPUBLK = '5E138A6EE9623D7954FE0486915D208A'
WriteKey('00', g_sAppDisData, '84', '00', KEY_TYPE_APPUNBLOCK + KEY_INDEX_00 + KEY_VERSION_01 + KEY_ALG_DES_ID, '00', KEY_DF01_DAPPUBLK)
#*****写应用锁定密钥, DAPPBLK*****
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_APPBLOCK + KEY_INDEX_00 + KEY_VERSION_01 + KEY_ALG_DES_ID,'00', KEY_DF01_DAPPBLK)
KEY_DF01_DAPPBLK = '91D5E33E385BD6BC984C9BA2296E5BE0'
WriteKey('00', g_sAppDisData, '84', '00', KEY_TYPE_APPBLOCK + KEY_INDEX_00 + KEY_VERSION_01 + KEY_ALG_DES_ID,'00', KEY_DF01_DAPPBLK)
#*****写TAC密钥, DTK*****
#WriteKey('00', g_sAppDisData, '80', '00', KEY_TYPE_MTK + KEY_INDEX_01 + KEY_VERSION_01 + KEY_ALG_DES_ID,'00', KEY_DF01_DTK)
KEY_DF01_DTK = '7367F1C8831631925E16349D37FDE320'
WriteKey('00', g_sAppDisData, '84', '00', KEY_TYPE_MTK + KEY_INDEX_01 + KEY_VERSION_01 + KEY_ALG_DES_ID,'00', KEY_DF01_DTK)
#*****建立DF01 15文件,二进制*****
CreateFile(DF01_EF15_FID, DF01_EF15_SFI, DF01_EF15_TYPE, '0001','001E', '8498', 'F0', '')
StoreData('00', DF01_EF15_SFI+'00', EP_DF01_EF15_DATA)
#*****建立DF01 16文件,二进制*****
CreateFile(DF01_EF16_FID, DF01_EF16_SFI, DF01_EF16_TYPE, '0001', '0037', '8498', 'F0', '')
StoreData('00', DF01_EF16_SFI+'00', EP_DF01_EF16_DATA)
#*****建立DF01 17文件,二进制*****
CreateFile(DF01_EF17_FID, DF01_EF17_SFI, DF01_EF17_TYPE, '0001', '003C', '8498', 'F0', '')
StoreData('00', DF01_EF17_SFI+'00', EP_DF01_EF17_DATA)
#*****建立DF01 05文件,二进制*****
CreateFile(DF01_EF05_FID, DF01_EF05_SFI, DF01_EF05_TYPE, '0001', '003C', '8498', 'F0', '')
StoreData('00', DF01_EF05_SFI+'00', EP_DF01_EF05_DATA)
#*****建立DF01 06文件,二进制*****
CreateFile(DF01_EF06_FID, DF01_EF06_SFI, DF01_EF06_TYPE, '0001', '0044', '8498', 'F0', '')
StoreData('00', DF01_EF06_SFI+'00', EP_DF01_EF06_DATA)
#*****建立DF01 18文件,明细文件, 循环记录*****
CreateFile(DF01_EF18_FID, DF01_EF18_SFI, DF01_EF18_TYPE, '000A', '0017', '8098', 'F0', '')
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
StoreData('00', DF01_EF18_SFI+'00', EP_DF01_EF18_DATA)
#*****建立DF01 1A文件,复合交易专用, 变长记录*****
CreateFile(DF01_EF1A_FID, DF01_EF1A_SFI, DF01_EF1A_TYPE, '0012', '0000', '8498', 'F0', '')
#*****建立DF01 1E文件,复合交易专用, 循环记录*****
CreateFile(DF01_EF1E_FID, DF01_EF1E_SFI, DF01_EF1E_TYPE, '001E', '0030', '8498', 'F0', '')
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_01)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_02)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_03)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_04)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_05)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_06)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_07)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_08)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_09)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_0A)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_0B)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_0C)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_0D)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_0E)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_0F)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_10)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_11)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_12)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_13)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_14)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_15)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_16)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_17)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_18)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_19)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_1A)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_1B)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_1C)
StoreData('00', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_1D)
StoreData('80', DF01_EF1E_SFI+'00', DF01_EF1E_DATA_1E)
#EC-电子现金个人化
# store方法形参:p1, DGI, sData
select_aid (EC_AID, '9000')
BlockNum = 0
GP_SecureChannel('00')
#未修改
StoreData('00', '0101', '703E57133105110901000000315D40122200123456789F5F201A20202020202020202020202020202020202020202020202020209F1F01209F6101209F620100')
SendCommand('80E20001FF0102FE7081FB9081F8CA832A5A66E7623A0E54CB8A410FD66660E0320CB8AF17BF52E0B897E7D1D44BF60FC0B35848FD8A907901CAE5CB6757643C793C9DB25A76974BE634E8F38EEBD12160C885A131DDA0C9441DDC6D335BB8C1698EDF8F8C8940FF67CA200BF3D061E1D30F259ECAB21E04134BC85A04511B3B04EEACEF82D94258CE243F8AF8DD389ED98B54A15F12F9433F19FDCEBDC71206B702FAD812684DC975A6A168D48E0143487277F99CACCBEBF9C1E858209BBEC09A30FEA2E5885958D85DB8C42CB409324A2FDC3A493EB3BACEE88263260A6E94A6DF93ED339EC17A7B41C275923613BB53335D9697742253D4C4270CC5F731F52FBBE207')
BlockNum += 1
SendCommand('80E20002029861')
BlockNum += 1
StoreData('00', '0103', '70099F32010392008F0108')
StoreData('00', '0201', '7081855F25031807175F24034012315A0A3105110901000000059F5F3401019F0702FF008E0C000000000000000002031F009F0D05D86004A8009F0E0500109800009F0F05D86804F8005F280201568C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E148D1A8A029F02069F03069F1A0295055F2A029A039F21039C019F3704')
StoreData('00', '0202', '708193938190814C65DCF54F0F6D75E5CC8DE859CDB659C553F0D78311A1803DAB65906F41802FDD85346FD065B61D23472652C7F13F8D08212A4B92D562DA3CC6B045B5A4D94AD6DC5A963115061582D5836BD727E920E9EF47B0E666441422FF78AF8427FF11A37E0E284103AA466BBC81A29B59256356E0EE38CF5C999ABC5D413E3FDB8C65C5421889EDE61DB6AA6FB1AD30A0D8')
StoreData('00', '0203', '7081949F468190AEDAD2610949B53494611E7E6E3D82C7AE682E5A1D954E2094BD3C42CCBC91F64AA26095DDAD0AC9E60919CA831891D55CE0AF470C8D9EAFE8BFE7BA1644131947530903867619706DA1D5EBD6485EDBF20989523037E82CE71247FD789BC2B77826506277DBC4C3FA424FFFB6AFB2CB6D9C654401C2BD79B8B47158F6F5ED13594F5DC2CB607F333634FC6A476BC88B')
StoreData('00', '0204', '70578C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E148D1A8A029F02069F03069F1A0295055F2A029A039F21039C019F37049F080200309F1401009F2301009F4701039F48009F49039F37049F4A0182')
StoreData('00', '0301', '707D5F24034012315A0A3105110901000000059F5F3401019F0702FF008E0A00000000000000001F009F0D05D8603CA8005F280201569F0E0500108000009F0F05D8683CF8008C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E148D1A8A029F02069F03069F1A0295055F2A029A039F21039C019F3704')
StoreData('00', '0302', '7081939381900BBC9CF01C0E9A16BEF8ED86F8AC36A3DB4855C675B6B0920111E56913B13C580059B490D711B976157645D7569C0EB92492D283745CE6ACE2AC3A6413D62CFA576F225F9FDB5E43365A2FF2985EE49FD2E987887E00194553CD051F2D23F7A48CAA0E46F55325B7CAAD0D64B808DD0217F13F982356911C1034424C3953462A0B32142CD7343957F774C2ACBA245E99')
StoreData('00', '0303', '7081949F468190822BB97D4190F4A9A35D9B9E31FEF97DBBD8231E9C79EAD147C27C6DD7A458617069C2A778AE9490569EADB3A5EC36EE0393C1C017094876C82AB96A5330F5AD5DDCA7CD08B2F23893DEAC6A11E4E8F9D85F3FEF77AFBCDE18A9698C93CFA46212F798E5BDFC04A80A81CEA1D29A84649123DC804141519A81E5EDE8C6970226E51712EFA7CA001C214041791BCB5B25')
StoreData('00', '0304', '70169F080200309F4701039F48009F49039F37049F4A0182')
StoreData('00', '0401', '70245F25031807175F300202209F420201569F74064543433030319F69080100000000000082')
#StoreData('00', '0501', '70099F7406454343303031')
#StoreData('00', '0501', '70139F74064543433030315F300202019F42020156') #更新之后的05文件 by Huihh 2016.10.10
#StoreData('00', '0701', '707E5A0A3222220711520768888F5F24032507155F25031507159F0702FFC08E0A00000000000000001F009F0D05D8603CA8009F0E0500108000009F0F05D8683CF8009F4A01828C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E148D1A8A029F02069F03069F1A0295055F2A029A039F21039C019F3704')
#StoreData('00', '0702', '700F9F420201565F300202209F08020030')
#StoreData('00', '0703', '7081939381909417FA339E47266E393CC3FBD44C0AFBD9EE7674455CA1F499AC90CF9D5B77F431CFA08C0B3A695AF7D03A34E44DAB9210FB329FC22978917700DFB9599C58FB0B8CA60FFE44178108A9BF30B4953177B78C8D6B2D6F52F1409B339A47E3EF580EB8A99E8FBC0F9D550F6BD84EB41774C358D1A5974941ADE52521508B4F6218AF74EA6421AAD34B3E9474CEF17AD232')
#StoreData('00', '0704', '7081949F46819029E8B9220D21938A67DFE74E34307DF53C542804BE2C423C426F6451BD373BC97A1AF1E73F8F60C32BBA459F8AC68D6FDEF5BE450E48BD018EC5C4C7BBC89E533B6E3236499B329D8D6B36B1B225CA43F603CAF9A4549ED0C41D2DEB9D9FE443C75F1DD9BB11A3449E626D1F6E2669F440DF59FFF68EEFBCC0FF698F41697EC17F042825E2AA98FDC8B195C187E9484A')
#StoreData('00', '0705', '700D9F4701039F48009F49039F3704')
#StoreData('00', '0801', '701BDF240420180101DF250420150101DF210101DF22020001DF230101')
StoreData('00', '0D01', '9F55009F5601009F570201569F5801009F5901009F7201009F5301009F54060000000000009F5C060000000000009F7304000000009F360200009F13020000')
StoreData('00', '0E01', '9F4F199A039F21039F02069F03069F1A025F2A029F4E149C019F36029F510201569F5202C0009F5D060000000000019F6804815000009F6B060000001000009F6C0200009F6D060000000000009F77060000001000009F78060000001000009F7906000000000000DF6206000000000000DF6306000000000000DF4F199A039F21039F02069F03069F1A025F2A029F4E149C019F3602')
StoreData('00', '8010', '123456FFFFFFFFFF')
StoreData('00', '9010', '0303')
StoreData('00', '9104', '82027C0094080801030010010401')
StoreData('00', '9200', '9F100A07010103000000010A01')
StoreData('00', '9203', '82027C00940C080103001801040120010100')
StoreData('00', '9207', '82027C00940C0802030018010401200101009F100A07010103000000010A01')
StoreData('60', '8000', '5FEB054F49FD8A812CF93DDC9412F5EB13A89DF2EC7A3030536DDE16D711E681DB7AA2964C4C264B98F7CFBA54562BF9')
StoreData('00', '9000', '645D89267781702B00')
#StoreData('00', 'A001', '15010000FF028016010000FF018017010000FF040018010000FF020019010000FF04001A010000FF088E1E020000301E30')
#StoreData('00', '8020', '016D4AB6CD0BE5CD15B576D9D52C924C016D4AB6CD0BE5CD15B576D9D52C924C016D4AB6CD0BE5CD15B576D9D52C924C016D4AB6CD0BE5CD15B576D9D52C924C016D4AB6CD0BE5CD15B576D9D52C924C016D4AB6CD0BE5CD15B576D9D52C924C016D4AB6CD0BE5CD15B576D9D52C924C')
#StoreData('00', '9020', 'F5106AF5106AF5106AF5106AF5106AF5106AF5106A')
StoreData('60', '8201', '88561CD4A13B5CCE76D802C72100B1C2494332A60B155472B5CAD6063B19F64EE63C2492AB5A7421174DA2B7BBAFD5D1')
StoreData('60', '8202', '49CAB28090C0D8B96FD2A5EAEE10DB1E74751BF6FC63CBA86858EEFCD3632D523CA143FD79903A3446121EEC3933E17A')
StoreData('60', '8203', 'F42A89D859C3BDF35AACC089C2F5B7C54FB765F59F48EA6F4DE16260AFAB3337BF3822C377AB74D3783211BA8821FCAA')
StoreData('60', '8204', '68B8AE467EAD1E9F0F2E073581E6B7205F10DFF58C8FF56B136E2C94190FA43CEFC4DD0A8821FA952AA66BF35B6FFF52')
StoreData('60', '8205', 'FFB90975C923206C2CD8DE356328D56EDAFA486D2CF4657C9EA0DA3A540D4006C96FFBE6E282618C9EB12D66232BA969')
#未修改
StoreData('00', '9102', 'A53E500A4D4F545F545F434153488701019F38099F7A019F02065F2A025F2D027A689F1101019F120A4D4F545F545F43415348BF0C0A9F4D020B0ADF4D020C0A')
StoreData('00', '9103', 'A564500A4D4F545F545F434153488701019F381EDF60019F66049F02069F03069F1A0295055F2A029A039C019F21039F3704BF0C319F4D020B0ADF4D020C0ADF610182DF112003162050FFFFFFFF013105110901000000059F01010000015619002050000100')
#?
StoreData('00', '1A12', issuer_ec_capp)
StoreData('80', '1E1E', issuer_ec_capp)
#电子现金主控密钥 暂无安放
#*****EP开通扩展应用*****
restart()
select_aid (EP_AID, '9000')
#*****2701*****
cmdData = '04E200D084' + '27017D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2702*****
cmdData = '04E200D084' + '27027D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2703*****
cmdData = '04E200D084' + '27037D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2704*****
cmdData = '04E200D084' + '27047D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2705*****
cmdData = '04E200D084' + '27057D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2706*****
cmdData = '04E200D084' + '27067D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2707*****
cmdData = '04E200D074' + '27076D01010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2708*****
cmdData = '04E200D084' + '27087D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2709*****
cmdData = '04E200D084' + '27097D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****270A*****
cmdData = '04E200D084' + '270A7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****270B*****
cmdData = '04E200D084' + '270B7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****270C*****
cmdData = '04E200D084' + '270C7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****270D*****
cmdData = '04E200D022' + '270D1B010100000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****270E*****
cmdData = '04E200D084' + '270E7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****270F*****
cmdData = '04E200D084' + '270F7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2710*****
cmdData = '04E200D084' + '27107D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2711*****
cmdData = '04E200D084' + '27117D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****2712*****
cmdData = '04E200D084' + '27127D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = edepCalculateMac(cmdData, KEY_DF01_DAMK)
SendCommand(cmdData + mac)
#*****EC开通扩展应用*****
restart()
select_aid (EC_AID, '9000')
# #获取记录保护密钥
# issuer_ec_capp = 'D2B7A38C88C6471FEC673DC69ABC19D1' #发卡机构记录保护密钥
# # DEP = '09991001'
# # PAN = '03222220711520768888'
# # PAN = EP_DF01_EF15_DATA[20:40] #应用主账户
# PAN = '28000100001117'
# PANSN = '01'
# SN = PAN + PANSN
# derivedFactor = SN[-16:]
# EC_Capp_AppendRecord_Key = DerivedKey(issuer_ec_capp, derivedFactor)
#行业保护密钥
EC_Capp_StoreData_Key = '4AE08CB59B6B1C19E3940B0EF819B568'
# EC_Capp_Enc_AppendRecord_Key = blockDesECB(EC_Capp_AppendRecord_Key, EC_Capp_StoreData_Key)
EC_Capp_Enc_AppendRecord_Key = blockDesECB(EC_Capp_StoreData_Key, issuer_ec_capp)
ATC, SW1, SW2 = pboc.get_data('9F36')
ATC = ATC[6:10]
#*****2701*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27017D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2702*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27027D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2703*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27037D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2704*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27047D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2705*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27057D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2706*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27067D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2707*****
cmdData = '04E200D084' + EC_Capp_Enc_AppendRecord_Key + '27076D01010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2708*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27087D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2709*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27097D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****270A*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '270A7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****270B*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '270B7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****270C*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '270C7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****270D*****
cmdData = '04E200D032' + EC_Capp_Enc_AppendRecord_Key + '270D1B010100000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****270E*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '270E7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****270F*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '270F7D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2710*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27107D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2711*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27117D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****2712*****
cmdData = '04E200D094' + EC_Capp_Enc_AppendRecord_Key + '27127D0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
#*****1E*****
cmdData = '04E200F044' + EC_Capp_Enc_AppendRecord_Key + '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
mac = pbocCalculateMac(cmdData, issuer_ec_capp, ATC)
SendCommand(cmdData + mac)
disconnect() #disconnect the card
if __name__ == '__main__':
main()
else:
main()