40 const time_t t = ::time(
nullptr);
41 if (!::gmtime_r(&t, <))
42 throw aws_rest_error(
"gmtime_r failed");
43 if (!::strftime(buf,
sizeof(buf),
"%Y%m%dT%H%M%SZ", <))
44 throw aws_rest_error(
"strftime failed");
45 return std::string(buf);
62 hi->update((
const std::uint8_t *)data.c_str(), data.length());
71 hi->update((
const std::uint8_t *)data.c_str(), data.length());
80 di->
update((
const std::uint8_t *)data.c_str(), data.length());
86 const std::string &key,
87 const std::string &date_stamp,
88 const std::string ®ion_name,
89 const std::string &service_name)
100 KeyValue(std::string key_arg, std::string value_arg)
101 :
key(std::move(key_arg)),
102 value(std::move(value_arg))
120 struct Query :
public std::vector<KeyValue>
126 for (
auto &p : *
this)
130 ret += p.uri_encode();
138 std::sort(begin(), end());
165 parms.emplace_back(
"X-Amz-Algorithm",
"AWS4-HMAC-SHA256");
168 parms.emplace_back(
"X-Amz-Expires", std::to_string(
expires));
171 if (!creds.
token.empty())
172 parms.emplace_back(
"X-Amz-Security-Token", creds.
token);
182 parms.emplace_back(
"X-Amz-Signature",
signature(digest_factory, creds));
198 return "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
206 +
"host:" +
host +
'\n'
210 ret +=
"UNSIGNED-PAYLOAD";
218 std::string signed_headers =
"host";
219 return signed_headers;
224 return "AWS4-HMAC-SHA256\n"
static SHA256 hmac_sha256(DigestFactory &digest_factory, const std::string &data, const std::string &key)
OPENVPN_EXCEPTION(aws_rest_error)
static SHA256 sha256(DigestFactory &digest_factory, const std::string &data)
static SHA256 hmac_sha256(DigestFactory &digest_factory, const std::string &data, const SHA256 &key)
static SHA256 signing_key(DigestFactory &df, const std::string &key, const std::string &date_stamp, const std::string ®ion_name, const std::string &service_name)
static std::string amz_date()
virtual HMACInstance::Ptr new_hmac(const CryptoAlgs::Type digest_type, const unsigned char *key, const size_t key_size)=0
virtual DigestInstance::Ptr new_digest(const CryptoAlgs::Type digest_type)=0
virtual size_t final(unsigned char *out)=0
virtual void update(const unsigned char *in, const size_t size)=0
std::string encode(const std::string &str)
std::string render_hex(const unsigned char *data, size_t size, const bool caps=false)
bool operator<(const KeyValue &rhs) const
std::string uri_encode() const
KeyValue(std::string key_arg, std::string value_arg)
void add_amz_parms(const Creds &creds)
std::string url_query() const
std::string canonical_request() const
std::string amz_credential() const
std::string uri_query() const
virtual std::string content_hash() const
std::string amz_signed_headers() const
std::string signature(DigestFactory &digest_factory, const Creds &creds) const
std::string string_to_sign(DigestFactory &digest_factory) const
void add_amz_signature(DigestFactory &digest_factory, const Creds &creds)
virtual ~QueryBuilder()=default
std::string canonical_query_string() const
std::string to_hex() const