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

📄 formaticc.c

📁 linux下的pcsclite
💻 C
字号:
/* * This is an APDU robot for pcsc-lite. * * MUSCLE SmartCard Development ( http://www.linuxnet.com ) * * Copyright (C) 2000-2002 *  David Corcoran <corcoran@linuxnet.com> *  Ludovic Rousseau <ludovic.rousseau@free.fr> * * $Id: formaticc.c,v 1.14 2004/08/06 12:12:18 rousseau Exp $ */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <wintypes.h>#include <winscard.h>#ifndef MAXHOSTNAMELEN#define MAXHOSTNAMELEN 64#endifint main(int argc, char *argv[]){	SCARDHANDLE hCard;	SCARDCONTEXT hContext;	SCARD_IO_REQUEST sRecvPci;	SCARD_READERSTATE_A rgReaderStates[1];	DWORD dwSendLength, dwRecvLength, dwPref, dwReaders;	LPTSTR mszReaders;	BYTE s[MAX_BUFFER_SIZE], r[MAX_BUFFER_SIZE];	LPCTSTR mszGroups;	LONG rv;	FILE *fp;	FILE *fo;	int i, p, iReader, cnum, iProtocol;	int iList[16];	char pcHost[MAXHOSTNAMELEN];	char pcAFile[FILENAME_MAX];	char pcOFile[FILENAME_MAX];	char line[80];	char *line_ptr;	unsigned int x;	printf("\nWinscard PC/SC Lite Test Program\n\n");	printf("Please enter the desired host (localhost for this machine) [localhost]: ");	fgets(line, sizeof(line), stdin);	if (line[0] == '\n')		strncpy(pcHost, "localhost", sizeof(pcHost)-1);	else		strncpy(pcHost, line, sizeof(pcHost)-1);	printf("Please input the desired transmit protocol (0/1) [0]: ");	fgets(line, sizeof(line), stdin);	if (line[0] == '\n')		iProtocol = 0;	else		sscanf(line, "%d", &iProtocol);	printf("Please input the desired input apdu file: ");	fgets(line, sizeof(line), stdin);	sscanf(line, "%s", pcAFile);	printf("Please input the desired output apdu file: ");	fgets(line, sizeof(line), stdin);	sscanf(line, "%s", pcOFile);	fp = fopen(pcAFile, "r");	if (fp == NULL)	{		perror(pcAFile);		return 1;	}	fo = fopen(pcOFile, "w");	if (fo == NULL)	{		perror(pcOFile);		return 1;	}	rv = SCardEstablishContext(SCARD_SCOPE_GLOBAL, pcHost, NULL, &hContext);	if (rv != SCARD_S_SUCCESS)	{		printf("ERROR :: Cannot Connect to Resource Manager\n");		return 1;	}	mszGroups = 0;	SCardListReaders(hContext, mszGroups, 0, &dwReaders);	mszReaders = (char *) malloc(sizeof(char) * dwReaders);	SCardListReaders(hContext, mszGroups, mszReaders, &dwReaders);	/*	 * Have to understand the multi-string here 	 */	p = 0;	for (i = 0; i < dwReaders - 1; i++)	{		++p;		printf("Reader %02d: %s\n", p, &mszReaders[i]);		iList[p] = i;		while (mszReaders[++i] != 0) ;	}	do	{		printf("Enter the desired reader number: ");		fgets(line, sizeof(line), stdin);		sscanf(line, "%d", &iReader);		printf("\n");		if (iReader > p || iReader <= 0)		{			printf("Invalid Value - try again\n");		}	}	while (iReader > p || iReader <= 0);	rgReaderStates[0].szReader = &mszReaders[iList[iReader]];	rgReaderStates[0].dwCurrentState = SCARD_STATE_EMPTY;	printf("Please insert a smart card\n");	SCardGetStatusChange(hContext, INFINITE, rgReaderStates, 1);	rv = SCardConnect(hContext, &mszReaders[iList[iReader]],		SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,		&hCard, &dwPref);	if (rv != SCARD_S_SUCCESS)	{		SCardReleaseContext(hContext);		printf("Error connecting to reader %ld\n", rv);		return 1;	}	/*	 * Now lets get some work done 	 */	SCardBeginTransaction(hCard);	cnum = 0;	do	{		cnum += 1;		if (fgets(line, sizeof(line), fp) == NULL)			break;		line_ptr = line;		if (sscanf(line_ptr, "%x", &x) == 0)			break;		dwSendLength = x;		line_ptr = strchr(line_ptr, ' ');		if (line_ptr == NULL)			break;		line_ptr++;		for (i = 0; i < dwSendLength; i++)		{			if (sscanf(line_ptr, "%x", &x) == 0)			{				printf("Corrupt APDU: %s\n", line);				SCardDisconnect(hCard, SCARD_RESET_CARD);				SCardReleaseContext(hContext);				return 1;			}			s[i] = x;			line_ptr = strchr(line_ptr, ' ');			if (line_ptr == NULL)				break;			line_ptr++;		}		printf("Processing Command %03d of length %03lX: %s", cnum,			dwSendLength, line);		memset(r, 0x00, MAX_BUFFER_SIZE);		dwRecvLength = MAX_BUFFER_SIZE;		if (iProtocol == 0)		{			rv = SCardTransmit(hCard, SCARD_PCI_T0, s, dwSendLength,				&sRecvPci, r, &dwRecvLength);		}		else		{			if (iProtocol == 1)			{				rv = SCardTransmit(hCard, SCARD_PCI_T1, s, dwSendLength,					&sRecvPci, r, &dwRecvLength);			}			else			{				printf("Invalid Protocol\n");				SCardDisconnect(hCard, SCARD_RESET_CARD);				SCardReleaseContext(hContext);				return 1;			}		}		if (rv != SCARD_S_SUCCESS)			fprintf(fo, ".error %ld\n", rv);		else		{			fprintf(fo, "%02ld ", dwRecvLength);			for (i = 0; i < dwRecvLength; i++)				fprintf(fo, "%02X ", r[i]);			fprintf(fo, "\n");		}		if (rv == SCARD_W_RESET_CARD)		{			SCardReconnect(hCard, SCARD_SHARE_SHARED,				SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,				SCARD_RESET_CARD, &dwPref);		}	}	while (1);	SCardEndTransaction(hCard, SCARD_LEAVE_CARD);	SCardDisconnect(hCard, SCARD_UNPOWER_CARD);	SCardReleaseContext(hContext);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -