/***************************************************************************** ** Descriptions: 存储内外卡标志 ** Parameters: SDK_8583_ST8583 *pstBag8583 ** Returned value: ** Created By: huacong 2016.03.17 ** Remarks: *****************************************************************************/ s32 WriteCardInOrOut(SDK_8583_ST8583 *pstSendBag, SDK_8583_ST8583 *pstRevBag) { u8 temp[512]; u8 bIsForeignCard[2] = { 0 }; memset(temp, 0, sizeof(temp)); if (GetFieldData(pstRevBag, 63, temp, sizeof(temp)) > 0) { if (((!memcmp(temp, "CUP", 3)) || //中国银联 (!memcmp(temp, "cup", 3)) || (!memcmp(temp, "000", 3)) || (!memcmp(temp, "\x00\x00\x00", 3)))) { bIsForeignCard[0] = '0'; } else { bIsForeignCard[0] = '1'; } } else if (GetFieldData(pstSendBag, 63, temp, sizeof(temp)) > 0) { if (((!memcmp(temp, "CUP", 3)) || //中国银联 (!memcmp(temp, "cup", 3)) || (!memcmp(temp, "000", 3)) || (!memcmp(temp, "\x00\x00\x00", 3)))) { bIsForeignCard[0] = '0'; } else { bIsForeignCard[0] = '1'; } } // Log("wangb","WriteCardInOrOut is %s ",bIsForeignCard); if (ProviderSetTagValue(TAG_TRADE_CARDINOUT, bIsForeignCard, 1) != 1) { return SDK_ERR; } // Log("wangb","WriteCardInOrOut is %s ",bIsForeignCard); return SDK_OK; }
/***************************************************************************** ** Descriptions: 读取冲正包 ** Parameters: SDK_8583_ST8583 *pstReversalBag ** Returned value: ** Created By: huacong 2016.03.10 ** Remarks: *****************************************************************************/ s32 ReadReversalBag(SDK_8583_ST8583 *pstReversalBag) { s32 ret = SDK_ESC, len; u8 temp[SDK_8583_BAGMAXLEN]; Log("zbq", "jump into ReadReversalBag"); memset(temp, 0, sizeof(temp)); if ((len = ProviderGetTagValue(TAG_TRADE_REVERSALBAG, temp)) > 0) { memcpy(pstReversalBag->ucBagData, temp, len); pstReversalBag->nBagLen = len; if (ParseField8583(pstReversalBag) < SDK_EQU) { return SDK_ERR; } else { //xiaox 有55域则写入 emvtag 缓存链表 if (sdk8583IsDomainExist(pstReversalBag, 55)) { if (gstEmvTempTagList.ItemCount > 0) { FreeTagList(&gstEmvTempTagList); } memset(temp, 0, sizeof(temp)); InitTagList(&gstEmvTempTagList); len = GetFieldData(pstReversalBag, 55, temp, sizeof(temp)); BuildTagListOneLevel(temp, len, &gstEmvTempTagList); TraceHex("xiaox","55field",temp,len); } } } else { return SDK_ERR; } }
/***************************************************************************** ** Descriptions: 读取发送包 ** Parameters: SDK_8583_ST8583 *pstSendBag ** Returned value: ** Created By: huacong 2016.03.04 修改 wangb 2016 0315 ** Remarks: *****************************************************************************/ s32 ReadSendBag(SDK_8583_ST8583 *pstSendBag) { u8 temp[2048]; s32 len; memset(temp, 0, sizeof(temp)); if (pstSendBag == NULL) { return SDK_ERR; } if ((len = ProviderGetTagValue(TAG_8583_SENDBAG, temp)) > 2) { memcpy(pstSendBag->ucBagData, temp + 2, len - 2); pstSendBag->nBagLen = len - 2; if (ParseField8583(pstSendBag) < SDK_EQU) { return SDK_ERR; } else { //xiaox 有55域则写入 emvtag 缓存链表 if (sdk8583IsDomainExist(pstSendBag, 55)) { if (gstEmvTempTagList.ItemCount > 0) { FreeTagList(&gstEmvTempTagList); } memset(temp, 0, sizeof(temp)); InitTagList(&gstEmvTempTagList); len = GetFieldData(pstSendBag, 55, temp, sizeof(temp)); BuildTagListOneLevel(temp, len, &gstEmvTempTagList); TraceHex("xiaox","55field",temp,len); } } } else { return SDK_ERR; } return SDK_OK; }
TEST_F(CoordinateTransformableDataObject_test, ApplyCoordinateSystemFromFieldData) { auto dataSet = genPolyDataSet(); const auto coordsSpec = ReferencedCoordinateSystemSpecification( CoordinateSystemType::geographic, "testGeoSystem", "testMetricSystem", "", { 100, 200 }, {0.2, 0.3}); coordsSpec.writeToFieldData(*dataSet->GetFieldData()); PolyDataObject polyData("poly", *dataSet); ASSERT_EQ(coordsSpec, polyData.coordinateSystem()); }
TEST_F(CoordinateTransformableDataObject_test, coordsPassToProcessedFieldData) { auto dataObject = genPolyData(); const auto coordsSpec = ReferencedCoordinateSystemSpecification( CoordinateSystemType::geographic, "testGeoSystem", "testMetricSystem", "", { 100, 200 }, { 0.2, 0.3 }); dataObject->specifyCoordinateSystem(coordsSpec); auto processedDataSet = dataObject->processedDataSet(); const auto passedSpec = ReferencedCoordinateSystemSpecification::fromFieldData(*processedDataSet->GetFieldData()); ASSERT_EQ(coordsSpec, passedSpec); }
bool FeedFilter::Term::Match(FeedItemInfo* pFeedItemInfo) { const char* szStrValue = NULL; long long iIntValue = 0; if (!GetFieldData(m_szField, pFeedItemInfo, &szStrValue, &iIntValue)) { return false; } bool bMatch = MatchValue(szStrValue, iIntValue); if (m_bPositive != bMatch) { return false; } return true; }
/***************************************************************************** 函 数 名 : Trace8583Bag 功能描述 : 显示8583报文域信息 输入参数 : u8 *asTitle SDK_8583_ST8583 *pstBag8583 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年12月25日 作 者 : zj 修改内容 : 新生成函数 *****************************************************************************/ void Trace8583Bag(u8 *asTitle, SDK_8583_ST8583 *pstBag8583) { #ifndef XGD_SDK_DEBUG return; #else u32 i; u8 asBuf[STOREBAGLEN]; u8 asBuf1[STOREBAGLEN * 2]; s32 siLen = 0; for (i = 0; i <= 64; i++) { if (sdk8583IsDomainExist(pstBag8583, i)) { memset(asBuf, 0, sizeof(asBuf)); siLen = 0; siLen = GetFieldData(pstBag8583, i, asBuf, sizeof(asBuf)); if (siLen > 0) { if (sdkIsVisibleStr(asBuf, siLen)) { // Trace(asTitle, "[%03u][%03d][%s]\r\n", i, siLen, asBuf); } else { //可能是不是ASCII内容,转换为HEX显示,最后标注*号区分 memset(asBuf1, 0, sizeof(asBuf1)); sdkBcdToAsc(asBuf1, asBuf, siLen); // Trace(asTitle, "[%03u][%03d][%s]*\r\n", i, siLen, asBuf1); } } } } #endif }
/***************************************************************************** 函 数 名 : EncryptMagData 功能描述 : 磁道数据加密 输入参数 : u8 *pheDataBuf s32 *iDataLen 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年12月26日 作 者 : wuzhonglin 修改内容 : 新生成函数 *****************************************************************************/ s32 EncryptMagData(struct _TradeData *pstTradeData, SDK_8583_ST8583 *pstSendBag) { u8 tmp[256], buf[128], outbuf[128] = { 0 }; s32 iLen, pOutLen; s32 slt = SDK_OK; u8 *pBuf; bool bIsEncryp = false; // && pstTradeData->stKeySystemParam.bIsMk3Des // iLen = GetFieldData(pstSendBag, 35, tmp, sizeof(tmp)); // && pstTradeData->stKeySystemParam.bIsMk3Des if (gstAppSetting.stKeySystemParam.bIsSupportTdk && (sdk8583IsDomainExist(pstSendBag, 35) || sdk8583IsDomainExist(pstSendBag, 36))) { memset(tmp, 0, sizeof(tmp)); iLen = GetFieldData(pstSendBag, 35, tmp, sizeof(tmp)); Log("wangb", "Field35_1=%s", tmp); if (iLen > 16) { // sdkAscToBcd(buf, tmp, iLen); // pBuf = &buf[(iLen + 1) / 2 - 9]; //加密 // slt = sdkPEDWkDes(pstTradeData->stKeySystemParam.uiTdkIndex, SDK_PED_DES_TRIPLE, SDK_PED_ENCRYPT, pBuf, pBuf); slt = ProviderTrackDataEncrypt(tmp, outbuf, &pOutLen); //Fixme if (slt != SDK_OK) { return SDK_ERR; } // sdkBcdToAsc(tmp, outbuf, (pOutLen + 1) / 2); sdkBcdToAsc(tmp, outbuf, pOutLen); Log("wangb", "Field35_2 %s", tmp); sdk8583ClrField(pstSendBag, 35); SetFieldData(pstSendBag, 35, tmp, iLen); bIsEncryp = true; } memset(tmp, 0, sizeof(tmp)); memset(outbuf, 0, sizeof(outbuf)); iLen = GetFieldData(pstSendBag, 36, tmp, sizeof(tmp)); if (iLen > 16) { // // sdkAscToBcd(buf, tmp, iLen); // pBuf = &buf[(iLen + 1) / 2 - 9]; //加密 // slt = sdkPEDWkDes(pstTradeData->stKeySystemParam.uiTdkIndex, SDK_PED_DES_TRIPLE, SDK_PED_ENCRYPT, pBuf, pBuf); slt = ProviderTrackDataEncrypt(tmp, outbuf, &pOutLen); if (slt != SDK_OK) { return SDK_ERR; } // sdkBcdToAsc(tmp, buf, (iLen + 1) / 2); sdkBcdToAsc(tmp, outbuf, pOutLen); sdk8583ClrField(pstSendBag, 36); SetFieldData(pstSendBag, 36, tmp, iLen); bIsEncryp = true; } } if (bIsEncryp) { //重新设置53域TRACK-ENCRYPTION-USED iLen = 0; memset(tmp, 0, sizeof(tmp)); iLen = GetFieldData(pstSendBag, 53, tmp, sizeof(tmp)); if (iLen >= 3) { tmp[2] = '1'; sdk8583ClrField(pstSendBag, 53); SetFieldData(pstSendBag, 53, tmp, iLen); } else { strcpy(tmp, "001"); if (gstAppSetting.stKeySystemParam.bIsMk3Des) // 3des { tmp[1] = '6'; } SetFieldData(pstSendBag, 53, tmp, strlen(tmp)); } } Log("wangb", "pucMacBuf3 is %s", tmp); return SDK_OK; }
/***************************************************************************** ** Descriptions: 效验接收包 ** Parameters: void ** Returned value: ** Created By: lilin2012.08.06 ** Remarks: ***************************************************+**************************/ s32 CheckRecBag(SDK_8583_ST8583 *pstSendBag, SDK_8583_ST8583 *pstRevBag) { //SDK_PED_DES_TYPE type; u8 ucMacBuf[32]; u8 sendbuf[64] = { 0 }; u8 proccode[6] = { 0 }; s32 slen; s32 rlen; u8 revbuf[64] = { 0 }; u8 res[3] = { 0 }; s32 rlt; u8 i; u8 num = 0; struct _Field60 stfield60; struct _TradeData *stTradeData = &gstTradeData; #ifdef ELECSIGN u8 maxCheckNum = 6; #endif u8 he_checkdata[6] = { SDK_8583_FIELD_MSG, //消息类型 3, //交易处理码 11, //流水号 41, //终端号 42, //商户号 4, //交易金额 }; //获取处理吗 Log("wangb", "CheckRecBag start"); if (sdk8583IsDomainExist(pstSendBag, 3)) { GetFieldData(pstSendBag, 3, proccode, 6); } memset(sendbuf, 0, sizeof(sendbuf)); rlt = GetFieldData(pstSendBag, SDK_8583_FIELD_MSG, sendbuf, 4); //获取消息类型 if (rlt < 0) { Log("CheckRecBag", "取RECV0错误"); return ERR_RECZERO; } else { if (memcmp(sendbuf, "05", 2)) //结算报文没有39域 { memset(res, 0, sizeof(res)); rlt = GetFieldData(pstRevBag, 39, res, 3); if (rlt < 0) { Log("CheckRecBag", "取RECV39错误\r\n"); return ERR_RECZERO; } else { ProviderSetTagValue(TAG_8583_BKRESULT, res, rlt); } } } //是否缺失64域 if (sdk8583IsDomainExist(pstSendBag, 64)) //先判断发送包是否有64 { if (strcmp(res, "00") == 0) //39域返回正确 { if (!sdk8583IsDomainExist(pstRevBag, 64)) //判断接收64域 { rlt = ERR_MISSMAC; return rlt; } } } //判断64域是否正确 if (sdk8583IsDomainExist(pstRevBag, 64)) { rlt = GetMacData(stTradeData, pstRevBag, ucMacBuf); Log("wangb", "ucMacBuf64 %s", ucMacBuf); if (rlt != SDK_OK) { Log("CheckRecBag", "ECB算法错误"); return ERR_CALCMAC; } memset(revbuf, 0, sizeof(revbuf)); rlt = GetFieldData(pstRevBag, 64, revbuf, 8); Log("wangb", "revbuf64 %s", revbuf); if (rlt < 0) { Log("CheckRecBag", "缺少64域"); return ERR_RECZERO; } // TraceHex("CheckRecBag", "cal=", ucMacBuf, 8); // TraceHex("CheckRecBag", "mac=", revbuf, 8); if (memcmp(ucMacBuf, revbuf, 8)) { Log("CheckRecBag", "MAC效验错误"); rlt = ERR_CALCMAC; return rlt; } } u8 gElecSignIsSendingEsTrade = false; //本次交易为电子签名上送交易(用于解包8583不校验4域--打包8583) #ifdef ELECSIGN if (gElecSignIsSendingEsTrade) { maxCheckNum = 5; } else { maxCheckNum = 6; } for (i = 0; i < maxCheckNum; i++) #else for (i = 0; i < 6; i++) #endif { num = he_checkdata[i]; if (sdk8583IsDomainExist(pstRevBag, num) && sdk8583IsDomainExist(pstSendBag, num)) { memset(revbuf, 0, sizeof(revbuf)); rlen = GetFieldData(pstRevBag, num, revbuf, 64); if (rlen < 0) { Log("CheckRecBag", "取RECV%d错误\r\n", num); return ERR_RECZERO; } memset(sendbuf, 0, sizeof(sendbuf)); slen = GetFieldData(pstSendBag, num, sendbuf, 64); if (slen < 0) { Log("CheckRecBag", "取SEND%d错误\r\n", num); return ERR_RECZERO; } Log("wangb", "sendbuf is %s", sendbuf); Log("wangb", "revbuf is %s", revbuf); switch (num) { case SDK_8583_FIELD_MSG: //判断消息类型 if ((memcmp(sendbuf, revbuf, 2)) || (revbuf[2] != (sendbuf[2] + 1))) { rlt = ERR_MSGTYPE; return rlt; } break; case 3: //比较处理码(银行卡检测中心说一定要比较第1个字节交易类型) if (memcmp(sendbuf, revbuf, 2)) { rlt = ERR_PROCESSCODE; return rlt; } break; case 11: //比较POS流水号 if (strcmp(sendbuf, revbuf)) { rlt = ERR_VOUCHERNO; return rlt; } break; case 41: //比较终端号 if (strcmp(sendbuf, revbuf)) { rlt = ERR_TERMINALNO; return rlt; } break; case 42: //比较商户号 if (strcmp(sendbuf, revbuf)) { rlt = ERR_MERCHANTNO; return rlt; } break; case 4: //比较交易金额 if (strcmp(sendbuf, revbuf)) { Log("CheckRecBag", "%s %s\r\n", sendbuf, revbuf); memset(&stfield60, 0, sizeof(stfield60)); if (ParseField60(&stfield60)) { if (strcmp(res, "10") || stfield60.ucPortion != '1') //不为部分扣款 { rlt = ERR_TRADEAMOUNT; return rlt; } } } break; default: break; } } else { if (num == 41) { rlt = ERR_TERMINALNO; return rlt; } if (num == 42) { rlt = ERR_MERCHANTNO; return rlt; } } } //响应码处理 memset(sendbuf, 0, sizeof(sendbuf)); rlt = GetFieldData(pstSendBag, SDK_8583_FIELD_MSG, sendbuf, 4); //获取消息类型码 if (rlt < 0) { Log("CheckRecBag", "取RECV0错误"); return ERR_RECZERO; } if (memcmp(sendbuf, "04", 2) == 0) //冲正包判断 { if (memcmp(res, "00", 2) && memcmp(res, "12", 2) && memcmp(res, "25", 2)) { return ERR_RESPONSE; } } //磁条卡现金充值确认包判断 else if (memcmp(sendbuf, "0220", 4) == 0 && memcmp(proccode, "63", 2) == 0) { if (memcmp(res, "00", 2) && memcmp(res, "A6", 2)) { return ERR_RESPONSE; } } else { if (memcmp(sendbuf, "05", 2)) //结算报文没有39域 { if (!CheckResponseCode(res)) //响应码错误 { Log("CheckRecBag", "响应码error %s", res); // Log("CheckRecBag", "FunCode", stfield60.asFunCode, 2); //磁条卡现金充值回98当做超时 memset(&stfield60, 0, sizeof(struct _Field60)); ParseField60(&stfield60); //磁条卡现金充值包判断 if (memcmp(sendbuf, "0200", 4) == 0 && memcmp(proccode, "63", 2) == 0 && memcmp(stfield60.asFunCode, "48", 2) == 0) { if (memcmp(res, "98", 2) == 0) { //lilin 20140214磁条卡现金充值不显示交易失败要进行磁条卡现金充值确认 // GetStrResponseError(dispbuf); // sdkDispPromptBox(false, 500, dispbuf); return SDK_TIME_OUT; } } /*=======BEGIN: lilin 2015.01.12 15:31 modify===========*/ if ((memcmp(sendbuf, "0200", 4) == 0) && (memcmp(proccode, "00", 2) == 0) && (memcmp(stfield60.asFunCode, "22", 2) == 0)) //消费 { if ((strcmp(res, "10") == 0) && (stfield60.ucPortion != '1')) //如果不是部分扣费还返回10则需要冲正 { return ERR_NEEDREVERSAL; } if ((strcmp(res, "10") == 0) && (stfield60.ucPortion == '1')) //部分扣款 { return ERR_RESPONSE10; } } /*====================== END======================== */ return ERR_RESPONSE; } } } //都正确处理更新时间和日期 if (sdk8583IsDomainExist(pstRevBag, 12)) //更新交易时间 { memset(revbuf, 0, sizeof(revbuf)); rlt = GetFieldData(pstRevBag, 12, revbuf, 64); /* if (rlt) { sdkAscToBcd(&gstSys.ucHour, &revbuf[0], 2); sdkAscToBcd(&gstSys.ucMinute, &revbuf[2], 2); sdkAscToBcd(&gstSys.ucSecond, &revbuf[4], 2); } */ } if (sdk8583IsDomainExist(pstRevBag, 13)) //更新交易日期 { memset(revbuf, 0, sizeof(revbuf)); rlt = GetFieldData(pstRevBag, 13, revbuf, 64); /* if (rlt) { sdkAscToBcd(&gstSys.ucMonth, &revbuf[0], 2); sdkAscToBcd(&gstSys.ucDay, &revbuf[2], 2); } */ } // Trace("CheckRecBag", "OK\r\n"); Log("wangb", "CheckRecBag OK"); return SDK_OK; }
bool FeedFilter::Term::Compile(char* szToken) { debug("Token: %s", szToken); char ch = szToken[0]; m_bPositive = ch != '-'; if (ch == '-' || ch == '+') { szToken++; ch = szToken[0]; } char ch2= szToken[1]; if ((ch == '(' || ch == ')' || ch == '|') && (ch2 == ' ' || ch2 == '\0')) { switch (ch) { case '(': m_eCommand = fcOpeningBrace; return true; case ')': m_eCommand = fcClosingBrace; return true; case '|': m_eCommand = fcOrOperator; return true; } } char *szField = NULL; m_eCommand = fcText; char* szColon = NULL; if (ch != '@' && ch != '$' && ch != '<' && ch != '>' && ch != '=') { szColon = strchr(szToken, ':'); } if (szColon) { szField = szToken; szColon[0] = '\0'; szToken = szColon + 1; ch = szToken[0]; } if (ch == '\0') { return false; } ch2= szToken[1]; if (ch == '@') { m_eCommand = fcText; szToken++; } else if (ch == '$') { m_eCommand = fcRegex; szToken++; } else if (ch == '=') { m_eCommand = fcEqual; szToken++; } else if (ch == '<' && ch2 == '=') { m_eCommand = fcLessEqual; szToken += 2; } else if (ch == '>' && ch2 == '=') { m_eCommand = fcGreaterEqual; szToken += 2; } else if (ch == '<') { m_eCommand = fcLess; szToken++; } else if (ch == '>') { m_eCommand = fcGreater; szToken++; } debug("%s, Field: %s, Command: %i, Param: %s", (m_bPositive ? "Positive" : "Negative"), szField, m_eCommand, szToken); const char* szStrValue; long long iIntValue; if (!GetFieldData(szField, NULL, &szStrValue, &iIntValue)) { return false; } if (szField && !ParseParam(szField, szToken)) { return false; } m_szField = szField ? strdup(szField) : NULL; m_szParam = strdup(szToken); return true; }