/*PB3.0系统自动生成demo源码文件*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <string.h>
#include <signal.h>
#include <setjmp.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <dirent.h>
#include <ctype.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include "pbconstval.h"
#include "pberrlog.h"
#include "pbstructdef.h"
#include "atmi.h" /* TUXEDO Header File */
#include "stdarg.h"
EXEC SQL INCLUDE "pbdbfunc.h";
void hex2str1( char *sSrc, char *sDest, int nSrcLen );
void str2hex1( char *sSrc, char *sDest, int nSrcLen );
/**
* 解密
* input:
* pinblock 16位ASCII(8位16进制数), 0x44 ,0x33 ... (2位变4位 4433)
* acc19 19位ascii账号
* output:
* mingwen 16位明文
* return: 0-成功;<0-失败
*/
int Data_decry(char* pinblock,char *acc19,char *mingwen)
{
EXEC SQL BEGIN DECLARE SECTION;
char note1[256+1];
char pik[32+1];
EXEC SQL END DECLARE SECTION;
int i,len,len1,len2,iret=-1,iret1;
char ip[15+1];
char port[6+1];
char index[4+1];
char piklen[2+1];
char acc12[16+1];
char in[100+1];
unsigned char hin[100+1];
char out[50+1];
unsigned char hout[50+1];
char *p,*p1;
char mingwen1[50+1];
char mingwen2[50+1];
char mingwen3[50+1];
memset(ip,0x00,sizeof(ip));
memset(port,0x00,sizeof(port));
memset(index,0x00,sizeof(index));
memset(piklen,0x00,sizeof(piklen));
memset(pik,0x00,sizeof(pik));
memset(acc12,0x00,sizeof(acc12));
memset(in,0x00,sizeof(in));
memset(hin,0x00,sizeof(hin));
memset(out,0x00,sizeof(out));
memset(hout,0x00,sizeof(hout));
len=strlen(acc19);
if(len!=19){
WriteLog(ERR_LVL,"acc19 is not 19 length![%d]",len);
return iret;
}
len=strlen(pinblock);
if(len!=16){
WriteLog(ERR_LVL,"pinblock is not 16 length![%d]",len);
return iret;
}
iret1=str12right2left(acc19,acc12,12,1);
if(iret1!=0){
WriteLog(ERR_LVL,"acc19 transfor acc12 fail![%d]",iret1);
return iret;
}
EXEC SQL SELECT NOTE1,secretkey into :note1,:pik
FROM t_pb_busi_sys_cfg
WHERE areano="000000"
AND chnlno="001"
AND busitype="001";
if(SQLCODE!=0)
{
WriteLog(ERR_LVL,"select note1 from t_pb_busi_sys_cfg err![%s][%ld]!",SQLMSG,SQLCODE);
return iret;
}
trim(note1);
/* note1组成:
ip:port:加密机索引:pik长度:pik 参考文档:SJL05金融数据加密机程序员手册.doc 解密PIN<0x0422>
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen,pik);
*/
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen);
trim(ip);
trim(port);
trim(index);
trim(piklen);
if(strlen(ip)==0)
{
WriteLog(ERR_LVL,"ip err![%s][%d]!",ip,strlen(ip));
return iret;
}
if(strlen(port)==0)
{
WriteLog(ERR_LVL,"port err![%s][%d]!",port,strlen(port));
return iret;
}
if(strlen(index)==0)
{
WriteLog(ERR_LVL,"index err![%s][%d]!",index,strlen(index));
return iret;
}
if(strlen(piklen)==0)
{
WriteLog(ERR_LVL,"piklen err![%s][%d]!",piklen,strlen(piklen));
return iret;
}
trim(pik);
if(strlen(pik)==0)
{
WriteLog(ERR_LVL,"pik err![%s][%d]!",pik,strlen(pik));
return iret;
}
//拼接数据
sprintf(in,"%s","0422");
p=strcat(in,index);
p=strcat(in,pinblock);
p=strcat(in,acc12);
p=strcat(in,piklen);
p=strcat(in,pik);
iret1=str2hex(in,hin,strlen(in));
if(iret1!=0)
{
WriteLog(ERR_LVL,"in transfor hin fail![%s][%d]!",in,iret1);
return iret;
}
iret1=sendrecv((strlen(in)/2+strlen(in)%2),hin,hout,ip,port);
if(iret1!=0)
{
WriteLog(ERR_LVL,"sendrecv fail![%d]",iret1);
return iret;
}
p1=&mingwen1[0];
iret1=hex2str(hout,&p1,9);
p1=mingwen1;
memset(mingwen2,0x00,sizeof(mingwen2));
memset(mingwen3,0x00,sizeof(mingwen3));
WriteLog(ERR_LVL,"[%s]!",mingwen1);
memcpy( mingwen2,mingwen1+2,2);
memcpy( mingwen3,mingwen1+4,atoi(mingwen2));
memcpy(mingwen,mingwen3,strlen(mingwen3));
return 0;
}
/**
* 加密
* input:
* mingwen 6位明文
* acc19 19位ascii账号
* output:
* pinblock 16位ASCII(8位16进制数), 0x44 ,0x33 ... (2位变4位 4433)
* return: 0-成功;<0-失败
*/
int Data_encry(char* pinblock,char *acc19,char *mingwen){
EXEC SQL BEGIN DECLARE SECTION;
char note1[256+1];
char pik[32+1];
EXEC SQL END DECLARE SECTION;
int len,len1,len2,iret=-1,iret1;
char ip[15+1];
char port[6+1];
char index[4+1];
char piklen[2+1];
char acc12[16+1];
char acc[19+1];
char in[100+1];
unsigned char hin[100+1];
char out[50+1];
unsigned char hout[50+1];
char *p,*p1;
char mingwen0[50+1];
char mingwen1[50+1];
char mingwen2[50+1];
char mingwen3[50+1];
memset(ip,0x00,sizeof(ip));
memset(port,0x00,sizeof(port));
memset(index,0x00,sizeof(index));
memset(piklen,0x00,sizeof(piklen));
memset(pik,0x00,sizeof(pik));
memset(acc12,0x00,sizeof(acc12));
memset(in,0x00,sizeof(in));
memset(hin,0x00,sizeof(hin));
memset(out,0x00,sizeof(out));
memset(hout,0x00,sizeof(hout));
len=strlen(acc19);
if(len!=19){
WriteLog(ERR_LVL,"acc19 is not 19 length![%d]",len);
return iret;
}
len=strlen(mingwen);
if(len!=6){
WriteLog(ERR_LVL,"mingwen is not 6 length![%d]",len);
return iret;
}
memset(acc,0x00,sizeof(acc));
memcpy(acc,acc19,strlen(acc19));
memset(mingwen0,0x00,sizeof(mingwen0));
memcpy(mingwen0,mingwen,strlen(mingwen));
memset(mingwen1,0x00,sizeof(mingwen1));
getPinBlock98(mingwen0,acc,mingwen1);
WriteLog(ERR_LVL,"getPinBlock98 is [%s]",mingwen1);
EXEC SQL SELECT NOTE1,secretkey into :note1,:pik
FROM t_pb_busi_sys_cfg
WHERE areano="000000"
AND chnlno="001"
AND busitype="001";
if(SQLCODE!=0){
WriteLog(ERR_LVL,"select note1 from t_pb_busi_sys_cfg err![%s][%ld]!",SQLMSG,SQLCODE);
return iret;
}
trim(note1);
/* note1组成:
ip:port:加密机索引:pik长度:pik 参考文档:SJL05金融数据加密机程序员手册.doc 解密PIN<0x0422>
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen,pik);
*/
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen);
trim(ip);
trim(port);
trim(index);
trim(piklen);
if(strlen(ip)==0){
WriteLog(ERR_LVL,"ip err![%s][%d]!",ip,strlen(ip));
return iret;
}
if(strlen(port)==0){
WriteLog(ERR_LVL,"port err![%s][%d]!",port,strlen(port));
return iret;
}
if(strlen(index)==0){
WriteLog(ERR_LVL,"index err![%s][%d]!",index,strlen(index));
return iret;
}
if(strlen(piklen)==0){
WriteLog(ERR_LVL,"piklen err![%s][%d]!",piklen,strlen(piklen));
return iret;
}
trim(pik);
if(strlen(pik)==0){
WriteLog(ERR_LVL,"pik err![%s][%d]!",pik,strlen(pik));
return iret;
}
//拼接数据
sprintf(in,"%s","0405");
p=strcat(in,index);
p=strcat(in,"01");
p=strcat(in,piklen);
p=strcat(in,pik);
p=strcat(in,mingwen1);
iret1=str2hex(in,hin,strlen(in));
if(iret1!=0){
WriteLog(ERR_LVL,"in transfor hin fail![%s][%d]!",in,iret1);
return iret;
}
iret1=sendrecv((strlen(in)/2+strlen(in)%2),hin,hout,ip,port);
if(iret1!=0){
WriteLog(ERR_LVL,"sendrecv fail![%d]",iret1);
return iret;
}
memset(mingwen2,0x00,sizeof(mingwen2));
p1=&mingwen2[0];
hex2str(hout,&p1,9);
p1=mingwen2;
memset(mingwen3,0x00,sizeof(mingwen3));
WriteLog(ERR_LVL,"[%s]!",mingwen2);
memcpy( mingwen3,mingwen2+2,strlen(mingwen2)-2);
memcpy(pinblock,mingwen3,strlen(mingwen3));
return 0;
}
/**
* 解密
* input:
* pinblock 16位ASCII(8位16进制数), 0x44 ,0x33 ... (2位变4位 4433)
* acc19 19位ascii账号
* output:
* mingwen 6位明文
* return: 0-成功;<0-失败
*/
int Data_decry_new(char* pinblock,char *acc19,char *mingwen){
EXEC SQL BEGIN DECLARE SECTION;
char note1[256+1];
char pik[100+1];
EXEC SQL END DECLARE SECTION;
int i,len,len1,len2,iret=-1,iret1;
char ip[15+1];
char port[6+1];
char index[4+1];
char KeyType[3+1];
char PINFormat[2+1];
char piklen[2+1];
char acc12[16+1];
char zmk[32+1];
char zpk[32+1];
char lzpk[32+1];
char scheme[1+1];
char CheckValue[6+1];
char in[200+1];
unsigned char hin[200+1];
char out[100+1];
unsigned char hout[100+1];
char *p,*p1;
char mingwen1[50+1];
char mingwen2[50+1];
char mingwen3[50+1];
char slen[10+1];
char slen1[10+1];
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memset(CheckValue,0x00,sizeof(CheckValue));
memset(PINFormat,0x00,sizeof(PINFormat));
memset(scheme,0x00,sizeof(scheme));
memset(zmk,0x00,sizeof(zmk));
memset(zpk,0x00,sizeof(zpk));
memset(lzpk,0x00,sizeof(lzpk));
memset(ip,0x00,sizeof(ip));
memset(port,0x00,sizeof(port));
memset(index,0x00,sizeof(index));
memset(piklen,0x00,sizeof(piklen));
memset(pik,0x00,sizeof(pik));
memset(acc12,0x00,sizeof(acc12));
memset(in,0x00,sizeof(in));
memset(hin,0x00,sizeof(hin));
memset(out,0x00,sizeof(out));
memset(hout,0x00,sizeof(hout));
len=strlen(acc19);
if(len!=19){
WriteLog(ERR_LVL,"acc19 is not 19 length![%d]",len);
return iret;
}
len=strlen(pinblock);
if(len!=16){
WriteLog(ERR_LVL,"pinblock is not 16 length![%d]",len);
return iret;
}
iret1=str12right2left1(acc19,acc12,12,1);
if(iret1!=0){
WriteLog(ERR_LVL,"acc19 transfor acc12 fail![%d]",iret1);
return iret;
}
EXEC SQL SELECT NOTE1,secretkey into :note1,:pik
FROM t_pb_busi_sys_cfg
WHERE areano="000000"
AND chnlno="001"
AND busitype="001";
if(SQLCODE!=0)
{
WriteLog(ERR_LVL,"select note1 from t_pb_busi_sys_cfg err![%s][%ld]!",SQLMSG,SQLCODE);
return iret;
}
trim(note1);
/* note1组成:
ip:port:加密机索引:pik长度:pik 参考文档:SJL05金融数据加密机程序员手册.doc 解密PIN<0x0422>
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen,pik);
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen );
ip:port:KeyType:PINFormat:scheme
参考文档:SJL05金融数据加密机程序员手册.doc 3.1.22 导入密钥(即密钥由ZMK保护转为LMK保护)<A6>
3.2.3 请求转换PINBlock 从ZPK到LMK<JE>
*/
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,KeyType,PINFormat,scheme );
trim(scheme);
if(strlen(scheme)==0)
{
WriteLog(ERR_LVL,"scheme err![%s][%d]!",scheme,strlen(scheme));
return iret;
}
trim(ip);
trim(port);
trim(KeyType);
trim(PINFormat);
trim(scheme);
if(strlen(ip)==0)
{
WriteLog(ERR_LVL,"ip err![%s][%d]!",ip,strlen(ip));
return iret;
}
if(strlen(port)==0)
{
WriteLog(ERR_LVL,"port err![%s][%d]!",port,strlen(port));
return iret;
}
if(strlen(KeyType)==0)
{
WriteLog(ERR_LVL,"KeyType err![%s][%d]!",KeyType,strlen(KeyType));
return iret;
}
if(strlen(PINFormat)==0)
{
WriteLog(ERR_LVL,"PINFormat err![%s][%d]!",PINFormat,strlen(PINFormat));
return iret;
}
trim(pik);
if(strlen(pik)==0)
{
WriteLog(ERR_LVL,"pik err![%s][%d]!",pik,strlen(pik));
return iret;
}
if(strcmp(scheme,"U")==0){
sscanf(pik,"%[^:]:%[^:]:%[^:]",zmk,zpk,lzpk );
}else{
sscanf(pik,"%[^:]:%[^:]:%[^:]:%[^:]",zmk,zpk,lzpk,CheckValue );
trim(CheckValue);
if(strlen(CheckValue)==0)
{
WriteLog(ERR_LVL,"CheckValue err![%s][%d]!",CheckValue,strlen(CheckValue));
return iret;
}
}
trim(zmk);
if(strlen(zmk)==0)
{
WriteLog(ERR_LVL,"zmk err![%s][%d]!",zmk,strlen(zmk));
return iret;
}
trim(lzpk);
if(strlen(lzpk)==0)
{
WriteLog(ERR_LVL,"lzpk err![%s][%d]!",lzpk,strlen(lzpk));
return iret;
}
trim(zpk);
if(strlen(zpk)==0)
{
WriteLog(ERR_LVL,"zpk err![%s][%d]!",zpk,strlen(zpk));
return iret;
}
//拼接数据
//A6
/*
sprintf(in,"%s","A6");
p=strcat(in,KeyType);
p=strcat(in,scheme);
p=strcat(in,zmk);
p=strcat(in,scheme);
p=strcat(in,zpk);
p=strcat(in,scheme);
if(strcmp(scheme,"U")==0){
}else{
p=strcat(in,";");
p=strcat(in,CheckValue);
}
len=strlen(in);
sprintf(slen,"%04x",len);
iret1=str2hex(slen,slen1,strlen(slen));
if(iret1!=0)
{
WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
return iret;
}
memcpy(hin,slen1,2);
memcpy(hin+2,in,len);
iret1=sendrecv1((len+2),hin,hout,ip,port);
if(iret1!=0)
{
WriteLog(ERR_LVL,"A6 sendrecv fail![%d]",iret1);
return iret;
}
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memcpy(slen,hout,2);
p1=&slen1[0];
iret1=hex2str(slen,&p1,2);
p1=slen1;
len=hex2int(slen1);
memset(out,0x00,sizeof(out));
memcpy(out,hout+2,len);
if(memcmp(out,"A7",2)!=0){
WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6> fail![%s]",out);
return iret;
}
if(memcmp(out+2,"12",2)==0){
WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6> fail 用户存储区中无密钥 ![%s]",out);
}
if(memcmp(out+2,"13",2)==0){
WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6> fail!本地主密钥错[%s]",out);
}
if(memcmp(out+2,"15",2)==0){
WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6> fail!输入数据错误[%s]",out);
}
if(memcmp(out+2,"21",2)==0){
WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6> fail!无效的用户存储区索引[%s]",out);
}
if(memcmp(out+2,"00",2)!=0){
WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6> fail![%s]",out);
return iret;
}
*/
//拼接数据
//JE
memset(in,0x00,sizeof(in));
memset(hin,0x00,sizeof(hin));
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memset(hout,0x00,sizeof(hout));
sprintf(in,"%s","JE");
p=strcat(in,scheme);
p=strcat(in,lzpk);
p=strcat(in,pinblock);
p=strcat(in,PINFormat);
p=strcat(in,acc12);
len=strlen(in);
sprintf(slen,"%04x",len);
iret1=str2hex(slen,slen1,strlen(slen));
if(iret1!=0)
{
WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
return iret;
}
memcpy(hin,slen1,2);
memcpy(hin+2,in,len);
iret1=sendrecv1((len+2),hin,hout,ip,port);
if(iret1!=0)
{
WriteLog(ERR_LVL,"JE sendrecv fail![%d]",iret1);
return iret;
}
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memcpy(slen,hout,2);
p1=&slen1[0];
iret1=hex2str(slen,&p1,2);
p1=slen1;
len=hex2int(slen1);
WriteLog(ERR_LVL,"slen1 =[%s]",slen1);
WriteLog(ERR_LVL,"len =[%d]",len);
memset(out,0x00,sizeof(out));
memcpy(out,hout+2,len);
if(memcmp(out,"JF",2)!=0){
WriteLog(ERR_LVL,"JE 响应码 fail![%s]",hout);
return iret;
}
if(memcmp(out+2,"12",2)==0){
WriteLog(ERR_LVL,"JE fail!用户存储区中无密钥[%s]",out);
}
if(memcmp(out+2,"13",2)==0){
WriteLog(ERR_LVL,"JE fail!本地主密钥错[%s]",out);
}
if(memcmp(out+2,"15",2)==0){
WriteLog(ERR_LVL,"JE fail!输入数据错误[%s]",out);
}
if(memcmp(out+2,"20",2)==0){
WriteLog(ERR_LVL,"JE fail!PINBlock错误[%s]",out);
}
if(memcmp(out+2,"21",2)==0){
WriteLog(ERR_LVL,"JE fail!无效的用户存储区索引[%s]",out);
}
if(memcmp(out+2,"22",2)==0){
WriteLog(ERR_LVL,"JE fail!错误的主帐号数据[%s]",out);
}
if(memcmp(out+2,"23",2)==0){
WriteLog(ERR_LVL,"JE fail!错误的PINblock格式[%s]",out);
}
if(memcmp(out+2,"24",2)==0){
WriteLog(ERR_LVL,"JE fail!PIN长度错误 [%s]",out);
}
if(memcmp(out+2,"00",2)!=0){
WriteLog(ERR_LVL,"JE fail![%s]",out);
return iret;
}
memset(mingwen1,0x00,sizeof(mingwen1));
memcpy(mingwen1,out+4,7);
//拼接数据
//NG
memset(in,0x00,sizeof(in));
memset(hin,0x00,sizeof(hin));
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memset(hout,0x00,sizeof(hout));
sprintf(in,"%s","NG");
p=strcat(in,acc12);
p=strcat(in,mingwen1);
len=strlen(in);
sprintf(slen,"%04x",len);
iret1=str2hex(slen,slen1,strlen(slen));
if(iret1!=0)
{
WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
return iret;
}
memcpy(hin,slen1,2);
memcpy(hin+2,in,len);
iret1=sendrecv1((len+2),hin,hout,ip,port);
if(iret1!=0)
{
WriteLog(ERR_LVL,"NG sendrecv fail![%d]",iret1);
return iret;
}
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memcpy(slen,hout,2);
p1=&slen1[0];
iret1=hex2str(slen,&p1,2);
p1=slen1;
len=hex2int1(slen1);
memset(out,0x00,sizeof(out));
memcpy(out,hout+2,len);
if(memcmp(out,"NH",2)!=0){
WriteLog(ERR_LVL,"NG 响应码 fail![%s]",out);
return iret;
}
if(memcmp(out+2,"13",2)==0){
WriteLog(ERR_LVL,"NG fail!本地主密钥错[%s]",out);
}
if(memcmp(out+2,"14",2)==0){
WriteLog(ERR_LVL,"NG fail!输入的PIN错误[%s]",out);
}
if(memcmp(out+2,"15",2)==0){
WriteLog(ERR_LVL,"NG fail!输入数据错[%s]",out);
}
if(memcmp(out+2,"17",2)==0){
WriteLog(ERR_LVL,"NG fail!未授权处理明文PIN[%s]",out);
}
if(memcmp(out+2,"00",2)!=0){
WriteLog(ERR_LVL,"NG fail![%s]",out);
return iret;
}
memset(mingwen1,0x00,sizeof(mingwen1));
memcpy(mingwen1,out+4,7);
WriteLog(ERR_LVL,"[%s]!",mingwen1);
len=strlen(mingwen1);
for(i=0;i<len;i++){
if(mingwen1[i]=='F'){
break;
}
}
memcpy(mingwen,mingwen1,i);
return 0;
}
/**
* 加密
* input:
* mingwen 6位明文
* acc19 19位ascii账号
* output:
* pinblock 16位ASCII(8位16进制数), 0x44 ,0x33 ... (2位变4位 4433)
* return: 0-成功;<0-失败
*/
int Data_encry_new(char* pinblock,char *acc19,char *mingwen){
EXEC SQL BEGIN DECLARE SECTION;
char note1[256+1];
char pik[100+1];
EXEC SQL END DECLARE SECTION;
int i,len,len1,len2,iret=-1,iret1;
char ip[15+1];
char port[6+1];
char index[4+1];
char KeyType[3+1];
char PINFormat[2+1];
char piklen[2+1];
char acc12[16+1];
char zmk[32+1];
char zpk[32+1];
char lzpk[32+1];
char scheme[1+1];
char CheckValue[6+1];
char in[200+1];
unsigned char hin[200+1];
char out[100+1];
unsigned char hout[100+1];
char *p,*p1;
char mingwen1[50+1];
char mingwen2[50+1];
char mingwen3[50+1];
char slen[10+1];
char slen1[10+1];
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memset(CheckValue,0x00,sizeof(CheckValue));
memset(PINFormat,0x00,sizeof(PINFormat));
memset(scheme,0x00,sizeof(scheme));
memset(zmk,0x00,sizeof(zmk));
memset(zpk,0x00,sizeof(zpk));
memset(lzpk,0x00,sizeof(lzpk));
memset(ip,0x00,sizeof(ip));
memset(port,0x00,sizeof(port));
memset(index,0x00,sizeof(index));
memset(piklen,0x00,sizeof(piklen));
memset(pik,0x00,sizeof(pik));
memset(acc12,0x00,sizeof(acc12));
memset(in,0x00,sizeof(in));
memset(hin,0x00,sizeof(hin));
memset(out,0x00,sizeof(out));
memset(hout,0x00,sizeof(hout));
len=strlen(acc19);
if(len!=19){
WriteLog(ERR_LVL,"acc19 is not 19 length![%d]",len);
return iret;
}
len=strlen(mingwen);
if(len!=6){
WriteLog(ERR_LVL,"mingwen is not 6 length![%d]",len);
return iret;
}
iret1=str12right2left1(acc19,acc12,12,1);
if(iret1!=0){
WriteLog(ERR_LVL,"acc19 transfor acc12 fail![%d]",iret1);
return iret;
}
EXEC SQL SELECT NOTE1,secretkey into :note1,:pik
FROM t_pb_busi_sys_cfg
WHERE areano="000000"
AND chnlno="001"
AND busitype="001";
if(SQLCODE!=0)
{
WriteLog(ERR_LVL,"select note1 from t_pb_busi_sys_cfg err![%s][%ld]!",SQLMSG,SQLCODE);
return iret;
}
trim(note1);
/* note1组成:
ip:port:加密机索引:pik长度:pik 参考文档:SJL05金融数据加密机程序员手册.doc 解密PIN<0x0422>
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen,pik);
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen );
ip:port:KeyType:PINFormat:scheme
参考文档:SJL05金融数据加密机程序员手册.doc 3.1.22 导入密钥(即密钥由ZMK保护转为LMK保护)<A6>
3.2.3 请求转换PINBlock 从ZPK到LMK<JE>
*/
sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,KeyType,PINFormat,scheme );
trim(scheme);
if(strlen(scheme)==0)
{
WriteLog(ERR_LVL,"scheme err![%s][%d]!",scheme,strlen(scheme));
return iret;
}
trim(ip);
trim(port);
trim(KeyType);
trim(PINFormat);
trim(scheme);
if(strlen(ip)==0)
{
WriteLog(ERR_LVL,"ip err![%s][%d]!",ip,strlen(ip));
return iret;
}
if(strlen(port)==0)
{
WriteLog(ERR_LVL,"port err![%s][%d]!",port,strlen(port));
return iret;
}
if(strlen(KeyType)==0)
{
WriteLog(ERR_LVL,"KeyType err![%s][%d]!",KeyType,strlen(KeyType));
return iret;
}
if(strlen(PINFormat)==0)
{
WriteLog(ERR_LVL,"PINFormat err![%s][%d]!",PINFormat,strlen(PINFormat));
return iret;
}
trim(pik);
if(strlen(pik)==0)
{
WriteLog(ERR_LVL,"pik err![%s][%d]!",pik,strlen(pik));
return iret;
}
if(strcmp(scheme,"U")==0){
sscanf(pik,"%[^:]:%[^:]:%[^:]",zmk,zpk,lzpk );
}else{
sscanf(pik,"%[^:]:%[^:]:%[^:]:%[^:]",zmk,zpk,lzpk,CheckValue );
trim(CheckValue);
if(strlen(CheckValue)==0)
{
WriteLog(ERR_LVL,"CheckValue err![%s][%d]!",CheckValue,strlen(CheckValue));
return iret;
}
}
trim(zmk);
if(strlen(zmk)==0)
{
WriteLog(ERR_LVL,"zmk err![%s][%d]!",zmk,strlen(zmk));
return iret;
}
trim(lzpk);
if(strlen(lzpk)==0)
{
WriteLog(ERR_LVL,"lzpk err![%s][%d]!",lzpk,strlen(lzpk));
return iret;
}
trim(zpk);
if(strlen(zpk)==0)
{
WriteLog(ERR_LVL,"zpk err![%s][%d]!",zpk,strlen(zpk));
return iret;
}
//拼接数据
//BA
memset(mingwen1,0x00,sizeof(mingwen1));
memcpy(mingwen1,mingwen,6);
p=strcat(mingwen1,"F");
sprintf(in,"%s","BA");
p=strcat(in,mingwen1);
p=strcat(in,acc12);
len=strlen(in);
sprintf(slen,"%04x",len);
iret1=str2hex(slen,slen1,strlen(slen));
if(iret1!=0)
{
WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
return iret;
}
memcpy(hin,slen1,2);
memcpy(hin+2,in,len);
iret1=sendrecv1((len+2),hin,hout,ip,port);
if(iret1!=0)
{
WriteLog(ERR_LVL,"BA sendrecv fail![%d]",iret1);
return iret;
}
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memcpy(slen,hout,2);
p1=&slen1[0];
iret1=hex2str(slen,&p1,2);
p1=slen1;
len=hex2int(slen1);
memset(out,0x00,sizeof(out));
memcpy(out,hout+2,len);
if(memcmp(out,"BB",2)!=0){
WriteLog(ERR_LVL,"BA 响应码 fail![%s]",out);
return iret;
}
if(memcmp(out+2,"13",2)==0){
WriteLog(ERR_LVL,"BA fail!本地主密钥错[%s]",out);
}
if(memcmp(out+2,"15",2)==0){
WriteLog(ERR_LVL,"BA fail!输入数据错[%s]",out);
}
if(memcmp(out+2,"17",2)==0){
WriteLog(ERR_LVL,"BA fail!未授权处理明文PIN[%s]",out);
}
if(memcmp(out+2,"00",2)!=0){
WriteLog(ERR_LVL,"BA fail![%s]",out);
return iret;
}
memset(mingwen1,0x00,sizeof(mingwen1));
memcpy(mingwen1,out+4,7);
//拼接数据
//JG
memset(in,0x00,sizeof(in));
memset(hin,0x00,sizeof(hin));
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memset(hout,0x00,sizeof(hout));
sprintf(in,"%s","JG");
p=strcat(in,scheme);
p=strcat(in,lzpk);
p=strcat(in,PINFormat);
p=strcat(in,acc12);
p=strcat(in,mingwen1);
len=strlen(in);
sprintf(slen,"%04x",len);
iret1=str2hex(slen,slen1,strlen(slen));
if(iret1!=0)
{
WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
return iret;
}
memcpy(hin,slen1,2);
memcpy(hin+2,in,len);
iret1=sendrecv1((len+2),hin,hout,ip,port);
if(iret1!=0)
{
WriteLog(ERR_LVL,"JG sendrecv fail![%d]",iret1);
return iret;
}
memset(slen,0x00,sizeof(slen));
memset(slen1,0x00,sizeof(slen1));
memcpy(slen,hout,2);
p1=&slen1[0];
iret1=hex2str(slen,&p1,2);
p1=slen1;
len=hex2int(slen1);
WriteLog(ERR_LVL,"slen1 =[%s]",slen1);
WriteLog(ERR_LVL,"len =[%d]",len);
memset(out,0x00,sizeof(out));
memcpy(out,hout+2,len);
if(memcmp(out,"JH",2)!=0){
WriteLog(ERR_LVL,"JG 响应码 fail![%s]",hout);
return iret;
}
if(memcmp(out+2,"13",2)==0){
WriteLog(ERR_LVL,"JG fail!本地主密钥错[%s]",out);
}
if(memcmp(out+2,"14",2)==0){
WriteLog(ERR_LVL,"JG fail!输入的PIN错误[%s]",out);
}
if(memcmp(out+2,"15",2)==0){
WriteLog(ERR_LVL,"JG fail!输入数据错误[%s]",out);
}
if(memcmp(out+2,"21",2)==0){
WriteLog(ERR_LVL,"JG fail!无效的用户存储区索引[%s]",out);
}
if(memcmp(out+2,"23",2)==0){
WriteLog(ERR_LVL,"JG fail!错误的PINblock格式[%s]",out);
}
if(memcmp(out+2,"24",2)==0){
WriteLog(ERR_LVL,"JG fail!PIN长度错误[%s]",out);
}
if(memcmp(out+2,"00",2)!=0){
WriteLog(ERR_LVL,"JG fail![%s]",out);
return iret;
}
memset(mingwen1,0x00,sizeof(mingwen1));
memcpy(mingwen1,out+4,16);
WriteLog(ERR_LVL,"[%s]!",mingwen1);
memcpy(pinblock,mingwen1,strlen(mingwen1));
return 0;
}
/**
* getPinBlock98
* 标准ANSI X9.8 Format(带主帐号信息)的PIN BLOCK计算
* PIN BLOCK 格式等于 PIN 按位异或 主帐号;
* @in param pPin String
* @in param pCardno String
* @out param pPinBlock String
* @return int
*/
int getPinBlock98(char * pPin, char * pCardno, char * pPinBlock)
{
unsigned char arrAccno[9];
unsigned char arrPin[9];
unsigned char arrRet[9];
unsigned char sAccno[17];
unsigned char sPin[17];
int i;
memset(arrAccno, 0x00, sizeof(arrAccno));
memset(arrPin, 0x00, sizeof(arrPin));
memset(arrRet, 0x00, sizeof(arrRet));
memset(sAccno, 0x00, sizeof(sAccno));
str12right2left(pCardno, sAccno,12,1);
str2hex1(sAccno, arrAccno, 16);
memset(sPin, 0x00, sizeof(sPin));
getHPin98(pPin, sPin);
str2hex1(sPin, arrPin, 16);
memset(arrRet, 0x00, sizeof(arrRet));
//PIN BLOCK 格式等于 PIN 按位异或 主帐号;
for (i = 0; i < 8; i++) {
arrRet[i] = (unsigned char) (arrPin[i] ^ arrAccno[i]);
}
hex2str1(arrRet, pPinBlock, 8);
return 0;
}
/**
* getHPin98
* 对密码进行转换
* PIN格式
* BYTE 1 PIN的长度
* BYTE 2 – BYTE 3/4/5/6/7 4--12个PIN(每个PIN占4个BIT)
* BYTE 4/5/6/7/8 – BYTE 8 FILLER “F” (每个“F“占4个BIT)
* @in param pin String
* @out param pPinOut String
* @return int
*/
int getHPin98(char * pin, char * pPinOut)
{
unsigned char arrPin[7];
unsigned char encode[9];
unsigned char sEncode[17];
memset(arrPin, 0x00, sizeof(arrPin));
memcpy(arrPin, pin, 6);
memset(encode, 0x00, sizeof(encode));
encode[0] = 0x06;
str2hex1(arrPin, (char *) &(encode[1]), 6 );
encode[4] = 0xFF;
encode[5] = 0xFF;
encode[6] = 0xFF;
encode[7] = 0xFF;
hex2str1(encode, pPinOut, 8);
return 0;
}
void hex2str1( char *sSrc, char *sDest, int nSrcLen )
{
int i;
char szTmp[3];
for( i = 0; i < nSrcLen; i++ )
{
sprintf( szTmp, "%02X", (unsigned char) sSrc[i] );
memcpy( &sDest[i * 2], szTmp, 2 );
}
return ;
}
void str2hex1( char *sSrc, char *sDest, int nSrcLen )
{
int i, nHighBits, nLowBits;
for( i = 0; i < nSrcLen; i += 2 )
{
nHighBits = sSrc[i];
nLowBits = sSrc[i + 1];
if( nHighBits > 0x39 )
nHighBits -= 0x37;
else
nHighBits -= 0x30;
if( i == nSrcLen - 1 )
nLowBits = 0;
else if( nLowBits > 0x39 )
nLowBits -= 0x37;
else
nLowBits -= 0x30;
sDest[i / 2] = (nHighBits << 4) | (nLowBits & 0x0f);
}
return ;
}
int sendrecv(int len, unsigned char *bufin,unsigned char *bufout,char *ip,char *port)
{
int client_sockfd;
int len1,iret=-1;
struct sockaddr_in remote_addr; //服务器端网络地址结构体
memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
remote_addr.sin_family=AF_INET; //设置为IP通信
remote_addr.sin_addr.s_addr=inet_addr(ip);//服务器IP地址
remote_addr.sin_port=htons(atoi(port)); //服务器端口号
/*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/
if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
WriteLog(ERR_LVL,"socket err");
return iret;
}
/*将套接字绑定到服务器的网络地址上*/
if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
{
WriteLog(ERR_LVL,"connect err");
perror("connect");
return iret;
}
WriteLog(ERR_LVL,"connected to server");
len1=send(client_sockfd,bufin,len,0);
if(len1<0){
close(client_sockfd);//关闭套接字
WriteLog(ERR_LVL,"send err %d",len1);
return iret;
}
len1=recv(client_sockfd,bufout,BUFSIZ,0);
if(len1<0){
close(client_sockfd);//关闭套接字
WriteLog(ERR_LVL,"recv err %d",len1);
return iret;
}
close(client_sockfd);//关闭套接字
if( bufout[0] == 'E' ){
WriteLog(ERR_LVL,"unpin err [%x]",bufout[1]);
return iret;
}
return 0;
}
int sendrecv1(int len, unsigned char *bufin,unsigned char *bufout,char *ip,char *port)
{
int client_sockfd;
int len1,iret=-1;
struct sockaddr_in remote_addr; //服务器端网络地址结构体
memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
remote_addr.sin_family=AF_INET; //设置为IP通信
remote_addr.sin_addr.s_addr=inet_addr(ip);//服务器IP地址
remote_addr.sin_port=htons(atoi(port)); //服务器端口号
/*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/
if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
WriteLog(ERR_LVL,"socket err");
return iret;
}
/*将套接字绑定到服务器的网络地址上*/
if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
{
WriteLog(ERR_LVL,"connect err");
perror("connect");
return iret;
}
WriteLog(ERR_LVL,"connected to server");
len1=send(client_sockfd,bufin,len,0);
if(len1<0){
close(client_sockfd);//关闭套接字
WriteLog(ERR_LVL,"send err %d",len1);
return iret;
}
len1=recv(client_sockfd,bufout,BUFSIZ,0);
if(len1<0){
close(client_sockfd);//关闭套接字
WriteLog(ERR_LVL,"recv err %d",len1);
return iret;
}
close(client_sockfd);//关闭套接字
WriteLog(ERR_LVL,"len1 = %d",len1);
/*
if( bufout[0] == 'E' ){
WriteLog(ERR_LVL,"unpin err [%x]",bufout[1]);
return iret;
}
*/
return 0;
}
int hex2int1(char *s){
int i=0,len,sum=0;
char s1[1+1];
len=strlen(s);
for(i=0;i<len;i++){
memset(s1,0x00,sizeof(s1));
memcpy(s1,s+i,1);
if(s1[0]>='0'&&s1[0]<='9')
sum+=(atoi(s1)*powerXY(16,len-1-i));
else if(s1[0]>='a'&&s1[0]<='z')
sum+=((s1[0]-'a'+10)*powerXY(16,len-1-i));
else
sum+=((s1[0]-'A'+10)*powerXY(16,len-1-i));
}
return sum;
}
int powerXY(int x,int y){
if(y==0)return 1;
else return x*powerXY(x,y-1);
}
int hex2int(char *s){
int i,t,sum=0;
for(i=0;i<strlen(s);i++){
if(s[i]<='9')t=s[i]-'0';
else if(s[i]>='a'&&s[i]<='f')t=s[i]-'a'+10;
else t=s[i]-'A'+10;
sum=sum*16+t;
}
return sum;
}
unsigned char ascii_table[16] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
void hex2asc(unsigned char dat, unsigned char **new)
**new = ascii_table[dat >> 4];
*new += 1;
**new = ascii_table[dat & 0x0f];
*new += 1;
}
int asc2hex(unsigned char dat, unsigned char *new)
{
if ((dat >= '0') && (dat <= '9'))
*new = dat - '0';
else if ((dat >= 'A') && (dat <= 'F'))
*new = dat - 'A' + 10;
else if ((dat >= 'a') && (dat <= 'f'))
*new = dat - 'a' + 10;
else
return -1;
return 0;
}
int hex2str(unsigned char *read, unsigned char **write, int len)
{
while (len--)
hex2asc(*read++, write);
return 0;
}
int str2hex(unsigned char *read, unsigned char *write, int len)
{
unsigned char dat;
while (len--) {
if (asc2hex(*read++, &dat))
return -1;
*write = *write << 4 | dat;
if (!(len & 1)) {
++write;
}
}
return 0;
}
int str12right2left(unsigned char *read, unsigned char *write, int len,int begin){
int len1=strlen(read);
if(len1!=19)return -1;
if(len1<begin)return -1;
if(len1<len)return -1;
int i=0;
while (len>=-3) {
if((len-1+4)==0||(len-1+4)==1||(len-1+4)==2||(len-1+4)==3){
write[len-1+4]='0';
}else{
write[len-1+4]=read[len1-1-begin-i];
}
len--;i++;
}
return 0;
}
int str12right2left1(unsigned char *read, unsigned char *write, int len,int begin){
int len1=strlen(read);
if(len1!=19)return -1;
if(len1<begin)return -1;
if(len1<len)return -1;
int i=0;
while (len>0) {
write[len-1]=read[len1-1-begin-i];
len--;i++;
}
return 0;
}
PasswordEncrypted
最新推荐文章于 2023-10-31 10:28:44 发布