aboutsummaryrefslogtreecommitdiffstats
path: root/ext/openssl/ossl_x509attr.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/openssl/ossl_x509attr.c')
-rw-r--r--ext/openssl/ossl_x509attr.c50
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;