diff --git a/src/libopensc/opensc.h b/src/libopensc/opensc.h index 979ef6d1..898797b4 100644 --- a/src/libopensc/opensc.h +++ b/src/libopensc/opensc.h @@ -300,6 +300,9 @@ typedef struct sc_reader { const struct sc_reader_operations *ops; void *drv_data; char *name; + char *vendor; + unsigned char version_major; + unsigned char version_minor; unsigned long flags, capabilities; unsigned int supported_protocols, active_protocol; diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index 27610a6f..4afc9b65 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -47,6 +47,15 @@ #endif #endif +#define SCARD_CLASS_SYSTEM 0x7fff +#define SCARD_ATTR_VALUE(Class, Tag) ((((ULONG)(Class)) << 16) | ((ULONG)(Tag))) +#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003) +#define SCARD_ATTR_DEVICE_SYSTEM_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004) +#define SCARD_CLASS_VENDOR_INFO 1 +#define SCARD_ATTR_VENDOR_NAME SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0100) /**< Vendor name. */ +#define SCARD_ATTR_VENDOR_IFD_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0101) /**< Vendor-supplied interface device type (model designation of reader). */ +#define SCARD_ATTR_VENDOR_IFD_VERSION SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0102) /**< Vendor-supplied interface device version (DWORD in the form 0xMMmmbbbb where MM = major version, mm = minor version, and bbbb = build number). */ + /* Logging */ #define PCSC_TRACE(reader, desc, rv) do { sc_log(reader->ctx, "%s:" desc ": 0x%08lx\n", reader->name, rv); } while (0) #define PCSC_LOG(ctx, desc, rv) do { sc_log(ctx, desc ": 0x%08lx\n", rv); } while (0) @@ -727,7 +736,8 @@ static int pcsc_init(sc_context_t *ctx) gpriv->SCardListReaders = (SCardListReaders_t)sc_dlsym(gpriv->dlhandle, "SCardListReadersA"); /* If we have SCardGetAttrib it is correct API */ - if (sc_dlsym(gpriv->dlhandle, "SCardGetAttrib") != NULL) { + gpriv->SCardGetAttrib = (SCardGetAttrib_t)sc_dlsym(gpriv->dlhandle, "SCardGetAttrib"); + if (gpriv->SCardGetAttrib != NULL) { #ifdef __APPLE__ gpriv->SCardControl = (SCardControl_t)sc_dlsym(gpriv->dlhandle, "SCardControl132"); #endif @@ -1057,6 +1067,25 @@ static void detect_reader_features(sc_reader_t *reader, SCARDHANDLE card_handle) /* debug the product and vendor ID of the reader */ part10_get_vendor_product(reader, card_handle, NULL, NULL); } + + if(gpriv->SCardGetAttrib != NULL) { + if (gpriv->SCardGetAttrib(card_handle, SCARD_ATTR_VENDOR_NAME, + rbuf, &rcount) == SCARD_S_SUCCESS + && rcount > 0) { + /* add NUL termination, just in case... */ + rbuf[(sizeof rbuf)-1] = '\0'; + reader->vendor = strdup((char *) rbuf); + } + + rcount = sizeof rbuf; + if(gpriv->SCardGetAttrib(card_handle, SCARD_ATTR_VENDOR_IFD_VERSION, + rbuf, &rcount) == SCARD_S_SUCCESS + && rcount == 4) { + i = *(DWORD *) rbuf; + reader->version_major = (i >> 24) & 0xFF; + reader->version_minor = (i >> 16) & 0xFF; + } + } } static int pcsc_detect_readers(sc_context_t *ctx) @@ -2108,11 +2137,6 @@ struct sc_reader_driver * sc_get_pcsc_driver(void) #ifdef ENABLE_MINIDRIVER -#define SCARD_CLASS_SYSTEM 0x7fff -#define SCARD_ATTR_VALUE(Class, Tag) ((((ULONG)(Class)) << 16) | ((ULONG)(Tag))) -#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003) -#define SCARD_ATTR_DEVICE_SYSTEM_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004) - static int cardmod_connect(sc_reader_t *reader) { int r; diff --git a/src/pkcs11/slot.c b/src/pkcs11/slot.c index 11d4391c..b56590cb 100644 --- a/src/pkcs11/slot.c +++ b/src/pkcs11/slot.c @@ -55,8 +55,8 @@ static void init_slot_info(CK_SLOT_INFO_PTR pInfo) strcpy_bp(pInfo->slotDescription, "Virtual hotplug slot", 64); strcpy_bp(pInfo->manufacturerID, OPENSC_VS_FF_COMPANY_NAME, 32); pInfo->flags = CKF_REMOVABLE_DEVICE | CKF_HW_SLOT; - pInfo->hardwareVersion.major = 0; - pInfo->hardwareVersion.minor = 0; + pInfo->hardwareVersion.major = OPENSC_VERSION_MAJOR; + pInfo->hardwareVersion.minor = OPENSC_VERSION_MINOR; pInfo->firmwareVersion.major = 0; pInfo->firmwareVersion.minor = 0; } @@ -97,7 +97,10 @@ CK_RV create_slot(sc_reader_t *reader) init_slot_info(&slot->slot_info); if (reader != NULL) { slot->reader = reader; + strcpy_bp(slot->slot_info.manufacturerID, reader->vendor, 32); strcpy_bp(slot->slot_info.slotDescription, reader->name, 64); + slot->slot_info.hardwareVersion.major = reader->version_major; + slot->slot_info.hardwareVersion.minor = reader->version_minor; } return CKR_OK;