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

📄 ic_card.c

📁 金融IC卡读写器函数
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -