Class: Amazon::Coral::V2SignatureHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/amazon/coral/v2signaturehelper.rb

Overview

Performs AWS V2 signatures on QueryStringMap objects.

Instance Method Summary collapse

Constructor Details

#initialize(aws_access_key_id, aws_secret_key) ⇒ V2SignatureHelper

Returns a new instance of V2SignatureHelper.



13
14
15
16
# File 'lib/amazon/coral/v2signaturehelper.rb', line 13

def initialize(aws_access_key_id, aws_secret_key)
  @aws_access_key_id = aws_access_key_id.to_s
  @aws_secret_key = aws_secret_key.to_s
end

Instance Method Details

#add_fields(query_string_map, time) ⇒ Object



62
63
64
65
66
67
# File 'lib/amazon/coral/v2signaturehelper.rb', line 62

def add_fields(query_string_map, time)
  query_string_map['AWSAccessKeyId'] = @aws_access_key_id
  query_string_map['SignatureVersion'] = '2'
  query_string_map['SignatureMethod'] = 'HmacSHA256'
  query_string_map['Timestamp'] = time.to_s
end

#canonicalize(args) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/amazon/coral/v2signaturehelper.rb', line 28

def canonicalize(args)
  query_string_map = args[:query_string_map]
  uri = args[:uri]
  verb = args[:verb]
  host = args[:host].downcase

  # exclude any existing Signature parameter from the canonical string
  sorted = sort(query_string_map.reject { |k, v| k == 'Signature' })
  
  canonical = "#{verb}\n#{host}\n#{uri}\n"
  isFirst = true

  sorted.each { |v|
    if(isFirst) then
      isFirst = false
    else
      canonical << '&'
    end

    canonical << UrlEncoding.encode(v[0])
    unless(v[1].nil?) then
      canonical << '='
      canonical << UrlEncoding.encode(v[1])
    end
  }

  return canonical
end

#compute_signature(canonical) ⇒ Object



57
58
59
60
# File 'lib/amazon/coral/v2signaturehelper.rb', line 57

def compute_signature(canonical)
  digest = OpenSSL::Digest::Digest.new('sha256')
  return Base64.encode64(OpenSSL::HMAC.digest(digest, @aws_secret_key, canonical)).strip
end

#sign(args) ⇒ Object



18
19
20
# File 'lib/amazon/coral/v2signaturehelper.rb', line 18

def sign(args)
  signT(Time.now.iso8601, args)
end

#signT(time, args) ⇒ Object



22
23
24
25
26
# File 'lib/amazon/coral/v2signaturehelper.rb', line 22

def signT(time, args)
  query_string_map = args[:query_string_map]
  add_fields(query_string_map, time)
  query_string_map['Signature'] = compute_signature(canonicalize(args))
end

#sort(hash) ⇒ Object



69
70
71
# File 'lib/amazon/coral/v2signaturehelper.rb', line 69

def sort(hash)
  hash.sort
end