15 #include <glog/logging.h> 16 #include <openssl/conf.h> 17 #include <openssl/err.h> 18 #include <openssl/evp.h> 25 struct Decryptor::Impl {
26 std::unique_ptr<EVP_CIPHER_CTX, void (*)(EVP_CIPHER_CTX*)>
ctx{
27 nullptr, &EVP_CIPHER_CTX_free};
31 const std::vector<uint8_t>& key,
32 const std::vector<uint8_t>& iv)
33 : scheme_(scheme), key_(key), iv_(iv), extra_(
new Impl) {
41 uint32_t block_offset, uint8_t*
dest) {
48 LOG(ERROR) <<
"Cannot have block offset when using CBC";
54 const size_t partial_size =
56 memcpy(temp_source + block_offset, data, partial_size);
59 if (!EVP_DecryptUpdate(extra_->ctx.get(), temp_dest, &num_bytes_read,
62 LOG(ERROR) <<
"Error decrypting data: " 63 << ERR_error_string(ERR_get_error(),
nullptr);
66 memcpy(dest, temp_dest + block_offset, partial_size);
75 if (!EVP_DecryptUpdate(extra_->ctx.get(),
dest, &num_bytes_read, data,
77 static_cast<size_t>(num_bytes_read) != data_size) {
78 LOG(ERROR) <<
"Error decrypting data: " 79 << ERR_error_string(ERR_get_error(),
nullptr);
86 bool Decryptor::InitIfNeeded() {
88 extra_->ctx.reset(EVP_CIPHER_CTX_new());
90 LOG(ERROR) <<
"Error allocating OpenSSL context: " 91 << ERR_error_string(ERR_get_error(),
nullptr);
96 if (!EVP_DecryptInit_ex(extra_->ctx.get(),
97 is_ctr ? EVP_aes_128_ctr() : EVP_aes_128_cbc(),
98 nullptr, key_.data(), iv_.data()) ||
99 !EVP_CIPHER_CTX_set_padding(extra_->ctx.get(), 0)) {
100 LOG(ERROR) <<
"Error setting up OpenSSL context: " 101 << ERR_error_string(ERR_get_error(),
nullptr);
bool DecryptPartialBlock(const uint8_t *data, size_t data_size, uint32_t block_offset, uint8_t *dest)
std::unique_ptr< EVP_CIPHER_CTX, void(*)(EVP_CIPHER_CTX *)> ctx
Decryptor(eme::EncryptionScheme scheme, const std::vector< uint8_t > &key, const std::vector< uint8_t > &iv)
bool Decrypt(const uint8_t *data, size_t data_size, uint8_t *dest)