From 31124ac4f906ba8a331bde47d23bc89757f1829f Mon Sep 17 00:00:00 2001 From: Viktor Tarasov Date: Sun, 1 Mar 2015 13:38:50 +0100 Subject: [PATCH] pkcs15init: allocate EC parameters --- src/libopensc/card.c | 25 +++++++++++++++++++++++++ src/libopensc/opensc.h | 9 +++++++++ src/pkcs15init/pkcs15-lib.c | 8 ++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/libopensc/card.c b/src/libopensc/card.c index 25e36c22..24d22d5b 100644 --- a/src/libopensc/card.c +++ b/src/libopensc/card.c @@ -1114,6 +1114,31 @@ void sc_print_cache(struct sc_card *card) { sc_print_path(&card->cache.current_df->path)); } +int sc_copy_ec_params(struct sc_ec_parameters *dst, struct sc_ec_parameters *src) +{ + if (!dst || !src) + return SC_ERROR_INVALID_ARGUMENTS; + + memset(dst, 0, sizeof(*dst)); + if (src->named_curve) { + dst->named_curve = strdup(src->named_curve); + if (!dst->named_curve) + return SC_ERROR_OUT_OF_MEMORY; + } + dst->id = src->id; + if (src->der.value && src->der.len) { + dst->der.value = malloc(src->der.len); + if (!dst->der.value) + return SC_ERROR_OUT_OF_MEMORY; + memcpy(dst->der.value, src->der.value, src->der.len); + dst->der.len = src->der.len; + } + src->type = dst->type; + src->field_length = dst->field_length; + + return SC_SUCCESS; +} + scconf_block * sc_match_atr_block(sc_context_t *ctx, struct sc_card_driver *driver, struct sc_atr *atr) { diff --git a/src/libopensc/opensc.h b/src/libopensc/opensc.h index 42d8bf10..63298adb 100644 --- a/src/libopensc/opensc.h +++ b/src/libopensc/opensc.h @@ -1315,6 +1315,15 @@ unsigned sc_crc32(unsigned char *value, size_t len); */ void sc_remote_data_init(struct sc_remote_data *rdata); + +/** + * Copy and allocate if needed EC parameters data + * @dst destination + * @src source + */ +int sc_copy_ec_params(struct sc_ec_parameters *, struct sc_ec_parameters *); + + struct sc_card_error { unsigned int SWs; int errorno; diff --git a/src/pkcs15init/pkcs15-lib.c b/src/pkcs15init/pkcs15-lib.c index cc655f6a..5d554ba4 100644 --- a/src/pkcs15init/pkcs15-lib.c +++ b/src/pkcs15init/pkcs15-lib.c @@ -1314,10 +1314,14 @@ sc_pkcs15init_generate_key(struct sc_pkcs15_card *p15card, struct sc_profile *pr pubkey_args.usage = keygen_args->prkey_args.usage; pubkey_args.x509_usage = keygen_args->prkey_args.x509_usage; - if (keygen_args->prkey_args.key.algorithm == SC_ALGORITHM_GOSTR3410) + if (keygen_args->prkey_args.key.algorithm == SC_ALGORITHM_GOSTR3410) { pubkey_args.params.gost = keygen_args->prkey_args.params.gost; - else if (keygen_args->prkey_args.key.algorithm == SC_ALGORITHM_EC) + } + else if (keygen_args->prkey_args.key.algorithm == SC_ALGORITHM_EC) { pubkey_args.key.u.ec.params = keygen_args->prkey_args.key.u.ec.params; + r = sc_copy_ec_params(&pubkey_args.key.u.ec.params, &keygen_args->prkey_args.key.u.ec.params); + LOG_TEST_RET(ctx, r, "Cannot allocate EC parameters"); + } /* Generate the private key on card */ r = profile->ops->create_key(profile, p15card, object);