if (ret < 0)
return gnutls_assert_val(ret);
- ret = _gnutls_x509_write_ecc_params(&key->params, parameters);
+ ret = _gnutls_x509_write_ecc_params(key->params.flags, parameters);
if (ret < 0) {
_gnutls_free_datum(ecpoint);
return gnutls_assert_val(ret);
uint8_t *tmp2 = NULL;
size_t tmp1_size, tmp2_size;
int ret;
-
+ ck_rv_t rv;
+
tmp1_size = tmp2_size = MAX_PK_PARAM_SIZE;
tmp1 = gnutls_malloc(tmp1_size);
if (tmp1 == NULL)
a[1].value = tmp2;
a[1].value_len = tmp2_size;
- if (pkcs11_get_attribute_value(module, pks, obj, a, 2) ==
+ if ((rv = pkcs11_get_attribute_value(module, pks, obj, a, 2)) ==
CKR_OK) {
ret =
_gnutls_set_datum(&pubkey[0], a[0].value,
}
} else {
gnutls_assert();
- ret = GNUTLS_E_PKCS11_ERROR;
+ ret = pkcs11_rv_to_err(rv);
goto cleanup;
}
a[1].value = tmp2;
a[1].value_len = tmp2_size;
- if (pkcs11_get_attribute_value(module, pks, obj, a, 2) ==
+ if ((rv = pkcs11_get_attribute_value(module, pks, obj, a, 2)) ==
CKR_OK) {
pubkey[2].data = a[0].value;
pubkey[2].size = a[0].value_len;
} else {
gnutls_assert();
- ret = GNUTLS_E_PKCS11_ERROR;
+ ret = pkcs11_rv_to_err(rv);
goto cleanup;
}
break;
a[0].type = CKA_EC_PARAMS;
a[0].value = tmp1;
a[0].value_len = tmp1_size;
+
a[1].type = CKA_EC_POINT;
a[1].value = tmp2;
a[1].value_len = tmp2_size;
- if (pkcs11_get_attribute_value(module, pks, obj, a, 2) ==
+ if ((rv = pkcs11_get_attribute_value(module, pks, obj, a, 2)) ==
CKR_OK) {
pubkey[0].data = a[0].value;
pubkey[1].size = a[1].value_len;
} else {
gnutls_assert();
- ret = GNUTLS_E_PKCS11_ERROR;
+
+ ret = pkcs11_rv_to_err(rv);
goto cleanup;
}
* store the DER-encoded public key in the SubjectPublicKeyInfo format
* in @pubkey. The @pubkey should be deinitialized using gnutls_free().
*
+ * Note that when generating an elliptic curve key, the curve
+ * can be substituted in the place of the bits parameter using the
+ * GNUTLS_CURVE_TO_BITS() macro.
+ *
* Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
* negative error value.
*
struct ck_mechanism mech;
gnutls_pubkey_t pkey = NULL;
gnutls_pkcs11_obj_t obj = NULL;
+ gnutls_datum_t der = {NULL, 0};
ck_key_type_t key_type;
PKCS11_CHECK_INIT;
a[a_val].value_len = sizeof(tval);
a_val++;
- a[a_val].type = CKA_MODULUS_BITS;
- a[a_val].value = &_bits;
- a[a_val].value_len = sizeof(_bits);
+ if (GNUTLS_BITS_ARE_CURVE(bits)) {
+ bits = GNUTLS_BITS_TO_CURVE(bits);
+ } else {
+ bits = _gnutls_ecc_bits_to_curve(bits);
+ }
+
+ ret = _gnutls_x509_write_ecc_params(bits, &der);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ a[a_val].type = CKA_EC_PARAMS;
+ a[a_val].value = der.data;
+ a[a_val].value_len = der.size;
a_val++;
break;
default:
if (sinfo.pks != 0)
pkcs11_close_session(&sinfo);
+ gnutls_free(der.data);
return ret;
}
case GNUTLS_PK_EC:
{
ret =
- _gnutls_x509_write_ecc_params(&key->params,
+ _gnutls_x509_write_ecc_params(key->params.flags,
&p);
if (ret < 0) {
gnutls_assert();
der->size = ASN1_NULL_SIZE;
return 0;
case GNUTLS_PK_EC:
- return _gnutls_x509_write_ecc_params(params, der);
+ return _gnutls_x509_write_ecc_params(params->flags, der);
default:
return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
}
* Allocates the space used to store the DER data.
*/
int
-_gnutls_x509_write_ecc_params(gnutls_pk_params_st * params,
+_gnutls_x509_write_ecc_params(gnutls_ecc_curve_t curve,
gnutls_datum_t * der)
{
int result;
der->data = NULL;
der->size = 0;
- if (params->params_nr < ECC_PUBLIC_PARAMS) {
- gnutls_assert();
- result = GNUTLS_E_INVALID_REQUEST;
- goto cleanup;
- }
-
- oid = _gnutls_ecc_curve_get_oid(params->flags);
+ oid = _gnutls_ecc_curve_get_oid(curve);
if (oid == NULL)
return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
int _gnutls_x509_read_pubkey(gnutls_pk_algorithm_t, uint8_t * der,
int dersize, gnutls_pk_params_st * params);
-int _gnutls_x509_write_ecc_params(gnutls_pk_params_st * params,
+int _gnutls_x509_write_ecc_params(gnutls_ecc_curve_t curve,
gnutls_datum_t * der);
int _gnutls_x509_write_ecc_pubkey(gnutls_pk_params_st * params,
gnutls_datum_t * der);