module AWS::Core::Signature::Version4

Public Instance Methods

add_authorization!(signer) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 23
def add_authorization! signer
  self.access_key_id = signer.access_key_id
  datetime = Time.now.utc.strftime("%Y%m%dT%H%M%SZ")
  headers['content-type'] ||= 'application/x-www-form-urlencoded'
  headers['host'] = host
  headers['x-amz-date'] = datetime
  headers['x-amz-security-token'] = signer.session_token if signer.session_token
  headers['authorization'] = authorization(signer, datetime)
end

Protected Instance Methods

action_name() click to toggle source
# File lib/aws/core/signature/version_4.rb, line 86
def action_name
  http_method.to_s.upcase
end
authorization(signer, datetime) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 35
def authorization signer, datetime
  parts = []
  parts << "AWS4-HMAC-SHA256 Credential=#{access_key_id}/#{credential_string(datetime)}"
  parts << "SignedHeaders=#{signed_headers}"
  parts << "Signature=#{hex16(signature(signer, datetime))}"
  parts.join(', ')
end
canonical_header_values(values) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 118
def canonical_header_values values
  values = [values] unless values.is_a?(Array)
  values.map(&:to_s).map(&:strip).join(',')
end
canonical_headers() click to toggle source
# File lib/aws/core/signature/version_4.rb, line 108
def canonical_headers
  headers = []
  self.headers.each_pair do |k,v|
    header = [k.to_s.downcase, v]
    headers << header unless header.first == 'authorization'
  end
  headers = headers.sort_by(&:first)
  headers.map{|k,v| "#{k}:#{canonical_header_values(v)}" }.join("\n")
end
canonical_querystring() click to toggle source
# File lib/aws/core/signature/version_4.rb, line 98
def canonical_querystring
  http_method.to_s.upcase == 'GET' ? url_encoded_params : ''
end
canonical_request() click to toggle source
# File lib/aws/core/signature/version_4.rb, line 70
def canonical_request
  parts = []
  parts << action_name
  parts << canonical_uri
  parts << canonical_querystring
  parts << canonical_headers + "\n"
  parts << signed_headers
  parts << hex16(hash(payload))
  parts.join("\n")
end
canonical_uri() click to toggle source
# File lib/aws/core/signature/version_4.rb, line 90
def canonical_uri
  path
end
credential_string(datetime) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 61
def credential_string datetime 
  parts = []
  parts << datetime[0,8]
  parts << region
  parts << service
  parts << 'aws4_request'
  parts.join("/")
end
hash(string) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 131
def hash string
  Digest::SHA256.digest(string)
end
hex16(string) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 123
def hex16 string
  string.unpack('H*').first
end
hmac(key, string) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 127
def hmac key, string
  OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha256'), key, string)
end
payload() click to toggle source
# File lib/aws/core/signature/version_4.rb, line 94
def payload
  body || ''
end
service() click to toggle source
# File lib/aws/core/signature/version_4.rb, line 81
def service
  # this method is implemented in the request class for each service
  raise NotImplementedError
end
signature(signer, datetime) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 43
def signature signer, datetime
  k_secret = signer.secret_access_key
  k_date = hmac("AWS4" + k_secret, datetime[0,8])
  k_region = hmac(k_date, region)
  k_service = hmac(k_region, service)
  k_credentials = hmac(k_service, 'aws4_request')
  hmac(k_credentials, string_to_sign(datetime))
end
signed_headers() click to toggle source
# File lib/aws/core/signature/version_4.rb, line 102
def signed_headers
  to_sign = headers.keys.map{|k| k.to_s.downcase }
  to_sign.delete('authorization')
  to_sign.sort.join(";")
end
string_to_sign(datetime) click to toggle source
# File lib/aws/core/signature/version_4.rb, line 52
def string_to_sign datetime
  parts = []
  parts << 'AWS4-HMAC-SHA256'
  parts << datetime
  parts << credential_string(datetime)
  parts << hex16(hash(canonical_request))
  parts.join("\n")
end