framework-pkcs15.c: new logic to discover objects that were hidden before PIN verification
pkcs15.c: object search continues with normal processing, even if enumeration of some files failed pkcs15.h: obsolete prototype removed pkcs15-syn.c: now obsolete function sc_pkcs15emu_postponed_load removed fixes: #266 git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@4877 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
parent
0ad6771346
commit
5a183a8dc7
|
@ -423,34 +423,3 @@ int sc_pkcs15emu_object_add(sc_pkcs15_card_t *p15card, unsigned int type,
|
|||
return SC_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
sc_pkcs15emu_postponed_load(sc_pkcs15_card_t *p15card, unsigned long *loaded_mask)
|
||||
{
|
||||
sc_context_t *ctx = p15card->card->ctx;
|
||||
sc_pkcs15_df_t *df;
|
||||
int r;
|
||||
|
||||
SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE);
|
||||
|
||||
if (loaded_mask)
|
||||
*loaded_mask = 0;
|
||||
|
||||
for (df = p15card->df_list; df; df = df->next) {
|
||||
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Type:%X,enumerated:%i", df->type, df->enumerated);
|
||||
if (df->enumerated)
|
||||
continue;
|
||||
if (!p15card->ops.parse_df)
|
||||
continue;
|
||||
r = p15card->ops.parse_df(p15card, df);
|
||||
SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, r, "DF parse error");
|
||||
|
||||
if (loaded_mask)
|
||||
*loaded_mask |= (1 << df->type);
|
||||
}
|
||||
|
||||
if (loaded_mask)
|
||||
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Loaded mask 0x%lX", *loaded_mask);
|
||||
SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_SUCCESS);
|
||||
}
|
||||
|
||||
|
|
|
@ -941,7 +941,6 @@ __sc_pkcs15_search_objects(sc_pkcs15_card_t *p15card,
|
|||
/* Enumerate the DF's, so p15card->obj_list is
|
||||
* populated. */
|
||||
r = sc_pkcs15_parse_df(p15card, df);
|
||||
SC_TEST_RET(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, r, "DF parsing failed");
|
||||
}
|
||||
|
||||
/* And now loop over all objects */
|
||||
|
|
|
@ -795,7 +795,6 @@ int sc_pkcs15emu_add_x509_cert(sc_pkcs15_card_t *,
|
|||
const sc_pkcs15_object_t *, const sc_pkcs15_cert_info_t *);
|
||||
int sc_pkcs15emu_add_data_object(sc_pkcs15_card_t *,
|
||||
const sc_pkcs15_object_t *, const sc_pkcs15_data_info_t *);
|
||||
int sc_pkcs15emu_postponed_load(sc_pkcs15_card_t *, unsigned long *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -1104,39 +1104,52 @@ static CK_RV pkcs15_login(struct sc_pkcs11_slot *slot,
|
|||
return sc_to_cryptoki_error(rc, "C_Login");
|
||||
|
||||
if (userType == CKU_USER) {
|
||||
unsigned long loaded_mask;
|
||||
sc_pkcs15_object_t *p15_obj = p15card->obj_list;
|
||||
sc_pkcs15_search_key_t sk;
|
||||
|
||||
sc_debug(context, SC_LOG_DEBUG_NORMAL, "Check if pkcs15 object list can be completed.");
|
||||
rc = sc_pkcs15emu_postponed_load(p15card, &loaded_mask);
|
||||
if (rc < 0)
|
||||
return sc_to_cryptoki_error(rc, "C_Login");
|
||||
|
||||
if (loaded_mask & (1 << SC_PKCS15_PRKDF )) {
|
||||
unsigned ii, objs_num_before = fw_data->num_objects;
|
||||
int rv;
|
||||
/* Ensure non empty list */
|
||||
if (p15_obj == NULL)
|
||||
return CKR_OK;
|
||||
|
||||
sc_debug(context, SC_LOG_DEBUG_NORMAL, "PrKDF has been parsed loaded");
|
||||
rv = pkcs15_create_pkcs11_objects(fw_data, SC_PKCS15_TYPE_PRKEY_RSA,
|
||||
"private key", __pkcs15_create_prkey_object);
|
||||
if (rv < 0)
|
||||
return sc_to_cryptoki_error(rv, NULL);
|
||||
/* Select last object in list */
|
||||
while(p15_obj->next)
|
||||
p15_obj = p15_obj->next;
|
||||
|
||||
sc_debug(context, SC_LOG_DEBUG_NORMAL, "Added %i private key objects to PIN('%s',auth-id:%s)", rv,
|
||||
auth_object->label, sc_pkcs15_print_id(&pin_info->auth_id));
|
||||
for (ii=objs_num_before;ii<fw_data->num_objects;ii++) {
|
||||
struct sc_pkcs15_object *p15_object = fw_data->objects[ii]->p15_object;
|
||||
/* Trigger enumeration of EF.XXX files */
|
||||
memset(&sk, 0, sizeof(sk));
|
||||
sk.class_mask = SC_PKCS15_SEARCH_CLASS_PRKEY | SC_PKCS15_SEARCH_CLASS_PUBKEY |
|
||||
SC_PKCS15_SEARCH_CLASS_CERT | SC_PKCS15_SEARCH_CLASS_DATA;
|
||||
sc_pkcs15_search_objects(p15card, &sk, NULL, 0);
|
||||
|
||||
if (!sc_pkcs15_compare_id(&pin_info->auth_id, &p15_object->auth_id))
|
||||
/* Iterate over newly discovered objects */
|
||||
while(p15_obj->next) {
|
||||
struct pkcs15_any_object *fw_obj;
|
||||
|
||||
p15_obj = p15_obj->next;
|
||||
|
||||
if (!sc_pkcs15_compare_id(&pin_info->auth_id, &p15_obj->auth_id))
|
||||
continue;
|
||||
|
||||
__pkcs15_prkey_bind_related(fw_data, (struct pkcs15_prkey_object *) fw_data->objects[ii]);
|
||||
|
||||
pkcs15_add_object(slot, fw_data->objects[ii], NULL);
|
||||
switch (p15_obj->type & SC_PKCS15_TYPE_CLASS_MASK) {
|
||||
case SC_PKCS15_TYPE_PRKEY:
|
||||
__pkcs15_create_prkey_object(fw_data, p15_obj, &fw_obj); break;
|
||||
case SC_PKCS15_TYPE_PUBKEY:
|
||||
__pkcs15_create_pubkey_object(fw_data, p15_obj, &fw_obj); break;
|
||||
case SC_PKCS15_TYPE_CERT:
|
||||
__pkcs15_create_cert_object(fw_data, p15_obj, &fw_obj); break;
|
||||
case SC_PKCS15_TYPE_DATA_OBJECT:
|
||||
__pkcs15_create_data_object(fw_data, p15_obj, &fw_obj); break;
|
||||
default: continue;
|
||||
}
|
||||
|
||||
sc_debug(context, SC_LOG_DEBUG_NORMAL, "new object found: type=0x%03X", p15_obj->type);
|
||||
pkcs15_add_object(slot, fw_obj, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return sc_to_cryptoki_error(rc, "C_Login");
|
||||
return CKR_OK;
|
||||
}
|
||||
|
||||
static CK_RV pkcs15_logout(struct sc_pkcs11_card *p11card, void *fw_token)
|
||||
|
|
Loading…
Reference in New Issue