diff options
Diffstat (limited to 'ext/openssl/ossl_x509attr.c')
-rw-r--r-- | ext/openssl/ossl_x509attr.c | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/ext/openssl/ossl_x509attr.c b/ext/openssl/ossl_x509attr.c index d0f41c6bb8..8f51436fd6 100644 --- a/ext/openssl/ossl_x509attr.c +++ b/ext/openssl/ossl_x509attr.c @@ -178,13 +178,13 @@ ossl_x509attr_get_oid(VALUE self) return ret; } -#if defined(HAVE_ST_X509_ATTRIBUTE_SINGLE) || defined(HAVE_ST_SINGLE) +/*#if defined(HAVE_ST_X509_ATTRIBUTE_SINGLE) # define OSSL_X509ATTR_IS_SINGLE(attr) ((attr)->single) # define OSSL_X509ATTR_SET_SINGLE(attr) ((attr)->single = 1) #else # define OSSL_X509ATTR_IS_SINGLE(attr) (!(attr)->value.set) # define OSSL_X509ATTR_SET_SINGLE(attr) ((attr)->value.set = 0) -#endif +#endif*/ /* * call-seq: @@ -202,13 +202,27 @@ ossl_x509attr_set_value(VALUE self, VALUE value) ASN1_TYPE_free(a1type); ossl_raise(eASN1Error, "couldn't set SEQUENCE for attribute value."); } + GetX509Attr(self, attr); - if(attr->value.set){ - if(OSSL_X509ATTR_IS_SINGLE(attr)) ASN1_TYPE_free(attr->value.single); - else sk_ASN1_TYPE_free(attr->value.set); + if (X509_ATTRIBUTE_count(attr)) { + ASN1_OBJECT *obj = X509_ATTRIBUTE_get0_object(attr); + /* populated, reset first */ + X509_ATTRIBUTE *new_attr = X509_ATTRIBUTE_new(); + if (!attr) { + ASN1_TYPE_free(a1type); + ossl_raise(rb_eRuntimeError, "X509_ATTRIBUTE_new() failed"); + } + SetX509Attr(self, new_attr); + X509_ATTRIBUTE_set1_object(new_attr, obj); + X509_ATTRIBUTE_free(attr); + attr = new_attr; } - OSSL_X509ATTR_SET_SINGLE(attr); - attr->value.single = a1type; + + if (!X509_ATTRIBUTE_set1_data(attr, ASN1_TYPE_get(a1type), a1type->value)) { + ASN1_TYPE_free(a1type); + ossl_raise(eX509AttrError, "X509_ATTRIBUTE_set1_data() failed"); + } + ASN1_TYPE_free(a1type); return value; } @@ -224,26 +238,32 @@ ossl_x509attr_get_value(VALUE self) VALUE str, asn1; long length; unsigned char *p; + int count; GetX509Attr(self, attr); - if(attr->value.ptr == NULL) return Qnil; - if(OSSL_X509ATTR_IS_SINGLE(attr)){ - length = i2d_ASN1_TYPE(attr->value.single, NULL); + count = X509_ATTRIBUTE_count(attr); + if (!count) return Qnil; + if (count == 1) { + ASN1_TYPE *a1type = X509_ATTRIBUTE_get0_type(attr, 0); + length = i2d_ASN1_TYPE(a1type, NULL); str = rb_str_new(0, length); p = (unsigned char *)RSTRING_PTR(str); - i2d_ASN1_TYPE(attr->value.single, &p); - ossl_str_adjust(str, p); + i2d_ASN1_TYPE(a1type, &p); } else{ - length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, + /*length = i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, (unsigned char **) NULL, i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0); str = rb_str_new(0, length); p = (unsigned char *)RSTRING_PTR(str); i2d_ASN1_SET_OF_ASN1_TYPE(attr->value.set, &p, - i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0); - ossl_str_adjust(str, p); + i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0);*/ + length = i2d_X509_ATTRIBUTE(attr, NULL); + str = rb_str_new(0, length); + p = (unsigned char *)RSTRING_PTR(str); + i2d_X509_ATTRIBUTE(attr, &p); } + ossl_str_adjust(str, p); asn1 = rb_funcall(mASN1, rb_intern("decode"), 1, str); return asn1; |