class Ribbon::Intercom::Utils::Signer
Attributes
key[R]
Public Class Methods
new(key=self.class.random_key)
click to toggle source
# File lib/ribbon/intercom/utils/signer.rb, line 19 def initialize(key=self.class.random_key) raise ArgumentError, "key must be defined" unless key @key = key.dup.freeze @_digest = OpenSSL::Digest::SHA256.new end
random_key()
click to toggle source
# File lib/ribbon/intercom/utils/signer.rb, line 8 def random_key SecureRandom.random_bytes(32) end
random_salt()
click to toggle source
# File lib/ribbon/intercom/utils/signer.rb, line 12 def random_salt SecureRandom.random_bytes(8) end
Public Instance Methods
sign(data)
click to toggle source
# File lib/ribbon/intercom/utils/signer.rb, line 25 def sign(data) unless data.is_a?(String) && data.encoding == Encoding::BINARY raise ArgumentError, "data must be a binary encoded string" end salt = self.class.random_salt signature = _sign(salt, data) _encode(signature, salt, data) end
verify(signed_data)
click to toggle source
# File lib/ribbon/intercom/utils/signer.rb, line 35 def verify(signed_data) unless signed_data.is_a?(String) && signed_data.encoding == Encoding::BINARY raise ArgumentError, "signed_data must be a binary encoded string" end signature, salt, data = _decode(signed_data) data if _sign(salt, data) == signature end
Private Instance Methods
_decode(signed_data)
click to toggle source
# File lib/ribbon/intercom/utils/signer.rb, line 54 def _decode(signed_data) index = 0 version = signed_data[index] index += version.length signature = signed_data.slice(index, @_digest.length) index += signature.length salt = signed_data.slice(index, 8) index += salt.length data = signed_data.slice(index..-1) [signature, salt, data] end
_encode(signature, salt, data)
click to toggle source
# File lib/ribbon/intercom/utils/signer.rb, line 50 def _encode(signature, salt, data) "\x01" + signature + salt + data end
_sign(salt, data)
click to toggle source
# File lib/ribbon/intercom/utils/signer.rb, line 46 def _sign(salt, data) OpenSSL::HMAC.digest(@_digest, key, salt + data) end