ASN1err(ASN1_F_I2D_NETSCAPE_RSA,ERR_R_MALLOC_FAILURE);
ASN1err(ASN1_F_I2D_RSA_NET,ERR_R_MALLOC_FAILURE);
int i2d_RSA_NET(const RSA *a, unsigned char **pp,		int (*cb)(char *buf, int len, const char *prompt, int verify),		int sgckey)	{	int i, j, ret = 0;	int rsalen, pkeylen, olen;	NETSCAPE_PKEY *pkey = NULL;	NETSCAPE_ENCRYPTED_PKEY *enckey = NULL;	unsigned char buf[256],*zz;	unsigned char key[EVP_MAX_KEY_LENGTH];	EVP_CIPHER_CTX ctx;	if (a == NULL) return(0);	if ((pkey=NETSCAPE_PKEY_new()) == NULL) goto err;	if ((enckey=NETSCAPE_ENCRYPTED_PKEY_new()) == NULL) goto err;	pkey->version = 0;	pkey->algor->algorithm=OBJ_nid2obj(NID_rsaEncryption);	if ((pkey->algor->parameter=ASN1_TYPE_new()) == NULL) goto err;	pkey->algor->parameter->type=V_ASN1_NULL;	rsalen = i2d_RSAPrivateKey(a, NULL);	/* Fake some octet strings just for the initial length	 * calculation. 	 */	pkey->private_key->length=rsalen;	pkeylen=i2d_NETSCAPE_PKEY(pkey,NULL);	enckey->enckey->digest->length = pkeylen;	enckey->os->length = 11;	/* "private-key" */	enckey->enckey->algor->algorithm=OBJ_nid2obj(NID_rc4);	if ((enckey->enckey->algor->parameter=ASN1_TYPE_new()) == NULL) goto err;	enckey->enckey->algor->parameter->type=V_ASN1_NULL;	if (pp == NULL)		{		olen = i2d_NETSCAPE_ENCRYPTED_PKEY(enckey, NULL);		NETSCAPE_PKEY_free(pkey);		NETSCAPE_ENCRYPTED_PKEY_free(enckey);		return olen;		}	/* Since its RC4 encrypted length is actual length */	if ((zz=(unsigned char *)OPENSSL_malloc(rsalen)) == NULL)		{		ASN1err(ASN1_F_I2D_NETSCAPE_RSA,ERR_R_MALLOC_FAILURE);		goto err;		}	pkey->private_key->data = zz;	/* Write out private key encoding */	i2d_RSAPrivateKey(a,&zz);	if ((zz=OPENSSL_malloc(pkeylen)) == NULL)		{		ASN1err(ASN1_F_I2D_NETSCAPE_RSA,ERR_R_MALLOC_FAILURE);		goto err;		}	if (!ASN1_STRING_set(enckey->os, "private-key", -1)) 		{		ASN1err(ASN1_F_I2D_NETSCAPE_RSA,ERR_R_MALLOC_FAILURE);		goto err;		}	enckey->enckey->digest->data = zz;	i2d_NETSCAPE_PKEY(pkey,&zz);	/* Wipe the private key encoding */	OPENSSL_cleanse(pkey->private_key->data, rsalen);			if (cb == NULL)		cb=EVP_read_pw_string;	i=cb((char *)buf,256,"Enter Private Key password:",1);	if (i != 0)		{		ASN1err(ASN1_F_I2D_NETSCAPE_RSA,ASN1_R_BAD_PASSWORD_READ);		goto err;		}	i = strlen((char *)buf);	/* If the key is used for SGC the algorithm is modified a little. */	if(sgckey) {		EVP_Digest(buf, i, buf, NULL, EVP_md5(), NULL);		memcpy(buf + 16, "SGCKEYSALT", 10);		i = 26;	}	EVP_BytesToKey(EVP_rc4(),EVP_md5(),NULL,buf,i,1,key,NULL);	OPENSSL_cleanse(buf,256);	/* Encrypt private key in place */	zz = enckey->enckey->digest->data;	EVP_CIPHER_CTX_init(&ctx);	EVP_EncryptInit_ex(&ctx,EVP_rc4(),NULL,key,NULL);	EVP_EncryptUpdate(&ctx,zz,&i,zz,pkeylen);	EVP_EncryptFinal_ex(&ctx,zz + i,&j);	EVP_CIPHER_CTX_cleanup(&ctx);	ret = i2d_NETSCAPE_ENCRYPTED_PKEY(enckey, pp);err:	NETSCAPE_ENCRYPTED_PKEY_free(enckey);	NETSCAPE_PKEY_free(pkey);	return(ret);	}