Class: Ibanity::HttpSignature

Inherits:
Object
  • Object
show all
Defined in:
lib/ibanity/http_signature.rb

Instance Method Summary collapse

Constructor Details

#initialize(certificate:, certificate_id:, key:, method:, uri:, query_params:, headers:, payload:) ⇒ HttpSignature

Returns a new instance of HttpSignature.



3
4
5
6
7
8
9
10
11
12
# File 'lib/ibanity/http_signature.rb', line 3

def initialize(certificate:, certificate_id:, key:, method:, uri:, query_params:, headers:, payload:)
  @certificate    = certificate
  @certificate_id = certificate_id
  @key            = key
  @method         = method
  @uri            = URI(uri)
  @headers        = headers
  @payload        = payload
  @query_params   = query_params
end

Instance Method Details

#base64_signatureObject



40
41
42
43
44
# File 'lib/ibanity/http_signature.rb', line 40

def base64_signature
  digest = signature_algorithm == "rsa-sha256" ?  OpenSSL::Digest::SHA256.new :  OpenSSL::Digest::SHA512.new
  signature = @key.sign(digest, signing_string)
  Base64.urlsafe_encode64(signature)
end

#dateObject



50
51
52
# File 'lib/ibanity/http_signature.rb', line 50

def date
  @date ||= Time.now.utc.iso8601
end

#header_value(header) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/ibanity/http_signature.rb', line 63

def header_value(header)
  case header
  when "(request-target)"
    request_target
  when "host"
    host
  when "digest"
    payload_digest
  when "date"
    date
  else
    camelized_header = header.split("-").collect(&:capitalize).join("-")
    @headers[camelized_header]
  end
end

#headers_to_signObject



26
27
28
29
30
31
32
33
# File 'lib/ibanity/http_signature.rb', line 26

def headers_to_sign
  result = ["(request-target)", "host", "digest", "date"]
  result << "authorization" unless @headers["Authorization"].nil?
  @headers.keys.each do |header|
    result << header.to_s.downcase if header.to_s.match(/ibanity/i)
  end
  result
end

#hostObject



46
47
48
# File 'lib/ibanity/http_signature.rb', line 46

def host
  @uri.host
end

#payload_digestObject



14
15
16
17
18
19
20
# File 'lib/ibanity/http_signature.rb', line 14

def payload_digest
  digest         = OpenSSL::Digest::SHA512.new
  string_payload = @payload.nil? ? "" : @payload.to_json
  digest.update(string_payload)
  base64 = Base64.urlsafe_encode64(digest.digest)
  "SHA-512=#{base64}"
end

#request_targetObject



35
36
37
38
# File 'lib/ibanity/http_signature.rb', line 35

def request_target
  @uri.query = URI.encode_www_form(URI.decode_www_form(@uri.query.to_s).concat(@query_params.to_a)) if @query_params&.keys&.any?
  "#{@method} #{@uri.request_uri}"
end

#signature_algorithmObject



22
23
24
# File 'lib/ibanity/http_signature.rb', line 22

def signature_algorithm
  @certificate.signature_algorithm.match("sha256") ? "rsa-sha256" : "rsa-sha512"
end

#signature_headersObject



79
80
81
82
83
84
85
# File 'lib/ibanity/http_signature.rb', line 79

def signature_headers
  {
    "Date"      => date,
    "Digest"    => payload_digest,
    "Signature" => "keyId=\"#{@certificate_id}\" algorithm=\"#{signature_algorithm}\" headers=\"#{headers_to_sign.join(" ")}\" signature=\"#{base64_signature}\""
  }
end

#signing_stringObject



54
55
56
57
58
59
60
61
# File 'lib/ibanity/http_signature.rb', line 54

def signing_string
  result = []
  headers_to_sign.each do |header_to_sign|
    value   = header_value(header_to_sign)
    result << "#{header_to_sign}: #{value}"
  end
  result.join("\n")
end