Branch data Line data Source code
1 : : // Copyright (c) 2022-present The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #include <test/fuzz/FuzzedDataProvider.h>
6 : : #include <test/fuzz/fuzz.h>
7 : : #include <test/fuzz/util.h>
8 : : #include <test/util/setup_common.h>
9 : : #include <wallet/crypter.h>
10 : :
11 : : namespace wallet {
12 : : namespace {
13 : :
14 : 1 : void initialize_crypter()
15 : : {
16 [ + - + - : 1 : static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
+ - ]
17 : 1 : }
18 : :
19 [ + - ]: 1456 : FUZZ_TARGET(crypter, .init = initialize_crypter)
20 : : {
21 : 998 : SeedRandomStateForTest(SeedRand::ZEROS);
22 : 998 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
23 : 998 : bool good_data{true};
24 : :
25 : 998 : CCrypter crypt;
26 : : // These values are regularly updated within `CallOneOf`
27 : 998 : std::vector<unsigned char> cipher_text_ed;
28 : 998 : CKeyingMaterial plain_text_ed;
29 : 998 : const std::vector<unsigned char> random_key = ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_KEY_SIZE);
30 : :
31 [ + + ]: 998 : if (fuzzed_data_provider.ConsumeBool()) {
32 [ + - ]: 722 : const std::string random_string = fuzzed_data_provider.ConsumeRandomLengthString(100);
33 [ - + + - ]: 722 : SecureString secure_string(random_string.begin(), random_string.end());
34 : :
35 [ + + ]: 722 : const unsigned int derivation_method = fuzzed_data_provider.ConsumeBool() ? 0 : fuzzed_data_provider.ConsumeIntegral<unsigned int>();
36 : :
37 : : // Limiting the value of rounds since it is otherwise uselessly expensive and causes a timeout when fuzzing.
38 : 722 : crypt.SetKeyFromPassphrase(/*key_data=*/secure_string,
39 [ - + + - ]: 1444 : /*salt=*/ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_SALT_SIZE),
40 : : /*rounds=*/fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, CMasterKey::DEFAULT_DERIVE_ITERATIONS),
41 : : /*derivation_method=*/derivation_method);
42 : 722 : }
43 : :
44 : 998 : CKey random_ckey;
45 [ + - ]: 998 : random_ckey.Set(random_key.begin(), random_key.end(), /*fCompressedIn=*/fuzzed_data_provider.ConsumeBool());
46 [ + + ]: 998 : if (!random_ckey.IsValid()) return;
47 [ + - ]: 994 : CPubKey pubkey{random_ckey.GetPubKey()};
48 : :
49 [ + + + + : 92759 : LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 100)
+ + ]
50 : : {
51 [ + - ]: 45426 : CallOneOf(
52 : : fuzzed_data_provider,
53 : 1698 : [&] {
54 : 1698 : const std::vector<unsigned char> random_vector = ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_KEY_SIZE);
55 [ + - ]: 1698 : plain_text_ed = CKeyingMaterial(random_vector.begin(), random_vector.end());
56 : 1698 : },
57 : 2453 : [&] {
58 : 2453 : cipher_text_ed = ConsumeRandomLengthByteVector(fuzzed_data_provider, 64);
59 : 2453 : },
60 : 2031 : [&] {
61 : 2031 : (void)crypt.Encrypt(plain_text_ed, cipher_text_ed);
62 : 2031 : },
63 : 5749 : [&] {
64 [ - + ]: 5749 : (void)crypt.Decrypt(cipher_text_ed, plain_text_ed);
65 : 5749 : },
66 : 5573 : [&] {
67 : 5573 : const CKeyingMaterial master_key(random_key.begin(), random_key.end());;
68 [ + - + - ]: 5573 : (void)EncryptSecret(master_key, plain_text_ed, pubkey.GetHash(), cipher_text_ed);
69 : 5573 : },
70 : 2006 : [&] {
71 : 2006 : std::optional<CPubKey> random_pub_key{ConsumeDeserializable<CPubKey>(fuzzed_data_provider)};
72 [ + + ]: 2006 : if (!random_pub_key) {
73 : 81 : good_data = false;
74 : 81 : return;
75 : : }
76 : 1925 : pubkey = *random_pub_key;
77 : : },
78 : 25916 : [&] {
79 : 25916 : const CKeyingMaterial master_key(random_key.begin(), random_key.end());
80 : 25916 : CKey key;
81 [ - + + - ]: 25916 : (void)DecryptKey(master_key, cipher_text_ed, pubkey, key);
82 : 25916 : });
83 : : }
84 : 998 : }
85 : : } // namespace
86 : : } // namespace wallet
|