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(unsigned char *chal, int csize, unsigned char *resp, int *rsize)
42 struct token_interface *type;
44 SCARDCONTEXT hContext;
47 DWORD nrdrs = SCARD_AUTOALLOCATE, activeproto;
55 rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
57 rc = SCardListReaders(hContext, NULL, (LPTSTR)&readers, &nrdrs);
59 for (rdr=readers; rdr < readers + nrdrs - 1; rdr += strlen(rdr) + 1) {
60 rc = SCardConnect(hContext, rdr, SCARD_SHARE_SHARED,
61 SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
62 &hCard, &activeproto);
64 switch (activeproto) {
65 case SCARD_PROTOCOL_T0:
66 pioSendPci = *SCARD_PCI_T0;
68 case SCARD_PROTOCOL_T1:
69 pioSendPci = *SCARD_PCI_T1;
72 atrsize = sizeof(atr);
73 rc = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING,
75 if (rc) goto disconnect;
76 rc = find_hb(atr, atrsize, &hb, &hbsize);
77 if (rc) goto disconnect;
78 for (i = 0; types[i]; i++) {
80 rc = type->check_atr_hb(hb, hbsize);
83 if (rc) goto disconnect;
84 rc = type->prologue(hCard);
87 (void)SCardDisconnect(hCard, SCARD_LEAVE_CARD);
89 if (rc) goto free_out;
92 memset(serial, 'z', sizeof(serial));
93 serial[sizeof(serial) - 1] - '\0';
94 lrsize = sizeof(serial);
95 rc = type->getserial(hCard, &serial, &lrsize);
96 if (rc) goto disc_free_out;
97 printf("Serial is %s\n", serial);
100 rc = type->trancieve(hCard, chal, csize, resp, &lrsize);
101 if (rc) goto disc_free_out;
103 rc = type->epilogue(hCard);
105 (void)SCardDisconnect(hCard, SCARD_EJECT_CARD);
107 (void)SCardFreeMemory(hContext, readers);
111 char *pcsc_errstr(long err) {
112 return pcsc_stringify_error(err);
115 int pcsc_option(char *option)
117 char *name, *key, *val;
119 struct token_interface *type;
121 name=(char *)alloca(strlen(option)+1);
122 strcpy(name, option);
123 if ((key = strchr(name, ':'))) *(key++) = '\0';
125 if ((val = strchr(key, '='))) *(val++) = '\0';
127 if (*val == '\0') return -1;
128 for (i = 0; types[i]; i++) {
130 if (!strcmp(type->name,name)) {
131 rc = type->parse_option(key, val);