2010-06-16 00:04:16 -04:00
|
|
|
module Fog
|
|
|
|
class HMAC
|
|
|
|
|
|
|
|
def initialize(type, key)
|
2010-06-16 00:07:15 -04:00
|
|
|
@key = key
|
|
|
|
case type
|
2010-06-16 00:04:16 -04:00
|
|
|
when 'sha1'
|
2010-06-16 00:07:15 -04:00
|
|
|
setup_sha1
|
2010-06-16 00:04:16 -04:00
|
|
|
when 'sha256'
|
2010-06-16 00:07:15 -04:00
|
|
|
setup_sha256
|
2010-06-16 00:04:16 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def sign(data)
|
2010-06-16 00:07:15 -04:00
|
|
|
@signer.call(data)
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def setup_sha1
|
|
|
|
@digest = OpenSSL::Digest::Digest.new('sha1')
|
|
|
|
@signer = lambda do |data|
|
|
|
|
OpenSSL::HMAC.digest(@digest, @key, data)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def setup_sha256
|
2010-06-16 00:19:40 -04:00
|
|
|
begin
|
|
|
|
@digest = OpenSSL::Digest::Digest.new('sha256')
|
|
|
|
@signer = lambda do |data|
|
|
|
|
OpenSSL::HMAC.digest(@digest, @key, data)
|
|
|
|
end
|
|
|
|
rescue RuntimeError => error
|
|
|
|
unless error.message == 'Unsupported digest algorithm (sha256).'
|
|
|
|
raise error
|
|
|
|
else
|
|
|
|
require 'hmac-sha2'
|
|
|
|
@hmac = ::HMAC::SHA256.new(@key)
|
|
|
|
@signer = lambda do |data|
|
|
|
|
@hmac.update(data)
|
|
|
|
@hmac.digest
|
|
|
|
end
|
|
|
|
end
|
2010-06-16 00:07:15 -04:00
|
|
|
end
|
2010-06-16 00:04:16 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|