class TimeSensitiveHmac::Signature

Attributes

digest[R]
secret[R]

Public Class Methods

new(secret, opts={}) click to toggle source
# File lib/time_sensitive_hmac/signature.rb, line 9
def initialize(secret, opts={})
  @secret = secret
  @digest = OpenSSL::Digest::Digest.new(
              opts[:digest] || 'sha256'
            )
end

Public Instance Methods

generate(time, data, context=nil) click to toggle source
# File lib/time_sensitive_hmac/signature.rb, line 16
def generate(time, data, context=nil)
  raw = OpenSSL::HMAC.digest(
    digest,
    secret,
    data_from_parts(time, context, data)
  )
  encode(raw)
end
verify(sig, time, data, context=nil, grace_period_in_seconds=0) click to toggle source
# File lib/time_sensitive_hmac/signature.rb, line 25
def verify(sig, time, data, context=nil, grace_period_in_seconds=0)
  # TODO: grace period
  # Take inspiration from HOTP (RFC 4226) for time intervals:
  # http://tools.ietf.org/html/rfc4226#page-35
  check_sig = generate(time, data, context)
  sig == check_sig
end
verify_now(sig, data, context=nil, grace_period_in_seconds=0) click to toggle source
# File lib/time_sensitive_hmac/signature.rb, line 33
def verify_now(sig, data, context=nil, grace_period_in_seconds=0)
  verify(sig, Time.now, context, grace_period_in_seconds)
end

Protected Instance Methods

data_from_parts(time, context, data) click to toggle source
# File lib/time_sensitive_hmac/signature.rb, line 44
def data_from_parts(time, context, data)
  [time.utc.to_i, encode(context), encode(data)].compact.join(':')
end
encode(input) click to toggle source
# File lib/time_sensitive_hmac/signature.rb, line 39
def encode(input)
  # encode64 includes a trailing \n.
  input && Base64.encode64(input).strip
end
normalise_to_time_class(time) click to toggle source
# File lib/time_sensitive_hmac/signature.rb, line 48
def normalise_to_time_class(time)
  unless time.is_a? Time
    time = Time.at(time.to_i)
  end
  time
end