jruby-openssl 0.8.0.pre3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/Manifest.txt +5 -124
  2. data/Rakefile +3 -3
  3. data/lib/shared/jopenssl.jar +0 -0
  4. data/lib/shared/jopenssl/version.rb +1 -1
  5. metadata +10 -116
  6. data/test/1.8/ssl_server.rb +0 -99
  7. data/test/1.8/test_asn1.rb +0 -212
  8. data/test/1.8/test_cipher.rb +0 -193
  9. data/test/1.8/test_config.rb +0 -290
  10. data/test/1.8/test_digest.rb +0 -88
  11. data/test/1.8/test_ec.rb +0 -128
  12. data/test/1.8/test_hmac.rb +0 -46
  13. data/test/1.8/test_ns_spki.rb +0 -59
  14. data/test/1.8/test_pair.rb +0 -149
  15. data/test/1.8/test_pkcs7.rb +0 -489
  16. data/test/1.8/test_pkey_rsa.rb +0 -49
  17. data/test/1.8/test_ssl.rb +0 -1032
  18. data/test/1.8/test_x509cert.rb +0 -277
  19. data/test/1.8/test_x509crl.rb +0 -253
  20. data/test/1.8/test_x509ext.rb +0 -99
  21. data/test/1.8/test_x509name.rb +0 -290
  22. data/test/1.8/test_x509req.rb +0 -195
  23. data/test/1.8/test_x509store.rb +0 -246
  24. data/test/1.8/utils.rb +0 -144
  25. data/test/1.9/ssl_server.rb +0 -81
  26. data/test/1.9/test_asn1.rb +0 -589
  27. data/test/1.9/test_bn.rb +0 -23
  28. data/test/1.9/test_buffering.rb +0 -88
  29. data/test/1.9/test_cipher.rb +0 -107
  30. data/test/1.9/test_config.rb +0 -288
  31. data/test/1.9/test_digest.rb +0 -118
  32. data/test/1.9/test_engine.rb +0 -15
  33. data/test/1.9/test_hmac.rb +0 -32
  34. data/test/1.9/test_ns_spki.rb +0 -50
  35. data/test/1.9/test_ocsp.rb +0 -47
  36. data/test/1.9/test_pair.rb +0 -257
  37. data/test/1.9/test_pkcs12.rb +0 -209
  38. data/test/1.9/test_pkcs7.rb +0 -156
  39. data/test/1.9/test_pkey_dh.rb +0 -72
  40. data/test/1.9/test_pkey_dsa.rb +0 -224
  41. data/test/1.9/test_pkey_ec.rb +0 -182
  42. data/test/1.9/test_pkey_rsa.rb +0 -244
  43. data/test/1.9/test_ssl.rb +0 -499
  44. data/test/1.9/test_ssl_session.rb +0 -327
  45. data/test/1.9/test_x509cert.rb +0 -217
  46. data/test/1.9/test_x509crl.rb +0 -221
  47. data/test/1.9/test_x509ext.rb +0 -69
  48. data/test/1.9/test_x509name.rb +0 -366
  49. data/test/1.9/test_x509req.rb +0 -150
  50. data/test/1.9/test_x509store.rb +0 -229
  51. data/test/1.9/utils.rb +0 -304
  52. data/test/cert_with_ec_pk.cer +0 -27
  53. data/test/fixture/ca-bundle.crt +0 -2794
  54. data/test/fixture/ca_path/72fa7371.0 +0 -19
  55. data/test/fixture/ca_path/verisign.pem +0 -19
  56. data/test/fixture/cacert.pem +0 -23
  57. data/test/fixture/cert_localhost.pem +0 -19
  58. data/test/fixture/common.pem +0 -48
  59. data/test/fixture/ids_in_subject_rdn_set.pem +0 -31
  60. data/test/fixture/imaps/cacert.pem +0 -60
  61. data/test/fixture/imaps/server.crt +0 -61
  62. data/test/fixture/imaps/server.key +0 -15
  63. data/test/fixture/key_then_cert.pem +0 -34
  64. data/test/fixture/keypair.pem +0 -27
  65. data/test/fixture/localhost_keypair.pem +0 -18
  66. data/test/fixture/max.pem +0 -29
  67. data/test/fixture/purpose/b70a5bc1.0 +0 -24
  68. data/test/fixture/purpose/ca/PASSWD_OF_CA_KEY_IS_1234 +0 -0
  69. data/test/fixture/purpose/ca/ca_config.rb +0 -37
  70. data/test/fixture/purpose/ca/cacert.pem +0 -24
  71. data/test/fixture/purpose/ca/newcerts/2_cert.pem +0 -19
  72. data/test/fixture/purpose/ca/newcerts/3_cert.pem +0 -19
  73. data/test/fixture/purpose/ca/newcerts/4_cert.pem +0 -19
  74. data/test/fixture/purpose/ca/private/cakeypair.pem +0 -30
  75. data/test/fixture/purpose/ca/serial +0 -1
  76. data/test/fixture/purpose/cacert.pem +0 -24
  77. data/test/fixture/purpose/scripts/gen_cert.rb +0 -127
  78. data/test/fixture/purpose/scripts/gen_csr.rb +0 -50
  79. data/test/fixture/purpose/scripts/init_ca.rb +0 -66
  80. data/test/fixture/purpose/sslclient.pem +0 -19
  81. data/test/fixture/purpose/sslclient/csr.pem +0 -10
  82. data/test/fixture/purpose/sslclient/keypair.pem +0 -15
  83. data/test/fixture/purpose/sslclient/sslclient.pem +0 -19
  84. data/test/fixture/purpose/sslserver.pem +0 -19
  85. data/test/fixture/purpose/sslserver/csr.pem +0 -10
  86. data/test/fixture/purpose/sslserver/keypair.pem +0 -15
  87. data/test/fixture/purpose/sslserver/sslserver.pem +0 -19
  88. data/test/fixture/purpose/sslserver_no_dsig_in_keyUsage.pem +0 -19
  89. data/test/fixture/selfcert.pem +0 -23
  90. data/test/fixture/verisign.pem +0 -19
  91. data/test/fixture/verisign_c3.pem +0 -14
  92. data/test/ref/a.out +0 -0
  93. data/test/ref/compile.rb +0 -8
  94. data/test/ref/pkcs1 +0 -0
  95. data/test/ref/pkcs1.c +0 -21
  96. data/test/ruby/envutil.rb +0 -208
  97. data/test/ruby/ut_eof.rb +0 -128
  98. data/test/test_all.rb +0 -1
  99. data/test/test_certificate.rb +0 -132
  100. data/test/test_cipher.rb +0 -197
  101. data/test/test_imaps.rb +0 -107
  102. data/test/test_integration.rb +0 -144
  103. data/test/test_openssl.rb +0 -4
  104. data/test/test_parse_certificate.rb +0 -27
  105. data/test/test_pkcs7.rb +0 -56
  106. data/test/test_pkey_dsa.rb +0 -180
  107. data/test/test_pkey_rsa.rb +0 -329
  108. data/test/test_ssl.rb +0 -97
  109. data/test/test_x509store.rb +0 -168
@@ -1,49 +0,0 @@
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
@@ -1,1032 +0,0 @@
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__) ? 100 : 10
21
-
22
- # NOT USED: Disable in-proc process launching and either run jruby with
23
- # specified args 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 readwrite_loop(ctx, ssl)
87
- while line = ssl.gets
88
- if line =~ /^STARTTLS$/
89
- ssl.accept
90
- next
91
- end
92
- ssl.write(line)
93
- end
94
- rescue OpenSSL::SSL::SSLError
95
- rescue IOError
96
- ensure
97
- ssl.close rescue nil
98
- end
99
-
100
- def server_loop(ctx, ssls, server_proc)
101
- loop do
102
- ssl = nil
103
- begin
104
- ssl = ssls.accept
105
- rescue OpenSSL::SSL::SSLError
106
- retry
107
- end
108
-
109
- Thread.start do
110
- Thread.current.abort_on_exception = true
111
- server_proc.call(ctx, ssl)
112
- end
113
- end
114
- rescue Errno::EBADF, IOError, Errno::EINVAL, Errno::ECONNABORTED
115
- end
116
-
117
- def start_server(port0, verify_mode, start_immediately, args = {}, &block)
118
- ctx_proc = args[:ctx_proc]
119
- server_proc = args[:server_proc]
120
- server_proc ||= method(:readwrite_loop)
121
-
122
- store = OpenSSL::X509::Store.new
123
- store.add_cert(@ca_cert)
124
- store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
125
- ctx = OpenSSL::SSL::SSLContext.new
126
- ctx.cert_store = store
127
- #ctx.extra_chain_cert = [ ca_cert ]
128
- ctx.cert = @svr_cert
129
- ctx.key = @svr_key
130
- ctx.verify_mode = verify_mode
131
- ctx_proc.call(ctx) if ctx_proc
132
-
133
- Socket.do_not_reverse_lookup = true
134
- tcps, port = choose_port(port0)
135
-
136
- ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx)
137
- ssls.start_immediately = start_immediately
138
-
139
- begin
140
- server = Thread.new do
141
- Thread.current.abort_on_exception = true
142
- server_loop(ctx, ssls, server_proc)
143
- end
144
-
145
- $stderr.printf("%s started: pid=%d port=%d\n", SSL_SERVER, $$, port) if $DEBUG
146
-
147
- block.call(server, port.to_i)
148
- ensure
149
- tcps.close if (tcps)
150
- if (server)
151
- server.join(5)
152
- if server.alive?
153
- server.kill
154
- server.join
155
- flunk("TCPServer was closed and SSLServer is still alive") unless $!
156
- end
157
- end
158
- end
159
- end
160
-
161
- def starttls(ssl)
162
- ssl.puts("STARTTLS")
163
-
164
- sleep 1 # When this line is eliminated, process on Cygwin blocks
165
- # forever at ssl.connect. But I don't know why it does.
166
-
167
- ssl.connect
168
- end
169
-
170
- def test_ctx_setup
171
- ctx = OpenSSL::SSL::SSLContext.new
172
- assert_equal(ctx.setup, true)
173
- assert_equal(ctx.setup, nil)
174
- end
175
-
176
- def test_connect_and_close
177
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
178
- sock = TCPSocket.new("127.0.0.1", port)
179
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
180
- assert(ssl.connect)
181
- ssl.close
182
- assert(!sock.closed?)
183
- sock.close
184
-
185
- sock = TCPSocket.new("127.0.0.1", port)
186
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
187
- ssl.sync_close = true # !!
188
- assert(ssl.connect)
189
- ssl.close
190
- assert(sock.closed?)
191
- }
192
- end
193
-
194
- def test_read_and_write
195
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
196
- sock = TCPSocket.new("127.0.0.1", port)
197
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
198
- ssl.sync_close = true
199
- ssl.connect
200
-
201
- assert_raise(ArgumentError) { ssl.sysread(-1) }
202
-
203
- # puts and gets
204
- ITERATIONS.times{
205
- str = "x" * 100 + "\n"
206
- ssl.puts(str)
207
- assert_equal(str, ssl.gets)
208
- }
209
-
210
- # read and write
211
- ITERATIONS.times{|i|
212
- str = "x" * 100 + "\n"
213
- ssl.write(str)
214
- assert_equal(str, ssl.read(str.size))
215
-
216
- str = "x" * i * 100 + "\n"
217
- buf = ""
218
- ssl.write(str)
219
- assert_equal(buf.object_id, ssl.read(str.size, buf).object_id)
220
- assert_equal(str, buf)
221
- }
222
-
223
- ssl.close
224
- }
225
- end
226
-
227
- def sysread_size(ssl, size)
228
- buf = ''
229
- while buf.bytesize < size
230
- buf += ssl.sysread(size - buf.bytesize)
231
- end
232
- buf
233
- end
234
-
235
- def test_sysread_chunks
236
- args = {}
237
- args[:server_proc] = proc { |ctx, ssl|
238
- while line = ssl.gets
239
- if line =~ /^STARTTLS$/
240
- ssl.accept
241
- next
242
- end
243
- ssl.write("0" * 800)
244
- ssl.write("1" * 200)
245
- ssl.close
246
- break
247
- end
248
- }
249
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, args){|server, port|
250
- sock = TCPSocket.new("127.0.0.1", port)
251
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
252
- ssl.sync_close = true
253
- ssl.connect
254
- ssl.syswrite("hello\n")
255
- assert_equal("0" * 200, sysread_size(ssl, 200))
256
- assert_equal("0" * 200, sysread_size(ssl, 200))
257
- assert_equal("0" * 200, sysread_size(ssl, 200))
258
- assert_equal("0" * 200, sysread_size(ssl, 200))
259
- assert_equal("1" * 200, sysread_size(ssl, 200))
260
- ssl.close
261
- }
262
- end
263
-
264
- def test_sysread_buffer
265
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
266
- sock = TCPSocket.new("127.0.0.1", port)
267
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
268
- ssl.sync_close = true
269
- ssl.connect
270
- ITERATIONS.times{|i|
271
- # the given buffer is cleared before concatenating.
272
- # NB: SSLSocket#readpartial depends sysread.
273
- str = "x" * i * 100 + "\n"
274
- ssl.syswrite(str)
275
- buf = "asdf"
276
- assert_equal(buf.object_id, ssl.sysread(0, buf).object_id)
277
- assert_equal("", buf)
278
-
279
- buf = "asdf"
280
- read = ssl.sysread(str.size, buf)
281
- assert(!read.empty?)
282
- assert_equal(buf.object_id, read.object_id)
283
- assert_equal(str[0, buf.bytesize], buf)
284
- sysread_size(ssl, str.bytesize - buf.bytesize) # drop unread bytes
285
-
286
- ssl.syswrite(str)
287
- read = ssl.sysread(str.size, nil)
288
- assert(!read.empty?)
289
- assert_equal(str[0, read.bytesize], read)
290
- sysread_size(ssl, str.bytesize - read.bytesize) # drop unread bytes
291
- }
292
- ssl.close
293
- }
294
- end
295
-
296
- def test_client_auth
297
- vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
298
- start_server(PORT, vflag, true){|server, port|
299
- assert_raise(OpenSSL::SSL::SSLError){
300
- sock = TCPSocket.new("127.0.0.1", port)
301
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
302
- ssl.connect
303
- }
304
-
305
- ctx = OpenSSL::SSL::SSLContext.new
306
- ctx.key = @cli_key
307
- ctx.cert = @cli_cert
308
- sock = TCPSocket.new("127.0.0.1", port)
309
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
310
- ssl.sync_close = true
311
- ssl.connect
312
- ssl.puts("foo")
313
- assert_equal("foo\n", ssl.gets)
314
- ssl.close
315
-
316
- called = nil
317
- ctx = OpenSSL::SSL::SSLContext.new
318
- ctx.client_cert_cb = Proc.new{ |sslconn|
319
- called = true
320
- [@cli_cert, @cli_key]
321
- }
322
- sock = TCPSocket.new("127.0.0.1", port)
323
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
324
- ssl.sync_close = true
325
- ssl.connect
326
- assert(called)
327
- ssl.puts("foo")
328
- assert_equal("foo\n", ssl.gets)
329
- ssl.close
330
- }
331
- end
332
-
333
- def test_client_auth_with_server_store
334
- vflag = OpenSSL::SSL::VERIFY_PEER
335
-
336
- localcacert_file = Tempfile.open("cafile")
337
- localcacert_file << @ca_cert.to_pem
338
- localcacert_file.close
339
- localcacert_path = localcacert_file.path
340
-
341
- ssl_store = OpenSSL::X509::Store.new
342
- ssl_store.purpose = OpenSSL::X509::PURPOSE_ANY
343
- ssl_store.add_file(localcacert_path)
344
-
345
- args = {}
346
- args[:ctx_proc] = proc { |server_ctx|
347
- server_ctx.cert = @svr_cert
348
- server_ctx.key = @svr_key
349
- server_ctx.verify_mode = vflag
350
- server_ctx.cert_store = ssl_store
351
- }
352
-
353
- start_server(PORT, vflag, true, args){|server, port|
354
- ctx = OpenSSL::SSL::SSLContext.new
355
- ctx.cert = @cli_cert
356
- ctx.key = @cli_key
357
- sock = TCPSocket.new("127.0.0.1", port)
358
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
359
- ssl.sync_close = true
360
- ssl.connect
361
- ssl.puts("foo")
362
- assert_equal("foo\n", ssl.gets)
363
- ssl.close
364
- localcacert_file.unlink
365
- }
366
- end
367
-
368
- def test_client_crl_with_server_store
369
- vflag = OpenSSL::SSL::VERIFY_PEER
370
-
371
- localcacert_file = Tempfile.open("cafile")
372
- localcacert_file << @ca_cert.to_pem
373
- localcacert_file.close
374
- localcacert_path = localcacert_file.path
375
-
376
- ssl_store = OpenSSL::X509::Store.new
377
- ssl_store.purpose = OpenSSL::X509::PURPOSE_ANY
378
- ssl_store.add_file(localcacert_path)
379
- ssl_store.flags = OpenSSL::X509::V_FLAG_CRL_CHECK_ALL|OpenSSL::X509::V_FLAG_CRL_CHECK
380
-
381
- crl = issue_crl([], 1, Time.now, Time.now+1600, [],
382
- @cli_cert, @ca_key, OpenSSL::Digest::SHA1.new)
383
-
384
- ssl_store.add_crl(OpenSSL::X509::CRL.new(crl.to_pem))
385
-
386
- args = {}
387
- args[:ctx_proc] = proc { |server_ctx|
388
- server_ctx.cert = @svr_cert
389
- server_ctx.key = @svr_key
390
- server_ctx.verify_mode = vflag
391
- server_ctx.cert_store = ssl_store
392
- }
393
-
394
- start_server(PORT, vflag, true, args){|s, p|
395
- ctx = OpenSSL::SSL::SSLContext.new
396
- ctx.cert = @cli_cert
397
- ctx.key = @cli_key
398
- assert_raise(OpenSSL::SSL::SSLError){
399
- sock = TCPSocket.new("127.0.0.1", p)
400
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
401
- ssl.sync_close = true
402
- ssl.connect
403
- ssl.close
404
- }
405
- localcacert_file.unlink
406
- }
407
- end
408
-
409
- def test_starttls
410
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, false){|server, port|
411
- sock = TCPSocket.new("127.0.0.1", port)
412
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
413
- ssl.sync_close = true
414
- str = "x" * 1000 + "\n"
415
-
416
- ITERATIONS.times{
417
- ssl.puts(str)
418
- assert_equal(str, ssl.gets)
419
- }
420
-
421
- starttls(ssl)
422
-
423
- ITERATIONS.times{
424
- ssl.puts(str)
425
- assert_equal(str, ssl.gets)
426
- }
427
-
428
- ssl.close
429
- }
430
- end
431
-
432
- def test_parallel
433
- GC.start
434
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
435
- ssls = []
436
- 10.times{
437
- sock = TCPSocket.new("127.0.0.1", port)
438
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
439
- ssl.connect
440
- ssl.sync_close = true
441
- ssls << ssl
442
- }
443
- str = "x" * 1000 + "\n"
444
- ITERATIONS.times{
445
- ssls.each{|ssl|
446
- ssl.puts(str)
447
- assert_equal(str, ssl.gets)
448
- }
449
- }
450
- ssls.each{|ssl| ssl.close }
451
- }
452
- end
453
-
454
- def test_verify_result
455
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
456
- sock = TCPSocket.new("127.0.0.1", port)
457
- ctx = OpenSSL::SSL::SSLContext.new
458
- ctx.set_params
459
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
460
- assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
461
- assert_equal(OpenSSL::X509::V_ERR_SELF_SIGNED_CERT_IN_CHAIN, ssl.verify_result)
462
-
463
- sock = TCPSocket.new("127.0.0.1", port)
464
- ctx = OpenSSL::SSL::SSLContext.new
465
- ctx.set_params(
466
- :verify_callback => Proc.new do |preverify_ok, store_ctx|
467
- store_ctx.error = OpenSSL::X509::V_OK
468
- true
469
- end
470
- )
471
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
472
- ssl.connect
473
- assert_equal(OpenSSL::X509::V_OK, ssl.verify_result)
474
-
475
- sock = TCPSocket.new("127.0.0.1", port)
476
- ctx = OpenSSL::SSL::SSLContext.new
477
- ctx.set_params(
478
- :verify_callback => Proc.new do |preverify_ok, store_ctx|
479
- store_ctx.error = OpenSSL::X509::V_ERR_APPLICATION_VERIFICATION
480
- false
481
- end
482
- )
483
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
484
- assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
485
- assert_equal(OpenSSL::X509::V_ERR_APPLICATION_VERIFICATION, ssl.verify_result)
486
- }
487
- end
488
-
489
- def test_extra_chain_cert
490
- start_server(PORT, OpenSSL::SSL::VERIFY_PEER, true){|server, port|
491
- sock = TCPSocket.new("127.0.0.1", port)
492
- ctx = OpenSSL::SSL::SSLContext.new
493
- ctx.set_params
494
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
495
- assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
496
- assert_equal(OpenSSL::X509::V_ERR_SELF_SIGNED_CERT_IN_CHAIN, ssl.verify_result)
497
- }
498
- # server returns a chain w/o root cert so the client verification fails
499
- # with UNABLE_TO_GET_ISSUER_CERT_LOCALLY not SELF_SIGNED_CERT_IN_CHAIN.
500
- args = {}
501
- args[:ctx_proc] = proc { |server_ctx|
502
- server_ctx.cert = @svr_cert
503
- server_ctx.key = @svr_key
504
- server_ctx.extra_chain_cert = [@svr_cert]
505
- }
506
- start_server(PORT, OpenSSL::SSL::VERIFY_PEER, true, args){|server, port|
507
- sock = TCPSocket.new("127.0.0.1", port)
508
- ctx = OpenSSL::SSL::SSLContext.new
509
- ctx.set_params
510
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
511
- assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
512
- assert_equal(OpenSSL::X509::V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, ssl.verify_result)
513
- }
514
- end
515
-
516
- def test_client_ca
517
- args = {}
518
- vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
519
-
520
- # client_ca as a cert
521
- args[:ctx_proc] = proc { |server_ctx|
522
- server_ctx.cert = @svr_cert
523
- server_ctx.key = @svr_key
524
- server_ctx.client_ca = @ca_cert
525
- }
526
- start_server(PORT, vflag, true, args){|server, port|
527
- ctx = OpenSSL::SSL::SSLContext.new
528
- ctx.key = @cli_key
529
- ctx.cert = @cli_cert
530
- sock = TCPSocket.new("127.0.0.1", port)
531
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
532
- ssl.sync_close = true
533
- ssl.connect
534
- ssl.puts("foo")
535
- assert_equal("foo\n", ssl.gets)
536
- }
537
-
538
- # client_ca as an array
539
- args[:ctx_proc] = proc { |server_ctx|
540
- server_ctx.cert = @svr_cert
541
- server_ctx.key = @svr_key
542
- server_ctx.client_ca = [@ca_cert, @svr_cert]
543
- }
544
- start_server(PORT, vflag, true, args){|server, port|
545
- ctx = OpenSSL::SSL::SSLContext.new
546
- ctx.key = @cli_key
547
- ctx.cert = @cli_cert
548
- sock = TCPSocket.new("127.0.0.1", port)
549
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
550
- ssl.sync_close = true
551
- ssl.connect
552
- ssl.puts("foo")
553
- assert_equal("foo\n", ssl.gets)
554
- }
555
- end
556
-
557
- def test_sslctx_ssl_version_client
558
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
559
- sock = TCPSocket.new("127.0.0.1", port)
560
- ctx = OpenSSL::SSL::SSLContext.new
561
- ctx.set_params
562
- ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
563
- ctx.ssl_version = "TLSv1"
564
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
565
- assert_nothing_raised do
566
- ssl.connect
567
- end
568
- ssl.puts("hello TLSv1")
569
- ssl.close
570
- sock.close
571
- #
572
- sock = TCPSocket.new("127.0.0.1", port)
573
- ctx.ssl_version = "SSLv3"
574
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
575
- assert_nothing_raised do
576
- ssl.connect
577
- end
578
- ssl.puts("hello SSLv3")
579
- ssl.close
580
- sock.close
581
- #
582
- sock = TCPSocket.new("127.0.0.1", port)
583
- ctx.ssl_version = "SSLv3_server"
584
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
585
- assert_raise(OpenSSL::SSL::SSLError) do
586
- ssl.connect
587
- end
588
- sock.close
589
- #
590
- sock = TCPSocket.new("127.0.0.1", port)
591
- ctx.ssl_version = "TLSv1_client"
592
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
593
- assert_nothing_raised do
594
- ssl.connect
595
- end
596
- ssl.puts("hello TLSv1_client")
597
- ssl.close
598
- sock.close
599
- }
600
- end
601
-
602
- def test_sslctx_ssl_version
603
- args = {}
604
- args[:ctx_proc] = proc { |server_ctx|
605
- server_ctx.ssl_version = "TLSv1"
606
- }
607
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, args){|server, port|
608
- sock = TCPSocket.new("127.0.0.1", port)
609
- ctx = OpenSSL::SSL::SSLContext.new
610
- ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
611
- ctx.ssl_version = "TLSv1"
612
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
613
- assert_nothing_raised do
614
- ssl.connect
615
- end
616
- ssl.puts("hello TLSv1")
617
- ssl.close
618
- sock.close
619
- #
620
- sock = TCPSocket.new("127.0.0.1", port)
621
- ctx.ssl_version = "SSLv3"
622
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
623
- assert_raise(OpenSSL::SSL::SSLError) do
624
- ssl.connect
625
- end
626
- }
627
- end
628
-
629
- def test_verify_depth
630
- vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
631
- args = {}
632
- # depth == 1 => OK
633
- args[:ctx_proc] = proc { |server_ctx|
634
- server_ctx.cert = @svr_cert
635
- server_ctx.key = @svr_key
636
- server_ctx.verify_mode = vflag
637
- server_ctx.verify_depth = 1
638
- }
639
- start_server(PORT, vflag, true, args){|server, port|
640
- ctx = OpenSSL::SSL::SSLContext.new
641
- ctx.key = @cli_key
642
- ctx.cert = @cli_cert
643
- sock = TCPSocket.new("127.0.0.1", port)
644
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
645
- assert_nothing_raised do
646
- ssl.connect
647
- end
648
- ssl.close
649
- }
650
- # depth == 0 => error
651
- error = nil
652
- args[:ctx_proc] = proc { |server_ctx|
653
- server_ctx.cert = @svr_cert
654
- server_ctx.key = @svr_key
655
- server_ctx.verify_mode = vflag
656
- server_ctx.verify_depth = 0
657
- server_ctx.verify_callback = proc { |preverify_ok, store_ctx|
658
- error = store_ctx.error
659
- preverify_ok
660
- }
661
- }
662
- start_server(PORT, vflag, true, args){|server, port|
663
- ctx = OpenSSL::SSL::SSLContext.new
664
- ctx.key = @cli_key
665
- ctx.cert = @cli_cert
666
- sock = TCPSocket.new("127.0.0.1", port)
667
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
668
- assert_raises(OpenSSL::SSL::SSLError) do
669
- ssl.connect
670
- end
671
- ssl.close
672
- }
673
- assert_equal OpenSSL::X509::V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, error
674
- end
675
-
676
- def test_sslctx_set_params
677
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
678
- sock = TCPSocket.new("127.0.0.1", port)
679
- ctx = OpenSSL::SSL::SSLContext.new
680
- ctx.set_params
681
- assert_equal(OpenSSL::SSL::VERIFY_PEER, ctx.verify_mode)
682
- assert_equal(OpenSSL::SSL::OP_ALL, ctx.options)
683
- ciphers = ctx.ciphers
684
- ciphers_versions = ciphers.collect{|_, v, _, _| v }
685
- ciphers_names = ciphers.collect{|v, _, _, _| v }
686
- assert(ciphers_names.all?{|v| /ADH/ !~ v })
687
- assert(ciphers_versions.all?{|v| /SSLv2/ !~ v })
688
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
689
- assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
690
- assert_equal(OpenSSL::X509::V_ERR_SELF_SIGNED_CERT_IN_CHAIN, ssl.verify_result)
691
- }
692
- end
693
-
694
- def test_sslctx_ciphers
695
- c = OpenSSL::SSL::SSLContext.new
696
-
697
- c.ciphers = 'DEFAULT'
698
- default = c.ciphers
699
- assert(default.size > 0)
700
-
701
- c.ciphers = 'ALL'
702
- all = c.ciphers
703
- assert(all.size > 0)
704
-
705
- c.ciphers = 'LOW'
706
- low = c.ciphers
707
- assert(low.size > 0)
708
-
709
- c.ciphers = 'MEDIUM'
710
- medium = c.ciphers
711
- assert(medium.size > 0)
712
-
713
- c.ciphers = 'HIGH'
714
- high = c.ciphers
715
- assert(high.size > 0)
716
-
717
- c.ciphers = 'EXP'
718
- exp = c.ciphers
719
- assert(exp.size > 0)
720
-
721
- # -
722
- c.ciphers = 'ALL:-LOW'
723
- assert_equal(all - low, c.ciphers)
724
- c.ciphers = 'ALL:-MEDIUM'
725
- assert_equal(all - medium, c.ciphers)
726
- c.ciphers = 'ALL:-HIGH'
727
- assert_equal(all - high, c.ciphers)
728
- c.ciphers = 'ALL:-EXP'
729
- assert_equal(all - exp, c.ciphers)
730
- c.ciphers = 'ALL:-LOW:-MEDIUM'
731
- assert_equal(all - low - medium, c.ciphers)
732
- c.ciphers = 'ALL:-LOW:-MEDIUM:-HIGH'
733
- assert_equal(all - low - medium - high, c.ciphers)
734
- assert_raise(OpenSSL::SSL::SSLError) do
735
- # should be empty for OpenSSL/0.9.8l. check OpenSSL changes if this test fail.
736
- c.ciphers = 'ALL:-LOW:-MEDIUM:-HIGH:-EXP'
737
- end
738
-
739
- # !
740
- c.ciphers = 'ALL:-LOW:LOW'
741
- assert_equal(all.sort, c.ciphers.sort)
742
- c.ciphers = 'ALL:!LOW:LOW'
743
- assert_equal(all - low, c.ciphers)
744
- c.ciphers = 'ALL:!LOW:+LOW'
745
- assert_equal(all - low, c.ciphers)
746
-
747
- # +
748
- c.ciphers = 'HIGH:LOW:+LOW'
749
- assert_equal(high + low, c.ciphers)
750
- c.ciphers = 'HIGH:LOW:+HIGH'
751
- assert_equal(low + high, c.ciphers)
752
-
753
- # name+name
754
- c.ciphers = 'RC4'
755
- rc4 = c.ciphers
756
- c.ciphers = 'RSA'
757
- rsa = c.ciphers
758
- c.ciphers = 'RC4+RSA'
759
- assert_equal(rc4&rsa, c.ciphers)
760
- c.ciphers = 'RSA+RC4'
761
- assert_equal(rc4&rsa, c.ciphers)
762
- c.ciphers = 'ALL:RSA+RC4'
763
- assert_equal(all + ((rc4&rsa) - all), c.ciphers)
764
- end
765
-
766
- def test_sslctx_options
767
- args = {}
768
- args[:ctx_proc] = proc { |server_ctx|
769
- # TLSv1 only
770
- server_ctx.options = OpenSSL::SSL::OP_NO_SSLv2|OpenSSL::SSL::OP_NO_SSLv3
771
- }
772
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, args){|server, port|
773
- sock = TCPSocket.new("127.0.0.1", port)
774
- ctx = OpenSSL::SSL::SSLContext.new
775
- ctx.set_params
776
- ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
777
- ctx.options = OpenSSL::SSL::OP_NO_TLSv1
778
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
779
- assert_raise(OpenSSL::SSL::SSLError, Errno::ECONNRESET) do
780
- ssl.connect
781
- end
782
- ssl.close
783
- sock.close
784
- #
785
- sock = TCPSocket.new("127.0.0.1", port)
786
- ctx = OpenSSL::SSL::SSLContext.new
787
- ctx.set_params
788
- ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
789
- ctx.options = OpenSSL::SSL::OP_NO_SSLv3
790
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
791
- assert_nothing_raised do
792
- ssl.connect
793
- end
794
- ssl.close
795
- sock.close
796
- }
797
- end
798
-
799
- def test_post_connection_check
800
- sslerr = OpenSSL::SSL::SSLError
801
-
802
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
803
- sock = TCPSocket.new("127.0.0.1", port)
804
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
805
- ssl.connect
806
- assert_raise(sslerr){ssl.post_connection_check("localhost.localdomain")}
807
- assert_raise(sslerr){ssl.post_connection_check("127.0.0.1")}
808
- assert(ssl.post_connection_check("localhost"))
809
- assert_raise(sslerr){ssl.post_connection_check("foo.example.com")}
810
-
811
- cert = ssl.peer_cert
812
- assert(!OpenSSL::SSL.verify_certificate_identity(cert, "localhost.localdomain"))
813
- assert(!OpenSSL::SSL.verify_certificate_identity(cert, "127.0.0.1"))
814
- assert(OpenSSL::SSL.verify_certificate_identity(cert, "localhost"))
815
- assert(!OpenSSL::SSL.verify_certificate_identity(cert, "foo.example.com"))
816
- }
817
-
818
- now = Time.now
819
- exts = [
820
- ["keyUsage","keyEncipherment,digitalSignature",true],
821
- ["subjectAltName","DNS:localhost.localdomain",false],
822
- ["subjectAltName","IP:127.0.0.1",false],
823
- ]
824
- @svr_cert = issue_cert(@svr, @svr_key, 4, now, now+1800, exts,
825
- @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
826
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
827
- sock = TCPSocket.new("127.0.0.1", port)
828
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
829
- ssl.connect
830
- assert(ssl.post_connection_check("localhost.localdomain"))
831
- assert(ssl.post_connection_check("127.0.0.1"))
832
- assert_raise(sslerr){ssl.post_connection_check("localhost")}
833
- assert_raise(sslerr){ssl.post_connection_check("foo.example.com")}
834
-
835
- cert = ssl.peer_cert
836
- assert(OpenSSL::SSL.verify_certificate_identity(cert, "localhost.localdomain"))
837
- assert(OpenSSL::SSL.verify_certificate_identity(cert, "127.0.0.1"))
838
- assert(!OpenSSL::SSL.verify_certificate_identity(cert, "localhost"))
839
- assert(!OpenSSL::SSL.verify_certificate_identity(cert, "foo.example.com"))
840
- }
841
-
842
- now = Time.now
843
- exts = [
844
- ["keyUsage","keyEncipherment,digitalSignature",true],
845
- ["subjectAltName","DNS:*.localdomain",false],
846
- ]
847
- @svr_cert = issue_cert(@svr, @svr_key, 5, now, now+1800, exts,
848
- @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
849
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
850
- sock = TCPSocket.new("127.0.0.1", port)
851
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
852
- ssl.connect
853
- assert(ssl.post_connection_check("localhost.localdomain"))
854
- assert_raise(sslerr){ssl.post_connection_check("127.0.0.1")}
855
- assert_raise(sslerr){ssl.post_connection_check("localhost")}
856
- assert_raise(sslerr){ssl.post_connection_check("foo.example.com")}
857
- cert = ssl.peer_cert
858
- assert(OpenSSL::SSL.verify_certificate_identity(cert, "localhost.localdomain"))
859
- assert(!OpenSSL::SSL.verify_certificate_identity(cert, "127.0.0.1"))
860
- assert(!OpenSSL::SSL.verify_certificate_identity(cert, "localhost"))
861
- assert(!OpenSSL::SSL.verify_certificate_identity(cert, "foo.example.com"))
862
- }
863
- end
864
-
865
- def TODO_implement_SSLSession_test_client_session
866
- last_session = nil
867
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true) do |server, port|
868
- 2.times do
869
- sock = TCPSocket.new("127.0.0.1", port)
870
- # Debian's openssl 0.9.8g-13 failed at assert(ssl.session_reused?),
871
- # when use default SSLContext. [ruby-dev:36167]
872
- ctx = OpenSSL::SSL::SSLContext.new("TLSv1")
873
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
874
- ssl.sync_close = true
875
- ssl.session = last_session if last_session
876
- ssl.connect
877
-
878
- session = ssl.session
879
- if last_session
880
- assert(ssl.session_reused?)
881
-
882
- if session.respond_to?(:id)
883
- assert_equal(session.id, last_session.id)
884
- end
885
- assert_equal(session.to_pem, last_session.to_pem)
886
- assert_equal(session.to_der, last_session.to_der)
887
- # Older version of OpenSSL may not be consistent. Look up which versions later.
888
- assert_equal(session.to_text, last_session.to_text)
889
- else
890
- assert(!ssl.session_reused?)
891
- end
892
- last_session = session
893
-
894
- str = "x" * 100 + "\n"
895
- ssl.puts(str)
896
- assert_equal(str, ssl.gets)
897
-
898
- ssl.close
899
- end
900
- end
901
- end
902
-
903
- def TODO_implement_SSLSession_test_server_session
904
- connections = 0
905
- saved_session = nil
906
-
907
- ctx_proc = Proc.new do |ctx, ssl|
908
- # add test for session callbacks here
909
- end
910
-
911
- server_proc = Proc.new do |ctx, ssl|
912
- session = ssl.session
913
- stats = ctx.session_cache_stats
914
-
915
- case connections
916
- when 0
917
- assert_equal(stats[:cache_num], 1)
918
- assert_equal(stats[:cache_hits], 0)
919
- assert_equal(stats[:cache_misses], 0)
920
- assert(!ssl.session_reused?)
921
- when 1
922
- assert_equal(stats[:cache_num], 1)
923
- assert_equal(stats[:cache_hits], 1)
924
- assert_equal(stats[:cache_misses], 0)
925
- assert(ssl.session_reused?)
926
- ctx.session_remove(session)
927
- saved_session = session
928
- when 2
929
- assert_equal(stats[:cache_num], 1)
930
- assert_equal(stats[:cache_hits], 1)
931
- assert_equal(stats[:cache_misses], 1)
932
- assert(!ssl.session_reused?)
933
- ctx.session_add(saved_session)
934
- when 3
935
- assert_equal(stats[:cache_num], 2)
936
- assert_equal(stats[:cache_hits], 2)
937
- assert_equal(stats[:cache_misses], 1)
938
- assert(ssl.session_reused?)
939
- ctx.flush_sessions(Time.now + 5000)
940
- when 4
941
- assert_equal(stats[:cache_num], 1)
942
- assert_equal(stats[:cache_hits], 2)
943
- assert_equal(stats[:cache_misses], 2)
944
- assert(!ssl.session_reused?)
945
- ctx.session_add(saved_session)
946
- end
947
- connections += 1
948
-
949
- readwrite_loop(ctx, ssl)
950
- end
951
-
952
- first_session = nil
953
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, :ctx_proc => ctx_proc, :server_proc => server_proc) do |server, port|
954
- 10.times do |i|
955
- sock = TCPSocket.new("127.0.0.1", port)
956
- ctx = OpenSSL::SSL::SSLContext.new
957
- if defined?(OpenSSL::SSL::OP_NO_TICKET)
958
- # disable RFC4507 support
959
- ctx.options = OpenSSL::SSL::OP_NO_TICKET
960
- end
961
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
962
- ssl.sync_close = true
963
- ssl.session = first_session if first_session
964
- ssl.connect
965
-
966
- session = ssl.session
967
- if first_session
968
- case i
969
- when 1; assert(ssl.session_reused?)
970
- when 2; assert(!ssl.session_reused?)
971
- when 3; assert(ssl.session_reused?)
972
- when 4; assert(!ssl.session_reused?)
973
- when 5..10; assert(ssl.session_reused?)
974
- end
975
- end
976
- first_session ||= session
977
-
978
- str = "x" * 100 + "\n"
979
- ssl.puts(str)
980
- assert_equal(str, ssl.gets)
981
-
982
- ssl.close
983
- end
984
- end
985
- end
986
-
987
- def test_tlsext_hostname
988
- return unless OpenSSL::SSL::SSLSocket.instance_methods.include?("hostname")
989
-
990
- ctx_proc = Proc.new do |ctx, ssl|
991
- foo_ctx = ctx.dup
992
-
993
- ctx.servername_cb = Proc.new do |ssl2, hostname|
994
- case hostname
995
- when 'foo.example.com'
996
- foo_ctx
997
- when 'bar.example.com'
998
- nil
999
- else
1000
- raise "unknown hostname #{hostname.inspect}"
1001
- end
1002
- end
1003
- end
1004
-
1005
- server_proc = Proc.new do |ctx, ssl|
1006
- readwrite_loop(ctx, ssl)
1007
- end
1008
-
1009
- start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, :ctx_proc => ctx_proc, :server_proc => server_proc) do |server, port|
1010
- 2.times do |i|
1011
- sock = TCPSocket.new("127.0.0.1", port)
1012
- ctx = OpenSSL::SSL::SSLContext.new
1013
- if defined?(OpenSSL::SSL::OP_NO_TICKET)
1014
- # disable RFC4507 support
1015
- ctx.options = OpenSSL::SSL::OP_NO_TICKET
1016
- end
1017
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
1018
- ssl.sync_close = true
1019
- ssl.hostname = (i & 1 == 0) ? 'foo.example.com' : 'bar.example.com'
1020
- ssl.connect
1021
-
1022
- str = "x" * 100 + "\n"
1023
- ssl.puts(str)
1024
- assert_equal(str, ssl.gets)
1025
-
1026
- ssl.close
1027
- end
1028
- end
1029
- end
1030
- end
1031
-
1032
- end