www.pudn.com > comm11111.rar > comm.c


/***************************** 
comm.c:对密码器,下载机操作函数 
编制人:李健 
编制日期:2001/8/31 
修改日期: 
动态连接:libzfmm.so 
*****************************/ 
 
#define	 Debug			0 
 
#include  
#include "comm.h" 
 
#define  MACH_ID_LEN		10	/*	机具编号	*/ 
#define  CHIP_SN_LEN		8	/*	芯片序列号	*/ 
#define  ACCU_LEN		32	/*	帐号		*/ 
#define  CHIP_ID_LEN		32	/*	芯片ID		*/ 
#define  VK_LEN			160	/*	VK		*/ 
#define  KEY_NUM_LEN		2	/*	密钥号		*/ 
#define  AK_LEN			32	/*	AK支		*/ 
#define  SIG_LEN		16	/*	SIG		*/ 
#define  UNLOCK_CODE_LEN	16	/*	解锁密码	*/ 
#define  PADDING_LEN		30	/*	填充位 0	*/ 
#define  SERVICE_LEN		2	/*	业务种类	*/ 
#define  DATE_LEN		8	/*	日期		*/ 
#define  TICKET_NUM_LEN		8	/*	凭证号码	*/ 
#define  BANLANCE_LEN		16	/*	金额		*/ 
#define  PAY_CODE_LEN		20	/*	联机支付密码长度*/ 
#define  ICZFMM_LEN		500	/*	对照表长度	*/ 
 
 
/*	读机具号和芯片SN ,出口参数MACH_ID,CHIP_SN	*/  
int 	Read_Sn(char *MACH_ID,char *CHIP_SN) 
{ 
	int ret; 
	char rece_buffer[PACKLEN]; 
 
	memset(rece_buffer,0,PACKLEN); 
 
	ret=PORT_RW(READ_SN,"",rece_buffer); 
	#if Debug>0 
	fprintf(stderr,"\nRead_Sn ret=%d\n",ret); 
	#endif 
	if (ret!=True)	 
		return ret; 
 
	#if Debug>0 
	fprintf(stderr,"rece_buffer=%s\n",rece_buffer); 
	#endif 
 
	strncpy(MACH_ID,rece_buffer,MACH_ID_LEN); 
	strncpy(CHIP_SN,&rece_buffer[MACH_ID_LEN],CHIP_SN_LEN); 
	 
	return True; 
 
 } 
 
/*	生成密钥对,入口参数:ACCU,出口参数:CHIP_ID,VK	*/ 
int 	Gen_Keypair(char *ACCU,char *CHIP_ID,char *VK) 
{ 
	int ret; 
	char rece_buffer[PACKLEN]; 
	char send_buffer[PACKLEN]; 
	char accu[ACCU_LEN]; 
 
	memset(rece_buffer,0,PACKLEN); 
	memset(send_buffer,0,PACKLEN); 
	memset(accu,0,ACCU_LEN); 
 
	/*	过滤帐号	*/ 
	ACCU_accu(ACCU,accu); 
 
	strcat(send_buffer,accu); 
 
	ret=PORT_RW(GEN_KEYPAIR,send_buffer,rece_buffer); 
	#if Debug>0 
	fprintf(stderr,"\n生成密钥对ret=%d\n",ret); 
	#endif 
	if (ret!=True)	 
		return ret; 
 
	#if Debug>0 
	fprintf(stderr,"rece_buffer=%s\n",rece_buffer); 
	#endif 
 
	strncpy(CHIP_ID,rece_buffer,CHIP_ID_LEN); 
	strncpy(VK,&rece_buffer[CHIP_ID_LEN],VK_LEN); 
 
	return True; 
} 
 
/*	下载AK支,入口参数:ACCU,KEY_NUM,AK支		*/ 
int 	Load_Ak(char *ACCU,char *KEY_NUM,char *AK) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
	char accu[ACCU_LEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
	memset(accu,0,ACCU_LEN); 
 
	/*	过滤帐号	*/ 
	ACCU_accu(ACCU,accu); 
 
	strcat(send_buffer,accu); 
	strcat(send_buffer,KEY_NUM); 
	strcat(send_buffer,AK); 
 
	ret=PORT_RW(LOAD_AK,send_buffer,rece_buffer); 
	#if Debug>0 
	fprintf(stderr,"\n下载AKret=%d\n",ret); 
	#endif 
	if (ret!=True)	 
		return ret; 
 
	#if Debug>0 
	fprintf(stderr,"rece_buffer=%s\n",rece_buffer); 
	#endif 
 
	return True; 
} 
 
/*	删除帐号,入口参数:ACCU				*/ 
int 	Del_Accu(char *ACCU) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
	char accu[ACCU_LEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
	memset(accu,0,ACCU_LEN); 
 
	/*	过滤帐号	*/ 
	ACCU_accu(ACCU,accu); 
 
	strcat(send_buffer,accu); 
 
	ret=PORT_RW(DEL_ACCU,send_buffer,rece_buffer); 
	#if Debug>0 
	fprintf(stderr,"\n删除帐号ret=%d\n",ret); 
	#endif 
	if (ret!=True)	 
		return ret; 
 
	return True; 
} 
 
/*	增发签名,入口参数:ACCU,CHIP_ID,VK,出口参数:SIG	*/ 
int 	Add_Sig(char *ACCU,char *CHIP_ID,char *VK,char *SIG) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
	char accu[ACCU_LEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
	memset(accu,0,ACCU_LEN); 
 
	/*	过滤帐号	*/ 
	ACCU_accu(ACCU,accu); 
 
	strcat(send_buffer,accu); 
	strcat(send_buffer,CHIP_ID); 
	strcat(send_buffer,VK); 
 
	ret=PORT_RW(ADD_SIG,send_buffer,rece_buffer); 
	#if Debug>0 
	fprintf(stderr,"\n增发ret=%d\n",ret); 
	#endif 
	if (ret!=True)	 
		return ret; 
 
	strncpy(SIG,rece_buffer,SIG_LEN); 
 
	return True; 
} 
 
/*	解锁,入口参数:UNLOCK_CODE			*/ 
int 	Unlock_Mach(char *UNLOCK_CODE) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
 
	strcat(send_buffer,UNLOCK_CODE); 
 
	ret=PORT_RW(UNLOCK,send_buffer,rece_buffer); 
	#if Debug>0 
	fprintf(stderr,"\n解锁ret=%d\n",ret); 
	#endif 
	if (ret!=True)	 
		return ret; 
 
	return True; 
} 
 
/*	发行机具,入口参数:UNLOCK_CODE			*/ 
int 	Dist_Mach(char *UNLOCK_CODE) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
 
	strcat(send_buffer,UNLOCK_CODE); 
 
	ret=PORT_RW(DIST_MACH,send_buffer,rece_buffer); 
	#if Debug>0 
	fprintf(stderr,"\n发行机具ret=%d\n",ret); 
	#endif 
	if (ret!=True)	 
		return ret; 
 
	#if Debug>0 
	fprintf(stderr,"发行机具rece_buffer=%s\n",rece_buffer); 
	#endif 
 
	return True; 
} 
 
/*	联机计算支付密码,入口参数:PLAIN_TXT:(ACCU,SERVICE,DATE,TICKET_NUM, 
						BANLANCE)	 
	 		 出口参数:PAY_CODE		*/ 
int 	Conn_Calu(char *PLAIN_TXT,char *PAY_CODE) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
	char PADDING[PADDING_LEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
 
 
	/*	填充0		*/ 
	memset(PADDING,'0',PADDING_LEN); 
 
	strncpy(send_buffer,PADDING,PADDING_LEN); 
	strncpy(&send_buffer[30],PLAIN_TXT,strlen(PLAIN_TXT)); 
 
	ret=PORT_RW(CONN_CALU,send_buffer,rece_buffer); 
	if (ret!=True)	 
		return ret; 
 
	#if Debug>0 
	fprintf(stderr,"rece_buffer=%s\n",rece_buffer); 
	#endif 
 
	strncpy(PAY_CODE,rece_buffer,PAY_CODE_LEN); 
 
	return True; 
} 
 
 
/******************************************************************************/ 
/*	初始化IC卡,入口参数:ICMM					      */ 
/******************************************************************************/ 
int 	Init_Ic(char *ICMM) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
 
	strcat(send_buffer,ICMM); 
 
	ret=PORT_RW(INIT_IC,send_buffer,rece_buffer); 
	if (ret!=True)	 
		return ret; 
 
	return True; 
} 
 
/******************************************************************************/ 
/*	验证密码,入口参数:ICMM					      */ 
/******************************************************************************/ 
int 	Ver_Icmm(char *ICMM) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
 
	strcat(send_buffer,ICMM); 
 
	ret=PORT_RW(VER_ICMM,send_buffer,rece_buffer); 
	if (ret!=True)	 
		return ret; 
 
	return True; 
} 
 
/******************************************************************************/ 
/*	修改密码,入口参数:ICMM					      */ 
/******************************************************************************/ 
int 	Chg_Icmm(char *ICMM) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
 
	strcat(send_buffer,ICMM); 
 
	ret=PORT_RW(CHG_ICMM,send_buffer,rece_buffer); 
	if (ret!=True)	 
		return ret; 
 
	return True; 
} 
 
/******************************************************************************/ 
/*	比较算法芯片号							      */ 
/******************************************************************************/ 
int 	Comp_Chipno() 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
 
	ret=PORT_RW(COMP_CHIPNO,send_buffer,rece_buffer); 
	if (ret!=True)	 
		return ret; 
 
	return True; 
} 
 
/******************************************************************************/ 
/*	产生支付密码对照表,入口参数:ICMM 
				    ACCU,SERVICE,DATE,TICKET_NUM_B,TICKET_NUM_E	 
	 		   出口参数:PAY_CODE				      */ 
/******************************************************************************/ 
int 	Iczfmm(char *ICMM,char *ACCU,char *SERVICE,char *DATE, 
	       char *TICKET_NUM_B,char *TICKET_NUM_E,char *PAY_CODE) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
	char accu[ACCU_LEN]; 
	char PADDING[PADDING_LEN]; 
	 
	ret=Comp_Chipno(); 
	if (ret!=True)	 
		return 99; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
	memset(accu,0,ACCU_LEN); 
 
	/*	填充0		*/ 
	memset(PADDING,'0',PADDING_LEN); 
 
	/*	过滤帐号	*/ 
	ACCU_accu(ACCU,accu); 
 
	strcat(send_buffer,PADDING); 
	strcat(send_buffer,ICMM); 
	strcat(send_buffer,accu); 
	strcat(send_buffer,SERVICE); 
	strcat(send_buffer,DATE); 
	strcat(send_buffer,TICKET_NUM_B); 
	strcat(send_buffer,TICKET_NUM_E); 
 
	ret=PORT_RW(ICZFMM,send_buffer,rece_buffer); 
	if (ret!=True)	 
		return ret; 
 
	strncpy(PAY_CODE,rece_buffer,ICZFMM_LEN); 
 
	return True; 
} 
 
/******************************************************************************/ 
/*	ACE平台产生支付密码对照表,入口参数:ICMM,ACCU,PLAIN_TXT 
	PLAIN_TXT包括 SERVICE,DATE,TICKET_NUM_B,TICKET_NUM_E	 
	 		          出口参数:PAY_CODE			      */ 
/******************************************************************************/ 
int 	ACE_Iczfmm(char *ICMM, char *ACCU,char *PLAIN_TXT,char *PAY_CODE) 
{ 
	int ret; 
	char send_buffer[PACKLEN]; 
	char rece_buffer[PACKLEN]; 
	char accu[ACCU_LEN]; 
	char PADDING[PADDING_LEN]; 
	 
	ret=Comp_Chipno(); 
	if (ret!=True)	 
		return 99; 
 
	memset(send_buffer,0,PACKLEN); 
	memset(rece_buffer,0,PACKLEN); 
	memset(accu,0,ACCU_LEN); 
 
	/*	填充0		*/ 
	memset(PADDING,'0',PADDING_LEN); 
 
	/*	过滤帐号	*/ 
	ACCU_accu(ACCU,accu); 
 
	strcat(send_buffer,PADDING); 
	strcat(send_buffer,ICMM); 
	strcat(send_buffer,accu); 
	strcat(send_buffer,PLAIN_TXT); 
 
	ret=PORT_RW(ICZFMM,send_buffer,rece_buffer); 
	if (ret!=True)	 
		return ret; 
 
	strncpy(PAY_CODE,rece_buffer,ICZFMM_LEN); 
 
	return True; 
} 
/*	过滤帐号				*/ 
ACCU_accu(char *inbuf,char outbuf[32]) 
{ 
	int i,j; 
	 
	j=0; 
	memset(outbuf,'0',32); 
 
	for(i=strlen(inbuf)-1;i>=0;i--) 
	  if (inbuf[i]>='0'&&inbuf[i]<='9') 
	  { 
		outbuf[31-j]=inbuf[i]; 
		j++; 
	  } 
	 
	return; 
} 
 
/*				*/ 
fillamt(char *inbuf,char outbuf[16]) 
{ 
	int i,j; 
	 
	j=0; 
	memset(outbuf,'0',16); 
	for(i=strlen(inbuf)-1;i>=0;i--) 
	  if (inbuf[i]>='0'&&inbuf[i]<='9') 
	  { 
		outbuf[15-j]=inbuf[i]; 
		j++; 
	  } 
	 
	return; 
} 
 
/*				*/ 
fillzfmm(char *inbuf,char outbuf[20]) 
{ 
	int i,j; 
	 
	j=0; 
	memset(outbuf,'0',20); 
 
	for(i=strlen(inbuf)-1;i>=0;i--) 
	  if (inbuf[i]>='0'&&inbuf[i]<='9') 
	  { 
		outbuf[19-j]=inbuf[i]; 
		j++; 
	  } 
	 
	return; 
}