aws-sdk 1.30.1 → 1.31.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -3
- data/lib/aws/api_config/CloudFront-2013-11-11.yml +2886 -0
- data/lib/aws/api_config/CloudTrail-2013-11-01.yml +36 -0
- data/lib/aws/api_config/ElasticTranscoder-2012-09-25.yml +67 -446
- data/lib/aws/auto_scaling.rb +0 -1
- data/lib/aws/auto_scaling/client.rb +2 -0
- data/lib/aws/cloud_formation.rb +0 -1
- data/lib/aws/cloud_formation/client.rb +2 -0
- data/lib/aws/cloud_front.rb +0 -1
- data/lib/aws/cloud_front/client.rb +6 -6
- data/lib/aws/cloud_search.rb +0 -1
- data/lib/aws/cloud_search/client.rb +3 -0
- data/lib/aws/cloud_trail.rb +0 -1
- data/lib/aws/cloud_trail/client.rb +2 -0
- data/lib/aws/cloud_watch.rb +0 -1
- data/lib/aws/cloud_watch/client.rb +2 -0
- data/lib/aws/core.rb +8 -6
- data/lib/aws/core/client.rb +30 -4
- data/lib/aws/core/configuration.rb +1 -1
- data/lib/aws/core/http/request.rb +2 -1
- data/lib/aws/core/signers/base.rb +46 -0
- data/lib/aws/core/signers/cloud_front.rb +56 -0
- data/lib/aws/core/signers/s3.rb +159 -0
- data/lib/aws/core/signers/version_2.rb +72 -0
- data/lib/aws/core/signers/version_3.rb +86 -0
- data/lib/aws/core/signers/version_3_https.rb +61 -0
- data/lib/aws/core/signers/version_4.rb +228 -0
- data/lib/aws/core/signers/version_4/chunk_signed_stream.rb +191 -0
- data/lib/aws/data_pipeline.rb +0 -1
- data/lib/aws/data_pipeline/client.rb +3 -0
- data/lib/aws/direct_connect.rb +0 -1
- data/lib/aws/direct_connect/client.rb +3 -0
- data/lib/aws/dynamo_db.rb +0 -1
- data/lib/aws/dynamo_db/client.rb +2 -0
- data/lib/aws/ec2.rb +0 -1
- data/lib/aws/ec2/client.rb +21 -0
- data/lib/aws/elastic_beanstalk.rb +0 -1
- data/lib/aws/elastic_beanstalk/client.rb +3 -0
- data/lib/aws/elastic_transcoder.rb +0 -1
- data/lib/aws/elastic_transcoder/client.rb +2 -0
- data/lib/aws/elasticache.rb +0 -1
- data/lib/aws/elasticache/client.rb +2 -0
- data/lib/aws/elb.rb +0 -1
- data/lib/aws/elb/client.rb +2 -0
- data/lib/aws/emr.rb +0 -1
- data/lib/aws/emr/client.rb +2 -0
- data/lib/aws/glacier.rb +0 -1
- data/lib/aws/glacier/client.rb +2 -0
- data/lib/aws/iam.rb +0 -1
- data/lib/aws/iam/client.rb +2 -0
- data/lib/aws/import_export.rb +0 -1
- data/lib/aws/import_export/client.rb +2 -0
- data/lib/aws/kinesis.rb +0 -1
- data/lib/aws/kinesis/client.rb +2 -0
- data/lib/aws/ops_works.rb +0 -1
- data/lib/aws/ops_works/client.rb +2 -0
- data/lib/aws/rds.rb +0 -1
- data/lib/aws/rds/client.rb +2 -0
- data/lib/aws/redshift.rb +0 -1
- data/lib/aws/redshift/client.rb +2 -0
- data/lib/aws/route_53.rb +0 -1
- data/lib/aws/route_53/client.rb +2 -0
- data/lib/aws/s3.rb +1 -0
- data/lib/aws/s3/bucket_collection.rb +9 -7
- data/lib/aws/s3/client.rb +70 -9
- data/lib/aws/s3/config.rb +12 -0
- data/lib/aws/s3/object_collection.rb +4 -9
- data/lib/aws/s3/presign_v4.rb +127 -0
- data/lib/aws/s3/presigned_post.rb +1 -1
- data/lib/aws/s3/request.rb +0 -136
- data/lib/aws/s3/s3_object.rb +40 -19
- data/lib/aws/simple_db.rb +0 -1
- data/lib/aws/simple_db/client.rb +2 -0
- data/lib/aws/simple_email_service.rb +0 -1
- data/lib/aws/simple_email_service/client.rb +2 -0
- data/lib/aws/simple_workflow.rb +0 -1
- data/lib/aws/simple_workflow/client.rb +2 -0
- data/lib/aws/sns.rb +0 -1
- data/lib/aws/sns/client.rb +2 -0
- data/lib/aws/sqs.rb +0 -1
- data/lib/aws/sqs/client.rb +2 -0
- data/lib/aws/storage_gateway.rb +0 -1
- data/lib/aws/storage_gateway/client.rb +2 -0
- data/lib/aws/sts.rb +0 -1
- data/lib/aws/sts/client.rb +2 -0
- data/lib/aws/support.rb +0 -1
- data/lib/aws/support/client.rb +2 -0
- data/lib/aws/version.rb +1 -1
- metadata +12 -38
- data/lib/aws/auto_scaling/request.rb +0 -29
- data/lib/aws/cloud_formation/request.rb +0 -29
- data/lib/aws/cloud_front/request.rb +0 -30
- data/lib/aws/cloud_search/request.rb +0 -23
- data/lib/aws/cloud_trail/request.rb +0 -30
- data/lib/aws/cloud_watch/request.rb +0 -29
- data/lib/aws/core/signature/version_2.rb +0 -56
- data/lib/aws/core/signature/version_3.rb +0 -77
- data/lib/aws/core/signature/version_3_https.rb +0 -54
- data/lib/aws/core/signature/version_4.rb +0 -135
- data/lib/aws/core/signer.rb +0 -46
- data/lib/aws/data_pipeline/request.rb +0 -26
- data/lib/aws/direct_connect/request.rb +0 -27
- data/lib/aws/dynamo_db/request.rb +0 -26
- data/lib/aws/ec2/request.rb +0 -21
- data/lib/aws/elastic_beanstalk/request.rb +0 -29
- data/lib/aws/elastic_transcoder/request.rb +0 -30
- data/lib/aws/elasticache/request.rb +0 -23
- data/lib/aws/elb/request.rb +0 -29
- data/lib/aws/emr/request.rb +0 -28
- data/lib/aws/glacier/request.rb +0 -29
- data/lib/aws/iam/request.rb +0 -29
- data/lib/aws/import_export/request.rb +0 -23
- data/lib/aws/kinesis/request.rb +0 -26
- data/lib/aws/ops_works/request.rb +0 -27
- data/lib/aws/rds/request.rb +0 -29
- data/lib/aws/redshift/request.rb +0 -29
- data/lib/aws/route_53/request.rb +0 -23
- data/lib/aws/simple_db/request.rb +0 -23
- data/lib/aws/simple_email_service/request.rb +0 -27
- data/lib/aws/simple_workflow/request.rb +0 -28
- data/lib/aws/sns/request.rb +0 -29
- data/lib/aws/sqs/request.rb +0 -31
- data/lib/aws/storage_gateway/request.rb +0 -28
- data/lib/aws/sts/request.rb +0 -29
- data/lib/aws/support/request.rb +0 -27
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
8
|
+
#
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
12
|
+
# language governing permissions and limitations under the License.
|
13
|
+
|
14
|
+
module AWS
|
15
|
+
module Core
|
16
|
+
module Signers
|
17
|
+
# @api private
|
18
|
+
class Version2
|
19
|
+
|
20
|
+
include Base
|
21
|
+
|
22
|
+
# @param [CredentialProviders::Provider] credentials
|
23
|
+
def initialize credentials
|
24
|
+
@credentials = credentials
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [CredentialProviders::Provider]
|
28
|
+
attr_reader :credentials
|
29
|
+
|
30
|
+
# @param [Http::Request] req
|
31
|
+
# @return [Http::Request]
|
32
|
+
def sign_request req
|
33
|
+
req.add_param('AWSAccessKeyId', credentials.access_key_id)
|
34
|
+
if token = credentials.session_token
|
35
|
+
req.add_param("SecurityToken", token)
|
36
|
+
end
|
37
|
+
req.add_param('SignatureVersion', '2')
|
38
|
+
req.add_param('SignatureMethod', 'HmacSHA256')
|
39
|
+
req.add_param('Signature', signature(req))
|
40
|
+
req.body = req.url_encoded_params
|
41
|
+
req
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
# @param [Http::Request] req
|
47
|
+
def signature req
|
48
|
+
sign(credentials.secret_access_key, string_to_sign(req))
|
49
|
+
end
|
50
|
+
|
51
|
+
# @param [Http::Request] req
|
52
|
+
def string_to_sign req
|
53
|
+
|
54
|
+
host =
|
55
|
+
case req.port
|
56
|
+
when 80, 443 then req.host
|
57
|
+
else "#{req.host}:#{req.port}"
|
58
|
+
end
|
59
|
+
|
60
|
+
[
|
61
|
+
req.http_method,
|
62
|
+
host.to_s.downcase,
|
63
|
+
req.path,
|
64
|
+
req.url_encoded_params,
|
65
|
+
].join("\n")
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
8
|
+
#
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
12
|
+
# language governing permissions and limitations under the License.
|
13
|
+
|
14
|
+
require 'openssl'
|
15
|
+
require 'time'
|
16
|
+
|
17
|
+
module AWS
|
18
|
+
module Core
|
19
|
+
module Signers
|
20
|
+
# @api private
|
21
|
+
class Version3
|
22
|
+
|
23
|
+
include Base
|
24
|
+
|
25
|
+
# @param [CredentialProviders::Provider] credentials
|
26
|
+
def initialize credentials
|
27
|
+
@credentials = credentials
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [CredentialProviders::Provider]
|
31
|
+
attr_reader :credentials
|
32
|
+
|
33
|
+
# @param [Http::Request] req
|
34
|
+
# @return [Http::Request]
|
35
|
+
def sign_request req
|
36
|
+
req.headers["x-amz-date"] ||= (req.headers["date"] ||= Time.now.httpdate)
|
37
|
+
req.headers["host"] ||= req.host
|
38
|
+
req.headers["x-amz-security-token"] = credentials.session_token if
|
39
|
+
credentials.session_token
|
40
|
+
req.headers["x-amzn-authorization"] =
|
41
|
+
"AWS3 "+
|
42
|
+
"AWSAccessKeyId=#{credentials.access_key_id},"+
|
43
|
+
"Algorithm=HmacSHA256,"+
|
44
|
+
"SignedHeaders=#{headers_to_sign(req).join(';')},"+
|
45
|
+
"Signature=#{signature(req)}"
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# @param [Http::Request] req
|
51
|
+
def signature req, service_signing_name = nil
|
52
|
+
sign(credentials.secret_access_key, string_to_sign(req))
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param [Http::Request] req
|
56
|
+
def string_to_sign req
|
57
|
+
OpenSSL::Digest::SHA256.digest([
|
58
|
+
req.http_method,
|
59
|
+
"/",
|
60
|
+
"",
|
61
|
+
canonical_headers(req),
|
62
|
+
req.body
|
63
|
+
].join("\n"))
|
64
|
+
end
|
65
|
+
|
66
|
+
# @param [Http::Request] req
|
67
|
+
def canonical_headers req
|
68
|
+
headers_to_sign(req).map do |name|
|
69
|
+
value = req.headers[name]
|
70
|
+
"#{name.downcase.strip}:#{value.strip}\n"
|
71
|
+
end.sort.join
|
72
|
+
end
|
73
|
+
|
74
|
+
# @param [Http::Request] req
|
75
|
+
def headers_to_sign req
|
76
|
+
req.headers.keys.select do |header|
|
77
|
+
header == "host" ||
|
78
|
+
header == "content-encoding" ||
|
79
|
+
header =~ /^x-amz/
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
8
|
+
#
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
12
|
+
# language governing permissions and limitations under the License.
|
13
|
+
|
14
|
+
require 'time'
|
15
|
+
|
16
|
+
module AWS
|
17
|
+
module Core
|
18
|
+
module Signers
|
19
|
+
# @api private
|
20
|
+
class Version3Https
|
21
|
+
|
22
|
+
include Base
|
23
|
+
|
24
|
+
# @param [CredentialProviders::Provider] credentials
|
25
|
+
def initialize credentials
|
26
|
+
@credentials = credentials
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [CredentialProviders::Provider]
|
30
|
+
attr_reader :credentials
|
31
|
+
|
32
|
+
# @param [Http::Request] req
|
33
|
+
# @return [Http::Request]
|
34
|
+
def sign_request req
|
35
|
+
parts = []
|
36
|
+
parts << "AWS3-HTTPS AWSAccessKeyId=#{credentials.access_key_id}"
|
37
|
+
parts << "Algorithm=HmacSHA256"
|
38
|
+
parts << "Signature=#{signature(req)}"
|
39
|
+
req.headers['x-amzn-authorization'] = parts.join(',')
|
40
|
+
req.headers['x-amz-security-token'] = credentials.session_token if
|
41
|
+
credentials.session_token
|
42
|
+
req
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
# @param [Http::Request] req
|
48
|
+
def signature req
|
49
|
+
sign(credentials.secret_access_key, string_to_sign(req))
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param [Http::Request] req
|
53
|
+
def string_to_sign req
|
54
|
+
req.headers['date'] ||= Time.now.httpdate
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
@@ -0,0 +1,228 @@
|
|
1
|
+
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
5
|
+
# the License is located at
|
6
|
+
#
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
8
|
+
#
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
12
|
+
# language governing permissions and limitations under the License.
|
13
|
+
|
14
|
+
require 'time'
|
15
|
+
require 'openssl'
|
16
|
+
require 'digest'
|
17
|
+
|
18
|
+
module AWS
|
19
|
+
module Core
|
20
|
+
module Signers
|
21
|
+
# @api private
|
22
|
+
class Version4
|
23
|
+
|
24
|
+
autoload :ChunkSignedStream, 'aws/core/signers/version_4/chunk_signed_stream'
|
25
|
+
|
26
|
+
# @api private
|
27
|
+
# SHA256 hex digest of the empty string
|
28
|
+
EMPTY_DIGEST = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
|
29
|
+
|
30
|
+
# @api private
|
31
|
+
STREAMING_CHECKSUM = "STREAMING-AWS4-HMAC-SHA256-PAYLOAD"
|
32
|
+
|
33
|
+
# @param [CredentialProviders::Provider] credentials
|
34
|
+
# @param [String] service_name
|
35
|
+
# @param [String] region
|
36
|
+
def initialize credentials, service_name, region
|
37
|
+
@credentials = credentials
|
38
|
+
@service_name = service_name
|
39
|
+
@region = region
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [CredentialProviders::Provider]
|
43
|
+
attr_reader :credentials
|
44
|
+
|
45
|
+
# @return [String]
|
46
|
+
attr_reader :service_name
|
47
|
+
|
48
|
+
# @return [String]
|
49
|
+
attr_reader :region
|
50
|
+
|
51
|
+
# @param [Http::Request] req
|
52
|
+
# @option options [Boolean] :chunk_signing (false) When +true+, the
|
53
|
+
# request body will be signed in chunk.
|
54
|
+
# @option options [DateTime String<YYYYMMDDTHHMMSSZ>] :datetime
|
55
|
+
# @return [Http::Request]
|
56
|
+
def sign_request req, options = {}
|
57
|
+
datetime = options[:datetime] || Time.now.utc.strftime("%Y%m%dT%H%M%SZ")
|
58
|
+
key = derive_key(datetime)
|
59
|
+
token = credentials.session_token
|
60
|
+
chunk_signing = !!options[:chunk_signing]
|
61
|
+
content_sha256 = req.headers['x-amz-content-sha256'] || body_digest(req, chunk_signing)
|
62
|
+
|
63
|
+
req.headers['host'] = req.host
|
64
|
+
req.headers['x-amz-date'] = datetime
|
65
|
+
req.headers['x-amz-security-token'] = token if token
|
66
|
+
req.headers['x-amz-content-sha256'] = content_sha256
|
67
|
+
|
68
|
+
if chunk_signing
|
69
|
+
orig_size = req.headers['content-length'].to_i
|
70
|
+
signed_size = ChunkSignedStream.signed_size(orig_size.to_i)
|
71
|
+
req.headers['content-length'] = signed_size.to_s
|
72
|
+
req.headers['x-amz-decoded-content-length'] = orig_size.to_s
|
73
|
+
end
|
74
|
+
|
75
|
+
req.headers['authorization'] = authorization(req, key, datetime, content_sha256)
|
76
|
+
|
77
|
+
req.body_stream = chunk_signed_stream(req, key) if chunk_signing
|
78
|
+
|
79
|
+
req
|
80
|
+
end
|
81
|
+
|
82
|
+
def signature(request, key, datetime, content_sha256)
|
83
|
+
string = string_to_sign(request, datetime, content_sha256)
|
84
|
+
hexhmac(key, string)
|
85
|
+
end
|
86
|
+
|
87
|
+
def credential(datetime)
|
88
|
+
"#{credentials.access_key_id}/#{key_path(datetime)}"
|
89
|
+
end
|
90
|
+
|
91
|
+
def derive_key(datetime)
|
92
|
+
k_secret = credentials.secret_access_key
|
93
|
+
k_date = hmac("AWS4" + k_secret, datetime[0,8])
|
94
|
+
k_region = hmac(k_date, region)
|
95
|
+
k_service = hmac(k_region, service_name)
|
96
|
+
k_credentials = hmac(k_service, 'aws4_request')
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
# Wraps the req body stream with another stream. The wrapper signs
|
102
|
+
# the original body as it is read, injecting signatures of indiviaul
|
103
|
+
# chunks into the resultant stream.
|
104
|
+
# @param [Http::Request] req
|
105
|
+
# @param [String] key
|
106
|
+
# @param [String] datetime
|
107
|
+
def chunk_signed_stream req, key
|
108
|
+
args = []
|
109
|
+
args << req.body_stream
|
110
|
+
args << req.headers['x-amz-decoded-content-length'].to_i
|
111
|
+
args << key
|
112
|
+
args << key_path(req.headers['x-amz-date'])
|
113
|
+
args << req.headers['x-amz-date']
|
114
|
+
args << req.headers['authorization'].split('Signature=')[1]
|
115
|
+
ChunkSignedStream.new(*args)
|
116
|
+
end
|
117
|
+
|
118
|
+
def authorization req, key, datetime, content_sha256
|
119
|
+
parts = []
|
120
|
+
parts << "AWS4-HMAC-SHA256 Credential=#{credential(datetime)}"
|
121
|
+
parts << "SignedHeaders=#{signed_headers(req)}"
|
122
|
+
parts << "Signature=#{signature(req, key, datetime, content_sha256)}"
|
123
|
+
parts.join(', ')
|
124
|
+
end
|
125
|
+
|
126
|
+
def string_to_sign req, datetime, content_sha256
|
127
|
+
parts = []
|
128
|
+
parts << 'AWS4-HMAC-SHA256'
|
129
|
+
parts << datetime
|
130
|
+
parts << key_path(datetime)
|
131
|
+
parts << hexdigest(canonical_request(req, content_sha256))
|
132
|
+
parts.join("\n")
|
133
|
+
end
|
134
|
+
|
135
|
+
# @param [String] datetime
|
136
|
+
# @return [String] the signature scope.
|
137
|
+
def key_path datetime
|
138
|
+
parts = []
|
139
|
+
parts << datetime[0,8]
|
140
|
+
parts << region
|
141
|
+
parts << service_name
|
142
|
+
parts << 'aws4_request'
|
143
|
+
parts.join("/")
|
144
|
+
end
|
145
|
+
|
146
|
+
# @param [Http::Request] req
|
147
|
+
def canonical_request req, content_sha256
|
148
|
+
parts = []
|
149
|
+
parts << req.http_method
|
150
|
+
parts << req.path
|
151
|
+
parts << req.querystring
|
152
|
+
parts << canonical_headers(req) + "\n"
|
153
|
+
parts << signed_headers(req)
|
154
|
+
parts << content_sha256
|
155
|
+
parts.join("\n")
|
156
|
+
end
|
157
|
+
|
158
|
+
# @param [Http::Request] req
|
159
|
+
def signed_headers req
|
160
|
+
to_sign = req.headers.keys.map{|k| k.to_s.downcase }
|
161
|
+
to_sign.delete('authorization')
|
162
|
+
to_sign.sort.join(";")
|
163
|
+
end
|
164
|
+
|
165
|
+
# @param [Http::Request] req
|
166
|
+
def canonical_headers req
|
167
|
+
headers = []
|
168
|
+
req.headers.each_pair do |k,v|
|
169
|
+
headers << [k,v] unless k == 'authorization'
|
170
|
+
end
|
171
|
+
headers = headers.sort_by(&:first)
|
172
|
+
headers.map{|k,v| "#{k}:#{canonical_header_values(v)}" }.join("\n")
|
173
|
+
end
|
174
|
+
|
175
|
+
# @param [String,Array<String>] values
|
176
|
+
def canonical_header_values values
|
177
|
+
values = [values] unless values.is_a?(Array)
|
178
|
+
values.map(&:to_s).join(',').gsub(/\s+/, ' ').strip
|
179
|
+
end
|
180
|
+
|
181
|
+
# @param [Http::Request] req
|
182
|
+
# @param [Boolean] chunk_signing
|
183
|
+
# @return [String]
|
184
|
+
def body_digest req, chunk_signing
|
185
|
+
case
|
186
|
+
when chunk_signing then STREAMING_CHECKSUM
|
187
|
+
when ['', nil].include?(req.body) then EMPTY_DIGEST
|
188
|
+
else hexdigest(req.body)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
# @param [String] value
|
193
|
+
# @return [String]
|
194
|
+
def hexdigest value
|
195
|
+
digest = Digest::SHA256.new
|
196
|
+
if value.respond_to?(:read)
|
197
|
+
chunk = nil
|
198
|
+
chunk_size = 1024 * 1024 # 1 megabyte
|
199
|
+
digest.update(chunk) while chunk = value.read(chunk_size)
|
200
|
+
value.rewind
|
201
|
+
else
|
202
|
+
digest.update(value)
|
203
|
+
end
|
204
|
+
digest.hexdigest
|
205
|
+
end
|
206
|
+
|
207
|
+
# @param [String] key
|
208
|
+
# @param [String] value
|
209
|
+
# @return [String]
|
210
|
+
def hmac key, value
|
211
|
+
OpenSSL::HMAC.digest(sha256_digest, key, value)
|
212
|
+
end
|
213
|
+
|
214
|
+
# @param [String] key
|
215
|
+
# @param [String] value
|
216
|
+
# @return [String]
|
217
|
+
def hexhmac key, value
|
218
|
+
OpenSSL::HMAC.hexdigest(sha256_digest, key, value)
|
219
|
+
end
|
220
|
+
|
221
|
+
def sha256_digest
|
222
|
+
OpenSSL::Digest::Digest.new('sha256')
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|