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;
|
||||
|
||||
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) {
|
||||
sc_unlock(p11card->card);
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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_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_extract(CK_ATTRIBUTE_PTR, void *, size_t *);
|
||||
|
||||
|
|
Loading…
Reference in New Issue