pkcs11: generate EC key: use allocated EC params
For internal use allocate and copy the EC params data from the caller's template, rather then use them directly as a pointer in internal public key data.
This commit is contained in:
parent
31124ac4f9
commit
6f6286de99
|
@ -2766,7 +2766,7 @@ pkcs15_gen_keypair(struct sc_pkcs11_slot *slot, CK_MECHANISM_PTR pMechanism,
|
||||||
struct sc_lv_data *der = &keygen_args.prkey_args.key.u.ec.params.der;
|
struct sc_lv_data *der = &keygen_args.prkey_args.key.u.ec.params.der;
|
||||||
|
|
||||||
der->len = sizeof(struct sc_object_id);
|
der->len = sizeof(struct sc_object_id);
|
||||||
rv = attr_find_ptr(pPubTpl, ulPubCnt, CKA_EC_PARAMS, (void **)&der->value, &der->len);
|
rv = attr_find_and_allocate_ptr(pPubTpl, ulPubCnt, CKA_EC_PARAMS, (void **)&der->value, &der->len);
|
||||||
if (rv != CKR_OK) {
|
if (rv != CKR_OK) {
|
||||||
sc_unlock(p11card->card);
|
sc_unlock(p11card->card);
|
||||||
return sc_to_cryptoki_error(rc, "C_GenerateKeyPair");
|
return sc_to_cryptoki_error(rc, "C_GenerateKeyPair");
|
||||||
|
|
|
@ -251,6 +251,30 @@ CK_RV attr_find2(CK_ATTRIBUTE_PTR pTemp1, CK_ULONG ulCount1,
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CK_RV attr_find_and_allocate_ptr(CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_ULONG type, void **out, size_t *out_len)
|
||||||
|
{
|
||||||
|
void *ptr;
|
||||||
|
size_t len;
|
||||||
|
CK_RV rv;
|
||||||
|
|
||||||
|
if (!out || !out_len)
|
||||||
|
return CKR_ARGUMENTS_BAD;
|
||||||
|
len = *out_len;
|
||||||
|
|
||||||
|
rv = attr_find_ptr(pTemplate, ulCount, type, &ptr, &len);
|
||||||
|
if (rv != CKR_OK)
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
*out = calloc(1, len);
|
||||||
|
if (*out == NULL)
|
||||||
|
return CKR_HOST_MEMORY;
|
||||||
|
|
||||||
|
memcpy(*out, ptr, len);
|
||||||
|
*out_len = len;
|
||||||
|
|
||||||
|
return CKR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
CK_RV attr_find_ptr(CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_ULONG type, void **ptr, size_t * sizep)
|
CK_RV attr_find_ptr(CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_ULONG type, void **ptr, size_t * sizep)
|
||||||
{
|
{
|
||||||
unsigned int n;
|
unsigned int n;
|
||||||
|
|
|
@ -369,6 +369,7 @@ CK_RV attr_find(CK_ATTRIBUTE_PTR, CK_ULONG, CK_ULONG, void *, size_t *);
|
||||||
CK_RV attr_find2(CK_ATTRIBUTE_PTR, CK_ULONG, CK_ATTRIBUTE_PTR, CK_ULONG,
|
CK_RV attr_find2(CK_ATTRIBUTE_PTR, CK_ULONG, CK_ATTRIBUTE_PTR, CK_ULONG,
|
||||||
CK_ULONG, void *, size_t *);
|
CK_ULONG, void *, size_t *);
|
||||||
CK_RV attr_find_ptr(CK_ATTRIBUTE_PTR, CK_ULONG, CK_ULONG, void **, size_t *);
|
CK_RV attr_find_ptr(CK_ATTRIBUTE_PTR, CK_ULONG, CK_ULONG, void **, size_t *);
|
||||||
|
CK_RV attr_find_and_allocate_ptr(CK_ATTRIBUTE_PTR, CK_ULONG, CK_ULONG, void **, size_t *);
|
||||||
CK_RV attr_find_var(CK_ATTRIBUTE_PTR, CK_ULONG, CK_ULONG, void *, size_t *);
|
CK_RV attr_find_var(CK_ATTRIBUTE_PTR, CK_ULONG, CK_ULONG, void *, size_t *);
|
||||||
CK_RV attr_extract(CK_ATTRIBUTE_PTR, void *, size_t *);
|
CK_RV attr_extract(CK_ATTRIBUTE_PTR, void *, size_t *);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue