From 955a3391481f6b116ee38f4d6762c6fd3967551c Mon Sep 17 00:00:00 2001 From: Philip Wendland Date: Thu, 25 Sep 2014 17:12:02 +0200 Subject: [PATCH] Merge PR#288 from philipWendland:upstream-ecc-fix add the possibility to store public ECC keys encoded according to SPKI EC pubkey storing: Check if params are available before copying. pkcs15-lib.c / sc_pkcs15init_store_public_key may be called with keyargs->key.u.ec.params.value == NULL. In this case, allocating and copying the parameters will fail. Add a check to prevent this. --- src/libopensc/pkcs15-pubkey.c | 5 ++++- src/pkcs15init/pkcs15-lib.c | 13 ++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/libopensc/pkcs15-pubkey.c b/src/libopensc/pkcs15-pubkey.c index 146e0b29..b7a585f5 100644 --- a/src/libopensc/pkcs15-pubkey.c +++ b/src/libopensc/pkcs15-pubkey.c @@ -944,7 +944,10 @@ sc_pkcs15_read_pubkey(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_obj r = sc_pkcs15_read_file(p15card, &info->path, &data, &len); LOG_TEST_RET(ctx, r, "Failed to read public key file."); - r = sc_pkcs15_decode_pubkey(ctx, pubkey, data, len); + if (algorithm == SC_ALGORITHM_EC && *data == (SC_ASN1_TAG_SEQUENCE | SC_ASN1_TAG_CONSTRUCTED)) + r = sc_pkcs15_pubkey_from_spki_sequence(ctx, data, len, &pubkey); + else + r = sc_pkcs15_decode_pubkey(ctx, pubkey, data, len); LOG_TEST_RET(ctx, r, "Decode public key error"); } else { diff --git a/src/pkcs15init/pkcs15-lib.c b/src/pkcs15init/pkcs15-lib.c index cac658c8..913450a2 100644 --- a/src/pkcs15init/pkcs15-lib.c +++ b/src/pkcs15init/pkcs15-lib.c @@ -1547,6 +1547,14 @@ sc_pkcs15init_store_public_key(struct sc_pkcs15_card *p15card, struct sc_profile } else if (key.algorithm == SC_ALGORITHM_EC) { key_info->field_length = keybits; + if (key.u.ec.params.der.value) { + key_info->params.data = malloc(key.u.ec.params.der.len); + if (!key_info->params.data) { + LOG_TEST_RET(ctx, SC_ERROR_OUT_OF_MEMORY, "Cannot allocate EC params"); + } + key_info->params.len = key.u.ec.params.der.len; + memcpy(key_info->params.data, key.u.ec.params.der.value, key.u.ec.params.der.len); + } } /* Select a intrinsic Key ID if the user didn't specify one */ @@ -1579,7 +1587,10 @@ sc_pkcs15init_store_public_key(struct sc_pkcs15_card *p15card, struct sc_profile LOG_TEST_RET(ctx, r, "SPKI encode public key error"); /* Now create key file and store key */ - r = sc_pkcs15init_store_data(p15card, profile, object, &object->content, &key_info->path); + if (type == SC_PKCS15_TYPE_PUBKEY_EC) + r = sc_pkcs15init_store_data(p15card, profile, object, &key_info->direct.spki, &key_info->path); + else + r = sc_pkcs15init_store_data(p15card, profile, object, &object->content, &key_info->path); path = &key_info->path; if (path->count == 0) {