Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
AES.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
7
8#include "AES.h"
9
10using std::byte;
11
12using namespace Stroika::Foundation;
14using namespace Stroika::Foundation::Cryptography;
15using namespace Stroika::Foundation::Cryptography::Providers;
16using namespace Stroika::Foundation::Cryptography::Encoding;
17using namespace Stroika::Foundation::Cryptography::Encoding::Algorithm;
18#if qStroika_HasComponent_OpenSSL
19using namespace Stroika::Foundation::Cryptography::Providers::OpenSSL;
20#endif
21using namespace Stroika::Foundation::Streams;
22
23using Memory::BLOB;
24
25#if qStroika_HasComponent_OpenSSL
26namespace {
27 OpenSSLCryptoParams cvt_ (const OpenSSL::DerivedKey& key, AESOptions options)
28 {
29 switch (options) {
30 case AESOptions::e128_CBC:
31 return OpenSSLCryptoParams{CipherAlgorithms::kAES_128_CBC, key};
32 case AESOptions::e128_ECB:
33 return OpenSSLCryptoParams{CipherAlgorithms::kAES_128_ECB, key};
34 case AESOptions::e128_OFB:
35 return OpenSSLCryptoParams{CipherAlgorithms::kAES_128_OFB, key};
36 case AESOptions::e128_CFB1:
37 return OpenSSLCryptoParams{CipherAlgorithms::kAES_128_CFB1, key};
38 case AESOptions::e128_CFB8:
39 return OpenSSLCryptoParams{CipherAlgorithms::kAES_128_CFB8, key};
40 case AESOptions::e128_CFB128:
41 return OpenSSLCryptoParams{CipherAlgorithms::kAES_128_CFB128, key};
42 case AESOptions::e192_CBC:
43 return OpenSSLCryptoParams{CipherAlgorithms::kAES_192_CBC, key};
44 case AESOptions::e192_ECB:
45 return OpenSSLCryptoParams{CipherAlgorithms::kAES_192_ECB, key};
46 case AESOptions::e192_OFB:
47 return OpenSSLCryptoParams{CipherAlgorithms::kAES_192_OFB, key};
48 case AESOptions::e192_CFB1:
49 return OpenSSLCryptoParams{CipherAlgorithms::kAES_192_CFB1, key};
50 case AESOptions::e192_CFB8:
51 return OpenSSLCryptoParams{CipherAlgorithms::kAES_192_CFB8, key};
52 case AESOptions::e192_CFB128:
53 return OpenSSLCryptoParams{CipherAlgorithms::kAES_192_CFB128, key};
54 case AESOptions::e256_CBC:
55 return OpenSSLCryptoParams{CipherAlgorithms::kAES_256_CBC, key};
56 case AESOptions::e256_ECB:
57 return OpenSSLCryptoParams{CipherAlgorithms::kAES_256_ECB, key};
58 case AESOptions::e256_OFB:
59 return OpenSSLCryptoParams{CipherAlgorithms::kAES_256_OFB, key};
60 case AESOptions::e256_CFB1:
61 return OpenSSLCryptoParams{CipherAlgorithms::kAES_256_CFB1, key};
62 case AESOptions::e256_CFB8:
63 return OpenSSLCryptoParams{CipherAlgorithms::kAES_256_CFB8, key};
64 case AESOptions::e256_CFB128:
65 return OpenSSLCryptoParams{CipherAlgorithms::kAES_256_CFB128, key};
66 default:
68 return OpenSSLCryptoParams{CipherAlgorithms::kAES_256_CFB128, key};
69 }
70 }
71}
72#endif
73
74#if qStroika_HasComponent_OpenSSL
75/*
76 ********************************************************************************
77 ***************************** Algorithm::DecodeAES *****************************
78 ********************************************************************************
79 */
80Streams::InputStream::Ptr<byte> Algorithm::DecodeAES (const OpenSSL::DerivedKey& key, const InputStream::Ptr<byte>& in, AESOptions options)
81{
82 return OpenSSLInputStream::New (cvt_ (key, options), Direction::eDecrypt, in);
83}
84Memory::BLOB Algorithm::DecodeAES (const OpenSSL::DerivedKey& key, const Memory::BLOB& in, AESOptions options)
85{
86 return DecodeAES (key, in.As<Streams::InputStream::Ptr<byte>> (), options).ReadAll ();
87}
88#endif
89
90#if qStroika_HasComponent_OpenSSL
91/*
92 ********************************************************************************
93 ****************************** Algorithm::EncodeAES ****************************
94 ********************************************************************************
95 */
96Streams::InputStream::Ptr<byte> Algorithm::EncodeAES (const OpenSSL::DerivedKey& key, const InputStream::Ptr<byte>& in, AESOptions options)
97{
98 return OpenSSLInputStream::New (cvt_ (key, options), Direction::eEncrypt, in);
99}
100Memory::BLOB Algorithm::EncodeAES (const OpenSSL::DerivedKey& key, const Memory::BLOB& in, AESOptions options)
101{
102 return EncodeAES (key, in.As<InputStream::Ptr<byte>> (), options).ReadAll ();
103}
104#endif
105
106#if qStroika_HasComponent_OpenSSL
107/*
108 ********************************************************************************
109 **************************** Algorithm::AESEncoder *****************************
110 ********************************************************************************
111 */
112OutputStream::Ptr<byte> Algorithm::AESDecoder (const OpenSSL::DerivedKey& key, const OutputStream::Ptr<byte>& out, AESOptions options)
113{
114 return OpenSSLOutputStream::New (cvt_ (key, options), Direction::eDecrypt, out);
115}
116#endif
117
118#if qStroika_HasComponent_OpenSSL
119/*
120 ********************************************************************************
121 ****************************** Algorithm::AESEncoder ***************************
122 ********************************************************************************
123 */
124OutputStream::Ptr<byte> Algorithm::AESEncoder (const OpenSSL::DerivedKey& key, const OutputStream::Ptr<byte>& out, AESOptions options)
125{
126 return OpenSSLOutputStream::New (cvt_ (key, options), Direction::eEncrypt, out);
127}
128#endif
#define RequireNotReached()
Definition Assertions.h:385
InputStream<>::Ptr is Smart pointer (with abstract Rep) class defining the interface to reading from ...
OutputStream<>::Ptr is Smart pointer to a stream-based sink of data.