pkcs15init: introduce EC key generation parameters

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@5332 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
vtarasov 2011-04-12 11:36:40 +00:00
parent cdf88a895b
commit 2fecaa73bd
4 changed files with 36 additions and 20 deletions

View File

@ -755,6 +755,7 @@ pkcs15_add_object(struct sc_pkcs11_slot *slot,
switch (__p15_type(obj)) {
case SC_PKCS15_TYPE_PRKEY_RSA:
case SC_PKCS15_TYPE_PRKEY_GOSTR3410:
case SC_PKCS15_TYPE_PRKEY_EC:
pkcs15_add_object(slot, (struct pkcs15_any_object *) obj->related_pubkey, NULL);
card_fw_data = (struct pkcs15_fw_data *) slot->card->fw_data;
for (i = 0; i < card_fw_data->num_objects; i++) {
@ -1857,10 +1858,8 @@ set_gost_params(struct sc_pkcs15init_prkeyargs *prkey_args,
for (i = 0; i < sizeof(gostr3410_param_oid)
/sizeof(gostr3410_param_oid[0]); ++i) {
if (!memcmp(gost_params_oid, gostr3410_param_oid[i].oid, len)) {
prkey_args->gost_params.gostr3410 =
gostr3410_param_oid[i].param;
pubkey_args->gost_params.gostr3410 =
gostr3410_param_oid[i].param;
prkey_args->params.gost.gostr3410 = gostr3410_param_oid[i].param;
pubkey_args->params.gost.gostr3410 = gostr3410_param_oid[i].param;
break;
}
}

View File

@ -197,6 +197,10 @@ struct sc_pkcs15init_keyarg_gost_params {
unsigned char gostr3410, gostr3411, gost28147;
};
struct sc_pkcs15init_keyarg_ec_params {
const char *curve;
};
struct sc_pkcs15init_prkeyargs {
struct sc_pkcs15_id id;
struct sc_pkcs15_id auth_id;
@ -205,7 +209,11 @@ struct sc_pkcs15init_prkeyargs {
unsigned long x509_usage;
unsigned int flags;
unsigned int access_flags;
struct sc_pkcs15init_keyarg_gost_params gost_params;
union {
struct sc_pkcs15init_keyarg_gost_params gost;
struct sc_pkcs15init_keyarg_ec_params ec;
} params;
struct sc_pkcs15_prkey key;
@ -226,7 +234,11 @@ struct sc_pkcs15init_pubkeyargs {
const char * label;
unsigned long usage;
unsigned long x509_usage;
struct sc_pkcs15init_keyarg_gost_params gost_params;
union {
struct sc_pkcs15init_keyarg_gost_params gost;
struct sc_pkcs15init_keyarg_ec_params ec;
} params;
struct sc_pkcs15_pubkey key;
};
@ -390,6 +402,7 @@ extern struct sc_pkcs15init_operations *sc_pkcs15init_get_westcos_ops(void);
extern struct sc_pkcs15init_operations *sc_pkcs15init_get_myeid_ops(void);
extern struct sc_pkcs15init_operations *sc_pkcs15init_get_authentic_ops(void);
extern struct sc_pkcs15init_operations *sc_pkcs15init_get_iasecc_ops(void);
extern struct sc_pkcs15init_operations *sc_pkcs15init_get_piv_ops(void);
#ifdef __cplusplus
}

View File

@ -1132,9 +1132,9 @@ sc_pkcs15init_init_prkdf(struct sc_pkcs15_card *p15card,
if (!key_info->params)
LOG_TEST_RET(ctx, SC_ERROR_OUT_OF_MEMORY, "Cannot allocate memory for GOST parameters");
keyinfo_gostparams = key_info->params;
keyinfo_gostparams->gostr3410 = keyargs->gost_params.gostr3410;
keyinfo_gostparams->gostr3411 = keyargs->gost_params.gostr3411;
keyinfo_gostparams->gost28147 = keyargs->gost_params.gost28147;
keyinfo_gostparams->gostr3410 = keyargs->params.gost.gostr3410;
keyinfo_gostparams->gostr3411 = keyargs->params.gost.gostr3411;
keyinfo_gostparams->gost28147 = keyargs->params.gost.gost28147;
}
r = select_object_path(p15card, profile, object, &key_info->path);
@ -1221,7 +1221,7 @@ sc_pkcs15init_generate_key(struct sc_pkcs15_card *p15card,
pubkey_args.label = keygen_args->pubkey_label ? keygen_args->pubkey_label : object->label;
pubkey_args.usage = keygen_args->prkey_args.usage;
pubkey_args.x509_usage = keygen_args->prkey_args.x509_usage;
pubkey_args.gost_params = keygen_args->prkey_args.gost_params;
pubkey_args.params.gost = keygen_args->prkey_args.params.gost;
/* Generate the private key on card */
r = profile->ops->create_key(profile, p15card, object);
@ -1445,9 +1445,9 @@ sc_pkcs15init_store_public_key(struct sc_pkcs15_card *p15card,
if (!key_info->params)
return SC_ERROR_OUT_OF_MEMORY;
keyinfo_gostparams = key_info->params;
keyinfo_gostparams->gostr3410 = keyargs->gost_params.gostr3410;
keyinfo_gostparams->gostr3411 = keyargs->gost_params.gostr3411;
keyinfo_gostparams->gost28147 = keyargs->gost_params.gost28147;
keyinfo_gostparams->gostr3410 = keyargs->params.gost.gostr3410;
keyinfo_gostparams->gostr3411 = keyargs->params.gost.gostr3411;
keyinfo_gostparams->gost28147 = keyargs->params.gost.gost28147;
}
/* Select a intrinsic Key ID if the user didn't specify one */

View File

@ -856,7 +856,7 @@ do_store_private_key(struct sc_profile *profile)
if ((r = do_convert_private_key(&args.key, pkey)) < 0)
return r;
init_gost_params(&args.gost_params, pkey);
init_gost_params(&args.params.gost, pkey);
if (ncerts) {
unsigned int usage;
@ -1003,11 +1003,10 @@ do_store_public_key(struct sc_profile *profile, EVP_PKEY *pkey)
if (r >= 0) {
r = do_convert_public_key(&args.key, pkey);
if (r >= 0)
init_gost_params(&args.gost_params, pkey);
init_gost_params(&args.params.gost, pkey);
}
if (r >= 0)
r = sc_pkcs15init_store_public_key(p15card, profile,
&args, &dummy);
r = sc_pkcs15init_store_public_key(p15card, profile, &args, &dummy);
return r;
}
@ -1456,9 +1455,13 @@ do_generate_key(struct sc_profile *profile, const char *spec)
keygen_args.prkey_args.key.algorithm = SC_ALGORITHM_GOSTR3410;
keybits = SC_PKCS15_GOSTR3410_KEYSIZE;
/* FIXME: now only SC_PKCS15_PARAMSET_GOSTR3410_A */
keygen_args.prkey_args.gost_params.gostr3410 =
SC_PKCS15_PARAMSET_GOSTR3410_A;
keygen_args.prkey_args.params.gost.gostr3410 = SC_PKCS15_PARAMSET_GOSTR3410_A;
spec += strlen("gost2001");
} else if (!strncasecmp(spec, "ec", 2)) {
keygen_args.prkey_args.key.algorithm = SC_ALGORITHM_EC;
spec += 2;
keygen_args.prkey_args.params.ec.curve = spec;
keybits = 0;
} else {
util_error("Unknown algorithm \"%s\"", spec);
return SC_ERROR_INVALID_ARGUMENTS;
@ -1466,7 +1469,8 @@ do_generate_key(struct sc_profile *profile, const char *spec)
if (*spec == '/' || *spec == '-')
spec++;
if (*spec) {
if (*spec && isdigit(*spec)) {
char *end;
keybits = strtoul(spec, &end, 10);