i2p.cpp raw
1 // Copyright (c) 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 <common/args.h>
6 #include <compat/compat.h>
7 #include <i2p.h>
8 #include <netaddress.h>
9 #include <netbase.h>
10 #include <test/fuzz/FuzzedDataProvider.h>
11 #include <test/fuzz/fuzz.h>
12 #include <test/fuzz/util.h>
13 #include <test/fuzz/util/net.h>
14 #include <test/fuzz/util/threadinterrupt.h>
15 #include <test/util/setup_common.h>
16 #include <test/util/time.h>
17 #include <util/fs_helpers.h>
18 #include <util/threadinterrupt.h>
19
20 void initialize_i2p()
21 {
22 static const auto testing_setup = MakeNoLogFileContext<>();
23 }
24
25 FUZZ_TARGET(i2p, .init = initialize_i2p)
26 {
27 SeedRandomStateForTest(SeedRand::ZEROS);
28 FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
29
30 FakeNodeClock clock{ConsumeTime(fuzzed_data_provider)};
31 FakeSteadyClock steady_clock;
32
33 // Mock CreateSock() to create FuzzedSock.
34 auto CreateSockOrig = CreateSock;
35 CreateSock = [&fuzzed_data_provider, &steady_clock](int, int, int) {
36 return std::make_unique<FuzzedSock>(fuzzed_data_provider, steady_clock);
37 };
38
39 const fs::path private_key_path = gArgs.GetDataDirNet() / "fuzzed_i2p_private_key";
40 const CService addr{in6_addr(COMPAT_IN6ADDR_LOOPBACK_INIT), 7656};
41 const Proxy sam_proxy{addr, /*tor_stream_isolation=*/false};
42 auto interrupt{ConsumeThreadInterrupt(fuzzed_data_provider)};
43
44 i2p::sam::Session session{private_key_path, sam_proxy, interrupt};
45 i2p::Connection conn;
46
47 if (session.Listen(conn)) {
48 if (session.Accept(conn)) {
49 try {
50 (void)conn.sock->RecvUntilTerminator('\n', 10ms, *interrupt, i2p::sam::MAX_MSG_SIZE);
51 } catch (const std::runtime_error&) {
52 }
53 }
54 }
55
56 bool proxy_error;
57
58 if (session.Connect(CService{}, conn, proxy_error)) {
59 try {
60 conn.sock->SendComplete("verack\n", 10ms, *interrupt);
61 } catch (const std::runtime_error&) {
62 }
63 }
64
65 fs::remove(private_key_path);
66
67 CreateSock = CreateSockOrig;
68 }
69