use SCardGetAttrib to initialize reader's metadata

This commit is contained in:
Frank Morgner 2015-12-10 06:21:56 +01:00 committed by Frank Morgner
parent 415f15e3e2
commit 5403899444
3 changed files with 38 additions and 8 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;