6 #include <openssl/evp.h>
7 #include <openssl/aes.h>
15 : key_(new unsigned char[32]), iv_(new unsigned char[16])
22 : key_(new unsigned char[32]), iv_(new unsigned char[16])
29 unsigned char* key,
int key_length)
30 : key_(new unsigned char[32]), iv_(new unsigned char[16])
32 memcpy(
key_.
get_ptr(), key, std::min(32, key_length));
40 int i, rounds = 10000;
43 int64_t salt = 0x70e4ed2d19a447ef;
45 i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha256(), (
unsigned char*)&salt,
46 (
unsigned char*)password.c_str(), (
int)password.length(), rounds,
47 (
unsigned char*)key_.get_ptr(), (
unsigned char*)iv_.get_ptr());
52 " Unable to initialize 256 bit AES. Only received %d bytes.\n", i);
61 char* source,
int size,
int max_size)
const
66 EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
69 int ciphertext_len = 0;
72 size = std::min(size, max_size);
76 EVP_CIPHER_CTX_init(ctx);
79 result = EVP_EncryptInit_ex(
80 ctx, EVP_aes_256_cbc(), NULL, key_.get_ptr(), iv_.get_ptr());
85 "AESBufferFilter::encode: Cannot init key/iv. Result=%d.\n", result);
91 result = EVP_EncryptUpdate(
92 ctx, (
unsigned char*)source, &len, (
unsigned char*)source, size);
97 "AESBufferFilter::encode: Cannot perform encrypt. Result=%d.\n",
103 ciphertext_len = len;
106 "AESBufferFilter::encode:EVP_EncryptUpdate:2: len=%d, "
107 "ciphertext_len=%d.\n",
108 len, ciphertext_len);
111 result = EVP_EncryptFinal_ex(ctx, (
unsigned char*)(source + len), &len);
116 "AESBufferFilter::encode: Cannot finalize encrypt. Result=%d.\n",
122 ciphertext_len += len;
125 "AESBufferFilter::encode:EVP_EncryptFinal_ex: "
126 "len=%d, ciphertext_len=%d.\n",
127 len, ciphertext_len);
129 EVP_CIPHER_CTX_free(ctx);
131 return ciphertext_len;
135 char* source,
int size,
int max_size)
const
140 EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
143 int plaintext_len(0);
146 size = std::min(size, max_size);
149 EVP_CIPHER_CTX_init(ctx);
151 result = EVP_DecryptInit_ex(
152 ctx, EVP_aes_256_cbc(), NULL, key_.get_ptr(), iv_.get_ptr());
157 "AESBufferFilter::decode: Cannot init key/iv. Result=%d.\n", result);
163 "AESBufferFilter::decode:EVP_DecryptUpdate:1: len=%d, size=%d.\n", len,
166 result = EVP_DecryptUpdate(
167 ctx, (
unsigned char*)source, &len, (
unsigned char*)source, size);
173 "AESBufferFilter::decode: Cannot perform decrypt. Result=%d.\n",
180 "AESBufferFilter::decode:EVP_DecryptUpdate:2: len=%d, "
181 "plaintext_len=%d.\n",
184 result = EVP_DecryptFinal_ex(ctx, (
unsigned char*)(source + len), &len);
189 "AESBufferFilter::decode: Cannot finalize decrypt. Result=%d.\n",
195 plaintext_len += len;
198 "AESBufferFilter::decode:EVP_DecryptFinal_ex: "
199 "len=%d, plaintext_len=%d.\n",
202 EVP_CIPHER_CTX_free(ctx);
204 return plaintext_len;
#define madara_logger_ptr_log(loggering, level,...)
Fast version of the madara::logger::log method for Logger pointers.
Encrypts a buffer with 256 bit AES via OpenSSL.
int generate_key(const std::string &password)
Generates a 256 bit key from a password.
utility::ScopedArray< unsigned char > iv_
initialization vector
virtual int encode(char *source, int size, int max_size) const
Encodes the buffer in place using AES encryption.
utility::ScopedArray< unsigned char > key_
the user's cypher key
virtual int decode(char *source, int size, int max_size) const
Decodes the buffer in place using AES encryption.
virtual ~AESBufferFilter()
Destructor.
AESBufferFilter()
Constructor.
virtual std::string get_id(void)
Gets the id of the filter.
virtual uint32_t get_version(void)
Gets the version of the filter.
T * get_ptr(void)
get the underlying pointer
MADARA_EXPORT utility::Refcounter< logger::Logger > global_logger
uint32_t get_uint_version(const std::string &str_version)
Converts a string version to a uint32.