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,177 @@
1
+ =begin
2
+ = $RCSfile$ -- Ruby-space definitions that completes C-space funcs for SSL
3
+
4
+ = Info
5
+ 'OpenSSL for Ruby 2' project
6
+ Copyright (C) 2001 GOTOU YUUZOU <gotoyuzo@notwork.org>
7
+ All rights reserved.
8
+
9
+ = Licence
10
+ This program is licenced under the same licence as Ruby.
11
+ (See the file 'LICENCE'.)
12
+
13
+ = Version
14
+ $Id: ssl-internal.rb 29189 2010-09-06 01:53:00Z nahi $
15
+ =end
16
+
17
+ require "openssl/buffering"
18
+ require "fcntl"
19
+
20
+ module OpenSSL
21
+ module SSL
22
+ class SSLContext
23
+ DEFAULT_PARAMS = {
24
+ :ssl_version => "SSLv23",
25
+ :verify_mode => OpenSSL::SSL::VERIFY_PEER,
26
+ :ciphers => "ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW",
27
+ :options => OpenSSL::SSL::OP_ALL,
28
+ }
29
+
30
+ DEFAULT_CERT_STORE = OpenSSL::X509::Store.new
31
+ DEFAULT_CERT_STORE.set_default_paths
32
+ if defined?(OpenSSL::X509::V_FLAG_CRL_CHECK_ALL)
33
+ DEFAULT_CERT_STORE.flags = OpenSSL::X509::V_FLAG_CRL_CHECK_ALL
34
+ end
35
+
36
+ def set_params(params={})
37
+ params = DEFAULT_PARAMS.merge(params)
38
+ params.each{|name, value| self.__send__("#{name}=", value) }
39
+ if self.verify_mode != OpenSSL::SSL::VERIFY_NONE
40
+ unless self.ca_file or self.ca_path or self.cert_store
41
+ self.cert_store = DEFAULT_CERT_STORE
42
+ end
43
+ end
44
+ return params
45
+ end
46
+ end
47
+
48
+ module SocketForwarder
49
+ def addr
50
+ to_io.addr
51
+ end
52
+
53
+ def peeraddr
54
+ to_io.peeraddr
55
+ end
56
+
57
+ def setsockopt(level, optname, optval)
58
+ to_io.setsockopt(level, optname, optval)
59
+ end
60
+
61
+ def getsockopt(level, optname)
62
+ to_io.getsockopt(level, optname)
63
+ end
64
+
65
+ def fcntl(*args)
66
+ to_io.fcntl(*args)
67
+ end
68
+
69
+ def closed?
70
+ to_io.closed?
71
+ end
72
+
73
+ def do_not_reverse_lookup=(flag)
74
+ to_io.do_not_reverse_lookup = flag
75
+ end
76
+ end
77
+
78
+ module Nonblock
79
+ def initialize(*args)
80
+ flag = File::NONBLOCK
81
+ flag |= @io.fcntl(Fcntl::F_GETFL) if defined?(Fcntl::F_GETFL)
82
+ @io.fcntl(Fcntl::F_SETFL, flag)
83
+ super
84
+ end
85
+ end
86
+
87
+ def verify_certificate_identity(cert, hostname)
88
+ should_verify_common_name = true
89
+ cert.extensions.each{|ext|
90
+ next if ext.oid != "subjectAltName"
91
+ ext.value.split(/,\s+/).each{|general_name|
92
+ if /\ADNS:(.*)/ =~ general_name
93
+ should_verify_common_name = false
94
+ reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+")
95
+ return true if /\A#{reg}\z/i =~ hostname
96
+ elsif /\AIP Address:(.*)/ =~ general_name
97
+ should_verify_common_name = false
98
+ return true if $1 == hostname
99
+ end
100
+ }
101
+ }
102
+ if should_verify_common_name
103
+ cert.subject.to_a.each{|oid, value|
104
+ if oid == "CN"
105
+ reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
106
+ return true if /\A#{reg}\z/i =~ hostname
107
+ end
108
+ }
109
+ end
110
+ return false
111
+ end
112
+ module_function :verify_certificate_identity
113
+
114
+ class SSLSocket
115
+ include Buffering
116
+ include SocketForwarder
117
+ include Nonblock
118
+
119
+ def post_connection_check(hostname)
120
+ unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
121
+ raise SSLError, "hostname does not match the server certificate"
122
+ end
123
+ return true
124
+ end
125
+
126
+ def session
127
+ SSL::Session.new(self)
128
+ rescue SSL::Session::SessionError
129
+ nil
130
+ end
131
+ end
132
+
133
+ class SSLServer
134
+ include SocketForwarder
135
+ attr_accessor :start_immediately
136
+
137
+ def initialize(svr, ctx)
138
+ @svr = svr
139
+ @ctx = ctx
140
+ unless ctx.session_id_context
141
+ session_id = OpenSSL::Digest::MD5.hexdigest($0)
142
+ @ctx.session_id_context = session_id
143
+ end
144
+ @start_immediately = true
145
+ end
146
+
147
+ def to_io
148
+ @svr
149
+ end
150
+
151
+ def listen(backlog=5)
152
+ @svr.listen(backlog)
153
+ end
154
+
155
+ def shutdown(how=Socket::SHUT_RDWR)
156
+ @svr.shutdown(how)
157
+ end
158
+
159
+ def accept
160
+ sock = @svr.accept
161
+ begin
162
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
163
+ ssl.sync_close = true
164
+ ssl.accept if @start_immediately
165
+ ssl
166
+ rescue SSLError => ex
167
+ sock.close
168
+ raise ex
169
+ end
170
+ end
171
+
172
+ def close
173
+ @svr.close
174
+ end
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,2 @@
1
+ warn 'deprecated openssl/ssl use: require "openssl" instead of "openssl/ssl"'
2
+ require 'openssl'
@@ -0,0 +1,158 @@
1
+ =begin
2
+ = $RCSfile$ -- Ruby-space definitions that completes C-space funcs for X509 and subclasses
3
+
4
+ = Info
5
+ 'OpenSSL for Ruby 2' project
6
+ Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz>
7
+ All rights reserved.
8
+
9
+ = Licence
10
+ This program is licenced under the same licence as Ruby.
11
+ (See the file 'LICENCE'.)
12
+
13
+ = Version
14
+ $Id: x509-internal.rb 32663 2011-07-25 04:51:26Z nahi $
15
+ =end
16
+
17
+ module OpenSSL
18
+ module X509
19
+ class ExtensionFactory
20
+ def create_extension(*arg)
21
+ if arg.size > 1
22
+ create_ext(*arg)
23
+ else
24
+ send("create_ext_from_"+arg[0].class.name.downcase, arg[0])
25
+ end
26
+ end
27
+
28
+ def create_ext_from_array(ary)
29
+ raise ExtensionError, "unexpected array form" if ary.size > 3
30
+ create_ext(ary[0], ary[1], ary[2])
31
+ end
32
+
33
+ def create_ext_from_string(str) # "oid = critical, value"
34
+ oid, value = str.split(/=/, 2)
35
+ oid.strip!
36
+ value.strip!
37
+ create_ext(oid, value)
38
+ end
39
+
40
+ def create_ext_from_hash(hash)
41
+ create_ext(hash["oid"], hash["value"], hash["critical"])
42
+ end
43
+ end
44
+
45
+ class Extension
46
+ def to_s # "oid = critical, value"
47
+ str = self.oid
48
+ str << " = "
49
+ str << "critical, " if self.critical?
50
+ str << self.value.gsub(/\n/, ", ")
51
+ end
52
+
53
+ def to_h # {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}
54
+ {"oid"=>self.oid,"value"=>self.value,"critical"=>self.critical?}
55
+ end
56
+
57
+ def to_a
58
+ [ self.oid, self.value, self.critical? ]
59
+ end
60
+ end
61
+
62
+ class Name
63
+ module RFC2253DN
64
+ Special = ',=+<>#;'
65
+ HexChar = /[0-9a-fA-F]/
66
+ HexPair = /#{HexChar}#{HexChar}/
67
+ HexString = /#{HexPair}+/
68
+ Pair = /\\(?:[#{Special}]|\\|"|#{HexPair})/
69
+ StringChar = /[^#{Special}\\"]/
70
+ QuoteChar = /[^\\"]/
71
+ AttributeType = /[a-zA-Z][0-9a-zA-Z]*|[0-9]+(?:\.[0-9]+)*/
72
+ AttributeValue = /
73
+ (?!["#])((?:#{StringChar}|#{Pair})*)|
74
+ \#(#{HexString})|
75
+ "((?:#{QuoteChar}|#{Pair})*)"
76
+ /x
77
+ TypeAndValue = /\A(#{AttributeType})=#{AttributeValue}/
78
+
79
+ module_function
80
+
81
+ def expand_pair(str)
82
+ return nil unless str
83
+ return str.gsub(Pair){
84
+ pair = $&
85
+ case pair.size
86
+ when 2 then pair[1,1]
87
+ when 3 then Integer("0x#{pair[1,2]}").chr
88
+ else raise OpenSSL::X509::NameError, "invalid pair: #{str}"
89
+ end
90
+ }
91
+ end
92
+
93
+ def expand_hexstring(str)
94
+ return nil unless str
95
+ der = str.gsub(HexPair){$&.to_i(16).chr }
96
+ a1 = OpenSSL::ASN1.decode(der)
97
+ return a1.value, a1.tag
98
+ end
99
+
100
+ def expand_value(str1, str2, str3)
101
+ value = expand_pair(str1)
102
+ value, tag = expand_hexstring(str2) unless value
103
+ value = expand_pair(str3) unless value
104
+ return value, tag
105
+ end
106
+
107
+ def scan(dn)
108
+ str = dn
109
+ ary = []
110
+ while true
111
+ if md = TypeAndValue.match(str)
112
+ remain = md.post_match
113
+ type = md[1]
114
+ value, tag = expand_value(md[2], md[3], md[4]) rescue nil
115
+ if value
116
+ type_and_value = [type, value]
117
+ type_and_value.push(tag) if tag
118
+ ary.unshift(type_and_value)
119
+ if remain.length > 2 && remain[0] == ?,
120
+ str = remain[1..-1]
121
+ next
122
+ elsif remain.length > 2 && remain[0] == ?+
123
+ raise OpenSSL::X509::NameError,
124
+ "multi-valued RDN is not supported: #{dn}"
125
+ elsif remain.empty?
126
+ break
127
+ end
128
+ end
129
+ end
130
+ msg_dn = dn[0, dn.length - str.length] + " =>" + str
131
+ raise OpenSSL::X509::NameError, "malformed RDN: #{msg_dn}"
132
+ end
133
+ return ary
134
+ end
135
+ end
136
+
137
+ class << self
138
+ def parse_rfc2253(str, template=OBJECT_TYPE_TEMPLATE)
139
+ ary = OpenSSL::X509::Name::RFC2253DN.scan(str)
140
+ self.new(ary, template)
141
+ end
142
+
143
+ def parse_openssl(str, template=OBJECT_TYPE_TEMPLATE)
144
+ ary = str.scan(/\s*([^\/,]+)\s*/).collect{|i| i[0].split("=", 2) }
145
+ self.new(ary, template)
146
+ end
147
+
148
+ alias parse parse_openssl
149
+ end
150
+ end
151
+
152
+ class StoreContext
153
+ def cleanup
154
+ warn "(#{caller.first}) OpenSSL::X509::StoreContext#cleanup is deprecated with no replacement" if $VERBOSE
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,2 @@
1
+ warn 'deprecated openssl/x509 use: require "openssl" instead of "openssl/x509"'
2
+ require 'openssl'
@@ -1,5 +1,5 @@
1
1
  module Jopenssl
2
2
  module Version
3
- VERSION = "0.7.5.dev"
3
+ VERSION = "0.7.5"
4
4
  end
5
5
  end
@@ -0,0 +1,18 @@
1
+ unless defined? JRUBY_VERSION
2
+ warn 'Loading jruby-openssl in a non-JRuby interpreter'
3
+ end
4
+
5
+ begin
6
+ require 'bouncy-castle-java'
7
+ rescue LoadError
8
+ # runs under restricted mode.
9
+ end
10
+ require 'jopenssl'
11
+
12
+ if RUBY_VERSION >= '1.9.0'
13
+ $LOAD_PATH.unshift(File.expand_path('../../1.9', __FILE__))
14
+ load(File.expand_path('../../1.9/openssl.rb', __FILE__))
15
+ else
16
+ $LOAD_PATH.unshift(File.expand_path('../../1.8', __FILE__))
17
+ load(File.expand_path('../../1.8/openssl.rb', __FILE__))
18
+ end
File without changes
@@ -0,0 +1 @@
1
+ require 'openssl'
@@ -0,0 +1 @@
1
+ require 'openssl'
File without changes
@@ -35,6 +35,7 @@ class OpenSSL::TestASN1 < Test::Unit::TestCase
35
35
  assert_equal(1, version.value.size)
36
36
  assert_equal(OpenSSL::ASN1::Integer, version.value[0].class)
37
37
  assert_equal(2, version.value[0].value)
38
+ assert_equal(OpenSSL::BN, version.value[0].value.class)
38
39
 
39
40
  serial = tbs_cert.value[1]
40
41
  assert_equal(OpenSSL::ASN1::Integer, serial.class)
@@ -194,4 +195,18 @@ class OpenSSL::TestASN1 < Test::Unit::TestCase
194
195
  cululated_sig = key.sign(OpenSSL::Digest::SHA1.new, tbs_cert.to_der)
195
196
  assert_equal(cululated_sig, sig_val.value)
196
197
  end
198
+
199
+ def test_encode_boolean
200
+ encode_decode_test(OpenSSL::ASN1::Boolean, [true, false])
201
+ end
202
+
203
+ def test_encode_integer
204
+ encode_decode_test(OpenSSL::ASN1::Integer, [72, -127, -128, 128, -1, 0, 1, -(2**12345), 2**12345])
205
+ end
206
+
207
+ def encode_decode_test(type, values)
208
+ values.each do |v|
209
+ assert_equal(v, OpenSSL::ASN1.decode(type.new(v).to_der).value)
210
+ end
211
+ end
197
212
  end if defined?(OpenSSL)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -90,9 +90,17 @@ class OpenSSL::TestPair < Test::Unit::TestCase
90
90
  ssl_pair {|s1, s2|
91
91
  s2.write "a\nbcd"
92
92
  assert_equal("a\n", s1.gets)
93
- assert_equal("bcd", s1.readpartial(10))
93
+ read = s1.readpartial(10)
94
+ assert_equal("bcd"[0, read.bytesize], read)
95
+ s1.read(read.bytesize - 3) # drop unread bytes
96
+
94
97
  s2.write "efg"
95
- assert_equal("efg", s1.readpartial(10))
98
+ read = s1.readpartial(10)
99
+ assert_equal("efg"[0, read.bytesize], read)
100
+ rest = 3 - read.bytesize
101
+ while rest > 0
102
+ rest -= s1.readpartial(rest).size
103
+ end
96
104
  s2.close
97
105
  assert_raise(EOFError) { s1.readpartial(10) }
98
106
  assert_raise(EOFError) { s1.readpartial(10) }
File without changes
File without changes