LCOV - code coverage report
Current view: top level - src/wallet/test/fuzz - crypter.cpp (source / functions) Coverage Total Hit
Test: fuzz_coverage.info Lines: 100.0 % 54 54
Test Date: 2025-05-10 04:08:03 Functions: 100.0 % 10 10
Branches: 65.9 % 44 29

             Branch data     Line data    Source code
       1                 :             : // Copyright (c) 2022 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                 :             : const TestingSetup* g_setup;
      15                 :           1 : void initialize_crypter()
      16                 :             : {
      17   [ +  -  +  - ]:           2 :     static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
      18                 :           1 :     g_setup = testing_setup.get();
      19         [ +  - ]:           2 : }
      20                 :             : 
      21         [ +  - ]:         798 : FUZZ_TARGET(crypter, .init = initialize_crypter)
      22                 :             : {
      23                 :         354 :     SeedRandomStateForTest(SeedRand::ZEROS);
      24                 :         354 :     FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
      25                 :         354 :     bool good_data{true};
      26                 :             : 
      27                 :         354 :     CCrypter crypt;
      28                 :             :     // These values are regularly updated within `CallOneOf`
      29                 :         354 :     std::vector<unsigned char> cipher_text_ed;
      30                 :         354 :     CKeyingMaterial plain_text_ed;
      31                 :         354 :     const std::vector<unsigned char> random_key = ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_KEY_SIZE);
      32                 :             : 
      33         [ +  + ]:         354 :     if (fuzzed_data_provider.ConsumeBool()) {
      34         [ +  - ]:         330 :         const std::string random_string = fuzzed_data_provider.ConsumeRandomLengthString(100);
      35         [ +  - ]:         330 :         SecureString secure_string(random_string.begin(), random_string.end());
      36                 :             : 
      37         [ +  + ]:         330 :         const unsigned int derivation_method = fuzzed_data_provider.ConsumeBool() ? 0 : fuzzed_data_provider.ConsumeIntegral<unsigned int>();
      38                 :             : 
      39                 :             :         // Limiting the value of rounds since it is otherwise uselessly expensive and causes a timeout when fuzzing.
      40         [ +  - ]:         660 :         crypt.SetKeyFromPassphrase(/*key_data=*/secure_string,
      41         [ +  - ]:         660 :                                    /*salt=*/ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_SALT_SIZE),
      42                 :             :                                    /*rounds=*/fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, CMasterKey::DEFAULT_DERIVE_ITERATIONS),
      43                 :             :                                    /*derivation_method=*/derivation_method);
      44                 :         330 :     }
      45                 :             : 
      46                 :         354 :     CKey random_ckey;
      47         [ +  - ]:         354 :     random_ckey.Set(random_key.begin(), random_key.end(), /*fCompressedIn=*/fuzzed_data_provider.ConsumeBool());
      48         [ +  + ]:         354 :     if (!random_ckey.IsValid()) return;
      49         [ +  - ]:         350 :     CPubKey pubkey{random_ckey.GetPubKey()};
      50                 :             : 
      51   [ +  +  +  +  :       10445 :     LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 100)
                   +  + ]
      52                 :             :     {
      53         [ +  - ]:        4882 :         CallOneOf(
      54                 :             :             fuzzed_data_provider,
      55                 :         191 :             [&] {
      56                 :         191 :                 const std::vector<unsigned char> random_vector = ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_KEY_SIZE);
      57         [ +  - ]:         191 :                 plain_text_ed = CKeyingMaterial(random_vector.begin(), random_vector.end());
      58                 :         191 :             },
      59                 :         500 :             [&] {
      60                 :         500 :                 cipher_text_ed = ConsumeRandomLengthByteVector(fuzzed_data_provider, 64);
      61                 :         500 :             },
      62                 :         899 :             [&] {
      63                 :         899 :                 (void)crypt.Encrypt(plain_text_ed, cipher_text_ed);
      64                 :         899 :             },
      65                 :        1567 :             [&] {
      66                 :        1567 :                 (void)crypt.Decrypt(cipher_text_ed, plain_text_ed);
      67                 :        1567 :             },
      68                 :         144 :             [&] {
      69                 :         144 :                 const CKeyingMaterial master_key(random_key.begin(), random_key.end());;
      70   [ +  -  +  - ]:         144 :                 (void)EncryptSecret(master_key, plain_text_ed, pubkey.GetHash(), cipher_text_ed);
      71                 :         144 :             },
      72                 :          29 :             [&] {
      73                 :          29 :                 std::optional<CPubKey> random_pub_key{ConsumeDeserializable<CPubKey>(fuzzed_data_provider)};
      74         [ +  + ]:          29 :                 if (!random_pub_key) {
      75                 :          19 :                     good_data = false;
      76                 :          19 :                     return;
      77                 :             :                 }
      78                 :          10 :                 pubkey = *random_pub_key;
      79                 :             :             },
      80                 :        1552 :             [&] {
      81                 :        1552 :                 const CKeyingMaterial master_key(random_key.begin(), random_key.end());
      82                 :        1552 :                 CKey key;
      83         [ +  - ]:        1552 :                 (void)DecryptKey(master_key, cipher_text_ed, pubkey, key);
      84                 :        1552 :             });
      85                 :             :     }
      86                 :         354 : }
      87                 :             : } // namespace
      88                 :             : } // namespace wallet
        

Generated by: LCOV version 2.0-1