jruby-openssl 0.9.5-java

Sign up to get free protection for your applications and to get access to all the features.
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