aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2017-11-25 11:39:37 -0500
committerRafael Mendonça França <rafaelmfranca@gmail.com>2017-11-25 11:39:37 -0500
commit0623b5d19408ef3093bef3597bfcb12cf70a08a3 (patch)
tree9027e49a5e270a5fe61088f3d38adb05854c88ed /activesupport/lib
parent8c750ffb92a8e5ee5661875c52dbc1a7686fb1bc (diff)
parentfa487763d98ccf9c3e66fdb44f09af5c37a50fe5 (diff)
downloadrails-0623b5d19408ef3093bef3597bfcb12cf70a08a3.tar.gz
rails-0623b5d19408ef3093bef3597bfcb12cf70a08a3.tar.bz2
rails-0623b5d19408ef3093bef3597bfcb12cf70a08a3.zip
Merge pull request #24510 from vipulnsward/make-variable_size_secure_compare-public
Make variable_size_secure_compare public
Diffstat (limited to 'activesupport/lib')
-rw-r--r--activesupport/lib/active_support/security_utils.rb22
1 files changed, 12 insertions, 10 deletions
diff --git a/activesupport/lib/active_support/security_utils.rb b/activesupport/lib/active_support/security_utils.rb
index b6b31ef140..4d129bfe41 100644
--- a/activesupport/lib/active_support/security_utils.rb
+++ b/activesupport/lib/active_support/security_utils.rb
@@ -4,14 +4,12 @@ require "digest/sha2"
module ActiveSupport
module SecurityUtils
- # Constant time string comparison.
+ # Constant time string comparison, for fixed length strings.
#
# The values compared should be of fixed length, such as strings
- # that have already been processed by HMAC. This should not be used
- # on variable length plaintext strings because it could leak length info
- # via timing attacks.
- def secure_compare(a, b)
- return false unless a.bytesize == b.bytesize
+ # that have already been processed by HMAC. Raises in case of length mismatch.
+ def fixed_length_secure_compare(a, b)
+ raise ArgumentError, "string length mismatch." unless a.bytesize == b.bytesize
l = a.unpack "C#{a.bytesize}"
@@ -19,11 +17,15 @@ module ActiveSupport
b.each_byte { |byte| res |= byte ^ l.shift }
res == 0
end
- module_function :secure_compare
+ module_function :fixed_length_secure_compare
- def variable_size_secure_compare(a, b) # :nodoc:
- secure_compare(::Digest::SHA256.hexdigest(a), ::Digest::SHA256.hexdigest(b))
+ # Constant time string comparison, for variable length strings.
+ #
+ # The values are first processed by SHA256, so that we don't leak length info
+ # via timing attacks.
+ def secure_compare(a, b)
+ fixed_length_secure_compare(::Digest::SHA256.hexdigest(a), ::Digest::SHA256.hexdigest(b))
end
- module_function :variable_size_secure_compare
+ module_function :secure_compare
end
end