PBOC代码回顾(1)(10)

2020-05-05 13:54

}

ucErrFlag = ICC_ERR_GetICPKInfo -2; goto END_Execute;

usTempLen = 1+10+2+3+1+1+1+1+m_TerminalParams.usIssuerPKLen-42; usHashResultIndex = usTempLen +1;

memcpy(ucTemp,ucICInfo+1,usTempLen); if (tlvICPKRemainder.nLength != 0) { memcpy(ucTemp+usTempLen,tlvICPKRemainder.pValue,tlvICPKRemainder.nLength); usTempLen += tlvICPKRemainder.nLength; }

memcpy(ucTemp+usTempLen,tlvICPKExponent.pValue,tlvICPKExponent.nLength); usTempLen += tlvICPKExponent.nLength; if (pSADList->GetCount() != 0) { GetTLVListData(pSADList,ucSADData,&usSADDataLen); memcpy(ucTemp+usTempLen,ucSADData,usSADDataLen); usTempLen += usSADDataLen; }

if (tlvSDATagList.nLength !=0) { if ((tlvSDATagList.nLength != 1) || (tlvSDATagList.pValue[0] != TAG_AIP)) { ucErrFlag = ICC_ERR_GetICPKInfo -3; goto END_Execute; } else { if (ICC_SUCCESS != GetEntityValue(TAG_AIP,&tlvAIP)) { ucErrFlag = ICC_ERR_TLVDATA; goto END_Execute; } memcpy(ucTemp +usTempLen,tlvAIP.pValue,tlvAIP.nLength); usTempLen += tlvAIP.nLength; } }

SHA1_160.SHA1(ucTemp,usTempLen,ucHashResult);

if (0 != memcmp(ucHashResult,ucICInfo+usHashResultIndex,20)) { ucErrFlag = ICC_ERR_GetICPKInfo -4; goto END_Execute; }

memcpy(ucICPAN,ucICInfo+2,10);

Formater.bcdtostr((char*)ucICPAN,10,(char*)ucHexICPAN);

Formater.bcdtostr((char*)tlvPAN.pValue,tlvPAN.nLength,(char*)ucHexPAN); for (i = 0; i < 20; i++) { if (ucHexICPAN[i] == 'F')

break; } if (0 != memcmp(ucHexPAN,ucHexPAN,i)) { ucErrFlag = ICC_ERR_GetICPKInfo -5; goto END_Execute; } month = Formater.BCDToInt(ucICInfo[12]); year = Formater.BCDToInt(ucICInfo[13]); if(year < 50) year += 2000; else year += 1900; GetLocalTime(&sysTime); if ((year < sysTime.wYear) || ((year == sysTime.wYear) && (month < sysTime.wMonth)) ) { ucErrFlag = ICC_ERR_GetICPKInfo -6; goto END_Execute; } //获取IC卡公钥模 ZeroMemory(ucICPK,248); *usICPKLen = m_TerminalParams.usIssuerPKLen-42; memcpy(ucICPK,ucICInfo+1+1+10+2+3+1+1+1+1,*usICPKLen); for (i = 0; i < *usICPKLen; i++) { if (ucICPK[i] == 0xBB) break; } if (i < *usICPKLen) *usICPKLen = i; if (tlvICPKRemainder.nLength != 0) { memcpy(ucICPK+*usICPKLen,tlvICPKRemainder.pValue,tlvICPKRemainder.nLength); *usICPKLen += tlvICPKRemainder.nLength; } m_TerminalParams.usICPKLen = *usICPKLen; memcpy(m_TerminalParams.ucICPK,ucICPK,*usICPKLen);

END_Execute: if (ucErrFlag != ICC_SUCCESS) { strLog.Format(\ Log.WTrace(strLog); return ICC_ERR_VERIFYFAILED; } return ICC_SUCCESS; }

//看DF名称与AID的匹配程度

int CICParam::DFNameMatchAID(BYTE *pDFName, USHORT usDFLen, BYTE *pAIDItem, USHORT usAIDLen) { if ( 0 == memcmp(pDFName,pAIDItem,usAIDLen)) { if (usDFLen == usAIDLen) { return AIDEXACTMATCH; } return AIDPARTMATCH; } return AIDNOMATCH; }

//规范6 7.6.3 应用版本号检查

int CICParam::VerifyAppVersionNumber() { INT nLenOfTerm,nLenOfICC; BYTE ucTermVersion[512],ucICCVersion[512]; if ((ICC_SUCCESS != GetEntityValue(TAG_TERMINAL_APPLICATION_VERSION,&nLenOfTerm,ucTermVersion)) || (ICC_SUCCESS != GetEntityValue(TAG_ICC_APPLICATION_VERSION,&nLenOfICC,ucICCVersion))) { //不提供版本号,不认为是应用版本号检查项的功能错误 return ICC_WARNING; } if ((nLenOfICC != nLenOfTerm) || (0 != memcmp(ucTermVersion,ucICCVersion,nLenOfICC))) { SetBitOfEntityValue(TAG_TVR,TVR_APP_VER_DIFF); Log.WTrace(CString(\应用版本号不一致\\r\\n\ } return ICC_SUCCESS; }

// 规范6: 7.6.4 应用用途控制检查

// 检查交易点各方面的情况以决定处理是否要继续 int CICParam::VerifyAppUsageControl() { TLVDATA tlvData; INT nLen; BYTE ucTransType,ucAppUsageCtl[2],ucIssuerCountry[2]; BOOL bUnallowedFlag = FALSE; //可选数据元,没有此数据元也不算错误,返回ICC_WARNING if (ICC_SUCCESS !=

GetEntityValue(TAG_APPLICATION_USAGE_CONTROL,&nLen,ucAppUsageCtl)) return ICC_WARNING; //即使AUC和发卡方国家代码不存在这一步也要进行,所以把这一步放在前面,和流程图的顺序有区别 if ((m_TerminalParams.ucTerminalType == 0x14 || m_TerminalParams.ucTerminalType == 0x15 || m_TerminalParams.ucTerminalType == 0x16) && (m_TerminalParams.ucAdditionalTerminalCaps[0]&ADDTERMCAPS_CASH) ) { if (!BITGET(AUC_ATM, ucAppUsageCtl)) SetBitOfEntityValue(TAG_TVR,TVR_RSNA); } else { if (!BITGET(AUC_POS, ucAppUsageCtl)) SetBitOfEntityValue(TAG_TVR,TVR_RSNA); } if (ICC_SUCCESS != GetEntityValue(TAG_ISSUER_COUNTRY_CODE,&nLen,ucIssuerCountry)) { return ICC_WARNING; } if (ICC_SUCCESS == GetEntityValue(TAG_TRANSACTION_TYPE,&tlvData)) { ucTransType = tlvData.pValue[0]; } else { return ICC_ERR_TLVDATA; } //看发卡行国家代码和终端国家代码是否匹配,见规范6的表17 应用用途检查时的终端行为 //JR/T 0025限制:字节1中,位4,6值相同;位3,5值相同 if ( 0 == memcmp(ucIssuerCountry,m_TerminalParams.ucTerminalCountryCode,2)) { switch(ucTransType) { case TRANSTYPE_CASH: if (!BITGET(AUC_DOMESTICCASH,ucAppUsageCtl)) bUnallowedFlag = TRUE; break; case TRANSTYPE_GOODSANDSERVICES: if ( !BITGET(AUC_DOMESTICGOODS, ucAppUsageCtl) && !BITGET(AUC_DOMESTICSERVICES, ucAppUsageCtl) ) bUnallowedFlag = TRUE; break; case TRANSTYPE_CASHBACK: if ( !BITGET(AUC_DOMESTICCASHBACK, ucAppUsageCtl) ) bUnallowedFlag = TRUE;

break; default: break; } } else { switch(ucTransType) { case TRANSTYPE_CASH: if ( !BITGET(AUC_INTERNATIONALCASH, ucAppUsageCtl) ) bUnallowedFlag = TRUE; break; case TRANSTYPE_GOODSANDSERVICES: if ( !BITGET(AUC_INTERNATIONALGOODS, ucAppUsageCtl) && !BITGET(AUC_INTERNATIONALSERVICES, ucAppUsageCtl) ) bUnallowedFlag = TRUE; break; case TRANSTYPE_CASHBACK: if ( !BITGET(AUC_INTERNATIONALCASHBACK, ucAppUsageCtl) ) bUnallowedFlag = TRUE; break; default: break; } } if (bUnallowedFlag == TRUE) { SetBitOfEntityValue(TAG_TVR,TVR_RSNA); } return ICC_SUCCESS; }

//规范6 7.6.5 应用生效日期检查 int CICParam::VerifyEffectiveDate() { INT nLen; BYTE ucEffectDate[3],ucTransDate[3],ucDate1[4],ucDate2[4]; if ((ICC_SUCCESS != GetEntityValue(TAG_APPLICATION_EFFECTIVE_DATE,&nLen,ucEffectDate)) || (ICC_SUCCESS != GetEntityValue(TAG_TRANSACTION_DATE,&nLen,ucTransDate))) return ICC_WARNING; if ((!Formater.VerifyYYMMDD(ucEffectDate)) || (!Formater.VerifyYYMMDD(ucTransDate))) return ICC_ERR_TLVDATA; if(ucEffectDate[0] < 0x50) {


PBOC代码回顾(1)(10).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《圆明园的毁灭》图片

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: