openssl 2.1.4 → 2.2.2

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.
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);