ret =
_gnutls_x509_read_ecc_params(parameters->data,
- parameters->size, &key->params);
+ parameters->size, &key->params.flags);
if (ret < 0) {
gnutls_assert();
goto cleanup;
*/
int
_gnutls_x509_read_ecc_params(uint8_t * der, int dersize,
- gnutls_pk_params_st * params)
+ unsigned int * curve)
{
int ret;
ASN1_TYPE spk = ASN1_TYPE_EMPTY;
goto cleanup;
}
- params->flags = _gnutls_oid_to_ecc_curve(oid);
- if (params->flags == GNUTLS_ECC_CURVE_INVALID) {
+ *curve = _gnutls_oid_to_ecc_curve(oid);
+ if (*curve == GNUTLS_ECC_CURVE_INVALID) {
_gnutls_debug_log("Curve %s is not supported\n", oid);
gnutls_assert();
ret = GNUTLS_E_ECC_UNSUPPORTED_CURVE;
case GNUTLS_PK_DSA:
return _gnutls_x509_read_dsa_params(der, dersize, params);
case GNUTLS_PK_EC:
- return _gnutls_x509_read_ecc_params(der, dersize, params);
+ return _gnutls_x509_read_ecc_params(der, dersize, ¶ms->flags);
default:
return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
}
*/
int
_gnutls_privkey_decode_ecc_key(ASN1_TYPE* pkey_asn, const gnutls_datum_t * raw_key,
- gnutls_x509_privkey_t pkey)
+ gnutls_x509_privkey_t pkey, gnutls_ecc_curve_t curve)
{
int ret;
unsigned int version;
gnutls_pk_params_init(&pkey->params);
pkey->params.algo = GNUTLS_PK_EC;
-
if ((ret =
asn1_create_element(_gnutls_get_gnutls_asn(),
"GNUTLS.ECPrivateKey",
}
/* read the curve */
- oid_size = sizeof(oid);
- ret =
- asn1_read_value(*pkey_asn, "parameters.namedCurve", oid,
+ if (curve == GNUTLS_ECC_CURVE_INVALID) {
+ oid_size = sizeof(oid);
+ ret =
+ asn1_read_value(*pkey_asn, "parameters.namedCurve", oid,
&oid_size);
- if (ret != ASN1_SUCCESS) {
- gnutls_assert();
- ret = _gnutls_asn2err(ret);
- goto error;
- }
+ if (ret != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto error;
+ }
- pkey->params.flags = _gnutls_oid_to_ecc_curve(oid);
- if (pkey->params.flags == GNUTLS_ECC_CURVE_INVALID) {
- _gnutls_debug_log("Curve %s is not supported\n", oid);
- gnutls_assert();
- ret = GNUTLS_E_ECC_UNSUPPORTED_CURVE;
- goto error;
+ pkey->params.flags = _gnutls_oid_to_ecc_curve(oid);
+
+ if (pkey->params.flags == GNUTLS_ECC_CURVE_INVALID) {
+ _gnutls_debug_log("Curve %s is not supported\n", oid);
+ gnutls_assert();
+ ret = GNUTLS_E_ECC_UNSUPPORTED_CURVE;
+ goto error;
+ }
+ } else {
+ pkey->params.flags = curve;
}
+
/* read the public key */
ret = _gnutls_x509_read_value(*pkey_asn, "publicKey", &out);
if (ret < 0) {
if (key->key == NULL)
gnutls_assert();
} else if (key->pk_algorithm == GNUTLS_PK_EC) {
- result = _gnutls_privkey_decode_ecc_key(&key->key, &_data, key);
+ result = _gnutls_privkey_decode_ecc_key(&key->key, &_data, key, 0);
if (result < 0) {
gnutls_assert();
goto failover;
if (key->key == NULL) {
key->pk_algorithm = GNUTLS_PK_EC;
result =
- _gnutls_privkey_decode_ecc_key(&key->key, &_data, key);
+ _gnutls_privkey_decode_ecc_key(&key->key, &_data, key, 0);
if (result < 0) {
gnutls_assert();
goto failover;
goto cleanup;
}
break;
-
default:
ret = gnutls_assert_val(GNUTLS_E_UNKNOWN_PK_ALGORITHM);
{
int ret;
gnutls_datum_t tmp;
+ unsigned char oid[MAX_OID_SIZE];
+ unsigned curve = GNUTLS_ECC_CURVE_INVALID;
+ int len, result;
+
+ /* openssl PKCS #8 files with ECC keys place the curve in
+ * privateKeyAlgorithm.parameters instead of the ECPrivateKey.parameters.
+ */
+ len = sizeof(oid);
+ result =
+ asn1_read_value(pkcs8_asn, "privateKeyAlgorithm.parameters",
+ oid, &len);
+ if (result == ASN1_SUCCESS) {
+ ret = _gnutls_x509_read_ecc_params(oid, len, &curve);
+ if (ret < 0) {
+ curve = GNUTLS_ECC_CURVE_INVALID;
+ }
+ }
ret = _gnutls_x509_read_value(pkcs8_asn, "privateKey", &tmp);
if (ret < 0) {
goto error;
}
- ret = _gnutls_privkey_decode_ecc_key(&pkey->key, &tmp, pkey);
+ ret = _gnutls_privkey_decode_ecc_key(&pkey->key, &tmp, pkey, curve);
_gnutls_free_key_datum(&tmp);
if (ret < 0) {
gnutls_x509_privkey_t pkey)
{
int result, len;
- char oid[64];
+ char oid[MAX_OID_SIZE];
ASN1_TYPE pkcs8_asn = ASN1_TYPE_EMPTY;
gnutls_x509_privkey_t pkey);
int _gnutls_privkey_decode_ecc_key(ASN1_TYPE* pkey_asn, const gnutls_datum_t *
raw_key,
- gnutls_x509_privkey_t pkey);
+ gnutls_x509_privkey_t pkey,
+ gnutls_ecc_curve_t curve);
int
_gnutls_x509_read_ecc_params(uint8_t * der, int dersize,
- gnutls_pk_params_st * params);
+ unsigned int *curve);
int _gnutls_asn1_encode_privkey(gnutls_pk_algorithm_t pk, ASN1_TYPE * c2,
gnutls_pk_params_st * params);