Module: RbNaCl::Util
- Extended by:
- Sodium
- Defined in:
- lib/rbnacl/util.rb
Overview
Various utility functions
Class Method Summary collapse
-
.bin2hex(bytes) ⇒ String
Hex encodes a message.
-
.check_length(string, length, description) ⇒ Object
Check the length of the passed in string.
-
.check_string(string, length, description) ⇒ Object
Check a passed in string, converting the argument if necessary.
-
.hex2bin(hex) ⇒ String
Hex decodes a message.
-
.prepend_zeros(n, message) ⇒ String
Prepends a message with zeros.
-
.remove_zeros(n, message) ⇒ String
Remove zeros from the start of a message.
-
.verify16(one, two) ⇒ Boolean
Compare two 16 byte strings in constant time.
-
.verify16!(one, two) ⇒ Boolean
Compare two 16 byte strings in constant time.
-
.verify32(one, two) ⇒ Boolean
Compare two 32 byte strings in constant time.
-
.verify32!(one, two) ⇒ Boolean
Compare two 32 byte strings in constant time.
-
.zero_pad(n, message) ⇒ String
Pad a string out to n characters with zeros.
-
.zeros(n = 32) ⇒ String
Returns a string of n zeros.
Methods included from Sodium
primitive, sodium_constant, sodium_function, sodium_function_with_return_code, sodium_primitive, sodium_type
Class Method Details
.bin2hex(bytes) ⇒ String
Hex encodes a message
193 194 195 |
# File 'lib/rbnacl/util.rb', line 193 def bin2hex(bytes) bytes.to_s.unpack("H*").first end |
.check_length(string, length, description) ⇒ Object
Check the length of the passed in string
In several places through the codebase we have to be VERY strict with what length of string we accept. This method supports that.
82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/rbnacl/util.rb', line 82 def check_length(string, length, description) if string.nil? raise LengthError, "#{description} was nil (Expected #{length.to_int})", caller end if string.bytesize != length.to_int raise LengthError, "#{description} was #{string.bytesize} bytes (Expected #{length.to_int})", caller end true end |
.check_string(string, length, description) ⇒ Object
Check a passed in string, converting the argument if necessary
In several places through the codebase we have to be VERY strict with the strings we accept. This method supports that.
108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/rbnacl/util.rb', line 108 def check_string(string, length, description) unless string.respond_to? :to_str raise TypeError, "can't convert #{string.class} into String with #to_str" end string = string.to_str unless string.encoding == Encoding::BINARY raise EncodingError, "strings must use BINARY encoding (got #{string.encoding})" end check_length(string, length, description) string end |
.hex2bin(hex) ⇒ String
Hex decodes a message
202 203 204 |
# File 'lib/rbnacl/util.rb', line 202 def hex2bin(hex) [hex.to_s].pack("H*") end |
.prepend_zeros(n, message) ⇒ String
Prepends a message with zeros
Many functions require a string with some zeros prepended.
36 37 38 |
# File 'lib/rbnacl/util.rb', line 36 def prepend_zeros(n, ) zeros(n) + end |
.remove_zeros(n, message) ⇒ String
Remove zeros from the start of a message
Many functions require a string with some zeros prepended, then need them removing after. Note: this modifies the passed in string
49 50 51 |
# File 'lib/rbnacl/util.rb', line 49 def remove_zeros(n, ) .slice!(n, .bytesize - n) end |
.verify16(one, two) ⇒ Boolean
Compare two 16 byte strings in constant time
This should help to avoid timing attacks for string comparisons in your application. Note that many of the functions (such as OneTime#verify) use this method under the hood already.
165 166 167 168 |
# File 'lib/rbnacl/util.rb', line 165 def verify16(one, two) return false unless two.bytesize == 16 && one.bytesize == 16 c_verify16(one, two) end |
.verify16!(one, two) ⇒ Boolean
Compare two 16 byte strings in constant time
This should help to avoid timing attacks for string comparisons in your application. Note that many of the functions (such as OneTime#verify) use this method under the hood already.
182 183 184 185 186 |
# File 'lib/rbnacl/util.rb', line 182 def verify16!(one, two) check_length(one, 16, "First message") check_length(two, 16, "Second message") c_verify16(one, two) end |
.verify32(one, two) ⇒ Boolean
Compare two 32 byte strings in constant time
This should help to avoid timing attacks for string comparisons in your application. Note that many of the functions (such as HmacSha256#verify) use this method under the hood already.
132 133 134 135 |
# File 'lib/rbnacl/util.rb', line 132 def verify32(one, two) return false unless two.bytesize == 32 && one.bytesize == 32 c_verify32(one, two) end |
.verify32!(one, two) ⇒ Boolean
Compare two 32 byte strings in constant time
This should help to avoid timing attacks for string comparisons in your application. Note that many of the functions (such as HmacSha256#verify) use this method under the hood already.
149 150 151 152 153 |
# File 'lib/rbnacl/util.rb', line 149 def verify32!(one, two) check_length(one, 32, "First message") check_length(two, 32, "Second message") c_verify32(one, two) end |
.zero_pad(n, message) ⇒ String
Pad a string out to n characters with zeros
61 62 63 64 65 66 67 68 69 70 |
# File 'lib/rbnacl/util.rb', line 61 def zero_pad(n, ) len = .bytesize if len == n elsif len > n raise LengthError, "String too long for zero-padding to #{n} bytes" else + zeros(n - len) end end |
.zeros(n = 32) ⇒ String
Returns a string of n zeros
Lots of the functions require us to create strings to pass into functions of a specified size.
21 22 23 24 25 26 |
# File 'lib/rbnacl/util.rb', line 21 def zeros(n = 32) zeros = "\0" * n # make sure they're 8-bit zeros, not 7-bit zeros. Otherwise we might get # encoding errors later zeros.respond_to?(:force_encoding) ? zeros.force_encoding("ASCII-8BIT") : zeros end |