Exemple #1
0
		inline size_t name_entry::write_der(void* buf) const
		{
			unsigned char* out = static_cast<unsigned char*>(buf);
			unsigned char** pout = out != NULL ? &out : NULL;

			int result = i2d_X509_NAME_ENTRY(ptr().get(), pout);

			error::throw_error_if(result < 0);

			return result;
		}
static int i2d_X509_NAME_entries(X509_NAME *a)
{
    X509_NAME_ENTRY *ne,*fe=NULL;
    STACK_OF(X509_NAME_ENTRY) *sk;
    BUF_MEM *buf=NULL;
    int set=0,r,ret=0;
    int i;
    unsigned char *p;
    int size=0;

    sk=a->entries;
    for (i=0; i<sk_X509_NAME_ENTRY_num(sk); i++)
    {
        ne=sk_X509_NAME_ENTRY_value(sk,i);
        if (fe == NULL)
        {
            fe=ne;
            size=0;
        }

        if (ne->set != set)
        {
            ret+=ASN1_object_size(1,size,V_ASN1_SET);
            fe->size=size;
            fe=ne;
            size=0;
            set=ne->set;
        }
        size+=i2d_X509_NAME_ENTRY(ne,NULL);
    }
    if (fe != NULL)
    {
        /* SET OF needed only if entries is non empty */
        ret+=ASN1_object_size(1,size,V_ASN1_SET);
        fe->size=size;
    }

    r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE);

    buf=a->bytes;
    if (!BUF_MEM_grow(buf,r)) goto err;
    p=(unsigned char *)buf->data;

    ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);

    set= -1;
    for (i=0; i<sk_X509_NAME_ENTRY_num(sk); i++)
    {
        ne=sk_X509_NAME_ENTRY_value(sk,i);
        if (set != ne->set)
        {
            set=ne->set;
            ASN1_put_object(&p,1,ne->size,
                            V_ASN1_SET,V_ASN1_UNIVERSAL);
        }
        i2d_X509_NAME_ENTRY(ne,&p);
    }
    a->modified=0;
    return(r);
err:
    return(-1);
}