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,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,413 @@
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 'tempfile'
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 choose_port(port)
73
+ tcps = nil
74
+ 100.times{|i|
75
+ begin
76
+ tcps = TCPServer.new("127.0.0.1", port+i)
77
+ port = port + i
78
+ break
79
+ rescue Errno::EADDRINUSE
80
+ next
81
+ end
82
+ }
83
+ return tcps, port
84
+ end
85
+
86
+ def start_server(port0, verify_mode, start_immediately, ctx = nil, &block)
87
+ tcps, port = choose_port(port0)
88
+ t = Thread.start {
89
+ begin
90
+ if ctx.nil?
91
+ store = OpenSSL::X509::Store.new
92
+ store.add_cert(@ca_cert)
93
+ store.purpose = OpenSSL::X509::PURPOSE_ANY
94
+ ctx = OpenSSL::SSL::SSLContext.new
95
+ ctx.cert_store = store
96
+ #ctx.extra_chain_cert = [ ca_cert ]
97
+ ctx.cert = @svr_cert
98
+ ctx.key = @svr_key
99
+ ctx.verify_mode = verify_mode
100
+ end
101
+
102
+ Socket.do_not_reverse_lookup = true
103
+ ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx)
104
+ ssls.start_immediately = start_immediately
105
+
106
+ loop do
107
+ begin
108
+ ssl = ssls.accept
109
+ Thread.start{
110
+ q = Queue.new
111
+ th = Thread.start{ ssl.write(q.shift) while true }
112
+ while line = ssl.gets
113
+ if line =~ /^STARTTLS$/
114
+ ssl.accept
115
+ next
116
+ end
117
+ q.push(line)
118
+ end
119
+ th.kill if q.empty?
120
+ ssl.close
121
+ }
122
+ rescue
123
+ if $DEBUG
124
+ puts $!
125
+ puts $!.backtrace.join("\n")
126
+ end
127
+ end
128
+ end
129
+ rescue
130
+ puts $!
131
+ puts $!.backtrace.join("\n")
132
+ end
133
+ }
134
+ sleep 1
135
+ block.call(nil, port.to_i)
136
+ end
137
+
138
+ def starttls(ssl)
139
+ ssl.puts("STARTTLS")
140
+
141
+ sleep 1 # When this line is eliminated, process on Cygwin blocks
142
+ # forever at ssl.connect. But I don't know why it does.
143
+
144
+ ssl.connect
145
+ end
146
+
147
+ def test_connect_and_close
148
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
149
+ sock = TCPSocket.new("127.0.0.1", p)
150
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
151
+ assert(ssl.connect)
152
+ ssl.close
153
+ assert(!sock.closed?)
154
+ sock.close
155
+
156
+ sock = TCPSocket.new("127.0.0.1", p)
157
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
158
+ ssl.sync_close = true # !!
159
+ assert(ssl.connect)
160
+ ssl.close
161
+ assert(sock.closed?)
162
+ }
163
+ end
164
+
165
+ def test_read_and_write
166
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
167
+ sock = TCPSocket.new("127.0.0.1", p)
168
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
169
+ ssl.sync_close = true
170
+ ssl.connect
171
+
172
+ assert_raises(ArgumentError) { ssl.sysread(-1) }
173
+
174
+ # syswrite and sysread
175
+ ITERATIONS.times{|i|
176
+ str = "x" * 100 + "\n"
177
+ ssl.syswrite(str)
178
+ assert_equal(str, ssl.sysread(str.size))
179
+
180
+ str = "x" * i * 100 + "\n"
181
+ buf = ""
182
+ ssl.syswrite(str)
183
+ assert_equal(buf.object_id, ssl.sysread(str.size, buf).object_id)
184
+ assert_equal(str, buf)
185
+ }
186
+
187
+ # puts and gets
188
+ ITERATIONS.times{
189
+ str = "x" * 100 + "\n"
190
+ ssl.puts(str)
191
+ assert_equal(str, ssl.gets)
192
+ }
193
+
194
+ # read and write
195
+ ITERATIONS.times{|i|
196
+ str = "x" * 100 + "\n"
197
+ ssl.write(str)
198
+ assert_equal(str, ssl.read(str.size))
199
+
200
+ str = "x" * i * 100 + "\n"
201
+ buf = ""
202
+ ssl.write(str)
203
+ assert_equal(buf.object_id, ssl.read(str.size, buf).object_id)
204
+ assert_equal(str, buf)
205
+ }
206
+
207
+ ssl.close
208
+ }
209
+ end
210
+
211
+ def test_client_auth
212
+ vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
213
+ start_server(PORT, vflag, true){|s, p|
214
+ assert_raises(OpenSSL::SSL::SSLError){
215
+ sock = TCPSocket.new("127.0.0.1", p)
216
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
217
+ ssl.connect
218
+ }
219
+ ctx = OpenSSL::SSL::SSLContext.new
220
+ ctx.key = @cli_key
221
+ ctx.cert = @cli_cert
222
+ sock = TCPSocket.new("127.0.0.1", p)
223
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
224
+ ssl.sync_close = true
225
+ ssl.connect
226
+ ssl.puts("foo")
227
+ assert_equal("foo\n", ssl.gets)
228
+ ssl.close
229
+
230
+ called = nil
231
+ ctx = OpenSSL::SSL::SSLContext.new
232
+ ctx.client_cert_cb = Proc.new{|ssl2|
233
+ called = true
234
+ [@cli_cert, @cli_key]
235
+ }
236
+ sock = TCPSocket.new("127.0.0.1", p)
237
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
238
+ ssl.sync_close = true
239
+ ssl.connect
240
+ assert(called)
241
+ ssl.puts("foo")
242
+ assert_equal("foo\n", ssl.gets)
243
+ ssl.close
244
+ }
245
+ end
246
+
247
+ def test_client_auth_with_server_store
248
+ vflag = OpenSSL::SSL::VERIFY_PEER
249
+
250
+ localcacert_file = Tempfile.open("cafile")
251
+ localcacert_file << @ca_cert.to_pem
252
+ localcacert_file.close
253
+ localcacert_path = localcacert_file.path
254
+
255
+ ssl_store = OpenSSL::X509::Store.new
256
+ ssl_store.purpose = OpenSSL::X509::PURPOSE_ANY
257
+ ssl_store.add_file(localcacert_path)
258
+
259
+ server_ctx = OpenSSL::SSL::SSLContext.new
260
+ server_ctx.cert = @svr_cert
261
+ server_ctx.key = @svr_key
262
+ server_ctx.verify_mode = vflag
263
+ server_ctx.cert_store = ssl_store
264
+
265
+ start_server(PORT, vflag, true, server_ctx){|s, p|
266
+ ctx = OpenSSL::SSL::SSLContext.new
267
+ ctx.cert = @cli_cert
268
+ ctx.key = @cli_key
269
+ sock = TCPSocket.new("127.0.0.1", p)
270
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
271
+ ssl.sync_close = true
272
+ ssl.connect
273
+ ssl.puts("foo")
274
+ assert_equal("foo\n", ssl.gets)
275
+ ssl.close
276
+ localcacert_file.unlink
277
+ }
278
+ end
279
+
280
+ def test_client_crl_with_server_store
281
+ vflag = OpenSSL::SSL::VERIFY_PEER
282
+
283
+ localcacert_file = Tempfile.open("cafile")
284
+ localcacert_file << @ca_cert.to_pem
285
+ localcacert_file.close
286
+ localcacert_path = localcacert_file.path
287
+
288
+ ssl_store = OpenSSL::X509::Store.new
289
+ ssl_store.purpose = OpenSSL::X509::PURPOSE_ANY
290
+ ssl_store.add_file(localcacert_path)
291
+ ssl_store.flags = OpenSSL::X509::V_FLAG_CRL_CHECK_ALL|OpenSSL::X509::V_FLAG_CRL_CHECK
292
+
293
+ crl = issue_crl([], 1, Time.now, Time.now+1600, [],
294
+ @cli_cert, @ca_key, OpenSSL::Digest::SHA1.new)
295
+
296
+ ssl_store.add_crl(OpenSSL::X509::CRL.new(crl.to_pem))
297
+
298
+ server_ctx = OpenSSL::SSL::SSLContext.new
299
+ server_ctx.cert = @svr_cert
300
+ server_ctx.key = @svr_key
301
+ server_ctx.verify_mode = vflag
302
+ server_ctx.cert_store = ssl_store
303
+
304
+ start_server(PORT, vflag, true, server_ctx){|s, p|
305
+ ctx = OpenSSL::SSL::SSLContext.new
306
+ ctx.cert = @cli_cert
307
+ ctx.key = @cli_key
308
+ assert_raises(OpenSSL::SSL::SSLError){
309
+ sock = TCPSocket.new("127.0.0.1", p)
310
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
311
+ ssl.sync_close = true
312
+ ssl.connect
313
+ ssl.close
314
+ }
315
+ localcacert_file.unlink
316
+ }
317
+ end
318
+
319
+ def test_starttls
320
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, false){|s, p|
321
+ sock = TCPSocket.new("127.0.0.1", p)
322
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
323
+ ssl.sync_close = true
324
+ str = "x" * 1000 + "\n"
325
+ ITERATIONS.times{
326
+ ssl.puts(str)
327
+ assert_equal(str, ssl.gets)
328
+ }
329
+
330
+ starttls(ssl)
331
+
332
+ ITERATIONS.times{
333
+ ssl.puts(str)
334
+ assert_equal(str, ssl.gets)
335
+ }
336
+
337
+ ssl.close
338
+ }
339
+ end
340
+
341
+ def test_parallel
342
+ GC.start
343
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
344
+ ssls = []
345
+ 10.times{
346
+ sock = TCPSocket.new("127.0.0.1", p)
347
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
348
+ ssl.connect
349
+ ssl.sync_close = true
350
+ ssls << ssl
351
+ }
352
+ str = "x" * 1000 + "\n"
353
+ ITERATIONS.times{
354
+ ssls.each{|ssl|
355
+ ssl.puts(str)
356
+ assert_equal(str, ssl.gets)
357
+ }
358
+ }
359
+ ssls.each{|ssl| ssl.close }
360
+ }
361
+ end
362
+
363
+ def test_post_connection_check
364
+ sslerr = OpenSSL::SSL::SSLError
365
+
366
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
367
+ sock = TCPSocket.new("127.0.0.1", p)
368
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
369
+ ssl.connect
370
+ assert_raises(sslerr){ssl.post_connection_check("localhost.localdomain")}
371
+ assert_raises(sslerr){ssl.post_connection_check("127.0.0.1")}
372
+ assert(ssl.post_connection_check("localhost"))
373
+ assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
374
+ }
375
+
376
+ now = Time.now
377
+ exts = [
378
+ ["keyUsage","keyEncipherment,digitalSignature",true],
379
+ ["subjectAltName","DNS:localhost.localdomain",false],
380
+ ["subjectAltName","IP:127.0.0.1",false],
381
+ ]
382
+ @svr_cert = issue_cert(@svr, @svr_key, 4, now, now+1800, exts,
383
+ @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
384
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
385
+ sock = TCPSocket.new("127.0.0.1", p)
386
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
387
+ ssl.connect
388
+ assert(ssl.post_connection_check("localhost.localdomain"))
389
+ assert(ssl.post_connection_check("127.0.0.1"))
390
+ assert_raises(sslerr){ssl.post_connection_check("localhost")}
391
+ assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
392
+ }
393
+
394
+ now = Time.now
395
+ exts = [
396
+ ["keyUsage","keyEncipherment,digitalSignature",true],
397
+ ["subjectAltName","DNS:*.localdomain",false],
398
+ ]
399
+ @svr_cert = issue_cert(@svr, @svr_key, 5, now, now+1800, exts,
400
+ @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
401
+ start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
402
+ sock = TCPSocket.new("127.0.0.1", p)
403
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
404
+ ssl.connect
405
+ assert(ssl.post_connection_check("localhost.localdomain"))
406
+ assert_raises(sslerr){ssl.post_connection_check("127.0.0.1")}
407
+ assert_raises(sslerr){ssl.post_connection_check("localhost")}
408
+ assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
409
+ }
410
+ end
411
+ end
412
+
413
+ end