15 #include <CommonCrypto/CommonCryptor.h> 16 #include <Security/Security.h> 17 #include <glog/logging.h> 26 void IncrementIv(std::vector<uint8_t>* iv) {
28 auto* iv_ptr =
reinterpret_cast<uint64_t*
>(iv->data() + 8);
31 *iv_ptr = htonll(ntohll(*iv_ptr) + 1);
39 const std::vector<uint8_t>& key,
40 const std::vector<uint8_t>& iv)
41 : scheme_(scheme), key_(key), iv_(iv) {
49 uint32_t block_offset, uint8_t*
dest) {
54 size_t data_offset = 0;
55 while (data_offset < data_size) {
58 CCCryptorStatus result = CCCrypt(
59 kCCEncrypt, kCCAlgorithmAES128, 0, key_.data(), key_.size(),
nullptr,
61 if (result != kCCSuccess) {
62 LOG(ERROR) <<
"Error decrypting data: " << result;
65 if (length != AES_BLOCK_SIZE) {
66 LOG(ERROR) <<
"Not all data decrypted";
70 const size_t to_decrypt = AES_BLOCK_SIZE - block_offset;
71 for (
size_t i = 0; i < to_decrypt && i + data_offset < data_size; i++) {
72 dest[data_offset + i] =
73 data[data_offset + i] ^ encrypted_iv[i + block_offset];
76 data_offset += to_decrypt;
81 if (block_offset != 0) {
82 LOG(ERROR) <<
"Cannot have block offset when using CBC";
86 LOG(ERROR) <<
"CBC requires protected ranges to be a multiple of the " 93 CCCryptorStatus result =
94 CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key_.data(), key_.size(),
95 iv_.data(), data, data_size,
dest, data_size, &length);
96 if (result != kCCSuccess) {
97 LOG(ERROR) <<
"Error decrypting data: " << result;
100 if (length != data_size) {
101 LOG(ERROR) <<
"Not all data decrypted";
117 bool Decryptor::InitIfNeeded() {
bool DecryptPartialBlock(const uint8_t *data, size_t data_size, uint32_t block_offset, uint8_t *dest)
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)