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