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