class HMAC::Base

Private Class Methods

digest(key, text) click to toggle source

These two class methods below are safer than using above instance methods combinatorially because an instance will have held a key even if it's no longer in use.

# File lib/hmac.rb, line 96
def Base.digest(key, text)
  hmac = self.new(key)
  begin
    hmac.update(text)
    hmac.digest
  ensure
    hmac.reset_key
  end
end
hexdigest(key, text) click to toggle source
# File lib/hmac.rb, line 106
def Base.hexdigest(key, text)
  hmac = self.new(key)
  begin
    hmac.update(text)
    hmac.hexdigest
  ensure
    hmac.reset_key
  end
end
new(algorithm, block_size, output_length, key) click to toggle source
# File lib/hmac.rb, line 23
def initialize(algorithm, block_size, output_length, key)
  @algorithm = algorithm
  @block_size = block_size
  @output_length = output_length
  @initialized = false
  @key_xor_ipad = ''
  @key_xor_opad = ''
  set_key(key) unless key.nil?
end

Public Instance Methods

<<(text)
Alias for: update
digest() click to toggle source
# File lib/hmac.rb, line 82
def digest
  check_status
  @md.digest
end
hexdigest() click to toggle source
# File lib/hmac.rb, line 87
def hexdigest
  check_status
  @md.hexdigest
end
Also aliased as: to_s
reset_key() click to toggle source
# File lib/hmac.rb, line 59
def reset_key
  @key_xor_ipad.gsub!(/./, '?')
  @key_xor_opad.gsub!(/./, '?')
  @key_xor_ipad[0..-1] = ''
  @key_xor_opad[0..-1] = ''
  @initialized = false
end
set_key(key) click to toggle source
# File lib/hmac.rb, line 42
def set_key(key)
  # If key is longer than the block size, apply hash function
  # to key and use the result as a real key.
  key = @algorithm.digest(key) if key.size > @block_size
  akey = key.unpack("C*")
  key_xor_ipad = ("\x36" * @block_size).unpack("C*")
  key_xor_opad = ("\x5C" * @block_size).unpack("C*")
  for i in 0 .. akey.size - 1
    key_xor_ipad[i] ^= akey[i]
    key_xor_opad[i] ^= akey[i]
  end
  @key_xor_ipad = key_xor_ipad.pack("C*")
  @key_xor_opad = key_xor_opad.pack("C*")
  @md = @algorithm.new
  @initialized = true
end
to_s()
Alias for: hexdigest
update(text) click to toggle source
# File lib/hmac.rb, line 67
def update(text)
  check_status
  # perform inner H
  md = @algorithm.new
  md.update(@key_xor_ipad)
  md.update(text)
  str = md.digest
  # perform outer H
  md = @algorithm.new
  md.update(@key_xor_opad)
  md.update(str)
  @md = md
end
Also aliased as: <<

Private Instance Methods

check_status() click to toggle source
# File lib/hmac.rb, line 34
def check_status
  unless @initialized
    raise RuntimeError,
    "The underlying hash algorithm has not yet been initialized."
  end
end