📄 test_smcard.c
字号:
/*O_RDONLY 打开文件仅用于读。 O_WRONLY 打开文件仅用于写。 O_RDWR 打开文件用于读写。 O_CREAT 如果文件不存在,则创建,此时mode作为第三个参数给出。 */#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <string.h> #include <unistd.h> #define CMD_LEN 5#define RCV_BUF_LEN 100#define MAX_ATR_LEN 33#define SC_IOC_WARMACTIVATE 0#define SC_IOC_DEACTIVATE 1#define SC_IOC_ATRPROC 2#define SC_IOC_GETPPSRESULT 3#define SC_IOC_GETAPDUSULT 4#define SC_IOC_SETAPDUCMD 5#define SC_IOC_SETAPDUCMDNUM 6#define SC_IOC_SETPARAMETER 7#define SC_IOC_GETATR 8#define SC_IOC_EXECUTECMD 9#define SC_IOC_GETSTATUS 10#define SC_IOC_GETCARDEXIST 11typedef struct{ unsigned char protocol; unsigned char gtr_time; unsigned int fi; unsigned int di; unsigned int div_clock_multiple; unsigned char rm_parity; unsigned int cwi;}sc_parameter;typedef struct{ unsigned char atr_buffer[MAX_ATR_LEN]; // atr string unsigned int atr_len; // atr len unsigned int openflag; unsigned int exist; unsigned int fi; unsigned int di; unsigned char gtr_time; // gtr between characters ( in etus) unsigned char prot; unsigned int etu; // card-clk num unsigned int clock; // frequence in KHz unsigned char remove_parity; //remove parity bit, if =0, not remove ; if =1 remove unsigned int errno; // error number unsigned int cwt; //timeout value between characters( in etus) volatile unsigned int timeout; // 0 - no error 1 - timeout }SmartCard_Dev;//T=0命令unsigned char cmd_rd_bin[5] ={0x00,0xb0,0x00,0x00,0x0f};unsigned char cmd_sel_file[7] ={0x00,0xA4,0x00,0x00,0x02,0x2F,0x02};unsigned char cmd_get_radom[5] ={0x00,0x84,0x00,0x00,0x08};unsigned char cmd_get_resp[5] ={0x00,0xC0,0x00,0x00,0x00};unsigned char PPS_Q[4] = {0xff,0x10,0x11,0xfe};unsigned char PPS_R[6];unsigned char rcv[RCV_BUF_LEN];#define SIZE 35unsigned char atr_string[35];unsigned char pps_string[6];int card_exist = 0;sc_parameter p_parameter;SmartCard_Dev ps_parameter;static int fp;main(){ unsigned int i,j, k; int error; unsigned long loop = 0; memset(atr_string, 0, 35); if((fp=open("/dev/smcard",O_RDWR))== -1 ) { printf("cant open the sm_card dev\n"); return 0; } else printf("open the sm_card dev\n"); AGAIN: error = ioctl(fp, SC_IOC_GETCARDEXIST, &card_exist); while(!card_exist) ioctl(fp, SC_IOC_GETCARDEXIST, &card_exist); printf("\n"); sleep(1); memset(atr_string, 0, 35); ioctl(fp, SC_IOC_GETATR, atr_string); printf("ATR = \n"); for(i=0;i<SIZE-1;i++) { printf("0x%x ",atr_string[i]); } printf("\n"); p_parameter.protocol =0; p_parameter.gtr_time =0; p_parameter.fi = 1; p_parameter.di =1; p_parameter.div_clock_multiple = 9; p_parameter.rm_parity = 0; error = ioctl(fp, SC_IOC_SETPARAMETER, &p_parameter); printf("\n after set parameter error : %d\n",error);/* error = ioctl(fp, SC_IOC_GETSTATUS, &ps_parameter); printf("\n read parameter error : %d\n",error); printf("ps_parmeter.state = %d\n",ps_parameter.state); printf("ps_parmeter.atr_len = %d\n",ps_parameter.atr_len ); printf("ps_parmeter.openflag = %d\n",ps_parameter.openflag); printf("ps_parmeter.exist = %d\n",ps_parameter.exist); printf("ps_parmeter.fi = %d\n",ps_parameter.fi); printf("ps_parmeter.di = %d\n",ps_parameter.di); printf("ps_parmeter.gtr_time = %d\n",ps_parameter.gtr_time); printf("ps_parmeter.prot = %d\n",ps_parameter.prot); printf("ps_parmeter.etu = %d\n",ps_parameter.etu); printf("ps_parmeter.clock = %d\n",ps_parameter.clock); printf("ps_parmeter.remove_parity = %d\n",ps_parameter.remove_parity); printf("ps_parmeter.errno = %d\n",ps_parameter.errno);*/ error = ioctl(fp, SC_IOC_ATRPROC, NULL); printf("after atrproc... -:- %d\n",error); if(error > 0) { error = ioctl(fp, SC_IOC_WARMACTIVATE, rcv); printf("warm\n"); usleep(50000); goto AGAIN; }/* error = ioctl(fp, SC_IOC_GETPPSRESULT, &pps_string); printf("after get pps_result ... -:- %d\n",error); printf("pps_result = "); for(k=0; k<6; k++) printf("0x%x ",pps_string[k]); printf("\n"); for(k=0; k<RCV_BUF_LEN; k++) d_cmd_get_radom[k] = cmd_get_radom[k];*/ while(1) { i=5; j=8; //printf("\n**%4x : ",sc_T0_APDU(d_cmd_get_radom, &i, rcv, &j)); if(!(error = ioctl(fp, SC_IOC_SETAPDUCMDNUM, &i))) printf("cmdnum-:-%d\n",error); else { printf("cmdnum-:-%d\n",error); break; } if(!(error = ioctl(fp, SC_IOC_SETAPDUCMD, cmd_get_radom))) printf("cmd-:-%d\n",error); else { printf("cmd-:-%d\n",error); break; } error = ioctl(fp, SC_IOC_EXECUTECMD, NULL); printf("error = %x\n",error); if(error == 5) { //error = ioctl(fp, SC_IOC_WARMACTIVATE, rcv); //printf("write error\n",error); break; } printf("execucmd-:-%x\n",error); if(!(error = ioctl(fp, SC_IOC_GETAPDUSULT, rcv))) printf("result-:-%d\n",error); else { printf("result-:-%d\n",error); break; } for(k=0; k<8; k++) printf("0x%2x ",rcv[k]); printf("loop = %ld\n",++loop); memset(rcv, 0, 100); usleep(50000); } goto AGAIN; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -