29 #include "absl/status/statusor.h"
30 #include "absl/strings/ascii.h"
31 #include "absl/strings/escaping.h"
32 #include "absl/strings/str_cat.h"
33 #include "absl/strings/str_format.h"
34 #include "absl/strings/str_join.h"
35 #include "absl/strings/str_split.h"
36 #include "absl/strings/string_view.h"
37 #include "absl/time/clock.h"
38 #include "absl/time/time.h"
44 const char kAlgorithm[] =
"AWS4-HMAC-SHA256";
45 const char kDateFormat[] =
"%a, %d %b %E4Y %H:%M:%S %Z";
46 const char kXAmzDateFormat[] =
"%Y%m%dT%H%M%SZ";
67 reinterpret_cast<const unsigned char*
>(
msg.c_str()),
msg.length(),
78 std::map<std::string, std::string> additional_headers,
80 : access_key_id_(
std::
move(access_key_id)),
81 secret_access_key_(
std::
move(secret_access_key)),
85 request_payload_(
std::
move(request_payload)),
86 additional_headers_(
std::
move(additional_headers)) {
92 "Only one of {date, x-amz-date} can be specified, not both.");
128 std::string request_date_short = request_date_full.substr(0, 8);
131 std::vector<absl::string_view> canonical_request_vector;
133 canonical_request_vector.emplace_back(
method_);
134 canonical_request_vector.emplace_back(
"\n");
136 canonical_request_vector.emplace_back(
138 canonical_request_vector.emplace_back(
"\n");
140 std::vector<std::string> query_vector;
142 query_vector.emplace_back(
absl::StrCat(query_kv.key,
"=", query_kv.value));
145 canonical_request_vector.emplace_back(
query);
146 canonical_request_vector.emplace_back(
"\n");
161 std::vector<absl::string_view> canonical_headers_vector;
163 canonical_headers_vector.emplace_back(
header.first);
164 canonical_headers_vector.emplace_back(
":");
165 canonical_headers_vector.emplace_back(
header.second);
166 canonical_headers_vector.emplace_back(
"\n");
169 canonical_request_vector.emplace_back(canonical_headers);
170 canonical_request_vector.emplace_back(
"\n");
172 std::vector<absl::string_view> signed_headers_vector;
174 signed_headers_vector.emplace_back(
header.first);
177 canonical_request_vector.emplace_back(signed_headers);
178 canonical_request_vector.emplace_back(
"\n");
181 canonical_request_vector.emplace_back(hashed_request_payload);
185 std::vector<absl::string_view> string_to_sign_vector;
187 string_to_sign_vector.emplace_back(
"AWS4-HMAC-SHA256");
188 string_to_sign_vector.emplace_back(
"\n");
190 string_to_sign_vector.emplace_back(request_date_full);
191 string_to_sign_vector.emplace_back(
"\n");
193 std::pair<absl::string_view, absl::string_view> host_parts =
197 "%s/%s/%s/aws4_request", request_date_short,
region_, service_name);
198 string_to_sign_vector.emplace_back(credential_scope);
199 string_to_sign_vector.emplace_back(
"\n");
201 std::string hashed_canonical_request = SHA256Hex(canonical_request);
202 string_to_sign_vector.emplace_back(hashed_canonical_request);
217 "%s Credential=%s/%s, SignedHeaders=%s, Signature=%s", kAlgorithm,