/* convert a ASCII phone number to 'called/calling/connect party BCD number' */ int gsm48_encode_bcd_number(uint8_t *bcd_lv, uint8_t max_len, int h_len, const char *input) { int in_len = strlen(input); int i; uint8_t *bcd_cur = bcd_lv + 1 + h_len; /* two digits per byte, plus type byte */ bcd_lv[0] = in_len/2 + h_len; if (in_len % 2) bcd_lv[0]++; if (bcd_lv[0] > max_len) return -EIO; for (i = 0; i < in_len; i++) { int rc = asc_to_bcd(input[i]); if (rc < 0) return rc; if (i % 2 == 0) *bcd_cur = rc; else *bcd_cur++ |= (rc << 4); } /* append padding nibble in case of odd length */ if (i % 2) *bcd_cur++ |= 0xf0; /* return how many bytes we used */ return (bcd_cur - bcd_lv); }
/* * ��֤�ն����͵�PIN�Ƿ������ݿ��е�PINһ�� * * ��2��: * 1����PIK��PIN���ļ��� * 2�����ն����͵����Ľ��бȽ� * * ���� face->data ���ݿ�����������(8�ֽ�)+�ն�PIN����(8�ֽ�) * ��Ӧ face->data SUCC-һ�� FAIL-��һ�� */ int UphsmVerifyPin(struct interface *face, int nSekPosIndex) { char szInData[1024], szOutData[1024], szPanBlock[17], szEncPin[17]; int nLen, nRet, nSndLen; memset( szPanBlock, '0', 16 ); szPanBlock[16] = 0; nLen = 0; memcpy( szInData, "60", 2 ); /* ���� */ nLen += 2; /* ����PIK�Ĵ洢������Կ���� */ sprintf( szInData+nLen, "S%04ld", nSekPosIndex ); nLen += 5; /* PIK��Կ���ȱ�ʶ��16λ�� */ szInData[nLen] = 'Y'; nLen ++; /* PIK��Կ���� */ bcd_to_asc( (uchar *)(szInData+nLen), (uchar *)(face->pin_key), 32, 0 ); nLen += 32; /* PinBlock��ʽ */ memcpy( szInData+nLen, "01", 2 ); nLen += 2; /* PIN���� */ memcpy( szInData+nLen, "08", 2 ); nLen += 2; memcpy( szInData+nLen, face->data, 8 ); nLen += 8; memcpy( szInData+nLen, "FFFFFFFF", 6 ); nLen += 6; /* �ʺ� */ memcpy( szInData+nLen, szPanBlock, 16 ); nLen += 16; nRet = commu_with_hsm( szInData, nLen, szOutData ); if( nRet == FAIL ) { ErrorLog( ERROR, "commu with hsm fail" ); strcpy( face->return_code, ERR_SYSTEM_ERROR ); return FAIL; } if( memcmp(szOutData, "61", 2) != 0 || memcmp(szOutData+2, "00", 2) != 0 ) { DispUphsmErrorMsg( szOutData+2, face->return_code ); ErrorLog( ERROR, "hsm encrypt pin fail[%2.2s]", szOutData+2 ); return SUCC; } asc_to_bcd( (uchar *)szEncPin, (uchar *)(szOutData+4), 16, 0 ); if( memcmp( face->data+8, szEncPin, 8 ) == 0 ) { strcpy( face->data, "SUCC" ); } else { strcpy( face->data, "FAIL" ); } face->data_len = 4; strcpy( face->return_code, TRANS_SUCC ); return SUCC; }
/* * ��ԴPIN������ԴPIK���ܣ�����PIN��ʽת����Ȼ����Ŀ��PIK��������� * * ���� face->data Դ�ʺ�(16�ֽ�)+��������(8�ֽ�)+Ŀ���ʺ�(16�ֽ�) * ��Ӧ face->data ת���ܺ����������(8�ֽ�) */ int UphsmChangePin(struct interface *face, int nSekPosIndex, int nSekPppIndex) { char szInData[1024], szOutData[1024], szPanBlock[17], szTargetPan[17]; int nLen, nRet, nSndLen; sprintf( szPanBlock, "0000%12.12s", face->data+3 ); szPanBlock[16] = 0; sprintf( szTargetPan, "0000%12.12s", face->data+27 ); szTargetPan[16] = 0; nLen = 0; memcpy( szInData, "P0", 2 ); /* ���� */ nLen += 2; /* ����ԴPIK�Ĵ洢������Կ���� */ sprintf( szInData+nLen, "S%04ld", nSekPosIndex ); nLen += 5; /* ����Ŀ��PIK�Ĵ洢������Կ���� */ sprintf( szInData+nLen, "S%04ld", nSekPppIndex ); nLen += 5; /* ԴPIK��Կ���ȱ�ʶ��16λ�� */ szInData[nLen] = 'Y'; nLen ++; /* ԴPIK��Կ���� */ bcd_to_asc( (uchar *)(szInData+nLen), (uchar *)(face->pin_key), 32, 0 ); nLen += 32; /* Ŀ��PIK��Կ���ȱ�ʶ��16λ�� */ szInData[nLen] = 'Y'; nLen ++; /* Ŀ��PIK��Կ���� */ bcd_to_asc( (uchar *)(szInData+nLen), (uchar *)(face->mac_key), 32, 0 ); nLen += 32; /* ԴPinBlock��ʽ */ memcpy( szInData+nLen, "01", 2 ); nLen += 2; /* Ŀ��PinBlock��ʽ */ memcpy( szInData+nLen, "01", 2 ); nLen += 2; /* ԴPinBlock���� */ bcd_to_asc( (uchar *)(szInData+nLen), (uchar *)(face->data+16), 16, 0 ); nLen += 16; /* Դ�ʺ� */ memcpy( szInData+nLen, szPanBlock, 16 ); nLen += 16; /* Ŀ���ʺ� */ memcpy( szInData+nLen, szTargetPan, 16 ); nLen += 16; debug_disp("UphsmChangePin szInData:", szInData, nLen); nRet = commu_with_hsm( szInData, nLen, szOutData ); if( nRet == FAIL ) { ErrorLog( ERROR, "commu with hsm fail" ); strcpy( face->return_code, ERR_SYSTEM_ERROR ); return FAIL; } debug_disp("UphsmChangePin szOutData:", szOutData, nRet); if( memcmp(szOutData, "P1", 2) != 0 || memcmp(szOutData+2, "00", 2) != 0 ) { DispUphsmErrorMsg( szOutData+2, face->return_code ); ErrorLog( ERROR, "hsm pin change fail[%2.2s]", szOutData+2 ); return SUCC; } asc_to_bcd( (uchar *)(face->data), (uchar *)(szOutData+4), 16, 0 ); face->data_len = 8; strcpy( face->return_code, TRANS_SUCC ); return SUCC; }
/* * ��ANSI X9.9 MAC�㷨��������MAC�� * * ���� face->data ����MAC��������ݣ�������data_lenָ�� * ��Ӧ face->data MAC(8�ֽ�) */ int UphsmCalcMac(struct interface *face, int nSekIndex) { char szInData[2048], szOutData[2048]; int nLen, nRet, nSndLen; nLen = 0; memcpy( szInData, "M0", 2 ); /* ���� */ nLen += 2; /* MAC�㷨 1-XOR 2-X9.9 3-X9.19 */ if( face->alog == X99_CALC_MAC ) { szInData[nLen] = '2'; } else if( face->alog == XOR_CALC_MAC ) { szInData[nLen] = '1'; } else { szInData[nLen] = '3'; } nLen += 1; sprintf( szInData+nLen, "S%04ld", nSekIndex ); /* ������Կ���� */ nLen += 5; szInData[nLen] = 'Y'; /* ��Կ���ȱ�ʶ��16λ�� */ nLen ++; bcd_to_asc( (uchar *)(szInData+nLen), (uchar *)(face->mac_key), 32, 0 ); /*MAC��Կ����*/ nLen += 32; sprintf( szInData+nLen, "%04ld", face->data_len ); nLen += 4; memcpy( szInData+nLen, face->data, face->data_len ); nLen += face->data_len; nRet = commu_with_hsm( szInData, nLen, szOutData ); if( nRet == FAIL ) { ErrorLog( ERROR, "commu with hsm fail" ); strcpy( face->return_code, ERR_SYSTEM_ERROR ); return FAIL; } if( memcmp(szOutData, "M1", 2) != 0 || memcmp(szOutData+2, "00", 2) != 0 ) { DispUphsmErrorMsg( szOutData+2, face->return_code ); ErrorLog( ERROR, "hsm calc mac fail[%2.2s]", szOutData+2 ); return SUCC; } asc_to_bcd( (uchar *)(face->data), (uchar *)(szOutData+4), 16, 0 ); face->data_len = 8; strcpy( face->return_code, TRANS_SUCC ); return SUCC; }
/************************ **功能:消息内容转换***** ************************/ int MessInToOut(unsigned char *sMess, TXN_MSG_DTL *pstMsgDtl ) { unsigned char sTmp[17]; unsigned char sTmp1[17]; unsigned char sFlwCd[3]; unsigned char sBuf[512]; int iMsgLen, iLen; int iCnt, i, iBufLen ; /*报文类型*/ memset(sTmp, 0, sizeof(sTmp)); memset(sTmp1, 0, sizeof(sTmp1)); memcpy(sTmp, pstMsgDtl->sMsqType, 2 ); Str2Hex(sTmp, sTmp1, 2 ); memcpy(sMess, sTmp1, 1 ); iLen = 1; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "报文类型[%2.2s]", pstMsgDtl->sMsqType ); /*结束标志*/ memset(sTmp, 0, sizeof(sTmp)); memset(sTmp1, 0, sizeof(sTmp1)); memcpy(sTmp, pstMsgDtl->sEndFlg, 2 ); Str2Hex(sTmp, sTmp1, 2 ); memcpy(sMess+iLen, sTmp1, 1 ); iLen = iLen + 1; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "程序版本号[%4.4s]", pstMsgDtl->sProVer); #if 0 /* 程序版本号 */ memset(sTmp, 0, sizeof(sTmp)); memset(sTmp1, 0, sizeof(sTmp1)); memcpy(sTmp, pstMsgDtl->sProVer, 4); Str2Hex(sTmp, sTmp1, 4 ); memcpy(sMess+iLen, sTmp1, 2 ); iLen = iLen + 2; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "应用版本号[%8.8s]", pstMsgDtl->sAppVer); /* 应用版本号 */ memset(sTmp, 0, sizeof(sTmp)); memset(sTmp1, 0, sizeof(sTmp1)); memcpy(sTmp, pstMsgDtl->sAppVer, 8); Str2Hex(sTmp, sTmp1, 8 ); memcpy(sMess+iLen, sTmp1, 4 ); iLen = iLen + 4; #endif /*序列号*/ memset(sTmp, 0, sizeof(sTmp)); asc_to_bcd(sTmp, pstMsgDtl->sTsamNo, 16, 1 ); memcpy(sMess+iLen, sTmp, 8 ); iLen = iLen + 8; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "序列号[%16.16s]", pstMsgDtl->sTsamNo ); /*系统日期*/ memset(sTmp, 0, sizeof(sTmp)); HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "系统日期[%8.8s]", pstMsgDtl->sSysDt ); asc_to_bcd(sTmp, pstMsgDtl->sSysDt, 8, 1 ); memcpy(sMess+iLen, sTmp, 4 ); iLen = iLen + 4; /*系统时间*/ memset(sTmp, 0, sizeof(sTmp)); asc_to_bcd(sTmp, pstMsgDtl->sSysTm, 6, 1 ); memcpy(sMess+iLen, sTmp, 3 ); iLen = iLen + 3; /*交易流水号*/ memset(sTmp, 0, sizeof(sTmp)); asc_to_bcd(sTmp, pstMsgDtl->sTxnSeq, 6, 1 ); memcpy(sMess+iLen, sTmp, 3 ); iLen = iLen + 3; /*交易代码*/ memset(sTmp, 0, sizeof(sTmp)); memcpy(sTmp, pstMsgDtl->sTxnCode, 3 ); memcpy(sMess+iLen, sTmp, 3 ); iLen = iLen + 3; /*流程代码总数*/ memset(sTmp, 0, sizeof(sTmp)); memset(sTmp1, 0, sizeof(sTmp1)); memcpy(sTmp, pstMsgDtl->sFlowNum, 2 ); HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__,"流程代码个数[%2.2s]", sTmp ); Str2Hex(sTmp, sTmp1, 2 ); memcpy(sMess+iLen, sTmp1, 1 ); iLen = iLen + 1; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "iLen[%d]", iLen ); /*流程代码集*/ iCnt = sTmp1[0]; iMsgLen = 0; iBufLen = 0; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__,"流程代码个数[%d]", iCnt ); memset(sBuf, 0, sizeof(sBuf)); for(i = 0; i < iCnt; i ++ ) { memset(sTmp, 0, sizeof(sTmp)); memset(sTmp1, 0, sizeof(sTmp1)); memset(sFlwCd, 0, sizeof(sFlwCd)); memcpy(sTmp, pstMsgDtl->sFlowCode+iMsgLen, 2 ); HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "流程代码[%s]", sTmp ); Str2Hex(sTmp, sTmp1, 2 ); /*HtDebugString (gsLogFile, HT_LOG_MODE_DEBUG, __FILE__, __LINE__, (char *)sTmp1, 2 );*/ sTmp1[0] = sTmp1[0] >> 6; /*HtDebugString (gsLogFile, HT_LOG_MODE_DEBUG, __FILE__, __LINE__, (char *)sTmp1, 2 );*/ if(sTmp1[0] == 0x03 ) { /**3字节**/ memset(sTmp, 0, sizeof(sTmp)); memcpy(sTmp, pstMsgDtl->sFlowCode+iMsgLen, 6 ); Str2Hex(sTmp, sFlwCd, 6 ); memcpy(sBuf+iBufLen, sFlwCd, 3 ); iBufLen = iBufLen + 3; iMsgLen = iMsgLen + 6; } else if(sTmp1[0] == 0x00 ) { /**双字节**/ memset(sTmp, 0, sizeof(sTmp)); memcpy(sTmp, pstMsgDtl->sFlowCode+iMsgLen, 4 ); Str2Hex(sTmp, sFlwCd, 4 ); memcpy(sBuf+iBufLen, sFlwCd, 2 ); iBufLen = iBufLen + 2; iMsgLen = iMsgLen + 4; } else { /**单字节**/ memset(sTmp, 0, sizeof(sTmp)); memcpy(sTmp, pstMsgDtl->sFlowCode+iMsgLen, 2 ); Str2Hex(sTmp, sFlwCd, 2 ); memcpy(sBuf+iBufLen, sFlwCd, 1 ); iBufLen = iBufLen + 1; iMsgLen = iMsgLen + 2; } }/*end for */ HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "iBufLen[%d]", iBufLen ); memcpy(sMess+iLen, sBuf, iBufLen ); iLen = iLen + iBufLen; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "iLen[%d]", iLen ); /*有效数据长度*/ memset(sTmp, 0, sizeof(sTmp)); memset(sTmp1, 0, sizeof(sTmp1)); memcpy(sTmp, pstMsgDtl->sDataLen, 4 ); HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__,"有效数据长度[%s]", sTmp ); Str2Hex(sTmp, sTmp1, 4 ); memcpy(sMess+iLen, sTmp1, 2 ); iLen = iLen + 2; /*有效数据*/ iMsgLen = (sTmp1[0]*256 + sTmp1[1]) - 8; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__,"有效数据长度[%d]", iMsgLen ); memcpy(sMess+iLen, pstMsgDtl->sDataDtl, iMsgLen ); HtDebugString(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__, __LINE__, (char*)pstMsgDtl->sDataDtl, iMsgLen ); iLen = iLen + iMsgLen; HtLog(gsLogFile, HT_LOG_MODE_DEBUG, __FILE__,__LINE__, "iLen[%d]", iLen ); /*MAC*/ memset(sTmp, 0, sizeof(sTmp)); asc_to_bcd(sTmp, pstMsgDtl->sMac, 16, 1 ); memcpy(sMess+iLen, sTmp, 8 ); iLen = iLen + 8; return iLen; }