goto err;
ASN1_SEQUENCE_cb(X509_PUBKEY, pubkey_cb) = {	ASN1_SIMPLE(X509_PUBKEY, algor, X509_ALGOR),	ASN1_SIMPLE(X509_PUBKEY, public_key, ASN1_BIT_STRING)} ASN1_SEQUENCE_END_cb(X509_PUBKEY, X509_PUBKEY)IMPLEMENT_ASN1_FUNCTIONS(X509_PUBKEY)int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey)	{	int ok=0;	X509_PUBKEY *pk;	X509_ALGOR *a;	ASN1_OBJECT *o;	unsigned char *s,*p;	int i;	if (x == NULL) return(0);	if ((pk=X509_PUBKEY_new()) == NULL) goto err;	a=pk->algor;	/* set the algorithm id */	if ((o=OBJ_nid2obj(pkey->type)) == NULL) goto err;	ASN1_OBJECT_free(a->algorithm);	a->algorithm=o;	/* Set the parameter list */	if (!pkey->save_parameters || (pkey->type == EVP_PKEY_RSA))		{		if ((a->parameter == NULL) ||			(a->parameter->type != V_ASN1_NULL))			{			ASN1_TYPE_free(a->parameter);			a->parameter=ASN1_TYPE_new();			a->parameter->type=V_ASN1_NULL;			}		}#ifndef OPENSSL_NO_DSA	else if (pkey->type == EVP_PKEY_DSA)		{		unsigned char *pp;		DSA *dsa;				dsa=pkey->pkey.dsa;		dsa->write_params=0;		ASN1_TYPE_free(a->parameter);		i=i2d_DSAparams(dsa,NULL);		p=(unsigned char *)OPENSSL_malloc(i);		pp=p;		i2d_DSAparams(dsa,&pp);		a->parameter=ASN1_TYPE_new();		a->parameter->type=V_ASN1_SEQUENCE;		a->parameter->value.sequence=ASN1_STRING_new();		ASN1_STRING_set(a->parameter->value.sequence,p,i);		OPENSSL_free(p);		}#endif#ifndef OPENSSL_NO_ECDSA	else if (pkey->type == EVP_PKEY_ECDSA)		{		unsigned char *pp;		ECDSA *ecdsa;				ecdsa = pkey->pkey.ecdsa;		ASN1_TYPE_free(a->parameter);		if ((i = i2d_ECDSAParameters(ecdsa, NULL)) == 0)			{			X509err(X509_F_X509_PUBKEY_SET, ERR_R_ECDSA_LIB);			goto err;			}		if ((p = (unsigned char *) OPENSSL_malloc(i)) == NULL)			{			X509err(X509_F_X509_PUBKEY_SET, ERR_R_MALLOC_FAILURE);			goto err;			}			pp = p;		if (!i2d_ECDSAParameters(ecdsa, &pp))			{			X509err(X509_F_X509_PUBKEY_SET, ERR_R_ECDSA_LIB);			OPENSSL_free(p);			goto err;			}		if ((a->parameter = ASN1_TYPE_new()) == NULL)			{			X509err(X509_F_X509_PUBKEY_SET, ERR_R_ASN1_LIB);			OPENSSL_free(p);			goto err;			}		a->parameter->type = V_ASN1_SEQUENCE;		if ((a->parameter->value.sequence = ASN1_STRING_new()) == NULL)			{			X509err(X509_F_X509_PUBKEY_SET, ERR_R_ASN1_LIB);			OPENSSL_free(p);			goto err;			}		ASN1_STRING_set(a->parameter->value.sequence, p, i);		OPENSSL_free(p);		}#endif	else if (1)		{		X509err(X509_F_X509_PUBKEY_SET,X509_R_UNSUPPORTED_ALGORITHM);		goto err;		}	if ((i=i2d_PublicKey(pkey,NULL)) <= 0) goto err;	if ((s=(unsigned char *)OPENSSL_malloc(i+1)) == NULL) goto err;	p=s;	i2d_PublicKey(pkey,&p);	if (!M_ASN1_BIT_STRING_set(pk->public_key,s,i)) goto err;	/* Set number of unused bits to zero */	pk->public_key->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);	pk->public_key->flags|=ASN1_STRING_FLAG_BITS_LEFT;	OPENSSL_free(s);#if 0	CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);	pk->pkey=pkey;#endif	if (*x != NULL)		X509_PUBKEY_free(*x);	*x=pk;	pk=NULL;	ok=1;err:	if (pk != NULL) X509_PUBKEY_free(pk);	return(ok);	}