From: Eugene Crosser Date: Fri, 1 Nov 2013 12:34:14 +0000 (+0400) Subject: introduce getserial op X-Git-Url: http://www.average.org/gitweb/?p=pam_pcsc_cr.git;a=commitdiff_plain;h=eea9460026cdcb2ac2dd3210a7376fa99c140af4 introduce getserial op --- diff --git a/pcsc_cr.c b/pcsc_cr.c index 52a18e7..b457cd8 100644 --- a/pcsc_cr.c +++ b/pcsc_cr.c @@ -87,6 +87,15 @@ long pcsc_cr(unsigned char *chal, int csize, unsigned char *resp, int *rsize) (void)SCardDisconnect(hCard, SCARD_LEAVE_CARD); } if (rc) goto free_out; +#if 0 + char serial[16]; + memset(serial, 'z', sizeof(serial)); + serial[sizeof(serial) - 1] - '\0'; + lrsize = sizeof(serial); + rc = type->getserial(hCard, &serial, &lrsize); + if (rc) goto disc_free_out; + printf("Serial is %s\n", serial); +#endif lrsize = *rsize; rc = type->trancieve(hCard, chal, csize, resp, &lrsize); if (rc) goto disc_free_out; diff --git a/token.h b/token.h index b1ef461..e857f03 100644 --- a/token.h +++ b/token.h @@ -10,6 +10,7 @@ struct token_interface { int (*parse_option)(char *key, char *val); DWORD (*check_atr_hb)(BYTE *str, DWORD size); DWORD (*prologue)(SCARDHANDLE hCard); + DWORD (*getserial)(SCARDHANDLE hCard, BYTE *recv, LPDWORD recvsize_p); DWORD (*trancieve)(SCARDHANDLE hCard, BYTE *send, DWORD sendsize, BYTE *recv, LPDWORD recvsize_p); DWORD (*epilogue)(SCARDHANDLE hCard); diff --git a/ykneo.c b/ykneo.c index 9fbe87e..be277f4 100644 --- a/ykneo.c +++ b/ykneo.c @@ -11,7 +11,7 @@ static const BYTE selcmd[] = {0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x05, 0x27, 0x20, 0x01, 0x00}; -static const BYTE cr_cmd[] = {0x00, 0x01, 0xff, 0x00}; +static const BYTE yk_cmd[] = {0x00, 0x01, 0xff, 0x00}; static BYTE cr_for_slot[3] = {0xff, 0x30, 0x38}; @@ -56,6 +56,28 @@ static DWORD ykn_prologue(SCARDHANDLE hCard) else return SCARD_W_CARD_NOT_AUTHENTICATED; } +static DWORD ykn_getserial(SCARDHANDLE hCard, BYTE *recv, LPDWORD recvsize_p) +{ + DWORD rc; + BYTE rbuf[4 + 2]; + DWORD rsize = sizeof(rbuf); + BYTE sbuf[sizeof(yk_cmd) + 1]; + unsigned int serial; + + memcpy(sbuf, yk_cmd, sizeof(yk_cmd)); + sbuf[2] = 0x10; /* read serial */ + sbuf[4] = rsize; + rc = SCardTransmit(hCard, &pioSendPci, sbuf, sizeof(sbuf), + NULL, rbuf, &rsize); + if (rc) return rc; + if ((rbuf[rsize-2] != 0x90) || (rbuf[rsize-1] != 0x00)) + return SCARD_W_CARD_NOT_AUTHENTICATED; + serial = (rbuf[0]<<24) + (rbuf[1]<<16) + (rbuf[2]<<8) + (rbuf[3]); + rc = snprintf(recv, *recvsize_p, "%u", serial); + *recvsize_p = rc; + return SCARD_S_SUCCESS; +} + static DWORD ykn_trancieve(SCARDHANDLE hCard, BYTE *send, DWORD sendsize, BYTE *recv, LPDWORD recvsize_p) { @@ -63,10 +85,10 @@ static DWORD ykn_trancieve(SCARDHANDLE hCard, DWORD rsize = *recvsize_p + 2; BYTE *rbuf = alloca(rsize); BYTE *sbuf = alloca(sendsize + 6); - memcpy(sbuf, cr_cmd, sizeof(cr_cmd)); + memcpy(sbuf, yk_cmd, sizeof(yk_cmd)); sbuf[2] = cr_for_slot[slot]; - sbuf[sizeof(cr_cmd)] = sendsize; - memcpy(sbuf + sizeof(cr_cmd) + 1, send, sendsize); + sbuf[sizeof(yk_cmd)] = sendsize; + memcpy(sbuf + sizeof(yk_cmd) + 1, send, sendsize); sbuf[sendsize + 5] = rsize; rc = SCardTransmit(hCard, &pioSendPci, sbuf, sendsize + 6, NULL, rbuf, &rsize); @@ -88,6 +110,7 @@ struct token_interface ykneo_interface = { .parse_option = ykn_parse_option, .check_atr_hb = ykn_check_atr_hb, .prologue = ykn_prologue, + .getserial = ykn_getserial, .trancieve = ykn_trancieve, .epilogue = ykn_epilogue, };