Bitcoin Core 31.99.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 <compat/compat.h>
7#include <i2p.h>
8#include <netaddress.h>
9#include <netbase.h>
11#include <test/fuzz/fuzz.h>
12#include <test/fuzz/util.h>
13#include <test/fuzz/util/net.h>
16#include <test/util/time.h>
17#include <util/fs_helpers.h>
18#include <util/threadinterrupt.h>
19
21{
22 static const auto testing_setup = MakeNoLogFileContext<>();
23}
24
26{
28 FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
29
31
32 // Mock CreateSock() to create FuzzedSock.
33 auto CreateSockOrig = CreateSock;
34 CreateSock = [&fuzzed_data_provider](int, int, int) {
35 return std::make_unique<FuzzedSock>(fuzzed_data_provider);
36 };
37
38 const fs::path private_key_path = gArgs.GetDataDirNet() / "fuzzed_i2p_private_key";
39 const CService addr{in6_addr(COMPAT_IN6ADDR_LOOPBACK_INIT), 7656};
40 const Proxy sam_proxy{addr, /*tor_stream_isolation=*/false};
42
43 i2p::sam::Session session{private_key_path, sam_proxy, interrupt};
44 i2p::Connection conn;
45
46 if (session.Listen(conn)) {
47 if (session.Accept(conn)) {
48 try {
49 (void)conn.sock->RecvUntilTerminator('\n', 10ms, *interrupt, i2p::sam::MAX_MSG_SIZE);
50 } catch (const std::runtime_error&) {
51 }
52 }
53 }
54
55 bool proxy_error;
56
57 if (session.Connect(CService{}, conn, proxy_error)) {
58 try {
59 conn.sock->SendComplete("verack\n", 10ms, *interrupt);
60 } catch (const std::runtime_error&) {
61 }
62 }
63
64 fs::remove(private_key_path);
65
66 CreateSock = CreateSockOrig;
67}
ArgsManager gArgs
Definition: args.cpp:40
fs::path GetDataDirNet() const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Get data directory path with appended network identifier.
Definition: args.cpp:330
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:530
Helper to initialize the global NodeClock, let a duration elapse, and reset it after use in a test.
Definition: time.h:40
Definition: netbase.h:60
I2P SAM session.
Definition: i2p.h:57
#define COMPAT_IN6ADDR_LOOPBACK_INIT
Definition: compat.h:50
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
Definition: i2p.cpp:32
Definition: basic.cpp:8
std::function< std::unique_ptr< Sock >(int, int, int)> CreateSock
Socket factory.
Definition: netbase.cpp:577
An established connection with another peer.
Definition: i2p.h:32
std::unique_ptr< Sock > sock
Connected socket.
Definition: i2p.h:34
FUZZ_TARGET(i2p,.init=initialize_i2p)
Definition: i2p.cpp:25
void initialize_i2p()
Definition: i2p.cpp:20
std::shared_ptr< CThreadInterrupt > ConsumeThreadInterrupt(FuzzedDataProvider &fuzzed_data_provider)
NodeSeconds ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
Definition: util.cpp:34
void SeedRandomStateForTest(SeedRand seedtype)
Seed the global RNG state for testing and log the seed value.
Definition: random.cpp:19
@ ZEROS
Seed with a compile time constant of zeros.
FuzzedDataProvider & fuzzed_data_provider
Definition: fees.cpp:39