AWS SDK for C++
AWS SDK for C++
Loading...
Searching...
No Matches
CryptoImpl.h
Go to the documentation of this file.
1
5#pragma once
6
12#include <openssl/ossl_typ.h>
13#include <openssl/evp.h>
14#include <openssl/hmac.h>
15#include <openssl/rand.h>
16#include <atomic>
17#include <mutex>
18
19namespace Aws
20{
21 namespace Utils
22 {
23 namespace Crypto
24 {
25 namespace OpenSSL
26 {
28
30
32
33 void locking_fn(int mode, int n, const char* file, int line);
34
35 unsigned long id_fn();
36 }
37
45 {
46 public:
48 { }
49
51
55 void GetBytes(unsigned char* buffer, size_t bufferSize) override;
56 };
57
58 class MD5OpenSSLImpl : public Hash
59 {
60 public:
61
63
64 virtual ~MD5OpenSSLImpl();
65
66 virtual HashResult Calculate(const Aws::String& str) override;
67
68 virtual HashResult Calculate(Aws::IStream& stream) override;
69
70 virtual void Update(unsigned char* buffer, size_t bufferSize) override;
71
72 virtual HashResult GetHash() override;
73
74 private:
75 EVP_MD_CTX *m_ctx;
76 };
77
78 class Sha1OpenSSLImpl : public Hash
79 {
80 public:
81
83
85
86 virtual HashResult Calculate(const Aws::String& str) override;
87
88 virtual HashResult Calculate(Aws::IStream& stream) override;
89
90 virtual void Update(unsigned char* buffer, size_t bufferSize) override;
91
92 virtual HashResult GetHash() override;
93
94 private:
95 EVP_MD_CTX *m_ctx;
96 };
97
98 class Sha256OpenSSLImpl : public Hash
99 {
100 public:
102
104
105 virtual HashResult Calculate(const Aws::String& str) override;
106
107 virtual HashResult Calculate(Aws::IStream& stream) override;
108
109 virtual void Update(unsigned char* buffer, size_t bufferSize) override;
110
111 virtual HashResult GetHash() override;
112
113 private:
114 EVP_MD_CTX *m_ctx;
115 };
116
118 {
119 public:
120 virtual ~Sha256HMACOpenSSLImpl() = default;
121
122 virtual HashResult Calculate(const ByteBuffer& toSign, const ByteBuffer& secret) override;
123 };
124
129 {
130 public:
134 OpenSSLCipher(const CryptoBuffer& key, size_t ivSize, bool ctrMode = false);
135
140 OpenSSLCipher(CryptoBuffer&& key, CryptoBuffer&& initializationVector,
141 CryptoBuffer&& tag = CryptoBuffer(0));
142
147 OpenSSLCipher(const CryptoBuffer& key, const CryptoBuffer& initializationVector,
148 const CryptoBuffer& tag = CryptoBuffer(0));
149
150 OpenSSLCipher(const OpenSSLCipher& other) = delete;
151
152 OpenSSLCipher& operator=(const OpenSSLCipher& other) = delete;
153
160
167
168
169 virtual ~OpenSSLCipher();
170
176 CryptoBuffer EncryptBuffer(const CryptoBuffer& unEncryptedData) override;
177
182
188 CryptoBuffer DecryptBuffer(const CryptoBuffer& encryptedData) override;
189
194
195 void Reset() override;
196
197 protected:
198 virtual size_t GetBlockSizeBytes() const = 0;
199 virtual size_t GetKeyLengthBits() const = 0;
200 bool CheckKeyAndIVLength(size_t expectedKeyLength, size_t expectedIVLength);
201
202 EVP_CIPHER_CTX* m_encryptor_ctx;
203 EVP_CIPHER_CTX* m_decryptor_ctx;
204 private:
205 void Init();
206 void Cleanup();
207
208 /* openssl has bug finalize decryption of an empty string */
209 bool m_emptyPlaintext = false;
210 };
211
216 {
217 public:
222
226 AES_CBC_Cipher_OpenSSL(CryptoBuffer&& key, CryptoBuffer&& initializationVector);
227
231 AES_CBC_Cipher_OpenSSL(const CryptoBuffer& key, const CryptoBuffer& initializationVector);
232
234
236
238
239 void Reset() override;
240
241 protected:
242 size_t GetBlockSizeBytes() const override;
243
244 size_t GetKeyLengthBits() const override;
245
246 private:
247 void InitCipher();
248
249 static size_t BlockSizeBytes;
250 static size_t KeyLengthBits;
251 };
252
257 {
258 public:
264
268 AES_CTR_Cipher_OpenSSL(CryptoBuffer&& key, CryptoBuffer&& initializationVector);
269
273 AES_CTR_Cipher_OpenSSL(const CryptoBuffer& key, const CryptoBuffer& initializationVector);
274
276
278
280
281 void Reset() override;
282
283 protected:
284 size_t GetBlockSizeBytes() const override;
285
286 size_t GetKeyLengthBits() const override;
287
288 private:
289 void InitCipher();
290
291 static size_t BlockSizeBytes;
292 static size_t KeyLengthBits;
293 };
294
299 {
300 public:
305
310
316 AES_GCM_Cipher_OpenSSL(CryptoBuffer&& key, CryptoBuffer&& initializationVector,
317 CryptoBuffer&& tag = CryptoBuffer(0), CryptoBuffer&& aad = CryptoBuffer(0));
318
324 AES_GCM_Cipher_OpenSSL(const CryptoBuffer& key, const CryptoBuffer& initializationVector,
325 const CryptoBuffer& tag = CryptoBuffer(0), const CryptoBuffer& aad = CryptoBuffer(0));
326
328
330
332
339
340 void Reset() override;
341
342 protected:
343 size_t GetBlockSizeBytes() const override;
344
345 size_t GetKeyLengthBits() const override;
346
347 size_t GetTagLengthBytes() const;
348
349 private:
350 void InitCipher();
351
352 CryptoBuffer m_aad;
353 static size_t BlockSizeBytes;
354 static size_t IVLengthBytes;
355 static size_t KeyLengthBits;
356 static size_t TagLengthBytes;
357 };
358
364 {
365 public:
366
371
373
375
377
380
383
384 void Reset() override;
385
386 protected:
387 inline size_t GetBlockSizeBytes() const override { return BlockSizeBytes; }
388
389 inline size_t GetKeyLengthBits() const override { return KeyLengthBits; }
390
391 private:
392 void InitCipher();
393
394 static size_t BlockSizeBytes;
395 static size_t KeyLengthBits;
396
397 CryptoBuffer m_workingKeyBuffer;
398 };
399
400 } // namespace Crypto
401 } // namespace Utils
402} // namespace Aws
char * buffer
Definition: cJSON.h:174
AES_CBC_Cipher_OpenSSL(const CryptoBuffer &key, const CryptoBuffer &initializationVector)
AES_CBC_Cipher_OpenSSL(const CryptoBuffer &key)
AES_CBC_Cipher_OpenSSL(CryptoBuffer &&key, CryptoBuffer &&initializationVector)
size_t GetKeyLengthBits() const override
AES_CBC_Cipher_OpenSSL & operator=(const AES_CBC_Cipher_OpenSSL &other)=delete
size_t GetBlockSizeBytes() const override
AES_CBC_Cipher_OpenSSL(const AES_CBC_Cipher_OpenSSL &other)=delete
AES_CBC_Cipher_OpenSSL(AES_CBC_Cipher_OpenSSL &&toMove)=default
AES_CTR_Cipher_OpenSSL(const CryptoBuffer &key)
size_t GetBlockSizeBytes() const override
AES_CTR_Cipher_OpenSSL(const AES_CTR_Cipher_OpenSSL &other)=delete
AES_CTR_Cipher_OpenSSL(CryptoBuffer &&key, CryptoBuffer &&initializationVector)
size_t GetKeyLengthBits() const override
AES_CTR_Cipher_OpenSSL(AES_CTR_Cipher_OpenSSL &&toMove)=default
AES_CTR_Cipher_OpenSSL & operator=(const AES_CTR_Cipher_OpenSSL &other)=delete
AES_CTR_Cipher_OpenSSL(const CryptoBuffer &key, const CryptoBuffer &initializationVector)
AES_GCM_Cipher_OpenSSL(const CryptoBuffer &key)
size_t GetBlockSizeBytes() const override
AES_GCM_Cipher_OpenSSL(CryptoBuffer &&key, CryptoBuffer &&initializationVector, CryptoBuffer &&tag=CryptoBuffer(0), CryptoBuffer &&aad=CryptoBuffer(0))
AES_GCM_Cipher_OpenSSL(AES_GCM_Cipher_OpenSSL &&toMove)=default
AES_GCM_Cipher_OpenSSL & operator=(const AES_GCM_Cipher_OpenSSL &other)=delete
AES_GCM_Cipher_OpenSSL(const AES_GCM_Cipher_OpenSSL &other)=delete
size_t GetKeyLengthBits() const override
CryptoBuffer FinalizeEncryption() override
AES_GCM_Cipher_OpenSSL(const CryptoBuffer &key, const CryptoBuffer &initializationVector, const CryptoBuffer &tag=CryptoBuffer(0), const CryptoBuffer &aad=CryptoBuffer(0))
AES_GCM_Cipher_OpenSSL(const CryptoBuffer &key, const CryptoBuffer *aad)
AES_KeyWrap_Cipher_OpenSSL & operator=(const AES_KeyWrap_Cipher_OpenSSL &)=delete
CryptoBuffer DecryptBuffer(const CryptoBuffer &) override
AES_KeyWrap_Cipher_OpenSSL(const AES_KeyWrap_Cipher_OpenSSL &)=delete
AES_KeyWrap_Cipher_OpenSSL(const CryptoBuffer &key)
AES_KeyWrap_Cipher_OpenSSL(AES_KeyWrap_Cipher_OpenSSL &&)=default
CryptoBuffer EncryptBuffer(const CryptoBuffer &) override
virtual HashResult Calculate(const Aws::String &str) override
virtual void Update(unsigned char *buffer, size_t bufferSize) override
virtual HashResult Calculate(Aws::IStream &stream) override
virtual HashResult GetHash() override
OpenSSLCipher(CryptoBuffer &&key, CryptoBuffer &&initializationVector, CryptoBuffer &&tag=CryptoBuffer(0))
CryptoBuffer FinalizeDecryption() override
virtual size_t GetBlockSizeBytes() const =0
OpenSSLCipher(const CryptoBuffer &key, const CryptoBuffer &initializationVector, const CryptoBuffer &tag=CryptoBuffer(0))
CryptoBuffer DecryptBuffer(const CryptoBuffer &encryptedData) override
virtual size_t GetKeyLengthBits() const =0
OpenSSLCipher & operator=(const OpenSSLCipher &other)=delete
CryptoBuffer FinalizeEncryption() override
OpenSSLCipher(const OpenSSLCipher &other)=delete
OpenSSLCipher & operator=(OpenSSLCipher &&toMove)=default
OpenSSLCipher(const CryptoBuffer &key, size_t ivSize, bool ctrMode=false)
CryptoBuffer EncryptBuffer(const CryptoBuffer &unEncryptedData) override
OpenSSLCipher(OpenSSLCipher &&toMove)
EVP_CIPHER_CTX * m_decryptor_ctx
Definition: CryptoImpl.h:203
EVP_CIPHER_CTX * m_encryptor_ctx
Definition: CryptoImpl.h:202
bool CheckKeyAndIVLength(size_t expectedKeyLength, size_t expectedIVLength)
void GetBytes(unsigned char *buffer, size_t bufferSize) override
virtual HashResult Calculate(Aws::IStream &stream) override
virtual void Update(unsigned char *buffer, size_t bufferSize) override
virtual HashResult GetHash() override
virtual HashResult Calculate(const Aws::String &str) override
virtual HashResult Calculate(const ByteBuffer &toSign, const ByteBuffer &secret) override
virtual HashResult GetHash() override
virtual HashResult Calculate(Aws::IStream &stream) override
virtual HashResult Calculate(const Aws::String &str) override
virtual void Update(unsigned char *buffer, size_t bufferSize) override
void locking_fn(int mode, int n, const char *file, int line)
std::basic_istream< char, std::char_traits< char > > IStream
Definition: AWSStreamFwd.h:20
std::basic_string< char, std::char_traits< char >, Aws::Allocator< char > > String
Definition: AWSString.h:97