Verify content's sha256 sum matches the expected value.
Fixes: #10333
Signed-off-by: Javier M. Mellid <jmunhoz@igalia.com>
#define ERR_INVALID_TENANT_NAME 2037
#define ERR_WEBSITE_REDIRECT 2038
#define ERR_NO_SUCH_WEBSITE_CONFIGURATION 2039
+#define ERR_AMZ_CONTENT_SHA256_MISMATCH 2040
#define ERR_USER_SUSPENDED 2100
#define ERR_INTERNAL_ERROR 2200
#define ERR_NOT_IMPLEMENTED 2201
{ ERR_TOO_SMALL, 400, "EntityTooSmall" },
{ ERR_TOO_MANY_BUCKETS, 400, "TooManyBuckets" },
{ ERR_MALFORMED_XML, 400, "MalformedXML" },
+ { ERR_AMZ_CONTENT_SHA256_MISMATCH, 400, "XAmzContentSHA256Mismatch" },
{ ERR_LENGTH_REQUIRED, 411, "MissingContentLength" },
{ EACCES, 403, "AccessDenied" },
{ EPERM, 403, "AccessDenied" },
s->aws4_auth_canonical_hdrs, s->aws4_auth_signed_hdrs, request_payload, unsigned_payload,
canonical_req, canonical_req_hash);
+ /* Validate x-amz-sha256 */
+
+ if (s->aws4_auth_complete) {
+ const char *expected_request_payload_hash = s->info.env->get("HTTP_X_AMZ_CONTENT_SHA256");
+ if (expected_request_payload_hash &&
+ s->aws4_auth_payload_hash.compare(expected_request_payload_hash) != 0) {
+ dout(10) << "ERROR: x-amz-content-sha256 does not match" << dendl;
+ return -ERR_AMZ_CONTENT_SHA256_MISMATCH;
+ }
+ }
+
/*
* create a string to sign
*