Bitcoin Core  28.1.0
P2P Digital Currency
i2p.cpp
Go to the documentation of this file.
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 <i2p.h>
7 #include <netaddress.h>
8 #include <netbase.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 
18 {
19  static const auto testing_setup = MakeNoLogFileContext<>();
20 }
21 
23 {
24  FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
25 
26  SetMockTime(ConsumeTime(fuzzed_data_provider));
27 
28  // Mock CreateSock() to create FuzzedSock.
29  auto CreateSockOrig = CreateSock;
30  CreateSock = [&fuzzed_data_provider](int, int, int) {
31  return std::make_unique<FuzzedSock>(fuzzed_data_provider);
32  };
33 
34  const fs::path private_key_path = gArgs.GetDataDirNet() / "fuzzed_i2p_private_key";
35  const CService addr{in6_addr(IN6ADDR_LOOPBACK_INIT), 7656};
36  const Proxy sam_proxy{addr, false};
37  CThreadInterrupt interrupt;
38 
39  i2p::sam::Session session{private_key_path, sam_proxy, &interrupt};
40  i2p::Connection conn;
41 
42  if (session.Listen(conn)) {
43  if (session.Accept(conn)) {
44  try {
45  (void)conn.sock->RecvUntilTerminator('\n', 10ms, interrupt, i2p::sam::MAX_MSG_SIZE);
46  } catch (const std::runtime_error&) {
47  }
48  }
49  }
50 
51  bool proxy_error;
52 
53  if (session.Connect(CService{}, conn, proxy_error)) {
54  try {
55  conn.sock->SendComplete("verack\n", 10ms, interrupt);
56  } catch (const std::runtime_error&) {
57  }
58  }
59 
60  fs::remove_all(private_key_path);
61 
62  CreateSock = CreateSockOrig;
63 }
void initialize_i2p()
Definition: i2p.cpp:17
I2P SAM session.
Definition: i2p.h:56
An established connection with another peer.
Definition: i2p.h:32
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
Definition: time.cpp:32
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Definition: args.h:232
FUZZ_TARGET(i2p,.init=initialize_i2p)
Definition: i2p.cpp:22
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:530
A helper class for interruptible sleeps.
static constexpr size_t MAX_MSG_SIZE
The maximum size of an incoming message from the I2P SAM proxy (in bytes).
Definition: i2p.h:51
ArgsManager gArgs
Definition: args.cpp:41
Definition: netbase.h:58
Definition: i2p.cpp:31
int64_t ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
Definition: util.cpp:34
std::function< std::unique_ptr< Sock >int, int, int)> CreateSock
Socket factory.
Definition: netbase.cpp:557
std::unique_ptr< Sock > sock
Connected socket.
Definition: i2p.h:34
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:32