From 653311ac5a76922161e068e1afb08418670c22ea Mon Sep 17 00:00:00 2001 From: Gautam Botrel Date: Mon, 12 Sep 2022 13:20:31 -0500 Subject: [PATCH] fix: fixes #359 missing fields in plonk serialized format --- internal/backend/bls12-377/plonk/marshal.go | 4 ++ .../backend/bls12-377/plonk/marshal_test.go | 44 ++++++++++++------ internal/backend/bls12-381/plonk/marshal.go | 4 ++ .../backend/bls12-381/plonk/marshal_test.go | 44 ++++++++++++------ internal/backend/bls24-315/plonk/marshal.go | 4 ++ .../backend/bls24-315/plonk/marshal_test.go | 44 ++++++++++++------ internal/backend/bls24-317/plonk/marshal.go | 4 ++ .../backend/bls24-317/plonk/marshal_test.go | 44 ++++++++++++------ internal/backend/bn254/plonk/marshal.go | 4 ++ internal/backend/bn254/plonk/marshal_test.go | 44 ++++++++++++------ internal/backend/bw6-633/plonk/marshal.go | 4 ++ .../backend/bw6-633/plonk/marshal_test.go | 44 ++++++++++++------ internal/backend/bw6-761/plonk/marshal.go | 4 ++ .../backend/bw6-761/plonk/marshal_test.go | 44 ++++++++++++------ .../zkpschemes/plonk/plonk.marshal.go.tmpl | 4 ++ .../zkpschemes/plonk/tests/marshal.go.tmpl | 46 +++++++++++++------ 16 files changed, 282 insertions(+), 104 deletions(-) diff --git a/internal/backend/bls12-377/plonk/marshal.go b/internal/backend/bls12-377/plonk/marshal.go index 2bb46eabd..f5e5eaffa 100644 --- a/internal/backend/bls12-377/plonk/marshal.go +++ b/internal/backend/bls12-377/plonk/marshal.go @@ -117,6 +117,7 @@ func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { ([]fr.Element)(pk.Qo), ([]fr.Element)(pk.CQk), ([]fr.Element)(pk.LQk), + ([]fr.Element)(pk.EvaluationPermutationBigDomainBitReversed), ([]fr.Element)(pk.S1Canonical), ([]fr.Element)(pk.S2Canonical), ([]fr.Element)(pk.S3Canonical), @@ -162,6 +163,7 @@ func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { (*[]fr.Element)(&pk.Qo), (*[]fr.Element)(&pk.CQk), (*[]fr.Element)(&pk.LQk), + (*[]fr.Element)(&pk.EvaluationPermutationBigDomainBitReversed), (*[]fr.Element)(&pk.S1Canonical), (*[]fr.Element)(&pk.S2Canonical), (*[]fr.Element)(&pk.S3Canonical), @@ -187,6 +189,7 @@ func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { &vk.SizeInv, &vk.Generator, vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], @@ -214,6 +217,7 @@ func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { &vk.SizeInv, &vk.Generator, &vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], diff --git a/internal/backend/bls12-377/plonk/marshal_test.go b/internal/backend/bls12-377/plonk/marshal_test.go index f4bea8c37..4227edb58 100644 --- a/internal/backend/bls12-377/plonk/marshal_test.go +++ b/internal/backend/bls12-377/plonk/marshal_test.go @@ -31,7 +31,9 @@ func TestProvingKeySerialization(t *testing.T) { // create a random vk var vk VerifyingKey vk.Size = 42 - vk.SizeInv = fr.One() + vk.SizeInv.SetRandom() + vk.Generator.SetRandom() + vk.CosetShift.SetRandom() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -49,18 +51,18 @@ func TestProvingKeySerialization(t *testing.T) { pk.Vk = &vk pk.Domain[0] = *fft.NewDomain(42) pk.Domain[1] = *fft.NewDomain(4 * 42) - pk.Ql = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qr = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qm = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qo = make([]fr.Element, pk.Domain[0].Cardinality) - pk.CQk = make([]fr.Element, pk.Domain[0].Cardinality) - pk.LQk = make([]fr.Element, pk.Domain[0].Cardinality) - - for i := 0; i < 12; i++ { - pk.Ql[i].SetOne().Neg(&pk.Ql[i]) - pk.Qr[i].SetOne() - pk.Qo[i].SetUint64(42) - } + + n := int(pk.Domain[0].Cardinality) + pk.Ql = rVector(n) + pk.Qr = rVector(n) + pk.Qm = rVector(n) + pk.Qo = rVector(n) + pk.CQk = rVector(n) + pk.LQk = rVector(n) + pk.S1Canonical = rVector(n) + pk.S2Canonical = rVector(n) + pk.S3Canonical = rVector(n) + pk.EvaluationPermutationBigDomainBitReversed = rVector(n) pk.Permutation = make([]int64, 3*pk.Domain[0].Cardinality) pk.Permutation[0] = -12 @@ -93,6 +95,9 @@ func TestVerifyingKeySerialization(t *testing.T) { var vk VerifyingKey vk.Size = 42 vk.SizeInv = fr.One() + vk.Generator = fr.One() + vk.NbPublicVariables = 8000 + vk.CosetShift = fr.One() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -125,3 +130,16 @@ func TestVerifyingKeySerialization(t *testing.T) { t.Fatal("bytes written / read don't match") } } + +func rVector(n int) []fr.Element { + v := make([]fr.Element, n) + one := fr.One() + for i := 0; i < len(v); i++ { + if i == 0 { + v[i].SetRandom() + } else { + v[i].Add(&v[i-1], &one) + } + } + return v +} diff --git a/internal/backend/bls12-381/plonk/marshal.go b/internal/backend/bls12-381/plonk/marshal.go index d03d1be5f..5afeea186 100644 --- a/internal/backend/bls12-381/plonk/marshal.go +++ b/internal/backend/bls12-381/plonk/marshal.go @@ -117,6 +117,7 @@ func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { ([]fr.Element)(pk.Qo), ([]fr.Element)(pk.CQk), ([]fr.Element)(pk.LQk), + ([]fr.Element)(pk.EvaluationPermutationBigDomainBitReversed), ([]fr.Element)(pk.S1Canonical), ([]fr.Element)(pk.S2Canonical), ([]fr.Element)(pk.S3Canonical), @@ -162,6 +163,7 @@ func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { (*[]fr.Element)(&pk.Qo), (*[]fr.Element)(&pk.CQk), (*[]fr.Element)(&pk.LQk), + (*[]fr.Element)(&pk.EvaluationPermutationBigDomainBitReversed), (*[]fr.Element)(&pk.S1Canonical), (*[]fr.Element)(&pk.S2Canonical), (*[]fr.Element)(&pk.S3Canonical), @@ -187,6 +189,7 @@ func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { &vk.SizeInv, &vk.Generator, vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], @@ -214,6 +217,7 @@ func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { &vk.SizeInv, &vk.Generator, &vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], diff --git a/internal/backend/bls12-381/plonk/marshal_test.go b/internal/backend/bls12-381/plonk/marshal_test.go index e30d108e8..149b1d78f 100644 --- a/internal/backend/bls12-381/plonk/marshal_test.go +++ b/internal/backend/bls12-381/plonk/marshal_test.go @@ -31,7 +31,9 @@ func TestProvingKeySerialization(t *testing.T) { // create a random vk var vk VerifyingKey vk.Size = 42 - vk.SizeInv = fr.One() + vk.SizeInv.SetRandom() + vk.Generator.SetRandom() + vk.CosetShift.SetRandom() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -49,18 +51,18 @@ func TestProvingKeySerialization(t *testing.T) { pk.Vk = &vk pk.Domain[0] = *fft.NewDomain(42) pk.Domain[1] = *fft.NewDomain(4 * 42) - pk.Ql = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qr = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qm = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qo = make([]fr.Element, pk.Domain[0].Cardinality) - pk.CQk = make([]fr.Element, pk.Domain[0].Cardinality) - pk.LQk = make([]fr.Element, pk.Domain[0].Cardinality) - - for i := 0; i < 12; i++ { - pk.Ql[i].SetOne().Neg(&pk.Ql[i]) - pk.Qr[i].SetOne() - pk.Qo[i].SetUint64(42) - } + + n := int(pk.Domain[0].Cardinality) + pk.Ql = rVector(n) + pk.Qr = rVector(n) + pk.Qm = rVector(n) + pk.Qo = rVector(n) + pk.CQk = rVector(n) + pk.LQk = rVector(n) + pk.S1Canonical = rVector(n) + pk.S2Canonical = rVector(n) + pk.S3Canonical = rVector(n) + pk.EvaluationPermutationBigDomainBitReversed = rVector(n) pk.Permutation = make([]int64, 3*pk.Domain[0].Cardinality) pk.Permutation[0] = -12 @@ -93,6 +95,9 @@ func TestVerifyingKeySerialization(t *testing.T) { var vk VerifyingKey vk.Size = 42 vk.SizeInv = fr.One() + vk.Generator = fr.One() + vk.NbPublicVariables = 8000 + vk.CosetShift = fr.One() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -125,3 +130,16 @@ func TestVerifyingKeySerialization(t *testing.T) { t.Fatal("bytes written / read don't match") } } + +func rVector(n int) []fr.Element { + v := make([]fr.Element, n) + one := fr.One() + for i := 0; i < len(v); i++ { + if i == 0 { + v[i].SetRandom() + } else { + v[i].Add(&v[i-1], &one) + } + } + return v +} diff --git a/internal/backend/bls24-315/plonk/marshal.go b/internal/backend/bls24-315/plonk/marshal.go index 05f24f4f3..21bde3ca2 100644 --- a/internal/backend/bls24-315/plonk/marshal.go +++ b/internal/backend/bls24-315/plonk/marshal.go @@ -117,6 +117,7 @@ func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { ([]fr.Element)(pk.Qo), ([]fr.Element)(pk.CQk), ([]fr.Element)(pk.LQk), + ([]fr.Element)(pk.EvaluationPermutationBigDomainBitReversed), ([]fr.Element)(pk.S1Canonical), ([]fr.Element)(pk.S2Canonical), ([]fr.Element)(pk.S3Canonical), @@ -162,6 +163,7 @@ func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { (*[]fr.Element)(&pk.Qo), (*[]fr.Element)(&pk.CQk), (*[]fr.Element)(&pk.LQk), + (*[]fr.Element)(&pk.EvaluationPermutationBigDomainBitReversed), (*[]fr.Element)(&pk.S1Canonical), (*[]fr.Element)(&pk.S2Canonical), (*[]fr.Element)(&pk.S3Canonical), @@ -187,6 +189,7 @@ func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { &vk.SizeInv, &vk.Generator, vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], @@ -214,6 +217,7 @@ func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { &vk.SizeInv, &vk.Generator, &vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], diff --git a/internal/backend/bls24-315/plonk/marshal_test.go b/internal/backend/bls24-315/plonk/marshal_test.go index 99763b07e..2ebb3a8a1 100644 --- a/internal/backend/bls24-315/plonk/marshal_test.go +++ b/internal/backend/bls24-315/plonk/marshal_test.go @@ -31,7 +31,9 @@ func TestProvingKeySerialization(t *testing.T) { // create a random vk var vk VerifyingKey vk.Size = 42 - vk.SizeInv = fr.One() + vk.SizeInv.SetRandom() + vk.Generator.SetRandom() + vk.CosetShift.SetRandom() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -49,18 +51,18 @@ func TestProvingKeySerialization(t *testing.T) { pk.Vk = &vk pk.Domain[0] = *fft.NewDomain(42) pk.Domain[1] = *fft.NewDomain(4 * 42) - pk.Ql = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qr = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qm = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qo = make([]fr.Element, pk.Domain[0].Cardinality) - pk.CQk = make([]fr.Element, pk.Domain[0].Cardinality) - pk.LQk = make([]fr.Element, pk.Domain[0].Cardinality) - - for i := 0; i < 12; i++ { - pk.Ql[i].SetOne().Neg(&pk.Ql[i]) - pk.Qr[i].SetOne() - pk.Qo[i].SetUint64(42) - } + + n := int(pk.Domain[0].Cardinality) + pk.Ql = rVector(n) + pk.Qr = rVector(n) + pk.Qm = rVector(n) + pk.Qo = rVector(n) + pk.CQk = rVector(n) + pk.LQk = rVector(n) + pk.S1Canonical = rVector(n) + pk.S2Canonical = rVector(n) + pk.S3Canonical = rVector(n) + pk.EvaluationPermutationBigDomainBitReversed = rVector(n) pk.Permutation = make([]int64, 3*pk.Domain[0].Cardinality) pk.Permutation[0] = -12 @@ -93,6 +95,9 @@ func TestVerifyingKeySerialization(t *testing.T) { var vk VerifyingKey vk.Size = 42 vk.SizeInv = fr.One() + vk.Generator = fr.One() + vk.NbPublicVariables = 8000 + vk.CosetShift = fr.One() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -125,3 +130,16 @@ func TestVerifyingKeySerialization(t *testing.T) { t.Fatal("bytes written / read don't match") } } + +func rVector(n int) []fr.Element { + v := make([]fr.Element, n) + one := fr.One() + for i := 0; i < len(v); i++ { + if i == 0 { + v[i].SetRandom() + } else { + v[i].Add(&v[i-1], &one) + } + } + return v +} diff --git a/internal/backend/bls24-317/plonk/marshal.go b/internal/backend/bls24-317/plonk/marshal.go index d3c6b9567..363f24677 100644 --- a/internal/backend/bls24-317/plonk/marshal.go +++ b/internal/backend/bls24-317/plonk/marshal.go @@ -117,6 +117,7 @@ func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { ([]fr.Element)(pk.Qo), ([]fr.Element)(pk.CQk), ([]fr.Element)(pk.LQk), + ([]fr.Element)(pk.EvaluationPermutationBigDomainBitReversed), ([]fr.Element)(pk.S1Canonical), ([]fr.Element)(pk.S2Canonical), ([]fr.Element)(pk.S3Canonical), @@ -162,6 +163,7 @@ func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { (*[]fr.Element)(&pk.Qo), (*[]fr.Element)(&pk.CQk), (*[]fr.Element)(&pk.LQk), + (*[]fr.Element)(&pk.EvaluationPermutationBigDomainBitReversed), (*[]fr.Element)(&pk.S1Canonical), (*[]fr.Element)(&pk.S2Canonical), (*[]fr.Element)(&pk.S3Canonical), @@ -187,6 +189,7 @@ func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { &vk.SizeInv, &vk.Generator, vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], @@ -214,6 +217,7 @@ func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { &vk.SizeInv, &vk.Generator, &vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], diff --git a/internal/backend/bls24-317/plonk/marshal_test.go b/internal/backend/bls24-317/plonk/marshal_test.go index c77a478ad..6b6e16332 100644 --- a/internal/backend/bls24-317/plonk/marshal_test.go +++ b/internal/backend/bls24-317/plonk/marshal_test.go @@ -31,7 +31,9 @@ func TestProvingKeySerialization(t *testing.T) { // create a random vk var vk VerifyingKey vk.Size = 42 - vk.SizeInv = fr.One() + vk.SizeInv.SetRandom() + vk.Generator.SetRandom() + vk.CosetShift.SetRandom() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -49,18 +51,18 @@ func TestProvingKeySerialization(t *testing.T) { pk.Vk = &vk pk.Domain[0] = *fft.NewDomain(42) pk.Domain[1] = *fft.NewDomain(4 * 42) - pk.Ql = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qr = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qm = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qo = make([]fr.Element, pk.Domain[0].Cardinality) - pk.CQk = make([]fr.Element, pk.Domain[0].Cardinality) - pk.LQk = make([]fr.Element, pk.Domain[0].Cardinality) - - for i := 0; i < 12; i++ { - pk.Ql[i].SetOne().Neg(&pk.Ql[i]) - pk.Qr[i].SetOne() - pk.Qo[i].SetUint64(42) - } + + n := int(pk.Domain[0].Cardinality) + pk.Ql = rVector(n) + pk.Qr = rVector(n) + pk.Qm = rVector(n) + pk.Qo = rVector(n) + pk.CQk = rVector(n) + pk.LQk = rVector(n) + pk.S1Canonical = rVector(n) + pk.S2Canonical = rVector(n) + pk.S3Canonical = rVector(n) + pk.EvaluationPermutationBigDomainBitReversed = rVector(n) pk.Permutation = make([]int64, 3*pk.Domain[0].Cardinality) pk.Permutation[0] = -12 @@ -93,6 +95,9 @@ func TestVerifyingKeySerialization(t *testing.T) { var vk VerifyingKey vk.Size = 42 vk.SizeInv = fr.One() + vk.Generator = fr.One() + vk.NbPublicVariables = 8000 + vk.CosetShift = fr.One() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -125,3 +130,16 @@ func TestVerifyingKeySerialization(t *testing.T) { t.Fatal("bytes written / read don't match") } } + +func rVector(n int) []fr.Element { + v := make([]fr.Element, n) + one := fr.One() + for i := 0; i < len(v); i++ { + if i == 0 { + v[i].SetRandom() + } else { + v[i].Add(&v[i-1], &one) + } + } + return v +} diff --git a/internal/backend/bn254/plonk/marshal.go b/internal/backend/bn254/plonk/marshal.go index e4c4d7059..29ca26942 100644 --- a/internal/backend/bn254/plonk/marshal.go +++ b/internal/backend/bn254/plonk/marshal.go @@ -117,6 +117,7 @@ func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { ([]fr.Element)(pk.Qo), ([]fr.Element)(pk.CQk), ([]fr.Element)(pk.LQk), + ([]fr.Element)(pk.EvaluationPermutationBigDomainBitReversed), ([]fr.Element)(pk.S1Canonical), ([]fr.Element)(pk.S2Canonical), ([]fr.Element)(pk.S3Canonical), @@ -162,6 +163,7 @@ func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { (*[]fr.Element)(&pk.Qo), (*[]fr.Element)(&pk.CQk), (*[]fr.Element)(&pk.LQk), + (*[]fr.Element)(&pk.EvaluationPermutationBigDomainBitReversed), (*[]fr.Element)(&pk.S1Canonical), (*[]fr.Element)(&pk.S2Canonical), (*[]fr.Element)(&pk.S3Canonical), @@ -187,6 +189,7 @@ func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { &vk.SizeInv, &vk.Generator, vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], @@ -214,6 +217,7 @@ func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { &vk.SizeInv, &vk.Generator, &vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], diff --git a/internal/backend/bn254/plonk/marshal_test.go b/internal/backend/bn254/plonk/marshal_test.go index ceec7305b..a8408b8ff 100644 --- a/internal/backend/bn254/plonk/marshal_test.go +++ b/internal/backend/bn254/plonk/marshal_test.go @@ -31,7 +31,9 @@ func TestProvingKeySerialization(t *testing.T) { // create a random vk var vk VerifyingKey vk.Size = 42 - vk.SizeInv = fr.One() + vk.SizeInv.SetRandom() + vk.Generator.SetRandom() + vk.CosetShift.SetRandom() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -49,18 +51,18 @@ func TestProvingKeySerialization(t *testing.T) { pk.Vk = &vk pk.Domain[0] = *fft.NewDomain(42) pk.Domain[1] = *fft.NewDomain(4 * 42) - pk.Ql = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qr = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qm = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qo = make([]fr.Element, pk.Domain[0].Cardinality) - pk.CQk = make([]fr.Element, pk.Domain[0].Cardinality) - pk.LQk = make([]fr.Element, pk.Domain[0].Cardinality) - - for i := 0; i < 12; i++ { - pk.Ql[i].SetOne().Neg(&pk.Ql[i]) - pk.Qr[i].SetOne() - pk.Qo[i].SetUint64(42) - } + + n := int(pk.Domain[0].Cardinality) + pk.Ql = rVector(n) + pk.Qr = rVector(n) + pk.Qm = rVector(n) + pk.Qo = rVector(n) + pk.CQk = rVector(n) + pk.LQk = rVector(n) + pk.S1Canonical = rVector(n) + pk.S2Canonical = rVector(n) + pk.S3Canonical = rVector(n) + pk.EvaluationPermutationBigDomainBitReversed = rVector(n) pk.Permutation = make([]int64, 3*pk.Domain[0].Cardinality) pk.Permutation[0] = -12 @@ -93,6 +95,9 @@ func TestVerifyingKeySerialization(t *testing.T) { var vk VerifyingKey vk.Size = 42 vk.SizeInv = fr.One() + vk.Generator = fr.One() + vk.NbPublicVariables = 8000 + vk.CosetShift = fr.One() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -125,3 +130,16 @@ func TestVerifyingKeySerialization(t *testing.T) { t.Fatal("bytes written / read don't match") } } + +func rVector(n int) []fr.Element { + v := make([]fr.Element, n) + one := fr.One() + for i := 0; i < len(v); i++ { + if i == 0 { + v[i].SetRandom() + } else { + v[i].Add(&v[i-1], &one) + } + } + return v +} diff --git a/internal/backend/bw6-633/plonk/marshal.go b/internal/backend/bw6-633/plonk/marshal.go index 8f2ad728c..217e2a2ad 100644 --- a/internal/backend/bw6-633/plonk/marshal.go +++ b/internal/backend/bw6-633/plonk/marshal.go @@ -117,6 +117,7 @@ func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { ([]fr.Element)(pk.Qo), ([]fr.Element)(pk.CQk), ([]fr.Element)(pk.LQk), + ([]fr.Element)(pk.EvaluationPermutationBigDomainBitReversed), ([]fr.Element)(pk.S1Canonical), ([]fr.Element)(pk.S2Canonical), ([]fr.Element)(pk.S3Canonical), @@ -162,6 +163,7 @@ func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { (*[]fr.Element)(&pk.Qo), (*[]fr.Element)(&pk.CQk), (*[]fr.Element)(&pk.LQk), + (*[]fr.Element)(&pk.EvaluationPermutationBigDomainBitReversed), (*[]fr.Element)(&pk.S1Canonical), (*[]fr.Element)(&pk.S2Canonical), (*[]fr.Element)(&pk.S3Canonical), @@ -187,6 +189,7 @@ func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { &vk.SizeInv, &vk.Generator, vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], @@ -214,6 +217,7 @@ func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { &vk.SizeInv, &vk.Generator, &vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], diff --git a/internal/backend/bw6-633/plonk/marshal_test.go b/internal/backend/bw6-633/plonk/marshal_test.go index 7ace49aef..005db7466 100644 --- a/internal/backend/bw6-633/plonk/marshal_test.go +++ b/internal/backend/bw6-633/plonk/marshal_test.go @@ -31,7 +31,9 @@ func TestProvingKeySerialization(t *testing.T) { // create a random vk var vk VerifyingKey vk.Size = 42 - vk.SizeInv = fr.One() + vk.SizeInv.SetRandom() + vk.Generator.SetRandom() + vk.CosetShift.SetRandom() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -49,18 +51,18 @@ func TestProvingKeySerialization(t *testing.T) { pk.Vk = &vk pk.Domain[0] = *fft.NewDomain(42) pk.Domain[1] = *fft.NewDomain(4 * 42) - pk.Ql = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qr = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qm = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qo = make([]fr.Element, pk.Domain[0].Cardinality) - pk.CQk = make([]fr.Element, pk.Domain[0].Cardinality) - pk.LQk = make([]fr.Element, pk.Domain[0].Cardinality) - - for i := 0; i < 12; i++ { - pk.Ql[i].SetOne().Neg(&pk.Ql[i]) - pk.Qr[i].SetOne() - pk.Qo[i].SetUint64(42) - } + + n := int(pk.Domain[0].Cardinality) + pk.Ql = rVector(n) + pk.Qr = rVector(n) + pk.Qm = rVector(n) + pk.Qo = rVector(n) + pk.CQk = rVector(n) + pk.LQk = rVector(n) + pk.S1Canonical = rVector(n) + pk.S2Canonical = rVector(n) + pk.S3Canonical = rVector(n) + pk.EvaluationPermutationBigDomainBitReversed = rVector(n) pk.Permutation = make([]int64, 3*pk.Domain[0].Cardinality) pk.Permutation[0] = -12 @@ -93,6 +95,9 @@ func TestVerifyingKeySerialization(t *testing.T) { var vk VerifyingKey vk.Size = 42 vk.SizeInv = fr.One() + vk.Generator = fr.One() + vk.NbPublicVariables = 8000 + vk.CosetShift = fr.One() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -125,3 +130,16 @@ func TestVerifyingKeySerialization(t *testing.T) { t.Fatal("bytes written / read don't match") } } + +func rVector(n int) []fr.Element { + v := make([]fr.Element, n) + one := fr.One() + for i := 0; i < len(v); i++ { + if i == 0 { + v[i].SetRandom() + } else { + v[i].Add(&v[i-1], &one) + } + } + return v +} diff --git a/internal/backend/bw6-761/plonk/marshal.go b/internal/backend/bw6-761/plonk/marshal.go index fe81cc4e0..c9c6ddf6b 100644 --- a/internal/backend/bw6-761/plonk/marshal.go +++ b/internal/backend/bw6-761/plonk/marshal.go @@ -117,6 +117,7 @@ func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { ([]fr.Element)(pk.Qo), ([]fr.Element)(pk.CQk), ([]fr.Element)(pk.LQk), + ([]fr.Element)(pk.EvaluationPermutationBigDomainBitReversed), ([]fr.Element)(pk.S1Canonical), ([]fr.Element)(pk.S2Canonical), ([]fr.Element)(pk.S3Canonical), @@ -162,6 +163,7 @@ func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { (*[]fr.Element)(&pk.Qo), (*[]fr.Element)(&pk.CQk), (*[]fr.Element)(&pk.LQk), + (*[]fr.Element)(&pk.EvaluationPermutationBigDomainBitReversed), (*[]fr.Element)(&pk.S1Canonical), (*[]fr.Element)(&pk.S2Canonical), (*[]fr.Element)(&pk.S3Canonical), @@ -187,6 +189,7 @@ func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { &vk.SizeInv, &vk.Generator, vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], @@ -214,6 +217,7 @@ func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { &vk.SizeInv, &vk.Generator, &vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], diff --git a/internal/backend/bw6-761/plonk/marshal_test.go b/internal/backend/bw6-761/plonk/marshal_test.go index 2b47f5e50..b2e450000 100644 --- a/internal/backend/bw6-761/plonk/marshal_test.go +++ b/internal/backend/bw6-761/plonk/marshal_test.go @@ -31,7 +31,9 @@ func TestProvingKeySerialization(t *testing.T) { // create a random vk var vk VerifyingKey vk.Size = 42 - vk.SizeInv = fr.One() + vk.SizeInv.SetRandom() + vk.Generator.SetRandom() + vk.CosetShift.SetRandom() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -49,18 +51,18 @@ func TestProvingKeySerialization(t *testing.T) { pk.Vk = &vk pk.Domain[0] = *fft.NewDomain(42) pk.Domain[1] = *fft.NewDomain(4 * 42) - pk.Ql = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qr = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qm = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qo = make([]fr.Element, pk.Domain[0].Cardinality) - pk.CQk = make([]fr.Element, pk.Domain[0].Cardinality) - pk.LQk = make([]fr.Element, pk.Domain[0].Cardinality) - - for i := 0; i < 12; i++ { - pk.Ql[i].SetOne().Neg(&pk.Ql[i]) - pk.Qr[i].SetOne() - pk.Qo[i].SetUint64(42) - } + + n := int(pk.Domain[0].Cardinality) + pk.Ql = rVector(n) + pk.Qr = rVector(n) + pk.Qm = rVector(n) + pk.Qo = rVector(n) + pk.CQk = rVector(n) + pk.LQk = rVector(n) + pk.S1Canonical = rVector(n) + pk.S2Canonical = rVector(n) + pk.S3Canonical = rVector(n) + pk.EvaluationPermutationBigDomainBitReversed = rVector(n) pk.Permutation = make([]int64, 3*pk.Domain[0].Cardinality) pk.Permutation[0] = -12 @@ -93,6 +95,9 @@ func TestVerifyingKeySerialization(t *testing.T) { var vk VerifyingKey vk.Size = 42 vk.SizeInv = fr.One() + vk.Generator = fr.One() + vk.NbPublicVariables = 8000 + vk.CosetShift = fr.One() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -125,3 +130,16 @@ func TestVerifyingKeySerialization(t *testing.T) { t.Fatal("bytes written / read don't match") } } + +func rVector(n int) []fr.Element { + v := make([]fr.Element, n) + one := fr.One() + for i := 0; i < len(v); i++ { + if i == 0 { + v[i].SetRandom() + } else { + v[i].Add(&v[i-1], &one) + } + } + return v +} diff --git a/internal/generator/backend/template/zkpschemes/plonk/plonk.marshal.go.tmpl b/internal/generator/backend/template/zkpschemes/plonk/plonk.marshal.go.tmpl index 5e03ff6fb..f3144e699 100644 --- a/internal/generator/backend/template/zkpschemes/plonk/plonk.marshal.go.tmpl +++ b/internal/generator/backend/template/zkpschemes/plonk/plonk.marshal.go.tmpl @@ -98,6 +98,7 @@ func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { ([]fr.Element)(pk.Qo), ([]fr.Element)(pk.CQk), ([]fr.Element)(pk.LQk), + ([]fr.Element)(pk.EvaluationPermutationBigDomainBitReversed), ([]fr.Element)(pk.S1Canonical), ([]fr.Element)(pk.S2Canonical), ([]fr.Element)(pk.S3Canonical), @@ -143,6 +144,7 @@ func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { (*[]fr.Element)(&pk.Qo), (*[]fr.Element)(&pk.CQk), (*[]fr.Element)(&pk.LQk), + (*[]fr.Element)(&pk.EvaluationPermutationBigDomainBitReversed), (*[]fr.Element)(&pk.S1Canonical), (*[]fr.Element)(&pk.S2Canonical), (*[]fr.Element)(&pk.S3Canonical), @@ -168,6 +170,7 @@ func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { &vk.SizeInv, &vk.Generator, vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], @@ -195,6 +198,7 @@ func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { &vk.SizeInv, &vk.Generator, &vk.NbPublicVariables, + &vk.CosetShift, &vk.S[0], &vk.S[1], &vk.S[2], diff --git a/internal/generator/backend/template/zkpschemes/plonk/tests/marshal.go.tmpl b/internal/generator/backend/template/zkpschemes/plonk/tests/marshal.go.tmpl index a289d09f4..a63e5fa69 100644 --- a/internal/generator/backend/template/zkpschemes/plonk/tests/marshal.go.tmpl +++ b/internal/generator/backend/template/zkpschemes/plonk/tests/marshal.go.tmpl @@ -12,7 +12,9 @@ func TestProvingKeySerialization(t *testing.T) { // create a random vk var vk VerifyingKey vk.Size = 42 - vk.SizeInv = fr.One() + vk.SizeInv.SetRandom() + vk.Generator.SetRandom() + vk.CosetShift.SetRandom() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -30,18 +32,19 @@ func TestProvingKeySerialization(t *testing.T) { pk.Vk = &vk pk.Domain[0] = *fft.NewDomain(42) pk.Domain[1] = *fft.NewDomain(4 * 42) - pk.Ql = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qr = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qm = make([]fr.Element, pk.Domain[0].Cardinality) - pk.Qo = make([]fr.Element, pk.Domain[0].Cardinality) - pk.CQk = make([]fr.Element, pk.Domain[0].Cardinality) - pk.LQk = make([]fr.Element, pk.Domain[0].Cardinality) - - for i := 0; i < 12; i++ { - pk.Ql[i].SetOne().Neg(&pk.Ql[i]) - pk.Qr[i].SetOne() - pk.Qo[i].SetUint64(42) - } + + n := int(pk.Domain[0].Cardinality) + pk.Ql = rVector(n) + pk.Qr = rVector(n) + pk.Qm = rVector(n) + pk.Qo = rVector(n) + pk.CQk = rVector(n) + pk.LQk = rVector(n) + pk.S1Canonical = rVector(n) + pk.S2Canonical = rVector(n) + pk.S3Canonical = rVector(n) + pk.EvaluationPermutationBigDomainBitReversed = rVector(n) + pk.Permutation = make([]int64, 3*pk.Domain[0].Cardinality) pk.Permutation[0] = -12 @@ -74,6 +77,9 @@ func TestVerifyingKeySerialization(t *testing.T) { var vk VerifyingKey vk.Size = 42 vk.SizeInv = fr.One() + vk.Generator = fr.One() + vk.NbPublicVariables = 8000 + vk.CosetShift = fr.One() _, _, g1gen, _ := curve.Generators() vk.S[0] = g1gen @@ -107,3 +113,17 @@ func TestVerifyingKeySerialization(t *testing.T) { } } + + +func rVector( n int) []fr.Element { + v := make([]fr.Element, n) + one := fr.One() + for i := 0; i < len(v); i++ { + if i == 0 { + v[i].SetRandom() + } else { + v[i].Add(&v[i-1], &one) + } + } + return v +}