jruby-openssl 0.9.5-java

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 (54) hide show
  1. checksums.yaml +7 -0
  2. data/History.txt +218 -0
  3. data/License.txt +30 -0
  4. data/Mavenfile +44 -0
  5. data/README.txt +13 -0
  6. data/Rakefile +7 -0
  7. data/lib/jopenssl.jar +0 -0
  8. data/lib/jopenssl/load.rb +29 -0
  9. data/lib/jopenssl/version.rb +6 -0
  10. data/lib/jopenssl18/openssl.rb +23 -0
  11. data/lib/jopenssl18/openssl/bn.rb +35 -0
  12. data/lib/jopenssl18/openssl/buffering.rb +241 -0
  13. data/lib/jopenssl18/openssl/cipher.rb +65 -0
  14. data/lib/jopenssl18/openssl/config.rb +316 -0
  15. data/lib/jopenssl18/openssl/digest.rb +61 -0
  16. data/lib/jopenssl18/openssl/pkcs7.rb +25 -0
  17. data/lib/jopenssl18/openssl/ssl-internal.rb +179 -0
  18. data/lib/jopenssl18/openssl/ssl.rb +1 -0
  19. data/lib/jopenssl18/openssl/x509-internal.rb +153 -0
  20. data/lib/jopenssl18/openssl/x509.rb +1 -0
  21. data/lib/jopenssl19/openssl.rb +23 -0
  22. data/lib/jopenssl19/openssl/bn.rb +35 -0
  23. data/lib/jopenssl19/openssl/buffering.rb +449 -0
  24. data/lib/jopenssl19/openssl/cipher.rb +65 -0
  25. data/lib/jopenssl19/openssl/config.rb +313 -0
  26. data/lib/jopenssl19/openssl/digest.rb +72 -0
  27. data/lib/jopenssl19/openssl/ssl-internal.rb +177 -0
  28. data/lib/jopenssl19/openssl/ssl.rb +2 -0
  29. data/lib/jopenssl19/openssl/x509-internal.rb +158 -0
  30. data/lib/jopenssl19/openssl/x509.rb +2 -0
  31. data/lib/jopenssl21/openssl.rb +23 -0
  32. data/lib/jopenssl21/openssl/bn.rb +35 -0
  33. data/lib/jopenssl21/openssl/buffering.rb +449 -0
  34. data/lib/jopenssl21/openssl/cipher.rb +65 -0
  35. data/lib/jopenssl21/openssl/config.rb +313 -0
  36. data/lib/jopenssl21/openssl/digest.rb +89 -0
  37. data/lib/jopenssl21/openssl/ssl.rb +237 -0
  38. data/lib/jopenssl21/openssl/x509.rb +162 -0
  39. data/lib/jruby-openssl.rb +5 -0
  40. data/lib/openssl.rb +1 -0
  41. data/lib/openssl/bn.rb +7 -0
  42. data/lib/openssl/buffering.rb +7 -0
  43. data/lib/openssl/cipher.rb +7 -0
  44. data/lib/openssl/config.rb +7 -0
  45. data/lib/openssl/digest.rb +7 -0
  46. data/lib/openssl/pkcs12.rb +106 -0
  47. data/lib/openssl/pkcs7.rb +7 -0
  48. data/lib/openssl/ssl-internal.rb +7 -0
  49. data/lib/openssl/ssl.rb +7 -0
  50. data/lib/openssl/x509-internal.rb +7 -0
  51. data/lib/openssl/x509.rb +7 -0
  52. data/lib/org/bouncycastle/bcpkix-jdk15on/1.47/bcpkix-jdk15on-1.47.jar +0 -0
  53. data/lib/org/bouncycastle/bcprov-jdk15on/1.47/bcprov-jdk15on-1.47.jar +0 -0
  54. metadata +97 -0
@@ -0,0 +1,237 @@
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$
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 => defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS) ?
28
+ OpenSSL::SSL::OP_ALL & ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS :
29
+ OpenSSL::SSL::OP_ALL,
30
+ }
31
+
32
+ DEFAULT_CERT_STORE = OpenSSL::X509::Store.new
33
+ DEFAULT_CERT_STORE.set_default_paths
34
+ if defined?(OpenSSL::X509::V_FLAG_CRL_CHECK_ALL)
35
+ DEFAULT_CERT_STORE.flags = OpenSSL::X509::V_FLAG_CRL_CHECK_ALL
36
+ end
37
+
38
+ ##
39
+ # Sets the parameters for this SSL context to the values in +params+.
40
+ # The keys in +params+ must be assignment methods on SSLContext.
41
+ #
42
+ # If the verify_mode is not VERIFY_NONE and ca_file, ca_path and
43
+ # cert_store are not set then the system default certificate store is
44
+ # used.
45
+
46
+ def set_params(params={})
47
+ params = DEFAULT_PARAMS.merge(params)
48
+ params.each{|name, value| self.__send__("#{name}=", value) }
49
+ if self.verify_mode != OpenSSL::SSL::VERIFY_NONE
50
+ unless self.ca_file or self.ca_path or self.cert_store
51
+ self.cert_store = DEFAULT_CERT_STORE
52
+ end
53
+ end
54
+ return params
55
+ end
56
+ end
57
+
58
+ module SocketForwarder
59
+ def addr
60
+ to_io.addr
61
+ end
62
+
63
+ def peeraddr
64
+ to_io.peeraddr
65
+ end
66
+
67
+ def setsockopt(level, optname, optval)
68
+ to_io.setsockopt(level, optname, optval)
69
+ end
70
+
71
+ def getsockopt(level, optname)
72
+ to_io.getsockopt(level, optname)
73
+ end
74
+
75
+ def fcntl(*args)
76
+ to_io.fcntl(*args)
77
+ end
78
+
79
+ def closed?
80
+ to_io.closed?
81
+ end
82
+
83
+ def do_not_reverse_lookup=(flag)
84
+ to_io.do_not_reverse_lookup = flag
85
+ end
86
+ end
87
+
88
+ module Nonblock
89
+ def initialize(*args)
90
+ flag = File::NONBLOCK
91
+ flag |= @io.fcntl(Fcntl::F_GETFL) if defined?(Fcntl::F_GETFL)
92
+ @io.fcntl(Fcntl::F_SETFL, flag)
93
+ super
94
+ end
95
+ end
96
+
97
+ # FIXME: Using the old non-ASN1 logic here because our ASN1 appears to
98
+ # return the wrong types for some decoded objects. See #1102
99
+ def verify_certificate_identity(cert, hostname)
100
+ should_verify_common_name = true
101
+ cert.extensions.each{|ext|
102
+ next if ext.oid != "subjectAltName"
103
+ ext.value.split(/,\s+/).each{|general_name|
104
+ if /\ADNS:(.*)/ =~ general_name
105
+ should_verify_common_name = false
106
+ reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+")
107
+ return true if /\A#{reg}\z/i =~ hostname
108
+ elsif /\AIP Address:(.*)/ =~ general_name
109
+ should_verify_common_name = false
110
+ return true if $1 == hostname
111
+ end
112
+ }
113
+ }
114
+ if should_verify_common_name
115
+ cert.subject.to_a.each{|oid, value|
116
+ if oid == "CN"
117
+ reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
118
+ return true if /\A#{reg}\z/i =~ hostname
119
+ end
120
+ }
121
+ end
122
+ return false
123
+ end
124
+ =begin
125
+ def verify_certificate_identity(cert, hostname)
126
+ should_verify_common_name = true
127
+ cert.extensions.each{|ext|
128
+ next if ext.oid != "subjectAltName"
129
+ ostr = OpenSSL::ASN1.decode(ext.to_der).value.last
130
+ sequence = OpenSSL::ASN1.decode(ostr.value)
131
+ sequence.value.each{|san|
132
+ case san.tag
133
+ when 2 # dNSName in GeneralName (RFC5280)
134
+ should_verify_common_name = false
135
+ reg = Regexp.escape(san.value).gsub(/\\\*/, "[^.]+")
136
+ return true if /\A#{reg}\z/i =~ hostname
137
+ when 7 # iPAddress in GeneralName (RFC5280)
138
+ should_verify_common_name = false
139
+ # follows GENERAL_NAME_print() in x509v3/v3_alt.c
140
+ if san.value.size == 4
141
+ return true if san.value.unpack('C*').join('.') == hostname
142
+ elsif san.value.size == 16
143
+ return true if san.value.unpack('n*').map { |e| sprintf("%X", e) }.join(':') == hostname
144
+ end
145
+ end
146
+ }
147
+ }
148
+ if should_verify_common_name
149
+ cert.subject.to_a.each{|oid, value|
150
+ if oid == "CN"
151
+ reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
152
+ return true if /\A#{reg}\z/i =~ hostname
153
+ end
154
+ }
155
+ end
156
+ return false
157
+ end
158
+ =end
159
+ module_function :verify_certificate_identity
160
+
161
+ class SSLSocket
162
+ include Buffering
163
+ include SocketForwarder
164
+ include Nonblock
165
+
166
+ def post_connection_check(hostname)
167
+ unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
168
+ raise SSLError, "hostname \"#{hostname}\" does not match the server certificate"
169
+ end
170
+ return true
171
+ end
172
+
173
+ def session
174
+ SSL::Session.new(self)
175
+ rescue SSL::Session::SessionError
176
+ nil
177
+ end
178
+ end
179
+
180
+ ##
181
+ # SSLServer represents a TCP/IP server socket with Secure Sockets Layer.
182
+ class SSLServer
183
+ include SocketForwarder
184
+ # When true then #accept works exactly the same as TCPServer#accept
185
+ attr_accessor :start_immediately
186
+
187
+ # Creates a new instance of SSLServer.
188
+ # * +srv+ is an instance of TCPServer.
189
+ # * +ctx+ is an instance of OpenSSL::SSL::SSLContext.
190
+ def initialize(svr, ctx)
191
+ @svr = svr
192
+ @ctx = ctx
193
+ unless ctx.session_id_context
194
+ # see #6137 - session id may not exceed 32 bytes
195
+ prng = ::Random.new($0.hash)
196
+ session_id = prng.bytes(16).unpack('H*')[0]
197
+ @ctx.session_id_context = session_id
198
+ end
199
+ @start_immediately = true
200
+ end
201
+
202
+ # Returns the TCPServer passed to the SSLServer when initialized.
203
+ def to_io
204
+ @svr
205
+ end
206
+
207
+ # See TCPServer#listen for details.
208
+ def listen(backlog=5)
209
+ @svr.listen(backlog)
210
+ end
211
+
212
+ # See BasicSocket#shutdown for details.
213
+ def shutdown(how=Socket::SHUT_RDWR)
214
+ @svr.shutdown(how)
215
+ end
216
+
217
+ # Works similar to TCPServer#accept.
218
+ def accept
219
+ sock = @svr.accept
220
+ begin
221
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
222
+ ssl.sync_close = true
223
+ ssl.accept if @start_immediately
224
+ ssl
225
+ rescue SSLError => ex
226
+ sock.close
227
+ raise ex
228
+ end
229
+ end
230
+
231
+ # See IO#close for details.
232
+ def close
233
+ @svr.close
234
+ end
235
+ end
236
+ end
237
+ end
@@ -0,0 +1,162 @@
1
+ #--
2
+ #
3
+ # $RCSfile$
4
+ #
5
+ # = Ruby-space definitions that completes C-space funcs for X509 and subclasses
6
+ #
7
+ # = Info
8
+ # 'OpenSSL for Ruby 2' project
9
+ # Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz>
10
+ # All rights reserved.
11
+ #
12
+ # = Licence
13
+ # This program is licenced under the same licence as Ruby.
14
+ # (See the file 'LICENCE'.)
15
+ #
16
+ # = Version
17
+ # $Id$
18
+ #
19
+ #++
20
+
21
+ module OpenSSL
22
+ module X509
23
+ class ExtensionFactory
24
+ def create_extension(*arg)
25
+ if arg.size > 1
26
+ create_ext(*arg)
27
+ else
28
+ send("create_ext_from_"+arg[0].class.name.downcase, arg[0])
29
+ end
30
+ end
31
+
32
+ def create_ext_from_array(ary)
33
+ raise ExtensionError, "unexpected array form" if ary.size > 3
34
+ create_ext(ary[0], ary[1], ary[2])
35
+ end
36
+
37
+ def create_ext_from_string(str) # "oid = critical, value"
38
+ oid, value = str.split(/=/, 2)
39
+ oid.strip!
40
+ value.strip!
41
+ create_ext(oid, value)
42
+ end
43
+
44
+ def create_ext_from_hash(hash)
45
+ create_ext(hash["oid"], hash["value"], hash["critical"])
46
+ end
47
+ end
48
+
49
+ class Extension
50
+ def to_s # "oid = critical, value"
51
+ str = self.oid
52
+ str << " = "
53
+ str << "critical, " if self.critical?
54
+ str << self.value.gsub(/\n/, ", ")
55
+ end
56
+
57
+ def to_h # {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}
58
+ {"oid"=>self.oid,"value"=>self.value,"critical"=>self.critical?}
59
+ end
60
+
61
+ def to_a
62
+ [ self.oid, self.value, self.critical? ]
63
+ end
64
+ end
65
+
66
+ class Name
67
+ module RFC2253DN
68
+ Special = ',=+<>#;'
69
+ HexChar = /[0-9a-fA-F]/
70
+ HexPair = /#{HexChar}#{HexChar}/
71
+ HexString = /#{HexPair}+/
72
+ Pair = /\\(?:[#{Special}]|\\|"|#{HexPair})/
73
+ StringChar = /[^#{Special}\\"]/
74
+ QuoteChar = /[^\\"]/
75
+ AttributeType = /[a-zA-Z][0-9a-zA-Z]*|[0-9]+(?:\.[0-9]+)*/
76
+ AttributeValue = /
77
+ (?!["#])((?:#{StringChar}|#{Pair})*)|
78
+ \#(#{HexString})|
79
+ "((?:#{QuoteChar}|#{Pair})*)"
80
+ /x
81
+ TypeAndValue = /\A(#{AttributeType})=#{AttributeValue}/
82
+
83
+ module_function
84
+
85
+ def expand_pair(str)
86
+ return nil unless str
87
+ return str.gsub(Pair){
88
+ pair = $&
89
+ case pair.size
90
+ when 2 then pair[1,1]
91
+ when 3 then Integer("0x#{pair[1,2]}").chr
92
+ else raise OpenSSL::X509::NameError, "invalid pair: #{str}"
93
+ end
94
+ }
95
+ end
96
+
97
+ def expand_hexstring(str)
98
+ return nil unless str
99
+ der = str.gsub(HexPair){$&.to_i(16).chr }
100
+ a1 = OpenSSL::ASN1.decode(der)
101
+ return a1.value, a1.tag
102
+ end
103
+
104
+ def expand_value(str1, str2, str3)
105
+ value = expand_pair(str1)
106
+ value, tag = expand_hexstring(str2) unless value
107
+ value = expand_pair(str3) unless value
108
+ return value, tag
109
+ end
110
+
111
+ def scan(dn)
112
+ str = dn
113
+ ary = []
114
+ while true
115
+ if md = TypeAndValue.match(str)
116
+ remain = md.post_match
117
+ type = md[1]
118
+ value, tag = expand_value(md[2], md[3], md[4]) rescue nil
119
+ if value
120
+ type_and_value = [type, value]
121
+ type_and_value.push(tag) if tag
122
+ ary.unshift(type_and_value)
123
+ if remain.length > 2 && remain[0] == ?,
124
+ str = remain[1..-1]
125
+ next
126
+ elsif remain.length > 2 && remain[0] == ?+
127
+ raise OpenSSL::X509::NameError,
128
+ "multi-valued RDN is not supported: #{dn}"
129
+ elsif remain.empty?
130
+ break
131
+ end
132
+ end
133
+ end
134
+ msg_dn = dn[0, dn.length - str.length] + " =>" + str
135
+ raise OpenSSL::X509::NameError, "malformed RDN: #{msg_dn}"
136
+ end
137
+ return ary
138
+ end
139
+ end
140
+
141
+ class << self
142
+ def parse_rfc2253(str, template=OBJECT_TYPE_TEMPLATE)
143
+ ary = OpenSSL::X509::Name::RFC2253DN.scan(str)
144
+ self.new(ary, template)
145
+ end
146
+
147
+ def parse_openssl(str, template=OBJECT_TYPE_TEMPLATE)
148
+ ary = str.scan(/\s*([^\/,]+)\s*/).collect{|i| i[0].split("=", 2) }
149
+ self.new(ary, template)
150
+ end
151
+
152
+ alias parse parse_openssl
153
+ end
154
+ end
155
+
156
+ class StoreContext
157
+ def cleanup
158
+ warn "(#{caller.first}) OpenSSL::X509::StoreContext#cleanup is deprecated with no replacement" if $VERBOSE
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,5 @@
1
+ # This file allows older version of JRuby (prior to 1.7.5) to explicitly load
2
+ # the gem version of jruby-openssl rather than the stdlib version. JRuby 1.7.5
3
+ # and higher use the "default gems" capability of RubyGems.
4
+
5
+ require 'jopenssl/load'
@@ -0,0 +1 @@
1
+ require 'jopenssl/load'
@@ -0,0 +1,7 @@
1
+ if RUBY_VERSION >= '2.1.0'
2
+ load('jopenssl21/openssl/bn.rb')
3
+ elsif RUBY_VERSION >= '1.9.0'
4
+ load('jopenssl19/openssl/bn.rb')
5
+ else
6
+ load('jopenssl18/openssl/bn.rb')
7
+ end
@@ -0,0 +1,7 @@
1
+ if RUBY_VERSION >= '2.1.0'
2
+ load('jopenssl21/openssl/buffering.rb')
3
+ elsif RUBY_VERSION >= '1.9.0'
4
+ load('jopenssl19/openssl/buffering.rb')
5
+ else
6
+ load('jopenssl18/openssl/buffering.rb')
7
+ end
@@ -0,0 +1,7 @@
1
+ if RUBY_VERSION >= '2.1.0'
2
+ load('jopenssl21/openssl/cipher.rb')
3
+ elsif RUBY_VERSION >= '1.9.0'
4
+ load('jopenssl19/openssl/cipher.rb')
5
+ else
6
+ load('jopenssl18/openssl/cipher.rb')
7
+ end
@@ -0,0 +1,7 @@
1
+ if RUBY_VERSION >= '2.1.0'
2
+ load('jopenssl21/openssl/config.rb')
3
+ elsif RUBY_VERSION >= '1.9.0'
4
+ load('jopenssl19/openssl/config.rb')
5
+ else
6
+ load('jopenssl18/openssl/config.rb')
7
+ end
@@ -0,0 +1,7 @@
1
+ if RUBY_VERSION >= '2.1.0'
2
+ load('jopenssl21/openssl/digest.rb')
3
+ elsif RUBY_VERSION >= '1.9.0'
4
+ load('jopenssl19/openssl/digest.rb')
5
+ else
6
+ load('jopenssl18/openssl/digest.rb')
7
+ end