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; }