aws-sdk-core 3.215.1 → 3.216.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2db2754760f96d9db50166b8e7df8835da9f6c4f22fc5863c735bf430836ba3
4
- data.tar.gz: c471ae0f2bd0d4ae6becf61924503c18eb879a9c1b5d1c6bbece136f46586577
3
+ metadata.gz: b080913159acbb53f549533292ccf3389e85da2bca62918de1988a819c455c9a
4
+ data.tar.gz: dabf63ed13af2582ffdc557e474ef027990132dc45af5da81dbdcc6fd9fb123b
5
5
  SHA512:
6
- metadata.gz: a328281836956b7c2cf2d4f3e013d5d869f5a4fe6605b385816025917180925881b2777d978bc7bca1ce7ff025921599e1c0040553a7d64aa09daf6f0416177c
7
- data.tar.gz: ee39dc732d9ed7d852d9aa8a6fecc7fa19e2c56fb250c3fcb60ffd6ca2d8f4365d3a77be64851d11552ef60548add61101d1b77a0f3e5d000f9f7c1543c9e3ef
6
+ metadata.gz: 8d1f1a3a28d629e1b5334fceb1d9815a2f6b4b425c693beb26a2d312cf600350ac2981ef8b28e12f365ab2973c45dc7ecc4719a04cbf6d49cbd1e09db72047ed
7
+ data.tar.gz: 0e792a5695283dd2ca209a3e2f95570a630dfdc84f02e6f2c31d9e89b278b8e8a6866564c8b0646671b76c687bfd7f76446e469b6939f8d8bf8e7b30c557ce0d
data/CHANGELOG.md CHANGED
@@ -1,6 +1,21 @@
1
1
  Unreleased Changes
2
2
  ------------------
3
3
 
4
+ 3.216.0 (2025-01-15)
5
+ ------------------
6
+
7
+ * Feature - Updated Aws::STS::Client with the latest API changes.
8
+
9
+ * Feature - Updated Aws::SSOOIDC::Client with the latest API changes.
10
+
11
+ * Feature - Updated Aws::SSO::Client with the latest API changes.
12
+
13
+ * Feature - Always calculate request checksums for operations that support or require it. Supported config options are `when_supported` and `when_required`. The default value is `when_supported`. This option is configured in code with `:request_checksum_calculation`, in the shared config file as `request_checksum_calculation`, and in the ENV as `ENV['AWS_REQUEST_CHECKSUM_CALCULATION']`.
14
+
15
+ * Feature - Always validate response checksums for operations that support or require it. Supported config options are `when_supported` and `when_required`. The default value is `when_supported`. This option is configured in code with `:response_checksum_validation`, in the shared config file as `response_checksum_validation`, and in the ENV as `ENV['AWS_RESPONSE_CHECKSUM_VALIDATION']`.
16
+
17
+ * Feature - Support CRC64NVME checksums through the `aws-crt` gem.
18
+
4
19
  3.215.1 (2025-01-14)
5
20
  ------------------
6
21
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.215.1
1
+ 3.216.0
@@ -13,34 +13,131 @@ module Aws
13
13
  begin
14
14
  require 'aws-crt'
15
15
  supported << 'CRC32C'
16
+ supported << 'CRC64NVME' if Aws::Crt::GEM_VERSION >= '0.3.0'
16
17
  rescue LoadError
18
+ # Ignored
17
19
  end
18
20
  supported
19
21
  end.freeze
20
22
 
21
- # priority order of checksum algorithms to validate responses against
22
- # Remove any algorithms not supported by client (ie, depending on CRT availability)
23
- CHECKSUM_ALGORITHM_PRIORITIES = %w[CRC32C SHA1 CRC32 SHA256] & CLIENT_ALGORITHMS
23
+ CRT_ALGORITHMS = %w[CRC32C CRC64NVME].freeze
24
+
25
+ # Priority order of checksum algorithms to validate responses against.
26
+ # Remove any algorithms not supported by client (ie, depending on CRT availability).
27
+ # This list was chosen based on average performance.
28
+ CHECKSUM_ALGORITHM_PRIORITIES = %w[CRC32 CRC32C CRC64NVME SHA1 SHA256] & CLIENT_ALGORITHMS
24
29
 
25
30
  # byte size of checksums, used in computing the trailer length
26
31
  CHECKSUM_SIZE = {
27
- 'CRC32' => 16,
28
- 'CRC32C' => 16,
29
- 'SHA1' => 36,
30
- 'SHA256' => 52
31
- }
32
+ 'CRC32' => 9,
33
+ 'CRC32C' => 9,
34
+ 'CRC64NVME' => 13,
35
+ # SHA functions need 1 byte padding because of how they are encoded
36
+ 'SHA1' => 28 + 1,
37
+ 'SHA256' => 44 + 1
38
+ }.freeze
39
+
40
+ DEFAULT_CHECKSUM = 'CRC32'
41
+
42
+ option(:request_checksum_calculation,
43
+ doc_default: 'when_supported',
44
+ doc_type: 'String',
45
+ docstring: <<~DOCS) do |cfg|
46
+ Determines when a checksum will be calculated for request payloads. Values are:
47
+
48
+ * `when_supported` - (default) When set, a checksum will be
49
+ calculated for all request payloads of operations modeled with the
50
+ `httpChecksum` trait where `requestChecksumRequired` is `true` and/or a
51
+ `requestAlgorithmMember` is modeled.
52
+ * `when_required` - When set, a checksum will only be calculated for
53
+ request payloads of operations modeled with the `httpChecksum` trait where
54
+ `requestChecksumRequired` is `true` or where a `requestAlgorithmMember`
55
+ is modeled and supplied.
56
+ DOCS
57
+ resolve_request_checksum_calculation(cfg)
58
+ end
32
59
 
33
- # Interface for computing digests on request/response bodies
34
- # which may be files, strings or IO like objects
35
- # Applies only to digest functions that produce 32 bit integer checksums
36
- # (eg CRC32)
37
- class Digest32
60
+ option(:response_checksum_validation,
61
+ doc_default: 'when_supported',
62
+ doc_type: 'String',
63
+ docstring: <<~DOCS) do |cfg|
64
+ Determines when checksum validation will be performed on response payloads. Values are:
65
+
66
+ * `when_supported` - (default) When set, checksum validation is performed on all
67
+ response payloads of operations modeled with the `httpChecksum` trait where
68
+ `responseAlgorithms` is modeled, except when no modeled checksum algorithms
69
+ are supported.
70
+ * `when_required` - When set, checksum validation is not performed on
71
+ response payloads of operations unless the checksum algorithm is supported and
72
+ the `requestValidationModeMember` member is set to `ENABLED`.
73
+ DOCS
74
+ resolve_response_checksum_validation(cfg)
75
+ end
38
76
 
39
- attr_reader :value
77
+ class << self
78
+ def digest_for_algorithm(algorithm)
79
+ case algorithm
80
+ when 'CRC32'
81
+ Digest.new(Zlib.method(:crc32), 'N')
82
+ when 'CRC32C'
83
+ Digest.new(Aws::Crt::Checksums.method(:crc32c), 'N')
84
+ when 'CRC64NVME'
85
+ Digest.new(Aws::Crt::Checksums.method(:crc64nvme), 'Q>')
86
+ when 'SHA1'
87
+ ::Digest::SHA1.new
88
+ when 'SHA256'
89
+ ::Digest::SHA256.new
90
+ else
91
+ raise ArgumentError,
92
+ "#{algorithm} is not a supported checksum algorithm."
93
+ end
94
+ end
95
+
96
+ # The trailer size (in bytes) is the overhead (0, \r, \n) + the trailer
97
+ # name + the bytesize of the base64 encoded checksum.
98
+ def trailer_length(algorithm, location_name)
99
+ 7 + location_name.size + CHECKSUM_SIZE[algorithm]
100
+ end
40
101
 
41
- # @param [Object] digest_fn
42
- def initialize(digest_fn)
102
+ private
103
+
104
+ def resolve_request_checksum_calculation(cfg)
105
+ mode = ENV['AWS_REQUEST_CHECKSUM_CALCULATION'] ||
106
+ Aws.shared_config.request_checksum_calculation(profile: cfg.profile) ||
107
+ 'when_supported'
108
+ mode = mode.downcase
109
+ unless %w[when_supported when_required].include?(mode)
110
+ raise ArgumentError,
111
+ 'expected :request_checksum_calculation or' \
112
+ " ENV['AWS_REQUEST_CHECKSUM_CALCULATION'] to be " \
113
+ '`when_supported` or `when_required`.'
114
+ end
115
+ mode
116
+ end
117
+
118
+ def resolve_response_checksum_validation(cfg)
119
+ mode = ENV['AWS_RESPONSE_CHECKSUM_VALIDATION'] ||
120
+ Aws.shared_config.response_checksum_validation(profile: cfg.profile) ||
121
+ 'when_supported'
122
+ mode = mode.downcase
123
+ unless %w[when_supported when_required].include?(mode)
124
+ raise ArgumentError,
125
+ 'expected :response_checksum_validation or' \
126
+ " ENV['AWS_RESPONSE_CHECKSUM_VALIDATION'] to be " \
127
+ '`when_supported` or `when_required`.'
128
+ end
129
+ mode
130
+ end
131
+ end
132
+
133
+ # Interface for computing digests on request/response bodies
134
+ # which may be files, strings or IO like objects.
135
+ # Applies only to digest functions that produce 32 or 64 bit
136
+ # integer checksums (eg CRC32 or CRC64).
137
+ class Digest
138
+ def initialize(digest_fn, directive)
43
139
  @digest_fn = digest_fn
140
+ @directive = directive
44
141
  @value = 0
45
142
  end
46
143
 
@@ -49,125 +146,223 @@ module Aws
49
146
  end
50
147
 
51
148
  def base64digest
52
- Base64.encode64([@value].pack('N')).chomp
149
+ Base64.encode64([@value].pack(@directive)).chomp
53
150
  end
54
151
  end
55
152
 
56
153
  def add_handlers(handlers, _config)
57
154
  handlers.add(OptionHandler, step: :initialize)
58
- # priority set low to ensure checksum is computed AFTER the request is
59
- # built but before it is signed
155
+ # Priority is set low to ensure the checksum is computed AFTER the
156
+ # request is built but before it is signed.
60
157
  handlers.add(ChecksumHandler, priority: 15, step: :build)
61
158
  end
62
159
 
63
- private
64
-
65
- def self.request_algorithm_selection(context)
66
- return unless context.operation.http_checksum
67
-
68
- input_member = context.operation.http_checksum['requestAlgorithmMember']
69
- context.params[input_member.to_sym]&.upcase if input_member
70
- end
71
-
72
- def self.request_validation_mode(context)
73
- return unless context.operation.http_checksum
74
-
75
- input_member = context.operation.http_checksum['requestValidationModeMember']
76
- context.params[input_member.to_sym] if input_member
77
- end
78
-
79
- def self.operation_response_algorithms(context)
80
- return unless context.operation.http_checksum
81
-
82
- context.operation.http_checksum['responseAlgorithms']
83
- end
84
-
85
-
86
- # @api private
87
160
  class OptionHandler < Seahorse::Client::Handler
88
161
  def call(context)
89
162
  context[:http_checksum] ||= {}
90
163
 
91
- # validate request configuration
92
- if (request_input = ChecksumAlgorithm.request_algorithm_selection(context))
93
- unless CLIENT_ALGORITHMS.include? request_input
94
- if (request_input == 'CRC32C')
95
- raise ArgumentError, "CRC32C requires crt support - install the aws-crt gem for support."
96
- else
97
- raise ArgumentError, "#{request_input} is not a supported checksum algorithm."
98
- end
99
- end
100
- end
101
-
102
- # validate response configuration
103
- if (ChecksumAlgorithm.request_validation_mode(context))
104
- # Compute an ordered list as the union between priority supported and the
105
- # operation's modeled response algorithms.
106
- validation_list = CHECKSUM_ALGORITHM_PRIORITIES &
107
- ChecksumAlgorithm.operation_response_algorithms(context)
108
- context[:http_checksum][:validation_list] = validation_list
164
+ # Set validation mode to enabled when supported.
165
+ if context.config.response_checksum_validation == 'when_supported'
166
+ enable_request_validation_mode(context)
109
167
  end
110
168
 
111
169
  @handler.call(context)
112
170
  end
171
+
172
+ private
173
+
174
+ def enable_request_validation_mode(context)
175
+ return unless context.operation.http_checksum
176
+
177
+ input_member = context.operation.http_checksum['requestValidationModeMember']
178
+ context.params[input_member.to_sym] ||= 'ENABLED' if input_member
179
+ end
113
180
  end
114
181
 
115
- # @api private
116
182
  class ChecksumHandler < Seahorse::Client::Handler
117
-
118
183
  def call(context)
184
+ algorithm = nil
119
185
  if should_calculate_request_checksum?(context)
120
- request_algorithm_input = ChecksumAlgorithm.request_algorithm_selection(context) ||
121
- context[:default_request_checksum_algorithm]
122
- context[:checksum_algorithms] = request_algorithm_input
123
-
124
- request_checksum_property = {
125
- 'algorithm' => request_algorithm_input,
126
- 'in' => checksum_request_in(context),
127
- 'name' => "x-amz-checksum-#{request_algorithm_input.downcase}"
186
+ algorithm = choose_request_algorithm!(context)
187
+ request_algorithm = {
188
+ algorithm: algorithm,
189
+ in: checksum_request_in(context),
190
+ name: "x-amz-checksum-#{algorithm.downcase}",
191
+ request_algorithm_header: request_algorithm_header(context)
128
192
  }
129
193
 
130
- calculate_request_checksum(context, request_checksum_property)
194
+ context[:http_checksum][:request_algorithm] = request_algorithm
195
+ calculate_request_checksum(context, request_algorithm)
131
196
  end
132
197
 
133
198
  if should_verify_response_checksum?(context)
134
199
  add_verify_response_checksum_handlers(context)
135
200
  end
136
201
 
137
- @handler.call(context)
202
+ with_metrics(context.config, algorithm) { @handler.call(context) }
138
203
  end
139
204
 
140
205
  private
141
206
 
142
- def should_calculate_request_checksum?(context)
207
+ def with_metrics(config, algorithm, &block)
208
+ metrics = []
209
+ add_request_config_metric(config, metrics)
210
+ add_response_config_metric(config, metrics)
211
+ add_request_checksum_metrics(algorithm, metrics)
212
+ Aws::Plugins::UserAgent.metric(*metrics, &block)
213
+ end
214
+
215
+ def add_request_config_metric(config, metrics)
216
+ case config.request_checksum_calculation
217
+ when 'when_supported'
218
+ metrics << 'FLEXIBLE_CHECKSUMS_REQ_WHEN_SUPPORTED'
219
+ when 'when_required'
220
+ metrics << 'FLEXIBLE_CHECKSUMS_REQ_WHEN_REQUIRED'
221
+ end
222
+ end
223
+
224
+ def add_response_config_metric(config, metrics)
225
+ case config.response_checksum_validation
226
+ when 'when_supported'
227
+ metrics << 'FLEXIBLE_CHECKSUMS_RES_WHEN_SUPPORTED'
228
+ when 'when_required'
229
+ metrics << 'FLEXIBLE_CHECKSUMS_RES_WHEN_REQUIRED'
230
+ end
231
+ end
232
+
233
+ def add_request_checksum_metrics(algorithm, metrics)
234
+ case algorithm
235
+ when 'CRC32'
236
+ metrics << 'FLEXIBLE_CHECKSUMS_REQ_CRC32'
237
+ when 'CRC32C'
238
+ metrics << 'FLEXIBLE_CHECKSUMS_REQ_CRC32C'
239
+ when 'CRC64NVME'
240
+ metrics << 'FLEXIBLE_CHECKSUMS_REQ_CRC64'
241
+ when 'SHA1'
242
+ metrics << 'FLEXIBLE_CHECKSUMS_REQ_SHA1'
243
+ when 'SHA256'
244
+ metrics << 'FLEXIBLE_CHECKSUMS_REQ_SHA256'
245
+ end
246
+ end
247
+
248
+ def request_algorithm_selection(context)
249
+ return unless context.operation.http_checksum
250
+
251
+ input_member = context.operation.http_checksum['requestAlgorithmMember']
252
+ context.params[input_member.to_sym] ||= DEFAULT_CHECKSUM if input_member
253
+ end
254
+
255
+ def request_algorithm_header(context)
256
+ input_member = context.operation.http_checksum['requestAlgorithmMember']
257
+ shape = context.operation.input.shape.member(input_member)
258
+ shape.location_name if shape && shape.location == 'header'
259
+ end
260
+
261
+ def request_validation_mode(context)
262
+ return unless context.operation.http_checksum
263
+
264
+ input_member = context.operation.http_checksum['requestValidationModeMember']
265
+ context.params[input_member.to_sym] if input_member
266
+ end
267
+
268
+ def operation_response_algorithms(context)
269
+ return unless context.operation.http_checksum
270
+
271
+ context.operation.http_checksum['responseAlgorithms']
272
+ end
273
+
274
+ def checksum_required?(context)
275
+ (http_checksum = context.operation.http_checksum) &&
276
+ (checksum_required = http_checksum['requestChecksumRequired']) &&
277
+ (checksum_required && context.config.request_checksum_calculation == 'when_required')
278
+ end
279
+
280
+ def checksum_optional?(context)
143
281
  context.operation.http_checksum &&
144
- (ChecksumAlgorithm.request_algorithm_selection(context) ||
145
- context[:default_request_checksum_algorithm])
282
+ context.config.request_checksum_calculation != 'when_required'
146
283
  end
147
284
 
148
- def should_verify_response_checksum?(context)
149
- context[:http_checksum][:validation_list] && !context[:http_checksum][:validation_list].empty?
285
+ def checksum_provided_as_header?(headers)
286
+ headers.any? { |k, _| k.start_with?('x-amz-checksum-') }
287
+ end
288
+
289
+ def should_calculate_request_checksum?(context)
290
+ !checksum_provided_as_header?(context.http_request.headers) &&
291
+ request_algorithm_selection(context) &&
292
+ (checksum_required?(context) || checksum_optional?(context))
293
+ end
294
+
295
+ def choose_request_algorithm!(context)
296
+ algorithm = request_algorithm_selection(context).upcase
297
+ return algorithm if CLIENT_ALGORITHMS.include?(algorithm)
298
+
299
+ if CRT_ALGORITHMS.include?(algorithm)
300
+ raise ArgumentError,
301
+ 'CRC32C and CRC64NVME requires CRT support ' \
302
+ '- install the aws-crt gem'
303
+ end
304
+
305
+ raise ArgumentError,
306
+ "#{algorithm} is not a supported checksum algorithm."
307
+ end
308
+
309
+ def checksum_request_in(context)
310
+ if context.operation['unsignedPayload'] ||
311
+ context.operation['authtype'] == 'v4-unsigned-body'
312
+ 'trailer'
313
+ else
314
+ 'header'
315
+ end
150
316
  end
151
317
 
152
318
  def calculate_request_checksum(context, checksum_properties)
153
- case checksum_properties['in']
319
+ headers = context.http_request.headers
320
+ if (algorithm_header = checksum_properties[:request_algorithm_header])
321
+ headers[algorithm_header] = checksum_properties[:algorithm]
322
+ end
323
+ case checksum_properties[:in]
154
324
  when 'header'
155
- header_name = checksum_properties['name']
156
- body = context.http_request.body_contents
157
- if body
158
- context.http_request.headers[header_name] ||=
159
- ChecksumAlgorithm.calculate_checksum(checksum_properties['algorithm'], body)
160
- end
325
+ apply_request_checksum(context, headers, checksum_properties)
161
326
  when 'trailer'
162
- apply_request_trailer_checksum(context, checksum_properties)
327
+ apply_request_trailer_checksum(context, headers, checksum_properties)
328
+ else
329
+ # nothing
330
+ end
331
+ end
332
+
333
+ def apply_request_checksum(context, headers, checksum_properties)
334
+ header_name = checksum_properties[:name]
335
+ body = context.http_request.body_contents
336
+ headers[header_name] = calculate_checksum(
337
+ checksum_properties[:algorithm],
338
+ body
339
+ )
340
+ end
341
+
342
+ def calculate_checksum(algorithm, body)
343
+ digest = ChecksumAlgorithm.digest_for_algorithm(algorithm)
344
+ if body.respond_to?(:read)
345
+ update_in_chunks(digest, body)
346
+ else
347
+ digest.update(body)
348
+ end
349
+ digest.base64digest
350
+ end
351
+
352
+ def update_in_chunks(digest, io)
353
+ loop do
354
+ chunk = io.read(CHUNK_SIZE)
355
+ break unless chunk
356
+
357
+ digest.update(chunk)
163
358
  end
359
+ io.rewind
164
360
  end
165
361
 
166
- def apply_request_trailer_checksum(context, checksum_properties)
167
- location_name = checksum_properties['name']
362
+ def apply_request_trailer_checksum(context, headers, checksum_properties)
363
+ location_name = checksum_properties[:name]
168
364
 
169
365
  # set required headers
170
- headers = context.http_request.headers
171
366
  headers['Content-Encoding'] = 'aws-chunked'
172
367
  headers['X-Amz-Content-Sha256'] = 'STREAMING-UNSIGNED-PAYLOAD-TRAILER'
173
368
  headers['X-Amz-Trailer'] = location_name
@@ -176,121 +371,88 @@ module Aws
176
371
  # to set the Content-Length header (set by content_length plugin).
177
372
  # This means we cannot use Transfer-Encoding=chunked
178
373
 
179
- if !context.http_request.body.respond_to?(:size)
374
+ unless context.http_request.body.respond_to?(:size)
180
375
  raise Aws::Errors::ChecksumError, 'Could not determine length of the body'
181
376
  end
182
377
  headers['X-Amz-Decoded-Content-Length'] = context.http_request.body.size
183
378
 
184
379
  context.http_request.body = AwsChunkedTrailerDigestIO.new(
185
380
  context.http_request.body,
186
- checksum_properties['algorithm'],
381
+ checksum_properties[:algorithm],
187
382
  location_name
188
383
  )
189
384
  end
190
385
 
386
+ def should_verify_response_checksum?(context)
387
+ request_validation_mode(context) == 'ENABLED'
388
+ end
389
+
191
390
  # Add events to the http_response to verify the checksum as its read
192
391
  # This prevents the body from being read multiple times
193
392
  # verification is done only once a successful response has completed
194
393
  def add_verify_response_checksum_handlers(context)
195
- http_response = context.http_response
196
- checksum_context = { }
197
- http_response.on_headers do |_status, headers|
198
- header_name, algorithm = response_header_to_verify(headers, context[:http_checksum][:validation_list])
199
- if header_name
200
- expected = headers[header_name]
201
-
202
- unless context[:http_checksum][:skip_on_suffix] && /-[\d]+$/.match(expected)
203
- checksum_context[:algorithm] = algorithm
204
- checksum_context[:header_name] = header_name
205
- checksum_context[:digest] = ChecksumAlgorithm.digest_for_algorithm(algorithm)
206
- checksum_context[:expected] = expected
207
- end
208
- end
209
- end
394
+ checksum_context = {}
395
+ add_verify_response_headers_handler(context, checksum_context)
396
+ add_verify_response_data_handler(context, checksum_context)
397
+ add_verify_response_success_handler(context, checksum_context)
398
+ end
210
399
 
211
- http_response.on_data do |chunk|
212
- checksum_context[:digest].update(chunk) if checksum_context[:digest]
400
+ def add_verify_response_headers_handler(context, checksum_context)
401
+ validation_list = CHECKSUM_ALGORITHM_PRIORITIES &
402
+ operation_response_algorithms(context)
403
+ context[:http_checksum][:validation_list] = validation_list
404
+
405
+ context.http_response.on_headers do |_status, headers|
406
+ header_name, algorithm = response_header_to_verify(
407
+ headers,
408
+ validation_list
409
+ )
410
+ next unless header_name
411
+
412
+ expected = headers[header_name]
413
+ next if context[:http_checksum][:skip_on_suffix] && /-\d+$/.match(expected)
414
+
415
+ checksum_context[:algorithm] = algorithm
416
+ checksum_context[:header_name] = header_name
417
+ checksum_context[:digest] = ChecksumAlgorithm.digest_for_algorithm(algorithm)
418
+ checksum_context[:expected] = expected
213
419
  end
420
+ end
214
421
 
215
- http_response.on_success do
216
- if checksum_context[:digest] &&
217
- (computed = checksum_context[:digest].base64digest)
422
+ def add_verify_response_data_handler(context, checksum_context)
423
+ context.http_response.on_data do |chunk|
424
+ checksum_context[:digest]&.update(chunk)
425
+ end
426
+ end
218
427
 
219
- if computed != checksum_context[:expected]
220
- raise Aws::Errors::ChecksumError,
221
- "Checksum validation failed on #{checksum_context[:header_name]} "\
222
- "computed: #{computed}, expected: #{checksum_context[:expected]}"
223
- end
428
+ def add_verify_response_success_handler(context, checksum_context)
429
+ context.http_response.on_success do
430
+ next unless checksum_context[:digest]
224
431
 
432
+ computed = checksum_context[:digest].base64digest
433
+ if computed == checksum_context[:expected]
225
434
  context[:http_checksum][:validated] = checksum_context[:algorithm]
435
+ else
436
+ raise Aws::Errors::ChecksumError,
437
+ "Checksum validation failed on #{checksum_context[:header_name]} "\
438
+ "computed: #{computed}, expected: #{checksum_context[:expected]}"
226
439
  end
227
440
  end
228
441
  end
229
442
 
230
- # returns nil if no headers to verify
231
443
  def response_header_to_verify(headers, validation_list)
232
444
  validation_list.each do |algorithm|
233
- header_name = "x-amz-checksum-#{algorithm}"
445
+ header_name = "x-amz-checksum-#{algorithm.downcase}"
234
446
  return [header_name, algorithm] if headers[header_name]
235
447
  end
236
448
  nil
237
449
  end
238
-
239
- # determine where (header vs trailer) a request checksum should be added
240
- def checksum_request_in(context)
241
- if context.operation['unsignedPayload'] ||
242
- context.operation['authtype'] == 'v4-unsigned-body'
243
- 'trailer'
244
- else
245
- 'header'
246
- end
247
- end
248
-
249
- end
250
-
251
- def self.calculate_checksum(algorithm, body)
252
- digest = ChecksumAlgorithm.digest_for_algorithm(algorithm)
253
- if body.respond_to?(:read)
254
- ChecksumAlgorithm.update_in_chunks(digest, body)
255
- else
256
- digest.update(body)
257
- end
258
- digest.base64digest
259
- end
260
-
261
- def self.digest_for_algorithm(algorithm)
262
- case algorithm
263
- when 'CRC32'
264
- Digest32.new(Zlib.method(:crc32))
265
- when 'CRC32C'
266
- # this will only be used if input algorithm is CRC32C AND client supports it (crt available)
267
- Digest32.new(Aws::Crt::Checksums.method(:crc32c))
268
- when 'SHA1'
269
- Digest::SHA1.new
270
- when 'SHA256'
271
- Digest::SHA256.new
272
- end
273
- end
274
-
275
- # The trailer size (in bytes) is the overhead + the trailer name +
276
- # the length of the base64 encoded checksum
277
- def self.trailer_length(algorithm, location_name)
278
- CHECKSUM_SIZE[algorithm] + location_name.size
279
- end
280
-
281
- def self.update_in_chunks(digest, io)
282
- loop do
283
- chunk = io.read(CHUNK_SIZE)
284
- break unless chunk
285
- digest.update(chunk)
286
- end
287
- io.rewind
288
450
  end
289
451
 
290
452
  # Wrapper for request body that implements application-layer
291
453
  # chunking with Digest computed on chunks + added as a trailer
292
454
  class AwsChunkedTrailerDigestIO
293
- CHUNK_SIZE = 16384
455
+ CHUNK_SIZE = 16_384
294
456
 
295
457
  def initialize(io, algorithm, location_name)
296
458
  @io = io
@@ -331,7 +493,7 @@ module Aws
331
493
  else
332
494
  trailers = {}
333
495
  trailers[@location_name] = @digest.base64digest
334
- trailers = trailers.map { |k,v| "#{k}:#{v}"}.join("\r\n")
496
+ trailers = trailers.map { |k,v| "#{k}:#{v}" }.join("\r\n")
335
497
  @trailer_io = StringIO.new("0\r\n#{trailers}\r\n\r\n")
336
498
  chunk = @trailer_io.read(length, buf)
337
499
  end
@@ -11,8 +11,8 @@ module Aws
11
11
  CHUNK_SIZE = 1 * 1024 * 1024 # one MB
12
12
 
13
13
  def call(context)
14
- if checksum_required?(context) &&
15
- !context[:checksum_algorithms] && # skip in favor of flexible checksum
14
+ if context.operation.http_checksum_required &&
15
+ !context[:http_checksum][:request_algorithm] && # skip in favor of flexible checksum
16
16
  !context[:s3_express_endpoint] # s3 express endpoints do not support md5
17
17
  body = context.http_request.body
18
18
  context.http_request.headers['Content-Md5'] ||= md5(body)
@@ -22,12 +22,6 @@ module Aws
22
22
 
23
23
  private
24
24
 
25
- def checksum_required?(context)
26
- context.operation.http_checksum_required ||
27
- (context.operation.http_checksum &&
28
- context.operation.http_checksum['requestChecksumRequired'])
29
- end
30
-
31
25
  # @param [File, Tempfile, IO#read, String] value
32
26
  # @return [String<MD5>]
33
27
  def md5(value)
@@ -25,7 +25,16 @@ module Aws
25
25
  "ACCOUNT_ID_MODE_DISABLED": "Q",
26
26
  "ACCOUNT_ID_MODE_REQUIRED": "R",
27
27
  "SIGV4A_SIGNING": "S",
28
- "RESOLVED_ACCOUNT_ID": "T"
28
+ "RESOLVED_ACCOUNT_ID": "T",
29
+ "FLEXIBLE_CHECKSUMS_REQ_CRC32" : "U",
30
+ "FLEXIBLE_CHECKSUMS_REQ_CRC32C" : "V",
31
+ "FLEXIBLE_CHECKSUMS_REQ_CRC64" : "W",
32
+ "FLEXIBLE_CHECKSUMS_REQ_SHA1" : "X",
33
+ "FLEXIBLE_CHECKSUMS_REQ_SHA256" : "Y",
34
+ "FLEXIBLE_CHECKSUMS_REQ_WHEN_SUPPORTED" : "Z",
35
+ "FLEXIBLE_CHECKSUMS_REQ_WHEN_REQUIRED" : "a",
36
+ "FLEXIBLE_CHECKSUMS_RES_WHEN_SUPPORTED" : "b",
37
+ "FLEXIBLE_CHECKSUMS_RES_WHEN_REQUIRED" : "c"
29
38
  }
30
39
  METRICS
31
40
 
@@ -212,6 +212,8 @@ module Aws
212
212
  :retry_mode,
213
213
  :adaptive_retry_wait_to_fill,
214
214
  :correct_clock_skew,
215
+ :request_checksum_calculation,
216
+ :response_checksum_validation,
215
217
  :csm_client_id,
216
218
  :csm_enabled,
217
219
  :csm_host,
@@ -257,11 +257,34 @@ module Aws::SSO
257
257
  # Used when loading credentials from the shared credentials file
258
258
  # at HOME/.aws/credentials. When not specified, 'default' is used.
259
259
  #
260
+ # @option options [String] :request_checksum_calculation ("when_supported")
261
+ # Determines when a checksum will be calculated for request payloads. Values are:
262
+ #
263
+ # * `when_supported` - (default) When set, a checksum will be
264
+ # calculated for all request payloads of operations modeled with the
265
+ # `httpChecksum` trait where `requestChecksumRequired` is `true` and/or a
266
+ # `requestAlgorithmMember` is modeled.
267
+ # * `when_required` - When set, a checksum will only be calculated for
268
+ # request payloads of operations modeled with the `httpChecksum` trait where
269
+ # `requestChecksumRequired` is `true` or where a `requestAlgorithmMember`
270
+ # is modeled and supplied.
271
+ #
260
272
  # @option options [Integer] :request_min_compression_size_bytes (10240)
261
273
  # The minimum size in bytes that triggers compression for request
262
274
  # bodies. The value must be non-negative integer value between 0
263
275
  # and 10485780 bytes inclusive.
264
276
  #
277
+ # @option options [String] :response_checksum_validation ("when_supported")
278
+ # Determines when checksum validation will be performed on response payloads. Values are:
279
+ #
280
+ # * `when_supported` - (default) When set, checksum validation is performed on all
281
+ # response payloads of operations modeled with the `httpChecksum` trait where
282
+ # `responseAlgorithms` is modeled, except when no modeled checksum algorithms
283
+ # are supported.
284
+ # * `when_required` - When set, checksum validation is not performed on
285
+ # response payloads of operations unless the checksum algorithm is supported and
286
+ # the `requestValidationModeMember` member is set to `ENABLED`.
287
+ #
265
288
  # @option options [Proc] :retry_backoff
266
289
  # A proc or lambda used for backoff. Defaults to 2**retries * retry_base_delay.
267
290
  # This option is only used in the `legacy` retry mode.
@@ -669,7 +692,7 @@ module Aws::SSO
669
692
  tracer: tracer
670
693
  )
671
694
  context[:gem_name] = 'aws-sdk-core'
672
- context[:gem_version] = '3.215.1'
695
+ context[:gem_version] = '3.216.0'
673
696
  Seahorse::Client::Request.new(handlers, context)
674
697
  end
675
698
 
data/lib/aws-sdk-sso.rb CHANGED
@@ -56,7 +56,7 @@ module Aws::SSO
56
56
  autoload :EndpointProvider, 'aws-sdk-sso/endpoint_provider'
57
57
  autoload :Endpoints, 'aws-sdk-sso/endpoints'
58
58
 
59
- GEM_VERSION = '3.215.1'
59
+ GEM_VERSION = '3.216.0'
60
60
 
61
61
  end
62
62
 
@@ -257,11 +257,34 @@ module Aws::SSOOIDC
257
257
  # Used when loading credentials from the shared credentials file
258
258
  # at HOME/.aws/credentials. When not specified, 'default' is used.
259
259
  #
260
+ # @option options [String] :request_checksum_calculation ("when_supported")
261
+ # Determines when a checksum will be calculated for request payloads. Values are:
262
+ #
263
+ # * `when_supported` - (default) When set, a checksum will be
264
+ # calculated for all request payloads of operations modeled with the
265
+ # `httpChecksum` trait where `requestChecksumRequired` is `true` and/or a
266
+ # `requestAlgorithmMember` is modeled.
267
+ # * `when_required` - When set, a checksum will only be calculated for
268
+ # request payloads of operations modeled with the `httpChecksum` trait where
269
+ # `requestChecksumRequired` is `true` or where a `requestAlgorithmMember`
270
+ # is modeled and supplied.
271
+ #
260
272
  # @option options [Integer] :request_min_compression_size_bytes (10240)
261
273
  # The minimum size in bytes that triggers compression for request
262
274
  # bodies. The value must be non-negative integer value between 0
263
275
  # and 10485780 bytes inclusive.
264
276
  #
277
+ # @option options [String] :response_checksum_validation ("when_supported")
278
+ # Determines when checksum validation will be performed on response payloads. Values are:
279
+ #
280
+ # * `when_supported` - (default) When set, checksum validation is performed on all
281
+ # response payloads of operations modeled with the `httpChecksum` trait where
282
+ # `responseAlgorithms` is modeled, except when no modeled checksum algorithms
283
+ # are supported.
284
+ # * `when_required` - When set, checksum validation is not performed on
285
+ # response payloads of operations unless the checksum algorithm is supported and
286
+ # the `requestValidationModeMember` member is set to `ENABLED`.
287
+ #
265
288
  # @option options [Proc] :retry_backoff
266
289
  # A proc or lambda used for backoff. Defaults to 2**retries * retry_base_delay.
267
290
  # This option is only used in the `legacy` retry mode.
@@ -1022,7 +1045,7 @@ module Aws::SSOOIDC
1022
1045
  tracer: tracer
1023
1046
  )
1024
1047
  context[:gem_name] = 'aws-sdk-core'
1025
- context[:gem_version] = '3.215.1'
1048
+ context[:gem_version] = '3.216.0'
1026
1049
  Seahorse::Client::Request.new(handlers, context)
1027
1050
  end
1028
1051
 
@@ -56,7 +56,7 @@ module Aws::SSOOIDC
56
56
  autoload :EndpointProvider, 'aws-sdk-ssooidc/endpoint_provider'
57
57
  autoload :Endpoints, 'aws-sdk-ssooidc/endpoints'
58
58
 
59
- GEM_VERSION = '3.215.1'
59
+ GEM_VERSION = '3.216.0'
60
60
 
61
61
  end
62
62
 
@@ -259,11 +259,34 @@ module Aws::STS
259
259
  # Used when loading credentials from the shared credentials file
260
260
  # at HOME/.aws/credentials. When not specified, 'default' is used.
261
261
  #
262
+ # @option options [String] :request_checksum_calculation ("when_supported")
263
+ # Determines when a checksum will be calculated for request payloads. Values are:
264
+ #
265
+ # * `when_supported` - (default) When set, a checksum will be
266
+ # calculated for all request payloads of operations modeled with the
267
+ # `httpChecksum` trait where `requestChecksumRequired` is `true` and/or a
268
+ # `requestAlgorithmMember` is modeled.
269
+ # * `when_required` - When set, a checksum will only be calculated for
270
+ # request payloads of operations modeled with the `httpChecksum` trait where
271
+ # `requestChecksumRequired` is `true` or where a `requestAlgorithmMember`
272
+ # is modeled and supplied.
273
+ #
262
274
  # @option options [Integer] :request_min_compression_size_bytes (10240)
263
275
  # The minimum size in bytes that triggers compression for request
264
276
  # bodies. The value must be non-negative integer value between 0
265
277
  # and 10485780 bytes inclusive.
266
278
  #
279
+ # @option options [String] :response_checksum_validation ("when_supported")
280
+ # Determines when checksum validation will be performed on response payloads. Values are:
281
+ #
282
+ # * `when_supported` - (default) When set, checksum validation is performed on all
283
+ # response payloads of operations modeled with the `httpChecksum` trait where
284
+ # `responseAlgorithms` is modeled, except when no modeled checksum algorithms
285
+ # are supported.
286
+ # * `when_required` - When set, checksum validation is not performed on
287
+ # response payloads of operations unless the checksum algorithm is supported and
288
+ # the `requestValidationModeMember` member is set to `ENABLED`.
289
+ #
267
290
  # @option options [Proc] :retry_backoff
268
291
  # A proc or lambda used for backoff. Defaults to 2**retries * retry_base_delay.
269
292
  # This option is only used in the `legacy` retry mode.
@@ -2572,7 +2595,7 @@ module Aws::STS
2572
2595
  tracer: tracer
2573
2596
  )
2574
2597
  context[:gem_name] = 'aws-sdk-core'
2575
- context[:gem_version] = '3.215.1'
2598
+ context[:gem_version] = '3.216.0'
2576
2599
  Seahorse::Client::Request.new(handlers, context)
2577
2600
  end
2578
2601
 
data/lib/aws-sdk-sts.rb CHANGED
@@ -56,7 +56,7 @@ module Aws::STS
56
56
  autoload :EndpointProvider, 'aws-sdk-sts/endpoint_provider'
57
57
  autoload :Endpoints, 'aws-sdk-sts/endpoints'
58
58
 
59
- GEM_VERSION = '3.215.1'
59
+ GEM_VERSION = '3.216.0'
60
60
 
61
61
  end
62
62
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-sdk-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.215.1
4
+ version: 3.216.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amazon Web Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-14 00:00:00.000000000 Z
11
+ date: 2025-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jmespath