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