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

📄 main.cpp

📁 台灣自然人憑證登入系統java card login 走PKCS-15
💻 CPP
字号:
//The following example shows locating smart cards.
//THIS SAMPLE CODE IS COPY FORM PLATFROM SDK -- SCardLocateCards SESSION
// MODIFY BY ANDY HUA.
//History: 2005/04/18 add the G&D STARCOS SPK 2.3 MOICA card testing command.

#include <stdio.h>
#include <conio.h>
#include <winscard.h>
#include <tchar.h>
#include "SCcommand.h"


HRESULT __cdecl main()
{
	HRESULT           hr = S_OK;
	LPTSTR            szReaders, szRdr;
	DWORD             cchReaders = SCARD_AUTOALLOCATE;
	DWORD             dwI, dwRdrCount;
	SCARD_READERSTATE rgscState[MAXIMUM_SMARTCARD_READERS];
	TCHAR             szCard[MAX_PATH];
	SCARDCONTEXT      hSC;
	SCARDHANDLE		  hCardHandle;		//Handle pointer for Smart card library
	DWORD			  dwActiveProtocol;	//connect to smart card used active protocol
	LONG              lReturn;
	
	// Establish the card to watch for.
	// Multiple cards can be looked for, but
	// this sample looks for only one card.
	

	//======CHANGE YOUR INSERT CARD FRIENDLY NAME IN REGISTRY!!========
	//lstrcpy( szCard, TEXT("GemSAFE"));
	//lstrcpy( szCard, TEXT("Schlumberger Cyberflex Palmera 32K"));
	lstrcpy( szCard, TEXT("STARCOS SPK 2.3"));
	//======CHANGE YOUR INSERT CARD FRIENDLY NAME IN REGISTRY!!========

	
	szCard[lstrlen(szCard) + 1] = 0;  // Double trailing zero.
	
	// Establish a context.
	lReturn = SCardEstablishContext(SCARD_SCOPE_USER,
	                                NULL,
	                                NULL,
	                                &hSC );
	if ( SCARD_S_SUCCESS != lReturn )
	{
	    printf("Failed SCardEstablishContext\n");
	    exit(1);
	}
	
	// Determine which readers are available.
	lReturn = SCardListReaders(hSC,
	                           NULL,
	                           (LPTSTR)&szReaders,
	                           &cchReaders );
	if ( SCARD_S_SUCCESS != lReturn )
	{
	    printf("Failed SCardListReaders\n");
	    exit(1);
	}
	// Place the readers into the state array.
	szRdr = szReaders;
	for ( dwI = 0; dwI < MAXIMUM_SMARTCARD_READERS; dwI++ )
	{
	    if ( 0 == *szRdr )
	        break;
	    rgscState[dwI].szReader = szRdr;
	    rgscState[dwI].dwCurrentState = SCARD_STATE_UNAWARE;
	    szRdr += lstrlen(szRdr) + 1;
	}
	dwRdrCount = dwI;
	
	// If any readers are available, proceed.
	if ( 0 != dwRdrCount )
	{
	  for (;;)
	  { 
	    //wait until there is a change
	    _tprintf( TEXT("Waiting for Card : '%s'.\n"),
	                     szCard );
		

		// Card not found yet; wait until there is a change.
	    lReturn = SCardGetStatusChange(hSC,
									 INFINITE, // infinite wait
									 rgscState,
									 dwRdrCount );
	    if ( SCARD_S_SUCCESS != lReturn )
		{
		  printf("Failed SCardGetStatusChange\n");
		  exit(1);
		}

		// Look for the card.
	    lReturn = SCardLocateCards(hSC,
	                               szCard,
	                               rgscState,
	                               dwRdrCount );
	    if ( SCARD_S_SUCCESS != lReturn )
	    {
	        printf("Failed SCardLocateCards\n");
	        //exit(1);
	    }

	
	    // Look through the array of readers.
	    for ( dwI=0; dwI < dwRdrCount; dwI++)
	    {
	        if ( 0 != ( SCARD_STATE_ATRMATCH & 
	                    rgscState[dwI].dwEventState))
	        {
	           _tprintf( TEXT("Card '%s' found in reader '%s'.\n"),
	                     szCard,
	                     rgscState[dwI].szReader );
	            SCardFreeMemory( hSC,
	                             szReaders );

	            goto SEND_SCCOMMAND;
				//return 0;  // Context will be release automatically.
	        }
	        // Update the state.
	        rgscState[dwI].dwCurrentState = rgscState[dwI].dwEventState;
	    }
	

	 }  // for (;;)
	}
	else
	    printf("No readers available\n");
	
	
	//==================================================================================
	//append the Smart Card APDU command used SCardTransmit API
	//used the MOICA PKI card API, see CardApi.cpp

SEND_SCCOMMAND:

	// Connect to SmartCard
	lReturn = SCardConnect ( hSC,
							 _T("O2 O2Micro CCID SC Reader 0"),
							 SCARD_SHARE_SHARED,
							 SCARD_PROTOCOL_T1|SCARD_PROTOCOL_T0,
							 &hCardHandle,
							 &dwActiveProtocol 
						   );

	if ( lReturn != SCARD_S_SUCCESS )
	{
		printf("Failed SCardConnect!\n");
		exit(1);
	}
	
	//read MOICA card SN
	BYTE MOICAserialNumber[16];
	int MOICAserialNumberLen;

	lReturn = Getcardserialnumber( 	hCardHandle, 
									MOICAserialNumber,
									&MOICAserialNumberLen);
	if ( lReturn != SCARD_S_SUCCESS )
	{
		printf("Failed Get MOICA card serialnumber!\n");
		exit(1);
	}
	_tprintf( TEXT("Your MOICA Card SN : '%s'\n"), MOICAserialNumber);

	printf(" --> Press any key to continue\n");
	getch();

	//read MOICA card signature
	BYTE certificate[1500];

	lReturn = Readcertificate( 	hCardHandle, 
								certificate);
	if ( lReturn != SCARD_S_SUCCESS )
	{
		printf("Failed Read MOICA card certificate!\n");
		exit(1);
	}
	printf(" --> End Read your MOICA card certificate EF, totally 1500 bytes.\n");

	//==================================================================================
	
	// Release the context.
	lReturn = SCardReleaseContext(hSC);
	if ( SCARD_S_SUCCESS != lReturn )
	{
	    printf("Failed SCardReleaseContext\n");
	    exit(1);
	}
	
	SCardFreeMemory( hSC,
	                 szReaders );
	
	return hr;
}








⌨️ 快捷键说明

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