diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 4cc2638d0..ccbe2f38f 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -9,7 +9,7 @@ permissions: contents: read env: - GO_VERSION: 1.25.x # NB! when updating also update matrix, we cannot refer to env variables in the matrix + GO_VERSION: 1.26.x # NB! when updating also update matrix, we cannot refer to env variables in the matrix GOLANGCI_LINT_VERSION: v2.10.1 jobs: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 2702f2169..4d878b621 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -12,7 +12,7 @@ permissions: contents: read env: - GO_VERSION: 1.25.x # NB! when updating also update matrix, we cannot refer to env variables in the matrix + GO_VERSION: 1.26.x # NB! when updating also update matrix, we cannot refer to env variables in the matrix GOLANGCI_LINT_VERSION: v2.10.1 jobs: @@ -48,7 +48,7 @@ jobs: test: strategy: matrix: - go-version: [1.25.x] + go-version: [1.26.x] os: [ gha-runner-scale-set-ubuntu-24-amd64-xxl, diff --git a/CHANGELOG.md b/CHANGELOG.md index f20f4bce8..bb4bfb9dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,34 @@ + +## [v0.22.0] - 2026-10-02 +### Breaking +- BLS12-381/Jubjub: correct the twisted-Edwards generator; regenerate keys and signatures derived from the previous generator ([#821](https://github.com/Consensys/gnark-crypto/pull/821)) +- BLS12-381/Bandersnatch EdDSA now uses Bandersnatch rather than Jubjub; regenerate keys and signatures ([#882](https://github.com/Consensys/gnark-crypto/pull/882)) +- MamaBear Poseidon2 uses its derived `R_F = 8`, `R_P = 32` round schedule; existing MamaBear Poseidon2 outputs are incompatible ([#900](https://github.com/Consensys/gnark-crypto/pull/900)) + +### Security +- ecdsa: reject identity and small-subgroup public keys during key deserialization ([#889](https://github.com/Consensys/gnark-crypto/pull/889)) +- kzg MPC setup: restore the omitted verifying-key G1 generator when reading a setup, preserving opening-proof binding ([#891](https://github.com/Consensys/gnark-crypto/pull/891)) +- Vortex: reject malformed opening proofs that could make an invalid evaluation claim verify (KoalaBear [#896](https://github.com/Consensys/gnark-crypto/pull/896); MamaBear) +- shplonk and fflonk: reject malformed proof shapes rather than panicking in `BatchVerify` ([#892](https://github.com/Consensys/gnark-crypto/pull/892)) +- fft: reject invalid serialized domain cardinalities before panic or excessive allocation ([#893](https://github.com/Consensys/gnark-crypto/pull/893)) +- field vectors: reject lengths exceeding a knowable remaining input before allocating ([#878](https://github.com/Consensys/gnark-crypto/pull/878)) + +### Feat +- add the 49-bit MamaBear field, degree-3 extensions, FFT, Poseidon2, SIS, IOP, and experimental Vortex commitment scheme with AVX-512 IFMA acceleration ([#887](https://github.com/Consensys/gnark-crypto/pull/887)) +- kzg: add the `Committer` interface plus `OpenWithCommitter` and `BatchOpenSinglePointWithCommitter` for externally accelerated quotient commitments ([#879](https://github.com/Consensys/gnark-crypto/pull/879)) + +### Perf +- MamaBear AVX-512 IFMA vector arithmetic and FFT acceleration; optimized E3 arithmetic and Poseidon2 ([#887](https://github.com/Consensys/gnark-crypto/pull/887)) + +### Fix +- reject uncompressed all-zero point encodings whose infinity bit is clear ([#897](https://github.com/Consensys/gnark-crypto/pull/897)) +- correct MamaBear Poseidon2 parameters for 128-bit security ([#900](https://github.com/Consensys/gnark-crypto/pull/900)) + +### Build +- require Go 1.26.8 and update CI to Go 1.26.x +- **deps:** update direct and tool dependencies + ## [v0.21.0] - 2026-08-10 ### Breaking @@ -2289,6 +2319,7 @@ - Merge pull request [#2](https://github.com/Consensys/gnark-crypto/issues/2) from ConsenSys/develop ## v0.0.1 - 2020-03-23 +[v0.22.0]: https://github.com/Consensys/gnark-crypto/compare/v0.21.0...v0.22.0 [v0.21.0]: https://github.com/Consensys/gnark-crypto/compare/v0.20.1...v0.21.0 [v0.20.1]: https://github.com/Consensys/gnark-crypto/compare/v0.20.0...v0.20.1 [v0.20.0]: https://github.com/Consensys/gnark-crypto/compare/v0.19.2...v0.20.0 diff --git a/CITATION.bib b/CITATION.bib index a9c1d25cc..0d85ac908 100644 --- a/CITATION.bib +++ b/CITATION.bib @@ -1,4 +1,4 @@ -@software{gnark-crypto-v0.20, +@software{gnark-crypto-v0.22, author = {Gautam Botrel and Thomas Piellard and Youssef El Housni and @@ -6,11 +6,11 @@ @software{gnark-crypto-v0.20 Gus Gutoski and Ivo Kubjas and Yao J. Galteland}, - title = {Consensys/gnark-crypto: v0.20.0}, - month = mar, + title = {Consensys/gnark-crypto: v0.22.0}, + month = oct, year = 2026, publisher = {Zenodo}, - version = {v0.20.0}, + version = {v0.22.0}, doi = {10.5281/zenodo.5815453}, url = {https://doi.org/10.5281/zenodo.5815453} } \ No newline at end of file diff --git a/README.md b/README.md index ad5811690..3691e81c3 100644 --- a/README.md +++ b/README.md @@ -16,16 +16,18 @@ It is actively developed and maintained by the team ( | [Ha * [`bls12-377`] / [`bw6-761`] * [`bls24-315`] / [`bw6-633`] -Each of these curves has a [`twistededwards`] sub-package with its companion curve, which allows efficient elliptic curve cryptography inside zkSNARK circuits. +Each pairing-friendly curve has a [`twistededwards`] companion sub-package for efficient elliptic-curve cryptography in zkSNARK circuits. BLS12-381 also has the [`bandersnatch`] companion curve. -Additional (non pairing-friendly) curves: [`secp256r1`] (P-256), [`secp256k1`], [`grumpkin`], [`stark-curve`]. +Additional non-pairing-friendly curves: [`secp256r1`] (P-256), [`secp256k1`], [`grumpkin`], [`stark-curve`]. ### Small fields Small prime fields for STARK-style provers: -* [`koalabear`], [`babybear`] (31-bit, with AVX-512 and NEON vector kernels), [`goldilocks`] (64-bit) -* Each with `extensions` (degree 2/4/6), `fft`, `poseidon2`, `sis` (Ring-SIS) and `iop` sub-packages +* [`koalabear`] and [`babybear`] — 31-bit fields with AVX-512 and NEON vector kernels; degree-2/4/6 extensions +* [`mamabear`] — 49-bit field with AVX-512 IFMA kernels; a degree-3 extension +* [`goldilocks`] — 64-bit field; a degree-2 extension +* Each field includes `fft`, `poseidon2`, `sis` (Ring-SIS) and `iop`; KoalaBear and MamaBear additionally provide the experimental [`vortex`] commitment scheme ### Signatures & hashing @@ -68,7 +70,7 @@ See [list of audits for `gnark` and `gnark-crypto`](https://github.com/Consensys ### Go version -`gnark-crypto` requires Go 1.25 or newer (see `go.mod`); CI tests against Go 1.25.x. +`gnark-crypto` requires Go 1.26 or newer (see `go.mod`); CI tests against Go 1.26.x. ### Install `gnark-crypto` @@ -105,7 +107,7 @@ If you use `gnark-crypto` in your research a citation would be appreciated. Please use the following BibTeX to cite the most recent release. ```bib -@software{gnark-crypto-v0.21, +@software{gnark-crypto-v0.22, author = {Gautam Botrel and Thomas Piellard and Youssef El Housni and @@ -113,11 +115,11 @@ Please use the following BibTeX to cite the most recent release. Gus Gutoski and Ivo Kubjas and Yao J. Galteland}, - title = {Consensys/gnark-crypto: v0.21.0}, - month = aug, + title = {Consensys/gnark-crypto: v0.22.0}, + month = oct, year = 2026, publisher = {Zenodo}, - version = {v0.21.0}, + version = {v0.22.0}, doi = {10.5281/zenodo.5815453}, url = {https://doi.org/10.5281/zenodo.5815453} } @@ -144,6 +146,7 @@ This project is licensed under the Apache 2 License - see the [LICENSE](LICENSE) [`grumpkin`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/ecc/grumpkin [`stark-curve`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/ecc/stark-curve [`twistededwards`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/ecc/bn254/twistededwards +[`bandersnatch`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/ecc/bls12-381/bandersnatch [`eddsa`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/signature/eddsa [`ecdsa`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/signature/ecdsa [`fft`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/ecc/bn254/fr/fft @@ -161,6 +164,8 @@ This project is licensed under the Apache 2 License - see the [LICENSE](LICENSE) [`koalabear`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/field/koalabear [`babybear`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/field/babybear [`goldilocks`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/field/goldilocks +[`mamabear`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/field/mamabear +[`vortex`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/field/koalabear/vortex [`merkletree`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/accumulator/merkletree [`eisenstein`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/algebra/eisenstein [`lattice`]: https://pkg.go.dev/github.com/consensys/gnark-crypto/algebra/lattice diff --git a/field/mamabear/vortex/prover_test.go b/field/mamabear/vortex/prover_test.go index 379fac916..df4bad5a6 100644 --- a/field/mamabear/vortex/prover_test.go +++ b/field/mamabear/vortex/prover_test.go @@ -139,6 +139,203 @@ func runTest(t *testing.T, tc *testcaseVortex) { } } +// An unchecked suffix changes the polynomial evaluated at x without changing +// the Reed-Solomon codeword or any opened column. +func TestVerifyRejectsOversizedUAlpha(t *testing.T) { + const numColumns, numRows = 4, 4 + sisParams, err := sis.NewRSis(0, 9, 16, numRows) + require.NoError(t, err) + params, err := NewParams(numColumns, numRows, sisParams, 2, 1) + require.NoError(t, err) + + matrix := make([][]mamabear.Element, numRows) + for row := range matrix { + matrix[row] = make([]mamabear.Element, numColumns) + for col := range matrix[row] { + matrix[row][col] = mamabear.NewElement(uint64(100 + 10*row + col)) + } + } + x := fext.E3{ + A0: mamabear.NewElement(123), + A1: mamabear.NewElement(456), + A2: mamabear.NewElement(789), + } + alpha := fext.E3{ + A0: mamabear.NewElement(17), + A1: mamabear.NewElement(19), + A2: mamabear.NewElement(23), + } + claims := make([]fext.E3, numRows) + for row := range matrix { + claims[row], err = EvalBasePolyLagrange(matrix[row], x) + require.NoError(t, err) + } + state, err := Commit(params, matrix) + require.NoError(t, err) + state.OpenLinComb(alpha) + proof, err := state.OpenColumns([]int{0}) + require.NoError(t, err) + input := VerifierInput{ + Proof: proof, MerkleRoot: state.GetCommitment(), ClaimedValues: claims, + EvaluationPoint: x, Alpha: alpha, SelectedColumns: []int{0}, + } + require.NoError(t, params.Verify(input)) + input.Proof = nil + require.Error(t, params.Verify(input), "missing proof must be rejected") + short := *proof + short.UAlpha = short.UAlpha[:len(short.UAlpha)-1] + input.Proof = &short + require.Error(t, params.Verify(input), "short codeword must be rejected without panicking") + input.Proof = proof + + falseClaims := append([]fext.E3(nil), claims...) + var one fext.E3 + one.SetOne() + falseClaims[0].Add(&falseClaims[0], &one) + input.ClaimedValues = falseClaims + require.Error(t, params.Verify(input)) + + n := params.SizeCodeWord() + forged := *proof + forged.UAlpha = make([]fext.E3, 2*n) + copy(forged.UAlpha, proof.UAlpha) + forged.UAlpha[n] = EvalBasePolyHorner(forged.OpenedColumns[0], alpha) + prefixValue, err := EvalFextPolyLagrange(forged.UAlpha, x) + require.NoError(t, err) + target := EvalFextPolyHorner(falseClaims, alpha) + var correction fext.E3 + correction.Sub(&target, &prefixValue) + corrected := false + for index := n + 1; index < len(forged.UAlpha); index++ { + basis := make([]fext.E3, len(forged.UAlpha)) + basis[index].SetOne() + weight, evalErr := EvalFextPolyLagrange(basis, x) + require.NoError(t, evalErr) + if weight.IsZero() { + continue + } + var inverse fext.E3 + inverse.Inverse(&weight) + forged.UAlpha[index].Mul(&correction, &inverse) + corrected = true + break + } + require.True(t, corrected, "no nonzero suffix Lagrange coordinate") + input.Proof = &forged + require.Error(t, params.Verify(input), "forged false claim must be rejected") +} + +func TestVerifyRejectsMalformedOpening(t *testing.T) { + const numColumns, numRows = 4, 4 + sisParams, err := sis.NewRSis(0, 9, 16, numRows) + require.NoError(t, err) + params, err := NewParams(numColumns, numRows, sisParams, 2, 1) + require.NoError(t, err) + matrix := make([][]mamabear.Element, numRows) + for i := range matrix { + matrix[i] = make([]mamabear.Element, numColumns) + matrix[i][0] = mamabear.NewElement(uint64(i + 1)) + } + var x, alpha fext.E3 + x.A0 = mamabear.NewElement(123) + alpha.A0 = mamabear.NewElement(17) + claims := make([]fext.E3, numRows) + for i := range matrix { + claims[i], err = EvalBasePolyLagrange(matrix[i], x) + require.NoError(t, err) + } + state, err := Commit(params, matrix) + require.NoError(t, err) + state.OpenLinComb(alpha) + proof, err := state.OpenColumns([]int{0}) + require.NoError(t, err) + input := VerifierInput{ + Proof: proof, MerkleRoot: state.GetCommitment(), ClaimedValues: claims, + EvaluationPoint: x, Alpha: alpha, SelectedColumns: []int{0}, + } + require.NoError(t, params.Verify(input)) + + t.Run("missing selection permits an unbound claim", func(t *testing.T) { + bad := input + bad.SelectedColumns = nil + bad.Proof = &Proof{UAlpha: make([]fext.E3, params.SizeCodeWord())} + bad.ClaimedValues = make([]fext.E3, numRows) + require.Error(t, params.Verify(bad)) + }) + t.Run("missing opened column", func(t *testing.T) { + bad := *proof + bad.OpenedColumns = nil + input.Proof = &bad + require.Error(t, params.Verify(input)) + }) + t.Run("missing merkle proof", func(t *testing.T) { + bad := *proof + bad.MerkleProofOpenedColumns = nil + input.Proof = &bad + require.Error(t, params.Verify(input)) + }) + t.Run("short opened column", func(t *testing.T) { + bad := *proof + bad.OpenedColumns = [][]mamabear.Element{proof.OpenedColumns[0][:numRows-1]} + input.Proof = &bad + require.Error(t, params.Verify(input)) + }) + t.Run("oversized opened column", func(t *testing.T) { + bad := *proof + bad.OpenedColumns = [][]mamabear.Element{append(append([]mamabear.Element(nil), proof.OpenedColumns[0]...), mamabear.Element{})} + input.Proof = &bad + require.Error(t, params.Verify(input)) + }) + t.Run("out of range Merkle alias", func(t *testing.T) { + bad := input + bad.Proof = proof + bad.SelectedColumns = []int{params.SizeCodeWord()} + require.Error(t, params.Verify(bad)) + }) + t.Run("negative column", func(t *testing.T) { + bad := input + bad.Proof = proof + bad.SelectedColumns = []int{-1} + require.Error(t, params.Verify(bad)) + }) + t.Run("missing claims", func(t *testing.T) { + bad := input + bad.Proof = proof + bad.ClaimedValues = nil + require.Error(t, params.Verify(bad)) + }) + t.Run("extra claims", func(t *testing.T) { + bad := input + bad.Proof = proof + bad.ClaimedValues = append(append([]fext.E3(nil), claims...), fext.E3{}) + require.Error(t, params.Verify(bad)) + }) + t.Run("extra opened column", func(t *testing.T) { + bad := *proof + bad.OpenedColumns = append(append([][]mamabear.Element(nil), proof.OpenedColumns...), proof.OpenedColumns[0]) + input.Proof = &bad + require.Error(t, params.Verify(input)) + }) + t.Run("extra Merkle proof", func(t *testing.T) { + bad := *proof + bad.MerkleProofOpenedColumns = append(append([]MerkleProof(nil), proof.MerkleProofOpenedColumns...), proof.MerkleProofOpenedColumns[0]) + input.Proof = &bad + require.Error(t, params.Verify(input)) + }) + t.Run("missing Merkle sibling", func(t *testing.T) { + bad := *proof + bad.MerkleProofOpenedColumns = []MerkleProof{proof.MerkleProofOpenedColumns[0][:0]} + input.Proof = &bad + require.Error(t, params.Verify(input)) + }) + t.Run("extra Merkle sibling", func(t *testing.T) { + bad := *proof + bad.MerkleProofOpenedColumns = []MerkleProof{append(append(MerkleProof(nil), proof.MerkleProofOpenedColumns[0]...), Hash{})} + input.Proof = &bad + require.Error(t, params.Verify(input)) + }) +} + func FuzzVortex(f *testing.F) { const ( sisLog2Degree = 4 diff --git a/field/mamabear/vortex/reedsolomon.go b/field/mamabear/vortex/reedsolomon.go index ba77dbaca..d3348c4be 100644 --- a/field/mamabear/vortex/reedsolomon.go +++ b/field/mamabear/vortex/reedsolomon.go @@ -81,7 +81,9 @@ func (p *Params) encodeReedSolomonCosets(input, res []mamabear.Element) { // IsReedSolomonCodewords returns true iff the argument is a correct codeword. func (p *Params) IsReedSolomonCodewords(codeword []fext.E3) bool { - + if len(codeword) != p.SizeCodeWord() { + return false + } coeffs := make([]mamabear.Element, p.SizeCodeWord()) for i := range coeffs { diff --git a/field/mamabear/vortex/verifier.go b/field/mamabear/vortex/verifier.go index 8d9ded0b3..a290bb482 100644 --- a/field/mamabear/vortex/verifier.go +++ b/field/mamabear/vortex/verifier.go @@ -31,8 +31,29 @@ type VerifierInput struct { // Verify implements the verification algorithm for a Vortex opening proof. func (p *Params) Verify(input VerifierInput) error { - proof := input.Proof + if proof == nil { + return errors.New("invalid proof: missing opening proof") + } + n := p.SizeCodeWord() + if len(proof.UAlpha) != n { + return fmt.Errorf("invalid proof: uAlpha must have %d elements", n) + } + if len(input.SelectedColumns) == 0 || len(input.SelectedColumns) != p.NumSelectedColumns || + len(proof.OpenedColumns) != len(input.SelectedColumns) || + len(proof.MerkleProofOpenedColumns) != len(input.SelectedColumns) { + return errors.New("invalid proof: incorrect number of opened columns") + } + if len(input.ClaimedValues) == 0 || len(input.ClaimedValues) > p.MaxNbRows { + return errors.New("invalid proof: incorrect number of claimed rows") + } + merkleDepth := log2Ceil(n) + for i, c := range input.SelectedColumns { + if c < 0 || c >= n || len(proof.OpenedColumns[i]) != len(input.ClaimedValues) || + len(proof.MerkleProofOpenedColumns[i]) != merkleDepth { + return fmt.Errorf("invalid proof: malformed opening at column %d", i) + } + } root := input.MerkleRoot // Check consistency between uAlpha and the claimed value. diff --git a/go.mod b/go.mod index 73de9003f..220af3dde 100644 --- a/go.mod +++ b/go.mod @@ -1,29 +1,27 @@ module github.com/consensys/gnark-crypto -go 1.25.7 +go 1.26.8 require ( - github.com/bits-and-blooms/bitset v1.24.6 + github.com/bits-and-blooms/bitset v1.25.0 github.com/consensys/bavard v0.2.2-0.20260118153501-cba9f5475432 github.com/leanovate/gopter v0.2.11 github.com/mmcloughlin/addchain v0.4.0 - github.com/stretchr/testify v1.11.1 - golang.org/x/crypto v0.54.0 - golang.org/x/sync v0.22.0 - golang.org/x/sys v0.47.0 + github.com/stretchr/testify v1.12.1 + golang.org/x/crypto v0.57.0 + golang.org/x/sync v0.23.0 + golang.org/x/sys v0.48.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect github.com/klauspost/asmfmt v1.3.2 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/mod v0.38.0 // indirect - golang.org/x/telemetry v0.0.0-20260804195142-bdd03c3c8848 // indirect - golang.org/x/tools v0.48.0 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect + golang.org/x/mod v0.41.0 // indirect + golang.org/x/telemetry v0.0.0-20260908163034-4bcc4b2ee518 // indirect + golang.org/x/tools v0.50.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index f932569e0..36376fc91 100644 --- a/go.sum +++ b/go.sum @@ -44,8 +44,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.24.6 h1:qcrftZUVBIwfs+m+nhoCBAPT+ZPZZjti8SbHbDQQkZ4= -github.com/bits-and-blooms/bitset v1.24.6/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.25.0 h1:0Ro0qF4abCkM6SqWPVj29sFhAbMPAZpaDD7xhJ10beM= +github.com/bits-and-blooms/bitset v1.25.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -62,7 +62,6 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -214,7 +213,6 @@ github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -247,8 +245,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -269,6 +267,8 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -278,8 +278,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= -golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= +golang.org/x/crypto v0.57.0 h1:3ZVCjf8Ggz7zneR/EHRVx68Ctf+2pmIMP2UFhh9cC6M= +golang.org/x/crypto v0.57.0/go.mod h1:Fdz0i5U6CoizGwLda9DttjSk6qlZo25zYNtR+ycvuZA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -318,8 +318,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= -golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= +golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= +golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -384,8 +384,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= -golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -434,10 +434,10 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= -golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/telemetry v0.0.0-20260804195142-bdd03c3c8848 h1:gw6MYMPjxGBM77qPFYzz0c2naANqd2FF66wZRteou4s= -golang.org/x/telemetry v0.0.0-20260804195142-bdd03c3c8848/go.mod h1:LV7u5Oco+Z/g6XI7PqN+EUUUGGkEcmB1uj2ceI0fOVg= +golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= +golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/telemetry v0.0.0-20260908163034-4bcc4b2ee518 h1:F5BWKvW126NXR74uxkxuc1jQHhm/rwm/J3rSiFyuRs4= +golang.org/x/telemetry v0.0.0-20260908163034-4bcc4b2ee518/go.mod h1:i+ivNqjDnTF3WTElsdk5g9V5DTSBYgdNo7xTU9SDwYA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -510,8 +510,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= -golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= +golang.org/x/tools v0.50.0 h1:c2ifzfcuY7L90lZ2aKd8S4K2NpASF08SZx9ZuJkHmSU= +golang.org/x/tools v0.50.0/go.mod h1:7ulVMw3831Mwi5EZD6RomGyffr4VFjuNYXf2BbCEAV0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -631,8 +631,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=