void aesCfbDecrypt(uint8_t *key, int32_t keyLength, uint8_t* IV, uint8_t *data, int32_t dataLength) { AESencrypt *saAes = new AESencrypt(); if (keyLength == 16) saAes->key128(key); else if (keyLength == 32) saAes->key256(key); else return; // Note: maybe copy IV to an internal array if we encounter strange things. // the cfb encrypt modify the IV on return. Same for output data (inplace encryption) saAes->cfb_decrypt(data, data, dataLength, IV); delete saAes; }
int32_t zina::aesCbcEncrypt(const string& key, const string& IV, const string& plainText, string* cryptText) { LOGGER(DEBUGGING, __func__, " -->"); if (IV.size() != AES_BLOCK_SIZE) { LOGGER(ERROR, __func__, " <-- IV wrong block size."); return WRONG_BLK_SIZE; } size_t padlen = (AES_BLOCK_SIZE - plainText.size() % AES_BLOCK_SIZE); // data.append(padlen, padlen); uint8_t* outBuffer = new uint8_t[plainText.size() + padlen]; memcpy(outBuffer, plainText.data(), plainText.size()); memset(outBuffer + plainText.size(), static_cast<int>(padlen&0xff), padlen); // pad to full blocksize uint8_t ivTemp[AES_BLOCK_SIZE]; // copy IV, AES code modifies IV buffer memcpy(ivTemp, IV.data(), AES_BLOCK_SIZE); AESencrypt aes; if (key.size() == 16) aes.key128((const uint8_t*)key.data()); else if (key.size() == 32) aes.key256((const uint8_t*)key.data()); else { LOGGER(ERROR, __func__, " <-- Unsupported key size: ", key.size()); delete[] outBuffer; return UNSUPPORTED_KEY_SIZE; } // Encrypt in place aes.cbc_encrypt(outBuffer, outBuffer, static_cast<int>(plainText.size() + padlen), ivTemp); cryptText->assign((const char*)outBuffer, plainText.size() + padlen); delete[] outBuffer; LOGGER(DEBUGGING, __func__, " <--"); return SUCCESS; }