diff --git a/go.mod b/go.mod index 1fc0d8b..9115ff1 100644 --- a/go.mod +++ b/go.mod @@ -1,44 +1,50 @@ module github.com/go-i2p/go-i2p -go 1.23.1 +go 1.23.3 + +toolchain go1.23.5 require ( github.com/beevik/ntp v1.4.3 github.com/emirpasic/gods v1.18.1 github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e github.com/flynn/noise v1.1.0 - github.com/go-i2p/logger v0.0.0-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/spf13/cobra v1.8.1 + github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.19.0 - github.com/stretchr/testify v1.9.0 - go.step.sm/crypto v0.53.0 - golang.org/x/crypto v0.27.0 + github.com/stretchr/testify v1.10.0 + go.step.sm/crypto v0.58.1 + golang.org/x/crypto v0.35.0 + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa gopkg.in/yaml.v3 v3.0.1 ) require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect + github.com/magiconair/properties v1.8.9 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/oklog/ulid/v2 v2.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/samber/lo v1.49.1 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.7.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/afero v1.12.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/subosito/gotenv v1.6.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.9.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.29.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.18.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/go.sum b/go.sum index f6b3f50..6a04797 100644 --- a/go.sum +++ b/go.sum @@ -2,7 +2,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho= github.com/beevik/ntp v1.4.3/go.mod h1:Unr8Zg+2dRn7d8bHFuehIMSvvUYssHMxW3Q5Nx4RW5Q= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -15,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/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-i2p/logger v0.0.0-20241121221545-ce7ceeba699a h1:z19Zzn9uX/bGxzQ0XTSrXe+bl29XW60n6kUpg1elscA= -github.com/go-i2p/logger v0.0.0-20241121221545-ce7ceeba699a/go.mod h1:qMpzyCtcUAeVIe38fKEmJyWoyGfLN2N9MmgiM6iQBdQ= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c h1:VTiECn3dFEmUlZjto+wOwJ7SSJTHPLyNprQMR5HzIMI= +github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c/go.mod h1:te7Zj3g3oMeIl8uBXAgO62UKmZ6m6kHRNg1Mm+X8Hzk= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -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.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= +github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= +github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= +github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= +github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= +github.com/samber/oops v1.16.1 h1:XlKkXsWM5g8hE4C+sEV9n0X282fZn3XabVmAKU2RiHI= +github.com/samber/oops v1.16.1/go.mod h1:8eXgMAJcDXRAijQsFRhfy/EHDOTiSvwkg6khFqFK078= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= -github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -go.step.sm/crypto v0.53.0 h1:+1as1ogzuCzx15/468M4mEC5juogI5a0Fzbsyh1CuYY= -go.step.sm/crypto v0.53.0/go.mod h1:AqLU78RqNUHepLzyOWZuNN/2++Lu7dZENdO9UzWOGSk= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.step.sm/crypto v0.58.1 h1:2PpEYTbytA3el9dW0gh9uJEe/CR/J6wS+x2vWYLG83M= +go.step.sm/crypto v0.58.1/go.mod h1:yluOL5OqY7mXGGQ7JUmAv/6h8T8Ge3yXdlEESWHOqDQ= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/lib/common/certificate/certificate.go b/lib/common/certificate/certificate.go index f351ca8..fc45d38 100644 --- a/lib/common/certificate/certificate.go +++ b/lib/common/certificate/certificate.go @@ -4,9 +4,9 @@ package certificate import ( "encoding/binary" - "errors" "fmt" + "github.com/samber/oops" "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), "reason": "too short (len < CERT_MIN_SIZE)" + fmt.Sprintf("%d", certificate.kind.Int()), }).Error("invalid certificate, empty") - err = fmt.Errorf("error parsing certificate: certificate is empty") + err = oops.Errorf("error parsing certificate: certificate is empty") return case 1, 2: certificate.kind = Integer(data[0 : len(data)-1]) @@ -168,7 +168,7 @@ func readCertificate(data []byte) (certificate Certificate, err error) { "certificate_bytes_length": len(data), "reason": "too short (len < CERT_MIN_SIZE)" + fmt.Sprintf("%d", certificate.kind.Int()), }).Error("invalid certificate, too short") - err = fmt.Errorf("error parsing certificate: certificate is too short") + err = oops.Errorf("error parsing certificate: certificate is too short") return default: certificate.kind = Integer(data[0:1]) @@ -176,7 +176,7 @@ func readCertificate(data []byte) (certificate Certificate, err error) { payloadLength := len(data) - CERT_MIN_SIZE certificate.payload = data[CERT_MIN_SIZE:] if certificate.len.Int() > len(data)-CERT_MIN_SIZE { - err = fmt.Errorf("certificate parsing warning: certificate data is shorter than specified by length") + err = oops.Errorf("certificate parsing warning: certificate data is shorter than specified by length") log.WithFields(logrus.Fields{ "at": "(Certificate) NewCertificate", "certificate_bytes_length": certificate.len.Int(), @@ -222,12 +222,12 @@ func NewCertificate() *Certificate { func NewCertificateDeux(certType int, payload []byte) (*Certificate, error) { if certType < 0 || certType > 255 { - return nil, fmt.Errorf("invalid certificate type: %d", certType) + return nil, oops.Errorf("invalid certificate type: %d", certType) } certTypeByte := byte(certType) if len(payload) > 65535 { - return nil, fmt.Errorf("payload too long: %d bytes", len(payload)) + return nil, oops.Errorf("payload too long: %d bytes", len(payload)) } _len, err := NewIntegerFromInt(len(payload), 2) @@ -255,12 +255,12 @@ func NewCertificateWithType(certType uint8, payload []byte) (*Certificate, error case CERT_NULL, CERT_HASHCASH, CERT_HIDDEN, CERT_SIGNED, CERT_MULTIPLE, CERT_KEY: // Valid type default: - return nil, fmt.Errorf("invalid certificate type: %d", certType) + return nil, oops.Errorf("invalid certificate type: %d", certType) } // For NULL certificates, payload should be empty if certType == CERT_NULL && len(payload) > 0 { - return nil, errors.New("NULL certificates must have empty payload") + return nil, oops.Errorf("NULL certificates must have empty payload") } length, _ := NewIntegerFromInt(len(payload), 2) @@ -280,10 +280,10 @@ func NewCertificateWithType(certType uint8, payload []byte) (*Certificate, error func GetSignatureTypeFromCertificate(cert Certificate) (int, error) { if cert.Type() != CERT_KEY { - return 0, fmt.Errorf("unexpected certificate type: %d", cert.Type()) + return 0, oops.Errorf("unexpected certificate type: %d", cert.Type()) } if len(cert.payload) < 4 { - return 0, fmt.Errorf("certificate payload too short to contain signature type") + return 0, oops.Errorf("certificate payload too short to contain signature type") } sigType := int(binary.BigEndian.Uint16(cert.payload[2:4])) // Changed offset to read signing key type return sigType, nil diff --git a/lib/common/data/date.go b/lib/common/data/date.go index fc0655d..a25aeec 100644 --- a/lib/common/data/date.go +++ b/lib/common/data/date.go @@ -2,10 +2,10 @@ package data import ( - "errors" "time" "github.com/go-i2p/logger" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -57,7 +57,7 @@ func ReadDate(data []byte) (date Date, remainder []byte, err error) { log.WithFields(logrus.Fields{ "data": data, }).Error("ReadDate: data is too short") - err = errors.New("ReadDate: data is too short") + err = oops.Errorf("ReadDate: data is too short") return } copy(date[:], data[:8]) diff --git a/lib/common/data/errors.go b/lib/common/data/errors.go index f8b17de..be76237 100644 --- a/lib/common/data/errors.go +++ b/lib/common/data/errors.go @@ -1,23 +1,24 @@ package data import ( - "errors" "fmt" + + "github.com/samber/oops" ) var ( - ErrZeroLength = errors.New("error parsing string: zero length") - ErrDataTooShort = errors.New("string parsing warning: string data is shorter than specified by length") - ErrDataTooLong = errors.New("string parsing warning: string contains data beyond length") - ErrLengthMismatch = errors.New("error reading I2P string, length does not match data") - ErrMappingLengthMismatch = errors.New("warning parsing mapping: mapping length exceeds provided data") + ErrZeroLength = oops.Errorf("error parsing string: zero length") + ErrDataTooShort = oops.Errorf("string parsing warning: string data is shorter than specified by length") + ErrDataTooLong = oops.Errorf("string parsing warning: string contains data beyond length") + ErrLengthMismatch = oops.Errorf("error reading I2P string, length does not match data") + ErrMappingLengthMismatch = oops.Errorf("warning parsing mapping: mapping length exceeds provided data") ) // WrapErrors compiles a slice of errors and returns them wrapped together as a single error. func WrapErrors(errs []error) error { var err error for i, e := range errs { - err = fmt.Errorf("%v\n\t%d: %v", err, i, e) + err = oops.Errorf("%v\n\t%d: %v", err, i, e) } return err } diff --git a/lib/common/data/mapping.go b/lib/common/data/mapping.go index 1b322c2..d9aa9b4 100644 --- a/lib/common/data/mapping.go +++ b/lib/common/data/mapping.go @@ -1,8 +1,7 @@ package data import ( - "errors" - + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -164,7 +163,7 @@ func ReadMapping(bytes []byte) (mapping Mapping, remainder []byte, err []error) "at": "ReadMapping", "reason": "zero length", }).Warn("mapping format violation") - e := errors.New("zero length") + e := oops.Errorf("zero length") err = append(err, e) return } @@ -184,7 +183,7 @@ func ReadMapping(bytes []byte) (mapping Mapping, remainder []byte, err []error) "expected_size": size.Int(), "actual_size": len(remainder), }).Warn("mapping format violation: mapping length exceeds provided data") - e := errors.New("warning parsing mapping: mapping length exceeds provided data") + e := oops.Errorf("warning parsing mapping: mapping length exceeds provided data") err = append(err, e) // Use whatever data is available (recovery) @@ -209,7 +208,7 @@ func ReadMapping(bytes []byte) (mapping Mapping, remainder []byte, err []error) "at": "ReadMapping", "reason": "error parsing mapping values", }).Warn("mapping format violation") - e := errors.New("error parsing mapping values") + e := oops.Errorf("error parsing mapping values") err = append(err, e) } if len(remainder) > 0 { // Handle extra bytes beyond mapping length @@ -217,7 +216,7 @@ func ReadMapping(bytes []byte) (mapping Mapping, remainder []byte, err []error) "expected_size": size.Int(), "actual_size": len(remainder), }).Error("mapping format violation: data exists beyond length of mapping") - e := errors.New("warning parsing mapping: data exists beyond length of mapping") + e := oops.Errorf("warning parsing mapping: data exists beyond length of mapping") err = append(err, e) // Slice the exact mapping bytes diff --git a/lib/common/data/mapping_test.go b/lib/common/data/mapping_test.go index 69065c5..0b76685 100644 --- a/lib/common/data/mapping_test.go +++ b/lib/common/data/mapping_test.go @@ -2,9 +2,9 @@ package data import ( "bytes" - "errors" "testing" + "github.com/samber/oops" "github.com/stretchr/testify/assert" ) @@ -154,7 +154,7 @@ func TestFullGoMapToMappingProducesCorrectMapping(t *testing.T) { func TestStopValueReadTrueWhenCorrectErr(t *testing.T) { assert := assert.New(t) - status := stopValueRead(errors.New("error parsing string: zero length")) + status := stopValueRead(oops.Errorf("error parsing string: zero length")) assert.Equal(true, status, "stopValueRead() did not return true when String error found") } @@ -162,7 +162,7 @@ func TestStopValueReadTrueWhenCorrectErr(t *testing.T) { func TestStopValueReadFalseWhenWrongErr(t *testing.T) { assert := assert.New(t) - status := stopValueRead(errors.New("something else")) + status := stopValueRead(oops.Errorf("something else")) assert.Equal(false, status, "stopValueRead() did not return false when non String error found") } diff --git a/lib/common/data/mapping_values.go b/lib/common/data/mapping_values.go index 7c84cf5..c81bec5 100644 --- a/lib/common/data/mapping_values.go +++ b/lib/common/data/mapping_values.go @@ -1,9 +1,9 @@ package data import ( - "errors" "sort" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -90,7 +90,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal "at": "(Mapping) Values", "reason": "data shorter than expected", }).Error("mapping contained no data") - errs = []error{errors.New("mapping contained no data")} + errs = []error{oops.Errorf("mapping contained no data")} return } map_values := make(MappingValues, 0) @@ -103,7 +103,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal "mapping_length_field": int_map_length, "reason": "data longer than expected", }).Warn("mapping format warning") - errs = append(errs, errors.New("warning parsing mapping: data exists beyond length of mapping")) + errs = append(errs, oops.Errorf("warning parsing mapping: data exists beyond length of mapping")) } else if int_map_length > mapping_len { log.WithFields(logrus.Fields{ "at": "(Mapping) Values", @@ -111,7 +111,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal "mapping_length_field": int_map_length, "reason": "data shorter than expected", }).Warn("mapping format warning") - errs = append(errs, errors.New("warning parsing mapping: mapping length exceeds provided data")) + errs = append(errs, oops.Errorf("warning parsing mapping: mapping length exceeds provided data")) } encounteredKeysMap := map[string]bool{} @@ -158,7 +158,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal "key": string(key_str), }).Error("mapping format violation") log.Printf("DUPE: %s", key_str) - errs = append(errs, errors.New("mapping format violation, duplicate key in mapping")) + errs = append(errs, oops.Errorf("mapping format violation, duplicate key in mapping")) // Based on other implementations this does not seem to happen often? // Java throws an exception in this case, the base object is a Hashmap so the value is overwritten and an exception is thrown. // i2pd as far as I can tell just overwrites the original value @@ -171,7 +171,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal "reason": "expected =", "value:": string(remainder), }).Warn("mapping format violation") - errs = append(errs, errors.New("mapping format violation, expected =")) + errs = append(errs, oops.Errorf("mapping format violation, expected =")) log.Printf("ERRVAL: %s", remainder) break } else { @@ -197,7 +197,7 @@ func ReadMappingValues(remainder []byte, map_length Integer) (values *MappingVal "reason": "expected ;", "value:": string(remainder), }).Warn("mapping format violation") - errs = append(errs, errors.New("mapping format violation, expected ;")) + errs = append(errs, oops.Errorf("mapping format violation, expected ;")) break } else { remainder = remainder[1:] diff --git a/lib/common/data/string.go b/lib/common/data/string.go index a8ffd57..69f1b33 100644 --- a/lib/common/data/string.go +++ b/lib/common/data/string.go @@ -1,8 +1,7 @@ package data import ( - "errors" - + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -124,7 +123,7 @@ func ToI2PString(data string) (str I2PString, err error) { "max_len": STRING_MAX_SIZE, "reason": "too much data", }).Error("cannot create I2P string") - err = errors.New("cannot store that much data in I2P string") + err = oops.Errorf("cannot store that much data in I2P string") return } i2p_string := []byte{byte(data_len)} diff --git a/lib/common/key_certificate/key_certificate.go b/lib/common/key_certificate/key_certificate.go index 7d2c833..bba4fed 100644 --- a/lib/common/key_certificate/key_certificate.go +++ b/lib/common/key_certificate/key_certificate.go @@ -31,6 +31,7 @@ import ( "fmt" "github.com/go-i2p/go-i2p/lib/common/signature" + "github.com/samber/oops" "github.com/go-i2p/logger" "github.com/sirupsen/logrus" @@ -148,7 +149,7 @@ func (keyCertificate KeyCertificate) ConstructPublicKey(data []byte) (public_key "required_len": KEYCERT_PUBKEY_SIZE, "reason": "not enough data", }).Error("error constructing public key") - err = fmt.Errorf("error constructing public key: not enough data") + err = oops.Errorf("error constructing public key: not enough data") return } switch key_type { @@ -191,7 +192,7 @@ var SignaturePublicKeySizes = map[uint16]int{ func (keyCertificate *KeyCertificate) CryptoPublicKeySize() (int, error) { size, exists := CryptoPublicKeySizes[uint16(keyCertificate.CpkType.Int())] if !exists { - return 0, fmt.Errorf("unknown crypto key type: %d", keyCertificate.CpkType.Int()) + return 0, oops.Errorf("unknown crypto key type: %d", keyCertificate.CpkType.Int()) } return size, nil } @@ -240,7 +241,7 @@ func (keyCertificate KeyCertificate) ConstructSigningPublicKey(data []byte) (sig "required_len": KEYCERT_SPK_SIZE, "reason": "not enough data", }).Error("error constructing signing public key") - err = fmt.Errorf("error constructing signing public key: not enough data") + err = oops.Errorf("error constructing signing public key: not enough data") return } switch signing_key_type { @@ -297,7 +298,7 @@ func (keyCertificate KeyCertificate) ConstructSigningPublicKey(data []byte) (sig log.WithFields(logrus.Fields{ "signing_key_type": signing_key_type, }).Warn("Unknown signing key type") - return nil, fmt.Errorf("unknown signing key type") + return nil, oops.Errorf("unknown signing key type") } return @@ -365,11 +366,11 @@ func NewKeyCertificate(bytes []byte) (key_certificate *KeyCertificate, remainder } if certificate.Type() != CERT_KEY { - return nil, remainder, fmt.Errorf("invalid certificate type: %d", certificate.Type()) + return nil, remainder, oops.Errorf("invalid certificate type: %d", certificate.Type()) } if len(certificate.Data()) < 4 { - return nil, remainder, fmt.Errorf("key certificate data too short") + return nil, remainder, oops.Errorf("key certificate data too short") } log.Println("Certificate Data in NewKeyCertificate: ", certificate.Data()[0:2], certificate.Data()[2:4]) @@ -393,7 +394,7 @@ func NewKeyCertificate(bytes []byte) (key_certificate *KeyCertificate, remainder func KeyCertificateFromCertificate(cert Certificate) (*KeyCertificate, error) { if cert.Type() != CERT_KEY { - return nil, fmt.Errorf("expected Key Certificate type, got %d", cert.Type()) + return nil, oops.Errorf("expected Key Certificate type, got %d", cert.Type()) } data := cert.Data() @@ -401,7 +402,7 @@ func KeyCertificateFromCertificate(cert Certificate) (*KeyCertificate, error) { fmt.Printf("Certificate Data Bytes in KeyCertificateFromCertificate: %v\n", data) if len(data) < 4 { - return nil, fmt.Errorf("certificate payload too short in KeyCertificateFromCertificate") + return nil, oops.Errorf("certificate payload too short in KeyCertificateFromCertificate") } cpkTypeBytes := data[0:2] diff --git a/lib/common/keys_and_cert/keys_and_cert.go b/lib/common/keys_and_cert/keys_and_cert.go index f541e85..0a9856b 100644 --- a/lib/common/keys_and_cert/keys_and_cert.go +++ b/lib/common/keys_and_cert/keys_and_cert.go @@ -2,10 +2,8 @@ package keys_and_cert import ( - "errors" - "fmt" - "github.com/go-i2p/logger" + "github.com/samber/oops" . "github.com/go-i2p/go-i2p/lib/common/certificate" . "github.com/go-i2p/go-i2p/lib/common/key_certificate" @@ -154,7 +152,7 @@ func ReadKeysAndCert(data []byte) (keys_and_cert KeysAndCert, remainder []byte, "required_len": KEYS_AND_CERT_MIN_SIZE, "reason": "not enough data", }).Error("error parsing keys and cert") - err = errors.New("error parsing KeysAndCert: data is smaller than minimum valid size") + err = oops.Errorf("error parsing KeysAndCert: data is smaller than minimum valid size") return } @@ -217,7 +215,7 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain dataLen := len(data) if dataLen < minDataLength { - err = fmt.Errorf("error parsing KeysAndCert: data is smaller than minimum valid size, got %d bytes", dataLen) + err = oops.Errorf("error parsing KeysAndCert: data is smaller than minimum valid size, got %d bytes", dataLen) log.WithError(err).Error("Data is smaller than minimum valid size") return } @@ -228,7 +226,7 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain // Extract public key publicKeyData := data[:pubKeySize] if len(publicKeyData) != pubKeySize { - err = errors.New("invalid ElGamal public key length") + err = oops.Errorf("invalid ElGamal public key length") log.WithError(err).Error("Invalid ElGamal public key length") return } @@ -244,7 +242,7 @@ func ReadKeysAndCertElgAndEd25519(data []byte) (keysAndCert *KeysAndCert, remain // Extract signing public key signingPubKeyData := data[paddingEnd : paddingEnd+sigKeySize] if len(signingPubKeyData) != sigKeySize { - err = errors.New("invalid Ed25519 public key length") + err = oops.Errorf("invalid Ed25519 public key length") log.WithError(err).Error("Invalid Ed25519 public key length") return } @@ -273,14 +271,14 @@ func constructPublicKey(data []byte, cryptoType uint16) (crypto.RecievingPublicK switch cryptoType { case CRYPTO_KEY_TYPE_ELGAMAL: if len(data) != 256 { - return nil, errors.New("invalid ElGamal public key length") + return nil, oops.Errorf("invalid ElGamal public key length") } var elgPublicKey crypto.ElgPublicKey copy(elgPublicKey[:], data) return elgPublicKey, nil // Handle other crypto types... default: - return nil, fmt.Errorf("unsupported crypto key type: %d", cryptoType) + return nil, oops.Errorf("unsupported crypto key type: %d", cryptoType) } } @@ -288,12 +286,12 @@ func constructSigningPublicKey(data []byte, sigType uint16) (crypto.SigningPubli switch sigType { case SIGNATURE_TYPE_ED25519_SHA512: if len(data) != 32 { - return nil, errors.New("invalid Ed25519 public key length") + return nil, oops.Errorf("invalid Ed25519 public key length") } return crypto.Ed25519PublicKey(data), nil // Handle other signature types... default: - return nil, fmt.Errorf("unsupported signature key type: %d", sigType) + return nil, oops.Errorf("unsupported signature key type: %d", sigType) } } @@ -309,7 +307,7 @@ func NewKeysAndCert( if keyCertificate == nil { log.Error("KeyCertificate is nil") - return nil, errors.New("KeyCertificate cannot be nil") + return nil, oops.Errorf("KeyCertificate cannot be nil") } // Get actual key sizes from certificate @@ -323,7 +321,7 @@ func NewKeysAndCert( "expected_size": pubKeySize, "actual_size": publicKey.Len(), }).Error("Invalid publicKey size") - return nil, fmt.Errorf("publicKey has invalid size: expected %d, got %d", pubKeySize, publicKey.Len()) + return nil, oops.Errorf("publicKey has invalid size: expected %d, got %d", pubKeySize, publicKey.Len()) } } @@ -334,7 +332,7 @@ func NewKeysAndCert( "expected_size": sigKeySize, "actual_size": signingPublicKey.Len(), }).Error("Invalid signingPublicKey size") - return nil, fmt.Errorf("signingPublicKey has invalid size: expected %d, got %d", sigKeySize, signingPublicKey.Len()) + return nil, oops.Errorf("signingPublicKey has invalid size: expected %d, got %d", sigKeySize, signingPublicKey.Len()) } } @@ -345,7 +343,7 @@ func NewKeysAndCert( "expected_size": expectedPaddingSize, "actual_size": len(padding), }).Error("Invalid padding size") - return nil, fmt.Errorf("invalid padding size") + return nil, oops.Errorf("invalid padding size") } keysAndCert := &KeysAndCert{ diff --git a/lib/common/lease/lease.go b/lib/common/lease/lease.go index 504eb4c..58745e3 100644 --- a/lib/common/lease/lease.go +++ b/lib/common/lease/lease.go @@ -3,11 +3,11 @@ package lease import ( "encoding/binary" - "errors" "time" . "github.com/go-i2p/go-i2p/lib/common/data" "github.com/go-i2p/logger" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -87,7 +87,7 @@ func ReadLease(data []byte) (lease Lease, remainder []byte, err error) { log.WithField("input_length", len(data)).Debug("Reading Lease from bytes") if len(data) < LEASE_SIZE { - err = errors.New("error parsing lease: not enough data") + err = oops.Errorf("error parsing lease: not enough data") log.WithFields(logrus.Fields{ "data_length": len(data), "required_length": LEASE_SIZE, diff --git a/lib/common/lease_set/lease_set.go b/lib/common/lease_set/lease_set.go index d9a2aad..6deb36f 100644 --- a/lib/common/lease_set/lease_set.go +++ b/lib/common/lease_set/lease_set.go @@ -2,10 +2,10 @@ package lease_set import ( - "errors" "fmt" "github.com/go-i2p/go-i2p/lib/common/signature" + "github.com/samber/oops" "github.com/go-i2p/logger" "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)) if len(data) < 387 { // Minimum size of Destination (384 keys + 3 bytes for minimum certificate) - err = errors.New("LeaseSet data too short to contain Destination") + err = oops.Errorf("LeaseSet data too short to contain Destination") fmt.Printf("Error: %v\n", err) return } @@ -199,7 +199,7 @@ func ReadDestinationFromLeaseSet(data []byte) (destination Destination, remainde fmt.Printf(" destinationLength: %d\n", destinationLength) if len(data) < destinationLength { - err = errors.New("LeaseSet data too short to contain full Destination") + err = oops.Errorf("LeaseSet data too short to contain full Destination") fmt.Printf("Error: %v\n", err) return } @@ -237,7 +237,7 @@ func (lease_set LeaseSet) PublicKey() (public_key crypto.ElgPublicKey, err error "required_len": LEASE_SET_PUBKEY_SIZE, "reason": "not enough data", }).Error("error parsing public key") - err = errors.New("error parsing public key: not enough data") + err = oops.Errorf("error parsing public key: not enough data") copy(public_key[:], remainder) return } @@ -270,7 +270,7 @@ func (lease_set LeaseSet) SigningKey() (signing_public_key crypto.SigningPublicK "required_len": offset + LEASE_SET_SPK_SIZE, "reason": "not enough data", }).Error("error parsing signing public key") - err = errors.New("error parsing signing public key: not enough data") + err = oops.Errorf("error parsing signing public key: not enough data") return } if cert_len == 0 { @@ -328,7 +328,7 @@ func (lease_set LeaseSet) LeaseCount() (count int, err error) { "required_len": LEASE_SET_PUBKEY_SIZE + LEASE_SET_SPK_SIZE + 1, "reason": "not enough data", }).Error("error parsing lease count") - err = errors.New("error parsing lease count: not enough data") + err = oops.Errorf("error parsing lease count: not enough data") return } c := Integer([]byte{remainder[LEASE_SET_PUBKEY_SIZE+LEASE_SET_SPK_SIZE]}) @@ -339,7 +339,7 @@ func (lease_set LeaseSet) LeaseCount() (count int, err error) { "lease_count": count, "reason": "more than 16 leases", }).Warn("invalid lease set") - err = errors.New("invalid lease set: more than 16 leases") + err = oops.Errorf("invalid lease set: more than 16 leases") } else { log.WithField("lease_count", count).Debug("Retrieved LeaseCount from LeaseSet") } @@ -372,7 +372,7 @@ func (lease_set LeaseSet) Leases() (leases []Lease, err error) { "required_len": end, "reason": "some leases missing", }).Error("error parsnig lease set") - err = errors.New("error parsing lease set: some leases missing") + err = oops.Errorf("error parsing lease set: some leases missing") return } var lease Lease @@ -422,7 +422,7 @@ func (lease_set LeaseSet) Signature() (signature signature.Signature, err error) "required_len": end, "reason": "not enough data", }).Error("error parsing signatre") - err = errors.New("error parsing signature: not enough data") + err = oops.Errorf("error parsing signature: not enough data") return } signature = []byte(lease_set[start:end]) @@ -500,15 +500,15 @@ func NewLeaseSet( log.Debug("Creating new LeaseSet") // Validate destination size if len(destination.KeysAndCert.Bytes()) < 387 { - return nil, errors.New("invalid destination: minimum size is 387 bytes") + return nil, oops.Errorf("invalid destination: minimum size is 387 bytes") } // Validate encryption key size if len(encryptionKey.Bytes()) != LEASE_SET_PUBKEY_SIZE { - return nil, errors.New("invalid encryption key size") + return nil, oops.Errorf("invalid encryption key size") } // Validate inputs if len(leases) > 16 { - return nil, errors.New("invalid lease set: more than 16 leases") + return nil, oops.Errorf("invalid lease set: more than 16 leases") } // Validate signing key size matches certificate cert := destination.Certificate() @@ -520,13 +520,13 @@ func NewLeaseSet( } expectedSize := keyCert.SignatureSize() if len(signingKey.Bytes()) != expectedSize { - return nil, fmt.Errorf("invalid signing key size: got %d, expected %d", + return nil, oops.Errorf("invalid signing key size: got %d, expected %d", len(signingKey.Bytes()), expectedSize) } } else { // Default DSA size if len(signingKey.Bytes()) != LEASE_SET_SPK_SIZE { - return nil, errors.New("invalid signing key size") + return nil, oops.Errorf("invalid signing key size") } } // Build LeaseSet data diff --git a/lib/common/lease_set/lease_set_test.go b/lib/common/lease_set/lease_set_test.go index e635cf2..669a634 100644 --- a/lib/common/lease_set/lease_set_test.go +++ b/lib/common/lease_set/lease_set_test.go @@ -3,7 +3,6 @@ package lease_set import ( "bytes" "crypto/rand" - "fmt" "testing" "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_info" "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/keys_and_cert" @@ -274,7 +274,7 @@ func createTestLeaseSet(t *testing.T, routerInfo *router_info.RouterInfo, leaseC // Generate test Destination and client keys dest, encryptionKey, signingKey, signingPrivKey, err := generateTestDestination(t) if err != nil { - return nil, fmt.Errorf("failed to generate test destination: %v", err) + return nil, oops.Errorf("failed to generate test destination: %v", err) } destBytes := dest.KeysAndCert.Bytes() diff --git a/lib/common/router_address/router_address.go b/lib/common/router_address/router_address.go index b2f6539..ae184f3 100644 --- a/lib/common/router_address/router_address.go +++ b/lib/common/router_address/router_address.go @@ -3,14 +3,13 @@ package router_address import ( "encoding/binary" - "errors" - "fmt" "net" "strconv" "strings" "time" "github.com/go-i2p/logger" + "github.com/samber/oops" "github.com/sirupsen/logrus" . "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) if ip == nil { log.Error("Failed to parse IP address") - return nil, fmt.Errorf("null host error") + return nil, oops.Errorf("null host error") } // return net.ResolveIPAddr("", ip.String()) addr, err := net.ResolveIPAddr("", ip.String()) @@ -285,7 +284,7 @@ func (router_address RouterAddress) Port() (string, error) { func (router_address RouterAddress) StaticKey() ([32]byte, error) { sk := router_address.StaticKeyString() if len([]byte(sk)) != 32 { - return [32]byte{}, fmt.Errorf("error: invalid static key") + return [32]byte{}, oops.Errorf("error: invalid static key") } return [32]byte(sk), nil } @@ -293,7 +292,7 @@ func (router_address RouterAddress) StaticKey() ([32]byte, error) { func (router_address RouterAddress) InitializationVector() ([16]byte, error) { iv := router_address.InitializationVectorString() 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 } @@ -319,7 +318,7 @@ func ReadRouterAddress(data []byte) (router_address RouterAddress, remainder []b log.WithField("data_length", len(data)).Debug("Reading RouterAddress from data") if len(data) == 0 { log.WithField("at", "(RouterAddress) ReadRouterAddress").Error("error parsing RouterAddress: no data") - err = errors.New("error parsing RouterAddress: no data") + err = oops.Errorf("error parsing RouterAddress: no data") return } router_address.TransportCost, remainder, err = NewInteger(data, 1) diff --git a/lib/common/router_info/10k_test.go b/lib/common/router_info/10k_test.go index b993c5a..505e701 100644 --- a/lib/common/router_info/10k_test.go +++ b/lib/common/router_info/10k_test.go @@ -8,18 +8,20 @@ import ( "strings" "testing" "time" + + "github.com/samber/oops" ) func consolidateNetDb(sourcePath string, destPath string) error { // Create destination directory if it doesn't exist if err := os.MkdirAll(destPath, 0o755); err != nil { - return fmt.Errorf("failed to create destination directory: %v", err) + return oops.Errorf("failed to create destination directory: %v", err) } // Walk through all subdirectories return filepath.Walk(sourcePath, func(path string, info os.FileInfo, err error) error { if err != nil { - return fmt.Errorf("error accessing path %q: %v", path, err) + return oops.Errorf("error accessing path %q: %v", path, err) } // Skip if it's a directory @@ -37,7 +39,7 @@ func consolidateNetDb(sourcePath string, destPath string) error { // Copy the file if err := copyFile(srcFile, dstFile); err != nil { - return fmt.Errorf("failed to copy %s: %v", info.Name(), err) + return oops.Errorf("failed to copy %s: %v", info.Name(), err) } } @@ -69,7 +71,7 @@ func consolidateAllNetDbs(tempDir string) error { // Create the temp directory if err := os.MkdirAll(tempDir, 0o755); err != nil { - return fmt.Errorf("failed to create temp directory: %v", err) + return oops.Errorf("failed to create temp directory: %v", err) } // Try to consolidate I2P netDb @@ -91,7 +93,7 @@ func consolidateAllNetDbs(tempDir string) error { func cleanupTempDir(path string) error { if err := os.RemoveAll(path); err != nil { - return fmt.Errorf("failed to cleanup temporary directory %s: %v", path, err) + return oops.Errorf("failed to cleanup temporary directory %s: %v", path, err) } return nil } @@ -110,7 +112,7 @@ func createTempNetDbDir() (string, error) { // Create the directory with appropriate permissions err := os.MkdirAll(tempDir, 0o755) if err != nil { - return "", fmt.Errorf("failed to create temporary directory: %v", err) + return "", oops.Errorf("failed to create temporary directory: %v", err) } return tempDir, nil diff --git a/lib/common/router_info/router_info.go b/lib/common/router_info/router_info.go index 2289f24..bb3431b 100644 --- a/lib/common/router_info/router_info.go +++ b/lib/common/router_info/router_info.go @@ -3,13 +3,12 @@ package router_info import ( "encoding/binary" - "errors" - "fmt" "strconv" "strings" "time" "github.com/go-i2p/go-i2p/lib/common/certificate" + "github.com/samber/oops" "github.com/go-i2p/go-i2p/lib/crypto" @@ -306,7 +305,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error) sigType, err := certificate.GetSignatureTypeFromCertificate(cert) if err != nil { log.WithError(err).Error("Failed to get signature type from certificate") - return RouterInfo{}, remainder, fmt.Errorf("certificate signature type error: %v", err) + return RouterInfo{}, remainder, oops.Errorf("certificate signature type error: %v", err) } // Enhanced signature type validation @@ -315,7 +314,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error) "sigType": sigType, "cert": cert, }).Error("Invalid signature type detected") - return RouterInfo{}, remainder, fmt.Errorf("invalid signature type: %d", sigType) + return RouterInfo{}, remainder, oops.Errorf("invalid signature type: %d", sigType) } log.WithFields(logrus.Fields{ @@ -329,7 +328,7 @@ func ReadRouterInfo(bytes []byte) (info RouterInfo, remainder []byte, err error) //"required_len": MAPPING_SIZE, "reason": "not enough data", }).Error("error parsing router info") - err = errors.New("error parsing router info: not enough data to read signature") + err = oops.Errorf("error parsing router info: not enough data to read signature") } log.WithFields(logrus.Fields{ diff --git a/lib/common/signature/signature.go b/lib/common/signature/signature.go index af541f6..46839d8 100644 --- a/lib/common/signature/signature.go +++ b/lib/common/signature/signature.go @@ -2,9 +2,8 @@ package signature import ( - "fmt" - "github.com/go-i2p/logger" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -88,12 +87,12 @@ func ReadSignature(data []byte, sigType int) (sig Signature, remainder []byte, e case SIGNATURE_TYPE_REDDSA_SHA512_ED25519: sigLength = RedDSA_SHA512_Ed25519_SIZE default: - err = fmt.Errorf("unsupported signature type: %d", sigType) + err = oops.Errorf("unsupported signature type: %d", sigType) return } if len(data) < sigLength { - err = fmt.Errorf("insufficient data to read signature: need %d bytes, have %d", sigLength, len(data)) + err = oops.Errorf("insufficient data to read signature: need %d bytes, have %d", sigLength, len(data)) log.WithError(err).Error("Failed to read Signature") return } diff --git a/lib/crypto/aes.go b/lib/crypto/aes.go index 765cda9..584e5cc 100644 --- a/lib/crypto/aes.go +++ b/lib/crypto/aes.go @@ -4,9 +4,9 @@ import ( "bytes" "crypto/aes" "crypto/cipher" - "fmt" "github.com/go-i2p/logger" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -61,7 +61,7 @@ func (d *AESSymmetricDecrypter) Decrypt(data []byte) ([]byte, error) { if len(data)%aes.BlockSize != 0 { log.Error("Ciphertext is not a multiple of the block size") - return nil, fmt.Errorf("ciphertext is not a multiple of the block size") + return nil, oops.Errorf("ciphertext is not a multiple of the block size") } plaintext := make([]byte, len(data)) @@ -120,18 +120,18 @@ func pkcs7Unpad(data []byte) ([]byte, error) { length := len(data) if length == 0 { log.Error("Data is empty") - return nil, fmt.Errorf("data is empty") + return nil, oops.Errorf("data is empty") } padding := int(data[length-1]) if padding == 0 || padding > aes.BlockSize { log.WithField("padding", padding).Error("Invalid padding") - return nil, fmt.Errorf("invalid padding") + return nil, oops.Errorf("invalid padding") } paddingStart := length - padding for i := paddingStart; i < length; i++ { if data[i] != byte(padding) { log.Error("Invalid padding") - return nil, fmt.Errorf("invalid padding") + return nil, oops.Errorf("invalid padding") } } @@ -143,7 +143,7 @@ func pkcs7Unpad(data []byte) ([]byte, error) { // EncryptNoPadding encrypts data using AES-CBC without padding func (e *AESSymmetricEncrypter) EncryptNoPadding(data []byte) ([]byte, error) { if len(data)%aes.BlockSize != 0 { - return nil, fmt.Errorf("data length must be a multiple of block size") + return nil, oops.Errorf("data length must be a multiple of block size") } block, err := aes.NewCipher(e.Key) @@ -161,7 +161,7 @@ func (e *AESSymmetricEncrypter) EncryptNoPadding(data []byte) ([]byte, error) { // DecryptNoPadding decrypts data using AES-CBC without padding func (d *AESSymmetricDecrypter) DecryptNoPadding(data []byte) ([]byte, error) { if len(data)%aes.BlockSize != 0 { - return nil, fmt.Errorf("data length must be a multiple of block size") + return nil, oops.Errorf("data length must be a multiple of block size") } block, err := aes.NewCipher(d.Key) diff --git a/lib/crypto/curve25519.go b/lib/crypto/curve25519.go index 41f7c71..66066ec 100644 --- a/lib/crypto/curve25519.go +++ b/lib/crypto/curve25519.go @@ -4,16 +4,16 @@ import ( "crypto/rand" "crypto/sha256" "crypto/sha512" - "errors" "io" "math/big" + "github.com/samber/oops" "github.com/sirupsen/logrus" curve25519 "go.step.sm/crypto/x25519" ) -var Curve25519EncryptTooBig = errors.New("failed to encrypt data, too big for Curve25519") +var Curve25519EncryptTooBig = oops.Errorf("failed to encrypt data, too big for Curve25519") type Curve25519PublicKey []byte @@ -132,14 +132,14 @@ func (v *Curve25519Verifier) VerifyHash(h, sig []byte) (err error) { } if len(v.k) != curve25519.PublicKeySize { log.Error("Invalid Curve25519 public key size") - err = errors.New("failed to verify: invalid curve25519 public key size") + err = oops.Errorf("failed to verify: invalid curve25519 public key size") return } ok := curve25519.Verify(v.k, h, sig) if !ok { log.Error("Invalid signature") - err = errors.New("failed to verify: invalid signature") + err = oops.Errorf("failed to verify: invalid signature") } else { log.Debug("Hash verified successfully") } @@ -168,7 +168,7 @@ func (s *Curve25519Signer) Sign(data []byte) (sig []byte, err error) { if len(s.k) != curve25519.PrivateKeySize { log.Error("Invalid Curve25519 private key size") - err = errors.New("failed to sign: invalid curve25519 private key size") + err = oops.Errorf("failed to sign: invalid curve25519 private key size") return } h := sha512.Sum512(data) diff --git a/lib/crypto/ed25519.go b/lib/crypto/ed25519.go index 8eec01f..dffccde 100644 --- a/lib/crypto/ed25519.go +++ b/lib/crypto/ed25519.go @@ -6,17 +6,17 @@ import ( "crypto/rand" "crypto/sha256" "crypto/sha512" - "errors" "fmt" "io" "math/big" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) var ( - Ed25519EncryptTooBig = errors.New("failed to encrypt data, too big for Ed25519") - ErrInvalidPublicKeySize = errors.New("failed to verify: invalid ed25519 public key size") + Ed25519EncryptTooBig = oops.Errorf("failed to encrypt data, too big for Ed25519") + ErrInvalidPublicKeySize = oops.Errorf("failed to verify: invalid ed25519 public key size") ) type Ed25519PublicKey []byte @@ -133,7 +133,7 @@ func (elg Ed25519PublicKey) NewEncrypter() (enc Encrypter, err error) { log.Debug("Creating new Ed25519 encrypter") k := createEd25519PublicKey(elg[:]) if k == nil { - return nil, errors.New("invalid public key format") + return nil, oops.Errorf("invalid public key format") } enc, err = createEd25519Encryption(k, rand.Reader) @@ -159,14 +159,14 @@ func (v *Ed25519Verifier) VerifyHash(h, sig []byte) (err error) { } if len(v.k) != ed25519.PublicKeySize { log.Error("Invalid Ed25519 public key size") - err = errors.New("failed to verify: invalid ed25519 public key size") + err = oops.Errorf("failed to verify: invalid ed25519 public key size") return } ok := ed25519.Verify(v.k, h, sig) if !ok { log.Warn("Invalid Ed25519 signature") - err = errors.New("failed to verify: invalid signature") + err = oops.Errorf("failed to verify: invalid signature") } else { log.Debug("Ed25519 signature verified successfully") } @@ -198,7 +198,7 @@ func (k Ed25519PrivateKey) Zero() { func (k Ed25519PrivateKey) NewDecrypter() (Decrypter, error) { 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{ privateKey: k, @@ -216,7 +216,7 @@ func (d *Ed25519Decrypter) Decrypt(data []byte) ([]byte, error) { func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte, error) { 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 @@ -239,14 +239,14 @@ func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte // Use private key to decrypt m := new(big.Int).ModInverse(a, p) 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() // Remove padding and validate hash 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] @@ -255,7 +255,7 @@ func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte // Verify hash actualHash := sha256.Sum256(message) 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 @@ -263,7 +263,7 @@ func (d *Ed25519Decrypter) DecryptPadding(data []byte, zeroPadding bool) ([]byte func (k Ed25519PrivateKey) NewSigner() (Signer, error) { if len(k) != ed25519.PrivateKeySize { - return nil, errors.New("invalid ed25519 private key size") + return nil, oops.Errorf("invalid ed25519 private key size") } return &Ed25519Signer{k: k}, nil } @@ -286,7 +286,7 @@ func (k Ed25519PrivateKey) Generate() (SigningPrivateKey, error) { func (k Ed25519PrivateKey) Public() (SigningPublicKey, error) { fmt.Printf("Ed25519PrivateKey.Public(): len(k) = %d\n", len(k)) if len(k) != ed25519.PrivateKeySize { - return nil, fmt.Errorf("invalid ed25519 private key size: expected %d, got %d", ed25519.PrivateKeySize, len(k)) + return nil, oops.Errorf("invalid ed25519 private key size: expected %d, got %d", ed25519.PrivateKeySize, len(k)) } pubKey := k[32:] 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 { log.Error("Invalid Ed25519 private key size") - err = errors.New("failed to sign: invalid ed25519 private key size") + err = oops.Errorf("failed to sign: invalid ed25519 private key size") return } h := sha512.Sum512(data) diff --git a/lib/crypto/elg.go b/lib/crypto/elg.go index 4ad11cc..dbf3fb2 100644 --- a/lib/crypto/elg.go +++ b/lib/crypto/elg.go @@ -4,10 +4,10 @@ import ( "crypto/rand" "crypto/sha256" "crypto/subtle" - "errors" "io" "math/big" + "github.com/samber/oops" "github.com/sirupsen/logrus" "golang.org/x/crypto/openpgp/elgamal" @@ -38,8 +38,8 @@ var ( ) var ( - ElgDecryptFail = errors.New("failed to decrypt elgamal encrypted data") - ElgEncryptTooBig = errors.New("failed to encrypt data, too big for elgamal") + ElgDecryptFail = oops.Errorf("failed to decrypt elgamal encrypted data") + ElgEncryptTooBig = oops.Errorf("failed to encrypt data, too big for elgamal") ) // generate an elgamal key pair diff --git a/lib/crypto/sign.go b/lib/crypto/sign.go index 82938d1..92b4cdf 100644 --- a/lib/crypto/sign.go +++ b/lib/crypto/sign.go @@ -1,13 +1,11 @@ package crypto -import ( - "errors" -) +import "github.com/samber/oops" var ( - ErrBadSignatureSize = errors.New("bad signature size") - ErrInvalidKeyFormat = errors.New("invalid key format") - ErrInvalidSignature = errors.New("invalid signature") + ErrBadSignatureSize = oops.Errorf("bad signature size") + ErrInvalidKeyFormat = oops.Errorf("invalid key format") + ErrInvalidSignature = oops.Errorf("invalid signature") ) // type for verifying signatures diff --git a/lib/i2np/build_request_record.go b/lib/i2np/build_request_record.go index 3f3cf94..7a1d26e 100644 --- a/lib/i2np/build_request_record.go +++ b/lib/i2np/build_request_record.go @@ -1,9 +1,9 @@ package i2np import ( - "errors" "time" + "github.com/samber/oops" "github.com/sirupsen/logrus" common "github.com/go-i2p/go-i2p/lib/common/data" @@ -173,7 +173,7 @@ type BuildRequestRecord struct { Padding [29]byte } -var ERR_BUILD_REQUEST_RECORD_NOT_ENOUGH_DATA = errors.New("not enough i2np build request record data") +var ERR_BUILD_REQUEST_RECORD_NOT_ENOUGH_DATA = oops.Errorf("not enough i2np build request record data") func ReadBuildRequestRecord(data []byte) (BuildRequestRecord, error) { log.Debug("Reading BuildRequestRecord") diff --git a/lib/i2np/header.go b/lib/i2np/header.go index 5ed92f6..e430b2a 100644 --- a/lib/i2np/header.go +++ b/lib/i2np/header.go @@ -1,9 +1,9 @@ package i2np import ( - "errors" "time" + "github.com/samber/oops" "github.com/sirupsen/logrus" datalib "github.com/go-i2p/go-i2p/lib/common/data" @@ -90,7 +90,7 @@ type I2NPSSUHeader struct { Expiration time.Time } -var ERR_I2NP_NOT_ENOUGH_DATA = errors.New("not enough i2np header data") +var ERR_I2NP_NOT_ENOUGH_DATA = oops.Errorf("not enough i2np header data") // Read an entire I2NP message and return the parsed header // with embedded encrypted data diff --git a/lib/keys/routerinfo_keystore.go b/lib/keys/routerinfo_keystore.go index 3910332..a48e61e 100644 --- a/lib/keys/routerinfo_keystore.go +++ b/lib/keys/routerinfo_keystore.go @@ -4,8 +4,6 @@ import ( "bytes" "crypto/ed25519" "crypto/rand" - "errors" - "fmt" "os" "path/filepath" @@ -19,6 +17,7 @@ import ( "github.com/go-i2p/go-i2p/lib/common/signature" "github.com/go-i2p/go-i2p/lib/crypto" "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 @@ -82,7 +81,7 @@ func generateNewKey() (crypto.Ed25519PrivateKey, error) { func loadExistingKey(keyData []byte) (crypto.Ed25519PrivateKey, error) { // Validate key length if len(keyData) != ed25519.PrivateKeySize { - return nil, errors.New("invalid key length") + return nil, oops.Errorf("invalid key length") } // Convert to our type @@ -127,31 +126,31 @@ func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.Ro // Get signing keys publicKey, privateKey, err := ks.GetKeys() 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 payload := new(bytes.Buffer) cryptoKeyType, err := data.NewIntegerFromInt(7, 2) // Ed25519 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 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(*signingKeyType) cert, err := certificate.NewCertificateWithType(certificate.CERT_KEY, payload.Bytes()) 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 keyCert, err := key_certificate.KeyCertificateFromCertificate(*cert) 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() @@ -160,7 +159,7 @@ func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.Ro padding := make([]byte, paddingSize) _, err = rand.Read(padding) 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 @@ -171,7 +170,7 @@ func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.Ro padding, ) 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 @@ -192,7 +191,7 @@ func (ks *RouterInfoKeystore) ConstructRouterInfo(addresses []*router_address.Ro signature.SIGNATURE_TYPE_EDDSA_SHA512_ED25519, ) 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 diff --git a/lib/netdb/reseed/reseed.go b/lib/netdb/reseed/reseed.go index 6f914b3..7dc159d 100644 --- a/lib/netdb/reseed/reseed.go +++ b/lib/netdb/reseed/reseed.go @@ -1,7 +1,6 @@ package reseed import ( - "fmt" "io" "net" "net/http" @@ -10,6 +9,7 @@ import ( "path/filepath" "github.com/go-i2p/logger" + "github.com/samber/oops" "github.com/sirupsen/logrus" "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 { 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") @@ -121,5 +121,5 @@ func (r Reseed) SingleReseed(uri string) ([]router_info.RouterInfo, error) { } } log.Error("Undefined reseed error") - return nil, fmt.Errorf("error: undefined reseed error") + return nil, oops.Errorf("error: undefined reseed error") } diff --git a/lib/su3/su3.go b/lib/su3/su3.go index c36d4fb..11b82eb 100644 --- a/lib/su3/su3.go +++ b/lib/su3/su3.go @@ -72,7 +72,6 @@ import ( "crypto/sha512" "encoding/binary" "errors" - "fmt" "hash" "io" "io/ioutil" @@ -80,6 +79,7 @@ import ( "sync" "github.com/go-i2p/logger" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -152,29 +152,29 @@ var contentTypes = map[byte]ContentType{ } var ( - ErrMissingMagicBytes = errors.New("missing magic bytes") - ErrMissingUnusedByte6 = errors.New("missing unused byte 6") - ErrMissingFileFormatVersion = errors.New("missing or incorrect file format version") - ErrMissingSignatureType = errors.New("missing or invalid signature type") - ErrUnsupportedSignatureType = errors.New("unsupported signature type") - ErrMissingSignatureLength = errors.New("missing signature length") - ErrMissingUnusedByte12 = errors.New("missing unused byte 12") - ErrMissingVersionLength = errors.New("missing version length") - ErrVersionTooShort = errors.New("version length too short") - ErrMissingUnusedByte14 = errors.New("missing unused byte 14") - ErrMissingSignerIDLength = errors.New("missing signer ID length") - ErrMissingContentLength = errors.New("missing content length") - ErrMissingUnusedByte24 = errors.New("missing unused byte 24") - ErrMissingFileType = errors.New("missing or invalid file type") - ErrMissingUnusedByte26 = errors.New("missing unused byte 26") - ErrMissingContentType = errors.New("missing or invalid content type") - ErrMissingUnusedBytes28To39 = errors.New("missing unused bytes 28-39") - ErrMissingVersion = errors.New("missing version") - ErrMissingSignerID = errors.New("missing signer ID") - ErrMissingContent = errors.New("missing content") - ErrMissingSignature = errors.New("missing signature") - ErrInvalidPublicKey = errors.New("invalid public key") - ErrInvalidSignature = errors.New("invalid signature") + ErrMissingMagicBytes = oops.Errorf("missing magic bytes") + ErrMissingUnusedByte6 = oops.Errorf("missing unused byte 6") + ErrMissingFileFormatVersion = oops.Errorf("missing or incorrect file format version") + ErrMissingSignatureType = oops.Errorf("missing or invalid signature type") + ErrUnsupportedSignatureType = oops.Errorf("unsupported signature type") + ErrMissingSignatureLength = oops.Errorf("missing signature length") + ErrMissingUnusedByte12 = oops.Errorf("missing unused byte 12") + ErrMissingVersionLength = oops.Errorf("missing version length") + ErrVersionTooShort = oops.Errorf("version length too short") + ErrMissingUnusedByte14 = oops.Errorf("missing unused byte 14") + ErrMissingSignerIDLength = oops.Errorf("missing signer ID length") + ErrMissingContentLength = oops.Errorf("missing content length") + ErrMissingUnusedByte24 = oops.Errorf("missing unused byte 24") + ErrMissingFileType = oops.Errorf("missing or invalid file type") + ErrMissingUnusedByte26 = oops.Errorf("missing unused byte 26") + ErrMissingContentType = oops.Errorf("missing or invalid content type") + ErrMissingUnusedBytes28To39 = oops.Errorf("missing unused bytes 28-39") + ErrMissingVersion = oops.Errorf("missing version") + ErrMissingSignerID = oops.Errorf("missing signer ID") + ErrMissingContent = oops.Errorf("missing content") + ErrMissingSignature = oops.Errorf("missing signature") + ErrInvalidPublicKey = oops.Errorf("invalid public key") + ErrInvalidSignature = oops.Errorf("invalid signature") ) const magicBytes = "I2Psu3" @@ -217,7 +217,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err := reader.Read(mbytes) if err != nil && !errors.Is(err, io.EOF) { 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) { log.Error("Missing magic bytes") @@ -235,7 +235,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(unused[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing unused byte 6") @@ -248,7 +248,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(unused[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { 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[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing signature type") @@ -291,7 +291,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(sigLengthBytes[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing signature length") @@ -307,7 +307,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(unused[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing unused byte 12") @@ -321,7 +321,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(verLengthBytes[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing version length") @@ -339,7 +339,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(unused[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing unused byte 14") @@ -353,7 +353,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(sigIDLengthBytes[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing signer ID length") @@ -368,7 +368,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(contentLengthBytes[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing content length") @@ -383,7 +383,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(unused[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing unused byte 24") @@ -397,7 +397,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(fileTypeBytes[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing file type") @@ -416,7 +416,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(unused[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing unused byte 26") @@ -430,7 +430,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(contentTypeBytes[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Missing content type") @@ -450,7 +450,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(unused[:]) if err != nil && !errors.Is(err, io.EOF) { 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 { 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[:]) if err != nil && !errors.Is(err, io.EOF) { 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) { log.Error("Missing version") @@ -481,7 +481,7 @@ func Read(reader io.Reader) (su3 *SU3, err error) { l, err = reader.Read(signerIDBytes[:]) if err != nil && !errors.Is(err, io.EOF) { 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) { log.Error("Missing signer ID") @@ -562,7 +562,7 @@ func (r *contentReader) Read(p []byte) (n int, err error) { if r.finished { 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 { @@ -578,7 +578,7 @@ func (r *contentReader) Read(p []byte) (n int, err error) { if err != nil && !errors.Is(err, io.EOF) { 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 { log.Error("Content shorter than expected") return l, ErrMissingContent @@ -656,7 +656,7 @@ func (r *signatureReader) getBytes() { _, err := ioutil.ReadAll(r.su3.contentReader) if err != nil { 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 } } @@ -671,7 +671,7 @@ func (r *signatureReader) getBytes() { if err != nil { 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) { log.Error("Signature shorter than expected") r.err = ErrMissingSignature diff --git a/lib/transport/errors.go b/lib/transport/errors.go index 6b5d577..dd4dbaf 100644 --- a/lib/transport/errors.go +++ b/lib/transport/errors.go @@ -1,8 +1,6 @@ package transport -import ( - "errors" -) +import "github.com/samber/oops" // error for when we have no transports available to use -var ErrNoTransportAvailable = errors.New("no transports available") +var ErrNoTransportAvailable = oops.Errorf("no transports available") diff --git a/lib/transport/noise/encrdecr_packet_test.go b/lib/transport/noise/encrdecr_packet_test.go index 250a65b..4e7d02e 100644 --- a/lib/transport/noise/encrdecr_packet_test.go +++ b/lib/transport/noise/encrdecr_packet_test.go @@ -5,19 +5,19 @@ import ( "crypto/cipher" "crypto/rand" "encoding/binary" - "fmt" "testing" "github.com/go-i2p/go-i2p/lib/crypto" "github.com/go-i2p/go-i2p/lib/transport/obfs" "github.com/flynn/noise" + "github.com/samber/oops" "github.com/stretchr/testify/assert" ) func (ns *NoiseSession) testEncryptPacket(plaintext []byte) (int, []byte, error) { if ns.CipherState == nil { - return 0, nil, fmt.Errorf("CipherState is nil") + return 0, nil, oops.Errorf("CipherState is nil") } // 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) { if ns.CipherState == nil { - return 0, nil, fmt.Errorf("CipherState is nil") + return 0, nil, oops.Errorf("CipherState is nil") } 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 packetLength := binary.BigEndian.Uint16(packet[:2]) 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] diff --git a/lib/transport/noise/incoming_handshake.go b/lib/transport/noise/incoming_handshake.go index 8966d2e..24f43b2 100644 --- a/lib/transport/noise/incoming_handshake.go +++ b/lib/transport/noise/incoming_handshake.go @@ -3,10 +3,10 @@ package noise import ( "bytes" "crypto/rand" - "errors" "io" "github.com/flynn/noise" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -47,7 +47,7 @@ func (c *NoiseSession) ComposeReceiverHandshakeMessage(localStatic noise.DHKey, if len(remoteStatic) != 0 && len(remoteStatic) != noise.DH25519.DHLen() { 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) @@ -84,7 +84,7 @@ func (c *NoiseSession) ComposeReceiverHandshakeMessage(localStatic noise.DHKey, // Verify no CipherStates are returned yet 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 diff --git a/lib/transport/noise/outgoing_handshake.go b/lib/transport/noise/outgoing_handshake.go index 4c1a67f..af8ea1f 100644 --- a/lib/transport/noise/outgoing_handshake.go +++ b/lib/transport/noise/outgoing_handshake.go @@ -3,13 +3,12 @@ package noise import ( "bytes" "crypto/rand" - "errors" - "fmt" "io" "github.com/sirupsen/logrus" "github.com/flynn/noise" + "github.com/samber/oops" ) func (c *NoiseSession) RunOutgoingHandshake() error { @@ -59,12 +58,12 @@ func (c *NoiseSession) ComposeInitiatorHandshakeMessage( remoteStatic, err := c.peerStaticKey() 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() 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{ Public: localStatic[:], @@ -73,7 +72,7 @@ func (c *NoiseSession) ComposeInitiatorHandshakeMessage( localStaticDH := *c.HandshakeKey() 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) @@ -109,7 +108,7 @@ func (c *NoiseSession) ComposeInitiatorHandshakeMessage( // Verify no CipherStates are returned yet 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 diff --git a/lib/transport/noise/read_session.go b/lib/transport/noise/read_session.go index b8f8833..346add9 100644 --- a/lib/transport/noise/read_session.go +++ b/lib/transport/noise/read_session.go @@ -1,9 +1,9 @@ package noise import ( - "errors" "sync/atomic" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -17,7 +17,7 @@ func (c *NoiseSession) Read(b []byte) (int, error) { "at": "(NoiseSession) Read", "reason": "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) { defer atomic.AddInt32(&c.activeCall, -2) @@ -36,7 +36,7 @@ func (c *NoiseSession) Read(b []byte) (int, error) { defer c.Mutex.Unlock() if !c.handshakeComplete { 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) if err != nil { @@ -52,7 +52,7 @@ func (c *NoiseSession) decryptPacket(data []byte) (int, []byte, error) { if c.CipherState == 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 decryptedData, err := c.CipherState.Decrypt(nil, nil, data) diff --git a/lib/transport/noise/session.go b/lib/transport/noise/session.go index 62659c3..26bb460 100644 --- a/lib/transport/noise/session.go +++ b/lib/transport/noise/session.go @@ -1,7 +1,6 @@ package noise import ( - "fmt" "net" "sync" "time" @@ -10,6 +9,7 @@ import ( cb "github.com/emirpasic/gods/queues/circularbuffer" "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/transport" @@ -101,7 +101,7 @@ func (s *NoiseSession) peerStaticKey() ([32]byte, error) { 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) { @@ -114,7 +114,7 @@ func (s *NoiseSession) peerStaticIV() ([16]byte, error) { 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. @@ -147,7 +147,7 @@ func NewNoiseTransportSession(ri router_info.RouterInfo) (transport.TransportSes return session, nil } 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) { diff --git a/lib/transport/noise/transport.go b/lib/transport/noise/transport.go index d16d02d..eab67ce 100644 --- a/lib/transport/noise/transport.go +++ b/lib/transport/noise/transport.go @@ -7,12 +7,11 @@ package noise **/ import ( - "errors" - "fmt" "net" "sync" "github.com/flynn/noise" + "github.com/samber/oops" "github.com/sirupsen/logrus" "github.com/go-i2p/go-i2p/lib/common/data" @@ -27,7 +26,7 @@ type NoiseTransport struct { router_info.RouterInfo transportStyle string Listener net.Listener - //peerConnections map[data.Hash]transport.TransportSession + // peerConnections map[data.Hash]transport.TransportSession peerConnections map[data.Hash]*NoiseSession } @@ -84,7 +83,7 @@ func (noopt *NoiseTransport) SetIdentity(ident router_info.RouterInfo) (err erro "at": "(NoiseTransport) SetIdentity", "reason": "network socket is null", }).Error("network socket is null") - err = errors.New("network socket is null") + err = oops.Errorf("network socket is null") return } 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") if len(hash) == 0 { 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 { log.Debug("NoiseTransport: Existing session found") @@ -194,7 +193,7 @@ func (s *NoiseTransport) localStaticKey() ([32]byte, error) { 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) { @@ -207,7 +206,7 @@ func (s *NoiseTransport) localStaticIV() ([16]byte, error) { 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 { diff --git a/lib/transport/noise/write_session.go b/lib/transport/noise/write_session.go index 19c098a..f2ff497 100644 --- a/lib/transport/noise/write_session.go +++ b/lib/transport/noise/write_session.go @@ -2,10 +2,9 @@ package noise import ( "encoding/binary" - "errors" - "fmt" "sync/atomic" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -19,7 +18,7 @@ func (c *NoiseSession) Write(b []byte) (int, error) { "at": "(NoiseSession) Write", "reason": "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) { defer atomic.AddInt32(&c.activeCall, -2) @@ -38,7 +37,7 @@ func (c *NoiseSession) Write(b []byte) (int, error) { defer c.Mutex.Unlock() if !c.handshakeComplete { 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) if err != nil { @@ -55,14 +54,14 @@ func (c *NoiseSession) encryptPacket(data []byte) (int, []byte, error) { m := len(data) if c.CipherState == 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 encryptedData, err := c.CipherState.Encrypt(nil, nil, data) if err != nil { 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) diff --git a/lib/transport/ntcp/session.go b/lib/transport/ntcp/session.go index 8401856..eb80800 100644 --- a/lib/transport/ntcp/session.go +++ b/lib/transport/ntcp/session.go @@ -1,13 +1,14 @@ package ntcp import ( - "fmt" "time" "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/transport/noise" "github.com/go-i2p/go-i2p/lib/transport/obfs" + + "github.com/samber/oops" "golang.org/x/exp/rand" ) @@ -97,7 +98,7 @@ func (s *NTCP2Session) peerStaticKey() ([32]byte, error) { 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) { @@ -110,7 +111,7 @@ func (s *NTCP2Session) peerStaticIV() ([16]byte, error) { 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 diff --git a/lib/transport/ntcp/transport.go b/lib/transport/ntcp/transport.go index fcccbca..6d9cedc 100644 --- a/lib/transport/ntcp/transport.go +++ b/lib/transport/ntcp/transport.go @@ -5,13 +5,14 @@ package ntcp **/ import ( - "fmt" "net" "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/noise" "github.com/go-i2p/go-i2p/lib/util/time/sntp" + + "github.com/samber/oops" ) const ( @@ -74,11 +75,11 @@ func (t *NTCP2Transport) Accept() (net.Conn, error) { // then check if it's a router address routerAddr, ok := remoteAddr.(*router_info.RouterInfo) 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 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 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 [32]byte{}, fmt.Errorf("Remote static key error") + return [32]byte{}, oops.Errorf("Remote static key error") } func (s *NTCP2Transport) localStaticIV() ([16]byte, error) { @@ -115,5 +116,5 @@ func (s *NTCP2Transport) localStaticIV() ([16]byte, error) { return addr.InitializationVector() } } - return [16]byte{}, fmt.Errorf("Remote static IV error") + return [16]byte{}, oops.Errorf("Remote static IV error") } diff --git a/lib/transport/obfs/obfs.go b/lib/transport/obfs/obfs.go index acf3b98..892dd92 100644 --- a/lib/transport/obfs/obfs.go +++ b/lib/transport/obfs/obfs.go @@ -1,15 +1,14 @@ package obfs import ( - "fmt" - "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 func ObfuscateEphemeralKey(message []byte, aesKey *crypto.AESSymmetricKey) ([]byte, error) { 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) @@ -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 func DeobfuscateEphemeralKey(message []byte, aesKey *crypto.AESSymmetricKey) ([]byte, error) { 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) diff --git a/lib/tunnel/delivery.go b/lib/tunnel/delivery.go index cc453cc..8334850 100644 --- a/lib/tunnel/delivery.go +++ b/lib/tunnel/delivery.go @@ -2,10 +2,10 @@ package tunnel import ( "encoding/binary" - "errors" common "github.com/go-i2p/go-i2p/lib/common/data" "github.com/go-i2p/logger" + "github.com/samber/oops" "github.com/sirupsen/logrus" ) @@ -180,7 +180,7 @@ func (delivery_instructions DeliveryInstructions) Type() (int, error) { return FIRST_FRAGMENT, nil } 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 @@ -212,7 +212,7 @@ func (delivery_instructions DeliveryInstructions) FragmentNumber() (int, error) return fragNum, nil } 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 @@ -246,7 +246,7 @@ func (delivery_instructions DeliveryInstructions) LastFollowOnFragment() (bool, return isLast, nil } 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 @@ -270,7 +270,7 @@ func (delivery_instructions DeliveryInstructions) DeliveryType() (byte, error) { return deliveryType, nil } 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. @@ -304,7 +304,7 @@ func (delivery_instructions DeliveryInstructions) HasDelay() (bool, error) { return delay, nil } 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 @@ -333,7 +333,7 @@ func (delivery_instructions DeliveryInstructions) Fragmented() (bool, error) { // return ((delivery_instructions[0] & 0x08) == 0x08), nil } 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. @@ -368,7 +368,7 @@ func (delivery_instructions DeliveryInstructions) HasExtendedOptions() (bool, er return extended_options, nil } 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. @@ -399,7 +399,7 @@ func (delivery_instructions DeliveryInstructions) HasHash() (bool, error) { } if len(delivery_instructions) < min_size { 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") } else { @@ -425,11 +425,11 @@ func (delivery_instructions DeliveryInstructions) TunnelID() (tunnel_id uint32, log.WithField("tunnel_id", tunnel_id).Debug("TunnelID retrieved") } else { 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 { 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 } @@ -455,7 +455,7 @@ func (delivery_instructions DeliveryInstructions) Hash() (hash common.Hash, err log.WithField("hash", hash).Debug("Hash retrieved for DT_TUNNEL") } else { 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 { 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") } else { 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 { 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 } @@ -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") } else { 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 } } 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") } else { 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 } } 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") } else { 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 { 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") } else { 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 { 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 } @@ -570,13 +570,13 @@ func (delivery_instructions DeliveryInstructions) ExtendedOptions() (data []byte } if len(delivery_instructions) < extended_options_index+2 { 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 } else { extended_options_size := common.Integer([]byte{delivery_instructions[extended_options_index]}) 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") - 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 } else { data = delivery_instructions[extended_options_index+1 : extended_options_size.Int()] @@ -587,7 +587,7 @@ func (delivery_instructions DeliveryInstructions) ExtendedOptions() (data []byte } } else { 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 } @@ -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") } else { 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 { 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") } else { 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 { 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 } @@ -668,7 +668,7 @@ func (delivery_instructions DeliveryInstructions) message_id_index() (message_id return message_id, nil } else { 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 { 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 } @@ -845,7 +845,7 @@ func maybeAppendMessageID(di_flag DeliveryInstructions, di_type int, data, curre } if len(data) < message_id_index+4 { 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 { now = append(current, data[message_id_index:message_id_index+4]...) 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 { if len(data) < 5 { 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 { now = append(current, data[1:5]...) 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 { if len(data) < 7 { 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 { now = append(now, data[5:7]...) log.Debug("Size appended for FOLLOW_ON_FRAGMENT") @@ -899,7 +899,7 @@ func readDeliveryInstructions(data []byte) (instructions DeliveryInstructions, r log.Debug("Reading DeliveryInstructions") if len(data) < 1 { log.Error("No data provided") - err = errors.New("no data provided") + err = oops.Errorf("no data provided") return }