2#include <openssl/evp.h>
3#include <openssl/aes.h>
4#include <openssl/ssl.h>
13 ctx = EVP_CIPHER_CTX_new();
14 EVP_CIPHER_CTX_init(ctx);
20 EVP_CIPHER_CTX_cleanup(ctx);
21 EVP_CIPHER_CTX_free(ctx);
24bool EvpAES::ecb_encrypt(
const QByteArray &in, QByteArray &out,
25 const QByteArray &key,
bool enc)
28 Q_ASSERT(key.size() == KEY_SIZE_16B
29 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
32 const EVP_CIPHER * cipher =
nullptr;
33 if (key.size() == KEY_SIZE_16B)
35 cipher = EVP_aes_128_ecb();
37 else if (key.size() == KEY_SIZE_24B)
39 cipher = EVP_aes_192_ecb();
43 cipher = EVP_aes_256_ecb();
47 return encrypt(in, out, key, QByteArray(), cipher, enc);
50bool EvpAES::cbc_encrypt(
const QByteArray &in, QByteArray &out,
51 const QByteArray &key,
const QByteArray &ivec,
bool enc)
54 Q_ASSERT(key.size() == KEY_SIZE_16B
55 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
56 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
59 const EVP_CIPHER * cipher =
nullptr;
60 if (key.size() == KEY_SIZE_16B)
62 cipher = EVP_aes_128_cbc();
64 else if (key.size() == KEY_SIZE_24B)
66 cipher = EVP_aes_192_cbc();
70 cipher = EVP_aes_256_cbc();
74 return encrypt(in, out, key, ivec, cipher, enc);
77bool EvpAES::cfb1_encrypt(
const QByteArray &in, QByteArray &out,
78 const QByteArray &key,
const QByteArray &ivec,
bool enc)
81 Q_ASSERT(key.size() == KEY_SIZE_16B
82 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
83 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
86 const EVP_CIPHER * cipher =
nullptr;
87 if (key.size() == KEY_SIZE_16B)
89 cipher = EVP_aes_128_cfb1();
91 else if (key.size() == KEY_SIZE_24B)
93 cipher = EVP_aes_192_cfb1();
97 cipher = EVP_aes_256_cfb1();
101 return encrypt(in, out, key, ivec, cipher, enc);
104bool EvpAES::cfb8_encrypt(
const QByteArray &in, QByteArray &out,
105 const QByteArray &key,
const QByteArray &ivec,
bool enc)
108 Q_ASSERT(key.size() == KEY_SIZE_16B
109 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
110 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
113 const EVP_CIPHER * cipher =
nullptr;
114 if (key.size() == KEY_SIZE_16B)
116 cipher = EVP_aes_128_cfb8();
118 else if (key.size() == KEY_SIZE_24B)
120 cipher = EVP_aes_192_cfb8();
124 cipher = EVP_aes_256_cfb8();
128 return encrypt(in, out, key, ivec, cipher, enc);
131bool EvpAES::cfb128_encrypt(
const QByteArray &in, QByteArray &out,
132 const QByteArray &key,
const QByteArray &ivec,
bool enc)
135 Q_ASSERT(key.size() == KEY_SIZE_16B
136 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
137 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
140 const EVP_CIPHER * cipher =
nullptr;
141 if (key.size() == KEY_SIZE_16B)
143 cipher = EVP_aes_128_cfb128();
145 else if (key.size() == KEY_SIZE_24B)
147 cipher = EVP_aes_192_cfb128();
151 cipher = EVP_aes_256_cfb128();
155 return encrypt(in, out, key, ivec, cipher, enc);
158bool EvpAES::ofb128_encrypt(
const QByteArray &in, QByteArray &out,
159 const QByteArray &key,
const QByteArray &ivec,
bool enc)
162 Q_ASSERT(key.size() == KEY_SIZE_16B
163 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
164 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
167 const EVP_CIPHER * cipher =
nullptr;
168 if (key.size() == KEY_SIZE_16B)
170 cipher = EVP_aes_128_ofb();
172 else if (key.size() == KEY_SIZE_24B)
174 cipher = EVP_aes_192_ofb();
178 cipher = EVP_aes_256_ofb();
182 return encrypt(in, out, key, ivec, cipher, enc);
185bool EvpAES::ctr_encrypt(
const QByteArray &in, QByteArray &out,
186 const QByteArray &key,
const QByteArray &ivec,
bool enc)
189 Q_ASSERT(key.size() == KEY_SIZE_16B
190 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
191 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
194 const EVP_CIPHER * cipher =
nullptr;
195 if (key.size() == KEY_SIZE_16B)
197 cipher = EVP_aes_128_ctr();
199 else if (key.size() == KEY_SIZE_24B)
201 cipher = EVP_aes_192_ctr();
205 cipher = EVP_aes_256_ctr();
209 return encrypt(in, out, key, ivec, cipher, enc);
212bool EvpAES::gcm_encrypt(
const QByteArray &in, QByteArray &out,
213 const QByteArray &key,
const QByteArray &ivec,
bool enc)
216 Q_ASSERT(key.size() == KEY_SIZE_16B
217 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
218 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
221 const EVP_CIPHER * cipher =
nullptr;
222 if (key.size() == KEY_SIZE_16B)
224 cipher = EVP_aes_128_gcm();
226 else if (key.size() == KEY_SIZE_24B)
228 cipher = EVP_aes_192_gcm();
232 cipher = EVP_aes_256_gcm();
236 return encrypt(in, out, key, ivec, cipher, enc);
239bool EvpAES::xts_encrypt(
const QByteArray &in, QByteArray &out,
240 const QByteArray &key,
const QByteArray &ivec,
bool enc)
243 Q_ASSERT(key.size() == KEY_SIZE_16B || key.size() == KEY_SIZE_32B);
244 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
247 const EVP_CIPHER * cipher =
nullptr;
248 if (key.size() == KEY_SIZE_16B)
250 cipher = EVP_aes_128_xts();
254 cipher = EVP_aes_256_xts();
258 return encrypt(in, out, key, ivec, cipher, enc);
261bool EvpAES::ocb_encrypt(
const QByteArray &in, QByteArray &out,
262 const QByteArray &key,
const QByteArray &ivec,
bool enc)
264#if OPENSSL_VERSION_NUMBER >= 0x3000000fL
265 #ifndef OPENSSL_NO_OCB
268 Q_ASSERT(key.size() == KEY_SIZE_16B
269 || key.size() == KEY_SIZE_24B || key.size() == KEY_SIZE_32B);
270 Q_ASSERT(ivec.size() == KEY_SIZE_16B);
273 const EVP_CIPHER * cipher =
nullptr;
274 if (key.size() == KEY_SIZE_16B)
276 cipher = EVP_aes_128_ocb();
278 else if (key.size() == KEY_SIZE_24B)
280 cipher = EVP_aes_192_ocb();
284 cipher = EVP_aes_256_ocb();
288 return encrypt(in, out, key, ivec, cipher, enc);
295bool EvpAES::encrypt(
const QByteArray &in, QByteArray &out,
296 const QByteArray &key,
const QByteArray &ivec,
297 const EVP_CIPHER *cipher,
bool enc)
302 int ret = EVP_EncryptInit_ex(ctx, cipher, NULL,
303 (
const unsigned char*)key.data(),
304 (
const unsigned char*)ivec.data());
312 out.resize(in.size() + AES_BLOCK_SIZE);
313 ret = EVP_EncryptUpdate(ctx, (
unsigned char*)out.data(), &mlen,
314 (
const unsigned char*)in.data(),
323 ret = EVP_EncryptFinal_ex(ctx, (
unsigned char *)out.data() + mlen, &flen);
328 out.resize(mlen + flen);
334 int ret = EVP_DecryptInit_ex(ctx, cipher, NULL,
335 (
const unsigned char*)key.data(),
336 (
const unsigned char*)ivec.data());
344 out.resize(in.size());
345 ret = EVP_DecryptUpdate(ctx, (
unsigned char*)out.data(), &mlen,
346 (
const unsigned char*)in.data(), in.size());
354 ret = EVP_DecryptFinal_ex(ctx, (
unsigned char *)out.data() + mlen, &flen);
359 out.resize(mlen + flen);
367#if OPENSSL_VERSION_NUMBER >= 0x3000000fL
368 SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_client_method());
370 SSL_CTX_free(ssl_ctx);