12 #define NewX509Attr(klass) \ 
   13     TypedData_Wrap_Struct((klass), &ossl_x509attr_type, 0) 
   14 #define SetX509Attr(obj, attr) do { \ 
   16         ossl_raise(rb_eRuntimeError, "ATTR wasn't initialized!"); \ 
   18     RTYPEDDATA_DATA(obj) = (attr); \ 
   20 #define GetX509Attr(obj, attr) do { \ 
   21     TypedData_Get_Struct((obj), X509_ATTRIBUTE, &ossl_x509attr_type, (attr)); \ 
   23         ossl_raise(rb_eRuntimeError, "ATTR wasn't initialized!"); \ 
   34 ossl_x509attr_free(
void *
ptr)
 
   36     X509_ATTRIBUTE_free(
ptr);
 
   40     "OpenSSL/X509/ATTRIBUTE",
 
   42         0, ossl_x509attr_free,
 
   58         new = X509_ATTRIBUTE_new();
 
   60         new = X509_ATTRIBUTE_dup(attr);
 
   84 ossl_x509attr_alloc(
VALUE klass)
 
   90     if (!(attr = X509_ATTRIBUTE_new()))
 
  105     X509_ATTRIBUTE *attr, *x;
 
  106     const unsigned char *p;
 
  113         x = d2i_X509_ATTRIBUTE(&attr, &p, 
RSTRING_LEN(oid));
 
  127 ossl_x509attr_initialize_copy(
VALUE self, 
VALUE other)
 
  129     X509_ATTRIBUTE *attr, *attr_other, *attr_new;
 
  135     attr_new = X509_ATTRIBUTE_dup(attr_other);
 
  140     X509_ATTRIBUTE_free(attr);
 
  152     X509_ATTRIBUTE *attr;
 
  158     obj = OBJ_txt2obj(s, 0);
 
  160     if (!X509_ATTRIBUTE_set1_object(attr, obj)) {
 
  161         ASN1_OBJECT_free(obj);
 
  164     ASN1_OBJECT_free(obj);
 
  174 ossl_x509attr_get_oid(
VALUE self)
 
  176     X509_ATTRIBUTE *attr;
 
  183     oid = X509_ATTRIBUTE_get0_object(attr);
 
  184     if ((nid = OBJ_obj2nid(oid)) != NID_undef)
 
  187         if (!(out = BIO_new(BIO_s_mem())))
 
  189         i2a_ASN1_OBJECT(out, oid);
 
  201 ossl_x509attr_set_value(
VALUE self, 
VALUE value)
 
  203     X509_ATTRIBUTE *attr;
 
  210     if (asn1_tag != V_ASN1_SET)
 
  212     if (!RB_TYPE_P(asn1_value, 
T_ARRAY))
 
  216     if (X509_ATTRIBUTE_count(attr)) { 
 
  217         ASN1_OBJECT *obj = X509_ATTRIBUTE_get0_object(attr);
 
  218         X509_ATTRIBUTE *new_attr = X509_ATTRIBUTE_create_by_OBJ(
NULL, obj, 0, 
NULL, -1);
 
  222         X509_ATTRIBUTE_free(attr);
 
  226     for (i = 0; i < 
RARRAY_LEN(asn1_value); i++) {
 
  228         if (!X509_ATTRIBUTE_set1_data(attr, ASN1_TYPE_get(a1type),
 
  229                                       a1type->value.ptr, -1)) {
 
  230             ASN1_TYPE_free(a1type);
 
  233         ASN1_TYPE_free(a1type);
 
  244 ossl_x509attr_get_value(
VALUE self)
 
  246     X509_ATTRIBUTE *attr;
 
  254     if (!(sk = sk_ASN1_TYPE_new_null()))
 
  257     count = X509_ATTRIBUTE_count(attr);
 
  258     for (i = 0; i < 
count; i++)
 
  259         sk_ASN1_TYPE_push(sk, X509_ATTRIBUTE_get0_type(attr, i));
 
  261     if ((
len = i2d_ASN1_SET_ANY(sk, 
NULL)) <= 0) {
 
  262         sk_ASN1_TYPE_free(sk);
 
  267     if (i2d_ASN1_SET_ANY(sk, &p) <= 0) {
 
  268         sk_ASN1_TYPE_free(sk);
 
  272     sk_ASN1_TYPE_free(sk);
 
  282 ossl_x509attr_to_der(
VALUE self)
 
  284     X509_ATTRIBUTE *attr;
 
  290     if((
len = i2d_X509_ATTRIBUTE(attr, 
NULL)) <= 0)
 
  294     if(i2d_X509_ATTRIBUTE(attr, &p) <= 0)