crypto iface compiles
[pam_pcsc_cr.git] / ykneo.c
diff --git a/ykneo.c b/ykneo.c
index 3399f711a0c8323fbf71c597c05af6763fd3d492..2510e18d307ab3f68a3d27a1f50f784c677eae38 100644 (file)
--- a/ykneo.c
+++ b/ykneo.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
 #include <string.h>
 #include <alloca.h>
 
@@ -7,9 +8,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 +38,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 +52,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 +74,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,