rtecp: fix delete private key
when deleting private key, delete also it's internal public part Fix #671 Fix #705
This commit is contained in:
parent
f98c8cd37c
commit
0838520b62
|
@ -355,6 +355,7 @@ static int rtecp_create_key(sc_profile_t *profile, sc_pkcs15_card_t *p15card,
|
||||||
SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_OUT_OF_MEMORY);
|
SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_OUT_OF_MEMORY);
|
||||||
file->id = key_info->key_reference;
|
file->id = key_info->key_reference;
|
||||||
r = sc_file_set_type_attr(file, (const u8*)"\x10\x00", 2);
|
r = sc_file_set_type_attr(file, (const u8*)"\x10\x00", 2);
|
||||||
|
|
||||||
/* private key file */
|
/* private key file */
|
||||||
if (obj->type == SC_PKCS15_TYPE_PRKEY_RSA)
|
if (obj->type == SC_PKCS15_TYPE_PRKEY_RSA)
|
||||||
file->size = key_info->modulus_length / 8 / 2 * 5 + 8;
|
file->size = key_info->modulus_length / 8 / 2 * 5 + 8;
|
||||||
|
@ -375,8 +376,10 @@ static int rtecp_create_key(sc_profile_t *profile, sc_pkcs15_card_t *p15card,
|
||||||
else
|
else
|
||||||
r = sc_file_set_prop_attr(file, prgkey_prop,sizeof(prgkey_prop));
|
r = sc_file_set_prop_attr(file, prgkey_prop,sizeof(prgkey_prop));
|
||||||
}
|
}
|
||||||
if (r == SC_SUCCESS)
|
if (r == SC_SUCCESS) {
|
||||||
|
sc_log(ctx, "create private key file id:%04i", file->id);
|
||||||
r = sc_create_file(p15card->card, file);
|
r = sc_create_file(p15card->card, file);
|
||||||
|
}
|
||||||
/* public key file */
|
/* public key file */
|
||||||
if (obj->type == SC_PKCS15_TYPE_PRKEY_RSA)
|
if (obj->type == SC_PKCS15_TYPE_PRKEY_RSA)
|
||||||
file->size = key_info->modulus_length / 8 / 2 * 3;
|
file->size = key_info->modulus_length / 8 / 2 * 3;
|
||||||
|
@ -396,8 +399,10 @@ static int rtecp_create_key(sc_profile_t *profile, sc_pkcs15_card_t *p15card,
|
||||||
else
|
else
|
||||||
r = sc_file_set_prop_attr(file, pbgkey_prop,sizeof(pbgkey_prop));
|
r = sc_file_set_prop_attr(file, pbgkey_prop,sizeof(pbgkey_prop));
|
||||||
}
|
}
|
||||||
if (r == SC_SUCCESS)
|
if (r == SC_SUCCESS) {
|
||||||
|
sc_log(ctx, "create public key file id:%04i", file->id);
|
||||||
r = sc_create_file(p15card->card, file);
|
r = sc_create_file(p15card->card, file);
|
||||||
|
}
|
||||||
assert(file);
|
assert(file);
|
||||||
sc_file_free(file);
|
sc_file_free(file);
|
||||||
SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, r);
|
SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, r);
|
||||||
|
@ -630,6 +635,51 @@ static int rtecp_finalize(sc_card_t *card)
|
||||||
return sc_card_ctl(card, SC_CARDCTL_RTECP_INIT_END, NULL);
|
return sc_card_ctl(card, SC_CARDCTL_RTECP_INIT_END, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Delete object
|
||||||
|
*
|
||||||
|
* Applied to private key: used to delete public part internal file
|
||||||
|
*/
|
||||||
|
static int rtecp_delete_object(struct sc_profile *profile, struct sc_pkcs15_card *p15card,
|
||||||
|
struct sc_pkcs15_object *obj, const struct sc_path *path)
|
||||||
|
{
|
||||||
|
sc_context_t *ctx;
|
||||||
|
sc_file_t *df;
|
||||||
|
sc_path_t pubkey_path;
|
||||||
|
int key_ref;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (!profile || !p15card || !p15card->card || !p15card->card->ctx)
|
||||||
|
return SC_ERROR_INVALID_ARGUMENTS;
|
||||||
|
|
||||||
|
ctx = p15card->card->ctx;
|
||||||
|
LOG_FUNC_CALLED(ctx);
|
||||||
|
sc_log(ctx, "delete object: type %X, path %s", obj->type, sc_print_path(path));
|
||||||
|
|
||||||
|
if ((obj->type & SC_PKCS15_TYPE_CLASS_MASK) != SC_PKCS15_TYPE_PRKEY)
|
||||||
|
LOG_FUNC_RETURN(ctx, SC_ERROR_NOT_SUPPORTED);
|
||||||
|
|
||||||
|
key_ref = ((struct sc_pkcs15_prkey_info *)obj->data)->key_reference;
|
||||||
|
sc_log(ctx, "key reference %04i", key_ref);
|
||||||
|
|
||||||
|
r = sc_profile_get_file(profile, "PuKey-DF", &df);
|
||||||
|
LOG_TEST_RET(ctx, r, "Get PuKey-DF info failed");
|
||||||
|
pubkey_path = df->path;
|
||||||
|
sc_file_free(df);
|
||||||
|
|
||||||
|
r = sc_append_file_id(&pubkey_path, key_ref);
|
||||||
|
LOG_TEST_RET(ctx, r, "Append ID to file failed");
|
||||||
|
|
||||||
|
sc_log(ctx, "delete pubkey file %s", sc_print_path(&pubkey_path));
|
||||||
|
r = sc_pkcs15init_delete_by_path(profile, p15card, &pubkey_path);
|
||||||
|
if (r && r != SC_ERROR_FILE_NOT_FOUND)
|
||||||
|
LOG_FUNC_RETURN(ctx, r);
|
||||||
|
|
||||||
|
LOG_FUNC_RETURN(ctx, SC_ERROR_NOT_SUPPORTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct sc_pkcs15init_operations sc_pkcs15init_rtecp_operations = {
|
static struct sc_pkcs15init_operations sc_pkcs15init_rtecp_operations = {
|
||||||
rtecp_erase, /* erase_card */
|
rtecp_erase, /* erase_card */
|
||||||
rtecp_init, /* init_card */
|
rtecp_init, /* init_card */
|
||||||
|
@ -644,7 +694,7 @@ static struct sc_pkcs15init_operations sc_pkcs15init_rtecp_operations = {
|
||||||
NULL, /* encode_private_key */
|
NULL, /* encode_private_key */
|
||||||
NULL, /* encode_public_key */
|
NULL, /* encode_public_key */
|
||||||
rtecp_finalize, /* finalize_card */
|
rtecp_finalize, /* finalize_card */
|
||||||
NULL, /* delete_object */
|
rtecp_delete_object, /* delete_object */
|
||||||
NULL, NULL, NULL, NULL, NULL, /* pkcs15init emulation */
|
NULL, NULL, NULL, NULL, NULL, /* pkcs15init emulation */
|
||||||
NULL /* sanity_check */
|
NULL /* sanity_check */
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue