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