5 extern struct token_interface ykneo_interface;
7 static struct token_interface *types[] = {
12 SCARD_IO_REQUEST pioSendPci;
14 static LONG find_hb(LPTSTR atr, DWORD atrsize, LPTSTR *hb, LPDWORD hbsize)
17 if (atrsize < 2) return SCARD_W_UNSUPPORTED_CARD;
21 default: return SCARD_W_UNSUPPORTED_CARD;
23 *hbsize = atr[1]&0x0f;
27 for (j = 0; j < 4; j++) if (cont & (0x01 << j)) i++;
28 } while ((cont & 0x08) && (i < atrsize));
29 if ((i + (*hbsize) + 2) != atrsize)
30 return SCARD_W_UNSUPPORTED_CARD;
32 return SCARD_S_SUCCESS;
35 long pcsc_cr(unsigned char *chal, int csize, unsigned char *resp, int *rsize)
37 struct token_interface *type;
39 SCARDCONTEXT hContext;
42 DWORD nrdrs = SCARD_AUTOALLOCATE, activeproto;
50 rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
52 rc = SCardListReaders(hContext, NULL, (LPTSTR)&readers, &nrdrs);
54 for (rdr=readers; rdr < readers + nrdrs - 1; rdr += strlen(rdr) + 1) {
55 rc = SCardConnect(hContext, rdr, SCARD_SHARE_SHARED,
56 SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
57 &hCard, &activeproto);
59 switch (activeproto) {
60 case SCARD_PROTOCOL_T0:
61 pioSendPci = *SCARD_PCI_T0;
63 case SCARD_PROTOCOL_T1:
64 pioSendPci = *SCARD_PCI_T1;
67 atrsize = sizeof(atr);
68 rc = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING,
70 if (rc) goto disconnect;
71 rc = find_hb(atr, atrsize, &hb, &hbsize);
72 if (rc) goto disconnect;
73 for (i = 0; types[i]; i++) {
75 rc = type->check_atr_hb(hb, hbsize);
78 if (rc) goto disconnect;
79 rc = type->prologue(hCard, NULL);
82 (void)SCardDisconnect(hCard, SCARD_LEAVE_CARD);
84 if (rc) goto free_out;
86 rc = type->trancieve(hCard, NULL, chal, csize, resp, &lrsize);
87 if (rc) goto disc_free_out;
89 rc = type->epilogue(hCard, NULL);
91 (void)SCardDisconnect(hCard, SCARD_EJECT_CARD);
93 (void)SCardFreeMemory(hContext, readers);
97 char *pcsc_errstr(long err) {
98 return pcsc_stringify_error(err);