에스토니아 ID 카드의 개인 파일을 읽으려고합니다. 그러나, 에스토니아 ID 카드에 연결할 때 WinSCard SCARD_E_PROTO_MISMATCH
00 A4 00 0C # We choose root folder
00 A4 01 0C 02 EE EE # We choose folder EEEE
00 A4 02 04 02 50 44 # We choose file 5044, which contains personal data
00 B2 XX 04 # We read record XX (see table) from the personal data file
# The card responds 61 YY, where YY denotes the number of bytes waiting to be read
00 C0 00 00 YY # We read YY bytes from the card
# Card responds ... 90 00, where ... is the requested data and 90 00 means status OK
:
나는 개인 파일의 레코드 (즉, ID 번호, 이름 등)를 읽기 위해 ( here에서) 카드에 다음 데이터를 보낼 필요 원시 바이트는 T = 0 프로토콜에 있고 카드는 T = 0을 승인하기 전에 부당하게 오랜 시간 동안 T = 1에 고착됩니다.
- 카드
SCardStatusChange
에서 독자에게 - 프로그램 수익을 부착하고 카드 (
SCardConnect
또는SCardReconnect
)SCARD_E_SHARING_VIOLATION
가 수신 오류에 연결을 시도에 카드 - 에게 처리 시작 다음과 같이 이벤트의 순서는 이상 약 5 초
- 그런 다음 연결하려고하면
SCARD_E_PROTO_MISMATCH
오류가 3 ~ 30 초 사이에 수신됩니다. - 그런 다음 카드가 성공적으로 연결되고 데이터를 읽습니다.
T = 0 프로토콜에서 어떻게 든 더 빨리 연결할 수 있습니까? 다음과 같이
내 소스 코드의 단순화 된 버전입니다 : 당신 만 T0
프로토콜에 대한 독점 액세스를 위해 SCardConnect()
을 요구하고있다
// NOTE: this is approximately what I do.
// I haven't tested this code yet - it's almost 1 AM here.
#include <winscard.h>
void readSmartCard() {
LONG sCardErrorCode;
SCARDCONTEXT sCardContext;
DWORD sCardReaderStrLen = 1024;
wchar_t sCardReaderStr[1024];
SCARDHANDLE sCardHandle;
DWORD sCardActiveProtocol;
SCARD_READERSTATE readerState;
sCardErrorCode = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &sCardContext);
// error handling macro
ZeroMemory(&sCardReaderState, sizeof(sCardReaderState));
sCardReaderState.szReader = L"\\\\?PnP?\\Notification";
sCardReaderState.pvUserData = nullptr;
sCardReaderState.dwEventState = SCARD_STATE_PRESENT;
sCardErrorCode = SCardGetStatusChange(sCardContext, INFINITE, &readerState, 1);
// e.h.m
if (readerState.dwCurrentState == 65538) {
sCardErrorCode = SCardListReaders(sCardContext, NULL, sCardReaderStr, &sCardReaderStrLen);
// e.h.m
readerState.szReader = sCardReaderStr;
}
sCardErrorCode = SCardGetStatusChange(sCardContext, INFINITE, &readerState, 1);
// e.h.m
if (sCardReaderState.dwEventState & SCARD_STATE_PRESENT) {
while (true) {
sCardErrorCode = SCardConnect(sCardContext, readerState.szReader, SCARD_SHARE_EXCLUSIVE,
SCARD_PROTOCOL_T0, &sCardHandle, &sCardActiveProtocol);
// e.h.m
printf("%x", sCardErrorCode);
// this will print:
// 8010000b (for around 5s)
// 8010000f (for around 20s)
if (sCardErrorCode == SCARD_S_SUCCESS) {
break;
}
Sleep(1000);
}
// open personal file and read data, yay!
}
}
1) 연결을 위해 사용 된 프로토콜은 성능에서 눈에 띄는 차이를 만들어서는 안됩니다. 2) T = 0과 T = 1을 지원하는 카드는 매우 특이합니다. 3) 의심스러운 경우 항상 T = 1을 사용합니다. 적용하기 쉽고 안전한 메시징과 관련하여 더욱 강력합니다. – guidot