Use timing safe compare in Sodium::SecureBuffer.
parent
0d8dd544d5
commit
4be74741d5
|
@ -7,5 +7,8 @@ module Sodium
|
|||
|
||||
class DecryptionFailed < Error
|
||||
end
|
||||
|
||||
class MemcmpFailed < Error
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -45,6 +45,7 @@ module Sodium
|
|||
fun crypto_generichash_blake2b_saltbytes : LibC::SizeT
|
||||
fun crypto_generichash_blake2b_personalbytes : LibC::SizeT
|
||||
|
||||
fun sodium_memcmp(Pointer(LibC::UChar), Pointer(LibC::UChar), LibC::SizeT) : LibC::Int
|
||||
fun sodium_memzero(Pointer(LibC::UChar), LibC::SizeT) : Nil
|
||||
|
||||
fun sodium_malloc(LibC::SizeT) : Pointer(LibC::UChar)
|
||||
|
@ -280,3 +281,25 @@ module Sodium
|
|||
raise "Assumptions in this library regarding nonce sizes may not be valid"
|
||||
end
|
||||
end
|
||||
|
||||
module Sodium
|
||||
def self.memcmp(a : Bytes, b : Bytes) : Bool
|
||||
if a.bytesize != b.bytesize
|
||||
false
|
||||
elsif LibSodium.sodium_memcmp(a, b, a.bytesize) == 0
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
# Raises unless comparison succeeds.
|
||||
def self.memcmp!(a, b)
|
||||
raise Error::MemcmpFailed.new unless memcmp(a, b)
|
||||
true
|
||||
end
|
||||
|
||||
def self.memzero(bytes : Bytes)
|
||||
LibSodium.sodium_memzero bytes, bytes.bytesize
|
||||
end
|
||||
end
|
||||
|
|
|
@ -82,11 +82,11 @@ module Sodium
|
|||
end
|
||||
|
||||
def ==(other : self)
|
||||
self.to_slice == other.to_slice
|
||||
Sodium.memcmp self.to_slice, other.to_slice
|
||||
end
|
||||
|
||||
def ==(other : Bytes)
|
||||
self.to_slice == other
|
||||
Sodium.memcmp self.to_slice, other
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,9 +1,3 @@
|
|||
module Sodium
|
||||
def self.memzero(bytes : Bytes)
|
||||
LibSodium.sodium_memzero bytes, bytes.bytesize
|
||||
end
|
||||
end
|
||||
|
||||
module Sodium::Wipe
|
||||
annotation Var
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue