openssl 2.0.9 → 2.1.0.beta1
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.
Potentially problematic release.
This version of openssl might be problematic. Click here for more details.
- checksums.yaml +5 -5
 - data/History.md +28 -69
 - data/README.md +1 -1
 - data/ext/openssl/deprecation.rb +0 -3
 - data/ext/openssl/extconf.rb +8 -52
 - data/ext/openssl/openssl_missing.c +0 -67
 - data/ext/openssl/openssl_missing.h +3 -50
 - data/ext/openssl/ossl.c +81 -74
 - data/ext/openssl/ossl.h +14 -27
 - data/ext/openssl/ossl_asn1.c +287 -374
 - data/ext/openssl/ossl_asn1.h +0 -4
 - data/ext/openssl/ossl_bio.c +5 -20
 - data/ext/openssl/ossl_bio.h +0 -2
 - data/ext/openssl/ossl_bn.c +70 -28
 - data/ext/openssl/ossl_cipher.c +18 -42
 - data/ext/openssl/ossl_cipher.h +1 -1
 - data/ext/openssl/ossl_digest.c +8 -12
 - data/ext/openssl/ossl_digest.h +1 -1
 - data/ext/openssl/ossl_engine.c +47 -47
 - data/ext/openssl/ossl_hmac.c +19 -22
 - data/ext/openssl/ossl_kdf.c +221 -0
 - data/ext/openssl/ossl_kdf.h +6 -0
 - data/ext/openssl/ossl_ns_spki.c +17 -21
 - data/ext/openssl/ossl_ocsp.c +85 -80
 - data/ext/openssl/ossl_pkcs12.c +15 -21
 - data/ext/openssl/ossl_pkcs7.c +8 -21
 - data/ext/openssl/ossl_pkey.c +24 -48
 - data/ext/openssl/ossl_pkey.h +1 -6
 - data/ext/openssl/ossl_pkey_dh.c +11 -11
 - data/ext/openssl/ossl_pkey_dsa.c +16 -22
 - data/ext/openssl/ossl_pkey_ec.c +43 -56
 - data/ext/openssl/ossl_pkey_rsa.c +19 -19
 - data/ext/openssl/ossl_rand.c +12 -12
 - data/ext/openssl/ossl_ssl.c +291 -243
 - data/ext/openssl/ossl_ssl.h +0 -5
 - data/ext/openssl/ossl_ssl_session.c +7 -9
 - data/ext/openssl/ossl_version.h +1 -1
 - data/ext/openssl/ossl_x509.c +0 -15
 - data/ext/openssl/ossl_x509.h +0 -7
 - data/ext/openssl/ossl_x509attr.c +3 -7
 - data/ext/openssl/ossl_x509cert.c +17 -54
 - data/ext/openssl/ossl_x509crl.c +15 -25
 - data/ext/openssl/ossl_x509ext.c +9 -14
 - data/ext/openssl/ossl_x509name.c +76 -41
 - data/ext/openssl/ossl_x509req.c +10 -47
 - data/ext/openssl/ossl_x509revoked.c +8 -8
 - data/ext/openssl/ossl_x509store.c +15 -45
 - data/ext/openssl/ruby_missing.h +2 -13
 - data/lib/openssl.rb +1 -0
 - data/lib/openssl/bn.rb +2 -1
 - data/lib/openssl/buffering.rb +24 -23
 - data/lib/openssl/config.rb +12 -11
 - data/lib/openssl/digest.rb +3 -6
 - data/lib/openssl/pkcs5.rb +22 -0
 - data/lib/openssl/pkey.rb +0 -41
 - data/lib/openssl/ssl.rb +118 -16
 - data/lib/openssl/x509.rb +7 -1
 - metadata +8 -7
 - data/ext/openssl/ossl_pkcs5.c +0 -180
 - data/ext/openssl/ossl_pkcs5.h +0 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 4cc6326c79cf145b9fb1f5a44a7b55a455ae0980
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 6a7dfe45eb2335413661a03fe31b883890052b78
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 621847e9bf167872c49c12c6adea64b4516b74818377808918ff7cb1a032381f88e1c5b3d3679da80ee7a1c89d4848c620c2876436e41af82ed9a15330a57fdd
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 352c40ced871126e88f96ef339a7c455e974794ef98688527a9fddcc4e0e6c6e6297bd0591dbd74c185bee19bdc7500a16f50b8c6c17fd08fe09584d14b9b94f
         
     | 
    
        data/History.md
    CHANGED
    
    | 
         @@ -1,73 +1,32 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            Version 2.0. 
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            Security fixes
         
     | 
| 
       5 
     | 
    
         
            -
            --------------
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            * OpenSSL::X509::Name#<=> could incorrectly return 0 (= equal) for non-equal
         
     | 
| 
       8 
     | 
    
         
            -
              objects. CVE-2018-16395 is assigned for this issue.
         
     | 
| 
       9 
     | 
    
         
            -
              https://hackerone.com/reports/387250
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            Bug fixes
         
     | 
| 
       12 
     | 
    
         
            -
            ---------
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            * Fixed OpenSSL::PKey::*.{new,generate} immediately aborting if the thread is
         
     | 
| 
       15 
     | 
    
         
            -
              interrupted.
         
     | 
| 
       16 
     | 
    
         
            -
              [[Bug #14882]](https://bugs.ruby-lang.org/issues/14882)
         
     | 
| 
       17 
     | 
    
         
            -
              [[GitHub #205]](https://github.com/ruby/openssl/pull/205)
         
     | 
| 
       18 
     | 
    
         
            -
            * Fixed OpenSSL::X509::Name#to_s failing with OpenSSL::X509::NameError if
         
     | 
| 
       19 
     | 
    
         
            -
              called against an empty instance.
         
     | 
| 
       20 
     | 
    
         
            -
              [[GitHub #200]](https://github.com/ruby/openssl/issues/200)
         
     | 
| 
       21 
     | 
    
         
            -
              [[GitHub #211]](https://github.com/ruby/openssl/pull/211)
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
            Version 2.0.8
         
     | 
| 
       25 
     | 
    
         
            -
            =============
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
            Bug fixes
         
     | 
| 
       28 
     | 
    
         
            -
            ---------
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            * OpenSSL::Cipher#pkcs5_keyivgen raises an error when a negative iteration
         
     | 
| 
       31 
     | 
    
         
            -
              count is given.
         
     | 
| 
       32 
     | 
    
         
            -
              [[GitHub #184]](https://github.com/ruby/openssl/pull/184)
         
     | 
| 
       33 
     | 
    
         
            -
            * Fixed build with LibreSSL 2.7.
         
     | 
| 
       34 
     | 
    
         
            -
              [[GitHub #192]](https://github.com/ruby/openssl/issues/192)
         
     | 
| 
       35 
     | 
    
         
            -
              [[GitHub #193]](https://github.com/ruby/openssl/pull/193)
         
     | 
| 
      
 1 
     | 
    
         
            +
            Version 2.1.0.beta1
         
     | 
| 
      
 2 
     | 
    
         
            +
            ===================
         
     | 
| 
       36 
3 
     | 
    
         | 
| 
      
 4 
     | 
    
         
            +
            Notable changes
         
     | 
| 
      
 5 
     | 
    
         
            +
            ---------------
         
     | 
| 
       37 
6 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
            * OpenSSL:: 
     | 
| 
       45 
     | 
    
         
            -
              [[ 
     | 
| 
       46 
     | 
    
         
            -
            * OpenSSL 
     | 
| 
       47 
     | 
    
         
            -
               
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
               
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
               
     | 
| 
       61 
     | 
    
         
            -
            * A possible deadlock in OpenSSL::SSL::SSLSocket#sysread is fixed.
         
     | 
| 
       62 
     | 
    
         
            -
              [[GitHub #139]](https://github.com/ruby/openssl/pull/139)
         
     | 
| 
       63 
     | 
    
         
            -
            * OpenSSL::BN#hash could return an unnormalized fixnum value on Windows.
         
     | 
| 
       64 
     | 
    
         
            -
              [[Bug #13877]](https://bugs.ruby-lang.org/issues/13877)
         
     | 
| 
       65 
     | 
    
         
            -
            * OpenSSL::SSL::SSLSocket#sysread and #sysread_nonblock set the length of the
         
     | 
| 
       66 
     | 
    
         
            -
              destination buffer String to 0 on error.
         
     | 
| 
       67 
     | 
    
         
            -
              [[GitHub #153]](https://github.com/ruby/openssl/pull/153)
         
     | 
| 
       68 
     | 
    
         
            -
            * Possible deadlock is fixed. This happened only when built with older versions
         
     | 
| 
       69 
     | 
    
         
            -
              of OpenSSL (before 1.1.0) or LibreSSL.
         
     | 
| 
       70 
     | 
    
         
            -
              [[GitHub #155]](https://github.com/ruby/openssl/pull/155)
         
     | 
| 
      
 7 
     | 
    
         
            +
            * Support for OpenSSL versions before 1.0.1 is removed.
         
     | 
| 
      
 8 
     | 
    
         
            +
              [[GitHub #86]](https://github.com/ruby/openssl/pull/86)
         
     | 
| 
      
 9 
     | 
    
         
            +
            * OpenSSL::BN#negative?, #+@, and #-@ are added.
         
     | 
| 
      
 10 
     | 
    
         
            +
            * OpenSSL::SSL::SSLSocket#connect raises a more informative exception when
         
     | 
| 
      
 11 
     | 
    
         
            +
              certificate verification fails.
         
     | 
| 
      
 12 
     | 
    
         
            +
              [[GitHub #99]](https://github.com/ruby/openssl/pull/99)
         
     | 
| 
      
 13 
     | 
    
         
            +
            * OpenSSL::KDF module is newly added. Support for scrypt is added.
         
     | 
| 
      
 14 
     | 
    
         
            +
              [[GitHub #109]](https://github.com/ruby/openssl/pull/109)
         
     | 
| 
      
 15 
     | 
    
         
            +
            * OpenSSL.fips_mode is added. We have had the setter, but not the getter.
         
     | 
| 
      
 16 
     | 
    
         
            +
              [[GitHub #125]](https://github.com/ruby/openssl/pull/125)
         
     | 
| 
      
 17 
     | 
    
         
            +
            * OpenSSL::OCSP::Request#signed? is added.
         
     | 
| 
      
 18 
     | 
    
         
            +
            * OpenSSL::ASN1 handles the indefinite length form better. OpenSSL::ASN1.decode
         
     | 
| 
      
 19 
     | 
    
         
            +
              no longer wrongly treats the end-of-contents octets as part of the content.
         
     | 
| 
      
 20 
     | 
    
         
            +
              OpenSSL::ASN1::ASN1Data#infinite_length is renamed to #indefinite_length.
         
     | 
| 
      
 21 
     | 
    
         
            +
              [[GitHub #98]](https://github.com/ruby/openssl/pull/98)
         
     | 
| 
      
 22 
     | 
    
         
            +
            * OpenSSL::X509::Name#add_entry now accepts two additional keyword arguments
         
     | 
| 
      
 23 
     | 
    
         
            +
              'loc' and 'set'.
         
     | 
| 
      
 24 
     | 
    
         
            +
              [[GitHub #94]](https://github.com/ruby/openssl/issues/94)
         
     | 
| 
      
 25 
     | 
    
         
            +
            * OpenSSL::SSL::SSLContext#min_version= and #max_version= are added.
         
     | 
| 
      
 26 
     | 
    
         
            +
              [[GitHub #142]](https://github.com/ruby/openssl/pull/142)
         
     | 
| 
      
 27 
     | 
    
         
            +
            * OpenSSL::X509::Name#to_utf8 is added.
         
     | 
| 
      
 28 
     | 
    
         
            +
              [[GitHub #26]](https://github.com/ruby/openssl/issues/26)
         
     | 
| 
      
 29 
     | 
    
         
            +
              [[GitHub #143]](https://github.com/ruby/openssl/pull/143)
         
     | 
| 
       71 
30 
     | 
    
         | 
| 
       72 
31 
     | 
    
         | 
| 
       73 
32 
     | 
    
         
             
            Version 2.0.5
         
     | 
| 
         @@ -222,7 +181,7 @@ Notable changes 
     | 
|
| 
       222 
181 
     | 
    
         
             
              - A new option 'verify_hostname' is added to OpenSSL::SSL::SSLContext. When it
         
     | 
| 
       223 
182 
     | 
    
         
             
                is enabled, and the SNI hostname is also set, the hostname verification on
         
     | 
| 
       224 
183 
     | 
    
         
             
                the server certificate is automatically performed. It is now enabled by
         
     | 
| 
       225 
     | 
    
         
            -
                OpenSSL::SSL:: 
     | 
| 
      
 184 
     | 
    
         
            +
                OpenSSL::SSL::Context#set_params.
         
     | 
| 
       226 
185 
     | 
    
         
             
                [[GH ruby/openssl#60]](https://github.com/ruby/openssl/pull/60)
         
     | 
| 
       227 
186 
     | 
    
         | 
| 
       228 
187 
     | 
    
         
             
            Removals
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -27,7 +27,7 @@ Alternatively, you can install the gem with `bundler`: 
     | 
|
| 
       27 
27 
     | 
    
         
             
            # Gemfile
         
     | 
| 
       28 
28 
     | 
    
         
             
            gem 'openssl'
         
     | 
| 
       29 
29 
     | 
    
         
             
            # or specify git master
         
     | 
| 
       30 
     | 
    
         
            -
            gem 'openssl',  
     | 
| 
      
 30 
     | 
    
         
            +
            gem 'openssl', git: 'https://github.com/ruby/openssl'
         
     | 
| 
       31 
31 
     | 
    
         
             
            ```
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
            After doing `bundle install`, you should have the gem installed in your bundle.
         
     | 
    
        data/ext/openssl/deprecation.rb
    CHANGED
    
    | 
         @@ -3,9 +3,6 @@ module OpenSSL 
     | 
|
| 
       3 
3 
     | 
    
         
             
              def self.deprecated_warning_flag
         
     | 
| 
       4 
4 
     | 
    
         
             
                unless flag = (@deprecated_warning_flag ||= nil)
         
     | 
| 
       5 
5 
     | 
    
         
             
                  if try_compile("", flag = "-Werror=deprecated-declarations")
         
     | 
| 
       6 
     | 
    
         
            -
                    if /darwin/ =~ RUBY_PLATFORM and with_config("broken-apple-openssl")
         
     | 
| 
       7 
     | 
    
         
            -
                      flag = "-Wno-deprecated-declarations"
         
     | 
| 
       8 
     | 
    
         
            -
                    end
         
     | 
| 
       9 
6 
     | 
    
         
             
                    $warnflags << " #{flag}"
         
     | 
| 
       10 
7 
     | 
    
         
             
                  else
         
     | 
| 
       11 
8 
     | 
    
         
             
                    flag = ""
         
     | 
    
        data/ext/openssl/extconf.rb
    CHANGED
    
    | 
         @@ -33,9 +33,6 @@ end 
     | 
|
| 
       33 
33 
     | 
    
         
             
            Logging::message "=== Checking for system dependent stuff... ===\n"
         
     | 
| 
       34 
34 
     | 
    
         
             
            have_library("nsl", "t_open")
         
     | 
| 
       35 
35 
     | 
    
         
             
            have_library("socket", "socket")
         
     | 
| 
       36 
     | 
    
         
            -
            if $mswin || $mingw
         
     | 
| 
       37 
     | 
    
         
            -
              have_library("ws2_32")
         
     | 
| 
       38 
     | 
    
         
            -
            end
         
     | 
| 
       39 
36 
     | 
    
         | 
| 
       40 
37 
     | 
    
         
             
            Logging::message "=== Checking for required stuff... ===\n"
         
     | 
| 
       41 
38 
     | 
    
         
             
            result = pkg_config("openssl") && have_header("openssl/ssl.h")
         
     | 
| 
         @@ -94,30 +91,19 @@ unless result 
     | 
|
| 
       94 
91 
     | 
    
         
             
              unless find_openssl_library
         
     | 
| 
       95 
92 
     | 
    
         
             
                Logging::message "=== Checking for required stuff failed. ===\n"
         
     | 
| 
       96 
93 
     | 
    
         
             
                Logging::message "Makefile wasn't created. Fix the errors above.\n"
         
     | 
| 
       97 
     | 
    
         
            -
                 
     | 
| 
      
 94 
     | 
    
         
            +
                raise "OpenSSL library could not be found. You might want to use " \
         
     | 
| 
      
 95 
     | 
    
         
            +
                  "--with-openssl-dir=<dir> option to specify the prefix where OpenSSL " \
         
     | 
| 
      
 96 
     | 
    
         
            +
                  "is installed."
         
     | 
| 
       98 
97 
     | 
    
         
             
              end
         
     | 
| 
       99 
98 
     | 
    
         
             
            end
         
     | 
| 
       100 
99 
     | 
    
         | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
       104 
     | 
    
         
            -
            unless result
         
     | 
| 
       105 
     | 
    
         
            -
              raise "OpenSSL 0.9.8 or later required."
         
     | 
| 
       106 
     | 
    
         
            -
            end
         
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
            if /darwin/ =~ RUBY_PLATFORM and !OpenSSL.check_func("SSL_library_init()", "openssl/ssl.h")
         
     | 
| 
       109 
     | 
    
         
            -
              raise "Ignore OpenSSL broken by Apple.\nPlease use another openssl. (e.g. using `configure --with-openssl-dir=/path/to/openssl')"
         
     | 
| 
      
 100 
     | 
    
         
            +
            unless checking_for("OpenSSL version is 1.0.1 or later") {
         
     | 
| 
      
 101 
     | 
    
         
            +
                try_static_assert("OPENSSL_VERSION_NUMBER >= 0x10001000L", "openssl/opensslv.h") }
         
     | 
| 
      
 102 
     | 
    
         
            +
              raise "OpenSSL >= 1.0.1 or LibreSSL is required"
         
     | 
| 
       110 
103 
     | 
    
         
             
            end
         
     | 
| 
       111 
104 
     | 
    
         | 
| 
       112 
105 
     | 
    
         
             
            Logging::message "=== Checking for OpenSSL features... ===\n"
         
     | 
| 
       113 
106 
     | 
    
         
             
            # compile options
         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
            # SSLv2 and SSLv3 may be removed in future versions of OpenSSL, and even macros
         
     | 
| 
       116 
     | 
    
         
            -
            # like OPENSSL_NO_SSL2 may not be defined.
         
     | 
| 
       117 
     | 
    
         
            -
            have_func("SSLv2_method")
         
     | 
| 
       118 
     | 
    
         
            -
            have_func("SSLv3_method")
         
     | 
| 
       119 
     | 
    
         
            -
            have_func("TLSv1_1_method")
         
     | 
| 
       120 
     | 
    
         
            -
            have_func("TLSv1_2_method")
         
     | 
| 
       121 
107 
     | 
    
         
             
            have_func("RAND_egd")
         
     | 
| 
       122 
108 
     | 
    
         
             
            engines = %w{builtin_engines openbsd_dev_crypto dynamic 4758cca aep atalla chil
         
     | 
| 
       123 
109 
     | 
    
         
             
                         cswift nuron sureware ubsec padlock capi gmp gost cryptodev aesni}
         
     | 
| 
         @@ -125,34 +111,6 @@ engines.each { |name| 
     | 
|
| 
       125 
111 
     | 
    
         
             
              OpenSSL.check_func_or_macro("ENGINE_load_#{name}", "openssl/engine.h")
         
     | 
| 
       126 
112 
     | 
    
         
             
            }
         
     | 
| 
       127 
113 
     | 
    
         | 
| 
       128 
     | 
    
         
            -
            if ($mswin || $mingw) && have_macro("LIBRESSL_VERSION_NUMBER", "openssl/opensslv.h")
         
     | 
| 
       129 
     | 
    
         
            -
              $defs.push("-DNOCRYPT")
         
     | 
| 
       130 
     | 
    
         
            -
            end
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
            # added in 0.9.8X
         
     | 
| 
       133 
     | 
    
         
            -
            have_func("EVP_CIPHER_CTX_new")
         
     | 
| 
       134 
     | 
    
         
            -
            have_func("EVP_CIPHER_CTX_free")
         
     | 
| 
       135 
     | 
    
         
            -
            OpenSSL.check_func_or_macro("SSL_CTX_clear_options", "openssl/ssl.h")
         
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
            # added in 1.0.0
         
     | 
| 
       138 
     | 
    
         
            -
            have_func("ASN1_TIME_adj")
         
     | 
| 
       139 
     | 
    
         
            -
            have_func("EVP_CIPHER_CTX_copy")
         
     | 
| 
       140 
     | 
    
         
            -
            have_func("EVP_PKEY_base_id")
         
     | 
| 
       141 
     | 
    
         
            -
            have_func("HMAC_CTX_copy")
         
     | 
| 
       142 
     | 
    
         
            -
            have_func("PKCS5_PBKDF2_HMAC")
         
     | 
| 
       143 
     | 
    
         
            -
            have_func("X509_NAME_hash_old")
         
     | 
| 
       144 
     | 
    
         
            -
            have_func("X509_STORE_CTX_get0_current_crl")
         
     | 
| 
       145 
     | 
    
         
            -
            have_func("X509_STORE_set_verify_cb")
         
     | 
| 
       146 
     | 
    
         
            -
            have_func("i2d_ASN1_SET_ANY")
         
     | 
| 
       147 
     | 
    
         
            -
            have_func("SSL_SESSION_cmp") # removed
         
     | 
| 
       148 
     | 
    
         
            -
            OpenSSL.check_func_or_macro("SSL_set_tlsext_host_name", "openssl/ssl.h")
         
     | 
| 
       149 
     | 
    
         
            -
            have_struct_member("CRYPTO_THREADID", "ptr", "openssl/crypto.h")
         
     | 
| 
       150 
     | 
    
         
            -
            have_func("EVP_PKEY_get0")
         
     | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
            # added in 1.0.1
         
     | 
| 
       153 
     | 
    
         
            -
            have_func("SSL_CTX_set_next_proto_select_cb")
         
     | 
| 
       154 
     | 
    
         
            -
            have_macro("EVP_CTRL_GCM_GET_TAG", ['openssl/evp.h']) && $defs.push("-DHAVE_AUTHENTICATED_ENCRYPTION")
         
     | 
| 
       155 
     | 
    
         
            -
             
     | 
| 
       156 
114 
     | 
    
         
             
            # added in 1.0.2
         
     | 
| 
       157 
115 
     | 
    
         
             
            have_func("EC_curve_nist2nid")
         
     | 
| 
       158 
116 
     | 
    
         
             
            have_func("X509_REVOKED_dup")
         
     | 
| 
         @@ -164,11 +122,8 @@ OpenSSL.check_func_or_macro("SSL_get_server_tmp_key", "openssl/ssl.h") 
     | 
|
| 
       164 
122 
     | 
    
         
             
            have_func("SSL_is_server")
         
     | 
| 
       165 
123 
     | 
    
         | 
| 
       166 
124 
     | 
    
         
             
            # added in 1.1.0
         
     | 
| 
       167 
     | 
    
         
            -
            if !have_struct_member("SSL", "ctx", "openssl/ssl.h") ||
         
     | 
| 
       168 
     | 
    
         
            -
                try_static_assert("LIBRESSL_VERSION_NUMBER >= 0x2070000fL", "openssl/opensslv.h")
         
     | 
| 
       169 
     | 
    
         
            -
              $defs.push("-DHAVE_OPAQUE_OPENSSL")
         
     | 
| 
       170 
     | 
    
         
            -
            end
         
     | 
| 
       171 
125 
     | 
    
         
             
            have_func("CRYPTO_lock") || $defs.push("-DHAVE_OPENSSL_110_THREADING_API")
         
     | 
| 
      
 126 
     | 
    
         
            +
            have_struct_member("SSL", "ctx", "openssl/ssl.h") || $defs.push("-DHAVE_OPAQUE_OPENSSL")
         
     | 
| 
       172 
127 
     | 
    
         
             
            have_func("BN_GENCB_new")
         
     | 
| 
       173 
128 
     | 
    
         
             
            have_func("BN_GENCB_free")
         
     | 
| 
       174 
129 
     | 
    
         
             
            have_func("BN_GENCB_get_arg")
         
     | 
| 
         @@ -199,6 +154,7 @@ OpenSSL.check_func_or_macro("SSL_CTX_set_min_proto_version", "openssl/ssl.h") 
     | 
|
| 
       199 
154 
     | 
    
         
             
            have_func("SSL_CTX_get_security_level")
         
     | 
| 
       200 
155 
     | 
    
         
             
            have_func("X509_get0_notBefore")
         
     | 
| 
       201 
156 
     | 
    
         
             
            have_func("SSL_SESSION_get_protocol_version")
         
     | 
| 
      
 157 
     | 
    
         
            +
            have_func("EVP_PBE_scrypt")
         
     | 
| 
       202 
158 
     | 
    
         | 
| 
       203 
159 
     | 
    
         
             
            Logging::message "=== Checking done. ===\n"
         
     | 
| 
       204 
160 
     | 
    
         | 
| 
         @@ -20,73 +20,6 @@ 
     | 
|
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
            #include "openssl_missing.h"
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
            /* added in 0.9.8X */
         
     | 
| 
       24 
     | 
    
         
            -
            #if !defined(HAVE_EVP_CIPHER_CTX_NEW)
         
     | 
| 
       25 
     | 
    
         
            -
            EVP_CIPHER_CTX *
         
     | 
| 
       26 
     | 
    
         
            -
            ossl_EVP_CIPHER_CTX_new(void)
         
     | 
| 
       27 
     | 
    
         
            -
            {
         
     | 
| 
       28 
     | 
    
         
            -
                EVP_CIPHER_CTX *ctx = OPENSSL_malloc(sizeof(EVP_CIPHER_CTX));
         
     | 
| 
       29 
     | 
    
         
            -
                if (!ctx)
         
     | 
| 
       30 
     | 
    
         
            -
            	return NULL;
         
     | 
| 
       31 
     | 
    
         
            -
                EVP_CIPHER_CTX_init(ctx);
         
     | 
| 
       32 
     | 
    
         
            -
                return ctx;
         
     | 
| 
       33 
     | 
    
         
            -
            }
         
     | 
| 
       34 
     | 
    
         
            -
            #endif
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
            #if !defined(HAVE_EVP_CIPHER_CTX_FREE)
         
     | 
| 
       37 
     | 
    
         
            -
            void
         
     | 
| 
       38 
     | 
    
         
            -
            ossl_EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
         
     | 
| 
       39 
     | 
    
         
            -
            {
         
     | 
| 
       40 
     | 
    
         
            -
                if (ctx) {
         
     | 
| 
       41 
     | 
    
         
            -
            	EVP_CIPHER_CTX_cleanup(ctx);
         
     | 
| 
       42 
     | 
    
         
            -
            	OPENSSL_free(ctx);
         
     | 
| 
       43 
     | 
    
         
            -
                }
         
     | 
| 
       44 
     | 
    
         
            -
            }
         
     | 
| 
       45 
     | 
    
         
            -
            #endif
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
            /* added in 1.0.0 */
         
     | 
| 
       48 
     | 
    
         
            -
            #if !defined(HAVE_EVP_CIPHER_CTX_COPY)
         
     | 
| 
       49 
     | 
    
         
            -
            /*
         
     | 
| 
       50 
     | 
    
         
            -
             * this function does not exist in OpenSSL yet... or ever?.
         
     | 
| 
       51 
     | 
    
         
            -
             * a future version may break this function.
         
     | 
| 
       52 
     | 
    
         
            -
             * tested on 0.9.7d.
         
     | 
| 
       53 
     | 
    
         
            -
             */
         
     | 
| 
       54 
     | 
    
         
            -
            int
         
     | 
| 
       55 
     | 
    
         
            -
            ossl_EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
         
     | 
| 
       56 
     | 
    
         
            -
            {
         
     | 
| 
       57 
     | 
    
         
            -
                memcpy(out, in, sizeof(EVP_CIPHER_CTX));
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
            #if !defined(OPENSSL_NO_ENGINE)
         
     | 
| 
       60 
     | 
    
         
            -
                if (in->engine) ENGINE_add(out->engine);
         
     | 
| 
       61 
     | 
    
         
            -
                if (in->cipher_data) {
         
     | 
| 
       62 
     | 
    
         
            -
            	out->cipher_data = OPENSSL_malloc(in->cipher->ctx_size);
         
     | 
| 
       63 
     | 
    
         
            -
            	memcpy(out->cipher_data, in->cipher_data, in->cipher->ctx_size);
         
     | 
| 
       64 
     | 
    
         
            -
                }
         
     | 
| 
       65 
     | 
    
         
            -
            #endif
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
                return 1;
         
     | 
| 
       68 
     | 
    
         
            -
            }
         
     | 
| 
       69 
     | 
    
         
            -
            #endif
         
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
            #if !defined(OPENSSL_NO_HMAC)
         
     | 
| 
       72 
     | 
    
         
            -
            #if !defined(HAVE_HMAC_CTX_COPY)
         
     | 
| 
       73 
     | 
    
         
            -
            int
         
     | 
| 
       74 
     | 
    
         
            -
            ossl_HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in)
         
     | 
| 
       75 
     | 
    
         
            -
            {
         
     | 
| 
       76 
     | 
    
         
            -
                if (!out || !in)
         
     | 
| 
       77 
     | 
    
         
            -
            	return 0;
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                memcpy(out, in, sizeof(HMAC_CTX));
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx);
         
     | 
| 
       82 
     | 
    
         
            -
                EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx);
         
     | 
| 
       83 
     | 
    
         
            -
                EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx);
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
                return 1;
         
     | 
| 
       86 
     | 
    
         
            -
            }
         
     | 
| 
       87 
     | 
    
         
            -
            #endif /* HAVE_HMAC_CTX_COPY */
         
     | 
| 
       88 
     | 
    
         
            -
            #endif /* NO_HMAC */
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
23 
     | 
    
         
             
            /* added in 1.0.2 */
         
     | 
| 
       91 
24 
     | 
    
         
             
            #if !defined(OPENSSL_NO_EC)
         
     | 
| 
       92 
25 
     | 
    
         
             
            #if !defined(HAVE_EC_CURVE_NIST2NID)
         
     | 
| 
         @@ -12,53 +12,6 @@ 
     | 
|
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
            #include "ruby/config.h"
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
            /* added in 0.9.8X */
         
     | 
| 
       16 
     | 
    
         
            -
            #if !defined(HAVE_EVP_CIPHER_CTX_NEW)
         
     | 
| 
       17 
     | 
    
         
            -
            EVP_CIPHER_CTX *ossl_EVP_CIPHER_CTX_new(void);
         
     | 
| 
       18 
     | 
    
         
            -
            #  define EVP_CIPHER_CTX_new ossl_EVP_CIPHER_CTX_new
         
     | 
| 
       19 
     | 
    
         
            -
            #endif
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
            #if !defined(HAVE_EVP_CIPHER_CTX_FREE)
         
     | 
| 
       22 
     | 
    
         
            -
            void ossl_EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *);
         
     | 
| 
       23 
     | 
    
         
            -
            #  define EVP_CIPHER_CTX_free ossl_EVP_CIPHER_CTX_free
         
     | 
| 
       24 
     | 
    
         
            -
            #endif
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
            #if !defined(HAVE_SSL_CTX_CLEAR_OPTIONS)
         
     | 
| 
       27 
     | 
    
         
            -
            #  define SSL_CTX_clear_options(ctx, op) ((ctx)->options &= ~(op))
         
     | 
| 
       28 
     | 
    
         
            -
            #endif
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            /* added in 1.0.0 */
         
     | 
| 
       31 
     | 
    
         
            -
            #if !defined(HAVE_EVP_PKEY_BASE_ID)
         
     | 
| 
       32 
     | 
    
         
            -
            #  define EVP_PKEY_base_id(pkey) EVP_PKEY_type((pkey)->type)
         
     | 
| 
       33 
     | 
    
         
            -
            #endif
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
            #if !defined(HAVE_EVP_CIPHER_CTX_COPY)
         
     | 
| 
       36 
     | 
    
         
            -
            int ossl_EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *, const EVP_CIPHER_CTX *);
         
     | 
| 
       37 
     | 
    
         
            -
            #  define EVP_CIPHER_CTX_copy ossl_EVP_CIPHER_CTX_copy
         
     | 
| 
       38 
     | 
    
         
            -
            #endif
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
            #if !defined(HAVE_HMAC_CTX_COPY)
         
     | 
| 
       41 
     | 
    
         
            -
            int ossl_HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in);
         
     | 
| 
       42 
     | 
    
         
            -
            #  define HMAC_CTX_copy ossl_HMAC_CTX_copy
         
     | 
| 
       43 
     | 
    
         
            -
            #endif
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
            #if !defined(HAVE_X509_STORE_CTX_GET0_CURRENT_CRL)
         
     | 
| 
       46 
     | 
    
         
            -
            #  define X509_STORE_CTX_get0_current_crl(x) ((x)->current_crl)
         
     | 
| 
       47 
     | 
    
         
            -
            #endif
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
            #if !defined(HAVE_X509_STORE_SET_VERIFY_CB)
         
     | 
| 
       50 
     | 
    
         
            -
            #  define X509_STORE_set_verify_cb X509_STORE_set_verify_cb_func
         
     | 
| 
       51 
     | 
    
         
            -
            #endif
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
            #if !defined(HAVE_I2D_ASN1_SET_ANY)
         
     | 
| 
       54 
     | 
    
         
            -
            #  define i2d_ASN1_SET_ANY(sk, x) i2d_ASN1_SET_OF_ASN1_TYPE((sk), (x), \
         
     | 
| 
       55 
     | 
    
         
            -
            		i2d_ASN1_TYPE, V_ASN1_SET, V_ASN1_UNIVERSAL, 0)
         
     | 
| 
       56 
     | 
    
         
            -
            #endif
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
            #if !defined(HAVE_EVP_PKEY_GET0)
         
     | 
| 
       59 
     | 
    
         
            -
            #  define EVP_PKEY_get0(pk) (pk->pkey.ptr)
         
     | 
| 
       60 
     | 
    
         
            -
            #endif
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
15 
     | 
    
         
             
            /* added in 1.0.2 */
         
     | 
| 
       63 
16 
     | 
    
         
             
            #if !defined(OPENSSL_NO_EC)
         
     | 
| 
       64 
17 
     | 
    
         
             
            #if !defined(HAVE_EC_CURVE_NIST2NID)
         
     | 
| 
         @@ -196,7 +149,7 @@ void ossl_X509_REQ_get0_signature(const X509_REQ *, const ASN1_BIT_STRING **, co 
     | 
|
| 
       196 
149 
     | 
    
         
             
            static inline _type *EVP_PKEY_get0_##_type(EVP_PKEY *pkey) { \
         
     | 
| 
       197 
150 
     | 
    
         
             
            	return pkey->pkey._name; }
         
     | 
| 
       198 
151 
     | 
    
         
             
            #define IMPL_KEY_ACCESSOR2(_type, _group, a1, a2, _fail_cond) \
         
     | 
| 
       199 
     | 
    
         
            -
            static inline void _type##_get0_##_group( 
     | 
| 
      
 152 
     | 
    
         
            +
            static inline void _type##_get0_##_group(_type *obj, const BIGNUM **a1, const BIGNUM **a2) { \
         
     | 
| 
       200 
153 
     | 
    
         
             
            	if (a1) *a1 = obj->a1; \
         
     | 
| 
       201 
154 
     | 
    
         
             
            	if (a2) *a2 = obj->a2; } \
         
     | 
| 
       202 
155 
     | 
    
         
             
            static inline int _type##_set0_##_group(_type *obj, BIGNUM *a1, BIGNUM *a2) { \
         
     | 
| 
         @@ -205,7 +158,7 @@ static inline int _type##_set0_##_group(_type *obj, BIGNUM *a1, BIGNUM *a2) { \ 
     | 
|
| 
       205 
158 
     | 
    
         
             
            	BN_clear_free(obj->a2); obj->a2 = a2; \
         
     | 
| 
       206 
159 
     | 
    
         
             
            	return 1; }
         
     | 
| 
       207 
160 
     | 
    
         
             
            #define IMPL_KEY_ACCESSOR3(_type, _group, a1, a2, a3, _fail_cond) \
         
     | 
| 
       208 
     | 
    
         
            -
            static inline void _type##_get0_##_group( 
     | 
| 
      
 161 
     | 
    
         
            +
            static inline void _type##_get0_##_group(_type *obj, const BIGNUM **a1, const BIGNUM **a2, const BIGNUM **a3) { \
         
     | 
| 
       209 
162 
     | 
    
         
             
            	if (a1) *a1 = obj->a1; \
         
     | 
| 
       210 
163 
     | 
    
         
             
            	if (a2) *a2 = obj->a2; \
         
     | 
| 
       211 
164 
     | 
    
         
             
            	if (a3) *a3 = obj->a3; } \
         
     | 
| 
         @@ -245,7 +198,7 @@ IMPL_PKEY_GETTER(EC_KEY, ec) 
     | 
|
| 
       245 
198 
     | 
    
         
             
            #undef IMPL_KEY_ACCESSOR3
         
     | 
| 
       246 
199 
     | 
    
         
             
            #endif /* HAVE_OPAQUE_OPENSSL */
         
     | 
| 
       247 
200 
     | 
    
         | 
| 
       248 
     | 
    
         
            -
            #if  
     | 
| 
      
 201 
     | 
    
         
            +
            #if !defined(EVP_CTRL_AEAD_GET_TAG)
         
     | 
| 
       249 
202 
     | 
    
         
             
            #  define EVP_CTRL_AEAD_GET_TAG EVP_CTRL_GCM_GET_TAG
         
     | 
| 
       250 
203 
     | 
    
         
             
            #  define EVP_CTRL_AEAD_SET_TAG EVP_CTRL_GCM_SET_TAG
         
     | 
| 
       251 
204 
     | 
    
         
             
            #  define EVP_CTRL_AEAD_SET_IVLEN EVP_CTRL_GCM_SET_IVLEN
         
     | 
    
        data/ext/openssl/ossl.c
    CHANGED
    
    | 
         @@ -92,22 +92,40 @@ OSSL_IMPL_SK2ARY(x509crl, X509_CRL) 
     | 
|
| 
       92 
92 
     | 
    
         
             
            OSSL_IMPL_SK2ARY(x509name, X509_NAME)
         
     | 
| 
       93 
93 
     | 
    
         | 
| 
       94 
94 
     | 
    
         
             
            static VALUE
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
      
 95 
     | 
    
         
            +
            ossl_str_new_i(VALUE size)
         
     | 
| 
       96 
96 
     | 
    
         
             
            {
         
     | 
| 
       97 
     | 
    
         
            -
                return rb_str_new( 
     | 
| 
      
 97 
     | 
    
         
            +
                return rb_str_new(NULL, (long)size);
         
     | 
| 
      
 98 
     | 
    
         
            +
            }
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
            VALUE
         
     | 
| 
      
 101 
     | 
    
         
            +
            ossl_str_new(const char *ptr, long len, int *pstate)
         
     | 
| 
      
 102 
     | 
    
         
            +
            {
         
     | 
| 
      
 103 
     | 
    
         
            +
                VALUE str;
         
     | 
| 
      
 104 
     | 
    
         
            +
                int state;
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
                str = rb_protect(ossl_str_new_i, len, &state);
         
     | 
| 
      
 107 
     | 
    
         
            +
                if (pstate)
         
     | 
| 
      
 108 
     | 
    
         
            +
            	*pstate = state;
         
     | 
| 
      
 109 
     | 
    
         
            +
                if (state) {
         
     | 
| 
      
 110 
     | 
    
         
            +
            	if (!pstate)
         
     | 
| 
      
 111 
     | 
    
         
            +
            	    rb_set_errinfo(Qnil);
         
     | 
| 
      
 112 
     | 
    
         
            +
            	return Qnil;
         
     | 
| 
      
 113 
     | 
    
         
            +
                }
         
     | 
| 
      
 114 
     | 
    
         
            +
                if (ptr)
         
     | 
| 
      
 115 
     | 
    
         
            +
            	memcpy(RSTRING_PTR(str), ptr, len);
         
     | 
| 
      
 116 
     | 
    
         
            +
                return str;
         
     | 
| 
       98 
117 
     | 
    
         
             
            }
         
     | 
| 
       99 
118 
     | 
    
         | 
| 
       100 
119 
     | 
    
         
             
            VALUE
         
     | 
| 
       101 
120 
     | 
    
         
             
            ossl_buf2str(char *buf, int len)
         
     | 
| 
       102 
121 
     | 
    
         
             
            {
         
     | 
| 
       103 
122 
     | 
    
         
             
                VALUE str;
         
     | 
| 
       104 
     | 
    
         
            -
                int  
     | 
| 
      
 123 
     | 
    
         
            +
                int state;
         
     | 
| 
       105 
124 
     | 
    
         | 
| 
       106 
     | 
    
         
            -
                str =  
     | 
| 
       107 
     | 
    
         
            -
                if(!NIL_P(str)) memcpy(RSTRING_PTR(str), buf, len);
         
     | 
| 
      
 125 
     | 
    
         
            +
                str = ossl_str_new(buf, len, &state);
         
     | 
| 
       108 
126 
     | 
    
         
             
                OPENSSL_free(buf);
         
     | 
| 
       109 
     | 
    
         
            -
                if 
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
      
 127 
     | 
    
         
            +
                if (state)
         
     | 
| 
      
 128 
     | 
    
         
            +
            	rb_jump_tag(state);
         
     | 
| 
       111 
129 
     | 
    
         
             
                return str;
         
     | 
| 
       112 
130 
     | 
    
         
             
            }
         
     | 
| 
       113 
131 
     | 
    
         | 
| 
         @@ -220,7 +238,7 @@ VALUE eOSSLError; 
     | 
|
| 
       220 
238 
     | 
    
         
             
            /*
         
     | 
| 
       221 
239 
     | 
    
         
             
             * Convert to DER string
         
     | 
| 
       222 
240 
     | 
    
         
             
             */
         
     | 
| 
       223 
     | 
    
         
            -
            ID ossl_s_to_der;
         
     | 
| 
      
 241 
     | 
    
         
            +
            static ID ossl_s_to_der;
         
     | 
| 
       224 
242 
     | 
    
         | 
| 
       225 
243 
     | 
    
         
             
            VALUE
         
     | 
| 
       226 
244 
     | 
    
         
             
            ossl_to_der(VALUE obj)
         
     | 
| 
         @@ -248,18 +266,15 @@ static VALUE 
     | 
|
| 
       248 
266 
     | 
    
         
             
            ossl_make_error(VALUE exc, const char *fmt, va_list args)
         
     | 
| 
       249 
267 
     | 
    
         
             
            {
         
     | 
| 
       250 
268 
     | 
    
         
             
                VALUE str = Qnil;
         
     | 
| 
       251 
     | 
    
         
            -
                 
     | 
| 
       252 
     | 
    
         
            -
                long e;
         
     | 
| 
      
 269 
     | 
    
         
            +
                unsigned long e;
         
     | 
| 
       253 
270 
     | 
    
         | 
| 
       254 
     | 
    
         
            -
                e = ERR_peek_last_error();
         
     | 
| 
       255 
271 
     | 
    
         
             
                if (fmt) {
         
     | 
| 
       256 
272 
     | 
    
         
             
            	str = rb_vsprintf(fmt, args);
         
     | 
| 
       257 
273 
     | 
    
         
             
                }
         
     | 
| 
      
 274 
     | 
    
         
            +
                e = ERR_peek_last_error();
         
     | 
| 
       258 
275 
     | 
    
         
             
                if (e) {
         
     | 
| 
       259 
     | 
    
         
            -
            	 
     | 
| 
       260 
     | 
    
         
            -
             
     | 
| 
       261 
     | 
    
         
            -
            	else
         
     | 
| 
       262 
     | 
    
         
            -
            	    msg = ERR_reason_error_string(e);
         
     | 
| 
      
 276 
     | 
    
         
            +
            	const char *msg = ERR_reason_error_string(e);
         
     | 
| 
      
 277 
     | 
    
         
            +
             
     | 
| 
       263 
278 
     | 
    
         
             
            	if (NIL_P(str)) {
         
     | 
| 
       264 
279 
     | 
    
         
             
            	    if (msg) str = rb_str_new_cstr(msg);
         
     | 
| 
       265 
280 
     | 
    
         
             
            	}
         
     | 
| 
         @@ -267,8 +282,8 @@ ossl_make_error(VALUE exc, const char *fmt, va_list args) 
     | 
|
| 
       267 
282 
     | 
    
         
             
            	    if (RSTRING_LEN(str)) rb_str_cat2(str, ": ");
         
     | 
| 
       268 
283 
     | 
    
         
             
            	    rb_str_cat2(str, msg ? msg : "(null)");
         
     | 
| 
       269 
284 
     | 
    
         
             
            	}
         
     | 
| 
      
 285 
     | 
    
         
            +
            	ossl_clear_error();
         
     | 
| 
       270 
286 
     | 
    
         
             
                }
         
     | 
| 
       271 
     | 
    
         
            -
                ossl_clear_error();
         
     | 
| 
       272 
287 
     | 
    
         | 
| 
       273 
288 
     | 
    
         
             
                if (NIL_P(str)) str = rb_str_new(0, 0);
         
     | 
| 
       274 
289 
     | 
    
         
             
                return rb_exc_new3(exc, str);
         
     | 
| 
         @@ -319,7 +334,8 @@ ossl_clear_error(void) 
     | 
|
| 
       319 
334 
     | 
    
         
             
             *
         
     | 
| 
       320 
335 
     | 
    
         
             
             * See any remaining errors held in queue.
         
     | 
| 
       321 
336 
     | 
    
         
             
             *
         
     | 
| 
       322 
     | 
    
         
            -
             * Any errors you see here are probably due to a bug in  
     | 
| 
      
 337 
     | 
    
         
            +
             * Any errors you see here are probably due to a bug in Ruby's OpenSSL
         
     | 
| 
      
 338 
     | 
    
         
            +
             * implementation.
         
     | 
| 
       323 
339 
     | 
    
         
             
             */
         
     | 
| 
       324 
340 
     | 
    
         
             
            VALUE
         
     | 
| 
       325 
341 
     | 
    
         
             
            ossl_get_errors(void)
         
     | 
| 
         @@ -381,6 +397,23 @@ ossl_debug_set(VALUE self, VALUE val) 
     | 
|
| 
       381 
397 
     | 
    
         
             
                return val;
         
     | 
| 
       382 
398 
     | 
    
         
             
            }
         
     | 
| 
       383 
399 
     | 
    
         | 
| 
      
 400 
     | 
    
         
            +
            /*
         
     | 
| 
      
 401 
     | 
    
         
            +
             * call-seq
         
     | 
| 
      
 402 
     | 
    
         
            +
             *   OpenSSL.fips_mode -> true | false
         
     | 
| 
      
 403 
     | 
    
         
            +
             */
         
     | 
| 
      
 404 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 405 
     | 
    
         
            +
            ossl_fips_mode_get(VALUE self)
         
     | 
| 
      
 406 
     | 
    
         
            +
            {
         
     | 
| 
      
 407 
     | 
    
         
            +
             
     | 
| 
      
 408 
     | 
    
         
            +
            #ifdef OPENSSL_FIPS
         
     | 
| 
      
 409 
     | 
    
         
            +
                VALUE enabled;
         
     | 
| 
      
 410 
     | 
    
         
            +
                enabled = FIPS_mode() ? Qtrue : Qfalse;
         
     | 
| 
      
 411 
     | 
    
         
            +
                return enabled;
         
     | 
| 
      
 412 
     | 
    
         
            +
            #else
         
     | 
| 
      
 413 
     | 
    
         
            +
                return Qfalse;
         
     | 
| 
      
 414 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 415 
     | 
    
         
            +
            }
         
     | 
| 
      
 416 
     | 
    
         
            +
             
     | 
| 
       384 
417 
     | 
    
         
             
            /*
         
     | 
| 
       385 
418 
     | 
    
         
             
             * call-seq:
         
     | 
| 
       386 
419 
     | 
    
         
             
             *   OpenSSL.fips_mode = boolean -> boolean
         
     | 
| 
         @@ -443,7 +476,7 @@ mem_check_start(VALUE self) 
     | 
|
| 
       443 
476 
     | 
    
         
             
             * Prints detected memory leaks to standard error. This cleans the global state
         
     | 
| 
       444 
477 
     | 
    
         
             
             * up thus you cannot use any methods of the library after calling this.
         
     | 
| 
       445 
478 
     | 
    
         
             
             *
         
     | 
| 
       446 
     | 
    
         
            -
             * Returns true if leaks detected, false otherwise.
         
     | 
| 
      
 479 
     | 
    
         
            +
             * Returns +true+ if leaks detected, +false+ otherwise.
         
     | 
| 
       447 
480 
     | 
    
         
             
             *
         
     | 
| 
       448 
481 
     | 
    
         
             
             * This is available only when built with a capable OpenSSL and --enable-debug
         
     | 
| 
       449 
482 
     | 
    
         
             
             * configure option.
         
     | 
| 
         @@ -484,53 +517,40 @@ print_mem_leaks(VALUE self) 
     | 
|
| 
       484 
517 
     | 
    
         
             
            /**
         
     | 
| 
       485 
518 
     | 
    
         
             
             * Stores locks needed for OpenSSL thread safety
         
     | 
| 
       486 
519 
     | 
    
         
             
             */
         
     | 
| 
       487 
     | 
    
         
            -
             
     | 
| 
       488 
     | 
    
         
            -
                rb_nativethread_lock_t lock;
         
     | 
| 
       489 
     | 
    
         
            -
                rb_nativethread_id_t owner;
         
     | 
| 
       490 
     | 
    
         
            -
                size_t count;
         
     | 
| 
       491 
     | 
    
         
            -
            };
         
     | 
| 
      
 520 
     | 
    
         
            +
            static rb_nativethread_lock_t *ossl_locks;
         
     | 
| 
       492 
521 
     | 
    
         | 
| 
       493 
522 
     | 
    
         
             
            static void
         
     | 
| 
       494 
     | 
    
         
            -
             
     | 
| 
      
 523 
     | 
    
         
            +
            ossl_lock_unlock(int mode, rb_nativethread_lock_t *lock)
         
     | 
| 
       495 
524 
     | 
    
         
             
            {
         
     | 
| 
       496 
     | 
    
         
            -
                 
     | 
| 
       497 
     | 
    
         
            -
             
     | 
| 
      
 525 
     | 
    
         
            +
                if (mode & CRYPTO_LOCK) {
         
     | 
| 
      
 526 
     | 
    
         
            +
            	rb_nativethread_lock_lock(lock);
         
     | 
| 
      
 527 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 528 
     | 
    
         
            +
            	rb_nativethread_lock_unlock(lock);
         
     | 
| 
      
 529 
     | 
    
         
            +
                }
         
     | 
| 
       498 
530 
     | 
    
         
             
            }
         
     | 
| 
       499 
531 
     | 
    
         | 
| 
       500 
532 
     | 
    
         
             
            static void
         
     | 
| 
       501 
     | 
    
         
            -
             
     | 
| 
      
 533 
     | 
    
         
            +
            ossl_lock_callback(int mode, int type, const char *file, int line)
         
     | 
| 
       502 
534 
     | 
    
         
             
            {
         
     | 
| 
       503 
     | 
    
         
            -
                 
     | 
| 
       504 
     | 
    
         
            -
            	/* TODO: rb_nativethread_id_t is not necessarily compared with ==. */
         
     | 
| 
       505 
     | 
    
         
            -
            	rb_nativethread_id_t tid = rb_nativethread_self();
         
     | 
| 
       506 
     | 
    
         
            -
            	if (l->count && l->owner == tid) {
         
     | 
| 
       507 
     | 
    
         
            -
            	    l->count++;
         
     | 
| 
       508 
     | 
    
         
            -
            	    return;
         
     | 
| 
       509 
     | 
    
         
            -
            	}
         
     | 
| 
       510 
     | 
    
         
            -
            	rb_nativethread_lock_lock(&l->lock);
         
     | 
| 
       511 
     | 
    
         
            -
            	l->owner = tid;
         
     | 
| 
       512 
     | 
    
         
            -
            	l->count = 1;
         
     | 
| 
       513 
     | 
    
         
            -
                } else {
         
     | 
| 
       514 
     | 
    
         
            -
            	if (!--l->count)
         
     | 
| 
       515 
     | 
    
         
            -
            	    rb_nativethread_lock_unlock(&l->lock);
         
     | 
| 
       516 
     | 
    
         
            -
                }
         
     | 
| 
      
 535 
     | 
    
         
            +
                ossl_lock_unlock(mode, &ossl_locks[type]);
         
     | 
| 
       517 
536 
     | 
    
         
             
            }
         
     | 
| 
       518 
537 
     | 
    
         | 
| 
      
 538 
     | 
    
         
            +
            struct CRYPTO_dynlock_value {
         
     | 
| 
      
 539 
     | 
    
         
            +
                rb_nativethread_lock_t lock;
         
     | 
| 
      
 540 
     | 
    
         
            +
            };
         
     | 
| 
      
 541 
     | 
    
         
            +
             
     | 
| 
       519 
542 
     | 
    
         
             
            static struct CRYPTO_dynlock_value *
         
     | 
| 
       520 
543 
     | 
    
         
             
            ossl_dyn_create_callback(const char *file, int line)
         
     | 
| 
       521 
544 
     | 
    
         
             
            {
         
     | 
| 
       522 
     | 
    
         
            -
                 
     | 
| 
       523 
     | 
    
         
            -
                 
     | 
| 
       524 
     | 
    
         
            -
            	OPENSSL_malloc(sizeof(struct CRYPTO_dynlock_value));
         
     | 
| 
       525 
     | 
    
         
            -
                if (dynlock)
         
     | 
| 
       526 
     | 
    
         
            -
            	ossl_lock_init(dynlock);
         
     | 
| 
      
 545 
     | 
    
         
            +
                struct CRYPTO_dynlock_value *dynlock = (struct CRYPTO_dynlock_value *)OPENSSL_malloc((int)sizeof(struct CRYPTO_dynlock_value));
         
     | 
| 
      
 546 
     | 
    
         
            +
                rb_nativethread_lock_initialize(&dynlock->lock);
         
     | 
| 
       527 
547 
     | 
    
         
             
                return dynlock;
         
     | 
| 
       528 
548 
     | 
    
         
             
            }
         
     | 
| 
       529 
549 
     | 
    
         | 
| 
       530 
550 
     | 
    
         
             
            static void
         
     | 
| 
       531 
551 
     | 
    
         
             
            ossl_dyn_lock_callback(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)
         
     | 
| 
       532 
552 
     | 
    
         
             
            {
         
     | 
| 
       533 
     | 
    
         
            -
                ossl_lock_unlock(mode, l);
         
     | 
| 
      
 553 
     | 
    
         
            +
                ossl_lock_unlock(mode, &l->lock);
         
     | 
| 
       534 
554 
     | 
    
         
             
            }
         
     | 
| 
       535 
555 
     | 
    
         | 
| 
       536 
556 
     | 
    
         
             
            static void
         
     | 
| 
         @@ -540,42 +560,29 @@ ossl_dyn_destroy_callback(struct CRYPTO_dynlock_value *l, const char *file, int 
     | 
|
| 
       540 
560 
     | 
    
         
             
                OPENSSL_free(l);
         
     | 
| 
       541 
561 
     | 
    
         
             
            }
         
     | 
| 
       542 
562 
     | 
    
         | 
| 
       543 
     | 
    
         
            -
            #ifdef HAVE_CRYPTO_THREADID_PTR
         
     | 
| 
       544 
563 
     | 
    
         
             
            static void ossl_threadid_func(CRYPTO_THREADID *id)
         
     | 
| 
       545 
564 
     | 
    
         
             
            {
         
     | 
| 
       546 
565 
     | 
    
         
             
                /* register native thread id */
         
     | 
| 
       547 
566 
     | 
    
         
             
                CRYPTO_THREADID_set_pointer(id, (void *)rb_nativethread_self());
         
     | 
| 
       548 
567 
     | 
    
         
             
            }
         
     | 
| 
       549 
     | 
    
         
            -
            #else
         
     | 
| 
       550 
     | 
    
         
            -
            static unsigned long ossl_thread_id(void)
         
     | 
| 
       551 
     | 
    
         
            -
            {
         
     | 
| 
       552 
     | 
    
         
            -
                /* before OpenSSL 1.0, this is 'unsigned long' */
         
     | 
| 
       553 
     | 
    
         
            -
                return (unsigned long)rb_nativethread_self();
         
     | 
| 
       554 
     | 
    
         
            -
            }
         
     | 
| 
       555 
     | 
    
         
            -
            #endif
         
     | 
| 
       556 
     | 
    
         
            -
             
     | 
| 
       557 
     | 
    
         
            -
            static struct CRYPTO_dynlock_value *ossl_locks;
         
     | 
| 
       558 
     | 
    
         
            -
             
     | 
| 
       559 
     | 
    
         
            -
            static void
         
     | 
| 
       560 
     | 
    
         
            -
            ossl_lock_callback(int mode, int type, const char *file, int line)
         
     | 
| 
       561 
     | 
    
         
            -
            {
         
     | 
| 
       562 
     | 
    
         
            -
                ossl_lock_unlock(mode, &ossl_locks[type]);
         
     | 
| 
       563 
     | 
    
         
            -
            }
         
     | 
| 
       564 
568 
     | 
    
         | 
| 
       565 
569 
     | 
    
         
             
            static void Init_ossl_locks(void)
         
     | 
| 
       566 
570 
     | 
    
         
             
            {
         
     | 
| 
       567 
571 
     | 
    
         
             
                int i;
         
     | 
| 
       568 
572 
     | 
    
         
             
                int num_locks = CRYPTO_num_locks();
         
     | 
| 
       569 
573 
     | 
    
         | 
| 
       570 
     | 
    
         
            -
                 
     | 
| 
       571 
     | 
    
         
            -
             
     | 
| 
       572 
     | 
    
         
            -
             
     | 
| 
      
 574 
     | 
    
         
            +
                if ((unsigned)num_locks >= INT_MAX / (int)sizeof(VALUE)) {
         
     | 
| 
      
 575 
     | 
    
         
            +
            	rb_raise(rb_eRuntimeError, "CRYPTO_num_locks() is too big: %d", num_locks);
         
     | 
| 
      
 576 
     | 
    
         
            +
                }
         
     | 
| 
      
 577 
     | 
    
         
            +
                ossl_locks = (rb_nativethread_lock_t *) OPENSSL_malloc(num_locks * (int)sizeof(rb_nativethread_lock_t));
         
     | 
| 
      
 578 
     | 
    
         
            +
                if (!ossl_locks) {
         
     | 
| 
      
 579 
     | 
    
         
            +
            	rb_raise(rb_eNoMemError, "CRYPTO_num_locks() is too big: %d", num_locks);
         
     | 
| 
      
 580 
     | 
    
         
            +
                }
         
     | 
| 
      
 581 
     | 
    
         
            +
                for (i = 0; i < num_locks; i++) {
         
     | 
| 
      
 582 
     | 
    
         
            +
            	rb_nativethread_lock_initialize(&ossl_locks[i]);
         
     | 
| 
      
 583 
     | 
    
         
            +
                }
         
     | 
| 
       573 
584 
     | 
    
         | 
| 
       574 
     | 
    
         
            -
            #ifdef HAVE_CRYPTO_THREADID_PTR
         
     | 
| 
       575 
585 
     | 
    
         
             
                CRYPTO_THREADID_set_callback(ossl_threadid_func);
         
     | 
| 
       576 
     | 
    
         
            -
            #else
         
     | 
| 
       577 
     | 
    
         
            -
                CRYPTO_set_id_callback(ossl_thread_id);
         
     | 
| 
       578 
     | 
    
         
            -
            #endif
         
     | 
| 
       579 
586 
     | 
    
         
             
                CRYPTO_set_locking_callback(ossl_lock_callback);
         
     | 
| 
       580 
587 
     | 
    
         
             
                CRYPTO_set_dynlock_create_callback(ossl_dyn_create_callback);
         
     | 
| 
       581 
588 
     | 
    
         
             
                CRYPTO_set_dynlock_lock_callback(ossl_dyn_lock_callback);
         
     | 
| 
         @@ -585,7 +592,7 @@ static void Init_ossl_locks(void) 
     | 
|
| 
       585 
592 
     | 
    
         | 
| 
       586 
593 
     | 
    
         
             
            /*
         
     | 
| 
       587 
594 
     | 
    
         
             
             * OpenSSL provides SSL, TLS and general purpose cryptography.  It wraps the
         
     | 
| 
       588 
     | 
    
         
            -
             * OpenSSL[ 
     | 
| 
      
 595 
     | 
    
         
            +
             * OpenSSL[https://www.openssl.org/] library.
         
     | 
| 
       589 
596 
     | 
    
         
             
             *
         
     | 
| 
       590 
597 
     | 
    
         
             
             * = Examples
         
     | 
| 
       591 
598 
     | 
    
         
             
             *
         
     | 
| 
         @@ -1078,7 +1085,6 @@ static void Init_ossl_locks(void) 
     | 
|
| 
       1078 
1085 
     | 
    
         
             
            void
         
     | 
| 
       1079 
1086 
     | 
    
         
             
            Init_openssl(void)
         
     | 
| 
       1080 
1087 
     | 
    
         
             
            {
         
     | 
| 
       1081 
     | 
    
         
            -
            #undef rb_intern
         
     | 
| 
       1082 
1088 
     | 
    
         
             
                /*
         
     | 
| 
       1083 
1089 
     | 
    
         
             
                 * Init timezone info
         
     | 
| 
       1084 
1090 
     | 
    
         
             
                 */
         
     | 
| 
         @@ -1138,7 +1144,7 @@ Init_openssl(void) 
     | 
|
| 
       1138 
1144 
     | 
    
         
             
                rb_define_const(mOSSL, "OPENSSL_VERSION_NUMBER", INT2NUM(OPENSSL_VERSION_NUMBER));
         
     | 
| 
       1139 
1145 
     | 
    
         | 
| 
       1140 
1146 
     | 
    
         
             
                /*
         
     | 
| 
       1141 
     | 
    
         
            -
                 * Boolean indicating whether OpenSSL is FIPS- 
     | 
| 
      
 1147 
     | 
    
         
            +
                 * Boolean indicating whether OpenSSL is FIPS-capable or not
         
     | 
| 
       1142 
1148 
     | 
    
         
             
                 */
         
     | 
| 
       1143 
1149 
     | 
    
         
             
                rb_define_const(mOSSL, "OPENSSL_FIPS",
         
     | 
| 
       1144 
1150 
     | 
    
         
             
            #ifdef OPENSSL_FIPS
         
     | 
| 
         @@ -1148,6 +1154,7 @@ Init_openssl(void) 
     | 
|
| 
       1148 
1154 
     | 
    
         
             
            #endif
         
     | 
| 
       1149 
1155 
     | 
    
         
             
            		   );
         
     | 
| 
       1150 
1156 
     | 
    
         | 
| 
      
 1157 
     | 
    
         
            +
                rb_define_module_function(mOSSL, "fips_mode", ossl_fips_mode_get, 0);
         
     | 
| 
       1151 
1158 
     | 
    
         
             
                rb_define_module_function(mOSSL, "fips_mode=", ossl_fips_mode_set, 1);
         
     | 
| 
       1152 
1159 
     | 
    
         | 
| 
       1153 
1160 
     | 
    
         
             
                /*
         
     | 
| 
         @@ -1187,7 +1194,6 @@ Init_openssl(void) 
     | 
|
| 
       1187 
1194 
     | 
    
         
             
                Init_ossl_ns_spki();
         
     | 
| 
       1188 
1195 
     | 
    
         
             
                Init_ossl_pkcs12();
         
     | 
| 
       1189 
1196 
     | 
    
         
             
                Init_ossl_pkcs7();
         
     | 
| 
       1190 
     | 
    
         
            -
                Init_ossl_pkcs5();
         
     | 
| 
       1191 
1197 
     | 
    
         
             
                Init_ossl_pkey();
         
     | 
| 
       1192 
1198 
     | 
    
         
             
                Init_ossl_rand();
         
     | 
| 
       1193 
1199 
     | 
    
         
             
                Init_ossl_ssl();
         
     | 
| 
         @@ -1195,6 +1201,7 @@ Init_openssl(void) 
     | 
|
| 
       1195 
1201 
     | 
    
         
             
                Init_ossl_ocsp();
         
     | 
| 
       1196 
1202 
     | 
    
         
             
                Init_ossl_engine();
         
     | 
| 
       1197 
1203 
     | 
    
         
             
                Init_ossl_asn1();
         
     | 
| 
      
 1204 
     | 
    
         
            +
                Init_ossl_kdf();
         
     | 
| 
       1198 
1205 
     | 
    
         | 
| 
       1199 
1206 
     | 
    
         
             
            #if defined(OSSL_DEBUG)
         
     | 
| 
       1200 
1207 
     | 
    
         
             
                /*
         
     |