/**< 跟第三方系统进行通信 */ int CTradeBase::DoSendAndRcv(unsigned char *ReqBuf, int ReqLen,unsigned char *RepBuf, int *RepLen, int TimeOut,char* errDesc) { trace_log(DBG, "SndBuf len:%d",ReqLen); trace_mem(ReqBuf, ReqLen); SocketClient client; return client.SendToHost(ReqBuf,ReqLen,RepBuf,*RepLen,g_Cfg.CupHost.cIp,g_Cfg.CupHost.iPort,40,errDesc); }
/**< 跟第三方系统进行通信 */ int CTradeBase::DoSendAndRcv(unsigned char *ReqBuf, int ReqLen,unsigned char *RepBuf, int *RepLen, int TimeOut,char* errDesc) { trace_log(DBG, "SndBuf len:%d",ReqLen); trace_mem(ReqBuf, ReqLen); #ifndef USE_LONG_CONN SocketClient client; return client.SendToHost(ReqBuf,ReqLen,RepBuf,*RepLen,g_Cfg.CupHost[0].Host,g_Cfg.CupHost[0].Port,40,errDesc); #else return 0; #endif }
/************************************************************** 函数名称: GetDataFromHsm 函数功能: 连接加密机从其获取数据 入口参数: pMsgBuffer[in/out]:发送或返回的数据中的MSG iLen[in/out]:发送或返回数据的长度 相关调用: 返 回 值: true成功, false失败 **************************************************************/ bool EnCryptComm::GetDataFromHsm(unsigned char *pMsgBuffer, unsigned & iLen) { unsigned char cmd = pMsgBuffer[0], Buffer[1024]={0}; unsigned sLen;//发送数据长度 sLen = iLen + 7; memcpy(Buffer, &sLen, 2);//LC Buffer[2]=0xF1;//INS Buffer[3]=0;//SEQ //CR默认为0 memcpy(&Buffer[6], pMsgBuffer, iLen);//MSG Buffer[sLen-1] = CalcSum(Buffer, sLen - 1);//CRC char errDesc[512]={0}; unsigned char cRecBuf[1024]={0}; int recLen=0; SocketClient client; int iErrorCode=client.SendToHost(Buffer,sLen,cRecBuf,recLen,g_Cfg.EncHost.Host, g_Cfg.EncHost.Port,20,errDesc); if(0==iErrorCode) { trace_log(DBG, "recv from enchost"); trace_mem(cRecBuf, recLen); if(cRecBuf[recLen-1] == CalcSum(cRecBuf, recLen - 1) && cRecBuf[6] == cmd && cRecBuf[8] == CMD_OK) {//校验值正确,与原命令字相同,返回码为成功 if(memcmp(pMsgBuffer+2, cRecBuf+9, LEN_MERCHNO+LEN_TERMINO)!=0)//+LEN_TERMINO {//比较商户号与终端号 trace_log(DBG, "The return data from encryptor is not match!!"); return false; } memcpy(pMsgBuffer, cRecBuf+6, recLen-7);//去掉LC,INS,SEQ,CR,CRC iLen = recLen-7; trace_log(DBG,"GetDataFromHsm->iLen=%d",iLen); return true; } else { trace_log(ERR, "GetDataFromHsm else CalcSum %d", recLen); return false ; } }else{ trace_log(ERR,errDesc); return false; } }
int CTradegetmainkey::DoTrade(SAConnection *saConn, void * pNode) { if(saConn == NULL || pNode == NULL) { trace_log(ERR, "Paramter error!"); return RET_SYSEXP; } trace_log(DBG,"-----getmainkey-----"); /********************pack********************/ TRADEDATA * pData = (TRADEDATA *)pNode; int iFieldDataLen = 0; bool bFlag = true; BYTE bFieldData[64] = {0}; BYTE bKeyData[200] = {0}; trace_log(DBG,"pack 8583"); TRADEDATA pTmpData; memcpy(&pTmpData, pData, sizeof(TRADEDATA)); pTmpData.TransData.HeadData.RTradeType = POS_GETMAINKEY; pTmpData.TransData.HeadData.nLFlowID = 0; CUPS8583 sndObj; //0消息类型 bFlag &= sndObj.SetValueByStr(0, "0820"); //41 受卡机终端标识码 bFlag &= sndObj.SetValueByStr(41, pTmpData.TransData.HeadData.arrRTermNo); //42 受卡方标识码 bFlag &= sndObj.SetValueByStr(42, pTmpData.TransData.HeadData.arrRMerchNo); //60 自定义域 memcpy(bFieldData,"00",2); strcat((char *)bFieldData,(char *)pData->BatchNo); strcat((char *)bFieldData,(char *)"102"); bFlag &= sndObj.SetValueByStr(60, (char *)bFieldData); //62域 秘钥信息 /*BYTE fieldData62[120]={0}; memset(fieldData62,20,15);//ip地址 strcat((char *)fieldData62,"00000000000000000000");//sim卡号 strcat((char *)fieldData62,"0000.00.00"); strcat((char *)fieldData62,"0000.00.00"); strcat((char *)fieldData62,"460"); strcat((char *)fieldData62,"00"); strcat((char *)fieldData62,"0000"); strcat((char *)fieldData62,"0000"); strcat((char *)fieldData62,"00000000000000000000000000000000");*/ /*rsa_init(&rsa,RSA_PKCS_V15, 0 ); rsa_gen_key(&rsa,NULL,NULL,1024,65537); rsa_public(&rsa,KLK,bFieldData);*/ bFlag &=sndObj.SetValueByHex(62,bFieldData,100); /**< 插入交易记录 */ if(COperateDB::MyBeforeInsertDB(saConn, &pTmpData)) { trace_log(ERR, "MyBeforeInsertDB(getmainkey) return failed!"); return RET_SYSEXP; } /**< 打包 */ unsigned char SndBuf[PACK_MAXLEN]={0}; unsigned iSndLen = sizeof(SndBuf); bFlag &= sndObj.Pack(SndBuf, iSndLen); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } SetMsgHead(SndBuf, iSndLen, pData);/**< 设置报文头*/ /********************communication********************/ unsigned char RcvBuf[PACK_MAXLEN]={0}; int iRcvLen = sizeof(RcvBuf); trace_log(DBG,"getmainkey SndBuf len:",iSndLen); trace_mem(SndBuf,iSndLen); char errDesc[512]={0}; SocketClient client; if(0 != client.SendToHost(SndBuf,(int)iSndLen,RcvBuf,iRcvLen,g_Cfg.CupHost[0].Host,(int)g_Cfg.CupHost[0].Port,60000,errDesc)) { trace_log(ERR, errDesc); return RET_SYSEXP; } /********************unpack********************/ trace_log(DBG,"RcvBuf len:",iRcvLen); trace_mem(RcvBuf,iRcvLen); CUPS8583 rcvObj; if(1 != rcvObj.UnPack(RcvBuf, iRcvLen)) { trace_log(ERR, "unpack right CUPS8583 error!"); return RET_UNPACK; } iFieldDataLen = rcvObj.GetValueByStr(39, pTmpData.TransData.HeadData.RspCode, sizeof(pTmpData.TransData.HeadData.RspCode)); if(iFieldDataLen != 2) { trace_log(ERR, "GetValueByStr fail!(Field39)"); return RET_MSGERR; } if(memcmp(pTmpData.TransData.HeadData.RspCode,"00",2)==0) { iFieldDataLen = rcvObj.GetValueByStr(62, (char *)bKeyData,sizeof(bKeyData)); if(bSoftEncrypt) { /**< 软加密 */ trace_log(DBG, "filed62 len is %d, content is:",iFieldDataLen); trace_mem(bKeyData, iFieldDataLen); trace_log(DBG,"bKek"); trace_mem(bKek,16); int nResult=GetMainCrypt(saConn,bKeyData,bKek,iFieldDataLen,&pTmpData); /*拷贝密钥否则签到是密钥无法使用*/ memcpy(pData->bMacKey,pTmpData.bMacKey,32); memcpy(pData->bPinKey,pTmpData.bPinKey,32); memcpy(pData->bTdkKey,pTmpData.bTdkKey,32); memcpy(pData->bMainKey,pTmpData.bMainKey,32); if(nResult) { trace_log(ERR, "check value failed!nResult = %d", nResult); return RET_MSGERR; } } else { if(!cryptComm.SetMainKey(pData->TransData.HeadData.arrRMerchNo,pData->TransData.HeadData.arrRTermNo,bKeyData,iFieldDataLen)) { trace_log(ERR, "Call TranslatePin fail!"); return RET_SYSEXP; } } if(0 != COperateDB::UpdateMainKey(saConn, &pTmpData)) return RET_SYSEXP; }else{ trace_log(ERR, "getmainkey failed!"); return RET_SYSEXP; } if(COperateDB::MyAfterUpdateDB(saConn, &pTmpData, (char)ST_SUCCESS, (char *)"00",(char *)"成功")) { trace_log(ERR, "MyAfterUpdateDB (getmainkey) return failed!"); return RET_SYSEXP; } trace_log(DBG,"getmainkey success"); return RET_SUCCESS; }
int CTradeLogin::DoTrade(SAConnection *saConn, void * pNode) { if(saConn == NULL || pNode == NULL) { trace_log(ERR, "Paramter error!"); return RET_SYSEXP; } trace_log(DBG,"-----Login-----"); unsigned int g_nChnBatchNo; unsigned int g_nChnVouchNo; TRADEDATA * pData = (TRADEDATA *)pNode; bool bIsRelogin = false; //重签到标识 if(pData->bIsLogin) bIsRelogin = true; /**< 获取流水号批次号及是否需要签到 */ pthread_mutex_lock(&mutex_load); if(COperateDB::GetChannelInfo(saConn, pData)) { pthread_mutex_unlock(&mutex_load); return RET_SYSEXP; } /**<处理流水号 */ g_nChnVouchNo=atoi(pData->VouchNo); g_nChnBatchNo=atoi(pData->BatchNo); if(g_nChnVouchNo < 999999 && g_nChnVouchNo > 0) { g_nChnVouchNo++; }else{ g_nChnVouchNo = 1; if(g_nChnBatchNo<999999) { g_nChnBatchNo++; }else g_nChnBatchNo=1; } sprintf(pData->BatchNo, "%06d", g_nChnBatchNo); sprintf(pData->VouchNo, "%06d", g_nChnVouchNo); /**< 回存流水号和批次号 */ if(0 != COperateDB::SaveChannelInfo(saConn, pData)) { trace_log(ERR, "DoGetVouchNo fail."); pthread_mutex_unlock(&mutex_load); return RET_SYSEXP; } trace_log(DBG,"BatchNo:%s-----VouchNo:%s",pData->BatchNo,pData->VouchNo); pthread_mutex_unlock(&mutex_load); if(!pData->bIsLogin) return 0; //不需要签到时直接返回 int iFieldDataLen = 0; bool bFlag = true; BYTE bFieldData[64] = {0}; BYTE bKeyData[200] = {0}; BYTE bMainKey[16+1] = {0}; TRADEDATA pTmpData; memcpy(&pTmpData, pData, sizeof(TRADEDATA)); pTmpData.TransData.HeadData.RTradeType = POS_SIGN; CUPS8583 sndObj; //0消息类型 bFlag &= sndObj.SetValueByStr(0, "0800"); //流水号 bFlag &= sndObj.SetValueByStr(11, pData->VouchNo); //41 受卡机终端标识码 bFlag &= sndObj.SetValueByStr(41, pTmpData.TransData.HeadData.arrRTermNo); //42 受卡方标识码 bFlag &= sndObj.SetValueByStr(42, pTmpData.TransData.HeadData.arrRMerchNo); //60 自定义域 memcpy(bFieldData,"00",2); strcat((char *)bFieldData,(char *)pData->BatchNo); strcat((char *)bFieldData,(char *)"003"); bFlag &= sndObj.SetValueByStr(60, (char *)bFieldData); //63 自定义域 bFlag &= sndObj.SetValueByStr(63, (char *)"001"); /**< 打包 */ unsigned char SndBuf[PACK_MAXLEN]={0}; unsigned iSndLen = sizeof(SndBuf); bFlag &= sndObj.Pack(SndBuf, iSndLen); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } SetMsgHead(SndBuf, iSndLen, pData);/**< 设置报文头*/ /********************communication********************/ unsigned char RcvBuf[PACK_MAXLEN]={0}; int iRcvLen = sizeof(RcvBuf); trace_log(DBG,"login SndBuf len:%d",iSndLen); trace_mem(SndBuf,iSndLen); char errDesc[512]={0}; SocketClient client; trace_log(DBG,"SendToHost:%s:%d",g_Cfg.CupHost.cIp, g_Cfg.CupHost.iPort); if(0 != client.SendToHost(SndBuf,(int)iSndLen,RcvBuf,iRcvLen,g_Cfg.CupHost.cIp,(int)g_Cfg.CupHost.iPort,60000,errDesc)) { trace_log(ERR, errDesc); return RET_SYSEXP; } /********************unpack********************/ trace_log(DBG,"RcvBuf len:",iRcvLen); trace_mem(RcvBuf,iRcvLen); CUPS8583 rcvObj; if(1 != rcvObj.UnPack(RcvBuf, iRcvLen)) { trace_log(ERR, "unpack right CUPS8583 error!"); return RET_UNPACK; } memset(bFieldData, 0, sizeof(bFieldData)); iFieldDataLen = rcvObj.GetValueByStr(13, (char*)bFieldData, sizeof(bFieldData)); if(iFieldDataLen <= 0) { trace_log(ERR, "GetValueByStr failed!(Field13)"); return RET_MSGERR; } iFieldDataLen = rcvObj.GetValueByStr(39, pTmpData.TransData.HeadData.RspCode, sizeof(pTmpData.TransData.HeadData.RspCode)); if(iFieldDataLen != 2) { trace_log(ERR, "GetValueByStr fail!(Field39)"); return RET_MSGERR; } if(memcmp(pTmpData.TransData.HeadData.RspCode,"00",2)==0) { /**< 快钱下发的流水号和批次号 */ iFieldDataLen = rcvObj.GetValueByHex(62, bKeyData, sizeof(bKeyData)); if(iFieldDataLen >0) { if(bSoftEncrypt) { /**< 软加密 */ trace_log(DBG, "filed62 len is %d, content is:",iFieldDataLen); trace_mem(bKeyData, iFieldDataLen); memset((char *)bMainKey,0x00,sizeof((char *)bMainKey)); if(COperateDB::GetMainKey(saConn,pData)) { trace_log(ERR, "GetMainKey() fail."); } Ccommon::Asc2Bcd((const char*)pData->bMainKey, (unsigned char *)bMainKey, 32, NL); int nResult=GetWorkCrypt(saConn,bKeyData,bMainKey,iFieldDataLen,&pTmpData); /*拷贝密钥否则签到是密钥无法使用*/ memcpy(pData->bMacKey,pTmpData.bMacKey,32); memcpy(pData->bPinKey,pTmpData.bPinKey,32); if(nResult) { trace_log(ERR, "check value failed!nResult = %d", nResult); return RET_MSGERR; } if(COperateDB::UpdateworkKey(saConn,bKeyData,&pTmpData)) { trace_log(ERR, "UpdateworkKey() fail."); return RET_RELOGIN; } } else { /**< 硬件加密 */ trace_log(DBG,"cWorkKeyLen(Field62_DataLen)= %d", iFieldDataLen); trace_mem((unsigned char *)bKeyData, iFieldDataLen); if(!cryptComm.SetWorkKey(pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo,/*pData->RcvBrchCode,pData->RcvBrchCode,*/(BYTE*) bKeyData, iFieldDataLen, 2)) { trace_log(ERR,"Set bank work key fail!"); return RET_RELOGIN; } } }else{ trace_log(ERR, "Get security key failed!"); return RET_RELOGIN; } //获取批次 iFieldDataLen = rcvObj.GetValueByStr(60, (char *)bFieldData, sizeof(bFieldData)); if(iFieldDataLen > 0) { memcpy(pData->BatchNo,bFieldData+2,6); memcpy(pTmpData.BatchNo,pData->BatchNo,6); } //获取签到日期 iFieldDataLen = rcvObj.GetValueByStr(13, (char *)bFieldData, sizeof(bFieldData)); if(0 != COperateDB::UpdateTermalState(saConn, bFieldData, &pTmpData)) return RET_SYSEXP; }else{ trace_log(ERR, "login in failed!"); return RET_SYSEXP; } trace_log(DBG,"sign in success"); return RET_SUCCESS; }