@@ -201,37 +201,36 @@ static VALUE
201
201
ossl_x509attr_set_value (VALUE self , VALUE value )
202
202
{
203
203
X509_ATTRIBUTE * attr ;
204
- VALUE asn1_value ;
205
- int i , asn1_tag ;
204
+ GetX509Attr (self , attr );
206
205
207
206
OSSL_Check_Kind (value , cASN1Data );
208
- asn1_tag = NUM2INT (rb_attr_get (value , rb_intern ("@tag" )));
209
- asn1_value = rb_attr_get (value , rb_intern ("@value" ));
210
- if (asn1_tag != V_ASN1_SET )
211
- ossl_raise (eASN1Error , "argument must be ASN1::Set" );
212
- if (!RB_TYPE_P (asn1_value , T_ARRAY ))
213
- ossl_raise (eASN1Error , "ASN1::Set has non-array value" );
207
+ VALUE der = ossl_to_der (value );
208
+ const unsigned char * p = (const unsigned char * )RSTRING_PTR (der );
209
+ STACK_OF (ASN1_TYPE ) * sk = d2i_ASN1_SET_ANY (NULL , & p , RSTRING_LEN (der ));
210
+ if (!sk )
211
+ ossl_raise (eX509AttrError , "attribute value must be ASN1::Set" );
214
212
215
- GetX509Attr (self , attr );
216
213
if (X509_ATTRIBUTE_count (attr )) { /* populated, reset first */
217
- ASN1_OBJECT * obj = X509_ATTRIBUTE_get0_object (attr );
218
- X509_ATTRIBUTE * new_attr = X509_ATTRIBUTE_create_by_OBJ (NULL , obj , 0 , NULL , -1 );
219
- if (!new_attr )
220
- ossl_raise (eX509AttrError , NULL );
221
- SetX509Attr (self , new_attr );
222
- X509_ATTRIBUTE_free (attr );
223
- attr = new_attr ;
214
+ ASN1_OBJECT * obj = X509_ATTRIBUTE_get0_object (attr );
215
+ X509_ATTRIBUTE * new_attr = X509_ATTRIBUTE_create_by_OBJ (NULL , obj , 0 , NULL , -1 );
216
+ if (!new_attr ) {
217
+ sk_ASN1_TYPE_pop_free (sk , ASN1_TYPE_free );
218
+ ossl_raise (eX509AttrError , "X509_ATTRIBUTE_create_by_OBJ" );
219
+ }
220
+ SetX509Attr (self , new_attr );
221
+ X509_ATTRIBUTE_free (attr );
222
+ attr = new_attr ;
224
223
}
225
224
226
- for (i = 0 ; i < RARRAY_LEN (asn1_value ); i ++ ) {
227
- ASN1_TYPE * a1type = ossl_asn1_get_asn1type (RARRAY_AREF (asn1_value , i ));
228
- if (!X509_ATTRIBUTE_set1_data (attr , ASN1_TYPE_get (a1type ),
229
- a1type -> value .ptr , -1 )) {
230
- ASN1_TYPE_free (a1type );
231
- ossl_raise (eX509AttrError , NULL );
232
- }
233
- ASN1_TYPE_free (a1type );
225
+ for (int i = 0 ; i < sk_ASN1_TYPE_num (sk ); i ++ ) {
226
+ ASN1_TYPE * a1type = sk_ASN1_TYPE_value (sk , i );
227
+ if (!X509_ATTRIBUTE_set1_data (attr , ASN1_TYPE_get (a1type ),
228
+ a1type -> value .ptr , -1 )) {
229
+ sk_ASN1_TYPE_pop_free (sk , ASN1_TYPE_free );
230
+ ossl_raise (eX509AttrError , "X509_ATTRIBUTE_set1_data" );
231
+ }
234
232
}
233
+ sk_ASN1_TYPE_pop_free (sk , ASN1_TYPE_free );
235
234
236
235
return value ;
237
236
}
0 commit comments