?? ic_card.c
字號:
printf("%02X", temp[i]); sprintf(startday+i*2, "%02X", temp[i]); } printf("start date:[%s]\n", startday); memset(temp, 0x00, sizeof(temp)); memcpy(temp, ptr+16, 4); // 應用有效日期 for(i = 0; i < 4; i++) { printf("%02X", temp[i]); sprintf(endday+i*2, "%02X", temp[i]); } printf("youxiao date:[%s]\n", endday); ptr += 20; printf("self fci data:[%02x %02x]\n", ptr[0], ptr[1]); return 0;}/*=============================================================================//函數名稱: PbocVerify//輸入參數: char *pin: 密碼//輸出參數:char *TimesLeft : 剩余校驗次數//返 回: 0--成功; <0: 失敗//功 能: 校驗密碼//開發人員: yangxh//修改記錄: 1. 第一次編寫.===============================================================================*/int PbocVerify(char *pin, int pinlen, char *TimesLeft){ unsigned char SendCommand[128]; unsigned char recvlen = 0; int sendlen; char recvbuf[256]; short ret;// int i; if(pinlen != 3) return -1; memset((char *)SendCommand, 0x00, sizeof(SendCommand)); sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x14, 0x00, 0x20, 0x00, 0x00, 0x03); memcpy(SendCommand+6, pin, 3); sendlen = 9; printf("Send Verify\n");/* for(i = 0; i < 9; i++) { printf("%02x", SendCommand[i]); }*/ ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen); if( ret ) return ret; if(recvbuf[0] != 0x00) { if(recvbuf[1] == 0x63) { printf("還允許重試密碼%d次!\n", recvbuf[2] & 0x0f); *TimesLeft = recvbuf[2] & 0x0f; return 105; //105代表輸入密碼錯 } else if(recvbuf[1] == 0x69 && recvbuf[2] == 0x83) { *TimesLeft = 0; return 106; //106代表卡已經被鎖定 } return 105; } if(recvbuf[1] == 0x90 && recvbuf[2] == 0x00) { return 0; } return -1;}/*=============================================================================//函數名稱: PbocGetBalance//輸入參數: unsigned char mode:模式//輸出參數:char *balance : 余額//返 回: 0--成功; <0: 失敗//功 能: 獲得存折、錢包余額//開發人員: yangxh//修改記錄: 1. 第一次編寫.===============================================================================*/int PbocGetBalance(unsigned char mode, char *balance){ unsigned char SendCommand[128]; unsigned char recvlen = 0; char recvbuf[256]; char mount[8]; long m; int sendlen,k; short ret, i; if(mode !=0x01 && mode != 0x02) { return -1; } *balance='\0'; /*printf("-------PbocGetBalance11-------\n"); for(k=0;k<4;k++) printf("%X",*(ppp->random+k)); printf("\n");*/ memset((char *)SendCommand, 0x00, sizeof(SendCommand)); sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x13, 0x80, 0x5C, 0x00, mode, 0x04); sendlen = 6; printf("Send Get Balance\n"); ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen); if( ret ) return ret; if(recvbuf[0] == 0x00) { if(recvbuf[5] == 0x90 && recvbuf[6] == 0x00) { memcpy(mount, recvbuf+1, 4); for(i = 0; i < 4; i++) { sprintf(mount+i*2, "%02X", recvbuf[i+1]); } sscanf(mount, "%08lX", &m); printf("mount [%8ld]\n", m); sprintf(balance, "%.2f", (float)m/100); printf("balance[%s]\n", balance); } } /*printf("-------PbocGetBalance22-------\n"); for(k=0;k<4;k++) printf("%X",*(ppp->random+k)); printf("\n");*/ return 0;}//獲取生成MAC1數據信息int PbocSelectPbocForSam(stMACDATA *pst){ short ret; short sfi; char *ptr, tmpfilename[256]; char chPSE[50]; unsigned char recvbuf[256]; char cardno[21]; int k; /*printf("-------PbocSelectPbocForSam11-------\n"); for(k=0;k<4;k++) printf("%X",*(ppp->random+k)); printf("\n");*/ memset(tmpfilename, 0x00, sizeof(tmpfilename)); memset(recvbuf,'\0',256); memset(chPSE, '\0', 50); memcpy(tmpfilename, "1PAY.SYS.DDF01", 14); strcpy(chPSE, tmpfilename); PbocICSelect("1PAY.SYS.DDF01", strlen(tmpfilename), recvbuf);// if( ret )// return ret; ptr = strstr((char *)(recvbuf+1), "\x88\x01"); if(ptr == NULL) return -1; ptr += 2; sfi = ptr[0] & 0XFF; memset(recvbuf, 0x00, sizeof(recvbuf)); ret = PbocICSelect("\xD1\x56\x00\x00\x01\x45\x44\x2F\x45\x50\x00\x00\x00\x00\x00\x00", 16, recvbuf); if( ret ) return ret; //Unpackage Receive Data memset(cardno, 0x00, sizeof(cardno)); GetCardInfo((char *)recvbuf, pst);/* printf("-------PbocSelectPbocForSam22-------\n"); for(k=0;k<4;k++) printf("%X",*(ppp->random+k)); printf("\n");*/ return 0;}int GetCardInfo(char *recvbuf, stMACDATA *pst){ int i; char startday[10], endday[10]; char temp[50]; char *ptr; memset(temp, 0x00, sizeof(temp)); memset(startday, 0x00, sizeof(startday)); memset(endday, 0x00, sizeof(endday)); if(recvbuf[0] != 0x00) return -1; if(recvbuf[1] != 0x6f) return -2; printf("FCI:[%02X]\n", recvbuf[2]); if(recvbuf[3] != 0x84) memcpy(temp, recvbuf+5, recvbuf[4]); printf("DF name:\n"); for(i = 0; i < recvbuf[4]; i++) { printf("%02X ", temp[i]); } printf("\n"); ptr = recvbuf + recvbuf[4] + 5; if(ptr[0] != 0xa5) return -4; ptr = strstr(ptr, "\x9f\x0c"); /* { printf("Sender self define fci:[%02x]\n", ptr[2]); } else return -5;*/ ptr += 3; memcpy(pst->bank_id, ptr, 2); ptr += 2; memcpy(pst->city_id,ptr,2); ptr += 10; memcpy(pst->consumer_id,ptr,8); return 0;}//讀取SAM卡上消費交易需要的數據int PsamForMac1(/*char *Commbuff,*/stMACDATA *pst){ int k; /*printf("-------PsamForMac111-------\n"); for(k=0;k<4;k++) printf("%X",*(ppp->random+k)); printf("\n");*/ int result; unsigned char recvlen = 0; char recvbuf[256]; static unsigned char SELECT_SAM[]={0x1f,0x02,0x02}; static unsigned char SAM_POWER_UP[]={0x1a};// static unsigned char SAM_POWER_DOWN[]={0x19}; SendCmd( SELECT_SAM, sizeof( SELECT_SAM ), (unsigned char *)recvbuf, &recvlen) ; SendCmd( SAM_POWER_UP, sizeof( SAM_POWER_UP ), (unsigned char *)recvbuf, &recvlen) ; result = PbocSelectPsam(pst);// result = PsamForPurchase(pst); result = PbocSelectADF(pst); /*printf("-------PsamForMac122-------\n"); for(k=0;k<4;k++) printf("%X",*(ppp->random+k)); printf("\n");*/ return result;}//讀取SAM卡基礎文件 int PbocSelectPsam(stMACDATA *pst){ short ret,k; short i=0, sfi; char *ptr, tmpfilename[256]; char chPSE[50]; unsigned char recvbuf[256]; unsigned char datalen; /*printf("-------PbocSelectPsam11-------\n"); for(k=0;k<4;k++) printf("%X",*(ppp->random+k)); printf("\n");*/ memset(tmpfilename, 0x00, sizeof(tmpfilename)); memset(recvbuf,'\0',256); memset(chPSE, '\0', 50); memcpy(tmpfilename, "1PAY.SYS.DDF01", 14); strcpy(chPSE, tmpfilename); PbocPsamSelect("1PAY.SYS.DDF01", strlen(tmpfilename), recvbuf); PsamForPurchase(pst);// if( ret )// return ret; ptr = strstr((char *)(recvbuf+1), "\x88\x01"); if(ptr == NULL) return -1; ptr += 2; sfi = ptr[0] & 0XFF; memset(recvbuf, 0x00, sizeof(recvbuf)); for(i = 1; ; i++) { ret = PsamReadRecord(0x1c, ABS_RECORD, sfi, i, 0, (char *)recvbuf); if( ret ) return ret; ptr = strstr((char *)(recvbuf+1),"\x4F"); if(ptr == NULL) return -1; if(strncmp(ptr+2, chPSE, 14) != 0 ) break; } datalen = ptr[1] & 0XFF; memset(tmpfilename, 0x00, sizeof(tmpfilename)); memcpy(tmpfilename, ptr+2, datalen); ret = PbocPsamSelect(tmpfilename, datalen, recvbuf); if( ret ) return ret; //Unpackage Receive Data GetSamInfo((char *)recvbuf, pst); /*printf("-------PbocSelectPsam22-------\n"); for(k=0;k<4;k++) printf("%X",*(ppp->random+k)); printf("\n");*/ return 0;}//讀取CDF文件,測試用函數int PsamForPurchase(stMACDATA *pst){ int result; result = PbocSelectCDF(pst); return result;}// 讀取終端信息文件,獲取終端機編號int PbocSelectCDF(stMACDATA *pst){ unsigned char SendCommand[128]; unsigned char recvlen = 0; unsigned char recvbuf[256]; int sendlen; short ret; int i; memset(SendCommand, 0x00, sizeof(SendCommand)); sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x1c, 0x00, 0xB0, 0x96, 0x00, 0x00); sendlen = 6; ret = SendCmd(SendCommand, sendlen, recvbuf, &recvlen); if(recvbuf[1] == 0x61 || recvbuf[1] == 0x6C) { sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x1b, 0x00, 0xB0, 0x96, 0x00, 0x06); SendCmd(SendCommand, 6, recvbuf, &recvlen); } memset(pst->term_no, 0x00, 7); memcpy(pst->term_no, recvbuf+1, 6); for(i = 0; i < 6; i++) { printf("%02X", pst->term_no[i]); } return 0;}// 選擇全國密鑰管理中心ADF,獲取消費密鑰索引號int PbocSelectADF(stMACDATA *pst){ unsigned char SendCommand[128]; unsigned char recvlen = 0; unsigned char recvbuf[256]; int sendlen; short ret; memset(SendCommand, 0x00, sizeof(SendCommand)); sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x1c, 0x00, 0xB0, 0x97, 0x00,0x00); sendlen = 6; ret = SendCmd(SendCommand, sendlen, recvbuf, &recvlen); if(recvbuf[1] == 0x61 || recvbuf[1] == 0x6C) { sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x1b, 0x00, 0xB0, 0x97, 0x00, 0x19); SendCmd(SendCommand, 6, recvbuf, &recvlen); } return 0;}//循環讀取SAM上信息文件 int PbocPsamSelect(char *file_id, int filelen, unsigned char *recvbuf){ unsigned char recvlen = 0; unsigned char SendCommand[128]; int sendlen; short ret; memset((char *)SendCommand, 0x00, sizeof(SendCommand)); sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x1c, 0x00, 0xA4, 0x04, 0x00, filelen); memcpy(SendCommand+6, file_id, filelen); sendlen = filelen + 6; ret = SendCmd(SendCommand, sendlen, recvbuf, &recvlen); if(recvbuf[1] == 0x61) { sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x1b, 0x00, 0xC0, 0x00, 0x00, recvbuf[2]); SendCmd(SendCommand, 6, recvbuf, &recvlen); } return 0;}//消費初始化int PbocInitForPurchase(unsigned char mode, char *trademoney,char *terminalNo,stMACDATA *pstmacdata){ unsigned char SendCommand[128]; unsigned char recvlen = 0; char recvbuf[256]; int sendlen; short ret; char *ptr; char temp[50]; int i,k; char balance[9]; char trade_no[5]; char overdraft[7]; char random[9]; char buffer[9]; unsigned int money; char money1[20]; printf("-------PbocInitForPurchase11-------\n"); for(k=0;k<4;k++) printf("%X",*(pstmacdata->random+k)); printf("\n"); if(mode !=0x01 && mode != 0x02) { return -1; } memset((char *)SendCommand, 0x00, sizeof(SendCommand)); memset(buffer,0x00,sizeof(buffer)); memset(random,0x00,sizeof(random)); sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x14, 0x80, 0x50, 0x01, mode, 0x0b); memcpy(SendCommand+6,pstmacdata->mac_index,1); Dec2Hex(trademoney,money1); sscanf(money1,"%08X",&money); memcpy(temp, &money, 4); for(i = 0; i < 4; i++) { printf("%02X", temp[3-i]); SendCommand[7+i] = temp[3-i]; } memcpy(pstmacdata->amount, SendCommand+7, 4); memcpy(SendCommand+11,pstmacdata->term_no,6); sendlen = 17; ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen); if( ret ) return ret; if(recvbuf[1] == 0x61) { sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x13, 0x00, 0xC0, 0x00, 0x00, recvbuf[2]); SendCmd(SendCommand, 6, (unsigned char *)recvbuf, &recvlen); ptr = recvbuf+1; memset(temp, 0x00, sizeof(temp)); memcpy(temp, ptr, 4); for(i = 0; i < 4; i++) { printf("%02X", temp[i]); sprintf(balance+i*2, "%02X", temp[i]); } printf("the balance is [%s]\n",balance); memcpy(pstmacdata->trade_no, ptr+4, 2);// memset(temp, 0x00, sizeof(temp));// memcpy(temp, ptr+4, 2);// for(i = 0; i < 2; i++)// {// printf("%02X", temp[i]);// sprintf(trade_no+i*2, "%02X", temp[i]);// }// printf("the trade_no is [%s]\n",trade_no);// printf("the 222balance is [%s]\n",balance); memset(temp, 0x00, sizeof(temp)); memcpy(temp, ptr+6, 3); for(i = 0; i < 3; i++) { printf("%02X", temp[i]); sprintf(overdraft+i*2, "%02X", temp[i]); } printf("the overdraft is [%s]\n",overdraft); memset(temp, 0x00, sizeof(temp)); memcpy(pstmacdata->mac_version, ptr+9, 1); printf("the pstmacdata->mac_version is:\n"); printf("%02X", pstmacdata->mac_version[0]); printf("\n"); memcpy(pstmacdata->arith_no, ptr+10, 1); memcpy(pstmacdata->random, ptr+11, 4); memset(temp, 0x00, sizeof(temp)); memcpy(temp, ptr+11, 4); printf("-------PbocInitForPurchase12-------\n"); for(k=0;k<4;k++) printf("%X",*(ptr+11+k)); printf("\n"); for(i = 0; i < 4; i++) { printf("%02X", temp[i]); sprintf(random+i*2, "%02X", temp[i]); } printf("\nthe random is [%s]\n",random); strcpy(pstmacdata->balance,balance);// strcpy(pstmacdata->trade_no,trade_no); strcpy(pstmacdata->overdraft,overdraft); //strcpy(pstmacdata->random,random); } printf("-------PbocInitForPurchase22-------\n"); for(k=0;k<8;k++) printf("%c",*(pstmacdata->random+k)); printf("\n"); return 0;}//生成MAC1int PsamCreatMac1(stMACDATA pstmacdata,char *mac1,char *term_tradeno,char *trademoney,char *tradeday,char *tradetime){ int sendlen; unsigned char SendCommand[128]; short ret; unsigned char recvlen = 0; char recvbuf[256]; int i,k;// unsigned int random;// unsigned int trade_no; unsigned int money; char money1[20]; unsigned int time; unsigned int day; char time1[10]; char day1[10]; char *ptr; unsigned char trade_money[]={0x06}; char temp[20]; printf("-------PsamCreatMac111-------\n"); for(k=0;k<4;k++) printf("%X",pstmacdata.random[k]); printf("\n"); memset((char *)SendCommand, 0x00, sizeof(SendCommand));// sscanf(pstmacdata.random, "%08X", &random);// sscanf(pstmacdata.trade_no, "%04X", &trade_no); sprintf((char *)SendCommand, "%c%c%c%c%c%c",0x1c, 0x80,0x70,0x00,0x00, 0x2c); memcpy(SendCommand + 6, pstmacdata.random, 4); // memcpy(temp, &random, 4); // for(i = 0; i < 4; i++)// {// SendCommand[6+i] = temp[3-i];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -