コード例 #1
0
// 更新出厂KEY
int ks_zjvcc_cardtype::UpdateKey(const byte ucMainKey[16],byte ucKeyIndex,byte ucKeyType,byte ucKey[16]) {
    int nRet=0;
    byte ucCmd[256]= {0};
    byte ucCmdLen=0;
    byte ucOutBuf[128]= {0};
    int  iOutLen=0;
    int  keylen = 0;
    byte ucMac[4]= {0};
    byte ucSessionKey[17]= {0};
    byte ucRandom[9]= {0};
    byte ucPlainKey[40]= {0};


    // 更新握奇出厂卡的密钥
    memcpy(ucCmd,"\x84\xD4\x00\x00\x1C",5);
    ucCmd[2] = ucKeyType;
    ucCmd[3] = ucKeyIndex;

    keylen = 0;
    ucPlainKey[keylen++] = 16;
    memcpy(ucPlainKey+keylen,ucKey,16);
    keylen += 16;
    memcpy(ucPlainKey+keylen,"\x80\x00\x00\x00\x00\x00\x00",7);
    keylen += 7;

    nRet=GetRandomNum8(ucRandom);
    if(nRet) {
        return nRet;
    }

    //用主控会话密钥加密待加密数据
    EncryptKey(ucMainKey,2,ucPlainKey,keylen,ucOutBuf,iOutLen);

    memcpy(ucCmd+5,ucOutBuf,iOutLen);
    ucCmdLen=iOutLen+5;

    // 计算MAC
    CalcMac(ucRandom,(byte*)ucMainKey,2,ucCmd,ucCmdLen,ucMac);

    memcpy(ucCmd+ucCmdLen,ucMac,4);
    ucCmdLen+=4;

    byte ucRespData[256]= {0};
    byte ucRespLen = 0;

    return Adpu(ucCmd,ucCmdLen, ucRespData, ucRespLen);
}
コード例 #2
0
ファイル: tradepayback.cpp プロジェクト: vagabond1132/Code
int CTradePayback::DoPack(SAConnection *saConn, void * pNode,
                          unsigned char * pBuffer, unsigned & iBufLen)
{
    if(saConn == NULL || pNode == NULL || pBuffer == NULL)
    {
        trace_log(ERR, "Parameter error!");
        return RET_SYSEXP;
    }
    TRADEDATA * pData = (TRADEDATA *)pNode;

    CTLVTemplet tlvObj;
    if(1 != tlvObj.UnPackTLVData(pData->TransData.TlvDataLen, pData->TransData.TlvData))
    {
        trace_log(ERR, "UnPackTLVData fail!");
        return RET_SYSEXP;
    }

    bool bFlag = true;
    bool bHasPin = true, bHasTrack = true;
    unsigned char bFieldData[FIELD_MAXLEN]={0};
    BYTE bTmpData[FIELD_MAXLEN]={0};
    unsigned int iFieldDataLen = 0 ;
    //char cCurTime[15] = {0};
    BYTE bT2Data[120] = {0};
    char cLenData[5] = {0};

    //0消息类型
    bFlag &= sndObj.SetValueByStr(0 , "0220");
    //2主账号
        bFlag &= sndObj.SetValueByStr(2 , pData->TransData.HeadData.Account);
    //3 交易处理码
    if(!strncmp(pData->TransData.HeadData.SerConCode, "65", 2))
        bFlag &= sndObj.SetValueByStr(3, "021000");
    else
        bFlag &= sndObj.SetValueByStr(3, "020000");
    //4金额
    bFlag &= sndObj.SetValueByStr(4, pData->TransData.HeadData.ReqAmount);
    //11流水号
    bFlag &= sndObj.SetValueByStr(11, pData->VouchNo);

    /*struct tm stCurTime;
    time_t ltime;
    pthread_mutex_lock(&tm_lock);
    time( &ltime );
    strftime(cCurTime, sizeof(cCurTime)-1, "%Y%m%d%H%M%S", localtime_xgd(&ltime, &stCurTime));
    pthread_mutex_unlock(&tm_lock);
    //12 交易时间
    memset(bTmpData, 0, sizeof(bTmpData));
    memcpy(bTmpData, cCurTime + 8, 6);
    bFlag &= sndObj.SetValueByStr(12, (char *)bTmpData);
    //13 交易日期
    memset(bTmpData, 0, sizeof(bTmpData));
    memcpy(bTmpData, cCurTime + 4, 4);
    bFlag &= sndObj.SetValueByStr(13, (char *)bTmpData);*/

    //14卡有效期
    memset(bFieldData, 0, sizeof(bFieldData));
    iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_INPUTEXPDATE, bFieldData, sizeof(bFieldData));
    if(iFieldDataLen > 0)
    {
        bFlag &= sndObj.SetValueByStr(14, (char *)bFieldData);
    }
    
    //22服务点输入方式码
    //tlvObj.GetTLVItemByHex(TAG_POSENTMODE, pData->TransData.HeadData.SvrPointCode, 2);
    if(memcmp(pData->TransData.HeadData.SvrPointCode, "\x00\x00", 2) == 0)
    {//未指明
        memset(bFieldData, 0, sizeof(bFieldData));
        iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_TRACK2, bFieldData, sizeof(bFieldData));
        if(iFieldDataLen > 0)
        {//有磁道信息
            pData->TransData.HeadData.SvrPointCode[0] = 0x02;
        }
        else
        {
            pData->TransData.HeadData.SvrPointCode[0] = 0x01;
        }
        memset(bFieldData, 0, sizeof(bFieldData));
        iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_ENCRYPTPWD, bFieldData, sizeof(bFieldData));
        if(iFieldDataLen > 0)
        {//有密码
            pData->TransData.HeadData.SvrPointCode[1] = 0x10;
        }
        else
        {
            pData->TransData.HeadData.SvrPointCode[1] = 0x20;
        }
    }
    if(pData->TransData.HeadData.SvrPointCode[0] == 0x01)
    {//手输卡号,无磁道信息
        bHasTrack = false;
    }
    if(pData->TransData.HeadData.SvrPointCode[1] != 0x10)
    {//无密码
        bHasPin = false;
    }
    memset(bFieldData, 0, sizeof(bFieldData));
    BcdToAsc(bFieldData, pData->TransData.HeadData.SvrPointCode, 2);
    bFieldData[3] = 0;
    bFlag &= sndObj.SetValueByStr(22, (char *)bFieldData);

    //32 受理机构代码
    bFlag &= sndObj.SetValueByStr(32, pData->RcvBrchCode);
    //33 发送机构代码
    bFlag &= sndObj.SetValueByStr(33, pData->SndBrchCode);
    
    if(bHasTrack)
    {
        int nResult = EncryptTrack(bFlag, tlvObj, pData);
        if(nResult)
        {
            trace_log(ERR, "Encrypt Track failed!");
            return nResult;
        }
    }
    //系统参考号
    bFlag &= sndObj.SetValueByStr(37, pData->TransData.HeadData.SysRefNo);

    //41终端号
    bFlag &= sndObj.SetValueByStr(41, pData->TransData.HeadData.arrRTermNo);
    //42商户号
    bFlag &= sndObj.SetValueByStr(42, pData->TransData.HeadData.arrRMerchNo);
        
    if(bHasPin)
    {
        int nResult = ChangePinBlock(bFlag, tlvObj, pData);
        if(nResult)
        {
            trace_log(DBG, "ChangePinBlock return failed!");
            return nResult;
        }
    }

    //60 应用版本
    bFlag &= sndObj.SetValueByStr(60, "310");

    //62 凭证号批次号,凭证号用原来的
    memset(bTmpData, 0, sizeof(bTmpData));
    sprintf((char *)bTmpData, "%s%s", pData->TransData.HeadData.OrigLPosSeq, pData->TransData.HeadData.OrigLBatchNo);
    bFlag &= sndObj.SetValueByStr(62, (char *)bTmpData);
    
    //64MAC
    bFlag &= sndObj.SetValueByHex(64, (unsigned char*)"00000000", 8);
    
    //组包
    iBufLen = PACK_MAXLEN;
    bFlag &= sndObj.Pack(pBuffer, iBufLen);
    if(!bFlag)
    {
        trace_log(ERR, "Pack right CUPS8583 fail!");
        return RET_PACK;
    }

    //计算Mac
    bool bIsOrg = true;
    int nReturn = CalcMac(bIsOrg, iBufLen, pBuffer, pData);
    if(nReturn)
    {
        trace_log(ERR, "Calc Mac failed!");
        return nReturn;
    }

    return RET_SUCCESS;
}
コード例 #3
0
ファイル: tradedoreset.cpp プロジェクト: vagabond1132/Code
//冲正
int CTradeDoReset::DoPack(SAConnection *saConn, void * pNode,
                        unsigned char * pBuffer, unsigned & iBufLen)
{
    if(saConn == NULL || pNode == NULL || pBuffer == NULL)
    {
        trace_log(ERR, "Paramter error!");
        return RET_SYSEXP;
    }
    TRADEDATA * pData = (TRADEDATA *)pNode;

    CTLVTemplet tlvObj;
    if(1 != tlvObj.UnPackTLVData(pData->TransData.TlvDataLen, pData->TransData.TlvData))
    {
        trace_log(ERR, "UnPackTLVData fail!");
        return RET_SYSEXP;
    }

    bool bFlag = true;
    //unsigned char cFieldData[FIELD_MAXLEN]={0}, bFieldData[FIELD_MAXLEN]={0}, 
    //unsigned int iFieldDataLen = 0;
    POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType;

    if(m_unTradeOrgMap.empty())
        initTredeTypeMap();

    //冲正的时候不能隔批次
    if(strcmp(pData->BatchNo, pData->TransData.HeadData.OrigLBatchNo))
    {
        trace_log(ERR, "The original BatchNo is different with the current one");
        return RET_SYSEXP;
    }
    
    SAString sSql;
    SACommand Cmd;
    Cmd.setConnection(saConn);
    try
    {
        //trace_log(DBG, "posType = %c, m_unTradeOrgMap[posType] = %c", posType, m_unTradeOrgMap[posType]);
        sSql.Format("select FIELD2,FIELD3,FIELD4,FIELD11,FIELD14,FIELD22,FIELD32,FIELD33,FIELD35,FIELD36,FIELD41,"
            "FIELD42,FIELD48,FIELD49,FIELD60,FIELD62 from T_CHANNEL_RESETLIST where FIELD11='%s' and FIELD41='%s'"
            " and FIELD42='%s' and CRT_TYPE='%c' and CRT_BATCHNO='%s'", pData->TransData.HeadData.OrigLPosSeq,
            pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo,
            m_unTradeOrgMap[posType], pData->TransData.HeadData.OrigLBatchNo);
        Cmd.setCommandText(sSql);
        Cmd.Execute();
        if(!Cmd.FetchNext())
        {
            trace_log(ERR, "select original trade record fail[%s]!", _T(sSql));
            strcpy(pData->TransData.HeadData.RspCode, "25");
            return RET_SYSEXP;
        }
        
        //0消息类型
        bFlag &= sndObj.SetValueByStr(0, "0420");
        //2账号
        bFlag &= sndObj.SetValueByStr(2, _T(Cmd.Field("FIELD2").asString()));        
        //3处理码
        bFlag &= sndObj.SetValueByStr(3, _T(Cmd.Field("FIELD3").asString()));
        //4金额
        bFlag &= sndObj.SetValueByStr(4, _T(Cmd.Field("FIELD4").asString()));
        //11流水号:此处需要新流水号,而62域要原流水号
        bFlag &= sndObj.SetValueByStr(11, pData->VouchNo);
        //14 卡有效期
        SAString str = Cmd.Field("FIELD14").asString();
        if(str.GetLength() > 0)
        {
            bFlag &= sndObj.SetValueByStr(14, _T(str));
        }
            
        if( posType >= 0x63 && posType <= 0x66)
        {
            //22 输入方式
            bFlag &= sndObj.SetValueByStr(22, _T(Cmd.Field("FIELD22").asString()));

            //35 二磁道
            str = Cmd.Field("FIELD35").asString();
            if(str.GetLength() > 0)
            {
                bFlag &= sndObj.SetValueByStr(35, _T(str));
            }
            
            //36 三磁道
            str = Cmd.Field("FIELD36").asString();
            if(str.GetLength() > 0)
            {
                bFlag &= sndObj.SetValueByStr(36, _T(str));
            }
            
            //48 自定义域
            str = Cmd.Field("FIELD48").asString();
            if(str.GetLength() > 0)
            {
                bFlag &= sndObj.SetValueByStr(48, _T(str));
            }
            //49 货币代码
            bFlag &= sndObj.SetValueByStr(49, _T(Cmd.Field("FIELD49").asString()));
        }
            
        //32 受理机构代码
        bFlag &= sndObj.SetValueByStr(32, _T(Cmd.Field("FIELD32").asString()));
        //33 发送机构代码
        bFlag &= sndObj.SetValueByStr(33, _T(Cmd.Field("FIELD33").asString()));
        //41 终端号
        bFlag &= sndObj.SetValueByStr(41, _T(Cmd.Field("FIELD41").asString()));
        //42 商户号
        bFlag &= sndObj.SetValueByStr(42, _T(Cmd.Field("FIELD42").asString()));
        //60
        bFlag &= sndObj.SetValueByStr(60, _T(Cmd.Field("FIELD60").asString()));
        //62
        bFlag &= sndObj.SetValueByStr(62, _T(Cmd.Field("FIELD62").asString()));
    }
    catch (SAException &e)
    {
        saConn->Rollback();
        trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql));
        return -1;
    }
    catch (...)
    {
        trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql));
        return -1;
    }
    
    //64MAC
    bFlag &= sndObj.SetValueByHex(64, (unsigned char*)"00000000", 8);
    
    //组包
    iBufLen = PACK_MAXLEN;
    bFlag &= sndObj.Pack(pBuffer, iBufLen);
    if(!bFlag)
    {
        trace_log(ERR, "Pack right CUPS8583 fail!");
        return RET_PACK;
    }

    //计算Mac
    bool bIsOrg = true;
    int nReturn = CalcMac(bIsOrg, iBufLen, pBuffer, pData);
    if(nReturn)
    {
        trace_log(ERR, "Calc Mac failed!");
        return nReturn;
    }

    return RET_SUCCESS;
}