@@ -109,6 +109,51 @@ def test_version
109109 assert_equal 1 , req . version
110110 end
111111
112+ def create_ext_req ( exts )
113+ ef = OpenSSL ::X509 ::ExtensionFactory . new
114+ exts = exts . collect { |e | ef . create_extension ( *e ) }
115+ OpenSSL ::ASN1 ::Set ( [ OpenSSL ::ASN1 ::Sequence ( exts ) ] )
116+ end
117+
118+ def get_ext_req ( ext_req_value )
119+ set = OpenSSL ::ASN1 . decode ( ext_req_value )
120+ seq = set . value [ 0 ]
121+ seq . value . collect { |asn1ext | OpenSSL ::X509 ::Extension . new ( asn1ext ) . to_a }
122+ end
123+
124+ def test_attr ; setup!
125+ exts = [
126+ [ 'keyUsage' , 'Digital Signature, Key Encipherment' , true ] ,
127+ [ 'subjectAltName' , 'email:gotoyuzo@ruby-lang.org' , false ] ,
128+ ]
129+ attrval = create_ext_req ( exts )
130+ attrs = [
131+ OpenSSL ::X509 ::Attribute . new ( 'extReq' , attrval ) ,
132+ OpenSSL ::X509 ::Attribute . new ( 'msExtReq' , attrval ) ,
133+ ]
134+
135+ req0 = issue_csr ( 0 , @dn , @rsa1024 , OpenSSL ::Digest . new ( 'SHA256' ) )
136+ attrs . each { |attr | req0 . add_attribute ( attr ) }
137+ req1 = issue_csr ( 0 , @dn , @rsa1024 , OpenSSL ::Digest . new ( 'SHA256' ) )
138+ req1 . attributes = attrs
139+ assert_equal req0 . to_der , req1 . to_der
140+
141+ attrs = req0 . attributes
142+ assert_equal 2 , attrs . size
143+ assert_equal 'extReq' , attrs [ 0 ] . oid
144+ assert_equal 'msExtReq' , attrs [ 1 ] . oid
145+ assert_equal exts , get_ext_req ( attrs [ 0 ] . value )
146+ assert_equal exts , get_ext_req ( attrs [ 1 ] . value )
147+
148+ req = OpenSSL ::X509 ::Request . new ( req0 . to_der )
149+ attrs = req . attributes
150+ assert_equal 2 , attrs . size
151+ assert_equal 'extReq' , attrs [ 0 ] . oid
152+ assert_equal 'msExtReq' , attrs [ 1 ] . oid
153+ assert_equal exts , get_ext_req ( attrs [ 0 ] . value )
154+ assert_equal exts , get_ext_req ( attrs [ 1 ] . value )
155+ end
156+
112157 def test_dup ; setup!
113158 req = issue_csr ( 0 , @dn , @rsa1024 , OpenSSL ::Digest . new ( 'SHA256' ) )
114159 assert_equal req . to_der , req . dup . to_der
0 commit comments