diff options
author | practicalswift <practicalswift@users.noreply.github.com> | 2020-06-16 13:57:40 +0000 |
---|---|---|
committer | practicalswift <practicalswift@users.noreply.github.com> | 2020-06-25 15:06:13 +0000 |
commit | 4cee53bba722a480ccd6472d2ffe9b0001394dd9 (patch) | |
tree | 7b19facbb88f7045b7b73daf2926edfc26885d03 /src/test/fuzz/crypto_aes256cbc.cpp | |
parent | 9352c3232594f953d2db11c1e140be3f7f9fbae4 (diff) | |
download | bitcoin-4cee53bba722a480ccd6472d2ffe9b0001394dd9.tar.xz |
tests: Add fuzzing harness for AES256CBCEncrypt/AES256CBCDecrypt
Diffstat (limited to 'src/test/fuzz/crypto_aes256cbc.cpp')
-rw-r--r-- | src/test/fuzz/crypto_aes256cbc.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/test/fuzz/crypto_aes256cbc.cpp b/src/test/fuzz/crypto_aes256cbc.cpp new file mode 100644 index 0000000000..52983c7e79 --- /dev/null +++ b/src/test/fuzz/crypto_aes256cbc.cpp @@ -0,0 +1,34 @@ +// Copyright (c) 2020 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include <crypto/aes.h> +#include <test/fuzz/FuzzedDataProvider.h> +#include <test/fuzz/fuzz.h> +#include <test/fuzz/util.h> + +#include <cassert> +#include <cstdint> +#include <vector> + +void test_one_input(const std::vector<uint8_t>& buffer) +{ + FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; + const std::vector<uint8_t> key = ConsumeFixedLengthByteVector(fuzzed_data_provider, AES256_KEYSIZE); + const std::vector<uint8_t> iv = ConsumeFixedLengthByteVector(fuzzed_data_provider, AES_BLOCKSIZE); + const bool pad = fuzzed_data_provider.ConsumeBool(); + + AES256CBCEncrypt encrypt{key.data(), iv.data(), pad}; + AES256CBCDecrypt decrypt{key.data(), iv.data(), pad}; + + while (fuzzed_data_provider.ConsumeBool()) { + const std::vector<uint8_t> plaintext = ConsumeRandomLengthByteVector(fuzzed_data_provider); + std::vector<uint8_t> ciphertext(plaintext.size() + AES_BLOCKSIZE); + const int encrypt_ret = encrypt.Encrypt(plaintext.data(), plaintext.size(), ciphertext.data()); + ciphertext.resize(encrypt_ret); + std::vector<uint8_t> decrypted_plaintext(ciphertext.size()); + const int decrypt_ret = decrypt.Decrypt(ciphertext.data(), ciphertext.size(), decrypted_plaintext.data()); + decrypted_plaintext.resize(decrypt_ret); + assert(decrypted_plaintext == plaintext || (!pad && plaintext.size() % AES_BLOCKSIZE != 0 && encrypt_ret == 0 && decrypt_ret == 0)); + } +} |