Merge pull request #31 from go-i2p/ntcp

NTCP2 Handshake Development
This commit is contained in:
idk
2025-03-21 15:48:13 -04:00
committed by GitHub
164 changed files with 23401 additions and 1525 deletions

3
.gitignore vendored
View File

@ -9,3 +9,6 @@ go-i2p
.idea/
router.info
log
*.gv
diff
err

View File

@ -1,20 +1,35 @@
# Contributing
Thanks for taking a look at go-i2p! Please reach out if you have any questions or need help getting started.
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.
## Getting Starting
## Getting Started
Install required dependencies
This example assumes Ubuntu 16.04
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.
```sh
go get github.com/hkparker/go-i2p
go get github.com/Sirupsen/logrus
go get github.com/stretchr/testify/assert
# 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
```
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).
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.
## I2P Specifications
@ -26,9 +41,17 @@ 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. 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. 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:
```go
log.WithFields(log.Fields{
@ -56,4 +79,4 @@ func TestRouterAddressCountReturnsCorrectCount(t *testing.T) {
## Pull Requests
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.
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.

View File

@ -64,9 +64,5 @@ info:
release:
github-release release -u go-i2p -r go-i2p -n "${RELEASE_VERSION}" -t "${RELEASE_TAG}" -d "${RELEASE_DESCRIPTION}" -p
callvis:
go-callvis -format svg -focus upgrade -group pkg,type -limit github.com/go-i2p/go-i2p github.com/go-i2p/go-i2p
godoc:
find lib -type d -exec bash -c "ls {}/*.go && godocdown -o ./{}/doc.md ./{}" \;
./callgraph.sh

View File

@ -15,9 +15,7 @@ please keep up with these changes, as they will not be backward compatible and r
- [ ] Datagrams
- [ ] I2CP
- [ ] Message routing
- [ ] SAM
- [ ] Streaming
- [ ] Tunnel Manager
- Cryptographic primitives
- Signing
- [ ] ECDSA_SHA256_P256

19
callgraph.sh Executable file
View File

@ -0,0 +1,19 @@
#! /usr/bin/env sh
dirs=$(find lib/ -type d)
for dir in $dirs; do
files=$(find "$dir" -maxdepth 1 -type f -name "*.go")
#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"
git mv -v "$dir/doc.md" "$dir/README.md"
godocdown -template template.md -o "$dir/README.md" "./$dir"
git add -v "$dir/$package.svg" "$dir/README.md"
done

43
go.mod
View File

@ -1,43 +1,50 @@
module github.com/go-i2p/go-i2p
go 1.23.1
go 1.23.3
toolchain go1.23.5
require (
github.com/beevik/ntp v1.4.3
github.com/emirpasic/gods v1.18.1
github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e
github.com/flynn/noise v1.1.0
github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c
github.com/samber/oops v1.16.1
github.com/sirupsen/logrus v1.9.3
github.com/spf13/cobra v1.8.1
github.com/spf13/cobra v1.9.1
github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.9.0
go.step.sm/crypto v0.53.0
golang.org/x/crypto v0.27.0
github.com/stretchr/testify v1.10.0
go.step.sm/crypto v0.58.1
golang.org/x/crypto v0.35.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/fsnotify/fsnotify v1.7.0 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/magiconair/properties v1.8.9 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/oklog/ulid/v2 v2.1.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/locafero v0.7.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/samber/lo v1.49.1 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.7.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/afero v1.12.0 // indirect
github.com/spf13/cast v1.7.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/net v0.29.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/text v0.18.0 // indirect
go.opentelemetry.io/otel v1.34.0 // indirect
go.opentelemetry.io/otel/trace v1.34.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect
golang.org/x/net v0.35.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.22.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
)

92
go.sum
View File

@ -2,7 +2,7 @@ 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.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@ -15,10 +15,12 @@ github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
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.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
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/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@ -30,71 +32,73 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU=
github.com/oklog/ulid/v2 v2.1.0/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.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
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.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew=
github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o=
github.com/samber/oops v1.16.1 h1:XlKkXsWM5g8hE4C+sEV9n0X282fZn3XabVmAKU2RiHI=
github.com/samber/oops v1.16.1/go.mod h1:8eXgMAJcDXRAijQsFRhfy/EHDOTiSvwkg6khFqFK078=
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.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
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 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
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.step.sm/crypto v0.53.0 h1:+1as1ogzuCzx15/468M4mEC5juogI5a0Fzbsyh1CuYY=
go.step.sm/crypto v0.53.0/go.mod h1:AqLU78RqNUHepLzyOWZuNN/2++Lu7dZENdO9UzWOGSk=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
go.step.sm/crypto v0.58.1 h1:2PpEYTbytA3el9dW0gh9uJEe/CR/J6wS+x2vWYLG83M=
go.step.sm/crypto v0.58.1/go.mod h1:yluOL5OqY7mXGGQ7JUmAv/6h8T8Ge3yXdlEESWHOqDQ=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4=
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
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/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
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=

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/bootstrap"
![bootstrap.svg](bootstrap.svg)
provides generic interfaces for initial bootstrap into network and network
### reseeding
@ -21,3 +23,9 @@ type Bootstrap interface {
```
interface defining a way to bootstrap into the i2p network
bootstrap
github.com/go-i2p/go-i2p/lib/bootstrap

View File

@ -0,0 +1,13 @@
<?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="0pt" height="0pt"
viewBox="0.00 0.00 0.00 0.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 0)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,0 0,0 0,0 0,0"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 584 B

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/base32"
![base32.svg](base32.svg)
Package base32 implmenets utilities for encoding and decoding text using I2P's
### alphabet
@ -31,3 +33,9 @@ DecodeString decodes base64 string to []byte I2PEncoding
func EncodeToString(data []byte) string
```
EncodeToString encodes []byte to a base32 string using I2PEncoding
base32
github.com/go-i2p/go-i2p/lib/common/base32

View File

@ -0,0 +1,13 @@
<?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="0pt" height="0pt"
viewBox="0.00 0.00 0.00 0.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 0)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,0 0,0 0,0 0,0"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 584 B

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/base64"
![base64.svg](base64.svg)
Package base64 implmenets utilities for encoding and decoding text using I2P's
### alphabet
@ -31,3 +33,9 @@ DecodeString decodes base64 string to []byte I2PEncoding
func EncodeToString(data []byte) string
```
I2PEncoding is the standard base64 encoding used through I2P.
base64
github.com/go-i2p/go-i2p/lib/common/base64

View File

@ -0,0 +1,13 @@
<?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="0pt" height="0pt"
viewBox="0.00 0.00 0.00 0.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 0)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,0 0,0 0,0 0,0"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 584 B

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/common/certificate"
![certificate.svg](certificate.svg)
## Usage
@ -23,6 +26,12 @@ const CERT_MIN_SIZE = 3
CERT_MIN_SIZE is the minimum size of a valid Certificate in []byte 1 byte for
type 2 bytes for payload length
#### func GetSignatureTypeFromCertificate
```go
func GetSignatureTypeFromCertificate(cert Certificate) (int, error)
```
#### type Certificate
```go
@ -37,10 +46,22 @@ https://geti2p.net/spec/common-structures#certificate
#### func NewCertificate
```go
func NewCertificate(data []byte) (certificate Certificate, err error)
func NewCertificate() *Certificate
```
NewCertificate creates a new Certficiate from []byte returns err if the
certificate is too short or if the payload doesn't match specified length.
NewCertificate creates a new Certificate with default NULL type
#### func NewCertificateDeux
```go
func NewCertificateDeux(certType int, payload []byte) (*Certificate, error)
```
#### func NewCertificateWithType
```go
func NewCertificateWithType(certType uint8, payload []byte) (*Certificate, error)
```
NewCertificateWithType creates a new Certificate with specified type and payload
#### func ReadCertificate
@ -96,3 +117,9 @@ func (c *Certificate) Type() (cert_type int)
```
Type returns the Certificate type specified in the first byte of the
Certificate,
certificate
github.com/go-i2p/go-i2p/lib/common/certificate

View File

@ -4,13 +4,13 @@ package certificate
import (
"encoding/binary"
"errors"
"fmt"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
// log "github.com/sirupsen/logrus"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
. "github.com/go-i2p/go-i2p/lib/common/data"
)
@ -158,7 +158,7 @@ func readCertificate(data []byte) (certificate Certificate, err error) {
"certificate_bytes_length": len(data),
"reason": "too short (len < CERT_MIN_SIZE)" + fmt.Sprintf("%d", certificate.kind.Int()),
}).Error("invalid certificate, empty")
err = fmt.Errorf("error parsing certificate: certificate is empty")
err = oops.Errorf("error parsing certificate: certificate is empty")
return
case 1, 2:
certificate.kind = Integer(data[0 : len(data)-1])
@ -168,7 +168,7 @@ func readCertificate(data []byte) (certificate Certificate, err error) {
"certificate_bytes_length": len(data),
"reason": "too short (len < CERT_MIN_SIZE)" + fmt.Sprintf("%d", certificate.kind.Int()),
}).Error("invalid certificate, too short")
err = fmt.Errorf("error parsing certificate: certificate is too short")
err = oops.Errorf("error parsing certificate: certificate is too short")
return
default:
certificate.kind = Integer(data[0:1])
@ -176,7 +176,7 @@ func readCertificate(data []byte) (certificate Certificate, err error) {
payloadLength := len(data) - CERT_MIN_SIZE
certificate.payload = data[CERT_MIN_SIZE:]
if certificate.len.Int() > len(data)-CERT_MIN_SIZE {
err = fmt.Errorf("certificate parsing warning: certificate data is shorter than specified by length")
err = oops.Errorf("certificate parsing warning: certificate data is shorter than specified by length")
log.WithFields(logrus.Fields{
"at": "(Certificate) NewCertificate",
"certificate_bytes_length": certificate.len.Int(),
@ -222,12 +222,12 @@ func NewCertificate() *Certificate {
func NewCertificateDeux(certType int, payload []byte) (*Certificate, error) {
if certType < 0 || certType > 255 {
return nil, fmt.Errorf("invalid certificate type: %d", certType)
return nil, oops.Errorf("invalid certificate type: %d", certType)
}
certTypeByte := byte(certType)
if len(payload) > 65535 {
return nil, fmt.Errorf("payload too long: %d bytes", len(payload))
return nil, oops.Errorf("payload too long: %d bytes", len(payload))
}
_len, err := NewIntegerFromInt(len(payload), 2)
@ -255,12 +255,12 @@ func NewCertificateWithType(certType uint8, payload []byte) (*Certificate, error
case CERT_NULL, CERT_HASHCASH, CERT_HIDDEN, CERT_SIGNED, CERT_MULTIPLE, CERT_KEY:
// Valid type
default:
return nil, fmt.Errorf("invalid certificate type: %d", certType)
return nil, oops.Errorf("invalid certificate type: %d", certType)
}
// For NULL certificates, payload should be empty
if certType == CERT_NULL && len(payload) > 0 {
return nil, errors.New("NULL certificates must have empty payload")
return nil, oops.Errorf("NULL certificates must have empty payload")
}
length, _ := NewIntegerFromInt(len(payload), 2)
@ -280,10 +280,10 @@ func NewCertificateWithType(certType uint8, payload []byte) (*Certificate, error
func GetSignatureTypeFromCertificate(cert Certificate) (int, error) {
if cert.Type() != CERT_KEY {
return 0, fmt.Errorf("unexpected certificate type: %d", cert.Type())
return 0, oops.Errorf("unexpected certificate type: %d", cert.Type())
}
if len(cert.payload) < 4 {
return 0, fmt.Errorf("certificate payload too short to contain signature type")
return 0, oops.Errorf("certificate payload too short to contain signature type")
}
sigType := int(binary.BigEndian.Uint16(cert.payload[2:4])) // Changed offset to read signing key type
return sigType, nil

View File

@ -0,0 +1,617 @@
<?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="1146pt" height="928pt"
viewBox="0.00 0.00 1146.34 928.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 928)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-928 1146.344,-928 1146.344,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-920 1138.344,-920 1138.344,-8 8,-8"/>
<text text-anchor="middle" x="573.172" y="-899.8" font-family="Arial" font-size="18.00" fill="#000000">certificate</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer</title>
<g id="a_clust5"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M1038.4239,-407C1038.4239,-407 1086.3103,-407 1086.3103,-407 1092.3103,-407 1098.3103,-413 1098.3103,-419 1098.3103,-419 1098.3103,-534 1098.3103,-534 1098.3103,-540 1092.3103,-546 1086.3103,-546 1086.3103,-546 1038.4239,-546 1038.4239,-546 1032.4239,-546 1026.4239,-540 1026.4239,-534 1026.4239,-534 1026.4239,-419 1026.4239,-419 1026.4239,-413 1032.4239,-407 1038.4239,-407"/>
<text text-anchor="middle" x="1062.3671" y="-415.5" font-family="Arial" font-size="15.00" fill="#222222">(Integer)</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="M1035.7065,-262C1035.7065,-262 1090.0277,-262 1090.0277,-262 1096.0277,-262 1102.0277,-268 1102.0277,-274 1102.0277,-274 1102.0277,-328 1102.0277,-328 1102.0277,-334 1096.0277,-340 1090.0277,-340 1090.0277,-340 1035.7065,-340 1035.7065,-340 1029.7065,-340 1023.7065,-334 1023.7065,-328 1023.7065,-328 1023.7065,-274 1023.7065,-274 1023.7065,-268 1029.7065,-262 1035.7065,-262"/>
<text text-anchor="middle" x="1062.8671" y="-270.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&#45;i2p/logger.Logger</title>
<g id="a_clust3"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M1023.2577,-619C1023.2577,-619 1101.4765,-619 1101.4765,-619 1107.4765,-619 1113.4765,-625 1113.4765,-631 1113.4765,-631 1113.4765,-807 1113.4765,-807 1113.4765,-813 1107.4765,-819 1101.4765,-819 1101.4765,-819 1023.2577,-819 1023.2577,-819 1017.2577,-819 1011.2577,-813 1011.2577,-807 1011.2577,-807 1011.2577,-631 1011.2577,-631 1011.2577,-625 1017.2577,-619 1023.2577,-619"/>
<text text-anchor="middle" x="1062.3671" y="-627.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&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate">
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M322.261,-285C322.261,-285 866.0844,-285 866.0844,-285 872.0844,-285 878.0844,-291 878.0844,-297 878.0844,-297 878.0844,-534 878.0844,-534 878.0844,-540 872.0844,-546 866.0844,-546 866.0844,-546 322.261,-546 322.261,-546 316.261,-546 310.261,-540 310.261,-534 310.261,-534 310.261,-297 310.261,-297 310.261,-291 316.261,-285 322.261,-285"/>
<text text-anchor="middle" x="594.1727" y="-293.5" font-family="Arial" font-size="15.00" fill="#222222">(*Certificate)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate | defined in certificate.go:150&#10;at certificate.go:194: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:160: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at certificate.go:170: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at certificate.go:188: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at certificate.go:161: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:171: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:179: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:159: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:169: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:178: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:182: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:192: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:193: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:156: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:166: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:180: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:191: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M879.924,-615C879.924,-615 796.587,-615 796.587,-615 790.587,-615 784.587,-609 784.587,-603 784.587,-603 784.587,-591 784.587,-591 784.587,-585 790.587,-579 796.587,-579 796.587,-579 879.924,-579 879.924,-579 885.924,-579 891.924,-585 891.924,-591 891.924,-591 891.924,-603 891.924,-603 891.924,-609 885.924,-615 879.924,-615"/>
<text text-anchor="middle" x="838.2555" y="-592.8" font-family="Verdana" font-size="14.00" fill="#000000">readCertificate</text>
</a>
</g>
</g>
<!-- github.com/samber/oops.Errorf -->
<g id="node2" class="node">
<title>github.com/samber/oops.Errorf</title>
<g id="a_node2"><a xlink:title="github.com/samber/oops.Errorf | defined in oops.go:34">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M1079.5624,-129C1079.5624,-129 1045.1718,-129 1045.1718,-129 1039.1718,-129 1033.1718,-123 1033.1718,-117 1033.1718,-117 1033.1718,-105 1033.1718,-105 1033.1718,-99 1039.1718,-93 1045.1718,-93 1045.1718,-93 1079.5624,-93 1079.5624,-93 1085.5624,-93 1091.5624,-99 1091.5624,-105 1091.5624,-105 1091.5624,-117 1091.5624,-117 1091.5624,-123 1085.5624,-129 1079.5624,-129"/>
<text text-anchor="middle" x="1062.3671" y="-115.2" font-family="Verdana" font-size="14.00" fill="#000000">oops</text>
<text text-anchor="middle" x="1062.3671" y="-98.4" font-family="Verdana" font-size="14.00" fill="#000000">Errorf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge17" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge17"><a xlink:title="at certificate.go:161: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:171: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:179: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M887.6922,-578.8268C900.2566,-572.1105 912.6559,-563.2952 921.3902,-552 962.8333,-498.4057 971.7912,-319.8683 994.3902,-256 1009.3883,-213.6131 1032.5644,-166.915 1047.601,-138.2675"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1050.7756,-139.7516 1052.3648,-129.2766 1044.5902,-136.4742 1050.7756,-139.7516"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="node17" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_node17"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithFields | defined in log.go:60">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M1093.5862,-750C1093.5862,-750 1031.148,-750 1031.148,-750 1025.148,-750 1019.148,-744 1019.148,-738 1019.148,-738 1019.148,-726 1019.148,-726 1019.148,-720 1025.148,-714 1031.148,-714 1031.148,-714 1093.5862,-714 1093.5862,-714 1099.5862,-714 1105.5862,-720 1105.5862,-726 1105.5862,-726 1105.5862,-738 1105.5862,-738 1105.5862,-744 1099.5862,-750 1093.5862,-750"/>
<text text-anchor="middle" x="1062.3671" y="-736.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="1062.3671" y="-719.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge39" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge39"><a xlink:title="at certificate.go:156: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:166: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:180: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:191: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M862.2851,-615.121C892.2409,-637.2428 945.472,-675.0325 994.3902,-702 999.262,-704.6857 1004.4214,-707.3179 1009.6333,-709.8383"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1008.4809,-713.1637 1019.0207,-714.242 1011.4538,-706.8263 1008.4809,-713.1637"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="node19" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_node19"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Error | defined in log.go:42">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M1080.1334,-689C1080.1334,-689 1044.6008,-689 1044.6008,-689 1038.6008,-689 1032.6008,-683 1032.6008,-677 1032.6008,-677 1032.6008,-665 1032.6008,-665 1032.6008,-659 1038.6008,-653 1044.6008,-653 1044.6008,-653 1080.1334,-653 1080.1334,-653 1086.1334,-653 1092.1334,-659 1092.1334,-665 1092.1334,-665 1092.1334,-677 1092.1334,-677 1092.1334,-683 1086.1334,-689 1080.1334,-689"/>
<text text-anchor="middle" x="1062.3671" y="-675.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="1062.3671" y="-658.4" font-family="Verdana" font-size="14.00" fill="#000000">Error</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge16" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge16"><a xlink:title="at certificate.go:160: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at certificate.go:170: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at certificate.go:188: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M891.9358,-614.7248C932.1804,-628.0133 986.3626,-645.9039 1022.7345,-657.9136"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1021.9014,-661.3243 1032.4946,-661.1363 1024.0963,-654.6773 1021.9014,-661.3243"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Logger).Debug -->
<g id="node20" class="node">
<title>(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_node20"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Debug | defined in logger.go:221">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M1081.1891,-332C1081.1891,-332 1043.5451,-332 1043.5451,-332 1037.5451,-332 1031.5451,-326 1031.5451,-320 1031.5451,-320 1031.5451,-308 1031.5451,-308 1031.5451,-302 1037.5451,-296 1043.5451,-296 1043.5451,-296 1081.1891,-296 1081.1891,-296 1087.1891,-296 1093.1891,-302 1093.1891,-308 1093.1891,-308 1093.1891,-320 1093.1891,-320 1093.1891,-326 1087.1891,-332 1081.1891,-332"/>
<text text-anchor="middle" x="1062.3671" y="-318.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="1062.3671" y="-301.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge2"><a xlink:title="at certificate.go:194: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M883.6249,-578.925C896.9934,-571.9937 910.8476,-563.037 921.3902,-552 972.8783,-498.0971 954.9975,-464.2831 994.3902,-401 1007.8831,-379.3241 1025.7385,-356.651 1039.7636,-339.887"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1042.5136,-342.0555 1046.305,-332.1623 1037.1716,-337.5318 1042.5136,-342.0555"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="node21" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_node21"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int | defined in integer.go:32">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M1077.3671,-538C1077.3671,-538 1047.3671,-538 1047.3671,-538 1041.3671,-538 1035.3671,-532 1035.3671,-526 1035.3671,-526 1035.3671,-514 1035.3671,-514 1035.3671,-508 1041.3671,-502 1047.3671,-502 1047.3671,-502 1077.3671,-502 1077.3671,-502 1083.3671,-502 1089.3671,-508 1089.3671,-514 1089.3671,-514 1089.3671,-526 1089.3671,-526 1089.3671,-532 1083.3671,-538 1077.3671,-538"/>
<text text-anchor="middle" x="1062.3671" y="-524.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="1062.3671" y="-507.4" font-family="Verdana" font-size="14.00" fill="#000000">Int</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge20" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge20"><a xlink:title="at certificate.go:159: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:169: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:178: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:182: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:192: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:193: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M890.7997,-578.9469C932.19,-564.7261 988.8409,-545.2621 1025.521,-532.6595"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1026.9878,-535.8565 1035.3079,-529.297 1024.7132,-529.2363 1026.9878,-535.8565"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate | defined in certificate.go:201&#10;at certificate.go:202: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate]&#10;at certificate.go:210: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:207: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes]&#10;at certificate.go:204: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]&#10;at certificate.go:208: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M167.867,-845C167.867,-845 80.178,-845 80.178,-845 74.178,-845 68.178,-839 68.178,-833 68.178,-833 68.178,-821 68.178,-821 68.178,-815 74.178,-809 80.178,-809 80.178,-809 167.867,-809 167.867,-809 173.867,-809 179.867,-815 179.867,-821 179.867,-821 179.867,-833 179.867,-833 179.867,-839 173.867,-845 167.867,-845"/>
<text text-anchor="middle" x="124.0225" y="-822.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate -->
<g id="edge8" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate</title>
<g id="a_edge8"><a xlink:title="at certificate.go:202: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.readCertificate]">
<path fill="none" stroke="#000000" d="M180.1672,-827C229.1368,-827 302.0893,-827 365.6397,-827 365.6397,-827 365.6397,-827 527.1776,-827 662.8932,-827 778.1694,-683.7089 820.7207,-623.3279"/>
<polygon fill="#000000" stroke="#000000" points="823.6406,-625.2592 826.4648,-615.0477 817.889,-621.2692 823.6406,-625.2592"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes -->
<g id="node11" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes</title>
<g id="a_node11"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes | defined in certificate.go:87&#10;at certificate.go:90: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:92: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:95: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:88: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:89: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M400.8974,-477C400.8974,-477 330.382,-477 330.382,-477 324.382,-477 318.382,-471 318.382,-465 318.382,-465 318.382,-453 318.382,-453 318.382,-447 324.382,-441 330.382,-441 330.382,-441 400.8974,-441 400.8974,-441 406.8974,-441 412.8974,-447 412.8974,-453 412.8974,-453 412.8974,-465 412.8974,-465 412.8974,-471 406.8974,-477 400.8974,-477"/>
<text text-anchor="middle" x="365.6397" y="-454.8" font-family="Verdana" font-size="14.00" fill="#000000">ExcessBytes</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes -->
<g id="edge18" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes</title>
<g id="a_edge18"><a xlink:title="at certificate.go:207: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes]">
<path fill="none" stroke="#000000" d="M129.437,-808.9044C146.6115,-754.2052 204.7309,-588.3227 305.045,-490 307.6901,-487.4074 310.5958,-484.985 313.6587,-482.7299"/>
<polygon fill="#000000" stroke="#000000" points="315.668,-485.597 322.0625,-477.1494 311.7957,-479.7656 315.668,-485.597"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge22" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge22"><a xlink:title="at certificate.go:208: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M179.9695,-836.824C228.8138,-844.544 301.6938,-854 365.6397,-854 365.6397,-854 365.6397,-854 838.2555,-854 918.5747,-854 924.2112,-802.065 994.3902,-763 999.5451,-760.1306 1005.014,-757.3022 1010.5228,-754.5908"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1012.2784,-757.6307 1019.7827,-750.1517 1009.2523,-751.3185 1012.2784,-757.6307"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="node18" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_node18"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Warn | defined in log.go:30">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M1080.1334,-811C1080.1334,-811 1044.6008,-811 1044.6008,-811 1038.6008,-811 1032.6008,-805 1032.6008,-799 1032.6008,-799 1032.6008,-787 1032.6008,-787 1032.6008,-781 1038.6008,-775 1044.6008,-775 1044.6008,-775 1080.1334,-775 1080.1334,-775 1086.1334,-775 1092.1334,-781 1092.1334,-787 1092.1334,-787 1092.1334,-799 1092.1334,-799 1092.1334,-805 1086.1334,-811 1080.1334,-811"/>
<text text-anchor="middle" x="1062.3671" y="-797.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="1062.3671" y="-780.4" font-family="Verdana" font-size="14.00" fill="#000000">Warn</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="edge21" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_edge21"><a xlink:title="at certificate.go:204: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]">
<path fill="none" stroke="#8b4513" d="M174.6643,-845.1314C223.0522,-860.819 298.3724,-881 365.6397,-881 365.6397,-881 365.6397,-881 838.2555,-881 892.3836,-881 907.9658,-880.678 958.3902,-861 985.466,-850.4337 1012.8462,-832.1507 1032.7088,-817.2021"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1034.9416,-819.9004 1040.7382,-811.0319 1030.6763,-814.3499 1034.9416,-819.9004"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge9" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge9"><a xlink:title="at certificate.go:210: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M126.618,-808.9925C142.1927,-704.3357 227.2637,-179 365.6397,-179 365.6397,-179 365.6397,-179 838.2555,-179 876.2584,-179 889.4097,-178.4702 921.3902,-199 965.6091,-227.3863 951.2954,-261.9346 994.3902,-292 1002.5446,-297.689 1012.2569,-301.9722 1021.752,-305.1723"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1020.9084,-308.5739 1031.4939,-308.1286 1022.9412,-301.8755 1020.9084,-308.5739"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.init -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.init</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.init | defined in .:0&#10;at certificate.go:18: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M139.0225,-59C139.0225,-59 109.0225,-59 109.0225,-59 103.0225,-59 97.0225,-53 97.0225,-47 97.0225,-47 97.0225,-35 97.0225,-35 97.0225,-29 103.0225,-23 109.0225,-23 109.0225,-23 139.0225,-23 139.0225,-23 145.0225,-23 151.0225,-29 151.0225,-35 151.0225,-35 151.0225,-47 151.0225,-47 151.0225,-53 145.0225,-59 139.0225,-59"/>
<text text-anchor="middle" x="124.0225" y="-36.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node5" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node5"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M414.3292,-59C414.3292,-59 316.9502,-59 316.9502,-59 310.9502,-59 304.9502,-53 304.9502,-47 304.9502,-47 304.9502,-35 304.9502,-35 304.9502,-29 310.9502,-23 316.9502,-23 316.9502,-23 414.3292,-23 414.3292,-23 420.3292,-23 426.3292,-29 426.3292,-35 426.3292,-35 426.3292,-47 426.3292,-47 426.3292,-53 420.3292,-59 414.3292,-59"/>
<text text-anchor="middle" x="365.6397" y="-45.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="365.6397" y="-28.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge36" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge36"><a xlink:title="at certificate.go:18: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M151.2694,-41C185.8355,-41 246.7324,-41 294.8092,-41"/>
<polygon fill="#8b4513" stroke="#8b4513" points="294.8596,-44.5001 304.8596,-41 294.8595,-37.5001 294.8596,-44.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.GetSignatureTypeFromCertificate -->
<g id="node6" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.GetSignatureTypeFromCertificate</title>
<g id="a_node6"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.GetSignatureTypeFromCertificate | defined in certificate.go:281&#10;at certificate.go:282: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at certificate.go:283: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at certificate.go:283: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:286: calling [github.com/samber/oops.Errorf]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M220.0675,-223C220.0675,-223 27.9775,-223 27.9775,-223 21.9775,-223 15.9775,-217 15.9775,-211 15.9775,-211 15.9775,-199 15.9775,-199 15.9775,-193 21.9775,-187 27.9775,-187 27.9775,-187 220.0675,-187 220.0675,-187 226.0675,-187 232.0675,-193 232.0675,-199 232.0675,-199 232.0675,-211 232.0675,-211 232.0675,-217 226.0675,-223 220.0675,-223"/>
<text text-anchor="middle" x="124.0225" y="-200.8" font-family="Verdana" font-size="14.00" fill="#000000">GetSignatureTypeFromCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.GetSignatureTypeFromCertificate&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.GetSignatureTypeFromCertificate&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge4"><a xlink:title="at certificate.go:283: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:286: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M145.3922,-186.9364C185.6792,-154.7915 276.818,-91 365.6397,-91 365.6397,-91 365.6397,-91 718.6208,-91 829.0428,-91 959.081,-101.4127 1022.9377,-107.2115"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1022.6938,-110.7038 1032.9723,-108.1345 1023.335,-103.7332 1022.6938,-110.7038"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type -->
<g id="node15" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type</title>
<g id="a_node15"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type | defined in certificate.go:116&#10;at certificate.go:117: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:120: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:118: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M380.6397,-416C380.6397,-416 350.6397,-416 350.6397,-416 344.6397,-416 338.6397,-410 338.6397,-404 338.6397,-404 338.6397,-392 338.6397,-392 338.6397,-386 344.6397,-380 350.6397,-380 350.6397,-380 380.6397,-380 380.6397,-380 386.6397,-380 392.6397,-386 392.6397,-392 392.6397,-392 392.6397,-404 392.6397,-404 392.6397,-410 386.6397,-416 380.6397,-416"/>
<text text-anchor="middle" x="365.6397" y="-393.8" font-family="Verdana" font-size="14.00" fill="#000000">Type</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.GetSignatureTypeFromCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.GetSignatureTypeFromCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type</title>
<g id="a_edge3"><a xlink:title="at certificate.go:282: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at certificate.go:283: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]">
<path fill="none" stroke="#000000" d="M140.8989,-223.1706C171.4062,-255.2997 238.7388,-322.9884 305.045,-368 312.5955,-373.1256 321.1482,-377.9048 329.3982,-382.0752"/>
<polygon fill="#000000" stroke="#000000" points="327.9911,-385.2828 338.5145,-386.5112 331.054,-378.9885 327.9911,-385.2828"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux -->
<g id="node7" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux</title>
<g id="a_node7"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux | defined in certificate.go:223&#10;at certificate.go:243: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:225: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:230: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:246: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:233: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M896.0832,-153C896.0832,-153 780.4278,-153 780.4278,-153 774.4278,-153 768.4278,-147 768.4278,-141 768.4278,-141 768.4278,-129 768.4278,-129 768.4278,-123 774.4278,-117 780.4278,-117 780.4278,-117 896.0832,-117 896.0832,-117 902.0832,-117 908.0832,-123 908.0832,-129 908.0832,-129 908.0832,-141 908.0832,-141 908.0832,-147 902.0832,-153 896.0832,-153"/>
<text text-anchor="middle" x="838.2555" y="-130.8" font-family="Verdana" font-size="14.00" fill="#000000">NewCertificateDeux</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge23" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge23"><a xlink:title="at certificate.go:225: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:230: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M908.244,-127.505C945.9757,-123.4643 991.1517,-118.6264 1022.8055,-115.2366"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1023.4211,-118.6908 1032.9915,-114.1458 1022.6757,-111.7306 1023.4211,-118.6908"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt -->
<g id="node8" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt</title>
<g id="a_node8"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt | defined in integer.go:68">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M1118.3209,-53C1118.3209,-53 1006.4133,-53 1006.4133,-53 1000.4133,-53 994.4133,-47 994.4133,-41 994.4133,-41 994.4133,-29 994.4133,-29 994.4133,-23 1000.4133,-17 1006.4133,-17 1006.4133,-17 1118.3209,-17 1118.3209,-17 1124.3209,-17 1130.3209,-23 1130.3209,-29 1130.3209,-29 1130.3209,-41 1130.3209,-41 1130.3209,-47 1124.3209,-53 1118.3209,-53"/>
<text text-anchor="middle" x="1062.3671" y="-39.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="1062.3671" y="-22.4" font-family="Verdana" font-size="14.00" fill="#000000">NewIntegerFromInt</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt -->
<g id="edge37" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt</title>
<g id="a_edge37"><a xlink:title="at certificate.go:233: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt]">
<path fill="none" stroke="#8b4513" d="M878.8404,-116.8908C916.3257,-100.1646 972.1246,-75.2668 1012.3495,-57.3182"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1014.0001,-60.4143 1021.7061,-53.1432 1011.1477,-54.0218 1014.0001,-60.4143"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge12" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge12"><a xlink:title="at certificate.go:243: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M851.522,-153.0586C870.1671,-179.3685 903.8061,-230.4117 921.3902,-279 953.8513,-368.6964 935.6768,-626.8209 994.3902,-702 998.6579,-707.4646 1004.1302,-711.9569 1010.1131,-715.6445"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1008.6953,-718.8555 1019.1632,-720.4908 1011.9999,-712.6846 1008.6953,-718.8555"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge34" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateDeux&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge34"><a xlink:title="at certificate.go:246: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M908.395,-144.374C926.6456,-149.8377 944.937,-158.4481 958.3902,-172 997.6189,-211.5165 955.4437,-252.2053 994.3902,-292 1001.7432,-299.5132 1011.6778,-304.4629 1021.6788,-307.7231"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1021.0388,-311.1769 1031.6088,-310.4525 1022.8941,-304.4273 1021.0388,-311.1769"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType -->
<g id="node9" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType</title>
<g id="a_node9"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType | defined in certificate.go:252&#10;at certificate.go:258: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:263: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:265: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M909.5251,-57C909.5251,-57 766.9859,-57 766.9859,-57 760.9859,-57 754.9859,-51 754.9859,-45 754.9859,-45 754.9859,-33 754.9859,-33 754.9859,-27 760.9859,-21 766.9859,-21 766.9859,-21 909.5251,-21 909.5251,-21 915.5251,-21 921.5251,-27 921.5251,-33 921.5251,-33 921.5251,-45 921.5251,-45 921.5251,-51 915.5251,-57 909.5251,-57"/>
<text text-anchor="middle" x="838.2555" y="-34.8" font-family="Verdana" font-size="14.00" fill="#000000">NewCertificateWithType</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge28" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge28"><a xlink:title="at certificate.go:258: calling [github.com/samber/oops.Errorf]&#10;at certificate.go:263: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M894.519,-57.0757C934.8151,-70.0216 988.0345,-87.1193 1023.6417,-98.5588"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1022.6011,-101.9006 1033.1924,-101.6271 1024.7422,-95.236 1022.6011,-101.9006"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt -->
<g id="edge40" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt</title>
<g id="a_edge40"><a xlink:title="at certificate.go:265: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt]">
<path fill="none" stroke="#8b4513" d="M921.7064,-37.5105C942.1472,-37.1457 963.949,-36.7566 984.1349,-36.3963"/>
<polygon fill="#8b4513" stroke="#8b4513" points="984.2775,-39.8944 994.2134,-36.2164 984.1525,-32.8955 984.2775,-39.8944"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length -->
<g id="node10" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length</title>
<g id="a_node10"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length | defined in certificate.go:125&#10;at certificate.go:129: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:126: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:127: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M857.9142,-538C857.9142,-538 818.5968,-538 818.5968,-538 812.5968,-538 806.5968,-532 806.5968,-526 806.5968,-526 806.5968,-514 806.5968,-514 806.5968,-508 812.5968,-502 818.5968,-502 818.5968,-502 857.9142,-502 857.9142,-502 863.9142,-502 869.9142,-508 869.9142,-514 869.9142,-514 869.9142,-526 869.9142,-526 869.9142,-532 863.9142,-538 857.9142,-538"/>
<text text-anchor="middle" x="838.2555" y="-515.8" font-family="Verdana" font-size="14.00" fill="#000000">Length</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge38" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge38"><a xlink:title="at certificate.go:127: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M870.0778,-521.9339C886.97,-524.4397 907.1252,-529.9669 921.3902,-542 981.1357,-592.3975 938.7785,-647.0748 994.3902,-702 998.9677,-706.521 1004.3418,-710.4191 1010.0282,-713.7654"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1008.6741,-717.0082 1019.1517,-718.5799 1011.9411,-710.8173 1008.6741,-717.0082"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge24" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge24"><a xlink:title="at certificate.go:129: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M863.6821,-501.7945C880.5068,-489.4202 902.8082,-472.3815 921.3902,-456 964.9263,-417.6195 1011.6811,-368.8553 1038.9109,-339.6073"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1041.4949,-341.9681 1045.7268,-332.2552 1036.3615,-337.2091 1041.4949,-341.9681"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge35" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge35"><a xlink:title="at certificate.go:126: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M870.3652,-520C911.289,-520 981.8968,-520 1025.1348,-520"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1025.2399,-523.5001 1035.2399,-520 1025.2398,-516.5001 1025.2399,-523.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge6" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge6"><a xlink:title="at certificate.go:90: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M413.037,-477.0926C418.1184,-480.6981 422.7107,-484.966 426.2344,-490 463.4737,-543.2008 413.5692,-737.0025 462.2344,-780 503.5475,-816.5017 904.5976,-792.0624 958.3902,-780 975.6557,-776.1284 978.3402,-770.4489 994.3902,-763 1000.477,-760.1751 1006.8798,-757.2259 1013.2223,-754.3181"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1014.7903,-757.4497 1022.4278,-750.1066 1011.8781,-751.0842 1014.7903,-757.4497"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge19" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge19"><a xlink:title="at certificate.go:92: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:95: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M407.6685,-440.8914C414.1432,-437.349 420.556,-433.3622 426.2344,-429 480.1656,-387.5692 459.1696,-314 527.1776,-314 527.1776,-314 527.1776,-314 838.2555,-314 902.192,-314 976.3886,-314 1021.3294,-314"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1021.5535,-317.5001 1031.5535,-314 1021.5535,-310.5001 1021.5535,-317.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge30" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).ExcessBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge30"><a xlink:title="at certificate.go:88: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at certificate.go:89: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M413.0536,-442.2321C444.9043,-432.4424 488.049,-422 527.1776,-422 527.1776,-422 527.1776,-422 718.6208,-422 779.7179,-422 950.1975,-479.98 1025.6438,-506.7463"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1024.618,-510.0963 1035.2127,-510.1547 1026.9669,-503.5021 1024.618,-510.0963"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes -->
<g id="node12" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes</title>
<g id="a_node12"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes | defined in certificate.go:100&#10;at certificate.go:104: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:101: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes]&#10;at certificate.go:102: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes]&#10;at certificate.go:106: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:103: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M543.0641,-538C543.0641,-538 511.2911,-538 511.2911,-538 505.2911,-538 499.2911,-532 499.2911,-526 499.2911,-526 499.2911,-514 499.2911,-514 499.2911,-508 505.2911,-502 511.2911,-502 511.2911,-502 543.0641,-502 543.0641,-502 549.0641,-502 555.0641,-508 555.0641,-514 555.0641,-514 555.0641,-526 555.0641,-526 555.0641,-532 549.0641,-538 543.0641,-538"/>
<text text-anchor="middle" x="527.1776" y="-515.8" font-family="Verdana" font-size="14.00" fill="#000000">Bytes</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data -->
<g id="node13" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data</title>
<g id="a_node13"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data | defined in certificate.go:134&#10;at certificate.go:138: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]&#10;at certificate.go:144: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at certificate.go:135: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length]&#10;at certificate.go:142: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M670.1208,-538C670.1208,-538 640.1208,-538 640.1208,-538 634.1208,-538 628.1208,-532 628.1208,-526 628.1208,-526 628.1208,-514 628.1208,-514 628.1208,-508 634.1208,-502 640.1208,-502 640.1208,-502 670.1208,-502 670.1208,-502 676.1208,-502 682.1208,-508 682.1208,-514 682.1208,-514 682.1208,-526 682.1208,-526 682.1208,-532 676.1208,-538 670.1208,-538"/>
<text text-anchor="middle" x="655.1208" y="-515.8" font-family="Verdana" font-size="14.00" fill="#000000">Data</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data -->
<g id="edge32" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data</title>
<g id="a_edge32"><a xlink:title="at certificate.go:103: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]">
<path fill="none" stroke="#000000" d="M555.2553,-520C573.6714,-520 597.9555,-520 617.9655,-520"/>
<polygon fill="#000000" stroke="#000000" points="617.9862,-523.5001 627.9861,-520 617.9861,-516.5001 617.9862,-523.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge1" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge1"><a xlink:title="at certificate.go:104: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M529.9125,-538.0109C538.4723,-586.9966 569.4835,-719 655.1208,-719 655.1208,-719 655.1208,-719 838.2555,-719 896.6494,-719 963.4583,-723.453 1008.8298,-727.1466"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1008.7727,-730.6539 1019.0281,-727.9935 1009.3521,-723.6779 1008.7727,-730.6539"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge27" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge27"><a xlink:title="at certificate.go:106: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M535.3242,-501.8239C552.2462,-467.1555 594.7211,-395 655.1208,-395 655.1208,-395 655.1208,-395 718.6208,-395 830.9451,-395 958.5435,-353.5187 1022.0321,-329.926"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1023.5331,-333.1008 1031.659,-326.3022 1021.067,-326.5495 1023.5331,-333.1008"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes -->
<g id="node22" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes</title>
<g id="a_node22"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes | defined in integer.go:27">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M1078.2536,-477C1078.2536,-477 1046.4806,-477 1046.4806,-477 1040.4806,-477 1034.4806,-471 1034.4806,-465 1034.4806,-465 1034.4806,-453 1034.4806,-453 1034.4806,-447 1040.4806,-441 1046.4806,-441 1046.4806,-441 1078.2536,-441 1078.2536,-441 1084.2536,-441 1090.2536,-447 1090.2536,-453 1090.2536,-453 1090.2536,-465 1090.2536,-465 1090.2536,-471 1084.2536,-477 1078.2536,-477"/>
<text text-anchor="middle" x="1062.3671" y="-463.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="1062.3671" y="-446.4" font-family="Verdana" font-size="14.00" fill="#000000">Bytes</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes -->
<g id="edge25" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes</title>
<g id="a_edge25"><a xlink:title="at certificate.go:101: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes]&#10;at certificate.go:102: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes]">
<path fill="none" stroke="#8b4513" d="M555.1926,-504.3634C580.5012,-491.7165 619.1824,-476 655.1208,-476 655.1208,-476 655.1208,-476 838.2555,-476 903.8206,-476 979.867,-468.6762 1024.3892,-463.6427"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1024.9341,-467.1032 1034.4676,-462.4812 1024.1326,-460.1492 1024.9341,-467.1032"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length -->
<g id="edge26" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length</title>
<g id="a_edge26"><a xlink:title="at certificate.go:135: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length]">
<path fill="none" stroke="#000000" d="M682.143,-520C712.169,-520 761.0347,-520 796.0998,-520"/>
<polygon fill="#000000" stroke="#000000" points="796.503,-523.5001 806.5029,-520 796.5029,-516.5001 796.503,-523.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge31" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge31"><a xlink:title="at certificate.go:142: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M662.5733,-538.0526C676.177,-568.6482 708.0373,-630.4325 755.1208,-662 765.7096,-669.0994 923.8065,-702.9794 1008.9624,-720.8715"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1008.4652,-724.3433 1018.9709,-722.9713 1009.9026,-717.4924 1008.4652,-724.3433"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="edge14" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_edge14"><a xlink:title="at certificate.go:138: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]">
<path fill="none" stroke="#8b4513" d="M660.6886,-538.1788C672.3115,-572.9981 702.5344,-649.1699 755.1208,-689 837.4468,-751.3554 959.4954,-777.7431 1022.106,-787.6955"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1021.9424,-791.211 1032.3563,-789.2615 1022.9997,-784.2913 1021.9424,-791.211"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge15" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge15"><a xlink:title="at certificate.go:144: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M682.1656,-509.4896C730.9543,-490.2072 836.5157,-447.009 921.3902,-402 958.6511,-382.2405 999.3255,-356.3539 1027.366,-337.7802"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1029.6243,-340.4813 1036.0057,-332.0238 1025.743,-334.6558 1029.6243,-340.4813"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).length -->
<g id="node14" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).length</title>
<g id="a_node14"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).length | defined in certificate.go:110&#10;at certificate.go:111: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M383.1355,-538C383.1355,-538 348.1439,-538 348.1439,-538 342.1439,-538 336.1439,-532 336.1439,-526 336.1439,-526 336.1439,-514 336.1439,-514 336.1439,-508 342.1439,-502 348.1439,-502 348.1439,-502 383.1355,-502 383.1355,-502 389.1355,-502 395.1355,-508 395.1355,-514 395.1355,-514 395.1355,-526 395.1355,-526 395.1355,-532 389.1355,-538 383.1355,-538"/>
<text text-anchor="middle" x="365.6397" y="-515.8" font-family="Verdana" font-size="14.00" fill="#000000">length</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).length&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes -->
<g id="edge7" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).length&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes</title>
<g id="a_edge7"><a xlink:title="at certificate.go:111: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]">
<path fill="none" stroke="#000000" d="M395.2682,-520C421.6326,-520 460.3466,-520 489.0205,-520"/>
<polygon fill="#000000" stroke="#000000" points="489.0889,-523.5001 499.0889,-520 489.0888,-516.5001 489.0889,-523.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge33" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge33"><a xlink:title="at certificate.go:118: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M392.8854,-405.4307C405.0472,-410.1699 418.3791,-417.6229 426.2344,-429 508.5551,-548.228 369.8577,-641.3821 462.2344,-753 481.4902,-776.2666 496.9762,-773 527.1776,-773 527.1776,-773 527.1776,-773 838.2555,-773 897.4598,-773 964.0466,-758.9838 1009.1435,-747.3416"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1010.2151,-750.6788 1018.9943,-744.7479 1008.4327,-743.9095 1010.2151,-750.6788"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge11" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge11"><a xlink:title="at certificate.go:120: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M392.7503,-388.5653C404.0291,-383.6871 416.6888,-376.869 426.2344,-368 449.2966,-346.5723 437.5241,-326.5042 462.2344,-307 485.9407,-288.2882 496.9762,-287 527.1776,-287 527.1776,-287 527.1776,-287 838.2555,-287 902.7902,-287 977.0323,-298.1719 1021.7903,-306.143"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1021.2301,-309.5984 1031.6944,-307.9407 1022.4802,-302.711 1021.2301,-309.5984"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge10" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge10"><a xlink:title="at certificate.go:117: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M392.7931,-389.8024C424.6635,-380.9199 479.2568,-368 527.1776,-368 527.1776,-368 527.1776,-368 838.2555,-368 926.3206,-368 921.2143,-441.0025 994.3902,-490 1003.9919,-496.4291 1015.1971,-502.0322 1025.7081,-506.6001"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1024.5221,-509.8973 1035.0999,-510.4981 1027.2055,-503.432 1024.5221,-509.8973"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes -->
<g id="node16" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes</title>
<g id="a_node16"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes | defined in certificate.go:76&#10;at certificate.go:80: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at certificate.go:77: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes]&#10;at certificate.go:78: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes]&#10;at certificate.go:82: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M394.1852,-355C394.1852,-355 337.0942,-355 337.0942,-355 331.0942,-355 325.0942,-349 325.0942,-343 325.0942,-343 325.0942,-331 325.0942,-331 325.0942,-325 331.0942,-319 337.0942,-319 337.0942,-319 394.1852,-319 394.1852,-319 400.1852,-319 406.1852,-325 406.1852,-331 406.1852,-331 406.1852,-343 406.1852,-343 406.1852,-349 400.1852,-355 394.1852,-355"/>
<text text-anchor="middle" x="365.6397" y="-332.8" font-family="Verdana" font-size="14.00" fill="#000000">RawBytes</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge5" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge5"><a xlink:title="at certificate.go:80: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M406.2658,-351.7653C413.7563,-356.0336 420.8884,-361.3814 426.2344,-368 535.4971,-503.2716 353.2904,-746 527.1776,-746 527.1776,-746 527.1776,-746 838.2555,-746 896.665,-746 963.4713,-741.2044 1008.8379,-737.2267"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1009.3865,-740.6917 1019.035,-736.3147 1008.7629,-733.7195 1009.3865,-740.6917"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge29" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge29"><a xlink:title="at certificate.go:82: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M406.2343,-326.7314C413.3846,-323.7232 420.3965,-319.8824 426.2344,-315 450.677,-294.5581 440.8621,-276.6333 462.2344,-253 486.1323,-226.5738 491.5482,-206 527.1776,-206 527.1776,-206 527.1776,-206 838.2555,-206 895.5894,-206 911.0429,-220.6671 958.3902,-253 977.8704,-266.3028 974.5202,-279.2867 994.3902,-292 1002.6878,-297.309 1012.3789,-301.4413 1021.8004,-304.616"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1020.8641,-307.9898 1031.4513,-307.5869 1022.9237,-301.2996 1020.8641,-307.9898"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes -->
<g id="edge13" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes</title>
<g id="a_edge13"><a xlink:title="at certificate.go:77: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes]&#10;at certificate.go:78: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Bytes]">
<path fill="none" stroke="#8b4513" d="M406.3953,-323.1598C413.0929,-320.6131 419.9087,-317.8521 426.2344,-315 472.8101,-294.0003 476.0867,-260 527.1776,-260 527.1776,-260 527.1776,-260 838.2555,-260 940.5999,-260 1017.9747,-377.4734 1048.3334,-431.9054"/>
<polygon fill="#8b4513" stroke="#8b4513" points="1045.4271,-433.8864 1053.2885,-440.9891 1051.5723,-430.5342 1045.4271,-433.8864"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 61 KiB

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/data"
![data.svg](data.svg)
Package data implements common data structures used in higher level structures.
## Usage
@ -22,6 +24,16 @@ const STRING_MAX_SIZE = 255
STRING_MAX_SIZE is the maximum number of bytes that can be stored in an I2P
string
```go
var (
ErrZeroLength = oops.Errorf("error parsing string: zero length")
ErrDataTooShort = oops.Errorf("string parsing warning: string data is shorter than specified by length")
ErrDataTooLong = oops.Errorf("string parsing warning: string contains data beyond length")
ErrLengthMismatch = oops.Errorf("error reading I2P string, length does not match data")
ErrMappingLengthMismatch = oops.Errorf("warning parsing mapping: mapping length exceeds provided data")
)
```
#### func PrintErrors
```go
@ -207,7 +219,7 @@ Bytes returns the raw []byte content of an Integer.
```go
func (i Integer) Int() int
```
Int returns the Date as a Go integer
Int returns the Integer as a Go integer
#### type Mapping
@ -295,3 +307,9 @@ occurred during parsing.
```go
func (m MappingValues) Get(key I2PString) I2PString
```
data
github.com/go-i2p/go-i2p/lib/common/data

1306
lib/common/data/data.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 139 KiB

View File

@ -2,10 +2,10 @@
package data
import (
"errors"
"time"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
)
@ -57,7 +57,7 @@ func ReadDate(data []byte) (date Date, remainder []byte, err error) {
log.WithFields(logrus.Fields{
"data": data,
}).Error("ReadDate: data is too short")
err = errors.New("ReadDate: data is too short")
err = oops.Errorf("ReadDate: data is too short")
return
}
copy(date[:], data[:8])

View File

@ -1,23 +1,24 @@
package data
import (
"errors"
"fmt"
"github.com/samber/oops"
)
var (
ErrZeroLength = errors.New("error parsing string: zero length")
ErrDataTooShort = errors.New("string parsing warning: string data is shorter than specified by length")
ErrDataTooLong = errors.New("string parsing warning: string contains data beyond length")
ErrLengthMismatch = errors.New("error reading I2P string, length does not match data")
ErrMappingLengthMismatch = errors.New("warning parsing mapping: mapping length exceeds provided data")
ErrZeroLength = fmt.Errorf("error parsing string: zero length")
ErrDataTooShort = fmt.Errorf("string parsing warning: string data is shorter than specified by length")
ErrDataTooLong = fmt.Errorf("string parsing warning: string contains data beyond length")
ErrLengthMismatch = fmt.Errorf("error reading I2P string, length does not match data")
ErrMappingLengthMismatch = fmt.Errorf("warning parsing mapping: mapping length exceeds provided data")
)
// WrapErrors compiles a slice of errors and returns them wrapped together as a single error.
func WrapErrors(errs []error) error {
var err error
for i, e := range errs {
err = fmt.Errorf("%v\n\t%d: %v", err, i, e)
err = oops.Errorf("%v\n\t%d: %v", err, i, e)
}
return err
}

View File

@ -1,8 +1,7 @@
package data
import (
"errors"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
)
@ -164,7 +163,7 @@ func ReadMapping(bytes []byte) (mapping Mapping, remainder []byte, err []error)
"at": "ReadMapping",
"reason": "zero length",
}).Warn("mapping format violation")
e := errors.New("zero length")
e := oops.Errorf("zero length")
err = append(err, e)
return
}
@ -184,7 +183,7 @@ func ReadMapping(bytes []byte) (mapping Mapping, remainder []byte, err []error)
"expected_size": size.Int(),
"actual_size": len(remainder),
}).Warn("mapping format violation: mapping length exceeds provided data")
e := errors.New("warning parsing mapping: mapping length exceeds provided data")
e := oops.Errorf("warning parsing mapping: mapping length exceeds provided data")
err = append(err, e)
// Use whatever data is available (recovery)
@ -209,7 +208,7 @@ func ReadMapping(bytes []byte) (mapping Mapping, remainder []byte, err []error)
"at": "ReadMapping",
"reason": "error parsing mapping values",
}).Warn("mapping format violation")
e := errors.New("error parsing mapping values")
e := oops.Errorf("error parsing mapping values")
err = append(err, e)
}
if len(remainder) > 0 { // Handle extra bytes beyond mapping length
@ -217,7 +216,7 @@ func ReadMapping(bytes []byte) (mapping Mapping, remainder []byte, err []error)
"expected_size": size.Int(),
"actual_size": len(remainder),
}).Error("mapping format violation: data exists beyond length of mapping")
e := errors.New("warning parsing mapping: data exists beyond length of mapping")
e := oops.Errorf("warning parsing mapping: data exists beyond length of mapping")
err = append(err, e)
// Slice the exact mapping bytes

View File

@ -2,9 +2,9 @@ package data
import (
"bytes"
"errors"
"testing"
"github.com/samber/oops"
"github.com/stretchr/testify/assert"
)
@ -154,7 +154,7 @@ func TestFullGoMapToMappingProducesCorrectMapping(t *testing.T) {
func TestStopValueReadTrueWhenCorrectErr(t *testing.T) {
assert := assert.New(t)
status := stopValueRead(errors.New("error parsing string: zero length"))
status := stopValueRead(oops.Errorf("error parsing string: zero length"))
assert.Equal(true, status, "stopValueRead() did not return true when String error found")
}
@ -162,7 +162,7 @@ func TestStopValueReadTrueWhenCorrectErr(t *testing.T) {
func TestStopValueReadFalseWhenWrongErr(t *testing.T) {
assert := assert.New(t)
status := stopValueRead(errors.New("something else"))
status := stopValueRead(oops.Errorf("something else"))
assert.Equal(false, status, "stopValueRead() did not return false when non String error found")
}

View File

@ -1,9 +1,9 @@
package data
import (
"errors"
"sort"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
)
@ -90,7 +90,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"at": "(Mapping) Values",
"reason": "data shorter than expected",
}).Error("mapping contained no data")
errs = []error{errors.New("mapping contained no data")}
errs = []error{oops.Errorf("mapping contained no data")}
return
}
map_values := make(MappingValues, 0)
@ -103,7 +103,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"mapping_length_field": int_map_length,
"reason": "data longer than expected",
}).Warn("mapping format warning")
errs = append(errs, errors.New("warning parsing mapping: data exists beyond length of mapping"))
errs = append(errs, oops.Errorf("warning parsing mapping: data exists beyond length of mapping"))
} else if int_map_length > mapping_len {
log.WithFields(logrus.Fields{
"at": "(Mapping) Values",
@ -111,7 +111,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"mapping_length_field": int_map_length,
"reason": "data shorter than expected",
}).Warn("mapping format warning")
errs = append(errs, errors.New("warning parsing mapping: mapping length exceeds provided data"))
errs = append(errs, oops.Errorf("warning parsing mapping: mapping length exceeds provided data"))
}
encounteredKeysMap := map[string]bool{}
@ -158,7 +158,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"key": string(key_str),
}).Error("mapping format violation")
log.Printf("DUPE: %s", key_str)
errs = append(errs, errors.New("mapping format violation, duplicate key in mapping"))
errs = append(errs, oops.Errorf("mapping format violation, duplicate key in mapping"))
// Based on other implementations this does not seem to happen often?
// Java throws an exception in this case, the base object is a Hashmap so the value is overwritten and an exception is thrown.
// i2pd as far as I can tell just overwrites the original value
@ -171,7 +171,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"reason": "expected =",
"value:": string(remainder),
}).Warn("mapping format violation")
errs = append(errs, errors.New("mapping format violation, expected ="))
errs = append(errs, oops.Errorf("mapping format violation, expected ="))
log.Printf("ERRVAL: %s", remainder)
break
} else {
@ -197,7 +197,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"reason": "expected ;",
"value:": string(remainder),
}).Warn("mapping format violation")
errs = append(errs, errors.New("mapping format violation, expected ;"))
errs = append(errs, oops.Errorf("mapping format violation, expected ;"))
break
} else {
remainder = remainder[1:]

View File

@ -1,8 +1,7 @@
package data
import (
"errors"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
)
@ -124,7 +123,7 @@ func ToI2PString(data string) (str I2PString, err error) {
"max_len": STRING_MAX_SIZE,
"reason": "too much data",
}).Error("cannot create I2P string")
err = errors.New("cannot store that much data in I2P string")
err = oops.Errorf("cannot store that much data in I2P string")
return
}
i2p_string := []byte{byte(data_len)}

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/destination"
![destination.svg](destination.svg)
Package destination implements the I2P Destination common data structure
## Usage
@ -40,3 +42,9 @@ Base32Address returns the I2P base32 address for this Destination.
func (destination Destination) Base64() string
```
Base64 returns the I2P base64 address for this Destination.
destination
github.com/go-i2p/go-i2p/lib/common/destination

View File

@ -4,7 +4,7 @@ package destination
import (
"strings"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/sirupsen/logrus"
. "github.com/go-i2p/go-i2p/lib/common/keys_and_cert"
@ -31,7 +31,7 @@ Identical to KeysAndCert.
//
// https://geti2p.net/spec/common-structures#destination
type Destination struct {
KeysAndCert
*KeysAndCert
}
// Base32Address returns the I2P base32 address for this Destination.

View File

@ -0,0 +1,300 @@
<?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="357pt" height="609pt"
viewBox="0.00 0.00 356.94 609.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 609)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-609 356.9356,-609 356.9356,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-601 348.9356,-601 348.9356,-8 8,-8"/>
<text text-anchor="middle" x="178.4678" y="-580.8" font-family="Arial" font-size="18.00" fill="#000000">destination</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination</title>
<g id="a_clust6"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination">
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M28,-295C28,-295 131.0814,-295 131.0814,-295 137.0814,-295 143.0814,-301 143.0814,-307 143.0814,-307 143.0814,-422 143.0814,-422 143.0814,-428 137.0814,-434 131.0814,-434 131.0814,-434 28,-434 28,-434 22,-434 16,-428 16,-422 16,-422 16,-307 16,-307 16,-301 22,-295 28,-295"/>
<text text-anchor="middle" x="79.5407" y="-303.5" font-family="Arial" font-size="15.00" fill="#222222">(Destination)</text>
</a>
</g>
</g>
<g id="clust5" class="cluster">
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
<g id="a_clust5"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M249.4047,-121C249.4047,-121 303.7259,-121 303.7259,-121 309.7259,-121 315.7259,-127 315.7259,-133 315.7259,-133 315.7259,-187 315.7259,-187 315.7259,-193 309.7259,-199 303.7259,-199 303.7259,-199 249.4047,-199 249.4047,-199 243.4047,-199 237.4047,-193 237.4047,-187 237.4047,-187 237.4047,-133 237.4047,-133 237.4047,-127 243.4047,-121 249.4047,-121"/>
<text text-anchor="middle" x="276.5653" y="-129.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
</a>
</g>
</g>
<g id="clust4" class="cluster">
<title>cluster_*github.com/go&#45;i2p/logger.Logger</title>
<g id="a_clust4"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M236.9559,-260C236.9559,-260 315.1747,-260 315.1747,-260 321.1747,-260 327.1747,-266 327.1747,-272 327.1747,-272 327.1747,-326 327.1747,-326 327.1747,-332 321.1747,-338 315.1747,-338 315.1747,-338 236.9559,-338 236.9559,-338 230.9559,-338 224.9559,-332 224.9559,-326 224.9559,-326 224.9559,-272 224.9559,-272 224.9559,-266 230.9559,-260 236.9559,-260"/>
<text text-anchor="middle" x="276.0653" y="-268.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&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert</title>
<g id="a_clust3"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M227.6382,-432C227.6382,-432 324.4924,-432 324.4924,-432 330.4924,-432 336.4924,-438 336.4924,-444 336.4924,-444 336.4924,-498 336.4924,-498 336.4924,-504 330.4924,-510 324.4924,-510 324.4924,-510 227.6382,-510 227.6382,-510 221.6382,-510 215.6382,-504 215.6382,-498 215.6382,-498 215.6382,-444 215.6382,-444 215.6382,-438 221.6382,-432 227.6382,-432"/>
<text text-anchor="middle" x="276.0653" y="-440.5" font-family="Arial" font-size="15.00" fill="#222222">(*KeysAndCert)</text>
</a>
</g>
</g>
<g id="clust2" class="cluster">
<title>cluster_*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M239.087,-346C239.087,-346 314.0436,-346 314.0436,-346 320.0436,-346 326.0436,-352 326.0436,-358 326.0436,-358 326.0436,-412 326.0436,-412 326.0436,-418 320.0436,-424 314.0436,-424 314.0436,-424 239.087,-424 239.087,-424 233.087,-424 227.087,-418 227.087,-412 227.087,-412 227.087,-358 227.087,-358 227.087,-352 233.087,-346 239.087,-346"/>
<text text-anchor="middle" x="276.5653" y="-354.5" font-family="Arial" font-size="15.00" fill="#222222">(*Certificate)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination | defined in destination.go:72&#10;at destination.go:77: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert]&#10;at destination.go:75: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:84: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:73: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at destination.go:82: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M126.3497,-191C126.3497,-191 32.7317,-191 32.7317,-191 26.7317,-191 20.7317,-185 20.7317,-179 20.7317,-179 20.7317,-167 20.7317,-167 20.7317,-161 26.7317,-155 32.7317,-155 32.7317,-155 126.3497,-155 126.3497,-155 132.3497,-155 138.3497,-161 138.3497,-167 138.3497,-167 138.3497,-179 138.3497,-179 138.3497,-185 132.3497,-191 126.3497,-191"/>
<text text-anchor="middle" x="79.5407" y="-168.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadDestination</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert | defined in keys_and_cert.go:142">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M328.8062,-113C328.8062,-113 223.3244,-113 223.3244,-113 217.3244,-113 211.3244,-107 211.3244,-101 211.3244,-101 211.3244,-89 211.3244,-89 211.3244,-83 217.3244,-77 223.3244,-77 223.3244,-77 328.8062,-77 328.8062,-77 334.8062,-77 340.8062,-83 340.8062,-89 340.8062,-89 340.8062,-101 340.8062,-101 340.8062,-107 334.8062,-113 328.8062,-113"/>
<text text-anchor="middle" x="276.0653" y="-99.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="276.0653" y="-82.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadKeysAndCert</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert</title>
<g id="a_edge1"><a xlink:title="at destination.go:77: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert]">
<path fill="none" stroke="#8b4513" d="M119.8466,-154.9251C145.7433,-143.5438 180.215,-128.8228 211.195,-117 211.5179,-116.8768 211.8418,-116.7535 212.1667,-116.6302"/>
<polygon fill="#8b4513" stroke="#8b4513" points="213.6372,-119.8181 221.8003,-113.0642 211.2071,-113.2534 213.6372,-119.8181"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="node9" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_node9"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithFields | defined in log.go:60">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M307.2844,-330C307.2844,-330 244.8462,-330 244.8462,-330 238.8462,-330 232.8462,-324 232.8462,-318 232.8462,-318 232.8462,-306 232.8462,-306 232.8462,-300 238.8462,-294 244.8462,-294 244.8462,-294 307.2844,-294 307.2844,-294 313.2844,-294 319.2844,-300 319.2844,-306 319.2844,-306 319.2844,-318 319.2844,-318 319.2844,-324 313.2844,-330 307.2844,-330"/>
<text text-anchor="middle" x="276.0653" y="-316.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="276.0653" y="-299.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge13" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge13"><a xlink:title="at destination.go:73: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at destination.go:82: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M95.6552,-191.3454C118.8737,-216.761 164.144,-262.6371 211.195,-290 215.0581,-292.2466 219.1849,-294.3077 223.4146,-296.1894"/>
<polygon fill="#8b4513" stroke="#8b4513" points="222.196,-299.4724 232.7765,-300.0243 224.8495,-292.9948 222.196,-299.4724"/>
</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="M294.8873,-191C294.8873,-191 257.2433,-191 257.2433,-191 251.2433,-191 245.2433,-185 245.2433,-179 245.2433,-179 245.2433,-167 245.2433,-167 245.2433,-161 251.2433,-155 257.2433,-155 257.2433,-155 294.8873,-155 294.8873,-155 300.8873,-155 306.8873,-161 306.8873,-167 306.8873,-167 306.8873,-179 306.8873,-179 306.8873,-185 300.8873,-191 294.8873,-191"/>
<text text-anchor="middle" x="276.0653" y="-177.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="276.0653" y="-160.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge4"><a xlink:title="at destination.go:75: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:84: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M138.2384,-173C169.429,-173 207.0043,-173 235.0381,-173"/>
<polygon fill="#8b4513" stroke="#8b4513" points="235.282,-176.5001 245.282,-173 235.2819,-169.5001 235.282,-176.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.init -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.init</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.init | defined in .:0&#10;at destination.go:17: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M94.5407,-52C94.5407,-52 64.5407,-52 64.5407,-52 58.5407,-52 52.5407,-46 52.5407,-40 52.5407,-40 52.5407,-28 52.5407,-28 52.5407,-22 58.5407,-16 64.5407,-16 64.5407,-16 94.5407,-16 94.5407,-16 100.5407,-16 106.5407,-22 106.5407,-28 106.5407,-28 106.5407,-40 106.5407,-40 106.5407,-46 100.5407,-52 94.5407,-52"/>
<text text-anchor="middle" x="79.5407" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M324.7548,-52C324.7548,-52 227.3758,-52 227.3758,-52 221.3758,-52 215.3758,-46 215.3758,-40 215.3758,-40 215.3758,-28 215.3758,-28 215.3758,-22 221.3758,-16 227.3758,-16 227.3758,-16 324.7548,-16 324.7548,-16 330.7548,-16 336.7548,-22 336.7548,-28 336.7548,-28 336.7548,-40 336.7548,-40 336.7548,-46 330.7548,-52 324.7548,-52"/>
<text text-anchor="middle" x="276.0653" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="276.0653" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge14" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge14"><a xlink:title="at destination.go:17: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M106.8666,-34C132.1954,-34 170.9888,-34 205.043,-34"/>
<polygon fill="#8b4513" stroke="#8b4513" points="205.4392,-37.5001 215.4392,-34 205.4392,-30.5001 205.4392,-37.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/base32.EncodeToString -->
<g id="node5" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/base32.EncodeToString</title>
<g id="a_node5"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/base32.EncodeToString | defined in base32.go:16">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M321.8244,-563C321.8244,-563 230.3062,-563 230.3062,-563 224.3062,-563 218.3062,-557 218.3062,-551 218.3062,-551 218.3062,-539 218.3062,-539 218.3062,-533 224.3062,-527 230.3062,-527 230.3062,-527 321.8244,-527 321.8244,-527 327.8244,-527 333.8244,-533 333.8244,-539 333.8244,-539 333.8244,-551 333.8244,-551 333.8244,-557 327.8244,-563 321.8244,-563"/>
<text text-anchor="middle" x="276.0653" y="-549.2" font-family="Verdana" font-size="14.00" fill="#000000">base32</text>
<text text-anchor="middle" x="276.0653" y="-532.4" font-family="Verdana" font-size="14.00" fill="#000000">EncodeToString</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/base64.EncodeToString -->
<g id="node6" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/base64.EncodeToString</title>
<g id="a_node6"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/base64.EncodeToString | defined in base64.go:16">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M321.8244,-252C321.8244,-252 230.3062,-252 230.3062,-252 224.3062,-252 218.3062,-246 218.3062,-240 218.3062,-240 218.3062,-228 218.3062,-228 218.3062,-222 224.3062,-216 230.3062,-216 230.3062,-216 321.8244,-216 321.8244,-216 327.8244,-216 333.8244,-222 333.8244,-228 333.8244,-228 333.8244,-240 333.8244,-240 333.8244,-246 327.8244,-252 321.8244,-252"/>
<text text-anchor="middle" x="276.0653" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">base64</text>
<text text-anchor="middle" x="276.0653" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">EncodeToString</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes -->
<g id="node7" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes</title>
<g id="a_node7"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes | defined in certificate.go:100">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M304.0219,-416C304.0219,-416 248.1087,-416 248.1087,-416 242.1087,-416 236.1087,-410 236.1087,-404 236.1087,-404 236.1087,-392 236.1087,-392 236.1087,-386 242.1087,-380 248.1087,-380 248.1087,-380 304.0219,-380 304.0219,-380 310.0219,-380 316.0219,-386 316.0219,-392 316.0219,-392 316.0219,-404 316.0219,-404 316.0219,-410 310.0219,-416 304.0219,-416"/>
<text text-anchor="middle" x="276.0653" y="-402.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="276.0653" y="-385.4" font-family="Verdana" font-size="14.00" fill="#000000">Bytes</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate -->
<g id="node8" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate</title>
<g id="a_node8"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate | defined in keys_and_cert.go:136">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M316.4196,-502C316.4196,-502 235.711,-502 235.711,-502 229.711,-502 223.711,-496 223.711,-490 223.711,-490 223.711,-478 223.711,-478 223.711,-472 229.711,-466 235.711,-466 235.711,-466 316.4196,-466 316.4196,-466 322.4196,-466 328.4196,-472 328.4196,-478 328.4196,-478 328.4196,-490 328.4196,-490 328.4196,-496 322.4196,-502 316.4196,-502"/>
<text text-anchor="middle" x="276.0653" y="-488.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="276.0653" y="-471.4" font-family="Verdana" font-size="14.00" fill="#000000">Certificate</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address -->
<g id="node11" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address</title>
<g id="a_node11"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address | defined in destination.go:38&#10;at destination.go:42: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]&#10;at destination.go:41: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate]&#10;at destination.go:39: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:49: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:44: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/base32.EncodeToString]&#10;at destination.go:47: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M123.1221,-426C123.1221,-426 35.9593,-426 35.9593,-426 29.9593,-426 23.9593,-420 23.9593,-414 23.9593,-414 23.9593,-402 23.9593,-402 23.9593,-396 29.9593,-390 35.9593,-390 35.9593,-390 123.1221,-390 123.1221,-390 129.1221,-390 135.1221,-396 135.1221,-402 135.1221,-402 135.1221,-414 135.1221,-414 135.1221,-420 129.1221,-426 123.1221,-426"/>
<text text-anchor="middle" x="79.5407" y="-403.8" font-family="Verdana" font-size="14.00" fill="#000000">Base32Address</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/base32.EncodeToString -->
<g id="edge9" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/base32.EncodeToString</title>
<g id="a_edge9"><a xlink:title="at destination.go:44: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/base32.EncodeToString]">
<path fill="none" stroke="#8b4513" d="M98.3658,-426.2155C122.8623,-449.2395 167.6924,-489.1061 211.195,-516 214.7364,-518.1894 218.4716,-520.3055 222.2878,-522.3296"/>
<polygon fill="#8b4513" stroke="#8b4513" points="220.7827,-525.4905 231.2865,-526.8769 223.9399,-519.2429 220.7827,-525.4905"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes -->
<g id="edge2" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes</title>
<g id="a_edge2"><a xlink:title="at destination.go:42: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]">
<path fill="none" stroke="#8b4513" d="M135.3003,-423.7554C148.355,-425.819 162.2348,-426.7045 175.195,-425 192.0147,-422.7879 210.016,-418.5853 226.0877,-414.143"/>
<polygon fill="#8b4513" stroke="#8b4513" points="227.1646,-417.4754 235.8175,-411.3617 225.2406,-410.745 227.1646,-417.4754"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate -->
<g id="edge5" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate</title>
<g id="a_edge5"><a xlink:title="at destination.go:41: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate]">
<path fill="none" stroke="#8b4513" d="M126.1143,-426.0109C154.2801,-436.9032 190.3668,-450.8587 220.0806,-462.3496"/>
<polygon fill="#8b4513" stroke="#8b4513" points="218.8966,-465.6443 229.4859,-465.9868 221.4214,-459.1155 218.8966,-465.6443"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge10" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge10"><a xlink:title="at destination.go:47: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M135.4607,-410.5532C149.2676,-408.9965 163.4512,-405.3584 175.195,-398 200.9047,-381.8908 188.214,-359.8083 211.195,-340 215.0451,-336.6814 219.3484,-333.7036 223.8574,-331.0431"/>
<polygon fill="#8b4513" stroke="#8b4513" points="225.5446,-334.1099 232.7168,-326.3118 222.247,-327.9353 225.5446,-334.1099"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge8" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge8"><a xlink:title="at destination.go:39: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:49: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M128.4239,-389.9118C133.8188,-386.5287 138.8725,-382.5818 143.0814,-378 201.7913,-314.0883 148.9351,-255.4587 211.195,-195 217.9616,-188.4291 226.762,-183.8181 235.6865,-180.5832"/>
<polygon fill="#8b4513" stroke="#8b4513" points="236.8188,-183.8965 245.3289,-177.5856 234.7406,-177.2121 236.8188,-183.8965"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64 -->
<g id="node12" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64</title>
<g id="a_node12"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64 | defined in destination.go:55&#10;at destination.go:59: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]&#10;at destination.go:58: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate]&#10;at destination.go:60: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/base64.EncodeToString]&#10;at destination.go:56: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:64: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:62: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M100.2514,-365C100.2514,-365 58.83,-365 58.83,-365 52.83,-365 46.83,-359 46.83,-353 46.83,-353 46.83,-341 46.83,-341 46.83,-335 52.83,-329 58.83,-329 58.83,-329 100.2514,-329 100.2514,-329 106.2514,-329 112.2514,-335 112.2514,-341 112.2514,-341 112.2514,-353 112.2514,-353 112.2514,-359 106.2514,-365 100.2514,-365"/>
<text text-anchor="middle" x="79.5407" y="-342.8" font-family="Verdana" font-size="14.00" fill="#000000">Base64</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/base64.EncodeToString -->
<g id="edge7" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/base64.EncodeToString</title>
<g id="a_edge7"><a xlink:title="at destination.go:60: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/base64.EncodeToString]">
<path fill="none" stroke="#8b4513" d="M112.1939,-338.8592C122.5317,-335.4699 133.7005,-330.9153 143.0814,-325 176.9686,-303.632 175.1512,-282.1226 209.631,-257.6621"/>
<polygon fill="#8b4513" stroke="#8b4513" points="211.6947,-260.4935 218.1081,-252.0603 207.8355,-254.6534 211.6947,-260.4935"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes -->
<g id="edge3" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes</title>
<g id="a_edge3"><a xlink:title="at destination.go:59: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]">
<path fill="none" stroke="#8b4513" d="M112.2576,-348.1387C130.9214,-349.3528 154.6235,-351.8541 175.195,-357 193.2842,-361.5249 212.4093,-368.65 229.0864,-375.6996"/>
<polygon fill="#8b4513" stroke="#8b4513" points="228.0292,-379.056 238.5963,-379.8214 230.8129,-372.6333 228.0292,-379.056"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate -->
<g id="edge6" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate</title>
<g id="a_edge6"><a xlink:title="at destination.go:58: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate]">
<path fill="none" stroke="#8b4513" d="M112.2798,-361.284C122.4063,-366.1451 133.4308,-371.9033 143.0814,-378 163.9636,-391.1922 214.3577,-432.4214 246.7655,-459.4025"/>
<polygon fill="#8b4513" stroke="#8b4513" points="244.6676,-462.2104 254.5883,-465.9293 249.1521,-456.8354 244.6676,-462.2104"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge12" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge12"><a xlink:title="at destination.go:62: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M112.3907,-341.0766C130.5996,-337.7992 153.6485,-333.6603 174.195,-330 190.0047,-327.1835 207.1979,-324.1387 222.8796,-321.3685"/>
<polygon fill="#8b4513" stroke="#8b4513" points="223.6975,-324.7783 232.9366,-319.5929 222.4804,-317.8849 223.6975,-324.7783"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge11" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge11"><a xlink:title="at destination.go:56: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at destination.go:64: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M112.3191,-341.1468C123.1386,-337.8792 134.5697,-332.8178 143.0814,-325 168.1559,-301.9697 158.3099,-285.1129 174.195,-255 188.8126,-227.2898 186.6888,-214.5186 211.195,-195 218.2916,-189.3477 226.9195,-185.1105 235.5357,-181.9469"/>
<polygon fill="#8b4513" stroke="#8b4513" points="236.7484,-185.2331 245.1766,-178.8131 234.5844,-178.5759 236.7484,-185.2331"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/common/fuzz/certificate"
![exportable.svg](exportable.svg)
## Usage
@ -10,3 +13,9 @@
```go
func Fuzz(data []byte) int
```
exportable
github.com/go-i2p/go-i2p/lib/common/fuzz/certificate

View File

@ -0,0 +1,111 @@
<?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="272pt" height="306pt"
viewBox="0.00 0.00 271.84 306.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 306)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-306 271.8444,-306 271.8444,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-298 263.8444,-298 263.8444,-8 8,-8"/>
<text text-anchor="middle" x="135.9222" y="-277.8" font-family="Arial" font-size="18.00" fill="#000000">exportable</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M162.9439,-60C162.9439,-60 237.9005,-60 237.9005,-60 243.9005,-60 249.9005,-66 249.9005,-72 249.9005,-72 249.9005,-248 249.9005,-248 249.9005,-254 243.9005,-260 237.9005,-260 237.9005,-260 162.9439,-260 162.9439,-260 156.9439,-260 150.9439,-254 150.9439,-248 150.9439,-248 150.9439,-72 150.9439,-72 150.9439,-66 156.9439,-60 162.9439,-60"/>
<text text-anchor="middle" x="200.4222" y="-68.5" font-family="Arial" font-size="15.00" fill="#222222">(*Certificate)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz | defined in fuzz.go:5&#10;at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate]&#10;at fuzz.go:7: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at fuzz.go:8: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length]&#10;at fuzz.go:9: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M58,-160C58,-160 28,-160 28,-160 22,-160 16,-154 16,-148 16,-148 16,-136 16,-136 16,-130 22,-124 28,-124 28,-124 58,-124 58,-124 64,-124 70,-130 70,-136 70,-136 70,-148 70,-148 70,-154 64,-160 58,-160"/>
<text text-anchor="middle" x="43" y="-137.8" font-family="Verdana" font-size="14.00" fill="#000000">Fuzz</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate | defined in certificate.go:201">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M243.7667,-52C243.7667,-52 156.0777,-52 156.0777,-52 150.0777,-52 144.0777,-46 144.0777,-40 144.0777,-40 144.0777,-28 144.0777,-28 144.0777,-22 150.0777,-16 156.0777,-16 156.0777,-16 243.7667,-16 243.7667,-16 249.7667,-16 255.7667,-22 255.7667,-28 255.7667,-28 255.7667,-40 255.7667,-40 255.7667,-46 249.7667,-52 243.7667,-52"/>
<text text-anchor="middle" x="199.9222" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="199.9222" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate</title>
<g id="a_edge1"><a xlink:title="at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate]">
<path fill="none" stroke="#8b4513" d="M60.5563,-123.8395C78.2431,-106.2965 107.1045,-79.6361 142.3601,-57.393"/>
<polygon fill="#8b4513" stroke="#8b4513" points="144.2536,-60.3376 150.9601,-52.1355 140.6025,-54.3652 144.2536,-60.3376"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data -->
<g id="node3" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data</title>
<g id="a_node3"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data | defined in certificate.go:134">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M227.8788,-130C227.8788,-130 171.9656,-130 171.9656,-130 165.9656,-130 159.9656,-124 159.9656,-118 159.9656,-118 159.9656,-106 159.9656,-106 159.9656,-100 165.9656,-94 171.9656,-94 171.9656,-94 227.8788,-94 227.8788,-94 233.8788,-94 239.8788,-100 239.8788,-106 239.8788,-106 239.8788,-118 239.8788,-118 239.8788,-124 233.8788,-130 227.8788,-130"/>
<text text-anchor="middle" x="199.9222" y="-116.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="199.9222" y="-99.4" font-family="Verdana" font-size="14.00" fill="#000000">Data</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data</title>
<g id="a_edge2"><a xlink:title="at fuzz.go:7: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]">
<path fill="none" stroke="#8b4513" d="M70.3338,-136.7744C92.2913,-132.5766 123.7111,-126.5699 150.1132,-121.5224"/>
<polygon fill="#8b4513" stroke="#8b4513" points="150.7913,-124.9562 159.9562,-119.6406 149.4768,-118.0807 150.7913,-124.9562"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length -->
<g id="node4" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length</title>
<g id="a_node4"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length | defined in certificate.go:125">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M227.8788,-191C227.8788,-191 171.9656,-191 171.9656,-191 165.9656,-191 159.9656,-185 159.9656,-179 159.9656,-179 159.9656,-167 159.9656,-167 159.9656,-161 165.9656,-155 171.9656,-155 171.9656,-155 227.8788,-155 227.8788,-155 233.8788,-155 239.8788,-161 239.8788,-167 239.8788,-167 239.8788,-179 239.8788,-179 239.8788,-185 233.8788,-191 227.8788,-191"/>
<text text-anchor="middle" x="199.9222" y="-177.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="199.9222" y="-160.4" font-family="Verdana" font-size="14.00" fill="#000000">Length</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length</title>
<g id="a_edge3"><a xlink:title="at fuzz.go:8: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Length]">
<path fill="none" stroke="#8b4513" d="M70.3338,-147.3998C92.2913,-151.7375 123.7111,-157.9445 150.1132,-163.1602"/>
<polygon fill="#8b4513" stroke="#8b4513" points="149.4674,-166.6002 159.9562,-165.1047 150.8241,-159.7329 149.4674,-166.6002"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type -->
<g id="node5" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type</title>
<g id="a_node5"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type | defined in certificate.go:116">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M227.8788,-252C227.8788,-252 171.9656,-252 171.9656,-252 165.9656,-252 159.9656,-246 159.9656,-240 159.9656,-240 159.9656,-228 159.9656,-228 159.9656,-222 165.9656,-216 171.9656,-216 171.9656,-216 227.8788,-216 227.8788,-216 233.8788,-216 239.8788,-222 239.8788,-228 239.8788,-228 239.8788,-240 239.8788,-240 239.8788,-246 233.8788,-252 227.8788,-252"/>
<text text-anchor="middle" x="199.9222" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="199.9222" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">Type</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/certificate.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type</title>
<g id="a_edge4"><a xlink:title="at fuzz.go:9: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]">
<path fill="none" stroke="#8b4513" d="M70.1769,-159.2759C90.3621,-171.9616 118.6668,-189.4457 144,-204 148.084,-206.3463 152.3634,-208.7456 156.6592,-211.1147"/>
<polygon fill="#8b4513" stroke="#8b4513" points="154.9879,-214.1898 165.4424,-215.9086 158.3415,-208.0455 154.9879,-214.1898"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/common/fuzz/destination"
![exportable.svg](exportable.svg)
## Usage
@ -10,3 +13,9 @@
```go
func Fuzz(data []byte) int
```
exportable
github.com/go-i2p/go-i2p/lib/common/fuzz/destination

View File

@ -0,0 +1,92 @@
<?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="281pt" height="245pt"
viewBox="0.00 0.00 281.19 245.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 245)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-245 281.195,-245 281.195,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-237 273.195,-237 273.195,-8 8,-8"/>
<text text-anchor="middle" x="140.5975" y="-216.8" font-family="Arial" font-size="18.00" fill="#000000">exportable</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination</title>
<g id="a_clust2"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M150.1136,-60C150.1136,-60 253.195,-60 253.195,-60 259.195,-60 265.195,-66 265.195,-72 265.195,-72 265.195,-187 265.195,-187 265.195,-193 259.195,-199 253.195,-199 253.195,-199 150.1136,-199 150.1136,-199 144.1136,-199 138.1136,-193 138.1136,-187 138.1136,-187 138.1136,-72 138.1136,-72 138.1136,-66 144.1136,-60 150.1136,-60"/>
<text text-anchor="middle" x="201.6543" y="-68.5" font-family="Arial" font-size="15.00" fill="#222222">(Destination)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz | defined in fuzz.go:5&#10;at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination]&#10;at fuzz.go:7: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address]&#10;at fuzz.go:8: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M58,-130C58,-130 28,-130 28,-130 22,-130 16,-124 16,-118 16,-118 16,-106 16,-106 16,-100 22,-94 28,-94 28,-94 58,-94 58,-94 64,-94 70,-100 70,-106 70,-106 70,-118 70,-118 70,-124 64,-130 58,-130"/>
<text text-anchor="middle" x="43" y="-107.8" font-family="Verdana" font-size="14.00" fill="#000000">Fuzz</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination | defined in destination.go:72">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M248.4633,-52C248.4633,-52 154.8453,-52 154.8453,-52 148.8453,-52 142.8453,-46 142.8453,-40 142.8453,-40 142.8453,-28 142.8453,-28 142.8453,-22 148.8453,-16 154.8453,-16 154.8453,-16 248.4633,-16 248.4633,-16 254.4633,-16 260.4633,-22 260.4633,-28 260.4633,-28 260.4633,-40 260.4633,-40 260.4633,-46 254.4633,-52 248.4633,-52"/>
<text text-anchor="middle" x="201.6543" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">destination</text>
<text text-anchor="middle" x="201.6543" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadDestination</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination</title>
<g id="a_edge1"><a xlink:title="at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.ReadDestination]">
<path fill="none" stroke="#8b4513" d="M70.1001,-94.0845C88.7169,-82.2726 114.281,-67.0087 138.1136,-56 138.2063,-55.9572 138.2992,-55.9144 138.3921,-55.8716"/>
<polygon fill="#8b4513" stroke="#8b4513" points="139.5119,-59.2012 147.2891,-52.0063 136.7226,-52.7809 139.5119,-59.2012"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address -->
<g id="node3" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address</title>
<g id="a_node3"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address | defined in destination.go:38">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M245.2357,-130C245.2357,-130 158.0729,-130 158.0729,-130 152.0729,-130 146.0729,-124 146.0729,-118 146.0729,-118 146.0729,-106 146.0729,-106 146.0729,-100 152.0729,-94 158.0729,-94 158.0729,-94 245.2357,-94 245.2357,-94 251.2357,-94 257.2357,-100 257.2357,-106 257.2357,-106 257.2357,-118 257.2357,-118 257.2357,-124 251.2357,-130 245.2357,-130"/>
<text text-anchor="middle" x="201.6543" y="-116.2" font-family="Verdana" font-size="14.00" fill="#000000">destination</text>
<text text-anchor="middle" x="201.6543" y="-99.4" font-family="Verdana" font-size="14.00" fill="#000000">Base32Address</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address</title>
<g id="a_edge2"><a xlink:title="at fuzz.go:7: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base32Address]">
<path fill="none" stroke="#8b4513" d="M70.2736,-112C88.3329,-112 112.8362,-112 135.7903,-112"/>
<polygon fill="#8b4513" stroke="#8b4513" points="135.853,-115.5001 145.853,-112 135.8529,-108.5001 135.853,-115.5001"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64 -->
<g id="node4" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64</title>
<g id="a_node4"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64 | defined in destination.go:55">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M232.5916,-191C232.5916,-191 170.717,-191 170.717,-191 164.717,-191 158.717,-185 158.717,-179 158.717,-179 158.717,-167 158.717,-167 158.717,-161 164.717,-155 170.717,-155 170.717,-155 232.5916,-155 232.5916,-155 238.5916,-155 244.5916,-161 244.5916,-167 244.5916,-167 244.5916,-179 244.5916,-179 244.5916,-185 238.5916,-191 232.5916,-191"/>
<text text-anchor="middle" x="201.6543" y="-177.2" font-family="Verdana" font-size="14.00" fill="#000000">destination</text>
<text text-anchor="middle" x="201.6543" y="-160.4" font-family="Verdana" font-size="14.00" fill="#000000">Base64</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64 -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/destination.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64</title>
<g id="a_edge3"><a xlink:title="at fuzz.go:8: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/destination.Destination).Base64]">
<path fill="none" stroke="#8b4513" d="M70.2736,-122.4863C91.973,-130.8293 122.976,-142.7495 149.4161,-152.9153"/>
<polygon fill="#8b4513" stroke="#8b4513" points="148.3351,-156.2494 158.9251,-156.5713 150.8473,-149.7157 148.3351,-156.2494"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/common/fuzz/keys_and_cert"
![exportable.svg](exportable.svg)
## Usage
@ -10,3 +13,9 @@
```go
func Fuzz(data []byte) int
```
exportable
github.com/go-i2p/go-i2p/lib/common/fuzz/keys_and_cert

View File

@ -0,0 +1,111 @@
<?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="295pt" height="306pt"
viewBox="0.00 0.00 295.20 306.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 306)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-306 295.202,-306 295.202,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-298 287.202,-298 287.202,-8 8,-8"/>
<text text-anchor="middle" x="147.601" y="-277.8" font-family="Arial" font-size="18.00" fill="#000000">exportable</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M148.5386,-60C148.5386,-60 267.202,-60 267.202,-60 273.202,-60 279.202,-66 279.202,-72 279.202,-72 279.202,-248 279.202,-248 279.202,-254 273.202,-260 267.202,-260 267.202,-260 148.5386,-260 148.5386,-260 142.5386,-260 136.5386,-254 136.5386,-248 136.5386,-248 136.5386,-72 136.5386,-72 136.5386,-66 142.5386,-60 148.5386,-60"/>
<text text-anchor="middle" x="207.8703" y="-68.5" font-family="Arial" font-size="15.00" fill="#222222">(*KeysAndCert)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz | defined in fuzz.go:5&#10;at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert]&#10;at fuzz.go:7: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate]&#10;at fuzz.go:8: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).PublicKey]&#10;at fuzz.go:9: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).SigningPublicKey]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M58,-160C58,-160 28,-160 28,-160 22,-160 16,-154 16,-148 16,-148 16,-136 16,-136 16,-130 22,-124 28,-124 28,-124 58,-124 58,-124 64,-124 70,-130 70,-136 70,-136 70,-148 70,-148 70,-154 64,-160 58,-160"/>
<text text-anchor="middle" x="43" y="-137.8" font-family="Verdana" font-size="14.00" fill="#000000">Fuzz</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert | defined in keys_and_cert.go:142">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M260.6112,-52C260.6112,-52 155.1294,-52 155.1294,-52 149.1294,-52 143.1294,-46 143.1294,-40 143.1294,-40 143.1294,-28 143.1294,-28 143.1294,-22 149.1294,-16 155.1294,-16 155.1294,-16 260.6112,-16 260.6112,-16 266.6112,-16 272.6112,-22 272.6112,-28 272.6112,-28 272.6112,-40 272.6112,-40 272.6112,-46 266.6112,-52 260.6112,-52"/>
<text text-anchor="middle" x="207.8703" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="207.8703" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadKeysAndCert</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert</title>
<g id="a_edge1"><a xlink:title="at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert]">
<path fill="none" stroke="#8b4513" d="M58.0901,-123.9966C73.9008,-106.1275 100.4054,-78.8225 134.9201,-57.4503"/>
<polygon fill="#8b4513" stroke="#8b4513" points="137.0442,-60.2603 143.866,-52.1539 133.4779,-54.2368 137.0442,-60.2603"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate -->
<g id="node3" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate</title>
<g id="a_node3"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate | defined in keys_and_cert.go:136">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M248.2246,-130C248.2246,-130 167.516,-130 167.516,-130 161.516,-130 155.516,-124 155.516,-118 155.516,-118 155.516,-106 155.516,-106 155.516,-100 161.516,-94 167.516,-94 167.516,-94 248.2246,-94 248.2246,-94 254.2246,-94 260.2246,-100 260.2246,-106 260.2246,-106 260.2246,-118 260.2246,-118 260.2246,-124 254.2246,-130 248.2246,-130"/>
<text text-anchor="middle" x="207.8703" y="-116.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="207.8703" y="-99.4" font-family="Verdana" font-size="14.00" fill="#000000">Certificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate</title>
<g id="a_edge2"><a xlink:title="at fuzz.go:7: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate]">
<path fill="none" stroke="#8b4513" d="M70.225,-137.0461C90.5721,-133.3437 119.2244,-128.1301 145.123,-123.4176"/>
<polygon fill="#8b4513" stroke="#8b4513" points="146.0533,-126.8058 155.2652,-121.5721 144.8001,-119.9189 146.0533,-126.8058"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).PublicKey -->
<g id="node4" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).PublicKey</title>
<g id="a_node4"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).PublicKey | defined in keys_and_cert.go:126">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M248.2246,-191C248.2246,-191 167.516,-191 167.516,-191 161.516,-191 155.516,-185 155.516,-179 155.516,-179 155.516,-167 155.516,-167 155.516,-161 161.516,-155 167.516,-155 167.516,-155 248.2246,-155 248.2246,-155 254.2246,-155 260.2246,-161 260.2246,-167 260.2246,-167 260.2246,-179 260.2246,-179 260.2246,-185 254.2246,-191 248.2246,-191"/>
<text text-anchor="middle" x="207.8703" y="-177.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="207.8703" y="-160.4" font-family="Verdana" font-size="14.00" fill="#000000">PublicKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).PublicKey -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).PublicKey</title>
<g id="a_edge3"><a xlink:title="at fuzz.go:8: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).PublicKey]">
<path fill="none" stroke="#8b4513" d="M70.225,-147.119C90.5721,-150.9448 119.2244,-156.3322 145.123,-161.2018"/>
<polygon fill="#8b4513" stroke="#8b4513" points="144.7906,-164.7006 155.2652,-163.1088 146.0842,-157.8212 144.7906,-164.7006"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).SigningPublicKey -->
<g id="node5" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).SigningPublicKey</title>
<g id="a_node5"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).SigningPublicKey | defined in keys_and_cert.go:131">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M259.0341,-252C259.0341,-252 156.7065,-252 156.7065,-252 150.7065,-252 144.7065,-246 144.7065,-240 144.7065,-240 144.7065,-228 144.7065,-228 144.7065,-222 150.7065,-216 156.7065,-216 156.7065,-216 259.0341,-216 259.0341,-216 265.0341,-216 271.0341,-222 271.0341,-228 271.0341,-228 271.0341,-240 271.0341,-240 271.0341,-246 265.0341,-252 259.0341,-252"/>
<text text-anchor="middle" x="207.8703" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="207.8703" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">SigningPublicKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).SigningPublicKey -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/keys_and_cert.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).SigningPublicKey</title>
<g id="a_edge4"><a xlink:title="at fuzz.go:9: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).SigningPublicKey]">
<path fill="none" stroke="#8b4513" d="M67.6184,-160.1635C86.0385,-173.2904 112.1509,-190.9378 136.5386,-204 141.4238,-206.6165 146.5867,-209.1688 151.811,-211.6095"/>
<polygon fill="#8b4513" stroke="#8b4513" points="150.6805,-214.9395 161.2342,-215.8722 153.5656,-208.5617 150.6805,-214.9395"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/common/fuzz/router_address"
![exportable.svg](exportable.svg)
## Usage
@ -10,3 +13,9 @@
```go
func Fuzz(data []byte) int
```
exportable
github.com/go-i2p/go-i2p/lib/common/fuzz/router_address

View File

@ -0,0 +1,130 @@
<?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="298pt" height="367pt"
viewBox="0.00 0.00 297.74 367.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 367)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-367 297.7392,-367 297.7392,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-359 289.7392,-359 289.7392,-8 8,-8"/>
<text text-anchor="middle" x="148.8696" y="-338.8" font-family="Arial" font-size="18.00" fill="#000000">exportable</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress</title>
<g id="a_clust2"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M162.7686,-60C162.7686,-60 263.9706,-60 263.9706,-60 269.9706,-60 275.9706,-66 275.9706,-72 275.9706,-72 275.9706,-309 275.9706,-309 275.9706,-315 269.9706,-321 263.9706,-321 263.9706,-321 162.7686,-321 162.7686,-321 156.7686,-321 150.7686,-315 150.7686,-309 150.7686,-309 150.7686,-72 150.7686,-72 150.7686,-66 156.7686,-60 162.7686,-60"/>
<text text-anchor="middle" x="213.3696" y="-68.5" font-family="Arial" font-size="15.00" fill="#222222">(RouterAddress)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz | defined in fuzz.go:5&#10;at fuzz.go:10: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).TransportStyle]&#10;at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.ReadRouterAddress]&#10;at fuzz.go:7: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Cost]&#10;at fuzz.go:8: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Expiration]&#10;at fuzz.go:9: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Options]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M58,-191C58,-191 28,-191 28,-191 22,-191 16,-185 16,-179 16,-179 16,-167 16,-167 16,-161 22,-155 28,-155 28,-155 58,-155 58,-155 64,-155 70,-161 70,-167 70,-167 70,-179 70,-179 70,-185 64,-191 58,-191"/>
<text text-anchor="middle" x="43" y="-168.8" font-family="Verdana" font-size="14.00" fill="#000000">Fuzz</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.ReadRouterAddress -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.ReadRouterAddress</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.ReadRouterAddress | defined in router_address.go:317">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M269.609,-52C269.609,-52 157.1302,-52 157.1302,-52 151.1302,-52 145.1302,-46 145.1302,-40 145.1302,-40 145.1302,-28 145.1302,-28 145.1302,-22 151.1302,-16 157.1302,-16 157.1302,-16 269.609,-16 269.609,-16 275.609,-16 281.609,-22 281.609,-28 281.609,-28 281.609,-40 281.609,-40 281.609,-46 275.609,-52 269.609,-52"/>
<text text-anchor="middle" x="213.3696" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">router_address</text>
<text text-anchor="middle" x="213.3696" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadRouterAddress</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.ReadRouterAddress -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.ReadRouterAddress</title>
<g id="a_edge2"><a xlink:title="at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.ReadRouterAddress]">
<path fill="none" stroke="#8b4513" d="M54.2,-154.8153C69.8891,-130.7191 100.687,-88.1071 143.143,-57.8152"/>
<polygon fill="#8b4513" stroke="#8b4513" points="145.2054,-60.6453 151.4961,-52.1202 141.2621,-54.8616 145.2054,-60.6453"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Cost -->
<g id="node3" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Cost</title>
<g id="a_node3"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Cost | defined in router_address.go:163">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M254.7758,-130C254.7758,-130 171.9634,-130 171.9634,-130 165.9634,-130 159.9634,-124 159.9634,-118 159.9634,-118 159.9634,-106 159.9634,-106 159.9634,-100 165.9634,-94 171.9634,-94 171.9634,-94 254.7758,-94 254.7758,-94 260.7758,-94 266.7758,-100 266.7758,-106 266.7758,-106 266.7758,-118 266.7758,-118 266.7758,-124 260.7758,-130 254.7758,-130"/>
<text text-anchor="middle" x="213.3696" y="-116.2" font-family="Verdana" font-size="14.00" fill="#000000">router_address</text>
<text text-anchor="middle" x="213.3696" y="-99.4" font-family="Verdana" font-size="14.00" fill="#000000">Cost</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Cost -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Cost</title>
<g id="a_edge3"><a xlink:title="at fuzz.go:7: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Cost]">
<path fill="none" stroke="#8b4513" d="M70.3728,-163.1993C92.7676,-155.181 125.2557,-143.5488 153.6076,-133.3975"/>
<polygon fill="#8b4513" stroke="#8b4513" points="154.8086,-136.6851 163.0435,-130.019 152.4489,-130.0948 154.8086,-136.6851"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Expiration -->
<g id="node4" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Expiration</title>
<g id="a_node4"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Expiration | defined in router_address.go:168">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M254.7758,-191C254.7758,-191 171.9634,-191 171.9634,-191 165.9634,-191 159.9634,-185 159.9634,-179 159.9634,-179 159.9634,-167 159.9634,-167 159.9634,-161 165.9634,-155 171.9634,-155 171.9634,-155 254.7758,-155 254.7758,-155 260.7758,-155 266.7758,-161 266.7758,-167 266.7758,-167 266.7758,-179 266.7758,-179 266.7758,-185 260.7758,-191 254.7758,-191"/>
<text text-anchor="middle" x="213.3696" y="-177.2" font-family="Verdana" font-size="14.00" fill="#000000">router_address</text>
<text text-anchor="middle" x="213.3696" y="-160.4" font-family="Verdana" font-size="14.00" fill="#000000">Expiration</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Expiration -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Expiration</title>
<g id="a_edge4"><a xlink:title="at fuzz.go:8: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Expiration]">
<path fill="none" stroke="#8b4513" d="M70.3728,-173C91.7248,-173 122.2521,-173 149.6217,-173"/>
<polygon fill="#8b4513" stroke="#8b4513" points="149.9311,-176.5001 159.931,-173 149.931,-169.5001 149.9311,-176.5001"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Options -->
<g id="node5" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Options</title>
<g id="a_node5"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Options | defined in router_address.go:305">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M254.7758,-252C254.7758,-252 171.9634,-252 171.9634,-252 165.9634,-252 159.9634,-246 159.9634,-240 159.9634,-240 159.9634,-228 159.9634,-228 159.9634,-222 165.9634,-216 171.9634,-216 171.9634,-216 254.7758,-216 254.7758,-216 260.7758,-216 266.7758,-222 266.7758,-228 266.7758,-228 266.7758,-240 266.7758,-240 266.7758,-246 260.7758,-252 254.7758,-252"/>
<text text-anchor="middle" x="213.3696" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">router_address</text>
<text text-anchor="middle" x="213.3696" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">Options</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Options -->
<g id="edge5" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Options</title>
<g id="a_edge5"><a xlink:title="at fuzz.go:9: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).Options]">
<path fill="none" stroke="#8b4513" d="M70.3728,-182.8007C92.7676,-190.819 125.2557,-202.4512 153.6076,-212.6025"/>
<polygon fill="#8b4513" stroke="#8b4513" points="152.4489,-215.9052 163.0435,-215.981 154.8086,-209.3149 152.4489,-215.9052"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).TransportStyle -->
<g id="node6" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).TransportStyle</title>
<g id="a_node6"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).TransportStyle | defined in router_address.go:173">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M255.0718,-313C255.0718,-313 171.6674,-313 171.6674,-313 165.6674,-313 159.6674,-307 159.6674,-301 159.6674,-301 159.6674,-289 159.6674,-289 159.6674,-283 165.6674,-277 171.6674,-277 171.6674,-277 255.0718,-277 255.0718,-277 261.0718,-277 267.0718,-283 267.0718,-289 267.0718,-289 267.0718,-301 267.0718,-301 267.0718,-307 261.0718,-313 255.0718,-313"/>
<text text-anchor="middle" x="213.3696" y="-299.2" font-family="Verdana" font-size="14.00" fill="#000000">router_address</text>
<text text-anchor="middle" x="213.3696" y="-282.4" font-family="Verdana" font-size="14.00" fill="#000000">TransportStyle</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).TransportStyle -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_address.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).TransportStyle</title>
<g id="a_edge1"><a xlink:title="at fuzz.go:10: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/router_address.RouterAddress).TransportStyle]">
<path fill="none" stroke="#8b4513" d="M59.628,-191.1509C78.7338,-211.2098 111.7512,-243.5148 145,-265 149.0077,-267.5898 153.2766,-270.0551 157.6487,-272.3782"/>
<polygon fill="#8b4513" stroke="#8b4513" points="156.211,-275.5729 166.7171,-276.9412 159.3574,-269.3198 156.211,-275.5729"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/common/fuzz/router_identity"
![exportable.svg](exportable.svg)
## Usage
@ -10,3 +13,9 @@
```go
func Fuzz(data []byte) int
```
exportable
github.com/go-i2p/go-i2p/lib/common/fuzz/router_identity

View File

@ -0,0 +1,73 @@
<?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="293pt" height="184pt"
viewBox="0.00 0.00 293.42 184.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 184)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-184 293.4152,-184 293.4152,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-176 285.4152,-176 285.4152,-8 8,-8"/>
<text text-anchor="middle" x="146.7076" y="-155.8" font-family="Arial" font-size="18.00" fill="#000000">exportable</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M161.7805,-60C161.7805,-60 258.6347,-60 258.6347,-60 264.6347,-60 270.6347,-66 270.6347,-72 270.6347,-72 270.6347,-126 270.6347,-126 270.6347,-132 264.6347,-138 258.6347,-138 258.6347,-138 161.7805,-138 161.7805,-138 155.7805,-138 149.7805,-132 149.7805,-126 149.7805,-126 149.7805,-72 149.7805,-72 149.7805,-66 155.7805,-60 161.7805,-60"/>
<text text-anchor="middle" x="210.2076" y="-68.5" font-family="Arial" font-size="15.00" fill="#222222">(*KeysAndCert)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_identity.Fuzz -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_identity.Fuzz</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_identity.Fuzz | defined in fuzz.go:5&#10;at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity]&#10;at fuzz.go:7: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M58,-65C58,-65 28,-65 28,-65 22,-65 16,-59 16,-53 16,-53 16,-41 16,-41 16,-35 22,-29 28,-29 28,-29 58,-29 58,-29 64,-29 70,-35 70,-41 70,-41 70,-53 70,-53 70,-59 64,-65 58,-65"/>
<text text-anchor="middle" x="43" y="-42.8" font-family="Verdana" font-size="14.00" fill="#000000">Fuzz</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity | defined in router_identity.go:37">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M265.6234,-52C265.6234,-52 154.7918,-52 154.7918,-52 148.7918,-52 142.7918,-46 142.7918,-40 142.7918,-40 142.7918,-28 142.7918,-28 142.7918,-22 148.7918,-16 154.7918,-16 154.7918,-16 265.6234,-16 265.6234,-16 271.6234,-16 277.6234,-22 277.6234,-28 277.6234,-28 277.6234,-40 277.6234,-40 277.6234,-46 271.6234,-52 265.6234,-52"/>
<text text-anchor="middle" x="210.2076" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">router_identity</text>
<text text-anchor="middle" x="210.2076" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadRouterIdentity</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_identity.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_identity.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity</title>
<g id="a_edge1"><a xlink:title="at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity]">
<path fill="none" stroke="#8b4513" d="M70.2369,-44.8824C87.33,-43.5534 110.3072,-41.767 132.6983,-40.0262"/>
<polygon fill="#8b4513" stroke="#8b4513" points="133.223,-43.496 142.9216,-39.2313 132.6803,-36.5171 133.223,-43.496"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate -->
<g id="node3" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate</title>
<g id="a_node3"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate | defined in keys_and_cert.go:136">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M250.5619,-130C250.5619,-130 169.8533,-130 169.8533,-130 163.8533,-130 157.8533,-124 157.8533,-118 157.8533,-118 157.8533,-106 157.8533,-106 157.8533,-100 163.8533,-94 169.8533,-94 169.8533,-94 250.5619,-94 250.5619,-94 256.5619,-94 262.5619,-100 262.5619,-106 262.5619,-106 262.5619,-118 262.5619,-118 262.5619,-124 256.5619,-130 250.5619,-130"/>
<text text-anchor="middle" x="210.2076" y="-116.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="210.2076" y="-99.4" font-family="Verdana" font-size="14.00" fill="#000000">Certificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_identity.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/router_identity.Fuzz&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate</title>
<g id="a_edge2"><a xlink:title="at fuzz.go:7: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Certificate]">
<path fill="none" stroke="#8b4513" d="M70.3186,-59.5347C90.2689,-68.4946 118.0733,-80.5827 143,-90 144.6187,-90.6115 146.2628,-91.2224 147.9247,-91.8308"/>
<polygon fill="#8b4513" stroke="#8b4513" points="146.9887,-95.2129 157.5834,-95.2765 149.3408,-88.6199 146.9887,-95.2129"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/common/fuzz/string"
![exportable.svg](exportable.svg)
## Usage
@ -10,3 +13,9 @@
```go
func Fuzz(data []byte) int
```
exportable
github.com/go-i2p/go-i2p/lib/common/fuzz/string

View File

@ -0,0 +1,92 @@
<?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="257pt" height="245pt"
viewBox="0.00 0.00 257.22 245.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 245)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-245 257.2202,-245 257.2202,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-237 249.2202,-237 249.2202,-8 8,-8"/>
<text text-anchor="middle" x="128.6101" y="-216.8" font-family="Arial" font-size="18.00" fill="#000000">exportable</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString</title>
<g id="a_clust2"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M162.7812,-60C162.7812,-60 226.439,-60 226.439,-60 232.439,-60 238.439,-66 238.439,-72 238.439,-72 238.439,-187 238.439,-187 238.439,-193 232.439,-199 226.439,-199 226.439,-199 162.7812,-199 162.7812,-199 156.7812,-199 150.7812,-193 150.7812,-187 150.7812,-187 150.7812,-72 150.7812,-72 150.7812,-66 156.7812,-60 162.7812,-60"/>
<text text-anchor="middle" x="194.6101" y="-68.5" font-family="Arial" font-size="15.00" fill="#222222">(I2PString)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz | defined in fuzz.go:5&#10;at fuzz.go:7: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data]&#10;at fuzz.go:10: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data]&#10;at fuzz.go:8: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length]&#10;at fuzz.go:11: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length]&#10;at fuzz.go:9: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ToI2PString]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M58,-130C58,-130 28,-130 28,-130 22,-130 16,-124 16,-118 16,-118 16,-106 16,-106 16,-100 22,-94 28,-94 28,-94 58,-94 58,-94 64,-94 70,-100 70,-106 70,-106 70,-118 70,-118 70,-124 64,-130 58,-130"/>
<text text-anchor="middle" x="43" y="-107.8" font-family="Verdana" font-size="14.00" fill="#000000">Fuzz</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ToI2PString -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ToI2PString</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ToI2PString | defined in string.go:114">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M229.3306,-52C229.3306,-52 159.8896,-52 159.8896,-52 153.8896,-52 147.8896,-46 147.8896,-40 147.8896,-40 147.8896,-28 147.8896,-28 147.8896,-22 153.8896,-16 159.8896,-16 159.8896,-16 229.3306,-16 229.3306,-16 235.3306,-16 241.3306,-22 241.3306,-28 241.3306,-28 241.3306,-40 241.3306,-40 241.3306,-46 235.3306,-52 229.3306,-52"/>
<text text-anchor="middle" x="194.6101" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="194.6101" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">ToI2PString</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ToI2PString -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ToI2PString</title>
<g id="a_edge3"><a xlink:title="at fuzz.go:9: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ToI2PString]">
<path fill="none" stroke="#8b4513" d="M70.0043,-97.129C89.2049,-86.6594 115.8894,-72.3156 146.6535,-56.7465"/>
<polygon fill="#8b4513" stroke="#8b4513" points="148.5211,-59.7249 155.8799,-52.1027 145.374,-53.4722 148.5211,-59.7249"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data -->
<g id="node3" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data</title>
<g id="a_node3"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data | defined in string.go:73">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M209.6101,-130C209.6101,-130 179.6101,-130 179.6101,-130 173.6101,-130 167.6101,-124 167.6101,-118 167.6101,-118 167.6101,-106 167.6101,-106 167.6101,-100 173.6101,-94 179.6101,-94 179.6101,-94 209.6101,-94 209.6101,-94 215.6101,-94 221.6101,-100 221.6101,-106 221.6101,-106 221.6101,-118 221.6101,-118 221.6101,-124 215.6101,-130 209.6101,-130"/>
<text text-anchor="middle" x="194.6101" y="-116.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="194.6101" y="-99.4" font-family="Verdana" font-size="14.00" fill="#000000">Data</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data</title>
<g id="a_edge1"><a xlink:title="at fuzz.go:7: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data]&#10;at fuzz.go:10: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Data]">
<path fill="none" stroke="#8b4513" d="M70.1048,-112C94.3917,-112 130.2444,-112 157.2471,-112"/>
<polygon fill="#8b4513" stroke="#8b4513" points="157.4848,-115.5001 167.4848,-112 157.4847,-108.5001 157.4848,-115.5001"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length -->
<g id="node4" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length</title>
<g id="a_node4"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length | defined in string.go:31">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M214.2688,-191C214.2688,-191 174.9514,-191 174.9514,-191 168.9514,-191 162.9514,-185 162.9514,-179 162.9514,-179 162.9514,-167 162.9514,-167 162.9514,-161 168.9514,-155 174.9514,-155 174.9514,-155 214.2688,-155 214.2688,-155 220.2688,-155 226.2688,-161 226.2688,-167 226.2688,-167 226.2688,-179 226.2688,-179 226.2688,-185 220.2688,-191 214.2688,-191"/>
<text text-anchor="middle" x="194.6101" y="-177.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="194.6101" y="-160.4" font-family="Verdana" font-size="14.00" fill="#000000">Length</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/fuzz/string.Fuzz&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length</title>
<g id="a_edge2"><a xlink:title="at fuzz.go:8: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length]&#10;at fuzz.go:11: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.I2PString).Length]">
<path fill="none" stroke="#8b4513" d="M70.1048,-122.9056C93.2412,-132.2144 126.8736,-145.7464 153.3522,-156.4"/>
<polygon fill="#8b4513" stroke="#8b4513" points="152.1674,-159.6959 162.7511,-160.1816 154.7804,-153.2018 152.1674,-159.6959"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -2,32 +2,34 @@
--
import "github.com/go-i2p/go-i2p/lib/common/key_certificate"
![key_certificate.svg](key_certificate.svg)
Package key_certificate implements the I2P Destination common data structure
## Usage
```go
const (
KEYCERT_SIGN_DSA_SHA1 = iota
KEYCERT_SIGN_P256
KEYCERT_SIGN_P384
KEYCERT_SIGN_P521
KEYCERT_SIGN_RSA2048
KEYCERT_SIGN_RSA3072
KEYCERT_SIGN_RSA4096
KEYCERT_SIGN_ED25519
KEYCERT_SIGN_ED25519PH
KEYCERT_SIGN_DSA_SHA1 = 0
KEYCERT_SIGN_P256 = 1
KEYCERT_SIGN_P384 = 2
KEYCERT_SIGN_P521 = 3
KEYCERT_SIGN_RSA2048 = 4
KEYCERT_SIGN_RSA3072 = 5
KEYCERT_SIGN_RSA4096 = 6
KEYCERT_SIGN_ED25519 = 7
KEYCERT_SIGN_ED25519PH = 8
)
```
Key Certificate Signing Key Types
```go
const (
KEYCERT_CRYPTO_ELG = iota
KEYCERT_CRYPTO_P256
KEYCERT_CRYPTO_P384
KEYCERT_CRYPTO_P521
KEYCERT_CRYPTO_X25519
KEYCERT_CRYPTO_ELG = 0
KEYCERT_CRYPTO_P256 = 1
KEYCERT_CRYPTO_P384 = 2
KEYCERT_CRYPTO_P521 = 3
KEYCERT_CRYPTO_X25519 = 4
)
```
Key Certificate Public Key Types
@ -45,7 +47,7 @@ const (
KEYCERT_SIGN_ED25519PH_SIZE = 32
)
```
SigningPublicKey sizes for Signing Key Types
signingPublicKey sizes for Signing Key Types
```go
const (
@ -56,7 +58,7 @@ const (
KEYCERT_CRYPTO_X25519_SIZE = 32
)
```
PublicKey sizes for Public Key Types
publicKey sizes for Public Key Types
```go
const (
@ -66,17 +68,42 @@ const (
```
Sizes of structures in KeyCertificates
```go
const (
CRYPTO_KEY_TYPE_ELGAMAL = 0 // ElGamal
// Signature Types
SIGNATURE_TYPE_DSA_SHA1 = 0 // DSA-SHA1
SIGNATURE_TYPE_ED25519_SHA512 = 7 // Ed25519
)
```
```go
const (
KEYCERT_MIN_SIZE = 7
)
```
```go
var CryptoPublicKeySizes = map[uint16]int{
CRYPTO_KEY_TYPE_ELGAMAL: 256,
}
```
```go
var SignaturePublicKeySizes = map[uint16]int{
SIGNATURE_TYPE_DSA_SHA1: 128,
SIGNATURE_TYPE_ED25519_SHA512: 32,
}
```
#### type KeyCertificate
```go
type KeyCertificate struct {
Certificate
SpkType Integer
CpkType Integer
}
```
@ -85,9 +112,8 @@ type KeyCertificate []byte
#### func KeyCertificateFromCertificate
```go
func KeyCertificateFromCertificate(certificate Certificate) *KeyCertificate
func KeyCertificateFromCertificate(cert Certificate) (*KeyCertificate, error)
```
KeyCertificateFromCertificate returns a *KeyCertificate from a *Certificate.
#### func NewKeyCertificate
@ -101,54 +127,72 @@ returned. Returns a list of errors that occurred during parsing.
#### func (KeyCertificate) ConstructPublicKey
```go
func (key_certificate KeyCertificate) ConstructPublicKey(data []byte) (public_key crypto.PublicKey, err error)
func (keyCertificate KeyCertificate) ConstructPublicKey(data []byte) (public_key crypto.RecievingPublicKey, err error)
```
ConstructPublicKey returns a PublicKey constructed using any excess data that
ConstructPublicKey returns a publicKey constructed using any excess data that
may be stored in the KeyCertififcate. Returns enr errors encountered while
parsing.
#### func (KeyCertificate) ConstructSigningPublicKey
```go
func (key_certificate KeyCertificate) ConstructSigningPublicKey(data []byte) (signing_public_key crypto.SigningPublicKey, err error)
func (keyCertificate KeyCertificate) ConstructSigningPublicKey(data []byte) (signing_public_key crypto.SigningPublicKey, err error)
```
ConstructSigningPublicKey returns a SingingPublicKey constructed using any
excess data that may be stored in the KeyCertificate. Returns any errors
encountered while parsing.
#### func (*KeyCertificate) CryptoPublicKeySize
```go
func (keyCertificate *KeyCertificate) CryptoPublicKeySize() (int, error)
```
#### func (KeyCertificate) CryptoSize
```go
func (key_certificate KeyCertificate) CryptoSize() (size int)
func (keyCertificate KeyCertificate) CryptoSize() (size int)
```
CryptoSize return the size of a Public Key corresponding to the Key
Certificate's PublicKey type.
Certificate's publicKey type.
#### func (KeyCertificate) Data
```go
func (key_certificate KeyCertificate) Data() ([]byte, error)
func (keyCertificate KeyCertificate) Data() ([]byte, error)
```
Data returns the raw []byte contained in the Certificate.
#### func (KeyCertificate) PublicKeyType
```go
func (key_certificate KeyCertificate) PublicKeyType() (pubkey_type int)
func (keyCertificate KeyCertificate) PublicKeyType() (pubkey_type int)
```
PublicKeyType returns the PublicKey type as a Go integer.
PublicKeyType returns the publicKey type as a Go integer.
#### func (KeyCertificate) SignatureSize
```go
func (key_certificate KeyCertificate) SignatureSize() (size int)
func (keyCertificate KeyCertificate) SignatureSize() (size int)
```
SignatureSize return the size of a Signature corresponding to the Key
Certificate's SigningPublicKey type.
Certificate's signingPublicKey type.
#### func (*KeyCertificate) SigningPublicKeySize
```go
func (keyCertificate *KeyCertificate) SigningPublicKeySize() int
```
#### func (KeyCertificate) SigningPublicKeyType
```go
func (key_certificate KeyCertificate) SigningPublicKeyType() (signing_pubkey_type int)
func (keyCertificate KeyCertificate) SigningPublicKeyType() (signing_pubkey_type int)
```
SigningPublicKeyType returns the SigningPublicKey type as a Go integer.
SigningPublicKeyType returns the signingPublicKey type as a Go integer.
key_certificate
github.com/go-i2p/go-i2p/lib/common/key_certificate

View File

@ -31,8 +31,9 @@ import (
"fmt"
"github.com/go-i2p/go-i2p/lib/common/signature"
"github.com/samber/oops"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/sirupsen/logrus"
. "github.com/go-i2p/go-i2p/lib/common/certificate"
@ -132,7 +133,7 @@ func (keyCertificate KeyCertificate) PublicKeyType() (pubkey_type int) {
// ConstructPublicKey returns a publicKey constructed using any excess data that may be stored in the KeyCertififcate.
// Returns enr errors encountered while parsing.
func (keyCertificate KeyCertificate) ConstructPublicKey(data []byte) (public_key crypto.PublicKey, err error) {
func (keyCertificate KeyCertificate) ConstructPublicKey(data []byte) (public_key crypto.RecievingPublicKey, err error) {
log.WithFields(logrus.Fields{
"input_length": len(data),
}).Debug("Constructing publicKey from keyCertificate")
@ -148,7 +149,7 @@ func (keyCertificate KeyCertificate) ConstructPublicKey(data []byte) (public_key
"required_len": KEYCERT_PUBKEY_SIZE,
"reason": "not enough data",
}).Error("error constructing public key")
err = fmt.Errorf("error constructing public key: not enough data")
err = oops.Errorf("error constructing public key: not enough data")
return
}
switch key_type {
@ -191,7 +192,7 @@ var SignaturePublicKeySizes = map[uint16]int{
func (keyCertificate *KeyCertificate) CryptoPublicKeySize() (int, error) {
size, exists := CryptoPublicKeySizes[uint16(keyCertificate.CpkType.Int())]
if !exists {
return 0, fmt.Errorf("unknown crypto key type: %d", keyCertificate.CpkType.Int())
return 0, oops.Errorf("unknown crypto key type: %d", keyCertificate.CpkType.Int())
}
return size, nil
}
@ -240,7 +241,7 @@ func (keyCertificate KeyCertificate) ConstructSigningPublicKey(data []byte) (sig
"required_len": KEYCERT_SPK_SIZE,
"reason": "not enough data",
}).Error("error constructing signing public key")
err = fmt.Errorf("error constructing signing public key: not enough data")
err = oops.Errorf("error constructing signing public key: not enough data")
return
}
switch signing_key_type {
@ -297,7 +298,7 @@ func (keyCertificate KeyCertificate) ConstructSigningPublicKey(data []byte) (sig
log.WithFields(logrus.Fields{
"signing_key_type": signing_key_type,
}).Warn("Unknown signing key type")
return nil, fmt.Errorf("unknown signing key type")
return nil, oops.Errorf("unknown signing key type")
}
return
@ -365,11 +366,11 @@ func NewKeyCertificate(bytes []byte) (key_certificate *KeyCertificate, remainder
}
if certificate.Type() != CERT_KEY {
return nil, remainder, fmt.Errorf("invalid certificate type: %d", certificate.Type())
return nil, remainder, oops.Errorf("invalid certificate type: %d", certificate.Type())
}
if len(certificate.Data()) < 4 {
return nil, remainder, fmt.Errorf("key certificate data too short")
return nil, remainder, oops.Errorf("key certificate data too short")
}
log.Println("Certificate Data in NewKeyCertificate: ", certificate.Data()[0:2], certificate.Data()[2:4])
@ -393,7 +394,7 @@ func NewKeyCertificate(bytes []byte) (key_certificate *KeyCertificate, remainder
func KeyCertificateFromCertificate(cert Certificate) (*KeyCertificate, error) {
if cert.Type() != CERT_KEY {
return nil, fmt.Errorf("expected Key Certificate type, got %d", cert.Type())
return nil, oops.Errorf("expected Key Certificate type, got %d", cert.Type())
}
data := cert.Data()
@ -401,7 +402,7 @@ func KeyCertificateFromCertificate(cert Certificate) (*KeyCertificate, error) {
fmt.Printf("Certificate Data Bytes in KeyCertificateFromCertificate: %v\n", data)
if len(data) < 4 {
return nil, fmt.Errorf("certificate payload too short in KeyCertificateFromCertificate")
return nil, oops.Errorf("certificate payload too short in KeyCertificateFromCertificate")
}
cpkTypeBytes := data[0:2]

View File

@ -0,0 +1,764 @@
<?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="869pt" height="1198pt"
viewBox="0.00 0.00 868.95 1198.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 1198)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-1198 868.947,-1198 868.947,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-1190 860.947,-1190 860.947,-8 8,-8"/>
<text text-anchor="middle" x="434.4735" y="-1169.8" font-family="Arial" font-size="18.00" fill="#000000">key_certificate</text>
</g>
<g id="clust7" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate</title>
<g id="a_clust7"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate">
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M28,-616C28,-616 643.9118,-616 643.9118,-616 649.9118,-616 655.9118,-622 655.9118,-628 655.9118,-628 655.9118,-804 655.9118,-804 655.9118,-810 649.9118,-816 643.9118,-816 643.9118,-816 28,-816 28,-816 22,-816 16,-810 16,-804 16,-804 16,-628 16,-628 16,-622 22,-616 28,-616"/>
<text text-anchor="middle" x="335.9559" y="-624.5" font-family="Arial" font-size="15.00" fill="#222222">(KeyCertificate)</text>
</a>
</g>
</g>
<g id="clust6" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer</title>
<g id="a_clust6"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M773.0248,-279C773.0248,-279 821.0248,-279 821.0248,-279 827.0248,-279 833.0248,-285 833.0248,-291 833.0248,-291 833.0248,-345 833.0248,-345 833.0248,-351 827.0248,-357 821.0248,-357 821.0248,-357 773.0248,-357 773.0248,-357 767.0248,-357 761.0248,-351 761.0248,-345 761.0248,-345 761.0248,-291 761.0248,-291 761.0248,-285 767.0248,-279 773.0248,-279"/>
<text text-anchor="middle" x="797.0248" y="-287.5" font-family="Arial" font-size="15.00" fill="#222222">(Integer)</text>
</a>
</g>
</g>
<g id="clust5" class="cluster">
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
<g id="a_clust5"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M769.9673,-511C769.9673,-511 824.0823,-511 824.0823,-511 830.0823,-511 836.0823,-517 836.0823,-523 836.0823,-523 836.0823,-638 836.0823,-638 836.0823,-644 830.0823,-650 824.0823,-650 824.0823,-650 769.9673,-650 769.9673,-650 763.9673,-650 757.9673,-644 757.9673,-638 757.9673,-638 757.9673,-523 757.9673,-523 757.9673,-517 763.9673,-511 769.9673,-511"/>
<text text-anchor="middle" x="797.0248" y="-519.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
</a>
</g>
</g>
<g id="clust4" class="cluster">
<title>cluster_*github.com/go&#45;i2p/logger.Logger</title>
<g id="a_clust4"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M757.9154,-835C757.9154,-835 836.1342,-835 836.1342,-835 842.1342,-835 848.1342,-841 848.1342,-847 848.1342,-847 848.1342,-1084 848.1342,-1084 848.1342,-1090 842.1342,-1096 836.1342,-1096 836.1342,-1096 757.9154,-1096 757.9154,-1096 751.9154,-1096 745.9154,-1090 745.9154,-1084 745.9154,-1084 745.9154,-847 745.9154,-847 745.9154,-841 751.9154,-835 757.9154,-835"/>
<text text-anchor="middle" x="797.0248" y="-843.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&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate</title>
<g id="a_clust3"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate">
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M498.8136,-204C498.8136,-204 641.5794,-204 641.5794,-204 647.5794,-204 653.5794,-210 653.5794,-216 653.5794,-216 653.5794,-331 653.5794,-331 653.5794,-337 647.5794,-343 641.5794,-343 641.5794,-343 498.8136,-343 498.8136,-343 492.8136,-343 486.8136,-337 486.8136,-331 486.8136,-331 486.8136,-216 486.8136,-216 486.8136,-210 492.8136,-204 498.8136,-204"/>
<text text-anchor="middle" x="570.1965" y="-212.5" font-family="Arial" font-size="15.00" fill="#222222">(*KeyCertificate)</text>
</a>
</g>
</g>
<g id="clust2" class="cluster">
<title>cluster_*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M760.2527,-16C760.2527,-16 834.7969,-16 834.7969,-16 840.7969,-16 846.7969,-22 846.7969,-28 846.7969,-28 846.7969,-204 846.7969,-204 846.7969,-210 840.7969,-216 834.7969,-216 834.7969,-216 760.2527,-216 760.2527,-216 754.2527,-216 748.2527,-210 748.2527,-204 748.2527,-204 748.2527,-28 748.2527,-28 748.2527,-22 754.2527,-16 760.2527,-16"/>
<text text-anchor="middle" x="797.5248" y="-24.5" font-family="Arial" font-size="15.00" fill="#222222">(*Certificate)</text>
</a>
</g>
</g>
<!-- github.com/samber/oops.Errorf -->
<g id="node1" class="node">
<title>github.com/samber/oops.Errorf</title>
<g id="a_node1"><a xlink:title="github.com/samber/oops.Errorf | defined in oops.go:34">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M814.2201,-269C814.2201,-269 779.8295,-269 779.8295,-269 773.8295,-269 767.8295,-263 767.8295,-257 767.8295,-257 767.8295,-245 767.8295,-245 767.8295,-239 773.8295,-233 779.8295,-233 779.8295,-233 814.2201,-233 814.2201,-233 820.2201,-233 826.2201,-239 826.2201,-245 826.2201,-245 826.2201,-257 826.2201,-257 826.2201,-263 820.2201,-269 814.2201,-269"/>
<text text-anchor="middle" x="797.0248" y="-255.2" font-family="Verdana" font-size="14.00" fill="#000000">oops</text>
<text text-anchor="middle" x="797.0248" y="-238.4" font-family="Verdana" font-size="14.00" fill="#000000">Errorf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate | defined in key_certificate.go:356&#10;at key_certificate.go:368: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at key_certificate.go:369: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at key_certificate.go:369: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:373: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:362: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate]&#10;at key_certificate.go:384: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:384: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:387: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:388: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:364: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at key_certificate.go:372: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:375: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:375: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:377: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:378: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:375: calling [(*github.com/sirupsen/logrus.Logger).Println]&#10;at key_certificate.go:384: calling [(*github.com/sirupsen/logrus.Logger).Println]&#10;at key_certificate.go:377: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger]&#10;at key_certificate.go:378: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger]&#10;at key_certificate.go:357: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:386: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:359: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:390: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:364: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M624.5242,-440C624.5242,-440 515.8688,-440 515.8688,-440 509.8688,-440 503.8688,-434 503.8688,-428 503.8688,-428 503.8688,-416 503.8688,-416 503.8688,-410 509.8688,-404 515.8688,-404 515.8688,-404 624.5242,-404 624.5242,-404 630.5242,-404 636.5242,-410 636.5242,-416 636.5242,-416 636.5242,-428 636.5242,-428 636.5242,-434 630.5242,-440 624.5242,-440"/>
<text text-anchor="middle" x="570.1965" y="-417.8" font-family="Verdana" font-size="14.00" fill="#000000">NewKeyCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge18" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge18"><a xlink:title="at key_certificate.go:369: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:373: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M596.8742,-403.9091C617.0949,-389.7754 645.2117,-369.2031 668.1026,-349 703.2178,-318.008 702.1893,-299.0641 741.1026,-273 746.3929,-269.4565 752.3392,-266.3522 758.328,-263.6791"/>
<polygon fill="#8b4513" stroke="#8b4513" points="759.7675,-266.8716 767.6857,-259.8322 757.1059,-260.3973 759.7675,-266.8716"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate | defined in certificate.go:201">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M840.8693,-411C840.8693,-411 753.1803,-411 753.1803,-411 747.1803,-411 741.1803,-405 741.1803,-399 741.1803,-399 741.1803,-387 741.1803,-387 741.1803,-381 747.1803,-375 753.1803,-375 753.1803,-375 840.8693,-375 840.8693,-375 846.8693,-375 852.8693,-381 852.8693,-387 852.8693,-387 852.8693,-399 852.8693,-399 852.8693,-405 846.8693,-411 840.8693,-411"/>
<text text-anchor="middle" x="797.0248" y="-397.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="797.0248" y="-380.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate -->
<g id="edge20" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate</title>
<g id="a_edge20"><a xlink:title="at key_certificate.go:362: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.ReadCertificate]">
<path fill="none" stroke="#8b4513" d="M636.7198,-413.495C666.3047,-409.7126 701.0564,-405.2696 730.6267,-401.489"/>
<polygon fill="#8b4513" stroke="#8b4513" points="731.3777,-404.9216 740.853,-400.1816 730.4899,-397.9781 731.3777,-404.9216"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger | defined in integer.go:51">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M831.4325,-472C831.4325,-472 762.6171,-472 762.6171,-472 756.6171,-472 750.6171,-466 750.6171,-460 750.6171,-460 750.6171,-448 750.6171,-448 750.6171,-442 756.6171,-436 762.6171,-436 762.6171,-436 831.4325,-436 831.4325,-436 837.4325,-436 843.4325,-442 843.4325,-448 843.4325,-448 843.4325,-460 843.4325,-460 843.4325,-466 837.4325,-472 831.4325,-472"/>
<text text-anchor="middle" x="797.0248" y="-458.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="797.0248" y="-441.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadInteger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger -->
<g id="edge42" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger</title>
<g id="a_edge42"><a xlink:title="at key_certificate.go:377: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger]&#10;at key_certificate.go:378: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.ReadInteger]">
<path fill="none" stroke="#8b4513" d="M636.7198,-431.3848C669.748,-436.0443 709.2155,-441.6122 740.7245,-446.0574"/>
<polygon fill="#8b4513" stroke="#8b4513" points="740.2658,-449.5273 750.6567,-447.4586 741.2437,-442.5959 740.2658,-449.5273"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type -->
<g id="node9" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type</title>
<g id="a_node9"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type | defined in certificate.go:116">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M824.9814,-147C824.9814,-147 769.0682,-147 769.0682,-147 763.0682,-147 757.0682,-141 757.0682,-135 757.0682,-135 757.0682,-123 757.0682,-123 757.0682,-117 763.0682,-111 769.0682,-111 769.0682,-111 824.9814,-111 824.9814,-111 830.9814,-111 836.9814,-117 836.9814,-123 836.9814,-123 836.9814,-135 836.9814,-135 836.9814,-141 830.9814,-147 824.9814,-147"/>
<text text-anchor="middle" x="797.0248" y="-133.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="797.0248" y="-116.4" font-family="Verdana" font-size="14.00" fill="#000000">Type</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type -->
<g id="edge17" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type</title>
<g id="a_edge17"><a xlink:title="at key_certificate.go:368: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at key_certificate.go:369: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]">
<path fill="none" stroke="#8b4513" d="M603.5382,-403.7704C624.5147,-390.8516 650.7951,-371.7977 668.1026,-349 722.5518,-277.2789 681.9563,-227.8996 741.1026,-160 743.3959,-157.3673 745.9699,-154.9135 748.7209,-152.6345"/>
<polygon fill="#8b4513" stroke="#8b4513" points="750.8606,-155.4057 756.8567,-146.6709 746.7222,-149.76 750.8606,-155.4057"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data -->
<g id="node10" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data</title>
<g id="a_node10"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data | defined in certificate.go:134">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M824.9814,-208C824.9814,-208 769.0682,-208 769.0682,-208 763.0682,-208 757.0682,-202 757.0682,-196 757.0682,-196 757.0682,-184 757.0682,-184 757.0682,-178 763.0682,-172 769.0682,-172 769.0682,-172 824.9814,-172 824.9814,-172 830.9814,-172 836.9814,-178 836.9814,-184 836.9814,-184 836.9814,-196 836.9814,-196 836.9814,-202 830.9814,-208 824.9814,-208"/>
<text text-anchor="middle" x="797.0248" y="-194.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="797.0248" y="-177.4" font-family="Verdana" font-size="14.00" fill="#000000">Data</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data -->
<g id="edge27" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data</title>
<g id="a_edge27"><a xlink:title="at key_certificate.go:372: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:375: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:375: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:377: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]&#10;at key_certificate.go:378: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]">
<path fill="none" stroke="#8b4513" d="M601.2704,-403.9136C622.0733,-390.6712 649.0339,-371.192 668.1026,-349 713.0667,-296.671 689.5991,-257.9074 741.1026,-212 743.2565,-210.0801 745.5977,-208.3183 748.0606,-206.7028"/>
<polygon fill="#8b4513" stroke="#8b4513" points="749.8257,-209.7255 756.8078,-201.7567 746.3802,-203.6322 749.8257,-209.7255"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="node13" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_node13"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithFields | defined in log.go:60">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M828.2439,-966C828.2439,-966 765.8057,-966 765.8057,-966 759.8057,-966 753.8057,-960 753.8057,-954 753.8057,-954 753.8057,-942 753.8057,-942 753.8057,-936 759.8057,-930 765.8057,-930 765.8057,-930 828.2439,-930 828.2439,-930 834.2439,-930 840.2439,-936 840.2439,-942 840.2439,-942 840.2439,-954 840.2439,-954 840.2439,-960 834.2439,-966 828.2439,-966"/>
<text text-anchor="middle" x="797.0248" y="-952.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="797.0248" y="-935.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge47" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge47"><a xlink:title="at key_certificate.go:357: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:386: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M581.3431,-440.0377C601.1893,-472.8081 642.9244,-544.7714 668.1026,-610 691.4331,-670.4419 690.0503,-687.9844 705.1026,-751 722.7428,-824.8496 695.4332,-857.3432 741.1026,-918 742.5025,-919.8594 744.0522,-921.6161 745.7174,-923.2746"/>
<polygon fill="#8b4513" stroke="#8b4513" points="743.741,-926.185 753.652,-929.9296 748.2394,-920.8217 743.741,-926.185"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="node14" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_node14"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Error | defined in log.go:42">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M814.7911,-1027C814.7911,-1027 779.2585,-1027 779.2585,-1027 773.2585,-1027 767.2585,-1021 767.2585,-1015 767.2585,-1015 767.2585,-1003 767.2585,-1003 767.2585,-997 773.2585,-991 779.2585,-991 779.2585,-991 814.7911,-991 814.7911,-991 820.7911,-991 826.7911,-997 826.7911,-1003 826.7911,-1003 826.7911,-1015 826.7911,-1015 826.7911,-1021 820.7911,-1027 814.7911,-1027"/>
<text text-anchor="middle" x="797.0248" y="-1013.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="797.0248" y="-996.4" font-family="Verdana" font-size="14.00" fill="#000000">Error</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge26" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge26"><a xlink:title="at key_certificate.go:364: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M581.9063,-440.1476C602.451,-472.8028 644.9967,-544.2038 668.1026,-610 723.495,-767.735 641.686,-844.5939 741.1026,-979 745.5619,-985.0288 751.603,-989.9724 758.0695,-993.9818"/>
<polygon fill="#8b4513" stroke="#8b4513" points="756.5889,-997.1611 767.0427,-998.8842 759.9451,-991.0181 756.5889,-997.1611"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="node16" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_node16"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithError | defined in log.go:66">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M825.5563,-905C825.5563,-905 768.4933,-905 768.4933,-905 762.4933,-905 756.4933,-899 756.4933,-893 756.4933,-893 756.4933,-881 756.4933,-881 756.4933,-875 762.4933,-869 768.4933,-869 768.4933,-869 825.5563,-869 825.5563,-869 831.5563,-869 837.5563,-875 837.5563,-881 837.5563,-881 837.5563,-893 837.5563,-893 837.5563,-899 831.5563,-905 825.5563,-905"/>
<text text-anchor="middle" x="797.0248" y="-891.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="797.0248" y="-874.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge49" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge49"><a xlink:title="at key_certificate.go:364: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M579.9178,-440.0117C597.8251,-473.3324 637.033,-546.9525 668.1026,-610 712.7258,-700.5509 762.2521,-809.5549 784.7302,-859.5321"/>
<polygon fill="#8b4513" stroke="#8b4513" points="781.5658,-861.0294 788.8557,-868.7176 787.9513,-858.1614 781.5658,-861.0294"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Logger).Debug -->
<g id="node17" class="node">
<title>(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_node17"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Debug | defined in logger.go:221">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M815.8468,-642C815.8468,-642 778.2028,-642 778.2028,-642 772.2028,-642 766.2028,-636 766.2028,-630 766.2028,-630 766.2028,-618 766.2028,-618 766.2028,-612 772.2028,-606 778.2028,-606 778.2028,-606 815.8468,-606 815.8468,-606 821.8468,-606 827.8468,-612 827.8468,-618 827.8468,-618 827.8468,-630 827.8468,-630 827.8468,-636 821.8468,-642 815.8468,-642"/>
<text text-anchor="middle" x="797.0248" y="-628.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="797.0248" y="-611.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge48" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge48"><a xlink:title="at key_certificate.go:359: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:390: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M584.9677,-440.0797C612.8973,-473.4782 676.4662,-545.8263 741.1026,-594 746.1462,-597.759 751.7216,-601.3335 757.3408,-604.6188"/>
<polygon fill="#8b4513" stroke="#8b4513" points="755.6991,-607.7107 766.1369,-609.5284 759.1108,-601.5984 755.6991,-607.7107"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Logger).Println -->
<g id="node18" class="node">
<title>(*github.com/sirupsen/logrus.Logger).Println</title>
<g id="a_node18"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Println | defined in logger.go:315">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M816.1399,-581C816.1399,-581 777.9097,-581 777.9097,-581 771.9097,-581 765.9097,-575 765.9097,-569 765.9097,-569 765.9097,-557 765.9097,-557 765.9097,-551 771.9097,-545 777.9097,-545 777.9097,-545 816.1399,-545 816.1399,-545 822.1399,-545 828.1399,-551 828.1399,-557 828.1399,-557 828.1399,-569 828.1399,-569 828.1399,-575 822.1399,-581 816.1399,-581"/>
<text text-anchor="middle" x="797.0248" y="-567.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="797.0248" y="-550.4" font-family="Verdana" font-size="14.00" fill="#000000">Println</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/sirupsen/logrus.Logger).Println -->
<g id="edge28" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(*github.com/sirupsen/logrus.Logger).Println</title>
<g id="a_edge28"><a xlink:title="at key_certificate.go:375: calling [(*github.com/sirupsen/logrus.Logger).Println]&#10;at key_certificate.go:384: calling [(*github.com/sirupsen/logrus.Logger).Println]">
<path fill="none" stroke="#8b4513" d="M613.0003,-440.1284C640.9539,-453.2026 677.2897,-472.6265 705.1026,-496 724.7105,-512.4782 720.4893,-525.7984 741.1026,-541 745.8362,-544.4909 751.1969,-547.5111 756.679,-550.0988"/>
<polygon fill="#8b4513" stroke="#8b4513" points="755.3592,-553.3409 765.9302,-554.0519 758.1098,-546.904 755.3592,-553.3409"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="node19" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_node19"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int | defined in integer.go:32">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M812.0248,-349C812.0248,-349 782.0248,-349 782.0248,-349 776.0248,-349 770.0248,-343 770.0248,-337 770.0248,-337 770.0248,-325 770.0248,-325 770.0248,-319 776.0248,-313 782.0248,-313 782.0248,-313 812.0248,-313 812.0248,-313 818.0248,-313 824.0248,-319 824.0248,-325 824.0248,-325 824.0248,-337 824.0248,-337 824.0248,-343 818.0248,-349 812.0248,-349"/>
<text text-anchor="middle" x="797.0248" y="-335.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="797.0248" y="-318.4" font-family="Verdana" font-size="14.00" fill="#000000">Int</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge21" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge21"><a xlink:title="at key_certificate.go:384: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:384: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:387: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:388: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M614.774,-403.8763C649.2358,-389.8959 698.151,-370.1187 741.1026,-353 747.4188,-350.4826 754.1434,-347.8212 760.6591,-345.2522"/>
<polygon fill="#8b4513" stroke="#8b4513" points="761.9606,-348.5013 769.9839,-341.5819 759.3968,-341.9877 761.9606,-348.5013"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.init -->
<g id="node5" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.init</title>
<g id="a_node5"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.init | defined in .:0&#10;at key_certificate.go:44: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M129.5505,-52C129.5505,-52 99.5505,-52 99.5505,-52 93.5505,-52 87.5505,-46 87.5505,-40 87.5505,-40 87.5505,-28 87.5505,-28 87.5505,-22 93.5505,-16 99.5505,-16 99.5505,-16 129.5505,-16 129.5505,-16 135.5505,-16 141.5505,-22 141.5505,-28 141.5505,-28 141.5505,-40 141.5505,-40 141.5505,-46 135.5505,-52 129.5505,-52"/>
<text text-anchor="middle" x="114.5505" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node6" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node6"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M387.3852,-52C387.3852,-52 290.0062,-52 290.0062,-52 284.0062,-52 278.0062,-46 278.0062,-40 278.0062,-40 278.0062,-28 278.0062,-28 278.0062,-22 284.0062,-16 290.0062,-16 290.0062,-16 387.3852,-16 387.3852,-16 393.3852,-16 399.3852,-22 399.3852,-28 399.3852,-28 399.3852,-40 399.3852,-40 399.3852,-46 393.3852,-52 387.3852,-52"/>
<text text-anchor="middle" x="338.6957" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="338.6957" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge2"><a xlink:title="at key_certificate.go:44: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M141.5876,-34C172.6327,-34 224.7965,-34 267.6649,-34"/>
<polygon fill="#8b4513" stroke="#8b4513" points="267.7801,-37.5001 277.7801,-34 267.7801,-30.5001 267.7801,-37.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate -->
<g id="node7" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate</title>
<g id="a_node7"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate | defined in key_certificate.go:395&#10;at key_certificate.go:417: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:418: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:396: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at key_certificate.go:397: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at key_certificate.go:397: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:405: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:400: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M656.0088,-94C656.0088,-94 484.3842,-94 484.3842,-94 478.3842,-94 472.3842,-88 472.3842,-82 472.3842,-82 472.3842,-70 472.3842,-70 472.3842,-64 478.3842,-58 484.3842,-58 484.3842,-58 656.0088,-58 656.0088,-58 662.0088,-58 668.0088,-64 668.0088,-70 668.0088,-70 668.0088,-82 668.0088,-82 668.0088,-88 662.0088,-94 656.0088,-94"/>
<text text-anchor="middle" x="570.1965" y="-71.8" font-family="Verdana" font-size="14.00" fill="#000000">KeyCertificateFromCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge34" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge34"><a xlink:title="at key_certificate.go:397: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:405: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M667.4137,-94.0023C681.2903,-99.8803 694.4451,-107.6723 705.1026,-118 740.2286,-152.0391 709.1149,-184.9962 741.1026,-222 745.9705,-227.6313 752.203,-232.3181 758.7302,-236.1646"/>
<polygon fill="#8b4513" stroke="#8b4513" points="757.2348,-239.3328 767.7133,-240.8988 760.4984,-233.1401 757.2348,-239.3328"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type -->
<g id="edge22" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type</title>
<g id="a_edge22"><a xlink:title="at key_certificate.go:396: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]&#10;at key_certificate.go:397: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Type]">
<path fill="none" stroke="#8b4513" d="M636.8741,-57.9784C659.2304,-55.0617 683.8606,-55.376 705.1026,-64 725.7789,-72.3943 723.0955,-85.8197 741.1026,-99 744.2629,-101.3132 747.6237,-103.5624 751.0685,-105.7208"/>
<polygon fill="#8b4513" stroke="#8b4513" points="749.3552,-108.774 759.7378,-110.8837 752.9369,-102.7598 749.3552,-108.774"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data -->
<g id="edge50" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data</title>
<g id="a_edge50"><a xlink:title="at key_certificate.go:400: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Data]">
<path fill="none" stroke="#8b4513" d="M668.2729,-75.4271C681.4078,-78.5464 694.1161,-83.4785 705.1026,-91 733.6444,-110.54 716.7851,-135.4012 741.1026,-160 743.4263,-162.3506 745.9733,-164.5622 748.6595,-166.6352"/>
<polygon fill="#8b4513" stroke="#8b4513" points="746.8354,-169.6291 757.051,-172.4385 750.817,-163.8718 746.8354,-169.6291"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge12" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge12"><a xlink:title="at key_certificate.go:417: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:418: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M585.6811,-94.1768C605.4669,-117.6504 640.4609,-160.0092 668.1026,-198 702.8417,-245.7453 695.2619,-271.7837 741.1026,-309 746.8382,-313.6565 753.6796,-317.4203 760.5761,-320.4288"/>
<polygon fill="#8b4513" stroke="#8b4513" points="759.3279,-323.6987 769.916,-324.0763 761.8743,-317.1783 759.3279,-323.6987"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes -->
<g id="node8" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes</title>
<g id="a_node8"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes | defined in certificate.go:76">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M825.5703,-86C825.5703,-86 768.4793,-86 768.4793,-86 762.4793,-86 756.4793,-80 756.4793,-74 756.4793,-74 756.4793,-62 756.4793,-62 756.4793,-56 762.4793,-50 768.4793,-50 768.4793,-50 825.5703,-50 825.5703,-50 831.5703,-50 837.5703,-56 837.5703,-62 837.5703,-62 837.5703,-74 837.5703,-74 837.5703,-80 831.5703,-86 825.5703,-86"/>
<text text-anchor="middle" x="797.0248" y="-72.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="797.0248" y="-55.4" font-family="Verdana" font-size="14.00" fill="#000000">RawBytes</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeySize -->
<g id="node11" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeySize</title>
<g id="a_node11"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeySize | defined in key_certificate.go:200&#10;at key_certificate.go:202: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:204: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:207: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M633.4625,-335C633.4625,-335 506.9305,-335 506.9305,-335 500.9305,-335 494.9305,-329 494.9305,-323 494.9305,-323 494.9305,-311 494.9305,-311 494.9305,-305 500.9305,-299 506.9305,-299 506.9305,-299 633.4625,-299 633.4625,-299 639.4625,-299 645.4625,-305 645.4625,-311 645.4625,-311 645.4625,-323 645.4625,-323 645.4625,-329 639.4625,-335 633.4625,-335"/>
<text text-anchor="middle" x="570.1965" y="-312.8" font-family="Verdana" font-size="14.00" fill="#000000">SigningPublicKeySize</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeySize&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge35" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeySize&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge35"><a xlink:title="at key_certificate.go:204: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:207: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M645.8645,-325.397C654.0179,-328.7052 661.6716,-333.1247 668.1026,-339 755.1358,-418.513 668.3555,-501.2372 741.1026,-594 745.4422,-599.5336 751.0942,-604.1728 757.1344,-608.0195"/>
<polygon fill="#8b4513" stroke="#8b4513" points="755.7236,-611.2419 766.1542,-613.1004 759.1592,-605.1429 755.7236,-611.2419"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeySize&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge23" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeySize&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge23"><a xlink:title="at key_certificate.go:202: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M645.5417,-316.5867C664.9665,-316.8997 685.8285,-317.6037 705.1026,-319 723.1812,-320.3097 743.1442,-322.7896 759.8344,-325.1566"/>
<polygon fill="#8b4513" stroke="#8b4513" points="759.3568,-328.6239 769.7574,-326.6043 760.3674,-321.6972 759.3568,-328.6239"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoPublicKeySize -->
<g id="node12" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoPublicKeySize</title>
<g id="a_node12"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoPublicKeySize | defined in key_certificate.go:192&#10;at key_certificate.go:193: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:195: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:195: calling [github.com/samber/oops.Errorf]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M631.2863,-274C631.2863,-274 509.1067,-274 509.1067,-274 503.1067,-274 497.1067,-268 497.1067,-262 497.1067,-262 497.1067,-250 497.1067,-250 497.1067,-244 503.1067,-238 509.1067,-238 509.1067,-238 631.2863,-238 631.2863,-238 637.2863,-238 643.2863,-244 643.2863,-250 643.2863,-250 643.2863,-262 643.2863,-262 643.2863,-268 637.2863,-274 631.2863,-274"/>
<text text-anchor="middle" x="570.1965" y="-251.8" font-family="Verdana" font-size="14.00" fill="#000000">CryptoPublicKeySize</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoPublicKeySize&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge46" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoPublicKeySize&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge46"><a xlink:title="at key_certificate.go:195: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M643.517,-254.3457C663.1929,-253.9049 684.4582,-253.4315 704.1026,-253 721.5707,-252.6163 740.8861,-252.1994 757.361,-251.846"/>
<polygon fill="#8b4513" stroke="#8b4513" points="757.8064,-255.3374 767.7291,-251.6239 757.6564,-248.339 757.8064,-255.3374"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoPublicKeySize&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge24" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoPublicKeySize&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge24"><a xlink:title="at key_certificate.go:193: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:195: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M627.9893,-274.0642C641.1902,-278.2555 655.1461,-282.7384 668.1026,-287 699.2407,-297.2418 734.4523,-309.2911 760.1991,-318.1886"/>
<polygon fill="#8b4513" stroke="#8b4513" points="759.3255,-321.5899 769.9203,-321.5536 761.6153,-314.975 759.3255,-321.5899"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="node15" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_node15"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Warn | defined in log.go:30">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M814.7911,-1088C814.7911,-1088 779.2585,-1088 779.2585,-1088 773.2585,-1088 767.2585,-1082 767.2585,-1076 767.2585,-1076 767.2585,-1064 767.2585,-1064 767.2585,-1058 773.2585,-1052 779.2585,-1052 779.2585,-1052 814.7911,-1052 814.7911,-1052 820.7911,-1052 826.7911,-1058 826.7911,-1064 826.7911,-1064 826.7911,-1076 826.7911,-1076 826.7911,-1082 820.7911,-1088 814.7911,-1088"/>
<text text-anchor="middle" x="797.0248" y="-1074.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="797.0248" y="-1057.4" font-family="Verdana" font-size="14.00" fill="#000000">Warn</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType -->
<g id="node20" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType</title>
<g id="a_node20"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType | defined in key_certificate.go:117&#10;at key_certificate.go:118: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:122: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:121: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:119: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M636.1277,-747C636.1277,-747 504.2653,-747 504.2653,-747 498.2653,-747 492.2653,-741 492.2653,-735 492.2653,-735 492.2653,-723 492.2653,-723 492.2653,-717 498.2653,-711 504.2653,-711 504.2653,-711 636.1277,-711 636.1277,-711 642.1277,-711 648.1277,-717 648.1277,-723 648.1277,-723 648.1277,-735 648.1277,-735 648.1277,-741 642.1277,-747 636.1277,-747"/>
<text text-anchor="middle" x="570.1965" y="-724.8" font-family="Verdana" font-size="14.00" fill="#000000">SigningPublicKeyType</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge36" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge36"><a xlink:title="at key_certificate.go:119: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M635.1572,-747.0429C660.136,-756.9365 686.9783,-771.6613 705.1026,-793 742.5292,-837.0644 704.7763,-873.0242 741.1026,-918 742.7078,-919.9874 744.481,-921.8609 746.3786,-923.6248"/>
<polygon fill="#8b4513" stroke="#8b4513" points="744.2256,-926.3846 754.2222,-929.8944 748.5962,-920.9167 744.2256,-926.3846"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge14" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge14"><a xlink:title="at key_certificate.go:121: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M644.8739,-710.9421C653.0147,-707.5817 660.9359,-703.632 668.1026,-699 688.4688,-685.8368 684.0953,-671.7025 704.1026,-658 719.8601,-647.2081 739.4571,-639.3771 756.5865,-633.9707"/>
<polygon fill="#8b4513" stroke="#8b4513" points="757.7558,-637.2744 766.3393,-631.0636 755.7561,-630.5661 757.7558,-637.2744"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge13" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge13"><a xlink:title="at key_certificate.go:118: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:122: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M648.07,-713.9279C655.5391,-710.0271 662.4293,-705.1342 668.1026,-699 719.4262,-643.507 689.4674,-606.9535 705.1026,-533 721.9781,-453.1801 688.7512,-415.5726 741.1026,-353 746.0734,-347.0587 752.8651,-342.7131 760.0032,-339.5374"/>
<polygon fill="#8b4513" stroke="#8b4513" points="761.6587,-342.6561 769.8133,-335.892 759.2204,-336.0945 761.6587,-342.6561"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType -->
<g id="node21" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType</title>
<g id="a_node21"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType | defined in key_certificate.go:126&#10;at key_certificate.go:128: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:130: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:127: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:131: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M614.0634,-686C614.0634,-686 526.3296,-686 526.3296,-686 520.3296,-686 514.3296,-680 514.3296,-674 514.3296,-674 514.3296,-662 514.3296,-662 514.3296,-656 520.3296,-650 526.3296,-650 526.3296,-650 614.0634,-650 614.0634,-650 620.0634,-650 626.0634,-656 626.0634,-662 626.0634,-662 626.0634,-674 626.0634,-674 626.0634,-680 620.0634,-686 614.0634,-686"/>
<text text-anchor="middle" x="570.1965" y="-663.8" font-family="Verdana" font-size="14.00" fill="#000000">PublicKeyType</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge15" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge15"><a xlink:title="at key_certificate.go:128: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M626.1211,-676.7869C641.1497,-681.3767 656.4473,-688.3638 668.1026,-699 743.8881,-768.159 677.1256,-837.7918 741.1026,-918 742.6956,-919.9972 744.4589,-921.8787 746.3484,-923.6491"/>
<polygon fill="#8b4513" stroke="#8b4513" points="744.1829,-926.3989 754.1697,-929.9365 748.5687,-920.9432 744.1829,-926.3989"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge25" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge25"><a xlink:title="at key_certificate.go:130: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M626.0014,-649.968C649.8245,-642.9544 678.084,-635.5303 704.1026,-631 720.9685,-628.0634 739.7683,-626.3584 756.0215,-625.3687"/>
<polygon fill="#8b4513" stroke="#8b4513" points="756.4911,-628.8486 766.2884,-624.8159 756.1146,-621.8587 756.4911,-628.8486"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge37" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge37"><a xlink:title="at key_certificate.go:127: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]&#10;at key_certificate.go:131: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M626.3136,-665.5853C641.4337,-662.4116 656.7317,-656.5409 668.1026,-646 709.344,-607.7689 691.1057,-579.4661 705.1026,-525 724.5416,-449.3569 690.7196,-412.6766 741.1026,-353 746.0999,-347.0809 752.9027,-342.7447 760.0433,-339.571"/>
<polygon fill="#8b4513" stroke="#8b4513" points="761.6984,-342.6898 769.8519,-335.9245 759.2591,-336.1286 761.6984,-342.6898"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize -->
<g id="node22" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize</title>
<g id="a_node22"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize | defined in key_certificate.go:336&#10;at key_certificate.go:344: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType]&#10;at key_certificate.go:349: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:346: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M370.1859,-747C370.1859,-747 307.2055,-747 307.2055,-747 301.2055,-747 295.2055,-741 295.2055,-735 295.2055,-735 295.2055,-723 295.2055,-723 295.2055,-717 301.2055,-711 307.2055,-711 307.2055,-711 370.1859,-711 370.1859,-711 376.1859,-711 382.1859,-717 382.1859,-723 382.1859,-723 382.1859,-735 382.1859,-735 382.1859,-741 376.1859,-747 370.1859,-747"/>
<text text-anchor="middle" x="338.6957" y="-724.8" font-family="Verdana" font-size="14.00" fill="#000000">CryptoSize</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge38" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge38"><a xlink:title="at key_certificate.go:346: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M380.2059,-747.179C397.1496,-754.3392 417.0217,-762.4086 435.2904,-769 537.1692,-805.7584 576.109,-783.8366 668.1026,-841 708.1568,-865.8891 703.6251,-889.3777 741.1026,-918 744.0796,-920.2736 747.2523,-922.4725 750.5162,-924.5764"/>
<polygon fill="#8b4513" stroke="#8b4513" points="748.933,-927.7098 759.297,-929.9096 752.5669,-921.7269 748.933,-927.7098"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge19" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge19"><a xlink:title="at key_certificate.go:349: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M382.3547,-745.9975C447.4686,-768.5657 572.5878,-801.0664 668.1026,-760 719.7372,-737.7998 760.3936,-683.6278 781.3742,-650.7454"/>
<polygon fill="#8b4513" stroke="#8b4513" points="784.4544,-652.42 786.7629,-642.0797 778.51,-648.7235 784.4544,-652.42"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType -->
<g id="edge16" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType</title>
<g id="a_edge16"><a xlink:title="at key_certificate.go:344: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType]">
<path fill="none" stroke="#000000" d="M382.2392,-717.5264C416.6513,-708.4588 465.2401,-695.6558 504.3944,-685.3387"/>
<polygon fill="#000000" stroke="#000000" points="505.3531,-688.7056 514.1312,-682.7731 503.5695,-681.9367 505.3531,-688.7056"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey -->
<g id="node23" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey</title>
<g id="a_node23"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey | defined in key_certificate.go:136&#10;at key_certificate.go:152: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:137: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:146: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:167: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:145: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize]&#10;at key_certificate.go:169: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]&#10;at key_certificate.go:139: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:160: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:165: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:140: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType]&#10;at key_certificate.go:151: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M171.0885,-747C171.0885,-747 58.0125,-747 58.0125,-747 52.0125,-747 46.0125,-741 46.0125,-735 46.0125,-735 46.0125,-723 46.0125,-723 46.0125,-717 52.0125,-711 58.0125,-711 58.0125,-711 171.0885,-711 171.0885,-711 177.0885,-711 183.0885,-717 183.0885,-723 183.0885,-723 183.0885,-735 183.0885,-735 183.0885,-741 177.0885,-747 171.0885,-747"/>
<text text-anchor="middle" x="114.5505" y="-724.8" font-family="Verdana" font-size="14.00" fill="#000000">ConstructPublicKey</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge1" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge1"><a xlink:title="at key_certificate.go:152: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M183.4532,-714.7794C191.5582,-710.759 199.0724,-705.6054 205.101,-699 381.6728,-505.5329 76.7661,-125 338.6957,-125 338.6957,-125 338.6957,-125 570.1965,-125 630.8101,-125 656.4962,-108.7863 705.1026,-145 735.3968,-167.5704 714.9437,-194.7443 741.1026,-222 746.2048,-227.3162 752.4949,-231.8428 758.9942,-235.6272"/>
<polygon fill="#8b4513" stroke="#8b4513" points="757.4181,-238.753 767.8946,-240.3322 760.6895,-232.5644 757.4181,-238.753"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge6" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge6"><a xlink:title="at key_certificate.go:137: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:146: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:167: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M183.2373,-743.5944C191.4789,-747.7621 199.0879,-753.1179 205.101,-760 259.3545,-822.0933 182.9957,-883.4954 241.101,-942 272.3021,-973.4155 294.4188,-962 338.6957,-962 338.6957,-962 338.6957,-962 435.7904,-962 555.5251,-962 586.1221,-982.4179 705.1026,-969 717.8097,-967.567 731.321,-965.0531 743.9625,-962.2515"/>
<polygon fill="#8b4513" stroke="#8b4513" points="744.9277,-965.6207 753.8823,-959.9581 743.3509,-958.8006 744.9277,-965.6207"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge41" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge41"><a xlink:title="at key_certificate.go:151: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M183.2823,-743.5552C191.5171,-747.7288 199.1122,-753.0968 205.101,-760 261.1363,-824.5913 191.3196,-879.4744 241.101,-949 252.1089,-964.3739 260.0127,-964.4913 278.101,-970 450.222,-1022.4188 668.5942,-1016.8824 757.0879,-1011.839"/>
<polygon fill="#8b4513" stroke="#8b4513" points="757.452,-1015.3235 767.2242,-1011.2303 757.0323,-1008.3361 757.452,-1015.3235"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="edge29" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_edge29"><a xlink:title="at key_certificate.go:169: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]">
<path fill="none" stroke="#8b4513" d="M183.3243,-743.5189C191.5527,-747.698 199.1349,-753.0771 205.101,-760 275.1143,-841.2414 181.4402,-943.538 278.101,-990 442.4792,-1069.0119 666.8896,-1073.3858 757.0883,-1071.5264"/>
<polygon fill="#8b4513" stroke="#8b4513" points="757.2475,-1075.0236 767.159,-1071.2804 757.0765,-1068.0257 757.2475,-1075.0236"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge39" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge39"><a xlink:title="at key_certificate.go:139: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:160: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:165: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M179.7005,-710.861C188.4758,-707.4337 197.1754,-703.4889 205.101,-699 273.2704,-660.3902 260.3517,-584 338.6957,-584 338.6957,-584 338.6957,-584 570.1965,-584 636.1837,-584 711.3507,-600.6208 756.4438,-612.4345"/>
<polygon fill="#8b4513" stroke="#8b4513" points="755.5775,-615.8258 766.1419,-615.0232 757.3829,-609.0626 755.5775,-615.8258"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType -->
<g id="edge40" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType</title>
<g id="a_edge40"><a xlink:title="at key_certificate.go:140: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType]">
<path fill="none" stroke="#000000" d="M173.8034,-710.9401C204.6185,-702.2754 243.072,-692.5869 278.101,-687 355.0715,-674.7236 444.6608,-670.3373 504.1193,-668.7935"/>
<polygon fill="#000000" stroke="#000000" points="504.2147,-672.2923 514.1277,-668.5531 504.0465,-665.2943 504.2147,-672.2923"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize -->
<g id="edge7" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize</title>
<g id="a_edge7"><a xlink:title="at key_certificate.go:145: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize]">
<path fill="none" stroke="#000000" d="M183.3247,-729C216.0448,-729 254.5833,-729 285.0924,-729"/>
<polygon fill="#000000" stroke="#000000" points="285.1111,-732.5001 295.1111,-729 285.1111,-725.5001 285.1111,-732.5001"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data -->
<g id="node24" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data</title>
<g id="a_node24"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data | defined in key_certificate.go:108&#10;at key_certificate.go:110: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:112: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:109: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes]&#10;at key_certificate.go:113: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M129.5505,-686C129.5505,-686 99.5505,-686 99.5505,-686 93.5505,-686 87.5505,-680 87.5505,-674 87.5505,-674 87.5505,-662 87.5505,-662 87.5505,-656 93.5505,-650 99.5505,-650 99.5505,-650 129.5505,-650 129.5505,-650 135.5505,-650 141.5505,-656 141.5505,-662 141.5505,-662 141.5505,-674 141.5505,-674 141.5505,-680 135.5505,-686 129.5505,-686"/>
<text text-anchor="middle" x="114.5505" y="-663.8" font-family="Verdana" font-size="14.00" fill="#000000">Data</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes -->
<g id="edge30" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes</title>
<g id="a_edge30"><a xlink:title="at key_certificate.go:109: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes]&#10;at key_certificate.go:113: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).RawBytes]">
<path fill="none" stroke="#8b4513" d="M141.9287,-669.3268C162.6011,-668.7047 189.9181,-664.0934 205.101,-646 285.6875,-549.9656 152.4213,-171.6155 241.101,-83 253.5589,-70.5512 382.4012,-77.9928 399.2904,-73 434.9752,-62.4508 436.5018,-42.1915 472.2904,-32 571.4708,-3.7565 601.0031,-24.2227 704.1026,-22 726.6307,-21.5143 749.3452,-32.5024 766.6773,-43.8595"/>
<polygon fill="#8b4513" stroke="#8b4513" points="765.0063,-46.9595 775.2207,-49.7733 768.9904,-41.2039 765.0063,-46.9595"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge8" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge8"><a xlink:title="at key_certificate.go:110: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M141.7476,-671.3138C161.5079,-675.0183 187.726,-682.7917 205.101,-699 293.2352,-781.2161 218.1672,-935 338.6957,-935 338.6957,-935 338.6957,-935 435.7904,-935 545.0244,-935 672.7184,-941.0101 743.2682,-944.8573"/>
<polygon fill="#8b4513" stroke="#8b4513" points="743.4934,-948.375 753.6712,-945.4316 743.8793,-941.3857 743.4934,-948.375"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge9" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).Data&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge9"><a xlink:title="at key_certificate.go:112: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M141.9295,-672.2203C161.2735,-676.3484 186.8938,-684.255 205.101,-699 283.0789,-762.1498 238.354,-881 338.6957,-881 338.6957,-881 338.6957,-881 435.7904,-881 567.0107,-881 624.2079,-863.3191 705.1026,-760 733.5146,-723.7121 762.7128,-678.9988 780.3657,-650.9862"/>
<polygon fill="#8b4513" stroke="#8b4513" points="783.5501,-652.4956 785.8919,-642.1628 777.6176,-648.78 783.5501,-652.4956"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey -->
<g id="node25" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey</title>
<g id="a_node25"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey | defined in key_certificate.go:228&#10;at key_certificate.go:243: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at key_certificate.go:244: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:301: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:300: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]&#10;at key_certificate.go:232: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType]&#10;at key_certificate.go:237: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize]&#10;at key_certificate.go:229: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:238: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:298: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:231: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:252: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:257: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:262: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:291: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:296: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M193.1515,-808C193.1515,-808 35.9495,-808 35.9495,-808 29.9495,-808 23.9495,-802 23.9495,-796 23.9495,-796 23.9495,-784 23.9495,-784 23.9495,-778 29.9495,-772 35.9495,-772 35.9495,-772 193.1515,-772 193.1515,-772 199.1515,-772 205.1515,-778 205.1515,-784 205.1515,-784 205.1515,-796 205.1515,-796 205.1515,-802 199.1515,-808 193.1515,-808"/>
<text text-anchor="middle" x="114.5505" y="-785.8" font-family="Verdana" font-size="14.00" fill="#000000">ConstructSigningPublicKey</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge4" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge4"><a xlink:title="at key_certificate.go:244: calling [github.com/samber/oops.Errorf]&#10;at key_certificate.go:301: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M187.6597,-771.8102C193.9477,-768.5056 199.8877,-764.6045 205.101,-760 308.7479,-668.4577 355.3858,-271.8646 472.2904,-198 545.8628,-151.5143 582.7247,-181.1353 668.1026,-198 699.8907,-204.2791 733.6942,-218.4884 758.7091,-230.6148"/>
<polygon fill="#8b4513" stroke="#8b4513" points="757.329,-233.837 767.8435,-235.1395 760.4362,-227.5644 757.329,-233.837"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge43" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge43"><a xlink:title="at key_certificate.go:229: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:238: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:298: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M116.0225,-808.043C121.4043,-860.6999 145.0776,-1014.3968 241.101,-1077 274.1986,-1098.5783 665.3623,-1010.046 705.1026,-996 715.3602,-992.3745 736.4205,-981.4738 755.7972,-970.9753"/>
<polygon fill="#8b4513" stroke="#8b4513" points="757.7253,-973.9104 764.827,-966.048 754.3723,-967.7656 757.7253,-973.9104"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge3" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge3"><a xlink:title="at key_certificate.go:243: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M115.8282,-808.0832C120.6995,-861.6104 143.1637,-1019.5315 241.101,-1084 407.0141,-1193.2144 661.4299,-1080.7977 758.0127,-1030.5784"/>
<polygon fill="#8b4513" stroke="#8b4513" points="759.9097,-1033.5352 767.1271,-1025.7789 756.6481,-1027.3414 759.9097,-1033.5352"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="edge5" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_edge5"><a xlink:title="at key_certificate.go:300: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]">
<path fill="none" stroke="#8b4513" d="M116.8316,-808.3983C127.0704,-881.9631 175.6599,-1151 338.6957,-1151 338.6957,-1151 338.6957,-1151 570.1965,-1151 630.8101,-1151 648.5152,-1152.7226 705.1026,-1131 727.691,-1122.3289 750.3702,-1107.3614 767.55,-1094.4232"/>
<polygon fill="#8b4513" stroke="#8b4513" points="769.7414,-1097.1531 775.5175,-1088.2712 765.4633,-1091.6125 769.7414,-1097.1531"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge44" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge44"><a xlink:title="at key_certificate.go:231: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:252: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:257: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:262: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:291: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:296: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M119.1898,-808.1063C131.0901,-850.28 167.1025,-954.6126 241.101,-996 303.3494,-1030.8156 331.0158,-989.6295 399.2904,-969 524.3611,-931.2093 571.1409,-937.5743 668.1026,-850 731.0327,-793.1625 770.9949,-698.1555 787.8344,-651.522"/>
<polygon fill="#8b4513" stroke="#8b4513" points="791.1418,-652.6671 791.1677,-642.0723 784.5405,-650.3385 791.1418,-652.6671"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType -->
<g id="edge10" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType</title>
<g id="a_edge10"><a xlink:title="at key_certificate.go:232: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType]">
<path fill="none" stroke="#000000" d="M179.1608,-771.9389C188.1072,-768.4844 196.9981,-764.5112 205.101,-760 242.0423,-739.4332 238.3554,-713.4202 278.101,-699 314.4298,-685.8195 410.1854,-698.7747 482.2324,-711.5308"/>
<polygon fill="#000000" stroke="#000000" points="481.7713,-715.0039 492.2325,-713.3266 483.0087,-708.1141 481.7713,-715.0039"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize -->
<g id="node26" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize</title>
<g id="a_node26"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize | defined in key_certificate.go:308&#10;at key_certificate.go:323: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:328: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:320: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType]&#10;at key_certificate.go:331: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at key_certificate.go:325: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M377.452,-808C377.452,-808 299.9394,-808 299.9394,-808 293.9394,-808 287.9394,-802 287.9394,-796 287.9394,-796 287.9394,-784 287.9394,-784 287.9394,-778 293.9394,-772 299.9394,-772 299.9394,-772 377.452,-772 377.452,-772 383.452,-772 389.452,-778 389.452,-784 389.452,-784 389.452,-796 389.452,-796 389.452,-802 383.452,-808 377.452,-808"/>
<text text-anchor="middle" x="338.6957" y="-785.8" font-family="Verdana" font-size="14.00" fill="#000000">SignatureSize</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize -->
<g id="edge33" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize</title>
<g id="a_edge33"><a xlink:title="at key_certificate.go:237: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize]">
<path fill="none" stroke="#000000" d="M205.3958,-790C229.5957,-790 255.1662,-790 277.3684,-790"/>
<polygon fill="#000000" stroke="#000000" points="277.6448,-793.5001 287.6448,-790 277.6447,-786.5001 277.6448,-793.5001"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge11" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge11"><a xlink:title="at key_certificate.go:323: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at key_certificate.go:328: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M375.8587,-808.2143C393.6287,-816.5905 415.3328,-826.3426 435.2904,-834 542.9578,-875.3102 672.6115,-913.453 743.777,-933.4278"/>
<polygon fill="#8b4513" stroke="#8b4513" points="743.2698,-936.9201 753.8429,-936.2413 745.1542,-930.1785 743.2698,-936.9201"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="edge45" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_edge45"><a xlink:title="at key_certificate.go:325: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]">
<path fill="none" stroke="#8b4513" d="M362.379,-808.0007C388.7396,-827.803 432.8315,-860.236 472.2904,-886 572.4968,-951.428 599.1366,-965.5171 704.1026,-1023 721.629,-1032.598 741.3434,-1042.6696 758.0891,-1051.0166"/>
<polygon fill="#8b4513" stroke="#8b4513" points="756.5402,-1054.1552 767.0541,-1055.4624 759.6502,-1047.8839 756.5402,-1054.1552"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge32" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge32"><a xlink:title="at key_certificate.go:331: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M389.6092,-800.6705C404.284,-803.2803 420.3629,-805.6964 435.2904,-807 539.28,-816.0809 572.5848,-818.1029 668.1026,-776 724.1995,-751.2732 764.3986,-687.971 783.8368,-651.3294"/>
<polygon fill="#8b4513" stroke="#8b4513" points="787.0763,-652.6838 788.5471,-642.1916 780.8543,-649.4765 787.0763,-652.6838"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType -->
<g id="edge31" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType</title>
<g id="a_edge31"><a xlink:title="at key_certificate.go:320: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType]">
<path fill="none" stroke="#000000" d="M389.4995,-776.6133C419.4211,-768.729 457.9034,-758.589 491.6603,-749.6941"/>
<polygon fill="#000000" stroke="#000000" points="492.7279,-753.0324 501.506,-747.0998 490.9442,-746.2634 492.7279,-753.0324"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 82 KiB

View File

@ -14,7 +14,7 @@ func TestSigningPublicKeyTypeReturnsCorrectInteger(t *testing.T) {
assert.Nil(err)
pk_type := key_cert.SigningPublicKeyType()
assert.Equal(KEYCERT_SIGN_ED25519, pk_type, "SigningPublicKeyType() did not return correct type")
assert.Equal(KEYCERT_SIGN_P521, pk_type, "SigningPublicKeyType() did not return correct type")
}
func TestSigningPublicKeyTypeWithInvalidData(t *testing.T) {
@ -44,7 +44,7 @@ func TestPublicKeyTypeWithInvalidData(t *testing.T) {
// Test with invalid short data
key_cert, _, err := NewKeyCertificate([]byte{0x05, 0x00, 0x02})
assert.NotNil(err)
assert.Contains(err.Error(), "key certificate data too short", "Expected error for invalid data")
assert.Contains(err.Error(), "certificate parsing warning: certificate data is shorter than specified by length", "Expected error for invalid data")
assert.Nil(key_cert)
}
@ -61,6 +61,7 @@ func TestConstructPublicKeyWithInsufficientData(t *testing.T) {
assert.NotNil(err)
assert.Equal("error constructing public key: not enough data", err.Error())
}
func TestConstructPublicKeyReturnsCorrectDataWithElg(t *testing.T) {
assert := assert.New(t)

View File

@ -0,0 +1,116 @@
# keys_and_cert
--
import "github.com/go-i2p/go-i2p/lib/common/keys_and_cert"
![keys_and_cert.svg](keys_and_cert.svg)
Package keys_and_cert implements the I2P KeysAndCert common data structure
## Usage
```go
const (
KEYS_AND_CERT_PUBKEY_SIZE = 256
KEYS_AND_CERT_SPK_SIZE = 128
KEYS_AND_CERT_MIN_SIZE = 387
KEYS_AND_CERT_DATA_SIZE = 384
)
```
Sizes of various KeysAndCert structures and requirements
#### type KeysAndCert
```go
type KeysAndCert struct {
KeyCertificate *KeyCertificate
ReceivingPublic crypto.RecievingPublicKey
Padding []byte
SigningPublic crypto.SigningPublicKey
}
```
KeysAndCert is the represenation of an I2P KeysAndCert.
https://geti2p.net/spec/common-structures#keysandcert
#### func NewKeysAndCert
```go
func NewKeysAndCert(
keyCertificate *KeyCertificate,
publicKey crypto.RecievingPublicKey,
padding []byte,
signingPublicKey crypto.SigningPublicKey,
) (*KeysAndCert, error)
```
NewKeysAndCert creates a new KeysAndCert instance with the provided parameters.
It validates the sizes of the provided keys and padding before assembling the
struct.
#### func ReadKeysAndCert
```go
func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte, err error)
```
ReadKeysAndCert creates a new *KeysAndCert from []byte using ReadKeysAndCert.
Returns a pointer to KeysAndCert unlike ReadKeysAndCert.
#### func ReadKeysAndCertElgAndEd25519
```go
func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remainder []byte, err error)
```
#### func (KeysAndCert) Bytes
```go
func (keys_and_cert KeysAndCert) Bytes() []byte
```
Bytes returns the entire keyCertificate in []byte form, trims payload to
specified length.
#### func (*KeysAndCert) Certificate
```go
func (keys_and_cert *KeysAndCert) Certificate() (cert Certificate)
```
Certfificate returns the certificate.
#### func (*KeysAndCert) PublicKey
```go
func (keys_and_cert *KeysAndCert) PublicKey() (key crypto.RecievingPublicKey)
```
publicKey returns the public key as a crypto.publicKey.
#### func (*KeysAndCert) SigningPublicKey
```go
func (keys_and_cert *KeysAndCert) SigningPublicKey() (signing_public_key crypto.SigningPublicKey)
```
signingPublicKey returns the signing public key.
#### type PrivateKeysAndCert
```go
type PrivateKeysAndCert struct {
KeysAndCert
PK_KEY crypto.PrivateKey
SPK_KEY crypto.PrivateKey
}
```
PrivateKeysAndCert contains a KeysAndCert along with the corresponding private
keys for the Public Key and the Signing Public Key
#### func NewPrivateKeysAndCert
```go
func NewPrivateKeysAndCert() (*PrivateKeysAndCert, error)
```
keys_and_cert
github.com/go-i2p/go-i2p/lib/common/keys_and_cert

View File

@ -1,66 +0,0 @@
# keys_and_cert
--
import "github.com/go-i2p/go-i2p/lib/common/keys_and_cert"
Package keys_and_cert implements the I2P KeysAndCert common data structure
## Usage
```go
const (
KEYS_AND_CERT_PUBKEY_SIZE = 256
KEYS_AND_CERT_SPK_SIZE = 128
KEYS_AND_CERT_MIN_SIZE = 387
KEYS_AND_CERT_DATA_SIZE = 384
)
```
Sizes of various KeysAndCert structures and requirements
#### type KeysAndCert
```go
type KeysAndCert struct {
KeyCertificate *KeyCertificate
}
```
KeysAndCert is the represenation of an I2P KeysAndCert.
https://geti2p.net/spec/common-structures#keysandcert
#### func ReadKeysAndCert
```go
func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte, err error)
```
ReadKeysAndCert creates a new *KeysAndCert from []byte using ReadKeysAndCert.
Returns a pointer to KeysAndCert unlike ReadKeysAndCert.
#### func (KeysAndCert) Bytes
```go
func (keys_and_cert KeysAndCert) Bytes() []byte
```
Bytes returns the entire KeyCertificate in []byte form, trims payload to
specified length.
#### func (*KeysAndCert) Certificate
```go
func (keys_and_cert *KeysAndCert) Certificate() (cert Certificate)
```
Certfificate returns the certificate.
#### func (*KeysAndCert) PublicKey
```go
func (keys_and_cert *KeysAndCert) PublicKey() (key crypto.PublicKey)
```
PublicKey returns the public key as a crypto.PublicKey.
#### func (*KeysAndCert) SigningPublicKey
```go
func (keys_and_cert *KeysAndCert) SigningPublicKey() (signing_public_key crypto.SigningPublicKey)
```
SigningPublicKey returns the signing public key.

View File

@ -2,10 +2,8 @@
package keys_and_cert
import (
"errors"
"fmt"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/samber/oops"
. "github.com/go-i2p/go-i2p/lib/common/certificate"
. "github.com/go-i2p/go-i2p/lib/common/key_certificate"
@ -79,38 +77,59 @@ total length: 387+ bytes
//
// https://geti2p.net/spec/common-structures#keysandcert
type KeysAndCert struct {
KeyCertificate *KeyCertificate
publicKey crypto.PublicKey
Padding []byte
signingPublicKey crypto.SigningPublicKey
KeyCertificate *KeyCertificate
ReceivingPublic crypto.RecievingPublicKey
Padding []byte
SigningPublic crypto.SigningPublicKey
}
// Bytes returns the entire keyCertificate in []byte form, trims payload to specified length.
func (keys_and_cert KeysAndCert) Bytes() []byte {
bytes := keys_and_cert.publicKey.Bytes()
bytes = append(bytes, keys_and_cert.Padding...)
bytes = append(bytes, keys_and_cert.signingPublicKey.Bytes()...)
bytes = append(bytes, keys_and_cert.KeyCertificate.Bytes()...)
bytes := []byte{}
rpublen := 0
if keys_and_cert.ReceivingPublic != nil {
bytes = append(bytes, keys_and_cert.ReceivingPublic.Bytes()...)
rpublen = len(keys_and_cert.ReceivingPublic.Bytes())
}
// bytes = append(bytes, keys_and_cert.ReceivingPublic.Bytes()...)
padlen := 0
if keys_and_cert.Padding != nil {
bytes = append(bytes, keys_and_cert.Padding...)
padlen = len(keys_and_cert.Padding)
}
// bytes = append(bytes, keys_and_cert.Padding...)
spublen := 0
if keys_and_cert.SigningPublic != nil {
bytes = append(bytes, keys_and_cert.SigningPublic.Bytes()...)
spublen = len(keys_and_cert.SigningPublic.Bytes())
}
// bytes = append(bytes, keys_and_cert.SigningPublic.Bytes()...)
certlen := 0
if keys_and_cert.KeyCertificate != nil {
bytes = append(bytes, keys_and_cert.KeyCertificate.Bytes()...)
certlen = len(keys_and_cert.KeyCertificate.Bytes())
}
// bytes = append(bytes, keys_and_cert.KeyCertificate.Bytes()...)
log.WithFields(logrus.Fields{
"bytes": bytes,
"padding": keys_and_cert.Padding,
"bytes_length": len(bytes),
"pk_bytes_length": len(keys_and_cert.publicKey.Bytes()),
"padding_bytes_length": len(keys_and_cert.Padding),
"spk_bytes_length": len(keys_and_cert.signingPublicKey.Bytes()),
"cert_bytes_length": len(keys_and_cert.KeyCertificate.Bytes()),
"pk_bytes_length": rpublen,
"padding_bytes_length": padlen,
"spk_bytes_length": spublen,
"cert_bytes_length": certlen,
}).Debug("Retrieved bytes from KeysAndCert")
return bytes
}
// publicKey returns the public key as a crypto.publicKey.
func (keys_and_cert *KeysAndCert) PublicKey() (key crypto.PublicKey) {
return keys_and_cert.publicKey
func (keys_and_cert *KeysAndCert) PublicKey() (key crypto.RecievingPublicKey) {
return keys_and_cert.ReceivingPublic
}
// signingPublicKey returns the signing public key.
func (keys_and_cert *KeysAndCert) SigningPublicKey() (signing_public_key crypto.SigningPublicKey) {
return keys_and_cert.signingPublicKey
return keys_and_cert.SigningPublic
}
// Certfificate returns the certificate.
@ -120,10 +139,13 @@ func (keys_and_cert *KeysAndCert) Certificate() (cert Certificate) {
// ReadKeysAndCert creates a new *KeysAndCert from []byte using ReadKeysAndCert.
// Returns a pointer to KeysAndCert unlike ReadKeysAndCert.
func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte, err error) {
func ReadKeysAndCert(data []byte) (*KeysAndCert, []byte, error) {
log.WithFields(logrus.Fields{
"input_length": len(data),
}).Debug("Reading KeysAndCert from data")
var err error
var remainder []byte
var keys_and_cert KeysAndCert
data_len := len(data)
if data_len < KEYS_AND_CERT_MIN_SIZE {
@ -133,14 +155,14 @@ func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte,
"required_len": KEYS_AND_CERT_MIN_SIZE,
"reason": "not enough data",
}).Error("error parsing keys and cert")
err = errors.New("error parsing KeysAndCert: data is smaller than minimum valid size")
return
err = oops.Errorf("error parsing KeysAndCert: data is smaller than minimum valid size")
return &keys_and_cert, remainder, err
}
keys_and_cert.KeyCertificate, remainder, err = NewKeyCertificate(data[KEYS_AND_CERT_DATA_SIZE:])
if err != nil {
log.WithError(err).Error("Failed to create keyCertificate")
return
return &keys_and_cert, remainder, err
}
// Get the actual key sizes from the certificate
@ -148,10 +170,10 @@ func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte,
sigKeySize := keys_and_cert.KeyCertificate.SignatureSize()
// Construct public key
keys_and_cert.publicKey, err = keys_and_cert.KeyCertificate.ConstructPublicKey(data[:pubKeySize])
keys_and_cert.ReceivingPublic, err = keys_and_cert.KeyCertificate.ConstructPublicKey(data[:pubKeySize])
if err != nil {
log.WithError(err).Error("Failed to construct publicKey")
return
return &keys_and_cert, remainder, err
}
// Calculate padding size and extract padding
@ -162,12 +184,12 @@ func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte,
}
// Construct signing public key
keys_and_cert.signingPublicKey, err = keys_and_cert.KeyCertificate.ConstructSigningPublicKey(
keys_and_cert.SigningPublic, err = keys_and_cert.KeyCertificate.ConstructSigningPublicKey(
data[KEYS_AND_CERT_DATA_SIZE-sigKeySize : KEYS_AND_CERT_DATA_SIZE],
)
if err != nil {
log.WithError(err).Error("Failed to construct signingPublicKey")
return
return &keys_and_cert, remainder, err
}
log.WithFields(logrus.Fields{
@ -177,7 +199,7 @@ func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte,
"remainder_length": len(remainder),
}).Debug("Successfully read KeysAndCert")
return
return &keys_and_cert, remainder, err
}
func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remainder []byte, err error) {
@ -196,7 +218,7 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain
dataLen := len(data)
if dataLen < minDataLength {
err = fmt.Errorf("error parsing KeysAndCert: data is smaller than minimum valid size, got %d bytes", dataLen)
err = oops.Errorf("error parsing KeysAndCert: data is smaller than minimum valid size, got %d bytes", dataLen)
log.WithError(err).Error("Data is smaller than minimum valid size")
return
}
@ -207,13 +229,13 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain
// Extract public key
publicKeyData := data[:pubKeySize]
if len(publicKeyData) != pubKeySize {
err = errors.New("invalid ElGamal public key length")
err = oops.Errorf("invalid ElGamal public key length")
log.WithError(err).Error("Invalid ElGamal public key length")
return
}
var elgPublicKey crypto.ElgPublicKey
copy(elgPublicKey[:], publicKeyData)
keysAndCert.publicKey = elgPublicKey
keysAndCert.ReceivingPublic = elgPublicKey
// Extract padding
paddingStart := pubKeySize
@ -223,12 +245,12 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain
// Extract signing public key
signingPubKeyData := data[paddingEnd : paddingEnd+sigKeySize]
if len(signingPubKeyData) != sigKeySize {
err = errors.New("invalid Ed25519 public key length")
err = oops.Errorf("invalid Ed25519 public key length")
log.WithError(err).Error("Invalid Ed25519 public key length")
return
}
edPublicKey := crypto.Ed25519PublicKey(signingPubKeyData)
keysAndCert.signingPublicKey = edPublicKey
keysAndCert.SigningPublic = edPublicKey
// Extract the certificate
certData := data[totalKeySize:]
@ -248,18 +270,18 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain
return
}
func constructPublicKey(data []byte, cryptoType uint16) (crypto.PublicKey, error) {
func constructPublicKey(data []byte, cryptoType uint16) (crypto.RecievingPublicKey, error) {
switch cryptoType {
case CRYPTO_KEY_TYPE_ELGAMAL:
if len(data) != 256 {
return nil, errors.New("invalid ElGamal public key length")
return nil, oops.Errorf("invalid ElGamal public key length")
}
var elgPublicKey crypto.ElgPublicKey
copy(elgPublicKey[:], data)
return elgPublicKey, nil
// Handle other crypto types...
default:
return nil, fmt.Errorf("unsupported crypto key type: %d", cryptoType)
return nil, oops.Errorf("unsupported crypto key type: %d", cryptoType)
}
}
@ -267,12 +289,12 @@ func constructSigningPublicKey(data []byte, sigType uint16) (crypto.SigningPubli
switch sigType {
case SIGNATURE_TYPE_ED25519_SHA512:
if len(data) != 32 {
return nil, errors.New("invalid Ed25519 public key length")
return nil, oops.Errorf("invalid Ed25519 public key length")
}
return crypto.Ed25519PublicKey(data), nil
// Handle other signature types...
default:
return nil, fmt.Errorf("unsupported signature key type: %d", sigType)
return nil, oops.Errorf("unsupported signature key type: %d", sigType)
}
}
@ -280,7 +302,7 @@ func constructSigningPublicKey(data []byte, sigType uint16) (crypto.SigningPubli
// It validates the sizes of the provided keys and padding before assembling the struct.
func NewKeysAndCert(
keyCertificate *KeyCertificate,
publicKey crypto.PublicKey,
publicKey crypto.RecievingPublicKey,
padding []byte,
signingPublicKey crypto.SigningPublicKey,
) (*KeysAndCert, error) {
@ -288,7 +310,7 @@ func NewKeysAndCert(
if keyCertificate == nil {
log.Error("KeyCertificate is nil")
return nil, errors.New("KeyCertificate cannot be nil")
return nil, oops.Errorf("KeyCertificate cannot be nil")
}
// Get actual key sizes from certificate
@ -296,21 +318,25 @@ func NewKeysAndCert(
sigKeySize := keyCertificate.SignatureSize()
// Validate public key size
if publicKey.Len() != pubKeySize {
log.WithFields(logrus.Fields{
"expected_size": pubKeySize,
"actual_size": publicKey.Len(),
}).Error("Invalid publicKey size")
return nil, fmt.Errorf("publicKey has invalid size: expected %d, got %d", pubKeySize, publicKey.Len())
if publicKey != nil {
if publicKey.Len() != pubKeySize {
log.WithFields(logrus.Fields{
"expected_size": pubKeySize,
"actual_size": publicKey.Len(),
}).Error("Invalid publicKey size")
return nil, oops.Errorf("publicKey has invalid size: expected %d, got %d", pubKeySize, publicKey.Len())
}
}
// Validate signing key size
if signingPublicKey.Len() != sigKeySize {
log.WithFields(logrus.Fields{
"expected_size": sigKeySize,
"actual_size": signingPublicKey.Len(),
}).Error("Invalid signingPublicKey size")
return nil, fmt.Errorf("signingPublicKey has invalid size: expected %d, got %d", sigKeySize, signingPublicKey.Len())
if signingPublicKey != nil {
// Validate signing key size
if signingPublicKey.Len() != sigKeySize {
log.WithFields(logrus.Fields{
"expected_size": sigKeySize,
"actual_size": signingPublicKey.Len(),
}).Error("Invalid signingPublicKey size")
return nil, oops.Errorf("signingPublicKey has invalid size: expected %d, got %d", sigKeySize, signingPublicKey.Len())
}
}
// Calculate expected padding size
@ -320,21 +346,21 @@ func NewKeysAndCert(
"expected_size": expectedPaddingSize,
"actual_size": len(padding),
}).Error("Invalid padding size")
return nil, fmt.Errorf("invalid padding size")
return nil, oops.Errorf("invalid padding size")
}
keysAndCert := &KeysAndCert{
KeyCertificate: keyCertificate,
publicKey: publicKey,
Padding: padding,
signingPublicKey: signingPublicKey,
KeyCertificate: keyCertificate,
ReceivingPublic: publicKey,
Padding: padding,
SigningPublic: signingPublicKey,
}
log.WithFields(logrus.Fields{
/*log.WithFields(logrus.Fields{
"public_key_length": publicKey.Len(),
"signing_public_key_length": signingPublicKey.Len(),
"padding_length": len(padding),
}).Debug("Successfully created KeysAndCert")
}).Debug("Successfully created KeysAndCert")*/
return keysAndCert, nil
}

View File

@ -0,0 +1,531 @@
<?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="518pt" height="983pt"
viewBox="0.00 0.00 517.94 983.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 983)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-983 517.944,-983 517.944,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-975 509.944,-975 509.944,-8 8,-8"/>
<text text-anchor="middle" x="258.972" y="-954.8" font-family="Arial" font-size="18.00" fill="#000000">keys_and_cert</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert</title>
<g id="a_clust6"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert">
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M82.9783,-421C82.9783,-421 172.8647,-421 172.8647,-421 178.8647,-421 184.8647,-427 184.8647,-433 184.8647,-433 184.8647,-487 184.8647,-487 184.8647,-493 178.8647,-499 172.8647,-499 172.8647,-499 82.9783,-499 82.9783,-499 76.9783,-499 70.9783,-493 70.9783,-487 70.9783,-487 70.9783,-433 70.9783,-433 70.9783,-427 76.9783,-421 82.9783,-421"/>
<text text-anchor="middle" x="127.9215" y="-429.5" font-family="Arial" font-size="15.00" fill="#222222">(KeysAndCert)</text>
</a>
</g>
</g>
<g id="clust5" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate</title>
<g id="a_clust5"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M316.843,-554C316.843,-554 489.944,-554 489.944,-554 495.944,-554 501.944,-560 501.944,-566 501.944,-566 501.944,-925 501.944,-925 501.944,-931 495.944,-937 489.944,-937 489.944,-937 316.843,-937 316.843,-937 310.843,-937 304.843,-931 304.843,-925 304.843,-925 304.843,-566 304.843,-566 304.843,-560 310.843,-554 316.843,-554"/>
<text text-anchor="middle" x="403.3935" y="-562.5" font-family="Arial" font-size="15.00" fill="#222222">(KeyCertificate)</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="M376.7329,-329C376.7329,-329 431.0541,-329 431.0541,-329 437.0541,-329 443.0541,-335 443.0541,-341 443.0541,-341 443.0541,-395 443.0541,-395 443.0541,-401 437.0541,-407 431.0541,-407 431.0541,-407 376.7329,-407 376.7329,-407 370.7329,-407 364.7329,-401 364.7329,-395 364.7329,-395 364.7329,-341 364.7329,-341 364.7329,-335 370.7329,-329 376.7329,-329"/>
<text text-anchor="middle" x="403.8935" y="-337.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&#45;i2p/logger.Logger</title>
<g id="a_clust3"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M364.2841,-121C364.2841,-121 442.5029,-121 442.5029,-121 448.5029,-121 454.5029,-127 454.5029,-133 454.5029,-133 454.5029,-309 454.5029,-309 454.5029,-315 448.5029,-321 442.5029,-321 442.5029,-321 364.2841,-321 364.2841,-321 358.2841,-321 352.2841,-315 352.2841,-309 352.2841,-309 352.2841,-133 352.2841,-133 352.2841,-127 358.2841,-121 364.2841,-121"/>
<text text-anchor="middle" x="403.3935" y="-129.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&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M366.4152,-415C366.4152,-415 441.3718,-415 441.3718,-415 447.3718,-415 453.3718,-421 453.3718,-427 453.3718,-427 453.3718,-481 453.3718,-481 453.3718,-487 447.3718,-493 441.3718,-493 441.3718,-493 366.4152,-493 366.4152,-493 360.4152,-493 354.4152,-487 354.4152,-481 354.4152,-481 354.4152,-427 354.4152,-427 354.4152,-421 360.4152,-415 366.4152,-415"/>
<text text-anchor="middle" x="403.8935" y="-423.5" font-family="Arial" font-size="15.00" fill="#222222">(*Certificate)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert | defined in keys_and_cert.go:142&#10;at keys_and_cert.go:194: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType]&#10;at keys_and_cert.go:161: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:172: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:188: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:184: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey]&#10;at keys_and_cert.go:155: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:193: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType]&#10;at keys_and_cert.go:145: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at keys_and_cert.go:197: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at keys_and_cert.go:159: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate]&#10;at keys_and_cert.go:167: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize]&#10;at keys_and_cert.go:143: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:149: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:192: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:154: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:161: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:172: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:188: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:166: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize]&#10;at keys_and_cert.go:170: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M180.6624,-693C180.6624,-693 75.1806,-693 75.1806,-693 69.1806,-693 63.1806,-687 63.1806,-681 63.1806,-681 63.1806,-669 63.1806,-669 63.1806,-663 69.1806,-657 75.1806,-657 75.1806,-657 180.6624,-657 180.6624,-657 186.6624,-657 192.6624,-663 192.6624,-669 192.6624,-669 192.6624,-681 192.6624,-681 192.6624,-687 186.6624,-693 180.6624,-693"/>
<text text-anchor="middle" x="127.9215" y="-670.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadKeysAndCert</text>
</a>
</g>
</g>
<!-- github.com/samber/oops.Errorf -->
<g id="node2" class="node">
<title>github.com/samber/oops.Errorf</title>
<g id="a_node2"><a xlink:title="github.com/samber/oops.Errorf | defined in oops.go:34">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M420.5888,-113C420.5888,-113 386.1982,-113 386.1982,-113 380.1982,-113 374.1982,-107 374.1982,-101 374.1982,-101 374.1982,-89 374.1982,-89 374.1982,-83 380.1982,-77 386.1982,-77 386.1982,-77 420.5888,-77 420.5888,-77 426.5888,-77 432.5888,-83 432.5888,-89 432.5888,-89 432.5888,-101 432.5888,-101 432.5888,-107 426.5888,-113 420.5888,-113"/>
<text text-anchor="middle" x="403.3935" y="-99.2" font-family="Verdana" font-size="14.00" fill="#000000">oops</text>
<text text-anchor="middle" x="403.3935" y="-82.4" font-family="Verdana" font-size="14.00" fill="#000000">Errorf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge8" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge8"><a xlink:title="at keys_and_cert.go:155: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M143.8627,-656.5842C168.659,-626.8653 216.0827,-565.521 239.843,-505 271.7913,-423.623 244.7054,-180.4538 304.843,-117 319.9046,-101.1079 343.7276,-95.4861 364.1779,-93.896"/>
<polygon fill="#8b4513" stroke="#8b4513" points="364.379,-97.3905 374.1957,-93.4052 364.0364,-90.3989 364.379,-97.3905"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate | defined in key_certificate.go:356">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M457.7212,-546C457.7212,-546 349.0658,-546 349.0658,-546 343.0658,-546 337.0658,-540 337.0658,-534 337.0658,-534 337.0658,-522 337.0658,-522 337.0658,-516 343.0658,-510 349.0658,-510 349.0658,-510 457.7212,-510 457.7212,-510 463.7212,-510 469.7212,-516 469.7212,-522 469.7212,-522 469.7212,-534 469.7212,-534 469.7212,-540 463.7212,-546 457.7212,-546"/>
<text text-anchor="middle" x="403.3935" y="-532.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="403.3935" y="-515.4" font-family="Verdana" font-size="14.00" fill="#000000">NewKeyCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate -->
<g id="edge15" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate</title>
<g id="a_edge15"><a xlink:title="at keys_and_cert.go:159: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate]">
<path fill="none" stroke="#8b4513" d="M192.97,-674.8638C221.8889,-671.5212 254.395,-662.7751 276.843,-642 308.2115,-612.9693 273.4972,-579.0553 304.843,-550 311.3352,-543.9822 319.1006,-539.4824 327.3843,-536.136"/>
<polygon fill="#8b4513" stroke="#8b4513" points="328.6168,-539.4132 336.9169,-532.8284 326.3221,-532.7999 328.6168,-539.4132"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="node11" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_node11"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithFields | defined in log.go:60">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M434.6126,-252C434.6126,-252 372.1744,-252 372.1744,-252 366.1744,-252 360.1744,-246 360.1744,-240 360.1744,-240 360.1744,-228 360.1744,-228 360.1744,-222 366.1744,-216 372.1744,-216 372.1744,-216 434.6126,-216 434.6126,-216 440.6126,-216 446.6126,-222 446.6126,-228 446.6126,-228 446.6126,-240 446.6126,-240 446.6126,-246 440.6126,-252 434.6126,-252"/>
<text text-anchor="middle" x="403.3935" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="403.3935" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge19" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge19"><a xlink:title="at keys_and_cert.go:143: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:149: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:192: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M166.7371,-656.9252C201.9987,-638.2568 252.1576,-605.5781 276.843,-561 308.9578,-503.0055 262.9195,-315.3531 304.843,-264 316.0468,-250.2762 333.3358,-242.6814 350.3232,-238.5271"/>
<polygon fill="#8b4513" stroke="#8b4513" points="351.1673,-241.9265 360.242,-236.4584 349.7381,-235.0739 351.1673,-241.9265"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="node12" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_node12"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Error | defined in log.go:42">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M421.1598,-191C421.1598,-191 385.6272,-191 385.6272,-191 379.6272,-191 373.6272,-185 373.6272,-179 373.6272,-179 373.6272,-167 373.6272,-167 373.6272,-161 379.6272,-155 385.6272,-155 385.6272,-155 421.1598,-155 421.1598,-155 427.1598,-155 433.1598,-161 433.1598,-167 433.1598,-167 433.1598,-179 433.1598,-179 433.1598,-185 427.1598,-191 421.1598,-191"/>
<text text-anchor="middle" x="403.3935" y="-177.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="403.3935" y="-160.4" font-family="Verdana" font-size="14.00" fill="#000000">Error</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge20" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge20"><a xlink:title="at keys_and_cert.go:154: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:161: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:172: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:188: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M157.5401,-656.8334C192.8637,-633.3427 250.4401,-588.8608 276.843,-534 308.8552,-467.4842 258.4356,-260.4063 304.843,-203 318.886,-185.6287 342.6844,-178.0668 363.3765,-174.8776"/>
<polygon fill="#8b4513" stroke="#8b4513" points="364.0468,-178.3211 373.5362,-173.6093 363.1797,-171.375 364.0468,-178.3211"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="node13" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_node13"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithError | defined in log.go:66">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M431.925,-313C431.925,-313 374.862,-313 374.862,-313 368.862,-313 362.862,-307 362.862,-301 362.862,-301 362.862,-289 362.862,-289 362.862,-283 368.862,-277 374.862,-277 374.862,-277 431.925,-277 431.925,-277 437.925,-277 443.925,-283 443.925,-289 443.925,-289 443.925,-301 443.925,-301 443.925,-307 437.925,-313 431.925,-313"/>
<text text-anchor="middle" x="403.3935" y="-299.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="403.3935" y="-282.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge4"><a xlink:title="at keys_and_cert.go:161: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:172: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:188: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M183.7946,-656.9047C216.4688,-643.2906 255.3921,-621.1975 276.843,-588 341.1192,-488.5262 228.5804,-413.6117 304.843,-323 316.6193,-309.0079 334.8337,-301.7386 352.4149,-298.0489"/>
<polygon fill="#8b4513" stroke="#8b4513" points="353.3895,-301.4318 362.6397,-296.2663 352.1872,-294.5359 353.3895,-301.4318"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Logger).Debug -->
<g id="node14" class="node">
<title>(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_node14"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Debug | defined in logger.go:221">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M422.2155,-399C422.2155,-399 384.5715,-399 384.5715,-399 378.5715,-399 372.5715,-393 372.5715,-387 372.5715,-387 372.5715,-375 372.5715,-375 372.5715,-369 378.5715,-363 384.5715,-363 384.5715,-363 422.2155,-363 422.2155,-363 428.2155,-363 434.2155,-369 434.2155,-375 434.2155,-375 434.2155,-387 434.2155,-387 434.2155,-393 428.2155,-399 422.2155,-399"/>
<text text-anchor="middle" x="403.3935" y="-385.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="403.3935" y="-368.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge14" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge14"><a xlink:title="at keys_and_cert.go:145: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at keys_and_cert.go:197: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M192.7169,-664.3298C222.8565,-655.9798 256.4681,-641.1747 276.843,-615 333.5988,-542.0887 244.2982,-478.7969 304.843,-409 319.1007,-392.5635 342.2361,-385.4419 362.5088,-382.486"/>
<polygon fill="#8b4513" stroke="#8b4513" points="362.9564,-385.9576 372.4822,-381.3197 362.1433,-379.005 362.9564,-385.9576"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize -->
<g id="node15" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize</title>
<g id="a_node15"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize | defined in key_certificate.go:336">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M445.0648,-685C445.0648,-685 361.7222,-685 361.7222,-685 355.7222,-685 349.7222,-679 349.7222,-673 349.7222,-673 349.7222,-661 349.7222,-661 349.7222,-655 355.7222,-649 361.7222,-649 361.7222,-649 445.0648,-649 445.0648,-649 451.0648,-649 457.0648,-655 457.0648,-661 457.0648,-661 457.0648,-673 457.0648,-673 457.0648,-679 451.0648,-685 445.0648,-685"/>
<text text-anchor="middle" x="403.3935" y="-671.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="403.3935" y="-654.4" font-family="Verdana" font-size="14.00" fill="#000000">CryptoSize</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize -->
<g id="edge21" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize</title>
<g id="a_edge21"><a xlink:title="at keys_and_cert.go:166: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize]">
<path fill="none" stroke="#8b4513" d="M192.6966,-691.3183C218.7969,-696.016 249.2118,-699.1254 276.843,-696 297.5359,-693.6594 319.7758,-689.231 339.7508,-684.5266"/>
<polygon fill="#8b4513" stroke="#8b4513" points="340.7669,-687.8818 349.6628,-682.1273 339.12,-681.0783 340.7669,-687.8818"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize -->
<g id="node16" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize</title>
<g id="a_node16"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize | defined in key_certificate.go:308">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M445.0648,-624C445.0648,-624 361.7222,-624 361.7222,-624 355.7222,-624 349.7222,-618 349.7222,-612 349.7222,-612 349.7222,-600 349.7222,-600 349.7222,-594 355.7222,-588 361.7222,-588 361.7222,-588 445.0648,-588 445.0648,-588 451.0648,-588 457.0648,-594 457.0648,-600 457.0648,-600 457.0648,-612 457.0648,-612 457.0648,-618 451.0648,-624 445.0648,-624"/>
<text text-anchor="middle" x="403.3935" y="-610.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="403.3935" y="-593.4" font-family="Verdana" font-size="14.00" fill="#000000">SignatureSize</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize -->
<g id="edge16" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize</title>
<g id="a_edge16"><a xlink:title="at keys_and_cert.go:167: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize]">
<path fill="none" stroke="#8b4513" d="M192.9302,-683.3546C220.0593,-684.1156 251.1657,-681.2808 276.843,-669 293.8915,-660.8461 289.0186,-647.3307 304.843,-637 315.4495,-630.0758 327.7038,-624.6127 339.8897,-620.3316"/>
<polygon fill="#8b4513" stroke="#8b4513" points="341.2013,-623.585 349.6151,-617.1462 339.0224,-616.9327 341.2013,-623.585"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey -->
<g id="node17" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey</title>
<g id="a_node17"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey | defined in key_certificate.go:136">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M459.9315,-868C459.9315,-868 346.8555,-868 346.8555,-868 340.8555,-868 334.8555,-862 334.8555,-856 334.8555,-856 334.8555,-844 334.8555,-844 334.8555,-838 340.8555,-832 346.8555,-832 346.8555,-832 459.9315,-832 459.9315,-832 465.9315,-832 471.9315,-838 471.9315,-844 471.9315,-844 471.9315,-856 471.9315,-856 471.9315,-862 465.9315,-868 459.9315,-868"/>
<text text-anchor="middle" x="403.3935" y="-854.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="403.3935" y="-837.4" font-family="Verdana" font-size="14.00" fill="#000000">ConstructPublicKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey -->
<g id="edge29" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey</title>
<g id="a_edge29"><a xlink:title="at keys_and_cert.go:170: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructPublicKey]">
<path fill="none" stroke="#8b4513" d="M145.2786,-693.2912C175.1374,-723.7533 239.3534,-784.9819 304.843,-820 311.2403,-823.4207 318.0845,-826.5106 325.0734,-829.2886"/>
<polygon fill="#8b4513" stroke="#8b4513" points="324.0727,-832.6513 334.665,-832.8853 326.5305,-826.097 324.0727,-832.6513"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey -->
<g id="node18" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey</title>
<g id="a_node18"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey | defined in key_certificate.go:228">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M481.9945,-929C481.9945,-929 324.7925,-929 324.7925,-929 318.7925,-929 312.7925,-923 312.7925,-917 312.7925,-917 312.7925,-905 312.7925,-905 312.7925,-899 318.7925,-893 324.7925,-893 324.7925,-893 481.9945,-893 481.9945,-893 487.9945,-893 493.9945,-899 493.9945,-905 493.9945,-905 493.9945,-917 493.9945,-917 493.9945,-923 487.9945,-929 481.9945,-929"/>
<text text-anchor="middle" x="403.3935" y="-915.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="403.3935" y="-898.4" font-family="Verdana" font-size="14.00" fill="#000000">ConstructSigningPublicKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey -->
<g id="edge5" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey</title>
<g id="a_edge5"><a xlink:title="at keys_and_cert.go:184: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).ConstructSigningPublicKey]">
<path fill="none" stroke="#8b4513" d="M138.4625,-693.1607C162.6348,-733.2019 226.0876,-829.588 304.843,-881 309.1779,-883.8298 313.7924,-886.4033 318.5678,-888.7421"/>
<polygon fill="#8b4513" stroke="#8b4513" points="317.3636,-892.0384 327.9186,-892.9564 320.2399,-885.6566 317.3636,-892.0384"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType -->
<g id="node19" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType</title>
<g id="a_node19"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType | defined in key_certificate.go:126">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M447.2604,-746C447.2604,-746 359.5266,-746 359.5266,-746 353.5266,-746 347.5266,-740 347.5266,-734 347.5266,-734 347.5266,-722 347.5266,-722 347.5266,-716 353.5266,-710 359.5266,-710 359.5266,-710 447.2604,-710 447.2604,-710 453.2604,-710 459.2604,-716 459.2604,-722 459.2604,-722 459.2604,-734 459.2604,-734 459.2604,-740 453.2604,-746 447.2604,-746"/>
<text text-anchor="middle" x="403.3935" y="-732.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="403.3935" y="-715.4" font-family="Verdana" font-size="14.00" fill="#000000">PublicKeyType</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType -->
<g id="edge9" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType</title>
<g id="a_edge9"><a xlink:title="at keys_and_cert.go:193: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType]">
<path fill="none" stroke="#8b4513" d="M192.8557,-687.4931C236.389,-695.8688 293.5386,-706.8642 337.309,-715.2855"/>
<polygon fill="#8b4513" stroke="#8b4513" points="336.8,-718.7517 347.2812,-717.2042 338.1226,-711.8778 336.8,-718.7517"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType -->
<g id="node20" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType</title>
<g id="a_node20"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType | defined in key_certificate.go:117">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M469.3247,-807C469.3247,-807 337.4623,-807 337.4623,-807 331.4623,-807 325.4623,-801 325.4623,-795 325.4623,-795 325.4623,-783 325.4623,-783 325.4623,-777 331.4623,-771 337.4623,-771 337.4623,-771 469.3247,-771 469.3247,-771 475.3247,-771 481.3247,-777 481.3247,-783 481.3247,-783 481.3247,-795 481.3247,-795 481.3247,-801 475.3247,-807 469.3247,-807"/>
<text text-anchor="middle" x="403.3935" y="-793.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="403.3935" y="-776.4" font-family="Verdana" font-size="14.00" fill="#000000">SigningPublicKeyType</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType</title>
<g id="a_edge1"><a xlink:title="at keys_and_cert.go:194: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType]">
<path fill="none" stroke="#8b4513" d="M162.1682,-693.1217C197.3304,-711.2817 253.9512,-739.2968 304.843,-759 312.8408,-762.0964 321.3002,-765.0854 329.7677,-767.8986"/>
<polygon fill="#8b4513" stroke="#8b4513" points="328.715,-771.2366 339.3071,-770.9965 330.8771,-764.5789 328.715,-771.2366"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructSigningPublicKey -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructSigningPublicKey</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructSigningPublicKey | defined in keys_and_cert.go:285&#10;at keys_and_cert.go:294: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:289: calling [github.com/samber/oops.Errorf]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M204.9005,-174C204.9005,-174 50.9425,-174 50.9425,-174 44.9425,-174 38.9425,-168 38.9425,-162 38.9425,-162 38.9425,-150 38.9425,-150 38.9425,-144 44.9425,-138 50.9425,-138 50.9425,-138 204.9005,-138 204.9005,-138 210.9005,-138 216.9005,-144 216.9005,-150 216.9005,-150 216.9005,-162 216.9005,-162 216.9005,-168 210.9005,-174 204.9005,-174"/>
<text text-anchor="middle" x="127.9215" y="-151.8" font-family="Verdana" font-size="14.00" fill="#000000">constructSigningPublicKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructSigningPublicKey&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge30" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructSigningPublicKey&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge30"><a xlink:title="at keys_and_cert.go:294: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:289: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M193.0243,-137.9766C208.3786,-133.7234 224.6885,-129.2035 239.843,-125 255.8446,-120.5615 259.6133,-118.5143 275.843,-115 305.2057,-108.642 338.7862,-103.4592 364.1189,-99.9639"/>
<polygon fill="#8b4513" stroke="#8b4513" points="364.6464,-103.4246 374.0875,-98.6167 363.7088,-96.4876 364.6464,-103.4246"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructPublicKey -->
<g id="node5" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructPublicKey</title>
<g id="a_node5"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructPublicKey | defined in keys_and_cert.go:270&#10;at keys_and_cert.go:281: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:274: calling [github.com/samber/oops.Errorf]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M183.3373,-113C183.3373,-113 72.5057,-113 72.5057,-113 66.5057,-113 60.5057,-107 60.5057,-101 60.5057,-101 60.5057,-89 60.5057,-89 60.5057,-83 66.5057,-77 72.5057,-77 72.5057,-77 183.3373,-77 183.3373,-77 189.3373,-77 195.3373,-83 195.3373,-89 195.3373,-89 195.3373,-101 195.3373,-101 195.3373,-107 189.3373,-113 183.3373,-113"/>
<text text-anchor="middle" x="127.9215" y="-90.8" font-family="Verdana" font-size="14.00" fill="#000000">constructPublicKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructPublicKey&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge25" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.constructPublicKey&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge25"><a xlink:title="at keys_and_cert.go:281: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:274: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M195.3627,-89.6985C220.8813,-88.2528 250.1937,-87.2635 276.843,-88 306.0974,-88.8085 339.1122,-90.6663 364.084,-92.2649"/>
<polygon fill="#8b4513" stroke="#8b4513" points="364.0523,-95.7702 374.2594,-92.9303 364.5091,-88.7851 364.0523,-95.7702"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.init -->
<g id="node6" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.init</title>
<g id="a_node6"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.init | defined in .:0&#10;at keys_and_cert.go:14: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M142.9215,-52C142.9215,-52 112.9215,-52 112.9215,-52 106.9215,-52 100.9215,-46 100.9215,-40 100.9215,-40 100.9215,-28 100.9215,-28 100.9215,-22 106.9215,-16 112.9215,-16 112.9215,-16 142.9215,-16 142.9215,-16 148.9215,-16 154.9215,-22 154.9215,-28 154.9215,-28 154.9215,-40 154.9215,-40 154.9215,-46 148.9215,-52 142.9215,-52"/>
<text text-anchor="middle" x="127.9215" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node7" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node7"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M452.083,-52C452.083,-52 354.704,-52 354.704,-52 348.704,-52 342.704,-46 342.704,-40 342.704,-40 342.704,-28 342.704,-28 342.704,-22 348.704,-16 354.704,-16 354.704,-16 452.083,-16 452.083,-16 458.083,-16 464.083,-22 464.083,-28 464.083,-28 464.083,-40 464.083,-40 464.083,-46 458.083,-52 452.083,-52"/>
<text text-anchor="middle" x="403.3935" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="403.3935" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge22" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge22"><a xlink:title="at keys_and_cert.go:14: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M155.0887,-34C195.9363,-34 274.546,-34 332.4167,-34"/>
<polygon fill="#8b4513" stroke="#8b4513" points="332.6037,-37.5001 342.6036,-34 332.6036,-30.5001 332.6037,-37.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519 -->
<g id="node8" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519</title>
<g id="a_node8"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519 | defined in keys_and_cert.go:202&#10;at keys_and_cert.go:203: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:260: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:205: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at keys_and_cert.go:265: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at keys_and_cert.go:218: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:229: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:245: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:219: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:230: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:246: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:256: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:219: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:230: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:246: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:256: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:254: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M227.7646,-235C227.7646,-235 28.0784,-235 28.0784,-235 22.0784,-235 16.0784,-229 16.0784,-223 16.0784,-223 16.0784,-211 16.0784,-211 16.0784,-205 22.0784,-199 28.0784,-199 28.0784,-199 227.7646,-199 227.7646,-199 233.7646,-199 239.7646,-205 239.7646,-211 239.7646,-211 239.7646,-223 239.7646,-223 239.7646,-229 233.7646,-235 227.7646,-235"/>
<text text-anchor="middle" x="127.9215" y="-212.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadKeysAndCertElgAndEd25519</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge10" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge10"><a xlink:title="at keys_and_cert.go:218: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:229: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:245: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M212.5176,-198.9808C222.0613,-195.3874 231.3831,-191.1025 239.843,-186 275.9199,-164.2407 268.2275,-137.8402 304.843,-117 322.8401,-106.7567 345.2113,-101.2823 364.0882,-98.3568"/>
<polygon fill="#8b4513" stroke="#8b4513" points="364.7318,-101.8015 374.1658,-96.9797 363.784,-94.8659 364.7318,-101.8015"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate -->
<g id="edge18" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate</title>
<g id="a_edge18"><a xlink:title="at keys_and_cert.go:254: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.NewKeyCertificate]">
<path fill="none" stroke="#8b4513" d="M152.985,-235.2962C177.7252,-254.4015 215.3117,-286.3687 239.843,-321 263.6588,-354.6212 262.657,-367.3175 276.843,-406 291.7054,-446.5268 274.2247,-468.5726 304.843,-499 311.3462,-505.4626 319.2114,-510.4991 327.6295,-514.4217"/>
<polygon fill="#8b4513" stroke="#8b4513" points="326.3633,-517.6853 336.9427,-518.2557 329.028,-511.2124 326.3633,-517.6853"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge2"><a xlink:title="at keys_and_cert.go:203: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:260: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M197.2721,-198.9469C222.3516,-194.6033 250.8809,-192.1862 276.843,-196 284.4717,-197.1206 318.9934,-207.5456 350.0558,-217.1927"/>
<polygon fill="#8b4513" stroke="#8b4513" points="349.3926,-220.6519 359.981,-220.2847 351.4747,-213.9687 349.3926,-220.6519"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge12" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge12"><a xlink:title="at keys_and_cert.go:219: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:230: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:246: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:256: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M222.8962,-198.9676C240.4749,-195.8282 258.6953,-192.7061 275.843,-190 304.9989,-185.3989 338.0353,-181.0188 363.1803,-177.8572"/>
<polygon fill="#8b4513" stroke="#8b4513" points="363.9484,-181.2887 373.4393,-176.5798 363.0834,-174.3424 363.9484,-181.2887"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge11" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge11"><a xlink:title="at keys_and_cert.go:219: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:230: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:246: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at keys_and_cert.go:256: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M240.0357,-210.2228C252.9491,-212.6803 265.5262,-216.73 276.843,-223 296.1446,-233.694 287.12,-250.8543 304.843,-264 318.8008,-274.353 336.3101,-281.3098 352.6832,-285.9582"/>
<polygon fill="#8b4513" stroke="#8b4513" points="352.1297,-289.4308 362.6891,-288.564 353.8939,-282.6567 352.1297,-289.4308"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge6" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCertElgAndEd25519&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge6"><a xlink:title="at keys_and_cert.go:205: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at keys_and_cert.go:265: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M240.0563,-228.7418C253.4889,-233.7787 266.1921,-240.6576 276.843,-250 304.2186,-274.0125 281.1301,-299.3644 304.843,-327 320.2372,-344.9408 343.1376,-357.996 362.9895,-366.7711"/>
<polygon fill="#8b4513" stroke="#8b4513" points="361.8684,-370.0962 372.4438,-370.7377 364.5766,-363.6413 361.8684,-370.0962"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert -->
<g id="node9" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert</title>
<g id="a_node9"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert | defined in keys_and_cert.go:300&#10;at keys_and_cert.go:315: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize]&#10;at keys_and_cert.go:310: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:324: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:335: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:346: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:314: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize]&#10;at keys_and_cert.go:306: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at keys_and_cert.go:309: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:323: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:334: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:345: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:320: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:331: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:342: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M179.8247,-369C179.8247,-369 76.0183,-369 76.0183,-369 70.0183,-369 64.0183,-363 64.0183,-357 64.0183,-357 64.0183,-345 64.0183,-345 64.0183,-339 70.0183,-333 76.0183,-333 76.0183,-333 179.8247,-333 179.8247,-333 185.8247,-333 191.8247,-339 191.8247,-345 191.8247,-345 191.8247,-357 191.8247,-357 191.8247,-363 185.8247,-369 179.8247,-369"/>
<text text-anchor="middle" x="127.9215" y="-346.8" font-family="Verdana" font-size="14.00" fill="#000000">NewKeysAndCert</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge7" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge7"><a xlink:title="at keys_and_cert.go:310: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:324: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:335: calling [github.com/samber/oops.Errorf]&#10;at keys_and_cert.go:346: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M152.1441,-332.7848C176.5748,-313.5026 214.2421,-281.1803 239.843,-247 259.2056,-221.1485 279.3945,-136.8893 304.843,-117 321.5858,-103.9146 344.5681,-98.2886 364.1275,-95.9917"/>
<polygon fill="#8b4513" stroke="#8b4513" points="364.6506,-99.4584 374.2856,-95.052 364.0057,-92.4881 364.6506,-99.4584"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge28" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge28"><a xlink:title="at keys_and_cert.go:320: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:331: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:342: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M191.7116,-348.8837C220.192,-345.1015 252.6964,-336.5574 276.843,-318 298.2784,-301.5262 284.0613,-281.2911 304.843,-264 317.7082,-253.2957 334.3362,-246.4085 350.257,-241.9781"/>
<polygon fill="#8b4513" stroke="#8b4513" points="351.1905,-245.3525 360.0386,-239.5249 349.4876,-238.5627 351.1905,-245.3525"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge27" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge27"><a xlink:title="at keys_and_cert.go:309: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:323: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:334: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at keys_and_cert.go:345: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M191.9642,-338.4004C221.3678,-329.6201 254.5678,-315.0105 276.843,-291 304.7572,-260.9111 275.6395,-231.8392 304.843,-203 320.3392,-187.6971 343.392,-180.1646 363.306,-176.4727"/>
<polygon fill="#8b4513" stroke="#8b4513" points="364.0507,-179.8983 373.377,-174.8713 362.9514,-172.9852 364.0507,-179.8983"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge26" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge26"><a xlink:title="at keys_and_cert.go:306: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M191.8127,-357.958C244.4538,-363.6908 317.5263,-371.6487 362.5692,-376.5541"/>
<polygon fill="#8b4513" stroke="#8b4513" points="362.2418,-380.039 372.562,-377.6423 362.9997,-373.0802 362.2418,-380.039"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize -->
<g id="edge13" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize</title>
<g id="a_edge13"><a xlink:title="at keys_and_cert.go:314: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize]">
<path fill="none" stroke="#8b4513" d="M177.0131,-369.0656C199.059,-379.4364 223.6889,-394.5297 239.843,-415 303.5319,-495.7057 232.5349,-563.9164 304.843,-637 314.3655,-646.6246 326.8741,-653.1804 339.77,-657.6406"/>
<polygon fill="#8b4513" stroke="#8b4513" points="339.0779,-661.0887 349.664,-660.6591 341.1205,-654.3933 339.0779,-661.0887"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize</title>
<g id="a_edge3"><a xlink:title="at keys_and_cert.go:315: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize]">
<path fill="none" stroke="#8b4513" d="M191.6882,-362.1355C221.9523,-370.7126 255.9784,-385.7562 276.843,-412 325.0422,-472.6256 251.6954,-527.6622 304.843,-584 314.0457,-593.7551 326.5488,-599.6446 339.5579,-603.1076"/>
<polygon fill="#8b4513" stroke="#8b4513" points="339.04,-606.5773 349.5584,-605.3067 340.5435,-599.7406 339.04,-606.5773"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes -->
<g id="node10" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes</title>
<g id="a_node10"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes | defined in certificate.go:100">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M431.3501,-485C431.3501,-485 375.4369,-485 375.4369,-485 369.4369,-485 363.4369,-479 363.4369,-473 363.4369,-473 363.4369,-461 363.4369,-461 363.4369,-455 369.4369,-449 375.4369,-449 375.4369,-449 431.3501,-449 431.3501,-449 437.3501,-449 443.3501,-455 443.3501,-461 443.3501,-461 443.3501,-473 443.3501,-473 443.3501,-479 437.3501,-485 431.3501,-485"/>
<text text-anchor="middle" x="403.3935" y="-471.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="403.3935" y="-454.4" font-family="Verdana" font-size="14.00" fill="#000000">Bytes</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes -->
<g id="node21" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes</title>
<g id="a_node21"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes | defined in keys_and_cert.go:87&#10;at keys_and_cert.go:113: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at keys_and_cert.go:109: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]&#10;at keys_and_cert.go:110: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]&#10;at keys_and_cert.go:121: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M143.808,-491C143.808,-491 112.035,-491 112.035,-491 106.035,-491 100.035,-485 100.035,-479 100.035,-479 100.035,-467 100.035,-467 100.035,-461 106.035,-455 112.035,-455 112.035,-455 143.808,-455 143.808,-455 149.808,-455 155.808,-461 155.808,-467 155.808,-467 155.808,-479 155.808,-479 155.808,-485 149.808,-491 143.808,-491"/>
<text text-anchor="middle" x="127.9215" y="-468.8" font-family="Verdana" font-size="14.00" fill="#000000">Bytes</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes -->
<g id="edge23" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes</title>
<g id="a_edge23"><a xlink:title="at keys_and_cert.go:109: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]&#10;at keys_and_cert.go:110: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.Certificate).Bytes]">
<path fill="none" stroke="#8b4513" d="M155.9212,-475.9548C185.8556,-478.7304 234.709,-482.1584 276.843,-480 302.1093,-478.7057 330.1021,-475.9668 353.3226,-473.3353"/>
<polygon fill="#8b4513" stroke="#8b4513" points="353.7632,-476.8078 363.2935,-472.1792 352.9568,-469.8544 353.7632,-476.8078"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge17" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge17"><a xlink:title="at keys_and_cert.go:113: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M155.98,-475.87C190.0003,-477.6345 246.5359,-474.7391 276.843,-441 330.0662,-381.7497 252.5607,-324.0821 304.843,-264 316.3746,-250.7481 333.5651,-243.2488 350.3744,-239.0387"/>
<polygon fill="#8b4513" stroke="#8b4513" points="351.1457,-242.4529 360.1818,-236.9213 349.6684,-235.6106 351.1457,-242.4529"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge24" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.KeysAndCert).Bytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge24"><a xlink:title="at keys_and_cert.go:121: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M155.8096,-475.9198C187.6346,-477.8339 240.0275,-476.5344 276.843,-453 296.3729,-440.5154 286.2571,-422.8509 304.843,-409 321.526,-396.5672 343.5395,-389.6503 362.5288,-385.8042"/>
<polygon fill="#8b4513" stroke="#8b4513" points="363.2084,-389.2382 372.4256,-384.014 361.9623,-382.35 363.2084,-389.2382"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -2,6 +2,7 @@ package keys_and_cert
import (
"bytes"
"crypto/ed25519"
"crypto/rand"
"testing"
@ -32,8 +33,15 @@ func TestCertificateWithMissingData(t *testing.T) {
// createValidKeyCertificate creates a valid KeyCertificate for testing.
func createValidKeyAndCert(t *testing.T) *KeysAndCert {
// Generate signing key pair (Ed25519)
var ed25519_privkey crypto.Ed25519PrivateKey
_, err := (&ed25519_privkey).Generate()
//var ed25519_privkey crypto.Ed25519PrivateKey
_, priv, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
t.Fatalf("Failed to generate Ed25519 private %s", err)
}
// Copy the full private key (includes public key)
ed25519_privkey := make(crypto.Ed25519PrivateKey, ed25519.PrivateKeySize)
copy(ed25519_privkey, priv)
//_, err = (ed25519_privkey).Generate()
if err != nil {
t.Fatalf("Failed to generate Ed25519 private key: %v\n", err)
}
@ -103,7 +111,7 @@ func createValidKeyAndCert(t *testing.T) *KeysAndCert {
t.Fatal(err)
}
t.Logf("pubkey bytes after NewKeysAndCert: %v\n", keysAndCert.signingPublicKey.Bytes())
t.Logf("pubkey bytes after NewKeysAndCert: %v\n", keysAndCert.SigningPublic.Bytes())
return keysAndCert
}
@ -122,9 +130,9 @@ func TestCertificateWithValidDataElgAndEd25519(t *testing.T) {
// Compare individual fields
assert.Equal(keysAndCert.KeyCertificate.Bytes(), parsedKeysAndCert.KeyCertificate.Bytes(), "KeyCertificates should match")
assert.Equal(keysAndCert.publicKey.Bytes(), parsedKeysAndCert.publicKey.Bytes(), "PublicKeys should match")
assert.Equal(keysAndCert.ReceivingPublic.Bytes(), parsedKeysAndCert.ReceivingPublic.Bytes(), "PublicKeys should match")
assert.Equal(keysAndCert.Padding, parsedKeysAndCert.Padding, "Padding should match")
assert.Equal(keysAndCert.signingPublicKey.Bytes(), parsedKeysAndCert.signingPublicKey.Bytes(), "SigningPublicKeys should match")
assert.Equal(keysAndCert.SigningPublic.Bytes(), parsedKeysAndCert.SigningPublic.Bytes(), "SigningPublicKeys should match")
}
func TestCertificateWithValidDataManual(t *testing.T) {

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/lease"
![lease.svg](lease.svg)
Package lease implements the I2P lease common data structure
## Usage
@ -21,17 +23,21 @@ Sizes in bytes of various components of a Lease
type Lease [LEASE_SIZE]byte
```
Lease is the represenation of an I2P Lease.
https://geti2p.net/spec/common-structures#lease
#### func NewLease
```go
func NewLease(data []byte) (lease *Lease, remainder []byte, err error)
func NewLease(tunnelGateway Hash, tunnelID uint32, expirationTime time.Time) (*Lease, error)
```
NewLease creates a new *NewLease from []byte using ReadLease. Returns a pointer
to KeysAndCert unlike ReadLease.
NewLease creates a new Lease with the provided parameters.
#### func NewLeaseFromBytes
```go
func NewLeaseFromBytes(data []byte) (lease *Lease, remainder []byte, err error)
```
NewLeaseFromBytes creates a new *Lease from []byte using ReadLease. Returns a
pointer to Lease unlike ReadLease.
#### func ReadLease
@ -61,3 +67,9 @@ TunnelGateway returns the tunnel gateway as a Hash.
func (lease Lease) TunnelID() uint32
```
TunnelID returns the tunnel id as a uint23.
lease
github.com/go-i2p/go-i2p/lib/common/lease

View File

@ -3,11 +3,11 @@ package lease
import (
"encoding/binary"
"errors"
"time"
. "github.com/go-i2p/go-i2p/lib/common/data"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
)
@ -87,7 +87,7 @@ func ReadLease(data []byte) (lease Lease, remainder []byte, err error) {
log.WithField("input_length", len(data)).Debug("Reading Lease from bytes")
if len(data) < LEASE_SIZE {
err = errors.New("error parsing lease: not enough data")
err = oops.Errorf("error parsing lease: not enough data")
log.WithFields(logrus.Fields{
"data_length": len(data),
"required_length": LEASE_SIZE,

391
lib/common/lease/lease.svg Normal file
View File

@ -0,0 +1,391 @@
<?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="675pt" height="695pt"
viewBox="0.00 0.00 674.70 695.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 695)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-695 674.6972,-695 674.6972,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-687 667.6972,-687 667.6972,-8 8,-8"/>
<text text-anchor="middle" x="337.8486" y="-666.8" font-family="Arial" font-size="18.00" fill="#000000">lease</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease</title>
<g id="a_clust6"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease">
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M436.3753,-510C436.3753,-510 506.8003,-510 506.8003,-510 512.8003,-510 518.8003,-516 518.8003,-522 518.8003,-522 518.8003,-637 518.8003,-637 518.8003,-643 512.8003,-649 506.8003,-649 506.8003,-649 436.3753,-649 436.3753,-649 430.3753,-649 424.3753,-643 424.3753,-637 424.3753,-637 424.3753,-522 424.3753,-522 424.3753,-516 430.3753,-510 436.3753,-510"/>
<text text-anchor="middle" x="471.5878" y="-518.5" font-family="Arial" font-size="15.00" fill="#222222">(Lease)</text>
</a>
</g>
</g>
<g id="clust5" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer</title>
<g id="a_clust5"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M599.6972,-510C599.6972,-510 647.6972,-510 647.6972,-510 653.6972,-510 659.6972,-516 659.6972,-522 659.6972,-522 659.6972,-576 659.6972,-576 659.6972,-582 653.6972,-588 647.6972,-588 647.6972,-588 599.6972,-588 599.6972,-588 593.6972,-588 587.6972,-582 587.6972,-576 587.6972,-576 587.6972,-522 587.6972,-522 587.6972,-516 593.6972,-510 599.6972,-510"/>
<text text-anchor="middle" x="623.6972" y="-518.5" font-family="Arial" font-size="15.00" fill="#222222">(Integer)</text>
</a>
</g>
</g>
<g id="clust4" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date</title>
<g id="a_clust4"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M448.5878,-424C448.5878,-424 494.5878,-424 494.5878,-424 500.5878,-424 506.5878,-430 506.5878,-436 506.5878,-436 506.5878,-490 506.5878,-490 506.5878,-496 500.5878,-502 494.5878,-502 494.5878,-502 448.5878,-502 448.5878,-502 442.5878,-502 436.5878,-496 436.5878,-490 436.5878,-490 436.5878,-436 436.5878,-436 436.5878,-430 442.5878,-424 448.5878,-424"/>
<text text-anchor="middle" x="471.5878" y="-432.5" font-family="Arial" font-size="15.00" fill="#222222">(Date)</text>
</a>
</g>
</g>
<g id="clust3" class="cluster">
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
<g id="a_clust3"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M444.9272,-338C444.9272,-338 499.2484,-338 499.2484,-338 505.2484,-338 511.2484,-344 511.2484,-350 511.2484,-350 511.2484,-404 511.2484,-404 511.2484,-410 505.2484,-416 499.2484,-416 499.2484,-416 444.9272,-416 444.9272,-416 438.9272,-416 432.9272,-410 432.9272,-404 432.9272,-404 432.9272,-350 432.9272,-350 432.9272,-344 438.9272,-338 444.9272,-338"/>
<text text-anchor="middle" x="472.0878" y="-346.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&#45;i2p/logger.Logger</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M432.4784,-16C432.4784,-16 510.6972,-16 510.6972,-16 516.6972,-16 522.6972,-22 522.6972,-28 522.6972,-28 522.6972,-265 522.6972,-265 522.6972,-271 516.6972,-277 510.6972,-277 510.6972,-277 432.4784,-277 432.4784,-277 426.4784,-277 420.4784,-271 420.4784,-265 420.4784,-265 420.4784,-28 420.4784,-28 420.4784,-22 426.4784,-16 432.4784,-16"/>
<text text-anchor="middle" x="471.5878" y="-24.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.init -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.init</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.init | defined in .:0&#10;at lease.go:59: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M103.6445,-648C103.6445,-648 73.6445,-648 73.6445,-648 67.6445,-648 61.6445,-642 61.6445,-636 61.6445,-636 61.6445,-624 61.6445,-624 61.6445,-618 67.6445,-612 73.6445,-612 73.6445,-612 103.6445,-612 103.6445,-612 109.6445,-612 115.6445,-618 115.6445,-624 115.6445,-624 115.6445,-636 115.6445,-636 115.6445,-642 109.6445,-648 103.6445,-648"/>
<text text-anchor="middle" x="88.6445" y="-625.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M343.5732,-648C343.5732,-648 246.1942,-648 246.1942,-648 240.1942,-648 234.1942,-642 234.1942,-636 234.1942,-636 234.1942,-624 234.1942,-624 234.1942,-618 240.1942,-612 246.1942,-612 246.1942,-612 343.5732,-612 343.5732,-612 349.5732,-612 355.5732,-618 355.5732,-624 355.5732,-624 355.5732,-636 355.5732,-636 355.5732,-642 349.5732,-648 343.5732,-648"/>
<text text-anchor="middle" x="294.8837" y="-634.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="294.8837" y="-617.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge14" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge14"><a xlink:title="at lease.go:59: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M116.0315,-630C143.3741,-630 186.5488,-630 223.628,-630"/>
<polygon fill="#8b4513" stroke="#8b4513" points="223.9065,-633.5001 233.9064,-630 223.9064,-626.5001 223.9065,-633.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes | defined in lease.go:140&#10;at lease.go:146: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at lease.go:146: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at lease.go:153: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID]&#10;at lease.go:154: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time]&#10;at lease.go:141: calling [(*github.com/go&#45;i2p/logger.Logger).WithField]&#10;at lease.go:154: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date]&#10;at lease.go:152: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at lease.go:144: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease]&#10;at lease.go:141: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at lease.go:156: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M149.4338,-370C149.4338,-370 27.8552,-370 27.8552,-370 21.8552,-370 15.8552,-364 15.8552,-358 15.8552,-358 15.8552,-346 15.8552,-346 15.8552,-340 21.8552,-334 27.8552,-334 27.8552,-334 149.4338,-334 149.4338,-334 155.4338,-334 161.4338,-340 161.4338,-346 161.4338,-346 161.4338,-358 161.4338,-358 161.4338,-364 155.4338,-370 149.4338,-370"/>
<text text-anchor="middle" x="88.6445" y="-347.8" font-family="Verdana" font-size="14.00" fill="#000000">NewLeaseFromBytes</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease | defined in lease.go:86&#10;at lease.go:94: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at lease.go:102: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID]&#10;at lease.go:91: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at lease.go:101: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at lease.go:87: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at lease.go:105: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at lease.go:103: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date]&#10;at lease.go:90: calling [github.com/samber/oops.Errorf]&#10;at lease.go:87: calling [(*github.com/go&#45;i2p/logger.Logger).WithField]&#10;at lease.go:103: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M325.7915,-370C325.7915,-370 263.9759,-370 263.9759,-370 257.9759,-370 251.9759,-364 251.9759,-358 251.9759,-358 251.9759,-346 251.9759,-346 251.9759,-340 257.9759,-334 263.9759,-334 263.9759,-334 325.7915,-334 325.7915,-334 331.7915,-334 337.7915,-340 337.7915,-346 337.7915,-346 337.7915,-358 337.7915,-358 337.7915,-364 331.7915,-370 325.7915,-370"/>
<text text-anchor="middle" x="294.8837" y="-347.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadLease</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease -->
<g id="edge16" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease</title>
<g id="a_edge16"><a xlink:title="at lease.go:144: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease]">
<path fill="none" stroke="#000000" d="M161.3567,-352C187.8418,-352 217.2658,-352 241.7376,-352"/>
<polygon fill="#000000" stroke="#000000" points="241.8993,-355.5001 251.8993,-352 241.8992,-348.5001 241.8993,-355.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithField -->
<g id="node7" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithField</title>
<g id="a_node7"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithField | defined in log.go:54">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M499.8623,-208C499.8623,-208 443.3133,-208 443.3133,-208 437.3133,-208 431.3133,-202 431.3133,-196 431.3133,-196 431.3133,-184 431.3133,-184 431.3133,-178 437.3133,-172 443.3133,-172 443.3133,-172 499.8623,-172 499.8623,-172 505.8623,-172 511.8623,-178 511.8623,-184 511.8623,-184 511.8623,-196 511.8623,-196 511.8623,-202 505.8623,-208 499.8623,-208"/>
<text text-anchor="middle" x="471.5878" y="-194.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="471.5878" y="-177.4" font-family="Verdana" font-size="14.00" fill="#000000">WithField</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithField -->
<g id="edge9" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithField</title>
<g id="a_edge9"><a xlink:title="at lease.go:141: calling [(*github.com/go&#45;i2p/logger.Logger).WithField]">
<path fill="none" stroke="#8b4513" d="M100.1767,-333.7646C121.8709,-301.3 172.2078,-234.2444 234.289,-206 294.1148,-178.7817 371.2873,-179.2255 421.1046,-183.4546"/>
<polygon fill="#8b4513" stroke="#8b4513" points="421.0219,-186.962 431.3037,-184.4059 421.672,-179.9923 421.0219,-186.962"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="node8" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_node8"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithFields | defined in log.go:60">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M502.8069,-147C502.8069,-147 440.3687,-147 440.3687,-147 434.3687,-147 428.3687,-141 428.3687,-135 428.3687,-135 428.3687,-123 428.3687,-123 428.3687,-117 434.3687,-111 440.3687,-111 440.3687,-111 502.8069,-111 502.8069,-111 508.8069,-111 514.8069,-117 514.8069,-123 514.8069,-123 514.8069,-135 514.8069,-135 514.8069,-141 508.8069,-147 502.8069,-147"/>
<text text-anchor="middle" x="471.5878" y="-133.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="471.5878" y="-116.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge13" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge13"><a xlink:title="at lease.go:152: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M97.8504,-333.963C117.4971,-297.4537 167.2644,-214.8924 234.289,-175 290.9662,-141.2663 367.4961,-131.6152 418.1376,-129.1911"/>
<polygon fill="#8b4513" stroke="#8b4513" points="418.3687,-132.6848 428.2207,-128.7875 418.0887,-125.6904 418.3687,-132.6848"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="node9" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_node9"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Error | defined in log.go:42">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M489.3541,-269C489.3541,-269 453.8215,-269 453.8215,-269 447.8215,-269 441.8215,-263 441.8215,-257 441.8215,-257 441.8215,-245 441.8215,-245 441.8215,-239 447.8215,-233 453.8215,-233 453.8215,-233 489.3541,-233 489.3541,-233 495.3541,-233 501.3541,-239 501.3541,-245 501.3541,-245 501.3541,-257 501.3541,-257 501.3541,-263 495.3541,-269 489.3541,-269"/>
<text text-anchor="middle" x="471.5878" y="-255.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="471.5878" y="-238.4" font-family="Verdana" font-size="14.00" fill="#000000">Error</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge5" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge5"><a xlink:title="at lease.go:146: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M157.1071,-333.9432C237.1567,-312.8304 366.9508,-278.5977 431.9072,-261.4656"/>
<polygon fill="#8b4513" stroke="#8b4513" points="432.9814,-264.8021 441.7581,-258.8675 431.1961,-258.0335 432.9814,-264.8021"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="node10" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_node10"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithError | defined in log.go:66">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M500.1193,-86C500.1193,-86 443.0563,-86 443.0563,-86 437.0563,-86 431.0563,-80 431.0563,-74 431.0563,-74 431.0563,-62 431.0563,-62 431.0563,-56 437.0563,-50 443.0563,-50 443.0563,-50 500.1193,-50 500.1193,-50 506.1193,-50 512.1193,-56 512.1193,-62 512.1193,-62 512.1193,-74 512.1193,-74 512.1193,-80 506.1193,-86 500.1193,-86"/>
<text text-anchor="middle" x="471.5878" y="-72.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="471.5878" y="-55.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge4"><a xlink:title="at lease.go:146: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M95.218,-333.6831C111.5803,-290.8021 158.3717,-183.4188 234.289,-129 289.9209,-89.1221 369.3726,-75.2752 420.7191,-70.4904"/>
<polygon fill="#8b4513" stroke="#8b4513" points="421.2461,-73.9584 430.9142,-69.625 420.654,-66.9835 421.2461,-73.9584"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Logger).Debug -->
<g id="node11" class="node">
<title>(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_node11"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Debug | defined in logger.go:221">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M490.4098,-408C490.4098,-408 452.7658,-408 452.7658,-408 446.7658,-408 440.7658,-402 440.7658,-396 440.7658,-396 440.7658,-384 440.7658,-384 440.7658,-378 446.7658,-372 452.7658,-372 452.7658,-372 490.4098,-372 490.4098,-372 496.4098,-372 502.4098,-378 502.4098,-384 502.4098,-384 502.4098,-396 502.4098,-396 502.4098,-402 496.4098,-408 490.4098,-408"/>
<text text-anchor="middle" x="471.5878" y="-394.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="471.5878" y="-377.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge21" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge21"><a xlink:title="at lease.go:141: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at lease.go:156: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M160.8141,-370.0472C184.1162,-375.1506 210.1618,-380.1005 234.289,-383 302.768,-391.2296 383.1186,-391.6912 430.5587,-391.0239"/>
<polygon fill="#8b4513" stroke="#8b4513" points="430.7975,-394.5205 440.7384,-390.856 430.682,-387.5215 430.7975,-394.5205"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time -->
<g id="node12" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time</title>
<g id="a_node12"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time | defined in date.go:47">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M486.5878,-494C486.5878,-494 456.5878,-494 456.5878,-494 450.5878,-494 444.5878,-488 444.5878,-482 444.5878,-482 444.5878,-470 444.5878,-470 444.5878,-464 450.5878,-458 456.5878,-458 456.5878,-458 486.5878,-458 486.5878,-458 492.5878,-458 498.5878,-464 498.5878,-470 498.5878,-470 498.5878,-482 498.5878,-482 498.5878,-488 492.5878,-494 486.5878,-494"/>
<text text-anchor="middle" x="471.5878" y="-480.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="471.5878" y="-463.4" font-family="Verdana" font-size="14.00" fill="#000000">Time</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time -->
<g id="edge7" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time</title>
<g id="a_edge7"><a xlink:title="at lease.go:154: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time]">
<path fill="none" stroke="#8b4513" d="M144.3277,-370.0307C223.6462,-395.7146 367.017,-442.1392 434.5303,-464.0005"/>
<polygon fill="#8b4513" stroke="#8b4513" points="433.7171,-467.416 444.309,-467.1669 435.8735,-460.7565 433.7171,-467.416"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID -->
<g id="node14" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID</title>
<g id="a_node14"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID | defined in lease.go:70&#10;at lease.go:73: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M499.014,-580C499.014,-580 444.1616,-580 444.1616,-580 438.1616,-580 432.1616,-574 432.1616,-568 432.1616,-568 432.1616,-556 432.1616,-556 432.1616,-550 438.1616,-544 444.1616,-544 444.1616,-544 499.014,-544 499.014,-544 505.014,-544 511.014,-550 511.014,-556 511.014,-556 511.014,-568 511.014,-568 511.014,-574 505.014,-580 499.014,-580"/>
<text text-anchor="middle" x="471.5878" y="-557.8" font-family="Verdana" font-size="14.00" fill="#000000">TunnelID</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID -->
<g id="edge6" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID</title>
<g id="a_edge6"><a xlink:title="at lease.go:153: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID]">
<path fill="none" stroke="#000000" d="M121.6255,-370.0862C191.1853,-408.2317 352.8181,-496.8686 429.6171,-538.9839"/>
<polygon fill="#000000" stroke="#000000" points="428.0993,-542.1433 438.5504,-543.8828 431.4652,-536.0056 428.0993,-542.1433"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date -->
<g id="node15" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date</title>
<g id="a_node15"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date | defined in lease.go:78">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M486.5878,-641C486.5878,-641 456.5878,-641 456.5878,-641 450.5878,-641 444.5878,-635 444.5878,-629 444.5878,-629 444.5878,-617 444.5878,-617 444.5878,-611 450.5878,-605 456.5878,-605 456.5878,-605 486.5878,-605 486.5878,-605 492.5878,-605 498.5878,-611 498.5878,-617 498.5878,-617 498.5878,-629 498.5878,-629 498.5878,-635 492.5878,-641 486.5878,-641"/>
<text text-anchor="middle" x="471.5878" y="-618.8" font-family="Verdana" font-size="14.00" fill="#000000">Date</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date -->
<g id="edge12" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLeaseFromBytes&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date</title>
<g id="a_edge12"><a xlink:title="at lease.go:154: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date]">
<path fill="none" stroke="#000000" d="M109.2739,-370.2555C136.9708,-394.4689 188.0534,-438.0956 234.289,-472 313.8747,-530.3598 336.5256,-541.1186 420.4784,-593 425.2922,-595.9749 430.3967,-599.0562 435.4447,-602.0609"/>
<polygon fill="#000000" stroke="#000000" points="434.005,-605.2754 444.3953,-607.3472 437.5648,-599.2482 434.005,-605.2754"/>
</a>
</g>
</g>
<!-- github.com/samber/oops.Errorf -->
<g id="node5" class="node">
<title>github.com/samber/oops.Errorf</title>
<g id="a_node5"><a xlink:title="github.com/samber/oops.Errorf | defined in oops.go:34">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M488.7831,-330C488.7831,-330 454.3925,-330 454.3925,-330 448.3925,-330 442.3925,-324 442.3925,-318 442.3925,-318 442.3925,-306 442.3925,-306 442.3925,-300 448.3925,-294 454.3925,-294 454.3925,-294 488.7831,-294 488.7831,-294 494.7831,-294 500.7831,-300 500.7831,-306 500.7831,-306 500.7831,-318 500.7831,-318 500.7831,-324 494.7831,-330 488.7831,-330"/>
<text text-anchor="middle" x="471.5878" y="-316.2" font-family="Verdana" font-size="14.00" fill="#000000">oops</text>
<text text-anchor="middle" x="471.5878" y="-299.4" font-family="Verdana" font-size="14.00" fill="#000000">Errorf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge15" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge15"><a xlink:title="at lease.go:90: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M337.6588,-342.3171C366.587,-335.7687 404.4919,-327.1883 432.5907,-320.8277"/>
<polygon fill="#8b4513" stroke="#8b4513" points="433.4839,-324.2141 442.4644,-318.5926 431.9384,-317.3868 433.4839,-324.2141"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithField -->
<g id="edge17" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithField</title>
<g id="a_edge17"><a xlink:title="at lease.go:87: calling [(*github.com/go&#45;i2p/logger.Logger).WithField]">
<path fill="none" stroke="#8b4513" d="M309.8202,-333.5984C332.1151,-306.8286 376.2323,-256.4766 420.4784,-221 423.5779,-218.5148 426.8932,-216.0797 430.2906,-213.7353"/>
<polygon fill="#8b4513" stroke="#8b4513" points="432.3984,-216.5381 438.8283,-208.1174 428.5506,-210.6905 432.3984,-216.5381"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge8" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge8"><a xlink:title="at lease.go:91: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at lease.go:101: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M308.5198,-333.7011C321.0696,-316.6688 340.023,-290.4563 355.4784,-267 386.0932,-220.5367 381.1197,-199.3318 420.4784,-160 422.9387,-157.5414 425.6308,-155.1952 428.4518,-152.9742"/>
<polygon fill="#8b4513" stroke="#8b4513" points="430.5942,-155.7444 436.6582,-147.0566 426.4999,-150.0666 430.5942,-155.7444"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge1"><a xlink:title="at lease.go:94: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M321.1218,-333.8135C346.0516,-316.9436 384.9088,-291.6981 420.4784,-273 424.2782,-271.0026 428.2988,-269.0357 432.3491,-267.1489"/>
<polygon fill="#8b4513" stroke="#8b4513" points="434.0789,-270.2087 441.7637,-262.9152 431.2079,-263.8245 434.0789,-270.2087"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge10" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge10"><a xlink:title="at lease.go:87: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at lease.go:105: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M337.6588,-361.1987C366.0412,-367.3023 403.0647,-375.2642 430.9898,-381.2695"/>
<polygon fill="#8b4513" stroke="#8b4513" points="430.3212,-384.7056 440.8335,-383.3863 431.7929,-377.8621 430.3212,-384.7056"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time -->
<g id="edge18" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time</title>
<g id="a_edge18"><a xlink:title="at lease.go:103: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Date).Time]">
<path fill="none" stroke="#8b4513" d="M320.578,-370.0307C351.4625,-391.7035 403.3925,-428.1448 437.5774,-452.1336"/>
<polygon fill="#8b4513" stroke="#8b4513" points="435.6664,-455.0683 445.8625,-457.9476 439.6873,-449.3384 435.6664,-455.0683"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID</title>
<g id="a_edge3"><a xlink:title="at lease.go:102: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID]">
<path fill="none" stroke="#000000" d="M308.7434,-370.1622C331.4192,-399.6574 378.1669,-459.5504 420.4784,-508 428.753,-517.475 438.1342,-527.5615 446.5804,-536.421"/>
<polygon fill="#000000" stroke="#000000" points="444.2593,-539.057 453.7108,-543.8445 449.3077,-534.2079 444.2593,-539.057"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date -->
<g id="edge11" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.ReadLease&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date</title>
<g id="a_edge11"><a xlink:title="at lease.go:103: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).Date]">
<path fill="none" stroke="#000000" d="M300.4209,-370.1055C314.376,-413.2656 354.643,-523.762 420.4784,-593 424.8984,-597.6485 430.1968,-601.8121 435.6835,-605.4513"/>
<polygon fill="#000000" stroke="#000000" points="433.9995,-608.5236 444.3614,-610.7327 437.6387,-602.5439 433.9995,-608.5236"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLease -->
<g id="node6" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLease</title>
<g id="a_node6"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLease | defined in lease.go:111&#10;at lease.go:112: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at lease.go:133: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at lease.go:130: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M324.4525,-254C324.4525,-254 265.3149,-254 265.3149,-254 259.3149,-254 253.3149,-248 253.3149,-242 253.3149,-242 253.3149,-230 253.3149,-230 253.3149,-224 259.3149,-218 265.3149,-218 265.3149,-218 324.4525,-218 324.4525,-218 330.4525,-218 336.4525,-224 336.4525,-230 336.4525,-230 336.4525,-242 336.4525,-242 336.4525,-248 330.4525,-254 324.4525,-254"/>
<text text-anchor="middle" x="294.8837" y="-231.8" font-family="Verdana" font-size="14.00" fill="#000000">NewLease</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLease&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge20" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLease&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge20"><a xlink:title="at lease.go:130: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M313.4696,-217.8123C331.9694,-200.5161 361.811,-174.724 391.4784,-158 399.9895,-153.2022 409.4419,-148.9495 418.7832,-145.2801"/>
<polygon fill="#8b4513" stroke="#8b4513" points="420.2944,-148.4518 428.4335,-141.669 417.8411,-141.8957 420.2944,-148.4518"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLease&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge19" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.NewLease&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge19"><a xlink:title="at lease.go:112: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at lease.go:133: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M308.1096,-254.0083C329.2087,-281.6794 372.977,-334.9156 420.4784,-368 423.9564,-370.4224 427.7435,-372.6607 431.6316,-374.7068"/>
<polygon fill="#8b4513" stroke="#8b4513" points="430.262,-377.9321 440.7891,-379.1285 433.3058,-371.6285 430.262,-377.9321"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="node13" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_node13"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int | defined in integer.go:32">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M638.6972,-580C638.6972,-580 608.6972,-580 608.6972,-580 602.6972,-580 596.6972,-574 596.6972,-568 596.6972,-568 596.6972,-556 596.6972,-556 596.6972,-550 602.6972,-544 608.6972,-544 608.6972,-544 638.6972,-544 638.6972,-544 644.6972,-544 650.6972,-550 650.6972,-556 650.6972,-556 650.6972,-568 650.6972,-568 650.6972,-574 644.6972,-580 638.6972,-580"/>
<text text-anchor="middle" x="623.6972" y="-566.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="623.6972" y="-549.4" font-family="Verdana" font-size="14.00" fill="#000000">Int</text>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int -->
<g id="edge2" class="edge">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/lease.Lease).TunnelID&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int</title>
<g id="a_edge2"><a xlink:title="at lease.go:73: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/data.Integer).Int]">
<path fill="none" stroke="#8b4513" d="M511.1557,-562C534.257,-562 563.2443,-562 586.0141,-562"/>
<polygon fill="#8b4513" stroke="#8b4513" points="586.3165,-565.5001 596.3164,-562 586.3164,-558.5001 586.3165,-565.5001"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -2,6 +2,7 @@ package lease
import (
"testing"
"github.com/stretchr/testify/assert"
. "github.com/go-i2p/go-i2p/lib/common/data"
@ -14,7 +15,7 @@ func TestTunnelGateway(t *testing.T) {
var lease_bytes []byte
lease_bytes = append(lease_bytes, expectedTunnelGatewayBytes...)
lease_bytes = append(lease_bytes, make([]byte, LEASE_SIZE - LEASE_TUNNEL_GW_SIZE)...)
lease_bytes = append(lease_bytes, make([]byte, LEASE_SIZE-LEASE_TUNNEL_GW_SIZE)...)
lease := Lease(lease_bytes)
tunnelGateway := lease.TunnelGateway()
@ -29,7 +30,7 @@ func TestTunnelID(t *testing.T) {
var lease_bytes []byte
lease_bytes = append(lease_bytes, make([]byte, LEASE_TUNNEL_GW_SIZE)...)
lease_bytes = append(lease_bytes, expectedTunnelIDBytes...)
lease_bytes = append(lease_bytes, make([]byte, LEASE_SIZE - LEASE_TUNNEL_ID_SIZE - LEASE_TUNNEL_GW_SIZE)...)
lease_bytes = append(lease_bytes, make([]byte, LEASE_SIZE-LEASE_TUNNEL_ID_SIZE-LEASE_TUNNEL_GW_SIZE)...)
lease := Lease(lease_bytes)
tunnelID := lease.TunnelID()
@ -42,7 +43,7 @@ func TestDate(t *testing.T) {
expectedDateBytes := []byte{0x21, 0x37, 0x31, 0x33, 0x16, 0x93, 0x13, 0x28}
var lease_bytes []byte
lease_bytes = append(lease_bytes, make([]byte, LEASE_TUNNEL_GW_SIZE + LEASE_TUNNEL_ID_SIZE)...)
lease_bytes = append(lease_bytes, make([]byte, LEASE_TUNNEL_GW_SIZE+LEASE_TUNNEL_ID_SIZE)...)
lease_bytes = append(lease_bytes, expectedDateBytes...)
lease := Lease(lease_bytes)

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/lease_set"
![lease_set.svg](lease_set.svg)
Package lease_set implements the I2P LeastSet common data structure
## Usage
@ -15,6 +17,12 @@ const (
```
Sizes of various structures in an I2P LeaseSet
#### func ReadDestinationFromLeaseSet
```go
func ReadDestinationFromLeaseSet(data []byte) (destination Destination, remainder []byte, err error)
```
#### type LeaseSet
```go
@ -25,6 +33,18 @@ LeaseSet is the represenation of an I2P LeaseSet.
https://geti2p.net/spec/common-structures#leaseset
#### func NewLeaseSet
```go
func NewLeaseSet(
destination Destination,
encryptionKey crypto.RecievingPublicKey,
signingKey crypto.SigningPublicKey,
leases []Lease,
signingPrivateKey crypto.SigningPrivateKey,
) (LeaseSet, error)
```
#### func (LeaseSet) Destination
```go
@ -32,6 +52,12 @@ func (lease_set LeaseSet) Destination() (destination Destination, err error)
```
Destination returns the Destination as []byte.
#### func (LeaseSet) DestinationDeux
```go
func (lease_set LeaseSet) DestinationDeux() (destination Destination, err error)
```
#### func (LeaseSet) LeaseCount
```go
@ -74,7 +100,7 @@ encountered during parsing.
#### func (LeaseSet) Signature
```go
func (lease_set LeaseSet) Signature() (signature Signature, err error)
func (lease_set LeaseSet) Signature() (signature signature.Signature, err error)
```
Signature returns the signature as Signature. returns errors encountered during
parsing.
@ -93,3 +119,9 @@ errors encountered during parsing.
func (lease_set LeaseSet) Verify() error
```
Verify returns nil
lease_set
github.com/go-i2p/go-i2p/lib/common/lease_set

View File

@ -2,12 +2,12 @@
package lease_set
import (
"errors"
"fmt"
"github.com/go-i2p/go-i2p/lib/common/signature"
"github.com/samber/oops"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/sirupsen/logrus"
. "github.com/go-i2p/go-i2p/lib/common/certificate"
@ -175,7 +175,7 @@ func ReadDestinationFromLeaseSet(data []byte) (destination Destination, remainde
fmt.Printf("Reading Destination from LeaseSet, input_length=%d\n", len(data))
if len(data) < 387 { // Minimum size of Destination (384 keys + 3 bytes for minimum certificate)
err = errors.New("LeaseSet data too short to contain Destination")
err = oops.Errorf("LeaseSet data too short to contain Destination")
fmt.Printf("Error: %v\n", err)
return
}
@ -199,7 +199,7 @@ func ReadDestinationFromLeaseSet(data []byte) (destination Destination, remainde
fmt.Printf(" destinationLength: %d\n", destinationLength)
if len(data) < destinationLength {
err = errors.New("LeaseSet data too short to contain full Destination")
err = oops.Errorf("LeaseSet data too short to contain full Destination")
fmt.Printf("Error: %v\n", err)
return
}
@ -208,7 +208,7 @@ func ReadDestinationFromLeaseSet(data []byte) (destination Destination, remainde
keysAndCert, _, err := ReadKeysAndCert(destinationData)
if err != nil {
fmt.Printf("Failed to read KeysAndCert: %v\n", err) //32 / 0 error
fmt.Printf("Failed to read KeysAndCert: %v\n", err) // 32 / 0 error
return
}
@ -237,7 +237,7 @@ func (lease_set LeaseSet) PublicKey() (public_key crypto.ElgPublicKey, err error
"required_len": LEASE_SET_PUBKEY_SIZE,
"reason": "not enough data",
}).Error("error parsing public key")
err = errors.New("error parsing public key: not enough data")
err = oops.Errorf("error parsing public key: not enough data")
copy(public_key[:], remainder)
return
}
@ -270,7 +270,7 @@ func (lease_set LeaseSet) SigningKey() (signing_public_key crypto.SigningPublicK
"required_len": offset + LEASE_SET_SPK_SIZE,
"reason": "not enough data",
}).Error("error parsing signing public key")
err = errors.New("error parsing signing public key: not enough data")
err = oops.Errorf("error parsing signing public key: not enough data")
return
}
if cert_len == 0 {
@ -328,7 +328,7 @@ func (lease_set LeaseSet) LeaseCount() (count int, err error) {
"required_len": LEASE_SET_PUBKEY_SIZE + LEASE_SET_SPK_SIZE + 1,
"reason": "not enough data",
}).Error("error parsing lease count")
err = errors.New("error parsing lease count: not enough data")
err = oops.Errorf("error parsing lease count: not enough data")
return
}
c := Integer([]byte{remainder[LEASE_SET_PUBKEY_SIZE+LEASE_SET_SPK_SIZE]})
@ -339,7 +339,7 @@ func (lease_set LeaseSet) LeaseCount() (count int, err error) {
"lease_count": count,
"reason": "more than 16 leases",
}).Warn("invalid lease set")
err = errors.New("invalid lease set: more than 16 leases")
err = oops.Errorf("invalid lease set: more than 16 leases")
} else {
log.WithField("lease_count", count).Debug("Retrieved LeaseCount from LeaseSet")
}
@ -372,7 +372,7 @@ func (lease_set LeaseSet) Leases() (leases []Lease, err error) {
"required_len": end,
"reason": "some leases missing",
}).Error("error parsnig lease set")
err = errors.New("error parsing lease set: some leases missing")
err = oops.Errorf("error parsing lease set: some leases missing")
return
}
var lease Lease
@ -422,7 +422,7 @@ func (lease_set LeaseSet) Signature() (signature signature.Signature, err error)
"required_len": end,
"reason": "not enough data",
}).Error("error parsing signatre")
err = errors.New("error parsing signature: not enough data")
err = oops.Errorf("error parsing signature: not enough data")
return
}
signature = []byte(lease_set[start:end])
@ -492,7 +492,7 @@ func (lease_set LeaseSet) OldestExpiration() (earliest Date, err error) {
func NewLeaseSet(
destination Destination,
encryptionKey crypto.PublicKey,
encryptionKey crypto.RecievingPublicKey,
signingKey crypto.SigningPublicKey,
leases []Lease,
signingPrivateKey crypto.SigningPrivateKey,
@ -500,15 +500,15 @@ func NewLeaseSet(
log.Debug("Creating new LeaseSet")
// Validate destination size
if len(destination.KeysAndCert.Bytes()) < 387 {
return nil, errors.New("invalid destination: minimum size is 387 bytes")
return nil, oops.Errorf("invalid destination: minimum size is 387 bytes")
}
// Validate encryption key size
if len(encryptionKey.Bytes()) != LEASE_SET_PUBKEY_SIZE {
return nil, errors.New("invalid encryption key size")
return nil, oops.Errorf("invalid encryption key size")
}
// Validate inputs
if len(leases) > 16 {
return nil, errors.New("invalid lease set: more than 16 leases")
return nil, oops.Errorf("invalid lease set: more than 16 leases")
}
// Validate signing key size matches certificate
cert := destination.Certificate()
@ -520,13 +520,13 @@ func NewLeaseSet(
}
expectedSize := keyCert.SignatureSize()
if len(signingKey.Bytes()) != expectedSize {
return nil, fmt.Errorf("invalid signing key size: got %d, expected %d",
return nil, oops.Errorf("invalid signing key size: got %d, expected %d",
len(signingKey.Bytes()), expectedSize)
}
} else {
// Default DSA size
if len(signingKey.Bytes()) != LEASE_SET_SPK_SIZE {
return nil, errors.New("invalid signing key size")
return nil, oops.Errorf("invalid signing key size")
}
}
// Build LeaseSet data

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 136 KiB

View File

@ -3,14 +3,15 @@ package lease_set
import (
"bytes"
"crypto/rand"
"fmt"
"testing"
"time"
"github.com/go-i2p/go-i2p/lib/common/destination"
"github.com/go-i2p/go-i2p/lib/common/key_certificate"
"github.com/go-i2p/go-i2p/lib/common/router_address"
"github.com/go-i2p/go-i2p/lib/common/router_info"
"github.com/go-i2p/go-i2p/lib/common/signature"
"testing"
"time"
"github.com/samber/oops"
"github.com/go-i2p/go-i2p/lib/common/data"
"github.com/go-i2p/go-i2p/lib/common/keys_and_cert"
@ -23,7 +24,7 @@ import (
"github.com/stretchr/testify/assert"
)
func generateTestRouterInfo(t *testing.T) (*router_info.RouterInfo, crypto.PublicKey, crypto.SigningPublicKey, crypto.SigningPrivateKey, crypto.SigningPrivateKey, error) {
func generateTestRouterInfo(t *testing.T) (*router_info.RouterInfo, crypto.RecievingPublicKey, crypto.SigningPublicKey, crypto.SigningPrivateKey, crypto.SigningPrivateKey, error) {
// Generate signing key pair (Ed25519)
var ed25519_privkey crypto.Ed25519PrivateKey
_, err := (&ed25519_privkey).Generate()
@ -63,7 +64,7 @@ func generateTestRouterInfo(t *testing.T) (*router_info.RouterInfo, crypto.Publi
copy(elg_pubkey[256-len(yBytes):], yBytes)
// Ensure that elg_pubkey implements crypto.PublicKey interface
var _ crypto.PublicKey = elg_pubkey
var _ crypto.RecievingPublicKey = elg_pubkey
// Create KeyCertificate specifying key types
var payload bytes.Buffer
@ -135,13 +136,11 @@ func generateTestRouterInfo(t *testing.T) (*router_info.RouterInfo, crypto.Publi
// Generate signing key pair for the LeaseSet (Ed25519)
var leaseSetSigningPrivKey crypto.Ed25519PrivateKey
_, err = leaseSetSigningPrivKey.Generate()
if err != nil {
t.Fatalf("Failed to generate lease set Ed25519 private key: %v", err)
}
leaseSetSigningPubKeyRaw, err := leaseSetSigningPrivKey.Public()
if err != nil {
t.Fatalf("Failed to derive lease set Ed25519 public key: %v", err)
}
@ -176,7 +175,8 @@ func createTestLease(t *testing.T, index int, routerInfo *router_info.RouterInfo
return testLease, nil
}
func generateTestDestination(t *testing.T) (*destination.Destination, crypto.PublicKey, crypto.SigningPublicKey, crypto.SigningPrivateKey, error) {
func generateTestDestination(t *testing.T) (*destination.Destination, crypto.RecievingPublicKey, crypto.SigningPublicKey, crypto.SigningPrivateKey, error) {
// Generate client signing key pair (Ed25519)
var ed25519_privkey crypto.Ed25519PrivateKey
_, err := (&ed25519_privkey).Generate()
@ -274,7 +274,7 @@ func createTestLeaseSet(t *testing.T, routerInfo *router_info.RouterInfo, leaseC
// Generate test Destination and client keys
dest, encryptionKey, signingKey, signingPrivKey, err := generateTestDestination(t)
if err != nil {
return nil, fmt.Errorf("failed to generate test destination: %v", err)
return nil, oops.Errorf("failed to generate test destination: %v", err)
}
destBytes := dest.KeysAndCert.Bytes()

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/router_address"
![router_address.svg](router_address.svg)
Package router_address implements the I2P RouterAddress common data structure
## Usage
@ -28,6 +30,14 @@ RouterAddress is the represenation of an I2P RouterAddress.
https://geti2p.net/spec/common-structures#routeraddress
#### func NewRouterAddress
```go
func NewRouterAddress(cost uint8, expiration time.Time, transportType string, options map[string]string) (*RouterAddress, error)
```
NewRouterAddress creates a new RouterAddress with the provided parameters.
Returns a pointer to RouterAddress.
#### func ReadRouterAddress
```go
@ -44,6 +54,12 @@ func (router_address RouterAddress) Bytes() []byte
```
Bytes returns the router address as a []byte.
#### func (RouterAddress) CapsString
```go
func (router_address RouterAddress) CapsString() I2PString
```
#### func (RouterAddress) Cost
```go
@ -77,10 +93,17 @@ func (router_address RouterAddress) Host() (net.Addr, error)
func (router_address RouterAddress) HostString() I2PString
```
#### func (*RouterAddress) IPVersion
```go
func (router_address *RouterAddress) IPVersion() string
```
IPVersion returns a string "4" for IPv4 or 6 for IPv6
#### func (RouterAddress) InitializationVector
```go
func (router_address RouterAddress) InitializationVector() ([32]byte, error)
func (router_address RouterAddress) InitializationVector() ([16]byte, error)
```
#### func (RouterAddress) InitializationVectorString
@ -112,7 +135,7 @@ func (router_address RouterAddress) IntroducerTagString(num int) I2PString
```go
func (router_address *RouterAddress) Network() string
```
Network implements net.Addr. It returns the transport type
Network implements net.Addr. It returns the transport type plus 4 or 6
#### func (RouterAddress) Options
@ -177,3 +200,9 @@ I2PString.
```go
func (router_address *RouterAddress) UDP() bool
```
router_address
github.com/go-i2p/go-i2p/lib/common/router_address

View File

@ -3,14 +3,13 @@ package router_address
import (
"encoding/binary"
"errors"
"fmt"
"net"
"strconv"
"strings"
"time"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
. "github.com/go-i2p/go-i2p/lib/common/data"
@ -180,6 +179,16 @@ func (router_address RouterAddress) GetOption(key I2PString) I2PString {
return router_address.Options().Values().Get(key)
}
func (router_address RouterAddress) HasOption(key I2PString) bool {
opt := router_address.GetOption(key)
return opt != nil
}
func (router_address RouterAddress) CheckOption(key string) bool {
keyv, _ := ToI2PString(key)
return router_address.HasOption(keyv)
}
func (router_address RouterAddress) HostString() I2PString {
host, _ := ToI2PString("host")
return router_address.GetOption(host)
@ -251,7 +260,7 @@ func (router_address RouterAddress) Host() (net.Addr, error) {
ip := net.ParseIP(hostBytes)
if ip == nil {
log.Error("Failed to parse IP address")
return nil, fmt.Errorf("null host error")
return nil, oops.Errorf("null host error")
}
// return net.ResolveIPAddr("", ip.String())
addr, err := net.ResolveIPAddr("", ip.String())
@ -285,17 +294,17 @@ func (router_address RouterAddress) Port() (string, error) {
func (router_address RouterAddress) StaticKey() ([32]byte, error) {
sk := router_address.StaticKeyString()
if len([]byte(sk)) != 32 {
return [32]byte{}, fmt.Errorf("error: invalid static key")
return [32]byte{}, oops.Errorf("error: invalid static key")
}
return [32]byte(sk), nil
}
func (router_address RouterAddress) InitializationVector() ([32]byte, error) {
func (router_address RouterAddress) InitializationVector() ([16]byte, error) {
iv := router_address.InitializationVectorString()
if len([]byte(iv)) != 32 {
return [32]byte{}, fmt.Errorf("error: invalid static key")
if len([]byte(iv)) != 16 {
return [16]byte{}, oops.Errorf("error: invalid IV")
}
return [32]byte(iv), nil
return [16]byte(iv), nil
}
func (router_address RouterAddress) ProtocolVersion() (string, error) {
@ -319,7 +328,7 @@ func ReadRouterAddress(data []byte) (router_address RouterAddress, remainder []b
log.WithField("data_length", len(data)).Debug("Reading RouterAddress from data")
if len(data) == 0 {
log.WithField("at", "(RouterAddress) ReadRouterAddress").Error("error parsing RouterAddress: no data")
err = errors.New("error parsing RouterAddress: no data")
err = oops.Errorf("error parsing RouterAddress: no data")
return
}
router_address.TransportCost, remainder, err = NewInteger(data, 1)

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 147 KiB

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/router_identity"
![router_identity.svg](router_identity.svg)
Package router_identity implements the I2P RouterIdentity common data structure
## Usage
@ -18,6 +20,12 @@ RouterIdentity is the represenation of an I2P RouterIdentity.
https://geti2p.net/spec/common-structures#routeridentity
#### func NewRouterIdentity
```go
func NewRouterIdentity(publicKey crypto.RecievingPublicKey, signingPublicKey crypto.SigningPublicKey, cert certificate.Certificate, padding []byte) (*RouterIdentity, error)
```
#### func ReadRouterIdentity
```go
@ -26,3 +34,15 @@ func ReadRouterIdentity(data []byte) (router_identity RouterIdentity, remainder
ReadRouterIdentity returns RouterIdentity from a []byte. The remaining bytes
after the specified length are also returned. Returns a list of errors that
occurred during parsing.
#### func (*RouterIdentity) AsDestination
```go
func (router_identity *RouterIdentity) AsDestination() destination.Destination
```
router_identity
github.com/go-i2p/go-i2p/lib/common/router_identity

View File

@ -7,7 +7,7 @@ import (
"github.com/go-i2p/go-i2p/lib/common/key_certificate"
. "github.com/go-i2p/go-i2p/lib/common/keys_and_cert"
"github.com/go-i2p/go-i2p/lib/crypto"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/sirupsen/logrus"
)
@ -28,13 +28,13 @@ Identical to KeysAndCert.
//
// https://geti2p.net/spec/common-structures#routeridentity
type RouterIdentity struct {
KeysAndCert
*KeysAndCert
}
// ReadRouterIdentity returns RouterIdentity from a []byte.
// The remaining bytes after the specified length are also returned.
// Returns a list of errors that occurred during parsing.
func ReadRouterIdentity(data []byte) (router_identity RouterIdentity, remainder []byte, err error) {
func ReadRouterIdentity(data []byte) (router_identity *RouterIdentity, remainder []byte, err error) {
log.WithFields(logrus.Fields{
"input_length": len(data),
}).Debug("Reading RouterIdentity from data")
@ -43,7 +43,7 @@ func ReadRouterIdentity(data []byte) (router_identity RouterIdentity, remainder
log.WithError(err).Error("Failed to read KeysAndCert for RouterIdentity")
return
}
router_identity = RouterIdentity{
router_identity = &RouterIdentity{
keys_and_cert,
}
log.WithFields(logrus.Fields{
@ -52,7 +52,7 @@ func ReadRouterIdentity(data []byte) (router_identity RouterIdentity, remainder
return
}
func NewRouterIdentity(publicKey crypto.PublicKey, signingPublicKey crypto.SigningPublicKey, cert certificate.Certificate, padding []byte) (*RouterIdentity, error) {
func NewRouterIdentity(publicKey crypto.RecievingPublicKey, signingPublicKey crypto.SigningPublicKey, cert certificate.Certificate, padding []byte) (*RouterIdentity, error) {
log.Debug("Creating new RouterIdentity")
// Step 1: Create keyCertificate from the provided certificate.
@ -72,7 +72,7 @@ func NewRouterIdentity(publicKey crypto.PublicKey, signingPublicKey crypto.Signi
// Step 3: Initialize RouterIdentity with KeysAndCert.
routerIdentity := RouterIdentity{
KeysAndCert: *keysAndCert,
KeysAndCert: keysAndCert,
}
log.WithFields(logrus.Fields{

View File

@ -0,0 +1,295 @@
<?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="435pt" height="714pt"
viewBox="0.00 0.00 435.23 714.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 714)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-714 435.2274,-714 435.2274,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-706 427.2274,-706 427.2274,-8 8,-8"/>
<text text-anchor="middle" x="217.6137" y="-685.8" font-family="Arial" font-size="18.00" fill="#000000">router_identity</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate</title>
<g id="a_clust4"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M247.606,-529C247.606,-529 395.0366,-529 395.0366,-529 401.0366,-529 407.0366,-535 407.0366,-541 407.0366,-541 407.0366,-656 407.0366,-656 407.0366,-662 401.0366,-668 395.0366,-668 395.0366,-668 247.606,-668 247.606,-668 241.606,-668 235.606,-662 235.606,-656 235.606,-656 235.606,-541 235.606,-541 235.606,-535 241.606,-529 247.606,-529"/>
<text text-anchor="middle" x="321.3213" y="-537.5" font-family="Arial" font-size="15.00" fill="#222222">(KeyCertificate)</text>
</a>
</g>
</g>
<g id="clust3" class="cluster">
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
<g id="a_clust3"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M294.6607,-182C294.6607,-182 348.9819,-182 348.9819,-182 354.9819,-182 360.9819,-188 360.9819,-194 360.9819,-194 360.9819,-248 360.9819,-248 360.9819,-254 354.9819,-260 348.9819,-260 348.9819,-260 294.6607,-260 294.6607,-260 288.6607,-260 282.6607,-254 282.6607,-248 282.6607,-248 282.6607,-194 282.6607,-194 282.6607,-188 288.6607,-182 294.6607,-182"/>
<text text-anchor="middle" x="321.8213" 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&#45;i2p/logger.Logger</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M282.2119,-268C282.2119,-268 360.4307,-268 360.4307,-268 366.4307,-268 372.4307,-274 372.4307,-280 372.4307,-280 372.4307,-456 372.4307,-456 372.4307,-462 366.4307,-468 360.4307,-468 360.4307,-468 282.2119,-468 282.2119,-468 276.2119,-468 270.2119,-462 270.2119,-456 270.2119,-456 270.2119,-280 270.2119,-280 270.2119,-274 276.2119,-268 282.2119,-268"/>
<text text-anchor="middle" x="321.3213" y="-276.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity | defined in router_identity.go:55&#10;at router_identity.go:56: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at router_identity.go:82: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at router_identity.go:62: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at router_identity.go:69: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at router_identity.go:80: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType]&#10;at router_identity.go:62: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at router_identity.go:69: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at router_identity.go:60: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate]&#10;at router_identity.go:78: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at router_identity.go:67: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert]&#10;at router_identity.go:79: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M137.2848,-454C137.2848,-454 29.1304,-454 29.1304,-454 23.1304,-454 17.1304,-448 17.1304,-442 17.1304,-442 17.1304,-430 17.1304,-430 17.1304,-424 23.1304,-418 29.1304,-418 29.1304,-418 137.2848,-418 137.2848,-418 143.2848,-418 149.2848,-424 149.2848,-430 149.2848,-430 149.2848,-442 149.2848,-442 149.2848,-448 143.2848,-454 137.2848,-454"/>
<text text-anchor="middle" x="83.2076" y="-431.8" font-family="Verdana" font-size="14.00" fill="#000000">NewRouterIdentity</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate | defined in key_certificate.go:395">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M407.1336,-174C407.1336,-174 235.509,-174 235.509,-174 229.509,-174 223.509,-168 223.509,-162 223.509,-162 223.509,-150 223.509,-150 223.509,-144 229.509,-138 235.509,-138 235.509,-138 407.1336,-138 407.1336,-138 413.1336,-138 419.1336,-144 419.1336,-150 419.1336,-150 419.1336,-162 419.1336,-162 419.1336,-168 413.1336,-174 407.1336,-174"/>
<text text-anchor="middle" x="321.3213" y="-160.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="321.3213" y="-143.4" font-family="Verdana" font-size="14.00" fill="#000000">KeyCertificateFromCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate -->
<g id="edge7" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate</title>
<g id="a_edge7"><a xlink:title="at router_identity.go:60: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate]">
<path fill="none" stroke="#8b4513" d="M91.9127,-417.9931C116.9545,-366.4708 189.176,-219.8907 221.6772,-181.4615"/>
<polygon fill="#8b4513" stroke="#8b4513" points="224.4105,-183.6793 229.0315,-174.1453 219.4736,-178.7167 224.4105,-183.6793"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert | defined in keys_and_cert.go:300">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M373.2245,-521C373.2245,-521 269.4181,-521 269.4181,-521 263.4181,-521 257.4181,-515 257.4181,-509 257.4181,-509 257.4181,-497 257.4181,-497 257.4181,-491 263.4181,-485 269.4181,-485 269.4181,-485 373.2245,-485 373.2245,-485 379.2245,-485 385.2245,-491 385.2245,-497 385.2245,-497 385.2245,-509 385.2245,-509 385.2245,-515 379.2245,-521 373.2245,-521"/>
<text text-anchor="middle" x="321.3213" y="-507.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="321.3213" y="-490.4" font-family="Verdana" font-size="14.00" fill="#000000">NewKeysAndCert</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert -->
<g id="edge11" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert</title>
<g id="a_edge11"><a xlink:title="at router_identity.go:67: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.NewKeysAndCert]">
<path fill="none" stroke="#8b4513" d="M147.3309,-454.0429C178.2892,-462.7539 215.5946,-473.2508 247.7093,-482.2872"/>
<polygon fill="#8b4513" stroke="#8b4513" points="246.9223,-485.7016 257.4965,-485.0411 248.8184,-478.9633 246.9223,-485.7016"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="node8" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_node8"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithError | defined in log.go:66">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M349.8528,-338C349.8528,-338 292.7898,-338 292.7898,-338 286.7898,-338 280.7898,-332 280.7898,-326 280.7898,-326 280.7898,-314 280.7898,-314 280.7898,-308 286.7898,-302 292.7898,-302 292.7898,-302 349.8528,-302 349.8528,-302 355.8528,-302 361.8528,-308 361.8528,-314 361.8528,-314 361.8528,-326 361.8528,-326 361.8528,-332 355.8528,-338 349.8528,-338"/>
<text text-anchor="middle" x="321.3213" y="-324.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="321.3213" y="-307.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge5" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge5"><a xlink:title="at router_identity.go:62: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at router_identity.go:69: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M116.4852,-417.7857C137.1588,-406.2385 164.1369,-390.7472 187.4152,-376 203.8706,-365.5752 205.933,-359.5923 223.4152,-351 238.2475,-343.7101 255.1749,-337.635 270.7356,-332.8508"/>
<polygon fill="#8b4513" stroke="#8b4513" points="272.1325,-336.0875 280.7281,-329.8934 270.146,-329.3753 272.1325,-336.0875"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="node9" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_node9"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Error | defined in log.go:42">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M339.0876,-399C339.0876,-399 303.555,-399 303.555,-399 297.555,-399 291.555,-393 291.555,-387 291.555,-387 291.555,-375 291.555,-375 291.555,-369 297.555,-363 303.555,-363 303.555,-363 339.0876,-363 339.0876,-363 345.0876,-363 351.0876,-369 351.0876,-375 351.0876,-375 351.0876,-387 351.0876,-387 351.0876,-393 345.0876,-399 339.0876,-399"/>
<text text-anchor="middle" x="321.3213" y="-385.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="321.3213" y="-368.4" font-family="Verdana" font-size="14.00" fill="#000000">Error</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge2"><a xlink:title="at router_identity.go:62: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at router_identity.go:69: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M149.5355,-420.6794C191.8686,-410.9012 245.3477,-398.5485 281.2958,-390.2452"/>
<polygon fill="#8b4513" stroke="#8b4513" points="282.4456,-393.5718 291.4014,-387.911 280.8702,-386.7514 282.4456,-393.5718"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="node10" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_node10"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithFields | defined in log.go:60">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M352.5404,-460C352.5404,-460 290.1022,-460 290.1022,-460 284.1022,-460 278.1022,-454 278.1022,-448 278.1022,-448 278.1022,-436 278.1022,-436 278.1022,-430 284.1022,-424 290.1022,-424 290.1022,-424 352.5404,-424 352.5404,-424 358.5404,-424 364.5404,-430 364.5404,-436 364.5404,-436 364.5404,-448 364.5404,-448 364.5404,-454 358.5404,-460 352.5404,-460"/>
<text text-anchor="middle" x="321.3213" y="-446.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="321.3213" y="-429.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge8" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge8"><a xlink:title="at router_identity.go:78: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M149.5355,-437.6713C186.8588,-438.6118 232.846,-439.7706 267.8442,-440.6525"/>
<polygon fill="#8b4513" stroke="#8b4513" points="267.7832,-444.152 277.8683,-440.9051 267.9596,-437.1542 267.7832,-444.152"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Logger).Debug -->
<g id="node11" class="node">
<title>(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_node11"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Debug | defined in logger.go:221">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M340.1433,-252C340.1433,-252 302.4993,-252 302.4993,-252 296.4993,-252 290.4993,-246 290.4993,-240 290.4993,-240 290.4993,-228 290.4993,-228 290.4993,-222 296.4993,-216 302.4993,-216 302.4993,-216 340.1433,-216 340.1433,-216 346.1433,-216 352.1433,-222 352.1433,-228 352.1433,-228 352.1433,-240 352.1433,-240 352.1433,-246 346.1433,-252 340.1433,-252"/>
<text text-anchor="middle" x="321.3213" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="321.3213" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge1"><a xlink:title="at router_identity.go:56: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at router_identity.go:82: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M111.7057,-417.9393C134.7308,-402.1267 166.6206,-377.297 187.4152,-349 212.1952,-315.2796 192.1907,-289.8594 223.4152,-262 239.0699,-248.0324 261.2498,-240.9976 280.5411,-237.4695"/>
<polygon fill="#8b4513" stroke="#8b4513" points="281.2727,-240.8976 290.6079,-235.8872 280.1857,-233.9825 281.2727,-240.8976"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType -->
<g id="node12" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType</title>
<g id="a_node12"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType | defined in key_certificate.go:126">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M365.1882,-660C365.1882,-660 277.4544,-660 277.4544,-660 271.4544,-660 265.4544,-654 265.4544,-648 265.4544,-648 265.4544,-636 265.4544,-636 265.4544,-630 271.4544,-624 277.4544,-624 277.4544,-624 365.1882,-624 365.1882,-624 371.1882,-624 377.1882,-630 377.1882,-636 377.1882,-636 377.1882,-648 377.1882,-648 377.1882,-654 371.1882,-660 365.1882,-660"/>
<text text-anchor="middle" x="321.3213" y="-646.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="321.3213" y="-629.4" font-family="Verdana" font-size="14.00" fill="#000000">PublicKeyType</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType -->
<g id="edge12" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType</title>
<g id="a_edge12"><a xlink:title="at router_identity.go:79: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).PublicKeyType]">
<path fill="none" stroke="#8b4513" d="M92.7203,-454.1885C112.3033,-489.86 160.6058,-569.2395 223.4152,-612 233.1738,-618.6437 244.4576,-623.8592 255.8186,-627.9406"/>
<polygon fill="#8b4513" stroke="#8b4513" points="254.7548,-631.2752 265.3483,-631.1086 256.9631,-624.6326 254.7548,-631.2752"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType -->
<g id="node13" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType</title>
<g id="a_node13"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType | defined in key_certificate.go:117">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M387.2525,-599C387.2525,-599 255.3901,-599 255.3901,-599 249.3901,-599 243.3901,-593 243.3901,-587 243.3901,-587 243.3901,-575 243.3901,-575 243.3901,-569 249.3901,-563 255.3901,-563 255.3901,-563 387.2525,-563 387.2525,-563 393.2525,-563 399.2525,-569 399.2525,-575 399.2525,-575 399.2525,-587 399.2525,-587 399.2525,-593 393.2525,-599 387.2525,-599"/>
<text text-anchor="middle" x="321.3213" y="-585.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="321.3213" y="-568.4" font-family="Verdana" font-size="14.00" fill="#000000">SigningPublicKeyType</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType</title>
<g id="a_edge3"><a xlink:title="at router_identity.go:80: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SigningPublicKeyType]">
<path fill="none" stroke="#8b4513" d="M98.4136,-454.1929C122.1823,-481.3843 170.8877,-532.2799 223.4152,-559 226.7561,-560.6995 230.227,-562.2687 233.7825,-563.7175"/>
<polygon fill="#8b4513" stroke="#8b4513" points="232.7674,-567.0741 243.3602,-567.2784 235.2067,-560.5129 232.7674,-567.0741"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity | defined in router_identity.go:37&#10;at router_identity.go:43: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at router_identity.go:38: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at router_identity.go:49: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at router_identity.go:40: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at router_identity.go:51: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at router_identity.go:41: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert]&#10;at router_identity.go:43: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M138.6234,-279C138.6234,-279 27.7918,-279 27.7918,-279 21.7918,-279 15.7918,-273 15.7918,-267 15.7918,-267 15.7918,-255 15.7918,-255 15.7918,-249 21.7918,-243 27.7918,-243 27.7918,-243 138.6234,-243 138.6234,-243 144.6234,-243 150.6234,-249 150.6234,-255 150.6234,-255 150.6234,-267 150.6234,-267 150.6234,-273 144.6234,-279 138.6234,-279"/>
<text text-anchor="middle" x="83.2076" y="-256.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadRouterIdentity</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert -->
<g id="node5" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert</title>
<g id="a_node5"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert | defined in keys_and_cert.go:142">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M374.0622,-113C374.0622,-113 268.5804,-113 268.5804,-113 262.5804,-113 256.5804,-107 256.5804,-101 256.5804,-101 256.5804,-89 256.5804,-89 256.5804,-83 262.5804,-77 268.5804,-77 268.5804,-77 374.0622,-77 374.0622,-77 380.0622,-77 386.0622,-83 386.0622,-89 386.0622,-89 386.0622,-101 386.0622,-101 386.0622,-107 380.0622,-113 374.0622,-113"/>
<text text-anchor="middle" x="321.3213" y="-99.2" font-family="Verdana" font-size="14.00" fill="#000000">keys_and_cert</text>
<text text-anchor="middle" x="321.3213" y="-82.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadKeysAndCert</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert -->
<g id="edge13" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert</title>
<g id="a_edge13"><a xlink:title="at router_identity.go:41: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/keys_and_cert.ReadKeysAndCert]">
<path fill="none" stroke="#8b4513" d="M97.1813,-242.9816C120.3918,-214.2268 169.6868,-157.9557 223.4152,-126 230.8191,-121.5964 238.9158,-117.7508 247.18,-114.4094"/>
<polygon fill="#8b4513" stroke="#8b4513" points="248.4486,-117.6716 256.5537,-110.8483 245.9626,-111.1279 248.4486,-117.6716"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge14" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge14"><a xlink:title="at router_identity.go:43: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M150.6747,-272.9895C162.9436,-275.4418 175.5953,-278.1511 187.4152,-281 215.2616,-287.7117 245.966,-296.5483 270.9409,-304.1128"/>
<polygon fill="#8b4513" stroke="#8b4513" points="269.9775,-307.4781 280.5637,-307.05 272.0211,-300.783 269.9775,-307.4781"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge4"><a xlink:title="at router_identity.go:43: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M135.3161,-279.0682C152.8203,-286.5087 171.8377,-296.1889 187.4152,-308 207.2762,-323.059 202.6429,-337.2252 223.4152,-351 240.6666,-362.44 262.4792,-369.6796 281.1349,-374.1732"/>
<polygon fill="#8b4513" stroke="#8b4513" points="280.6039,-377.6405 291.1254,-376.3963 282.1244,-370.8077 280.6039,-377.6405"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge9" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge9"><a xlink:title="at router_identity.go:38: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at router_identity.go:49: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M95.2196,-279.2363C117.0066,-310.9004 166.1264,-376.0918 223.4152,-412 236.8839,-420.4421 252.8878,-426.6467 268.0129,-431.147"/>
<polygon fill="#8b4513" stroke="#8b4513" points="267.2179,-434.5586 277.7899,-433.8646 269.0926,-427.8143 267.2179,-434.5586"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge10" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.ReadRouterIdentity&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge10"><a xlink:title="at router_identity.go:40: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at router_identity.go:51: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M150.4867,-253.3711C192.2932,-248.6306 244.6786,-242.6906 280.343,-238.6466"/>
<polygon fill="#8b4513" stroke="#8b4513" points="280.8476,-242.1119 290.3895,-237.5074 280.0588,-235.1565 280.8476,-242.1119"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.init -->
<g id="node6" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.init</title>
<g id="a_node6"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.init | defined in .:0&#10;at router_identity.go:14: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M98.2076,-52C98.2076,-52 68.2076,-52 68.2076,-52 62.2076,-52 56.2076,-46 56.2076,-40 56.2076,-40 56.2076,-28 56.2076,-28 56.2076,-22 62.2076,-16 68.2076,-16 68.2076,-16 98.2076,-16 98.2076,-16 104.2076,-16 110.2076,-22 110.2076,-28 110.2076,-28 110.2076,-40 110.2076,-40 110.2076,-46 104.2076,-52 98.2076,-52"/>
<text text-anchor="middle" x="83.2076" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node7" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node7"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M370.0108,-52C370.0108,-52 272.6318,-52 272.6318,-52 266.6318,-52 260.6318,-46 260.6318,-40 260.6318,-40 260.6318,-28 260.6318,-28 260.6318,-22 266.6318,-16 272.6318,-16 272.6318,-16 370.0108,-16 370.0108,-16 376.0108,-16 382.0108,-22 382.0108,-28 382.0108,-28 382.0108,-40 382.0108,-40 382.0108,-46 376.0108,-52 370.0108,-52"/>
<text text-anchor="middle" x="321.3213" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="321.3213" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge6" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge6"><a xlink:title="at router_identity.go:14: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M110.5223,-34C144.4368,-34 203.5523,-34 250.5669,-34"/>
<polygon fill="#8b4513" stroke="#8b4513" points="250.7058,-37.5001 260.7058,-34 250.7058,-30.5001 250.7058,-37.5001"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -8,18 +8,20 @@ import (
"strings"
"testing"
"time"
"github.com/samber/oops"
)
func consolidateNetDb(sourcePath string, destPath string) error {
// Create destination directory if it doesn't exist
if err := os.MkdirAll(destPath, 0o755); err != nil {
return fmt.Errorf("failed to create destination directory: %v", err)
return oops.Errorf("failed to create destination directory: %v", err)
}
// Walk through all subdirectories
return filepath.Walk(sourcePath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return fmt.Errorf("error accessing path %q: %v", path, err)
return oops.Errorf("error accessing path %q: %v", path, err)
}
// Skip if it's a directory
@ -37,7 +39,7 @@ func consolidateNetDb(sourcePath string, destPath string) error {
// Copy the file
if err := copyFile(srcFile, dstFile); err != nil {
return fmt.Errorf("failed to copy %s: %v", info.Name(), err)
return oops.Errorf("failed to copy %s: %v", info.Name(), err)
}
}
@ -69,7 +71,7 @@ func consolidateAllNetDbs(tempDir string) error {
// Create the temp directory
if err := os.MkdirAll(tempDir, 0o755); err != nil {
return fmt.Errorf("failed to create temp directory: %v", err)
return oops.Errorf("failed to create temp directory: %v", err)
}
// Try to consolidate I2P netDb
@ -91,7 +93,7 @@ func consolidateAllNetDbs(tempDir string) error {
func cleanupTempDir(path string) error {
if err := os.RemoveAll(path); err != nil {
return fmt.Errorf("failed to cleanup temporary directory %s: %v", path, err)
return oops.Errorf("failed to cleanup temporary directory %s: %v", path, err)
}
return nil
}
@ -110,7 +112,7 @@ func createTempNetDbDir() (string, error) {
// Create the directory with appropriate permissions
err := os.MkdirAll(tempDir, 0o755)
if err != nil {
return "", fmt.Errorf("failed to create temporary directory: %v", err)
return "", oops.Errorf("failed to create temporary directory: %v", err)
}
return tempDir, nil
@ -148,10 +150,10 @@ func Test10K(t *testing.T) {
t.Fatalf("Failed to read temp directory: %v", err)
}
for _, file := range files {
for d, file := range files {
if !file.IsDir() && strings.HasPrefix(file.Name(), "routerInfo-") {
// Read the router info file
log.Println("RI LOAD: ", file.Name())
log.Println("RI LOAD: ", d, file.Name())
data, err := os.ReadFile(filepath.Join(tempDir, file.Name()))
if err != nil {
t.Logf("Failed to read file %s: %v", file.Name(), err)

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/router_info"
![router_info.svg](router_info.svg)
Package router_info implements the I2P RouterInfo common data structure
## Usage
@ -28,6 +30,25 @@ RouterInfo is the represenation of an I2P RouterInfo.
https://geti2p.net/spec/common-structures#routerinfo
#### func NewRouterInfo
```go
func NewRouterInfo(
routerIdentity *RouterIdentity,
publishedTime time.Time,
addresses []*RouterAddress,
options map[string]string,
signingPrivateKey crypto.SigningPrivateKey,
sigType int,
) (*RouterInfo, error)
```
#### func OwnedRouterInfo
```go
func OwnedRouterInfo(keyCertificate key_certificate.KeyCertificate) *RouterInfo
```
#### func ReadRouterInfo
```go
@ -37,6 +58,12 @@ ReadRouterInfo returns RouterInfo from a []byte. The remaining bytes after the
specified length are also returned. Returns a list of errors that occurred
during parsing.
#### func (*RouterInfo) AddAddress
```go
func (router_info *RouterInfo) AddAddress(address *RouterAddress)
```
#### func (RouterInfo) Bytes
```go
@ -57,6 +84,13 @@ func (router_info *RouterInfo) IdentHash() Hash
```
IndentHash returns the identity hash (sha256 sum) for this RouterInfo.
#### func (RouterInfo) Network
```go
func (router_info RouterInfo) Network() string
```
Network implements net.Addr
#### func (RouterInfo) Options
```go
@ -137,3 +171,9 @@ func (router_info RouterInfo) String() string
```go
func (router_info *RouterInfo) UnCongested() bool
```
router_info
github.com/go-i2p/go-i2p/lib/common/router_info

View File

@ -0,0 +1,9 @@
package router_info
import "github.com/go-i2p/go-i2p/lib/common/key_certificate"
func OwnedRouterInfo(keyCertificate key_certificate.KeyCertificate) *RouterInfo {
return &RouterInfo{
// ...
}
}

View File

@ -3,17 +3,16 @@ package router_info
import (
"encoding/binary"
"errors"
"fmt"
"strconv"
"strings"
"time"
"github.com/go-i2p/go-i2p/lib/common/certificate"
"github.com/samber/oops"
"github.com/go-i2p/go-i2p/lib/crypto"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/sirupsen/logrus"
. "github.com/go-i2p/go-i2p/lib/common/data"
@ -115,7 +114,7 @@ signature :: Signature
//
// https://geti2p.net/spec/common-structures#routerinfo
type RouterInfo struct {
router_identity RouterIdentity
router_identity *RouterIdentity
published *Date
size *Integer
addresses []*RouterAddress
@ -170,7 +169,7 @@ func (router_info RouterInfo) String() string {
// RouterIdentity returns the router identity as *RouterIdentity.
func (router_info *RouterInfo) RouterIdentity() *RouterIdentity {
return &router_info.router_identity
return router_info.router_identity
}
// IndentHash returns the identity hash (sha256 sum) for this RouterInfo.
@ -224,6 +223,10 @@ func (router_info RouterInfo) Network() string {
return "i2p"
}
func (router_info *RouterInfo) AddAddress(address *RouterAddress) {
router_info.addresses = append(router_info.addresses, address)
}
// ReadRouterInfo returns RouterInfo from a []byte.
// The remaining bytes after the specified length are also returned.
// Returns a list of errors that occurred during parsing.
@ -302,7 +305,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error)
sigType, err := certificate.GetSignatureTypeFromCertificate(cert)
if err != nil {
log.WithError(err).Error("Failed to get signature type from certificate")
return RouterInfo{}, remainder, fmt.Errorf("certificate signature type error: %v", err)
return RouterInfo{}, remainder, oops.Errorf("certificate signature type error: %v", err)
}
// Enhanced signature type validation
@ -311,7 +314,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error)
"sigType": sigType,
"cert": cert,
}).Error("Invalid signature type detected")
return RouterInfo{}, remainder, fmt.Errorf("invalid signature type: %d", sigType)
return RouterInfo{}, remainder, oops.Errorf("invalid signature type: %d", sigType)
}
log.WithFields(logrus.Fields{
@ -325,7 +328,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error)
//"required_len": MAPPING_SIZE,
"reason": "not enough data",
}).Error("error parsing router info")
err = errors.New("error parsing router info: not enough data to read signature")
err = oops.Errorf("error parsing router info: not enough data to read signature")
}
log.WithFields(logrus.Fields{
@ -407,7 +410,7 @@ func NewRouterInfo(
// 5. Assemble RouterInfo without signature
routerInfo := &RouterInfo{
router_identity: *routerIdentity,
router_identity: routerIdentity,
published: &publishedDate,
size: sizeInt,
addresses: addresses,

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 148 KiB

View File

@ -22,11 +22,12 @@ import (
func TestCreateRouterInfo(t *testing.T) {
// Generate signing key pair (Ed25519)
var ed25519_privkey crypto.Ed25519PrivateKey
_, err := (&ed25519_privkey).Generate()
ed25519_signingprivkey, err := ed25519_privkey.Generate()
if err != nil {
t.Fatalf("Failed to generate Ed25519 private key: %v\n", err)
}
ed25519_pubkey_raw, err := ed25519_privkey.Public()
ed25519_pubkey_raw, err := ed25519_signingprivkey.Public()
if err != nil {
t.Fatalf("Failed to derive Ed25519 public key: %v\n", err)
}
@ -59,7 +60,7 @@ func TestCreateRouterInfo(t *testing.T) {
copy(elg_pubkey[256-len(yBytes):], yBytes)
// Ensure that elg_pubkey implements crypto.PublicKey interface
var _ crypto.PublicKey = elg_pubkey
var _ crypto.RecievingPublicKey = elg_pubkey
// Create KeyCertificate specifying key types
var payload bytes.Buffer

View File

@ -3,10 +3,11 @@ package router_info
import (
"bytes"
"crypto/rand"
"github.com/go-i2p/go-i2p/lib/common/keys_and_cert"
"testing"
"time"
"github.com/go-i2p/go-i2p/lib/common/keys_and_cert"
"github.com/go-i2p/go-i2p/lib/common/certificate"
"github.com/go-i2p/go-i2p/lib/common/data"
"github.com/go-i2p/go-i2p/lib/common/key_certificate"
@ -59,7 +60,7 @@ func generateTestRouterInfo(t *testing.T, publishedTime time.Time) (*RouterInfo,
copy(elg_pubkey[256-len(yBytes):], yBytes)
// Ensure that elg_pubkey implements crypto.PublicKey interface
var _ crypto.PublicKey = elg_pubkey
var _ crypto.RecievingPublicKey = elg_pubkey
// Create KeyCertificate specifying key types
var payload bytes.Buffer

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/session_key"
![session_key.svg](session_key.svg)
Package session_key implements the I2P SessionKey common data structure
## Usage
@ -32,3 +34,9 @@ func ReadSessionKey(bytes []byte) (info SessionKey, remainder []byte, err error)
ReadSessionKey returns SessionKey from a []byte. The remaining bytes after the
specified length are also returned. Returns a list of errors that occurred
during parsing.
session_key
github.com/go-i2p/go-i2p/lib/common/session_key

View File

@ -0,0 +1,167 @@
<?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="472pt" height="428pt"
viewBox="0.00 0.00 472.39 428.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 428)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-428 472.3858,-428 472.3858,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-420 464.3858,-420 464.3858,-8 8,-8"/>
<text text-anchor="middle" x="236.1929" y="-399.8" font-family="Arial" font-size="18.00" fill="#000000">session_key</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_*github.com/sirupsen/logrus.Entry</title>
<g id="a_clust2"><a xlink:title="type: *github.com/sirupsen/logrus.Entry">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M238.2974,-243C238.2974,-243 291.6186,-243 291.6186,-243 297.6186,-243 303.6186,-249 303.6186,-255 303.6186,-255 303.6186,-370 303.6186,-370 303.6186,-376 297.6186,-382 291.6186,-382 291.6186,-382 238.2974,-382 238.2974,-382 232.2974,-382 226.2974,-376 226.2974,-370 226.2974,-370 226.2974,-255 226.2974,-255 226.2974,-249 232.2974,-243 238.2974,-243"/>
<text text-anchor="middle" x="264.958" y="-251.5" font-family="Arial" font-size="15.00" fill="#222222">(*Entry)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey | defined in session_key.go:25&#10;at session_key.go:27: calling [github.com/sirupsen/logrus.Warn]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M312.3221,-52C312.3221,-52 217.5939,-52 217.5939,-52 211.5939,-52 205.5939,-46 205.5939,-40 205.5939,-40 205.5939,-28 205.5939,-28 205.5939,-22 211.5939,-16 217.5939,-16 217.5939,-16 312.3221,-16 312.3221,-16 318.3221,-16 324.3221,-22 324.3221,-28 324.3221,-28 324.3221,-40 324.3221,-40 324.3221,-46 318.3221,-52 312.3221,-52"/>
<text text-anchor="middle" x="264.958" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadSessionKey</text>
</a>
</g>
</g>
<!-- github.com/sirupsen/logrus.Warn -->
<g id="node2" class="node">
<title>github.com/sirupsen/logrus.Warn</title>
<g id="a_node2"><a xlink:title="github.com/sirupsen/logrus.Warn | defined in exported.go:113">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M444.3837,-52C444.3837,-52 409.3921,-52 409.3921,-52 403.3921,-52 397.3921,-46 397.3921,-40 397.3921,-40 397.3921,-28 397.3921,-28 397.3921,-22 403.3921,-16 409.3921,-16 409.3921,-16 444.3837,-16 444.3837,-16 450.3837,-16 456.3837,-22 456.3837,-28 456.3837,-28 456.3837,-40 456.3837,-40 456.3837,-46 450.3837,-52 444.3837,-52"/>
<text text-anchor="middle" x="426.8879" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="426.8879" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">Warn</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey&#45;&gt;github.com/sirupsen/logrus.Warn -->
<g id="edge7" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey&#45;&gt;github.com/sirupsen/logrus.Warn</title>
<g id="a_edge7"><a xlink:title="at session_key.go:27: calling [github.com/sirupsen/logrus.Warn]">
<path fill="none" stroke="#8b4513" d="M324.3352,-34C345.2029,-34 368.1346,-34 387.0117,-34"/>
<polygon fill="#8b4513" stroke="#8b4513" points="387.0431,-37.5001 397.043,-34 387.043,-30.5001 387.0431,-37.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey | defined in session_key.go:33&#10;at session_key.go:34: calling [github.com/sirupsen/logrus.WithField]&#10;at session_key.go:34: calling [(*github.com/sirupsen/logrus.Entry).Debug]&#10;at session_key.go:35: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey]&#10;at session_key.go:37: calling [github.com/sirupsen/logrus.WithError]&#10;at session_key.go:37: calling [(*github.com/sirupsen/logrus.Entry).Error]&#10;at session_key.go:41: calling [github.com/sirupsen/logrus.Debug]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M120.29,-204C120.29,-204 28.236,-204 28.236,-204 22.236,-204 16.236,-198 16.236,-192 16.236,-192 16.236,-180 16.236,-180 16.236,-174 22.236,-168 28.236,-168 28.236,-168 120.29,-168 120.29,-168 126.29,-168 132.29,-174 132.29,-180 132.29,-180 132.29,-192 132.29,-192 132.29,-198 126.29,-204 120.29,-204"/>
<text text-anchor="middle" x="74.263" y="-181.8" font-family="Verdana" font-size="14.00" fill="#000000">NewSessionKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey</title>
<g id="a_edge3"><a xlink:title="at session_key.go:35: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.ReadSessionKey]">
<path fill="none" stroke="#000000" d="M90.8252,-167.9829C114.5635,-142.8336 160.3942,-96.7292 205.526,-65 209.4263,-62.258 213.6003,-59.5997 217.8606,-57.0685"/>
<polygon fill="#000000" stroke="#000000" points="219.7007,-60.0485 226.6664,-52.0653 216.2427,-53.9622 219.7007,-60.0485"/>
</a>
</g>
</g>
<!-- github.com/sirupsen/logrus.WithField -->
<g id="node4" class="node">
<title>github.com/sirupsen/logrus.WithField</title>
<g id="a_node4"><a xlink:title="github.com/sirupsen/logrus.WithField | defined in exported.go:69">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M293.2325,-113C293.2325,-113 236.6835,-113 236.6835,-113 230.6835,-113 224.6835,-107 224.6835,-101 224.6835,-101 224.6835,-89 224.6835,-89 224.6835,-83 230.6835,-77 236.6835,-77 236.6835,-77 293.2325,-77 293.2325,-77 299.2325,-77 305.2325,-83 305.2325,-89 305.2325,-89 305.2325,-101 305.2325,-101 305.2325,-107 299.2325,-113 293.2325,-113"/>
<text text-anchor="middle" x="264.958" y="-99.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="264.958" y="-82.4" font-family="Verdana" font-size="14.00" fill="#000000">WithField</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;github.com/sirupsen/logrus.WithField -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;github.com/sirupsen/logrus.WithField</title>
<g id="a_edge1"><a xlink:title="at session_key.go:34: calling [github.com/sirupsen/logrus.WithField]">
<path fill="none" stroke="#8b4513" d="M112.3947,-167.8035C142.7648,-153.3108 185.4246,-132.9535 217.9151,-117.449"/>
<polygon fill="#8b4513" stroke="#8b4513" points="219.7002,-120.4753 227.2178,-113.0097 216.6854,-114.1577 219.7002,-120.4753"/>
</a>
</g>
</g>
<!-- github.com/sirupsen/logrus.WithError -->
<g id="node5" class="node">
<title>github.com/sirupsen/logrus.WithError</title>
<g id="a_node5"><a xlink:title="github.com/sirupsen/logrus.WithError | defined in exported.go:55">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M293.4895,-174C293.4895,-174 236.4265,-174 236.4265,-174 230.4265,-174 224.4265,-168 224.4265,-162 224.4265,-162 224.4265,-150 224.4265,-150 224.4265,-144 230.4265,-138 236.4265,-138 236.4265,-138 293.4895,-138 293.4895,-138 299.4895,-138 305.4895,-144 305.4895,-150 305.4895,-150 305.4895,-162 305.4895,-162 305.4895,-168 299.4895,-174 293.4895,-174"/>
<text text-anchor="middle" x="264.958" y="-160.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="264.958" y="-143.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;github.com/sirupsen/logrus.WithError -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;github.com/sirupsen/logrus.WithError</title>
<g id="a_edge4"><a xlink:title="at session_key.go:37: calling [github.com/sirupsen/logrus.WithError]">
<path fill="none" stroke="#8b4513" d="M132.514,-176.836C158.6025,-172.7318 189.0807,-167.937 214.2186,-163.9823"/>
<polygon fill="#8b4513" stroke="#8b4513" points="214.9448,-167.4112 224.2794,-162.3995 213.8569,-160.4962 214.9448,-167.4112"/>
</a>
</g>
</g>
<!-- github.com/sirupsen/logrus.Debug -->
<g id="node6" class="node">
<title>github.com/sirupsen/logrus.Debug</title>
<g id="a_node6"><a xlink:title="github.com/sirupsen/logrus.Debug | defined in exported.go:98">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M283.78,-235C283.78,-235 246.136,-235 246.136,-235 240.136,-235 234.136,-229 234.136,-223 234.136,-223 234.136,-211 234.136,-211 234.136,-205 240.136,-199 246.136,-199 246.136,-199 283.78,-199 283.78,-199 289.78,-199 295.78,-205 295.78,-211 295.78,-211 295.78,-223 295.78,-223 295.78,-229 289.78,-235 283.78,-235"/>
<text text-anchor="middle" x="264.958" y="-221.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="264.958" y="-204.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;github.com/sirupsen/logrus.Debug -->
<g id="edge6" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;github.com/sirupsen/logrus.Debug</title>
<g id="a_edge6"><a xlink:title="at session_key.go:41: calling [github.com/sirupsen/logrus.Debug]">
<path fill="none" stroke="#8b4513" d="M132.514,-195.4695C162.1028,-200.2795 197.3383,-206.0075 224.025,-210.3458"/>
<polygon fill="#8b4513" stroke="#8b4513" points="223.7352,-213.8446 234.1673,-211.9946 224.8585,-206.9353 223.7352,-213.8446"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Entry).Debug -->
<g id="node7" class="node">
<title>(*github.com/sirupsen/logrus.Entry).Debug</title>
<g id="a_node7"><a xlink:title="(*github.com/sirupsen/logrus.Entry).Debug | defined in entry.go:312">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M283.78,-313C283.78,-313 246.136,-313 246.136,-313 240.136,-313 234.136,-307 234.136,-301 234.136,-301 234.136,-289 234.136,-289 234.136,-283 240.136,-277 246.136,-277 246.136,-277 283.78,-277 283.78,-277 289.78,-277 295.78,-283 295.78,-289 295.78,-289 295.78,-301 295.78,-301 295.78,-307 289.78,-313 283.78,-313"/>
<text text-anchor="middle" x="264.958" y="-299.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="264.958" y="-282.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;(*github.com/sirupsen/logrus.Entry).Debug -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;(*github.com/sirupsen/logrus.Entry).Debug</title>
<g id="a_edge2"><a xlink:title="at session_key.go:34: calling [(*github.com/sirupsen/logrus.Entry).Debug]">
<path fill="none" stroke="#8b4513" d="M97.9151,-204.1135C123.4419,-223.0678 165.7928,-252.8208 205.526,-273 211.5896,-276.0795 218.19,-278.9545 224.7143,-281.5442"/>
<polygon fill="#8b4513" stroke="#8b4513" points="223.5564,-284.8483 234.1476,-285.1249 226.0405,-278.3039 223.5564,-284.8483"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Entry).Error -->
<g id="node8" class="node">
<title>(*github.com/sirupsen/logrus.Entry).Error</title>
<g id="a_node8"><a xlink:title="(*github.com/sirupsen/logrus.Entry).Error | defined in entry.go:332">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M282.4538,-374C282.4538,-374 247.4622,-374 247.4622,-374 241.4622,-374 235.4622,-368 235.4622,-362 235.4622,-362 235.4622,-350 235.4622,-350 235.4622,-344 241.4622,-338 247.4622,-338 247.4622,-338 282.4538,-338 282.4538,-338 288.4538,-338 294.4538,-344 294.4538,-350 294.4538,-350 294.4538,-362 294.4538,-362 294.4538,-368 288.4538,-374 282.4538,-374"/>
<text text-anchor="middle" x="264.958" y="-360.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="264.958" y="-343.4" font-family="Verdana" font-size="14.00" fill="#000000">Error</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;(*github.com/sirupsen/logrus.Entry).Error -->
<g id="edge5" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_key.NewSessionKey&#45;&gt;(*github.com/sirupsen/logrus.Entry).Error</title>
<g id="a_edge5"><a xlink:title="at session_key.go:37: calling [(*github.com/sirupsen/logrus.Entry).Error]">
<path fill="none" stroke="#8b4513" d="M87.925,-204.2759C110.108,-233.0122 156.4463,-289.2647 205.526,-326 211.902,-330.7723 219.1515,-335.1491 226.3422,-338.9974"/>
<polygon fill="#8b4513" stroke="#8b4513" points="224.849,-342.1646 235.349,-343.5794 228.023,-335.9256 224.849,-342.1646"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -2,6 +2,8 @@
--
import "github.com/go-i2p/go-i2p/lib/common/session_tag"
![session_tag.svg](session_tag.svg)
Package session_tag implements the I2P SessionTag common data structure
## Usage
@ -32,3 +34,9 @@ func ReadSessionTag(bytes []byte) (info SessionTag, remainder []byte, err error)
ReadSessionTag returns SessionTag from a []byte. The remaining bytes after the
specified length are also returned. Returns a list of errors that occurred
during parsing.
session_tag
github.com/go-i2p/go-i2p/lib/common/session_tag

View File

@ -2,7 +2,7 @@
package session_tag
import (
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/sirupsen/logrus"
)

View File

@ -0,0 +1,203 @@
<?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="508pt" height="384pt"
viewBox="0.00 0.00 508.38 384.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 384)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-384 508.3802,-384 508.3802,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-376 500.3802,-376 500.3802,-8 8,-8"/>
<text text-anchor="middle" x="254.1901" y="-355.8" font-family="Arial" font-size="18.00" fill="#000000">session_tag</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
<g id="a_clust3"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M237.9061,-207C237.9061,-207 292.2273,-207 292.2273,-207 298.2273,-207 304.2273,-213 304.2273,-219 304.2273,-219 304.2273,-273 304.2273,-273 304.2273,-279 298.2273,-285 292.2273,-285 292.2273,-285 237.9061,-285 237.9061,-285 231.9061,-285 225.9061,-279 225.9061,-273 225.9061,-273 225.9061,-219 225.9061,-219 225.9061,-213 231.9061,-207 237.9061,-207"/>
<text text-anchor="middle" x="265.0667" y="-215.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&#45;i2p/logger.Logger</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M402.1614,-16C402.1614,-16 480.3802,-16 480.3802,-16 486.3802,-16 492.3802,-22 492.3802,-28 492.3802,-28 492.3802,-326 492.3802,-326 492.3802,-332 486.3802,-338 480.3802,-338 480.3802,-338 402.1614,-338 402.1614,-338 396.1614,-338 390.1614,-332 390.1614,-326 390.1614,-326 390.1614,-28 390.1614,-28 390.1614,-22 396.1614,-16 402.1614,-16"/>
<text text-anchor="middle" x="441.2708" y="-24.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.init -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.init</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.init | defined in .:0&#10;at session_tag.go:9: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M88.486,-338C88.486,-338 58.486,-338 58.486,-338 52.486,-338 46.486,-332 46.486,-326 46.486,-326 46.486,-314 46.486,-314 46.486,-308 52.486,-302 58.486,-302 58.486,-302 88.486,-302 88.486,-302 94.486,-302 100.486,-308 100.486,-314 100.486,-314 100.486,-326 100.486,-326 100.486,-332 94.486,-338 88.486,-338"/>
<text text-anchor="middle" x="73.486" y="-315.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M313.2562,-338C313.2562,-338 215.8772,-338 215.8772,-338 209.8772,-338 203.8772,-332 203.8772,-326 203.8772,-326 203.8772,-314 203.8772,-314 203.8772,-308 209.8772,-302 215.8772,-302 215.8772,-302 313.2562,-302 313.2562,-302 319.2562,-302 325.2562,-308 325.2562,-314 325.2562,-314 325.2562,-326 325.2562,-326 325.2562,-332 319.2562,-338 313.2562,-338"/>
<text text-anchor="middle" x="264.5667" y="-324.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="264.5667" y="-307.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge2"><a xlink:title="at session_tag.go:9: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M100.8632,-320C124.9805,-320 161.1891,-320 193.4256,-320"/>
<polygon fill="#8b4513" stroke="#8b4513" points="193.7322,-323.5001 203.7321,-320 193.7321,-316.5001 193.7322,-323.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag | defined in session_tag.go:30&#10;at session_tag.go:32: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M311.3771,-89C311.3771,-89 217.7563,-89 217.7563,-89 211.7563,-89 205.7563,-83 205.7563,-77 205.7563,-77 205.7563,-65 205.7563,-65 205.7563,-59 211.7563,-53 217.7563,-53 217.7563,-53 311.3771,-53 311.3771,-53 317.3771,-53 323.3771,-59 323.3771,-65 323.3771,-65 323.3771,-77 323.3771,-77 323.3771,-83 317.3771,-89 311.3771,-89"/>
<text text-anchor="middle" x="264.5667" y="-66.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadSessionTag</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="node5" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_node5"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Warn | defined in log.go:30">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M459.0371,-86C459.0371,-86 423.5045,-86 423.5045,-86 417.5045,-86 411.5045,-80 411.5045,-74 411.5045,-74 411.5045,-62 411.5045,-62 411.5045,-56 417.5045,-50 423.5045,-50 423.5045,-50 459.0371,-50 459.0371,-50 465.0371,-50 471.0371,-56 471.0371,-62 471.0371,-62 471.0371,-74 471.0371,-74 471.0371,-80 465.0371,-86 459.0371,-86"/>
<text text-anchor="middle" x="441.2708" y="-72.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="441.2708" y="-55.4" font-family="Verdana" font-size="14.00" fill="#000000">Warn</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warn</title>
<g id="a_edge3"><a xlink:title="at session_tag.go:32: calling [(*github.com/go&#45;i2p/logger.Logger).Warn]">
<path fill="none" stroke="#8b4513" d="M323.4066,-70.001C349.0032,-69.5665 378.3334,-69.0685 401.332,-68.6781"/>
<polygon fill="#8b4513" stroke="#8b4513" points="401.4781,-72.1762 411.4172,-68.5068 401.3592,-65.1772 401.4781,-72.1762"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag | defined in session_tag.go:38&#10;at session_tag.go:46: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at session_tag.go:39: calling [(*github.com/go&#45;i2p/logger.Logger).WithField]&#10;at session_tag.go:39: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at session_tag.go:48: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at session_tag.go:40: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag]&#10;at session_tag.go:42: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at session_tag.go:42: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M118.958,-175C118.958,-175 28.014,-175 28.014,-175 22.014,-175 16.014,-169 16.014,-163 16.014,-163 16.014,-151 16.014,-151 16.014,-145 22.014,-139 28.014,-139 28.014,-139 118.958,-139 118.958,-139 124.958,-139 130.958,-145 130.958,-151 130.958,-151 130.958,-163 130.958,-163 130.958,-169 124.958,-175 118.958,-175"/>
<text text-anchor="middle" x="73.486" y="-152.8" font-family="Verdana" font-size="14.00" fill="#000000">NewSessionTag</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag -->
<g id="edge6" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag</title>
<g id="a_edge6"><a xlink:title="at session_tag.go:40: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.ReadSessionTag]">
<path fill="none" stroke="#000000" d="M107.7754,-138.8764C125.3106,-129.8351 147.0943,-118.9486 166.972,-110 179.9588,-104.1535 194.099,-98.2467 207.4821,-92.8597"/>
<polygon fill="#000000" stroke="#000000" points="209.074,-95.9929 217.0659,-89.0373 206.4808,-89.491 209.074,-95.9929"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithField -->
<g id="node6" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithField</title>
<g id="a_node6"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithField | defined in log.go:54">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M469.5453,-147C469.5453,-147 412.9963,-147 412.9963,-147 406.9963,-147 400.9963,-141 400.9963,-135 400.9963,-135 400.9963,-123 400.9963,-123 400.9963,-117 406.9963,-111 412.9963,-111 412.9963,-111 469.5453,-111 469.5453,-111 475.5453,-111 481.5453,-117 481.5453,-123 481.5453,-123 481.5453,-135 481.5453,-135 481.5453,-141 475.5453,-147 469.5453,-147"/>
<text text-anchor="middle" x="441.2708" y="-133.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="441.2708" y="-116.4" font-family="Verdana" font-size="14.00" fill="#000000">WithField</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithField -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithField</title>
<g id="a_edge4"><a xlink:title="at session_tag.go:39: calling [(*github.com/go&#45;i2p/logger.Logger).WithField]">
<path fill="none" stroke="#8b4513" d="M131.0584,-142.9712C142.8716,-140.5766 155.2725,-138.4102 166.972,-137 244.5117,-127.6536 335.2259,-126.9969 390.4445,-127.7334"/>
<polygon fill="#8b4513" stroke="#8b4513" points="390.6126,-131.2363 400.6655,-127.8912 390.7207,-124.2372 390.6126,-131.2363"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="node7" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_node7"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithError | defined in log.go:66">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M469.8023,-208C469.8023,-208 412.7393,-208 412.7393,-208 406.7393,-208 400.7393,-202 400.7393,-196 400.7393,-196 400.7393,-184 400.7393,-184 400.7393,-178 406.7393,-172 412.7393,-172 412.7393,-172 469.8023,-172 469.8023,-172 475.8023,-172 481.8023,-178 481.8023,-184 481.8023,-184 481.8023,-196 481.8023,-196 481.8023,-202 475.8023,-208 469.8023,-208"/>
<text text-anchor="middle" x="441.2708" y="-194.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="441.2708" y="-177.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge7" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge7"><a xlink:title="at session_tag.go:42: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M131.2039,-153.4715C189.8248,-151.0372 282.9951,-150.338 362.1614,-164 371.5718,-165.624 381.3929,-168.1409 390.7862,-170.9819"/>
<polygon fill="#8b4513" stroke="#8b4513" points="389.7944,-174.3392 400.3849,-174.0359 391.9168,-167.6687 389.7944,-174.3392"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="node8" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_node8"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Error | defined in log.go:42">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M459.0371,-269C459.0371,-269 423.5045,-269 423.5045,-269 417.5045,-269 411.5045,-263 411.5045,-257 411.5045,-257 411.5045,-245 411.5045,-245 411.5045,-239 417.5045,-233 423.5045,-233 423.5045,-233 459.0371,-233 459.0371,-233 465.0371,-233 471.0371,-239 471.0371,-245 471.0371,-245 471.0371,-257 471.0371,-257 471.0371,-263 465.0371,-269 459.0371,-269"/>
<text text-anchor="middle" x="441.2708" y="-255.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="441.2708" y="-238.4" font-family="Verdana" font-size="14.00" fill="#000000">Error</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge8" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge8"><a xlink:title="at session_tag.go:42: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M130.9975,-159.1129C203.3633,-162.5668 322.9335,-171.1449 362.1614,-191 378.4342,-199.2364 375.9262,-209.5982 390.1614,-221 394.1252,-224.1748 398.4605,-227.2407 402.8767,-230.1215"/>
<polygon fill="#8b4513" stroke="#8b4513" points="401.0515,-233.108 411.3925,-235.4135 404.7463,-227.1625 401.0515,-233.108"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="node9" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_node9"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithFields | defined in log.go:60">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M472.4899,-330C472.4899,-330 410.0517,-330 410.0517,-330 404.0517,-330 398.0517,-324 398.0517,-318 398.0517,-318 398.0517,-306 398.0517,-306 398.0517,-300 404.0517,-294 410.0517,-294 410.0517,-294 472.4899,-294 472.4899,-294 478.4899,-294 484.4899,-300 484.4899,-306 484.4899,-306 484.4899,-318 484.4899,-318 484.4899,-324 478.4899,-330 472.4899,-330"/>
<text text-anchor="middle" x="441.2708" y="-316.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="441.2708" y="-299.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge1"><a xlink:title="at session_tag.go:46: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M131.2291,-166.525C202.9067,-178.5 316.8096,-198.0892 325.1614,-203 364.3561,-226.0464 355.5781,-252.4814 390.1614,-282 392.6656,-284.1375 395.3424,-286.2094 398.1094,-288.1986"/>
<polygon fill="#8b4513" stroke="#8b4513" points="396.3464,-291.2306 406.599,-293.9015 400.2497,-285.4199 396.3464,-291.2306"/>
</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="M283.3887,-277C283.3887,-277 245.7447,-277 245.7447,-277 239.7447,-277 233.7447,-271 233.7447,-265 233.7447,-265 233.7447,-253 233.7447,-253 233.7447,-247 239.7447,-241 245.7447,-241 245.7447,-241 283.3887,-241 283.3887,-241 289.3887,-241 295.3887,-247 295.3887,-253 295.3887,-253 295.3887,-265 295.3887,-265 295.3887,-271 289.3887,-277 283.3887,-277"/>
<text text-anchor="middle" x="264.5667" y="-263.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="264.5667" y="-246.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge5" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/session_tag.NewSessionTag&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge5"><a xlink:title="at session_tag.go:39: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at session_tag.go:48: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M99.5846,-175.1809C125.3107,-192.5699 166.1513,-218.7711 203.972,-237 210.3393,-240.0689 217.2529,-242.9626 224.0558,-245.5807"/>
<polygon fill="#8b4513" stroke="#8b4513" points="223.2736,-249.0231 233.8669,-249.2077 225.7009,-242.4573 223.2736,-249.0231"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,80 @@
# signature
--
import "github.com/go-i2p/go-i2p/lib/common/signature"
![signature.svg](signature.svg)
Package signature implements the I2P Signature common data structure
## Usage
```go
const (
DSA_SHA1_SIZE = 40
ECDSA_SHA256_P256_SIZE = 64
ECDSA_SHA384_P384_SIZE = 96
ECDSA_SHA512_P512_SIZE = 132
RSA_SHA256_2048_SIZE = 256
RSA_SHA384_3072_SIZE = 384
RSA_SHA512_4096_SIZE = 512
EdDSA_SHA512_Ed25519_SIZE = 64
EdDSA_SHA512_Ed25519ph_SIZE = 64
RedDSA_SHA512_Ed25519_SIZE = 64
)
```
Lengths of signature keys
```go
const (
SIGNATURE_TYPE_DSA_SHA1 = 0
SIGNATURE_TYPE_ECDSA_SHA256_P256 = 1
SIGNATURE_TYPE_ECDSA_SHA384_P384 = 2
SIGNATURE_TYPE_ECDSA_SHA512_P521 = 3
SIGNATURE_TYPE_RSA_SHA256_2048 = 4
SIGNATURE_TYPE_RSA_SHA384_3072 = 5
SIGNATURE_TYPE_RSA_SHA512_4096 = 6
SIGNATURE_TYPE_EDDSA_SHA512_ED25519 = 7
SIGNATURE_TYPE_EDDSA_SHA512_ED25519PH = 8
SIGNATURE_TYPE_REDDSA_SHA512_ED25519 = 11
)
```
#### type Signature
```go
type Signature []byte
```
Signature is the represenation of an I2P Signature.
https://geti2p.net/spec/common-structures#signature
#### func NewSignature
```go
func NewSignature(data []byte, sigType int) (signature *Signature, remainder []byte, err error)
```
NewSignature creates a new *Signature from []byte using ReadSignature. Returns a
pointer to Signature unlike ReadSignature.
#### func ReadSignature
```go
func ReadSignature(data []byte, sigType int) (sig Signature, remainder []byte, err error)
```
ReadSignature returns a Signature from a []byte. The remaining bytes after the
specified length are also returned. Returns an error if there is insufficient
data to read the signature.
Since the signature type and length are inferred from context (the type of key
used), and are not explicitly stated, this function assumes the default
signature type (DSA_SHA1) with a length of 40 bytes.
If a different signature type is expected based on context, this function should
be modified accordingly to handle the correct signature length.
signature
github.com/go-i2p/go-i2p/lib/common/signature

View File

@ -1,50 +0,0 @@
# signature
--
import "github.com/go-i2p/go-i2p/lib/common/signature"
Package signature implements the I2P Signature common data structure
## Usage
```go
const (
DSA_SHA1_SIZE = 40
ECDSA_SHA256_P256_SIZE = 64
ECDSA_SHA384_P384_SIZE = 96
ECDSA_SHA512_P512_SIZE = 132
RSA_SHA256_2048_SIZE = 256
RSA_SHA384_3072_SIZE = 384
RSA_SHA512_4096_SIZE = 512
EdDSA_SHA512_Ed25519_SIZE = 64
EdDSA_SHA512_Ed25519ph_SIZE = 64
RedDSA_SHA512_Ed25519_SIZE = 64
)
```
Lengths of signature keys
#### type Signature
```go
type Signature []byte
```
Signature is the represenation of an I2P Signature.
https://geti2p.net/spec/common-structures#signature
#### func NewSignature
```go
func NewSignature(data []byte) (session_tag *Signature, remainder []byte, err error)
```
NewSignature creates a new *Signature from []byte using ReadSignature. Returns a
pointer to Signature unlike ReadSignature.
#### func ReadSignature
```go
func ReadSignature(bytes []byte) (info Signature, remainder []byte, err error)
```
ReadSignature returns Signature from a []byte. The remaining bytes after the
specified length are also returned. Returns a list of errors that occurred
during parsing.

View File

@ -2,9 +2,8 @@
package signature
import (
"fmt"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
)
@ -88,12 +87,12 @@ func ReadSignature(data []byte, sigType int) (sig Signature, remainder []byte, e
case SIGNATURE_TYPE_REDDSA_SHA512_ED25519:
sigLength = RedDSA_SHA512_Ed25519_SIZE
default:
err = fmt.Errorf("unsupported signature type: %d", sigType)
err = oops.Errorf("unsupported signature type: %d", sigType)
return
}
if len(data) < sigLength {
err = fmt.Errorf("insufficient data to read signature: need %d bytes, have %d", sigLength, len(data))
err = oops.Errorf("insufficient data to read signature: need %d bytes, have %d", sigLength, len(data))
log.WithError(err).Error("Failed to read Signature")
return
}

View File

@ -0,0 +1,221 @@
<?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="497pt" height="367pt"
viewBox="0.00 0.00 497.49 367.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 367)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-367 497.4896,-367 497.4896,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-359 489.4896,-359 489.4896,-8 8,-8"/>
<text text-anchor="middle" x="248.7448" y="-338.8" font-family="Arial" font-size="18.00" fill="#000000">signature</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
<g id="a_clust3"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M227.0155,-190C227.0155,-190 281.3367,-190 281.3367,-190 287.3367,-190 293.3367,-196 293.3367,-202 293.3367,-202 293.3367,-256 293.3367,-256 293.3367,-262 287.3367,-268 281.3367,-268 281.3367,-268 227.0155,-268 227.0155,-268 221.0155,-268 215.0155,-262 215.0155,-256 215.0155,-256 215.0155,-202 215.0155,-202 215.0155,-196 221.0155,-190 227.0155,-190"/>
<text text-anchor="middle" x="254.1761" y="-198.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&#45;i2p/logger.Logger</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M391.2708,-60C391.2708,-60 469.4896,-60 469.4896,-60 475.4896,-60 481.4896,-66 481.4896,-72 481.4896,-72 481.4896,-309 481.4896,-309 481.4896,-315 475.4896,-321 469.4896,-321 469.4896,-321 391.2708,-321 391.2708,-321 385.2708,-321 379.2708,-315 379.2708,-309 379.2708,-309 379.2708,-72 379.2708,-72 379.2708,-66 385.2708,-60 391.2708,-60"/>
<text text-anchor="middle" x="430.3802" y="-68.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.init -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.init</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.init | defined in .:0&#10;at signature.go:10: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M83.0407,-321C83.0407,-321 53.0407,-321 53.0407,-321 47.0407,-321 41.0407,-315 41.0407,-309 41.0407,-309 41.0407,-297 41.0407,-297 41.0407,-291 47.0407,-285 53.0407,-285 53.0407,-285 83.0407,-285 83.0407,-285 89.0407,-285 95.0407,-291 95.0407,-297 95.0407,-297 95.0407,-309 95.0407,-309 95.0407,-315 89.0407,-321 83.0407,-321"/>
<text text-anchor="middle" x="68.0407" y="-298.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M302.3656,-321C302.3656,-321 204.9866,-321 204.9866,-321 198.9866,-321 192.9866,-315 192.9866,-309 192.9866,-309 192.9866,-297 192.9866,-297 192.9866,-291 198.9866,-285 204.9866,-285 204.9866,-285 302.3656,-285 302.3656,-285 308.3656,-285 314.3656,-291 314.3656,-297 314.3656,-297 314.3656,-309 314.3656,-309 314.3656,-315 308.3656,-321 302.3656,-321"/>
<text text-anchor="middle" x="253.6761" y="-307.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="253.6761" y="-290.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge7" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge7"><a xlink:title="at signature.go:10: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M95.4318,-303C118.3566,-303 152.1155,-303 182.5704,-303"/>
<polygon fill="#8b4513" stroke="#8b4513" points="182.7516,-306.5001 192.7515,-303 182.7515,-299.5001 182.7516,-306.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature | defined in signature.go:106&#10;at signature.go:107: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at signature.go:117: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at signature.go:110: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at signature.go:110: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at signature.go:114: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]&#10;at signature.go:107: calling [(*github.com/go&#45;i2p/logger.Logger).WithField]&#10;at signature.go:108: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M108.1221,-158C108.1221,-158 27.9593,-158 27.9593,-158 21.9593,-158 15.9593,-152 15.9593,-146 15.9593,-146 15.9593,-134 15.9593,-134 15.9593,-128 21.9593,-122 27.9593,-122 27.9593,-122 108.1221,-122 108.1221,-122 114.1221,-122 120.1221,-128 120.1221,-134 120.1221,-134 120.1221,-146 120.1221,-146 120.1221,-152 114.1221,-158 108.1221,-158"/>
<text text-anchor="middle" x="68.0407" y="-135.8" font-family="Verdana" font-size="14.00" fill="#000000">NewSignature</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature | defined in signature.go:66&#10;at signature.go:96: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]&#10;at signature.go:96: calling [(*github.com/go&#45;i2p/logger.Logger).Error]&#10;at signature.go:90: calling [github.com/samber/oops.Errorf]&#10;at signature.go:95: calling [github.com/samber/oops.Errorf]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M295.0963,-69C295.0963,-69 212.2559,-69 212.2559,-69 206.2559,-69 200.2559,-63 200.2559,-57 200.2559,-57 200.2559,-45 200.2559,-45 200.2559,-39 206.2559,-33 212.2559,-33 212.2559,-33 295.0963,-33 295.0963,-33 301.0963,-33 307.0963,-39 307.0963,-45 307.0963,-45 307.0963,-57 307.0963,-57 307.0963,-63 301.0963,-69 295.0963,-69"/>
<text text-anchor="middle" x="253.6761" y="-46.8" font-family="Verdana" font-size="14.00" fill="#000000">ReadSignature</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature -->
<g id="edge10" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature</title>
<g id="a_edge10"><a xlink:title="at signature.go:108: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature]">
<path fill="none" stroke="#000000" d="M100.3187,-121.9311C116.8289,-112.9038 137.3448,-102.0133 156.0814,-93 170.2625,-86.1781 185.8305,-79.2387 200.2859,-73.0176"/>
<polygon fill="#000000" stroke="#000000" points="201.7762,-76.1871 209.5989,-69.0417 199.0277,-69.7492 201.7762,-76.1871"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithField -->
<g id="node6" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithField</title>
<g id="a_node6"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithField | defined in log.go:54">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M458.6547,-313C458.6547,-313 402.1057,-313 402.1057,-313 396.1057,-313 390.1057,-307 390.1057,-301 390.1057,-301 390.1057,-289 390.1057,-289 390.1057,-283 396.1057,-277 402.1057,-277 402.1057,-277 458.6547,-277 458.6547,-277 464.6547,-277 470.6547,-283 470.6547,-289 470.6547,-289 470.6547,-301 470.6547,-301 470.6547,-307 464.6547,-313 458.6547,-313"/>
<text text-anchor="middle" x="430.3802" y="-299.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="430.3802" y="-282.4" font-family="Verdana" font-size="14.00" fill="#000000">WithField</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithField -->
<g id="edge8" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithField</title>
<g id="a_edge8"><a xlink:title="at signature.go:107: calling [(*github.com/go&#45;i2p/logger.Logger).WithField]">
<path fill="none" stroke="#8b4513" d="M120.3668,-148.8384C190.1516,-160.7623 305.9394,-181.0792 314.2708,-186 353.4204,-209.1229 344.6875,-235.4814 379.2708,-265 381.775,-267.1375 384.4518,-269.2094 387.2188,-271.1986"/>
<polygon fill="#8b4513" stroke="#8b4513" points="385.4558,-274.2306 395.7084,-276.9015 389.3591,-268.4199 385.4558,-274.2306"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="node7" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_node7"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithError | defined in log.go:66">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M458.9117,-130C458.9117,-130 401.8487,-130 401.8487,-130 395.8487,-130 389.8487,-124 389.8487,-118 389.8487,-118 389.8487,-106 389.8487,-106 389.8487,-100 395.8487,-94 401.8487,-94 401.8487,-94 458.9117,-94 458.9117,-94 464.9117,-94 470.9117,-100 470.9117,-106 470.9117,-106 470.9117,-118 470.9117,-118 470.9117,-124 464.9117,-130 458.9117,-130"/>
<text text-anchor="middle" x="430.3802" y="-116.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="430.3802" y="-99.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge4"><a xlink:title="at signature.go:110: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M120.3499,-126.3642C132.0338,-123.81 144.4193,-121.4804 156.0814,-120 233.5606,-110.1646 324.2917,-109.6452 379.5304,-110.5437"/>
<polygon fill="#8b4513" stroke="#8b4513" points="379.6922,-114.0472 389.7553,-110.7329 379.8218,-107.0484 379.6922,-114.0472"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="node8" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_node8"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Error | defined in log.go:42">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M448.1465,-191C448.1465,-191 412.6139,-191 412.6139,-191 406.6139,-191 400.6139,-185 400.6139,-179 400.6139,-179 400.6139,-167 400.6139,-167 400.6139,-161 406.6139,-155 412.6139,-155 412.6139,-155 448.1465,-155 448.1465,-155 454.1465,-155 460.1465,-161 460.1465,-167 460.1465,-167 460.1465,-179 460.1465,-179 460.1465,-185 454.1465,-191 448.1465,-191"/>
<text text-anchor="middle" x="430.3802" y="-177.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="430.3802" y="-160.4" font-family="Verdana" font-size="14.00" fill="#000000">Error</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge5" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge5"><a xlink:title="at signature.go:110: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M120.1671,-136.7629C177.3282,-134.2601 271.5401,-133.2214 351.2708,-147 364.4226,-149.2728 378.3769,-153.2877 390.8445,-157.4926"/>
<polygon fill="#8b4513" stroke="#8b4513" points="389.886,-160.8654 400.4808,-160.8759 392.205,-154.2607 389.886,-160.8654"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="node9" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_node9"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).WithFields | defined in log.go:60">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M461.5993,-252C461.5993,-252 399.1611,-252 399.1611,-252 393.1611,-252 387.1611,-246 387.1611,-240 387.1611,-240 387.1611,-228 387.1611,-228 387.1611,-222 393.1611,-216 399.1611,-216 399.1611,-216 461.5993,-216 461.5993,-216 467.5993,-216 473.5993,-222 473.5993,-228 473.5993,-228 473.5993,-240 473.5993,-240 473.5993,-246 467.5993,-252 461.5993,-252"/>
<text text-anchor="middle" x="430.3802" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="430.3802" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields -->
<g id="edge6" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithFields</title>
<g id="a_edge6"><a xlink:title="at signature.go:114: calling [(*github.com/go&#45;i2p/logger.Logger).WithFields]">
<path fill="none" stroke="#8b4513" d="M120.2493,-142.0043C190.7307,-145.4303 312.0216,-154.0791 351.2708,-174 367.5344,-182.2546 365.0356,-192.5982 379.2708,-204 382.0037,-206.1889 384.9131,-208.326 387.9039,-210.3864"/>
<polygon fill="#8b4513" stroke="#8b4513" points="386.1803,-213.4407 396.469,-215.9692 390.0027,-207.5765 386.1803,-213.4407"/>
</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="M272.4981,-260C272.4981,-260 234.8541,-260 234.8541,-260 228.8541,-260 222.8541,-254 222.8541,-248 222.8541,-248 222.8541,-236 222.8541,-236 222.8541,-230 228.8541,-224 234.8541,-224 234.8541,-224 272.4981,-224 272.4981,-224 278.4981,-224 284.4981,-230 284.4981,-236 284.4981,-236 284.4981,-248 284.4981,-248 284.4981,-254 278.4981,-260 272.4981,-260"/>
<text text-anchor="middle" x="253.6761" y="-246.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="253.6761" y="-229.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.NewSignature&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debug</title>
<g id="a_edge1"><a xlink:title="at signature.go:107: calling [(*github.com/sirupsen/logrus.Logger).Debug]&#10;at signature.go:117: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
<path fill="none" stroke="#8b4513" d="M92.9329,-158.2683C117.4985,-175.7221 156.5722,-201.9699 193.0814,-220 199.419,-223.1298 206.3176,-226.0544 213.1146,-228.6844"/>
<polygon fill="#8b4513" stroke="#8b4513" points="212.33,-232.1261 222.9231,-232.3166 214.7609,-225.5617 212.33,-232.1261"/>
</a>
</g>
</g>
<!-- github.com/samber/oops.Errorf -->
<g id="node5" class="node">
<title>github.com/samber/oops.Errorf</title>
<g id="a_node5"><a xlink:title="github.com/samber/oops.Errorf | defined in oops.go:34">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M447.5755,-52C447.5755,-52 413.1849,-52 413.1849,-52 407.1849,-52 401.1849,-46 401.1849,-40 401.1849,-40 401.1849,-28 401.1849,-28 401.1849,-22 407.1849,-16 413.1849,-16 413.1849,-16 447.5755,-16 447.5755,-16 453.5755,-16 459.5755,-22 459.5755,-28 459.5755,-28 459.5755,-40 459.5755,-40 459.5755,-46 453.5755,-52 447.5755,-52"/>
<text text-anchor="middle" x="430.3802" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">oops</text>
<text text-anchor="middle" x="430.3802" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">Errorf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge9" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge9"><a xlink:title="at signature.go:90: calling [github.com/samber/oops.Errorf]&#10;at signature.go:95: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M307.0076,-43.7814C321.0603,-42.042 336.2212,-40.3099 350.2708,-39 363.518,-37.7649 378.0268,-36.7556 391.0136,-35.9755"/>
<polygon fill="#8b4513" stroke="#8b4513" points="391.2664,-39.4668 401.0492,-35.399 390.8649,-32.4783 391.2664,-39.4668"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).WithError</title>
<g id="a_edge2"><a xlink:title="at signature.go:96: calling [(*github.com/go&#45;i2p/logger.Logger).WithError]">
<path fill="none" stroke="#8b4513" d="M306.8913,-53.7663C321.7462,-55.9635 337.5623,-59.7036 351.2708,-66 366.1652,-72.8411 365.3628,-81.3277 379.2708,-90 379.7831,-90.3195 380.3009,-90.6364 380.8236,-90.9509"/>
<polygon fill="#8b4513" stroke="#8b4513" points="379.1809,-94.0419 389.6271,-95.8101 382.5636,-87.9135 379.1809,-94.0419"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/signature.ReadSignature&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Error</title>
<g id="a_edge3"><a xlink:title="at signature.go:96: calling [(*github.com/go&#45;i2p/logger.Logger).Error]">
<path fill="none" stroke="#8b4513" d="M280.561,-69.2323C300.376,-82.8562 327.8411,-102.1316 351.2708,-120 364.0764,-129.766 366.0636,-133.7844 379.2708,-143 383.2286,-145.7617 387.452,-148.5185 391.7106,-151.1795"/>
<polygon fill="#8b4513" stroke="#8b4513" points="390.0647,-154.2749 400.4279,-156.4779 393.7004,-148.2931 390.0647,-154.2749"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -6,11 +6,10 @@ import (
"github.com/stretchr/testify/assert"
)
func TestReadSignatureErrors(t *testing.T) {
assert := assert.New(t)
data := []byte{0xbe,0xef}
data := []byte{0xbe, 0xef}
unsupportedSigType := 1000
_, _, err := ReadSignature(data, unsupportedSigType)
assert.NotNil(err, "unsupported signature error should be reported")
@ -41,7 +40,7 @@ func TestReadSignature(t *testing.T) {
dataLen := 1024
data := []byte{}
for i := 0; i < dataLen; i++ {
data = append(data, byte(i % 10))
data = append(data, byte(i%10))
}
for i, sigType := range sigTypes {
@ -55,7 +54,7 @@ func TestReadSignature(t *testing.T) {
func TestNewSignatureError(t *testing.T) {
assert := assert.New(t)
data := []byte{0xbe,0xef}
data := []byte{0xbe, 0xef}
unsupportedSigType := 1000
_, _, err := NewSignature(data, unsupportedSigType)
assert.NotNil(err, "NewSignature error should be reported")
@ -67,8 +66,8 @@ func TestNewSignature(t *testing.T) {
data := []byte{}
sigLength := EdDSA_SHA512_Ed25519_SIZE
remLength := 20
for i := 0; i < sigLength + remLength; i++ {
data = append(data, byte(i % 10))
for i := 0; i < sigLength+remLength; i++ {
data = append(data, byte(i%10))
}
sigType := SIGNATURE_TYPE_EDDSA_SHA512_ED25519

View File

@ -2,9 +2,22 @@
--
import "github.com/go-i2p/go-i2p/lib/config"
![config.svg](config.svg)
## Usage
```go
const GOI2P_BASE_DIR = ".go-i2p"
```
```go
var (
CfgFile string
)
```
```go
var DefaultBootstrapConfig = BootstrapConfig{
LowPeerThreshold: 10,
@ -25,6 +38,18 @@ default settings for netdb
var RouterConfigProperties = DefaultRouterConfig()
```
#### func InitConfig
```go
func InitConfig()
```
#### func UpdateRouterConfig
```go
func UpdateRouterConfig()
```
#### type BootstrapConfig
```go
@ -83,3 +108,9 @@ router.config options
```go
func DefaultRouterConfig() *RouterConfig
```
config
github.com/go-i2p/go-i2p/lib/config

View File

@ -4,9 +4,9 @@ import (
"os"
"path/filepath"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/go-i2p/lib/util"
"github.com/go-i2p/logger"
"github.com/spf13/viper"
"gopkg.in/yaml.v3"
)
var (
@ -17,48 +17,13 @@ var (
const GOI2P_BASE_DIR = ".go-i2p"
func InitConfig() {
defaultConfigDir := filepath.Join(os.Getenv("HOME"), GOI2P_BASE_DIR)
defaultConfigFile := filepath.Join(defaultConfigDir, "config.yaml")
if CfgFile != "" {
// Use config file from the flag
viper.SetConfigFile(CfgFile)
} else {
// Create default config if it doesn't exist
if _, err := os.Stat(defaultConfigFile); os.IsNotExist(err) {
// Ensure directory exists
if err := os.MkdirAll(defaultConfigDir, 0o755); err != nil {
log.Fatalf("Could not create config directory: %s", err)
}
// Create default configuration
defaultConfig := struct {
BaseDir string `yaml:"base_dir"`
WorkingDir string `yaml:"working_dir"`
NetDB NetDbConfig `yaml:"netdb"`
Bootstrap BootstrapConfig `yaml:"bootstrap"`
}{
BaseDir: DefaultRouterConfig().BaseDir,
WorkingDir: DefaultRouterConfig().WorkingDir,
NetDB: *DefaultRouterConfig().NetDb,
Bootstrap: *DefaultRouterConfig().Bootstrap,
}
yamlData, err := yaml.Marshal(defaultConfig)
if err != nil {
log.Fatalf("Could not marshal default config: %s", err)
}
// Write default config file
if err := os.WriteFile(defaultConfigFile, yamlData, 0o644); err != nil {
log.Fatalf("Could not write default config file: %s", err)
}
log.Debugf("Created default configuration at: %s", defaultConfigFile)
}
// Set up viper to use the config file
viper.AddConfigPath(defaultConfigDir)
// Set up viper to use the default config path $HOME/.go-ip/
viper.AddConfigPath(BuildI2PDirPath())
viper.SetConfigName("config")
viper.SetConfigType("yaml")
}
@ -66,11 +31,8 @@ func InitConfig() {
// Load defaults
setDefaults()
if err := viper.ReadInConfig(); err != nil {
log.Warnf("Error reading config file: %s", err)
} else {
log.Debugf("Using config file: %s", viper.ConfigFileUsed())
}
// handle config file creating it if needed
handleConfigFile()
// Update RouterConfigProperties
UpdateRouterConfig()
@ -111,3 +73,41 @@ func UpdateRouterConfig() {
ReseedServers: reseedServers,
}
}
func createDefaultConfig(defaultConfigDir string) {
defaultConfigFile := filepath.Join(defaultConfigDir, "config.yaml")
// Ensure directory exists
if err := os.MkdirAll(defaultConfigDir, 0o755); err != nil {
log.Fatalf("Could not create config directory: %s", err)
}
// Write current config file
if err := viper.WriteConfig(); err != nil {
log.Fatalf("Could not write default config file: %s", err)
}
log.Debugf("Created default configuration at: %s", defaultConfigFile)
}
func handleConfigFile() {
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
if CfgFile != "" {
log.Fatalf("Config file %s is not found: %s", CfgFile, err)
} else {
createDefaultConfig(BuildI2PDirPath())
}
} else {
log.Fatalf("Error reading config file: %s", err)
}
} else {
log.Debugf("Using config file: %s", viper.ConfigFileUsed())
}
}
func BuildI2PDirPath() string {
return filepath.Join(util.UserHome(), GOI2P_BASE_DIR)
}

481
lib/config/config.svg Normal file
View File

@ -0,0 +1,481 @@
<?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="673pt" height="848pt"
viewBox="0.00 0.00 672.82 848.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 848)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-848 672.8192,-848 672.8192,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-840 664.8192,-840 664.8192,-8 8,-8"/>
<text text-anchor="middle" x="336.4096" y="-819.8" font-family="Arial" font-size="18.00" fill="#000000">config</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
<g id="a_clust3"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M213.047,-663C213.047,-663 271.0288,-663 271.0288,-663 277.0288,-663 283.0288,-669 283.0288,-675 283.0288,-675 283.0288,-790 283.0288,-790 283.0288,-796 277.0288,-802 271.0288,-802 271.0288,-802 213.047,-802 213.047,-802 207.047,-802 201.047,-796 201.047,-790 201.047,-790 201.047,-675 201.047,-675 201.047,-669 207.047,-663 213.047,-663"/>
<text text-anchor="middle" x="242.0379" y="-671.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&#45;i2p/logger.Logger</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/logger.Logger">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M430.3472,-602C430.3472,-602 484.113,-602 484.113,-602 490.113,-602 496.113,-608 496.113,-614 496.113,-614 496.113,-668 496.113,-668 496.113,-674 490.113,-680 484.113,-680 484.113,-680 430.3472,-680 430.3472,-680 424.3472,-680 418.3472,-674 418.3472,-668 418.3472,-668 418.3472,-614 418.3472,-614 418.3472,-608 424.3472,-602 430.3472,-602"/>
<text text-anchor="middle" x="457.2301" y="-610.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig | defined in config.go:19&#10;at config.go:72: calling [github.com/spf13/viper.ConfigFileUsed]&#10;at config.go:62: calling [github.com/spf13/viper.SetConfigName]&#10;at config.go:70: calling [(*github.com/go&#45;i2p/logger.Logger).Warnf]&#10;at config.go:61: calling [github.com/spf13/viper.AddConfigPath]&#10;at config.go:63: calling [github.com/spf13/viper.SetConfigType]&#10;at config.go:41: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:42: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:43: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:44: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:76: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig]&#10;at config.go:25: calling [github.com/spf13/viper.SetConfigFile]&#10;at config.go:69: calling [github.com/spf13/viper.ReadInConfig]&#10;at config.go:31: calling [(*github.com/sirupsen/logrus.Logger).Fatalf]&#10;at config.go:49: calling [(*github.com/sirupsen/logrus.Logger).Fatalf]&#10;at config.go:54: calling [(*github.com/sirupsen/logrus.Logger).Fatalf]&#10;at config.go:67: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults]&#10;at config.go:47: calling [gopkg.in/yaml.v3.Marshal]&#10;at config.go:57: calling [(*github.com/sirupsen/logrus.Logger).Debugf]&#10;at config.go:72: calling [(*github.com/sirupsen/logrus.Logger).Debugf]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M86.4951,-445C86.4951,-445 27.8345,-445 27.8345,-445 21.8345,-445 15.8345,-439 15.8345,-433 15.8345,-433 15.8345,-421 15.8345,-421 15.8345,-415 21.8345,-409 27.8345,-409 27.8345,-409 86.4951,-409 86.4951,-409 92.4951,-409 98.4951,-415 98.4951,-421 98.4951,-421 98.4951,-433 98.4951,-433 98.4951,-439 92.4951,-445 86.4951,-445"/>
<text text-anchor="middle" x="57.1648" y="-422.8" font-family="Verdana" font-size="14.00" fill="#000000">InitConfig</text>
</a>
</g>
</g>
<!-- github.com/spf13/viper.SetConfigFile -->
<g id="node2" class="node">
<title>github.com/spf13/viper.SetConfigFile</title>
<g id="a_node2"><a xlink:title="github.com/spf13/viper.SetConfigFile | defined in viper.go:509">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M281.0929,-113C281.0929,-113 202.9829,-113 202.9829,-113 196.9829,-113 190.9829,-107 190.9829,-101 190.9829,-101 190.9829,-89 190.9829,-89 190.9829,-83 196.9829,-77 202.9829,-77 202.9829,-77 281.0929,-77 281.0929,-77 287.0929,-77 293.0929,-83 293.0929,-89 293.0929,-89 293.0929,-101 293.0929,-101 293.0929,-107 287.0929,-113 281.0929,-113"/>
<text text-anchor="middle" x="242.0379" y="-99.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="242.0379" y="-82.4" font-family="Verdana" font-size="14.00" fill="#000000">SetConfigFile</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.SetConfigFile -->
<g id="edge17" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.SetConfigFile</title>
<g id="a_edge17"><a xlink:title="at config.go:25: calling [github.com/spf13/viper.SetConfigFile]">
<path fill="none" stroke="#8b4513" d="M59.6612,-408.7336C67.8983,-350.9377 95.897,-173.4308 134.3296,-132 146.5817,-118.7921 163.757,-110.299 180.7987,-104.8377"/>
<polygon fill="#8b4513" stroke="#8b4513" points="182.1403,-108.0935 190.779,-101.9597 180.2007,-101.3675 182.1403,-108.0935"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults | defined in config.go:79&#10;at config.go:81: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:82: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:85: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:88: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:89: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:81: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:82: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M273.5099,-201C273.5099,-201 210.5659,-201 210.5659,-201 204.5659,-201 198.5659,-195 198.5659,-189 198.5659,-189 198.5659,-177 198.5659,-177 198.5659,-171 204.5659,-165 210.5659,-165 210.5659,-165 273.5099,-165 273.5099,-165 279.5099,-165 285.5099,-171 285.5099,-177 285.5099,-177 285.5099,-189 285.5099,-189 285.5099,-195 279.5099,-201 273.5099,-201"/>
<text text-anchor="middle" x="242.0379" y="-178.8" font-family="Verdana" font-size="14.00" fill="#000000">setDefaults</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults -->
<g id="edge22" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults</title>
<g id="a_edge22"><a xlink:title="at config.go:67: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults]">
<path fill="none" stroke="#000000" d="M62.41,-408.7554C74.8624,-368.4311 109.8568,-270.808 171.3296,-214 176.6761,-209.0592 182.9367,-204.8195 189.4828,-201.2058"/>
<polygon fill="#000000" stroke="#000000" points="191.1647,-204.2777 198.5273,-196.6591 188.0206,-198.0235 191.1647,-204.2777"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig | defined in router.go:44">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M516.6979,-235C516.6979,-235 397.7623,-235 397.7623,-235 391.7623,-235 385.7623,-229 385.7623,-223 385.7623,-223 385.7623,-211 385.7623,-211 385.7623,-205 391.7623,-199 397.7623,-199 397.7623,-199 516.6979,-199 516.6979,-199 522.6979,-199 528.6979,-205 528.6979,-211 528.6979,-211 528.6979,-223 528.6979,-223 528.6979,-229 522.6979,-235 516.6979,-235"/>
<text text-anchor="middle" x="457.2301" y="-212.8" font-family="Verdana" font-size="14.00" fill="#000000">DefaultRouterConfig</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig -->
<g id="edge12" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig</title>
<g id="a_edge12"><a xlink:title="at config.go:41: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:42: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:43: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:44: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]">
<path fill="none" stroke="#000000" d="M58.2342,-408.7257C62.3308,-357.5636 81.7139,-212.7442 171.3296,-153 251.6114,-99.4785 297.5124,-147.955 385.7462,-187 391.5616,-189.5734 397.6655,-192.2189 403.7533,-194.8221"/>
<polygon fill="#000000" stroke="#000000" points="402.6903,-198.1732 413.2628,-198.8617 405.4272,-191.7304 402.6903,-198.1732"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.ReadInConfig -->
<g id="node6" class="node">
<title>github.com/spf13/viper.ReadInConfig</title>
<g id="a_node6"><a xlink:title="github.com/spf13/viper.ReadInConfig | defined in viper.go:1632">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M281.8526,-262C281.8526,-262 202.2232,-262 202.2232,-262 196.2232,-262 190.2232,-256 190.2232,-250 190.2232,-250 190.2232,-238 190.2232,-238 190.2232,-232 196.2232,-226 202.2232,-226 202.2232,-226 281.8526,-226 281.8526,-226 287.8526,-226 293.8526,-232 293.8526,-238 293.8526,-238 293.8526,-250 293.8526,-250 293.8526,-256 287.8526,-262 281.8526,-262"/>
<text text-anchor="middle" x="242.0379" y="-248.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="242.0379" y="-231.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadInConfig</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.ReadInConfig -->
<g id="edge18" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.ReadInConfig</title>
<g id="a_edge18"><a xlink:title="at config.go:69: calling [github.com/spf13/viper.ReadInConfig]">
<path fill="none" stroke="#8b4513" d="M66.7557,-408.6781C83.9212,-377.4408 122.6923,-313.5246 171.3296,-275 174.9135,-272.1613 178.7976,-269.5287 182.8383,-267.0977"/>
<polygon fill="#8b4513" stroke="#8b4513" points="184.8229,-269.9997 191.8786,-262.0961 181.4341,-263.8746 184.8229,-269.9997"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.AddConfigPath -->
<g id="node7" class="node">
<title>github.com/spf13/viper.AddConfigPath</title>
<g id="a_node7"><a xlink:title="github.com/spf13/viper.AddConfigPath | defined in viper.go:574">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M285.9202,-323C285.9202,-323 198.1556,-323 198.1556,-323 192.1556,-323 186.1556,-317 186.1556,-311 186.1556,-311 186.1556,-299 186.1556,-299 186.1556,-293 192.1556,-287 198.1556,-287 198.1556,-287 285.9202,-287 285.9202,-287 291.9202,-287 297.9202,-293 297.9202,-299 297.9202,-299 297.9202,-311 297.9202,-311 297.9202,-317 291.9202,-323 285.9202,-323"/>
<text text-anchor="middle" x="242.0379" y="-309.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="242.0379" y="-292.4" font-family="Verdana" font-size="14.00" fill="#000000">AddConfigPath</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.AddConfigPath -->
<g id="edge10" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.AddConfigPath</title>
<g id="a_edge10"><a xlink:title="at config.go:61: calling [github.com/spf13/viper.AddConfigPath]">
<path fill="none" stroke="#8b4513" d="M76.6135,-408.8716C98.4485,-389.1682 135.5252,-357.6121 171.3296,-336 176.255,-333.027 181.5164,-330.1794 186.8628,-327.4989"/>
<polygon fill="#8b4513" stroke="#8b4513" points="188.4024,-330.6422 195.8962,-323.1527 185.3675,-324.3343 188.4024,-330.6422"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.SetConfigName -->
<g id="node8" class="node">
<title>github.com/spf13/viper.SetConfigName</title>
<g id="a_node8"><a xlink:title="github.com/spf13/viper.SetConfigName | defined in viper.go:2174">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M287.2401,-384C287.2401,-384 196.8357,-384 196.8357,-384 190.8357,-384 184.8357,-378 184.8357,-372 184.8357,-372 184.8357,-360 184.8357,-360 184.8357,-354 190.8357,-348 196.8357,-348 196.8357,-348 287.2401,-348 287.2401,-348 293.2401,-348 299.2401,-354 299.2401,-360 299.2401,-360 299.2401,-372 299.2401,-372 299.2401,-378 293.2401,-384 287.2401,-384"/>
<text text-anchor="middle" x="242.0379" y="-370.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="242.0379" y="-353.4" font-family="Verdana" font-size="14.00" fill="#000000">SetConfigName</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.SetConfigName -->
<g id="edge6" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.SetConfigName</title>
<g id="a_edge6"><a xlink:title="at config.go:62: calling [github.com/spf13/viper.SetConfigName]">
<path fill="none" stroke="#8b4513" d="M98.6539,-413.3104C121.9783,-405.6144 151.5964,-395.8417 177.8508,-387.1789"/>
<polygon fill="#8b4513" stroke="#8b4513" points="178.9537,-390.5007 187.3534,-384.0435 176.7603,-383.8532 178.9537,-390.5007"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.SetConfigType -->
<g id="node9" class="node">
<title>github.com/spf13/viper.SetConfigType</title>
<g id="a_node9"><a xlink:title="github.com/spf13/viper.SetConfigType | defined in viper.go:2185">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M284.5817,-445C284.5817,-445 199.4941,-445 199.4941,-445 193.4941,-445 187.4941,-439 187.4941,-433 187.4941,-433 187.4941,-421 187.4941,-421 187.4941,-415 193.4941,-409 199.4941,-409 199.4941,-409 284.5817,-409 284.5817,-409 290.5817,-409 296.5817,-415 296.5817,-421 296.5817,-421 296.5817,-433 296.5817,-433 296.5817,-439 290.5817,-445 284.5817,-445"/>
<text text-anchor="middle" x="242.0379" y="-431.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="242.0379" y="-414.4" font-family="Verdana" font-size="14.00" fill="#000000">SetConfigType</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.SetConfigType -->
<g id="edge11" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.SetConfigType</title>
<g id="a_edge11"><a xlink:title="at config.go:63: calling [github.com/spf13/viper.SetConfigType]">
<path fill="none" stroke="#8b4513" d="M98.6539,-427C121.7737,-427 151.0773,-427 177.1591,-427"/>
<polygon fill="#8b4513" stroke="#8b4513" points="177.3534,-430.5001 187.3534,-427 177.3534,-423.5001 177.3534,-430.5001"/>
</a>
</g>
</g>
<!-- gopkg.in/yaml.v3.Marshal -->
<g id="node10" class="node">
<title>gopkg.in/yaml.v3.Marshal</title>
<g id="a_node10"><a xlink:title="gopkg.in/yaml.v3.Marshal | defined in yaml.go:218">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M264.9076,-506C264.9076,-506 219.1682,-506 219.1682,-506 213.1682,-506 207.1682,-500 207.1682,-494 207.1682,-494 207.1682,-482 207.1682,-482 207.1682,-476 213.1682,-470 219.1682,-470 219.1682,-470 264.9076,-470 264.9076,-470 270.9076,-470 276.9076,-476 276.9076,-482 276.9076,-482 276.9076,-494 276.9076,-494 276.9076,-500 270.9076,-506 264.9076,-506"/>
<text text-anchor="middle" x="242.0379" y="-492.2" font-family="Verdana" font-size="14.00" fill="#000000">yaml</text>
<text text-anchor="middle" x="242.0379" y="-475.4" font-family="Verdana" font-size="14.00" fill="#000000">Marshal</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;gopkg.in/yaml.v3.Marshal -->
<g id="edge23" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;gopkg.in/yaml.v3.Marshal</title>
<g id="a_edge23"><a xlink:title="at config.go:47: calling [gopkg.in/yaml.v3.Marshal]">
<path fill="none" stroke="#8b4513" d="M98.6539,-440.6896C127.9217,-450.3467 167.0992,-463.2735 197.1058,-473.1744"/>
<polygon fill="#8b4513" stroke="#8b4513" points="196.3096,-476.5972 206.9028,-476.4069 198.503,-469.9497 196.3096,-476.5972"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig -->
<g id="node11" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig</title>
<g id="a_node11"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig | defined in config.go:92&#10;at config.go:110: calling [github.com/spf13/viper.GetInt]&#10;at config.go:104: calling [github.com/spf13/viper.UnmarshalKey]&#10;at config.go:105: calling [(*github.com/go&#45;i2p/logger.Logger).Warnf]&#10;at config.go:94: calling [github.com/spf13/viper.GetString]&#10;at config.go:95: calling [github.com/spf13/viper.GetString]&#10;at config.go:99: calling [github.com/spf13/viper.GetString]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M300.9551,-567C300.9551,-567 183.1207,-567 183.1207,-567 177.1207,-567 171.1207,-561 171.1207,-555 171.1207,-555 171.1207,-543 171.1207,-543 171.1207,-537 177.1207,-531 183.1207,-531 183.1207,-531 300.9551,-531 300.9551,-531 306.9551,-531 312.9551,-537 312.9551,-543 312.9551,-543 312.9551,-555 312.9551,-555 312.9551,-561 306.9551,-567 300.9551,-567"/>
<text text-anchor="middle" x="242.0379" y="-544.8" font-family="Verdana" font-size="14.00" fill="#000000">UpdateRouterConfig</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig -->
<g id="edge15" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig</title>
<g id="a_edge15"><a xlink:title="at config.go:76: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig]">
<path fill="none" stroke="#000000" d="M76.1343,-445.065C97.8401,-465.0469 135.0821,-497.2831 171.3296,-519 175.7211,-521.6311 180.3856,-524.1477 185.1426,-526.525"/>
<polygon fill="#000000" stroke="#000000" points="183.824,-529.7738 194.3568,-530.9185 186.8368,-523.4553 183.824,-529.7738"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.ConfigFileUsed -->
<g id="node15" class="node">
<title>github.com/spf13/viper.ConfigFileUsed</title>
<g id="a_node15"><a xlink:title="github.com/spf13/viper.ConfigFileUsed | defined in viper.go:569">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M286.9707,-628C286.9707,-628 197.1051,-628 197.1051,-628 191.1051,-628 185.1051,-622 185.1051,-616 185.1051,-616 185.1051,-604 185.1051,-604 185.1051,-598 191.1051,-592 197.1051,-592 197.1051,-592 286.9707,-592 286.9707,-592 292.9707,-592 298.9707,-598 298.9707,-604 298.9707,-604 298.9707,-616 298.9707,-616 298.9707,-622 292.9707,-628 286.9707,-628"/>
<text text-anchor="middle" x="242.0379" y="-614.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="242.0379" y="-597.4" font-family="Verdana" font-size="14.00" fill="#000000">ConfigFileUsed</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.ConfigFileUsed -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;github.com/spf13/viper.ConfigFileUsed</title>
<g id="a_edge1"><a xlink:title="at config.go:72: calling [github.com/spf13/viper.ConfigFileUsed]">
<path fill="none" stroke="#8b4513" d="M66.4064,-445.0067C83.3121,-476.3611 122.0575,-541.3233 171.3296,-580 174.4846,-582.4766 177.8743,-584.7853 181.4,-586.9314"/>
<polygon fill="#8b4513" stroke="#8b4513" points="179.9481,-590.1289 190.3879,-591.9344 183.3526,-584.0126 179.9481,-590.1289"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/logger.Logger).Warnf -->
<g id="node21" class="node">
<title>(*github.com/go&#45;i2p/logger.Logger).Warnf</title>
<g id="a_node21"><a xlink:title="(*github.com/go&#45;i2p/logger.Logger).Warnf | defined in log.go:36">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M474.9964,-672C474.9964,-672 439.4638,-672 439.4638,-672 433.4638,-672 427.4638,-666 427.4638,-660 427.4638,-660 427.4638,-648 427.4638,-648 427.4638,-642 433.4638,-636 439.4638,-636 439.4638,-636 474.9964,-636 474.9964,-636 480.9964,-636 486.9964,-642 486.9964,-648 486.9964,-648 486.9964,-660 486.9964,-660 486.9964,-666 480.9964,-672 474.9964,-672"/>
<text text-anchor="middle" x="457.2301" y="-658.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="457.2301" y="-641.4" font-family="Verdana" font-size="14.00" fill="#000000">Warnf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warnf -->
<g id="edge7" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warnf</title>
<g id="a_edge7"><a xlink:title="at config.go:70: calling [(*github.com/go&#45;i2p/logger.Logger).Warnf]">
<path fill="none" stroke="#8b4513" d="M60.5914,-445.1687C69.7579,-488.0742 99.2234,-595.4829 171.3296,-641 191.553,-653.766 343.0676,-654.6831 416.953,-654.3531"/>
<polygon fill="#8b4513" stroke="#8b4513" points="417.2853,-657.8514 427.2659,-654.2966 417.2469,-650.8515 417.2853,-657.8514"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Logger).Fatalf -->
<g id="node22" class="node">
<title>(*github.com/sirupsen/logrus.Logger).Fatalf</title>
<g id="a_node22"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Fatalf | defined in logger.go:189">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M259.5337,-794C259.5337,-794 224.5421,-794 224.5421,-794 218.5421,-794 212.5421,-788 212.5421,-782 212.5421,-782 212.5421,-770 212.5421,-770 212.5421,-764 218.5421,-758 224.5421,-758 224.5421,-758 259.5337,-758 259.5337,-758 265.5337,-758 271.5337,-764 271.5337,-770 271.5337,-770 271.5337,-782 271.5337,-782 271.5337,-788 265.5337,-794 259.5337,-794"/>
<text text-anchor="middle" x="242.0379" y="-780.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="242.0379" y="-763.4" font-family="Verdana" font-size="14.00" fill="#000000">Fatalf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;(*github.com/sirupsen/logrus.Logger).Fatalf -->
<g id="edge19" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;(*github.com/sirupsen/logrus.Logger).Fatalf</title>
<g id="a_edge19"><a xlink:title="at config.go:31: calling [(*github.com/sirupsen/logrus.Logger).Fatalf]&#10;at config.go:49: calling [(*github.com/sirupsen/logrus.Logger).Fatalf]&#10;at config.go:54: calling [(*github.com/sirupsen/logrus.Logger).Fatalf]">
<path fill="none" stroke="#8b4513" d="M58.2044,-445.1411C62.2835,-499.0873 81.7586,-660.0854 171.3296,-746 180.1126,-754.4245 191.6201,-760.6551 202.793,-765.1854"/>
<polygon fill="#8b4513" stroke="#8b4513" points="201.8553,-768.5698 212.4488,-768.7413 204.2744,-762.0011 201.8553,-768.5698"/>
</a>
</g>
</g>
<!-- (*github.com/sirupsen/logrus.Logger).Debugf -->
<g id="node23" class="node">
<title>(*github.com/sirupsen/logrus.Logger).Debugf</title>
<g id="a_node23"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Debugf | defined in logger.go:163">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M263.0197,-733C263.0197,-733 221.0561,-733 221.0561,-733 215.0561,-733 209.0561,-727 209.0561,-721 209.0561,-721 209.0561,-709 209.0561,-709 209.0561,-703 215.0561,-697 221.0561,-697 221.0561,-697 263.0197,-697 263.0197,-697 269.0197,-697 275.0197,-703 275.0197,-709 275.0197,-709 275.0197,-721 275.0197,-721 275.0197,-727 269.0197,-733 263.0197,-733"/>
<text text-anchor="middle" x="242.0379" y="-719.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
<text text-anchor="middle" x="242.0379" y="-702.4" font-family="Verdana" font-size="14.00" fill="#000000">Debugf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debugf -->
<g id="edge24" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.InitConfig&#45;&gt;(*github.com/sirupsen/logrus.Logger).Debugf</title>
<g id="a_edge24"><a xlink:title="at config.go:57: calling [(*github.com/sirupsen/logrus.Logger).Debugf]&#10;at config.go:72: calling [(*github.com/sirupsen/logrus.Logger).Debugf]">
<path fill="none" stroke="#8b4513" d="M59.7631,-445.1644C66.3637,-486.5229 86.7448,-589.6433 134.3296,-661 146.392,-679.0884 152.3268,-682.4366 171.3296,-693 179.9196,-697.7751 189.6845,-701.6601 199.1566,-704.7608"/>
<polygon fill="#8b4513" stroke="#8b4513" points="198.2743,-708.1507 208.8601,-707.7126 200.3116,-701.4537 198.2743,-708.1507"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig -->
<g id="edge9" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig</title>
<g id="a_edge9"><a xlink:title="at config.go:81: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]&#10;at config.go:82: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]">
<path fill="none" stroke="#000000" d="M285.5853,-189.8804C311.2942,-193.9424 344.6737,-199.2163 375.1536,-204.0321"/>
<polygon fill="#000000" stroke="#000000" points="374.9402,-207.5417 385.3639,-205.6453 376.0327,-200.6274 374.9402,-207.5417"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.SetDefault -->
<g id="node5" class="node">
<title>github.com/spf13/viper.SetDefault</title>
<g id="a_node5"><a xlink:title="github.com/spf13/viper.SetDefault | defined in viper.go:1596">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M487.0956,-296C487.0956,-296 427.3646,-296 427.3646,-296 421.3646,-296 415.3646,-290 415.3646,-284 415.3646,-284 415.3646,-272 415.3646,-272 415.3646,-266 421.3646,-260 427.3646,-260 427.3646,-260 487.0956,-260 487.0956,-260 493.0956,-260 499.0956,-266 499.0956,-272 499.0956,-272 499.0956,-284 499.0956,-284 499.0956,-290 493.0956,-296 487.0956,-296"/>
<text text-anchor="middle" x="457.2301" y="-282.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="457.2301" y="-265.4" font-family="Verdana" font-size="14.00" fill="#000000">SetDefault</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults&#45;&gt;github.com/spf13/viper.SetDefault -->
<g id="edge5" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.setDefaults&#45;&gt;github.com/spf13/viper.SetDefault</title>
<g id="a_edge5"><a xlink:title="at config.go:81: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:82: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:85: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:88: calling [github.com/spf13/viper.SetDefault]&#10;at config.go:89: calling [github.com/spf13/viper.SetDefault]">
<path fill="none" stroke="#8b4513" d="M283.6095,-201.0383C293.1974,-205.2506 303.3415,-209.7489 312.7462,-214 345.36,-228.742 353.0167,-233.5166 385.7462,-248 392.1136,-250.8177 398.8267,-253.7217 405.4859,-256.5621"/>
<polygon fill="#8b4513" stroke="#8b4513" points="404.5842,-259.9812 415.1572,-260.6606 407.3156,-253.5361 404.5842,-259.9812"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.GetString -->
<g id="node12" class="node">
<title>github.com/spf13/viper.GetString</title>
<g id="a_node12"><a xlink:title="github.com/spf13/viper.GetString | defined in viper.go:975">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M484.6675,-472C484.6675,-472 429.7927,-472 429.7927,-472 423.7927,-472 417.7927,-466 417.7927,-460 417.7927,-460 417.7927,-448 417.7927,-448 417.7927,-442 423.7927,-436 429.7927,-436 429.7927,-436 484.6675,-436 484.6675,-436 490.6675,-436 496.6675,-442 496.6675,-448 496.6675,-448 496.6675,-460 496.6675,-460 496.6675,-466 490.6675,-472 484.6675,-472"/>
<text text-anchor="middle" x="457.2301" y="-458.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="457.2301" y="-441.4" font-family="Verdana" font-size="14.00" fill="#000000">GetString</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig&#45;&gt;github.com/spf13/viper.GetString -->
<g id="edge20" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig&#45;&gt;github.com/spf13/viper.GetString</title>
<g id="a_edge20"><a xlink:title="at config.go:94: calling [github.com/spf13/viper.GetString]&#10;at config.go:95: calling [github.com/spf13/viper.GetString]&#10;at config.go:99: calling [github.com/spf13/viper.GetString]">
<path fill="none" stroke="#8b4513" d="M285.1417,-530.9925C294.2808,-527.0961 303.8521,-522.9566 312.7462,-519 345.4473,-504.4527 353.103,-499.6768 385.7462,-485 393.114,-481.6874 400.9343,-478.2333 408.5951,-474.884"/>
<polygon fill="#8b4513" stroke="#8b4513" points="410.0483,-478.0687 417.8193,-470.8672 407.2535,-471.6508 410.0483,-478.0687"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.UnmarshalKey -->
<g id="node13" class="node">
<title>github.com/spf13/viper.UnmarshalKey</title>
<g id="a_node13"><a xlink:title="github.com/spf13/viper.UnmarshalKey | defined in viper.go:1103">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M499.4738,-533C499.4738,-533 414.9864,-533 414.9864,-533 408.9864,-533 402.9864,-527 402.9864,-521 402.9864,-521 402.9864,-509 402.9864,-509 402.9864,-503 408.9864,-497 414.9864,-497 414.9864,-497 499.4738,-497 499.4738,-497 505.4738,-497 511.4738,-503 511.4738,-509 511.4738,-509 511.4738,-521 511.4738,-521 511.4738,-527 505.4738,-533 499.4738,-533"/>
<text text-anchor="middle" x="457.2301" y="-519.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="457.2301" y="-502.4" font-family="Verdana" font-size="14.00" fill="#000000">UnmarshalKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig&#45;&gt;github.com/spf13/viper.UnmarshalKey -->
<g id="edge13" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig&#45;&gt;github.com/spf13/viper.UnmarshalKey</title>
<g id="a_edge13"><a xlink:title="at config.go:104: calling [github.com/spf13/viper.UnmarshalKey]">
<path fill="none" stroke="#8b4513" d="M312.7979,-537.82C338.5302,-533.7544 367.4592,-529.1836 392.6306,-525.2066"/>
<polygon fill="#8b4513" stroke="#8b4513" points="393.4713,-528.6173 402.8026,-523.5995 392.3788,-521.703 393.4713,-528.6173"/>
</a>
</g>
</g>
<!-- github.com/spf13/viper.GetInt -->
<g id="node14" class="node">
<title>github.com/spf13/viper.GetInt</title>
<g id="a_node14"><a xlink:title="github.com/spf13/viper.GetInt | defined in viper.go:989">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M474.9936,-594C474.9936,-594 439.4666,-594 439.4666,-594 433.4666,-594 427.4666,-588 427.4666,-582 427.4666,-582 427.4666,-570 427.4666,-570 427.4666,-564 433.4666,-558 439.4666,-558 439.4666,-558 474.9936,-558 474.9936,-558 480.9936,-558 486.9936,-564 486.9936,-570 486.9936,-570 486.9936,-582 486.9936,-582 486.9936,-588 480.9936,-594 474.9936,-594"/>
<text text-anchor="middle" x="457.2301" y="-580.2" font-family="Verdana" font-size="14.00" fill="#000000">viper</text>
<text text-anchor="middle" x="457.2301" y="-563.4" font-family="Verdana" font-size="14.00" fill="#000000">GetInt</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig&#45;&gt;github.com/spf13/viper.GetInt -->
<g id="edge8" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig&#45;&gt;github.com/spf13/viper.GetInt</title>
<g id="a_edge8"><a xlink:title="at config.go:110: calling [github.com/spf13/viper.GetInt]">
<path fill="none" stroke="#8b4513" d="M312.7979,-557.8782C347.3833,-562.2176 387.7433,-567.2815 416.9933,-570.9515"/>
<polygon fill="#8b4513" stroke="#8b4513" points="416.8776,-574.4644 427.2356,-572.2366 417.7491,-567.5188 416.8776,-574.4644"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warnf -->
<g id="edge14" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.UpdateRouterConfig&#45;&gt;(*github.com/go&#45;i2p/logger.Logger).Warnf</title>
<g id="a_edge14"><a xlink:title="at config.go:105: calling [(*github.com/go&#45;i2p/logger.Logger).Warnf]">
<path fill="none" stroke="#8b4513" d="M287.2284,-567.1523C295.8575,-571.0805 304.7021,-575.4362 312.7462,-580 347.3927,-599.6568 350.0307,-614.36 385.7462,-632 395.6276,-636.8804 406.8143,-640.943 417.3547,-644.1935"/>
<polygon fill="#8b4513" stroke="#8b4513" points="416.6188,-647.6245 427.1986,-647.0614 418.5767,-640.9039 416.6188,-647.6245"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase -->
<g id="node16" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase</title>
<g id="a_node16"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase | defined in router.go:28&#10;at router.go:29: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.home]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M490.3115,-52C490.3115,-52 424.1487,-52 424.1487,-52 418.1487,-52 412.1487,-46 412.1487,-40 412.1487,-40 412.1487,-28 412.1487,-28 412.1487,-22 418.1487,-16 424.1487,-16 424.1487,-16 490.3115,-16 490.3115,-16 496.3115,-16 502.3115,-22 502.3115,-28 502.3115,-28 502.3115,-40 502.3115,-40 502.3115,-46 496.3115,-52 490.3115,-52"/>
<text text-anchor="middle" x="457.2301" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">defaultBase</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.home -->
<g id="node17" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.home</title>
<g id="a_node17"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/config.home | defined in router.go:20">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M644.8719,-73C644.8719,-73 613.6613,-73 613.6613,-73 607.6613,-73 601.6613,-67 601.6613,-61 601.6613,-61 601.6613,-49 601.6613,-49 601.6613,-43 607.6613,-37 613.6613,-37 613.6613,-37 644.8719,-37 644.8719,-37 650.8719,-37 656.8719,-43 656.8719,-49 656.8719,-49 656.8719,-61 656.8719,-61 656.8719,-67 650.8719,-73 644.8719,-73"/>
<text text-anchor="middle" x="629.2666" y="-50.8" font-family="Verdana" font-size="14.00" fill="#000000">home</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.home -->
<g id="edge2" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.home</title>
<g id="a_edge2"><a xlink:title="at router.go:29: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.home]">
<path fill="none" stroke="#000000" d="M502.4307,-39.5175C530.203,-42.9076 565.3654,-47.1998 591.6199,-50.4046"/>
<polygon fill="#000000" stroke="#000000" points="591.2158,-53.8811 601.5663,-51.6187 592.0641,-46.9327 591.2158,-53.8811"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig -->
<g id="node18" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig</title>
<g id="a_node18"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig | defined in router.go:32&#10;at router.go:33: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.home]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M495.9892,-113C495.9892,-113 418.471,-113 418.471,-113 412.471,-113 406.471,-107 406.471,-101 406.471,-101 406.471,-89 406.471,-89 406.471,-83 412.471,-77 418.471,-77 418.471,-77 495.9892,-77 495.9892,-77 501.9892,-77 507.9892,-83 507.9892,-89 507.9892,-89 507.9892,-101 507.9892,-101 507.9892,-107 501.9892,-113 495.9892,-113"/>
<text text-anchor="middle" x="457.2301" y="-90.8" font-family="Verdana" font-size="14.00" fill="#000000">defaultConfig</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.home -->
<g id="edge25" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.home</title>
<g id="a_edge25"><a xlink:title="at router.go:33: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.home]">
<path fill="none" stroke="#000000" d="M508.3809,-83.107C535.0739,-76.9006 567.1591,-69.4405 591.5644,-63.7661"/>
<polygon fill="#000000" stroke="#000000" points="592.568,-67.1262 601.5155,-61.4524 590.9826,-60.3081 592.568,-67.1262"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.init -->
<g id="node19" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.init</title>
<g id="a_node19"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/config.init | defined in .:0&#10;at config.go:14: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]&#10;at netdb.go:15: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig]&#10;at router.go:41: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig]&#10;at router.go:40: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase]&#10;at router.go:48: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M257.0379,-52C257.0379,-52 227.0379,-52 227.0379,-52 221.0379,-52 215.0379,-46 215.0379,-40 215.0379,-40 215.0379,-28 215.0379,-28 215.0379,-22 221.0379,-16 227.0379,-16 227.0379,-16 257.0379,-16 257.0379,-16 263.0379,-16 269.0379,-22 269.0379,-28 269.0379,-28 269.0379,-40 269.0379,-40 269.0379,-46 263.0379,-52 257.0379,-52"/>
<text text-anchor="middle" x="242.0379" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.init&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig -->
<g id="edge21" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.init&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig</title>
<g id="a_edge21"><a xlink:title="at router.go:48: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.DefaultRouterConfig]">
<path fill="none" stroke="#000000" d="M269.1031,-41.4613C283.2977,-46.3943 300.2769,-54.0109 312.7462,-65 360.1517,-106.7781 338.0115,-145.5984 385.7462,-187 388.555,-189.4361 391.59,-191.6958 394.7696,-193.7888"/>
<polygon fill="#000000" stroke="#000000" points="393.0815,-196.8568 403.4683,-198.9463 396.6516,-190.8356 393.0815,-196.8568"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.init&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase -->
<g id="edge16" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.init&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase</title>
<g id="a_edge16"><a xlink:title="at router.go:40: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultBase]">
<path fill="none" stroke="#000000" d="M269.2921,-34C302.4127,-34 359.1306,-34 401.6157,-34"/>
<polygon fill="#000000" stroke="#000000" points="401.8132,-37.5001 411.8132,-34 401.8132,-30.5001 401.8132,-37.5001"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.init&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig -->
<g id="edge4" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.init&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig</title>
<g id="a_edge4"><a xlink:title="at netdb.go:15: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig]&#10;at router.go:41: calling [github.com/go&#45;i2p/go&#45;i2p/lib/config.defaultConfig]">
<path fill="none" stroke="#000000" d="M269.2921,-41.7257C301.1216,-50.7483 354.7445,-65.9487 396.5846,-77.809"/>
<polygon fill="#000000" stroke="#000000" points="395.8274,-81.2322 406.4029,-80.5921 397.7365,-74.4975 395.8274,-81.2322"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="node20" class="node">
<title>github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_node20"><a xlink:title="github.com/go&#45;i2p/logger.GetGoI2PLogger | defined in log.go:120">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M505.9196,-174C505.9196,-174 408.5406,-174 408.5406,-174 402.5406,-174 396.5406,-168 396.5406,-162 396.5406,-162 396.5406,-150 396.5406,-150 396.5406,-144 402.5406,-138 408.5406,-138 408.5406,-138 505.9196,-138 505.9196,-138 511.9196,-138 517.9196,-144 517.9196,-150 517.9196,-150 517.9196,-162 517.9196,-162 517.9196,-168 511.9196,-174 505.9196,-174"/>
<text text-anchor="middle" x="457.2301" y="-160.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
<text text-anchor="middle" x="457.2301" y="-143.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/config.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger -->
<g id="edge3" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/config.init&#45;&gt;github.com/go&#45;i2p/logger.GetGoI2PLogger</title>
<g id="a_edge3"><a xlink:title="at config.go:14: calling [github.com/go&#45;i2p/logger.GetGoI2PLogger]">
<path fill="none" stroke="#8b4513" d="M269.1253,-43.7794C282.6818,-49.1885 299.0729,-56.5294 312.7462,-65 348.6887,-87.2663 349.6286,-104.0189 385.7462,-126 390.09,-128.6436 394.7086,-131.1603 399.4263,-133.5301"/>
<polygon fill="#8b4513" stroke="#8b4513" points="398.0428,-136.748 408.5747,-137.9007 401.0603,-130.4317 398.0428,-136.748"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -1,7 +1,6 @@
package config
import (
"os"
"path/filepath"
)
@ -17,20 +16,12 @@ type RouterConfig struct {
Bootstrap *BootstrapConfig
}
func home() string {
h, err := os.UserHomeDir()
if err != nil {
panic(err)
}
return h
}
func defaultBase() string {
return filepath.Join(home(), GOI2P_BASE_DIR, "base")
return filepath.Join(BuildI2PDirPath(), "base")
}
func defaultConfig() string {
return filepath.Join(home(), GOI2P_BASE_DIR, "config")
return filepath.Join(BuildI2PDirPath(), "config")
}
// defaults for router

View File

@ -2,7 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/crypto"
package for i2p specific cryptography
![crypto.svg](crypto.svg)
package for i2p specific crpytography
## Usage
@ -12,89 +14,31 @@ const (
OPAD = byte(0x5C)
)
```
#### type AESSymmetricKey
```go
type AESSymmetricKey struct {
Key []byte // AES key (must be 16, 24, or 32 bytes for AES-128, AES-192, AES-256)
IV []byte // Initialization Vector (must be 16 bytes for AES)
}
```
AESSymmetricKey represents a symmetric key for AES encryption/decryption
#### func (AESSymmetricKey) NewEncrypter
```go
func (k *AESSymmetricKey) NewEncrypter() (Encrypter, error)
```
NewEncrypter creates a new AESSymmetricEncrypter
#### func (AESSymmetricKey) NewDecrypter
```go
func (k *AESSymmetricKey) NewDecrypter() (Decrypter, error)
```
NewDecrypter creates a new AESSymmetricDecrypter
#### func (AESSymmetricKey) Len
```go
func (k *AESSymmetricKey) Len() int
```
Len returns the length of the key
#### type AESSymmetricEncrypter
```go
type AESSymmetricEncrypter struct {
Key []byte
IV []byte
}
```
AESSymmetricEncrypter implements the Encrypter interface using AES
#### func (*AESSymmetricEncrypter) Encrypt
```go
func (e *AESSymmetricEncrypter) Encrypt(data []byte) ([]byte, error)
```
Encrypt encrypts data using AES-CBC with PKCS#7 padding
#### type AESSymmetricDecrypter
```go
type AESSymmetricDecrypter struct {
Key []byte
IV []byte
}
```
AESSymmetricDecrypter implements the Decrypter interface using AES
#### func (*AESSymmetricDecrypter) Decrypt
```go
func (d *AESSymmetricDecrypter) Decrypt(data []byte) ([]byte, error)
```
Decrypt decrypts data using AES-CBC with PKCS#7 padding
```go
var (
ElgDecryptFail = errors.New("failed to decrypt elgamal encrypted data")
ElgEncryptTooBig = errors.New("failed to encrypt data, too big for elgamal")
Ed25519EncryptTooBig = oops.Errorf("failed to encrypt data, too big for Ed25519")
ErrInvalidPublicKeySize = oops.Errorf("failed to verify: invalid ed25519 public key size")
)
```
```go
var (
ErrBadSignatureSize = errors.New("bad signature size")
ErrInvalidKeyFormat = errors.New("invalid key format")
ErrInvalidSignature = errors.New("invalid signature")
ElgDecryptFail = oops.Errorf("failed to decrypt elgamal encrypted data")
ElgEncryptTooBig = oops.Errorf("failed to encrypt data, too big for elgamal")
)
```
```go
var Ed25519EncryptTooBig = errors.New("failed to encrypt data, too big for Ed25519")
var (
ErrBadSignatureSize = oops.Errorf("bad signature size")
ErrInvalidKeyFormat = oops.Errorf("invalid key format")
ErrInvalidSignature = oops.Errorf("invalid signature")
)
```
```go
var Curve25519EncryptTooBig = oops.Errorf("failed to encrypt data, too big for Curve25519")
```
```go
@ -108,6 +52,180 @@ func ElgamalGenerate(priv *elgamal.PrivateKey, rand io.Reader) (err error)
```
generate an elgamal key pair
#### type AESSymmetricDecrypter
```go
type AESSymmetricDecrypter struct {
Key []byte
IV []byte
}
```
AESSymmetricDecrypter implements the Decrypter interface using AES
#### func (*AESSymmetricDecrypter) Decrypt
```go
func (d *AESSymmetricDecrypter) Decrypt(data []byte) ([]byte, error)
```
Decrypt decrypts data using AES-CBC with PKCS#7 padding
#### func (*AESSymmetricDecrypter) DecryptNoPadding
```go
func (d *AESSymmetricDecrypter) DecryptNoPadding(data []byte) ([]byte, error)
```
DecryptNoPadding decrypts data using AES-CBC without padding
#### type AESSymmetricEncrypter
```go
type AESSymmetricEncrypter struct {
Key []byte
IV []byte
}
```
AESSymmetricEncrypter implements the Encrypter interface using AES
#### func (*AESSymmetricEncrypter) Encrypt
```go
func (e *AESSymmetricEncrypter) Encrypt(data []byte) ([]byte, error)
```
Encrypt encrypts data using AES-CBC with PKCS#7 padding
#### func (*AESSymmetricEncrypter) EncryptNoPadding
```go
func (e *AESSymmetricEncrypter) EncryptNoPadding(data []byte) ([]byte, error)
```
EncryptNoPadding encrypts data using AES-CBC without padding
#### type AESSymmetricKey
```go
type AESSymmetricKey struct {
Key []byte // AES key (must be 16, 24, or 32 bytes for AES-128, AES-192, AES-256)
IV []byte // Initialization Vector (must be 16 bytes for AES)
}
```
AESSymmetricKey represents a symmetric key for AES encryption/decryption
#### func (*AESSymmetricKey) Len
```go
func (k *AESSymmetricKey) Len() int
```
Len returns the length of the key
#### func (*AESSymmetricKey) NewDecrypter
```go
func (k *AESSymmetricKey) NewDecrypter() (Decrypter, error)
```
NewDecrypter creates a new AESSymmetricDecrypter
#### func (*AESSymmetricKey) NewEncrypter
```go
func (k *AESSymmetricKey) NewEncrypter() (Encrypter, error)
```
NewEncrypter creates a new AESSymmetricEncrypter
#### type Curve25519Encryption
```go
type Curve25519Encryption struct {
}
```
#### func (*Curve25519Encryption) Encrypt
```go
func (curve25519 *Curve25519Encryption) Encrypt(data []byte) (enc []byte, err error)
```
#### func (*Curve25519Encryption) EncryptPadding
```go
func (curve25519 *Curve25519Encryption) EncryptPadding(data []byte, zeroPadding bool) (encrypted []byte, err error)
```
#### type Curve25519PrivateKey
```go
type Curve25519PrivateKey curve25519.PrivateKey
```
#### type Curve25519PublicKey
```go
type Curve25519PublicKey []byte
```
#### func (Curve25519PublicKey) Len
```go
func (k Curve25519PublicKey) Len() int
```
#### func (Curve25519PublicKey) NewEncrypter
```go
func (elg Curve25519PublicKey) NewEncrypter() (enc Encrypter, err error)
```
#### func (Curve25519PublicKey) NewVerifier
```go
func (k Curve25519PublicKey) NewVerifier() (v Verifier, err error)
```
#### type Curve25519Signer
```go
type Curve25519Signer struct {
}
```
#### func (*Curve25519Signer) Sign
```go
func (s *Curve25519Signer) Sign(data []byte) (sig []byte, err error)
```
#### func (*Curve25519Signer) SignHash
```go
func (s *Curve25519Signer) SignHash(h []byte) (sig []byte, err error)
```
#### type Curve25519Verifier
```go
type Curve25519Verifier struct {
}
```
#### func (*Curve25519Verifier) Verify
```go
func (v *Curve25519Verifier) Verify(data, sig []byte) (err error)
```
#### func (*Curve25519Verifier) VerifyHash
```go
func (v *Curve25519Verifier) VerifyHash(h, sig []byte) (err error)
```
#### type DSAPrivateKey
```go
@ -147,6 +265,12 @@ type DSAPublicKey [128]byte
```
#### func (DSAPublicKey) Bytes
```go
func (k DSAPublicKey) Bytes() []byte
```
#### func (DSAPublicKey) Len
```go
@ -251,6 +375,12 @@ type ECP256PublicKey [64]byte
```
#### func (ECP256PublicKey) Bytes
```go
func (k ECP256PublicKey) Bytes() []byte
```
#### func (ECP256PublicKey) Len
```go
@ -277,6 +407,12 @@ type ECP384PublicKey [96]byte
```
#### func (ECP384PublicKey) Bytes
```go
func (k ECP384PublicKey) Bytes() []byte
```
#### func (ECP384PublicKey) Len
```go
@ -303,6 +439,12 @@ type ECP521PublicKey [132]byte
```
#### func (ECP521PublicKey) Bytes
```go
func (k ECP521PublicKey) Bytes() []byte
```
#### func (ECP521PublicKey) Len
```go
@ -315,6 +457,26 @@ func (k ECP521PublicKey) Len() int
func (k ECP521PublicKey) NewVerifier() (Verifier, error)
```
#### type Ed25519Decrypter
```go
type Ed25519Decrypter struct {
}
```
#### func (*Ed25519Decrypter) Decrypt
```go
func (d *Ed25519Decrypter) Decrypt(data []byte) ([]byte, error)
```
#### func (*Ed25519Decrypter) DecryptPadding
```go
func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte, error)
```
#### type Ed25519Encryption
```go
@ -342,6 +504,48 @@ type Ed25519PrivateKey ed25519.PrivateKey
```
#### func (Ed25519PrivateKey) Bytes
```go
func (k Ed25519PrivateKey) Bytes() []byte
```
#### func (Ed25519PrivateKey) Generate
```go
func (k Ed25519PrivateKey) Generate() (SigningPrivateKey, error)
```
#### func (Ed25519PrivateKey) Len
```go
func (k Ed25519PrivateKey) Len() int
```
#### func (Ed25519PrivateKey) NewDecrypter
```go
func (k Ed25519PrivateKey) NewDecrypter() (Decrypter, error)
```
#### func (Ed25519PrivateKey) NewSigner
```go
func (k Ed25519PrivateKey) NewSigner() (Signer, error)
```
#### func (Ed25519PrivateKey) Public
```go
func (k Ed25519PrivateKey) Public() (SigningPublicKey, error)
```
#### func (Ed25519PrivateKey) Zero
```go
func (k Ed25519PrivateKey) Zero()
```
#### type Ed25519PublicKey
```go
@ -349,6 +553,18 @@ type Ed25519PublicKey []byte
```
#### func CreateEd25519PublicKeyFromBytes
```go
func CreateEd25519PublicKeyFromBytes(data []byte) (Ed25519PublicKey, error)
```
#### func (Ed25519PublicKey) Bytes
```go
func (k Ed25519PublicKey) Bytes() []byte
```
#### func (Ed25519PublicKey) Len
```go
@ -433,6 +649,12 @@ type ElgPublicKey [256]byte
```
#### func (ElgPublicKey) Bytes
```go
func (elg ElgPublicKey) Bytes() []byte
```
#### func (ElgPublicKey) Len
```go
@ -509,6 +731,21 @@ type PrivateEncryptionKey interface {
```
#### type PrivateKey
```go
type PrivateKey interface {
// Public returns the public key corresponding to this private key
Public() (SigningPublicKey, error)
// Bytes returns the raw bytes of this private key
Bytes() []byte
// Zero clears all sensitive data from the private key
Zero()
}
```
PrivateKey is an interface for private keys
#### type PublicEncryptionKey
```go
@ -527,7 +764,7 @@ type PublicEncryptionKey interface {
```go
type PublicKey interface {
Len() int
NewEncrypter() (Encrypter, error)
Bytes() []byte
}
```
@ -546,6 +783,27 @@ type RSA2048PublicKey [256]byte
```
#### func (RSA2048PublicKey) Bytes
```go
func (r RSA2048PublicKey) Bytes() []byte
```
Bytes implements SigningPublicKey.
#### func (RSA2048PublicKey) Len
```go
func (r RSA2048PublicKey) Len() int
```
Len implements SigningPublicKey.
#### func (RSA2048PublicKey) NewVerifier
```go
func (r RSA2048PublicKey) NewVerifier() (Verifier, error)
```
NewVerifier implements SigningPublicKey.
#### type RSA3072PrivateKey
```go
@ -560,6 +818,27 @@ type RSA3072PublicKey [384]byte
```
#### func (RSA3072PublicKey) Bytes
```go
func (r RSA3072PublicKey) Bytes() []byte
```
Bytes implements SigningPublicKey.
#### func (RSA3072PublicKey) Len
```go
func (r RSA3072PublicKey) Len() int
```
Len implements SigningPublicKey.
#### func (RSA3072PublicKey) NewVerifier
```go
func (r RSA3072PublicKey) NewVerifier() (Verifier, error)
```
NewVerifier implements SigningPublicKey.
#### type RSA4096PrivateKey
```go
@ -574,6 +853,38 @@ type RSA4096PublicKey [512]byte
```
#### func (RSA4096PublicKey) Bytes
```go
func (r RSA4096PublicKey) Bytes() []byte
```
Bytes implements SigningPublicKey.
#### func (RSA4096PublicKey) Len
```go
func (r RSA4096PublicKey) Len() int
```
Len implements SigningPublicKey.
#### func (RSA4096PublicKey) NewVerifier
```go
func (r RSA4096PublicKey) NewVerifier() (Verifier, error)
```
NewVerifier implements SigningPublicKey.
#### type RecievingPublicKey
```go
type RecievingPublicKey interface {
Len() int
Bytes() []byte
NewEncrypter() (Encrypter, error)
}
```
#### type Signer
```go
@ -618,6 +929,7 @@ type SigningPublicKey interface {
NewVerifier() (Verifier, error)
// get the size of this public key
Len() int
Bytes() []byte
}
```
@ -686,3 +998,9 @@ type Verifier interface {
```
type for verifying signatures
crypto
github.com/go-i2p/go-i2p/lib/crypto

View File

@ -4,9 +4,9 @@ import (
"bytes"
"crypto/aes"
"crypto/cipher"
"fmt"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
)
@ -61,7 +61,7 @@ func (d *AESSymmetricDecrypter) Decrypt(data []byte) ([]byte, error) {
if len(data)%aes.BlockSize != 0 {
log.Error("Ciphertext is not a multiple of the block size")
return nil, fmt.Errorf("ciphertext is not a multiple of the block size")
return nil, oops.Errorf("ciphertext is not a multiple of the block size")
}
plaintext := make([]byte, len(data))
@ -120,18 +120,18 @@ func pkcs7Unpad(data []byte) ([]byte, error) {
length := len(data)
if length == 0 {
log.Error("Data is empty")
return nil, fmt.Errorf("data is empty")
return nil, oops.Errorf("data is empty")
}
padding := int(data[length-1])
if padding == 0 || padding > aes.BlockSize {
log.WithField("padding", padding).Error("Invalid padding")
return nil, fmt.Errorf("invalid padding")
return nil, oops.Errorf("invalid padding")
}
paddingStart := length - padding
for i := paddingStart; i < length; i++ {
if data[i] != byte(padding) {
log.Error("Invalid padding")
return nil, fmt.Errorf("invalid padding")
return nil, oops.Errorf("invalid padding")
}
}
@ -143,7 +143,7 @@ func pkcs7Unpad(data []byte) ([]byte, error) {
// EncryptNoPadding encrypts data using AES-CBC without padding
func (e *AESSymmetricEncrypter) EncryptNoPadding(data []byte) ([]byte, error) {
if len(data)%aes.BlockSize != 0 {
return nil, fmt.Errorf("data length must be a multiple of block size")
return nil, oops.Errorf("data length must be a multiple of block size")
}
block, err := aes.NewCipher(e.Key)
@ -161,7 +161,7 @@ func (e *AESSymmetricEncrypter) EncryptNoPadding(data []byte) ([]byte, error) {
// DecryptNoPadding decrypts data using AES-CBC without padding
func (d *AESSymmetricDecrypter) DecryptNoPadding(data []byte) ([]byte, error) {
if len(data)%aes.BlockSize != 0 {
return nil, fmt.Errorf("data length must be a multiple of block size")
return nil, oops.Errorf("data length must be a multiple of block size")
}
block, err := aes.NewCipher(d.Key)

13
lib/crypto/crypto.svg Normal file
View File

@ -0,0 +1,13 @@
<?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="0pt" height="0pt"
viewBox="0.00 0.00 0.00 0.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 0)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,0 0,0 0,0 0,0"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 584 B

View File

@ -4,16 +4,16 @@ import (
"crypto/rand"
"crypto/sha256"
"crypto/sha512"
"errors"
"io"
"math/big"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
curve25519 "go.step.sm/crypto/x25519"
)
var Curve25519EncryptTooBig = errors.New("failed to encrypt data, too big for Curve25519")
var Curve25519EncryptTooBig = oops.Errorf("failed to encrypt data, too big for Curve25519")
type Curve25519PublicKey []byte
@ -132,14 +132,14 @@ func (v *Curve25519Verifier) VerifyHash(h, sig []byte) (err error) {
}
if len(v.k) != curve25519.PublicKeySize {
log.Error("Invalid Curve25519 public key size")
err = errors.New("failed to verify: invalid curve25519 public key size")
err = oops.Errorf("failed to verify: invalid curve25519 public key size")
return
}
ok := curve25519.Verify(v.k, h, sig)
if !ok {
log.Error("Invalid signature")
err = errors.New("failed to verify: invalid signature")
err = oops.Errorf("failed to verify: invalid signature")
} else {
log.Debug("Hash verified successfully")
}
@ -168,7 +168,7 @@ func (s *Curve25519Signer) Sign(data []byte) (sig []byte, err error) {
if len(s.k) != curve25519.PrivateKeySize {
log.Error("Invalid Curve25519 private key size")
err = errors.New("failed to sign: invalid curve25519 private key size")
err = oops.Errorf("failed to sign: invalid curve25519 private key size")
return
}
h := sha512.Sum512(data)

View File

@ -1,21 +1,22 @@
package crypto
import (
"bytes"
"crypto/ed25519"
"crypto/rand"
"crypto/sha256"
"crypto/sha512"
"errors"
"fmt"
"io"
"math/big"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
)
var (
Ed25519EncryptTooBig = errors.New("failed to encrypt data, too big for Ed25519")
ErrInvalidPublicKeySize = errors.New("failed to verify: invalid ed25519 public key size")
Ed25519EncryptTooBig = oops.Errorf("failed to encrypt data, too big for Ed25519")
ErrInvalidPublicKeySize = oops.Errorf("failed to verify: invalid ed25519 public key size")
)
type Ed25519PublicKey []byte
@ -132,7 +133,7 @@ func (elg Ed25519PublicKey) NewEncrypter() (enc Encrypter, err error) {
log.Debug("Creating new Ed25519 encrypter")
k := createEd25519PublicKey(elg[:])
if k == nil {
return nil, errors.New("invalid public key format")
return nil, oops.Errorf("invalid public key format")
}
enc, err = createEd25519Encryption(k, rand.Reader)
@ -158,14 +159,14 @@ func (v *Ed25519Verifier) VerifyHash(h, sig []byte) (err error) {
}
if len(v.k) != ed25519.PublicKeySize {
log.Error("Invalid Ed25519 public key size")
err = errors.New("failed to verify: invalid ed25519 public key size")
err = oops.Errorf("failed to verify: invalid ed25519 public key size")
return
}
ok := ed25519.Verify(v.k, h, sig)
if !ok {
log.Warn("Invalid Ed25519 signature")
err = errors.New("failed to verify: invalid signature")
err = oops.Errorf("failed to verify: invalid signature")
} else {
log.Debug("Ed25519 signature verified successfully")
}
@ -185,14 +186,84 @@ func (v *Ed25519Verifier) Verify(data, sig []byte) (err error) {
type Ed25519PrivateKey ed25519.PrivateKey
func (k Ed25519PrivateKey) Bytes() []byte {
return k
}
func (k Ed25519PrivateKey) Zero() {
for i := range k {
k[i] = 0
}
}
func (k Ed25519PrivateKey) NewDecrypter() (Decrypter, error) {
// TODO implement me
panic("implement me")
if len(k) != ed25519.PrivateKeySize {
return nil, oops.Errorf("invalid ed25519 private key size")
}
d := &Ed25519Decrypter{
privateKey: k,
}
return d, nil
}
type Ed25519Decrypter struct {
privateKey Ed25519PrivateKey
}
func (d *Ed25519Decrypter) Decrypt(data []byte) ([]byte, error) {
return d.DecryptPadding(data, true)
}
func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte, error) {
if len(data) != 514 && len(data) != 512 {
return nil, oops.Errorf("invalid ciphertext length")
}
// Extract components based on padding
var aBytes, bBytes []byte
if zeroPadding {
aBytes = data[1:258]
bBytes = data[258:]
} else {
aBytes = data[0:256]
bBytes = data[256:]
}
// Convert to big integers
a := new(big.Int).SetBytes(aBytes)
b := new(big.Int).SetBytes(bBytes)
// Compute p = 2^255 - 19
p := new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 255), big.NewInt(19))
// Use private key to decrypt
m := new(big.Int).ModInverse(a, p)
if m == nil {
return nil, oops.Errorf("decryption failed: modular inverse does not exist")
}
decrypted := new(big.Int).Mod(new(big.Int).Mul(b, m), p).Bytes()
// Remove padding and validate hash
if len(decrypted) < 33 {
return nil, oops.Errorf("decryption failed: result too short")
}
hashBytes := decrypted[1:33]
message := decrypted[33:]
// Verify hash
actualHash := sha256.Sum256(message)
if !bytes.Equal(hashBytes, actualHash[:]) {
return nil, oops.Errorf("decryption failed: hash verification failed")
}
return message, nil
}
func (k Ed25519PrivateKey) NewSigner() (Signer, error) {
if len(k) != ed25519.PrivateKeySize {
return nil, errors.New("invalid ed25519 private key size")
return nil, oops.Errorf("invalid ed25519 private key size")
}
return &Ed25519Signer{k: k}, nil
}
@ -201,27 +272,39 @@ func (k Ed25519PrivateKey) Len() int {
return len(k)
}
func (k *Ed25519PrivateKey) Generate() (SigningPrivateKey, error) {
// Generate a new Ed25519 key pair
func (k Ed25519PrivateKey) Generate() (SigningPrivateKey, error) {
_, priv, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
return nil, err
return nil, oops.Errorf("failed to generate ed25519 key: %v", err)
}
// Assign the generated private key to the receiver
*k = Ed25519PrivateKey(priv)
return k, nil
// Copy the full private key (includes public key)
newKey := make(Ed25519PrivateKey, ed25519.PrivateKeySize)
copy(newKey, priv)
return newKey, nil
}
func (k Ed25519PrivateKey) Public() (SigningPublicKey, error) {
fmt.Printf("Ed25519PrivateKey.Public(): len(k) = %d\n", len(k))
if len(k) != ed25519.PrivateKeySize {
return nil, fmt.Errorf("invalid ed25519 private key size: expected %d, got %d", ed25519.PrivateKeySize, len(k))
return nil, oops.Errorf("invalid ed25519 private key size: expected %d, got %d",
ed25519.PrivateKeySize, len(k))
}
pubKey := k[32:]
// Extract public key portion (last 32 bytes)
pubKey := ed25519.PrivateKey(k).Public().(ed25519.PublicKey)
fmt.Printf("Ed25519PrivateKey.Public(): extracted pubKey length: %d\n", len(pubKey))
return Ed25519PublicKey(pubKey), nil
}
func CreateEd25519PrivateKeyFromBytes(data []byte) (Ed25519PrivateKey, error) {
if len(data) != ed25519.PrivateKeySize {
return nil, oops.Errorf("invalid ed25519 private key size: expected %d, got %d",
ed25519.PrivateKeySize, len(data))
}
privKey := make(Ed25519PrivateKey, ed25519.PrivateKeySize)
copy(privKey, data)
return privKey, nil
}
type Ed25519Signer struct {
k []byte
}
@ -231,7 +314,7 @@ func (s *Ed25519Signer) Sign(data []byte) (sig []byte, err error) {
if len(s.k) != ed25519.PrivateKeySize {
log.Error("Invalid Ed25519 private key size")
err = errors.New("failed to sign: invalid ed25519 private key size")
err = oops.Errorf("failed to sign: invalid ed25519 private key size")
return
}
h := sha512.Sum512(data)

View File

@ -4,10 +4,10 @@ import (
"crypto/rand"
"crypto/sha256"
"crypto/subtle"
"errors"
"io"
"math/big"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
"golang.org/x/crypto/openpgp/elgamal"
@ -38,8 +38,8 @@ var (
)
var (
ElgDecryptFail = errors.New("failed to decrypt elgamal encrypted data")
ElgEncryptTooBig = errors.New("failed to encrypt data, too big for elgamal")
ElgDecryptFail = oops.Errorf("failed to decrypt elgamal encrypted data")
ElgEncryptTooBig = oops.Errorf("failed to encrypt data, too big for elgamal")
)
// generate an elgamal key pair

11
lib/crypto/privatekey.go Normal file
View File

@ -0,0 +1,11 @@
package crypto
// PrivateKey is an interface for private keys
type PrivateKey interface {
// Public returns the public key corresponding to this private key
Public() (SigningPublicKey, error)
// Bytes returns the raw bytes of this private key
Bytes() []byte
// Zero clears all sensitive data from the private key
Zero()
}

6
lib/crypto/public.go Normal file
View File

@ -0,0 +1,6 @@
package crypto
type PublicKey interface {
Len() int
Bytes() []byte
}

View File

@ -1,13 +1,11 @@
package crypto
import (
"errors"
)
import "github.com/samber/oops"
var (
ErrBadSignatureSize = errors.New("bad signature size")
ErrInvalidKeyFormat = errors.New("invalid key format")
ErrInvalidSignature = errors.New("invalid signature")
ErrBadSignatureSize = oops.Errorf("bad signature size")
ErrInvalidKeyFormat = oops.Errorf("invalid key format")
ErrInvalidSignature = oops.Errorf("invalid signature")
)
// type for verifying signatures
@ -28,7 +26,7 @@ type SigningPublicKey interface {
Len() int
Bytes() []byte
}
type PublicKey interface {
type RecievingPublicKey interface {
Len() int
Bytes() []byte
NewEncrypter() (Encrypter, error)

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/i2np"
![i2np.svg](i2np.svg)
## Usage
@ -23,11 +26,11 @@ const (
```
```go
var ERR_BUILD_REQUEST_RECORD_NOT_ENOUGH_DATA = errors.New("not enough i2np build request record data")
var ERR_BUILD_REQUEST_RECORD_NOT_ENOUGH_DATA = oops.Errorf("not enough i2np build request record data")
```
```go
var ERR_I2NP_NOT_ENOUGH_DATA = errors.New("not enough i2np header data")
var ERR_I2NP_NOT_ENOUGH_DATA = oops.Errorf("not enough i2np header data")
```
#### func ReadI2NPNTCPData
@ -341,3 +344,9 @@ type VariableTunnelBuildReply struct {
BuildResponseRecords []BuildResponseRecord
}
```
i2np
github.com/go-i2p/go-i2p/lib/i2np

View File

@ -1,15 +1,15 @@
package i2np
import (
"errors"
"time"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
common "github.com/go-i2p/go-i2p/lib/common/data"
"github.com/go-i2p/go-i2p/lib/common/session_key"
"github.com/go-i2p/go-i2p/lib/tunnel"
"github.com/go-i2p/go-i2p/lib/util/logger"
"github.com/go-i2p/logger"
)
var log = logger.GetGoI2PLogger()
@ -173,7 +173,7 @@ type BuildRequestRecord struct {
Padding [29]byte
}
var ERR_BUILD_REQUEST_RECORD_NOT_ENOUGH_DATA = errors.New("not enough i2np build request record data")
var ERR_BUILD_REQUEST_RECORD_NOT_ENOUGH_DATA = oops.Errorf("not enough i2np build request record data")
func ReadBuildRequestRecord(data []byte) (BuildRequestRecord, error) {
log.Debug("Reading BuildRequestRecord")

View File

@ -2,6 +2,9 @@
--
import "github.com/go-i2p/go-i2p/lib/i2np/fuzz/header"
![exportable.svg](exportable.svg)
## Usage
@ -10,3 +13,9 @@
```go
func Fuzz(data []byte) int
```
exportable
github.com/go-i2p/go-i2p/lib/i2np/fuzz/header

View File

@ -0,0 +1,46 @@
<?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="318pt" height="98pt"
viewBox="0.00 0.00 317.50 98.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 98)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-98 317.505,-98 317.505,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-90 309.505,-90 309.505,-8 8,-8"/>
<text text-anchor="middle" x="158.7525" y="-69.8" font-family="Arial" font-size="18.00" fill="#000000">exportable</text>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/i2np/fuzz/header.Fuzz -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/i2np/fuzz/header.Fuzz</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/i2np/fuzz/header.Fuzz | defined in fuzz.go:5&#10;at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/i2np.ReadI2NPNTCPHeader]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M58,-52C58,-52 28,-52 28,-52 22,-52 16,-46 16,-40 16,-40 16,-28 16,-28 16,-22 22,-16 28,-16 28,-16 58,-16 58,-16 64,-16 70,-22 70,-28 70,-28 70,-40 70,-40 70,-46 64,-52 58,-52"/>
<text text-anchor="middle" x="43" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">Fuzz</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/i2np.ReadI2NPNTCPHeader -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/i2np.ReadI2NPNTCPHeader</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/i2np.ReadI2NPNTCPHeader | defined in header.go:97">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M289.2583,-52C289.2583,-52 155.2467,-52 155.2467,-52 149.2467,-52 143.2467,-46 143.2467,-40 143.2467,-40 143.2467,-28 143.2467,-28 143.2467,-22 149.2467,-16 155.2467,-16 155.2467,-16 289.2583,-16 289.2583,-16 295.2583,-16 301.2583,-22 301.2583,-28 301.2583,-28 301.2583,-40 301.2583,-40 301.2583,-46 295.2583,-52 289.2583,-52"/>
<text text-anchor="middle" x="222.2525" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">i2np</text>
<text text-anchor="middle" x="222.2525" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">ReadI2NPNTCPHeader</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/i2np/fuzz/header.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/i2np.ReadI2NPNTCPHeader -->
<g id="edge1" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/i2np/fuzz/header.Fuzz&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/i2np.ReadI2NPNTCPHeader</title>
<g id="a_edge1"><a xlink:title="at fuzz.go:6: calling [github.com/go&#45;i2p/go&#45;i2p/lib/i2np.ReadI2NPNTCPHeader]">
<path fill="none" stroke="#8b4513" d="M70.2246,-34C87.2023,-34 110.1106,-34 132.9875,-34"/>
<polygon fill="#8b4513" stroke="#8b4513" points="133.1223,-37.5001 143.1222,-34 133.1222,-30.5001 133.1223,-37.5001"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -1,9 +1,9 @@
package i2np
import (
"errors"
"time"
"github.com/samber/oops"
"github.com/sirupsen/logrus"
datalib "github.com/go-i2p/go-i2p/lib/common/data"
@ -90,7 +90,7 @@ type I2NPSSUHeader struct {
Expiration time.Time
}
var ERR_I2NP_NOT_ENOUGH_DATA = errors.New("not enough i2np header data")
var ERR_I2NP_NOT_ENOUGH_DATA = oops.Errorf("not enough i2np header data")
// Read an entire I2NP message and return the parsed header
// with embedded encrypted data

1104
lib/i2np/i2np.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 111 KiB

105
lib/keys/README.md Normal file
View File

@ -0,0 +1,105 @@
# keys
--
import "github.com/go-i2p/go-i2p/lib/keys"
![keys.svg](keys.svg)
## Usage
#### type KeyStore
```go
type KeyStore interface {
KeyID() string
// GetKeys returns the public and private keys
GetKeys() (publicKey crypto.PublicKey, privateKey crypto.PrivateKey, err error)
// StoreKeys stores the keys
StoreKeys() error
}
```
KeyStore is an interface for storing and retrieving keys
#### type KeyStoreImpl
```go
type KeyStoreImpl struct {
}
```
#### func NewKeyStoreImpl
```go
func NewKeyStoreImpl(dir, name string, privateKey crypto.PrivateKey) *KeyStoreImpl
```
#### func (*KeyStoreImpl) GetKeys
```go
func (ks *KeyStoreImpl) GetKeys() (crypto.PublicKey, crypto.PrivateKey, error)
```
#### func (*KeyStoreImpl) KeyID
```go
func (ks *KeyStoreImpl) KeyID() string
```
#### func (*KeyStoreImpl) StoreKeys
```go
func (ks *KeyStoreImpl) StoreKeys() error
```
#### type RouterInfoKeystore
```go
type RouterInfoKeystore struct {
*sntp.RouterTimestamper
}
```
RouterInfoKeystore is an implementation of KeyStore for storing and retrieving
RouterInfo private keys and exporting RouterInfos
#### func NewRouterInfoKeystore
```go
func NewRouterInfoKeystore(dir, name string) (*RouterInfoKeystore, error)
```
NewRouterInfoKeystore creates a new RouterInfoKeystore with fresh and new
private keys it accepts a directory to store the keys in and a name for the keys
then it generates new private keys for the routerInfo if none exist
#### func (*RouterInfoKeystore) ConstructRouterInfo
```go
func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.RouterAddress) (*router_info.RouterInfo, error)
```
#### func (*RouterInfoKeystore) GetKeys
```go
func (ks *RouterInfoKeystore) GetKeys() (crypto.PublicKey, crypto.PrivateKey, error)
```
#### func (*RouterInfoKeystore) KeyID
```go
func (ks *RouterInfoKeystore) KeyID() string
```
#### func (*RouterInfoKeystore) StoreKeys
```go
func (ks *RouterInfoKeystore) StoreKeys() error
```
keys
github.com/go-i2p/go-i2p/lib/keys

375
lib/keys/keys.svg Normal file
View File

@ -0,0 +1,375 @@
<?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="699pt" height="783pt"
viewBox="0.00 0.00 698.59 783.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 783)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-783 698.5894,-783 698.5894,0 0,0"/>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-8 8,-775 690.5894,-775 690.5894,-8 8,-8"/>
<text text-anchor="middle" x="349.2947" y="-754.8" font-family="Arial" font-size="18.00" fill="#000000">keys</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate</title>
<g id="a_clust5"><a xlink:title="type: github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M535.0977,-451C535.0977,-451 634.2689,-451 634.2689,-451 640.2689,-451 646.2689,-457 646.2689,-463 646.2689,-463 646.2689,-578 646.2689,-578 646.2689,-584 640.2689,-590 634.2689,-590 634.2689,-590 535.0977,-590 535.0977,-590 529.0977,-590 523.0977,-584 523.0977,-578 523.0977,-578 523.0977,-463 523.0977,-463 523.0977,-457 529.0977,-451 535.0977,-451"/>
<text text-anchor="middle" x="584.6833" y="-459.5" font-family="Arial" font-size="15.00" fill="#222222">(KeyCertificate)</text>
</a>
</g>
</g>
<g id="clust4" class="cluster">
<title>cluster_*github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper</title>
<g id="a_clust4"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M515.4217,-365C515.4217,-365 654.9449,-365 654.9449,-365 660.9449,-365 666.9449,-371 666.9449,-377 666.9449,-377 666.9449,-431 666.9449,-431 666.9449,-437 660.9449,-443 654.9449,-443 654.9449,-443 515.4217,-443 515.4217,-443 509.4217,-443 503.4217,-437 503.4217,-431 503.4217,-431 503.4217,-377 503.4217,-377 503.4217,-371 509.4217,-365 515.4217,-365"/>
<text text-anchor="middle" x="585.1833" y="-373.5" font-family="Arial" font-size="15.00" fill="#222222">(*RouterTimestamper)</text>
</a>
</g>
</g>
<g id="clust3" class="cluster">
<title>cluster_*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore</title>
<g id="a_clust3"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore">
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M266.6495,-598C266.6495,-598 617.1721,-598 617.1721,-598 623.1721,-598 629.1721,-604 629.1721,-610 629.1721,-610 629.1721,-725 629.1721,-725 629.1721,-731 623.1721,-737 617.1721,-737 617.1721,-737 266.6495,-737 266.6495,-737 260.6495,-737 254.6495,-731 254.6495,-725 254.6495,-725 254.6495,-610 254.6495,-610 254.6495,-604 260.6495,-598 266.6495,-598"/>
<text text-anchor="middle" x="441.9108" y="-606.5" font-family="Arial" font-size="15.00" fill="#222222">(*RouterInfoKeystore)</text>
</a>
</g>
</g>
<g id="clust2" class="cluster">
<title>cluster_*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl</title>
<g id="a_clust2"><a xlink:title="type: *github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl">
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M60.0344,-347C60.0344,-347 359.6243,-347 359.6243,-347 365.6243,-347 371.6243,-353 371.6243,-359 371.6243,-359 371.6243,-413 371.6243,-413 371.6243,-419 365.6243,-425 359.6243,-425 359.6243,-425 60.0344,-425 60.0344,-425 54.0344,-425 48.0344,-419 48.0344,-413 48.0344,-413 48.0344,-359 48.0344,-359 48.0344,-353 54.0344,-347 60.0344,-347"/>
<text text-anchor="middle" x="209.8294" y="-355.5" font-family="Arial" font-size="15.00" fill="#222222">(*KeyStoreImpl)</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore -->
<g id="node1" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore</title>
<g id="a_node1"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore | defined in routerinfo_keystore.go:36&#10;at routerinfo_keystore.go:61: calling [github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.NewRouterTimestamper]&#10;at routerinfo_keystore.go:46: calling [github.com/go&#45;i2p/go&#45;i2p/lib/keys.generateNewKey]&#10;at routerinfo_keystore.go:55: calling [github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M166.575,-113C166.575,-113 27.808,-113 27.808,-113 21.808,-113 15.808,-107 15.808,-101 15.808,-101 15.808,-89 15.808,-89 15.808,-83 21.808,-77 27.808,-77 27.808,-77 166.575,-77 166.575,-77 172.575,-77 178.575,-83 178.575,-89 178.575,-89 178.575,-101 178.575,-101 178.575,-107 172.575,-113 166.575,-113"/>
<text text-anchor="middle" x="97.1915" y="-90.8" font-family="Verdana" font-size="14.00" fill="#000000">NewRouterInfoKeystore</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/keys.generateNewKey -->
<g id="node2" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/keys.generateNewKey</title>
<g id="a_node2"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/keys.generateNewKey | defined in routerinfo_keystore.go:70">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M381.2388,-174C381.2388,-174 283.9214,-174 283.9214,-174 277.9214,-174 271.9214,-168 271.9214,-162 271.9214,-162 271.9214,-150 271.9214,-150 271.9214,-144 277.9214,-138 283.9214,-138 283.9214,-138 381.2388,-138 381.2388,-138 387.2388,-138 393.2388,-144 393.2388,-150 393.2388,-150 393.2388,-162 393.2388,-162 393.2388,-168 387.2388,-174 381.2388,-174"/>
<text text-anchor="middle" x="332.5801" y="-151.8" font-family="Verdana" font-size="14.00" fill="#000000">generateNewKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/keys.generateNewKey -->
<g id="edge14" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/keys.generateNewKey</title>
<g id="a_edge14"><a xlink:title="at routerinfo_keystore.go:46: calling [github.com/go&#45;i2p/go&#45;i2p/lib/keys.generateNewKey]">
<path fill="none" stroke="#000000" d="M166.8604,-113.0544C196.8229,-120.8191 231.7977,-129.8826 261.8743,-137.6769"/>
<polygon fill="#000000" stroke="#000000" points="261.3138,-141.1472 271.872,-140.2678 263.0698,-134.371 261.3138,-141.1472"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.NewRouterTimestamper -->
<g id="node3" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.NewRouterTimestamper</title>
<g id="a_node3"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.NewRouterTimestamper | defined in router_timestamper.go:55">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M401.9748,-52C401.9748,-52 263.1854,-52 263.1854,-52 257.1854,-52 251.1854,-46 251.1854,-40 251.1854,-40 251.1854,-28 251.1854,-28 251.1854,-22 257.1854,-16 263.1854,-16 263.1854,-16 401.9748,-16 401.9748,-16 407.9748,-16 413.9748,-22 413.9748,-28 413.9748,-28 413.9748,-40 413.9748,-40 413.9748,-46 407.9748,-52 401.9748,-52"/>
<text text-anchor="middle" x="332.5801" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">sntp</text>
<text text-anchor="middle" x="332.5801" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">NewRouterTimestamper</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.NewRouterTimestamper -->
<g id="edge12" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.NewRouterTimestamper</title>
<g id="a_edge12"><a xlink:title="at routerinfo_keystore.go:61: calling [github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.NewRouterTimestamper]">
<path fill="none" stroke="#8b4513" d="M166.8604,-76.9456C194.0247,-69.9061 225.3088,-61.7989 253.3276,-54.538"/>
<polygon fill="#8b4513" stroke="#8b4513" points="254.2877,-57.9048 263.0899,-52.0081 252.5317,-51.1287 254.2877,-57.9048"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey -->
<g id="node4" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey</title>
<g id="a_node4"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey | defined in routerinfo_keystore.go:81&#10;at routerinfo_keystore.go:84: calling [github.com/samber/oops.Errorf]">
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M379.6755,-113C379.6755,-113 285.4847,-113 285.4847,-113 279.4847,-113 273.4847,-107 273.4847,-101 273.4847,-101 273.4847,-89 273.4847,-89 273.4847,-83 279.4847,-77 285.4847,-77 285.4847,-77 379.6755,-77 379.6755,-77 385.6755,-77 391.6755,-83 391.6755,-89 391.6755,-89 391.6755,-101 391.6755,-101 391.6755,-107 385.6755,-113 379.6755,-113"/>
<text text-anchor="middle" x="332.5801" y="-90.8" font-family="Verdana" font-size="14.00" fill="#000000">loadExistingKey</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey -->
<g id="edge16" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/keys.NewRouterInfoKeystore&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey</title>
<g id="a_edge16"><a xlink:title="at routerinfo_keystore.go:55: calling [github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey]">
<path fill="none" stroke="#000000" d="M178.5285,-95C206.0973,-95 236.6175,-95 263.1708,-95"/>
<polygon fill="#000000" stroke="#000000" points="263.5193,-98.5001 273.5192,-95 263.5192,-91.5001 263.5193,-98.5001"/>
</a>
</g>
</g>
<!-- github.com/samber/oops.Errorf -->
<g id="node5" class="node">
<title>github.com/samber/oops.Errorf</title>
<g id="a_node5"><a xlink:title="github.com/samber/oops.Errorf | defined in oops.go:34">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M601.8786,-52C601.8786,-52 567.488,-52 567.488,-52 561.488,-52 555.488,-46 555.488,-40 555.488,-40 555.488,-28 555.488,-28 555.488,-22 561.488,-16 567.488,-16 567.488,-16 601.8786,-16 601.8786,-16 607.8786,-16 613.8786,-22 613.8786,-28 613.8786,-28 613.8786,-40 613.8786,-40 613.8786,-46 607.8786,-52 601.8786,-52"/>
<text text-anchor="middle" x="584.6833" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">oops</text>
<text text-anchor="middle" x="584.6833" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">Errorf</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge15" class="edge">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/keys.loadExistingKey&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge15"><a xlink:title="at routerinfo_keystore.go:84: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M391.6871,-80.6982C439.0475,-69.2387 504.1698,-53.4814 545.3431,-43.5189"/>
<polygon fill="#8b4513" stroke="#8b4513" points="546.3731,-46.8708 555.2695,-41.1171 544.7268,-40.0671 546.3731,-46.8708"/>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt -->
<g id="node6" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt</title>
<g id="a_node6"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt | defined in integer.go:68">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M640.6371,-113C640.6371,-113 528.7295,-113 528.7295,-113 522.7295,-113 516.7295,-107 516.7295,-101 516.7295,-101 516.7295,-89 516.7295,-89 516.7295,-83 522.7295,-77 528.7295,-77 528.7295,-77 640.6371,-77 640.6371,-77 646.6371,-77 652.6371,-83 652.6371,-89 652.6371,-89 652.6371,-101 652.6371,-101 652.6371,-107 646.6371,-113 640.6371,-113"/>
<text text-anchor="middle" x="584.6833" y="-99.2" font-family="Verdana" font-size="14.00" fill="#000000">data</text>
<text text-anchor="middle" x="584.6833" y="-82.4" font-family="Verdana" font-size="14.00" fill="#000000">NewIntegerFromInt</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType -->
<g id="node7" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType</title>
<g id="a_node7"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType | defined in certificate.go:252">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M655.9529,-174C655.9529,-174 513.4137,-174 513.4137,-174 507.4137,-174 501.4137,-168 501.4137,-162 501.4137,-162 501.4137,-150 501.4137,-150 501.4137,-144 507.4137,-138 513.4137,-138 513.4137,-138 655.9529,-138 655.9529,-138 661.9529,-138 667.9529,-144 667.9529,-150 667.9529,-150 667.9529,-162 667.9529,-162 667.9529,-168 661.9529,-174 655.9529,-174"/>
<text text-anchor="middle" x="584.6833" y="-160.2" font-family="Verdana" font-size="14.00" fill="#000000">certificate</text>
<text text-anchor="middle" x="584.6833" y="-143.4" font-family="Verdana" font-size="14.00" fill="#000000">NewCertificateWithType</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate -->
<g id="node8" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate</title>
<g id="a_node8"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate | defined in key_certificate.go:395">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M670.4956,-235C670.4956,-235 498.871,-235 498.871,-235 492.871,-235 486.871,-229 486.871,-223 486.871,-223 486.871,-211 486.871,-211 486.871,-205 492.871,-199 498.871,-199 498.871,-199 670.4956,-199 670.4956,-199 676.4956,-199 682.4956,-205 682.4956,-211 682.4956,-211 682.4956,-223 682.4956,-223 682.4956,-229 676.4956,-235 670.4956,-235"/>
<text text-anchor="middle" x="584.6833" y="-221.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="584.6833" y="-204.4" font-family="Verdana" font-size="14.00" fill="#000000">KeyCertificateFromCertificate</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity -->
<g id="node9" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity</title>
<g id="a_node9"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity | defined in router_identity.go:55">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M638.7605,-296C638.7605,-296 530.6061,-296 530.6061,-296 524.6061,-296 518.6061,-290 518.6061,-284 518.6061,-284 518.6061,-272 518.6061,-272 518.6061,-266 524.6061,-260 530.6061,-260 530.6061,-260 638.7605,-260 638.7605,-260 644.7605,-260 650.7605,-266 650.7605,-272 650.7605,-272 650.7605,-284 650.7605,-284 650.7605,-290 644.7605,-296 638.7605,-296"/>
<text text-anchor="middle" x="584.6833" y="-282.2" font-family="Verdana" font-size="14.00" fill="#000000">router_identity</text>
<text text-anchor="middle" x="584.6833" y="-265.4" font-family="Verdana" font-size="14.00" fill="#000000">NewRouterIdentity</text>
</a>
</g>
</g>
<!-- github.com/go&#45;i2p/go&#45;i2p/lib/common/router_info.NewRouterInfo -->
<g id="node10" class="node">
<title>github.com/go&#45;i2p/go&#45;i2p/lib/common/router_info.NewRouterInfo</title>
<g id="a_node10"><a xlink:title="github.com/go&#45;i2p/go&#45;i2p/lib/common/router_info.NewRouterInfo | defined in router_info.go:370">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M628.5348,-357C628.5348,-357 540.8318,-357 540.8318,-357 534.8318,-357 528.8318,-351 528.8318,-345 528.8318,-345 528.8318,-333 528.8318,-333 528.8318,-327 534.8318,-321 540.8318,-321 540.8318,-321 628.5348,-321 628.5348,-321 634.5348,-321 640.5348,-327 640.5348,-333 640.5348,-333 640.5348,-345 640.5348,-345 640.5348,-351 634.5348,-357 628.5348,-357"/>
<text text-anchor="middle" x="584.6833" y="-343.2" font-family="Verdana" font-size="14.00" fill="#000000">router_info</text>
<text text-anchor="middle" x="584.6833" y="-326.4" font-family="Verdana" font-size="14.00" fill="#000000">NewRouterInfo</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).StoreKeys -->
<g id="node11" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).StoreKeys</title>
<g id="a_node11"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).StoreKeys | defined in types.go:56&#10;at types.go:65: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).KeyID]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M126.5063,-417C126.5063,-417 67.8767,-417 67.8767,-417 61.8767,-417 55.8767,-411 55.8767,-405 55.8767,-405 55.8767,-393 55.8767,-393 55.8767,-387 61.8767,-381 67.8767,-381 67.8767,-381 126.5063,-381 126.5063,-381 132.5063,-381 138.5063,-387 138.5063,-393 138.5063,-393 138.5063,-405 138.5063,-405 138.5063,-411 132.5063,-417 126.5063,-417"/>
<text text-anchor="middle" x="97.1915" y="-394.8" font-family="Verdana" font-size="14.00" fill="#000000">StoreKeys</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).KeyID -->
<g id="node12" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).KeyID</title>
<g id="a_node12"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).KeyID | defined in types.go:33">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M351.6686,-417C351.6686,-417 313.4916,-417 313.4916,-417 307.4916,-417 301.4916,-411 301.4916,-405 301.4916,-405 301.4916,-393 301.4916,-393 301.4916,-387 307.4916,-381 313.4916,-381 313.4916,-381 351.6686,-381 351.6686,-381 357.6686,-381 363.6686,-387 363.6686,-393 363.6686,-393 363.6686,-405 363.6686,-405 363.6686,-411 357.6686,-417 351.6686,-417"/>
<text text-anchor="middle" x="332.5801" y="-394.8" font-family="Verdana" font-size="14.00" fill="#000000">KeyID</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).StoreKeys&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).KeyID -->
<g id="edge11" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).StoreKeys&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).KeyID</title>
<g id="a_edge11"><a xlink:title="at types.go:65: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.KeyStoreImpl).KeyID]">
<path fill="none" stroke="#000000" d="M138.4624,-399C181.461,-399 248.436,-399 291.4006,-399"/>
<polygon fill="#000000" stroke="#000000" points="291.5116,-402.5001 301.5116,-399 291.5115,-395.5001 291.5116,-402.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).StoreKeys -->
<g id="node13" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).StoreKeys</title>
<g id="a_node13"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).StoreKeys | defined in routerinfo_keystore.go:99&#10;at routerinfo_keystore.go:107: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).KeyID]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M361.8949,-729C361.8949,-729 303.2653,-729 303.2653,-729 297.2653,-729 291.2653,-723 291.2653,-717 291.2653,-717 291.2653,-705 291.2653,-705 291.2653,-699 297.2653,-693 303.2653,-693 303.2653,-693 361.8949,-693 361.8949,-693 367.8949,-693 373.8949,-699 373.8949,-705 373.8949,-705 373.8949,-717 373.8949,-717 373.8949,-723 367.8949,-729 361.8949,-729"/>
<text text-anchor="middle" x="332.5801" y="-706.8" font-family="Verdana" font-size="14.00" fill="#000000">StoreKeys</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).KeyID -->
<g id="node14" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).KeyID</title>
<g id="a_node14"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).KeyID | defined in routerinfo_keystore.go:111">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M603.7718,-729C603.7718,-729 565.5948,-729 565.5948,-729 559.5948,-729 553.5948,-723 553.5948,-717 553.5948,-717 553.5948,-705 553.5948,-705 553.5948,-699 559.5948,-693 565.5948,-693 565.5948,-693 603.7718,-693 603.7718,-693 609.7718,-693 615.7718,-699 615.7718,-705 615.7718,-705 615.7718,-717 615.7718,-717 615.7718,-723 609.7718,-729 603.7718,-729"/>
<text text-anchor="middle" x="584.6833" y="-706.8" font-family="Verdana" font-size="14.00" fill="#000000">KeyID</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).StoreKeys&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).KeyID -->
<g id="edge6" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).StoreKeys&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).KeyID</title>
<g id="a_edge6"><a xlink:title="at routerinfo_keystore.go:107: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).KeyID]">
<path fill="none" stroke="#000000" d="M373.9275,-711C420.6798,-711 496.3667,-711 543.1822,-711"/>
<polygon fill="#000000" stroke="#000000" points="543.2839,-714.5001 553.2838,-711 543.2838,-707.5001 543.2839,-714.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo -->
<g id="node15" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo</title>
<g id="a_node15"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo | defined in routerinfo_keystore.go:125&#10;at routerinfo_keystore.go:166: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity]&#10;at routerinfo_keystore.go:177: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper).GetCurrentTime]&#10;at routerinfo_keystore.go:127: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).GetKeys]&#10;at routerinfo_keystore.go:129: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:136: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:140: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:147: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:153: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:162: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:173: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:194: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:134: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt]&#10;at routerinfo_keystore.go:138: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt]&#10;at routerinfo_keystore.go:151: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate]&#10;at routerinfo_keystore.go:156: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize]&#10;at routerinfo_keystore.go:157: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize]&#10;at routerinfo_keystore.go:185: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/router_info.NewRouterInfo]&#10;at routerinfo_keystore.go:145: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType]">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M390.4414,-668C390.4414,-668 274.7188,-668 274.7188,-668 268.7188,-668 262.7188,-662 262.7188,-656 262.7188,-656 262.7188,-644 262.7188,-644 262.7188,-638 268.7188,-632 274.7188,-632 274.7188,-632 390.4414,-632 390.4414,-632 396.4414,-632 402.4414,-638 402.4414,-644 402.4414,-644 402.4414,-656 402.4414,-656 402.4414,-662 396.4414,-668 390.4414,-668"/>
<text text-anchor="middle" x="332.5801" y="-645.8" font-family="Verdana" font-size="14.00" fill="#000000">ConstructRouterInfo</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/samber/oops.Errorf -->
<g id="edge4" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/samber/oops.Errorf</title>
<g id="a_edge4"><a xlink:title="at routerinfo_keystore.go:129: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:136: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:140: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:147: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:153: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:162: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:173: calling [github.com/samber/oops.Errorf]&#10;at routerinfo_keystore.go:194: calling [github.com/samber/oops.Errorf]">
<path fill="none" stroke="#8b4513" d="M340.8224,-631.974C357.3427,-595.0726 394.565,-507.912 413.7772,-431 453.9757,-270.074 366.7231,-179.4557 486.7772,-65 502.6013,-49.9138 525.7299,-42.1675 545.5344,-38.1909"/>
<polygon fill="#8b4513" stroke="#8b4513" points="546.2873,-41.6123 555.5316,-36.4361 545.077,-34.7177 546.2873,-41.6123"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt -->
<g id="edge5" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt</title>
<g id="a_edge5"><a xlink:title="at routerinfo_keystore.go:134: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt]&#10;at routerinfo_keystore.go:138: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/data.NewIntegerFromInt]">
<path fill="none" stroke="#8b4513" d="M340.5424,-631.9008C356.5529,-594.8661 392.894,-507.4752 413.7772,-431 450.4946,-296.5389 386.6461,-222.9624 486.7772,-126 492.8071,-120.1609 499.9302,-115.4211 507.5407,-111.5736"/>
<polygon fill="#8b4513" stroke="#8b4513" points="508.9888,-114.7601 516.6622,-107.4546 506.1079,-108.3804 508.9888,-114.7601"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType -->
<g id="edge13" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType</title>
<g id="a_edge13"><a xlink:title="at routerinfo_keystore.go:145: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/certificate.NewCertificateWithType]">
<path fill="none" stroke="#8b4513" d="M339.7144,-631.9698C354.36,-594.704 388.5591,-506.371 413.7772,-431 449.6932,-323.6553 407.3775,-267.6754 486.7772,-187 489.4348,-184.2997 492.3258,-181.8341 495.3931,-179.5828"/>
<polygon fill="#8b4513" stroke="#8b4513" points="497.3754,-182.4692 503.8852,-174.1102 493.5835,-176.5852 497.3754,-182.4692"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate -->
<g id="edge7" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate</title>
<g id="a_edge7"><a xlink:title="at routerinfo_keystore.go:151: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificateFromCertificate]">
<path fill="none" stroke="#8b4513" d="M339.3248,-631.7781C368.0663,-554.2094 479.2026,-255.1359 486.7772,-248 489.7579,-245.1919 492.992,-242.6381 496.4098,-240.3157"/>
<polygon fill="#8b4513" stroke="#8b4513" points="498.4764,-243.1572 505.2447,-235.006 494.8705,-237.1573 498.4764,-243.1572"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity -->
<g id="edge1" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity</title>
<g id="a_edge1"><a xlink:title="at routerinfo_keystore.go:166: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/router_identity.NewRouterIdentity]">
<path fill="none" stroke="#8b4513" d="M338.5426,-631.9132C359.8653,-568.2129 433.877,-355.5958 486.7772,-309 493.3874,-303.1776 501.0927,-298.4479 509.2244,-294.6061"/>
<polygon fill="#8b4513" stroke="#8b4513" points="510.7213,-297.7728 518.5508,-290.6348 507.9789,-291.3324 510.7213,-297.7728"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/router_info.NewRouterInfo -->
<g id="edge10" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;github.com/go&#45;i2p/go&#45;i2p/lib/common/router_info.NewRouterInfo</title>
<g id="a_edge10"><a xlink:title="at routerinfo_keystore.go:185: calling [github.com/go&#45;i2p/go&#45;i2p/lib/common/router_info.NewRouterInfo]">
<path fill="none" stroke="#8b4513" d="M336.7024,-631.6348C349.2815,-580.0653 392.2195,-433.0101 486.7772,-361 496.1976,-353.8259 507.5173,-348.9105 519.0637,-345.5601"/>
<polygon fill="#8b4513" stroke="#8b4513" points="519.9452,-348.9474 528.7793,-343.0986 518.226,-342.1618 519.9452,-348.9474"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).GetKeys -->
<g id="node16" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).GetKeys</title>
<g id="a_node16"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).GetKeys | defined in routerinfo_keystore.go:91">
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M609.1609,-668C609.1609,-668 560.2057,-668 560.2057,-668 554.2057,-668 548.2057,-662 548.2057,-656 548.2057,-656 548.2057,-644 548.2057,-644 548.2057,-638 554.2057,-632 560.2057,-632 560.2057,-632 609.1609,-632 609.1609,-632 615.1609,-632 621.1609,-638 621.1609,-644 621.1609,-644 621.1609,-656 621.1609,-656 621.1609,-662 615.1609,-668 609.1609,-668"/>
<text text-anchor="middle" x="584.6833" y="-645.8" font-family="Verdana" font-size="14.00" fill="#000000">GetKeys</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).GetKeys -->
<g id="edge3" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).GetKeys</title>
<g id="a_edge3"><a xlink:title="at routerinfo_keystore.go:127: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).GetKeys]">
<path fill="none" stroke="#000000" d="M402.4701,-650C445.626,-650 499.8217,-650 537.8465,-650"/>
<polygon fill="#000000" stroke="#000000" points="538.1201,-653.5001 548.1201,-650 538.12,-646.5001 538.1201,-653.5001"/>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper).GetCurrentTime -->
<g id="node17" class="node">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper).GetCurrentTime</title>
<g id="a_node17"><a xlink:title="(*github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper).GetCurrentTime | defined in router_timestamper.go:397">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M630.7075,-435C630.7075,-435 538.6591,-435 538.6591,-435 532.6591,-435 526.6591,-429 526.6591,-423 526.6591,-423 526.6591,-411 526.6591,-411 526.6591,-405 532.6591,-399 538.6591,-399 538.6591,-399 630.7075,-399 630.7075,-399 636.7075,-399 642.7075,-405 642.7075,-411 642.7075,-411 642.7075,-423 642.7075,-423 642.7075,-429 636.7075,-435 630.7075,-435"/>
<text text-anchor="middle" x="584.6833" y="-421.2" font-family="Verdana" font-size="14.00" fill="#000000">sntp</text>
<text text-anchor="middle" x="584.6833" y="-404.4" font-family="Verdana" font-size="14.00" fill="#000000">GetCurrentTime</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper).GetCurrentTime -->
<g id="edge2" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;(*github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper).GetCurrentTime</title>
<g id="a_edge2"><a xlink:title="at routerinfo_keystore.go:177: calling [(*github.com/go&#45;i2p/go&#45;i2p/lib/util/time/sntp.RouterTimestamper).GetCurrentTime]">
<path fill="none" stroke="#8b4513" d="M341.0985,-631.8057C360.8147,-591.713 413.5611,-495.3295 486.7772,-445 495.8122,-438.7893 506.2153,-433.9444 516.7935,-430.1682"/>
<polygon fill="#8b4513" stroke="#8b4513" points="518.1029,-433.4226 526.5231,-426.9922 515.9306,-426.7682 518.1029,-433.4226"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize -->
<g id="node18" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize</title>
<g id="a_node18"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize | defined in key_certificate.go:336">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M626.3546,-521C626.3546,-521 543.012,-521 543.012,-521 537.012,-521 531.012,-515 531.012,-509 531.012,-509 531.012,-497 531.012,-497 531.012,-491 537.012,-485 543.012,-485 543.012,-485 626.3546,-485 626.3546,-485 632.3546,-485 638.3546,-491 638.3546,-497 638.3546,-497 638.3546,-509 638.3546,-509 638.3546,-515 632.3546,-521 626.3546,-521"/>
<text text-anchor="middle" x="584.6833" y="-507.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="584.6833" y="-490.4" font-family="Verdana" font-size="14.00" fill="#000000">CryptoSize</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize -->
<g id="edge8" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize</title>
<g id="a_edge8"><a xlink:title="at routerinfo_keystore.go:156: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).CryptoSize]">
<path fill="none" stroke="#8b4513" d="M352.0391,-631.8627C379.9286,-606.7254 433.7711,-561.3133 486.7772,-534 497.5495,-528.4492 509.5032,-523.6606 521.2517,-519.6209"/>
<polygon fill="#8b4513" stroke="#8b4513" points="522.6344,-522.8507 531.0416,-516.4033 520.4487,-516.2006 522.6344,-522.8507"/>
</a>
</g>
</g>
<!-- (github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize -->
<g id="node19" class="node">
<title>(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize</title>
<g id="a_node19"><a xlink:title="(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize | defined in key_certificate.go:308">
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M626.3546,-582C626.3546,-582 543.012,-582 543.012,-582 537.012,-582 531.012,-576 531.012,-570 531.012,-570 531.012,-558 531.012,-558 531.012,-552 537.012,-546 543.012,-546 543.012,-546 626.3546,-546 626.3546,-546 632.3546,-546 638.3546,-552 638.3546,-558 638.3546,-558 638.3546,-570 638.3546,-570 638.3546,-576 632.3546,-582 626.3546,-582"/>
<text text-anchor="middle" x="584.6833" y="-568.2" font-family="Verdana" font-size="14.00" fill="#000000">key_certificate</text>
<text text-anchor="middle" x="584.6833" y="-551.4" font-family="Verdana" font-size="14.00" fill="#000000">SignatureSize</text>
</a>
</g>
</g>
<!-- (*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize -->
<g id="edge9" class="edge">
<title>(*github.com/go&#45;i2p/go&#45;i2p/lib/keys.RouterInfoKeystore).ConstructRouterInfo&#45;&gt;(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize</title>
<g id="a_edge9"><a xlink:title="at routerinfo_keystore.go:157: calling [(github.com/go&#45;i2p/go&#45;i2p/lib/common/key_certificate.KeyCertificate).SignatureSize]">
<path fill="none" stroke="#8b4513" d="M377.778,-631.8922C408.3304,-619.9262 449.7078,-604.2499 486.7772,-592 497.9243,-588.3163 509.8762,-584.6597 521.4653,-581.2639"/>
<polygon fill="#8b4513" stroke="#8b4513" points="522.4569,-584.6206 531.0892,-578.4779 520.5103,-577.8967 522.4569,-584.6206"/>
</a>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 37 KiB

Some files were not shown because too many files have changed in this diff Show More