class Authmac::HmacChecker

Public Class Methods

new(secret, message_format: :values, parameter_separator: '|', digest_function: 'sha1') click to toggle source

@param message_format [symbol] ‘:values` or `:json`.

`:json` will use a sorted json string to sign.
`:values` will use the sorted values separated by `parameter_separator` to sign.
# File lib/authmac/hmac_checker.rb, line 8
def initialize(secret, message_format: :values,
                       parameter_separator: '|',
                       digest_function: 'sha1')
  @secret = secret
  @digest = digest_function
  @separator = parameter_separator
  @message_format = message_format
  fail Authmac::SecretError, 'secret too short, see rfc2104' unless @secret.bytes.size >= digester.digest_length * 2
end

Public Instance Methods

sign(hash) click to toggle source
# File lib/authmac/hmac_checker.rb, line 22
def sign(hash)
  OpenSSL::HMAC.hexdigest(digester, @secret, message_string(hash))
end
validate(hash, given_hmac) click to toggle source
# File lib/authmac/hmac_checker.rb, line 18
def validate(hash, given_hmac)
  sign(hash) == given_hmac
end
with_signature(hash, hmac_key = :hmac) click to toggle source
# File lib/authmac/hmac_checker.rb, line 26
def with_signature(hash, hmac_key = :hmac)
  hash.merge({hmac_key => sign(hash)})
end

Private Instance Methods

digester() click to toggle source
# File lib/authmac/hmac_checker.rb, line 32
def digester
  OpenSSL::Digest.new(@digest)
end
hash_values_sorted_by_key(hash) click to toggle source
# File lib/authmac/hmac_checker.rb, line 50
def hash_values_sorted_by_key(hash)
  hash.sort_by {|key, value| key }.map(&:last)
end
message_string(hash) click to toggle source
# File lib/authmac/hmac_checker.rb, line 36
def message_string(hash)
  fail ArgumentError, 'hash arg not a hash' unless hash.is_a? Hash

  case @message_format
  when :values
    hash_values_sorted_by_key(hash).flatten.join(@separator)
  when :json
    require 'json'
    JSON.generate(params_sorted_by_key(hash))
  else
    fail ArgumentError, 'unknown message_format'
  end
end
params_sorted_by_key(params) click to toggle source

stringifies and sorts hashes by key at all levels.

# File lib/authmac/hmac_checker.rb, line 55
def params_sorted_by_key(params)
  case params
  when Hash
    params.map     { |k, v| [k.to_s, params_sorted_by_key(v)] }
          .sort_by { |k, v| k }
          .to_h
  when Array
    params.map { |val| params_sorted_by_key(val) }
  else
    params.to_s
  end
end