⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_smcard.c

📁 smart card智能卡的读写测试程序
💻 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 + -