Class: HMAC::Base
- Inherits:
-
Object
- Object
- HMAC::Base
- Defined in:
- lib/hmac.rb
Direct Known Subclasses
Instance Method Summary collapse
- #digest ⇒ Object
- #hexdigest ⇒ Object
-
#initialize(algorithm, block_size, output_length, key) ⇒ Base
constructor
A new instance of Base.
- #reset_key ⇒ Object
- #set_key(key) ⇒ Object
- #to_s ⇒ Object
- #update(text) ⇒ Object (also: #<<)
Constructor Details
#initialize(algorithm, block_size, output_length, key) ⇒ Base
Returns a new instance of Base.
16 17 18 19 20 21 22 23 24 |
# File 'lib/hmac.rb', line 16 def initialize(algorithm, block_size, output_length, key) @algorithm = algorithm @block_size = block_size @output_length = output_length @status = STATUS_UNDEFINED @key_xor_ipad = '' @key_xor_opad = '' set_key(key) unless key.nil? end |
Instance Method Details
#digest ⇒ Object
74 75 76 77 |
# File 'lib/hmac.rb', line 74 def digest check_status @md.digest end |
#hexdigest ⇒ Object
79 80 81 82 |
# File 'lib/hmac.rb', line 79 def hexdigest check_status @md.hexdigest end |
#reset_key ⇒ Object
51 52 53 54 55 56 57 |
# File 'lib/hmac.rb', line 51 def reset_key @key_xor_ipad.gsub!(/./, '?') @key_xor_opad.gsub!(/./, '?') @key_xor_ipad[0..-1] = '' @key_xor_opad[0..-1] = '' @status = STATUS_UNDEFINED end |
#set_key(key) ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/hmac.rb', line 35 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 key_xor_ipad = "\x36" * @block_size key_xor_opad = "\x5C" * @block_size for i in 0 .. key.size - 1 key_xor_ipad[i] ^= key[i] key_xor_opad[i] ^= key[i] end @key_xor_ipad = key_xor_ipad @key_xor_opad = key_xor_opad @md = @algorithm.new @status = STATUS_INITIALIZED end |
#to_s ⇒ Object
83 84 85 86 |
# File 'lib/hmac.rb', line 83 def hexdigest check_status @md.hexdigest end |
#update(text) ⇒ Object Also known as: <<
59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/hmac.rb', line 59 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 |