pftg-jruby-openssl 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. data/History.txt +48 -0
  2. data/License.txt +30 -0
  3. data/README.txt +24 -0
  4. data/lib/bcmail-jdk14-139.jar +0 -0
  5. data/lib/bcprov-jdk14-139.jar +0 -0
  6. data/lib/jopenssl.jar +0 -0
  7. data/lib/jopenssl/version.rb +5 -0
  8. data/lib/openssl.rb +24 -0
  9. data/lib/openssl/bn.rb +33 -0
  10. data/lib/openssl/buffering.rb +239 -0
  11. data/lib/openssl/cipher.rb +56 -0
  12. data/lib/openssl/digest.rb +46 -0
  13. data/lib/openssl/dummy.rb +34 -0
  14. data/lib/openssl/dummyssl.rb +13 -0
  15. data/lib/openssl/ssl.rb +135 -0
  16. data/lib/openssl/x509.rb +154 -0
  17. data/test/fixture/cacert.pem +23 -0
  18. data/test/fixture/cert_localhost.pem +19 -0
  19. data/test/fixture/common.pem +48 -0
  20. data/test/fixture/localhost_keypair.pem +18 -0
  21. data/test/fixture/max.pem +29 -0
  22. data/test/openssl/ssl_server.rb +99 -0
  23. data/test/openssl/test_asn1.rb +199 -0
  24. data/test/openssl/test_cipher.rb +196 -0
  25. data/test/openssl/test_digest.rb +88 -0
  26. data/test/openssl/test_hmac.rb +44 -0
  27. data/test/openssl/test_ns_spki.rb +69 -0
  28. data/test/openssl/test_pair.rb +149 -0
  29. data/test/openssl/test_pkcs7.rb +159 -0
  30. data/test/openssl/test_pkey_rsa.rb +49 -0
  31. data/test/openssl/test_ssl.rb +413 -0
  32. data/test/openssl/test_x509cert.rb +236 -0
  33. data/test/openssl/test_x509crl.rb +234 -0
  34. data/test/openssl/test_x509ext.rb +95 -0
  35. data/test/openssl/test_x509name.rb +265 -0
  36. data/test/openssl/test_x509req.rb +178 -0
  37. data/test/openssl/test_x509store.rb +245 -0
  38. data/test/openssl/utils.rb +135 -0
  39. data/test/pkcs7_mime_enveloped.message +19 -0
  40. data/test/pkcs7_mime_signed.message +30 -0
  41. data/test/pkcs7_multipart_signed.message +45 -0
  42. data/test/ref/a.out +0 -0
  43. data/test/ref/compile.rb +8 -0
  44. data/test/ref/pkcs1 +0 -0
  45. data/test/ref/pkcs1.c +21 -0
  46. data/test/test_cipher.rb +90 -0
  47. data/test/test_integration.rb +100 -0
  48. data/test/test_java.rb +98 -0
  49. data/test/test_java_attribute.rb +25 -0
  50. data/test/test_java_bio.rb +42 -0
  51. data/test/test_java_mime.rb +173 -0
  52. data/test/test_java_pkcs7.rb +769 -0
  53. data/test/test_java_smime.rb +177 -0
  54. data/test/test_openssl.rb +34 -0
  55. data/test/test_openssl_x509.rb +34 -0
  56. data/test/test_pkey.rb +46 -0
  57. data/test/ut_eof.rb +128 -0
  58. metadata +124 -0
@@ -0,0 +1,95 @@
1
+ begin
2
+ require "openssl"
3
+ require File.join(File.dirname(__FILE__), "utils.rb")
4
+ rescue LoadError
5
+ end
6
+ require "test/unit"
7
+
8
+ if defined?(OpenSSL)
9
+
10
+ class OpenSSL::TestX509Extension < Test::Unit::TestCase
11
+ def setup
12
+ @basic_constraints_value = OpenSSL::ASN1::Sequence([
13
+ OpenSSL::ASN1::Boolean(true), # CA
14
+ OpenSSL::ASN1::Integer(2) # pathlen
15
+ ])
16
+ @basic_constraints = OpenSSL::ASN1::Sequence([
17
+ OpenSSL::ASN1::ObjectId("basicConstraints"),
18
+ OpenSSL::ASN1::Boolean(true),
19
+ OpenSSL::ASN1::OctetString(@basic_constraints_value.to_der),
20
+ ])
21
+ end
22
+
23
+ def teardown
24
+ end
25
+
26
+ def test_new
27
+ ext = OpenSSL::X509::Extension.new(@basic_constraints.to_der)
28
+ assert_equal("basicConstraints", ext.oid)
29
+ assert_equal(true, ext.critical?)
30
+ assert_equal("CA:TRUE, pathlen:2", ext.value)
31
+
32
+ ext = OpenSSL::X509::Extension.new("2.5.29.19",
33
+ @basic_constraints_value.to_der, true)
34
+ assert_equal(@basic_constraints.to_der, ext.to_der)
35
+ end
36
+
37
+ def test_create_by_factory
38
+ ef = OpenSSL::X509::ExtensionFactory.new
39
+
40
+ bc = ef.create_extension("basicConstraints", "critical, CA:TRUE, pathlen:2")
41
+ assert_equal(@basic_constraints.to_der, bc.to_der)
42
+
43
+ bc = ef.create_extension("basicConstraints", "CA:TRUE, pathlen:2", true)
44
+ assert_equal(@basic_constraints.to_der, bc.to_der)
45
+
46
+ begin
47
+ ef.config = OpenSSL::Config.parse(<<-_end_of_cnf_)
48
+ [crlDistPts]
49
+ URI.1 = http://www.example.com/crl
50
+ URI.2 = ldap://ldap.example.com/cn=ca?certificateRevocationList;binary
51
+ _end_of_cnf_
52
+ rescue NotImplementedError
53
+ return
54
+ end
55
+
56
+ cdp = ef.create_extension("crlDistributionPoints", "@crlDistPts")
57
+ assert_equal(false, cdp.critical?)
58
+ assert_equal("crlDistributionPoints", cdp.oid)
59
+ assert_match(%{URI:http://www\.example\.com/crl}, cdp.value)
60
+ assert_match(
61
+ %r{URI:ldap://ldap\.example\.com/cn=ca\?certificateRevocationList;binary},
62
+ cdp.value)
63
+
64
+ cdp = ef.create_extension("crlDistributionPoints", "critical, @crlDistPts")
65
+ assert_equal(true, cdp.critical?)
66
+ assert_equal("crlDistributionPoints", cdp.oid)
67
+ assert_match(%{URI:http://www.example.com/crl}, cdp.value)
68
+ assert_match(
69
+ %r{URI:ldap://ldap.example.com/cn=ca\?certificateRevocationList;binary},
70
+ cdp.value)
71
+ end
72
+
73
+ # JRUBY-3888
74
+ # Problems with subjectKeyIdentifier with non 20-bytes sha1 digested keys
75
+ def test_certificate_with_rare_extension
76
+ cert_file = File.join(File.dirname(__FILE__), "..", "fixture", "max.pem")
77
+ cer = OpenSSL::X509::Certificate.new(File.read(cert_file))
78
+ exts = Hash.new
79
+ cer.extensions.each{|ext| exts[ext.oid] = ext.value}
80
+
81
+ assert exts["subjectKeyIdentifier"] == "4C:B9:E1:DC:7A:AC:35:CF"
82
+ end
83
+
84
+ def test_extension_from_20_byte_sha1_digests
85
+ cert_file = File.join(File.dirname(__FILE__), "..", "fixture", "common.pem")
86
+ cer = OpenSSL::X509::Certificate.new(File.read(cert_file))
87
+ exts = Hash.new
88
+ cer.extensions.each{|ext| exts[ext.oid] = ext.value}
89
+
90
+ assert exts["subjectKeyIdentifier"] == "B4:AC:83:5D:21:FB:D6:8A:56:7E:B2:49:6D:69:BB:E4:6F:D8:5A:AC"
91
+ end
92
+
93
+ end
94
+
95
+ end
@@ -0,0 +1,265 @@
1
+ begin
2
+ require "openssl"
3
+ rescue LoadError
4
+ end
5
+ require "test/unit"
6
+
7
+ if defined?(OpenSSL)
8
+
9
+ class OpenSSL::TestX509Name < Test::Unit::TestCase
10
+ OpenSSL::ASN1::ObjectId.register(
11
+ "1.2.840.113549.1.9.1", "emailAddress", "emailAddress")
12
+ OpenSSL::ASN1::ObjectId.register(
13
+ "2.5.4.5", "serialNumber", "serialNumber")
14
+
15
+ def setup
16
+ @obj_type_tmpl = Hash.new(OpenSSL::ASN1::PRINTABLESTRING)
17
+ @obj_type_tmpl.update(OpenSSL::X509::Name::OBJECT_TYPE_TEMPLATE)
18
+ end
19
+
20
+ def teardown
21
+ end
22
+
23
+ def test_s_new
24
+ dn = [ ["C", "JP"], ["O", "example"], ["CN", "www.example.jp"] ]
25
+ name = OpenSSL::X509::Name.new(dn)
26
+ ary = name.to_a
27
+ assert_equal("/C=JP/O=example/CN=www.example.jp", name.to_s)
28
+ assert_equal("C", ary[0][0])
29
+ assert_equal("O", ary[1][0])
30
+ assert_equal("CN", ary[2][0])
31
+ assert_equal("JP", ary[0][1])
32
+ assert_equal("example", ary[1][1])
33
+ assert_equal("www.example.jp", ary[2][1])
34
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[0][2])
35
+ assert_equal(OpenSSL::ASN1::UTF8STRING, ary[1][2])
36
+ assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
37
+
38
+ dn = [
39
+ ["countryName", "JP"],
40
+ ["organizationName", "example"],
41
+ ["commonName", "www.example.jp"]
42
+ ]
43
+ name = OpenSSL::X509::Name.new(dn)
44
+ ary = name.to_a
45
+ assert_equal("/C=JP/O=example/CN=www.example.jp", name.to_s)
46
+ assert_equal("C", ary[0][0])
47
+ assert_equal("O", ary[1][0])
48
+ assert_equal("CN", ary[2][0])
49
+ assert_equal("JP", ary[0][1])
50
+ assert_equal("example", ary[1][1])
51
+ assert_equal("www.example.jp", ary[2][1])
52
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[0][2])
53
+ assert_equal(OpenSSL::ASN1::UTF8STRING, ary[1][2])
54
+ assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
55
+
56
+ name = OpenSSL::X509::Name.new(dn, @obj_type_tmpl)
57
+ ary = name.to_a
58
+ assert_equal("/C=JP/O=example/CN=www.example.jp", name.to_s)
59
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[0][2])
60
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[1][2])
61
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[2][2])
62
+
63
+ dn = [
64
+ ["countryName", "JP", OpenSSL::ASN1::PRINTABLESTRING],
65
+ ["organizationName", "example", OpenSSL::ASN1::PRINTABLESTRING],
66
+ ["commonName", "www.example.jp", OpenSSL::ASN1::PRINTABLESTRING]
67
+ ]
68
+ name = OpenSSL::X509::Name.new(dn)
69
+ ary = name.to_a
70
+ assert_equal("/C=JP/O=example/CN=www.example.jp", name.to_s)
71
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[0][2])
72
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[1][2])
73
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[2][2])
74
+
75
+ dn = [
76
+ ["DC", "org"],
77
+ ["DC", "ruby-lang"],
78
+ ["CN", "GOTOU Yuuzou"],
79
+ ["emailAddress", "gotoyuzo@ruby-lang.org"],
80
+ ["serialNumber", "123"],
81
+ ]
82
+ name = OpenSSL::X509::Name.new(dn)
83
+ ary = name.to_a
84
+ assert_equal("/DC=org/DC=ruby-lang/CN=GOTOU Yuuzou/emailAddress=gotoyuzo@ruby-lang.org/serialNumber=123", name.to_s)
85
+ assert_equal("DC", ary[0][0])
86
+ assert_equal("DC", ary[1][0])
87
+ assert_equal("CN", ary[2][0])
88
+ assert_equal("emailAddress", ary[3][0])
89
+ assert_equal("serialNumber", ary[4][0])
90
+ assert_equal("org", ary[0][1])
91
+ assert_equal("ruby-lang", ary[1][1])
92
+ assert_equal("GOTOU Yuuzou", ary[2][1])
93
+ assert_equal("gotoyuzo@ruby-lang.org", ary[3][1])
94
+ assert_equal("123", ary[4][1])
95
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
96
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
97
+ assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
98
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[3][2])
99
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[4][2])
100
+
101
+ name_from_der = OpenSSL::X509::Name.new(name.to_der)
102
+ assert_equal(name_from_der.to_s, name.to_s)
103
+ assert_equal(name_from_der.to_a, name.to_a)
104
+ assert_equal(name_from_der.to_der, name.to_der)
105
+ end
106
+
107
+ def test_s_parse
108
+ dn = "/DC=org/DC=ruby-lang/CN=www.ruby-lang.org"
109
+ name = OpenSSL::X509::Name.parse(dn)
110
+ assert_equal(dn, name.to_s)
111
+ ary = name.to_a
112
+ assert_equal("DC", ary[0][0])
113
+ assert_equal("DC", ary[1][0])
114
+ assert_equal("CN", ary[2][0])
115
+ assert_equal("org", ary[0][1])
116
+ assert_equal("ruby-lang", ary[1][1])
117
+ assert_equal("www.ruby-lang.org", ary[2][1])
118
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
119
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
120
+ assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
121
+
122
+ dn2 = "DC=org, DC=ruby-lang, CN=www.ruby-lang.org"
123
+ name = OpenSSL::X509::Name.parse(dn)
124
+ ary = name.to_a
125
+ assert_equal(dn, name.to_s)
126
+ assert_equal("org", ary[0][1])
127
+ assert_equal("ruby-lang", ary[1][1])
128
+ assert_equal("www.ruby-lang.org", ary[2][1])
129
+
130
+ name = OpenSSL::X509::Name.parse(dn, @obj_type_tmpl)
131
+ ary = name.to_a
132
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
133
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
134
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[2][2])
135
+ end
136
+
137
+ def test_s_parse_rfc2253
138
+ scanner = OpenSSL::X509::Name::RFC2253DN.method(:scan)
139
+ assert_equal([["C", "JP"]], scanner.call("C=JP"))
140
+ assert_equal([
141
+ ["DC", "org"],
142
+ ["DC", "ruby-lang"],
143
+ ["CN", "GOTOU Yuuzou"],
144
+ ["emailAddress", "gotoyuzo@ruby-lang.org"],
145
+ ],
146
+ scanner.call(
147
+ "emailAddress=gotoyuzo@ruby-lang.org,CN=GOTOU Yuuzou,"+
148
+ "DC=ruby-lang,DC=org")
149
+ )
150
+
151
+ u8 = OpenSSL::ASN1::UTF8STRING
152
+ assert_equal([
153
+ ["DC", "org"],
154
+ ["DC", "ruby-lang"],
155
+ ["O", ",=+<>#;"],
156
+ ["O", ",=+<>#;"],
157
+ ["OU", ""],
158
+ ["OU", ""],
159
+ ["L", "aaa=\"bbb, ccc\""],
160
+ ["L", "aaa=\"bbb, ccc\""],
161
+ ["CN", "\345\276\214\350\227\244\350\243\225\350\224\265"],
162
+ ["CN", "\345\276\214\350\227\244\350\243\225\350\224\265"],
163
+ ["CN", "\345\276\214\350\227\244\350\243\225\350\224\265"],
164
+ ["CN", "\345\276\214\350\227\244\350\243\225\350\224\265", u8],
165
+ ["2.5.4.3", "GOTOU, Yuuzou"],
166
+ ["2.5.4.3", "GOTOU, Yuuzou"],
167
+ ["2.5.4.3", "GOTOU, Yuuzou"],
168
+ ["2.5.4.3", "GOTOU, Yuuzou"],
169
+ ["CN", "GOTOU \"gotoyuzo\" Yuuzou"],
170
+ ["CN", "GOTOU \"gotoyuzo\" Yuuzou"],
171
+ ["1.2.840.113549.1.9.1", "gotoyuzo@ruby-lang.org"],
172
+ ["emailAddress", "gotoyuzo@ruby-lang.org"],
173
+ ],
174
+ scanner.call(
175
+ "emailAddress=gotoyuzo@ruby-lang.org," +
176
+ "1.2.840.113549.1.9.1=gotoyuzo@ruby-lang.org," +
177
+ 'CN=GOTOU \"gotoyuzo\" Yuuzou,' +
178
+ 'CN="GOTOU \"gotoyuzo\" Yuuzou",' +
179
+ '2.5.4.3=GOTOU\,\20Yuuzou,' +
180
+ '2.5.4.3=GOTOU\, Yuuzou,' +
181
+ '2.5.4.3="GOTOU, Yuuzou",' +
182
+ '2.5.4.3="GOTOU\, Yuuzou",' +
183
+ "CN=#0C0CE5BE8CE897A4E8A395E894B5," +
184
+ 'CN=\E5\BE\8C\E8\97\A4\E8\A3\95\E8\94\B5,' +
185
+ "CN=\"\xE5\xBE\x8C\xE8\x97\xA4\xE8\xA3\x95\xE8\x94\xB5\"," +
186
+ "CN=\xE5\xBE\x8C\xE8\x97\xA4\xE8\xA3\x95\xE8\x94\xB5," +
187
+ 'L=aaa\=\"bbb\, ccc\",' +
188
+ 'L="aaa=\"bbb, ccc\"",' +
189
+ 'OU=,' +
190
+ 'OU="",' +
191
+ 'O=\,\=\+\<\>\#\;,' +
192
+ 'O=",=+<>#;",' +
193
+ "DC=ruby-lang," +
194
+ "DC=org")
195
+ )
196
+
197
+ [
198
+ "DC=org+DC=jp",
199
+ "DC=org,DC=ruby-lang+DC=rubyist,DC=www"
200
+ ].each{|dn|
201
+ ex = scanner.call(dn) rescue $!
202
+ dn_r = Regexp.escape(dn)
203
+ assert_match(/^multi-valued RDN is not supported: #{dn_r}/, ex.message)
204
+ }
205
+
206
+ [
207
+ ["DC=org,DC=exapmle,CN", "CN"],
208
+ ["DC=org,DC=example,", ""],
209
+ ["DC=org,DC=exapmle,CN=www.example.org;", "CN=www.example.org;"],
210
+ ["DC=org,DC=exapmle,CN=#www.example.org", "CN=#www.example.org"],
211
+ ["DC=org,DC=exapmle,CN=#777777.example.org", "CN=#777777.example.org"],
212
+ ["DC=org,DC=exapmle,CN=\"www.example\".org", "CN=\"www.example\".org"],
213
+ ["DC=org,DC=exapmle,CN=www.\"example.org\"", "CN=www.\"example.org\""],
214
+ ["DC=org,DC=exapmle,CN=www.\"example\".org", "CN=www.\"example\".org"],
215
+ ].each{|dn, msg|
216
+ ex = scanner.call(dn) rescue $!
217
+ assert_match(/^malformed RDN: .*=>#{Regexp.escape(msg)}/, ex.message)
218
+ }
219
+
220
+ dn = "CN=www.ruby-lang.org,DC=ruby-lang,DC=org"
221
+ name = OpenSSL::X509::Name.parse_rfc2253(dn)
222
+ assert_equal(dn, name.to_s(OpenSSL::X509::Name::RFC2253))
223
+ ary = name.to_a
224
+ assert_equal("DC", ary[0][0])
225
+ assert_equal("DC", ary[1][0])
226
+ assert_equal("CN", ary[2][0])
227
+ assert_equal("org", ary[0][1])
228
+ assert_equal("ruby-lang", ary[1][1])
229
+ assert_equal("www.ruby-lang.org", ary[2][1])
230
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
231
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
232
+ assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
233
+ end
234
+
235
+ def test_add_entry
236
+ dn = [
237
+ ["DC", "org"],
238
+ ["DC", "ruby-lang"],
239
+ ["CN", "GOTOU Yuuzou"],
240
+ ["emailAddress", "gotoyuzo@ruby-lang.org"],
241
+ ["serialNumber", "123"],
242
+ ]
243
+ name = OpenSSL::X509::Name.new
244
+ dn.each{|attr| name.add_entry(*attr) }
245
+ ary = name.to_a
246
+ assert_equal("/DC=org/DC=ruby-lang/CN=GOTOU Yuuzou/emailAddress=gotoyuzo@ruby-lang.org/serialNumber=123", name.to_s)
247
+ assert_equal("DC", ary[0][0])
248
+ assert_equal("DC", ary[1][0])
249
+ assert_equal("CN", ary[2][0])
250
+ assert_equal("emailAddress", ary[3][0])
251
+ assert_equal("serialNumber", ary[4][0])
252
+ assert_equal("org", ary[0][1])
253
+ assert_equal("ruby-lang", ary[1][1])
254
+ assert_equal("GOTOU Yuuzou", ary[2][1])
255
+ assert_equal("gotoyuzo@ruby-lang.org", ary[3][1])
256
+ assert_equal("123", ary[4][1])
257
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
258
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
259
+ assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
260
+ assert_equal(OpenSSL::ASN1::IA5STRING, ary[3][2])
261
+ assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[4][2])
262
+ end
263
+ end
264
+
265
+ end
@@ -0,0 +1,178 @@
1
+ begin
2
+ require "openssl"
3
+ require File.join(File.dirname(__FILE__), "utils.rb")
4
+ rescue LoadError
5
+ end
6
+ require "test/unit"
7
+
8
+ if defined?(OpenSSL)
9
+
10
+ class OpenSSL::TestX509Request < Test::Unit::TestCase
11
+ def setup
12
+ @rsa1024 = OpenSSL::TestUtils::TEST_KEY_RSA1024
13
+ @rsa2048 = OpenSSL::TestUtils::TEST_KEY_RSA2048
14
+ @dsa256 = OpenSSL::TestUtils::TEST_KEY_DSA256
15
+ @dsa512 = OpenSSL::TestUtils::TEST_KEY_DSA512
16
+ @dn = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=GOTOU Yuuzou")
17
+ end
18
+
19
+ def issue_csr(ver, dn, key, digest)
20
+ req = OpenSSL::X509::Request.new
21
+ req.version = ver
22
+ req.subject = dn
23
+ req.public_key = key.public_key
24
+ req.sign(key, digest)
25
+ req
26
+ end
27
+
28
+ def test_public_key
29
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest::SHA1.new)
30
+ assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
31
+ req = OpenSSL::X509::Request.new(req.to_der)
32
+ assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
33
+
34
+ req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest::DSS1.new)
35
+ assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
36
+ req = OpenSSL::X509::Request.new(req.to_der)
37
+ assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
38
+ end
39
+
40
+ def test_version
41
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest::SHA1.new)
42
+ assert_equal(0, req.version)
43
+ req = OpenSSL::X509::Request.new(req.to_der)
44
+ assert_equal(0, req.version)
45
+
46
+ req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest::SHA1.new)
47
+ assert_equal(1, req.version)
48
+ req = OpenSSL::X509::Request.new(req.to_der)
49
+ assert_equal(1, req.version)
50
+ end
51
+
52
+ def test_subject
53
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest::SHA1.new)
54
+ assert_equal(@dn.to_der, req.subject.to_der)
55
+ req = OpenSSL::X509::Request.new(req.to_der)
56
+ assert_equal(@dn.to_der, req.subject.to_der)
57
+ end
58
+
59
+ def create_ext_req(exts)
60
+ ef = OpenSSL::X509::ExtensionFactory.new
61
+ exts = exts.collect{|e| ef.create_extension(*e) }
62
+ return OpenSSL::ASN1::Set([OpenSSL::ASN1::Sequence(exts)])
63
+ end
64
+
65
+ def get_ext_req(ext_req_value)
66
+ set = OpenSSL::ASN1.decode(ext_req_value)
67
+ seq = set.value[0]
68
+ seq.value.collect{|asn1ext|
69
+ OpenSSL::X509::Extension.new(asn1ext).to_a
70
+ }
71
+ end
72
+
73
+ def test_attr
74
+ exts = [
75
+ ["keyUsage", "Digital Signature, Key Encipherment", true],
76
+ ["subjectAltName", "email:gotoyuzo@ruby-lang.org", false],
77
+ ]
78
+ attrval = create_ext_req(exts)
79
+ attrs = [
80
+ OpenSSL::X509::Attribute.new("extReq", attrval),
81
+ OpenSSL::X509::Attribute.new("msExtReq", attrval),
82
+ ]
83
+
84
+ req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest::SHA1.new)
85
+ attrs.each{|attr| req0.add_attribute(attr) }
86
+ req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest::SHA1.new)
87
+ req1.attributes = attrs
88
+ assert_equal(req0.to_der, req1.to_der)
89
+
90
+ attrs = req0.attributes
91
+ assert_equal(2, attrs.size)
92
+ assert_equal("extReq", attrs[0].oid)
93
+ assert_equal("msExtReq", attrs[1].oid)
94
+ assert_equal(exts, get_ext_req(attrs[0].value))
95
+ assert_equal(exts, get_ext_req(attrs[1].value))
96
+
97
+ req = OpenSSL::X509::Request.new(req0.to_der)
98
+ attrs = req.attributes
99
+ assert_equal(2, attrs.size)
100
+ assert_equal("extReq", attrs[0].oid)
101
+ assert_equal("msExtReq", attrs[1].oid)
102
+ assert_equal(exts, get_ext_req(attrs[0].value))
103
+ assert_equal(exts, get_ext_req(attrs[1].value))
104
+ end
105
+
106
+ def test_sign_and_verify
107
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest::SHA1.new)
108
+ assert_equal(true, req.verify(@rsa1024))
109
+ assert_equal(false, req.verify(@rsa2048))
110
+ assert_equal(false, req.verify(@dsa256))
111
+ assert_equal(false, req.verify(@dsa512))
112
+ req.version = 1
113
+ assert_equal(false, req.verify(@rsa1024))
114
+
115
+ req = issue_csr(0, @dn, @rsa2048, OpenSSL::Digest::MD5.new)
116
+ assert_equal(false, req.verify(@rsa1024))
117
+ assert_equal(true, req.verify(@rsa2048))
118
+ assert_equal(false, req.verify(@dsa256))
119
+ assert_equal(false, req.verify(@dsa512))
120
+ req.subject = OpenSSL::X509::Name.parse("/C=JP/CN=FooBar")
121
+ assert_equal(false, req.verify(@rsa2048))
122
+
123
+ req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest::DSS1.new)
124
+ assert_equal(false, req.verify(@rsa1024))
125
+ assert_equal(false, req.verify(@rsa2048))
126
+ assert_equal(false, req.verify(@dsa256))
127
+ assert_equal(true, req.verify(@dsa512))
128
+ req.public_key = @rsa1024.public_key
129
+ assert_equal(false, req.verify(@dsa512))
130
+
131
+ assert_raise(OpenSSL::X509::RequestError){
132
+ issue_csr(0, @dn, @rsa1024, OpenSSL::Digest::DSS1.new) }
133
+ assert_raise(OpenSSL::X509::RequestError){
134
+ issue_csr(0, @dn, @dsa512, OpenSSL::Digest::SHA1.new) }
135
+ assert_raise(OpenSSL::X509::RequestError){
136
+ issue_csr(0, @dn, @dsa512, OpenSSL::Digest::MD5.new) }
137
+ end
138
+
139
+ def test_create_from_pem
140
+ req = <<END
141
+ -----BEGIN CERTIFICATE REQUEST-----
142
+ MIIBVTCBvwIBADAWMRQwEgYDVQQDDAsxOTIuMTY4LjAuNDCBnzANBgkqhkiG9w0B
143
+ AQEFAAOBjQAwgYkCgYEA0oTTzFLydOTVtBpNdYl4S0356AysVkHlqD/tNEMxQT0l
144
+ dXdNoDKb/3TfM5WMciNxBb8rImJ51vEIf6WaWvPbaawcmhNWA9JmhMIeFCdeXyu/
145
+ XEjiiEOL4MkWf6qfsu6VoPr2YSnR0iiWLgWcnRPuy84+PE1XPPl1qGDA0apWJ9kC
146
+ AwEAAaAAMA0GCSqGSIb3DQEBBAUAA4GBAKdlyDzVrXRLkPdukQUTTy6uwhv35SKL
147
+ FfiKDrHtnFYd7VbynQ1sRre5CknuRrm+E7aEJEwpz6MS+6nqmQ6JwGcm/hlZM/m7
148
+ DVD201pI3p6LIxaRyXE20RYTp0Jj6jv+tNFd0wjVlzgStmcplNo8hu6Dtp1gKETW
149
+ qL7M4i48FXHn
150
+ -----END CERTIFICATE REQUEST-----
151
+ END
152
+ req = OpenSSL::X509::Request.new(req)
153
+
154
+ assert_equal(0, req.version)
155
+ assert_equal(OpenSSL::X509::Name.parse("/CN=192.168.0.4").to_der, req.subject.to_der)
156
+ end
157
+
158
+ def test_create_to_pem
159
+ req_s = <<END
160
+ -----BEGIN CERTIFICATE REQUEST-----
161
+ MIIBVTCBvwIBADAWMRQwEgYDVQQDDAsxOTIuMTY4LjAuNDCBnzANBgkqhkiG9w0B
162
+ AQEFAAOBjQAwgYkCgYEA0oTTzFLydOTVtBpNdYl4S0356AysVkHlqD/tNEMxQT0l
163
+ dXdNoDKb/3TfM5WMciNxBb8rImJ51vEIf6WaWvPbaawcmhNWA9JmhMIeFCdeXyu/
164
+ XEjiiEOL4MkWf6qfsu6VoPr2YSnR0iiWLgWcnRPuy84+PE1XPPl1qGDA0apWJ9kC
165
+ AwEAAaAAMA0GCSqGSIb3DQEBBAUAA4GBAKdlyDzVrXRLkPdukQUTTy6uwhv35SKL
166
+ FfiKDrHtnFYd7VbynQ1sRre5CknuRrm+E7aEJEwpz6MS+6nqmQ6JwGcm/hlZM/m7
167
+ DVD201pI3p6LIxaRyXE20RYTp0Jj6jv+tNFd0wjVlzgStmcplNo8hu6Dtp1gKETW
168
+ qL7M4i48FXHn
169
+ -----END CERTIFICATE REQUEST-----
170
+ END
171
+ req = OpenSSL::X509::Request.new(req_s)
172
+
173
+ assert_equal(req_s, req.to_pem)
174
+ end
175
+
176
+ end
177
+
178
+ end