module RbNaCl::KeyComparator
Implements comparisons of keys
This permits both timing invariant equality tests, as well as lexicographical sorting.
Public Instance Methods
spaceship operator
@param other [KeyComparator,#to_str] The thing to compare
@return [0] if the keys are equal @return [1] if the key is larger than the other key @return [-1] if the key is smaller than the other key @return [nil] if comparison doesn't make sense
# File lib/rbnacl/key_comparator.rb, line 19 def <=>(other) if KeyComparator > other.class other = other.to_bytes elsif other.respond_to?(:to_str) other = other.to_str else return nil end compare32(other) end
equality operator
The equality operator is explicity defined, despite including Comparable and having a spaceship operator, so that if equality tests are desired, they can be timing invariant, without any chance that the further comparisons for greater than and less than can leak information. Maybe this is too paranoid, but I don't know how ruby works under the hood with comparable.
@param other [KeyComparator,#to_str] The thing to compare
@return [true] if the keys are equal @return [false] if they keys are not equal
# File lib/rbnacl/key_comparator.rb, line 43 def ==(other) if KeyComparator > other.class other = other.to_bytes elsif other.respond_to?(:to_str) other = other.to_str else return false end Util.verify32(to_bytes, other) end
Private Instance Methods
# File lib/rbnacl/key_comparator.rb, line 56 def compare32(other) if Util.verify32(to_bytes, other) 0 elsif to_bytes > other 1 else -1 end end