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=