Ejemplo n.º 1
0
int i2d_PKCS7_SIGNER_INFO(PKCS7_SIGNER_INFO *a, unsigned char **pp)
	{
	M_ASN1_I2D_vars(a);

	M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER);
	M_ASN1_I2D_len(a->issuer_and_serial,i2d_PKCS7_ISSUER_AND_SERIAL);
	M_ASN1_I2D_len(a->digest_alg,i2d_X509_ALGOR);
	M_ASN1_I2D_len_IMP_SET_opt_type(X509_ATTRIBUTE,a->auth_attr,
					i2d_X509_ATTRIBUTE,0);
	M_ASN1_I2D_len(a->digest_enc_alg,i2d_X509_ALGOR);
	M_ASN1_I2D_len(a->enc_digest,i2d_ASN1_OCTET_STRING);
	M_ASN1_I2D_len_IMP_SET_opt_type(X509_ATTRIBUTE,a->unauth_attr,
					i2d_X509_ATTRIBUTE,1);

	M_ASN1_I2D_seq_total();

	M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER);
	M_ASN1_I2D_put(a->issuer_and_serial,i2d_PKCS7_ISSUER_AND_SERIAL);
	M_ASN1_I2D_put(a->digest_alg,i2d_X509_ALGOR);
	M_ASN1_I2D_put_IMP_SET_opt_type(X509_ATTRIBUTE,a->auth_attr,
					i2d_X509_ATTRIBUTE,0);
	M_ASN1_I2D_put(a->digest_enc_alg,i2d_X509_ALGOR);
	M_ASN1_I2D_put(a->enc_digest,i2d_ASN1_OCTET_STRING);
	M_ASN1_I2D_put_IMP_SET_opt_type(X509_ATTRIBUTE,a->unauth_attr,
					i2d_X509_ATTRIBUTE,1);

	M_ASN1_I2D_finish();
	}
Ejemplo n.º 2
0
int i2d_AC_CERTS(AC_CERTS *a, unsigned char **pp)
{
  M_ASN1_I2D_vars(a);
  M_ASN1_I2D_len_SEQUENCE(a->stackcert, i2d_X509);
  M_ASN1_I2D_seq_total();
  M_ASN1_I2D_put_SEQUENCE(a->stackcert, i2d_X509);
  M_ASN1_I2D_finish();
}
Ejemplo n.º 3
0
int i2d_AC_TARGETS(AC_TARGETS *a, unsigned char **pp)
{
  M_ASN1_I2D_vars(a);
  M_ASN1_I2D_len_SEQUENCE(a->targets, i2d_AC_TARGET);
  M_ASN1_I2D_seq_total();
  M_ASN1_I2D_put_SEQUENCE(a->targets, i2d_AC_TARGET);
  M_ASN1_I2D_finish();
}
Ejemplo n.º 4
0
int i2d_AC_FULL_ATTRIBUTES(AC_FULL_ATTRIBUTES *a, unsigned char **pp)
{
  M_ASN1_I2D_vars(a);
  M_ASN1_I2D_len_SEQUENCE(a->providers, i2d_AC_ATT_HOLDER);
  M_ASN1_I2D_seq_total();
  M_ASN1_I2D_put_SEQUENCE(a->providers, i2d_AC_ATT_HOLDER);
  M_ASN1_I2D_finish();
}
Ejemplo n.º 5
0
int i2d_pkcs7_issuer_and_subject(pkcs7_issuer_and_subject *a,
	     unsigned char **pp) {

	M_ASN1_I2D_vars(a);
	M_ASN1_I2D_len(a->issuer,i2d_X509_NAME);
	M_ASN1_I2D_len(a->subject,i2d_X509_NAME);
	M_ASN1_I2D_seq_total();
	M_ASN1_I2D_put(a->issuer,i2d_X509_NAME);
	M_ASN1_I2D_put(a->subject,i2d_X509_NAME);
	M_ASN1_I2D_finish();
}
Ejemplo n.º 6
0
int i2d_AC_ATT_HOLDER(AC_ATT_HOLDER *a, unsigned char **pp)
{
  M_ASN1_I2D_vars(a);
  M_ASN1_I2D_len(a->grantor,      i2d_GENERAL_NAMES);
  M_ASN1_I2D_len_SEQUENCE(a->attributes, i2d_AC_ATTRIBUTE);
  M_ASN1_I2D_seq_total();

  M_ASN1_I2D_put(a->grantor,      i2d_GENERAL_NAMES);
  M_ASN1_I2D_put_SEQUENCE(a->attributes, i2d_AC_ATTRIBUTE);
  M_ASN1_I2D_finish();
}
Ejemplo n.º 7
0
/*******************************************************************************
函数名称: cert_i2d_pkcs7_issuer_and_subject
功能描述:将issuerandsubject结构转化为BIO,用于证书查询时
输入参数: a,pkcs7_issuer_and_subject类型的指针
                       pp,保持与ASN1_i2d_bio中用法的一致

输出参数: 无
返 回 值:
--------------------------------------------------------------------------------
最近一次修改记录:
修改作者:王朝
修改目的:添加新函数
修改日期:2009年12月28日
*********************************************************************************/
s32 cert_i2d_pkcs7_issuer_and_subject(void *a,u8 **pp)
{
    pkcs7_issuer_and_subject *b = (pkcs7_issuer_and_subject *)a;

	M_ASN1_I2D_vars(b);
	M_ASN1_I2D_len(b->issuer,i2d_X509_NAME);
	M_ASN1_I2D_len(b->subject,i2d_X509_NAME);
	M_ASN1_I2D_seq_total();
	M_ASN1_I2D_put(b->issuer,i2d_X509_NAME);
	M_ASN1_I2D_put(b->subject,i2d_X509_NAME);
	M_ASN1_I2D_finish()
}
Ejemplo n.º 8
0
/* This isn't meant to run particularly, it's just to test type checking */
int main (int argc, char **argv)
{
    X *x = NULL;

    unsigned char **pp = NULL;

    M_ASN1_I2D_vars (x);
    M_ASN1_I2D_len_SEQUENCE_opt_type (X509_EXTENSION, x->ext, i2d_X509_EXTENSION);
    M_ASN1_I2D_seq_total ();
    M_ASN1_I2D_put_SEQUENCE_opt_type (X509_EXTENSION, x->ext, i2d_X509_EXTENSION);
    M_ASN1_I2D_finish ();
}
int i2d_PBE2PARAM(PBE2PARAM *a, unsigned char **pp)
{
	M_ASN1_I2D_vars(a);
	M_ASN1_I2D_len (a->keyfunc, i2d_X509_ALGOR);
	M_ASN1_I2D_len (a->encryption, i2d_X509_ALGOR);

	M_ASN1_I2D_seq_total ();

	M_ASN1_I2D_put (a->keyfunc, i2d_X509_ALGOR);
	M_ASN1_I2D_put (a->encryption, i2d_X509_ALGOR);

	M_ASN1_I2D_finish();
}
Ejemplo n.º 10
0
int i2d_PKCS7_ENCRYPT(PKCS7_ENCRYPT *a, unsigned char **pp)
{
    M_ASN1_I2D_vars(a);

    M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER);
    M_ASN1_I2D_len(a->enc_data,i2d_PKCS7_ENC_CONTENT);

    M_ASN1_I2D_seq_total();

    M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER);
    M_ASN1_I2D_put(a->enc_data,i2d_PKCS7_ENC_CONTENT);

    M_ASN1_I2D_finish();
}
Ejemplo n.º 11
0
int i2d_X509_PUBKEY(X509_PUBKEY *a, unsigned char **pp)
	{
	M_ASN1_I2D_vars(a);

	M_ASN1_I2D_len(a->algor,	i2d_X509_ALGOR);
	M_ASN1_I2D_len(a->public_key,	i2d_ASN1_BIT_STRING);

	M_ASN1_I2D_seq_total();

	M_ASN1_I2D_put(a->algor,	i2d_X509_ALGOR);
	M_ASN1_I2D_put(a->public_key,	i2d_ASN1_BIT_STRING);

	M_ASN1_I2D_finish();
	}
Ejemplo n.º 12
0
int i2d_X509_SIG(X509_SIG *a, unsigned char **pp)
{
    M_ASN1_I2D_vars(a);

    M_ASN1_I2D_len(a->algor,	i2d_X509_ALGOR);
    M_ASN1_I2D_len(a->digest,	i2d_ASN1_OCTET_STRING);

    M_ASN1_I2D_seq_total();

    M_ASN1_I2D_put(a->algor,	i2d_X509_ALGOR);
    M_ASN1_I2D_put(a->digest,	i2d_ASN1_OCTET_STRING);

    M_ASN1_I2D_finish();
}
Ejemplo n.º 13
0
int i2d_ASN1_HEADER(ASN1_HEADER *a, unsigned char **pp)
  {
  M_ASN1_I2D_vars(a);

  M_ASN1_I2D_len(a->header,  i2d_ASN1_OCTET_STRING);
  M_ASN1_I2D_len(a->data,    a->meth->i2d);

  M_ASN1_I2D_seq_total();

  M_ASN1_I2D_put(a->header,  i2d_ASN1_OCTET_STRING);
  M_ASN1_I2D_put(a->data,    a->meth->i2d);

  M_ASN1_I2D_finish();
  }
Ejemplo n.º 14
0
int i2d_X509_NAME_ENTRY(X509_NAME_ENTRY *a, unsigned char **pp)
{
    M_ASN1_I2D_vars(a);

    M_ASN1_I2D_len(a->object,i2d_ASN1_OBJECT);
    M_ASN1_I2D_len(a->value,i2d_ASN1_PRINTABLE);

    M_ASN1_I2D_seq_total();

    M_ASN1_I2D_put(a->object,i2d_ASN1_OBJECT);
    M_ASN1_I2D_put(a->value,i2d_ASN1_PRINTABLE);

    M_ASN1_I2D_finish();
}
Ejemplo n.º 15
0
int i2d_PKCS12_MAC_DATA(PKCS12_MAC_DATA *a, unsigned char **pp)
{
	M_ASN1_I2D_vars(a);
	M_ASN1_I2D_len (a->dinfo, i2d_X509_SIG);
	M_ASN1_I2D_len (a->salt, i2d_ASN1_OCTET_STRING);
	M_ASN1_I2D_len (a->iter, i2d_ASN1_INTEGER);

	M_ASN1_I2D_seq_total();

	M_ASN1_I2D_put (a->dinfo, i2d_X509_SIG);
	M_ASN1_I2D_put (a->salt, i2d_ASN1_OCTET_STRING);
	M_ASN1_I2D_put (a->iter, i2d_ASN1_INTEGER);
	M_ASN1_I2D_finish();
}
Ejemplo n.º 16
0
int i2d_X509_ALGOR(X509_ALGOR *a, unsigned char **pp)
	{
	M_ASN1_I2D_vars(a);

	M_ASN1_I2D_len(a->algorithm,i2d_ASN1_OBJECT);
	if (a->parameter != NULL)
		{ M_ASN1_I2D_len(a->parameter,i2d_ASN1_TYPE); }

	M_ASN1_I2D_seq_total();
	M_ASN1_I2D_put(a->algorithm,i2d_ASN1_OBJECT);
	if (a->parameter != NULL)
		{ M_ASN1_I2D_put(a->parameter,i2d_ASN1_TYPE); }

	M_ASN1_I2D_finish();
	}
Ejemplo n.º 17
0
int i2d_AC_TARGET(AC_TARGET *a, unsigned char **pp)
{
  int v1=0, v2=0, v3=0;

  M_ASN1_I2D_vars(a);
  M_ASN1_I2D_len_EXP_opt(a->name, i2d_GENERAL_NAME, 0, v1);
  M_ASN1_I2D_len_EXP_opt(a->group, i2d_GENERAL_NAME, 1, v2);
  M_ASN1_I2D_len_EXP_opt(a->cert, i2d_AC_IS, 2, v3);
  M_ASN1_I2D_seq_total();

  M_ASN1_I2D_put_EXP_opt(a->name, i2d_GENERAL_NAME, 0, v1);
  M_ASN1_I2D_put_EXP_opt(a->group, i2d_GENERAL_NAME, 1, v2);
  M_ASN1_I2D_put_EXP_opt(a->cert, i2d_AC_IS, 2, v3);
  M_ASN1_I2D_finish();
}
Ejemplo n.º 18
0
int i2d_AC_ATTRIBUTE(AC_ATTRIBUTE *a, unsigned char **pp)
{
  M_ASN1_I2D_vars(a);
  M_ASN1_I2D_len(a->name,      i2d_ASN1_OCTET_STRING);
  M_ASN1_I2D_len(a->value,     i2d_ASN1_OCTET_STRING);
  M_ASN1_I2D_len(a->qualifier, i2d_ASN1_OCTET_STRING);

  M_ASN1_I2D_seq_total();

  M_ASN1_I2D_put(a->name,      i2d_ASN1_OCTET_STRING);
  M_ASN1_I2D_put(a->value,     i2d_ASN1_OCTET_STRING);
  M_ASN1_I2D_put(a->qualifier, i2d_ASN1_OCTET_STRING);

  M_ASN1_I2D_finish();
}
Ejemplo n.º 19
0
int i2d_X509_KEY(X509 *a, unsigned char **pp)
	{
	M_ASN1_I2D_vars(a);

	M_ASN1_I2D_len(a->cert_info,	i2d_X509_CINF);
	M_ASN1_I2D_len(a->sig_alg,	i2d_X509_ALGOR);
	M_ASN1_I2D_len(a->signature,	i2d_ASN1_BIT_STRING);

	M_ASN1_I2D_seq_total();

	M_ASN1_I2D_put(a->cert_info,	i2d_X509_CINF);
	M_ASN1_I2D_put(a->sig_alg,	i2d_X509_ALGOR);
	M_ASN1_I2D_put(a->signature,	i2d_ASN1_BIT_STRING);

	M_ASN1_I2D_finish();
	}
Ejemplo n.º 20
0
int i2d_AC_SEQ(AC_SEQ *a, unsigned char **pp)
{
  M_ASN1_I2D_vars(a);
#ifdef TYPEDEF_I2D_OF
  M_ASN1_I2D_len_SEQUENCE(a->acs, (i2d_of_void*)i2d_AC);
#else
  M_ASN1_I2D_len_SEQUENCE(a->acs, i2d_AC);
#endif
  M_ASN1_I2D_seq_total();
#ifdef TYPEDEF_I2D_OF
  M_ASN1_I2D_put_SEQUENCE(a->acs, (i2d_of_void*)i2d_AC);
#else
  M_ASN1_I2D_put_SEQUENCE(a->acs, i2d_AC);
#endif
  M_ASN1_I2D_finish();
}
Ejemplo n.º 21
0
int i2d_NETSCAPE_CERT_SEQUENCE(NETSCAPE_CERT_SEQUENCE *a, unsigned char **pp)
{
	int v = 0;
	M_ASN1_I2D_vars(a);
	M_ASN1_I2D_len (a->type, i2d_ASN1_OBJECT);
	M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(X509,a->certs,i2d_X509,0,
					     V_ASN1_SEQUENCE,v);

	M_ASN1_I2D_seq_total();

	M_ASN1_I2D_put (a->type, i2d_ASN1_OBJECT);
	M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(X509,a->certs,i2d_X509,0,
					     V_ASN1_SEQUENCE,v);

	M_ASN1_I2D_finish();
}
Ejemplo n.º 22
0
static int i2d_NETSCAPE_PKEY(NETSCAPE_PKEY *a, unsigned char **pp)
	{
	M_ASN1_I2D_vars(a);


	M_ASN1_I2D_len(a->version,	i2d_ASN1_INTEGER);
	M_ASN1_I2D_len(a->algor,	i2d_X509_ALGOR);
	M_ASN1_I2D_len(a->private_key,	i2d_ASN1_OCTET_STRING);

	M_ASN1_I2D_seq_total();

	M_ASN1_I2D_put(a->version,	i2d_ASN1_INTEGER);
	M_ASN1_I2D_put(a->algor,	i2d_X509_ALGOR);
	M_ASN1_I2D_put(a->private_key,	i2d_ASN1_OCTET_STRING);

	M_ASN1_I2D_finish();
	}
int i2d_PBKDF2PARAM(PBKDF2PARAM *a, unsigned char **pp)
{
	M_ASN1_I2D_vars(a);
	M_ASN1_I2D_len (a->salt, i2d_ASN1_TYPE);
	M_ASN1_I2D_len (a->iter, i2d_ASN1_INTEGER);
	M_ASN1_I2D_len (a->keylength, i2d_ASN1_INTEGER);
	M_ASN1_I2D_len (a->prf, i2d_X509_ALGOR);

	M_ASN1_I2D_seq_total ();

	M_ASN1_I2D_put (a->salt, i2d_ASN1_TYPE);
	M_ASN1_I2D_put (a->iter, i2d_ASN1_INTEGER);
	M_ASN1_I2D_put (a->keylength, i2d_ASN1_INTEGER);
	M_ASN1_I2D_put (a->prf, i2d_X509_ALGOR);

	M_ASN1_I2D_finish();
}
Ejemplo n.º 24
0
int i2d_KCA_VERSION(KCA_VERSION *a, unsigned char **pp)
{
	M_ASN1_I2D_vars(a);

	r = M_ASN1_I2D_len (a->Version, i2d_ASN1_OCTET_STRING);

#if 0
	M_ASN1_I2D_seq_total();
#endif

	if (pp)
	{
		p = *pp;
		M_ASN1_I2D_put (a->Version, i2d_ASN1_OCTET_STRING);
		M_ASN1_I2D_finish();
	}
	else
		return(r);
}
Ejemplo n.º 25
0
int i2d_DLA3_QUERYURL(DLA3_QUERYURL *a, unsigned char **pp)
{
	M_ASN1_I2D_vars(a);

	r = M_ASN1_I2D_len (a->queryUrl, i2d_ASN1_OCTET_STRING);

#if 0
	M_ASN1_I2D_seq_total();
#endif

	if (pp)
	{
		p = *pp;
		M_ASN1_I2D_put (a->queryUrl, i2d_ASN1_OCTET_STRING);
		M_ASN1_I2D_finish();
	}
	else
		return(r);
}
Ejemplo n.º 26
0
/**
 * @ingroup proxypolicy
 *
 * Converts a PROXYPOLICY from its internal structure
 * to a DER encoded form
 *
 * @param a the PROXYPOLICY to convert
 * @param pp the buffer to put the DER encoding in
 *
 * @return the length of the DER encoding in bytes
 */
int i2d_PROXYPOLICY(
    PROXYPOLICY *                       a,
    unsigned char **                    pp)
{
    M_ASN1_I2D_vars(a);

    M_ASN1_I2D_len(a->policy_language, i2d_ASN1_OBJECT);

    if(a->policy)
    { 
        M_ASN1_I2D_len(a->policy, i2d_ASN1_OCTET_STRING);
    }
    
    M_ASN1_I2D_seq_total();
    M_ASN1_I2D_put(a->policy_language, i2d_ASN1_OBJECT);
    if(a->policy)
    { 
        M_ASN1_I2D_put(a->policy, i2d_ASN1_OCTET_STRING);
    }
    M_ASN1_I2D_finish();
}
Ejemplo n.º 27
0
int i2d_PKCS8_PRIV_KEY_INFO (PKCS8_PRIV_KEY_INFO *a, unsigned char **pp)
{

	M_ASN1_I2D_vars(a);

	M_ASN1_I2D_len (a->version, i2d_ASN1_INTEGER);
	M_ASN1_I2D_len (a->pkeyalg, i2d_X509_ALGOR);
	M_ASN1_I2D_len (a->pkey, i2d_ASN1_TYPE);
	M_ASN1_I2D_len_IMP_SET_opt_type (X509_ATTRIBUTE, a->attributes,
					 i2d_X509_ATTRIBUTE, 0);
	
	M_ASN1_I2D_seq_total ();

	M_ASN1_I2D_put (a->version, i2d_ASN1_INTEGER);
	M_ASN1_I2D_put (a->pkeyalg, i2d_X509_ALGOR);
	M_ASN1_I2D_put (a->pkey, i2d_ASN1_TYPE);
	M_ASN1_I2D_put_IMP_SET_opt_type (X509_ATTRIBUTE, a->attributes,
					 i2d_X509_ATTRIBUTE, 0);

	M_ASN1_I2D_finish();
}
Ejemplo n.º 28
0
int i2d_RSA_NET(RSA *a, unsigned char **pp, int (*cb)(), int sgckey)
	{
	int i,j,l[6];
	NETSCAPE_PKEY *pkey;
	unsigned char buf[256],*zz;
	unsigned char key[EVP_MAX_KEY_LENGTH];
	EVP_CIPHER_CTX ctx;
	X509_ALGOR *alg=NULL;
	ASN1_OCTET_STRING os,os2;
	M_ASN1_I2D_vars(a);

	if (a == NULL) return(0);

#ifdef WIN32
	r=r; /* shut the damn compiler up :-) */
#endif

	os.data=os2.data=NULL;
	if ((pkey=NETSCAPE_PKEY_new()) == NULL) goto err;
	if (!ASN1_INTEGER_set(pkey->version,0)) goto err;

	if (pkey->algor->algorithm != NULL)
		ASN1_OBJECT_free(pkey->algor->algorithm);
	pkey->algor->algorithm=OBJ_nid2obj(NID_rsaEncryption);
	if ((pkey->algor->parameter=ASN1_TYPE_new()) == NULL) goto err;
	pkey->algor->parameter->type=V_ASN1_NULL;

	l[0]=i2d_RSAPrivateKey(a,NULL);
	pkey->private_key->length=l[0];

	os2.length=i2d_NETSCAPE_PKEY(pkey,NULL);
	l[1]=i2d_ASN1_OCTET_STRING(&os2,NULL);

	if ((alg=X509_ALGOR_new()) == NULL) goto err;
	if (alg->algorithm != NULL)
		ASN1_OBJECT_free(alg->algorithm);
	alg->algorithm=OBJ_nid2obj(NID_rc4);
	if ((alg->parameter=ASN1_TYPE_new()) == NULL) goto err;
	alg->parameter->type=V_ASN1_NULL;

	l[2]=i2d_X509_ALGOR(alg,NULL);
	l[3]=ASN1_object_size(1,l[2]+l[1],V_ASN1_SEQUENCE);

#ifndef CONST_STRICT
	os.data=(unsigned char *)"private-key";
#endif
	os.length=11;
	l[4]=i2d_ASN1_OCTET_STRING(&os,NULL);

	l[5]=ASN1_object_size(1,l[4]+l[3],V_ASN1_SEQUENCE);

	if (pp == NULL)
		{
		if (pkey != NULL) NETSCAPE_PKEY_free(pkey);
		if (alg != NULL) X509_ALGOR_free(alg);
		return(l[5]);
		}

	if (pkey->private_key->data != NULL)
		OPENSSL_free(pkey->private_key->data);
	if ((pkey->private_key->data=(unsigned char *)OPENSSL_malloc(l[0])) == NULL)
		{
		ASN1err(ASN1_F_I2D_NETSCAPE_RSA,ERR_R_MALLOC_FAILURE);
		goto err;
		}
	zz=pkey->private_key->data;
	i2d_RSAPrivateKey(a,&zz);

	if ((os2.data=(unsigned char *)OPENSSL_malloc(os2.length)) == NULL)
		{
		ASN1err(ASN1_F_I2D_NETSCAPE_RSA,ERR_R_MALLOC_FAILURE);
		goto err;
		}
	zz=os2.data;
	i2d_NETSCAPE_PKEY(pkey,&zz);
		
	if (cb == NULL)
		cb=EVP_read_pw_string;
	i=cb(buf,256,"Enter Private Key password:"******"SGCKEYSALT", 10);
		i = 26;
	}
		
	EVP_BytesToKey(EVP_rc4(),EVP_md5(),NULL,buf,i,1,key,NULL);
	memset(buf,0,256);

	EVP_CIPHER_CTX_init(&ctx);
	EVP_EncryptInit(&ctx,EVP_rc4(),key,NULL);
	EVP_EncryptUpdate(&ctx,os2.data,&i,os2.data,os2.length);
	EVP_EncryptFinal(&ctx,&(os2.data[i]),&j);
	EVP_CIPHER_CTX_cleanup(&ctx);

	p= *pp;
	ASN1_put_object(&p,1,l[4]+l[3],V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
	i2d_ASN1_OCTET_STRING(&os,&p);
	ASN1_put_object(&p,1,l[2]+l[1],V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
	i2d_X509_ALGOR(alg,&p);
	i2d_ASN1_OCTET_STRING(&os2,&p);
	ret=l[5];
err:
	if (os2.data != NULL) OPENSSL_free(os2.data);
	if (alg != NULL) X509_ALGOR_free(alg);
	if (pkey != NULL) NETSCAPE_PKEY_free(pkey);
	r=r;
	return(ret);
	}
int i2d_PKCS12_SAFEBAG(PKCS12_SAFEBAG *a, unsigned char **pp)
{
	int bagnid, v = 0;
	M_ASN1_I2D_vars(a);
	bagnid = OBJ_obj2nid (a->type);
	M_ASN1_I2D_len (a->type, i2d_ASN1_OBJECT);
	
	switch (bagnid) {

		case NID_keyBag:
			M_ASN1_I2D_len_EXP_opt (a->value.keybag,
						 i2d_PKCS8_PRIV_KEY_INFO, 0, v);
		break;

		case NID_pkcs8ShroudedKeyBag:
			M_ASN1_I2D_len_EXP_opt (a->value.shkeybag,
						 i2d_X509_SIG, 0, v);
		break;

		case NID_safeContentsBag:
			M_ASN1_I2D_len_EXP_SEQUENCE_opt_type (PKCS12_SAFEBAG,
			    a->value.safes, (i2d_func_t)i2d_PKCS12_SAFEBAG,
			    0, V_ASN1_SEQUENCE, v);
		break;

		case NID_certBag:
		case NID_crlBag:
		case NID_secretBag:
			M_ASN1_I2D_len_EXP_opt (a->value.bag,
						 i2d_PKCS12_BAGS, 0, v);
		break;

		default:
			M_ASN1_I2D_len_EXP_opt (a->value.other,
						 i2d_ASN1_TYPE, 0, v);
		break;
	}

	M_ASN1_I2D_len_SET_type (X509_ATTRIBUTE,a->attrib,
	    (i2d_func_t)i2d_X509_ATTRIBUTE);

	M_ASN1_I2D_seq_total ();
	
	M_ASN1_I2D_put (a->type, i2d_ASN1_OBJECT);

	switch (bagnid) {

		case NID_keyBag:
			M_ASN1_I2D_put_EXP_opt (a->value.keybag,
						 i2d_PKCS8_PRIV_KEY_INFO, 0, v);
		break;

		case NID_pkcs8ShroudedKeyBag:
			M_ASN1_I2D_put_EXP_opt (a->value.shkeybag,
						 i2d_X509_SIG, 0, v);
		break;

		case NID_safeContentsBag:
			M_ASN1_I2D_put_EXP_SEQUENCE_opt_type (PKCS12_SAFEBAG, 
			    a->value.safes, (i2d_func_t)i2d_PKCS12_SAFEBAG,
			    0, V_ASN1_SEQUENCE, v);
		break;

		case NID_certBag:
		case NID_crlBag:
		case NID_secretBag:
			M_ASN1_I2D_put_EXP_opt (a->value.bag,
						 i2d_PKCS12_BAGS, 0, v);
		break;

		default:
			M_ASN1_I2D_put_EXP_opt (a->value.other,
						 i2d_ASN1_TYPE, 0, v);
		break;
	}

	M_ASN1_I2D_put_SET_type (X509_ATTRIBUTE, a->attrib,
	    (i2d_func_t)i2d_X509_ATTRIBUTE);

	M_ASN1_I2D_finish();
}