AWS SDK for C++

AWS SDK for C++ Version 1.11.827

Loading...
Searching...
No Matches
AWSAuthV4Signer.h
1
7#pragma once
8
9#include "aws/core/auth/signer/AWSAuthSignerBase.h"
10
11#include <aws/core/utils/Array.h>
12#include <aws/core/utils/memory/stl/AWSSet.h>
13#include <aws/core/utils/threading/ReaderWriterLock.h>
14#include <aws/core/utils/crypto/Sha256.h>
15#include <aws/core/utils/crypto/Sha256HMAC.h>
16#include <aws/core/http/HttpRequest.h>
17#include <aws/core/endpoint/internal/AWSEndpointAttribute.h>
18
19#include <aws/crt/auth/Sigv4Signing.h>
20
21#include <memory>
22
23namespace smithy
24{
25 class AwsSigV4Signer;
26}
27
28namespace Aws
29{
30 namespace Http
31 {
32 class HttpRequest;
33 } // namespace Http
34
35 namespace Auth
36 {
37 class AWSCredentials;
38 class AWSCredentialsProvider;
39 class CredentialsResolutionContext;
40
42 {
43 SIGV4 = static_cast<int>(Aws::Crt::Auth::SigningAlgorithm::SigV4),
44 ASYMMETRIC_SIGV4 = static_cast<int>(Aws::Crt::Auth::SigningAlgorithm::SigV4A),
45 };
46
47 AWS_CORE_API extern const char SIGV4_SIGNER[];
48 AWS_CORE_API extern const char ASYMMETRIC_SIGV4_SIGNER[];
49 } // namespace Auth
50
51 namespace Client
52 {
57 class AWS_CORE_API AWSAuthV4Signer : public AWSAuthSigner
58 {
59
60 public:
65 {
69 RequestDependent,
73 Always,
77 Never
78 };
88 AWSAuthV4Signer(const std::shared_ptr<Auth::AWSCredentialsProvider>& credentialsProvider,
89 const char* serviceName, const Aws::String& region, PayloadSigningPolicy signingPolicy = PayloadSigningPolicy::RequestDependent,
90 bool urlEscapePath = true, Aws::Auth::AWSSigningAlgorithm signingAlgorithm = Aws::Auth::AWSSigningAlgorithm::SIGV4);
91
93
98 const char* GetName() const override
99 {
100 if (m_signingAlgorithm == Aws::Auth::AWSSigningAlgorithm::ASYMMETRIC_SIGV4)
101 {
103 }
104 else
105 {
107 }
108 }
109
114 bool SignRequest(Aws::Http::HttpRequest& request) const override
115 {
116 return SignRequest(request, m_region.c_str(), m_serviceName.c_str(), true/*signBody*/);
117 }
118
124 bool SignRequest(Aws::Http::HttpRequest& request, bool signBody) const override
125 {
126 return SignRequest(request, m_region.c_str(), m_serviceName.c_str(), signBody);
127 }
128
134 bool SignRequest(Aws::Http::HttpRequest& request, const char* region, bool signBody) const override
135 {
136 return SignRequest(request, region, m_serviceName.c_str(), signBody);
137 }
138
144 bool SignRequest(Aws::Http::HttpRequest& request, const char* region, const char* serviceName, bool signBody) const override;
145
153 bool PresignRequest(Aws::Http::HttpRequest& request, long long expirationInSeconds = 0) const override;
154
162 bool PresignRequest(Aws::Http::HttpRequest& request, const char* region, long long expirationInSeconds = 0) const override;
163
172 bool PresignRequest(Aws::Http::HttpRequest& request, const char* region, const char* serviceName, long long expirationInSeconds = 0) const override;
173
182 bool PresignRequest(Aws::Http::HttpRequest& request, const Aws::Auth::AWSCredentials& creds, const char* region, const char* serviceName, long long expirationInSeconds = 0) const;
183
184
185 virtual Aws::Auth::AWSCredentials GetCredentials(const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) const;
186
187 Aws::String GetServiceName() const { return m_serviceName; }
188 Aws::String GetRegion() const { return m_region; }
190 const Aws::String& stringToSign, const Aws::String& simpleDate) const;
191 bool ShouldSignHeader(const Aws::String& header) const;
192
193 protected:
194 virtual bool ServiceRequireUnsignedPayload(const Aws::String& serviceName) const;
197
198 private:
199 Aws::String GenerateSignature(const Aws::Auth::AWSCredentials& credentials,
200 const Aws::String& stringToSign, const Aws::String& simpleDate, const Aws::String& region,
201 const Aws::String& serviceName) const;
202
203 Aws::String GenerateSignature(const Aws::String& stringToSign, const Aws::Utils::ByteBuffer& key) const;
204 Aws::String ComputePayloadHash(Aws::Http::HttpRequest&) const;
205 Aws::String GenerateStringToSign(const Aws::String& dateValue, const Aws::String& simpleDate,
206 const Aws::String& canonicalRequestHash, const Aws::String& region,
207 const Aws::String& serviceName) const;
208 Aws::Utils::ByteBuffer ComputeHash(const Aws::String& secretKey,
209 const Aws::String& simpleDate, const Aws::String& region, const Aws::String& serviceName) const;
210 bool SignRequestWithSigV4a(Aws::Http::HttpRequest& request, const char* region, const char* serviceName,
211 bool signBody, long long expirationTimeInSeconds, Aws::Crt::Auth::SignatureType signatureType) const;
212
217 bool SignRequestWithCreds(Aws::Http::HttpRequest& request, const Auth::AWSCredentials& credentials,
218 const char* region, const char* serviceName, bool signBody) const;
219
220
221 Aws::Auth::AWSSigningAlgorithm m_signingAlgorithm;
222 std::shared_ptr<Auth::AWSCredentialsProvider> m_credentialsProvider;
223 const Aws::String m_serviceName;
224 const Aws::String m_region;
225
226 Aws::Set<Aws::String> m_unsignedHeaders;
227
228 //these next four fields are ONLY for caching purposes and do not change
229 //the logical state of the signer. They are marked mutable so the
230 //interface can remain const.
231 mutable Aws::Utils::ByteBuffer m_partialSignature;
232 mutable Aws::String m_currentDateStr;
233 mutable Aws::String m_currentSecretKey;
234 mutable Utils::Threading::ReaderWriterLock m_partialSignatureLock;
235 PayloadSigningPolicy m_payloadSigningPolicy;
236 bool m_urlEscapePath;
237 mutable Aws::Crt::Auth::Sigv4HttpRequestSigner m_crtSigner{};
238 };
239 } // namespace Client
240} // namespace Aws
241
AWSAuthV4Signer(const std::shared_ptr< Auth::AWSCredentialsProvider > &credentialsProvider, const char *serviceName, const Aws::String &region, PayloadSigningPolicy signingPolicy=PayloadSigningPolicy::RequestDependent, bool urlEscapePath=true, Aws::Auth::AWSSigningAlgorithm signingAlgorithm=Aws::Auth::AWSSigningAlgorithm::SIGV4)
Aws::String GenerateSignature(const Aws::Auth::AWSCredentials &credentials, const Aws::String &stringToSign, const Aws::String &simpleDate) const
bool PresignRequest(Aws::Http::HttpRequest &request, const char *region, long long expirationInSeconds=0) const override
bool SignRequest(Aws::Http::HttpRequest &request, bool signBody) const override
const char * GetName() const override
Aws::String GetRegion() const
void UpdateUserAgentWithCredentialFeatures(Aws::Http::HttpRequest &request, const Aws::Auth::CredentialsResolutionContext &context) const
bool ShouldSignHeader(const Aws::String &header) const
bool PresignRequest(Aws::Http::HttpRequest &request, const char *region, const char *serviceName, long long expirationInSeconds=0) const override
bool SignRequest(Aws::Http::HttpRequest &request, const char *region, const char *serviceName, bool signBody) const override
bool SignRequest(Aws::Http::HttpRequest &request, const char *region, bool signBody) const override
bool SignRequest(Aws::Http::HttpRequest &request) const override
virtual Aws::Auth::AWSCredentials GetCredentials(const std::shared_ptr< Aws::Http::ServiceSpecificParameters > &serviceSpecificParameters) const
Aws::String GetServiceName() const
bool PresignRequest(Aws::Http::HttpRequest &request, long long expirationInSeconds=0) const override
bool PresignRequest(Aws::Http::HttpRequest &request, const Aws::Auth::AWSCredentials &creds, const char *region, const char *serviceName, long long expirationInSeconds=0) const
virtual bool ServiceRequireUnsignedPayload(const Aws::String &serviceName) const
AWS_CORE_API const char SIGV4_SIGNER[]
Definition AWSClient.h:57
AWS_CORE_API const char ASYMMETRIC_SIGV4_SIGNER[]
std::basic_string< char, std::char_traits< char >, Aws::Allocator< char > > String
Definition AWSString.h:97
std::set< T, std::less< T >, Aws::Allocator< T > > Set
Definition AWSSet.h:18