内蒙古个人化修改

# -*- 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()
 

猜你喜欢

转载自blog.csdn.net/qq_27129519/article/details/81183886