Sha256: 49c63d3033812f51086abbdfffa81c5a0c6e378690206dd90f920b1fa6faf3ae

Contents?: true

Size: 1.4 KB

Versions: 123

Compression:

Stored size: 1.4 KB

Contents

# frozen_string_literal: true

# Constant time string comparison, for fixed length strings.
# Code borrowed from ActiveSupport
# https://github.com/rails/rails/blob/75ac626c4e21129d8296d4206a1960563cc3d4aa/activesupport/lib/active_support/security_utils.rb#L33
#
# The values compared should be of fixed length, such as strings
# that have already been processed by HMAC. Raises in case of length mismatch.
module Svix
    if defined?(OpenSSL.fixed_length_secure_compare)
        def fixed_length_secure_compare(a, b)
            OpenSSL.fixed_length_secure_compare(a, b)
        end
        else
        def fixed_length_secure_compare(a, b)
            raise ArgumentError, "string length mismatch." unless a.bytesize == b.bytesize

            l = a.unpack "C#{a.bytesize}"

            res = 0
            b.each_byte { |byte| res |= byte ^ l.shift }
            res == 0
        end
    end
    module_function :fixed_length_secure_compare

    # Secure string comparison for strings of variable length.
    #
    # While a timing attack would not be able to discern the content of
    # a secret compared via secure_compare, it is possible to determine
    # the secret length. This should be considered when using secure_compare
    # to compare weak, short secrets to user input.
    def secure_compare(a, b)
        a.length == b.length && fixed_length_secure_compare(a, b)
    end
    module_function :secure_compare
end

Version data entries

123 entries across 123 versions & 1 rubygems

Version Path
svix-1.60.1 lib/svix/util.rb
svix-1.60.0 lib/svix/util.rb
svix-1.59.2 lib/svix/util.rb
svix-1.59.1 lib/svix/util.rb
svix-1.59.0 lib/svix/util.rb
svix-1.58.2 lib/svix/util.rb
svix-1.58.1 lib/svix/util.rb
svix-1.58.0 lib/svix/util.rb
svix-1.57.0 lib/svix/util.rb
svix-1.56.0 lib/svix/util.rb
svix-1.45.1 lib/svix/util.rb
svix-1.45.0 lib/svix/util.rb
svix-1.44.0 lib/svix/util.rb
svix-1.43.0 lib/svix/util.rb
svix-1.42.0 lib/svix/util.rb
svix-1.41.0 lib/svix/util.rb
svix-1.40.0 lib/svix/util.rb
svix-1.39.0 lib/svix/util.rb
svix-1.38.0 lib/svix/util.rb
svix-1.37.0 lib/svix/util.rb