jruby-openssl 0.7.5.dev → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/History.txt +44 -14
  2. data/Manifest.txt +135 -80
  3. data/Rakefile +14 -6
  4. data/lib/{openssl.rb → 1.8/openssl.rb} +2 -11
  5. data/lib/{openssl → 1.8/openssl}/bn.rb +2 -2
  6. data/lib/{openssl → 1.8/openssl}/buffering.rb +3 -1
  7. data/lib/{openssl → 1.8/openssl}/cipher.rb +0 -0
  8. data/lib/{openssl → 1.8/openssl}/config.rb +1 -1
  9. data/lib/{openssl → 1.8/openssl}/digest.rb +2 -2
  10. data/lib/{openssl → 1.8/openssl}/pkcs7.rb +0 -0
  11. data/lib/{openssl/ssl.rb → 1.8/openssl/ssl-internal.rb} +2 -2
  12. data/lib/1.8/openssl/ssl.rb +1 -0
  13. data/lib/{openssl/x509.rb → 1.8/openssl/x509-internal.rb} +8 -9
  14. data/lib/1.8/openssl/x509.rb +1 -0
  15. data/lib/1.9/openssl.rb +22 -0
  16. data/lib/1.9/openssl/bn.rb +35 -0
  17. data/lib/1.9/openssl/buffering.rb +448 -0
  18. data/lib/1.9/openssl/cipher.rb +65 -0
  19. data/lib/1.9/openssl/config.rb +313 -0
  20. data/lib/1.9/openssl/digest.rb +72 -0
  21. data/lib/1.9/openssl/ssl-internal.rb +177 -0
  22. data/lib/1.9/openssl/ssl.rb +2 -0
  23. data/lib/1.9/openssl/x509-internal.rb +158 -0
  24. data/lib/1.9/openssl/x509.rb +2 -0
  25. data/lib/{jopenssl.jar → shared/jopenssl.jar} +0 -0
  26. data/lib/{jopenssl → shared/jopenssl}/version.rb +1 -1
  27. data/lib/shared/openssl.rb +18 -0
  28. data/lib/{openssl → shared/openssl}/dummy.rb +0 -0
  29. data/lib/{openssl → shared/openssl}/dummyssl.rb +0 -0
  30. data/lib/shared/openssl/ssl.rb +1 -0
  31. data/lib/shared/openssl/x509.rb +1 -0
  32. data/test/{openssl → 1.8}/ssl_server.rb +0 -0
  33. data/test/{openssl → 1.8}/test_asn1.rb +15 -0
  34. data/test/{openssl → 1.8}/test_cipher.rb +0 -0
  35. data/test/{openssl → 1.8}/test_config.rb +0 -0
  36. data/test/{openssl → 1.8}/test_digest.rb +0 -0
  37. data/test/{openssl → 1.8}/test_ec.rb +0 -0
  38. data/test/{openssl → 1.8}/test_hmac.rb +0 -0
  39. data/test/{openssl → 1.8}/test_ns_spki.rb +0 -0
  40. data/test/{openssl → 1.8}/test_pair.rb +10 -2
  41. data/test/{openssl → 1.8}/test_pkcs7.rb +0 -0
  42. data/test/{openssl → 1.8}/test_pkey_rsa.rb +0 -0
  43. data/test/{openssl → 1.8}/test_ssl.rb +17 -20
  44. data/test/{openssl → 1.8}/test_x509cert.rb +0 -0
  45. data/test/{openssl → 1.8}/test_x509crl.rb +0 -0
  46. data/test/{openssl → 1.8}/test_x509ext.rb +0 -0
  47. data/test/{openssl → 1.8}/test_x509name.rb +0 -0
  48. data/test/{openssl → 1.8}/test_x509req.rb +0 -0
  49. data/test/{openssl → 1.8}/test_x509store.rb +0 -0
  50. data/test/{openssl → 1.8}/utils.rb +0 -0
  51. data/test/1.9/ssl_server.rb +81 -0
  52. data/test/1.9/test_asn1.rb +589 -0
  53. data/test/1.9/test_bn.rb +23 -0
  54. data/test/1.9/test_buffering.rb +88 -0
  55. data/test/1.9/test_cipher.rb +107 -0
  56. data/test/1.9/test_config.rb +288 -0
  57. data/test/1.9/test_digest.rb +118 -0
  58. data/test/1.9/test_engine.rb +15 -0
  59. data/test/1.9/test_hmac.rb +32 -0
  60. data/test/1.9/test_ns_spki.rb +50 -0
  61. data/test/1.9/test_ocsp.rb +47 -0
  62. data/test/1.9/test_pair.rb +257 -0
  63. data/test/1.9/test_pkcs12.rb +209 -0
  64. data/test/1.9/test_pkcs7.rb +151 -0
  65. data/test/1.9/test_pkey_dh.rb +72 -0
  66. data/test/1.9/test_pkey_dsa.rb +224 -0
  67. data/test/1.9/test_pkey_ec.rb +182 -0
  68. data/test/1.9/test_pkey_rsa.rb +244 -0
  69. data/test/1.9/test_ssl.rb +455 -0
  70. data/test/1.9/test_ssl_session.rb +327 -0
  71. data/test/1.9/test_x509cert.rb +217 -0
  72. data/test/1.9/test_x509crl.rb +221 -0
  73. data/test/1.9/test_x509ext.rb +69 -0
  74. data/test/1.9/test_x509name.rb +296 -0
  75. data/test/1.9/test_x509req.rb +150 -0
  76. data/test/1.9/test_x509store.rb +229 -0
  77. data/test/1.9/utils.rb +304 -0
  78. data/test/fixture/purpose/ca/ca_config.rb +1 -1
  79. data/test/fixture/purpose/ca/gen_cert.rb +128 -0
  80. data/test/fixture/purpose/ca/newcerts/4_cert.pem +19 -0
  81. data/test/fixture/purpose/ca/serial +1 -1
  82. data/test/fixture/purpose/sslserver_no_dsig_in_keyUsage.pem +19 -0
  83. data/test/ruby/envutil.rb +208 -0
  84. data/test/ruby/ut_eof.rb +128 -0
  85. data/test/test_java.rb +1 -1
  86. data/test/test_openssl.rb +1 -1
  87. data/test/test_pkcs7.rb +16 -0
  88. data/test/test_pkey_dsa.rb +180 -0
  89. data/test/test_pkey_rsa.rb +298 -0
  90. data/test/test_ssl.rb +1 -1
  91. data/test/test_x509store.rb +8 -0
  92. metadata +121 -75
  93. data/test/test_pkey.rb +0 -204
@@ -0,0 +1,118 @@
1
+ require_relative 'utils'
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ class OpenSSL::TestDigest < Test::Unit::TestCase
6
+ def setup
7
+ @d1 = OpenSSL::Digest::Digest::new("MD5")
8
+ @d2 = OpenSSL::Digest::MD5.new
9
+ @md = Digest::MD5.new
10
+ @data = "DATA"
11
+ end
12
+
13
+ def teardown
14
+ @d1 = @d2 = @md = nil
15
+ end
16
+
17
+ def test_digest
18
+ assert_equal(@md.digest, @d1.digest)
19
+ assert_equal(@md.hexdigest, @d1.hexdigest)
20
+ @d1 << @data
21
+ @d2 << @data
22
+ @md << @data
23
+ assert_equal(@md.digest, @d1.digest)
24
+ assert_equal(@md.hexdigest, @d1.hexdigest)
25
+ assert_equal(@d1.digest, @d2.digest)
26
+ assert_equal(@d1.hexdigest, @d2.hexdigest)
27
+ assert_equal(@md.digest, OpenSSL::Digest::MD5.digest(@data))
28
+ assert_equal(@md.hexdigest, OpenSSL::Digest::MD5.hexdigest(@data))
29
+ end
30
+
31
+ def test_eql
32
+ assert(@d1 == @d2, "==")
33
+ d = @d1.clone
34
+ assert(d == @d1, "clone")
35
+ end
36
+
37
+ def test_info
38
+ assert_equal("MD5", @d1.name, "name")
39
+ assert_equal("MD5", @d2.name, "name")
40
+ assert_equal(16, @d1.size, "size")
41
+ end
42
+
43
+ def test_dup
44
+ @d1.update(@data)
45
+ assert_equal(@d1.name, @d1.dup.name, "dup")
46
+ assert_equal(@d1.name, @d1.clone.name, "clone")
47
+ assert_equal(@d1.digest, @d1.clone.digest, "clone .digest")
48
+ end
49
+
50
+ def test_reset
51
+ @d1.update(@data)
52
+ dig1 = @d1.digest
53
+ @d1.reset
54
+ @d1.update(@data)
55
+ dig2 = @d1.digest
56
+ assert_equal(dig1, dig2, "reset")
57
+ end
58
+
59
+ def test_digest_constants
60
+ algs = %w(DSS1 MD4 MD5 RIPEMD160 SHA SHA1)
61
+ if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
62
+ algs += %w(SHA224 SHA256 SHA384 SHA512)
63
+ end
64
+ algs.each do |alg|
65
+ assert_not_nil(OpenSSL::Digest.new(alg))
66
+ klass = OpenSSL::Digest.const_get(alg)
67
+ assert_not_nil(klass.new)
68
+ end
69
+ end
70
+
71
+ def test_digest_by_oid_and_name
72
+ check_digest(OpenSSL::ASN1::ObjectId.new("MD5"))
73
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA1"))
74
+ end
75
+
76
+ if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
77
+ def encode16(str)
78
+ str.unpack("H*").first
79
+ end
80
+
81
+ def test_098_features
82
+ sha224_a = "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5"
83
+ sha256_a = "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
84
+ sha384_a = "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31"
85
+ sha512_a = "1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75"
86
+
87
+ assert_equal(sha224_a, OpenSSL::Digest::SHA224.hexdigest("a"))
88
+ assert_equal(sha256_a, OpenSSL::Digest::SHA256.hexdigest("a"))
89
+ assert_equal(sha384_a, OpenSSL::Digest::SHA384.hexdigest("a"))
90
+ assert_equal(sha512_a, OpenSSL::Digest::SHA512.hexdigest("a"))
91
+
92
+ assert_equal(sha224_a, encode16(OpenSSL::Digest::SHA224.digest("a")))
93
+ assert_equal(sha256_a, encode16(OpenSSL::Digest::SHA256.digest("a")))
94
+ assert_equal(sha384_a, encode16(OpenSSL::Digest::SHA384.digest("a")))
95
+ assert_equal(sha512_a, encode16(OpenSSL::Digest::SHA512.digest("a")))
96
+ end
97
+
98
+ def test_digest_by_oid_and_name_sha2
99
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA224"))
100
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA256"))
101
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA384"))
102
+ check_digest(OpenSSL::ASN1::ObjectId.new("SHA512"))
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def check_digest(oid)
109
+ d = OpenSSL::Digest.new(oid.sn)
110
+ assert_not_nil(d)
111
+ d = OpenSSL::Digest.new(oid.ln)
112
+ assert_not_nil(d)
113
+ d = OpenSSL::Digest.new(oid.oid)
114
+ assert_not_nil(d)
115
+ end
116
+ end
117
+
118
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'utils'
2
+
3
+ if defined?(OpenSSL) && defined?(OpenSSL::Engine)
4
+
5
+ class OpenSSL::TestEngine < Test::Unit::TestCase
6
+
7
+ def test_engines_free # [ruby-dev:44173]
8
+ OpenSSL::Engine.load
9
+ OpenSSL::Engine.engines
10
+ OpenSSL::Engine.engines
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'utils'
2
+
3
+ class OpenSSL::TestHMAC < Test::Unit::TestCase
4
+ def setup
5
+ @digest = OpenSSL::Digest::MD5
6
+ @key = "KEY"
7
+ @data = "DATA"
8
+ @h1 = OpenSSL::HMAC.new(@key, @digest.new)
9
+ @h2 = OpenSSL::HMAC.new(@key, "MD5")
10
+ end
11
+
12
+ def teardown
13
+ end
14
+
15
+ def test_hmac
16
+ @h1.update(@data)
17
+ @h2.update(@data)
18
+ assert_equal(@h1.digest, @h2.digest)
19
+
20
+ assert_equal(OpenSSL::HMAC.digest(@digest.new, @key, @data), @h1.digest, "digest")
21
+ assert_equal(OpenSSL::HMAC.hexdigest(@digest.new, @key, @data), @h1.hexdigest, "hexdigest")
22
+
23
+ assert_equal(OpenSSL::HMAC.digest("MD5", @key, @data), @h2.digest, "digest")
24
+ assert_equal(OpenSSL::HMAC.hexdigest("MD5", @key, @data), @h2.hexdigest, "hexdigest")
25
+ end
26
+
27
+ def test_dup
28
+ @h1.update(@data)
29
+ h = @h1.dup
30
+ assert_equal(@h1.digest, h.digest, "dup digest")
31
+ end
32
+ end if defined?(OpenSSL)
@@ -0,0 +1,50 @@
1
+ require_relative 'utils'
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ class OpenSSL::TestNSSPI < Test::Unit::TestCase
6
+ def setup
7
+ # This request data is adopt from the specification of
8
+ # "Netscape Extensions for User Key Generation".
9
+ # -- http://wp.netscape.com/eng/security/comm4-keygen.html
10
+ @b64 = "MIHFMHEwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAnX0TILJrOMUue+PtwBRE6XfV"
11
+ @b64 << "WtKQbsshxk5ZhcUwcwyvcnIq9b82QhJdoACdD34rqfCAIND46fXKQUnb0mvKzQID"
12
+ @b64 << "AQABFhFNb3ppbGxhSXNNeUZyaWVuZDANBgkqhkiG9w0BAQQFAANBAAKv2Eex2n/S"
13
+ @b64 << "r/7iJNroWlSzSMtTiQTEB+ADWHGj9u1xrUrOilq/o2cuQxIfZcNZkYAkWP4DubqW"
14
+ @b64 << "i0//rgBvmco="
15
+ end
16
+
17
+ def test_build_data
18
+ key1 = OpenSSL::TestUtils::TEST_KEY_RSA1024
19
+ key2 = OpenSSL::TestUtils::TEST_KEY_RSA2048
20
+ spki = OpenSSL::Netscape::SPKI.new
21
+ spki.challenge = "RandomString"
22
+ spki.public_key = key1.public_key
23
+ spki.sign(key1, OpenSSL::Digest::SHA1.new)
24
+ assert(spki.verify(spki.public_key))
25
+ assert(spki.verify(key1.public_key))
26
+ assert(!spki.verify(key2.public_key))
27
+
28
+ der = spki.to_der
29
+ spki = OpenSSL::Netscape::SPKI.new(der)
30
+ assert_equal("RandomString", spki.challenge)
31
+ assert_equal(key1.public_key.to_der, spki.public_key.to_der)
32
+ assert(spki.verify(spki.public_key))
33
+ end
34
+
35
+ def test_decode_data
36
+ spki = OpenSSL::Netscape::SPKI.new(@b64)
37
+ assert_equal(@b64, spki.to_pem)
38
+ assert_equal(@b64.unpack("m").first, spki.to_der)
39
+ assert_equal("MozillaIsMyFriend", spki.challenge)
40
+ assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
41
+
42
+ spki = OpenSSL::Netscape::SPKI.new(@b64.unpack("m").first)
43
+ assert_equal(@b64, spki.to_pem)
44
+ assert_equal(@b64.unpack("m").first, spki.to_der)
45
+ assert_equal("MozillaIsMyFriend", spki.challenge)
46
+ assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,47 @@
1
+ require_relative "utils"
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ class OpenSSL::TestOCSP < Test::Unit::TestCase
6
+ def setup
7
+ ca_subj = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=TestCA")
8
+ ca_key = OpenSSL::TestUtils::TEST_KEY_RSA1024
9
+ ca_serial = 0xabcabcabcabc
10
+
11
+ subj = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=TestCert")
12
+ @key = OpenSSL::TestUtils::TEST_KEY_RSA1024
13
+ serial = 0xabcabcabcabd
14
+
15
+ now = Time.at(Time.now.to_i) # suppress usec
16
+ dgst = OpenSSL::Digest::SHA1.new
17
+
18
+ @ca_cert = OpenSSL::TestUtils.issue_cert(
19
+ ca_subj, ca_key, ca_serial, now, now+3600, [], nil, nil, dgst)
20
+ @cert = OpenSSL::TestUtils.issue_cert(
21
+ subj, @key, serial, now, now+3600, [], @ca_cert, nil, dgst)
22
+ end
23
+
24
+ def test_new_certificate_id
25
+ cid = OpenSSL::OCSP::CertificateId.new(@cert, @ca_cert)
26
+ assert_kind_of OpenSSL::OCSP::CertificateId, cid
27
+ assert_equal @cert.serial, cid.serial
28
+ end
29
+
30
+ def test_new_certificate_id_with_digest
31
+ cid = OpenSSL::OCSP::CertificateId.new(@cert, @ca_cert, OpenSSL::Digest::SHA256.new)
32
+ assert_kind_of OpenSSL::OCSP::CertificateId, cid
33
+ assert_equal @cert.serial, cid.serial
34
+ end if defined?(OpenSSL::Digest::SHA256)
35
+
36
+ def test_new_ocsp_request
37
+ request = OpenSSL::OCSP::Request.new
38
+ cid = OpenSSL::OCSP::CertificateId.new(@cert, @ca_cert, OpenSSL::Digest::SHA1.new)
39
+ request.add_certid(cid)
40
+ request.sign(@cert, @key, [@cert])
41
+ assert_kind_of OpenSSL::OCSP::Request, request
42
+ # in current implementation not same instance of certificate id, but should contain same data
43
+ assert_equal cid.serial, request.certid.first.serial
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,257 @@
1
+ require_relative 'utils'
2
+
3
+ if defined?(OpenSSL)
4
+
5
+ require 'socket'
6
+ require_relative '../ruby/ut_eof'
7
+
8
+ module SSLPair
9
+ DHParam = OpenSSL::PKey::DH.new(128)
10
+ def server
11
+ host = "127.0.0.1"
12
+ port = 0
13
+ ctx = OpenSSL::SSL::SSLContext.new()
14
+ ctx.ciphers = "ADH"
15
+ ctx.tmp_dh_callback = proc { DHParam }
16
+ tcps = TCPServer.new(host, port)
17
+ ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx)
18
+ return ssls
19
+ end
20
+
21
+ def client(port)
22
+ host = "127.0.0.1"
23
+ ctx = OpenSSL::SSL::SSLContext.new()
24
+ ctx.ciphers = "ADH"
25
+ s = TCPSocket.new(host, port)
26
+ ssl = OpenSSL::SSL::SSLSocket.new(s, ctx)
27
+ ssl.connect
28
+ ssl.sync_close = true
29
+ ssl
30
+ end
31
+
32
+ def ssl_pair
33
+ ssls = server
34
+ th = Thread.new {
35
+ ns = ssls.accept
36
+ ssls.close
37
+ ns
38
+ }
39
+ port = ssls.to_io.addr[1]
40
+ c = client(port)
41
+ s = th.value
42
+ if block_given?
43
+ begin
44
+ yield c, s
45
+ ensure
46
+ c.close unless c.closed?
47
+ s.close unless s.closed?
48
+ end
49
+ else
50
+ return c, s
51
+ end
52
+ ensure
53
+ if th && th.alive?
54
+ th.kill
55
+ th.join
56
+ end
57
+ end
58
+ end
59
+
60
+ class OpenSSL::TestEOF1 < Test::Unit::TestCase
61
+ include TestEOF
62
+ include SSLPair
63
+
64
+ def open_file(content)
65
+ s1, s2 = ssl_pair
66
+ Thread.new { s2 << content; s2.close }
67
+ yield s1
68
+ end
69
+ end
70
+
71
+ class OpenSSL::TestEOF2 < Test::Unit::TestCase
72
+ include TestEOF
73
+ include SSLPair
74
+
75
+ def open_file(content)
76
+ s1, s2 = ssl_pair
77
+ Thread.new { s1 << content; s1.close }
78
+ yield s2
79
+ end
80
+ end
81
+
82
+ class OpenSSL::TestPair < Test::Unit::TestCase
83
+ include SSLPair
84
+
85
+ def test_getc
86
+ ssl_pair {|s1, s2|
87
+ s1 << "a"
88
+ assert_equal(?a, s2.getc)
89
+ }
90
+ end
91
+
92
+ def test_readpartial
93
+ ssl_pair {|s1, s2|
94
+ s2.write "a\nbcd"
95
+ assert_equal("a\n", s1.gets)
96
+ read = s1.readpartial(10)
97
+ assert_equal("bcd"[0, read.bytesize], read)
98
+ s1.read(read.bytesize - 3) # drop unread bytes
99
+ s2.write "efg"
100
+ read = s1.readpartial(10)
101
+ assert_equal("efg"[0, read.bytesize], read)
102
+ rest = 3 - read.bytesize
103
+ while rest > 0
104
+ rest -= s1.readpartial(rest).size
105
+ end
106
+ s2.close
107
+ assert_raise(EOFError) { s1.readpartial(10) }
108
+ assert_raise(EOFError) { s1.readpartial(10) }
109
+ assert_equal("", s1.readpartial(0))
110
+ }
111
+ end
112
+
113
+ def test_readall
114
+ ssl_pair {|s1, s2|
115
+ s2.close
116
+ assert_equal("", s1.read)
117
+ }
118
+ end
119
+
120
+ def test_readline
121
+ ssl_pair {|s1, s2|
122
+ s2.close
123
+ assert_raise(EOFError) { s1.readline }
124
+ }
125
+ end
126
+
127
+ def test_puts_meta
128
+ ssl_pair {|s1, s2|
129
+ begin
130
+ old = $/
131
+ $/ = '*'
132
+ s1.puts 'a'
133
+ ensure
134
+ $/ = old
135
+ end
136
+ s1.close
137
+ assert_equal("a\n", s2.read)
138
+ }
139
+ end
140
+
141
+ def test_puts_empty
142
+ ssl_pair {|s1, s2|
143
+ s1.puts
144
+ s1.close
145
+ assert_equal("\n", s2.read)
146
+ }
147
+ end
148
+
149
+ def test_read_nonblock
150
+ ssl_pair {|s1, s2|
151
+ err = nil
152
+ assert_raise(OpenSSL::SSL::SSLError) {
153
+ begin
154
+ s2.read_nonblock(10)
155
+ ensure
156
+ err = $!
157
+ end
158
+ }
159
+ assert_kind_of(IO::WaitReadable, err)
160
+ s1.write "abc\ndef\n"
161
+ IO.select([s2])
162
+ assert_equal("ab", s2.read_nonblock(2))
163
+ assert_equal("c\n", s2.gets)
164
+ ret = nil
165
+ assert_nothing_raised("[ruby-core:20298]") { ret = s2.read_nonblock(10) }
166
+ assert_equal("def\n", ret)
167
+ }
168
+ end
169
+
170
+ def test_write_nonblock
171
+ ssl_pair {|s1, s2|
172
+ n = 0
173
+ begin
174
+ n += s1.write_nonblock("a" * 100000)
175
+ n += s1.write_nonblock("b" * 100000)
176
+ n += s1.write_nonblock("c" * 100000)
177
+ n += s1.write_nonblock("d" * 100000)
178
+ n += s1.write_nonblock("e" * 100000)
179
+ n += s1.write_nonblock("f" * 100000)
180
+ rescue IO::WaitWritable
181
+ end
182
+ s1.close
183
+ assert_equal(n, s2.read.length)
184
+ }
185
+ end
186
+
187
+ def test_write_nonblock_with_buffered_data
188
+ ssl_pair {|s1, s2|
189
+ s1.write "foo"
190
+ s1.write_nonblock("bar")
191
+ s1.write "baz"
192
+ s1.close
193
+ assert_equal("foobarbaz", s2.read)
194
+ }
195
+ end
196
+
197
+ def test_connect_accept_nonblock
198
+ host = "127.0.0.1"
199
+ port = 0
200
+ ctx = OpenSSL::SSL::SSLContext.new()
201
+ ctx.ciphers = "ADH"
202
+ ctx.tmp_dh_callback = proc { DHParam }
203
+ serv = TCPServer.new(host, port)
204
+
205
+ port = serv.connect_address.ip_port
206
+
207
+ sock1 = TCPSocket.new(host, port)
208
+ sock2 = serv.accept
209
+ serv.close
210
+
211
+ th = Thread.new {
212
+ s2 = OpenSSL::SSL::SSLSocket.new(sock2, ctx)
213
+ s2.sync_close = true
214
+ begin
215
+ sleep 0.2
216
+ s2.accept_nonblock
217
+ rescue IO::WaitReadable
218
+ IO.select([s2])
219
+ retry
220
+ rescue IO::WaitWritable
221
+ IO.select(nil, [s2])
222
+ retry
223
+ end
224
+ s2
225
+ }
226
+
227
+ sleep 0.1
228
+ ctx = OpenSSL::SSL::SSLContext.new()
229
+ ctx.ciphers = "ADH"
230
+ s1 = OpenSSL::SSL::SSLSocket.new(sock1, ctx)
231
+ begin
232
+ sleep 0.2
233
+ s1.connect_nonblock
234
+ rescue IO::WaitReadable
235
+ IO.select([s1])
236
+ retry
237
+ rescue IO::WaitWritable
238
+ IO.select(nil, [s1])
239
+ retry
240
+ end
241
+ s1.sync_close = true
242
+
243
+ s2 = th.value
244
+
245
+ s1.print "a\ndef"
246
+ assert_equal("a\n", s2.gets)
247
+ ensure
248
+ s1.close if s1 && !s1.closed?
249
+ s2.close if s2 && !s2.closed?
250
+ serv.close if serv && !serv.closed?
251
+ sock1.close if sock1 && !sock1.closed?
252
+ sock2.close if sock2 && !sock2.closed?
253
+ end
254
+
255
+ end
256
+
257
+ end