mirror of
https://github.com/go-i2p/go-i2p.git
synced 2025-08-23 18:32:19 -04:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3dfdc19b73 | ||
![]() |
2bfde499a2 | ||
![]() |
e11ca291db | ||
![]() |
219588879a | ||
![]() |
46c6dc723b | ||
![]() |
f1496a7064 |
@@ -1,26 +0,0 @@
|
||||
# Use the latest 2.1 version of CircleCI pipeline process engine. See: https://circleci.com/docs/2.0/configuration-reference
|
||||
version: 2.1
|
||||
jobs:
|
||||
build:
|
||||
working_directory: ~/repo
|
||||
docker:
|
||||
- image: circleci/golang:1.15.8
|
||||
steps:
|
||||
- checkout
|
||||
- restore_cache:
|
||||
keys:
|
||||
- go-mod-v4-{{ checksum "go.sum" }}
|
||||
- run:
|
||||
name: Install Dependencies
|
||||
command: go mod download
|
||||
- save_cache:
|
||||
key: go-mod-v4-{{ checksum "go.sum" }}
|
||||
paths:
|
||||
- "/go/pkg/mod"
|
||||
- run:
|
||||
name: Run tests
|
||||
command: |
|
||||
mkdir -p /tmp/test-reports
|
||||
gotestsum --junitfile /tmp/test-reports/unit-tests.xml
|
||||
- store_test_results:
|
||||
path: /tmp/test-reports
|
19
.github/workflows/auto-assign.yml
vendored
19
.github/workflows/auto-assign.yml
vendored
@@ -1,19 +0,0 @@
|
||||
name: Auto Assign
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
pull_request:
|
||||
types: [opened]
|
||||
jobs:
|
||||
run:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: 'Auto-assign issue'
|
||||
uses: pozil/auto-assign-issue@v1
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
assignees: eyedeekay
|
||||
numOfAssignee: 1
|
60
.github/workflows/page.yml
vendored
60
.github/workflows/page.yml
vendored
@@ -1,60 +0,0 @@
|
||||
name: Generate and Deploy GitHub Pages
|
||||
|
||||
on:
|
||||
# Run once hourly
|
||||
schedule:
|
||||
- cron: '0 * * * *'
|
||||
# Allow manual trigger
|
||||
workflow_dispatch:
|
||||
# Run on pushes to main branch
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # Fetch all history for proper repo data
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24.x'
|
||||
cache: true
|
||||
|
||||
- name: Build Site Generator
|
||||
run: |
|
||||
go install github.com/go-i2p/go-gh-page/cmd/github-site-gen@latest
|
||||
export GOBIN=$(go env GOPATH)/bin
|
||||
cp -v "$GOBIN/github-site-gen" ./github-site-gen
|
||||
# Ensure the binary is executable
|
||||
chmod +x github-site-gen
|
||||
|
||||
- name: Generate Site
|
||||
run: |
|
||||
# Determine current repository owner and name
|
||||
REPO_OWNER=$(echo $GITHUB_REPOSITORY | cut -d '/' -f 1)
|
||||
REPO_NAME=$(echo $GITHUB_REPOSITORY | cut -d '/' -f 2)
|
||||
|
||||
# Generate the site
|
||||
./github-site-gen -repo "${REPO_OWNER}/${REPO_NAME}" -output ./site
|
||||
|
||||
# Create a .nojekyll file to disable Jekyll processing
|
||||
touch ./site/.nojekyll
|
||||
|
||||
# Add a .gitattributes file to ensure consistent line endings
|
||||
echo "* text=auto" > ./site/.gitattributes
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: JamesIves/github-pages-deploy-action@v4
|
||||
with:
|
||||
folder: site # The folder the action should deploy
|
||||
branch: gh-pages # The branch the action should deploy to
|
||||
clean: true # Automatically remove deleted files from the deploy branch
|
||||
commit-message: "Deploy site generated on ${{ github.sha }}"
|
62
.github/workflows/tests.yml
vendored
62
.github/workflows/tests.yml
vendored
@@ -1,62 +0,0 @@
|
||||
name: Go Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, master ]
|
||||
pull_request:
|
||||
branches: [ main, master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: '1.21'
|
||||
- run: make build
|
||||
env:
|
||||
GO: go
|
||||
CGO_ENABLED: 0
|
||||
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: '1.21' # Adjust this version as needed
|
||||
|
||||
- name: Cache Go modules
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/go/pkg/mod
|
||||
~/.cache/go-build
|
||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-go-
|
||||
|
||||
- name: Install gofumpt
|
||||
run: go install mvdan.cc/gofumpt@latest
|
||||
|
||||
- name: Go mod tidy
|
||||
run: go mod tidy
|
||||
|
||||
- name: Run all tests
|
||||
run: go test -v ./...
|
||||
env:
|
||||
GO: go
|
||||
DEBUG_I2P: debug
|
||||
CGO_ENABLED: 0
|
||||
|
||||
- name: Upload Test Logs
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.test_target }}-logs
|
||||
path: ./test-logs/${{ matrix.test_target }}.log # Adjust this path as needed
|
8
.gitignore
vendored
8
.gitignore
vendored
@@ -5,10 +5,4 @@
|
||||
*.coverprofile
|
||||
*exportable-fuzz.zip
|
||||
go-i2p
|
||||
*.exe
|
||||
.idea/
|
||||
router.info
|
||||
log
|
||||
*.gv
|
||||
diff
|
||||
err
|
||||
*.exe
|
@@ -1,35 +1,20 @@
|
||||
# Contributing
|
||||
|
||||
Thanks for taking a look at go-i2p! Please reach out if you have any questions or need help getting started. We have an IRC channel on IRC2P: #go-i2p-dev and we're reachable here at github.com/go-i2p also.
|
||||
Thanks for taking a look at go-i2p! Please reach out if you have any questions or need help getting started.
|
||||
|
||||
## Getting Started
|
||||
## Getting Starting
|
||||
|
||||
Install required dependencies
|
||||
|
||||
This example assumes Ubuntu or Debian based Linux, a reasonably modern version.
|
||||
The instructions will be similar for other Linux distributions with slightly different package managers and package names.
|
||||
This example assumes Ubuntu 16.04
|
||||
|
||||
```sh
|
||||
# For obtaining, modifying, compiling, and tracking changes to go-i2p, install:
|
||||
sudo apt-get install golang-go make git
|
||||
# If you want to generate markdown versions of the godoc locally, also install:
|
||||
go install github.com/robertkrimen/godocdown/godocdown@master
|
||||
# If you want to generate call graphs locally, also install:
|
||||
go install github.com/ofabry/go-callvis@master
|
||||
go get github.com/hkparker/go-i2p
|
||||
go get github.com/Sirupsen/logrus
|
||||
go get github.com/stretchr/testify/assert
|
||||
```
|
||||
|
||||
On Windows, one must install the latest versions of Go and Git Bash from their respective sources.
|
||||
|
||||
## Set up your workspace:
|
||||
|
||||
```sh
|
||||
github_username=yourusername
|
||||
cd $(go env GOPATH)
|
||||
git clone git@github.com:$github_username/go-i2p github.com/go-i2p/go-i2p
|
||||
github.com/go-i2p/go-i2p
|
||||
```
|
||||
|
||||
Fork go-i2p and clone it into your workspace. Make sure you can execute `go test ./...` in the project's root directory. At that point you should have everything you need to start making changes and opening pull requests.
|
||||
Fork go-i2p and clone it into your workspace. Make sure you can execute `go test ./...` in the project's root directory. At that point you should have everything you need to start making changes and opening pull requests. If you aren't sure what to work on, take a look at some good [getting started issues](https://github.com/hkparker/go-i2p/issues?q=is%3Aopen+is%3Aissue+label%3A%22start+here%22).
|
||||
|
||||
## I2P Specifications
|
||||
|
||||
@@ -41,17 +26,9 @@ The I2P community maintains up-to-date [specifications](https://geti2p.net/spec)
|
||||
|
||||
## Conventions
|
||||
|
||||
#### Errors
|
||||
|
||||
We use oops to provide context to the errors we return. Do not use `errors.New` or `fmt.Errorf` when returning errors from functions. Instead, wrap raw errors in oops errors. When an error is recieved, used oops to supplement the log output.
|
||||
|
||||
It is OK to use `fmt.Errorf` for declaring custom error types.
|
||||
|
||||
#### Logging
|
||||
|
||||
Logrus is used for logging across all of go-i2p. We have a small extension of logrus at https://github.com/go-i2p/logger which we use to add a "Fail Fast mode." We are mostly converted over to using it.
|
||||
|
||||
All log statements should contain an `at` fields and a `reason` field. Here is a good example from the go-i2p implementation of a LeaseSet:
|
||||
Logrus is used for logging across all of go-i2p. All log statements should contain an `at` fields and a `reason` field. Here is a good example from the go-i2p implementation of a LeaseSet:
|
||||
|
||||
```go
|
||||
log.WithFields(log.Fields{
|
||||
@@ -79,4 +56,4 @@ func TestRouterAddressCountReturnsCorrectCount(t *testing.T) {
|
||||
|
||||
## Pull Requests
|
||||
|
||||
Pull requests should pass all tests, test all new behavior, and be correctly formatted by `gofumpt -w -s -extra` before merge. Feel free to open incomplete pull requests and ask for help and advice.
|
||||
Pull requests should pass all tests, test all new behavior, and be correctly formatted by `gofmt` before merge. Feel free to open incomplete pull requests if you are struggling, I will enthusiasticlly help you complete the PR in any way needed.
|
||||
|
31
Makefile
31
Makefile
@@ -1,9 +1,5 @@
|
||||
RELEASE_TAG=0.0.1
|
||||
RELEASE_VERSION=${RELEASE_TAG}
|
||||
RELEASE_DESCRIPTION=`cat PASTA.md`
|
||||
REPO := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
||||
CGO_ENABLED=0
|
||||
export DEBUG_I2P=debug
|
||||
|
||||
|
||||
ifdef GOROOT
|
||||
GO = $(GOROOT)/bin/go
|
||||
@@ -17,30 +13,13 @@ else
|
||||
EXE := $(REPO)/go-i2p
|
||||
endif
|
||||
|
||||
#check for gofumpt
|
||||
check_gofumpt:
|
||||
@which gofumpt > /dev/null 2>&1 || (echo "gofumpt is required but not installed. Please install it from https://github.com/mvdan/gofumpt."; exit 1)
|
||||
|
||||
build: clean $(EXE)
|
||||
|
||||
$(EXE):
|
||||
$(GO) build --tags netgo,osusergo -v -o $(EXE)
|
||||
$(GO) build -v -o $(EXE)
|
||||
|
||||
test:
|
||||
$(GO) test ./...
|
||||
|
||||
clean:
|
||||
$(GO) clean -v
|
||||
|
||||
fmt:
|
||||
find . -name '*.go' -exec gofumpt -w {} \;
|
||||
|
||||
info:
|
||||
echo "GOROOT: ${GOROOT}"
|
||||
echo "GO: ${GO}"
|
||||
echo "REPO: ${REPO}"
|
||||
|
||||
release:
|
||||
github-release release -u go-i2p -r go-i2p -n "${RELEASE_VERSION}" -t "${RELEASE_TAG}" -d "${RELEASE_DESCRIPTION}" -p
|
||||
|
||||
godoc:
|
||||
./callgraph.sh
|
||||
find . -name 'README.md' -exec git add -v {} \;
|
||||
git commit -am "GODOC UPDATE CHECKIN"
|
||||
|
189
PROPOSAL.md
Normal file
189
PROPOSAL.md
Normal file
@@ -0,0 +1,189 @@
|
||||
Proposal for developing go-i2p
|
||||
==============================
|
||||
|
||||
Goals:
|
||||
------
|
||||
|
||||
Make it easy to seamlessly integrate Go applications with I2P routers where
|
||||
a pre-installed I2P router with SAM is not already present.
|
||||
|
||||
Implement an I2P library with a memory-safe language capable of outputting
|
||||
shared objects and C libraries for use by other languages, in order to make
|
||||
embedding I2P in other projects easier.
|
||||
|
||||
### Why Go?
|
||||
|
||||
Go is a popular programming language developed at Google and now
|
||||
implemented by several projects. It is a memory-safe language which compiles
|
||||
binary executables for a target platform, as opposed to running on a virtual
|
||||
machine or interpreter. Go features a suite of cross-compilers with identical
|
||||
usage, making it a "Write-once, compile-anywhere" language. This is especially
|
||||
true when writing pure Go. Go compilers normally produce executables which are
|
||||
maximally "static" and only link dynamic libraries provided by the platform
|
||||
when instructed to specifically, however this behavior can be disabled. Go
|
||||
libraries can produce shared objects for other applications to use, and third
|
||||
party Go applications can seamlessly generate C bindings as a bridge to other
|
||||
languages. I can do this automatically with Java by generating JNI bindings,
|
||||
enabling go-i2p to interface with Java I2P readily.
|
||||
|
||||
### Why go-i2p?
|
||||
|
||||
go-i2p was a project to implement an I2P router and library of I2P structures
|
||||
using Go which gained interest for a time 7-8 years ago, but which has since
|
||||
gone dormant. In spite of that considerable lapse in time, the structure is
|
||||
a sound, understandable way of laying out a Go project and the extant code is
|
||||
usable as the basis for beginning the development of a Go based I2P router.
|
||||
It will considerably reduce the amount of work required to create a Go I2P
|
||||
router.
|
||||
|
||||
### Why Go Applications?
|
||||
|
||||
Go applications manage network connections and listeners in a way which
|
||||
enables easily configuring alternate transports and building different types
|
||||
of "addresses" which are useful for contacting people on those transports.
|
||||
The advantages of this approach will likely affect all parts of the go-i2p
|
||||
router and the applications that come with it. At this time the power of this
|
||||
approach is primarily visible in the power of Go's SAM libraries, which
|
||||
implement all of Go's interface types for network connections and addresses
|
||||
and can be "swapped" with any Go library which uses those interface types.
|
||||
In a matter of an hour or two, sometimes even less a developer who wishes
|
||||
to make their application able to build I2P connections can do so.
|
||||
|
||||
Moreover, these connections can often be used to transport other connections
|
||||
inside. It is therefore possible to use Go as an alternate way of doing
|
||||
"Native WebRTC" using I2P connections and add WebTorrent support to a
|
||||
desktop I2P BitTorrent Application. The best way to do this would be to
|
||||
add support to the `anacrolix/torrent` library which already supports regular
|
||||
WebTorrent.
|
||||
|
||||
Another key application is IPFS. IPFS is designed to use transports in a
|
||||
way which allows them to be readily substituted out, nested and combined.
|
||||
Interest in I2P transports has been expressed to me before, and I've enabled
|
||||
them using SAM in the past. Interestingly, however, IPFS has it's own pluggable
|
||||
peer-discovery methods as well, inclusing the "Hashmatter" anonymous DHT and
|
||||
in fact an IPFS network could hypothetically use a NetDB-like structure for
|
||||
anonymous peer discovery and also have I2P transports(related or unrelated).
|
||||
|
||||
Deeper into the router, this approach yields possibilities for experimenting
|
||||
with other types of transports, in particular transports which imitate other
|
||||
traffic. Tor's pluggable transports are largely written in Go, for instance,
|
||||
but perhaps more interestingly Go has a library for building custom SSH clients
|
||||
and servers(`gliderlabs/ssh`) which could be used to build ssh-alike transports
|
||||
that wouldn't be easily distinguishable from the real thing. Besides that,
|
||||
there is `pion/webrtc` and the accompanying libraries, which implement a
|
||||
memory-safe desktop WebRTC implementation that is used in Snowflake to mimic
|
||||
browser-to-browser connections WebRTC as a Tor pluggable transport. There are
|
||||
popular Go libraries which are used for everything from TLS to KCP, and each
|
||||
potential transport would need to be evaluated for utility, security, etc,
|
||||
however implementing such an "imitating" transport should eventually be
|
||||
something we are able to rapidly prototype by implementing our own `transport`
|
||||
interface and wrapping existing connection types.
|
||||
|
||||
#### Specific Applications
|
||||
|
||||
Besides having the most extensive SAM and I2CP libraries available in a Non-Java
|
||||
language, go has several applications which could improve I2P's ecosystem.
|
||||
|
||||
##### Extant, applications that have users
|
||||
|
||||
- [XD](https://github.com/majestrate/XD) - Simple bittorrent client with a WebUI
|
||||
and a custom RPC interface
|
||||
- [libanonvpn](https://github.com/RTradeLtd/libanonvpn) - Easy, self-healing TUN
|
||||
Devices over I2P on Linux, OSX, TAP devices over I2P on Windows
|
||||
- [BRB](https://github.com/eyedeekay/brb) - I2P IRC client with the ability to
|
||||
support multiple simultaneous anonymous users, a built-in IRC server, and a
|
||||
WebIRC interface for easy ephemeral groupchat.
|
||||
- [Railroad](https://github.com/eyedeekay/railroad) - Easy selfhosted blogging
|
||||
tool which supports live, WYSIWYG editing using a side-by-side Mardown Editor
|
||||
and Preview Panel.
|
||||
- [sam-forwarder](https://github.com/eyedeekay/sam-forwarder) - Versatile tunnel
|
||||
building and management tool like i2ptunnel with similar support. Slightly easier
|
||||
HTTPS support.
|
||||
- [eephttpd](https://github.com/eyedeekay/eephttpd) - Simple static http server
|
||||
with the ability to clone a git repository and automatically generate a site,
|
||||
and to in-turn be cloned by another git client. Also has a built-in bittorrent
|
||||
tracker and generates/shares a .torrent of everything in the docroot, with itself
|
||||
as a web seed.
|
||||
- [reseed-tools](https://i2pgit.org/idk/reseed-tools) Reseed server and library for
|
||||
handling `.su3` files in Go.
|
||||
- [syndie](https://github.com/kpetku/syndie-core) Maintained implementation of the
|
||||
Syndie message board system in Go.
|
||||
|
||||
... Many, many others but these are the most useful.
|
||||
|
||||
##### Partial/In Development
|
||||
|
||||
- [Brook](https;//github.com/txthinking/brook) - Selfhosting multi-transport VPN and
|
||||
transparent proxy with Android support.
|
||||
- [bt](https://github.com/xgfone/bt) - a very simple, readable, and safe pure-Go
|
||||
bittorent library with a similar set of features to I2PSnark. Although `anacrolix/torrent`
|
||||
supports more features, `xgfone/bt` is slightly easier to work with when cross-compiling.
|
||||
- [gophertunnel/gopherhole](https://i2pgit.org/idk/gophertunnel) - Are a simple Gopher
|
||||
client and server in pure Go which automatically configure themselves with I2P. Also
|
||||
has the ability to proxy Gopher content into the I2P Web.
|
||||
- [darkssh/darksshd](https://github.com/eyedeekay/darkssh) - SSH client and server
|
||||
with transparent support for I2P and Tor addresses, making MITM attacks based on
|
||||
social-engineering SSH clients into connecting to malicious servers impossible.
|
||||
- [samsocks](https://github.com/eyedeekay/samsocks) - Transparent socksifier with UDP
|
||||
support, built on SAM.
|
||||
- [i2pbrowser](https://github.com/eyedeekay/i2pbrowser) - Not pure go, this is
|
||||
actually an installer and bundling tool intended to pre-configure a browser
|
||||
for use with I2P and a suite of I2P applications. In a far-fling future where
|
||||
go-i2p is completed, this i2pbrowser would embed go-i2p instead of i2p-zero,
|
||||
while retaining it's other "router-agnostic" attitudes.
|
||||
|
||||
##### Proposed
|
||||
|
||||
- [Smallstep] - Smallstep is a Certificate Authority by Let's Encrypt which is often
|
||||
used for private CA's for SSH servers. It has ACME protocol support. It could be used
|
||||
in I2P as a CA for I2P sites
|
||||
- [torrent](https://github.com/anacrolix/torrent) - Anacrolix torrent is a very popular
|
||||
Bittorrent library used in 20-30 bittorrent clients, and which has features which are
|
||||
comparable to BiglyBT.
|
||||
- [Gitea](https://github.com/gitea/gitea) - Gitea is a Git web server similar to Gitea
|
||||
but in most ways simpler to self-host.
|
||||
- [Syncthing](https://github.com/syncthing/syncthing) - Syncthing is a continuous,
|
||||
multi-device file synchronization tool which combines concepts from Git with Bittorrent
|
||||
downloads to provide fast, decentralized file synchronization.
|
||||
- [webrtc](https://github.com/pion/webrtc) - Go has the only implementation of the WebRTC
|
||||
stack in a memory-safe language. `pion/webrtc` can be used with alternate transports and
|
||||
listeners as is standard in Go so it lends itself to adapting WebRTC applications to Go.
|
||||
- [SAM-PT] This is a pluggable transport for Tor which has two parts: on the server side,
|
||||
an I2P-enabled Tor bridge serving itself over a single hop. On the client side, an I2P
|
||||
enabled pluggable transport client connecting to the Tor bridge over any number of hops.
|
||||
This is a means of hiding the address of long-term bridge operators from probing by
|
||||
malicious actors who attempt to access Tor bridges for enumeration purposes.
|
||||
|
||||
### What are the alternatives?
|
||||
|
||||
|
||||
- Wrap `libi2pd/api.h` in a C library, provide a CGO wrapper to interface with Go.
|
||||
- I can't think of a single reason not to do this, regardless of whether go-i2p
|
||||
development is supported by the project. There are good reasons to do both, but
|
||||
it's not actually a good reason not to develop go-i2p. This also does not gain the same
|
||||
ability to experiment with i2p at the transport level that a complete go-i2p would.
|
||||
Nonetheless, the value for embedders is tremendous so a C interface to i2pd is likely
|
||||
to be completed by me soon anyway.
|
||||
- Continue development on `str4d/ire`.
|
||||
- While this is a fine idea, and ire is technically more complete than go-i2p,
|
||||
I've written hundreds of thousands of lines of Go, and understand the details of
|
||||
the language intimately. On the other hand, I've written exactly 98 lines of Rust,
|
||||
exactly the amount required to stand up my pastebin. I also know developers in the
|
||||
Go application community who are already asking me about contributing.
|
||||
|
||||
Milestones and Ongoing Tasks
|
||||
----------------------------
|
||||
|
||||
- Milestone 1: Common Structures Update
|
||||
- Milestone 2: Have a transport(NTCP2)
|
||||
- Milestone 3: Connect 2 go-i2p routers on the same network.
|
||||
- Milestone 4: Have a working NetDB
|
||||
- Milestone 5: Communicate across a tunnel with an extant I2P router on a testnet.
|
||||
- Milestone 6: Be a functioning standalone Reseed Server
|
||||
- Milestone 7: Streaming and Datgram Libraries
|
||||
- Milestone 9: Provide a usable I2CP Socket
|
||||
- Milestone 9: Build a SAM API on the I2CP Socket
|
||||
|
||||
It should be considered essential that in particular all exposed function, struct, and
|
||||
interface comments pass `golint` and `go vet` at all times, since this is expressly intended
|
||||
to produce a useful library for building I2P routers.
|
144
README.md
144
README.md
@@ -4,132 +4,78 @@ A pure Go implementation of the I2P router.
|
||||
|
||||
## Status
|
||||
|
||||
go-i2p is in early development. The master branch is being refactored and API's are
|
||||
definitely going to change. If you choose to use any part of this code right now,
|
||||
please keep up with these changes, as they will not be backward compatible and require
|
||||
**Fundamentally** changing any code that treats this as a dependency.
|
||||
go-i2p is in early development.
|
||||
|
||||
### Implemented Features
|
||||
|
||||
- Clients
|
||||
- [ ] Datagrams
|
||||
- [ ] I2CP
|
||||
- [ ] Message routing
|
||||
- [ ] Datagrams
|
||||
- [ ] SAM
|
||||
- [ ] Streaming
|
||||
- [Cryptographic primitives(see also: https://github.com/go-i2p/crypto)](https://github.com/go-i2p/crypto)
|
||||
- [ ] Tunnel Manager
|
||||
- Cryptographic primitives
|
||||
- Signing
|
||||
- [X] ECDSA_SHA256_P256
|
||||
- [X] ECDSA_SHA384_P384
|
||||
- [X] ECDSA_SHA512_P521
|
||||
- [X] Ed25519
|
||||
- [ ] ECDSA_SHA256_P256
|
||||
- [ ] ECDSA_SHA384_P384
|
||||
- [ ] ECDSA_SHA512_P521
|
||||
- [ ] Ed25519
|
||||
- Verifying
|
||||
- [X] DSA
|
||||
- [X] ECDSA_SHA256_P256
|
||||
- [X] ECDSA_SHA384_P384
|
||||
- [X] ECDSA_SHA512_P521
|
||||
- [X] RSA_SHA256_2048
|
||||
- [X] RSA_SHA384_3072
|
||||
- [X] RSA_SHA512_4096
|
||||
- [X] Ed25519
|
||||
- [ ] DSA
|
||||
- [ ] ECDSA_SHA256_P256
|
||||
- [ ] ECDSA_SHA384_P384
|
||||
- [ ] ECDSA_SHA512_P521
|
||||
- [ ] RSA_SHA256_2048
|
||||
- [ ] RSA_SHA384_3072
|
||||
- [ ] RSA_SHA512_4096
|
||||
- [ ] Ed25519
|
||||
- [ ] Red25519
|
||||
- [X] ElGamal
|
||||
- [X] AES256
|
||||
- [X] X25519
|
||||
- [X] ChaCha20/Poly1305
|
||||
- [ ] ElGamal
|
||||
- [ ] AES256
|
||||
- [ ] X25519
|
||||
- [ ] ChaCha20/Poly1305
|
||||
- [ ] Elligator2
|
||||
- [X] HKDF
|
||||
- [X] HMAC
|
||||
- [X] Noise subsystem
|
||||
- [ ] HKDF
|
||||
- [ ] HMAC
|
||||
- [ ] Noise subsystem
|
||||
- End-to-End Crypto
|
||||
- [ ] Garlic messages
|
||||
- [ ] ElGamal/AES+SessionTag
|
||||
- [ ] Ratchet/X25519
|
||||
- I2NP
|
||||
- [X] Message parsing and serialization
|
||||
- [X] Message interfaces and factory patterns
|
||||
- [X] Database Store/Lookup message structures
|
||||
- [X] Tunnel Build message structures
|
||||
- [X] Data, DeliveryStatus, TunnelData messages
|
||||
- [X] Build Request/Response Record parsing
|
||||
- [ ] Message routing and handling
|
||||
- [ ] Message parsing
|
||||
- [ ] Message handling
|
||||
- NetDB
|
||||
- [X] Local storage interface
|
||||
- [X] Reseed functionality (basic implementation)
|
||||
- [~] Persistence to disk
|
||||
- [ ] RouterInfo management
|
||||
- [ ] LeaseSet management
|
||||
- [X] Lookups
|
||||
- [ ] Local storage
|
||||
- [ ] Persistence to disk
|
||||
- [ ] Reseeding
|
||||
- [ ] Lookups
|
||||
- [ ] Expiry
|
||||
- [ ] Exploration
|
||||
- [ ] Publishing
|
||||
- [ ] Floodfill
|
||||
- [ ] LS2 and Encrypted Leasesets
|
||||
- Transport Layer
|
||||
- [X] Transport manager and interfaces
|
||||
- Transports
|
||||
- [ ] Transport manager
|
||||
- NTCP2
|
||||
- [X] Session handshake using noise protocol
|
||||
- [X] Connection management
|
||||
- [X] I2NP message framing and unframing
|
||||
- [X] Session lifecycle management
|
||||
- [X] Message queuing and worker threads
|
||||
- SSU2
|
||||
- [ ] Session handshake
|
||||
- [ ] Connection management
|
||||
- [ ] Handshake
|
||||
- [ ] Session tracking
|
||||
- [ ] Automatic session creation
|
||||
- SSU
|
||||
- [ ] Handshake
|
||||
- [ ] Session tracking
|
||||
- [ ] Automatic session creation
|
||||
- [ ] Peer Tests
|
||||
- [ ] Introducers
|
||||
- Tunnels
|
||||
- [X] Message structure parsing (delivery instructions)
|
||||
- [X] Fragment handling and reassembly
|
||||
- [X] Build Request/Response record interfaces
|
||||
- [ ] Tunnel building and management
|
||||
- [ ] Tunnel cryptography (layered encryption)
|
||||
- [ ] Gateway and endpoint implementation
|
||||
- [ ] Participant functionality
|
||||
- [Common Data Structures(see also: https://github.com/go-i2p/common](https://github.com/go-i2p/common)
|
||||
- [X] Keys and Cert
|
||||
- [X] Key Certificates
|
||||
- [X] Certificate
|
||||
- [X] Lease
|
||||
- [X] Lease Set
|
||||
- [X] Router Info
|
||||
- [X] Router Identity
|
||||
- [X] Router Address
|
||||
- [X] Session Key
|
||||
- [X] Signature Types
|
||||
- [X] Destination
|
||||
- [X] Data Types
|
||||
- [X] Session Tag
|
||||
- [ ] Building
|
||||
- [ ] Build Message Crypto (ElGamal)
|
||||
- [ ] Build Message Crypto (ECIES)
|
||||
- [ ] Participating
|
||||
- [ ] Tunnel Message Crypto
|
||||
- [ ] Tunnel Message Fragmentation/Reassembly
|
||||
|
||||
## Verbosity ##
|
||||
Logging can be enabled and configured using the `DEBUG_I2P` environment variable. By default, logging is disabled.
|
||||
|
||||
There are three available log levels:
|
||||
|
||||
- Debug
|
||||
```shell
|
||||
export DEBUG_I2P=debug
|
||||
```
|
||||
- Warn
|
||||
```shell
|
||||
export DEBUG_I2P=warn
|
||||
```
|
||||
- Error
|
||||
```shell
|
||||
export DEBUG_I2P=error
|
||||
```
|
||||
|
||||
If DEBUG_I2P is set to an unrecognized variable, it will fall back to "debug".
|
||||
|
||||
## Fast-Fail mode ##
|
||||
|
||||
Fast-Fail mode can be activated by setting `WARNFAIL_I2P` to any non-empty value. When set, every warning or error is Fatal.
|
||||
It is unsafe for production use, and intended only for debugging and testing purposes.
|
||||
|
||||
```shell
|
||||
export WARNFAIL_I2P=true
|
||||
```
|
||||
|
||||
If `WARNFAIL_I2P` is set and `DEBUG_I2P` is unset, `DEBUG_I2P` will be set to `debug`.
|
||||
|
||||
## Contributing
|
||||
|
||||
|
89
ROADMAP.md
89
ROADMAP.md
@@ -1,89 +0,0 @@
|
||||
# go-i2p Implementation Roadmap
|
||||
|
||||
## Completed Components ✅
|
||||
|
||||
### Transport Layer (NTCP2)
|
||||
- ✅ **Core NTCP2 Implementation**: Complete functional NTCP2 transport
|
||||
* ✅ Session handshake using noise protocol
|
||||
* ✅ Inbound and outbound connection management
|
||||
* ✅ I2NP message framing and unframing
|
||||
* ✅ Session lifecycle management with proper cleanup
|
||||
* ✅ Message queuing with background workers
|
||||
* ✅ RouterInfo compatibility checking
|
||||
* ✅ Error handling and session recovery
|
||||
|
||||
### I2NP Message System
|
||||
- ✅ **Core Message Infrastructure**: Complete I2NP message framework
|
||||
* ✅ Message parsing and serialization (NTCP format)
|
||||
* ✅ Interface-based message system with factory patterns
|
||||
* ✅ Data, DeliveryStatus, TunnelData message implementations
|
||||
* ✅ Database Store/Lookup message structures
|
||||
* ✅ Tunnel Build/Reply message structures
|
||||
* ✅ Build Request/Response Record parsing and interfaces
|
||||
|
||||
### Tunnel Message Processing
|
||||
- ✅ **Message Structure Handling**: Tunnel message framework
|
||||
* ✅ Delivery Instructions parsing and validation
|
||||
* ✅ Fragment handling and reassembly logic
|
||||
* ✅ Tunnel message structure parsing
|
||||
* ✅ Build record interface implementations
|
||||
|
||||
### Common Data Structures
|
||||
- ✅ **Complete Data Structure Support**: All I2P data types implemented
|
||||
* ✅ Keys and Certificates, Router Info/Address
|
||||
* ✅ Session Keys, Hashes, Signatures
|
||||
* ✅ Lease and LeaseSet structures
|
||||
|
||||
## In Progress Components 🚧
|
||||
|
||||
### NetDb Implementation
|
||||
- **Database Store Integration**:
|
||||
* 📋 Database Store message handling implementation
|
||||
* 📋 RouterInfo storage and retrieval
|
||||
* 📋 LeaseSet management and storage
|
||||
* 📋 Database lookup system
|
||||
* 📋 Peer selection logic (basic implementation)
|
||||
|
||||
## Next Priority Components 🎯
|
||||
|
||||
### Tunnel Building System
|
||||
- **Active Tunnel Management**:
|
||||
* 📋 Tunnel building coordination
|
||||
* 📋 Build request/response handling
|
||||
* 📋 Gateway and endpoint implementations
|
||||
* 📋 Participant tunnel processing
|
||||
|
||||
### Tunnel Cryptography
|
||||
- **Security Layer Implementation**:
|
||||
* 📋 Layered encryption/decryption
|
||||
* 📋 Key generation and management
|
||||
* 📋 Tunnel message forwarding logic
|
||||
|
||||
## Future Components 📅
|
||||
|
||||
### SSU2 Transport (Post-NTCP2)
|
||||
- **Secondary Transport Protocol**:
|
||||
* 📋 SSU2 handshake implementation
|
||||
* 📋 UDP-based session management
|
||||
* 📋 Peer testing mechanisms
|
||||
* 📋 Introducer functionality
|
||||
|
||||
### Advanced NetDb Features
|
||||
- **Enhanced Database Operations**:
|
||||
* 📋 Floodfill router functionality
|
||||
* 📋 Database exploration and publishing
|
||||
* 📋 LS2 and Encrypted LeaseSet support
|
||||
* 📋 Advanced peer selection algorithms
|
||||
|
||||
### Application Layer
|
||||
- **Client Applications**:
|
||||
* 📋 I2CP implementation
|
||||
* 📋 Streaming library
|
||||
* 📋 Datagram support
|
||||
* 📋 End-to-end encryption (Garlic routing)
|
||||
|
||||
## Current Status
|
||||
|
||||
**Primary Goal**: NTCP2 transport is feature-complete and actively sending/receiving I2NP messages. The foundation for tunnel building and NetDb integration is in place. Next major milestone is implementing database operations and tunnel building.
|
||||
|
||||
**Test Coverage**: Core components have basic test coverage including NTCP2 sessions, I2NP message processing, and tunnel message parsing.
|
19
callgraph.sh
19
callgraph.sh
@@ -1,19 +0,0 @@
|
||||
#! /usr/bin/env sh
|
||||
|
||||
dirs=$(find lib/ -type d)
|
||||
for dir in $dirs; do
|
||||
files=$(find "$dir" -maxdepth 2 -type f -name "*.go" -not -name "fuzz")
|
||||
#echo "Files in $dir: $files"
|
||||
file=$(echo $files | awk '{print $1}')
|
||||
if [ -z "$file" ]; then
|
||||
echo "no go files, skipping"
|
||||
continue
|
||||
fi
|
||||
packageLine=$(grep -E "^package" $file)
|
||||
package=$(echo $packageLine | awk '{print $2}')
|
||||
echo "Generating callgraph for $package"
|
||||
go-callvis -nostd -focus "$package" -group type -format svg -file $dir/$package "github.com/go-i2p/go-i2p/$dir"
|
||||
godocdown -template template.md -o "$dir/README.md" "./$dir"
|
||||
git add -v "$dir/README.md"
|
||||
git add -v "$dir/$package.svg" "$dir/README.md"
|
||||
done
|
45
go.mod
45
go.mod
@@ -1,46 +1,9 @@
|
||||
module github.com/go-i2p/go-i2p
|
||||
|
||||
go 1.24.2
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/beevik/ntp v1.4.3
|
||||
github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e
|
||||
github.com/go-i2p/common v0.0.0-20250715213359-dfa5527ece83
|
||||
github.com/go-i2p/crypto v0.0.0-20250716230511-565a0995440c
|
||||
github.com/go-i2p/go-noise v0.0.0-20250805210353-74f980a2439d
|
||||
github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c
|
||||
github.com/go-i2p/su3 v0.0.0-20250716183548-497fadf45e84
|
||||
github.com/samber/oops v1.19.0
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
github.com/spf13/cobra v1.9.1
|
||||
github.com/spf13/viper v1.20.1
|
||||
github.com/stretchr/testify v1.10.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
)
|
||||
|
||||
require (
|
||||
filippo.io/edwards25519 v1.1.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/dchest/siphash v1.2.3 // indirect
|
||||
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||
github.com/go-i2p/noise v0.0.0-20250805205922-091c71f48c43 // indirect
|
||||
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/oklog/ulid/v2 v2.1.1 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/sagikazarmark/locafero v0.10.0 // indirect
|
||||
github.com/samber/lo v1.51.0 // indirect
|
||||
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
|
||||
github.com/spf13/afero v1.14.0 // indirect
|
||||
github.com/spf13/cast v1.9.2 // indirect
|
||||
github.com/spf13/pflag v1.0.7 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
go.opentelemetry.io/otel v1.37.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.37.0 // indirect
|
||||
go.step.sm/crypto v0.67.0 // indirect
|
||||
golang.org/x/crypto v0.40.0 // indirect
|
||||
golang.org/x/net v0.41.0 // indirect
|
||||
golang.org/x/sys v0.35.0 // indirect
|
||||
golang.org/x/text v0.28.0 // indirect
|
||||
github.com/sirupsen/logrus v1.8.1
|
||||
github.com/stretchr/testify v1.7.0
|
||||
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc
|
||||
)
|
||||
|
108
go.sum
108
go.sum
@@ -1,98 +1,24 @@
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho=
|
||||
github.com/beevik/ntp v1.4.3/go.mod h1:Unr8Zg+2dRn7d8bHFuehIMSvvUYssHMxW3Q5Nx4RW5Q=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA=
|
||||
github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc=
|
||||
github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e h1:NMjWYVkgcQHGOy0/VxU0TU6smrcoxzj9hwDesx2sB0w=
|
||||
github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e/go.mod h1:fKfFM3BsOOyjtZmEty7FsGzGabXo8Eb/dHjyIhTtxsE=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/go-i2p/common v0.0.0-20250715213359-dfa5527ece83 h1:F6xM06QyqR+qMYA4SzWzUzfVmkSE1P41tHK32TmGxP8=
|
||||
github.com/go-i2p/common v0.0.0-20250715213359-dfa5527ece83/go.mod h1:e6X6esQk0zaevdZPZecKY7n8+wOfOLukQfWw558DYfk=
|
||||
github.com/go-i2p/crypto v0.0.0-20250716230511-565a0995440c h1:s+bMNveuZg8rhIolwy7w451Y4qirhhYZbbmvLfBIDw4=
|
||||
github.com/go-i2p/crypto v0.0.0-20250716230511-565a0995440c/go.mod h1:5felGikM6K5D95TLvVxew1UfR0BdtPpfmJLZa8cuY5U=
|
||||
github.com/go-i2p/go-noise v0.0.0-20250805210353-74f980a2439d h1:4DKwGZZ2yalAjrrOTw9Zoz31lOMXysw5PZTqKYazlVw=
|
||||
github.com/go-i2p/go-noise v0.0.0-20250805210353-74f980a2439d/go.mod h1:lNh+uKTp1nBVhY1MqJ7sNQWORRf1SMmYvu10Suv0zT8=
|
||||
github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c h1:VTiECn3dFEmUlZjto+wOwJ7SSJTHPLyNprQMR5HzIMI=
|
||||
github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c/go.mod h1:te7Zj3g3oMeIl8uBXAgO62UKmZ6m6kHRNg1Mm+X8Hzk=
|
||||
github.com/go-i2p/noise v0.0.0-20250805205922-091c71f48c43 h1:wHDEEr99CEe+2xQ/cqCt8g8QYw1JBqc8Fb/sg2A+K6U=
|
||||
github.com/go-i2p/noise v0.0.0-20250805205922-091c71f48c43/go.mod h1:yxzyP2upqal6mXWPWIPy7kuc1uuLzDrA21PSO5op9nE=
|
||||
github.com/go-i2p/su3 v0.0.0-20250716183548-497fadf45e84 h1:aEDC9JJGnPsUCOzyCuiOoGN8ByZ64xVs7dOKOawfImg=
|
||||
github.com/go-i2p/su3 v0.0.0-20250716183548-497fadf45e84/go.mod h1:khgAcQvD8LNY33zwha+ODxEdnHZRkDjQsdnnwojr7Ek=
|
||||
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
||||
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s=
|
||||
github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
|
||||
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/sagikazarmark/locafero v0.10.0 h1:FM8Cv6j2KqIhM2ZK7HZjm4mpj9NBktLgowT1aN9q5Cc=
|
||||
github.com/sagikazarmark/locafero v0.10.0/go.mod h1:Ieo3EUsjifvQu4NZwV5sPd4dwvu0OCgEQV7vjc9yDjw=
|
||||
github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI=
|
||||
github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
|
||||
github.com/samber/oops v1.19.0 h1:sfZAwC8MmTXBRRyNc4Z1utuTPBx+hFKF5fJ9DEQRZfw=
|
||||
github.com/samber/oops v1.19.0/go.mod h1:+f+61dbiMxEMQ8gw/zTxW2pk+YGobaDM4glEHQtPOww=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
|
||||
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
|
||||
github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
|
||||
github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
|
||||
github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE=
|
||||
github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
||||
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
|
||||
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
|
||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
|
||||
github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4=
|
||||
github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=
|
||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
|
||||
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
|
||||
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
|
||||
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
|
||||
go.step.sm/crypto v0.67.0 h1:1km9LmxMKG/p+mKa1R4luPN04vlJYnRLlLQrWv7egGU=
|
||||
go.step.sm/crypto v0.67.0/go.mod h1:+AoDpB0mZxbW/PmOXuwkPSpXRgaUaoIK+/Wx/HGgtAU=
|
||||
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
|
||||
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
|
||||
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
|
||||
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
|
||||
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
|
||||
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
|
||||
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc h1:+q90ECDSAQirdykUN6sPEiBXBsp8Csjcca8Oy7bgLTA=
|
||||
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
@@ -1,57 +0,0 @@
|
||||
# bootstrap
|
||||
--
|
||||
import "github.com/go-i2p/go-i2p/lib/bootstrap"
|
||||
|
||||

|
||||
|
||||
provides generic interfaces for initial bootstrap into network and network
|
||||
### reseeding
|
||||
|
||||
## Usage
|
||||
|
||||
#### type Bootstrap
|
||||
|
||||
```go
|
||||
type Bootstrap interface {
|
||||
// get more peers for bootstrap
|
||||
// try obtaining at most n router infos
|
||||
// if n is 0 then try obtaining as many router infos as possible
|
||||
// returns nil and error if we cannot fetch ANY router infos
|
||||
// returns a channel that yields 1 slice of router infos containing n or fewer router infos, caller must close channel after use
|
||||
GetPeers(ctx context.Context, n int) ([]router_info.RouterInfo, error)
|
||||
}
|
||||
```
|
||||
|
||||
interface defining a way to bootstrap into the i2p network
|
||||
|
||||
#### type ReseedBootstrap
|
||||
|
||||
```go
|
||||
type ReseedBootstrap struct {
|
||||
}
|
||||
```
|
||||
|
||||
ReseedBootstrap implements the Bootstrap interface using HTTP reseeding
|
||||
|
||||
#### func NewReseedBootstrap
|
||||
|
||||
```go
|
||||
func NewReseedBootstrap(config *config.BootstrapConfig) *ReseedBootstrap
|
||||
```
|
||||
NewReseedBootstrap creates a new reseeder with the provided configuration
|
||||
|
||||
#### func (*ReseedBootstrap) GetPeers
|
||||
|
||||
```go
|
||||
func (rb *ReseedBootstrap) GetPeers(ctx context.Context, n int) ([]router_info.RouterInfo, error)
|
||||
```
|
||||
GetPeers implements the Bootstrap interface by obtaining RouterInfos from
|
||||
configured reseed servers
|
||||
|
||||
|
||||
|
||||
bootstrap
|
||||
|
||||
github.com/go-i2p/go-i2p/lib/bootstrap
|
||||
|
||||
[go-i2p template file](/template.md)
|
@@ -1,10 +1,6 @@
|
||||
package bootstrap
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/go-i2p/common/router_info"
|
||||
)
|
||||
import "github.com/go-i2p/go-i2p/lib/common"
|
||||
|
||||
// interface defining a way to bootstrap into the i2p network
|
||||
type Bootstrap interface {
|
||||
@@ -13,5 +9,5 @@ type Bootstrap interface {
|
||||
// if n is 0 then try obtaining as many router infos as possible
|
||||
// returns nil and error if we cannot fetch ANY router infos
|
||||
// returns a channel that yields 1 slice of router infos containing n or fewer router infos, caller must close channel after use
|
||||
GetPeers(ctx context.Context, n int) ([]router_info.RouterInfo, error)
|
||||
GetPeers(n int) (chan []common.RouterInfo, error)
|
||||
}
|
||||
|
@@ -1,258 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
|
||||
-->
|
||||
<!-- Title: gocallvis Pages: 1 -->
|
||||
<svg width="365pt" height="722pt"
|
||||
viewBox="0.00 0.00 364.72 722.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(0 722)">
|
||||
<title>gocallvis</title>
|
||||
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-722 364.7182,-722 364.7182,0 0,0"/>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_focus</title>
|
||||
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="0,-8 0,-714 356.7182,-714 356.7182,-8 0,-8"/>
|
||||
<text text-anchor="middle" x="178.3591" y="-693.8" font-family="Arial" font-size="18.00" fill="#000000">bootstrap</text>
|
||||
</g>
|
||||
<g id="clust5" class="cluster">
|
||||
<title>cluster_github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed</title>
|
||||
<g id="a_clust5"><a xlink:title="type: github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed">
|
||||
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M242.0218,-598C242.0218,-598 334.2252,-598 334.2252,-598 340.2252,-598 346.2252,-604 346.2252,-610 346.2252,-610 346.2252,-664 346.2252,-664 346.2252,-670 340.2252,-676 334.2252,-676 334.2252,-676 242.0218,-676 242.0218,-676 236.0218,-676 230.0218,-670 230.0218,-664 230.0218,-664 230.0218,-610 230.0218,-610 230.0218,-604 236.0218,-598 242.0218,-598"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-606.5" font-family="Arial" font-size="15.00" fill="#222222">(Reseed)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<g id="clust4" class="cluster">
|
||||
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
|
||||
<g id="a_clust4"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
|
||||
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M261.4629,-451C261.4629,-451 315.7841,-451 315.7841,-451 321.7841,-451 327.7841,-457 327.7841,-463 327.7841,-463 327.7841,-578 327.7841,-578 327.7841,-584 321.7841,-590 315.7841,-590 315.7841,-590 261.4629,-590 261.4629,-590 255.4629,-590 249.4629,-584 249.4629,-578 249.4629,-578 249.4629,-463 249.4629,-463 249.4629,-457 255.4629,-451 261.4629,-451"/>
|
||||
<text text-anchor="middle" x="288.6235" y="-459.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_*github.com/go-i2p/logger.Logger</title>
|
||||
<g id="a_clust3"><a xlink:title="type: *github.com/go-i2p/logger.Logger">
|
||||
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M249.0141,-182C249.0141,-182 327.2329,-182 327.2329,-182 333.2329,-182 339.2329,-188 339.2329,-194 339.2329,-194 339.2329,-431 339.2329,-431 339.2329,-437 333.2329,-443 327.2329,-443 327.2329,-443 249.0141,-443 249.0141,-443 243.0141,-443 237.0141,-437 237.0141,-431 237.0141,-431 237.0141,-194 237.0141,-194 237.0141,-188 243.0141,-182 249.0141,-182"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-190.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap</title>
|
||||
<g id="a_clust2"><a xlink:title="type: *github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap">
|
||||
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M20,-304C20,-304 143.5288,-304 143.5288,-304 149.5288,-304 155.5288,-310 155.5288,-316 155.5288,-316 155.5288,-370 155.5288,-370 155.5288,-376 149.5288,-382 143.5288,-382 143.5288,-382 20,-382 20,-382 14,-382 8,-376 8,-370 8,-370 8,-316 8,-316 8,-310 14,-304 20,-304"/>
|
||||
<text text-anchor="middle" x="81.7644" y="-312.5" font-family="Arial" font-size="15.00" fill="#222222">(*ReseedBootstrap)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/go-i2p/go-i2p/lib/bootstrap.init -->
|
||||
<g id="node1" class="node">
|
||||
<title>github.com/go-i2p/go-i2p/lib/bootstrap.init</title>
|
||||
<g id="a_node1"><a xlink:title="github.com/go-i2p/go-i2p/lib/bootstrap.init | defined in .:0 at reseed_bootstrap.go:15: calling [github.com/go-i2p/logger.GetGoI2PLogger]">
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M96.2644,-52C96.2644,-52 66.2644,-52 66.2644,-52 60.2644,-52 54.2644,-46 54.2644,-40 54.2644,-40 54.2644,-28 54.2644,-28 54.2644,-22 60.2644,-16 66.2644,-16 66.2644,-16 96.2644,-16 96.2644,-16 102.2644,-16 108.2644,-22 108.2644,-28 108.2644,-28 108.2644,-40 108.2644,-40 108.2644,-46 102.2644,-52 96.2644,-52"/>
|
||||
<text text-anchor="middle" x="81.2644" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/go-i2p/logger.GetGoI2PLogger -->
|
||||
<g id="node2" class="node">
|
||||
<title>github.com/go-i2p/logger.GetGoI2PLogger</title>
|
||||
<g id="a_node2"><a xlink:title="github.com/go-i2p/logger.GetGoI2PLogger | defined in log.go:120">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M336.813,-52C336.813,-52 239.434,-52 239.434,-52 233.434,-52 227.434,-46 227.434,-40 227.434,-40 227.434,-28 227.434,-28 227.434,-22 233.434,-16 239.434,-16 239.434,-16 336.813,-16 336.813,-16 342.813,-16 348.813,-22 348.813,-28 348.813,-28 348.813,-40 348.813,-40 348.813,-46 342.813,-52 336.813,-52"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/go-i2p/go-i2p/lib/bootstrap.init->github.com/go-i2p/logger.GetGoI2PLogger -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>github.com/go-i2p/go-i2p/lib/bootstrap.init->github.com/go-i2p/logger.GetGoI2PLogger</title>
|
||||
<g id="a_edge7"><a xlink:title="at reseed_bootstrap.go:15: calling [github.com/go-i2p/logger.GetGoI2PLogger]">
|
||||
<path fill="none" stroke="#8b4513" d="M108.3076,-34C135.736,-34 179.3573,-34 216.7663,-34"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="217.1342,-37.5001 227.1342,-34 217.1341,-30.5001 217.1342,-37.5001"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/samber/oops.Errorf -->
|
||||
<g id="node3" class="node">
|
||||
<title>github.com/samber/oops.Errorf</title>
|
||||
<g id="a_node3"><a xlink:title="github.com/samber/oops.Errorf | defined in oops.go:34">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M305.3188,-113C305.3188,-113 270.9282,-113 270.9282,-113 264.9282,-113 258.9282,-107 258.9282,-101 258.9282,-101 258.9282,-89 258.9282,-89 258.9282,-83 264.9282,-77 270.9282,-77 270.9282,-77 305.3188,-77 305.3188,-77 311.3188,-77 317.3188,-83 317.3188,-89 317.3188,-89 317.3188,-101 317.3188,-101 317.3188,-107 311.3188,-113 305.3188,-113"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-99.2" font-family="Verdana" font-size="14.00" fill="#000000">oops</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-82.4" font-family="Verdana" font-size="14.00" fill="#000000">Errorf</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed -->
|
||||
<g id="node4" class="node">
|
||||
<title>github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed</title>
|
||||
<g id="a_node4"><a xlink:title="github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed | defined in new.go:10">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M321.4764,-174C321.4764,-174 254.7706,-174 254.7706,-174 248.7706,-174 242.7706,-168 242.7706,-162 242.7706,-162 242.7706,-150 242.7706,-150 242.7706,-144 248.7706,-138 254.7706,-138 254.7706,-138 321.4764,-138 321.4764,-138 327.4764,-138 333.4764,-144 333.4764,-150 333.4764,-150 333.4764,-162 333.4764,-162 333.4764,-168 327.4764,-174 321.4764,-174"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-160.2" font-family="Verdana" font-size="14.00" fill="#000000">reseed</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-143.4" font-family="Verdana" font-size="14.00" fill="#000000">NewReseed</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers -->
|
||||
<g id="node5" class="node">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers</title>
|
||||
<g id="a_node5"><a xlink:title="(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers | defined in reseed_bootstrap.go:32 at reseed_bootstrap.go:43: calling [(*github.com/go-i2p/logger.Logger).WithField] at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).WithField] at reseed_bootstrap.go:43: calling [(*github.com/sirupsen/logrus.Logger).Debug] at reseed_bootstrap.go:46: calling [github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed] at reseed_bootstrap.go:49: calling [(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed] at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).WithError] at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).Warn] at reseed_bootstrap.go:40: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:52: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:72: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:58: calling [(*github.com/go-i2p/logger.Logger).WithFields] at reseed_bootstrap.go:62: calling [(*github.com/sirupsen/logrus.Logger).Info]">
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M106.2947,-374C106.2947,-374 56.2341,-374 56.2341,-374 50.2341,-374 44.2341,-368 44.2341,-362 44.2341,-362 44.2341,-350 44.2341,-350 44.2341,-344 50.2341,-338 56.2341,-338 56.2341,-338 106.2947,-338 106.2947,-338 112.2947,-338 118.2947,-344 118.2947,-350 118.2947,-350 118.2947,-362 118.2947,-362 118.2947,-368 112.2947,-374 106.2947,-374"/>
|
||||
<text text-anchor="middle" x="81.2644" y="-351.8" font-family="Verdana" font-size="14.00" fill="#000000">GetPeers</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->github.com/samber/oops.Errorf -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->github.com/samber/oops.Errorf</title>
|
||||
<g id="a_edge8"><a xlink:title="at reseed_bootstrap.go:40: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:52: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:72: calling [github.com/samber/oops.Errorf]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.4074,-352.073C131.5385,-349.0001 145.5161,-343.5697 155.5288,-334 190.8891,-300.2044 195.4391,-162.9154 227.5288,-126 233.5557,-119.0668 241.5102,-113.4857 249.6658,-109.0748"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="251.4166,-112.115 258.8672,-104.5824 248.3454,-105.8247 251.4166,-112.115"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed</title>
|
||||
<g id="a_edge3"><a xlink:title="at reseed_bootstrap.go:46: calling [github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.6751,-351.3434C131.5313,-348.1844 145.2575,-342.8857 155.5288,-334 213.2793,-284.0401 171.3098,-229.6772 227.5288,-178 229.4394,-176.2438 231.5009,-174.6252 233.6705,-173.1338"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="235.6115,-176.0535 242.4829,-167.9892 232.0823,-170.0083 235.6115,-176.0535"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/logger.Logger).WithField -->
|
||||
<g id="node6" class="node">
|
||||
<title>(*github.com/go-i2p/logger.Logger).WithField</title>
|
||||
<g id="a_node6"><a xlink:title="(*github.com/go-i2p/logger.Logger).WithField | defined in log.go:54">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M316.398,-252C316.398,-252 259.849,-252 259.849,-252 253.849,-252 247.849,-246 247.849,-240 247.849,-240 247.849,-228 247.849,-228 247.849,-222 253.849,-216 259.849,-216 259.849,-216 316.398,-216 316.398,-216 322.398,-216 328.398,-222 328.398,-228 328.398,-228 328.398,-240 328.398,-240 328.398,-246 322.398,-252 316.398,-252"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">WithField</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithField -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithField</title>
|
||||
<g id="a_edge1"><a xlink:title="at reseed_bootstrap.go:43: calling [(*github.com/go-i2p/logger.Logger).WithField] at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).WithField]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.5683,-348.6617C130.8549,-345.2944 144.2489,-340.5496 155.5288,-334 193.8581,-311.7444 191.4175,-290.6986 227.5288,-265 231.4159,-262.2337 235.5842,-259.5689 239.8482,-257.0424"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="241.6859,-260.0242 248.6757,-252.0623 238.2464,-253.9275 241.6859,-260.0242"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/logger.Logger).WithError -->
|
||||
<g id="node7" class="node">
|
||||
<title>(*github.com/go-i2p/logger.Logger).WithError</title>
|
||||
<g id="a_node7"><a xlink:title="(*github.com/go-i2p/logger.Logger).WithError | defined in log.go:66">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M316.655,-313C316.655,-313 259.592,-313 259.592,-313 253.592,-313 247.592,-307 247.592,-301 247.592,-301 247.592,-289 247.592,-289 247.592,-283 253.592,-277 259.592,-277 259.592,-277 316.655,-277 316.655,-277 322.655,-277 328.655,-283 328.655,-289 328.655,-289 328.655,-301 328.655,-301 328.655,-307 322.655,-313 316.655,-313"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-299.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-282.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithError -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithError</title>
|
||||
<g id="a_edge5"><a xlink:title="at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).WithError]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.725,-344.9534C151.9288,-335.162 200.7001,-320.78 237.3948,-309.9592"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="238.7997,-313.194 247.4014,-307.0084 236.8198,-306.4798 238.7997,-313.194"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/logger.Logger).Warn -->
|
||||
<g id="node8" class="node">
|
||||
<title>(*github.com/go-i2p/logger.Logger).Warn</title>
|
||||
<g id="a_node8"><a xlink:title="(*github.com/go-i2p/logger.Logger).Warn | defined in log.go:30">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M305.8898,-374C305.8898,-374 270.3572,-374 270.3572,-374 264.3572,-374 258.3572,-368 258.3572,-362 258.3572,-362 258.3572,-350 258.3572,-350 258.3572,-344 264.3572,-338 270.3572,-338 270.3572,-338 305.8898,-338 305.8898,-338 311.8898,-338 317.8898,-344 317.8898,-350 317.8898,-350 317.8898,-362 317.8898,-362 317.8898,-368 311.8898,-374 305.8898,-374"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-360.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-343.4" font-family="Verdana" font-size="14.00" fill="#000000">Warn</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).Warn -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).Warn</title>
|
||||
<g id="a_edge6"><a xlink:title="at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).Warn]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.725,-356C155.3343,-356 210.8683,-356 248.2746,-356"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="248.3136,-359.5001 258.3136,-356 248.3135,-352.5001 248.3136,-359.5001"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/logger.Logger).WithFields -->
|
||||
<g id="node9" class="node">
|
||||
<title>(*github.com/go-i2p/logger.Logger).WithFields</title>
|
||||
<g id="a_node9"><a xlink:title="(*github.com/go-i2p/logger.Logger).WithFields | defined in log.go:60">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M319.3426,-435C319.3426,-435 256.9044,-435 256.9044,-435 250.9044,-435 244.9044,-429 244.9044,-423 244.9044,-423 244.9044,-411 244.9044,-411 244.9044,-405 250.9044,-399 256.9044,-399 256.9044,-399 319.3426,-399 319.3426,-399 325.3426,-399 331.3426,-405 331.3426,-411 331.3426,-411 331.3426,-423 331.3426,-423 331.3426,-429 325.3426,-435 319.3426,-435"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-421.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-404.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithFields -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithFields</title>
|
||||
<g id="a_edge9"><a xlink:title="at reseed_bootstrap.go:58: calling [(*github.com/go-i2p/logger.Logger).WithFields]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.725,-367.0466C151.1839,-376.6183 198.5195,-390.577 234.9071,-401.3072"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="234.2768,-404.7703 244.8585,-404.2417 236.2568,-398.0561 234.2768,-404.7703"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/sirupsen/logrus.Logger).Debug -->
|
||||
<g id="node10" class="node">
|
||||
<title>(*github.com/sirupsen/logrus.Logger).Debug</title>
|
||||
<g id="a_node10"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Debug | defined in logger.go:221">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M306.9455,-521C306.9455,-521 269.3015,-521 269.3015,-521 263.3015,-521 257.3015,-515 257.3015,-509 257.3015,-509 257.3015,-497 257.3015,-497 257.3015,-491 263.3015,-485 269.3015,-485 269.3015,-485 306.9455,-485 306.9455,-485 312.9455,-485 318.9455,-491 318.9455,-497 318.9455,-497 318.9455,-509 318.9455,-509 318.9455,-515 312.9455,-521 306.9455,-521"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-507.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-490.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/sirupsen/logrus.Logger).Debug -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/sirupsen/logrus.Logger).Debug</title>
|
||||
<g id="a_edge2"><a xlink:title="at reseed_bootstrap.go:43: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
|
||||
<path fill="none" stroke="#8b4513" d="M106.6294,-374.0251C143.6948,-400.3648 212.738,-449.4289 254.1541,-478.8604"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="252.3722,-481.8878 262.551,-484.8275 256.427,-476.1818 252.3722,-481.8878"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/sirupsen/logrus.Logger).Info -->
|
||||
<g id="node11" class="node">
|
||||
<title>(*github.com/sirupsen/logrus.Logger).Info</title>
|
||||
<g id="a_node11"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Info | defined in logger.go:225">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M305.6193,-582C305.6193,-582 270.6277,-582 270.6277,-582 264.6277,-582 258.6277,-576 258.6277,-570 258.6277,-570 258.6277,-558 258.6277,-558 258.6277,-552 264.6277,-546 270.6277,-546 270.6277,-546 305.6193,-546 305.6193,-546 311.6193,-546 317.6193,-552 317.6193,-558 317.6193,-558 317.6193,-570 317.6193,-570 317.6193,-576 311.6193,-582 305.6193,-582"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-568.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-551.4" font-family="Verdana" font-size="14.00" fill="#000000">Info</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/sirupsen/logrus.Logger).Info -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/sirupsen/logrus.Logger).Info</title>
|
||||
<g id="a_edge10"><a xlink:title="at reseed_bootstrap.go:62: calling [(*github.com/sirupsen/logrus.Logger).Info]">
|
||||
<path fill="none" stroke="#8b4513" d="M92.3256,-374.0399C114.3749,-408.7975 166.9292,-485.8578 227.5288,-534 234.1285,-539.243 241.7932,-543.9051 249.4061,-547.8995"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="248.0753,-551.1458 258.5915,-552.435 251.1745,-544.8692 248.0753,-551.1458"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed -->
|
||||
<g id="node12" class="node">
|
||||
<title>(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed</title>
|
||||
<g id="a_node12"><a xlink:title="(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed | defined in reseed.go:31">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M326.3271,-668C326.3271,-668 249.9199,-668 249.9199,-668 243.9199,-668 237.9199,-662 237.9199,-656 237.9199,-656 237.9199,-644 237.9199,-644 237.9199,-638 243.9199,-632 249.9199,-632 249.9199,-632 326.3271,-632 326.3271,-632 332.3271,-632 338.3271,-638 338.3271,-644 338.3271,-644 338.3271,-656 338.3271,-656 338.3271,-662 332.3271,-668 326.3271,-668"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-654.2" font-family="Verdana" font-size="14.00" fill="#000000">reseed</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-637.4" font-family="Verdana" font-size="14.00" fill="#000000">SingleReseed</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed</title>
|
||||
<g id="a_edge4"><a xlink:title="at reseed_bootstrap.go:49: calling [(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed]">
|
||||
<path fill="none" stroke="#8b4513" d="M89.919,-374.0435C110.3702,-415.6822 164.7136,-520.678 227.5288,-596 236.2167,-606.4176 246.9389,-616.6363 256.9371,-625.3325"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="254.8567,-628.1572 264.7475,-631.9549 259.3837,-622.8181 254.8567,-628.1572"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 23 KiB |
@@ -1,2 +1,4 @@
|
||||
//
|
||||
// provides generic interfaces for initial bootstrap into network and network reseeding
|
||||
//
|
||||
package bootstrap
|
||||
|
@@ -1,76 +0,0 @@
|
||||
package bootstrap
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/go-i2p/common/router_info"
|
||||
"github.com/go-i2p/go-i2p/lib/config"
|
||||
"github.com/go-i2p/go-i2p/lib/netdb/reseed"
|
||||
"github.com/go-i2p/logger"
|
||||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/samber/oops"
|
||||
)
|
||||
|
||||
var log = logger.GetGoI2PLogger()
|
||||
|
||||
// ReseedBootstrap implements the Bootstrap interface using HTTP reseeding
|
||||
type ReseedBootstrap struct {
|
||||
// Configuration containing reseed servers
|
||||
config *config.BootstrapConfig
|
||||
}
|
||||
|
||||
// NewReseedBootstrap creates a new reseeder with the provided configuration
|
||||
func NewReseedBootstrap(config *config.BootstrapConfig) *ReseedBootstrap {
|
||||
return &ReseedBootstrap{
|
||||
config: config,
|
||||
}
|
||||
}
|
||||
|
||||
// GetPeers implements the Bootstrap interface by obtaining RouterInfos
|
||||
// from configured reseed servers
|
||||
func (rb *ReseedBootstrap) GetPeers(ctx context.Context, n int) ([]router_info.RouterInfo, error) {
|
||||
var allRouterInfos []router_info.RouterInfo
|
||||
var lastErr error
|
||||
|
||||
// Try each reseed server until we get enough routerInfos or exhaust all servers
|
||||
for _, server := range rb.config.ReseedServers {
|
||||
// Check if context is canceled before making request
|
||||
if ctx.Err() != nil {
|
||||
return nil, oops.Errorf("reseed canceled: %v", ctx.Err())
|
||||
}
|
||||
|
||||
log.WithField("server", server.Url).Debug("Attempting to reseed from server")
|
||||
|
||||
// Use the existing Reseed implementation with a timeout context
|
||||
reseeder := reseed.NewReseed()
|
||||
|
||||
// Perform the actual reseeding operation synchronously
|
||||
serverRIs, err := reseeder.SingleReseed(server.Url)
|
||||
if err != nil {
|
||||
log.WithError(err).WithField("server", server.Url).Warn("Reseed attempt failed")
|
||||
lastErr = oops.Errorf("reseed from %s failed: %v", server.Url, err)
|
||||
continue
|
||||
}
|
||||
|
||||
// Add the retrieved RouterInfos to our collection
|
||||
allRouterInfos = append(allRouterInfos, serverRIs...)
|
||||
log.WithFields(logrus.Fields{
|
||||
"server": server.Url,
|
||||
"count": len(serverRIs),
|
||||
"total": len(allRouterInfos),
|
||||
}).Info("Successfully obtained router infos from reseed server")
|
||||
|
||||
// Check if we have enough RouterInfos
|
||||
if n > 0 && len(allRouterInfos) >= n {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// If we couldn't get any RouterInfos from any server, return the last error
|
||||
if len(allRouterInfos) == 0 && lastErr != nil {
|
||||
return nil, oops.Errorf("all reseed attempts failed: %w", lastErr)
|
||||
}
|
||||
|
||||
return allRouterInfos, nil
|
||||
}
|
18
lib/common/base32/base32.go
Normal file
18
lib/common/base32/base32.go
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// base32 encoding using I2P's alphabet
|
||||
//
|
||||
package base32
|
||||
|
||||
import (
|
||||
b32 "encoding/base32"
|
||||
)
|
||||
|
||||
var I2PEncoding *b32.Encoding = b32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567")
|
||||
|
||||
//
|
||||
// Return a go string of the I2P base32
|
||||
// encoding of the provided byte slice
|
||||
//
|
||||
func EncodeToString(data []byte) string {
|
||||
return I2PEncoding.EncodeToString(data)
|
||||
}
|
30
lib/common/base64/base64.go
Normal file
30
lib/common/base64/base64.go
Normal file
@@ -0,0 +1,30 @@
|
||||
//
|
||||
// base64 encoding using I2P's alphabet
|
||||
//
|
||||
package base64
|
||||
|
||||
import (
|
||||
b64 "encoding/base64"
|
||||
)
|
||||
|
||||
// i2p base64 alphabet
|
||||
const Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~"
|
||||
|
||||
// i2p base64 encoding
|
||||
var I2PEncoding *b64.Encoding = b64.NewEncoding(Alphabet)
|
||||
|
||||
//
|
||||
// Return a go string of the I2P base64
|
||||
// encoding of the provided byte slice
|
||||
//
|
||||
func EncodeToString(data []byte) string {
|
||||
return I2PEncoding.EncodeToString(data)
|
||||
}
|
||||
|
||||
//
|
||||
// decode string using i2p base64 encoding
|
||||
// returns error if data is malfromed
|
||||
//
|
||||
func DecodeFromString(str string) (d []byte, err error) {
|
||||
return I2PEncoding.DecodeString(str)
|
||||
}
|
139
lib/common/certificate.go
Normal file
139
lib/common/certificate.go
Normal file
@@ -0,0 +1,139 @@
|
||||
package common
|
||||
|
||||
/*
|
||||
I2P Certificate
|
||||
https://geti2p.net/spec/common-structures#certificate
|
||||
Accurate for version 0.9.24
|
||||
|
||||
+----+----+----+----+----+-//
|
||||
|type| length | payload
|
||||
+----+----+----+----+----+-//
|
||||
|
||||
type :: Integer
|
||||
length -> 1 byte
|
||||
|
||||
case 0 -> NULL
|
||||
case 1 -> HASHCASH
|
||||
case 2 -> HIDDEN
|
||||
case 3 -> SIGNED
|
||||
case 4 -> MULTIPLE
|
||||
case 5 -> KEY
|
||||
|
||||
length :: Integer
|
||||
length -> 2 bytes
|
||||
|
||||
payload :: data
|
||||
length -> $length bytes
|
||||
*/
|
||||
|
||||
import (
|
||||
"errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// Certificate Types
|
||||
const (
|
||||
CERT_NULL = iota
|
||||
CERT_HASHCASH
|
||||
CERT_HIDDEN
|
||||
CERT_SIGNED
|
||||
CERT_MULTIPLE
|
||||
CERT_KEY
|
||||
)
|
||||
|
||||
// Minimum size of a valid Certificate
|
||||
const (
|
||||
CERT_MIN_SIZE = 3
|
||||
)
|
||||
|
||||
type Certificate []byte
|
||||
|
||||
//
|
||||
// Return the Certificate Type specified in the first byte of the Certificate,
|
||||
// and an error if the certificate is shorter than the minimum certificate size.
|
||||
//
|
||||
func (certificate Certificate) Type() (cert_type int, err error) {
|
||||
cert_len := len(certificate)
|
||||
if cert_len < CERT_MIN_SIZE {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Certificate) Type",
|
||||
"certificate_bytes_length": cert_len,
|
||||
"reason": "too short (len < CERT_MIN_SIZE)",
|
||||
}).Error("invalid certificate")
|
||||
err = errors.New("error parsing certificate length: certificate is too short")
|
||||
return
|
||||
}
|
||||
cert_type = Integer([]byte{certificate[0]})
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Look up the length of the Certificate, reporting errors if the certificate is
|
||||
// shorter than the minimum certificate size or if the reported length doesn't
|
||||
// match the provided data.
|
||||
//
|
||||
func (certificate Certificate) Length() (length int, err error) {
|
||||
cert_len := len(certificate)
|
||||
_, err = certificate.Type()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
length = Integer(certificate[1:CERT_MIN_SIZE])
|
||||
inferred_len := length + CERT_MIN_SIZE
|
||||
if inferred_len > cert_len {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Certificate) Length",
|
||||
"certificate_bytes_length": cert_len,
|
||||
"certificate_length_field": length,
|
||||
"expected_bytes_length": inferred_len,
|
||||
"reason": "data shorter than specified",
|
||||
}).Warn("certificate format warning")
|
||||
err = errors.New("certificate parsing warning: certificate data is shorter than specified by length")
|
||||
} else if cert_len > inferred_len {
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Certificate) Length",
|
||||
"certificate_bytes_length": cert_len,
|
||||
"certificate_length_field": length,
|
||||
"expected_bytes_length": inferred_len,
|
||||
"reason": "data longer than expected",
|
||||
}).Warn("certificate format warning")
|
||||
err = errors.New("certificate parsing warning: certificate contains data beyond length")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Return the Certificate data and any errors encountered parsing the Certificate.
|
||||
//
|
||||
func (certificate Certificate) Data() (data []byte, err error) {
|
||||
length, err := certificate.Length()
|
||||
if err != nil {
|
||||
switch err.Error() {
|
||||
case "error parsing certificate length: certificate is too short":
|
||||
return
|
||||
case "certificate parsing warning: certificate data is shorter than specified by length":
|
||||
data = certificate[CERT_MIN_SIZE:]
|
||||
return
|
||||
case "certificate parsing warning: certificate contains data beyond length":
|
||||
data = certificate[CERT_MIN_SIZE : length+CERT_MIN_SIZE]
|
||||
return
|
||||
}
|
||||
}
|
||||
data = certificate[CERT_MIN_SIZE:]
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Read a Certificate from a slice of bytes, returning any extra data on the end of the slice
|
||||
// and any errors if a valid Certificate could not be read.
|
||||
//
|
||||
func ReadCertificate(data []byte) (certificate Certificate, remainder []byte, err error) {
|
||||
certificate = Certificate(data)
|
||||
length, err := certificate.Length()
|
||||
if err != nil && err.Error() == "certificate parsing warning: certificate contains data beyond length" {
|
||||
certificate = Certificate(data[:length+CERT_MIN_SIZE])
|
||||
remainder = data[length+CERT_MIN_SIZE:]
|
||||
err = nil
|
||||
}
|
||||
return
|
||||
}
|
148
lib/common/certificate_test.go
Normal file
148
lib/common/certificate_test.go
Normal file
@@ -0,0 +1,148 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestCertificateTypeIsFirstByte(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x00}
|
||||
certificate := Certificate(bytes)
|
||||
cert_type, err := certificate.Type()
|
||||
|
||||
assert.Equal(cert_type, 3, "certificate.Type() should be the first bytes in a certificate")
|
||||
assert.Nil(err)
|
||||
}
|
||||
|
||||
func TestCertificateLengthCorrect(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x02, 0xff, 0xff}
|
||||
certificate := Certificate(bytes)
|
||||
cert_len, err := certificate.Length()
|
||||
|
||||
assert.Equal(cert_len, 2, "certificate.Length() should return integer from second two bytes")
|
||||
assert.Nil(err)
|
||||
}
|
||||
|
||||
func TestCertificateLengthErrWhenTooShort(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x01}
|
||||
certificate := Certificate(bytes)
|
||||
cert_len, err := certificate.Length()
|
||||
|
||||
assert.Equal(cert_len, 0, "certificate.Length() did not return zero length for missing length data")
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("error parsing certificate length: certificate is too short", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCertificateLengthErrWhenDataTooShort(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x02, 0xff}
|
||||
certificate := Certificate(bytes)
|
||||
cert_len, err := certificate.Length()
|
||||
|
||||
assert.Equal(cert_len, 2, "certificate.Length() did not return indicated length when data was actually missing")
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("certificate parsing warning: certificate data is shorter than specified by length", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCertificateDataWhenCorrectSize(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x01, 0xaa}
|
||||
certificate := Certificate(bytes)
|
||||
cert_data, err := certificate.Data()
|
||||
|
||||
assert.Nil(err, "certificate.Data() returned error with valid data")
|
||||
cert_len := len(cert_data)
|
||||
assert.Equal(cert_len, 1, "certificate.Length() did not return indicated length when data was valid")
|
||||
assert.Equal(170, int(cert_data[0]), "certificate.Data() returned incorrect data")
|
||||
}
|
||||
|
||||
func TestCertificateDataWhenTooLong(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x02, 0xff, 0xff, 0xaa, 0xaa}
|
||||
certificate := Certificate(bytes)
|
||||
cert_data, err := certificate.Data()
|
||||
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("certificate parsing warning: certificate contains data beyond length", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
cert_len := len(cert_data)
|
||||
assert.Equal(cert_len, 2, "certificate.Length() did not return indicated length when data was too long")
|
||||
if cert_data[0] != 0xff || cert_data[1] != 0xff {
|
||||
t.Fatal("certificate.Data() returned incorrect data when data was too long")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCertificateDataWhenTooShort(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x02, 0xff}
|
||||
certificate := Certificate(bytes)
|
||||
cert_data, err := certificate.Data()
|
||||
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("certificate parsing warning: certificate data is shorter than specified by length", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
cert_len := len(cert_data)
|
||||
assert.Equal(cert_len, 1, "certificate.Data() did not return correct amount of data when data too short")
|
||||
assert.Equal(255, int(cert_data[0]), "certificate.Data() did not return correct data values when data was too short")
|
||||
}
|
||||
|
||||
func TestReadCertificateWithCorrectData(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x00, 0x00, 0x02, 0xff, 0xff}
|
||||
cert, remainder, err := ReadCertificate(bytes)
|
||||
|
||||
assert.Equal(len(cert), 5, "ReadCertificate() did not return correct amount of data for valid certificate")
|
||||
assert.Equal(len(remainder), 0, "ReadCertificate() did not return a zero length remainder on a valid certificate")
|
||||
assert.Nil(err, "ReadCertificate() should not return an error with valid data")
|
||||
}
|
||||
|
||||
func TestReadCertificateWithDataTooShort(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x00, 0x00, 0x02, 0xff}
|
||||
cert, remainder, err := ReadCertificate(bytes)
|
||||
|
||||
assert.Equal(len(cert), 4, "ReadCertificate() did not return correct amount of data for certificate with missing data")
|
||||
assert.Equal(len(remainder), 0, "ReadCertificate() did not return a zero length remainder on certificate with missing data")
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("certificate parsing warning: certificate data is shorter than specified by length", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadCertificateWithRemainder(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x00, 0x00, 0x02, 0xff, 0xff, 0x01}
|
||||
cert, remainder, err := ReadCertificate(bytes)
|
||||
|
||||
assert.Equal(len(cert), 5, "ReadCertificate() did not return correct amount of data for certificate with extra data")
|
||||
assert.Equal(len(remainder), 1, "ReadCertificate() returned incorrect length remainder on certificate with extra data")
|
||||
assert.Equal(1, int(remainder[0]), "ReadCertificate() did not return correct remainder value")
|
||||
assert.Nil(err)
|
||||
}
|
||||
|
||||
func TestReadCertificateWithInvalidLength(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x00, 0x00}
|
||||
cert, remainder, err := ReadCertificate(bytes)
|
||||
|
||||
assert.Equal(len(cert), 2, "ReadCertificate() should populate the certificate with the provided data even when invalid")
|
||||
assert.Equal(len(remainder), 0, "ReadCertificate() returned non-zero length remainder on invalid certificate")
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("error parsing certificate length: certificate is too short", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
}
|
24
lib/common/date.go
Normal file
24
lib/common/date.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package common
|
||||
|
||||
/*
|
||||
I2P Date
|
||||
https://geti2p.net/spec/common-structures#date
|
||||
Accurate for version 0.9.24
|
||||
*/
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type Date [8]byte
|
||||
|
||||
//
|
||||
// Time takes the value stored in date as an 8 byte big-endian integer representing the
|
||||
// number of milliseconds since the beginning of unix time and converts it to a Go time.Time
|
||||
// struct.
|
||||
//
|
||||
func (date Date) Time() (date_time time.Time) {
|
||||
seconds := Integer(date[:])
|
||||
date_time = time.Unix(0, int64(seconds*1000000))
|
||||
return
|
||||
}
|
15
lib/common/date_test.go
Normal file
15
lib/common/date_test.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestTimeFromMiliseconds(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
next_day := Date{0x00, 0x00, 0x00, 0x00, 0x05, 0x26, 0x5c, 0x00}
|
||||
go_time := next_day.Time()
|
||||
|
||||
assert.Equal(int64(86400), go_time.Unix(), "Date.Time() did not parse time in milliseconds")
|
||||
}
|
57
lib/common/destination.go
Normal file
57
lib/common/destination.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package common
|
||||
|
||||
/*
|
||||
I2P Destination
|
||||
https://geti2p.net/spec/common-structures#destination
|
||||
Accurate for version 0.9.24
|
||||
|
||||
Identical to KeysAndCert
|
||||
*/
|
||||
|
||||
import (
|
||||
"github.com/go-i2p/go-i2p/lib/common/base32"
|
||||
"github.com/go-i2p/go-i2p/lib/common/base64"
|
||||
"github.com/go-i2p/go-i2p/lib/crypto"
|
||||
"strings"
|
||||
)
|
||||
|
||||
//
|
||||
// A Destination is a KeysAndCert with functionallity
|
||||
// for generating base32 and base64 addresses.
|
||||
//
|
||||
type Destination []byte
|
||||
|
||||
func (destination Destination) PublicKey() (crypto.PublicKey, error) {
|
||||
return KeysAndCert(destination).PublicKey()
|
||||
}
|
||||
|
||||
func (destination Destination) SigningPublicKey() (crypto.SigningPublicKey, error) {
|
||||
return KeysAndCert(destination).SigningPublicKey()
|
||||
}
|
||||
|
||||
func (destination Destination) Certificate() (Certificate, error) {
|
||||
return KeysAndCert(destination).Certificate()
|
||||
}
|
||||
|
||||
func ReadDestination(data []byte) (destination Destination, remainder []byte, err error) {
|
||||
keys_and_cert, remainder, err := ReadKeysAndCert(data)
|
||||
destination = Destination(keys_and_cert)
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Generate the I2P base32 address for this Destination.
|
||||
//
|
||||
func (destination Destination) Base32Address() (str string) {
|
||||
hash := crypto.SHA256(destination)
|
||||
str = strings.Trim(base32.EncodeToString(hash[:]), "=")
|
||||
str = str + ".b32.i2p"
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Generate the I2P base64 address for this Destination.
|
||||
//
|
||||
func (destination Destination) Base64() string {
|
||||
return base64.EncodeToString(destination)
|
||||
}
|
13
lib/common/fuzz/Dockerfile
Normal file
13
lib/common/fuzz/Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
||||
FROM golang
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get upgrade -y
|
||||
|
||||
RUN go get github.com/dvyukov/go-fuzz/go-fuzz
|
||||
RUN go get github.com/dvyukov/go-fuzz/go-fuzz-build
|
||||
RUN go get github.com/hkparker/go-i2p
|
||||
RUN go get github.com/ddollar/forego
|
||||
|
||||
WORKDIR /go/src/github.com/hkparker/go-i2p
|
||||
|
||||
ENTRYPOINT ["make", "fuzz"]
|
8
lib/common/fuzz/Makefile
Normal file
8
lib/common/fuzz/Makefile
Normal file
@@ -0,0 +1,8 @@
|
||||
fuzz:
|
||||
go-fuzz-build -o keys_and_cert/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/keys_and_cert
|
||||
go-fuzz-build -o certificate/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/certificate
|
||||
go-fuzz-build -o destination/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/destination
|
||||
go-fuzz-build -o router_address/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/router_address
|
||||
go-fuzz-build -o router_identity/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/router_identity
|
||||
go-fuzz-build -o string/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/string
|
||||
forego start
|
6
lib/common/fuzz/Procfile
Normal file
6
lib/common/fuzz/Procfile
Normal file
@@ -0,0 +1,6 @@
|
||||
keys_and_cert: go-fuzz -bin=keys_and_cert/exportable-fuzz.zip -workdir=lib/common/fuzz/keys_and_cert -procs=2
|
||||
certificate: go-fuzz -bin=certificate/exportable-fuzz.zip -workdir=lib/common/fuzz/certificate -procs=2
|
||||
destination: go-fuzz -bin=destination/exportable-fuzz.zip -workdir=lib/common/fuzz/destination -procs=2
|
||||
router_address: go-fuzz -bin=router_address/exportable-fuzz.zip -workdir=lib/common/fuzz/router_address -procs=2
|
||||
router_identity: go-fuzz -bin=router_identity/exportable-fuzz.zip -workdir=lib/common/fuzz/router_identity -procs=2
|
||||
string: go-fuzz -bin=string/exportable-fuzz.zip -workdir=lib/common/fuzz/string -procs=2
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
|
Binary file not shown.
BIN
lib/common/fuzz/certificate/corpus/test-input-1
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/certificate/corpus/test-input-10
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-10
Normal file
Binary file not shown.
BIN
lib/common/fuzz/certificate/corpus/test-input-2
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-2
Normal file
Binary file not shown.
1
lib/common/fuzz/certificate/corpus/test-input-3
Normal file
1
lib/common/fuzz/certificate/corpus/test-input-3
Normal file
@@ -0,0 +1 @@
|
||||
|
BIN
lib/common/fuzz/certificate/corpus/test-input-4
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-4
Normal file
Binary file not shown.
BIN
lib/common/fuzz/certificate/corpus/test-input-5
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-5
Normal file
Binary file not shown.
BIN
lib/common/fuzz/certificate/corpus/test-input-6
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-6
Normal file
Binary file not shown.
BIN
lib/common/fuzz/certificate/corpus/test-input-7
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-7
Normal file
Binary file not shown.
BIN
lib/common/fuzz/certificate/corpus/test-input-8
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-8
Normal file
Binary file not shown.
BIN
lib/common/fuzz/certificate/corpus/test-input-9
Normal file
BIN
lib/common/fuzz/certificate/corpus/test-input-9
Normal file
Binary file not shown.
11
lib/common/fuzz/certificate/fuzz.go
Normal file
11
lib/common/fuzz/certificate/fuzz.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package exportable
|
||||
|
||||
import "github.com/go-i2p/go-i2p/lib/common"
|
||||
|
||||
func Fuzz(data []byte) int {
|
||||
cert := common.Certificate(data)
|
||||
cert.Data()
|
||||
cert.Length()
|
||||
cert.Type()
|
||||
return 0
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
|
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-1
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-128
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-128
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-128-1
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-128-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-128-2
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-128-2
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-128-3
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-128-3
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-2
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-2
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-256
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-256
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-256-1
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-256-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-256-2
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-256-2
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-256-3
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-256-3
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-3
Normal file
BIN
lib/common/fuzz/destination/corpus/corpus/test-input-3
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/test-input-128-256-1
Normal file
BIN
lib/common/fuzz/destination/corpus/test-input-128-256-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/test-input-128-256-2
Normal file
BIN
lib/common/fuzz/destination/corpus/test-input-128-256-2
Normal file
Binary file not shown.
BIN
lib/common/fuzz/destination/corpus/test-input-128-256-3
Normal file
BIN
lib/common/fuzz/destination/corpus/test-input-128-256-3
Normal file
Binary file not shown.
10
lib/common/fuzz/destination/fuzz.go
Normal file
10
lib/common/fuzz/destination/fuzz.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package exportable
|
||||
|
||||
import "github.com/go-i2p/go-i2p/lib/common"
|
||||
|
||||
func Fuzz(data []byte) int {
|
||||
destination := common.Destination(data)
|
||||
destination.Base32Address()
|
||||
destination.Base64()
|
||||
return 0
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
|
Binary file not shown.
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-1
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-1
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-2
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-2
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-256-1
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-256-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-256-2
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-256-2
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-256-3
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-256-3
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-3
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-128-3
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-2
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-2
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-256
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-256
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-256-1
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-256-1
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-256-2
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-256-2
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-256-3
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-256-3
Normal file
Binary file not shown.
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-3
Normal file
BIN
lib/common/fuzz/keys_and_cert/corpus/test-input-3
Normal file
Binary file not shown.
11
lib/common/fuzz/keys_and_cert/fuzz.go
Normal file
11
lib/common/fuzz/keys_and_cert/fuzz.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package exportable
|
||||
|
||||
import "github.com/go-i2p/go-i2p/lib/common"
|
||||
|
||||
func Fuzz(data []byte) int {
|
||||
keys_and_cert, _, _ := common.ReadKeysAndCert(data)
|
||||
keys_and_cert.Certificate()
|
||||
keys_and_cert.PublicKey()
|
||||
keys_and_cert.SigningPublicKey()
|
||||
return 0
|
||||
}
|
Binary file not shown.
@@ -0,0 +1 @@
|
||||
in literal
|
@@ -0,0 +1 @@
|
||||
i
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user