openssl 2.1.4 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +9 -7
  3. data/History.md +100 -0
  4. data/README.md +2 -2
  5. data/ext/openssl/extconf.rb +24 -15
  6. data/ext/openssl/openssl_missing.h +36 -1
  7. data/ext/openssl/ossl.c +58 -25
  8. data/ext/openssl/ossl.h +7 -4
  9. data/ext/openssl/ossl_asn1.c +25 -0
  10. data/ext/openssl/ossl_bn.c +65 -10
  11. data/ext/openssl/ossl_bn.h +2 -1
  12. data/ext/openssl/ossl_cipher.c +33 -24
  13. data/ext/openssl/ossl_digest.c +16 -51
  14. data/ext/openssl/ossl_engine.c +2 -12
  15. data/ext/openssl/ossl_hmac.c +5 -11
  16. data/ext/openssl/ossl_kdf.c +3 -19
  17. data/ext/openssl/ossl_ns_spki.c +1 -1
  18. data/ext/openssl/ossl_ocsp.c +6 -11
  19. data/ext/openssl/ossl_ocsp.h +3 -3
  20. data/ext/openssl/ossl_pkcs7.c +3 -19
  21. data/ext/openssl/ossl_pkcs7.h +16 -0
  22. data/ext/openssl/ossl_pkey.c +180 -14
  23. data/ext/openssl/ossl_pkey_dsa.c +2 -2
  24. data/ext/openssl/ossl_pkey_ec.c +29 -0
  25. data/ext/openssl/ossl_pkey_rsa.c +17 -9
  26. data/ext/openssl/ossl_rand.c +2 -32
  27. data/ext/openssl/ossl_ssl.c +94 -42
  28. data/ext/openssl/ossl_ts.c +1524 -0
  29. data/ext/openssl/ossl_ts.h +16 -0
  30. data/ext/openssl/ossl_x509cert.c +2 -2
  31. data/ext/openssl/ossl_x509ext.c +14 -0
  32. data/ext/openssl/ossl_x509name.c +7 -3
  33. data/lib/openssl/bn.rb +1 -1
  34. data/lib/openssl/buffering.rb +28 -5
  35. data/lib/openssl/cipher.rb +1 -1
  36. data/lib/openssl/config.rb +17 -8
  37. data/lib/openssl/digest.rb +10 -12
  38. data/lib/openssl/hmac.rb +13 -0
  39. data/lib/openssl/marshal.rb +30 -0
  40. data/lib/openssl/pkcs5.rb +1 -1
  41. data/lib/openssl/pkey.rb +18 -1
  42. data/lib/openssl/ssl.rb +40 -2
  43. data/lib/openssl/version.rb +5 -0
  44. data/lib/openssl/x509.rb +155 -1
  45. data/lib/openssl.rb +25 -9
  46. metadata +6 -3
  47. data/ext/openssl/deprecation.rb +0 -27
  48. data/ext/openssl/ossl_version.h +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88da06860381b21467805e571f0b92f020a070dd3088f39cd8511a6a1dcc87aa
4
- data.tar.gz: 28dbc9f0648e7a4a4400fcc8ced412286099dca4bfeea603cc0804a8c204e33f
3
+ metadata.gz: ca57a155a863eab5ef5138956be25ab7915d701d10e7487605f3f909262aecdc
4
+ data.tar.gz: ae7d5d15ae4944d79c8bd45a4279b4ab5fa021604ad8bb12759ebf3c9f6ff33d
5
5
  SHA512:
6
- metadata.gz: 7a2f752f6cafd6de5a0ef4674ae625d1afe8061da727a46732031de22d150d972bca92e783bef224706a0c511e27b6fc1aec787554c00efbb03b08ebf6e12f6e
7
- data.tar.gz: '09459c4b38deda5c19ad1fde1129e0de914f25f131d2f7d27ec535d6216130cdd3fe1b0f8ee8edd8f661625f62185e68b688b4f3d5713fc13562285b4e8651e4'
6
+ metadata.gz: 479a5f07bc88c5cc20e4be271da0f1e0314c69bcde3a3b173871e6499f905cb5d0335cc91b7132eb7c1b10382c088f23e5734aa5eadb675979f65afeb3e9f9fe
7
+ data.tar.gz: b3a5c5346ee5b3becedc9040c1a7e87344333c0cc1903566db1b24090897e45c186aded4e6c68f49eab16a13a42faf77d7adff89ea527fff5c73d4c0e976a27d
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 the version of Ruby, the
16
- version of openssl gem, the version of the OpenSSL library, along with a sample
17
- file that illustrates the problem or link to repository or gem that is
18
- associated with the bug.
19
-
20
- There is a number of unresolved issues and feature requests for openssl that
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
- [`.travis.yml`](https://github.com/ruby/openssl/tree/master/.travis.yml).
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,3 +1,103 @@
1
+ Version 2.2.2
2
+ =============
3
+
4
+ Merged changes in 2.1.4.
5
+
6
+
7
+ Version 2.2.1
8
+ =============
9
+
10
+ Merged changes in 2.1.3. Additionally, the following issues are fixed by this
11
+ release.
12
+
13
+ Bug fixes
14
+ ---------
15
+
16
+ * Fix crash in `OpenSSL::Timestamp::{Request,Response,TokenInfo}.new` when
17
+ invalid arguments are given.
18
+ [[GitHub #407]](https://github.com/ruby/openssl/pull/407)
19
+ * Fix `OpenSSL::Timestamp::Factory#create_timestamp` with LibreSSL on platforms
20
+ where `time_t` has a different size from `long`.
21
+ [[GitHub #454]](https://github.com/ruby/openssl/pull/454)
22
+
23
+
24
+ Version 2.2.0
25
+ =============
26
+
27
+ Compatibility notes
28
+ -------------------
29
+
30
+ * Remove unsupported MDC2, DSS, DSS1, and SHA algorithms.
31
+ * Remove `OpenSSL::PKCS7::SignerInfo#name` alias for `#issuer`.
32
+ [[GitHub #266]](https://github.com/ruby/openssl/pull/266)
33
+ * Deprecate `OpenSSL::Config#add_value` and `#[]=` for future removal.
34
+ [[GitHub #322]](https://github.com/ruby/openssl/pull/322)
35
+
36
+
37
+ Notable changes
38
+ ---------------
39
+
40
+ * Change default `OpenSSL::SSL::SSLServer#listen` backlog argument from
41
+ 5 to `Socket::SOMAXCONN`.
42
+ [[GitHub #286]](https://github.com/ruby/openssl/issues/286)
43
+ * Make `OpenSSL::HMAC#==` use a timing safe string comparison.
44
+ [[GitHub #284]](https://github.com/ruby/openssl/pull/284)
45
+ * Add support for SHA3 and BLAKE digests.
46
+ [[GitHub #282]](https://github.com/ruby/openssl/pull/282)
47
+ * Add `OpenSSL::SSL::SSLSocket.open` for opening a `TCPSocket` and
48
+ returning an `OpenSSL::SSL::SSLSocket` for it.
49
+ [[GitHub #225]](https://github.com/ruby/openssl/issues/225)
50
+ * Support marshalling of `OpenSSL::X509` and `OpenSSL::PKey` objects.
51
+ [[GitHub #281]](https://github.com/ruby/openssl/pull/281)
52
+ [[GitHub #363]](https://github.com/ruby/openssl/pull/363)
53
+ * Add `OpenSSL.secure_compare` for timing safe string comparison for
54
+ strings of possibly unequal length.
55
+ [[GitHub #280]](https://github.com/ruby/openssl/pull/280)
56
+ * Add `OpenSSL.fixed_length_secure_compare` for timing safe string
57
+ comparison for strings of equal length.
58
+ [[GitHub #269]](https://github.com/ruby/openssl/pull/269)
59
+ * Add `OpenSSL::SSL::SSLSocket#{finished_message,peer_finished_message}`
60
+ for last finished message sent and received.
61
+ [[GitHub #250]](https://github.com/ruby/openssl/pull/250)
62
+ * Add `OpenSSL::Timestamp` module for handing timestamp requests and
63
+ responses.
64
+ [[GitHub #204]](https://github.com/ruby/openssl/pull/204)
65
+ * Add helper methods for `OpenSSL::X509::Certificate`:
66
+ `find_extension`, `subject_key_identifier`,
67
+ `authority_key_identifier`, `crl_uris`, `ca_issuer_uris` and
68
+ `ocsp_uris`, and for `OpenSSL::X509::CRL`:
69
+ `find_extension` and `subject_key_identifier`.
70
+ [[GitHub #260]](https://github.com/ruby/openssl/pull/260)
71
+ [[GitHub #275]](https://github.com/ruby/openssl/pull/275)
72
+ [[GitHub #293]](https://github.com/ruby/openssl/pull/293)
73
+ * Add `OpenSSL::ECPoint#add` for performing elliptic curve point addition.
74
+ [[GitHub #261]](https://github.com/ruby/openssl/pull/261)
75
+ * Make `OpenSSL::PKey::RSA#{export,to_der}` check `key`, `factors`, and
76
+ `crt_params` to do proper private key serialization.
77
+ [[GitHub #258]](https://github.com/ruby/openssl/pull/258)
78
+ * Add `OpenSSL::SSL::{SSLSocket,SSLServer}#fileno`, returning the
79
+ underlying socket file descriptor number.
80
+ [[GitHub #247]](https://github.com/ruby/openssl/pull/247)
81
+ * Support client certificates with TLS 1.3, and support post-handshake
82
+ authentication with OpenSSL 1.1.1+.
83
+ [[GitHub #239]](https://github.com/ruby/openssl/pull/239)
84
+ * Add `OpenSSL::ASN1::ObjectId#==` for equality testing.
85
+ * Add `OpenSSL::X509::Extension#value_der` for the raw value of
86
+ the extension.
87
+ [[GitHub #234]](https://github.com/ruby/openssl/pull/234)
88
+ * Significantly reduce allocated memory in `OpenSSL::Buffering#do_write`.
89
+ [[GitHub #212]](https://github.com/ruby/openssl/pull/212)
90
+ * Ensure all valid IPv6 addresses are considered valid as elements
91
+ of subjectAlternativeName in certificates.
92
+ [[GitHub #185]](https://github.com/ruby/openssl/pull/185)
93
+ * Allow recipient's certificate to be omitted in PCKS7#decrypt.
94
+ [[GitHub #183]](https://github.com/ruby/openssl/pull/183)
95
+ * Add support for reading keys in PKCS #8 format and export via instance methods
96
+ added to `OpenSSL::PKey` classes: `private_to_der`, `private_to_pem`,
97
+ `public_to_der` and `public_to_pem`.
98
+ [[GitHub #297]](https://github.com/ruby/openssl/pull/297)
99
+
100
+
1
101
  Version 2.1.4
2
102
  =============
3
103
 
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # OpenSSL for Ruby
2
2
 
3
- [![Build Status](https://travis-ci.org/ruby/openssl.svg?branch=master)](https://travis-ci.org/ruby/openssl)
4
- [![Build status](https://ci.appveyor.com/api/projects/status/b8djtmwo7l26f88y/branch/master?svg=true)](https://ci.appveyor.com/project/ruby/openssl/branch/master)
3
+ [![Actions Status](https://github.com/ruby/openssl/workflows/CI/badge.svg)](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.
@@ -1,5 +1,5 @@
1
1
  # -*- coding: us-ascii -*-
2
- # frozen_string_literal: false
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_given = dir_config("openssl").any?
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,12 @@ if $mswin || $mingw
37
33
  have_library("ws2_32")
38
34
  end
39
35
 
36
+ if $mingw
37
+ append_cflags '-D_FORTIFY_SOURCE=2'
38
+ append_ldflags '-fstack-protector'
39
+ have_library 'ssp'
40
+ end
41
+
40
42
  def find_openssl_library
41
43
  if $mswin || $mingw
42
44
  # required for static OpenSSL libraries
@@ -119,10 +121,10 @@ end
119
121
  Logging::message "=== Checking for OpenSSL features... ===\n"
120
122
  # compile options
121
123
  have_func("RAND_egd")
122
- engines = %w{builtin_engines openbsd_dev_crypto dynamic 4758cca aep atalla chil
123
- cswift nuron sureware ubsec padlock capi gmp gost cryptodev aesni}
124
+ engines = %w{dynamic 4758cca aep atalla chil
125
+ cswift nuron sureware ubsec padlock capi gmp gost cryptodev}
124
126
  engines.each { |name|
125
- OpenSSL.check_func_or_macro("ENGINE_load_#{name}", "openssl/engine.h")
127
+ have_func("ENGINE_load_#{name}()", "openssl/engine.h")
126
128
  }
127
129
 
128
130
  # added in 1.0.2
@@ -130,9 +132,9 @@ have_func("EC_curve_nist2nid")
130
132
  have_func("X509_REVOKED_dup")
131
133
  have_func("X509_STORE_CTX_get0_store")
132
134
  have_func("SSL_CTX_set_alpn_select_cb")
133
- OpenSSL.check_func_or_macro("SSL_CTX_set1_curves_list", "openssl/ssl.h")
134
- OpenSSL.check_func_or_macro("SSL_CTX_set_ecdh_auto", "openssl/ssl.h")
135
- OpenSSL.check_func_or_macro("SSL_get_server_tmp_key", "openssl/ssl.h")
135
+ have_func("SSL_CTX_set1_curves_list(NULL, NULL)", "openssl/ssl.h")
136
+ have_func("SSL_CTX_set_ecdh_auto(NULL, 0)", "openssl/ssl.h")
137
+ have_func("SSL_get_server_tmp_key(NULL, NULL)", "openssl/ssl.h")
136
138
  have_func("SSL_is_server")
137
139
 
138
140
  # added in 1.1.0
@@ -148,9 +150,9 @@ have_func("EVP_MD_CTX_new")
148
150
  have_func("EVP_MD_CTX_free")
149
151
  have_func("HMAC_CTX_new")
150
152
  have_func("HMAC_CTX_free")
151
- OpenSSL.check_func("RAND_pseudo_bytes", "openssl/rand.h") # deprecated
152
153
  have_func("X509_STORE_get_ex_data")
153
154
  have_func("X509_STORE_set_ex_data")
155
+ have_func("X509_STORE_get_ex_new_index")
154
156
  have_func("X509_CRL_get0_signature")
155
157
  have_func("X509_REQ_get0_signature")
156
158
  have_func("X509_REVOKED_get0_serialNumber")
@@ -166,16 +168,23 @@ have_func("X509_CRL_up_ref")
166
168
  have_func("X509_STORE_up_ref")
167
169
  have_func("SSL_SESSION_up_ref")
168
170
  have_func("EVP_PKEY_up_ref")
169
- OpenSSL.check_func_or_macro("SSL_CTX_set_tmp_ecdh_callback", "openssl/ssl.h") # removed
170
- OpenSSL.check_func_or_macro("SSL_CTX_set_min_proto_version", "openssl/ssl.h")
171
+ have_func("SSL_CTX_set_tmp_ecdh_callback(NULL, NULL)", "openssl/ssl.h") # removed
172
+ have_func("SSL_CTX_set_min_proto_version(NULL, 0)", "openssl/ssl.h")
171
173
  have_func("SSL_CTX_get_security_level")
172
174
  have_func("X509_get0_notBefore")
173
175
  have_func("SSL_SESSION_get_protocol_version")
176
+ have_func("TS_STATUS_INFO_get0_status")
177
+ have_func("TS_STATUS_INFO_get0_text")
178
+ have_func("TS_STATUS_INFO_get0_failure_info")
179
+ have_func("TS_VERIFY_CTS_set_certs")
180
+ have_func("TS_VERIFY_CTX_set_store")
181
+ have_func("TS_VERIFY_CTX_add_flags")
182
+ have_func("TS_RESP_CTX_set_time_cb")
174
183
  have_func("EVP_PBE_scrypt")
184
+ have_func("SSL_CTX_set_post_handshake_auth")
175
185
 
176
186
  Logging::message "=== Checking done. ===\n"
177
187
 
178
188
  create_header
179
- OpenSSL.restore_warning_flag
180
189
  create_makefile("openssl")
181
190
  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
@@ -497,8 +497,11 @@ print_mem_leaks(VALUE self)
497
497
  int ret;
498
498
  #endif
499
499
 
500
- BN_CTX_free(ossl_bn_ctx);
501
- ossl_bn_ctx = NULL;
500
+ #ifndef HAVE_RB_EXT_RACTOR_SAFE
501
+ // for Ruby 2.x
502
+ void ossl_bn_ctx_free(void); // ossl_bn.c
503
+ ossl_bn_ctx_free();
504
+ #endif
502
505
 
503
506
  #if OPENSSL_VERSION_NUMBER >= 0x10100000
504
507
  ret = CRYPTO_mem_leaks_fp(stderr);
@@ -604,6 +607,35 @@ static void Init_ossl_locks(void)
604
607
  }
605
608
  #endif /* !HAVE_OPENSSL_110_THREADING_API */
606
609
 
610
+ /*
611
+ * call-seq:
612
+ * OpenSSL.fixed_length_secure_compare(string, string) -> boolean
613
+ *
614
+ * Constant time memory comparison for fixed length strings, such as results
615
+ * of HMAC calculations.
616
+ *
617
+ * Returns +true+ if the strings are identical, +false+ if they are of the same
618
+ * length but not identical. If the length is different, +ArgumentError+ is
619
+ * raised.
620
+ */
621
+ static VALUE
622
+ ossl_crypto_fixed_length_secure_compare(VALUE dummy, VALUE str1, VALUE str2)
623
+ {
624
+ const unsigned char *p1 = (const unsigned char *)StringValuePtr(str1);
625
+ const unsigned char *p2 = (const unsigned char *)StringValuePtr(str2);
626
+ long len1 = RSTRING_LEN(str1);
627
+ long len2 = RSTRING_LEN(str2);
628
+
629
+ if (len1 != len2) {
630
+ ossl_raise(rb_eArgError, "inputs must be of equal length");
631
+ }
632
+
633
+ switch (CRYPTO_memcmp(p1, p2, len1)) {
634
+ case 0: return Qtrue;
635
+ default: return Qfalse;
636
+ }
637
+ }
638
+
607
639
  /*
608
640
  * OpenSSL provides SSL, TLS and general purpose cryptography. It wraps the
609
641
  * OpenSSL[https://www.openssl.org/] library.
@@ -635,7 +667,7 @@ static void Init_ossl_locks(void)
635
667
  * ahold of the key may use it unless it is encrypted. In order to securely
636
668
  * export a key you may export it with a pass phrase.
637
669
  *
638
- * cipher = OpenSSL::Cipher.new 'AES-128-CBC'
670
+ * cipher = OpenSSL::Cipher.new 'AES-256-CBC'
639
671
  * pass_phrase = 'my secure pass phrase goes here'
640
672
  *
641
673
  * key_secure = key.export cipher, pass_phrase
@@ -710,16 +742,14 @@ static void Init_ossl_locks(void)
710
742
  * To sign a document, a cryptographically secure hash of the document is
711
743
  * computed first, which is then signed using the private key.
712
744
  *
713
- * digest = OpenSSL::Digest::SHA256.new
714
- * signature = key.sign digest, document
745
+ * signature = key.sign 'SHA256', document
715
746
  *
716
747
  * To validate the signature, again a hash of the document is computed and
717
748
  * the signature is decrypted using the public key. The result is then
718
749
  * compared to the hash just computed, if they are equal the signature was
719
750
  * valid.
720
751
  *
721
- * digest = OpenSSL::Digest::SHA256.new
722
- * if key.verify digest, signature, document
752
+ * if key.verify 'SHA256', signature, document
723
753
  * puts 'Valid'
724
754
  * else
725
755
  * puts 'Invalid'
@@ -745,7 +775,7 @@ static void Init_ossl_locks(void)
745
775
  * using PBKDF2. PKCS #5 v2.0 recommends at least 8 bytes for the salt,
746
776
  * the number of iterations largely depends on the hardware being used.
747
777
  *
748
- * cipher = OpenSSL::Cipher.new 'AES-128-CBC'
778
+ * cipher = OpenSSL::Cipher.new 'AES-256-CBC'
749
779
  * cipher.encrypt
750
780
  * iv = cipher.random_iv
751
781
  *
@@ -753,7 +783,7 @@ static void Init_ossl_locks(void)
753
783
  * salt = OpenSSL::Random.random_bytes 16
754
784
  * iter = 20000
755
785
  * key_len = cipher.key_len
756
- * digest = OpenSSL::Digest::SHA256.new
786
+ * digest = OpenSSL::Digest.new('SHA256')
757
787
  *
758
788
  * key = OpenSSL::PKCS5.pbkdf2_hmac(pwd, salt, iter, key_len, digest)
759
789
  * cipher.key = key
@@ -768,7 +798,7 @@ static void Init_ossl_locks(void)
768
798
  * Use the same steps as before to derive the symmetric AES key, this time
769
799
  * setting the Cipher up for decryption.
770
800
  *
771
- * cipher = OpenSSL::Cipher.new 'AES-128-CBC'
801
+ * cipher = OpenSSL::Cipher.new 'AES-256-CBC'
772
802
  * cipher.decrypt
773
803
  * cipher.iv = iv # the one generated with #random_iv
774
804
  *
@@ -776,7 +806,7 @@ static void Init_ossl_locks(void)
776
806
  * salt = ... # the one generated above
777
807
  * iter = 20000
778
808
  * key_len = cipher.key_len
779
- * digest = OpenSSL::Digest::SHA256.new
809
+ * digest = OpenSSL::Digest.new('SHA256')
780
810
  *
781
811
  * key = OpenSSL::PKCS5.pbkdf2_hmac(pwd, salt, iter, key_len, digest)
782
812
  * cipher.key = key
@@ -803,7 +833,7 @@ static void Init_ossl_locks(void)
803
833
  *
804
834
  * First set up the cipher for encryption
805
835
  *
806
- * encryptor = OpenSSL::Cipher.new 'AES-128-CBC'
836
+ * encryptor = OpenSSL::Cipher.new 'AES-256-CBC'
807
837
  * encryptor.encrypt
808
838
  * encryptor.pkcs5_keyivgen pass_phrase, salt
809
839
  *
@@ -816,7 +846,7 @@ static void Init_ossl_locks(void)
816
846
  *
817
847
  * Use a new Cipher instance set up for decryption
818
848
  *
819
- * decryptor = OpenSSL::Cipher.new 'AES-128-CBC'
849
+ * decryptor = OpenSSL::Cipher.new 'AES-256-CBC'
820
850
  * decryptor.decrypt
821
851
  * decryptor.pkcs5_keyivgen pass_phrase, salt
822
852
  *
@@ -833,7 +863,7 @@ static void Init_ossl_locks(void)
833
863
  * signature.
834
864
  *
835
865
  * key = OpenSSL::PKey::RSA.new 2048
836
- * name = OpenSSL::X509::Name.parse 'CN=nobody/DC=example'
866
+ * name = OpenSSL::X509::Name.parse '/CN=nobody/DC=example'
837
867
  *
838
868
  * cert = OpenSSL::X509::Certificate.new
839
869
  * cert.version = 2
@@ -872,7 +902,7 @@ static void Init_ossl_locks(void)
872
902
  * certificate.
873
903
  *
874
904
  * cert.issuer = name
875
- * cert.sign key, OpenSSL::Digest::SHA1.new
905
+ * cert.sign key, OpenSSL::Digest.new('SHA1')
876
906
  *
877
907
  * open 'certificate.pem', 'w' do |io| io.write cert.to_pem end
878
908
  *
@@ -904,7 +934,7 @@ static void Init_ossl_locks(void)
904
934
  * ca_key = OpenSSL::PKey::RSA.new 2048
905
935
  * pass_phrase = 'my secure pass phrase goes here'
906
936
  *
907
- * cipher = OpenSSL::Cipher.new 'AES-128-CBC'
937
+ * cipher = OpenSSL::Cipher.new 'AES-256-CBC'
908
938
  *
909
939
  * open 'ca_key.pem', 'w', 0400 do |io|
910
940
  * io.write ca_key.export(cipher, pass_phrase)
@@ -915,7 +945,7 @@ static void Init_ossl_locks(void)
915
945
  * A CA certificate is created the same way we created a certificate above, but
916
946
  * with different extensions.
917
947
  *
918
- * ca_name = OpenSSL::X509::Name.parse 'CN=ca/DC=example'
948
+ * ca_name = OpenSSL::X509::Name.parse '/CN=ca/DC=example'
919
949
  *
920
950
  * ca_cert = OpenSSL::X509::Certificate.new
921
951
  * ca_cert.serial = 0
@@ -948,7 +978,7 @@ static void Init_ossl_locks(void)
948
978
  *
949
979
  * Root CA certificates are self-signed.
950
980
  *
951
- * ca_cert.sign ca_key, OpenSSL::Digest::SHA1.new
981
+ * ca_cert.sign ca_key, OpenSSL::Digest.new('SHA1')
952
982
  *
953
983
  * The CA certificate is saved to disk so it may be distributed to all the
954
984
  * users of the keys this CA will sign.
@@ -966,7 +996,7 @@ static void Init_ossl_locks(void)
966
996
  * csr.version = 0
967
997
  * csr.subject = name
968
998
  * csr.public_key = key.public_key
969
- * csr.sign key, OpenSSL::Digest::SHA1.new
999
+ * csr.sign key, OpenSSL::Digest.new('SHA1')
970
1000
  *
971
1001
  * A CSR is saved to disk and sent to the CA for signing.
972
1002
  *
@@ -1010,7 +1040,7 @@ static void Init_ossl_locks(void)
1010
1040
  * csr_cert.add_extension \
1011
1041
  * extension_factory.create_extension('subjectKeyIdentifier', 'hash')
1012
1042
  *
1013
- * csr_cert.sign ca_key, OpenSSL::Digest::SHA1.new
1043
+ * csr_cert.sign ca_key, OpenSSL::Digest.new('SHA1')
1014
1044
  *
1015
1045
  * open 'csr_cert.pem', 'w' do |io|
1016
1046
  * io.write csr_cert.to_pem
@@ -1099,6 +1129,10 @@ static void Init_ossl_locks(void)
1099
1129
  void
1100
1130
  Init_openssl(void)
1101
1131
  {
1132
+ #if HAVE_RB_EXT_RACTOR_SAFE
1133
+ rb_ext_ractor_safe(true);
1134
+ #endif
1135
+
1102
1136
  #undef rb_intern
1103
1137
  /*
1104
1138
  * Init timezone info
@@ -1125,11 +1159,7 @@ Init_openssl(void)
1125
1159
  */
1126
1160
  mOSSL = rb_define_module("OpenSSL");
1127
1161
  rb_global_variable(&mOSSL);
1128
-
1129
- /*
1130
- * OpenSSL ruby extension version
1131
- */
1132
- rb_define_const(mOSSL, "VERSION", rb_str_new2(OSSL_VERSION));
1162
+ rb_define_singleton_method(mOSSL, "fixed_length_secure_compare", ossl_crypto_fixed_length_secure_compare, 2);
1133
1163
 
1134
1164
  /*
1135
1165
  * Version of OpenSSL the ruby OpenSSL extension was built with
@@ -1205,6 +1235,9 @@ Init_openssl(void)
1205
1235
  Init_ossl_pkey();
1206
1236
  Init_ossl_rand();
1207
1237
  Init_ossl_ssl();
1238
+ #ifndef OPENSSL_NO_TS
1239
+ Init_ossl_ts();
1240
+ #endif
1208
1241
  Init_ossl_x509();
1209
1242
  Init_ossl_ocsp();
1210
1243
  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
- #include <openssl/conf_api.h>
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 <= len);\
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
- #include "ossl_version.h"
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"
@@ -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);