+#ifndef OPENSSL_NO_ECDSA
+ else if (ret->type == EVP_PKEY_ECDSA)
+ {
+ 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.ecdsa= ECDSA_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_ECDSAParameters(&ret->pkey.ecdsa, &cp, (long)j))
+ {
+ X509err(X509_F_X509_PUBKEY_GET, ERR_R_ECDSA_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
+ */
+ ECDSA *ecdsa;
+ if (ret->pkey.ecdsa == NULL)
+ ret->pkey.ecdsa = ECDSA_new();
+ ecdsa = ret->pkey.ecdsa;
+ if (ecdsa->group)
+ EC_GROUP_free(ecdsa->group);
+ if ((ecdsa->group = EC_GROUP_new_by_name(
+ OBJ_obj2nid(a->parameter->value.object))) == NULL)
+ goto err;
+ EC_GROUP_set_asn1_flag(ecdsa->group, OPENSSL_EC_NAMED_CURVE |
+ (EC_GROUP_get_asn1_flag(ecdsa->group) & ~0x03));
+ }
+ /* the case implicitlyCA is currently not implemented */
+ ret->save_parameters = 1;
+ }
+#endif
+
+ p=key->public_key->data;
+ j=key->public_key->length;
+ if ((ret = d2i_PublicKey(type, &ret, &p, (long)j)) == NULL)
+ {
+ 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);