1
#include "source/extensions/common/aws/signers/sigv4_signer_impl.h"
2

            
3
#include "source/common/common/hex.h"
4
#include "source/common/crypto/utility.h"
5
#include "source/extensions/common/aws/utility.h"
6

            
7
namespace Envoy {
8
namespace Extensions {
9
namespace Common {
10
namespace Aws {
11

            
12
std::string SigV4SignerImpl::createCredentialScope(absl::string_view short_date,
13
130
                                                   absl::string_view override_region) const {
14
130
  return fmt::format(SigV4SignatureConstants::SigV4CredentialScopeFormat, short_date,
15
130
                     override_region.empty() ? region_ : override_region, service_name_);
16
130
}
17

            
18
std::string SigV4SignerImpl::createStringToSign(absl::string_view canonical_request,
19
                                                absl::string_view long_date,
20
130
                                                absl::string_view credential_scope) const {
21
130
  auto& crypto_util = Envoy::Common::Crypto::UtilitySingleton::get();
22
130
  return fmt::format(
23
130
      SigV4SignatureConstants::SigV4StringToSignFormat, SigV4SignatureConstants::SigV4Algorithm,
24
130
      long_date, credential_scope,
25
130
      Hex::encode(crypto_util.getSha256Digest(Buffer::OwnedImpl(canonical_request))));
26
130
}
27

            
28
std::string SigV4SignerImpl::createSignature(
29
    ABSL_ATTRIBUTE_UNUSED const absl::string_view access_key_id,
30
    const absl::string_view secret_access_key, const absl::string_view short_date,
31
130
    const absl::string_view string_to_sign, const absl::string_view override_region) const {
32

            
33
130
  auto& crypto_util = Envoy::Common::Crypto::UtilitySingleton::get();
34
130
  const auto secret_key =
35
130
      absl::StrCat(SigV4SignatureConstants::SigV4SignatureVersion, secret_access_key);
36
130
  const auto date_key = crypto_util.getSha256Hmac(
37
130
      std::vector<uint8_t>(secret_key.begin(), secret_key.end()), short_date);
38
130
  const auto region_key =
39
130
      crypto_util.getSha256Hmac(date_key, override_region.empty() ? region_ : override_region);
40
130
  const auto service_key = crypto_util.getSha256Hmac(region_key, service_name_);
41
130
  const auto signing_key =
42
130
      crypto_util.getSha256Hmac(service_key, SigV4SignatureConstants::Aws4Request);
43
130
  return Hex::encode(crypto_util.getSha256Hmac(signing_key, string_to_sign));
44
130
}
45

            
46
std::string SigV4SignerImpl::createAuthorizationHeader(
47
    const absl::string_view access_key_id, const absl::string_view credential_scope,
48
    const std::map<std::string, std::string>& canonical_headers,
49
46
    absl::string_view signature) const {
50
46
  const auto signed_headers = Utility::joinCanonicalHeaderNames(canonical_headers);
51
46
  return fmt::format(SigV4SignatureConstants::SigV4AuthorizationHeaderFormat,
52
46
                     SigV4SignatureConstants::SigV4Algorithm,
53
46
                     createAuthorizationCredential(access_key_id, credential_scope), signed_headers,
54
46
                     signature);
55
46
}
56

            
57
47
absl::string_view SigV4SignerImpl::getAlgorithmString() const {
58
47
  return SigV4SignatureConstants::SigV4Algorithm;
59
47
}
60

            
61
} // namespace Aws
62
} // namespace Common
63
} // namespace Extensions
64
} // namespace Envoy