mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #10635 from vipulnsward/change_to_strict
Use `Base.strict_decode64` instead of `Base.decode64`
This commit is contained in:
commit
8ef1ef1b82
3 changed files with 20 additions and 5 deletions
|
@ -76,12 +76,12 @@ module ActiveSupport
|
||||||
encrypted_data = cipher.update(@serializer.dump(value))
|
encrypted_data = cipher.update(@serializer.dump(value))
|
||||||
encrypted_data << cipher.final
|
encrypted_data << cipher.final
|
||||||
|
|
||||||
[encrypted_data, iv].map {|v| ::Base64.strict_encode64(v)}.join("--")
|
"#{::Base64.strict_encode64 encrypted_data}--#{::Base64.strict_encode64 iv}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def _decrypt(encrypted_message)
|
def _decrypt(encrypted_message)
|
||||||
cipher = new_cipher
|
cipher = new_cipher
|
||||||
encrypted_data, iv = encrypted_message.split("--").map {|v| ::Base64.decode64(v)}
|
encrypted_data, iv = encrypted_message.split("--").map {|v| ::Base64.strict_decode64(v)}
|
||||||
|
|
||||||
cipher.decrypt
|
cipher.decrypt
|
||||||
cipher.key = @secret
|
cipher.key = @secret
|
||||||
|
@ -91,7 +91,7 @@ module ActiveSupport
|
||||||
decrypted_data << cipher.final
|
decrypted_data << cipher.final
|
||||||
|
|
||||||
@serializer.load(decrypted_data)
|
@serializer.load(decrypted_data)
|
||||||
rescue OpenSSLCipherError, TypeError
|
rescue OpenSSLCipherError, TypeError, ArgumentError
|
||||||
raise InvalidMessage
|
raise InvalidMessage
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,11 @@ module ActiveSupport
|
||||||
|
|
||||||
data, digest = signed_message.split("--")
|
data, digest = signed_message.split("--")
|
||||||
if data.present? && digest.present? && secure_compare(digest, generate_digest(data))
|
if data.present? && digest.present? && secure_compare(digest, generate_digest(data))
|
||||||
@serializer.load(::Base64.decode64(data))
|
begin
|
||||||
|
@serializer.load(::Base64.strict_decode64(data))
|
||||||
|
rescue ArgumentError
|
||||||
|
raise InvalidSignature
|
||||||
|
end
|
||||||
else
|
else
|
||||||
raise InvalidSignature
|
raise InvalidSignature
|
||||||
end
|
end
|
||||||
|
|
|
@ -66,6 +66,17 @@ class MessageEncryptorTest < ActiveSupport::TestCase
|
||||||
ActiveSupport.use_standard_json_time_format = prev
|
ActiveSupport.use_standard_json_time_format = prev
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_message_obeys_strict_encoding
|
||||||
|
bad_encoding_characters = "\n!@#"
|
||||||
|
message, iv = @encryptor.encrypt_and_sign("This is a very \n\nhumble string"+bad_encoding_characters)
|
||||||
|
|
||||||
|
assert_not_decrypted("#{::Base64.encode64 message.to_s}--#{::Base64.encode64 iv.to_s}")
|
||||||
|
assert_not_verified("#{::Base64.encode64 message.to_s}--#{::Base64.encode64 iv.to_s}")
|
||||||
|
|
||||||
|
assert_not_decrypted([iv, message] * bad_encoding_characters)
|
||||||
|
assert_not_verified([iv, message] * bad_encoding_characters)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def assert_not_decrypted(value)
|
def assert_not_decrypted(value)
|
||||||
|
@ -81,7 +92,7 @@ class MessageEncryptorTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def munge(base64_string)
|
def munge(base64_string)
|
||||||
bits = ::Base64.decode64(base64_string)
|
bits = ::Base64.strict_decode64(base64_string)
|
||||||
bits.reverse!
|
bits.reverse!
|
||||||
::Base64.strict_encode64(bits)
|
::Base64.strict_encode64(bits)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue