📄 cmstrack.sqc
字号:
char * pcTrack2; /* 卡磁道二 */char * pcTrack3; /* 卡磁道三 */{ /* 定义 局部变量 */ int iRtn; /* 函数返回值 */ int iLen; /* 长度 */ int iFlag; /* 标志 */ int iNum, iNum1, iNum2, iNum3, iNum4; char acBuf[CONDITION_LEN]; /* 临时存储区 */ char acBuf1[CONDITION_LEN]; /* 临时存储区 */ sprintf( g_acTrcMsg, "cmsGenCardCovInfo begin " ); TRCLOG2 /* 获取数据库中配置的卡面信息 */ memset( acBuf, 0, sizeof( acBuf )); memset( acBuf1, 0, sizeof( acBuf1 )); strcpy( acBuf, pcCardNo+7 ); strcat( acBuf, " " ); strcat( acBuf, pcVouNo ); strcat( acBuf, " " ); strncpy( acBuf1, pcValidDate , 4 ); acBuf1[ 4 ] ='\0'; strcat( acBuf, acBuf1 ); strcat( acBuf, "/" ); memset( acBuf1, 0, sizeof( acBuf1 )); strncpy( acBuf1, pcValidDate+4 , 2 ); acBuf1[ 2 ] ='\0'; strcat( acBuf, acBuf1 ); strcpy( pcCardCover, acBuf); sprintf( g_acTrcMsg, "cmsGenCardCovInfo end " ); TRCLOG2 return SUCCESS;}/******************************************************* ** 函数名称:cmsGenCardTrack2Info ** 功能描述:按制卡格式生成卡的二磁道信息(哈尔滨) ** 输入参数: ** pcCardNo ---- 卡号 ** pcBankFg ---- 银行标志 ** pcCustInf ---- 客户信息 ** pcValidDate ---- 有效期 ** pcVouNo ---- 凭证号码 ** 输出参数: ** pcCardCover ---- 卡面 ** pcTrack1 ---- 磁道一 ** pcTrack2 ---- 磁道二 ** pcTrack3 ---- 磁道三 ** 返回结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsGenCardTrack2Info( pcCardNo, pcBankFg, pcCustInf, pcValidDate, pcVouNo, pcCardCover, pcTrack1, pcTrack2, pcTrack3 )char * pcCardNo; /* 卡号 */char * pcBankFg; /* 银行标志 */char * pcCustInf; /* 客户信息 */char * pcValidDate; /* 有效期 */char * pcVouNo; /* 凭证号码 */char * pcCardCover; /* 卡面 */char * pcTrack1; /* 卡磁道一 */char * pcTrack2; /* 卡磁道二 */char * pcTrack3; /* 卡磁道三 */{ /* 定义 局部变量 */ int iRtn; /* 函数返回值 */ int iLen; /* 长度 */ int iFlag; /* 标志 */ int iNum, iNum1, iNum2, iNum3, iNum4; char acBuf[CONDITION_LEN]; /* 临时存储区 */ char acBuf1[CONDITION_LEN]; /* 临时存储区 */ char acPinparm[ 6 + 1 ]; /* 写磁控制码 */ char acEncryPinparm[ 16 + 1 ]; /* 密文 */ sprintf( g_acTrcMsg, "cmsGenCardTrack2Info begin " ); TRCLOG2 memset( acPinparm, 0, sizeof( acPinparm )); memset( acEncryPinparm, 0, sizeof( acEncryPinparm )); /* 补充二磁道信息 */ memset( acBuf, 0, sizeof( acBuf )); strcpy( acBuf, pcTrack2 ); iRtn = cmsApiGenCardPinparm( pcCardNo, acPinparm, acEncryPinparm ); if ( iRtn ) { ERRLOG return FAILED; } memcpy( acBuf+31, acPinparm + strlen( acPinparm ) -3 , 3 ); strcpy( pcTrack2, acBuf); sprintf( g_acTrcMsg, "cmsGenCardTrack2Info end " ); TRCLOG2 return SUCCESS;}/******************************************************* ** 函数名称:cmsGenCardTrack3Info ** 功能描述:按制卡格式生成卡的三磁道信息(哈尔滨) ** 输入参数: ** pcCardNo ---- 卡号 ** pcBankFg ---- 银行标志 ** pcCustInf ---- 客户信息 ** pcValidDate ---- 有效期 ** pcVouNo ---- 凭证号码 ** 输出参数: ** pcCardCover ---- 卡面 ** pcTrack1 ---- 磁道一 ** pcTrack2 ---- 磁道二 ** pcTrack3 ---- 磁道三 ** 返回结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsGenCardTrack3Info( pcCardNo, pcBankFg, pcCustInf, pcValidDate, pcVouNo, pcCardCover, pcTrack1, pcTrack2, pcTrack3 )char * pcCardNo; /* 卡号 */char * pcBankFg; /* 银行标志 */char * pcCustInf; /* 客户信息 */char * pcValidDate; /* 有效期 */char * pcVouNo; /* 凭证号码 */char * pcCardCover; /* 卡面 */char * pcTrack1; /* 卡磁道一 */char * pcTrack2; /* 卡磁道二 */char * pcTrack3; /* 卡磁道三 */{ /* 定义 局部变量 */ int iRtn; /* 函数返回值 */ int iLen; /* 长度 */ int iFlag; /* 标志 */ int iNum, iNum1, iNum2, iNum3, iNum4; char acBuf[CONDITION_LEN]; /* 临时存储区 */ char acBuf1[CONDITION_LEN]; /* 临时存储区 */ char acPinparm[ 6 + 1 ]; /* 写磁控制码 */ char acEncryPinparm[ 16 + 1 ]; /* 密文 */ char acVouNos[ VOUNO_LEN + 1 ]; /* 凭证号码+校验 */ struct cmscardinfo stCmsCardInfo; /* 卡片信息表 */ sprintf( g_acTrcMsg, "cmsGenCardTrack3Info begin " ); TRCLOG2 memset( acPinparm, 0, sizeof( acPinparm )); memset( acEncryPinparm, 0, sizeof( acEncryPinparm )); memset( acVouNos, 0, sizeof( acVouNos )); memset( &stCmsCardInfo, 0x00, sizeof( struct cmscardinfo ) ); /* 补充三磁道信息 */ memset( acBuf, 0, sizeof( acBuf )); strcpy( acBuf, pcTrack3 ); iRtn = cmsApiGenCardPinparm( pcCardNo, acPinparm, acEncryPinparm ); if ( iRtn ) { ERRLOG return FAILED; } memcpy( acBuf+43, acPinparm , 6 ); memcpy( acBuf+62, pcCardNo + strlen( pcCardNo ) - 11 , 11 ); strcpy( acVouNos, pcVouNo ); iRtn = cmsGenCardVerifyBit ( acVouNos ); if ( iRtn ) { ERRLOG return FAILED; } memcpy( acBuf+74, acVouNos, strlen( acVouNos ) ); strcpy( pcTrack3, acBuf); strcpy( stCmsCardInfo.cardno, pcCardNo ); iRtn = pubReadCmscardinfo( &stCmsCardInfo ); if ( iRtn ) { ERRLOG return FAILED; } strcpy( stCmsCardInfo.cardoffset, acEncryPinparm ); iRtn = pubModiCmscardinfo( &stCmsCardInfo ); if ( iRtn ) { ERRLOG return FAILED; } sprintf( g_acTrcMsg, "cmsGenCardTrack3Info end " ); TRCLOG2 return SUCCESS;}/******************************************************* ** 函数名称:cmsCardVerify ** 功能描述:校验CVN ** 输入参数: ** pcCardNo ---- 卡号 ** pcTrack2 ---- 磁道二 ** pcTrack3 ---- 磁道三 ** 输出参数: ** 返回结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsCardVerify( pcCardNo, pcTrack2 ,pcTrack3 )char *pcCardNo;char *pcTrack2;char *pcTrack3;{ int iRtn; char vakey[5]; char vacdsj[36]; char acBuf1[CONDITION_LEN]; /* 临时存储区 */ char acBuf2[CONDITION_LEN]; /* 临时存储区 */ memset(vakey,0,sizeof(vakey)); memset(vacdsj,0,sizeof(vacdsj)); if (strlen(pcTrack2) == 0) { strcpy( g_acRspCode, "CMS222" ); pubCrtRspInfo( ); ERRLOG return FAILED; } /* 表示需要重新写磁道 */ if ((!strcmp(pcTrack2+17, "=0000201121234567890")) || (!memcmp(pcTrack2, "6603601", 7))) { return 1; } else { /* 计算密码校验值 */ memset( acBuf1, 0, sizeof( acBuf1 )); memset( acBuf2, 0, sizeof( acBuf2 )); strncpy( acBuf1, pcTrack2,17); memcpy( acBuf1 + strlen( acBuf1 ), pcTrack2+18, 4); memcpy( acBuf1 + strlen( acBuf1 ), pcTrack2+22, 3); iRtn = cmsGenCVN( acBuf1 , "678012DEF345ABC9", "DEF01234ABC56798", acBuf2); if ( iRtn ) { strcpy( g_acRspCode , "CMS1D1" ); pubCrtRspInfo( ); ERRLOG return FAILED; } sprintf(vacdsj,"%s=0000201%s234567890",pcCardNo,acBuf2); sprintf(g_acTrcMsg, "vacdsj:%s", vacdsj); TRCLOG2 if (strcmp(vacdsj,pcTrack2)) { strcpy( g_acRspCode , "CMS1D1" ); pubCrtRspInfo( ); ERRLOG return FAILED; } else return 0; } return 0;}/******************************************************* ** 函数名称:cmsCardVerifyHRB ** 功能描述:校验写磁控制码 ** 输入参数: ** pcCardNo ---- 卡号 ** pcTrack2 ---- 磁道二 ** pcTrack3 ---- 磁道三 ** 输出参数: ** 返回结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsCardVerifyHRB( pcCardNo, pcTrack2 ,pcTrack3 )char *pcCardNo;char *pcTrack2;char *pcTrack3;{ int iRtn; char acPinparm1[4]; char acPinparm2[7]; char acEncryPinparm[ 16 + 1 ]; /* 密文 */ char acBuf1[CONDITION_LEN]; /* 临时存储区 */ char acBuf2[CONDITION_LEN]; /* 临时存储区 */ struct cmscardinfo stCmsCardInfo; /* 卡片信息表 */ memset( acPinparm1,0,sizeof( acPinparm1 )); memset( acPinparm2,0,sizeof( acPinparm2 )); memset( acEncryPinparm, 0, sizeof( acEncryPinparm )); memset( &stCmsCardInfo, 0x00, sizeof( struct cmscardinfo ) ); if (strlen(pcTrack2) == 0) { strcpy( g_acRspCode, "CMS222" ); pubCrtRspInfo( ); ERRLOG return FAILED; } if (strlen(pcTrack3) == 0) { strcpy( g_acRspCode, "CMS223" ); pubCrtRspInfo( ); ERRLOG return FAILED; } memcpy( acPinparm1, pcTrack2+ 31, 3 ); memcpy( acPinparm2, pcTrack3+ 43, 6 ); if ( memcmp( acPinparm1, acPinparm2 + 3 , 3 ) ) { strcpy( g_acRspCode, "CMS1D1" ); pubCrtRspInfo( ); ERRLOG return FAILED; } PIN_Encrypt( acPinparm2, pcCardNo, acEncryPinparm ); strcpy( stCmsCardInfo.cardno, pcCardNo ); iRtn = pubReadCmscardinfo( &stCmsCardInfo ); if ( iRtn ) { ERRLOG return FAILED; } if ( strcmp( stCmsCardInfo.cardoffset, acEncryPinparm ) ) { strcpy( g_acRspCode, "CMS1D1" ); pubCrtRspInfo( ); ERRLOG return FAILED; } return SUCCESS;}/************************************************************************ Function Name: EncryptPkg Summary: encrypt a package using a 8 byte key Interface: Input paramter - char key[9]; char in[]; unencrypted bytes int size; the lenth you want to encrypt,it must be some times of 8. Output paramter - char out[]; encrypted bytes***********************************************************************int EncryptPkg( char * in,char * out,int size){ int i = 0, j = 0 ; char key_bit[65]; char key[8+1]; char out_tmp[8+1]; char in_tmp[8+1]; memset( out, 0x0, 9 ); sprintf(g_acTrcMsg, "in:%s", in); TRCLOG2 for( i = 0 ; i < size ; i ++ ) { j = i % 8; out[j] = out[j] + in[i] - 0x30 ; } for( i = 0 ; i < 8 ; i ++ ) { if( out[i] > 0x09 ) out[i] = out[i] - 0x09; out[i] = out[i] + 0x30 ; } return 0;}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -