openssl 2.1.4 → 2.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/CONTRIBUTING.md +9 -7
- data/History.md +68 -37
- data/README.md +2 -2
- data/ext/openssl/extconf.rb +43 -41
- data/ext/openssl/openssl_missing.h +36 -1
- data/ext/openssl/ossl.c +49 -23
- data/ext/openssl/ossl.h +7 -4
- data/ext/openssl/ossl_asn1.c +25 -0
- data/ext/openssl/ossl_bn.c +16 -23
- data/ext/openssl/ossl_cipher.c +33 -24
- data/ext/openssl/ossl_digest.c +18 -57
- data/ext/openssl/ossl_engine.c +2 -12
- data/ext/openssl/ossl_hmac.c +5 -11
- data/ext/openssl/ossl_kdf.c +3 -19
- data/ext/openssl/ossl_ns_spki.c +1 -1
- data/ext/openssl/ossl_ocsp.c +6 -11
- data/ext/openssl/ossl_ocsp.h +3 -3
- data/ext/openssl/ossl_pkcs7.c +3 -19
- data/ext/openssl/ossl_pkcs7.h +16 -0
- data/ext/openssl/ossl_pkey.c +180 -14
- data/ext/openssl/ossl_pkey_dsa.c +2 -2
- data/ext/openssl/ossl_pkey_ec.c +37 -8
- data/ext/openssl/ossl_pkey_rsa.c +17 -9
- data/ext/openssl/ossl_rand.c +2 -32
- data/ext/openssl/ossl_ssl.c +78 -72
- data/ext/openssl/ossl_ts.c +1514 -0
- data/ext/openssl/ossl_ts.h +16 -0
- data/ext/openssl/ossl_x509cert.c +2 -2
- data/ext/openssl/ossl_x509ext.c +14 -0
- data/ext/openssl/ossl_x509name.c +7 -3
- data/ext/openssl/ossl_x509store.c +20 -39
- data/lib/openssl/bn.rb +1 -1
- data/lib/openssl/buffering.rb +28 -5
- data/lib/openssl/cipher.rb +1 -1
- data/lib/openssl/config.rb +17 -8
- data/lib/openssl/digest.rb +10 -12
- data/lib/openssl/hmac.rb +13 -0
- data/lib/openssl/marshal.rb +30 -0
- data/lib/openssl/pkcs5.rb +1 -1
- data/lib/openssl/pkey.rb +18 -1
- data/lib/openssl/ssl.rb +40 -2
- data/lib/openssl/version.rb +5 -0
- data/lib/openssl/x509.rb +155 -1
- data/lib/openssl.rb +25 -9
- metadata +13 -24
- data/ext/openssl/deprecation.rb +0 -27
- data/ext/openssl/ossl_version.h +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f52e266d6038d1d7173a58d9ad72207e7d492da086ef0ecf9484a8b1cac5156
|
4
|
+
data.tar.gz: ca3211e0c3887311a9d0ac997c864e0cdd54fc0c7510d04c2497c9c99b97fd0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b20ff54093b47c1d1da2f90a41ee1787bcd6a3e14c26f86f4c117d5ec6703364c73df226da5bf357ec6440770b639dd92575e468caeaf38fd8815ef52fb9864f
|
7
|
+
data.tar.gz: 6f64e438c1cc74cea40674a4d3d5926ecc3ea4a0701dd02514f990fcbcb8c525a364789f832ac649fe65e557522a9df983e5beca5f3476b3ec29f7a82b15f071
|
data/CONTRIBUTING.md
CHANGED
@@ -12,12 +12,14 @@ If you think you found a bug, file a ticket on GitHub. Please DO NOT report
|
|
12
12
|
security issues here, there is a separate procedure which is described on
|
13
13
|
["Security at ruby-lang.org"](https://www.ruby-lang.org/en/security/).
|
14
14
|
|
15
|
-
When reporting a bug, please make sure you include
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
When reporting a bug, please make sure you include:
|
16
|
+
* Ruby version
|
17
|
+
* OpenSSL gem version
|
18
|
+
* OpenSSL library version
|
19
|
+
* A sample file that illustrates the problem or link to the repository or
|
20
|
+
gem that is associated with the bug.
|
21
|
+
|
22
|
+
There are a number of unresolved issues and feature requests for openssl that
|
21
23
|
need review. Before submitting a new ticket, it is recommended to check
|
22
24
|
[known issues] and [bugs.ruby-lang.org], the previous issue tracker.
|
23
25
|
|
@@ -78,7 +80,7 @@ $ docker-compose run debug
|
|
78
80
|
```
|
79
81
|
|
80
82
|
All possible values for `RUBY_VERSION` and `OPENSSL_VERSION` can be found in
|
81
|
-
[
|
83
|
+
[`test.yml`](https://github.com/ruby/openssl/tree/master/.github/workflows/test.yml).
|
82
84
|
|
83
85
|
**NOTE**: these commands must be run from the openssl repository root, in order
|
84
86
|
to use the
|
data/History.md
CHANGED
@@ -1,47 +1,78 @@
|
|
1
|
-
Version 2.
|
1
|
+
Version 2.2.0
|
2
2
|
=============
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
* Do not use pkg-config if --with-openssl-dir option is specified.
|
8
|
-
[[GitHub #486]](https://github.com/ruby/openssl/pull/486)
|
4
|
+
Compatibility notes
|
5
|
+
-------------------
|
9
6
|
|
7
|
+
* Remove unsupported MDC2, DSS, DSS1, and SHA algorithms.
|
8
|
+
* Remove `OpenSSL::PKCS7::SignerInfo#name` alias for `#issuer`.
|
9
|
+
[[GitHub #266]](https://github.com/ruby/openssl/pull/266)
|
10
|
+
* Deprecate `OpenSSL::Config#add_value` and `#[]=` for future removal.
|
11
|
+
[[GitHub #322]](https://github.com/ruby/openssl/pull/322)
|
10
12
|
|
11
|
-
Version 2.1.3
|
12
|
-
=============
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
Notable changes
|
15
|
+
---------------
|
16
16
|
|
17
|
-
*
|
18
|
-
|
19
|
-
[[GitHub #
|
20
|
-
*
|
17
|
+
* Change default `OpenSSL::SSL::SSLServer#listen` backlog argument from
|
18
|
+
5 to `Socket::SOMAXCONN`.
|
19
|
+
[[GitHub #286]](https://github.com/ruby/openssl/issues/286)
|
20
|
+
* Make `OpenSSL::HMAC#==` use a timing safe string comparison.
|
21
|
+
[[GitHub #284]](https://github.com/ruby/openssl/pull/284)
|
22
|
+
* Add support for SHA3 and BLAKE digests.
|
23
|
+
[[GitHub #282]](https://github.com/ruby/openssl/pull/282)
|
24
|
+
* Add `OpenSSL::SSL::SSLSocket.open` for opening a `TCPSocket` and
|
25
|
+
returning an `OpenSSL::SSL::SSLSocket` for it.
|
26
|
+
[[GitHub #225]](https://github.com/ruby/openssl/issues/225)
|
27
|
+
* Support marshalling of `OpenSSL::X509` and `OpenSSL::PKey` objects.
|
28
|
+
[[GitHub #281]](https://github.com/ruby/openssl/pull/281)
|
29
|
+
[[GitHub #363]](https://github.com/ruby/openssl/pull/363)
|
30
|
+
* Add `OpenSSL.secure_compare` for timing safe string comparison for
|
31
|
+
strings of possibly unequal length.
|
32
|
+
[[GitHub #280]](https://github.com/ruby/openssl/pull/280)
|
33
|
+
* Add `OpenSSL.fixed_length_secure_compare` for timing safe string
|
34
|
+
comparison for strings of equal length.
|
35
|
+
[[GitHub #269]](https://github.com/ruby/openssl/pull/269)
|
36
|
+
* Add `OpenSSL::SSL::SSLSocket#{finished_message,peer_finished_message}`
|
37
|
+
for last finished message sent and received.
|
38
|
+
[[GitHub #250]](https://github.com/ruby/openssl/pull/250)
|
39
|
+
* Add `OpenSSL::Timestamp` module for handing timestamp requests and
|
40
|
+
responses.
|
41
|
+
[[GitHub #204]](https://github.com/ruby/openssl/pull/204)
|
42
|
+
* Add helper methods for `OpenSSL::X509::Certificate`:
|
43
|
+
`find_extension`, `subject_key_identifier`,
|
44
|
+
`authority_key_identifier`, `crl_uris`, `ca_issuer_uris` and
|
45
|
+
`ocsp_uris`, and for `OpenSSL::X509::CRL`:
|
46
|
+
`find_extension` and `subject_key_identifier`.
|
47
|
+
[[GitHub #260]](https://github.com/ruby/openssl/pull/260)
|
48
|
+
[[GitHub #275]](https://github.com/ruby/openssl/pull/275)
|
49
|
+
[[GitHub #293]](https://github.com/ruby/openssl/pull/293)
|
50
|
+
* Add `OpenSSL::ECPoint#add` for performing elliptic curve point addition.
|
51
|
+
[[GitHub #261]](https://github.com/ruby/openssl/pull/261)
|
52
|
+
* Make `OpenSSL::PKey::RSA#{export,to_der}` check `key`, `factors`, and
|
53
|
+
`crt_params` to do proper private key serialization.
|
54
|
+
[[GitHub #258]](https://github.com/ruby/openssl/pull/258)
|
55
|
+
* Add `OpenSSL::SSL::{SSLSocket,SSLServer}#fileno`, returning the
|
56
|
+
underlying socket file descriptor number.
|
57
|
+
[[GitHub #247]](https://github.com/ruby/openssl/pull/247)
|
58
|
+
* Support client certificates with TLS 1.3, and support post-handshake
|
59
|
+
authentication with OpenSSL 1.1.1+.
|
60
|
+
[[GitHub #239]](https://github.com/ruby/openssl/pull/239)
|
61
|
+
* Add `OpenSSL::ASN1::ObjectId#==` for equality testing.
|
62
|
+
* Add `OpenSSL::X509::Extension#value_der` for the raw value of
|
63
|
+
the extension.
|
64
|
+
[[GitHub #234]](https://github.com/ruby/openssl/pull/234)
|
65
|
+
* Significantly reduce allocated memory in `OpenSSL::Buffering#do_write`.
|
66
|
+
[[GitHub #212]](https://github.com/ruby/openssl/pull/212)
|
67
|
+
* Ensure all valid IPv6 addresses are considered valid as elements
|
68
|
+
of subjectAlternativeName in certificates.
|
21
69
|
[[GitHub #185]](https://github.com/ruby/openssl/pull/185)
|
22
|
-
*
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
being modified by another thread.
|
29
|
-
[[GitHub #453]](https://github.com/ruby/openssl/pull/453)
|
30
|
-
* Fix misuse of input record separator in `OpenSSL::Buffering` where it was
|
31
|
-
for output.
|
32
|
-
* Fix wrong interger casting in `OpenSSL::PKey::EC#dsa_verify_asn1`.
|
33
|
-
[[GitHub #460]](https://github.com/ruby/openssl/pull/460)
|
34
|
-
* `extconf.rb` explicitly checks that OpenSSL's version number is 1.0.1 or
|
35
|
-
newer but also less than 3.0. Ruby/OpenSSL v2.1.x and v2.2.x will not support
|
36
|
-
OpenSSL 3.0 API.
|
37
|
-
[[GitHub #458]](https://github.com/ruby/openssl/pull/458)
|
38
|
-
* Activate `digest` gem correctly. `digest` library could go into an
|
39
|
-
inconsistent state if there are multiple versions of `digest` is installed
|
40
|
-
and `openssl` is `require`d before `digest`.
|
41
|
-
[[GitHub #463]](https://github.com/ruby/openssl/pull/463)
|
42
|
-
* Fix GC.compact compatibility.
|
43
|
-
[[GitHub #464]](https://github.com/ruby/openssl/issues/464)
|
44
|
-
[[GitHub #465]](https://github.com/ruby/openssl/pull/465)
|
70
|
+
* Allow recipient's certificate to be omitted in PCKS7#decrypt.
|
71
|
+
[[GitHub #183]](https://github.com/ruby/openssl/pull/183)
|
72
|
+
* Add support for reading keys in PKCS #8 format and export via instance methods
|
73
|
+
added to `OpenSSL::PKey` classes: `private_to_der`, `private_to_pem`,
|
74
|
+
`public_to_der` and `public_to_pem`.
|
75
|
+
[[GitHub #297]](https://github.com/ruby/openssl/pull/297)
|
45
76
|
|
46
77
|
|
47
78
|
Version 2.1.2
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# OpenSSL for Ruby
|
2
2
|
|
3
|
-
[](https://github.com/ruby/openssl/actions?workflow=CI)
|
4
|
+
|
5
5
|
|
6
6
|
OpenSSL provides SSL, TLS and general purpose cryptography. It wraps the
|
7
7
|
OpenSSL library.
|
data/ext/openssl/extconf.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- coding: us-ascii -*-
|
2
|
-
# frozen_string_literal:
|
2
|
+
# frozen_string_literal: true
|
3
3
|
=begin
|
4
4
|
= Info
|
5
5
|
'OpenSSL for Ruby 2' project
|
@@ -12,16 +12,12 @@
|
|
12
12
|
=end
|
13
13
|
|
14
14
|
require "mkmf"
|
15
|
-
require File.expand_path('../deprecation', __FILE__)
|
16
15
|
|
17
|
-
|
16
|
+
dir_config("openssl")
|
18
17
|
dir_config("kerberos")
|
19
18
|
|
20
19
|
Logging::message "=== OpenSSL for Ruby configurator ===\n"
|
21
20
|
|
22
|
-
# Check with -Werror=deprecated-declarations if available
|
23
|
-
OpenSSL.deprecated_warning_flag
|
24
|
-
|
25
21
|
##
|
26
22
|
# Adds -DOSSL_DEBUG for compilation and some more targets when GCC is used
|
27
23
|
# To turn it on, use: --with-debug or --enable-debug
|
@@ -37,6 +33,15 @@ if $mswin || $mingw
|
|
37
33
|
have_library("ws2_32")
|
38
34
|
end
|
39
35
|
|
36
|
+
Logging::message "=== Checking for required stuff... ===\n"
|
37
|
+
result = pkg_config("openssl") && have_header("openssl/ssl.h")
|
38
|
+
|
39
|
+
if $mingw
|
40
|
+
append_cflags '-D_FORTIFY_SOURCE=2'
|
41
|
+
append_ldflags '-fstack-protector'
|
42
|
+
have_library 'ssp'
|
43
|
+
end
|
44
|
+
|
40
45
|
def find_openssl_library
|
41
46
|
if $mswin || $mingw
|
42
47
|
# required for static OpenSSL libraries
|
@@ -87,52 +92,42 @@ def find_openssl_library
|
|
87
92
|
return false
|
88
93
|
end
|
89
94
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
"is installed."
|
99
|
-
end
|
100
|
-
|
101
|
-
version_ok = if have_macro("LIBRESSL_VERSION_NUMBER", "openssl/opensslv.h")
|
102
|
-
is_libressl = true
|
103
|
-
checking_for("LibreSSL version >= 2.5.0") {
|
104
|
-
try_static_assert("LIBRESSL_VERSION_NUMBER >= 0x20500000L", "openssl/opensslv.h") }
|
105
|
-
else
|
106
|
-
checking_for("OpenSSL version >= 1.0.1 and < 3.0.0") {
|
107
|
-
try_static_assert("OPENSSL_VERSION_NUMBER >= 0x10001000L", "openssl/opensslv.h") &&
|
108
|
-
!try_static_assert("OPENSSL_VERSION_MAJOR >= 3", "openssl/opensslv.h") }
|
109
|
-
end
|
110
|
-
unless version_ok
|
111
|
-
raise "OpenSSL >= 1.0.1, < 3.0.0 or LibreSSL >= 2.5.0 is required"
|
95
|
+
unless result
|
96
|
+
unless find_openssl_library
|
97
|
+
Logging::message "=== Checking for required stuff failed. ===\n"
|
98
|
+
Logging::message "Makefile wasn't created. Fix the errors above.\n"
|
99
|
+
raise "OpenSSL library could not be found. You might want to use " \
|
100
|
+
"--with-openssl-dir=<dir> option to specify the prefix where OpenSSL " \
|
101
|
+
"is installed."
|
102
|
+
end
|
112
103
|
end
|
113
104
|
|
114
|
-
|
115
|
-
|
116
|
-
|
105
|
+
unless checking_for("OpenSSL version is 1.0.1 or later") {
|
106
|
+
try_static_assert("OPENSSL_VERSION_NUMBER >= 0x10001000L", "openssl/opensslv.h") }
|
107
|
+
raise "OpenSSL >= 1.0.1 or LibreSSL is required"
|
117
108
|
end
|
118
109
|
|
119
110
|
Logging::message "=== Checking for OpenSSL features... ===\n"
|
120
111
|
# compile options
|
121
112
|
have_func("RAND_egd")
|
122
|
-
engines = %w{
|
123
|
-
cswift nuron sureware ubsec padlock capi gmp gost cryptodev
|
113
|
+
engines = %w{dynamic 4758cca aep atalla chil
|
114
|
+
cswift nuron sureware ubsec padlock capi gmp gost cryptodev}
|
124
115
|
engines.each { |name|
|
125
|
-
|
116
|
+
have_func("ENGINE_load_#{name}()", "openssl/engine.h")
|
126
117
|
}
|
127
118
|
|
119
|
+
if ($mswin || $mingw) && have_macro("LIBRESSL_VERSION_NUMBER", "openssl/opensslv.h")
|
120
|
+
$defs.push("-DNOCRYPT")
|
121
|
+
end
|
122
|
+
|
128
123
|
# added in 1.0.2
|
129
124
|
have_func("EC_curve_nist2nid")
|
130
125
|
have_func("X509_REVOKED_dup")
|
131
126
|
have_func("X509_STORE_CTX_get0_store")
|
132
127
|
have_func("SSL_CTX_set_alpn_select_cb")
|
133
|
-
|
134
|
-
|
135
|
-
|
128
|
+
have_func("SSL_CTX_set1_curves_list(NULL, NULL)", "openssl/ssl.h")
|
129
|
+
have_func("SSL_CTX_set_ecdh_auto(NULL, 0)", "openssl/ssl.h")
|
130
|
+
have_func("SSL_get_server_tmp_key(NULL, NULL)", "openssl/ssl.h")
|
136
131
|
have_func("SSL_is_server")
|
137
132
|
|
138
133
|
# added in 1.1.0
|
@@ -148,9 +143,9 @@ have_func("EVP_MD_CTX_new")
|
|
148
143
|
have_func("EVP_MD_CTX_free")
|
149
144
|
have_func("HMAC_CTX_new")
|
150
145
|
have_func("HMAC_CTX_free")
|
151
|
-
OpenSSL.check_func("RAND_pseudo_bytes", "openssl/rand.h") # deprecated
|
152
146
|
have_func("X509_STORE_get_ex_data")
|
153
147
|
have_func("X509_STORE_set_ex_data")
|
148
|
+
have_func("X509_STORE_get_ex_new_index")
|
154
149
|
have_func("X509_CRL_get0_signature")
|
155
150
|
have_func("X509_REQ_get0_signature")
|
156
151
|
have_func("X509_REVOKED_get0_serialNumber")
|
@@ -166,16 +161,23 @@ have_func("X509_CRL_up_ref")
|
|
166
161
|
have_func("X509_STORE_up_ref")
|
167
162
|
have_func("SSL_SESSION_up_ref")
|
168
163
|
have_func("EVP_PKEY_up_ref")
|
169
|
-
|
170
|
-
|
164
|
+
have_func("SSL_CTX_set_tmp_ecdh_callback(NULL, NULL)", "openssl/ssl.h") # removed
|
165
|
+
have_func("SSL_CTX_set_min_proto_version(NULL, 0)", "openssl/ssl.h")
|
171
166
|
have_func("SSL_CTX_get_security_level")
|
172
167
|
have_func("X509_get0_notBefore")
|
173
168
|
have_func("SSL_SESSION_get_protocol_version")
|
169
|
+
have_func("TS_STATUS_INFO_get0_status")
|
170
|
+
have_func("TS_STATUS_INFO_get0_text")
|
171
|
+
have_func("TS_STATUS_INFO_get0_failure_info")
|
172
|
+
have_func("TS_VERIFY_CTS_set_certs")
|
173
|
+
have_func("TS_VERIFY_CTX_set_store")
|
174
|
+
have_func("TS_VERIFY_CTX_add_flags")
|
175
|
+
have_func("TS_RESP_CTX_set_time_cb")
|
174
176
|
have_func("EVP_PBE_scrypt")
|
177
|
+
have_func("SSL_CTX_set_post_handshake_auth")
|
175
178
|
|
176
179
|
Logging::message "=== Checking done. ===\n"
|
177
180
|
|
178
181
|
create_header
|
179
|
-
OpenSSL.restore_warning_flag
|
180
182
|
create_makefile("openssl")
|
181
183
|
Logging::message "Done.\n"
|
@@ -72,6 +72,9 @@ void ossl_HMAC_CTX_free(HMAC_CTX *);
|
|
72
72
|
#if !defined(HAVE_X509_STORE_SET_EX_DATA)
|
73
73
|
# define X509_STORE_set_ex_data(x, idx, data) \
|
74
74
|
CRYPTO_set_ex_data(&(x)->ex_data, (idx), (data))
|
75
|
+
#endif
|
76
|
+
|
77
|
+
#if !defined(HAVE_X509_STORE_GET_EX_NEW_INDEX) && !defined(X509_STORE_get_ex_new_index)
|
75
78
|
# define X509_STORE_get_ex_new_index(l, p, newf, dupf, freef) \
|
76
79
|
CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE, (l), (p), \
|
77
80
|
(newf), (dupf), (freef))
|
@@ -144,7 +147,8 @@ void ossl_X509_REQ_get0_signature(const X509_REQ *, const ASN1_BIT_STRING **, co
|
|
144
147
|
CRYPTO_add(&(x)->references, 1, CRYPTO_LOCK_EVP_PKEY);
|
145
148
|
#endif
|
146
149
|
|
147
|
-
#if !defined(HAVE_OPAQUE_OPENSSL)
|
150
|
+
#if !defined(HAVE_OPAQUE_OPENSSL) && \
|
151
|
+
(!defined(LIBRESSL_VERSION_NUMBER) || LIBRESSL_VERSION_NUMBER < 0x2070000fL)
|
148
152
|
#define IMPL_PKEY_GETTER(_type, _name) \
|
149
153
|
static inline _type *EVP_PKEY_get0_##_type(EVP_PKEY *pkey) { \
|
150
154
|
return pkey->pkey._name; }
|
@@ -219,4 +223,35 @@ IMPL_PKEY_GETTER(EC_KEY, ec)
|
|
219
223
|
# define SSL_SESSION_get_protocol_version(s) ((s)->ssl_version)
|
220
224
|
#endif
|
221
225
|
|
226
|
+
#if !defined(HAVE_TS_STATUS_INFO_GET0_STATUS)
|
227
|
+
# define TS_STATUS_INFO_get0_status(a) ((a)->status)
|
228
|
+
#endif
|
229
|
+
|
230
|
+
#if !defined(HAVE_TS_STATUS_INFO_GET0_TEXT)
|
231
|
+
# define TS_STATUS_INFO_get0_text(a) ((a)->text)
|
232
|
+
#endif
|
233
|
+
|
234
|
+
#if !defined(HAVE_TS_STATUS_INFO_GET0_FAILURE_INFO)
|
235
|
+
# define TS_STATUS_INFO_get0_failure_info(a) ((a)->failure_info)
|
236
|
+
#endif
|
237
|
+
|
238
|
+
#if !defined(HAVE_TS_VERIFY_CTS_SET_CERTS)
|
239
|
+
# define TS_VERIFY_CTS_set_certs(ctx, crts) ((ctx)->certs=(crts))
|
240
|
+
#endif
|
241
|
+
|
242
|
+
#if !defined(HAVE_TS_VERIFY_CTX_SET_STORE)
|
243
|
+
# define TS_VERIFY_CTX_set_store(ctx, str) ((ctx)->store=(str))
|
244
|
+
#endif
|
245
|
+
|
246
|
+
#if !defined(HAVE_TS_VERIFY_CTX_ADD_FLAGS)
|
247
|
+
# define TS_VERIFY_CTX_add_flags(ctx, f) ((ctx)->flags |= (f))
|
248
|
+
#endif
|
249
|
+
|
250
|
+
#if !defined(HAVE_TS_RESP_CTX_SET_TIME_CB)
|
251
|
+
# define TS_RESP_CTX_set_time_cb(ctx, callback, dta) do { \
|
252
|
+
(ctx)->time_cb = (callback); \
|
253
|
+
(ctx)->time_cb_data = (dta); \
|
254
|
+
} while (0)
|
255
|
+
#endif
|
256
|
+
|
222
257
|
#endif /* _OSSL_OPENSSL_MISSING_H_ */
|
data/ext/openssl/ossl.c
CHANGED
@@ -604,6 +604,35 @@ static void Init_ossl_locks(void)
|
|
604
604
|
}
|
605
605
|
#endif /* !HAVE_OPENSSL_110_THREADING_API */
|
606
606
|
|
607
|
+
/*
|
608
|
+
* call-seq:
|
609
|
+
* OpenSSL.fixed_length_secure_compare(string, string) -> boolean
|
610
|
+
*
|
611
|
+
* Constant time memory comparison for fixed length strings, such as results
|
612
|
+
* of HMAC calculations.
|
613
|
+
*
|
614
|
+
* Returns +true+ if the strings are identical, +false+ if they are of the same
|
615
|
+
* length but not identical. If the length is different, +ArgumentError+ is
|
616
|
+
* raised.
|
617
|
+
*/
|
618
|
+
static VALUE
|
619
|
+
ossl_crypto_fixed_length_secure_compare(VALUE dummy, VALUE str1, VALUE str2)
|
620
|
+
{
|
621
|
+
const unsigned char *p1 = (const unsigned char *)StringValuePtr(str1);
|
622
|
+
const unsigned char *p2 = (const unsigned char *)StringValuePtr(str2);
|
623
|
+
long len1 = RSTRING_LEN(str1);
|
624
|
+
long len2 = RSTRING_LEN(str2);
|
625
|
+
|
626
|
+
if (len1 != len2) {
|
627
|
+
ossl_raise(rb_eArgError, "inputs must be of equal length");
|
628
|
+
}
|
629
|
+
|
630
|
+
switch (CRYPTO_memcmp(p1, p2, len1)) {
|
631
|
+
case 0: return Qtrue;
|
632
|
+
default: return Qfalse;
|
633
|
+
}
|
634
|
+
}
|
635
|
+
|
607
636
|
/*
|
608
637
|
* OpenSSL provides SSL, TLS and general purpose cryptography. It wraps the
|
609
638
|
* OpenSSL[https://www.openssl.org/] library.
|
@@ -635,7 +664,7 @@ static void Init_ossl_locks(void)
|
|
635
664
|
* ahold of the key may use it unless it is encrypted. In order to securely
|
636
665
|
* export a key you may export it with a pass phrase.
|
637
666
|
*
|
638
|
-
* cipher = OpenSSL::Cipher.new 'AES-
|
667
|
+
* cipher = OpenSSL::Cipher.new 'AES-256-CBC'
|
639
668
|
* pass_phrase = 'my secure pass phrase goes here'
|
640
669
|
*
|
641
670
|
* key_secure = key.export cipher, pass_phrase
|
@@ -710,16 +739,14 @@ static void Init_ossl_locks(void)
|
|
710
739
|
* To sign a document, a cryptographically secure hash of the document is
|
711
740
|
* computed first, which is then signed using the private key.
|
712
741
|
*
|
713
|
-
*
|
714
|
-
* signature = key.sign digest, document
|
742
|
+
* signature = key.sign 'SHA256', document
|
715
743
|
*
|
716
744
|
* To validate the signature, again a hash of the document is computed and
|
717
745
|
* the signature is decrypted using the public key. The result is then
|
718
746
|
* compared to the hash just computed, if they are equal the signature was
|
719
747
|
* valid.
|
720
748
|
*
|
721
|
-
*
|
722
|
-
* if key.verify digest, signature, document
|
749
|
+
* if key.verify 'SHA256', signature, document
|
723
750
|
* puts 'Valid'
|
724
751
|
* else
|
725
752
|
* puts 'Invalid'
|
@@ -745,7 +772,7 @@ static void Init_ossl_locks(void)
|
|
745
772
|
* using PBKDF2. PKCS #5 v2.0 recommends at least 8 bytes for the salt,
|
746
773
|
* the number of iterations largely depends on the hardware being used.
|
747
774
|
*
|
748
|
-
* cipher = OpenSSL::Cipher.new 'AES-
|
775
|
+
* cipher = OpenSSL::Cipher.new 'AES-256-CBC'
|
749
776
|
* cipher.encrypt
|
750
777
|
* iv = cipher.random_iv
|
751
778
|
*
|
@@ -753,7 +780,7 @@ static void Init_ossl_locks(void)
|
|
753
780
|
* salt = OpenSSL::Random.random_bytes 16
|
754
781
|
* iter = 20000
|
755
782
|
* key_len = cipher.key_len
|
756
|
-
* digest = OpenSSL::Digest
|
783
|
+
* digest = OpenSSL::Digest.new('SHA256')
|
757
784
|
*
|
758
785
|
* key = OpenSSL::PKCS5.pbkdf2_hmac(pwd, salt, iter, key_len, digest)
|
759
786
|
* cipher.key = key
|
@@ -768,7 +795,7 @@ static void Init_ossl_locks(void)
|
|
768
795
|
* Use the same steps as before to derive the symmetric AES key, this time
|
769
796
|
* setting the Cipher up for decryption.
|
770
797
|
*
|
771
|
-
* cipher = OpenSSL::Cipher.new 'AES-
|
798
|
+
* cipher = OpenSSL::Cipher.new 'AES-256-CBC'
|
772
799
|
* cipher.decrypt
|
773
800
|
* cipher.iv = iv # the one generated with #random_iv
|
774
801
|
*
|
@@ -776,7 +803,7 @@ static void Init_ossl_locks(void)
|
|
776
803
|
* salt = ... # the one generated above
|
777
804
|
* iter = 20000
|
778
805
|
* key_len = cipher.key_len
|
779
|
-
* digest = OpenSSL::Digest
|
806
|
+
* digest = OpenSSL::Digest.new('SHA256')
|
780
807
|
*
|
781
808
|
* key = OpenSSL::PKCS5.pbkdf2_hmac(pwd, salt, iter, key_len, digest)
|
782
809
|
* cipher.key = key
|
@@ -803,7 +830,7 @@ static void Init_ossl_locks(void)
|
|
803
830
|
*
|
804
831
|
* First set up the cipher for encryption
|
805
832
|
*
|
806
|
-
* encryptor = OpenSSL::Cipher.new 'AES-
|
833
|
+
* encryptor = OpenSSL::Cipher.new 'AES-256-CBC'
|
807
834
|
* encryptor.encrypt
|
808
835
|
* encryptor.pkcs5_keyivgen pass_phrase, salt
|
809
836
|
*
|
@@ -816,7 +843,7 @@ static void Init_ossl_locks(void)
|
|
816
843
|
*
|
817
844
|
* Use a new Cipher instance set up for decryption
|
818
845
|
*
|
819
|
-
* decryptor = OpenSSL::Cipher.new 'AES-
|
846
|
+
* decryptor = OpenSSL::Cipher.new 'AES-256-CBC'
|
820
847
|
* decryptor.decrypt
|
821
848
|
* decryptor.pkcs5_keyivgen pass_phrase, salt
|
822
849
|
*
|
@@ -833,7 +860,7 @@ static void Init_ossl_locks(void)
|
|
833
860
|
* signature.
|
834
861
|
*
|
835
862
|
* key = OpenSSL::PKey::RSA.new 2048
|
836
|
-
* name = OpenSSL::X509::Name.parse 'CN=nobody/DC=example'
|
863
|
+
* name = OpenSSL::X509::Name.parse '/CN=nobody/DC=example'
|
837
864
|
*
|
838
865
|
* cert = OpenSSL::X509::Certificate.new
|
839
866
|
* cert.version = 2
|
@@ -872,7 +899,7 @@ static void Init_ossl_locks(void)
|
|
872
899
|
* certificate.
|
873
900
|
*
|
874
901
|
* cert.issuer = name
|
875
|
-
* cert.sign key, OpenSSL::Digest
|
902
|
+
* cert.sign key, OpenSSL::Digest.new('SHA1')
|
876
903
|
*
|
877
904
|
* open 'certificate.pem', 'w' do |io| io.write cert.to_pem end
|
878
905
|
*
|
@@ -904,7 +931,7 @@ static void Init_ossl_locks(void)
|
|
904
931
|
* ca_key = OpenSSL::PKey::RSA.new 2048
|
905
932
|
* pass_phrase = 'my secure pass phrase goes here'
|
906
933
|
*
|
907
|
-
* cipher = OpenSSL::Cipher.new 'AES-
|
934
|
+
* cipher = OpenSSL::Cipher.new 'AES-256-CBC'
|
908
935
|
*
|
909
936
|
* open 'ca_key.pem', 'w', 0400 do |io|
|
910
937
|
* io.write ca_key.export(cipher, pass_phrase)
|
@@ -915,7 +942,7 @@ static void Init_ossl_locks(void)
|
|
915
942
|
* A CA certificate is created the same way we created a certificate above, but
|
916
943
|
* with different extensions.
|
917
944
|
*
|
918
|
-
* ca_name = OpenSSL::X509::Name.parse 'CN=ca/DC=example'
|
945
|
+
* ca_name = OpenSSL::X509::Name.parse '/CN=ca/DC=example'
|
919
946
|
*
|
920
947
|
* ca_cert = OpenSSL::X509::Certificate.new
|
921
948
|
* ca_cert.serial = 0
|
@@ -948,7 +975,7 @@ static void Init_ossl_locks(void)
|
|
948
975
|
*
|
949
976
|
* Root CA certificates are self-signed.
|
950
977
|
*
|
951
|
-
* ca_cert.sign ca_key, OpenSSL::Digest
|
978
|
+
* ca_cert.sign ca_key, OpenSSL::Digest.new('SHA1')
|
952
979
|
*
|
953
980
|
* The CA certificate is saved to disk so it may be distributed to all the
|
954
981
|
* users of the keys this CA will sign.
|
@@ -966,7 +993,7 @@ static void Init_ossl_locks(void)
|
|
966
993
|
* csr.version = 0
|
967
994
|
* csr.subject = name
|
968
995
|
* csr.public_key = key.public_key
|
969
|
-
* csr.sign key, OpenSSL::Digest
|
996
|
+
* csr.sign key, OpenSSL::Digest.new('SHA1')
|
970
997
|
*
|
971
998
|
* A CSR is saved to disk and sent to the CA for signing.
|
972
999
|
*
|
@@ -1010,7 +1037,7 @@ static void Init_ossl_locks(void)
|
|
1010
1037
|
* csr_cert.add_extension \
|
1011
1038
|
* extension_factory.create_extension('subjectKeyIdentifier', 'hash')
|
1012
1039
|
*
|
1013
|
-
* csr_cert.sign ca_key, OpenSSL::Digest
|
1040
|
+
* csr_cert.sign ca_key, OpenSSL::Digest.new('SHA1')
|
1014
1041
|
*
|
1015
1042
|
* open 'csr_cert.pem', 'w' do |io|
|
1016
1043
|
* io.write csr_cert.to_pem
|
@@ -1125,11 +1152,7 @@ Init_openssl(void)
|
|
1125
1152
|
*/
|
1126
1153
|
mOSSL = rb_define_module("OpenSSL");
|
1127
1154
|
rb_global_variable(&mOSSL);
|
1128
|
-
|
1129
|
-
/*
|
1130
|
-
* OpenSSL ruby extension version
|
1131
|
-
*/
|
1132
|
-
rb_define_const(mOSSL, "VERSION", rb_str_new2(OSSL_VERSION));
|
1155
|
+
rb_define_singleton_method(mOSSL, "fixed_length_secure_compare", ossl_crypto_fixed_length_secure_compare, 2);
|
1133
1156
|
|
1134
1157
|
/*
|
1135
1158
|
* Version of OpenSSL the ruby OpenSSL extension was built with
|
@@ -1205,6 +1228,9 @@ Init_openssl(void)
|
|
1205
1228
|
Init_ossl_pkey();
|
1206
1229
|
Init_ossl_rand();
|
1207
1230
|
Init_ossl_ssl();
|
1231
|
+
#ifndef OPENSSL_NO_TS
|
1232
|
+
Init_ossl_ts();
|
1233
|
+
#endif
|
1208
1234
|
Init_ossl_x509();
|
1209
1235
|
Init_ossl_ocsp();
|
1210
1236
|
Init_ossl_engine();
|
data/ext/openssl/ossl.h
CHANGED
@@ -27,7 +27,9 @@
|
|
27
27
|
#include <openssl/hmac.h>
|
28
28
|
#include <openssl/rand.h>
|
29
29
|
#include <openssl/conf.h>
|
30
|
-
#
|
30
|
+
#ifndef OPENSSL_NO_TS
|
31
|
+
#include <openssl/ts.h>
|
32
|
+
#endif
|
31
33
|
#include <openssl/crypto.h>
|
32
34
|
#if !defined(OPENSSL_NO_ENGINE)
|
33
35
|
# include <openssl/engine.h>
|
@@ -86,9 +88,8 @@ VALUE ossl_buf2str(char *buf, int len);
|
|
86
88
|
VALUE ossl_str_new(const char *, long, int *);
|
87
89
|
#define ossl_str_adjust(str, p) \
|
88
90
|
do{\
|
89
|
-
long len = RSTRING_LEN(str);\
|
90
91
|
long newlen = (long)((p) - (unsigned char*)RSTRING_PTR(str));\
|
91
|
-
assert(newlen <=
|
92
|
+
assert(newlen <= RSTRING_LEN(str));\
|
92
93
|
rb_str_set_len((str), newlen);\
|
93
94
|
}while(0)
|
94
95
|
/*
|
@@ -168,7 +169,9 @@ void ossl_debug(const char *, ...);
|
|
168
169
|
#include "ossl_pkey.h"
|
169
170
|
#include "ossl_rand.h"
|
170
171
|
#include "ossl_ssl.h"
|
171
|
-
#
|
172
|
+
#ifndef OPENSSL_NO_TS
|
173
|
+
#include "ossl_ts.h"
|
174
|
+
#endif
|
172
175
|
#include "ossl_x509.h"
|
173
176
|
#include "ossl_engine.h"
|
174
177
|
#include "ossl_kdf.h"
|
data/ext/openssl/ossl_asn1.c
CHANGED
@@ -1285,6 +1285,30 @@ ossl_asn1obj_get_ln(VALUE self)
|
|
1285
1285
|
return ret;
|
1286
1286
|
}
|
1287
1287
|
|
1288
|
+
/*
|
1289
|
+
* call-seq:
|
1290
|
+
* oid == other_oid => true or false
|
1291
|
+
*
|
1292
|
+
* Returns +true+ if _other_oid_ is the same as _oid_
|
1293
|
+
*/
|
1294
|
+
static VALUE
|
1295
|
+
ossl_asn1obj_eq(VALUE self, VALUE other)
|
1296
|
+
{
|
1297
|
+
VALUE valSelf, valOther;
|
1298
|
+
int nidSelf, nidOther;
|
1299
|
+
|
1300
|
+
valSelf = ossl_asn1_get_value(self);
|
1301
|
+
valOther = ossl_asn1_get_value(other);
|
1302
|
+
|
1303
|
+
if ((nidSelf = OBJ_txt2nid(StringValueCStr(valSelf))) == NID_undef)
|
1304
|
+
ossl_raise(eASN1Error, "OBJ_txt2nid");
|
1305
|
+
|
1306
|
+
if ((nidOther = OBJ_txt2nid(StringValueCStr(valOther))) == NID_undef)
|
1307
|
+
ossl_raise(eASN1Error, "OBJ_txt2nid");
|
1308
|
+
|
1309
|
+
return nidSelf == nidOther ? Qtrue : Qfalse;
|
1310
|
+
}
|
1311
|
+
|
1288
1312
|
static VALUE
|
1289
1313
|
asn1obj_get_oid_i(VALUE vobj)
|
1290
1314
|
{
|
@@ -1818,6 +1842,7 @@ do{\
|
|
1818
1842
|
rb_define_method(cASN1ObjectId, "oid", ossl_asn1obj_get_oid, 0);
|
1819
1843
|
rb_define_alias(cASN1ObjectId, "short_name", "sn");
|
1820
1844
|
rb_define_alias(cASN1ObjectId, "long_name", "ln");
|
1845
|
+
rb_define_method(cASN1ObjectId, "==", ossl_asn1obj_eq, 1);
|
1821
1846
|
rb_attr(cASN1BitString, rb_intern("unused_bits"), 1, 1, 0);
|
1822
1847
|
|
1823
1848
|
rb_define_method(cASN1EndOfContent, "initialize", ossl_asn1eoc_initialize, 0);
|