X-Git-Url: http://www.average.org/gitweb/?p=pam_pcsc_cr.git;a=blobdiff_plain;f=ykneo.c;h=5a153a545dd3af4c1d9131d0bb3138465394f029;hp=3399f711a0c8323fbf71c597c05af6763fd3d492;hb=55045da5118553f462a83ff65540ae026c44bdb0;hpb=7c4066e68330f89016e939a6ad34036f9e00c11d diff --git a/ykneo.c b/ykneo.c index 3399f71..5a153a5 100644 --- a/ykneo.c +++ b/ykneo.c @@ -1,3 +1,7 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include #include #include @@ -7,9 +11,29 @@ static const BYTE selcmd[] = {0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x05, 0x27, 0x20, 0x01, 0x00}; -static const BYTE cr_cmd[] = {0x00, 0x01, 0x38, 0x00}; +static const BYTE cr_cmd[] = {0x00, 0x01, 0xff, 0x00}; -static DWORD ykn_check_atr_hb(LPTSTR str, DWORD size) +static BYTE cr_for_slot[3] = {0xff, 0x30, 0x38}; + +static int slot; + +static int ykn_parse_option(char *key, char *val) +{ + if (!strcmp(key, "slot")) { + if (!strcmp(val, "1")) { + slot = 1; + } else if (!strcmp(val, "2")) { + slot = 2; + } else { + return -1; + } + } else { + return -1; + } + return 0; +} + +static DWORD ykn_check_atr_hb(BYTE *str, DWORD size) { if (size < strlen(NAMEPFX)) return SCARD_W_UNSUPPORTED_CARD; if (memcmp(str, NAMEPFX, strlen(NAMEPFX))) @@ -17,7 +41,7 @@ static DWORD ykn_check_atr_hb(LPTSTR str, DWORD size) return SCARD_S_SUCCESS; } -static DWORD ykn_prologue(SCARDHANDLE hCard,LPTSTR envp[]) +static DWORD ykn_prologue(SCARDHANDLE hCard) { BYTE buf[258]; DWORD rsize = sizeof(buf); @@ -31,14 +55,15 @@ static DWORD ykn_prologue(SCARDHANDLE hCard,LPTSTR envp[]) else return SCARD_W_CARD_NOT_AUTHENTICATED; } -static DWORD ykn_trancieve(SCARDHANDLE hCard,LPTSTR envp[], - LPTSTR send, DWORD sendsize, LPTSTR recv, LPDWORD recvsize_p) +static DWORD ykn_trancieve(SCARDHANDLE hCard, + BYTE *send, DWORD sendsize, BYTE *recv, LPDWORD recvsize_p) { DWORD rc; DWORD rsize = *recvsize_p + 2; BYTE *rbuf = alloca(rsize); BYTE *sbuf = alloca(sendsize + 6); memcpy(sbuf, cr_cmd, sizeof(cr_cmd)); + sbuf[2] = cr_for_slot[slot]; sbuf[sizeof(cr_cmd)] = sendsize; memcpy(sbuf + sizeof(cr_cmd) + 1, send, sendsize); sbuf[sendsize + 5] = rsize; @@ -52,12 +77,14 @@ static DWORD ykn_trancieve(SCARDHANDLE hCard,LPTSTR envp[], return SCARD_S_SUCCESS; } -static DWORD ykn_epilogue(SCARDHANDLE hCard,LPTSTR envp[]) +static DWORD ykn_epilogue(SCARDHANDLE hCard) { return SCardEndTransaction(hCard, SCARD_LEAVE_CARD); } struct token_interface ykneo_interface = { + .name = "ykneo", + .parse_option = ykn_parse_option, .check_atr_hb = ykn_check_atr_hb, .prologue = ykn_prologue, .trancieve = ykn_trancieve,