jruby-openssl 0.9.20-java → 0.10.7-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.
- checksums.yaml +4 -4
- data/History.md +132 -1
- data/LICENSE.txt +1 -1
- data/Mavenfile +49 -69
- data/README.md +14 -16
- data/Rakefile +4 -0
- data/lib/jopenssl/_compat23.rb +71 -0
- data/lib/jopenssl/load.rb +21 -12
- data/lib/jopenssl/version.rb +8 -10
- data/lib/jopenssl.jar +0 -0
- data/lib/jopenssl19/openssl/ssl-internal.rb +104 -0
- data/lib/jopenssl22/openssl/ssl.rb +16 -16
- data/lib/jopenssl23/openssl/bn.rb +2 -1
- data/lib/jopenssl23/openssl/buffering.rb +39 -35
- data/lib/jopenssl23/openssl/config.rb +12 -11
- data/lib/jopenssl23/openssl/digest.rb +1 -1
- data/lib/jopenssl23/openssl/pkey.rb +22 -34
- data/lib/jopenssl23/openssl/ssl.rb +210 -125
- data/lib/jopenssl23/openssl/x509.rb +76 -1
- data/lib/jopenssl23/openssl.rb +1 -1
- data/lib/openssl/bn.rb +1 -3
- data/lib/openssl/buffering.rb +1 -3
- data/lib/openssl/cipher.rb +1 -3
- data/lib/openssl/config.rb +10 -4
- data/lib/openssl/digest.rb +1 -3
- data/lib/openssl/pkcs12.rb +1 -3
- data/lib/openssl/pkcs5.rb +22 -0
- data/lib/openssl/ssl-internal.rb +1 -3
- data/lib/openssl/ssl.rb +1 -3
- data/lib/openssl/x509-internal.rb +1 -3
- data/lib/openssl/x509.rb +1 -3
- data/lib/org/bouncycastle/bcpkix-jdk15on/1.68/bcpkix-jdk15on-1.68.jar +0 -0
- data/lib/org/bouncycastle/bcprov-jdk15on/1.68/bcprov-jdk15on-1.68.jar +0 -0
- data/lib/org/bouncycastle/bctls-jdk15on/1.68/bctls-jdk15on-1.68.jar +0 -0
- data/pom.xml +100 -322
- metadata +19 -75
- data/integration/1.47/pom.xml +0 -15
- data/integration/1.48/pom.xml +0 -15
- data/integration/1.49/pom.xml +0 -15
- data/integration/1.50/pom.xml +0 -15
- data/integration/Mavenfile +0 -57
- data/integration/pom.xml +0 -122
- data/lib/jopenssl18/openssl/bn.rb +0 -25
- data/lib/jopenssl18/openssl/buffering.rb +0 -241
- data/lib/jopenssl18/openssl/cipher.rb +0 -28
- data/lib/jopenssl18/openssl/config.rb +0 -316
- data/lib/jopenssl18/openssl/digest.rb +0 -32
- data/lib/jopenssl18/openssl/pkcs7.rb +0 -25
- data/lib/jopenssl18/openssl/ssl-internal.rb +0 -112
- data/lib/jopenssl18/openssl/ssl.rb +0 -1
- data/lib/jopenssl18/openssl/x509-internal.rb +0 -110
- data/lib/jopenssl18/openssl/x509.rb +0 -1
- data/lib/jopenssl18/openssl.rb +0 -23
- data/lib/jopenssl24.rb +0 -112
- data/lib/openssl/pkcs7.rb +0 -5
- data/lib/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-jdk15on-1.56.jar +0 -0
- data/lib/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-jdk15on-1.56.jar +0 -0
@@ -1,316 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
= Ruby-space definitions that completes C-space funcs for Config
|
3
|
-
|
4
|
-
= Info
|
5
|
-
Copyright (C) 2010 Hiroshi Nakamura <nahi@ruby-lang.org>
|
6
|
-
|
7
|
-
= Licence
|
8
|
-
This program is licenced under the same licence as Ruby.
|
9
|
-
(See the file 'LICENCE'.)
|
10
|
-
|
11
|
-
=end
|
12
|
-
|
13
|
-
##
|
14
|
-
# Should we care what if somebody require this file directly?
|
15
|
-
#require 'openssl'
|
16
|
-
require 'stringio'
|
17
|
-
|
18
|
-
module OpenSSL
|
19
|
-
class Config
|
20
|
-
include Enumerable
|
21
|
-
|
22
|
-
class << self
|
23
|
-
def parse(str)
|
24
|
-
c = new()
|
25
|
-
parse_config(StringIO.new(str)).each do |section, hash|
|
26
|
-
c[section] = hash
|
27
|
-
end
|
28
|
-
c
|
29
|
-
end
|
30
|
-
|
31
|
-
alias load new
|
32
|
-
|
33
|
-
def parse_config(io)
|
34
|
-
begin
|
35
|
-
parse_config_lines(io)
|
36
|
-
rescue ConfigError => e
|
37
|
-
e.message.replace("error in line #{io.lineno}: " + e.message)
|
38
|
-
raise
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_key_string(data, section, key) # :nodoc:
|
43
|
-
if v = data[section] && data[section][key]
|
44
|
-
return v
|
45
|
-
elsif section == 'ENV'
|
46
|
-
if v = ENV[key]
|
47
|
-
return v
|
48
|
-
end
|
49
|
-
end
|
50
|
-
if v = data['default'] && data['default'][key]
|
51
|
-
return v
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def parse_config_lines(io)
|
58
|
-
section = 'default'
|
59
|
-
data = {section => {}}
|
60
|
-
while definition = get_definition(io)
|
61
|
-
definition = clear_comments(definition)
|
62
|
-
next if definition.empty?
|
63
|
-
if definition[0] == ?[
|
64
|
-
if /\[([^\]]*)\]/ =~ definition
|
65
|
-
section = $1.strip
|
66
|
-
data[section] ||= {}
|
67
|
-
else
|
68
|
-
raise ConfigError, "missing close square bracket"
|
69
|
-
end
|
70
|
-
else
|
71
|
-
if /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/ =~ definition
|
72
|
-
if $2
|
73
|
-
section = $1
|
74
|
-
key = $2
|
75
|
-
else
|
76
|
-
key = $1
|
77
|
-
end
|
78
|
-
value = unescape_value(data, section, $3)
|
79
|
-
(data[section] ||= {})[key] = value.strip
|
80
|
-
else
|
81
|
-
raise ConfigError, "missing equal sign"
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
data
|
86
|
-
end
|
87
|
-
|
88
|
-
# escape with backslash
|
89
|
-
QUOTE_REGEXP_SQ = /\A([^'\\]*(?:\\.[^'\\]*)*)'/
|
90
|
-
# escape with backslash and doubled dq
|
91
|
-
QUOTE_REGEXP_DQ = /\A([^"\\]*(?:""[^"\\]*|\\.[^"\\]*)*)"/
|
92
|
-
# escaped char map
|
93
|
-
ESCAPE_MAP = {
|
94
|
-
"r" => "\r",
|
95
|
-
"n" => "\n",
|
96
|
-
"b" => "\b",
|
97
|
-
"t" => "\t",
|
98
|
-
}
|
99
|
-
|
100
|
-
def unescape_value(data, section, value)
|
101
|
-
scanned = []
|
102
|
-
while m = value.match(/['"\\$]/)
|
103
|
-
scanned << m.pre_match
|
104
|
-
c = m[0]
|
105
|
-
value = m.post_match
|
106
|
-
case c
|
107
|
-
when "'"
|
108
|
-
if m = value.match(QUOTE_REGEXP_SQ)
|
109
|
-
scanned << m[1].gsub(/\\(.)/, '\\1')
|
110
|
-
value = m.post_match
|
111
|
-
else
|
112
|
-
break
|
113
|
-
end
|
114
|
-
when '"'
|
115
|
-
if m = value.match(QUOTE_REGEXP_DQ)
|
116
|
-
scanned << m[1].gsub(/""/, '').gsub(/\\(.)/, '\\1')
|
117
|
-
value = m.post_match
|
118
|
-
else
|
119
|
-
break
|
120
|
-
end
|
121
|
-
when "\\"
|
122
|
-
c = value.slice!(0, 1)
|
123
|
-
scanned << (ESCAPE_MAP[c] || c)
|
124
|
-
when "$"
|
125
|
-
ref, value = extract_reference(value)
|
126
|
-
refsec = section
|
127
|
-
if ref.index('::')
|
128
|
-
refsec, ref = ref.split('::', 2)
|
129
|
-
end
|
130
|
-
if v = get_key_string(data, refsec, ref)
|
131
|
-
scanned << v
|
132
|
-
else
|
133
|
-
raise ConfigError, "variable has no value"
|
134
|
-
end
|
135
|
-
else
|
136
|
-
raise 'must not reaced'
|
137
|
-
end
|
138
|
-
end
|
139
|
-
scanned << value
|
140
|
-
scanned.join
|
141
|
-
end
|
142
|
-
|
143
|
-
def extract_reference(value)
|
144
|
-
rest = ''
|
145
|
-
if m = value.match(/\(([^)]*)\)|\{([^}]*)\}/)
|
146
|
-
value = m[1] || m[2]
|
147
|
-
rest = m.post_match
|
148
|
-
elsif [?(, ?{].include?(value[0])
|
149
|
-
raise ConfigError, "no close brace"
|
150
|
-
end
|
151
|
-
if m = value.match(/[a-zA-Z0-9_]*(?:::[a-zA-Z0-9_]*)?/)
|
152
|
-
return m[0], m.post_match + rest
|
153
|
-
else
|
154
|
-
raise
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def clear_comments(line)
|
159
|
-
# FCOMMENT
|
160
|
-
if m = line.match(/\A([\t\n\f ]*);.*\z/)
|
161
|
-
return m[1]
|
162
|
-
end
|
163
|
-
# COMMENT
|
164
|
-
scanned = []
|
165
|
-
while m = line.match(/[#'"\\]/)
|
166
|
-
scanned << m.pre_match
|
167
|
-
c = m[0]
|
168
|
-
line = m.post_match
|
169
|
-
case c
|
170
|
-
when '#'
|
171
|
-
line = nil
|
172
|
-
break
|
173
|
-
when "'", '"'
|
174
|
-
regexp = (c == "'") ? QUOTE_REGEXP_SQ : QUOTE_REGEXP_DQ
|
175
|
-
scanned << c
|
176
|
-
if m = line.match(regexp)
|
177
|
-
scanned << m[0]
|
178
|
-
line = m.post_match
|
179
|
-
else
|
180
|
-
scanned << line
|
181
|
-
line = nil
|
182
|
-
break
|
183
|
-
end
|
184
|
-
when "\\"
|
185
|
-
scanned << c
|
186
|
-
scanned << line.slice!(0, 1)
|
187
|
-
else
|
188
|
-
raise 'must not reaced'
|
189
|
-
end
|
190
|
-
end
|
191
|
-
scanned << line
|
192
|
-
scanned.join
|
193
|
-
end
|
194
|
-
|
195
|
-
def get_definition(io)
|
196
|
-
if line = get_line(io)
|
197
|
-
while /[^\\]\\\z/ =~ line
|
198
|
-
if extra = get_line(io)
|
199
|
-
line += extra
|
200
|
-
else
|
201
|
-
break
|
202
|
-
end
|
203
|
-
end
|
204
|
-
return line.strip
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def get_line(io)
|
209
|
-
if line = io.gets
|
210
|
-
line.gsub(/[\r\n]*/, '')
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
def initialize(filename = nil)
|
216
|
-
@data = {}
|
217
|
-
if filename
|
218
|
-
File.open(filename.to_s) do |file|
|
219
|
-
Config.parse_config(file).each do |section, hash|
|
220
|
-
self[section] = hash
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
def get_value(section, key)
|
227
|
-
if section.nil?
|
228
|
-
raise TypeError.new('nil not allowed')
|
229
|
-
end
|
230
|
-
section = 'default' if section.empty?
|
231
|
-
get_key_string(section, key)
|
232
|
-
end
|
233
|
-
|
234
|
-
def value(arg1, arg2 = nil)
|
235
|
-
warn('Config#value is deprecated; use Config#get_value')
|
236
|
-
if arg2.nil?
|
237
|
-
section, key = 'default', arg1
|
238
|
-
else
|
239
|
-
section, key = arg1, arg2
|
240
|
-
end
|
241
|
-
section ||= 'default'
|
242
|
-
section = 'default' if section.empty?
|
243
|
-
get_key_string(section, key)
|
244
|
-
end
|
245
|
-
|
246
|
-
def add_value(section, key, value)
|
247
|
-
check_modify
|
248
|
-
(@data[section] ||= {})[key] = value
|
249
|
-
end
|
250
|
-
|
251
|
-
def [](section)
|
252
|
-
@data[section] || {}
|
253
|
-
end
|
254
|
-
|
255
|
-
def section(name)
|
256
|
-
warn('Config#section is deprecated; use Config#[]')
|
257
|
-
@data[name] || {}
|
258
|
-
end
|
259
|
-
|
260
|
-
def []=(section, pairs)
|
261
|
-
check_modify
|
262
|
-
@data[section] ||= {}
|
263
|
-
pairs.each do |key, value|
|
264
|
-
self.add_value(section, key, value)
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
def sections
|
269
|
-
@data.keys
|
270
|
-
end
|
271
|
-
|
272
|
-
def to_s
|
273
|
-
ary = []
|
274
|
-
@data.keys.sort.each do |section|
|
275
|
-
ary << "[ #{section} ]\n"
|
276
|
-
@data[section].keys.each do |key|
|
277
|
-
ary << "#{key}=#{@data[section][key]}\n"
|
278
|
-
end
|
279
|
-
ary << "\n"
|
280
|
-
end
|
281
|
-
ary.join
|
282
|
-
end
|
283
|
-
|
284
|
-
def each
|
285
|
-
@data.each do |section, hash|
|
286
|
-
hash.each do |key, value|
|
287
|
-
yield(section, key, value)
|
288
|
-
end
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
def inspect
|
293
|
-
"#<#{self.class.name} sections=#{sections.inspect}>"
|
294
|
-
end
|
295
|
-
|
296
|
-
protected
|
297
|
-
|
298
|
-
def data
|
299
|
-
@data
|
300
|
-
end
|
301
|
-
|
302
|
-
private
|
303
|
-
|
304
|
-
def initialize_copy(other)
|
305
|
-
@data = other.data.dup
|
306
|
-
end
|
307
|
-
|
308
|
-
def check_modify
|
309
|
-
raise TypeError.new("Insecure: can't modify OpenSSL config") if frozen?
|
310
|
-
end
|
311
|
-
|
312
|
-
def get_key_string(section, key)
|
313
|
-
Config.get_key_string(@data, section, key)
|
314
|
-
end
|
315
|
-
end
|
316
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
= $RCSfile$ -- Ruby-space predefined Digest 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$
|
15
|
-
=end
|
16
|
-
|
17
|
-
##
|
18
|
-
# Should we care what if somebody require this file directly?
|
19
|
-
#require 'openssl'
|
20
|
-
|
21
|
-
module OpenSSL
|
22
|
-
class Digest
|
23
|
-
# This class is only provided for backwards compatibility. Use OpenSSL::Digest in the future.
|
24
|
-
class Digest < Digest
|
25
|
-
def initialize(*args)
|
26
|
-
# add warning
|
27
|
-
super(*args)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end # Digest
|
31
|
-
end # OpenSSL
|
32
|
-
|
@@ -1,25 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
= $RCSfile$ -- PKCS7
|
3
|
-
|
4
|
-
= Licence
|
5
|
-
This program is licenced under the same licence as Ruby.
|
6
|
-
(See the file 'LICENCE'.)
|
7
|
-
|
8
|
-
= Version
|
9
|
-
$Id: digest.rb 12148 2007-04-05 05:59:22Z technorama $
|
10
|
-
=end
|
11
|
-
|
12
|
-
module OpenSSL
|
13
|
-
class PKCS7
|
14
|
-
# This class is only provided for backwards compatibility. Use OpenSSL::PKCS7 in the future.
|
15
|
-
class PKCS7 < PKCS7
|
16
|
-
def initialize(*args)
|
17
|
-
super(*args)
|
18
|
-
|
19
|
-
warn("Warning: OpenSSL::PKCS7::PKCS7 is deprecated after Ruby 1.9; use OpenSSL::PKCS7 instead")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end # PKCS7
|
24
|
-
end # OpenSSL
|
25
|
-
|
@@ -1,112 +0,0 @@
|
|
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' # used by OpenSSL::SSL::Nonblock (if loaded)
|
19
|
-
|
20
|
-
module OpenSSL
|
21
|
-
module SSL
|
22
|
-
|
23
|
-
def verify_certificate_identity(cert, hostname)
|
24
|
-
should_verify_common_name = true
|
25
|
-
cert.extensions.each{|ext|
|
26
|
-
next if ext.oid != "subjectAltName"
|
27
|
-
ext.value.split(/,\s+/).each{|general_name|
|
28
|
-
if /\ADNS:(.*)/ =~ general_name
|
29
|
-
should_verify_common_name = false
|
30
|
-
reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+")
|
31
|
-
return true if /\A#{reg}\z/i =~ hostname
|
32
|
-
# NOTE: somehow we need the IP: canonical form
|
33
|
-
# seems there were failures elsewhere when not
|
34
|
-
# not sure how that's possible possible to-do!
|
35
|
-
elsif /\AIP(?: Address)?:(.*)/ =~ general_name
|
36
|
-
#elsif /\AIP Address:(.*)/ =~ general_name
|
37
|
-
should_verify_common_name = false
|
38
|
-
return true if $1 == hostname
|
39
|
-
end
|
40
|
-
}
|
41
|
-
}
|
42
|
-
if should_verify_common_name
|
43
|
-
cert.subject.to_a.each{|oid, value|
|
44
|
-
if oid == "CN"
|
45
|
-
reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
|
46
|
-
return true if /\A#{reg}\z/i =~ hostname
|
47
|
-
end
|
48
|
-
}
|
49
|
-
end
|
50
|
-
return false
|
51
|
-
end
|
52
|
-
module_function :verify_certificate_identity
|
53
|
-
|
54
|
-
class SSLSocket
|
55
|
-
include Buffering
|
56
|
-
include SocketForwarder
|
57
|
-
include Nonblock
|
58
|
-
|
59
|
-
def post_connection_check(hostname)
|
60
|
-
unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
|
61
|
-
raise SSLError, "hostname was not match with the server certificate"
|
62
|
-
end
|
63
|
-
return true
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
class SSLServer
|
69
|
-
include SocketForwarder
|
70
|
-
attr_accessor :start_immediately
|
71
|
-
|
72
|
-
def initialize(svr, ctx)
|
73
|
-
@svr = svr
|
74
|
-
@ctx = ctx
|
75
|
-
unless ctx.session_id_context
|
76
|
-
session_id = OpenSSL::Digest::MD5.hexdigest($0)
|
77
|
-
@ctx.session_id_context = session_id
|
78
|
-
end
|
79
|
-
@start_immediately = true
|
80
|
-
end
|
81
|
-
|
82
|
-
def to_io
|
83
|
-
@svr
|
84
|
-
end
|
85
|
-
|
86
|
-
def listen(backlog=5)
|
87
|
-
@svr.listen(backlog)
|
88
|
-
end
|
89
|
-
|
90
|
-
def shutdown(how=Socket::SHUT_RDWR)
|
91
|
-
@svr.shutdown(how)
|
92
|
-
end
|
93
|
-
|
94
|
-
def accept
|
95
|
-
sock = @svr.accept
|
96
|
-
begin
|
97
|
-
ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
|
98
|
-
ssl.sync_close = true
|
99
|
-
ssl.accept if @start_immediately
|
100
|
-
ssl
|
101
|
-
rescue SSLError => ex
|
102
|
-
sock.close
|
103
|
-
raise ex
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def close
|
108
|
-
@svr.close
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
require 'openssl'
|
@@ -1,110 +0,0 @@
|
|
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$
|
15
|
-
=end
|
16
|
-
|
17
|
-
module OpenSSL
|
18
|
-
module X509
|
19
|
-
class Name
|
20
|
-
module RFC2253DN
|
21
|
-
Special = ',=+<>#;'
|
22
|
-
HexChar = /[0-9a-fA-F]/
|
23
|
-
HexPair = /#{HexChar}#{HexChar}/
|
24
|
-
HexString = /#{HexPair}+/
|
25
|
-
Pair = /\\(?:[#{Special}]|\\|"|#{HexPair})/
|
26
|
-
StringChar = /[^#{Special}\\"]/
|
27
|
-
QuoteChar = /[^\\"]/
|
28
|
-
AttributeType = /[a-zA-Z][0-9a-zA-Z]*|[0-9]+(?:\.[0-9]+)*/
|
29
|
-
AttributeValue = /
|
30
|
-
(?!["#])((?:#{StringChar}|#{Pair})*)|
|
31
|
-
\#(#{HexString})|
|
32
|
-
"((?:#{QuoteChar}|#{Pair})*)"
|
33
|
-
/x
|
34
|
-
TypeAndValue = /\A(#{AttributeType})=#{AttributeValue}/
|
35
|
-
|
36
|
-
module_function
|
37
|
-
|
38
|
-
def expand_pair(str)
|
39
|
-
return nil unless str
|
40
|
-
return str.gsub(Pair){
|
41
|
-
pair = $&
|
42
|
-
case pair.size
|
43
|
-
when 2 then pair[1,1]
|
44
|
-
when 3 then Integer("0x#{pair[1,2]}").chr
|
45
|
-
else raise OpenSSL::X509::NameError, "invalid pair: #{str}"
|
46
|
-
end
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
|
-
def expand_hexstring(str)
|
51
|
-
return nil unless str
|
52
|
-
der = str.gsub(HexPair){$&.to_i(16).chr }
|
53
|
-
a1 = OpenSSL::ASN1.decode(der)
|
54
|
-
return a1.value, a1.tag
|
55
|
-
end
|
56
|
-
|
57
|
-
def expand_value(str1, str2, str3)
|
58
|
-
value = expand_pair(str1)
|
59
|
-
value, tag = expand_hexstring(str2) unless value
|
60
|
-
value = expand_pair(str3) unless value
|
61
|
-
return value, tag
|
62
|
-
end
|
63
|
-
|
64
|
-
def scan(dn)
|
65
|
-
str = dn
|
66
|
-
ary = []
|
67
|
-
while true
|
68
|
-
if md = TypeAndValue.match(str)
|
69
|
-
matched = md.to_s
|
70
|
-
remain = md.post_match
|
71
|
-
type = md[1]
|
72
|
-
value, tag = expand_value(md[2], md[3], md[4]) rescue nil
|
73
|
-
if value
|
74
|
-
type_and_value = [type, value]
|
75
|
-
type_and_value.push(tag) if tag
|
76
|
-
ary.unshift(type_and_value)
|
77
|
-
if remain.length > 2 && remain[0] == ?,
|
78
|
-
str = remain[1..-1]
|
79
|
-
next
|
80
|
-
elsif remain.length > 2 && remain[0] == ?+
|
81
|
-
raise OpenSSL::X509::NameError,
|
82
|
-
"multi-valued RDN is not supported: #{dn}"
|
83
|
-
elsif remain.empty?
|
84
|
-
break
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
msg_dn = dn[0, dn.length - str.length] + " =>" + str
|
89
|
-
raise OpenSSL::X509::NameError, "malformed RDN: #{msg_dn}"
|
90
|
-
end
|
91
|
-
return ary
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
class <<self
|
96
|
-
def parse_rfc2253(str, template=OBJECT_TYPE_TEMPLATE)
|
97
|
-
ary = OpenSSL::X509::Name::RFC2253DN.scan(str)
|
98
|
-
self.new(ary, template)
|
99
|
-
end
|
100
|
-
|
101
|
-
def parse_openssl(str, template=OBJECT_TYPE_TEMPLATE)
|
102
|
-
ary = str.scan(/\s*([^\/,]+)\s*/).collect{|i| i[0].split("=", 2) }
|
103
|
-
self.new(ary, template)
|
104
|
-
end
|
105
|
-
|
106
|
-
alias parse parse_openssl
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
require 'openssl'
|
data/lib/jopenssl18/openssl.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
= $RCSfile$ -- Loader for all OpenSSL C-space and Ruby-space definitions
|
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: openssl.rb 12496 2007-06-08 15:02:04Z technorama $
|
15
|
-
=end
|
16
|
-
|
17
|
-
require 'openssl/bn'
|
18
|
-
require 'openssl/cipher'
|
19
|
-
require 'openssl/config'
|
20
|
-
require 'openssl/digest'
|
21
|
-
require 'openssl/pkcs7'
|
22
|
-
require 'openssl/ssl-internal'
|
23
|
-
require 'openssl/x509-internal'
|