Switch to oops for error configuration so we can get more info about failures

This commit is contained in:
eyedeekay
2025-02-26 19:22:48 -05:00
parent 3d6a08a76b
commit ae4970b3a9
40 changed files with 343 additions and 345 deletions

44
go.mod
View File

@ -1,44 +1,50 @@
module github.com/go-i2p/go-i2p module github.com/go-i2p/go-i2p
go 1.23.1 go 1.23.3
toolchain go1.23.5
require ( require (
github.com/beevik/ntp v1.4.3 github.com/beevik/ntp v1.4.3
github.com/emirpasic/gods v1.18.1 github.com/emirpasic/gods v1.18.1
github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e
github.com/flynn/noise v1.1.0 github.com/flynn/noise v1.1.0
github.com/go-i2p/logger v0.0.0-20241121221545-ce7ceeba699a 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/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/spf13/viper v1.19.0
github.com/stretchr/testify v1.9.0 github.com/stretchr/testify v1.10.0
go.step.sm/crypto v0.53.0 go.step.sm/crypto v0.58.1
golang.org/x/crypto v0.27.0 golang.org/x/crypto v0.35.0
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
) )
require ( require (
filippo.io/edwards25519 v1.1.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // 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/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.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/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/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/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/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect github.com/spf13/afero v1.12.0 // indirect
github.com/spf13/cast v1.7.0 // indirect github.com/spf13/cast v1.7.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.6 // indirect
github.com/subosito/gotenv v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect
go.uber.org/atomic v1.9.0 // indirect go.opentelemetry.io/otel v1.34.0 // indirect
go.uber.org/multierr v1.9.0 // indirect go.opentelemetry.io/otel/trace v1.34.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect go.uber.org/multierr v1.11.0 // indirect
golang.org/x/net v0.29.0 // indirect golang.org/x/net v0.35.0 // indirect
golang.org/x/sys v0.25.0 // indirect golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.18.0 // indirect golang.org/x/text v0.22.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect
) )

94
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= 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 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho=
github.com/beevik/ntp v1.4.3/go.mod h1:Unr8Zg+2dRn7d8bHFuehIMSvvUYssHMxW3Q5Nx4RW5Q= 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.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.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@ -15,12 +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/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 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 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.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/go-i2p/logger v0.0.0-20241121221545-ce7ceeba699a h1:z19Zzn9uX/bGxzQ0XTSrXe+bl29XW60n6kUpg1elscA= github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c h1:VTiECn3dFEmUlZjto+wOwJ7SSJTHPLyNprQMR5HzIMI=
github.com/go-i2p/logger v0.0.0-20241121221545-ce7ceeba699a/go.mod h1:qMpzyCtcUAeVIe38fKEmJyWoyGfLN2N9MmgiM6iQBdQ= github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c/go.mod h1:te7Zj3g3oMeIl8uBXAgO62UKmZ6m6kHRNg1Mm+X8Hzk=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 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= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@ -32,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.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 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= 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 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= 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.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 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 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/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.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= 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 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= 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 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 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 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= 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.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 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 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= 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.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.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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
go.step.sm/crypto v0.53.0 h1:+1as1ogzuCzx15/468M4mEC5juogI5a0Fzbsyh1CuYY= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
go.step.sm/crypto v0.53.0/go.mod h1:AqLU78RqNUHepLzyOWZuNN/2++Lu7dZENdO9UzWOGSk= go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.step.sm/crypto v0.58.1 h1:2PpEYTbytA3el9dW0gh9uJEe/CR/J6wS+x2vWYLG83M=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= 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.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.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= 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.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= 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-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.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.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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/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.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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= 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 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=

View File

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

View File

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

View File

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

View File

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

View File

@ -2,9 +2,9 @@ package data
import ( import (
"bytes" "bytes"
"errors"
"testing" "testing"
"github.com/samber/oops"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -154,7 +154,7 @@ func TestFullGoMapToMappingProducesCorrectMapping(t *testing.T) {
func TestStopValueReadTrueWhenCorrectErr(t *testing.T) { func TestStopValueReadTrueWhenCorrectErr(t *testing.T) {
assert := assert.New(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") 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) { func TestStopValueReadFalseWhenWrongErr(t *testing.T) {
assert := assert.New(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") assert.Equal(false, status, "stopValueRead() did not return false when non String error found")
} }

View File

@ -1,9 +1,9 @@
package data package data
import ( import (
"errors"
"sort" "sort"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -90,7 +90,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"at": "(Mapping) Values", "at": "(Mapping) Values",
"reason": "data shorter than expected", "reason": "data shorter than expected",
}).Error("mapping contained no data") }).Error("mapping contained no data")
errs = []error{errors.New("mapping contained no data")} errs = []error{oops.Errorf("mapping contained no data")}
return return
} }
map_values := make(MappingValues, 0) map_values := make(MappingValues, 0)
@ -103,7 +103,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"mapping_length_field": int_map_length, "mapping_length_field": int_map_length,
"reason": "data longer than expected", "reason": "data longer than expected",
}).Warn("mapping format warning") }).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 { } else if int_map_length > mapping_len {
log.WithFields(logrus.Fields{ log.WithFields(logrus.Fields{
"at": "(Mapping) Values", "at": "(Mapping) Values",
@ -111,7 +111,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"mapping_length_field": int_map_length, "mapping_length_field": int_map_length,
"reason": "data shorter than expected", "reason": "data shorter than expected",
}).Warn("mapping format warning") }).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{} encounteredKeysMap := map[string]bool{}
@ -158,7 +158,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"key": string(key_str), "key": string(key_str),
}).Error("mapping format violation") }).Error("mapping format violation")
log.Printf("DUPE: %s", key_str) 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? // 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. // 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 // 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 =", "reason": "expected =",
"value:": string(remainder), "value:": string(remainder),
}).Warn("mapping format violation") }).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) log.Printf("ERRVAL: %s", remainder)
break break
} else { } else {
@ -197,7 +197,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal
"reason": "expected ;", "reason": "expected ;",
"value:": string(remainder), "value:": string(remainder),
}).Warn("mapping format violation") }).Warn("mapping format violation")
errs = append(errs, errors.New("mapping format violation, expected ;")) errs = append(errs, oops.Errorf("mapping format violation, expected ;"))
break break
} else { } else {
remainder = remainder[1:] remainder = remainder[1:]

View File

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

View File

@ -31,6 +31,7 @@ import (
"fmt" "fmt"
"github.com/go-i2p/go-i2p/lib/common/signature" "github.com/go-i2p/go-i2p/lib/common/signature"
"github.com/samber/oops"
"github.com/go-i2p/logger" "github.com/go-i2p/logger"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -148,7 +149,7 @@ func (keyCertificate KeyCertificate) ConstructPublicKey(data []byte) (public_key
"required_len": KEYCERT_PUBKEY_SIZE, "required_len": KEYCERT_PUBKEY_SIZE,
"reason": "not enough data", "reason": "not enough data",
}).Error("error constructing public key") }).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 return
} }
switch key_type { switch key_type {
@ -191,7 +192,7 @@ var SignaturePublicKeySizes = map[uint16]int{
func (keyCertificate *KeyCertificate) CryptoPublicKeySize() (int, error) { func (keyCertificate *KeyCertificate) CryptoPublicKeySize() (int, error) {
size, exists := CryptoPublicKeySizes[uint16(keyCertificate.CpkType.Int())] size, exists := CryptoPublicKeySizes[uint16(keyCertificate.CpkType.Int())]
if !exists { 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 return size, nil
} }
@ -240,7 +241,7 @@ func (keyCertificate KeyCertificate) ConstructSigningPublicKey(data []byte) (sig
"required_len": KEYCERT_SPK_SIZE, "required_len": KEYCERT_SPK_SIZE,
"reason": "not enough data", "reason": "not enough data",
}).Error("error constructing signing public key") }).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 return
} }
switch signing_key_type { switch signing_key_type {
@ -297,7 +298,7 @@ func (keyCertificate KeyCertificate) ConstructSigningPublicKey(data []byte) (sig
log.WithFields(logrus.Fields{ log.WithFields(logrus.Fields{
"signing_key_type": signing_key_type, "signing_key_type": signing_key_type,
}).Warn("Unknown 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 return
@ -365,11 +366,11 @@ func NewKeyCertificate(bytes []byte) (key_certificate *KeyCertificate, remainder
} }
if certificate.Type() != CERT_KEY { 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 { 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]) 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) { func KeyCertificateFromCertificate(cert Certificate) (*KeyCertificate, error) {
if cert.Type() != CERT_KEY { 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() data := cert.Data()
@ -401,7 +402,7 @@ func KeyCertificateFromCertificate(cert Certificate) (*KeyCertificate, error) {
fmt.Printf("Certificate Data Bytes in KeyCertificateFromCertificate: %v\n", data) fmt.Printf("Certificate Data Bytes in KeyCertificateFromCertificate: %v\n", data)
if len(data) < 4 { 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] cpkTypeBytes := data[0:2]

View File

@ -2,10 +2,8 @@
package keys_and_cert package keys_and_cert
import ( import (
"errors"
"fmt"
"github.com/go-i2p/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/certificate"
. "github.com/go-i2p/go-i2p/lib/common/key_certificate" . "github.com/go-i2p/go-i2p/lib/common/key_certificate"
@ -154,7 +152,7 @@ func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte,
"required_len": KEYS_AND_CERT_MIN_SIZE, "required_len": KEYS_AND_CERT_MIN_SIZE,
"reason": "not enough data", "reason": "not enough data",
}).Error("error parsing keys and cert") }).Error("error parsing keys and cert")
err = errors.New("error parsing KeysAndCert: data is smaller than minimum valid size") err = oops.Errorf("error parsing KeysAndCert: data is smaller than minimum valid size")
return return
} }
@ -217,7 +215,7 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain
dataLen := len(data) dataLen := len(data)
if dataLen < minDataLength { 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") log.WithError(err).Error("Data is smaller than minimum valid size")
return return
} }
@ -228,7 +226,7 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain
// Extract public key // Extract public key
publicKeyData := data[:pubKeySize] publicKeyData := data[:pubKeySize]
if len(publicKeyData) != 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") log.WithError(err).Error("Invalid ElGamal public key length")
return return
} }
@ -244,7 +242,7 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain
// Extract signing public key // Extract signing public key
signingPubKeyData := data[paddingEnd : paddingEnd+sigKeySize] signingPubKeyData := data[paddingEnd : paddingEnd+sigKeySize]
if len(signingPubKeyData) != 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") log.WithError(err).Error("Invalid Ed25519 public key length")
return return
} }
@ -273,14 +271,14 @@ func constructPublicKey(data []byte, cryptoType uint16) (crypto.RecievingPublicK
switch cryptoType { switch cryptoType {
case CRYPTO_KEY_TYPE_ELGAMAL: case CRYPTO_KEY_TYPE_ELGAMAL:
if len(data) != 256 { 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 var elgPublicKey crypto.ElgPublicKey
copy(elgPublicKey[:], data) copy(elgPublicKey[:], data)
return elgPublicKey, nil return elgPublicKey, nil
// Handle other crypto types... // Handle other crypto types...
default: default:
return nil, fmt.Errorf("unsupported crypto key type: %d", cryptoType) return nil, oops.Errorf("unsupported crypto key type: %d", cryptoType)
} }
} }
@ -288,12 +286,12 @@ func constructSigningPublicKey(data []byte, sigType uint16) (crypto.SigningPubli
switch sigType { switch sigType {
case SIGNATURE_TYPE_ED25519_SHA512: case SIGNATURE_TYPE_ED25519_SHA512:
if len(data) != 32 { 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 return crypto.Ed25519PublicKey(data), nil
// Handle other signature types... // Handle other signature types...
default: default:
return nil, fmt.Errorf("unsupported signature key type: %d", sigType) return nil, oops.Errorf("unsupported signature key type: %d", sigType)
} }
} }
@ -309,7 +307,7 @@ func NewKeysAndCert(
if keyCertificate == nil { if keyCertificate == nil {
log.Error("KeyCertificate is 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 // Get actual key sizes from certificate
@ -323,7 +321,7 @@ func NewKeysAndCert(
"expected_size": pubKeySize, "expected_size": pubKeySize,
"actual_size": publicKey.Len(), "actual_size": publicKey.Len(),
}).Error("Invalid publicKey size") }).Error("Invalid publicKey size")
return nil, fmt.Errorf("publicKey has invalid size: expected %d, got %d", pubKeySize, publicKey.Len()) return nil, oops.Errorf("publicKey has invalid size: expected %d, got %d", pubKeySize, publicKey.Len())
} }
} }
@ -334,7 +332,7 @@ func NewKeysAndCert(
"expected_size": sigKeySize, "expected_size": sigKeySize,
"actual_size": signingPublicKey.Len(), "actual_size": signingPublicKey.Len(),
}).Error("Invalid signingPublicKey size") }).Error("Invalid signingPublicKey size")
return nil, fmt.Errorf("signingPublicKey has invalid size: expected %d, got %d", sigKeySize, signingPublicKey.Len()) return nil, oops.Errorf("signingPublicKey has invalid size: expected %d, got %d", sigKeySize, signingPublicKey.Len())
} }
} }
@ -345,7 +343,7 @@ func NewKeysAndCert(
"expected_size": expectedPaddingSize, "expected_size": expectedPaddingSize,
"actual_size": len(padding), "actual_size": len(padding),
}).Error("Invalid padding size") }).Error("Invalid padding size")
return nil, fmt.Errorf("invalid padding size") return nil, oops.Errorf("invalid padding size")
} }
keysAndCert := &KeysAndCert{ keysAndCert := &KeysAndCert{

View File

@ -3,11 +3,11 @@ package lease
import ( import (
"encoding/binary" "encoding/binary"
"errors"
"time" "time"
. "github.com/go-i2p/go-i2p/lib/common/data" . "github.com/go-i2p/go-i2p/lib/common/data"
"github.com/go-i2p/logger" "github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "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") log.WithField("input_length", len(data)).Debug("Reading Lease from bytes")
if len(data) < LEASE_SIZE { 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{ log.WithFields(logrus.Fields{
"data_length": len(data), "data_length": len(data),
"required_length": LEASE_SIZE, "required_length": LEASE_SIZE,

View File

@ -2,10 +2,10 @@
package lease_set package lease_set
import ( import (
"errors"
"fmt" "fmt"
"github.com/go-i2p/go-i2p/lib/common/signature" "github.com/go-i2p/go-i2p/lib/common/signature"
"github.com/samber/oops"
"github.com/go-i2p/logger" "github.com/go-i2p/logger"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -175,7 +175,7 @@ func ReadDestinationFromLeaseSet(data []byte) (destination Destination, remainde
fmt.Printf("Reading Destination from LeaseSet, input_length=%d\n", len(data)) 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) 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) fmt.Printf("Error: %v\n", err)
return return
} }
@ -199,7 +199,7 @@ func ReadDestinationFromLeaseSet(data []byte) (destination Destination, remainde
fmt.Printf(" destinationLength: %d\n", destinationLength) fmt.Printf(" destinationLength: %d\n", destinationLength)
if len(data) < 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) fmt.Printf("Error: %v\n", err)
return return
} }
@ -237,7 +237,7 @@ func (lease_set LeaseSet) PublicKey() (public_key crypto.ElgPublicKey, err error
"required_len": LEASE_SET_PUBKEY_SIZE, "required_len": LEASE_SET_PUBKEY_SIZE,
"reason": "not enough data", "reason": "not enough data",
}).Error("error parsing public key") }).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) copy(public_key[:], remainder)
return return
} }
@ -270,7 +270,7 @@ func (lease_set LeaseSet) SigningKey() (signing_public_key crypto.SigningPublicK
"required_len": offset + LEASE_SET_SPK_SIZE, "required_len": offset + LEASE_SET_SPK_SIZE,
"reason": "not enough data", "reason": "not enough data",
}).Error("error parsing signing public key") }).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 return
} }
if cert_len == 0 { 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, "required_len": LEASE_SET_PUBKEY_SIZE + LEASE_SET_SPK_SIZE + 1,
"reason": "not enough data", "reason": "not enough data",
}).Error("error parsing lease count") }).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 return
} }
c := Integer([]byte{remainder[LEASE_SET_PUBKEY_SIZE+LEASE_SET_SPK_SIZE]}) 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, "lease_count": count,
"reason": "more than 16 leases", "reason": "more than 16 leases",
}).Warn("invalid lease set") }).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 { } else {
log.WithField("lease_count", count).Debug("Retrieved LeaseCount from LeaseSet") 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, "required_len": end,
"reason": "some leases missing", "reason": "some leases missing",
}).Error("error parsnig lease set") }).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 return
} }
var lease Lease var lease Lease
@ -422,7 +422,7 @@ func (lease_set LeaseSet) Signature() (signature signature.Signature, err error)
"required_len": end, "required_len": end,
"reason": "not enough data", "reason": "not enough data",
}).Error("error parsing signatre") }).Error("error parsing signatre")
err = errors.New("error parsing signature: not enough data") err = oops.Errorf("error parsing signature: not enough data")
return return
} }
signature = []byte(lease_set[start:end]) signature = []byte(lease_set[start:end])
@ -500,15 +500,15 @@ func NewLeaseSet(
log.Debug("Creating new LeaseSet") log.Debug("Creating new LeaseSet")
// Validate destination size // Validate destination size
if len(destination.KeysAndCert.Bytes()) < 387 { 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 // Validate encryption key size
if len(encryptionKey.Bytes()) != LEASE_SET_PUBKEY_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 // Validate inputs
if len(leases) > 16 { 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 // Validate signing key size matches certificate
cert := destination.Certificate() cert := destination.Certificate()
@ -520,13 +520,13 @@ func NewLeaseSet(
} }
expectedSize := keyCert.SignatureSize() expectedSize := keyCert.SignatureSize()
if len(signingKey.Bytes()) != expectedSize { 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) len(signingKey.Bytes()), expectedSize)
} }
} else { } else {
// Default DSA size // Default DSA size
if len(signingKey.Bytes()) != LEASE_SET_SPK_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 // Build LeaseSet data

View File

@ -3,7 +3,6 @@ package lease_set
import ( import (
"bytes" "bytes"
"crypto/rand" "crypto/rand"
"fmt"
"testing" "testing"
"time" "time"
@ -12,6 +11,7 @@ import (
"github.com/go-i2p/go-i2p/lib/common/router_address" "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/router_info"
"github.com/go-i2p/go-i2p/lib/common/signature" "github.com/go-i2p/go-i2p/lib/common/signature"
"github.com/samber/oops"
"github.com/go-i2p/go-i2p/lib/common/data" "github.com/go-i2p/go-i2p/lib/common/data"
"github.com/go-i2p/go-i2p/lib/common/keys_and_cert" "github.com/go-i2p/go-i2p/lib/common/keys_and_cert"
@ -274,7 +274,7 @@ func createTestLeaseSet(t *testing.T, routerInfo *router_info.RouterInfo, leaseC
// Generate test Destination and client keys // Generate test Destination and client keys
dest, encryptionKey, signingKey, signingPrivKey, err := generateTestDestination(t) dest, encryptionKey, signingKey, signingPrivKey, err := generateTestDestination(t)
if err != nil { 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() destBytes := dest.KeysAndCert.Bytes()

View File

@ -3,14 +3,13 @@ package router_address
import ( import (
"encoding/binary" "encoding/binary"
"errors"
"fmt"
"net" "net"
"strconv" "strconv"
"strings" "strings"
"time" "time"
"github.com/go-i2p/logger" "github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
. "github.com/go-i2p/go-i2p/lib/common/data" . "github.com/go-i2p/go-i2p/lib/common/data"
@ -251,7 +250,7 @@ func (router_address RouterAddress) Host() (net.Addr, error) {
ip := net.ParseIP(hostBytes) ip := net.ParseIP(hostBytes)
if ip == nil { if ip == nil {
log.Error("Failed to parse IP address") 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()) // return net.ResolveIPAddr("", ip.String())
addr, err := net.ResolveIPAddr("", ip.String()) addr, err := net.ResolveIPAddr("", ip.String())
@ -285,7 +284,7 @@ func (router_address RouterAddress) Port() (string, error) {
func (router_address RouterAddress) StaticKey() ([32]byte, error) { func (router_address RouterAddress) StaticKey() ([32]byte, error) {
sk := router_address.StaticKeyString() sk := router_address.StaticKeyString()
if len([]byte(sk)) != 32 { 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 return [32]byte(sk), nil
} }
@ -293,7 +292,7 @@ func (router_address RouterAddress) StaticKey() ([32]byte, error) {
func (router_address RouterAddress) InitializationVector() ([16]byte, error) { func (router_address RouterAddress) InitializationVector() ([16]byte, error) {
iv := router_address.InitializationVectorString() iv := router_address.InitializationVectorString()
if len([]byte(iv)) != 16 { if len([]byte(iv)) != 16 {
return [16]byte{}, fmt.Errorf("error: invalid IV") return [16]byte{}, oops.Errorf("error: invalid IV")
} }
return [16]byte(iv), nil return [16]byte(iv), nil
} }
@ -319,7 +318,7 @@ func ReadRouterAddress(data []byte) (router_address RouterAddress, remainder []b
log.WithField("data_length", len(data)).Debug("Reading RouterAddress from data") log.WithField("data_length", len(data)).Debug("Reading RouterAddress from data")
if len(data) == 0 { if len(data) == 0 {
log.WithField("at", "(RouterAddress) ReadRouterAddress").Error("error parsing RouterAddress: no data") 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 return
} }
router_address.TransportCost, remainder, err = NewInteger(data, 1) router_address.TransportCost, remainder, err = NewInteger(data, 1)

View File

@ -8,18 +8,20 @@ import (
"strings" "strings"
"testing" "testing"
"time" "time"
"github.com/samber/oops"
) )
func consolidateNetDb(sourcePath string, destPath string) error { func consolidateNetDb(sourcePath string, destPath string) error {
// Create destination directory if it doesn't exist // Create destination directory if it doesn't exist
if err := os.MkdirAll(destPath, 0o755); err != nil { 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 // Walk through all subdirectories
return filepath.Walk(sourcePath, func(path string, info os.FileInfo, err error) error { return filepath.Walk(sourcePath, func(path string, info os.FileInfo, err error) error {
if err != nil { 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 // Skip if it's a directory
@ -37,7 +39,7 @@ func consolidateNetDb(sourcePath string, destPath string) error {
// Copy the file // Copy the file
if err := copyFile(srcFile, dstFile); err != nil { 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 // Create the temp directory
if err := os.MkdirAll(tempDir, 0o755); err != nil { 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 // Try to consolidate I2P netDb
@ -91,7 +93,7 @@ func consolidateAllNetDbs(tempDir string) error {
func cleanupTempDir(path string) error { func cleanupTempDir(path string) error {
if err := os.RemoveAll(path); err != nil { 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 return nil
} }
@ -110,7 +112,7 @@ func createTempNetDbDir() (string, error) {
// Create the directory with appropriate permissions // Create the directory with appropriate permissions
err := os.MkdirAll(tempDir, 0o755) err := os.MkdirAll(tempDir, 0o755)
if err != nil { 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 return tempDir, nil

View File

@ -3,13 +3,12 @@ package router_info
import ( import (
"encoding/binary" "encoding/binary"
"errors"
"fmt"
"strconv" "strconv"
"strings" "strings"
"time" "time"
"github.com/go-i2p/go-i2p/lib/common/certificate" "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/crypto"
@ -306,7 +305,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error)
sigType, err := certificate.GetSignatureTypeFromCertificate(cert) sigType, err := certificate.GetSignatureTypeFromCertificate(cert)
if err != nil { if err != nil {
log.WithError(err).Error("Failed to get signature type from certificate") 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 // Enhanced signature type validation
@ -315,7 +314,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error)
"sigType": sigType, "sigType": sigType,
"cert": cert, "cert": cert,
}).Error("Invalid signature type detected") }).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{ log.WithFields(logrus.Fields{
@ -329,7 +328,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error)
//"required_len": MAPPING_SIZE, //"required_len": MAPPING_SIZE,
"reason": "not enough data", "reason": "not enough data",
}).Error("error parsing router info") }).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{ log.WithFields(logrus.Fields{

View File

@ -2,9 +2,8 @@
package signature package signature
import ( import (
"fmt"
"github.com/go-i2p/logger" "github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "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: case SIGNATURE_TYPE_REDDSA_SHA512_ED25519:
sigLength = RedDSA_SHA512_Ed25519_SIZE sigLength = RedDSA_SHA512_Ed25519_SIZE
default: default:
err = fmt.Errorf("unsupported signature type: %d", sigType) err = oops.Errorf("unsupported signature type: %d", sigType)
return return
} }
if len(data) < sigLength { 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") log.WithError(err).Error("Failed to read Signature")
return return
} }

View File

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

View File

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

View File

@ -6,17 +6,17 @@ import (
"crypto/rand" "crypto/rand"
"crypto/sha256" "crypto/sha256"
"crypto/sha512" "crypto/sha512"
"errors"
"fmt" "fmt"
"io" "io"
"math/big" "math/big"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
var ( var (
Ed25519EncryptTooBig = errors.New("failed to encrypt data, too big for Ed25519") Ed25519EncryptTooBig = oops.Errorf("failed to encrypt data, too big for Ed25519")
ErrInvalidPublicKeySize = errors.New("failed to verify: invalid ed25519 public key size") ErrInvalidPublicKeySize = oops.Errorf("failed to verify: invalid ed25519 public key size")
) )
type Ed25519PublicKey []byte type Ed25519PublicKey []byte
@ -133,7 +133,7 @@ func (elg Ed25519PublicKey) NewEncrypter() (enc Encrypter, err error) {
log.Debug("Creating new Ed25519 encrypter") log.Debug("Creating new Ed25519 encrypter")
k := createEd25519PublicKey(elg[:]) k := createEd25519PublicKey(elg[:])
if k == nil { 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) enc, err = createEd25519Encryption(k, rand.Reader)
@ -159,14 +159,14 @@ func (v *Ed25519Verifier) VerifyHash(h, sig []byte) (err error) {
} }
if len(v.k) != ed25519.PublicKeySize { if len(v.k) != ed25519.PublicKeySize {
log.Error("Invalid Ed25519 public key size") 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 return
} }
ok := ed25519.Verify(v.k, h, sig) ok := ed25519.Verify(v.k, h, sig)
if !ok { if !ok {
log.Warn("Invalid Ed25519 signature") log.Warn("Invalid Ed25519 signature")
err = errors.New("failed to verify: invalid signature") err = oops.Errorf("failed to verify: invalid signature")
} else { } else {
log.Debug("Ed25519 signature verified successfully") log.Debug("Ed25519 signature verified successfully")
} }
@ -198,7 +198,7 @@ func (k Ed25519PrivateKey) Zero() {
func (k Ed25519PrivateKey) NewDecrypter() (Decrypter, error) { func (k Ed25519PrivateKey) NewDecrypter() (Decrypter, error) {
if len(k) != ed25519.PrivateKeySize { if len(k) != ed25519.PrivateKeySize {
return nil, errors.New("invalid ed25519 private key size") return nil, oops.Errorf("invalid ed25519 private key size")
} }
d := &Ed25519Decrypter{ d := &Ed25519Decrypter{
privateKey: k, privateKey: k,
@ -216,7 +216,7 @@ func (d *Ed25519Decrypter) Decrypt(data []byte) ([]byte, error) {
func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte, error) { func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte, error) {
if len(data) != 514 && len(data) != 512 { if len(data) != 514 && len(data) != 512 {
return nil, errors.New("invalid ciphertext length") return nil, oops.Errorf("invalid ciphertext length")
} }
// Extract components based on padding // Extract components based on padding
@ -239,14 +239,14 @@ func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte
// Use private key to decrypt // Use private key to decrypt
m := new(big.Int).ModInverse(a, p) m := new(big.Int).ModInverse(a, p)
if m == nil { if m == nil {
return nil, errors.New("decryption failed: modular inverse does not exist") return nil, oops.Errorf("decryption failed: modular inverse does not exist")
} }
decrypted := new(big.Int).Mod(new(big.Int).Mul(b, m), p).Bytes() decrypted := new(big.Int).Mod(new(big.Int).Mul(b, m), p).Bytes()
// Remove padding and validate hash // Remove padding and validate hash
if len(decrypted) < 33 { if len(decrypted) < 33 {
return nil, errors.New("decryption failed: result too short") return nil, oops.Errorf("decryption failed: result too short")
} }
hashBytes := decrypted[1:33] hashBytes := decrypted[1:33]
@ -255,7 +255,7 @@ func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte
// Verify hash // Verify hash
actualHash := sha256.Sum256(message) actualHash := sha256.Sum256(message)
if !bytes.Equal(hashBytes, actualHash[:]) { if !bytes.Equal(hashBytes, actualHash[:]) {
return nil, errors.New("decryption failed: hash verification failed") return nil, oops.Errorf("decryption failed: hash verification failed")
} }
return message, nil return message, nil
@ -263,7 +263,7 @@ func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte
func (k Ed25519PrivateKey) NewSigner() (Signer, error) { func (k Ed25519PrivateKey) NewSigner() (Signer, error) {
if len(k) != ed25519.PrivateKeySize { 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 return &Ed25519Signer{k: k}, nil
} }
@ -286,7 +286,7 @@ func (k Ed25519PrivateKey) Generate() (SigningPrivateKey, error) {
func (k Ed25519PrivateKey) Public() (SigningPublicKey, error) { func (k Ed25519PrivateKey) Public() (SigningPublicKey, error) {
fmt.Printf("Ed25519PrivateKey.Public(): len(k) = %d\n", len(k)) fmt.Printf("Ed25519PrivateKey.Public(): len(k) = %d\n", len(k))
if len(k) != ed25519.PrivateKeySize { 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:] pubKey := k[32:]
fmt.Printf("Ed25519PrivateKey.Public(): extracted pubKey length: %d\n", len(pubKey)) fmt.Printf("Ed25519PrivateKey.Public(): extracted pubKey length: %d\n", len(pubKey))
@ -302,7 +302,7 @@ func (s *Ed25519Signer) Sign(data []byte) (sig []byte, err error) {
if len(s.k) != ed25519.PrivateKeySize { if len(s.k) != ed25519.PrivateKeySize {
log.Error("Invalid Ed25519 private key size") 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 return
} }
h := sha512.Sum512(data) h := sha512.Sum512(data)

View File

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

View File

@ -1,13 +1,11 @@
package crypto package crypto
import ( import "github.com/samber/oops"
"errors"
)
var ( var (
ErrBadSignatureSize = errors.New("bad signature size") ErrBadSignatureSize = oops.Errorf("bad signature size")
ErrInvalidKeyFormat = errors.New("invalid key format") ErrInvalidKeyFormat = oops.Errorf("invalid key format")
ErrInvalidSignature = errors.New("invalid signature") ErrInvalidSignature = oops.Errorf("invalid signature")
) )
// type for verifying signatures // type for verifying signatures

View File

@ -1,9 +1,9 @@
package i2np package i2np
import ( import (
"errors"
"time" "time"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
common "github.com/go-i2p/go-i2p/lib/common/data" common "github.com/go-i2p/go-i2p/lib/common/data"
@ -173,7 +173,7 @@ type BuildRequestRecord struct {
Padding [29]byte 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) { func ReadBuildRequestRecord(data []byte) (BuildRequestRecord, error) {
log.Debug("Reading BuildRequestRecord") log.Debug("Reading BuildRequestRecord")

View File

@ -1,9 +1,9 @@
package i2np package i2np
import ( import (
"errors"
"time" "time"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
datalib "github.com/go-i2p/go-i2p/lib/common/data" datalib "github.com/go-i2p/go-i2p/lib/common/data"
@ -90,7 +90,7 @@ type I2NPSSUHeader struct {
Expiration time.Time 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 // Read an entire I2NP message and return the parsed header
// with embedded encrypted data // with embedded encrypted data

View File

@ -4,8 +4,6 @@ import (
"bytes" "bytes"
"crypto/ed25519" "crypto/ed25519"
"crypto/rand" "crypto/rand"
"errors"
"fmt"
"os" "os"
"path/filepath" "path/filepath"
@ -19,6 +17,7 @@ import (
"github.com/go-i2p/go-i2p/lib/common/signature" "github.com/go-i2p/go-i2p/lib/common/signature"
"github.com/go-i2p/go-i2p/lib/crypto" "github.com/go-i2p/go-i2p/lib/crypto"
"github.com/go-i2p/go-i2p/lib/util/time/sntp" "github.com/go-i2p/go-i2p/lib/util/time/sntp"
"github.com/samber/oops"
) )
// RouterInfoKeystore is an implementation of KeyStore for storing and retrieving RouterInfo private keys and exporting RouterInfos // RouterInfoKeystore is an implementation of KeyStore for storing and retrieving RouterInfo private keys and exporting RouterInfos
@ -82,7 +81,7 @@ func generateNewKey() (crypto.Ed25519PrivateKey, error) {
func loadExistingKey(keyData []byte) (crypto.Ed25519PrivateKey, error) { func loadExistingKey(keyData []byte) (crypto.Ed25519PrivateKey, error) {
// Validate key length // Validate key length
if len(keyData) != ed25519.PrivateKeySize { if len(keyData) != ed25519.PrivateKeySize {
return nil, errors.New("invalid key length") return nil, oops.Errorf("invalid key length")
} }
// Convert to our type // Convert to our type
@ -127,31 +126,31 @@ func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.Ro
// Get signing keys // Get signing keys
publicKey, privateKey, err := ks.GetKeys() publicKey, privateKey, err := ks.GetKeys()
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get keys: %w", err) return nil, oops.Errorf("failed to get keys: %w", err)
} }
// Create certificate with Ed25519 key type // Create certificate with Ed25519 key type
payload := new(bytes.Buffer) payload := new(bytes.Buffer)
cryptoKeyType, err := data.NewIntegerFromInt(7, 2) // Ed25519 cryptoKeyType, err := data.NewIntegerFromInt(7, 2) // Ed25519
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create crypto key type: %w", err) return nil, oops.Errorf("failed to create crypto key type: %w", err)
} }
signingKeyType, err := data.NewIntegerFromInt(7, 2) // Ed25519 signingKeyType, err := data.NewIntegerFromInt(7, 2) // Ed25519
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create signing key type: %w", err) return nil, oops.Errorf("failed to create signing key type: %w", err)
} }
payload.Write(*cryptoKeyType) payload.Write(*cryptoKeyType)
payload.Write(*signingKeyType) payload.Write(*signingKeyType)
cert, err := certificate.NewCertificateWithType(certificate.CERT_KEY, payload.Bytes()) cert, err := certificate.NewCertificateWithType(certificate.CERT_KEY, payload.Bytes())
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create certificate: %w", err) return nil, oops.Errorf("failed to create certificate: %w", err)
} }
// Create padding // Create padding
keyCert, err := key_certificate.KeyCertificateFromCertificate(*cert) keyCert, err := key_certificate.KeyCertificateFromCertificate(*cert)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create key certificate: %w", err) return nil, oops.Errorf("failed to create key certificate: %w", err)
} }
pubKeySize := keyCert.CryptoSize() pubKeySize := keyCert.CryptoSize()
@ -160,7 +159,7 @@ func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.Ro
padding := make([]byte, paddingSize) padding := make([]byte, paddingSize)
_, err = rand.Read(padding) _, err = rand.Read(padding)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to generate padding: %w", err) return nil, oops.Errorf("failed to generate padding: %w", err)
} }
// Create RouterIdentity // Create RouterIdentity
@ -171,7 +170,7 @@ func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.Ro
padding, padding,
) )
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create router identity: %w", err) return nil, oops.Errorf("failed to create router identity: %w", err)
} }
// Get timestamp // Get timestamp
@ -192,7 +191,7 @@ func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.Ro
signature.SIGNATURE_TYPE_EDDSA_SHA512_ED25519, signature.SIGNATURE_TYPE_EDDSA_SHA512_ED25519,
) )
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create router info: %w", err) return nil, oops.Errorf("failed to create router info: %w", err)
} }
return ri, nil return ri, nil

View File

@ -1,7 +1,6 @@
package reseed package reseed
import ( import (
"fmt"
"io" "io"
"net" "net"
"net/http" "net/http"
@ -10,6 +9,7 @@ import (
"path/filepath" "path/filepath"
"github.com/go-i2p/logger" "github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/eyedeekay/go-unzip/pkg/unzip" "github.com/eyedeekay/go-unzip/pkg/unzip"
@ -93,7 +93,7 @@ func (r Reseed) SingleReseed(uri string) ([]router_info.RouterInfo, error) {
} }
if len(files) <= 0 { if len(files) <= 0 {
log.Error("Reseed appears to have no content") log.Error("Reseed appears to have no content")
return nil, fmt.Errorf("error: reseed appears to have no content") return nil, oops.Errorf("error: reseed appears to have no content")
} }
log.WithField("file_count", len(files)).Debug("Successfully extracted reseed files") log.WithField("file_count", len(files)).Debug("Successfully extracted reseed files")
@ -121,5 +121,5 @@ func (r Reseed) SingleReseed(uri string) ([]router_info.RouterInfo, error) {
} }
} }
log.Error("Undefined reseed error") log.Error("Undefined reseed error")
return nil, fmt.Errorf("error: undefined reseed error") return nil, oops.Errorf("error: undefined reseed error")
} }

View File

@ -72,7 +72,6 @@ import (
"crypto/sha512" "crypto/sha512"
"encoding/binary" "encoding/binary"
"errors" "errors"
"fmt"
"hash" "hash"
"io" "io"
"io/ioutil" "io/ioutil"
@ -80,6 +79,7 @@ import (
"sync" "sync"
"github.com/go-i2p/logger" "github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -152,29 +152,29 @@ var contentTypes = map[byte]ContentType{
} }
var ( var (
ErrMissingMagicBytes = errors.New("missing magic bytes") ErrMissingMagicBytes = oops.Errorf("missing magic bytes")
ErrMissingUnusedByte6 = errors.New("missing unused byte 6") ErrMissingUnusedByte6 = oops.Errorf("missing unused byte 6")
ErrMissingFileFormatVersion = errors.New("missing or incorrect file format version") ErrMissingFileFormatVersion = oops.Errorf("missing or incorrect file format version")
ErrMissingSignatureType = errors.New("missing or invalid signature type") ErrMissingSignatureType = oops.Errorf("missing or invalid signature type")
ErrUnsupportedSignatureType = errors.New("unsupported signature type") ErrUnsupportedSignatureType = oops.Errorf("unsupported signature type")
ErrMissingSignatureLength = errors.New("missing signature length") ErrMissingSignatureLength = oops.Errorf("missing signature length")
ErrMissingUnusedByte12 = errors.New("missing unused byte 12") ErrMissingUnusedByte12 = oops.Errorf("missing unused byte 12")
ErrMissingVersionLength = errors.New("missing version length") ErrMissingVersionLength = oops.Errorf("missing version length")
ErrVersionTooShort = errors.New("version length too short") ErrVersionTooShort = oops.Errorf("version length too short")
ErrMissingUnusedByte14 = errors.New("missing unused byte 14") ErrMissingUnusedByte14 = oops.Errorf("missing unused byte 14")
ErrMissingSignerIDLength = errors.New("missing signer ID length") ErrMissingSignerIDLength = oops.Errorf("missing signer ID length")
ErrMissingContentLength = errors.New("missing content length") ErrMissingContentLength = oops.Errorf("missing content length")
ErrMissingUnusedByte24 = errors.New("missing unused byte 24") ErrMissingUnusedByte24 = oops.Errorf("missing unused byte 24")
ErrMissingFileType = errors.New("missing or invalid file type") ErrMissingFileType = oops.Errorf("missing or invalid file type")
ErrMissingUnusedByte26 = errors.New("missing unused byte 26") ErrMissingUnusedByte26 = oops.Errorf("missing unused byte 26")
ErrMissingContentType = errors.New("missing or invalid content type") ErrMissingContentType = oops.Errorf("missing or invalid content type")
ErrMissingUnusedBytes28To39 = errors.New("missing unused bytes 28-39") ErrMissingUnusedBytes28To39 = oops.Errorf("missing unused bytes 28-39")
ErrMissingVersion = errors.New("missing version") ErrMissingVersion = oops.Errorf("missing version")
ErrMissingSignerID = errors.New("missing signer ID") ErrMissingSignerID = oops.Errorf("missing signer ID")
ErrMissingContent = errors.New("missing content") ErrMissingContent = oops.Errorf("missing content")
ErrMissingSignature = errors.New("missing signature") ErrMissingSignature = oops.Errorf("missing signature")
ErrInvalidPublicKey = errors.New("invalid public key") ErrInvalidPublicKey = oops.Errorf("invalid public key")
ErrInvalidSignature = errors.New("invalid signature") ErrInvalidSignature = oops.Errorf("invalid signature")
) )
const magicBytes = "I2Psu3" const magicBytes = "I2Psu3"
@ -217,7 +217,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err := reader.Read(mbytes) l, err := reader.Read(mbytes)
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read magic bytes") log.WithError(err).Error("Failed to read magic bytes")
return nil, fmt.Errorf("reading magic bytes: %w", err) return nil, oops.Errorf("reading magic bytes: %w", err)
} }
if l != len(mbytes) { if l != len(mbytes) {
log.Error("Missing magic bytes") log.Error("Missing magic bytes")
@ -235,7 +235,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(unused[:]) l, err = reader.Read(unused[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read unused byte 6") log.WithError(err).Error("Failed to read unused byte 6")
return nil, fmt.Errorf("reading unused byte 6: %w", err) return nil, oops.Errorf("reading unused byte 6: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing unused byte 6") log.Error("Missing unused byte 6")
@ -248,7 +248,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(unused[:]) l, err = reader.Read(unused[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read SU3 file format version") log.WithError(err).Error("Failed to read SU3 file format version")
return nil, fmt.Errorf("reading SU3 file format version: %w", err) return nil, oops.Errorf("reading SU3 file format version: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing SU3 file format version") log.Error("Missing SU3 file format version")
@ -271,7 +271,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(sigTypeBytes[:]) l, err = reader.Read(sigTypeBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read signature type") log.WithError(err).Error("Failed to read signature type")
return nil, fmt.Errorf("reading signature type: %w", err) return nil, oops.Errorf("reading signature type: %w", err)
} }
if l != 2 { if l != 2 {
log.Error("Missing signature type") log.Error("Missing signature type")
@ -291,7 +291,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(sigLengthBytes[:]) l, err = reader.Read(sigLengthBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read signature length") log.WithError(err).Error("Failed to read signature length")
return nil, fmt.Errorf("reading signature length: %w", err) return nil, oops.Errorf("reading signature length: %w", err)
} }
if l != 2 { if l != 2 {
log.Error("Missing signature length") log.Error("Missing signature length")
@ -307,7 +307,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(unused[:]) l, err = reader.Read(unused[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read unused byte 12") log.WithError(err).Error("Failed to read unused byte 12")
return nil, fmt.Errorf("reading unused byte 12: %w", err) return nil, oops.Errorf("reading unused byte 12: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing unused byte 12") log.Error("Missing unused byte 12")
@ -321,7 +321,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(verLengthBytes[:]) l, err = reader.Read(verLengthBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read version length") log.WithError(err).Error("Failed to read version length")
return nil, fmt.Errorf("reading version length: %w", err) return nil, oops.Errorf("reading version length: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing version length") log.Error("Missing version length")
@ -339,7 +339,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(unused[:]) l, err = reader.Read(unused[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read unused byte 14") log.WithError(err).Error("Failed to read unused byte 14")
return nil, fmt.Errorf("reading unused byte 14: %w", err) return nil, oops.Errorf("reading unused byte 14: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing unused byte 14") log.Error("Missing unused byte 14")
@ -353,7 +353,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(sigIDLengthBytes[:]) l, err = reader.Read(sigIDLengthBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read signer ID length") log.WithError(err).Error("Failed to read signer ID length")
return nil, fmt.Errorf("reading signer id length: %w", err) return nil, oops.Errorf("reading signer id length: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing signer ID length") log.Error("Missing signer ID length")
@ -368,7 +368,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(contentLengthBytes[:]) l, err = reader.Read(contentLengthBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read content length") log.WithError(err).Error("Failed to read content length")
return nil, fmt.Errorf("reading content length: %w", err) return nil, oops.Errorf("reading content length: %w", err)
} }
if l != 8 { if l != 8 {
log.Error("Missing content length") log.Error("Missing content length")
@ -383,7 +383,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(unused[:]) l, err = reader.Read(unused[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read unused byte 24") log.WithError(err).Error("Failed to read unused byte 24")
return nil, fmt.Errorf("reading unused byte 24: %w", err) return nil, oops.Errorf("reading unused byte 24: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing unused byte 24") log.Error("Missing unused byte 24")
@ -397,7 +397,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(fileTypeBytes[:]) l, err = reader.Read(fileTypeBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read file type") log.WithError(err).Error("Failed to read file type")
return nil, fmt.Errorf("reading file type: %w", err) return nil, oops.Errorf("reading file type: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing file type") log.Error("Missing file type")
@ -416,7 +416,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(unused[:]) l, err = reader.Read(unused[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read unused byte 26") log.WithError(err).Error("Failed to read unused byte 26")
return nil, fmt.Errorf("reading unused byte 26: %w", err) return nil, oops.Errorf("reading unused byte 26: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing unused byte 26") log.Error("Missing unused byte 26")
@ -430,7 +430,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(contentTypeBytes[:]) l, err = reader.Read(contentTypeBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read content type") log.WithError(err).Error("Failed to read content type")
return nil, fmt.Errorf("reading content type: %w", err) return nil, oops.Errorf("reading content type: %w", err)
} }
if l != 1 { if l != 1 {
log.Error("Missing content type") log.Error("Missing content type")
@ -450,7 +450,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(unused[:]) l, err = reader.Read(unused[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read unused bytes 28-39") log.WithError(err).Error("Failed to read unused bytes 28-39")
return nil, fmt.Errorf("reading unused bytes 28-39: %w", err) return nil, oops.Errorf("reading unused bytes 28-39: %w", err)
} }
if l != 1 { if l != 1 {
log.WithField("byte_number", 28+i).Error("Missing unused byte") log.WithField("byte_number", 28+i).Error("Missing unused byte")
@ -465,7 +465,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(versionBytes[:]) l, err = reader.Read(versionBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.Debug("Read unused bytes 28-39") log.Debug("Read unused bytes 28-39")
return nil, fmt.Errorf("reading version: %w", err) return nil, oops.Errorf("reading version: %w", err)
} }
if l != int(verLen) { if l != int(verLen) {
log.Error("Missing version") log.Error("Missing version")
@ -481,7 +481,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) {
l, err = reader.Read(signerIDBytes[:]) l, err = reader.Read(signerIDBytes[:])
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Failed to read signer ID") log.WithError(err).Error("Failed to read signer ID")
return nil, fmt.Errorf("reading signer id: %w", err) return nil, oops.Errorf("reading signer id: %w", err)
} }
if l != int(signIDLen) { if l != int(signIDLen) {
log.Error("Missing signer ID") log.Error("Missing signer ID")
@ -562,7 +562,7 @@ func (r *contentReader) Read(p []byte) (n int, err error) {
if r.finished { if r.finished {
log.Warn("Attempt to read content after finishing") log.Warn("Attempt to read content after finishing")
return 0, errors.New("out of bytes, maybe you read the signature before you read the content") return 0, oops.Errorf("out of bytes, maybe you read the signature before you read the content")
} }
if r.reader == nil { if r.reader == nil {
@ -578,7 +578,7 @@ func (r *contentReader) Read(p []byte) (n int, err error) {
if err != nil && !errors.Is(err, io.EOF) { if err != nil && !errors.Is(err, io.EOF) {
log.WithError(err).Error("Error reading content") log.WithError(err).Error("Error reading content")
return l, fmt.Errorf("reading content: %w", err) return l, oops.Errorf("reading content: %w", err)
} else if errors.Is(err, io.EOF) && r.reader.readSoFar != r.su3.ContentLength { } else if errors.Is(err, io.EOF) && r.reader.readSoFar != r.su3.ContentLength {
log.Error("Content shorter than expected") log.Error("Content shorter than expected")
return l, ErrMissingContent return l, ErrMissingContent
@ -656,7 +656,7 @@ func (r *signatureReader) getBytes() {
_, err := ioutil.ReadAll(r.su3.contentReader) _, err := ioutil.ReadAll(r.su3.contentReader)
if err != nil { if err != nil {
log.WithError(err).Error("Failed to read remaining content") log.WithError(err).Error("Failed to read remaining content")
r.err = fmt.Errorf("reading content: %w", err) r.err = oops.Errorf("reading content: %w", err)
return return
} }
} }
@ -671,7 +671,7 @@ func (r *signatureReader) getBytes() {
if err != nil { if err != nil {
log.WithError(err).Error("Failed to read signature") log.WithError(err).Error("Failed to read signature")
r.err = fmt.Errorf("reading signature: %w", err) r.err = oops.Errorf("reading signature: %w", err)
} else if reader.readSoFar != uint64(r.su3.SignatureLength) { } else if reader.readSoFar != uint64(r.su3.SignatureLength) {
log.Error("Signature shorter than expected") log.Error("Signature shorter than expected")
r.err = ErrMissingSignature r.err = ErrMissingSignature

View File

@ -1,8 +1,6 @@
package transport package transport
import ( import "github.com/samber/oops"
"errors"
)
// error for when we have no transports available to use // error for when we have no transports available to use
var ErrNoTransportAvailable = errors.New("no transports available") var ErrNoTransportAvailable = oops.Errorf("no transports available")

View File

@ -5,19 +5,19 @@ import (
"crypto/cipher" "crypto/cipher"
"crypto/rand" "crypto/rand"
"encoding/binary" "encoding/binary"
"fmt"
"testing" "testing"
"github.com/go-i2p/go-i2p/lib/crypto" "github.com/go-i2p/go-i2p/lib/crypto"
"github.com/go-i2p/go-i2p/lib/transport/obfs" "github.com/go-i2p/go-i2p/lib/transport/obfs"
"github.com/flynn/noise" "github.com/flynn/noise"
"github.com/samber/oops"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func (ns *NoiseSession) testEncryptPacket(plaintext []byte) (int, []byte, error) { func (ns *NoiseSession) testEncryptPacket(plaintext []byte) (int, []byte, error) {
if ns.CipherState == nil { if ns.CipherState == nil {
return 0, nil, fmt.Errorf("CipherState is nil") return 0, nil, oops.Errorf("CipherState is nil")
} }
// Encrypt the data // Encrypt the data
@ -37,18 +37,18 @@ func (ns *NoiseSession) testEncryptPacket(plaintext []byte) (int, []byte, error)
func (ns *NoiseSession) testPacketDeux(packet []byte) (int, []byte, error) { func (ns *NoiseSession) testPacketDeux(packet []byte) (int, []byte, error) {
if ns.CipherState == nil { if ns.CipherState == nil {
return 0, nil, fmt.Errorf("CipherState is nil") return 0, nil, oops.Errorf("CipherState is nil")
} }
if len(packet) < 2 { if len(packet) < 2 {
return 0, nil, fmt.Errorf("Packet too short to contain length prefix") return 0, nil, oops.Errorf("Packet too short to contain length prefix")
} }
// Extract the length prefix // Extract the length prefix
packetLength := binary.BigEndian.Uint16(packet[:2]) packetLength := binary.BigEndian.Uint16(packet[:2])
if len(packet[2:]) < int(packetLength) { if len(packet[2:]) < int(packetLength) {
return 0, nil, fmt.Errorf("Packet data is shorter than indicated length") return 0, nil, oops.Errorf("Packet data is shorter than indicated length")
} }
ciphertext := packet[2 : 2+packetLength] ciphertext := packet[2 : 2+packetLength]

View File

@ -3,10 +3,10 @@ package noise
import ( import (
"bytes" "bytes"
"crypto/rand" "crypto/rand"
"errors"
"io" "io"
"github.com/flynn/noise" "github.com/flynn/noise"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -47,7 +47,7 @@ func (c *NoiseSession) ComposeReceiverHandshakeMessage(localStatic noise.DHKey,
if len(remoteStatic) != 0 && len(remoteStatic) != noise.DH25519.DHLen() { if len(remoteStatic) != 0 && len(remoteStatic) != noise.DH25519.DHLen() {
log.WithField("rs_length", len(remoteStatic)).Error("Invalid remote static key length") log.WithField("rs_length", len(remoteStatic)).Error("Invalid remote static key length")
return nil, nil, nil, errors.New("only 32 byte curve25519 public keys are supported") return nil, nil, nil, oops.Errorf("only 32 byte curve25519 public keys are supported")
} }
negData = make([]byte, 6) negData = make([]byte, 6)
@ -84,7 +84,7 @@ func (c *NoiseSession) ComposeReceiverHandshakeMessage(localStatic noise.DHKey,
// Verify no CipherStates are returned yet // Verify no CipherStates are returned yet
if cs0 != nil || cs1 != nil { if cs0 != nil || cs1 != nil {
return nil, nil, nil, errors.New("unexpected cipher states in message 2") return nil, nil, nil, oops.Errorf("unexpected cipher states in message 2")
} }
return negData, msg, state, nil return negData, msg, state, nil

View File

@ -3,13 +3,12 @@ package noise
import ( import (
"bytes" "bytes"
"crypto/rand" "crypto/rand"
"errors"
"fmt"
"io" "io"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/flynn/noise" "github.com/flynn/noise"
"github.com/samber/oops"
) )
func (c *NoiseSession) RunOutgoingHandshake() error { func (c *NoiseSession) RunOutgoingHandshake() error {
@ -59,12 +58,12 @@ func (c *NoiseSession) ComposeInitiatorHandshakeMessage(
remoteStatic, err := c.peerStaticKey() remoteStatic, err := c.peerStaticKey()
if err != nil { if err != nil {
return nil, nil, nil, fmt.Errorf("Peer static key retrieval error: %s", err) return nil, nil, nil, oops.Errorf("Peer static key retrieval error: %s", err)
} }
/*localStatic, err := c.localStaticKey() /*localStatic, err := c.localStaticKey()
if err != nil { if err != nil {
return nil, nil, nil, fmt.Errorf("Local static key retrieval error: %s", err) return nil, nil, nil, oops.Errorf("Local static key retrieval error: %s", err)
} }
localStaticDH := noise.DHKey{ localStaticDH := noise.DHKey{
Public: localStatic[:], Public: localStatic[:],
@ -73,7 +72,7 @@ func (c *NoiseSession) ComposeInitiatorHandshakeMessage(
localStaticDH := *c.HandshakeKey() localStaticDH := *c.HandshakeKey()
if len(remoteStatic) != 0 && len(remoteStatic) != noise.DH25519.DHLen() { if len(remoteStatic) != 0 && len(remoteStatic) != noise.DH25519.DHLen() {
return nil, nil, nil, errors.New("only 32 byte curve25519 public keys are supported") return nil, nil, nil, oops.Errorf("only 32 byte curve25519 public keys are supported")
} }
negotiationData = make([]byte, 6) negotiationData = make([]byte, 6)
@ -109,7 +108,7 @@ func (c *NoiseSession) ComposeInitiatorHandshakeMessage(
// Verify no CipherStates are returned yet // Verify no CipherStates are returned yet
if cs0 != nil || cs1 != nil { if cs0 != nil || cs1 != nil {
return nil, nil, nil, errors.New("unexpected cipher states in message 1") return nil, nil, nil, oops.Errorf("unexpected cipher states in message 1")
} }
return negotiationData, handshakeMessage, handshakeState, nil return negotiationData, handshakeMessage, handshakeState, nil

View File

@ -1,9 +1,9 @@
package noise package noise
import ( import (
"errors"
"sync/atomic" "sync/atomic"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -17,7 +17,7 @@ func (c *NoiseSession) Read(b []byte) (int, error) {
"at": "(NoiseSession) Read", "at": "(NoiseSession) Read",
"reason": "session is closed", "reason": "session is closed",
}).Error("session is closed") }).Error("session is closed")
return 0, errors.New("session is closed") return 0, oops.Errorf("session is closed")
} }
if atomic.CompareAndSwapInt32(&c.activeCall, x, x+2) { if atomic.CompareAndSwapInt32(&c.activeCall, x, x+2) {
defer atomic.AddInt32(&c.activeCall, -2) defer atomic.AddInt32(&c.activeCall, -2)
@ -36,7 +36,7 @@ func (c *NoiseSession) Read(b []byte) (int, error) {
defer c.Mutex.Unlock() defer c.Mutex.Unlock()
if !c.handshakeComplete { if !c.handshakeComplete {
log.Error("NoiseSession Read: internal error - handshake still not complete after running") log.Error("NoiseSession Read: internal error - handshake still not complete after running")
return 0, errors.New("internal error") return 0, oops.Errorf("internal error")
} }
n, err := c.readPacketLocked(b) n, err := c.readPacketLocked(b)
if err != nil { if err != nil {
@ -52,7 +52,7 @@ func (c *NoiseSession) decryptPacket(data []byte) (int, []byte, error) {
if c.CipherState == nil { if c.CipherState == nil {
log.Error("Packet decryption: CipherState is nil") log.Error("Packet decryption: CipherState is nil")
return 0, nil, errors.New("CipherState is nil") return 0, nil, oops.Errorf("CipherState is nil")
} }
// Decrypt // Decrypt
decryptedData, err := c.CipherState.Decrypt(nil, nil, data) decryptedData, err := c.CipherState.Decrypt(nil, nil, data)

View File

@ -1,7 +1,6 @@
package noise package noise
import ( import (
"fmt"
"net" "net"
"sync" "sync"
"time" "time"
@ -10,6 +9,7 @@ import (
cb "github.com/emirpasic/gods/queues/circularbuffer" cb "github.com/emirpasic/gods/queues/circularbuffer"
"github.com/flynn/noise" "github.com/flynn/noise"
"github.com/samber/oops"
"github.com/go-i2p/go-i2p/lib/common/router_info" "github.com/go-i2p/go-i2p/lib/common/router_info"
"github.com/go-i2p/go-i2p/lib/transport" "github.com/go-i2p/go-i2p/lib/transport"
@ -101,7 +101,7 @@ func (s *NoiseSession) peerStaticKey() ([32]byte, error) {
return addr.StaticKey() return addr.StaticKey()
} }
} }
return [32]byte{}, fmt.Errorf("Remote static key error") return [32]byte{}, oops.Errorf("Remote static key error")
} }
func (s *NoiseSession) peerStaticIV() ([16]byte, error) { func (s *NoiseSession) peerStaticIV() ([16]byte, error) {
@ -114,7 +114,7 @@ func (s *NoiseSession) peerStaticIV() ([16]byte, error) {
return addr.InitializationVector() return addr.InitializationVector()
} }
} }
return [16]byte{}, fmt.Errorf("Remote static IV error") return [16]byte{}, oops.Errorf("Remote static IV error")
} }
// newBlock allocates a new packet, from hc's free list if possible. // newBlock allocates a new packet, from hc's free list if possible.
@ -147,7 +147,7 @@ func NewNoiseTransportSession(ri router_info.RouterInfo) (transport.TransportSes
return session, nil return session, nil
} }
log.Error("Failed to create NoiseTransportSession, all addresses failed") log.Error("Failed to create NoiseTransportSession, all addresses failed")
return nil, fmt.Errorf("Transport constructor error") return nil, oops.Errorf("Transport constructor error")
} }
func NewNoiseSession(ri router_info.RouterInfo) (*NoiseSession, error) { func NewNoiseSession(ri router_info.RouterInfo) (*NoiseSession, error) {

View File

@ -7,12 +7,11 @@ package noise
**/ **/
import ( import (
"errors"
"fmt"
"net" "net"
"sync" "sync"
"github.com/flynn/noise" "github.com/flynn/noise"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/go-i2p/go-i2p/lib/common/data" "github.com/go-i2p/go-i2p/lib/common/data"
@ -27,7 +26,7 @@ type NoiseTransport struct {
router_info.RouterInfo router_info.RouterInfo
transportStyle string transportStyle string
Listener net.Listener Listener net.Listener
//peerConnections map[data.Hash]transport.TransportSession // peerConnections map[data.Hash]transport.TransportSession
peerConnections map[data.Hash]*NoiseSession peerConnections map[data.Hash]*NoiseSession
} }
@ -84,7 +83,7 @@ func (noopt *NoiseTransport) SetIdentity(ident router_info.RouterInfo) (err erro
"at": "(NoiseTransport) SetIdentity", "at": "(NoiseTransport) SetIdentity",
"reason": "network socket is null", "reason": "network socket is null",
}).Error("network socket is null") }).Error("network socket is null")
err = errors.New("network socket is null") err = oops.Errorf("network socket is null")
return return
} }
log.Debug("NoiseTransport: Identity set successfully") log.Debug("NoiseTransport: Identity set successfully")
@ -100,7 +99,7 @@ func (noopt *NoiseTransport) GetSession(routerInfo router_info.RouterInfo) (tran
log.WithField("hash", hash).Debug("NoiseTransport: Getting session") log.WithField("hash", hash).Debug("NoiseTransport: Getting session")
if len(hash) == 0 { if len(hash) == 0 {
log.Error("NoiseTransport: RouterInfo has no IdentityHash") log.Error("NoiseTransport: RouterInfo has no IdentityHash")
return nil, errors.New("NoiseTransport: GetSession: RouterInfo has no IdentityHash") return nil, oops.Errorf("NoiseTransport: GetSession: RouterInfo has no IdentityHash")
} }
if t, ok := noopt.peerConnections[hash]; ok { if t, ok := noopt.peerConnections[hash]; ok {
log.Debug("NoiseTransport: Existing session found") log.Debug("NoiseTransport: Existing session found")
@ -194,7 +193,7 @@ func (s *NoiseTransport) localStaticKey() ([32]byte, error) {
return addr.StaticKey() return addr.StaticKey()
} }
} }
return [32]byte{}, fmt.Errorf("Remote static key error") return [32]byte{}, oops.Errorf("Remote static key error")
} }
func (s *NoiseTransport) localStaticIV() ([16]byte, error) { func (s *NoiseTransport) localStaticIV() ([16]byte, error) {
@ -207,7 +206,7 @@ func (s *NoiseTransport) localStaticIV() ([16]byte, error) {
return addr.InitializationVector() return addr.InitializationVector()
} }
} }
return [16]byte{}, fmt.Errorf("Remote static IV error") return [16]byte{}, oops.Errorf("Remote static IV error")
} }
func (h *NoiseTransport) HandshakeKey() *noise.DHKey { func (h *NoiseTransport) HandshakeKey() *noise.DHKey {

View File

@ -2,10 +2,9 @@ package noise
import ( import (
"encoding/binary" "encoding/binary"
"errors"
"fmt"
"sync/atomic" "sync/atomic"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -19,7 +18,7 @@ func (c *NoiseSession) Write(b []byte) (int, error) {
"at": "(NoiseSession) Write", "at": "(NoiseSession) Write",
"reason": "session is closed", "reason": "session is closed",
}).Error("session is closed") }).Error("session is closed")
return 0, errors.New("session is closed") return 0, oops.Errorf("session is closed")
} }
if atomic.CompareAndSwapInt32(&c.activeCall, x, x+2) { if atomic.CompareAndSwapInt32(&c.activeCall, x, x+2) {
defer atomic.AddInt32(&c.activeCall, -2) defer atomic.AddInt32(&c.activeCall, -2)
@ -38,7 +37,7 @@ func (c *NoiseSession) Write(b []byte) (int, error) {
defer c.Mutex.Unlock() defer c.Mutex.Unlock()
if !c.handshakeComplete { if !c.handshakeComplete {
log.Error("NoiseSession: Write - internal error, handshake still not complete") log.Error("NoiseSession: Write - internal error, handshake still not complete")
return 0, errors.New("internal error") return 0, oops.Errorf("internal error")
} }
n, err := c.writePacketLocked(b) n, err := c.writePacketLocked(b)
if err != nil { if err != nil {
@ -55,14 +54,14 @@ func (c *NoiseSession) encryptPacket(data []byte) (int, []byte, error) {
m := len(data) m := len(data)
if c.CipherState == nil { if c.CipherState == nil {
log.Error("NoiseSession: encryptPacket - CipherState is nil") log.Error("NoiseSession: encryptPacket - CipherState is nil")
return 0, nil, errors.New("CipherState is nil") return 0, nil, oops.Errorf("CipherState is nil")
} }
// Encrypt the data // Encrypt the data
encryptedData, err := c.CipherState.Encrypt(nil, nil, data) encryptedData, err := c.CipherState.Encrypt(nil, nil, data)
if err != nil { if err != nil {
log.WithError(err).Error("NoiseSession: encryptPacket - failed to encrypt data") log.WithError(err).Error("NoiseSession: encryptPacket - failed to encrypt data")
return 0, nil, fmt.Errorf("failed to encrypt: '%w'", err) return 0, nil, oops.Errorf("failed to encrypt: '%w'", err)
} }
// m := len(encryptedData) // m := len(encryptedData)

View File

@ -1,13 +1,14 @@
package ntcp package ntcp
import ( import (
"fmt"
"time" "time"
"github.com/go-i2p/go-i2p/lib/common/router_info" "github.com/go-i2p/go-i2p/lib/common/router_info"
"github.com/go-i2p/go-i2p/lib/crypto" "github.com/go-i2p/go-i2p/lib/crypto"
"github.com/go-i2p/go-i2p/lib/transport/noise" "github.com/go-i2p/go-i2p/lib/transport/noise"
"github.com/go-i2p/go-i2p/lib/transport/obfs" "github.com/go-i2p/go-i2p/lib/transport/obfs"
"github.com/samber/oops"
"golang.org/x/exp/rand" "golang.org/x/exp/rand"
) )
@ -97,7 +98,7 @@ func (s *NTCP2Session) peerStaticKey() ([32]byte, error) {
return addr.StaticKey() return addr.StaticKey()
} }
} }
return [32]byte{}, fmt.Errorf("Remote static key error") return [32]byte{}, oops.Errorf("Remote static key error")
} }
func (s *NTCP2Session) peerStaticIV() ([16]byte, error) { func (s *NTCP2Session) peerStaticIV() ([16]byte, error) {
@ -110,7 +111,7 @@ func (s *NTCP2Session) peerStaticIV() ([16]byte, error) {
return addr.InitializationVector() return addr.InitializationVector()
} }
} }
return [16]byte{}, fmt.Errorf("Remote static IV error") return [16]byte{}, oops.Errorf("Remote static IV error")
} }
// ObfuscateEphemeral implements NTCP2's key obfuscation using AES-256-CBC // ObfuscateEphemeral implements NTCP2's key obfuscation using AES-256-CBC

View File

@ -5,13 +5,14 @@ package ntcp
**/ **/
import ( import (
"fmt"
"net" "net"
"github.com/go-i2p/go-i2p/lib/common/router_info" "github.com/go-i2p/go-i2p/lib/common/router_info"
"github.com/go-i2p/go-i2p/lib/transport" "github.com/go-i2p/go-i2p/lib/transport"
"github.com/go-i2p/go-i2p/lib/transport/noise" "github.com/go-i2p/go-i2p/lib/transport/noise"
"github.com/go-i2p/go-i2p/lib/util/time/sntp" "github.com/go-i2p/go-i2p/lib/util/time/sntp"
"github.com/samber/oops"
) )
const ( const (
@ -74,11 +75,11 @@ func (t *NTCP2Transport) Accept() (net.Conn, error) {
// then check if it's a router address // then check if it's a router address
routerAddr, ok := remoteAddr.(*router_info.RouterInfo) routerAddr, ok := remoteAddr.(*router_info.RouterInfo)
if !ok { if !ok {
return nil, fmt.Errorf("remote address is not a router address") return nil, oops.Errorf("remote address is not a router address")
} }
// then check if it's compatible // then check if it's compatible
if !t.Compatible(*routerAddr) { if !t.Compatible(*routerAddr) {
return nil, fmt.Errorf("remote router address is not compatible with NTCP2") return nil, oops.Errorf("remote router address is not compatible with NTCP2")
} }
// Wrap connection with NTCP2 session // Wrap connection with NTCP2 session
session, err := NewNTCP2Session(remoteAddr.(router_info.RouterInfo)) // nil for incoming connections session, err := NewNTCP2Session(remoteAddr.(router_info.RouterInfo)) // nil for incoming connections
@ -102,7 +103,7 @@ func (s *NTCP2Transport) localStaticKey() ([32]byte, error) {
return addr.StaticKey() return addr.StaticKey()
} }
} }
return [32]byte{}, fmt.Errorf("Remote static key error") return [32]byte{}, oops.Errorf("Remote static key error")
} }
func (s *NTCP2Transport) localStaticIV() ([16]byte, error) { func (s *NTCP2Transport) localStaticIV() ([16]byte, error) {
@ -115,5 +116,5 @@ func (s *NTCP2Transport) localStaticIV() ([16]byte, error) {
return addr.InitializationVector() return addr.InitializationVector()
} }
} }
return [16]byte{}, fmt.Errorf("Remote static IV error") return [16]byte{}, oops.Errorf("Remote static IV error")
} }

View File

@ -1,15 +1,14 @@
package obfs package obfs
import ( import (
"fmt"
"github.com/go-i2p/go-i2p/lib/crypto" "github.com/go-i2p/go-i2p/lib/crypto"
"github.com/samber/oops"
) )
// ObfuscateEphemeralKey encrypts the ephemeral public key in the message using AES-256-CBC without padding // ObfuscateEphemeralKey encrypts the ephemeral public key in the message using AES-256-CBC without padding
func ObfuscateEphemeralKey(message []byte, aesKey *crypto.AESSymmetricKey) ([]byte, error) { func ObfuscateEphemeralKey(message []byte, aesKey *crypto.AESSymmetricKey) ([]byte, error) {
if len(message) < 32 { if len(message) < 32 {
return nil, fmt.Errorf("message is too short to contain ephemeral public key") return nil, oops.Errorf("message is too short to contain ephemeral public key")
} }
// Extract the ephemeral public key (first 32 bytes) // Extract the ephemeral public key (first 32 bytes)
@ -36,7 +35,7 @@ func ObfuscateEphemeralKey(message []byte, aesKey *crypto.AESSymmetricKey) ([]by
// DeobfuscateEphemeralKey decrypts the ephemeral public key in the message using AES-256-CBC without padding // DeobfuscateEphemeralKey decrypts the ephemeral public key in the message using AES-256-CBC without padding
func DeobfuscateEphemeralKey(message []byte, aesKey *crypto.AESSymmetricKey) ([]byte, error) { func DeobfuscateEphemeralKey(message []byte, aesKey *crypto.AESSymmetricKey) ([]byte, error) {
if len(message) < 32 { if len(message) < 32 {
return nil, fmt.Errorf("message is too short to contain ephemeral public key") return nil, oops.Errorf("message is too short to contain ephemeral public key")
} }
// Extract the encrypted ephemeral public key (first 32 bytes) // Extract the encrypted ephemeral public key (first 32 bytes)

View File

@ -2,10 +2,10 @@ package tunnel
import ( import (
"encoding/binary" "encoding/binary"
"errors"
common "github.com/go-i2p/go-i2p/lib/common/data" common "github.com/go-i2p/go-i2p/lib/common/data"
"github.com/go-i2p/logger" "github.com/go-i2p/logger"
"github.com/samber/oops"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -180,7 +180,7 @@ func (delivery_instructions DeliveryInstructions) Type() (int, error) {
return FIRST_FRAGMENT, nil return FIRST_FRAGMENT, nil
} }
log.Error("DeliveryInstructions contains no data") log.Error("DeliveryInstructions contains no data")
return 0, errors.New("DeliveryInstructions contains no data") return 0, oops.Errorf("DeliveryInstructions contains no data")
} }
// Read the integer stored in the 6-1 bits of a FOLLOW_ON_FRAGMENT's flag, indicating // Read the integer stored in the 6-1 bits of a FOLLOW_ON_FRAGMENT's flag, indicating
@ -212,7 +212,7 @@ func (delivery_instructions DeliveryInstructions) FragmentNumber() (int, error)
return fragNum, nil return fragNum, nil
} }
log.Error("Fragment Number only exists on FOLLOW_ON_FRAGMENT Delivery Instructions") log.Error("Fragment Number only exists on FOLLOW_ON_FRAGMENT Delivery Instructions")
return 0, errors.New("Fragment Number only exists on FOLLOW_ON_FRAGMENT Delivery Instructions") return 0, oops.Errorf("Fragment Number only exists on FOLLOW_ON_FRAGMENT Delivery Instructions")
} }
// Read the value of the 0 bit of a FOLLOW_ON_FRAGMENT, which is set to 1 to indicate the // Read the value of the 0 bit of a FOLLOW_ON_FRAGMENT, which is set to 1 to indicate the
@ -246,7 +246,7 @@ func (delivery_instructions DeliveryInstructions) LastFollowOnFragment() (bool,
return isLast, nil return isLast, nil
} }
log.Error("Last Fragment only exists for FOLLOW_ON_FRAGMENT Delivery Instructions") log.Error("Last Fragment only exists for FOLLOW_ON_FRAGMENT Delivery Instructions")
return false, errors.New("Last Fragment only exists for FOLLOW_ON_FRAGMENT Delivery Instructions") return false, oops.Errorf("Last Fragment only exists for FOLLOW_ON_FRAGMENT Delivery Instructions")
} }
// Return the delivery type for these DeliveryInstructions, can be of type // Return the delivery type for these DeliveryInstructions, can be of type
@ -270,7 +270,7 @@ func (delivery_instructions DeliveryInstructions) DeliveryType() (byte, error) {
return deliveryType, nil return deliveryType, nil
} }
log.Error("DeliveryInstructions contains no data") log.Error("DeliveryInstructions contains no data")
return 0, errors.New("DeliveryInstructions contains no data") return 0, oops.Errorf("DeliveryInstructions contains no data")
} }
// Check if the delay bit is set. This feature in unimplemented in the Java router. // Check if the delay bit is set. This feature in unimplemented in the Java router.
@ -304,7 +304,7 @@ func (delivery_instructions DeliveryInstructions) HasDelay() (bool, error) {
return delay, nil return delay, nil
} }
log.Error("DeliveryInstructions contains no data") log.Error("DeliveryInstructions contains no data")
return false, errors.New("DeliveryInstructions contains no data") return false, oops.Errorf("DeliveryInstructions contains no data")
} }
// Returns true if the Delivery Instructions are fragmented or false // Returns true if the Delivery Instructions are fragmented or false
@ -333,7 +333,7 @@ func (delivery_instructions DeliveryInstructions) Fragmented() (bool, error) {
// return ((delivery_instructions[0] & 0x08) == 0x08), nil // return ((delivery_instructions[0] & 0x08) == 0x08), nil
} }
log.Error("DeliveryInstructions contains no data") log.Error("DeliveryInstructions contains no data")
return false, errors.New("DeliveryInstructions contains no data") return false, oops.Errorf("DeliveryInstructions contains no data")
} }
// Check if the extended options bit is set. This feature in unimplemented in the Java router. // Check if the extended options bit is set. This feature in unimplemented in the Java router.
@ -368,7 +368,7 @@ func (delivery_instructions DeliveryInstructions) HasExtendedOptions() (bool, er
return extended_options, nil return extended_options, nil
} }
log.Error("DeliveryInstructions contains no data") log.Error("DeliveryInstructions contains no data")
return false, errors.New("DeliveryInstructions contains no data") return false, oops.Errorf("DeliveryInstructions contains no data")
} }
// Check if the DeliveryInstructions is of type DT_TUNNEL. // Check if the DeliveryInstructions is of type DT_TUNNEL.
@ -399,7 +399,7 @@ func (delivery_instructions DeliveryInstructions) HasHash() (bool, error) {
} }
if len(delivery_instructions) < min_size { if len(delivery_instructions) < min_size {
log.Error("Delivery Instructions indicates hash present but has too little data") log.Error("Delivery Instructions indicates hash present but has too little data")
return false, errors.New("Delivery Instructions indicates hash present but has too little data") return false, oops.Errorf("Delivery Instructions indicates hash present but has too little data")
} }
log.Debug("DeliveryInstructions has Hash") log.Debug("DeliveryInstructions has Hash")
} else { } else {
@ -425,11 +425,11 @@ func (delivery_instructions DeliveryInstructions) TunnelID() (tunnel_id uint32,
log.WithField("tunnel_id", tunnel_id).Debug("TunnelID retrieved") log.WithField("tunnel_id", tunnel_id).Debug("TunnelID retrieved")
} else { } else {
log.Error("DeliveryInstructions are invalid, too little data for Tunnel ID") log.Error("DeliveryInstructions are invalid, too little data for Tunnel ID")
err = errors.New("DeliveryInstructions are invalid, too little data for Tunnel ID") err = oops.Errorf("DeliveryInstructions are invalid, too little data for Tunnel ID")
} }
} else { } else {
log.Error("DeliveryInstructions are not of type DT_TUNNEL") log.Error("DeliveryInstructions are not of type DT_TUNNEL")
err = errors.New("DeliveryInstructions are not of type DT_TUNNEL") err = oops.Errorf("DeliveryInstructions are not of type DT_TUNNEL")
} }
return return
} }
@ -455,7 +455,7 @@ func (delivery_instructions DeliveryInstructions) Hash() (hash common.Hash, err
log.WithField("hash", hash).Debug("Hash retrieved for DT_TUNNEL") log.WithField("hash", hash).Debug("Hash retrieved for DT_TUNNEL")
} else { } else {
log.Error("DeliveryInstructions is invalid, not contain enough data for hash given type DT_TUNNEL") log.Error("DeliveryInstructions is invalid, not contain enough data for hash given type DT_TUNNEL")
err = errors.New("DeliveryInstructions is invalid, not contain enough data for hash given type DT_TUNNEL") err = oops.Errorf("DeliveryInstructions is invalid, not contain enough data for hash given type DT_TUNNEL")
} }
} else if delivery_type == DT_ROUTER { } else if delivery_type == DT_ROUTER {
if len(delivery_instructions) >= hash_end { if len(delivery_instructions) >= hash_end {
@ -463,11 +463,11 @@ func (delivery_instructions DeliveryInstructions) Hash() (hash common.Hash, err
log.WithField("hash", hash).Debug("Hash retrieved for DT_ROUTER") log.WithField("hash", hash).Debug("Hash retrieved for DT_ROUTER")
} else { } else {
log.Error("DeliveryInstructions is invalid, not contain enough data for hash given type DT_ROUTER") log.Error("DeliveryInstructions is invalid, not contain enough data for hash given type DT_ROUTER")
err = errors.New("DeliveryInstructions is invalid, not contain enough data for hash given type DT_ROUTER") err = oops.Errorf("DeliveryInstructions is invalid, not contain enough data for hash given type DT_ROUTER")
} }
} else { } else {
log.Error("No Hash on DeliveryInstructions not of type DT_TUNNEL or DT_ROUTER") log.Error("No Hash on DeliveryInstructions not of type DT_TUNNEL or DT_ROUTER")
err = errors.New("No Hash on DeliveryInstructions not of type DT_TUNNEL or DT_ROUTER") err = oops.Errorf("No Hash on DeliveryInstructions not of type DT_TUNNEL or DT_ROUTER")
} }
return return
} }
@ -493,7 +493,7 @@ func (delivery_instructions DeliveryInstructions) Delay() (delay_factor DelayFac
log.WithField("delay_factor", delay_factor).Debug("Delay factor retrieved for DT_TUNNEL") log.WithField("delay_factor", delay_factor).Debug("Delay factor retrieved for DT_TUNNEL")
} else { } else {
log.Error("DeliveryInstructions is invalid, does not contain enough data for DelayFactor") log.Error("DeliveryInstructions is invalid, does not contain enough data for DelayFactor")
err = errors.New("DeliveryInstructions is invalid, does not contain enough data for DelayFactor") err = oops.Errorf("DeliveryInstructions is invalid, does not contain enough data for DelayFactor")
return return
} }
} else if di_type == DT_ROUTER { } else if di_type == DT_ROUTER {
@ -502,7 +502,7 @@ func (delivery_instructions DeliveryInstructions) Delay() (delay_factor DelayFac
log.WithField("delay_factor", delay_factor).Debug("Delay factor retrieved for DT_ROUTER") log.WithField("delay_factor", delay_factor).Debug("Delay factor retrieved for DT_ROUTER")
} else { } else {
log.Error("DeliveryInstructions is invalid, does not contain enough data for DelayFactor") log.Error("DeliveryInstructions is invalid, does not contain enough data for DelayFactor")
err = errors.New("DeliveryInstructions is invalid, does not contain enough data for DelayFactor") err = oops.Errorf("DeliveryInstructions is invalid, does not contain enough data for DelayFactor")
return return
} }
} else { } else {
@ -529,7 +529,7 @@ func (delivery_instructions DeliveryInstructions) MessageID() (msgid uint32, err
log.WithField("message_id", msgid).Debug("MessageID retrieved for FOLLOW_ON_FRAGMENT") log.WithField("message_id", msgid).Debug("MessageID retrieved for FOLLOW_ON_FRAGMENT")
} else { } else {
log.Error("DeliveryInstructions are invalid, not enough data for Message ID") log.Error("DeliveryInstructions are invalid, not enough data for Message ID")
err = errors.New("DeliveryInstructions are invalid, not enough data for Message ID") err = oops.Errorf("DeliveryInstructions are invalid, not enough data for Message ID")
} }
} else if di_type == FIRST_FRAGMENT { } else if di_type == FIRST_FRAGMENT {
var message_id_index int var message_id_index int
@ -543,11 +543,11 @@ func (delivery_instructions DeliveryInstructions) MessageID() (msgid uint32, err
log.WithField("message_id", msgid).Debug("MessageID retrieved for FIRST_FRAGMENT") log.WithField("message_id", msgid).Debug("MessageID retrieved for FIRST_FRAGMENT")
} else { } else {
log.Error("DeliveryInstructions are invalid, not enough data for Message ID") log.Error("DeliveryInstructions are invalid, not enough data for Message ID")
err = errors.New("DeliveryInstructions are invalid, not enough data for Message ID") err = oops.Errorf("DeliveryInstructions are invalid, not enough data for Message ID")
} }
} else { } else {
log.Error("No Message ID for DeliveryInstructions not of type FIRST_FRAGMENT or FOLLOW_ON_FRAGMENT") log.Error("No Message ID for DeliveryInstructions not of type FIRST_FRAGMENT or FOLLOW_ON_FRAGMENT")
err = errors.New("No Message ID for DeliveryInstructions not of type FIRST_FRAGMENT or FOLLOW_ON_FRAGMENT") err = oops.Errorf("No Message ID for DeliveryInstructions not of type FIRST_FRAGMENT or FOLLOW_ON_FRAGMENT")
} }
return return
} }
@ -570,13 +570,13 @@ func (delivery_instructions DeliveryInstructions) ExtendedOptions() (data []byte
} }
if len(delivery_instructions) < extended_options_index+2 { if len(delivery_instructions) < extended_options_index+2 {
log.Error("DeliveryInstructions are invalid, length is shorter than required for Extended Options") log.Error("DeliveryInstructions are invalid, length is shorter than required for Extended Options")
err = errors.New("DeliveryInstructions are invalid, length is shorter than required for Extended Options") err = oops.Errorf("DeliveryInstructions are invalid, length is shorter than required for Extended Options")
return return
} else { } else {
extended_options_size := common.Integer([]byte{delivery_instructions[extended_options_index]}) extended_options_size := common.Integer([]byte{delivery_instructions[extended_options_index]})
if len(delivery_instructions) < extended_options_index+1+extended_options_size.Int() { if len(delivery_instructions) < extended_options_index+1+extended_options_size.Int() {
log.Error("DeliveryInstructions are invalid, length is shorter than specified in Extended Options") log.Error("DeliveryInstructions are invalid, length is shorter than specified in Extended Options")
err = errors.New("DeliveryInstructions are invalid, length is shorter than specified in Extended Options") err = oops.Errorf("DeliveryInstructions are invalid, length is shorter than specified in Extended Options")
return return
} else { } else {
data = delivery_instructions[extended_options_index+1 : extended_options_size.Int()] data = delivery_instructions[extended_options_index+1 : extended_options_size.Int()]
@ -587,7 +587,7 @@ func (delivery_instructions DeliveryInstructions) ExtendedOptions() (data []byte
} }
} else { } else {
log.Error("DeliveryInstruction does not have the ExtendedOptions flag set") log.Error("DeliveryInstruction does not have the ExtendedOptions flag set")
err = errors.New("DeliveryInstruction does not have the ExtendedOptions flag set") err = oops.Errorf("DeliveryInstruction does not have the ExtendedOptions flag set")
} }
return return
} }
@ -606,7 +606,7 @@ func (delivery_instructions DeliveryInstructions) FragmentSize() (frag_size uint
log.WithField("fragment_size", frag_size).Debug("FragmentSize retrieved for FOLLOW_ON_FRAGMENT") log.WithField("fragment_size", frag_size).Debug("FragmentSize retrieved for FOLLOW_ON_FRAGMENT")
} else { } else {
log.Error("DeliveryInstructions are invalid, not enough data for Fragment Size") log.Error("DeliveryInstructions are invalid, not enough data for Fragment Size")
err = errors.New("DeliveryInstructions are invalid, not enough data for Fragment Size") err = oops.Errorf("DeliveryInstructions are invalid, not enough data for Fragment Size")
} }
} else if di_type == FIRST_FRAGMENT { } else if di_type == FIRST_FRAGMENT {
var fragment_size_index int var fragment_size_index int
@ -620,11 +620,11 @@ func (delivery_instructions DeliveryInstructions) FragmentSize() (frag_size uint
log.WithField("fragment_size", frag_size).Debug("FragmentSize retrieved for FIRST_FRAGMENT") log.WithField("fragment_size", frag_size).Debug("FragmentSize retrieved for FIRST_FRAGMENT")
} else { } else {
log.Error("DeliveryInstructions are invalid, not enough data for Fragment Size") log.Error("DeliveryInstructions are invalid, not enough data for Fragment Size")
err = errors.New("DeliveryInstructions are invalid, not enough data for Fragment Size") err = oops.Errorf("DeliveryInstructions are invalid, not enough data for Fragment Size")
} }
} else { } else {
log.Error("No Fragment Size for DeliveryInstructions not of type FIRST_FRAGMENT or FOLLOW_ON_FRAGMENT") log.Error("No Fragment Size for DeliveryInstructions not of type FIRST_FRAGMENT or FOLLOW_ON_FRAGMENT")
err = errors.New("No Fragment Size for DeliveryInstructions not of type FIRST_FRAGMENT or FOLLOW_ON_FRAGMENT") err = oops.Errorf("No Fragment Size for DeliveryInstructions not of type FIRST_FRAGMENT or FOLLOW_ON_FRAGMENT")
} }
return return
} }
@ -668,7 +668,7 @@ func (delivery_instructions DeliveryInstructions) message_id_index() (message_id
return message_id, nil return message_id, nil
} else { } else {
log.Error("DeliveryInstruction must be fragmented to have a Message ID") log.Error("DeliveryInstruction must be fragmented to have a Message ID")
return 0, errors.New("DeliveryInstruction must be fragmented to have a Message ID") return 0, oops.Errorf("DeliveryInstruction must be fragmented to have a Message ID")
} }
} }
@ -719,7 +719,7 @@ func (delivery_instructions DeliveryInstructions) extended_options_index() (exte
} else { } else {
log.Error("DeliveryInstruction does not have the ExtendedOptions flag set") log.Error("DeliveryInstruction does not have the ExtendedOptions flag set")
err = errors.New("DeliveryInstruction does not have the ExtendedOptions flag set") err = oops.Errorf("DeliveryInstruction does not have the ExtendedOptions flag set")
} }
return return
} }
@ -845,7 +845,7 @@ func maybeAppendMessageID(di_flag DeliveryInstructions, di_type int, data, curre
} }
if len(data) < message_id_index+4 { if len(data) < message_id_index+4 {
log.Error("Data is too short to contain message ID in FIRST_FRAGMENT") log.Error("Data is too short to contain message ID in FIRST_FRAGMENT")
err = errors.New("data is too short to contain message ID in FIRST_FRAGMENT") err = oops.Errorf("data is too short to contain message ID in FIRST_FRAGMENT")
} else { } else {
now = append(current, data[message_id_index:message_id_index+4]...) now = append(current, data[message_id_index:message_id_index+4]...)
log.Debug("MessageID appended for FIRST_FRAGMENT") log.Debug("MessageID appended for FIRST_FRAGMENT")
@ -854,7 +854,7 @@ func maybeAppendMessageID(di_flag DeliveryInstructions, di_type int, data, curre
} else if di_type == FOLLOW_ON_FRAGMENT { } else if di_type == FOLLOW_ON_FRAGMENT {
if len(data) < 5 { if len(data) < 5 {
log.Error("Data is too short to contain message ID in FOLLOW_ON_FRAGMENT") log.Error("Data is too short to contain message ID in FOLLOW_ON_FRAGMENT")
err = errors.New("data is too short to contain message ID in FOLLOW_ON_FRAGMENT") err = oops.Errorf("data is too short to contain message ID in FOLLOW_ON_FRAGMENT")
} else { } else {
now = append(current, data[1:5]...) now = append(current, data[1:5]...)
log.Debug("MessageID appended for FOLLOW_ON_FRAGMENT") log.Debug("MessageID appended for FOLLOW_ON_FRAGMENT")
@ -886,7 +886,7 @@ func maybeAppendSize(di_flag DeliveryInstructions, di_type int, data, current []
} else if di_type == FOLLOW_ON_FRAGMENT { } else if di_type == FOLLOW_ON_FRAGMENT {
if len(data) < 7 { if len(data) < 7 {
log.Error("Data is too short to contain size data") log.Error("Data is too short to contain size data")
err = errors.New("data is too short to contain size data") err = oops.Errorf("data is too short to contain size data")
} else { } else {
now = append(now, data[5:7]...) now = append(now, data[5:7]...)
log.Debug("Size appended for FOLLOW_ON_FRAGMENT") log.Debug("Size appended for FOLLOW_ON_FRAGMENT")
@ -899,7 +899,7 @@ func readDeliveryInstructions(data []byte) (instructions DeliveryInstructions, r
log.Debug("Reading DeliveryInstructions") log.Debug("Reading DeliveryInstructions")
if len(data) < 1 { if len(data) < 1 {
log.Error("No data provided") log.Error("No data provided")
err = errors.New("no data provided") err = oops.Errorf("no data provided")
return return
} }