10 extern struct token_interface ykneo_interface;
12 static struct token_interface *types[] = {
17 SCARD_IO_REQUEST pioSendPci;
19 static LONG find_hb(BYTE *atr, DWORD atrsize, BYTE **hb, LPDWORD hbsize)
22 if (atrsize < 2) return SCARD_W_UNSUPPORTED_CARD;
26 default: return SCARD_W_UNSUPPORTED_CARD;
28 *hbsize = atr[1]&0x0f;
32 for (j = 0; j < 4; j++) if (cont & (0x01 << j)) i++;
33 } while ((cont & 0x08) && (i < atrsize));
34 if ((i + (*hbsize) + 2) != atrsize)
35 return SCARD_W_UNSUPPORTED_CARD;
37 return SCARD_S_SUCCESS;
40 long pcsc_cr(const unsigned char *chal, const int csize,
41 unsigned char *resp, int *rsize)
43 struct token_interface *type;
45 SCARDCONTEXT hContext;
48 DWORD nrdrs = SCARD_AUTOALLOCATE, activeproto;
56 rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
58 rc = SCardListReaders(hContext, NULL, (LPTSTR)&readers, &nrdrs);
60 for (rdr=readers; rdr < readers + nrdrs - 1; rdr += strlen(rdr) + 1) {
61 rc = SCardConnect(hContext, rdr, SCARD_SHARE_SHARED,
62 SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
63 &hCard, &activeproto);
65 switch (activeproto) {
66 case SCARD_PROTOCOL_T0:
67 pioSendPci = *SCARD_PCI_T0;
69 case SCARD_PROTOCOL_T1:
70 pioSendPci = *SCARD_PCI_T1;
73 atrsize = sizeof(atr);
74 rc = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING,
76 if (rc) goto disconnect;
77 rc = find_hb(atr, atrsize, &hb, &hbsize);
78 if (rc) goto disconnect;
79 for (i = 0; types[i]; i++) {
81 rc = type->check_atr_hb(hb, hbsize);
84 if (rc) goto disconnect;
85 rc = type->prologue(hCard);
88 (void)SCardDisconnect(hCard, SCARD_LEAVE_CARD);
90 if (rc) goto free_out;
93 memset(serial, 'z', sizeof(serial));
94 serial[sizeof(serial) - 1] - '\0';
95 lrsize = sizeof(serial);
96 rc = type->getserial(hCard, &serial, &lrsize);
97 if (rc) goto disc_free_out;
98 printf("Serial is %s\n", serial);
101 rc = type->trancieve(hCard, (BYTE*)chal, csize, resp, &lrsize);
102 if (rc) goto disc_free_out;
104 rc = type->epilogue(hCard);
106 (void)SCardDisconnect(hCard, SCARD_EJECT_CARD);
108 (void)SCardFreeMemory(hContext, readers);
112 char *pcsc_errstr(long err) {
113 return pcsc_stringify_error(err);
116 int pcsc_option(const char *option)
118 char *name, *key, *val;
120 struct token_interface *type;
122 name=(char *)alloca(strlen(option)+1);
123 strcpy(name, option);
124 if ((key = strchr(name, ':'))) *(key++) = '\0';
126 if ((val = strchr(key, '='))) *(val++) = '\0';
128 if (*val == '\0') return -1;
129 for (i = 0; types[i]; i++) {
131 if (!strcmp(type->name,name)) {
132 rc = type->parse_option(key, val);