// 更新出厂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); }
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( <ime ); strftime(cCurTime, sizeof(cCurTime)-1, "%Y%m%d%H%M%S", localtime_xgd(<ime, &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; }
//冲正 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; }