//按照通用接口规范进行封装各自银行的接口 int Bank_QueryBalance(INNER_TRANS_REQUEST * pNode,double *balance) { int ret=0; INNER_TRANS_REQUEST from_pos; BANK_TRANS_REQUEST BankReqPak; BANK_TRANS_REQUEST BankAnsPak; memset(&from_pos,0,sizeof from_pos); memset(&BankReqPak,0,sizeof BankReqPak); memset(&BankAnsPak,0,sizeof BankAnsPak); memcpy(&from_pos,pNode,sizeof(from_pos)); //组织银行包 //写交易代码 memcpy( BankReqPak.TradeCode,TRADE_BANK_QUERY, BANK_TRADE_CODE_LEN); //写交易日期和交易时间 getsysdate(BankReqPak.TradeDate); getsystime(BankReqPak.TradeTime); //memcpy(BankReqPak.TradeDate,from_pos.TradeDate,sizeof(BankReqPak.TradeDate)); //memcpy(BankReqPak.TradeTime,from_pos.TradeTime,sizeof(BankReqPak.TradeTime)); //写银行卡号字段 //sprintf(BankReqPak.BankCardNo,"%-20s","1030399110000001042"); //写银行卡号字段 sprintf(BankReqPak.BankCardNo,"%-20s",from_pos.BankCardNo); //写银行卡密码字段 //通过16进制格式传输,再解密 //dec2hex(from_pos.BankCardPwd, (unsigned char*)BankReqPak.BankCardPwd, 8); //dec2hex((unsigned char*)from_pos.BankCardPwd,8,(char*)BankReqPak.BankCardPwd); memcpy(BankReqPak.BankCardPwd,from_pos.BankCardPwd,sizeof(BankReqPak.BankCardPwd)); #if 1 char buffer[100]=""; int k=0; for(int i=0;i<16;i++) { k=(unsigned char)BankReqPak.BankCardPwd[i]; sprintf(&buffer[2*i],"%02X",k); } writelog(LOG_INFO,"BankCardNo=[%s],BankCardPwd=[%s]",BankReqPak.BankCardNo,BankReqPak.BankCardPwd); writelog(LOG_INFO,"BankCardNo=[%s],fromCardPwd=[%s]",BankReqPak.BankCardNo,from_pos.BankCardPwd); #endif //写校园端流水号 sprintf(BankReqPak.CustSn,"%-8f",0); //写院校代码 sprintf(BankReqPak.CustNo,"%-16s",SCHOOL_CODE); BankReqPak.AutoFlag='0'; //写校验mac码 generate_mac((char*)(&BankReqPak),sizeof(BankReqPak),BankReqPak.MAC); //memcpy(SockNode.Buf,&BankReqPak,sizeof(BankReqPak)); TRACE_BANK_TRANS(&BankReqPak,"send query bank package"); ret=send_to_and_recv_from_bank(BANK_NYYH,(char*)(&BankReqPak),sizeof(BankReqPak),(char*)(&BankAnsPak),sizeof(BankAnsPak),&g_Bank); if(ret) { writelog(LOG_ERR,"send_to_and_recv_from_bank error,errcode=[%d]",ret); return E_TRANS_BANK_NOANSWER; } TRACE_BANK_TRANS(&BankAnsPak,"receivce query bank package"); //农行暂时未校验该mac,所以暂时屏蔽掉 /* ret=check_mac((char*)(&BankAnsPak), sizeof(BankAnsPak)); if(ret) { writelog(LOG_ERR,"Receive data mac verify error,error code is [%d] ",ret); //sprintf(pNode->RetCode,"%d",E_TRANS_BANK_RECVERR); return E_TRANS_BANK_RECVERR; } */ if(0!=strncmp(BankAnsPak.RetCode,RET_BANK_OK,2)) { writelog(LOG_ERR,"Receive data return code error,error code= [%2.2s] ",BankAnsPak.RetCode); BankAnsPak.RetCode[2]=0; switch(atoi(BankAnsPak.RetCode)) { case 1: //银行卡挂失 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_LOST); return E_TRANS_BANKCARD_LOST; case 2: //银行卡状态错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_STATERR); return E_TRANS_BANKACC_STATERR; case 3: //银行卡金额不足 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_NOMONEY); return E_TRANS_BANKACC_NOMONEY; case 4: //银行未知错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANK_NODECIDE); return E_TRANS_BANK_NODECIDE; case 5: //银行密码错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_BANKCARD_PWDERR; case 6: //通讯或密钥错 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_BANK_NETERR; default: //其他未知错误 //sprintf(pNode->RetCode,"%d",E_TRANS_UNKNOW_ERROR); return E_TRANS_UNKNOW_ERROR; } } //填充应答包 //sprintf(pNode->RetCode,"%d",SUCCEED); memcpy(pNode->Balance,BankAnsPak.Balance,sizeof(pNode->Balance)); writelog(LOG_INFO,"query bank card balance succeed!bank card money=[%s]",BankAnsPak.Balance); return 0; }
int Bank_Undo(INNER_TRANS_REQUEST * pNode) { int ret=0; BANK_TRANS_REQUEST BankReqPak; BANK_TRANS_REQUEST BankAnsPak; char sMoney[32]=""; char sSerialno[32]=""; memset(&BankReqPak, ' ', sizeof(BankReqPak)); memset(&BankAnsPak, ' ', sizeof(BankAnsPak)); //写交易代码 memcpy( BankReqPak.TradeCode,TRADE_BANK_DETRANS, BANK_TRADE_CODE_LEN); //写交易日期和交易时间 memcpy(BankReqPak.TradeDate,pNode->TradeDate,sizeof(BankReqPak.TradeDate)); memcpy(BankReqPak.TradeTime,pNode->TradeTime,sizeof(BankReqPak.TradeTime)); //改成校园卡卡号 sprintf(BankReqPak.CustAccountNo,"%-10d",atoi(pNode->CardNo)); //写银行卡号字段 memcpy(BankReqPak.BankCardNo,pNode->BankCardNo, sizeof(BankReqPak.BankCardNo)); //写商户号字段 memcpy(BankReqPak.MercAccount,SCHOOL_ACCOUNT_NO,sizeof(BankReqPak.MercAccount)); //写转帐金额字段 sprintf(BankReqPak.TransMoney,"%09d",atoi(pNode->TransMoney)); //写转帐金额字段 //memcpy(BankReqPak.TransMoney,pNode->TransMoney,sizeof BankReqPak.TransMoney); //写银行卡密码字段!!!oldpwd? or pwd in shm? //memcpy(BankReqPak.BankCardPwd, tradeserial.oldpwd,sizeof(BankReqPak.BankCardPwd)); //写校园端流水号!!!serial_no or ReviseSerial_no? f? sprintf(sSerialno,"%d",pNode->RecvNo); memcpy(BankReqPak.CustSn,sSerialno,strlen(sSerialno)); //本地流水号 //写院校代码 sprintf(BankReqPak.CustNo,"%-16s",SCHOOL_CODE); //写校验mac码 generate_mac((char*)(&BankReqPak),sizeof(BankReqPak),BankReqPak.MAC); TRACE_BANK_TRANS(&BankReqPak,"send detrans package"); ret = send_to_and_recv_from_bank(BANK_NYYH,(char*)&BankReqPak, BANK_TRANS_PACKLEN, (char*)&BankAnsPak, BANK_TRANS_PACKLEN,&g_Bank); if(ret) { writelog(LOG_ERR,"send_to_and_recv_from_bank error,errcode=[%d]",ret); return ret; } TRACE_BANK_TRANS(&BankAnsPak,"recv detrans package"); if(0!=strncmp(BankAnsPak.RetCode,RET_BANK_OK,2)) { writelog(LOG_ERR,"Receive data return code error,error code= [%s] ",BankAnsPak.RetCode); BankAnsPak.RetCode[2]=0; switch(atoi(BankAnsPak.RetCode)) { case 1: //银行卡挂失 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_LOST); return E_TRANS_BANKCARD_LOST; case 2: //银行卡状态错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_STATERR); return E_TRANS_BANKACC_STATERR; case 3: //银行卡金额不足 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_NOMONEY); return E_TRANS_BANKACC_NOMONEY; case 4: //银行未知错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANK_NODECIDE); return E_TRANS_BANK_NODECIDE; case 5: //银行密码错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_BANKCARD_PWDERR; case 6: //通讯或密钥错 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_BANK_NETERR; default: //其他未知错误 //sprintf(pNode->RetCode,"%d",E_TRANS_UNKNOW_ERROR); return E_TRANS_UNKNOW_ERROR; } } pNode->SendNo=atoi(BankAnsPak.CustSn); pNode->RecvNo=atoi(BankAnsPak.BankSn); //memcpy((char*)pBankTrans, (char*)&BankTransPak, BANK_TRANS_PACKLEN); return 0; }
int Bank_Transfer(INNER_TRANS_REQUEST * pNode,int serial_no) { int ret=0; double unique=0; int temp_serial_no=0; char logicdate[11]=""; char buffer[16]=""; int i=0; char sMoney[32]=""; char sSerialno[32]=""; INNER_TRANS_REQUEST from_pos; BANK_TRANS_REQUEST BankReqPak; BANK_TRANS_REQUEST BankAnsPak; memset(&from_pos,0,sizeof from_pos); memset(&BankReqPak,0,sizeof BankReqPak); memset(&BankAnsPak,0,sizeof BankAnsPak); memcpy(&from_pos,pNode,sizeof from_pos); //组织银行包 memcpy(BankReqPak.TradeCode,TRADE_BANK_TRANS, BANK_TRADE_CODE_LEN); //写交易代码 writelog(LOG_DEBUG,"trans code [%s]",TRADE_BANK_TRANS); getsysdate(BankReqPak.TradeDate); getsystime(BankReqPak.TradeTime); //由于银行给的接口中的校园卡账号字段只有10个长度 //所以这里在校园卡账号字段上填写校园卡卡号 sprintf(BankReqPak.CustAccountNo,"%-10d",atoi(from_pos.CardNo)); //sprintf(BankReqPak.BankCardNo,"%-20s","1030399110000001042"); //写银行卡号字段 sprintf(BankReqPak.BankCardNo,"%-20s",from_pos.BankCardNo); //写银行卡号字段 memcpy(BankReqPak.MercAccount,SCHOOL_ACCOUNT_NO,sizeof(BankReqPak.MercAccount)); //写商户号字段 sprintf(BankReqPak.TransMoney,"%-9s",from_pos.TransMoney); //写转帐金额字段 //通过16进制传输,然后解密 hex2dec(from_pos.BankCardPwd,(unsigned char*)BankReqPak.BankCardPwd, 8); //memcpy(BankReqPak.BankCardPwd,from_pos.BankCardPwd,sizeof(BankReqPak.BankCardPwd)); //写银行卡密码字段 sprintf(sSerialno,"%d",serial_no); memcpy(BankReqPak.CustSn,sSerialno,strlen(sSerialno)); //写校园端流水号 sprintf(BankReqPak.CustNo,"%-16s",SCHOOL_CODE); //写院校代码 BankReqPak.AutoFlag='0'; //写自动自助标志 generate_mac((char*)(&BankReqPak),sizeof(BankReqPak),BankReqPak.MAC);//写校验mac码 TRACE_BANK_TRANS(&BankReqPak,"send transfer package"); //发送数据到银行并同时接收银行数据,此处不判断返回的mac校验 ret=send_to_and_recv_from_bank(BANK_NYYH,(char*)(&BankReqPak),sizeof(BankReqPak),(char*)(&BankAnsPak),sizeof(BankAnsPak),&g_Bank); if(ret) { writelog(LOG_ERR,"send_to_and_recv_from_bank error,errcode=[%d]",ret); return ret; } TRACE_BANK_TRANS(&BankAnsPak,"receive transfer package"); //校验mac,判断银行接收包是否正确 //目前银行端没有校验mac,所以屏蔽 /* ret=check_mac((char*)(&BankAnsPak), sizeof(BankAnsPak)); if(ret) { writelog(LOG_ERR,"send_to_and_recv_from_bank error,errcode=[%d]",ret); return E_TRANS_BANK_RECVERR; } */ if(0!=strncmp(BankAnsPak.RetCode,RET_BANK_OK,2)) { writelog(LOG_ERR,"Receive data return code error,error code= [%s] ",BankAnsPak.RetCode); BankAnsPak.RetCode[2]=0; switch(atoi(BankAnsPak.RetCode)) { case 1: //银行卡挂失 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_LOST); return E_TRANS_BANKCARD_LOST; case 2: //银行卡状态错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_STATERR); return E_TRANS_BANKACC_STATERR; case 3: //银行卡金额不足 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_NOMONEY); return E_TRANS_BANKACC_NOMONEY; case 4: //银行未知错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANK_NODECIDE); return E_TRANS_BANK_NODECIDE; case 5: //银行密码错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_BANKCARD_PWDERR; case 6: //通讯或密钥错 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_BANK_NETERR; default: //其他未知错误 //sprintf(pNode->RetCode,"%d",E_TRANS_UNKNOW_ERROR); return E_TRANS_UNKNOW_ERROR; } } return 0; }
int main(int argc, char **argv) { char c, *id = NULL, *spoof_addr = NULL; opterr = 0; while ((c = getopt(argc, argv, "hVi:m:")) != -1) { switch(c) { case 'h': help_message(); return 0; case 'V': printf("%s\n", version); return 0; case 'i': if (validate_interface(optarg)) { id = calloc(1, strlen(optarg)+1); strcpy(id, optarg); } else { fprintf(stderr, "Invalid interface specified after -i.\n"); return 1; } break; case 'm': if (validate_address(optarg)) { spoof_addr = calloc(1, strlen(optarg)+1); strcpy(spoof_addr, optarg); } else { fprintf(stderr, "Invalid address specified after -m.\n"); return 1; } break; case '?': if (optopt == 'i' || optopt == 'm') { fprintf(stderr, "Option -%c requires an argument.\n", optopt); return 1; } else if (isprint(optopt)) { fprintf(stderr, "Unknown option -%c.\n", optopt); return 1; } else { fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt); return 1; } default: abort(); /* if we get here, bad things have happened */ } } if (geteuid() != 0) { fprintf(stderr, "This tools needs to be run as root.\n"); return 1; } if (!id) { fprintf(stderr, "No interface supplied.\n"); return 1; } if (!spoof_addr) { spoof_addr = generate_mac(); spoof_addr[ADDR_BYTES-1] = '\0'; } spoof_interface_mac(id, spoof_addr); sleep(2); bounce_interface(id); sleep(1); return 0; }
int Do_Transfer(BANK_TRANS_REQUEST *pBankTrans) { //char buffer[20]=""; char temp[128]=""; int ho_OpCount=0; int delay_time=0; double ho_Fee_Change=0; int ret=0; FILE *fp; TIniFile tf; int nrows=0; char path_name[128]=""; char file_name[128]=""; BANK_TRANSFER_HEAD trans_head; BANK_TRANSFER_RECORD trans_record; T_v_tif_shopdeptfee v_shopdeptfee; T_t_cif_shop t_shop; //系统正在结算,可以生成划拨文件 //sleep(1); //ret=DB_v_tif_shopdeptfee_read_sum_fee(&ho_OpCount,&ho_Fee_Change); if(ret) { writelog(LOG_ERR,"DB_v_tif_shopdeptfee_read_sum_fee err [%d]",ret); return ret; } ho_OpCount=4; ho_Fee_Change=12345.98; strcpy(path_name,"/ykt/ykt/src/bank/ftp"); sprintf(file_name,"%s/fd_%8.8s",path_name,getsysdate(NULL)); #ifdef DEBUG // strcpy(path_name,"./ftp/fd_20041009"); writelog(LOG_ALERT,"file_name2=[%s]",file_name); #endif fp = fopen(file_name,"wb"); if (fp==NULL) { writelog(LOG_ALERT,"Open indicate file fail"); return -1; } memcpy(trans_head.rmb_batch_no,BATCH_NO,sizeof(trans_head.rmb_batch_no)); fprintf(fp,"%-14.14s",trans_head.rmb_batch_no); //批量编号 memcpy(trans_head.rmb_start_seq,"000000",6); fprintf(fp,"%-6.6s",trans_head.rmb_start_seq); //填000000 trans_head.rmb_acc_status='0'; fprintf(fp,"%c",trans_head.rmb_acc_status); //记帐状态(填0) trans_head.rmb_chk_status='2'; fprintf(fp,"%c",trans_head.rmb_chk_status); //检查状态(填2) sprintf(trans_head.rmb_total_amount,"%-13d",int(ho_Fee_Change*100)); fprintf(fp,"%-13.13s",trans_head.rmb_total_amount); //总金额(11位整数2位小数,无小数点) sprintf(trans_head.rmb_total_num,"%-6d",ho_OpCount); fprintf(fp,"%-6.6s",trans_head.rmb_total_num); //总笔数 fprintf(fp,"%-13.13s",trans_head.rmb_enter_amount); //入帐金额 fprintf(fp,"%-6.6s",trans_head.rmb_enter_num); //入帐笔数 sprintf(trans_head.rmb_unit_name,"%-40s",UNIT_NAME); fprintf(fp,"%-40.40s",trans_head.rmb_unit_name); //单位名称 #ifdef DEBUG writelog(LOG_ALERT,"trans_head.rmb_unit_name=[%s]",trans_head.rmb_unit_name); #endif strcpy(trans_head.rmb_unit_account,UNIT_ACCOUNT); //sprintf(trans_head.rmb_unit_account,"%-20s"UNIT_ACCOUNT); fprintf(fp,"%-20.20s",trans_head.rmb_unit_account); //单位帐号 #ifdef DEBUG writelog(LOG_ALERT,"trans_head.rmb_unit_account=[%s]",trans_head.rmb_unit_account); #endif memcpy(trans_head.rmb_apply_date,getsysdate(NULL),sizeof(trans_head.rmb_apply_date)); fprintf(fp,"%-8.8s",trans_head.rmb_apply_date); //申请入帐日期(当天日期) //memcpy(trans_head.rmb_send_date,trans_head.rmb_apply_date,sizeof(trans_head.rmb_apply_date)); memcpy(trans_head.rmb_send_date,getsystime(NULL),sizeof(trans_head.rmb_send_date)); fprintf(fp,"%-8.8s",trans_head.rmb_send_date); //上传日期(当天日期) #ifdef DEBUG printf("[%14.14s]\n",trans_head.rmb_batch_no ); //批量编号 printf("[%6.6s]\n",trans_head.rmb_start_seq ); //填000000 printf("[%c]\n",trans_head.rmb_acc_status ); //记帐状态(填0) printf("[%c]\n",trans_head.rmb_chk_status ); //检查状态(填2) printf("[%13.13s]\n",trans_head.rmb_total_amount ); //总金额(11位整数2位小数,无小数点) printf("[%6.6s]\n",trans_head.rmb_total_num ); //总笔数 printf("[%13.13s]\n",trans_head.rmb_enter_amount ); //入帐金额(11位整数2位小数,无小数点) printf("[%6.6s]\n",trans_head.rmb_enter_num ); //入帐笔数 printf("[%40.40s]\n",trans_head.rmb_unit_name ); //单位名称 printf("[%20.20s]\n",trans_head.rmb_unit_account ); //单位帐号 printf("[%8.8s]\n",trans_head.rmb_apply_date ); //申请入帐日期(当天日期) printf("[%8.8s]\n",trans_head.rmb_send_date ); //上传日期(当天日期) #endif //写入划拨文件 // fprintf(fp,(char*)(&trans_head)); strcpy(temp,"1"); ret=DB_v_tif_shopdeptfee_open_select_by_c6_and_is_indep(temp); if(ret) { //db_chk_err(__FILE__,__LINE__,&sqlca); writelog(LOG_ALERT,"DB_v_tif_shopdeptfee_open_select_by_c6_and_is_indep[%d]",ret); return ret; } while(1) { //初始化宿主变量 ho_Fee_Change=0; memset(&v_shopdeptfee,0,sizeof(v_shopdeptfee)); memset(&t_shop,0,sizeof(t_shop)); ret=DB_v_tif_shopdeptfee_fetch_select_by_c6(&v_shopdeptfee); if(ret) { if(DB_NOTFOUND==ret) { if(0==nrows) { writelog(LOG_ERR,"DB_v_tif_shopdeptfee_fetch_select_by_c6[%d]",ret); break; } else break; //循环记录结束 } else { //db_chk_err(__FILE__,__LINE__,&sqlca); writelog(LOG_ERR,"DB_v_tif_shopdeptfee_fetch_select_by_c6[%d]",ret); return ret; } } ret=DB_t_cif_shop_read_by_shop_id(v_shopdeptfee.shop_id,&t_shop); if(ret) { //db_chk_err(__FILE__,__LINE__,&sqlca); writelog(LOG_ALERT,"DB_t_cif_shop_read_by_shop_id[%d]",ret); return ret; } strcpy(trans_record.rmb_batch_no1,BATCH_NO); sprintf(trans_record.rmb_seq_no,"%d",nrows); trans_record.rmb_acc_status1='0'; trans_record.rmb_tran_kind='2'; strncpy(trans_record.rmb_cust_name,t_shop.b_act_name,sizeof(trans_record.rmb_cust_name)); strncpy(trans_record.rmb_acc_no,t_shop.b_act_id,sizeof(trans_record.rmb_acc_no)); trans_record.rmb_cb_cr='0'; sprintf(trans_record.rmb_tran_amt,"%f",ho_Fee_Change); strcpy(trans_record.rmb_cur_code,"001"); strcpy(trans_record.rmb_host_no,"00000000"); memcpy(trans_record.rmb_ret_code," ",sizeof(trans_record.rmb_ret_code)); strcpy(trans_record.rmb_acc_date,"00000000"); strcpy(trans_record.rmb_host_no1,"000000000"); strcpy(trans_record.rmb_open_branch,"0000000"); memcpy(trans_record.rmb_vcho_kind," ",sizeof(trans_record.rmb_vcho_kind)); strcpy(trans_record.rmb_vcho_bat_no,"00"); strcpy(trans_record.rmb_vcho_no,"000000000"); strcpy(trans_record.rmb_memo," "); strcpy(trans_record.rmb_tran_info," "); fprintf(fp,(char*)(&trans_record)); nrows++; } fclose(fp); memset(pBankTrans,0,BANK_TRANS_PACKLEN); //开始银行发送清算报文 memcpy( pBankTrans->TradeCode,TRADE_BANK_BALANCE, sizeof(pBankTrans->TradeCode)); //写交易代码 //写交易日期和交易时间 getsysdate(pBankTrans->TradeDate); getsystime(pBankTrans->TradeTime); //写院校代码 sprintf(pBankTrans->CustNo,"%-16s",SCHOOL_CODE); //写银行卡号-此处约定为划拨文件名 sprintf(pBankTrans->BankCardNo,"%8.8s",getsysdate(NULL)); //写校验mac码 //写校验mac码----林钦此处应该用银行回传回来的动态密钥做mac密钥,此处改过来了 generate_mac((char*)pBankTrans,sizeof(pBankTrans),pBankTrans->MAC); //ANSIX99(mac_key,(char*)(&BankTransPak), BANK_TRANS_PACKLEN-LEN_MAC,BankTransPak.MAC); TRACE_BANK_TRANS(pBankTrans,"send transfer package"); //发送数据到银行并同时接收银行数据,此处不判断返回的mac校验 ret=send_to_and_recv_from_bank((char*)pBankTrans,BANK_TRANS_PACKLEN, (char*)pBankTrans,BANK_TRANS_PACKLEN,delay_time); if(ret) { writelog(LOG_ERR,"send_to_and_recv_from_bank error,errcode=[%d]",ret); return E_TRANS_BANK_NOANSWER; } TRACE_BANK_TRANS(pBankTrans,"recv transfer package"); //农行暂时未校验该mac,所以暂时屏蔽掉 ret=check_mac((char*)pBankTrans,BANK_TRANS_PACKLEN); if(ret) { writelog(LOG_ERR,"Receive data mac verify error,error code is [%d] ",ret); //sprintf(pNode->RetCode,"%d",E_TRANS_BANK_RECVERR); return E_TRANS_BANK_RECVERR; } writelog(LOG_INFO,"Congratulation, transer succeed!"); return 0; }
/* void generate_mac(const char *data, const char *key, unsigned char *mac) { unsigned int h[5]; sha1_init(h); sha1_update(key, h); sha1_update(data); sha1_finish(mac); } */ int main(int argc, char *argv[]) { unsigned char mac[20]; char buff[128]; unsigned char tamp[2048]; const char *data = "comment1=cooking%20MCs;userdata=foo;comment2=%20like%20a%20pound%20of%20bacon"; init_key(); generate_mac(SHA1, data, strlen(data), secret_key, secret_key_len, mac); hexencode(mac, 20, buff); buff[40] = '\0'; printf("digest: %s\n", buff); printf("mac valid: %d\n", validate_mac(SHA1, data, strlen(data), secret_key, secret_key_len, mac)); strcpy(tamp, data); strcat(tamp, ";admin=true"); printf("tampered msg mac valid: %d\n", validate_mac(SHA1, tamp, strlen(tamp), secret_key, secret_key_len, mac)); // now try to bruteforce a valid message by continuing the existing mac. // // valid mac is based on sha1(key || msg) which is generated by sha1_update(key || msg || padding0) // we want sha1(key || msg || padding0 || tampering || padding1) to be valid, // for that we need to guess key length and append tampering and continue // the sha1 hash function over padding and tampering. // padding = | 0x80 0000 ... 0000 LEN | where // // tampered mac unsigned char tampmac[20]; int msglen = strlen(data); int keylen = 0; // start with a zero length key int valid; do { // the sha1 state we will continue on // // h[5] // | // key || msg || padding0 // unsigned int h[5]; int i; for(i = 0; i < 5; i++) { h[i] = (mac[i*4] << 24) | (mac[i*4+1] << 16) | (mac[i*4+2] << 8) | mac[i*4+3]; // printf("h[%d] = %08X\n", i, h[i]); } strcpy(tamp, ";admin=true"); int key_data_padding0_len = ((keylen + msglen + 9) + 64 - (keylen + msglen + 9) % 64); int tamp_len = strlen(tamp); // the length of the tampered message, that is msglen + keylen + padding + tamp // calculate tampered mac // the sha1 state we will continue on // // h[5] ----> tamp_mac // | | // key || msg || padding0 || tamp || padding1 // sha1_finish(tamp, key_data_padding0_len + tamp_len, h, tampmac); //printf("tampered mac:\n"); //hexdump(tampmac, 20); // generate tampered the message, that is, original message + padding0 + tampered data strcpy(tamp, data); // append padding0 after original message // // length of padding0 is (key+msg+9+64) - (key+msg+9+64) % 64 unsigned char *p = tamp+strlen(tamp); *p++ = 0x80; // nullpadd until 8 bytes from block boundary while( (keylen + (p - (unsigned char *)tamp) ) % 64 != 56) { *p++ = 0; } // first 32 bits of 64 bit length indicator is zero *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 0; unsigned int bits = 8*(msglen + keylen); // append the 32 bit length field *p++ = bits >> 24; *p++ = bits >> 16; *p++ = bits >> 8; *p++ = bits & 0xff; // append tampering strcpy(p, ";admin=true"); p += strlen(p); int tampered_msg_len = p - tamp; //printf("Validate mac using length: %d\n", tampered_msg_len); //hexdump(tamp, tampered_msg_len); valid = validate_mac(SHA1, tamp, tampered_msg_len, secret_key, secret_key_len, tampmac); if(!valid) { keylen++; printf("Message not accepted, try larger keylength %d\n", keylen); } else { printf("tampered message accepted, guessed keylength: %d\n", keylen); } } while(!valid && keylen < 256); if(!valid) { printf("Failed to get tampered message accepted\n"); } }