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); }