crypto.cpp
1 // Copyright (c) 2020-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 <crypto/hmac_sha256.h> 6 #include <crypto/hmac_sha512.h> 7 #include <crypto/ripemd160.h> 8 #include <crypto/sha1.h> 9 #include <crypto/sha256.h> 10 #include <crypto/sha3.h> 11 #include <crypto/sha512.h> 12 #include <hash.h> 13 #include <test/fuzz/FuzzedDataProvider.h> 14 #include <test/fuzz/fuzz.h> 15 #include <test/fuzz/util.h> 16 17 #include <cstdint> 18 #include <vector> 19 20 FUZZ_TARGET(crypto) 21 { 22 FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; 23 std::vector<uint8_t> data = ConsumeRandomLengthByteVector(fuzzed_data_provider); 24 if (data.empty()) { 25 auto new_size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096); 26 auto x = fuzzed_data_provider.ConsumeIntegral<uint8_t>(); 27 data.resize(new_size, x); 28 } 29 30 CHash160 hash160; 31 CHash256 hash256; 32 CHMAC_SHA256 hmac_sha256{data.data(), data.size()}; 33 CHMAC_SHA512 hmac_sha512{data.data(), data.size()}; 34 CRIPEMD160 ripemd160; 35 CSHA1 sha1; 36 CSHA256 sha256; 37 CSHA512 sha512; 38 SHA3_256 sha3; 39 CSipHasher sip_hasher{fuzzed_data_provider.ConsumeIntegral<uint64_t>(), fuzzed_data_provider.ConsumeIntegral<uint64_t>()}; 40 41 LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 30) 42 { 43 CallOneOf( 44 fuzzed_data_provider, 45 [&] { 46 if (fuzzed_data_provider.ConsumeBool()) { 47 data = ConsumeRandomLengthByteVector(fuzzed_data_provider); 48 if (data.empty()) { 49 auto new_size = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096); 50 auto x = fuzzed_data_provider.ConsumeIntegral<uint8_t>(); 51 data.resize(new_size, x); 52 } 53 } 54 55 (void)hash160.Write(data); 56 (void)hash256.Write(data); 57 (void)hmac_sha256.Write(data.data(), data.size()); 58 (void)hmac_sha512.Write(data.data(), data.size()); 59 (void)ripemd160.Write(data.data(), data.size()); 60 (void)sha1.Write(data.data(), data.size()); 61 (void)sha256.Write(data.data(), data.size()); 62 (void)sha3.Write(data); 63 (void)sha512.Write(data.data(), data.size()); 64 (void)sip_hasher.Write(data); 65 66 (void)Hash(data); 67 (void)Hash160(data); 68 (void)sha512.Size(); 69 }, 70 [&] { 71 (void)hash160.Reset(); 72 (void)hash256.Reset(); 73 (void)ripemd160.Reset(); 74 (void)sha1.Reset(); 75 (void)sha256.Reset(); 76 (void)sha3.Reset(); 77 (void)sha512.Reset(); 78 }, 79 [&] { 80 CallOneOf( 81 fuzzed_data_provider, 82 [&] { 83 data.resize(CHash160::OUTPUT_SIZE); 84 hash160.Finalize(data); 85 }, 86 [&] { 87 data.resize(CHash256::OUTPUT_SIZE); 88 hash256.Finalize(data); 89 }, 90 [&] { 91 data.resize(CHMAC_SHA256::OUTPUT_SIZE); 92 hmac_sha256.Finalize(data.data()); 93 }, 94 [&] { 95 data.resize(CHMAC_SHA512::OUTPUT_SIZE); 96 hmac_sha512.Finalize(data.data()); 97 }, 98 [&] { 99 data.resize(CRIPEMD160::OUTPUT_SIZE); 100 ripemd160.Finalize(data.data()); 101 }, 102 [&] { 103 data.resize(CSHA1::OUTPUT_SIZE); 104 sha1.Finalize(data.data()); 105 }, 106 [&] { 107 data.resize(CSHA256::OUTPUT_SIZE); 108 sha256.Finalize(data.data()); 109 }, 110 [&] { 111 data.resize(CSHA512::OUTPUT_SIZE); 112 sha512.Finalize(data.data()); 113 }, 114 [&] { 115 data.resize(1); 116 data[0] = sip_hasher.Finalize() % 256; 117 }, 118 [&] { 119 data.resize(SHA3_256::OUTPUT_SIZE); 120 sha3.Finalize(data); 121 }); 122 }); 123 } 124 if (fuzzed_data_provider.ConsumeBool()) { 125 uint64_t state[25]; 126 for (size_t i = 0; i < 25; ++i) { 127 state[i] = fuzzed_data_provider.ConsumeIntegral<uint64_t>(); 128 } 129 KeccakF(state); 130 } 131 }