コード例 #1
0
ファイル: gsm48_ie.c プロジェクト: 84danielwhite/libosmocore
/* 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);
}
コード例 #2
0
ファイル: unionpayhsm.c プロジェクト: cqm0609/epay_sdyl
/*
 * ��֤�ն����͵�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;
}
コード例 #3
0
ファイル: unionpayhsm.c プロジェクト: cqm0609/epay_sdyl
/*
 * ��Դ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;
}
コード例 #4
0
ファイル: unionpayhsm.c プロジェクト: cqm0609/epay_sdyl
/* 
 * ��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;
}
コード例 #5
0
ファイル: CvtCust.c プロジェクト: HollyLoong/online
/************************
**功能:消息内容转换*****
************************/
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;
}