From f642b20a8676329f11e27d0d040379c17283a313 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Tue, 17 Feb 2026 11:00:11 +0000 Subject: [PATCH 01/10] fix: register gates in GKR Poseidon --- .../poseidon2/gkr-poseidon2/gkr-poseidon2.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index b8901c4e5d..a3836392d7 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -323,6 +323,22 @@ func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { return gkrgates.Register(intKeyGate2(&p.RoundKeys[round][1]), 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithUnverifiedSolvableVar(0), gkrgates.WithName(gateNames.linear(y, round)), gkrgates.WithCurves(curve)) } + if err := gkrgates.Register(pow4Gate, 1); err != nil { + return fmt.Errorf("failed to register pow4Gate: %w", err) + } + if err := gkrgates.Register(pow4TimesGate, 2); err != nil { + return fmt.Errorf("failed to register pow4TimesGate: %w", err) + } + if err := gkrgates.Register(pow3Gate, 1); err != nil { + return fmt.Errorf("failed to register pow3Gate: %w", err) + } + if err := gkrgates.Register(pow2Gate, 1); err != nil { + return fmt.Errorf("failed to register pow2Gate: %w", err) + } + if err := gkrgates.Register(pow2TimesGate, 2); err != nil { + return fmt.Errorf("failed to register pow2TimesGate: %w", err) + } + fullRound := func(i int) error { if err := extKeySBox(i, x); err != nil { return err From f01d70396054b8681116b2e821181e86f366bab6 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Tue, 17 Feb 2026 16:37:33 +0100 Subject: [PATCH 02/10] Update std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index a3836392d7..d45cc17104 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -338,6 +338,15 @@ func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { if err := gkrgates.Register(pow2TimesGate, 2); err != nil { return fmt.Errorf("failed to register pow2TimesGate: %w", err) } + if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { + return fmt.Errorf("failed to register extGate2: %w", err) + } + if err := gkrgates.Register(intGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { + return fmt.Errorf("failed to register intGate2: %w", err) + } + if err := gkrgates.Register(extAddGate, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { + return fmt.Errorf("failed to register extAddGate: %w", err) + } fullRound := func(i int) error { if err := extKeySBox(i, x); err != nil { From 9e2ae14af3152c3abbc0cd3fdb38056e2dc17ba7 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Tue, 17 Feb 2026 16:37:41 +0100 Subject: [PATCH 03/10] Update std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../poseidon2/gkr-poseidon2/gkr-poseidon2.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index d45cc17104..60a51cf9d7 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -323,19 +323,19 @@ func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { return gkrgates.Register(intKeyGate2(&p.RoundKeys[round][1]), 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithUnverifiedSolvableVar(0), gkrgates.WithName(gateNames.linear(y, round)), gkrgates.WithCurves(curve)) } - if err := gkrgates.Register(pow4Gate, 1); err != nil { + if err := gkrgates.Register(pow4Gate, 1, gkrgates.WithUnverifiedDegree(4), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow4Gate: %w", err) } - if err := gkrgates.Register(pow4TimesGate, 2); err != nil { + if err := gkrgates.Register(pow4TimesGate, 2, gkrgates.WithUnverifiedDegree(5), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow4TimesGate: %w", err) } - if err := gkrgates.Register(pow3Gate, 1); err != nil { + if err := gkrgates.Register(pow3Gate, 1, gkrgates.WithUnverifiedDegree(3), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow3Gate: %w", err) } - if err := gkrgates.Register(pow2Gate, 1); err != nil { + if err := gkrgates.Register(pow2Gate, 1, gkrgates.WithUnverifiedDegree(2), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow2Gate: %w", err) } - if err := gkrgates.Register(pow2TimesGate, 2); err != nil { + if err := gkrgates.Register(pow2TimesGate, 2, gkrgates.WithUnverifiedDegree(3), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow2TimesGate: %w", err) } if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { From 3b50f9058880b4d2025cb9325fcdc3967dddd400 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Wed, 18 Feb 2026 23:50:44 +0000 Subject: [PATCH 04/10] Revert "Update std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go" This reverts commit 9e2ae14af3152c3abbc0cd3fdb38056e2dc17ba7. --- .../poseidon2/gkr-poseidon2/gkr-poseidon2.go | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index 60a51cf9d7..a3836392d7 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -323,30 +323,21 @@ func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { return gkrgates.Register(intKeyGate2(&p.RoundKeys[round][1]), 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithUnverifiedSolvableVar(0), gkrgates.WithName(gateNames.linear(y, round)), gkrgates.WithCurves(curve)) } - if err := gkrgates.Register(pow4Gate, 1, gkrgates.WithUnverifiedDegree(4), gkrgates.WithCurves(curve)); err != nil { + if err := gkrgates.Register(pow4Gate, 1); err != nil { return fmt.Errorf("failed to register pow4Gate: %w", err) } - if err := gkrgates.Register(pow4TimesGate, 2, gkrgates.WithUnverifiedDegree(5), gkrgates.WithCurves(curve)); err != nil { + if err := gkrgates.Register(pow4TimesGate, 2); err != nil { return fmt.Errorf("failed to register pow4TimesGate: %w", err) } - if err := gkrgates.Register(pow3Gate, 1, gkrgates.WithUnverifiedDegree(3), gkrgates.WithCurves(curve)); err != nil { + if err := gkrgates.Register(pow3Gate, 1); err != nil { return fmt.Errorf("failed to register pow3Gate: %w", err) } - if err := gkrgates.Register(pow2Gate, 1, gkrgates.WithUnverifiedDegree(2), gkrgates.WithCurves(curve)); err != nil { + if err := gkrgates.Register(pow2Gate, 1); err != nil { return fmt.Errorf("failed to register pow2Gate: %w", err) } - if err := gkrgates.Register(pow2TimesGate, 2, gkrgates.WithUnverifiedDegree(3), gkrgates.WithCurves(curve)); err != nil { + if err := gkrgates.Register(pow2TimesGate, 2); err != nil { return fmt.Errorf("failed to register pow2TimesGate: %w", err) } - if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register extGate2: %w", err) - } - if err := gkrgates.Register(intGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register intGate2: %w", err) - } - if err := gkrgates.Register(extAddGate, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register extAddGate: %w", err) - } fullRound := func(i int) error { if err := extKeySBox(i, x); err != nil { From b4e6d769b2a28be5c969ae3cb0b62de3a7ac4d22 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Wed, 18 Feb 2026 23:51:07 +0000 Subject: [PATCH 05/10] fix: add other unregistered gates --- std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index a3836392d7..32ab492b08 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -338,6 +338,15 @@ func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { if err := gkrgates.Register(pow2TimesGate, 2); err != nil { return fmt.Errorf("failed to register pow2TimesGate: %w", err) } + if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1)); err != nil { + return fmt.Errorf("failed to register extGate2: %w", err) + } + if err := gkrgates.Register(intGate2, 2, gkrgates.WithUnverifiedDegree(1)); err != nil { + return fmt.Errorf("failed to register intGate2: %w", err) + } + if err := gkrgates.Register(extAddGate, 3, gkrgates.WithUnverifiedDegree(1)); err != nil { + return fmt.Errorf("failed to register extAddGate: %w", err) + } fullRound := func(i int) error { if err := extKeySBox(i, x); err != nil { From 20f8253822e8a6c909cf17925352eac01ae4b021 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Wed, 18 Feb 2026 23:52:57 +0000 Subject: [PATCH 06/10] chore: add gate degrees --- .../poseidon2/gkr-poseidon2/gkr-poseidon2.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index 32ab492b08..e6e1c6e626 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -323,19 +323,19 @@ func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { return gkrgates.Register(intKeyGate2(&p.RoundKeys[round][1]), 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithUnverifiedSolvableVar(0), gkrgates.WithName(gateNames.linear(y, round)), gkrgates.WithCurves(curve)) } - if err := gkrgates.Register(pow4Gate, 1); err != nil { + if err := gkrgates.Register(pow4Gate, 1, gkrgates.WithUnverifiedDegree(4)); err != nil { return fmt.Errorf("failed to register pow4Gate: %w", err) } - if err := gkrgates.Register(pow4TimesGate, 2); err != nil { + if err := gkrgates.Register(pow4TimesGate, 2, gkrgates.WithUnverifiedDegree(5)); err != nil { return fmt.Errorf("failed to register pow4TimesGate: %w", err) } - if err := gkrgates.Register(pow3Gate, 1); err != nil { + if err := gkrgates.Register(pow3Gate, 1, gkrgates.WithUnverifiedDegree(3)); err != nil { return fmt.Errorf("failed to register pow3Gate: %w", err) } - if err := gkrgates.Register(pow2Gate, 1); err != nil { + if err := gkrgates.Register(pow2Gate, 1, gkrgates.WithUnverifiedDegree(2)); err != nil { return fmt.Errorf("failed to register pow2Gate: %w", err) } - if err := gkrgates.Register(pow2TimesGate, 2); err != nil { + if err := gkrgates.Register(pow2TimesGate, 2, gkrgates.WithUnverifiedDegree(3)); err != nil { return fmt.Errorf("failed to register pow2TimesGate: %w", err) } if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1)); err != nil { From b8beb72aab08b06c37289befc70aceacf93b6327 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Wed, 18 Feb 2026 23:53:07 +0000 Subject: [PATCH 07/10] chore: add curves to gates --- .../poseidon2/gkr-poseidon2/gkr-poseidon2.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index e6e1c6e626..5950cfbebd 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -323,28 +323,28 @@ func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { return gkrgates.Register(intKeyGate2(&p.RoundKeys[round][1]), 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithUnverifiedSolvableVar(0), gkrgates.WithName(gateNames.linear(y, round)), gkrgates.WithCurves(curve)) } - if err := gkrgates.Register(pow4Gate, 1, gkrgates.WithUnverifiedDegree(4)); err != nil { + if err := gkrgates.Register(pow4Gate, 1, gkrgates.WithUnverifiedDegree(4), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow4Gate: %w", err) } - if err := gkrgates.Register(pow4TimesGate, 2, gkrgates.WithUnverifiedDegree(5)); err != nil { + if err := gkrgates.Register(pow4TimesGate, 2, gkrgates.WithUnverifiedDegree(5), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow4TimesGate: %w", err) } - if err := gkrgates.Register(pow3Gate, 1, gkrgates.WithUnverifiedDegree(3)); err != nil { + if err := gkrgates.Register(pow3Gate, 1, gkrgates.WithUnverifiedDegree(3), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow3Gate: %w", err) } - if err := gkrgates.Register(pow2Gate, 1, gkrgates.WithUnverifiedDegree(2)); err != nil { + if err := gkrgates.Register(pow2Gate, 1, gkrgates.WithUnverifiedDegree(2), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow2Gate: %w", err) } - if err := gkrgates.Register(pow2TimesGate, 2, gkrgates.WithUnverifiedDegree(3)); err != nil { + if err := gkrgates.Register(pow2TimesGate, 2, gkrgates.WithUnverifiedDegree(3), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register pow2TimesGate: %w", err) } - if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1)); err != nil { + if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register extGate2: %w", err) } - if err := gkrgates.Register(intGate2, 2, gkrgates.WithUnverifiedDegree(1)); err != nil { + if err := gkrgates.Register(intGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register intGate2: %w", err) } - if err := gkrgates.Register(extAddGate, 3, gkrgates.WithUnverifiedDegree(1)); err != nil { + if err := gkrgates.Register(extAddGate, 3, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { return fmt.Errorf("failed to register extAddGate: %w", err) } From 3dd745442e49367b6e7c37a0a7728db0e2081325 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Wed, 18 Feb 2026 23:55:55 +0000 Subject: [PATCH 08/10] chore: remove unused gate --- std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index 5950cfbebd..e1d09a169a 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -103,14 +103,6 @@ func intGate2(api gkr.GateAPI, x ...frontend.Variable) frontend.Variable { return api.Add(api.Mul(x[1], 3), x[0]) } -// extGate applies the first row of the external matrix -func extGate(api gkr.GateAPI, x ...frontend.Variable) frontend.Variable { - if len(x) != 2 { - panic("expected 2 inputs") - } - return api.Add(api.Mul(x[0], 2), x[1]) -} - // extAddGate applies the first row of the external matrix to the first two elements and adds the third func extAddGate(api gkr.GateAPI, x ...frontend.Variable) frontend.Variable { if len(x) != 3 { From d46829b9ad285efbe96621e7f24d6bdaea363d4a Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Wed, 18 Feb 2026 23:56:15 +0000 Subject: [PATCH 09/10] chore: remove unused method --- std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index e1d09a169a..43209aa79e 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -396,9 +396,4 @@ func (n roundGateNamer) linear(varIndex, round int) gkr.GateName { return gkr.GateName(fmt.Sprintf("x%d-l-op-round=%d;%s", varIndex, round, n)) } -// integrated is the name of a gate where a polynomial of total degree 1 is applied to the input, followed by an S-box -func (n roundGateNamer) integrated(varIndex, round int) gkr.GateName { - return gkr.GateName(fmt.Sprintf("x%d-i-op-round=%d;%s", varIndex, round, n)) -} - type gkrPoseidon2Key struct{} From 53302ad391c52b6271aeab14f35b7d50c67f7e14 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Thu, 19 Feb 2026 00:08:18 +0000 Subject: [PATCH 10/10] chore: register static gates once --- .../poseidon2/gkr-poseidon2/gkr-poseidon2.go | 59 +++++++++++-------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go index 43209aa79e..a7712017b3 100644 --- a/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go +++ b/std/permutation/poseidon2/gkr-poseidon2/gkr-poseidon2.go @@ -3,6 +3,7 @@ package gkr_poseidon2 import ( "errors" "fmt" + "sync" "github.com/consensys/gnark/constraint/solver/gkrgates" "github.com/consensys/gnark/internal/kvstore" @@ -176,6 +177,7 @@ func defineCircuit(api frontend.API) (gkrCircuit *gkrapi.Circuit, in1, in2, out } gateNamer := newRoundGateNamer(&p, curve) + registerStaticGates() if err = registerGates(&p, curve); err != nil { return } @@ -286,6 +288,7 @@ func RegisterGates(curves ...ecc.ID) error { if len(curves) == 0 { return errors.New("expected at least one curve") } + registerStaticGates() for _, curve := range curves { p, err := poseidon2.GetDefaultParameters(curve) if err != nil { @@ -298,6 +301,37 @@ func RegisterGates(curves ...ecc.ID) error { return nil } +var staticGatesOnce sync.Once + +func registerStaticGates() { + staticGatesOnce.Do(func() { + if err := gkrgates.Register(pow4Gate, 1, gkrgates.WithUnverifiedDegree(4)); err != nil { + panic(err) + } + if err := gkrgates.Register(pow4TimesGate, 2, gkrgates.WithUnverifiedDegree(5)); err != nil { + panic(err) + } + if err := gkrgates.Register(pow3Gate, 1, gkrgates.WithUnverifiedDegree(3)); err != nil { + panic(err) + } + if err := gkrgates.Register(pow2Gate, 1, gkrgates.WithUnverifiedDegree(2)); err != nil { + panic(err) + } + if err := gkrgates.Register(pow2TimesGate, 2, gkrgates.WithUnverifiedDegree(3)); err != nil { + panic(err) + } + if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1)); err != nil { + panic(err) + } + if err := gkrgates.Register(intGate2, 2, gkrgates.WithUnverifiedDegree(1)); err != nil { + panic(err) + } + if err := gkrgates.Register(extAddGate, 3, gkrgates.WithUnverifiedDegree(1)); err != nil { + panic(err) + } + }) +} + func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { const ( x = iota @@ -315,31 +349,6 @@ func registerGates(p *poseidon2.Parameters, curve ecc.ID) error { return gkrgates.Register(intKeyGate2(&p.RoundKeys[round][1]), 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithUnverifiedSolvableVar(0), gkrgates.WithName(gateNames.linear(y, round)), gkrgates.WithCurves(curve)) } - if err := gkrgates.Register(pow4Gate, 1, gkrgates.WithUnverifiedDegree(4), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register pow4Gate: %w", err) - } - if err := gkrgates.Register(pow4TimesGate, 2, gkrgates.WithUnverifiedDegree(5), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register pow4TimesGate: %w", err) - } - if err := gkrgates.Register(pow3Gate, 1, gkrgates.WithUnverifiedDegree(3), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register pow3Gate: %w", err) - } - if err := gkrgates.Register(pow2Gate, 1, gkrgates.WithUnverifiedDegree(2), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register pow2Gate: %w", err) - } - if err := gkrgates.Register(pow2TimesGate, 2, gkrgates.WithUnverifiedDegree(3), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register pow2TimesGate: %w", err) - } - if err := gkrgates.Register(extGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register extGate2: %w", err) - } - if err := gkrgates.Register(intGate2, 2, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register intGate2: %w", err) - } - if err := gkrgates.Register(extAddGate, 3, gkrgates.WithUnverifiedDegree(1), gkrgates.WithCurves(curve)); err != nil { - return fmt.Errorf("failed to register extAddGate: %w", err) - } - fullRound := func(i int) error { if err := extKeySBox(i, x); err != nil { return err