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