jruby-openssl 0.9.7-java → 0.9.8-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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a10a9709e79d90c74281b533432e33c6c26a2f79
4
- data.tar.gz: a3cdde4bde8c2080b352f7359d9a6923e236ccb9
3
+ metadata.gz: 49741f0e23b3ad70304a6bdb63c2d23dde49f33a
4
+ data.tar.gz: 2036499982fa3531223893a4f9bf00ac01e6b2ec
5
5
  SHA512:
6
- metadata.gz: fd1dfecc8fc4ad3a15ee3f8961657d062885eb3ec059a4ce9de1fbb5a926ba74d53718bd84c463916c51262308dfedbba1d12ce61d9fd39bcb03e4433f949e32
7
- data.tar.gz: 2a20e1da276557801ee72d5b92355b0f28ec9c4f1bd49d8e0ab2b5da8596ac251ccff0f750e002ac75f56fb497d33947afe0ee1acee1424db873cc5db8a38fa4
6
+ metadata.gz: 6b8479f66c2858c0355dccaac0186c0ce881a51e5742de90d31659883b15e091d58caed87ddb937a1e3de6be8dfd53768eb39032c943fa1bc57fcf92c1089b78
7
+ data.tar.gz: e65b8995e632f4965f133f9f0f95bb73996116154cfda8342ac3e07d6073306e01494a1c93b404b61201595bbe1cd951b43ae844a06f3c03ed7fe4bfa7630792
data/History.md CHANGED
@@ -1,7 +1,52 @@
1
- == 0.9.7 (pending)
2
-
3
-
4
- == 0.9.6
1
+ ## 0.9.8
2
+
3
+ * refactor `PKCS5.pbkdf2_hmac_sha1` to use BC APIs
4
+ thus less dependent on provider internals (jruby/jruby#3025)
5
+ * HMAC - use our SimpleKey impl so that there's less[] copy
6
+ ... also allows for an empty key to work like MRI (jruby/jruby#2854)
7
+ * fixing oaep encryption to use correct algorithm (#54)
8
+ * [experimental] support NOT loading any (BC) jars on our own ... (#10)
9
+ * disable DHE (by default) on Java <= 7 ... on Java 8 we (still) force 1024/2048
10
+ (see jruby/jruby#2872 and #45)
11
+ * handle parsing of "incomplete" X.509 certificates like MRI does (#42)
12
+ * implement a CRL/certificate caching (for now off by default) in Lookup
13
+ ... set *-J-Djruby.openssl.x509.lookup.cache=true* to enable
14
+ * improve Store helper concurrency (with less synchronization)
15
+ * reviewed OpenSSL's .rb parts to match those present in MRI 1.9.3 / 2.2.2
16
+ * initial support for `OpenSSL::SSL::Session` (id, time, timeout work)
17
+ * session_cache_mode as present in OpenSSL makes no sense with Java APIs
18
+ * use the set SSLContext#session_cache_size on the underlying javax.net API
19
+ * tidy up SSLSocket's internals + add stack-trace debugging on accept/connect
20
+ * add SSLSocket ssl_version property like MRI has (#38)
21
+ * avoid unnecessary `_initialize` naming - it's confusing to see in JVM tools
22
+ * use SecurityHelper to get a X.509 certificate factory
23
+ we'll know prefer BC's X.509 factory over the built-in (Sun provider) one
24
+
25
+ ## 0.9.7
26
+
27
+ * put in some more ossl to jsse mappings for SSL/TLS
28
+ (SSL_DHE_xxx, TLS_ECDH_xxx, TLS_ECDHE_xxx)
29
+ * exclude SSLv2 in reported METHODS (all fine to close jruby/jruby#1874)
30
+ * support passing ssl_version as an argument to initialize SSLContext.new ...
31
+ * now that we've matched w MRI's SSLContext::METHODS don't report custom ones
32
+ * more ssl_version= compatibility fixes that match MRI (jruby/jruby#1736)
33
+ * support setting ssl_version = "TLSv1_1" (or "TLSv1_2") just like MRI
34
+ * [regression] make sure version is set when reading encoded certificate
35
+ + signature algorithm should be read as well when decoding certificate (#39)
36
+ * better accept handshake errors instead of "General SSLEngine problem (#37)
37
+ * trying to decode DER application specific objects (based on patch from #36)
38
+ * we've not been compatible with MRI's DES (EDE) - partly due DES(3) ECB
39
+ fixing jruby/jruby#2617 as well as jruby/jruby#931
40
+ * exclude reporting algorithms with CFB-1 cipher mode as supported (due #35)
41
+ * do not change CFB1 to CFB ... it's something different (although broken on BC)
42
+ * attempt to deal with update/final buffering incompatibility with MRI
43
+ * fix HMAC digest incorrect when data contains invalid characters (#33)
44
+ * add Gemfile and specify ruby-maven as dependency
45
+ * use SafePropertyAccessor to access properties instead of directly (#28)
46
+ * make sure SSLSocket's cipher and hostname are nil by default (avoids NPE)
47
+ * update to (packed) BC version 1.50 + start declaring 1.51 as semi-supported
48
+
49
+ ## 0.9.6
5
50
 
6
51
  * ClassCastException still happen deep within BC - turn them into SignatureExeption
7
52
  * make sure empty object can be serialize via to_pem
@@ -53,7 +98,7 @@
53
98
  * avoid using JRuby IO APIs (will likely not work in 9k)
54
99
  * make 'jopenssl/load' also work on jruby-1.6.8 mode 1.9
55
100
 
56
- == 0.9.5
101
+ ## 0.9.5
57
102
 
58
103
  MASSIVE internal "rewrite" to avoid depending on a registered (BC) security
59
104
  provider. This releases restores compatibility with BC version 1.47 while being
@@ -70,11 +115,11 @@ compatible with newer bouncy-castle jars as well (1.48, 1.49 and 1.50).
70
115
  * fix bug https://github.com/jruby/jruby/issues/1156
71
116
  * openssl: add handling for base 0 to new and to_s
72
117
 
73
- == 0.9.4
118
+ ## 0.9.4
74
119
 
75
120
  * Fix compatibility wiht Bouncy Castle 1.49.
76
121
 
77
- == 0.9.3
122
+ ## 0.9.3
78
123
 
79
124
  * Allow options passed to nonblock methods (not impl'ed yet)
80
125
  * Make ClassIndex into an enum, to prevent issues like jruby/jruby#1004
@@ -83,7 +128,7 @@ compatible with newer bouncy-castle jars as well (1.48, 1.49 and 1.50).
83
128
  == ...
84
129
 
85
130
 
86
- == 0.7.7
131
+ ## 0.7.7
87
132
 
88
133
  This release includes bug fixes.
89
134
 
@@ -93,14 +138,14 @@ This release includes bug fixes.
93
138
  * JRUBY-6515: sending UTF-8 data over SSL can hang with openssl
94
139
  * Update tests to sync with CRuby ruby_1_9_3
95
140
 
96
- == 0.7.6
141
+ ## 0.7.6
97
142
 
98
143
  This release includes initial implementation of PKCS12 by Owen Ou.
99
144
 
100
145
  * JRUBY-5066: Implement OpenSSL::PKCS12 (only for simple case)
101
146
  * JRUBY-6385: Assertion failure with -J-ea
102
147
 
103
- == 0.7.5
148
+ ## 0.7.5
104
149
 
105
150
  This release improved 1.9 mode support with help of
106
151
  Duncan Mak <duncan@earthaid.net>. Now jruby-ossl gem includes both 1.8 and 1.9
@@ -114,14 +159,14 @@ libraries and part of features should work fine on 1.9 mode, too.
114
159
  * JRUBY-5362: Improved 1.9 support
115
160
  * JRUBY-4992: Warn if loaded by non JRuby interpreter
116
161
 
117
- == 0.7.4
162
+ ## 0.7.4
118
163
 
119
164
  * JRUBY-5519: Avoid String encoding dependency in DER loading. PEM loading
120
165
  failed on JRuby 1.6.x. Fixed.
121
166
  * JRUBY-5510: Add debug information to released jar
122
167
  * JRUBY-5478: Update bouncycastle jars to the latest version. (1.46)
123
168
 
124
- == 0.7.3
169
+ ## 0.7.3
125
170
 
126
171
  * JRUBY-5200: Net::IMAP + SSL(imaps) login could hang. Fixed.
127
172
  * JRUBY-5253: Allow to load the certificate file which includes private
@@ -131,7 +176,7 @@ libraries and part of features should work fine on 1.9 mode, too.
131
176
  * JRUBY-5316: Improvements for J9's IBMJCE support. Now all testcases
132
177
  pass on J9 JDK 6.
133
178
 
134
- == 0.7.2
179
+ ## 0.7.2
135
180
 
136
181
  * JRUBY-5126: Ignore Cipher#reset and Cipher#iv= when it's a stream
137
182
  cipher (Net::SSH compatibility)
@@ -147,7 +192,7 @@ libraries and part of features should work fine on 1.9 mode, too.
147
192
  * JRUBY-5018: SSLSocket holds selectors, keys, preventing quick
148
193
  cleanup of resources when dereferenced
149
194
 
150
- == 0.7.1
195
+ ## 0.7.1
151
196
 
152
197
  NOTE: Now BouncyCastle jars has moved out to its own gem "bouncy-castle-java"
153
198
  http://rubygems.org/gems/bouncy-castle-java. You don't need to care about it
@@ -161,7 +206,7 @@ because "jruby-openssl" gem depends on it from now on.
161
206
  (JRuby-OpenSSL fake)" -> "jruby-ossl 0.7.1"
162
207
  * JRUBY-4975: Moving BouncyCastle jars out to its own gem.
163
208
 
164
- == 0.7
209
+ ## 0.7
165
210
 
166
211
  * Follow MRI 1.8.7 openssl API changes
167
212
  * Fixes so that jruby-openssl can run on appengine
@@ -217,7 +262,7 @@ because "jruby-openssl" gem depends on it from now on.
217
262
  - JRUBY-4574: jruby-openssl deprecation warning cleanup
218
263
  - JRUBY-4591: jruby-1.4 support
219
264
 
220
- == 0.6
265
+ ## 0.6
221
266
 
222
267
  * This is a recommended upgrade to jruby-openssl. A security problem
223
268
  involving peer certificate verification was found where failed
@@ -244,7 +289,7 @@ because "jruby-openssl" gem depends on it from now on.
244
289
  * Public keys are lazily instantiated when the
245
290
  X509::Certificate#public_key method is called (Dave Garcia)
246
291
 
247
- == 0.5.2
292
+ ## 0.5.2
248
293
 
249
294
  Multiple bugs fixed:
250
295
 
@@ -254,13 +299,13 @@ Multiple bugs fixed:
254
299
  * JRUBY-3767 OpenSSL ssl implementation doesn't support client auth
255
300
  * JRUBY-3673 jRuby-OpenSSL does not properly load certificate authority file
256
301
 
257
- == 0.5.1
302
+ ## 0.5.1
258
303
 
259
304
  * Multiple fixes by Brice Figureau to get net/ssh working. Requires JRuby 1.3.1
260
305
  to be 100%
261
306
  * Fix by Frederic Jean for a character-decoding issue for some certificates
262
307
 
263
- == 0.5
308
+ ## 0.5
264
309
 
265
310
  * Fixed JRUBY-3614: Unsupported HMAC algorithm (HMACSHA-256)
266
311
  * Fixed JRUBY-3570: ActiveMerchant's AuthorizeNet Gateway throws OpenSSL Cert
@@ -271,7 +316,7 @@ Multiple bugs fixed:
271
316
  digest
272
317
  * Misc code cleanup
273
318
 
274
- == 0.2
319
+ ## 0.2
275
320
 
276
321
  * Enable remaining tests; fix a nil string issue in SSLSocket.sysread
277
322
  (JRUBY-1888)
@@ -281,11 +326,11 @@ Multiple bugs fixed:
281
326
  * Fix cipher initialization (JRUBY-1100)
282
327
  * Now, only compatible with JRuby 1.1
283
328
 
284
- == 0.1.1
329
+ ## 0.1.1
285
330
 
286
331
  * Fixed blocker issue preventing HTTPS/SSL from working (JRUBY-1222)
287
332
 
288
- == 0.1
333
+ ## 0.1
289
334
 
290
335
  * PLEASE NOTE: This release is not compatible with JRuby releases earlier than
291
336
  1.0.3 or 1.1b2. If you must use JRuby 1.0.2 or earlier, please install the
@@ -294,6 +339,6 @@ Multiple bugs fixed:
294
339
  * Simultaneous support for JRuby trunk and 1.0 branch
295
340
  * Start of support for OpenSSL::BN
296
341
 
297
- == 0.0.5 and prior
342
+ ## 0.0.5 and prior
298
343
 
299
344
  * Initial versions with maintenance updates
data/Rakefile CHANGED
@@ -17,4 +17,15 @@ namespace :jar do
17
17
  task :all => :maven do
18
18
  maven.package '-Dmaven.test.skip'
19
19
  end
20
- end
20
+ end
21
+
22
+ file('lib/jopenssl.jar') { Rake::Task['jar'].invoke }
23
+
24
+ require 'rake/testtask'
25
+ Rake::TestTask.new do |task|
26
+ task.libs << 'lib'
27
+ task.test_files = FileList['src/test/ruby/**/test*.rb']
28
+ task.verbose = true
29
+ task.loader = :direct
30
+ end
31
+ task :test => 'lib/jopenssl.jar'
data/lib/jopenssl.jar CHANGED
Binary file
data/lib/jopenssl/load.rb CHANGED
@@ -3,30 +3,35 @@ warn 'Loading jruby-openssl in a non-JRuby interpreter' unless defined? JRUBY_VE
3
3
  require 'java'
4
4
  require 'jopenssl/version'
5
5
 
6
- version = Jopenssl::Version::BOUNCY_CASTLE_VERSION
7
- bc_jars = nil
8
- begin
9
- # if we have jar-dependencies we let it track the jars
10
- require_jar( 'org.bouncycastle', 'bcpkix-jdk15on', version )
11
- require_jar( 'org.bouncycastle', 'bcprov-jdk15on', version )
12
- bc_jars = true
13
- rescue LoadError
14
- end if defined?(Jars) && ( ! Jars.skip? ) rescue nil
15
- unless bc_jars
16
- load "org/bouncycastle/bcpkix-jdk15on/#{version}/bcpkix-jdk15on-#{version}.jar"
17
- load "org/bouncycastle/bcprov-jdk15on/#{version}/bcprov-jdk15on-#{version}.jar"
6
+ # NOTE: assuming user does pull in BC .jars from somewhere else on the CP
7
+ unless ENV_JAVA['jruby.openssl.load.jars'].eql?('false')
8
+ version = Jopenssl::Version::BOUNCY_CASTLE_VERSION
9
+ bc_jars = nil
10
+ begin
11
+ # if we have jar-dependencies we let it track the jars
12
+ require_jar( 'org.bouncycastle', 'bcpkix-jdk15on', version )
13
+ require_jar( 'org.bouncycastle', 'bcprov-jdk15on', version )
14
+ bc_jars = true
15
+ rescue LoadError
16
+ end if defined?(Jars) && ( ! Jars.skip? ) rescue nil
17
+ unless bc_jars
18
+ load "org/bouncycastle/bcpkix-jdk15on/#{version}/bcpkix-jdk15on-#{version}.jar"
19
+ load "org/bouncycastle/bcprov-jdk15on/#{version}/bcprov-jdk15on-#{version}.jar"
20
+ end
18
21
  end
19
22
 
20
23
  require 'jruby'
21
24
  require 'jopenssl.jar'
22
25
  org.jruby.ext.openssl.OpenSSL.load(JRuby.runtime)
23
26
 
24
- if RUBY_VERSION >= '2.1.0'
25
- load('jopenssl21/openssl.rb')
26
- elsif RUBY_VERSION >= '1.9.0'
27
- load('jopenssl19/openssl.rb')
27
+ if RUBY_VERSION > '2.2'
28
+ load 'jopenssl22/openssl.rb'
29
+ elsif RUBY_VERSION > '2.1'
30
+ load 'jopenssl21/openssl.rb'
31
+ elsif RUBY_VERSION > '1.9'
32
+ load 'jopenssl19/openssl.rb'
28
33
  else
29
- load('jopenssl18/openssl.rb')
34
+ load 'jopenssl18/openssl.rb'
30
35
  end
31
36
 
32
37
  require 'openssl/pkcs12'
@@ -1,6 +1,6 @@
1
1
  module Jopenssl
2
2
  module Version
3
- VERSION = '0.9.7'
3
+ VERSION = '0.9.8'
4
4
  BOUNCY_CASTLE_VERSION = '1.50'
5
5
  end
6
6
  end
@@ -15,48 +15,10 @@
15
15
  =end
16
16
 
17
17
  require "openssl/buffering"
18
- require "fcntl"
18
+ require 'fcntl' # used by OpenSSL::SSL::Nonblock (if loaded)
19
19
 
20
20
  module OpenSSL
21
21
  module SSL
22
- module SocketForwarder
23
- def addr
24
- to_io.addr
25
- end
26
-
27
- def peeraddr
28
- to_io.peeraddr
29
- end
30
-
31
- def setsockopt(level, optname, optval)
32
- to_io.setsockopt(level, optname, optval)
33
- end
34
-
35
- def getsockopt(level, optname)
36
- to_io.getsockopt(level, optname)
37
- end
38
-
39
- def fcntl(*args)
40
- to_io.fcntl(*args)
41
- end
42
-
43
- def closed?
44
- to_io.closed?
45
- end
46
-
47
- def do_not_reverse_lookup=(flag)
48
- to_io.do_not_reverse_lookup = flag
49
- end
50
- end
51
-
52
- module Nonblock
53
- def initialize(*args)
54
- flag = File::NONBLOCK
55
- flag |= @io.fcntl(Fcntl::F_GETFL) if defined?(Fcntl::F_GETFL)
56
- @io.fcntl(Fcntl::F_SETFL, flag)
57
- super
58
- end
59
- end
60
22
 
61
23
  def verify_certificate_identity(cert, hostname)
62
24
  should_verify_common_name = true
@@ -101,11 +63,6 @@ module OpenSSL
101
63
  return true
102
64
  end
103
65
 
104
- def session
105
- SSL::Session.new(self)
106
- rescue SSL::Session::SessionError
107
- nil
108
- end
109
66
  end
110
67
 
111
68
  class SSLServer
@@ -13,20 +13,41 @@
13
13
  require 'stringio'
14
14
 
15
15
  module OpenSSL
16
+ ##
17
+ # = OpenSSL::Config
18
+ #
19
+ # Configuration for the openssl library.
20
+ #
21
+ # Many system's installation of openssl library will depend on your system
22
+ # configuration. See the value of OpenSSL::Config::DEFAULT_CONFIG_FILE for
23
+ # the location of the file for your host.
24
+ #
25
+ # See also http://www.openssl.org/docs/apps/config.html
16
26
  class Config
17
27
  include Enumerable
18
28
 
19
29
  class << self
20
- def parse(str)
30
+
31
+ ##
32
+ # Parses a given +string+ as a blob that contains configuration for openssl.
33
+ #
34
+ # If the source of the IO is a file, then consider using #parse_config.
35
+ def parse(string)
21
36
  c = new()
22
- parse_config(StringIO.new(str)).each do |section, hash|
37
+ parse_config(StringIO.new(string)).each do |section, hash|
23
38
  c[section] = hash
24
39
  end
25
40
  c
26
41
  end
27
42
 
43
+ ##
44
+ # load is an alias to ::new
28
45
  alias load new
29
46
 
47
+ ##
48
+ # Parses the configuration data read from +io+, see also #parse.
49
+ #
50
+ # Raises a ConfigError on invalid configuration data.
30
51
  def parse_config(io)
31
52
  begin
32
53
  parse_config_lines(io)
@@ -209,6 +230,18 @@ module OpenSSL
209
230
  end
210
231
  end
211
232
 
233
+ ##
234
+ # Creates an instance of OpenSSL's configuration class.
235
+ #
236
+ # This can be used in contexts like OpenSSL::X509::ExtensionFactory.config=
237
+ #
238
+ # If the optional +filename+ parameter is provided, then it is read in and
239
+ # parsed via #parse_config.
240
+ #
241
+ # This can raise IO exceptions based on the access, or availability of the
242
+ # file. A ConfigError exception may be raised depending on the validity of
243
+ # the data being configured.
244
+ #
212
245
  def initialize(filename = nil)
213
246
  @data = {}
214
247
  if filename
@@ -220,6 +253,23 @@ module OpenSSL
220
253
  end
221
254
  end
222
255
 
256
+ ##
257
+ # Gets the value of +key+ from the given +section+
258
+ #
259
+ # Given the following configurating file being loaded:
260
+ #
261
+ # config = OpenSSL::Config.load('foo.cnf')
262
+ # #=> #<OpenSSL::Config sections=["default"]>
263
+ # puts config.to_s
264
+ # #=> [ default ]
265
+ # # foo=bar
266
+ #
267
+ # You can get a specific value from the config if you know the +section+
268
+ # and +key+ like so:
269
+ #
270
+ # config.get_value('default','foo')
271
+ # #=> "bar"
272
+ #
223
273
  def get_value(section, key)
224
274
  if section.nil?
225
275
  raise TypeError.new('nil not allowed')
@@ -228,7 +278,12 @@ module OpenSSL
228
278
  get_key_string(section, key)
229
279
  end
230
280
 
231
- def value(arg1, arg2 = nil)
281
+ ##
282
+ #
283
+ # *Deprecated*
284
+ #
285
+ # Use #get_value instead
286
+ def value(arg1, arg2 = nil) # :nodoc:
232
287
  warn('Config#value is deprecated; use Config#get_value')
233
288
  if arg2.nil?
234
289
  section, key = 'default', arg1
@@ -240,20 +295,84 @@ module OpenSSL
240
295
  get_key_string(section, key)
241
296
  end
242
297
 
298
+ ##
299
+ # Set the target +key+ with a given +value+ under a specific +section+.
300
+ #
301
+ # Given the following configurating file being loaded:
302
+ #
303
+ # config = OpenSSL::Config.load('foo.cnf')
304
+ # #=> #<OpenSSL::Config sections=["default"]>
305
+ # puts config.to_s
306
+ # #=> [ default ]
307
+ # # foo=bar
308
+ #
309
+ # You can set the value of +foo+ under the +default+ section to a new
310
+ # value:
311
+ #
312
+ # config.add_value('default', 'foo', 'buzz')
313
+ # #=> "buzz"
314
+ # puts config.to_s
315
+ # #=> [ default ]
316
+ # # foo=buzz
317
+ #
243
318
  def add_value(section, key, value)
244
319
  check_modify
245
320
  (@data[section] ||= {})[key] = value
246
321
  end
247
322
 
323
+ ##
324
+ # Get a specific +section+ from the current configuration
325
+ #
326
+ # Given the following configurating file being loaded:
327
+ #
328
+ # config = OpenSSL::Config.load('foo.cnf')
329
+ # #=> #<OpenSSL::Config sections=["default"]>
330
+ # puts config.to_s
331
+ # #=> [ default ]
332
+ # # foo=bar
333
+ #
334
+ # You can get a hash of the specific section like so:
335
+ #
336
+ # config['default']
337
+ # #=> {"foo"=>"bar"}
338
+ #
248
339
  def [](section)
249
340
  @data[section] || {}
250
341
  end
251
342
 
252
- def section(name)
343
+ ##
344
+ # Deprecated
345
+ #
346
+ # Use #[] instead
347
+ def section(name) # :nodoc:
253
348
  warn('Config#section is deprecated; use Config#[]')
254
349
  @data[name] || {}
255
350
  end
256
351
 
352
+ ##
353
+ # Sets a specific +section+ name with a Hash +pairs+
354
+ #
355
+ # Given the following configuration being created:
356
+ #
357
+ # config = OpenSSL::Config.new
358
+ # #=> #<OpenSSL::Config sections=[]>
359
+ # config['default'] = {"foo"=>"bar","baz"=>"buz"}
360
+ # #=> {"foo"=>"bar", "baz"=>"buz"}
361
+ # puts config.to_s
362
+ # #=> [ default ]
363
+ # # foo=bar
364
+ # # baz=buz
365
+ #
366
+ # It's important to note that this will essentially merge any of the keys
367
+ # in +pairs+ with the existing +section+. For example:
368
+ #
369
+ # config['default']
370
+ # #=> {"foo"=>"bar", "baz"=>"buz"}
371
+ # config['default'] = {"foo" => "changed"}
372
+ # #=> {"foo"=>"changed"}
373
+ # config['default']
374
+ # #=> {"foo"=>"changed", "baz"=>"buz"}
375
+ #
257
376
  def []=(section, pairs)
258
377
  check_modify
259
378
  @data[section] ||= {}
@@ -262,10 +381,38 @@ module OpenSSL
262
381
  end
263
382
  end
264
383
 
384
+ ##
385
+ # Get the names of all sections in the current configuration
265
386
  def sections
266
387
  @data.keys
267
388
  end
268
389
 
390
+ ##
391
+ # Get the parsable form of the current configuration
392
+ #
393
+ # Given the following configuration being created:
394
+ #
395
+ # config = OpenSSL::Config.new
396
+ # #=> #<OpenSSL::Config sections=[]>
397
+ # config['default'] = {"foo"=>"bar","baz"=>"buz"}
398
+ # #=> {"foo"=>"bar", "baz"=>"buz"}
399
+ # puts config.to_s
400
+ # #=> [ default ]
401
+ # # foo=bar
402
+ # # baz=buz
403
+ #
404
+ # You can parse get the serialized configuration using #to_s and then parse
405
+ # it later:
406
+ #
407
+ # serialized_config = config.to_s
408
+ # # much later...
409
+ # new_config = OpenSSL::Config.parse(serialized_config)
410
+ # #=> #<OpenSSL::Config sections=["default"]>
411
+ # puts new_config
412
+ # #=> [ default ]
413
+ # foo=bar
414
+ # baz=buz
415
+ #
269
416
  def to_s
270
417
  ary = []
271
418
  @data.keys.sort.each do |section|
@@ -278,6 +425,15 @@ module OpenSSL
278
425
  ary.join
279
426
  end
280
427
 
428
+ ##
429
+ # For a block.
430
+ #
431
+ # Receive the section and its pairs for the current configuration.
432
+ #
433
+ # config.each do |section, key, value|
434
+ # # ...
435
+ # end
436
+ #
281
437
  def each
282
438
  @data.each do |section, hash|
283
439
  hash.each do |key, value|
@@ -286,13 +442,16 @@ module OpenSSL
286
442
  end
287
443
  end
288
444
 
445
+ ##
446
+ # String representation of this configuration object, including the class
447
+ # name and its sections.
289
448
  def inspect
290
449
  "#<#{self.class.name} sections=#{sections.inspect}>"
291
450
  end
292
451
 
293
452
  protected
294
453
 
295
- def data
454
+ def data # :nodoc:
296
455
  @data
297
456
  end
298
457