コード例 #1
0
ファイル: tradebase.cpp プロジェクト: vagabond1132/Code
/**< 跟第三方系统进行通信 */
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);
}
コード例 #2
0
ファイル: tradebase.cpp プロジェクト: vagabond1132/Code
/**< 跟第三方系统进行通信 */
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
}
コード例 #3
0
ファイル: encryptcomm.cpp プロジェクト: vagabond1132/Code
/**************************************************************
函数名称: 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;
    }
}
コード例 #4
0
ファイル: tradegetmainkey.cpp プロジェクト: vagabond1132/Code
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;
}
コード例 #5
0
ファイル: tradelogin.cpp プロジェクト: vagabond1132/Code
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;
}