Added basic multivendor support for token information.

This commit is contained in:
Alessio Di Mauro
2015-07-03 17:23:16 +02:00
parent 2b2fe1f9fa
commit f95c6f2f2d
7 changed files with 154 additions and 13 deletions
+1 -1
View File
@@ -177,7 +177,7 @@ ykpiv_rc ykpiv_connect(ykpiv_state *state, const char *wanted) {
} }
// ********* // *********
reader_ptr = reader_buf; reader_ptr = reader_buf; // TODO: reader_buf is never free'd
if(wanted) { if(wanted) {
while(*reader_ptr != '\0') { while(*reader_ptr != '\0') {
if(strstr(reader_ptr, wanted)) { if(strstr(reader_ptr, wanted)) {
+2
View File
@@ -34,6 +34,8 @@ AM_CPPFLAGS += -I$(top_srcdir)/lib -I$(top_builddir)/lib
lib_LTLIBRARIES = libykcs11.la lib_LTLIBRARIES = libykcs11.la
libykcs11_la_SOURCES = ykcs11.c version.c ykcs11.pc.in ykcs11.map libykcs11_la_SOURCES = ykcs11.c version.c ykcs11.pc.in ykcs11.map
libykcs11_la_SOURCES += vendors.c vendor.h yubico.c yubico. h
#internal.h #internal.h
#libykcs11_la_SOURCES += error.c #libykcs11_la_SOURCES += error.c
#libykcs11_la_LDADD = ../lib/libykpiv.la #libykcs11_la_LDADD = ../lib/libykpiv.la
+28
View File
@@ -0,0 +1,28 @@
#include "vendors.h"
#include "yubico.h"
vendor_id_t get_vendor_id(char *vendor_name) {
vendor_id_t vid;
if (strncmp(vendor_name, "Yubico", 6) == 0)
return YUBICO;
return UNKNOWN;
}
vendor_t get_vendor(vendor_id_t vid) {
vendor_t v;
switch (vid) {
case YUBICO:
v.get_version = YUBICO_get_version;
break;
case UNKNOWN:
v.get_version = NULL;
}
return v;
}
+20
View File
@@ -0,0 +1,20 @@
#ifndef VENDORS_H
#define VENDORS_H
#include "pkcs11.h"
typedef enum {
UNKNOWN = 0x00,
YUBICO = 0x01
} vendor_id_t;
typedef CK_VERSION (*get_version_f)(char *, int);
typedef struct {
get_version_f get_version;
} vendor_t;
vendor_id_t get_vendor_id(char *vendor_name);
vendor_t get_vendor(vendor_id_t vid);
#endif
+66 -12
View File
@@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <ykpiv.h> #include <ykpiv.h>
#include <string.h> #include <string.h>
#include "vendors.h"
// TODO: do a bit of backend magic or should be handled by libykpiv? // TODO: do a bit of backend magic or should be handled by libykpiv?
@@ -111,21 +112,29 @@ CK_DEFINE_FUNCTION(CK_RV, C_GetSlotList)(
{ {
DIN; DIN;
unsigned long tot_readers_len; unsigned long tot_readers_len;
ykpiv_get_reader_slot_number(piv_state, pulCount, &tot_readers_len); unsigned long n_readers;
//DBG(("%u val %x ptr", *pulCount, pSlotList)); int i;
ykpiv_get_reader_slot_number(piv_state, &n_readers, &tot_readers_len); // TODO: maybe refactor this with a reader struct?
if (pSlotList == NULL_PTR) { if (pSlotList == NULL_PTR) {
// Just return the number of slots // Just return the number of slots
*pulCount = n_readers;
DOUT;
return CKR_OK; return CKR_OK;
} }
pSlotList[0] = 0;
return CKR_OK;
/*if ((*pulCount / sizeof(CK_SLOT_ID)) < tot_readers_len) {
DBG(("Buffer too small: needed %u, provided %u", tot_readers_len, *pulCount / sizeof(CK_SLOT_ID)))
return CKR_BUFFER_TOO_SMALL;
}*/
if (*pulCount < n_readers) {
DBG(("Buffer too small: needed %u, provided %u", n_readers, *pulCount));
return CKR_BUFFER_TOO_SMALL;
}
for (i = 0; i < n_readers; i++) {
pSlotList[i] = i;
}
DBG(("%d token", tokenPresent)); DBG(("%d token", tokenPresent));
DBG(("%u count", *pulCount)); DBG(("%u count", *pulCount));
DOUT;
return CKR_OK; return CKR_OK;
} }
@@ -140,14 +149,12 @@ CK_DEFINE_FUNCTION(CK_RV, C_GetSlotInfo)(
* name [interface] (serial) index slot * name [interface] (serial) index slot
* http://ludovicrousseau.blogspot.se/2010/05/what-is-in-pcsc-reader-name.html * http://ludovicrousseau.blogspot.se/2010/05/what-is-in-pcsc-reader-name.html
*/ */
ykpiv_get_reader_slot(piv_state, 0, pInfo->slotDescription); ykpiv_get_reader_slot(piv_state, slotID, pInfo->slotDescription); // TODO: should be ' ' padded
strcpy(pInfo->manufacturerID, "ADD SLOT MANUFACTURER NAME HERE"); strcpy(pInfo->manufacturerID, "ADD SLOT MANUFACTURER NAME HERE");
pInfo->flags = CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE | CKF_HW_SLOT; pInfo->flags = CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE | CKF_HW_SLOT; // TODO: What for other brands? Query for token status?
DBG(("slotID %u, pInfo %s", slotID, pInfo->slotDescription)); DBG(("slotID %u, pInfo %s", slotID, pInfo->slotDescription));
return CKR_OK; return CKR_OK;
} }
@@ -157,6 +164,53 @@ CK_DEFINE_FUNCTION(CK_RV, C_GetTokenInfo)(
) )
{ {
DIN; DIN;
CK_VERSION ver = {0, 0};
vendor_t yubico;
char buf[64];
ykpiv_get_version(piv_state, buf, 64);
yubico = get_vendor(get_vendor_id("Yubico"));
ver = yubico.get_version(buf, strlen(buf));
memset(pInfo->label, ' ', sizeof(pInfo->label));
strncpy(pInfo->label, "LABEL", 5);
memset(pInfo->manufacturerID, ' ', sizeof(pInfo->manufacturerID));
strncpy(pInfo->manufacturerID, "MANUFACTURER_ID", 15);
memset(pInfo->model, ' ', sizeof(pInfo->model));
strncpy(pInfo->model, "MODEL", 5);
memset(pInfo->serialNumber, ' ', sizeof(pInfo->serialNumber));
strncpy(pInfo->serialNumber, "12345", 5);
pInfo->flags = 0x00000400; // bit flags indicating capabilities and status of the device as defined below
pInfo->ulMaxSessionCount = CK_UNAVAILABLE_INFORMATION; // TODO: should this be 1?
pInfo->ulSessionCount = CK_UNAVAILABLE_INFORMATION; // number of sessions that this application currently has open with the token
pInfo->ulMaxRwSessionCount = CK_UNAVAILABLE_INFORMATION; // maximum number of read/write sessions that can be opened with the token at one time by a single TODO: should this be 1?
pInfo->ulRwSessionCount = CK_UNAVAILABLE_INFORMATION; // number of read/write sessions that this application currently has open with the token
pInfo->ulMaxPinLen = 127; // maximum length in bytes of the PIN
pInfo->ulMinPinLen = 3; // minimum length in bytes of the PIN
pInfo->ulTotalPublicMemory = CK_UNAVAILABLE_INFORMATION;
pInfo->ulFreePublicMemory = CK_UNAVAILABLE_INFORMATION;
pInfo->ulTotalPrivateMemory = CK_UNAVAILABLE_INFORMATION;
pInfo->ulFreePrivateMemory = CK_UNAVAILABLE_INFORMATION;
pInfo->hardwareVersion = ver; // version number of hardware
pInfo->firmwareVersion = ver; // version number of firmware
memset(pInfo->utcTime, ' ', sizeof(pInfo->utcTime));
return CKR_OK; return CKR_OK;
} }
+29
View File
@@ -0,0 +1,29 @@
#include "yubico.h"
#include "pkcs11.h"
CK_VERSION YUBICO_get_version(char *version, int len) {
CK_VERSION v = {0, 0};
int i = 0;
while (i < len && version[i] != '.') {
v.major *= 10;
v.major += version[i++] - '0';
}
i++;
while (i < len && version[i] != '.') {
v.minor *= 10;
v.minor += version[i++] - '0';
}
i++;
while (i < len && version[i] != '.') {
v.minor *= 10;
v.minor += version[i++] - '0';
}
return v;
}
+8
View File
@@ -0,0 +1,8 @@
#ifndef YUBICO_H
#define YUBICO_H
#include "pkcs11.h"
CK_VERSION YUBICO_get_version(char *version, int len);
#endif