jruby-jruby-openssl 0.5.0.4

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 (56) hide show
  1. data/History.txt +34 -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 +35 -0
  10. data/lib/openssl/buffering.rb +239 -0
  11. data/lib/openssl/cipher.rb +58 -0
  12. data/lib/openssl/digest.rb +48 -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/localhost_keypair.pem +18 -0
  20. data/test/openssl/ssl_server.rb +99 -0
  21. data/test/openssl/test_asn1.rb +199 -0
  22. data/test/openssl/test_cipher.rb +174 -0
  23. data/test/openssl/test_digest.rb +88 -0
  24. data/test/openssl/test_hmac.rb +44 -0
  25. data/test/openssl/test_ns_spki.rb +69 -0
  26. data/test/openssl/test_pair.rb +149 -0
  27. data/test/openssl/test_pkcs7.rb +159 -0
  28. data/test/openssl/test_pkey_rsa.rb +49 -0
  29. data/test/openssl/test_ssl.rb +307 -0
  30. data/test/openssl/test_x509cert.rb +236 -0
  31. data/test/openssl/test_x509crl.rb +234 -0
  32. data/test/openssl/test_x509ext.rb +74 -0
  33. data/test/openssl/test_x509name.rb +265 -0
  34. data/test/openssl/test_x509req.rb +178 -0
  35. data/test/openssl/test_x509store.rb +245 -0
  36. data/test/openssl/utils.rb +135 -0
  37. data/test/pkcs7_mime_enveloped.message +19 -0
  38. data/test/pkcs7_mime_signed.message +30 -0
  39. data/test/pkcs7_multipart_signed.message +45 -0
  40. data/test/ref/a.out +0 -0
  41. data/test/ref/compile.rb +8 -0
  42. data/test/ref/pkcs1 +0 -0
  43. data/test/ref/pkcs1.c +21 -0
  44. data/test/test_cipher.rb +81 -0
  45. data/test/test_integration.rb +100 -0
  46. data/test/test_java.rb +98 -0
  47. data/test/test_java_attribute.rb +25 -0
  48. data/test/test_java_bio.rb +42 -0
  49. data/test/test_java_mime.rb +173 -0
  50. data/test/test_java_pkcs7.rb +769 -0
  51. data/test/test_java_smime.rb +177 -0
  52. data/test/test_openssl.rb +34 -0
  53. data/test/test_openssl_x509.rb +34 -0
  54. data/test/test_pkey.rb +46 -0
  55. data/test/ut_eof.rb +128 -0
  56. metadata +120 -0
@@ -0,0 +1,49 @@
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::TestPKeyRSA < Test::Unit::TestCase
11
+ def test_padding
12
+ key = OpenSSL::PKey::RSA.new(512, 3)
13
+
14
+ # Need right size for raw mode
15
+ plain0 = "x" * (512/8)
16
+ cipher = key.private_encrypt(plain0, OpenSSL::PKey::RSA::NO_PADDING)
17
+ plain1 = key.public_decrypt(cipher, OpenSSL::PKey::RSA::NO_PADDING)
18
+ assert_equal(plain0, plain1)
19
+
20
+ # Need smaller size for pkcs1 mode
21
+ plain0 = "x" * (512/8 - 11)
22
+ cipher1 = key.private_encrypt(plain0, OpenSSL::PKey::RSA::PKCS1_PADDING)
23
+ plain1 = key.public_decrypt(cipher1, OpenSSL::PKey::RSA::PKCS1_PADDING)
24
+ assert_equal(plain0, plain1)
25
+
26
+ cipherdef = key.private_encrypt(plain0) # PKCS1_PADDING is default
27
+ plain1 = key.public_decrypt(cipherdef)
28
+ assert_equal(plain0, plain1)
29
+ assert_equal(cipher1, cipherdef)
30
+
31
+ # Failure cases
32
+ assert_raise(ArgumentError){ key.private_encrypt() }
33
+ assert_raise(ArgumentError){ key.private_encrypt("hi", 1, nil) }
34
+ assert_raise(OpenSSL::PKey::RSAError){ key.private_encrypt(plain0, 666) }
35
+ end
36
+
37
+ def test_private
38
+ key = OpenSSL::PKey::RSA.new(512, 3)
39
+ assert(key.private?)
40
+ key2 = OpenSSL::PKey::RSA.new(key.to_der)
41
+ assert(key2.private?)
42
+ key3 = key.public_key
43
+ assert(!key3.private?)
44
+ key4 = OpenSSL::PKey::RSA.new(key3.to_der)
45
+ assert(!key4.private?)
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,307 @@
1
+ begin
2
+ require "openssl"
3
+ require File.join(File.dirname(__FILE__), "utils.rb")
4
+ rescue LoadError
5
+ end
6
+ require "rbconfig"
7
+ require "socket"
8
+ require "test/unit"
9
+ require "jruby"
10
+
11
+ if defined?(OpenSSL)
12
+
13
+ class OpenSSL::TestSSL < Test::Unit::TestCase
14
+ RUBY = ENV["RUBY"] || File.join(
15
+ ::Config::CONFIG["bindir"],
16
+ ::Config::CONFIG["ruby_install_name"] + ::Config::CONFIG["EXEEXT"]
17
+ )
18
+ SSL_SERVER = File.join(File.dirname(__FILE__), "ssl_server.rb")
19
+ PORT = 20443
20
+ ITERATIONS = ($0 == __FILE__) ? 5 : 5
21
+
22
+ # Disable in-proc process launching and either run jruby with specified args
23
+ # or yield args to a given block
24
+ def jruby_oop(*args)
25
+ prev_in_process = JRuby.runtime.instance_config.run_ruby_in_process
26
+ JRuby.runtime.instance_config.run_ruby_in_process = false
27
+ if block_given?
28
+ yield args
29
+ else
30
+ `#{RUBY} #{args.join(' ')}`
31
+ end
32
+ ensure
33
+ JRuby.runtime.instance_config.run_ruby_in_process = prev_in_process
34
+ end
35
+
36
+ def setup
37
+ @ca_key = OpenSSL::TestUtils::TEST_KEY_RSA2048
38
+ @svr_key = OpenSSL::TestUtils::TEST_KEY_RSA1024
39
+ @cli_key = OpenSSL::TestUtils::TEST_KEY_DSA256
40
+ @ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA")
41
+ @svr = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=localhost")
42
+ @cli = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=localhost")
43
+
44
+ now = Time.at(Time.now.to_i)
45
+ ca_exts = [
46
+ ["basicConstraints","CA:TRUE",true],
47
+ ["keyUsage","cRLSign,keyCertSign",true],
48
+ ]
49
+ ee_exts = [
50
+ ["keyUsage","keyEncipherment,digitalSignature",true],
51
+ ]
52
+ @ca_cert = issue_cert(@ca, @ca_key, 1, now, now+3600, ca_exts,
53
+ nil, nil, OpenSSL::Digest::SHA1.new)
54
+ @svr_cert = issue_cert(@svr, @svr_key, 2, now, now+1800, ee_exts,
55
+ @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
56
+ @cli_cert = issue_cert(@cli, @cli_key, 3, now, now+1800, ee_exts,
57
+ @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
58
+ @server = nil
59
+ end
60
+
61
+ def teardown
62
+ end
63
+
64
+ def issue_cert(*arg)
65
+ OpenSSL::TestUtils.issue_cert(*arg)
66
+ end
67
+
68
+ def issue_crl(*arg)
69
+ OpenSSL::TestUtils.issue_crl(*arg)
70
+ end
71
+
72
+ def start_server(port0, verify_mode, start_immediately, &block)
73
+ server = nil
74
+ jruby_oop {
75
+ begin
76
+ cmd = [RUBY]
77
+ cmd << "-Ilib"
78
+ cmd << "-d" if $DEBUG
79
+ cmd << SSL_SERVER << port0.to_s << verify_mode.to_s
80
+ cmd << (start_immediately ? "yes" : "no")
81
+ server = IO.popen(cmd.join(" "), "w+")
82
+ server.write(@ca_cert.to_pem)
83
+ server.write(@svr_cert.to_pem)
84
+ server.write(@svr_key.to_pem)
85
+ $stderr.puts "sent certs to server" if $DEBUG
86
+ str = server.gets
87
+ $stderr.puts "got pid from server: #{str}" if $DEBUG
88
+ pid = Integer(str)
89
+ if port = server.gets
90
+ if $DEBUG
91
+ $stderr.printf("%s started: pid=%d port=%d\n", SSL_SERVER, pid, port)
92
+ end
93
+ block.call(server, port.to_i)
94
+ end
95
+ ensure
96
+ if server
97
+ $stderr.puts "killing: #{pid}" if $DEBUG
98
+ Process.kill(:KILL, pid)
99
+ server.close
100
+ end
101
+ end
102
+ }
103
+ end
104
+
105
+ def starttls(ssl)
106
+ ssl.puts("STARTTLS")
107
+
108
+ sleep 1 # When this line is eliminated, process on Cygwin blocks
109
+ # forever at ssl.connect. But I don't know why it does.
110
+
111
+ ssl.connect
112
+ end
113
+
114
+ def test_connect_and_close
115
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
116
+ sock = TCPSocket.new("127.0.0.1", p)
117
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
118
+ assert(ssl.connect)
119
+ ssl.close
120
+ assert(!sock.closed?)
121
+ sock.close
122
+
123
+ sock = TCPSocket.new("127.0.0.1", p)
124
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
125
+ ssl.sync_close = true # !!
126
+ assert(ssl.connect)
127
+ ssl.close
128
+ assert(sock.closed?)
129
+ }
130
+ end
131
+
132
+ def test_read_and_write
133
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
134
+ sock = TCPSocket.new("127.0.0.1", p)
135
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
136
+ ssl.sync_close = true
137
+ ssl.connect
138
+
139
+ # syswrite and sysread
140
+ ITERATIONS.times{|i|
141
+ str = "x" * 100 + "\n"
142
+ ssl.syswrite(str)
143
+ assert_equal(str, ssl.sysread(str.size))
144
+
145
+ str = "x" * i * 100 + "\n"
146
+ buf = ""
147
+ ssl.syswrite(str)
148
+ assert_equal(buf.object_id, ssl.sysread(str.size, buf).object_id)
149
+ assert_equal(str, buf)
150
+ }
151
+
152
+ # puts and gets
153
+ ITERATIONS.times{
154
+ str = "x" * 100 + "\n"
155
+ ssl.puts(str)
156
+ assert_equal(str, ssl.gets)
157
+ }
158
+
159
+ # read and write
160
+ ITERATIONS.times{|i|
161
+ str = "x" * 100 + "\n"
162
+ ssl.write(str)
163
+ assert_equal(str, ssl.read(str.size))
164
+
165
+ str = "x" * i * 100 + "\n"
166
+ buf = ""
167
+ ssl.write(str)
168
+ assert_equal(buf.object_id, ssl.read(str.size, buf).object_id)
169
+ assert_equal(str, buf)
170
+ }
171
+
172
+ ssl.close
173
+ }
174
+ end
175
+
176
+ # Temporarily disabled...see JRUBY-1888
177
+ # def test_client_auth
178
+ # vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
179
+ # start_server(PORT, vflag, true){|s, p|
180
+ # assert_raises(OpenSSL::SSL::SSLError){
181
+ # sock = TCPSocket.new("127.0.0.1", p)
182
+ # ssl = OpenSSL::SSL::SSLSocket.new(sock)
183
+ # ssl.connect
184
+ # }
185
+ # ctx = OpenSSL::SSL::SSLContext.new
186
+ # ctx.key = @cli_key
187
+ # ctx.cert = @cli_cert
188
+ # sock = TCPSocket.new("127.0.0.1", p)
189
+ # ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
190
+ # ssl.sync_close = true
191
+ # ssl.connect
192
+ # ssl.puts("foo")
193
+ # assert_equal("foo\n", ssl.gets)
194
+ # ssl.close
195
+ #
196
+ # called = nil
197
+ # ctx = OpenSSL::SSL::SSLContext.new
198
+ # ctx.client_cert_cb = Proc.new{|ssl|
199
+ # called = true
200
+ # [@cli_cert, @cli_key]
201
+ # }
202
+ # sock = TCPSocket.new("127.0.0.1", p)
203
+ # ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
204
+ # ssl.sync_close = true
205
+ # ssl.connect
206
+ ## assert(called)
207
+ # ssl.puts("foo")
208
+ # assert_equal("foo\n", ssl.gets)
209
+ # ssl.close
210
+ # }
211
+ # end
212
+
213
+ def test_starttls
214
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, false){|s, p|
215
+ sock = TCPSocket.new("127.0.0.1", p)
216
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
217
+ ssl.sync_close = true
218
+ str = "x" * 1000 + "\n"
219
+ ITERATIONS.times{
220
+ ssl.puts(str)
221
+ assert_equal(str, ssl.gets)
222
+ }
223
+
224
+ starttls(ssl)
225
+
226
+ ITERATIONS.times{
227
+ ssl.puts(str)
228
+ assert_equal(str, ssl.gets)
229
+ }
230
+
231
+ ssl.close
232
+ }
233
+ end
234
+
235
+ def test_parallel
236
+ GC.start
237
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
238
+ ssls = []
239
+ 10.times{
240
+ sock = TCPSocket.new("127.0.0.1", p)
241
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
242
+ ssl.connect
243
+ ssl.sync_close = true
244
+ ssls << ssl
245
+ }
246
+ str = "x" * 1000 + "\n"
247
+ ITERATIONS.times{
248
+ ssls.each{|ssl|
249
+ ssl.puts(str)
250
+ assert_equal(str, ssl.gets)
251
+ }
252
+ }
253
+ ssls.each{|ssl| ssl.close }
254
+ }
255
+ end
256
+
257
+ def test_post_connection_check
258
+ sslerr = OpenSSL::SSL::SSLError
259
+
260
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
261
+ sock = TCPSocket.new("127.0.0.1", p)
262
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
263
+ ssl.connect
264
+ assert_raises(sslerr){ssl.post_connection_check("localhost.localdomain")}
265
+ assert_raises(sslerr){ssl.post_connection_check("127.0.0.1")}
266
+ assert(ssl.post_connection_check("localhost"))
267
+ assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
268
+ }
269
+
270
+ now = Time.now
271
+ exts = [
272
+ ["keyUsage","keyEncipherment,digitalSignature",true],
273
+ ["subjectAltName","DNS:localhost.localdomain",false],
274
+ ["subjectAltName","IP:127.0.0.1",false],
275
+ ]
276
+ @svr_cert = issue_cert(@svr, @svr_key, 4, now, now+1800, exts,
277
+ @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
278
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
279
+ sock = TCPSocket.new("127.0.0.1", p)
280
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
281
+ ssl.connect
282
+ assert(ssl.post_connection_check("localhost.localdomain"))
283
+ assert(ssl.post_connection_check("127.0.0.1"))
284
+ assert_raises(sslerr){ssl.post_connection_check("localhost")}
285
+ assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
286
+ }
287
+
288
+ now = Time.now
289
+ exts = [
290
+ ["keyUsage","keyEncipherment,digitalSignature",true],
291
+ ["subjectAltName","DNS:*.localdomain",false],
292
+ ]
293
+ @svr_cert = issue_cert(@svr, @svr_key, 5, now, now+1800, exts,
294
+ @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
295
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
296
+ sock = TCPSocket.new("127.0.0.1", p)
297
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
298
+ ssl.connect
299
+ assert(ssl.post_connection_check("localhost.localdomain"))
300
+ assert_raises(sslerr){ssl.post_connection_check("127.0.0.1")}
301
+ assert_raises(sslerr){ssl.post_connection_check("localhost")}
302
+ assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
303
+ }
304
+ end
305
+ end
306
+
307
+ end
@@ -0,0 +1,236 @@
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::TestX509Certificate < 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
+ @ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA")
17
+ @ee1 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE1")
18
+ @ee2 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE2")
19
+ end
20
+
21
+ def teardown
22
+ end
23
+
24
+ def issue_cert(*args)
25
+ OpenSSL::TestUtils.issue_cert(*args)
26
+ end
27
+
28
+ def test_serial
29
+ [1, 2**32, 2**100].each{|s|
30
+ cert = issue_cert(@ca, @rsa2048, s, Time.now, Time.now+3600, [],
31
+ nil, nil, OpenSSL::Digest::SHA1.new)
32
+ assert_equal(s, cert.serial)
33
+ cert = OpenSSL::X509::Certificate.new(cert.to_der)
34
+ assert_equal(s, cert.serial)
35
+ }
36
+ end
37
+
38
+ def test_public_key
39
+ exts = [
40
+ ["basicConstraints","CA:TRUE",true],
41
+ ["subjectKeyIdentifier","hash",false],
42
+ ["authorityKeyIdentifier","keyid:always",false],
43
+ ]
44
+
45
+ sha1 = OpenSSL::Digest::SHA1.new
46
+ dss1 = OpenSSL::Digest::DSS1.new
47
+ [
48
+ [@rsa1024, sha1], [@rsa2048, sha1], [@dsa256, dss1], [@dsa512, dss1],
49
+ ].each{|pk, digest|
50
+ cert = issue_cert(@ca, pk, 1, Time.now, Time.now+3600, exts,
51
+ nil, nil, digest)
52
+ assert_equal(cert.extensions[1].value,OpenSSL::TestUtils.get_subject_key_id(cert))
53
+ cert = OpenSSL::X509::Certificate.new(cert.to_der)
54
+ assert_equal(cert.extensions[1].value,
55
+ OpenSSL::TestUtils.get_subject_key_id(cert))
56
+ }
57
+ end
58
+
59
+ def test_validity
60
+ now = Time.now until now && now.usec != 0
61
+ cert = issue_cert(@ca, @rsa2048, 1, now, now+3600, [],
62
+ nil, nil, OpenSSL::Digest::SHA1.new)
63
+ assert_not_equal(now, cert.not_before)
64
+ assert_not_equal(now+3600, cert.not_after)
65
+
66
+ now = Time.at(now.to_i)
67
+ cert = issue_cert(@ca, @rsa2048, 1, now, now+3600, [],
68
+ nil, nil, OpenSSL::Digest::SHA1.new)
69
+ assert_equal(now.getutc, cert.not_before)
70
+ assert_equal((now+3600).getutc, cert.not_after)
71
+
72
+ now = Time.at(0)
73
+ cert = issue_cert(@ca, @rsa2048, 1, now, now, [],
74
+ nil, nil, OpenSSL::Digest::SHA1.new)
75
+ assert_equal(now.getutc, cert.not_before)
76
+ assert_equal(now.getutc, cert.not_after)
77
+
78
+ now = Time.at(0x7fffffff)
79
+ cert = issue_cert(@ca, @rsa2048, 1, now, now, [],
80
+ nil, nil, OpenSSL::Digest::SHA1.new)
81
+ assert_equal(now.getutc, cert.not_before)
82
+ assert_equal(now.getutc, cert.not_after)
83
+ end
84
+
85
+ def test_extension
86
+ ca_exts = [
87
+ ["basicConstraints","CA:TRUE",true],
88
+ ["keyUsage","keyCertSign, cRLSign",true],
89
+ ["subjectKeyIdentifier","hash",false],
90
+ ["authorityKeyIdentifier","keyid:always",false],
91
+ ]
92
+ ca_cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, ca_exts,
93
+ nil, nil, OpenSSL::Digest::SHA1.new)
94
+ ca_cert.extensions.each_with_index{|ext, i|
95
+ assert_equal(ca_exts[i].first, ext.oid)
96
+ assert_equal(ca_exts[i].last, ext.critical?)
97
+ }
98
+
99
+ ee1_exts = [
100
+ ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true],
101
+ ["subjectKeyIdentifier","hash",false],
102
+ ["authorityKeyIdentifier","keyid:always",false],
103
+ ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false],
104
+ ["subjectAltName","email:ee1@ruby-lang.org",false],
105
+ ]
106
+ ee1_cert = issue_cert(@ee1, @rsa1024, 2, Time.now, Time.now+1800, ee1_exts,
107
+ ca_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
108
+ assert_equal(ca_cert.subject.to_der, ee1_cert.issuer.to_der)
109
+ ee1_cert.extensions.each_with_index{|ext, i|
110
+ assert_equal(ee1_exts[i].first, ext.oid)
111
+ assert_equal(ee1_exts[i].last, ext.critical?)
112
+ }
113
+
114
+ ee2_exts = [
115
+ ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true],
116
+ ["subjectKeyIdentifier","hash",false],
117
+ ["authorityKeyIdentifier","issuer:always",false],
118
+ ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false],
119
+ ["subjectAltName","email:ee2@ruby-lang.org",false],
120
+ ]
121
+ ee2_cert = issue_cert(@ee2, @rsa1024, 3, Time.now, Time.now+1800, ee2_exts,
122
+ ca_cert, @rsa2048, OpenSSL::Digest::MD5.new)
123
+ assert_equal(ca_cert.subject.to_der, ee2_cert.issuer.to_der)
124
+ ee2_cert.extensions.each_with_index{|ext, i|
125
+ assert_equal(ee2_exts[i].first, ext.oid)
126
+ assert_equal(ee2_exts[i].last, ext.critical?)
127
+ }
128
+
129
+ end
130
+
131
+ def test_sign_and_verify
132
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
133
+ nil, nil, OpenSSL::Digest::SHA1.new)
134
+ assert_equal(false, cert.verify(@rsa1024))
135
+ assert_equal(true, cert.verify(@rsa2048))
136
+ assert_equal(false, cert.verify(@dsa256))
137
+ assert_equal(false, cert.verify(@dsa512))
138
+ cert.serial = 2
139
+ assert_equal(false, cert.verify(@rsa2048))
140
+
141
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
142
+ nil, nil, OpenSSL::Digest::MD5.new)
143
+ assert_equal(false, cert.verify(@rsa1024))
144
+ assert_equal(true, cert.verify(@rsa2048))
145
+ assert_equal(false, cert.verify(@dsa256))
146
+ assert_equal(false, cert.verify(@dsa512))
147
+ cert.subject = @ee1
148
+ assert_equal(false, cert.verify(@rsa2048))
149
+
150
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
151
+ nil, nil, OpenSSL::Digest::DSS1.new)
152
+ assert_equal(false, cert.verify(@rsa1024))
153
+ assert_equal(false, cert.verify(@rsa2048))
154
+ assert_equal(false, cert.verify(@dsa256))
155
+ assert_equal(true, cert.verify(@dsa512))
156
+ cert.not_after = Time.now
157
+ assert_equal(false, cert.verify(@dsa512))
158
+
159
+ assert_raises(OpenSSL::X509::CertificateError){
160
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
161
+ nil, nil, OpenSSL::Digest::DSS1.new)
162
+ }
163
+ assert_raises(OpenSSL::X509::CertificateError){
164
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
165
+ nil, nil, OpenSSL::Digest::MD5.new)
166
+ }
167
+ assert_raises(OpenSSL::X509::CertificateError){
168
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
169
+ nil, nil, OpenSSL::Digest::SHA1.new)
170
+ }
171
+ end
172
+
173
+ def test_check_private_key
174
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
175
+ nil, nil, OpenSSL::Digest::SHA1.new)
176
+ assert_equal(true, cert.check_private_key(@rsa2048))
177
+ end
178
+
179
+ def test_to_text
180
+ cert_pem = <<END
181
+ -----BEGIN CERTIFICATE-----
182
+ MIIC8zCCAdugAwIBAgIBATANBgkqhkiG9w0BAQQFADA9MRMwEQYKCZImiZPyLGQB
183
+ GRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMQswCQYDVQQDDAJDQTAe
184
+ Fw0wOTA1MjMxNTAzNDNaFw0wOTA1MjMxNjAzNDNaMD0xEzARBgoJkiaJk/IsZAEZ
185
+ FgNvcmcxGTAXBgoJkiaJk/IsZAEZFglydWJ5LWxhbmcxCzAJBgNVBAMMAkNBMIIB
186
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuV9ht9J7k4NBs38jOXvvTKY9
187
+ gW8nLICSno5EETR1cuF7i4pNs9I1QJGAFAX0BEO4KbzXmuOvfCpD3CU+Slp1enen
188
+ fzq/t/e/1IRW0wkJUJUFQign4CtrkJL+P07yx18UjyPlBXb81ApEmAB5mrJVSrWm
189
+ qbjs07JbuS4QQGGXLc+Su96DkYKmSNVjBiLxVVSpyZfAY3hD37d60uG+X8xdW5v6
190
+ 8JkRFIhdGlb6JL8fllf/A/blNwdJOhVr9mESHhwGjwfSeTDPfd8ZLE027E5lyAVX
191
+ 9KZYcU00mOX+fdxOSnGqS/8JDRh0EPHDL15RcJjV2J6vZjPb0rOYGDoMcH+94wID
192
+ AQABMA0GCSqGSIb3DQEBBAUAA4IBAQB8UTw1agA9wdXxHMUACduYu6oNL7pdF0dr
193
+ w7a4QPJyj62h4+Umxvp13q0PBw0E+mSjhXMcqUhDLjrmMcvvNGhuh5Sdjbe3GI/M
194
+ 3lCC9OwYYIzzul7omvGC3JEIGfzzdNnPPCPKEWp5X9f0MKLMR79qOf+sjHTjN2BY
195
+ SY3YGsEFxyTXDdqrlaYaOtTAdi/C+g1WxR8fkPLefymVwIFwvyc9/bnp7iBn7Hcw
196
+ mbxtLPbtQ9mURT0GHewZRTGJ1aiTq9Ag3xXME2FPF04eFRd3mclOQZNXKQ+LDxYf
197
+ k0X5FeZvsWf4srFxoVxlcDdJtHh91ZRpDDJYGQlsUm9CPTnO+e4E
198
+ -----END CERTIFICATE-----
199
+ END
200
+
201
+ cert = OpenSSL::X509::Certificate.new(cert_pem)
202
+
203
+ cert_text = <<END
204
+ [0] Version: 3
205
+ SerialNumber: 1
206
+ IssuerDN: DC=org,DC=ruby-lang,CN=CA
207
+ Start Date: Sat May 23 17:03:43 CEST 2009
208
+ Final Date: Sat May 23 18:03:43 CEST 2009
209
+ SubjectDN: DC=org,DC=ruby-lang,CN=CA
210
+ Public Key: RSA Public Key
211
+ modulus: b95f61b7d27b938341b37f23397bef4ca63d816f272c80929e8e4411347572e17b8b8a4db3d2354091801405f40443b829bcd79ae3af7c2a43dc253e4a5a757a77a77f3abfb7f7bfd48456d30909509505422827e02b6b9092fe3f4ef2c75f148f23e50576fcd40a449800799ab2554ab5a6a9b8ecd3b25bb92e104061972dcf92bbde839182a648d5630622f15554a9c997c0637843dfb77ad2e1be5fcc5d5b9bfaf0991114885d1a56fa24bf1f9657ff03f6e53707493a156bf661121e1c068f07d27930cf7ddf192c4d36ec4e65c80557f4a658714d3498e5fe7ddc4e4a71aa4bff090d187410f1c32f5e517098d5d89eaf6633dbd2b398183a0c707fbde3
212
+ public exponent: 10001
213
+
214
+ Signature Algorithm: MD5withRSA
215
+ Signature: 7c513c356a003dc1d5f11cc50009db98bbaa0d2f
216
+ ba5d17476bc3b6b840f2728fada1e3e526c6fa75
217
+ dead0f070d04fa64a385731ca948432e3ae631cb
218
+ ef34686e87949d8db7b7188fccde5082f4ec1860
219
+ 8cf3ba5ee89af182dc910819fcf374d9cf3c23ca
220
+ 116a795fd7f430a2cc47bf6a39ffac8c74e33760
221
+ 58498dd81ac105c724d70ddaab95a61a3ad4c076
222
+ 2fc2fa0d56c51f1f90f2de7f2995c08170bf273d
223
+ fdb9e9ee2067ec773099bc6d2cf6ed43d994453d
224
+ 061dec19453189d5a893abd020df15cc13614f17
225
+ 4e1e15177799c94e419357290f8b0f161f9345f9
226
+ 15e66fb167f8b2b171a15c65703749b4787dd594
227
+ 690c325819096c526f423d39cef9ee04
228
+ END
229
+ assert_not_nil(cert.to_text)
230
+ # This is commented out because it doesn't take timezone into consideration; FIXME
231
+ #assert_equal(cert_text, cert.to_text)
232
+ end
233
+
234
+ end
235
+
236
+ end