use SCardGetAttrib to initialize reader's metadata
This commit is contained in:
parent
415f15e3e2
commit
5403899444
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue