/** * gck_module_get_info: * @self: The module to get info for. * * Get the info about a PKCS#11 module. * * Return value: The module info. Release this with gck_module_info_free(). **/ GckModuleInfo* gck_module_get_info (GckModule *self) { GckModuleInfo *modinfo; CK_INFO info; CK_RV rv; g_return_val_if_fail (GCK_IS_MODULE (self), NULL); g_return_val_if_fail (self->pv->funcs, NULL); memset (&info, 0, sizeof (info)); rv = (self->pv->funcs->C_GetInfo (&info)); if (rv != CKR_OK) { g_warning ("couldn't get module info: %s", gck_message_from_rv (rv)); return NULL; } modinfo = g_new0 (GckModuleInfo, 1); modinfo->flags = info.flags; modinfo->library_description = gck_string_from_chars (info.libraryDescription, sizeof (info.libraryDescription)); modinfo->manufacturer_id = gck_string_from_chars (info.manufacturerID, sizeof (info.manufacturerID)); modinfo->library_version_major = info.libraryVersion.major; modinfo->library_version_minor = info.libraryVersion.minor; modinfo->pkcs11_version_major = info.cryptokiVersion.major; modinfo->pkcs11_version_minor = info.cryptokiVersion.minor; return modinfo; }
GckModuleInfo* _gck_module_info_from_pkcs11 (CK_INFO_PTR info) { GckModuleInfo *modinfo; modinfo = g_new0 (GckModuleInfo, 1); modinfo->flags = info->flags; modinfo->library_description = gck_string_from_chars (info->libraryDescription, sizeof (info->libraryDescription)); modinfo->manufacturer_id = gck_string_from_chars (info->manufacturerID, sizeof (info->manufacturerID)); modinfo->library_version_major = info->libraryVersion.major; modinfo->library_version_minor = info->libraryVersion.minor; modinfo->pkcs11_version_major = info->cryptokiVersion.major; modinfo->pkcs11_version_minor = info->cryptokiVersion.minor; return modinfo; }
/** * gck_slot_get_info: * @self: The slot to get info for. * * Get the information for this slot. * * Return value: The slot information. When done, use gck_slot_info_free() * to release it. **/ GckSlotInfo* gck_slot_get_info (GckSlot *self) { CK_SLOT_ID handle = (CK_SLOT_ID)-1; GckModule *module = NULL; CK_FUNCTION_LIST_PTR funcs; GckSlotInfo *slotinfo; CK_SLOT_INFO info; CK_RV rv; g_return_val_if_fail (GCK_IS_SLOT (self), NULL); g_object_get (self, "module", &module, "handle", &handle, NULL); g_return_val_if_fail (GCK_IS_MODULE (module), NULL); funcs = gck_module_get_functions (module); g_return_val_if_fail (funcs, NULL); memset (&info, 0, sizeof (info)); rv = (funcs->C_GetSlotInfo) (handle, &info); g_object_unref (module); if (rv != CKR_OK) { g_warning ("couldn't get slot info: %s", gck_message_from_rv (rv)); return NULL; } slotinfo = g_new0 (GckSlotInfo, 1); slotinfo->slot_description = gck_string_from_chars (info.slotDescription, sizeof (info.slotDescription)); slotinfo->manufacturer_id = gck_string_from_chars (info.manufacturerID, sizeof (info.manufacturerID)); slotinfo->flags = info.flags; slotinfo->hardware_version_major = info.hardwareVersion.major; slotinfo->hardware_version_minor = info.hardwareVersion.minor; slotinfo->firmware_version_major = info.firmwareVersion.major; slotinfo->firmware_version_minor = info.firmwareVersion.minor; return slotinfo; }
/** * gck_slot_get_token_info: * @self: The slot to get info for. * * Get the token information for this slot. * * Return value: The token information. When done, use gck_token_info_free() * to release it. **/ GckTokenInfo* gck_slot_get_token_info (GckSlot *self) { CK_SLOT_ID handle = (CK_SLOT_ID)-1; CK_FUNCTION_LIST_PTR funcs; GckModule *module = NULL; GckTokenInfo *tokeninfo; CK_TOKEN_INFO info; gchar *string; struct tm tm; CK_RV rv; g_return_val_if_fail (GCK_IS_SLOT (self), NULL); g_object_get (self, "module", &module, "handle", &handle, NULL); g_return_val_if_fail (GCK_IS_MODULE (module), NULL); funcs = gck_module_get_functions (module); g_return_val_if_fail (funcs, NULL); memset (&info, 0, sizeof (info)); rv = (funcs->C_GetTokenInfo) (handle, &info); g_object_unref (module); if (rv != CKR_OK) { g_warning ("couldn't get slot info: %s", gck_message_from_rv (rv)); return NULL; } tokeninfo = g_new0 (GckTokenInfo, 1); tokeninfo->label = gck_string_from_chars (info.label, sizeof (info.label)); tokeninfo->model = gck_string_from_chars (info.model, sizeof (info.model)); tokeninfo->manufacturer_id = gck_string_from_chars (info.manufacturerID, sizeof (info.manufacturerID)); tokeninfo->serial_number = gck_string_from_chars (info.serialNumber, sizeof (info.serialNumber)); tokeninfo->flags = info.flags; tokeninfo->max_session_count = info.ulMaxSessionCount; tokeninfo->session_count = info.ulSessionCount; tokeninfo->max_rw_session_count = info.ulMaxRwSessionCount; tokeninfo->rw_session_count = info.ulRwSessionCount; tokeninfo->max_pin_len = info.ulMaxPinLen; tokeninfo->min_pin_len = info.ulMinPinLen; tokeninfo->total_public_memory = info.ulTotalPublicMemory; tokeninfo->total_private_memory = info.ulTotalPrivateMemory; tokeninfo->free_private_memory = info.ulFreePrivateMemory; tokeninfo->free_public_memory = info.ulFreePublicMemory; tokeninfo->hardware_version_major = info.hardwareVersion.major; tokeninfo->hardware_version_minor = info.hardwareVersion.minor; tokeninfo->firmware_version_major = info.firmwareVersion.major; tokeninfo->firmware_version_minor = info.firmwareVersion.minor; /* Parse the time into seconds since epoch */ if (info.flags & CKF_CLOCK_ON_TOKEN) { string = g_strndup ((gchar*)info.utcTime, MIN (14, sizeof (info.utcTime))); if (!strptime (string, "%Y%m%d%H%M%S", &tm)) tokeninfo->utc_time = -1; else tokeninfo->utc_time = timegm (&tm); g_free (string); } else { tokeninfo->utc_time = -1; } return tokeninfo; }