diff --git a/go.mod b/go.mod index 28abae8ffc..ebd0233dc6 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/pion/webrtc/v4 v4.0.7 github.com/prometheus/client_golang v1.20.5 github.com/prometheus/client_model v0.6.1 - github.com/quic-go/quic-go v0.48.2 + github.com/quic-go/quic-go v0.49.0 github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 github.com/raulk/go-watchdog v1.3.0 github.com/stretchr/testify v1.10.0 diff --git a/go.sum b/go.sum index 2d8fb16cf3..7350591980 100644 --- a/go.sum +++ b/go.sum @@ -340,8 +340,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= -github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/quic-go v0.49.0 h1:w5iJHXwHxs1QxyBv1EHKuC50GX5to8mJAxvtnttJp94= +github.com/quic-go/quic-go v0.49.0/go.mod h1:s2wDnmCdooUQBmQfpUSTCYBl1/D4FcqbULMMkASvR6s= github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= diff --git a/p2p/transport/quic/stream.go b/p2p/transport/quic/stream.go index 56f12dade2..ee21babe68 100644 --- a/p2p/transport/quic/stream.go +++ b/p2p/transport/quic/stream.go @@ -19,16 +19,20 @@ type stream struct { var _ network.MuxedStream = &stream{} func (s *stream) Read(b []byte) (n int, err error) { + var streamErr *quic.StreamError + n, err = s.Stream.Read(b) - if err != nil && errors.Is(err, &quic.StreamError{}) { + if err != nil && errors.As(err, &streamErr) { err = network.ErrReset } return n, err } func (s *stream) Write(b []byte) (n int, err error) { + var streamErr *quic.StreamError + n, err = s.Stream.Write(b) - if err != nil && errors.Is(err, &quic.StreamError{}) { + if err != nil && errors.As(err, &streamErr) { err = network.ErrReset } return n, err diff --git a/p2p/transport/webtransport/crypto.go b/p2p/transport/webtransport/crypto.go index bdc121c52a..90504ead01 100644 --- a/p2p/transport/webtransport/crypto.go +++ b/p2p/transport/webtransport/crypto.go @@ -86,6 +86,15 @@ func generateCert(key ic.PrivKey, start, end time.Time) (*x509.Certificate, *ecd return ca, caPrivateKey, nil } +type ErrCertHashMismatch struct { + Expected []byte + Actual [][]byte +} + +func (e ErrCertHashMismatch) Error() string { + return fmt.Sprintf("cert hash not found: %x (expected: %#x)", e.Expected, e.Actual) +} + func verifyRawCerts(rawCerts [][]byte, certHashes []multihash.DecodedMultihash) error { if len(rawCerts) < 1 { return errors.New("no cert") @@ -105,7 +114,7 @@ func verifyRawCerts(rawCerts [][]byte, certHashes []multihash.DecodedMultihash) for _, h := range certHashes { digests = append(digests, h.Digest) } - return fmt.Errorf("cert hash not found: %#x (expected: %#x)", hash, digests) + return ErrCertHashMismatch{Expected: hash[:], Actual: digests} } cert, err := x509.ParseCertificate(leaf) diff --git a/p2p/transport/webtransport/transport_test.go b/p2p/transport/webtransport/transport_test.go index f58f6cc009..0d43f0d30c 100644 --- a/p2p/transport/webtransport/transport_test.go +++ b/p2p/transport/webtransport/transport_test.go @@ -179,7 +179,11 @@ func TestHashVerification(t *testing.T) { var trErr *quic.TransportError require.ErrorAs(t, err, &trErr) require.Equal(t, quic.TransportErrorCode(0x12a), trErr.ErrorCode) - require.Contains(t, errors.Unwrap(trErr).Error(), "cert hash not found") + var errMismatchHash libp2pwebtransport.ErrCertHashMismatch + require.ErrorAs(t, err, &errMismatchHash) + + e := sha256.Sum256([]byte("foobar")) + require.EqualValues(t, e[:], errMismatchHash.Actual[0]) }) t.Run("fails when adding a wrong hash", func(t *testing.T) { diff --git a/test-plans/go.mod b/test-plans/go.mod index 6bd58c0b95..48e2c704c6 100644 --- a/test-plans/go.mod +++ b/test-plans/go.mod @@ -94,7 +94,7 @@ require ( github.com/prometheus/common v0.61.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/quic-go/qpack v0.5.1 // indirect - github.com/quic-go/quic-go v0.48.2 // indirect + github.com/quic-go/quic-go v0.49.0 // indirect github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect diff --git a/test-plans/go.sum b/test-plans/go.sum index 439614d540..8134e689b9 100644 --- a/test-plans/go.sum +++ b/test-plans/go.sum @@ -286,8 +286,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= -github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/quic-go v0.49.0 h1:w5iJHXwHxs1QxyBv1EHKuC50GX5to8mJAxvtnttJp94= +github.com/quic-go/quic-go v0.49.0/go.mod h1:s2wDnmCdooUQBmQfpUSTCYBl1/D4FcqbULMMkASvR6s= github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=