+#ifndef OPENSSL_NO_EC
+ else if (ret->type == EVP_PKEY_EC)
+ {
+ if (a->parameter && (a->parameter->type == V_ASN1_SEQUENCE))
+ {
+ /* type == V_ASN1_SEQUENCE => we have explicit parameters
+ * (e.g. parameters in the X9_62_EC_PARAMETERS-structure )
+ */
+ if ((ret->pkey.eckey= EC_KEY_new()) == NULL)
+ {
+ X509err(X509_F_X509_PUBKEY_GET,
+ ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+ cp = p = a->parameter->value.sequence->data;
+ j = a->parameter->value.sequence->length;
+ if (!d2i_ECParameters(&ret->pkey.eckey, &cp, (long)j))
+ {
+ X509err(X509_F_X509_PUBKEY_GET, ERR_R_EC_LIB);
+ goto err;
+ }
+ }
+ else if (a->parameter && (a->parameter->type == V_ASN1_OBJECT))
+ {
+ /* type == V_ASN1_OBJECT => the parameters are given
+ * by an asn1 OID
+ */
+ EC_KEY *eckey;
+ if (ret->pkey.eckey == NULL)
+ ret->pkey.eckey = EC_KEY_new();
+ eckey = ret->pkey.eckey;
+ if (eckey->group)
+ EC_GROUP_free(eckey->group);
+ if ((eckey->group = EC_GROUP_new_by_nid(
+ OBJ_obj2nid(a->parameter->value.object))) == NULL)
+ goto err;
+ EC_GROUP_set_asn1_flag(eckey->group,
+ OPENSSL_EC_NAMED_CURVE);
+ }
+ /* the case implicitlyCA is currently not implemented */
+ ret->save_parameters = 1;
+ }
+#endif
+
+ p=key->public_key->data;
+ j=key->public_key->length;
+ if (!d2i_PublicKey(type, &ret, &p, (long)j))
+ {
+ X509err(X509_F_X509_PUBKEY_GET, X509_R_ERR_ASN1_LIB);
+ goto err;
+ }
+
+ key->pkey = ret;
+ CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY);