openssl 3.1.1 → 3.2.0
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 +36 -27
- data/README.md +36 -19
- data/ext/openssl/extconf.rb +35 -8
- data/ext/openssl/ossl.c +73 -195
- data/ext/openssl/ossl.h +5 -6
- data/ext/openssl/ossl_asn1.c +24 -19
- data/ext/openssl/ossl_bn.c +1 -1
- data/ext/openssl/ossl_cipher.c +5 -20
- data/ext/openssl/ossl_config.c +1 -1
- data/ext/openssl/ossl_digest.c +1 -2
- data/ext/openssl/ossl_engine.c +1 -1
- data/ext/openssl/ossl_hmac.c +1 -1
- data/ext/openssl/ossl_kdf.c +1 -1
- data/ext/openssl/ossl_ns_spki.c +1 -1
- data/ext/openssl/ossl_ocsp.c +6 -6
- data/ext/openssl/ossl_pkcs12.c +1 -1
- data/ext/openssl/ossl_pkcs7.c +4 -14
- data/ext/openssl/ossl_pkey.c +217 -44
- data/ext/openssl/ossl_pkey_dh.c +22 -7
- data/ext/openssl/ossl_pkey_dsa.c +57 -8
- data/ext/openssl/ossl_pkey_ec.c +65 -9
- data/ext/openssl/ossl_pkey_rsa.c +68 -13
- data/ext/openssl/ossl_provider.c +211 -0
- data/ext/openssl/ossl_provider.h +5 -0
- data/ext/openssl/ossl_ssl.c +83 -65
- data/ext/openssl/ossl_ssl_session.c +1 -1
- data/ext/openssl/ossl_ts.c +3 -3
- data/ext/openssl/ossl_x509attr.c +1 -1
- data/ext/openssl/ossl_x509cert.c +1 -1
- data/ext/openssl/ossl_x509crl.c +1 -1
- data/ext/openssl/ossl_x509ext.c +13 -7
- data/ext/openssl/ossl_x509name.c +1 -1
- data/ext/openssl/ossl_x509req.c +1 -1
- data/ext/openssl/ossl_x509revoked.c +1 -1
- data/ext/openssl/ossl_x509store.c +12 -5
- data/lib/openssl/buffering.rb +8 -16
- data/lib/openssl/digest.rb +1 -5
- data/lib/openssl/ssl.rb +10 -10
- data/lib/openssl/version.rb +1 -1
- data/lib/openssl/x509.rb +5 -5
- metadata +12 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5040b959a35f5692d6d19e2bf520e1123da8133fff2f878cfc21c2ff0f145d6e
|
4
|
+
data.tar.gz: dfee6ebd76e423511aa0fc4630f8120edce8fe79d4f40ee7105ccad12c2d3340
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f542ec360be844382829f4bcc46b5cffdfcaf675b02ecdc1cd15a6e80c061476ee4582fdb201ef2dd0f430806d74036233eef3a5c23e5b4028560ad075ed706b
|
7
|
+
data.tar.gz: 0173033ebe6efb76b747cc80835cc9530dd664d038256bbdf963d4940b5f3bfad90be313554f548a911ac0977d4bdc33c088dfd3b6fb8e46db7bcd5d2ec34a8c
|
data/History.md
CHANGED
@@ -1,7 +1,41 @@
|
|
1
|
-
Version 3.
|
1
|
+
Version 3.2.0
|
2
2
|
=============
|
3
3
|
|
4
|
-
|
4
|
+
Compatibility
|
5
|
+
-------------
|
6
|
+
|
7
|
+
* Ruby >= 2.7
|
8
|
+
- Support for Ruby 2.6 has been removed. Note that Ruby 2.6 reached the
|
9
|
+
end-of-life in 2022-04.
|
10
|
+
[[GitHub #639]](https://github.com/ruby/openssl/pull/639)
|
11
|
+
* OpenSSL >= 1.0.2 or LibreSSL >= 3.1
|
12
|
+
|
13
|
+
Notable changes
|
14
|
+
---------------
|
15
|
+
|
16
|
+
* Add a stub gemspec for JRuby, which depends on the `jruby-openssl` gem.
|
17
|
+
[[GitHub #598]](https://github.com/ruby/openssl/pull/598)
|
18
|
+
* Add support for the FIPS module in OpenSSL 3.0/3.1.
|
19
|
+
[[GitHub #608]](https://github.com/ruby/openssl/pull/608)
|
20
|
+
* Rework `OpenSSL::PKey` routines for loading DER or PEM encoded keys for better
|
21
|
+
compatibility with OpenSSL 3.0/3.1 with the FIPS module.
|
22
|
+
[[GitHub #615]](https://github.com/ruby/openssl/pull/615)
|
23
|
+
[[GitHub #669]](https://github.com/ruby/openssl/pull/669)
|
24
|
+
* Add `OpenSSL::Provider` module for loading and unloading OpenSSL 3 providers.
|
25
|
+
[[GitHub #635]](https://github.com/ruby/openssl/pull/635)
|
26
|
+
* Add `OpenSSL::PKey.new_raw_private_key`, `.new_raw_public_key`,
|
27
|
+
`OpenSSL::PKey::PKey#raw_private_key`, and `#raw_public_key` for public key
|
28
|
+
algorithms that use "raw private/public key", such as X25519 and Ed25519.
|
29
|
+
[[GitHub #646]](https://github.com/ruby/openssl/pull/646)
|
30
|
+
* Improve OpenSSL error messages to include additional information when
|
31
|
+
it is available in OpenSSL's error queue.
|
32
|
+
[[GitHub #648]](https://github.com/ruby/openssl/pull/648)
|
33
|
+
* Change `OpenSSL::SSL::SSLContext#ca_file=` and `#ca_path=` to raise
|
34
|
+
`OpenSSL::SSL::SSLError` instead of printing a warning message.
|
35
|
+
[[GitHub #659]](https://github.com/ruby/openssl/pull/659)
|
36
|
+
* Allow `OpenSSL::X509::ExtensionFactory#create_extension` to take OIDs in the
|
37
|
+
dotted-decimal notation.
|
38
|
+
[[GitHub #141]](https://github.com/ruby/openssl/pull/141)
|
5
39
|
|
6
40
|
|
7
41
|
Version 3.1.0
|
@@ -40,31 +74,6 @@ Notable changes
|
|
40
74
|
LibreSSL 3.6 and Ed25519 support in LibreSSL 3.7.
|
41
75
|
|
42
76
|
|
43
|
-
Version 3.0.3
|
44
|
-
=============
|
45
|
-
|
46
|
-
Bug fixes
|
47
|
-
---------
|
48
|
-
|
49
|
-
* Fix a performance regression introduced in v2.1.3 on a buffered write to
|
50
|
-
`SSLSocket`.
|
51
|
-
[[GitHub #706]](https://github.com/ruby/openssl/pull/706)
|
52
|
-
* Fix `OpenSSL::PKCS7` to handle PKCS#7 structures without content.
|
53
|
-
[[GitHub #690]](https://github.com/ruby/openssl/pull/690)
|
54
|
-
[[GitHub #752]](https://github.com/ruby/openssl/pull/752)
|
55
|
-
* Fix `OpenSSL::ASN1::ObjectId#==` with OIDs without a known name.
|
56
|
-
[[GitHub #791]](https://github.com/ruby/openssl/issues/791)
|
57
|
-
[[GitHub #792]](https://github.com/ruby/openssl/pull/792)
|
58
|
-
* Fix `OpenSSL::X509::Certificate#crl_uris` to handle CDP with multiple CRL
|
59
|
-
URIs.
|
60
|
-
[[GitHub #775]](https://github.com/ruby/openssl/issues/775)
|
61
|
-
[[GitHub #776]](https://github.com/ruby/openssl/pull/776)
|
62
|
-
* Fix `OpenSSL::Cipher#update` to always make the output buffer `String`
|
63
|
-
independent.
|
64
|
-
[[Bug #20937]](https://bugs.ruby-lang.org/issues/20937)
|
65
|
-
[[GitHub #824]](https://github.com/ruby/openssl/pull/824)
|
66
|
-
|
67
|
-
|
68
77
|
Version 3.0.2
|
69
78
|
=============
|
70
79
|
|
data/README.md
CHANGED
@@ -2,26 +2,53 @@
|
|
2
2
|
|
3
3
|
[](https://github.com/ruby/openssl/actions?workflow=CI)
|
4
4
|
|
5
|
+
**OpenSSL for Ruby** provides access to SSL/TLS and general-purpose
|
6
|
+
cryptography based on the OpenSSL library.
|
5
7
|
|
6
|
-
OpenSSL
|
7
|
-
OpenSSL
|
8
|
+
OpenSSL for Ruby is sometimes referred to as **openssl** in all lowercase
|
9
|
+
or **Ruby/OpenSSL** for disambiguation.
|
10
|
+
|
11
|
+
## Compatibility and maintenance policy
|
12
|
+
|
13
|
+
OpenSSL for Ruby is released as a RubyGems gem. At the same time, it is part of
|
14
|
+
the standard library of Ruby. This is called a [default gem].
|
15
|
+
|
16
|
+
Each stable branch of OpenSSL for Ruby will remain supported as long as it is
|
17
|
+
included as a default gem in [supported Ruby branches][Ruby Maintenance Branches].
|
18
|
+
|
19
|
+
|Version|Maintenance status |Ruby compatibility|OpenSSL compatibility |
|
20
|
+
|-------|-------------------------------|------------------|--------------------------------------------|
|
21
|
+
|3.2.x |normal maintenance (Ruby 3.3) |Ruby 2.7+ |OpenSSL 1.0.2-3.1 (current) or LibreSSL 3.1+|
|
22
|
+
|3.1.x |normal maintenance (Ruby 3.2) |Ruby 2.6+ |OpenSSL 1.0.2-3.1 (current) or LibreSSL 3.1+|
|
23
|
+
|3.0.x |normal maintenance (Ruby 3.1) |Ruby 2.6+ |OpenSSL 1.0.2-3.1 (current) or LibreSSL 3.1+|
|
24
|
+
|2.2.x |security maintenance (Ruby 3.0)|Ruby 2.3+ |OpenSSL 1.0.1-1.1.1 or LibreSSL 2.9+ |
|
25
|
+
|2.1.x |end-of-life (Ruby 2.5-2.7) |Ruby 2.3+ |OpenSSL 1.0.1-1.1.1 or LibreSSL 2.5+ |
|
26
|
+
|2.0.x |end-of-life (Ruby 2.4) |Ruby 2.3+ |OpenSSL 0.9.8-1.1.1 or LibreSSL 2.3+ |
|
27
|
+
|
28
|
+
[default gem]: https://docs.ruby-lang.org/en/master/standard_library_rdoc.html
|
29
|
+
[Ruby Maintenance Branches]: https://www.ruby-lang.org/en/downloads/branches/
|
8
30
|
|
9
31
|
## Installation
|
10
32
|
|
11
|
-
|
12
|
-
|
33
|
+
> **Note**
|
34
|
+
> The openssl gem is included with Ruby by default, but you may wish to upgrade
|
35
|
+
> it to a newer version available at
|
36
|
+
> [rubygems.org](https://rubygems.org/gems/openssl).
|
37
|
+
|
38
|
+
To upgrade it, you can use RubyGems:
|
13
39
|
|
14
40
|
```
|
15
41
|
gem install openssl
|
16
42
|
```
|
17
43
|
|
18
|
-
|
44
|
+
In some cases, it may be necessary to specify the path to the installation
|
45
|
+
directory of the OpenSSL library.
|
19
46
|
|
20
47
|
```
|
21
48
|
gem install openssl -- --with-openssl-dir=/opt/openssl
|
22
49
|
```
|
23
50
|
|
24
|
-
Alternatively, you can install the gem with
|
51
|
+
Alternatively, you can install the gem with Bundler:
|
25
52
|
|
26
53
|
```ruby
|
27
54
|
# Gemfile
|
@@ -30,7 +57,7 @@ gem 'openssl'
|
|
30
57
|
gem 'openssl', git: 'https://github.com/ruby/openssl'
|
31
58
|
```
|
32
59
|
|
33
|
-
After
|
60
|
+
After running `bundle install`, you should have the gem installed in your bundle.
|
34
61
|
|
35
62
|
## Usage
|
36
63
|
|
@@ -40,15 +67,6 @@ Once installed, you can require "openssl" in your application.
|
|
40
67
|
require "openssl"
|
41
68
|
```
|
42
69
|
|
43
|
-
**NOTE**: If you are using Ruby 2.3 (and not Bundler), you **must** activate
|
44
|
-
the gem version of openssl, otherwise the default gem packaged with the Ruby
|
45
|
-
installation will be used:
|
46
|
-
|
47
|
-
```ruby
|
48
|
-
gem "openssl"
|
49
|
-
require "openssl"
|
50
|
-
```
|
51
|
-
|
52
70
|
## Documentation
|
53
71
|
|
54
72
|
See https://ruby.github.io/openssl/.
|
@@ -57,10 +75,9 @@ See https://ruby.github.io/openssl/.
|
|
57
75
|
|
58
76
|
Please read our [CONTRIBUTING.md] for instructions.
|
59
77
|
|
78
|
+
[CONTRIBUTING.md]: https://github.com/ruby/openssl/tree/master/CONTRIBUTING.md
|
79
|
+
|
60
80
|
## Security
|
61
81
|
|
62
82
|
Security issues should be reported to ruby-core by following the process
|
63
83
|
described on ["Security at ruby-lang.org"](https://www.ruby-lang.org/en/security/).
|
64
|
-
|
65
|
-
|
66
|
-
[CONTRIBUTING.md]: https://github.com/ruby/openssl/tree/master/CONTRIBUTING.md
|
data/ext/openssl/extconf.rb
CHANGED
@@ -13,20 +13,41 @@
|
|
13
13
|
|
14
14
|
require "mkmf"
|
15
15
|
|
16
|
-
|
16
|
+
ssl_dirs = nil
|
17
|
+
if defined?(::TruffleRuby)
|
18
|
+
# Always respect the openssl prefix chosen by truffle/openssl-prefix
|
19
|
+
require 'truffle/openssl-prefix'
|
20
|
+
ssl_dirs = dir_config("openssl", ENV["OPENSSL_PREFIX"])
|
21
|
+
else
|
22
|
+
ssl_dirs = dir_config("openssl")
|
23
|
+
end
|
24
|
+
dir_config_given = ssl_dirs.any?
|
25
|
+
|
26
|
+
_, ssl_ldir = ssl_dirs
|
27
|
+
if ssl_ldir&.split(File::PATH_SEPARATOR)&.none? { |dir| File.directory?(dir) }
|
28
|
+
# According to the `mkmf.rb#dir_config`, the `--with-openssl-dir=<dir>` uses
|
29
|
+
# the value of the `File.basename(RbConfig::MAKEFILE_CONFIG["libdir"])` as a
|
30
|
+
# loaded library directory name.
|
31
|
+
ruby_ldir_name = File.basename(RbConfig::MAKEFILE_CONFIG["libdir"])
|
32
|
+
|
33
|
+
raise "OpenSSL library directory could not be found in '#{ssl_ldir}'. " \
|
34
|
+
"You might want to fix this error in one of the following ways.\n" \
|
35
|
+
" * Recompile OpenSSL by configuring it with --libdir=#{ruby_ldir_name} " \
|
36
|
+
" to specify the OpenSSL library directory.\n" \
|
37
|
+
" * Recompile Ruby by configuring it with --libdir=<dir> to specify the " \
|
38
|
+
"Ruby library directory.\n" \
|
39
|
+
" * Compile this openssl gem with --with-openssl-include=<dir> and " \
|
40
|
+
"--with-openssl-lib=<dir> options to specify the OpenSSL include and " \
|
41
|
+
"library directories."
|
42
|
+
end
|
43
|
+
|
17
44
|
dir_config("kerberos")
|
18
45
|
|
19
46
|
Logging::message "=== OpenSSL for Ruby configurator ===\n"
|
20
47
|
|
21
|
-
##
|
22
|
-
# Adds -DOSSL_DEBUG for compilation and some more targets when GCC is used
|
23
|
-
# To turn it on, use: --with-debug or --enable-debug
|
24
|
-
#
|
25
|
-
if with_config("debug") or enable_config("debug")
|
26
|
-
$defs.push("-DOSSL_DEBUG")
|
27
|
-
end
|
28
48
|
$defs.push("-D""OPENSSL_SUPPRESS_DEPRECATED")
|
29
49
|
|
50
|
+
have_func("rb_io_descriptor")
|
30
51
|
have_func("rb_io_maybe_wait(0, Qnil, Qnil, Qnil)", "ruby/io.h") # Ruby 3.1
|
31
52
|
|
32
53
|
Logging::message "=== Checking for system dependent stuff... ===\n"
|
@@ -191,6 +212,12 @@ have_func("EVP_PKEY_dup(NULL)", evp_h)
|
|
191
212
|
|
192
213
|
Logging::message "=== Checking done. ===\n"
|
193
214
|
|
215
|
+
# Append flags from environment variables.
|
216
|
+
extcflags = ENV["RUBY_OPENSSL_EXTCFLAGS"]
|
217
|
+
append_cflags(extcflags.split) if extcflags
|
218
|
+
extldflags = ENV["RUBY_OPENSSL_EXTLDFLAGS"]
|
219
|
+
append_ldflags(extldflags.split) if extldflags
|
220
|
+
|
194
221
|
create_header
|
195
222
|
create_makefile("openssl")
|
196
223
|
Logging::message "Done.\n"
|
data/ext/openssl/ossl.c
CHANGED
@@ -207,7 +207,7 @@ ossl_pem_passwd_cb(char *buf, int max_len, int flag, void *pwd_)
|
|
207
207
|
|
208
208
|
while (1) {
|
209
209
|
/*
|
210
|
-
* when the flag is nonzero, this
|
210
|
+
* when the flag is nonzero, this password
|
211
211
|
* will be used to perform encryption; otherwise it will
|
212
212
|
* be used to perform decryption.
|
213
213
|
*/
|
@@ -272,23 +272,28 @@ VALUE
|
|
272
272
|
ossl_make_error(VALUE exc, VALUE str)
|
273
273
|
{
|
274
274
|
unsigned long e;
|
275
|
+
const char *data;
|
276
|
+
int flags;
|
275
277
|
|
276
|
-
|
278
|
+
if (NIL_P(str))
|
279
|
+
str = rb_str_new(NULL, 0);
|
280
|
+
|
281
|
+
#ifdef HAVE_ERR_GET_ERROR_ALL
|
282
|
+
e = ERR_peek_last_error_all(NULL, NULL, NULL, &data, &flags);
|
283
|
+
#else
|
284
|
+
e = ERR_peek_last_error_line_data(NULL, NULL, &data, &flags);
|
285
|
+
#endif
|
277
286
|
if (e) {
|
278
|
-
|
287
|
+
const char *msg = ERR_reason_error_string(e);
|
279
288
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
rb_str_cat2(str, msg ? msg : "(null)");
|
286
|
-
}
|
287
|
-
ossl_clear_error();
|
289
|
+
if (RSTRING_LEN(str)) rb_str_cat_cstr(str, ": ");
|
290
|
+
rb_str_cat_cstr(str, msg ? msg : "(null)");
|
291
|
+
if (flags & ERR_TXT_STRING && data)
|
292
|
+
rb_str_catf(str, " (%s)", data);
|
293
|
+
ossl_clear_error();
|
288
294
|
}
|
289
295
|
|
290
|
-
|
291
|
-
return rb_exc_new3(exc, str);
|
296
|
+
return rb_exc_new_str(exc, str);
|
292
297
|
}
|
293
298
|
|
294
299
|
void
|
@@ -369,22 +374,6 @@ ossl_get_errors(VALUE _)
|
|
369
374
|
*/
|
370
375
|
VALUE dOSSL;
|
371
376
|
|
372
|
-
#if !defined(HAVE_VA_ARGS_MACRO)
|
373
|
-
void
|
374
|
-
ossl_debug(const char *fmt, ...)
|
375
|
-
{
|
376
|
-
va_list args;
|
377
|
-
|
378
|
-
if (dOSSL == Qtrue) {
|
379
|
-
fprintf(stderr, "OSSL_DEBUG: ");
|
380
|
-
va_start(args, fmt);
|
381
|
-
vfprintf(stderr, fmt, args);
|
382
|
-
va_end(args);
|
383
|
-
fprintf(stderr, " [CONTEXT N/A]\n");
|
384
|
-
}
|
385
|
-
}
|
386
|
-
#endif
|
387
|
-
|
388
377
|
/*
|
389
378
|
* call-seq:
|
390
379
|
* OpenSSL.debug -> true | false
|
@@ -418,7 +407,11 @@ static VALUE
|
|
418
407
|
ossl_fips_mode_get(VALUE self)
|
419
408
|
{
|
420
409
|
|
421
|
-
#
|
410
|
+
#if OSSL_OPENSSL_PREREQ(3, 0, 0)
|
411
|
+
VALUE enabled;
|
412
|
+
enabled = EVP_default_properties_is_fips_enabled(NULL) ? Qtrue : Qfalse;
|
413
|
+
return enabled;
|
414
|
+
#elif defined(OPENSSL_FIPS)
|
422
415
|
VALUE enabled;
|
423
416
|
enabled = FIPS_mode() ? Qtrue : Qfalse;
|
424
417
|
return enabled;
|
@@ -442,8 +435,18 @@ ossl_fips_mode_get(VALUE self)
|
|
442
435
|
static VALUE
|
443
436
|
ossl_fips_mode_set(VALUE self, VALUE enabled)
|
444
437
|
{
|
445
|
-
|
446
|
-
|
438
|
+
#if OSSL_OPENSSL_PREREQ(3, 0, 0)
|
439
|
+
if (RTEST(enabled)) {
|
440
|
+
if (!EVP_default_properties_enable_fips(NULL, 1)) {
|
441
|
+
ossl_raise(eOSSLError, "Turning on FIPS mode failed");
|
442
|
+
}
|
443
|
+
} else {
|
444
|
+
if (!EVP_default_properties_enable_fips(NULL, 0)) {
|
445
|
+
ossl_raise(eOSSLError, "Turning off FIPS mode failed");
|
446
|
+
}
|
447
|
+
}
|
448
|
+
return enabled;
|
449
|
+
#elif defined(OPENSSL_FIPS)
|
447
450
|
if (RTEST(enabled)) {
|
448
451
|
int mode = FIPS_mode();
|
449
452
|
if(!mode && !FIPS_mode_set(1)) /* turning on twice leads to an error */
|
@@ -460,75 +463,6 @@ ossl_fips_mode_set(VALUE self, VALUE enabled)
|
|
460
463
|
#endif
|
461
464
|
}
|
462
465
|
|
463
|
-
#if defined(OSSL_DEBUG)
|
464
|
-
#if !defined(LIBRESSL_VERSION_NUMBER) && \
|
465
|
-
(OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(OPENSSL_NO_CRYPTO_MDEBUG) || \
|
466
|
-
defined(CRYPTO_malloc_debug_init))
|
467
|
-
/*
|
468
|
-
* call-seq:
|
469
|
-
* OpenSSL.mem_check_start -> nil
|
470
|
-
*
|
471
|
-
* Calls CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON). Starts tracking memory
|
472
|
-
* allocations. See also OpenSSL.print_mem_leaks.
|
473
|
-
*
|
474
|
-
* This is available only when built with a capable OpenSSL and --enable-debug
|
475
|
-
* configure option.
|
476
|
-
*/
|
477
|
-
static VALUE
|
478
|
-
mem_check_start(VALUE self)
|
479
|
-
{
|
480
|
-
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
|
481
|
-
return Qnil;
|
482
|
-
}
|
483
|
-
|
484
|
-
/*
|
485
|
-
* call-seq:
|
486
|
-
* OpenSSL.print_mem_leaks -> true | false
|
487
|
-
*
|
488
|
-
* For debugging the Ruby/OpenSSL library. Calls CRYPTO_mem_leaks_fp(stderr).
|
489
|
-
* Prints detected memory leaks to standard error. This cleans the global state
|
490
|
-
* up thus you cannot use any methods of the library after calling this.
|
491
|
-
*
|
492
|
-
* Returns +true+ if leaks detected, +false+ otherwise.
|
493
|
-
*
|
494
|
-
* This is available only when built with a capable OpenSSL and --enable-debug
|
495
|
-
* configure option.
|
496
|
-
*
|
497
|
-
* === Example
|
498
|
-
* OpenSSL.mem_check_start
|
499
|
-
* NOT_GCED = OpenSSL::PKey::RSA.new(256)
|
500
|
-
*
|
501
|
-
* END {
|
502
|
-
* GC.start
|
503
|
-
* OpenSSL.print_mem_leaks # will print the leakage
|
504
|
-
* }
|
505
|
-
*/
|
506
|
-
static VALUE
|
507
|
-
print_mem_leaks(VALUE self)
|
508
|
-
{
|
509
|
-
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
510
|
-
int ret;
|
511
|
-
#endif
|
512
|
-
|
513
|
-
#ifndef HAVE_RB_EXT_RACTOR_SAFE
|
514
|
-
// for Ruby 2.x
|
515
|
-
void ossl_bn_ctx_free(void); // ossl_bn.c
|
516
|
-
ossl_bn_ctx_free();
|
517
|
-
#endif
|
518
|
-
|
519
|
-
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
520
|
-
ret = CRYPTO_mem_leaks_fp(stderr);
|
521
|
-
if (ret < 0)
|
522
|
-
ossl_raise(eOSSLError, "CRYPTO_mem_leaks_fp");
|
523
|
-
return ret ? Qfalse : Qtrue;
|
524
|
-
#else
|
525
|
-
CRYPTO_mem_leaks_fp(stderr);
|
526
|
-
return Qnil;
|
527
|
-
#endif
|
528
|
-
}
|
529
|
-
#endif
|
530
|
-
#endif
|
531
|
-
|
532
466
|
#if !defined(HAVE_OPENSSL_110_THREADING_API)
|
533
467
|
/**
|
534
468
|
* Stores locks needed for OpenSSL thread safety
|
@@ -671,23 +605,21 @@ ossl_crypto_fixed_length_secure_compare(VALUE dummy, VALUE str1, VALUE str2)
|
|
671
605
|
*
|
672
606
|
* key = OpenSSL::PKey::RSA.new 2048
|
673
607
|
*
|
674
|
-
*
|
675
|
-
*
|
608
|
+
* File.write 'private_key.pem', key.private_to_pem
|
609
|
+
* File.write 'public_key.pem', key.public_to_pem
|
676
610
|
*
|
677
611
|
* === Exporting a Key
|
678
612
|
*
|
679
613
|
* Keys saved to disk without encryption are not secure as anyone who gets
|
680
614
|
* ahold of the key may use it unless it is encrypted. In order to securely
|
681
|
-
* export a key you may export it with a
|
615
|
+
* export a key you may export it with a password.
|
682
616
|
*
|
683
617
|
* cipher = OpenSSL::Cipher.new 'aes-256-cbc'
|
684
|
-
*
|
618
|
+
* password = 'my secure password goes here'
|
685
619
|
*
|
686
|
-
* key_secure = key.
|
620
|
+
* key_secure = key.private_to_pem cipher, password
|
687
621
|
*
|
688
|
-
*
|
689
|
-
* io.write key_secure
|
690
|
-
* end
|
622
|
+
* File.write 'private.secure.pem', key_secure
|
691
623
|
*
|
692
624
|
* OpenSSL::Cipher.ciphers returns a list of available ciphers.
|
693
625
|
*
|
@@ -707,13 +639,13 @@ ossl_crypto_fixed_length_secure_compare(VALUE dummy, VALUE str1, VALUE str2)
|
|
707
639
|
*
|
708
640
|
* === Loading an Encrypted Key
|
709
641
|
*
|
710
|
-
* OpenSSL will prompt you for your
|
711
|
-
* If you will not be able to type in the
|
642
|
+
* OpenSSL will prompt you for your password when loading an encrypted key.
|
643
|
+
* If you will not be able to type in the password you may provide it when
|
712
644
|
* loading the key:
|
713
645
|
*
|
714
646
|
* key4_pem = File.read 'private.secure.pem'
|
715
|
-
*
|
716
|
-
* key4 = OpenSSL::PKey.read key4_pem,
|
647
|
+
* password = 'my secure password goes here'
|
648
|
+
* key4 = OpenSSL::PKey.read key4_pem, password
|
717
649
|
*
|
718
650
|
* == RSA Encryption
|
719
651
|
*
|
@@ -829,45 +761,6 @@ ossl_crypto_fixed_length_secure_compare(VALUE dummy, VALUE str1, VALUE str2)
|
|
829
761
|
* decrypted = cipher.update encrypted
|
830
762
|
* decrypted << cipher.final
|
831
763
|
*
|
832
|
-
* == PKCS #5 Password-based Encryption
|
833
|
-
*
|
834
|
-
* PKCS #5 is a password-based encryption standard documented at
|
835
|
-
* RFC2898[http://www.ietf.org/rfc/rfc2898.txt]. It allows a short password or
|
836
|
-
* passphrase to be used to create a secure encryption key. If possible, PBKDF2
|
837
|
-
* as described above should be used if the circumstances allow it.
|
838
|
-
*
|
839
|
-
* PKCS #5 uses a Cipher, a pass phrase and a salt to generate an encryption
|
840
|
-
* key.
|
841
|
-
*
|
842
|
-
* pass_phrase = 'my secure pass phrase goes here'
|
843
|
-
* salt = '8 octets'
|
844
|
-
*
|
845
|
-
* === Encryption
|
846
|
-
*
|
847
|
-
* First set up the cipher for encryption
|
848
|
-
*
|
849
|
-
* encryptor = OpenSSL::Cipher.new 'aes-256-cbc'
|
850
|
-
* encryptor.encrypt
|
851
|
-
* encryptor.pkcs5_keyivgen pass_phrase, salt
|
852
|
-
*
|
853
|
-
* Then pass the data you want to encrypt through
|
854
|
-
*
|
855
|
-
* encrypted = encryptor.update 'top secret document'
|
856
|
-
* encrypted << encryptor.final
|
857
|
-
*
|
858
|
-
* === Decryption
|
859
|
-
*
|
860
|
-
* Use a new Cipher instance set up for decryption
|
861
|
-
*
|
862
|
-
* decryptor = OpenSSL::Cipher.new 'aes-256-cbc'
|
863
|
-
* decryptor.decrypt
|
864
|
-
* decryptor.pkcs5_keyivgen pass_phrase, salt
|
865
|
-
*
|
866
|
-
* Then pass the data you want to decrypt through
|
867
|
-
*
|
868
|
-
* plain = decryptor.update encrypted
|
869
|
-
* plain << decryptor.final
|
870
|
-
*
|
871
764
|
* == X509 Certificates
|
872
765
|
*
|
873
766
|
* === Creating a Certificate
|
@@ -945,12 +838,12 @@ ossl_crypto_fixed_length_secure_compare(VALUE dummy, VALUE str1, VALUE str2)
|
|
945
838
|
* not readable by other users.
|
946
839
|
*
|
947
840
|
* ca_key = OpenSSL::PKey::RSA.new 2048
|
948
|
-
*
|
841
|
+
* password = 'my secure password goes here'
|
949
842
|
*
|
950
|
-
* cipher =
|
843
|
+
* cipher = 'aes-256-cbc'
|
951
844
|
*
|
952
845
|
* open 'ca_key.pem', 'w', 0400 do |io|
|
953
|
-
* io.write ca_key.
|
846
|
+
* io.write ca_key.private_to_pem(cipher, password)
|
954
847
|
* end
|
955
848
|
*
|
956
849
|
* === CA Certificate
|
@@ -1170,8 +1063,8 @@ Init_openssl(void)
|
|
1170
1063
|
/*
|
1171
1064
|
* Init main module
|
1172
1065
|
*/
|
1173
|
-
mOSSL = rb_define_module("OpenSSL");
|
1174
1066
|
rb_global_variable(&mOSSL);
|
1067
|
+
mOSSL = rb_define_module("OpenSSL");
|
1175
1068
|
rb_define_singleton_method(mOSSL, "fixed_length_secure_compare", ossl_crypto_fixed_length_secure_compare, 2);
|
1176
1069
|
|
1177
1070
|
/*
|
@@ -1190,15 +1083,35 @@ Init_openssl(void)
|
|
1190
1083
|
|
1191
1084
|
/*
|
1192
1085
|
* Version number of OpenSSL the ruby OpenSSL extension was built with
|
1193
|
-
* (base 16)
|
1086
|
+
* (base 16). The formats are below.
|
1087
|
+
*
|
1088
|
+
* [OpenSSL 3] <tt>0xMNN00PP0 (major minor 00 patch 0)</tt>
|
1089
|
+
* [OpenSSL before 3] <tt>0xMNNFFPPS (major minor fix patch status)</tt>
|
1090
|
+
* [LibreSSL] <tt>0x20000000 (fixed value)</tt>
|
1091
|
+
*
|
1092
|
+
* See also the man page OPENSSL_VERSION_NUMBER(3).
|
1194
1093
|
*/
|
1195
1094
|
rb_define_const(mOSSL, "OPENSSL_VERSION_NUMBER", INT2NUM(OPENSSL_VERSION_NUMBER));
|
1196
1095
|
|
1096
|
+
#if defined(LIBRESSL_VERSION_NUMBER)
|
1097
|
+
/*
|
1098
|
+
* Version number of LibreSSL the ruby OpenSSL extension was built with
|
1099
|
+
* (base 16). The format is <tt>0xMNNFF00f (major minor fix 00
|
1100
|
+
* status)</tt>. This constant is only defined in LibreSSL cases.
|
1101
|
+
*
|
1102
|
+
* See also the man page LIBRESSL_VERSION_NUMBER(3).
|
1103
|
+
*/
|
1104
|
+
rb_define_const(mOSSL, "LIBRESSL_VERSION_NUMBER", INT2NUM(LIBRESSL_VERSION_NUMBER));
|
1105
|
+
#endif
|
1106
|
+
|
1197
1107
|
/*
|
1198
1108
|
* Boolean indicating whether OpenSSL is FIPS-capable or not
|
1199
1109
|
*/
|
1200
1110
|
rb_define_const(mOSSL, "OPENSSL_FIPS",
|
1201
|
-
|
1111
|
+
/* OpenSSL 3 is FIPS-capable even when it is installed without fips option */
|
1112
|
+
#if OSSL_OPENSSL_PREREQ(3, 0, 0)
|
1113
|
+
Qtrue
|
1114
|
+
#elif defined(OPENSSL_FIPS)
|
1202
1115
|
Qtrue
|
1203
1116
|
#else
|
1204
1117
|
Qfalse
|
@@ -1208,12 +1121,12 @@ Init_openssl(void)
|
|
1208
1121
|
rb_define_module_function(mOSSL, "fips_mode", ossl_fips_mode_get, 0);
|
1209
1122
|
rb_define_module_function(mOSSL, "fips_mode=", ossl_fips_mode_set, 1);
|
1210
1123
|
|
1124
|
+
rb_global_variable(&eOSSLError);
|
1211
1125
|
/*
|
1212
1126
|
* Generic error,
|
1213
1127
|
* common for all classes under OpenSSL module
|
1214
1128
|
*/
|
1215
1129
|
eOSSLError = rb_define_class_under(mOSSL,"OpenSSLError",rb_eStandardError);
|
1216
|
-
rb_global_variable(&eOSSLError);
|
1217
1130
|
|
1218
1131
|
/*
|
1219
1132
|
* Init debug core
|
@@ -1254,42 +1167,7 @@ Init_openssl(void)
|
|
1254
1167
|
Init_ossl_x509();
|
1255
1168
|
Init_ossl_ocsp();
|
1256
1169
|
Init_ossl_engine();
|
1170
|
+
Init_ossl_provider();
|
1257
1171
|
Init_ossl_asn1();
|
1258
1172
|
Init_ossl_kdf();
|
1259
|
-
|
1260
|
-
#if defined(OSSL_DEBUG)
|
1261
|
-
/*
|
1262
|
-
* For debugging Ruby/OpenSSL. Enable only when built with --enable-debug
|
1263
|
-
*/
|
1264
|
-
#if !defined(LIBRESSL_VERSION_NUMBER) && \
|
1265
|
-
(OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(OPENSSL_NO_CRYPTO_MDEBUG) || \
|
1266
|
-
defined(CRYPTO_malloc_debug_init))
|
1267
|
-
rb_define_module_function(mOSSL, "mem_check_start", mem_check_start, 0);
|
1268
|
-
rb_define_module_function(mOSSL, "print_mem_leaks", print_mem_leaks, 0);
|
1269
|
-
|
1270
|
-
#if defined(CRYPTO_malloc_debug_init) /* <= 1.0.2 */
|
1271
|
-
CRYPTO_malloc_debug_init();
|
1272
|
-
#endif
|
1273
|
-
|
1274
|
-
#if defined(V_CRYPTO_MDEBUG_ALL) /* <= 1.0.2 */
|
1275
|
-
CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
|
1276
|
-
#endif
|
1277
|
-
|
1278
|
-
#if OPENSSL_VERSION_NUMBER < 0x10100000 /* <= 1.0.2 */
|
1279
|
-
{
|
1280
|
-
int i;
|
1281
|
-
/*
|
1282
|
-
* See crypto/ex_data.c; call def_get_class() immediately to avoid
|
1283
|
-
* allocations. 15 is the maximum number that is used as the class index
|
1284
|
-
* in OpenSSL 1.0.2.
|
1285
|
-
*/
|
1286
|
-
for (i = 0; i <= 15; i++) {
|
1287
|
-
if (CRYPTO_get_ex_new_index(i, 0, (void *)"ossl-mdebug-dummy", 0, 0, 0) < 0)
|
1288
|
-
rb_raise(rb_eRuntimeError, "CRYPTO_get_ex_new_index for "
|
1289
|
-
"class index %d failed", i);
|
1290
|
-
}
|
1291
|
-
}
|
1292
|
-
#endif
|
1293
|
-
#endif
|
1294
|
-
#endif
|
1295
1173
|
}
|
data/ext/openssl/ossl.h
CHANGED
@@ -62,6 +62,10 @@
|
|
62
62
|
# define OSSL_USE_ENGINE
|
63
63
|
#endif
|
64
64
|
|
65
|
+
#if OSSL_OPENSSL_PREREQ(3, 0, 0)
|
66
|
+
# define OSSL_USE_PROVIDER
|
67
|
+
#endif
|
68
|
+
|
65
69
|
/*
|
66
70
|
* Common Module
|
67
71
|
*/
|
@@ -157,7 +161,6 @@ VALUE ossl_to_der_if_possible(VALUE);
|
|
157
161
|
*/
|
158
162
|
extern VALUE dOSSL;
|
159
163
|
|
160
|
-
#if defined(HAVE_VA_ARGS_MACRO)
|
161
164
|
#define OSSL_Debug(...) do { \
|
162
165
|
if (dOSSL == Qtrue) { \
|
163
166
|
fprintf(stderr, "OSSL_DEBUG: "); \
|
@@ -166,11 +169,6 @@ extern VALUE dOSSL;
|
|
166
169
|
} \
|
167
170
|
} while (0)
|
168
171
|
|
169
|
-
#else
|
170
|
-
void ossl_debug(const char *, ...);
|
171
|
-
#define OSSL_Debug ossl_debug
|
172
|
-
#endif
|
173
|
-
|
174
172
|
/*
|
175
173
|
* Include all parts
|
176
174
|
*/
|
@@ -194,6 +192,7 @@ void ossl_debug(const char *, ...);
|
|
194
192
|
#endif
|
195
193
|
#include "ossl_x509.h"
|
196
194
|
#include "ossl_engine.h"
|
195
|
+
#include "ossl_provider.h"
|
197
196
|
#include "ossl_kdf.h"
|
198
197
|
|
199
198
|
void Init_openssl(void);
|