static VALUE
ossl_asn1data_to_der(VALUE self)
{
VALUE value, der;
int tag, tag_class, is_cons = 0;
long length;
unsigned char *p;
value = ossl_asn1_get_value(self);
if(rb_obj_is_kind_of(value, rb_cArray)){
is_cons = 1;
value = join_der(value);
}
StringValue(value);
tag = ossl_asn1_tag(self);
tag_class = ossl_asn1_tag_class(self);
if((length = ASN1_object_size(1, RSTRING(value)->len, tag)) <= 0)
ossl_raise(eASN1Error, NULL);
der = rb_str_new(0, length);
p = RSTRING(der)->ptr;
ASN1_put_object(&p, is_cons, RSTRING(value)->len, tag, tag_class);
memcpy(p, RSTRING(value)->ptr, RSTRING(value)->len);
p += RSTRING(value)->len;
ossl_str_adjust(der, p);
return der;
}