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:
parent
cdf88a895b
commit
2fecaa73bd
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue