From 456fe4165f8499b2e6e982891d1a40b8b39cb941 Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Mon, 6 May 2024 11:45:23 +0200 Subject: [PATCH 01/45] dilithium: fix typo Closes #497 --- sign/dilithium/dilithium.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sign/dilithium/dilithium.go b/sign/dilithium/dilithium.go index b9dd1adb0..2a4b61b28 100644 --- a/sign/dilithium/dilithium.go +++ b/sign/dilithium/dilithium.go @@ -40,7 +40,7 @@ type PublicKey interface { Bytes() []byte } -// PrivateKey is a Dilithium public key. +// PrivateKey is a Dilithium private key. // // The structure contains values precomputed during unpacking/key generation // and is therefore significantly larger than a packed private key. From 5f944713f2899110da35cfeafcd878d5a64cf443 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 10 Jun 2024 00:58:20 -0700 Subject: [PATCH 02/45] Test for invalid encodings of BLS12381. --- ecc/bls12381/g1.go | 2 +- ecc/bls12381/g1_test.go | 7 +++++++ ecc/bls12381/g2.go | 2 +- ecc/bls12381/g2_test.go | 7 +++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/ecc/bls12381/g1.go b/ecc/bls12381/g1.go index 7ad211948..3ad4a66c8 100644 --- a/ecc/bls12381/g1.go +++ b/ecc/bls12381/g1.go @@ -44,7 +44,7 @@ func (g *G1) SetBytes(b []byte) error { l = G1SizeCompressed } zeros := make([]byte, l-1) - if (b[0]&0x1F) != 0 || subtle.ConstantTimeCompare(b[1:], zeros) != 1 { + if (b[0]&0x1F) != 0 || subtle.ConstantTimeCompare(b[1:l], zeros) != 1 { return errEncoding } g.SetIdentity() diff --git a/ecc/bls12381/g1_test.go b/ecc/bls12381/g1_test.go index cb601176e..a58b3d8a3 100644 --- a/ecc/bls12381/g1_test.go +++ b/ecc/bls12381/g1_test.go @@ -143,6 +143,13 @@ func TestG1Serial(t *testing.T) { want = *randomG1(t) } }) + t.Run("badPrefix", func(t *testing.T) { + q := new(G1) + b := make([]byte, G1Size) + for _, b[0] = range []byte{0x20, 0x60, 0xE0} { + test.CheckIsErr(t, q.SetBytes(b), mustErr) + } + }) t.Run("badLength", func(t *testing.T) { q := new(G1) p := randomG1(t) diff --git a/ecc/bls12381/g2.go b/ecc/bls12381/g2.go index 0d1a83a56..22ef5deb2 100644 --- a/ecc/bls12381/g2.go +++ b/ecc/bls12381/g2.go @@ -42,7 +42,7 @@ func (g *G2) SetBytes(b []byte) error { l = G2SizeCompressed } zeros := make([]byte, l-1) - if (b[0]&0x1F) != 0 || subtle.ConstantTimeCompare(b[1:], zeros) != 1 { + if (b[0]&0x1F) != 0 || subtle.ConstantTimeCompare(b[1:l], zeros) != 1 { return errEncoding } g.SetIdentity() diff --git a/ecc/bls12381/g2_test.go b/ecc/bls12381/g2_test.go index 1b5fb5952..77ed93986 100644 --- a/ecc/bls12381/g2_test.go +++ b/ecc/bls12381/g2_test.go @@ -102,6 +102,13 @@ func TestG2Serial(t *testing.T) { want = *randomG2(t) } }) + t.Run("badPrefix", func(t *testing.T) { + q := new(G2) + b := make([]byte, G2Size) + for _, b[0] = range []byte{0x20, 0x60, 0xE0} { + test.CheckIsErr(t, q.SetBytes(b), mustErr) + } + }) t.Run("badLength", func(t *testing.T) { q := new(G2) p := randomG2(t) From 9e7c49b71cae19b65a7a1f1f610dca8749ee6948 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 10 Jun 2024 01:00:58 -0700 Subject: [PATCH 03/45] Detects invalid encodings of bls12381 elements. --- ecc/bls12381/doc.go | 56 ++++++++++++++++++++++++++++++--------------- ecc/bls12381/g1.go | 6 +++++ ecc/bls12381/g2.go | 6 +++++ 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/ecc/bls12381/doc.go b/ecc/bls12381/doc.go index d7e07e54b..bf4df68db 100644 --- a/ecc/bls12381/doc.go +++ b/ecc/bls12381/doc.go @@ -32,23 +32,41 @@ // is the lexicographically largest of the two associated with the encoded // x-coordinate. // -// |----------------------------------------------------| -// | Serialization Format | -// |-----|-------|-------|---------------|--------------| -// | MSB | MSB-1 | MSB-2 | Description | Encoding | -// |-----|-------|-------|---------------|--------------| -// | 0 | X | X | Uncompressed | e || x || y | -// | 1 | X | X | Compressed | e || x | -// |-----|-------|-------|---------------|--------------| -// | X | 0 | X | Non-Infinity | e || x || y | -// | X | 1 | X | Infinity | e || 0 || 0 | -// |-----|-------|-------|---------------|--------------| -// | | | | Compressed, | | -// | 1 | 0 | 1 | Non-Infinity, | e || x | -// | | | | Big y-coord | | -// |-----|-------|-------|---------------|--------------| -// | | | | Compressed, | | -// | 1 | 0 | 0 | Non-Infinity, | e || x | -// | | | | Small y-coord | | -// |----------------------------------------------------| +// |------------------------------------------------------| +// | Serialization Format | +// |-----|-------|-------|-----------------|--------------| +// | MSB | MSB-1 | MSB-2 | Description | Encoding | +// |-----|-------|-------|-----------------|--------------| +// | | | | Non-compressed, | | +// | 0 | 0 | 0 | Non-Infinity, | e || x || y | +// | | | | Zero. | | +// |-----|-------|-------|-----------------|--------------| +// | | | | Non-compressed, | | +// | 0 | 0 | 1 | Non-Infinity, | Invalid | +// | | | | One. | | +// |-----|-------|-------|-----------------|--------------| +// | | | | Non-compressed, | | +// | 0 | 1 | 0 | Infinity, | e || 0 || 0 | +// | | | | Zero. | | +// |-----|-------|-------|-----------------|--------------| +// | | | | Non-compressed, | | +// | 0 | 1 | 1 | Infinity, | Invalid | +// | | | | One. | | +// |-----|-------|-------|-----------------|--------------| +// | | | | Compressed, | | +// | 1 | 0 | 0 | Non-Infinity, | e || x | +// | | | | Small y-coord | | +// |-----|-------|-------|-----------------|--------------| +// | | | | Compressed, | | +// | 1 | 0 | 1 | Non-Infinity, | e || x | +// | | | | Big y-coord | | +// |-----|-------|-------|-----------------|--------------| +// | | | | Compressed, | | +// | 1 | 1 | 0 | Infinity, | e || 0 | +// | | | | Zero. | | +// |-----|-------|-------|-----------------|--------------| +// | | | | Compressed, | | +// | 1 | 1 | 1 | Infinity, | Invalid | +// | | | | One. | | +// |------------------------------------------------------| package bls12381 diff --git a/ecc/bls12381/g1.go b/ecc/bls12381/g1.go index 3ad4a66c8..08e2ef96e 100644 --- a/ecc/bls12381/g1.go +++ b/ecc/bls12381/g1.go @@ -34,6 +34,12 @@ func (g *G1) SetBytes(b []byte) error { return errInputLength } + // Check for invalid prefixes + switch b[0] & 0xE0 { + case 0x20, 0x60, 0xE0: + return errEncoding + } + isCompressed := int((b[0] >> 7) & 0x1) isInfinity := int((b[0] >> 6) & 0x1) isBigYCoord := int((b[0] >> 5) & 0x1) diff --git a/ecc/bls12381/g2.go b/ecc/bls12381/g2.go index 22ef5deb2..740148938 100644 --- a/ecc/bls12381/g2.go +++ b/ecc/bls12381/g2.go @@ -32,6 +32,12 @@ func (g *G2) SetBytes(b []byte) error { return errInputLength } + // Check for invalid prefixes + switch b[0] & 0xE0 { + case 0x20, 0x60, 0xE0: + return errEncoding + } + isCompressed := int((b[0] >> 7) & 0x1) isInfinity := int((b[0] >> 6) & 0x1) isBigYCoord := int((b[0] >> 5) & 0x1) From 75b28edc25ec569e6353a2b944b0b83d48a9c2e8 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 10 Jun 2024 13:05:06 -0700 Subject: [PATCH 04/45] Preparing CIRCL release v1.3.9 --- CITATION.cff | 4 ++-- README.md | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 53c96566b..46c4f77f8 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,6 +1,6 @@ --- cff-version: 1.2.0 -version: 1.3.7 +version: 1.3.9 title: "Introducing CIRCL: An Advanced Cryptographic Library" license: BSD-3-Clause abstract: > @@ -25,6 +25,6 @@ keywords: - golang repository-code: "https://github.com/cloudflare/circl/" type: software -message: "Available at https://github.com/cloudflare/circl. v1.3.7 Accessed Dec, 2023." +message: "Available at https://github.com/cloudflare/circl. v1.3.9 Accessed Jun, 2024." contact: - name: "Cloudflare, Inc." diff --git a/README.md b/README.md index 12ae6dbe8..68a8d34a3 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Alternatively, look at the [Cloudflare Go](https://github.com/cloudflare/go/tree |:---:| - [Ed25519](./sign/ed25519) and [Ed448](./sign/ed448) signatures. ([RFC-8032]) +- [BLS](./sign/bls) signatures. ([draft-irtf-cfrg-bls-signature](https://datatracker.ietf.org/doc/draft-irtf-cfrg-bls-signature/)) | Prime Groups | |:---:| @@ -94,7 +95,7 @@ Alternatively, look at the [Cloudflare Go](https://github.com/cloudflare/go/tree - [Schnorr](./zk/dl): Prove knowledge of the Discrete Logarithm. ([RFC-8235]) - [DLEQ](./zk/dleq): Prove knowledge of the Discrete Logarithm Equality. ([RFC-9497]) - - [DLEQ in Qn](./zk/qndleq): Prove knowledge of the Discrete Logarithm Equality for subgroup of squares in (Z/nZ)*. + - [DLEQ in Qn](./zk/qndleq): Prove knowledge of the Discrete Logarithm Equality for subgroup of squares in (Z/nZ)\*. ### Symmetric Cryptography @@ -159,7 +160,7 @@ APA Style ``` Faz-Hernández, A. and Kwiatkowski, K. (2019). Introducing CIRCL: An Advanced Cryptographic Library. Cloudflare. Available at -https://github.com/cloudflare/circl. v1.3.7 Accessed Dec, 2023. +https://github.com/cloudflare/circl. v1.3.9 Accessed Jun, 2024. ``` Bibtex Source @@ -174,7 +175,7 @@ Bibtex Source of this library is to be used as a tool for experimental deployment of cryptographic algorithms targeting Post-Quantum (PQ) and Elliptic Curve Cryptography (ECC).}}, - note = {Available at \url{https://github.com/cloudflare/circl}. v1.3.7 Accessed Dec, 2023}, + note = {Available at \url{https://github.com/cloudflare/circl}. v1.3.9 Accessed Jun, 2024}, month = jun, year = {2019} } From d26845f0a83cf075c866a9d0e13c2a2d5a8e60dc Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Fri, 5 Jul 2024 12:20:41 +0200 Subject: [PATCH 05/45] eddilithium3: fix typos Closes #502 --- sign/eddilithium3/eddilithium.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sign/eddilithium3/eddilithium.go b/sign/eddilithium3/eddilithium.go index d1c8d629d..aa05c689c 100644 --- a/sign/eddilithium3/eddilithium.go +++ b/sign/eddilithium3/eddilithium.go @@ -162,7 +162,7 @@ func (sk *PrivateKey) MarshalBinary() ([]byte, error) { // UnmarshalBinary the public key from data. func (pk *PublicKey) UnmarshalBinary(data []byte) error { if len(data) != PublicKeySize { - return errors.New("packed public key must be of eddilithium4.PublicKeySize bytes") + return errors.New("packed public key must be of eddilithium3.PublicKeySize bytes") } var buf [PublicKeySize]byte copy(buf[:], data) @@ -173,7 +173,7 @@ func (pk *PublicKey) UnmarshalBinary(data []byte) error { // UnmarshalBinary unpacks the private key from data. func (sk *PrivateKey) UnmarshalBinary(data []byte) error { if len(data) != PrivateKeySize { - return errors.New("packed private key must be of eddilithium4.PrivateKeySize bytes") + return errors.New("packed private key must be of eddilithium3.PrivateKeySize bytes") } var buf [PrivateKeySize]byte copy(buf[:], data) @@ -215,7 +215,7 @@ func (sk *PrivateKey) Sign( var sig [SignatureSize]byte if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("eddilithium4: cannot sign hashed message") + return nil, errors.New("eddilithium3: cannot sign hashed message") } SignTo(sk, msg, sig[:]) From 2b4626dfe9750a28f5b456f0a6634fe95689364e Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Thu, 4 Jan 2024 18:45:11 +0100 Subject: [PATCH 06/45] Add ML-KEM (FIPS 203). We keep Kyber around (for now) as it's currently widely deployed. Code differences between them are minimal anyway. Tests against NIST's ACVP test vectors. --- README.md | 1 + kem/kyber/gen.go | 36 +- kem/kyber/kat_test.go | 29 +- kem/kyber/kyber1024/kyber.go | 9 +- kem/kyber/kyber512/kyber.go | 9 +- kem/kyber/kyber768/kyber.go | 9 +- kem/kyber/templates/pkg.templ.go | 76 +++- kem/mlkem/acvp_test.go | 270 ++++++++++++ kem/mlkem/doc.go | 7 + kem/mlkem/mlkem1024/kyber.go | 394 ++++++++++++++++++ kem/mlkem/mlkem512/kyber.go | 394 ++++++++++++++++++ kem/mlkem/mlkem768/kyber.go | 394 ++++++++++++++++++ .../expectedResults.json.gz | Bin 0 -> 103486 bytes .../ML-KEM-encapDecap-FIPS203/prompt.json.gz | Bin 0 -> 153136 bytes .../expectedResults.json.gz | Bin 0 -> 211052 bytes .../ML-KEM-keyGen-FIPS203/prompt.json.gz | Bin 0 -> 6505 bytes kem/mlkem/testdata/README.md | 4 + kem/schemes/schemes.go | 6 + kem/schemes/schemes_test.go | 3 + pke/kyber/kyber1024/internal/cpapke.go | 16 + pke/kyber/kyber1024/kyber.go | 32 +- pke/kyber/kyber512/internal/cpapke.go | 16 + pke/kyber/kyber512/kyber.go | 32 +- pke/kyber/kyber768/internal/cpapke.go | 16 + pke/kyber/kyber768/kyber.go | 32 +- pke/kyber/templates/pkg.templ.go | 32 +- 26 files changed, 1783 insertions(+), 34 deletions(-) create mode 100644 kem/mlkem/acvp_test.go create mode 100644 kem/mlkem/doc.go create mode 100644 kem/mlkem/mlkem1024/kyber.go create mode 100644 kem/mlkem/mlkem512/kyber.go create mode 100644 kem/mlkem/mlkem768/kyber.go create mode 100644 kem/mlkem/testdata/ML-KEM-encapDecap-FIPS203/expectedResults.json.gz create mode 100644 kem/mlkem/testdata/ML-KEM-encapDecap-FIPS203/prompt.json.gz create mode 100644 kem/mlkem/testdata/ML-KEM-keyGen-FIPS203/expectedResults.json.gz create mode 100644 kem/mlkem/testdata/ML-KEM-keyGen-FIPS203/prompt.json.gz create mode 100644 kem/mlkem/testdata/README.md diff --git a/README.md b/README.md index 68a8d34a3..30e7650a7 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ Alternatively, look at the [Cloudflare Go](https://github.com/cloudflare/go/tree |:---:| - [CSIDH](./dh/csidh): Post-Quantum Commutative Group Action ([CSIDH](https://csidh.isogeny.org/)). + - [ML-KEM](./kem/mlkem): modes 512, 768, 1024 ([ML-KEM](https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.203.pdf)). - [Kyber KEM](./kem/kyber): modes 512, 768, 1024 ([KYBER](https://pq-crystals.org/kyber/)). - [FrodoKEM](./kem/frodo): modes 640-SHAKE. ([FrodoKEM](https://frodokem.org/)) - (**insecure, deprecated**) ~~[SIDH/SIKE](./kem/sike)~~: Supersingular Key Encapsulation with primes p434, p503, p751 ([SIKE](https://sike.org/)). diff --git a/kem/kyber/gen.go b/kem/kyber/gen.go index 1abca8e5e..c0c815b61 100644 --- a/kem/kyber/gen.go +++ b/kem/kyber/gen.go @@ -7,8 +7,10 @@ package main import ( "bytes" + "fmt" "go/format" "io/ioutil" + "path" "strings" "text/template" ) @@ -17,8 +19,33 @@ type Instance struct { Name string } +func (m Instance) KemName() string { + if m.NIST() { + return m.Name + } + return m.Name + ".CCAKEM" +} + +func (m Instance) NIST() bool { + return strings.HasPrefix(m.Name, "ML-KEM") +} + +func (m Instance) PkePkg() string { + if !m.NIST() { + return m.Pkg() + } + return strings.ReplaceAll(m.Pkg(), "mlkem", "kyber") +} + func (m Instance) Pkg() string { - return strings.ToLower(m.Name) + return strings.ToLower(strings.ReplaceAll(m.Name, "-", "")) +} + +func (m Instance) PkgPath() string { + if m.NIST() { + return path.Join("..", "mlkem", m.Pkg()) + } + return m.Pkg() } var ( @@ -26,6 +53,9 @@ var ( {Name: "Kyber512"}, {Name: "Kyber768"}, {Name: "Kyber1024"}, + {Name: "ML-KEM-512"}, + {Name: "ML-KEM-768"}, + {Name: "ML-KEM-1024"}, } TemplateWarning = "// Code generated from" ) @@ -51,7 +81,7 @@ func generatePackageFiles() { // Formating output code code, err := format.Source(buf.Bytes()) if err != nil { - panic("error formating code") + panic(fmt.Sprintf("error formating code: %v", err)) } res := string(code) @@ -59,7 +89,7 @@ func generatePackageFiles() { if offset == -1 { panic("Missing template warning in pkg.templ.go") } - err = ioutil.WriteFile(mode.Pkg()+"/kyber.go", []byte(res[offset:]), 0o644) + err = ioutil.WriteFile(mode.PkgPath()+"/kyber.go", []byte(res[offset:]), 0o644) if err != nil { panic(err) } diff --git a/kem/kyber/kat_test.go b/kem/kyber/kat_test.go index 73eee008d..5b6d39e86 100644 --- a/kem/kyber/kat_test.go +++ b/kem/kyber/kat_test.go @@ -7,6 +7,7 @@ import ( "bytes" "crypto/sha256" "fmt" + "strings" "testing" "github.com/cloudflare/circl/internal/nist" @@ -22,6 +23,12 @@ func TestPQCgenKATKem(t *testing.T) { {"Kyber1024", "89248f2f33f7f4f7051729111f3049c409a933ec904aedadf035f30fa5646cd5"}, {"Kyber768", "a1e122cad3c24bc51622e4c242d8b8acbcd3f618fee4220400605ca8f9ea02c2"}, {"Kyber512", "e9c2bd37133fcb40772f81559f14b1f58dccd1c816701be9ba6214d43baf4547"}, + + // TODO crossreference with standard branch of reference implementation + // once they've added the final change: domain separation in K-PKE.KeyGen(). + {"ML-KEM-512", "a30184edee53b3b009356e1e31d7f9e93ce82550e3c622d7192e387b0cc84f2e"}, + {"ML-KEM-768", "729367b590637f4a93c68d5e4a4d2e2b4454842a52c9eec503e3a0d24cb66471"}, + {"ML-KEM-1024", "3fba7327d0320cb6134badf2a1bcb963a5b3c0026c7dece8f00d6a6155e47b33"}, } for _, kat := range kats { kat := kat @@ -45,18 +52,26 @@ func testPQCgenKATKem(t *testing.T, name, expected string) { } f := sha256.New() g := nist.NewDRBG(&seed) - fmt.Fprintf(f, "# %s\n\n", name) + + // The "standard" branch reference implementation still uses Kyber + // as name instead of ML-KEM. + fmt.Fprintf(f, "# %s\n\n", strings.ReplaceAll(name, "ML-KEM-", "Kyber")) for i := 0; i < 100; i++ { g.Fill(seed[:]) fmt.Fprintf(f, "count = %d\n", i) fmt.Fprintf(f, "seed = %X\n", seed) g2 := nist.NewDRBG(&seed) - // This is not equivalent to g2.Fill(kseed[:]). As the reference - // implementation calls randombytes twice generating the keypair, - // we have to do that as well. - g2.Fill(kseed[:32]) - g2.Fill(kseed[32:]) + if strings.HasPrefix(name, "ML-KEM") { + // https://github.com/pq-crystals/kyber/commit/830e0ba1a7fdba6cde03f8139b0d41ad2102b860 + g2.Fill(kseed[:]) + } else { + // This is not equivalent to g2.Fill(kseed[:]). As the reference + // implementation calls randombytes twice generating the keypair, + // we have to do that as well. + g2.Fill(kseed[:32]) + g2.Fill(kseed[32:]) + } g2.Fill(eseed) pk, sk := scheme.DeriveKeyPair(kseed) @@ -73,6 +88,6 @@ func testPQCgenKATKem(t *testing.T, name, expected string) { fmt.Fprintf(f, "ss = %X\n\n", ss) } if fmt.Sprintf("%x", f.Sum(nil)) != expected { - t.Fatal() + t.Fatalf("%s %x %s", name, f.Sum(nil), expected) } } diff --git a/kem/kyber/kyber1024/kyber.go b/kem/kyber/kyber1024/kyber.go index 428584528..c2f767cbe 100644 --- a/kem/kyber/kyber1024/kyber.go +++ b/kem/kyber/kyber1024/kyber.go @@ -123,10 +123,10 @@ func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { panic("ss must be of length SharedKeySize") } - // m = H(seed) var m [32]byte + // m = H(seed), the hash of shame h := sha3.New256() - h.Write(seed[:]) + h.Write(seed) h.Read(m[:]) // (K', r) = G(m ‖ H(pk)) @@ -194,7 +194,7 @@ func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { // K = KDF(K''/z, H(c)) kdf := sha3.NewShake256() kdf.Write(kr2[:]) - kdf.Read(ss[:SharedKeySize]) + kdf.Read(ss) } // Packs sk to buf. @@ -258,6 +258,7 @@ func (pk *PublicKey) Unpack(buf []byte) { h := sha3.New256() h.Write(buf) h.Read(pk.hpk[:]) + } // Boilerplate down below for the KEM scheme API. @@ -386,10 +387,10 @@ func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { } func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { + var ret PublicKey if len(buf) != PublicKeySize { return nil, kem.ErrPubKeySize } - var ret PublicKey ret.Unpack(buf) return &ret, nil } diff --git a/kem/kyber/kyber512/kyber.go b/kem/kyber/kyber512/kyber.go index c250d78c6..e60ca0fe5 100644 --- a/kem/kyber/kyber512/kyber.go +++ b/kem/kyber/kyber512/kyber.go @@ -123,10 +123,10 @@ func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { panic("ss must be of length SharedKeySize") } - // m = H(seed) var m [32]byte + // m = H(seed), the hash of shame h := sha3.New256() - h.Write(seed[:]) + h.Write(seed) h.Read(m[:]) // (K', r) = G(m ‖ H(pk)) @@ -194,7 +194,7 @@ func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { // K = KDF(K''/z, H(c)) kdf := sha3.NewShake256() kdf.Write(kr2[:]) - kdf.Read(ss[:SharedKeySize]) + kdf.Read(ss) } // Packs sk to buf. @@ -258,6 +258,7 @@ func (pk *PublicKey) Unpack(buf []byte) { h := sha3.New256() h.Write(buf) h.Read(pk.hpk[:]) + } // Boilerplate down below for the KEM scheme API. @@ -386,10 +387,10 @@ func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { } func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { + var ret PublicKey if len(buf) != PublicKeySize { return nil, kem.ErrPubKeySize } - var ret PublicKey ret.Unpack(buf) return &ret, nil } diff --git a/kem/kyber/kyber768/kyber.go b/kem/kyber/kyber768/kyber.go index 832d9b371..0e03c40dd 100644 --- a/kem/kyber/kyber768/kyber.go +++ b/kem/kyber/kyber768/kyber.go @@ -123,10 +123,10 @@ func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { panic("ss must be of length SharedKeySize") } - // m = H(seed) var m [32]byte + // m = H(seed), the hash of shame h := sha3.New256() - h.Write(seed[:]) + h.Write(seed) h.Read(m[:]) // (K', r) = G(m ‖ H(pk)) @@ -194,7 +194,7 @@ func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { // K = KDF(K''/z, H(c)) kdf := sha3.NewShake256() kdf.Write(kr2[:]) - kdf.Read(ss[:SharedKeySize]) + kdf.Read(ss) } // Packs sk to buf. @@ -258,6 +258,7 @@ func (pk *PublicKey) Unpack(buf []byte) { h := sha3.New256() h.Write(buf) h.Read(pk.hpk[:]) + } // Boilerplate down below for the KEM scheme API. @@ -386,10 +387,10 @@ func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { } func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { + var ret PublicKey if len(buf) != PublicKeySize { return nil, kem.ErrPubKeySize } - var ret PublicKey ret.Unpack(buf) return &ret, nil } diff --git a/kem/kyber/templates/pkg.templ.go b/kem/kyber/templates/pkg.templ.go index 22eb1fd74..44a311405 100644 --- a/kem/kyber/templates/pkg.templ.go +++ b/kem/kyber/templates/pkg.templ.go @@ -5,10 +5,14 @@ // Code generated from pkg.templ.go. DO NOT EDIT. // Package {{.Pkg}} implements the IND-CCA2 secure key encapsulation mechanism -// {{.Name}}.CCAKEM as submitted to round 3 of the NIST PQC competition and +{{ if .NIST -}} +// {{.KemName}} as defined in FIPS203. +{{- else -}} +// {{.KemName}} as submitted to round 3 of the NIST PQC competition and // described in // // https://pq-crystals.org/kyber/data/kyber-specification-round3.pdf +{{- end }} package {{.Pkg}} import ( @@ -18,7 +22,7 @@ import ( "github.com/cloudflare/circl/internal/sha3" "github.com/cloudflare/circl/kem" - cpapke "github.com/cloudflare/circl/pke/kyber/{{.Pkg}}" + cpapke "github.com/cloudflare/circl/pke/kyber/{{.PkePkg}}" cryptoRand "crypto/rand" ) @@ -42,14 +46,14 @@ const ( PrivateKeySize = cpapke.PrivateKeySize + cpapke.PublicKeySize + 64 ) -// Type of a {{.Name}}.CCAKEM public key +// Type of a {{.KemName}} public key type PublicKey struct { pk *cpapke.PublicKey hpk [32]byte // H(pk) } -// Type of a {{.Name}}.CCAKEM private key +// Type of a {{.KemName}} private key type PrivateKey struct { sk *cpapke.PrivateKey pk *cpapke.PublicKey @@ -69,7 +73,11 @@ func NewKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { panic("seed must be of length KeySeedSize") } + {{ if .NIST -}} + pk.pk, sk.sk = cpapke.NewKeyFromSeedMLKEM(seed[:cpapke.KeySeedSize]) + {{- else -}} pk.pk, sk.sk = cpapke.NewKeyFromSeed(seed[:cpapke.KeySeedSize]) + {{- end }} sk.pk = pk.pk copy(sk.z[:], seed[cpapke.KeySeedSize:]) @@ -127,11 +135,15 @@ func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { panic("ss must be of length SharedKeySize") } - // m = H(seed) var m [32]byte + {{ if .NIST -}} + copy(m[:], seed) + {{- else -}} + // m = H(seed), the hash of shame h := sha3.New256() - h.Write(seed[:]) + h.Write(seed) h.Read(m[:]) + {{- end }} // (K', r) = G(m ‖ H(pk)) var kr [64]byte @@ -143,6 +155,9 @@ func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { // c = Kyber.CPAPKE.Enc(pk, m, r) pk.pk.EncryptTo(ct, m[:], kr[32:]) + {{ if .NIST -}} + copy(ss, kr[:SharedKeySize]) + {{- else -}} // Compute H(c) and put in second slot of kr, which will be (K', H(c)). h.Reset() h.Write(ct[:CiphertextSize]) @@ -152,6 +167,7 @@ func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { kdf := sha3.NewShake256() kdf.Write(kr[:]) kdf.Read(ss[:SharedKeySize]) + {{- end }} } // DecapsulateTo computes the shared key which is encapsulated in ct @@ -183,6 +199,24 @@ func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { var ct2 [CiphertextSize]byte sk.pk.EncryptTo(ct2[:], m2[:], kr2[32:]) + {{ if .NIST -}} + var ss2 [SharedKeySize]byte + + // Compute shared secret in case of rejection: ss₂ = PRF(z ‖ c) + prf := sha3.NewShake256() + prf.Write(sk.z[:]) + prf.Write(ct[:CiphertextSize]) + prf.Read(ss2[:]) + + // Set ss2 to the real shared secret if c = c'. + subtle.ConstantTimeCopy( + subtle.ConstantTimeCompare(ct, ct2[:]), + ss2[:], + kr2[:SharedKeySize], + ) + + copy(ss, ss2[:]) + {{- else -}} // Compute H(c) and put in second slot of kr2, which will be (K'', H(c)). h := sha3.New256() h.Write(ct[:CiphertextSize]) @@ -198,7 +232,8 @@ func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { // K = KDF(K''/z, H(c)) kdf := sha3.NewShake256() kdf.Write(kr2[:]) - kdf.Read(ss[:SharedKeySize]) + kdf.Read(ss) + {{- end }} } // Packs sk to buf. @@ -249,19 +284,38 @@ func (pk *PublicKey) Pack(buf []byte) { // Unpacks pk from buf. // +{{ if .NIST -}} +// Returns an error if buf is not of size PublicKeySize, or the public key +// is not normalized. +func (pk *PublicKey) Unpack(buf []byte) error { + if len(buf) != PublicKeySize { + return kem.ErrPubKeySize + } +{{- else -}} // Panics if buf is not of size PublicKeySize. func (pk *PublicKey) Unpack(buf []byte) { if len(buf) != PublicKeySize { panic("buf must be of length PublicKeySize") } +{{- end }} pk.pk = new(cpapke.PublicKey) + {{ if .NIST -}} + if err := pk.pk.UnpackMLKEM(buf); err != nil { + return err + } + {{- else -}} pk.pk.Unpack(buf) + {{- end }} // Compute cached H(pk) h := sha3.New256() h.Write(buf) h.Read(pk.hpk[:]) + + {{ if .NIST -}} + return nil + {{- end }} } // Boilerplate down below for the KEM scheme API. @@ -390,11 +444,17 @@ func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { } func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { + var ret PublicKey + {{ if .NIST -}} + if err := ret.Unpack(buf); err != nil { + return nil, err + } + {{- else -}} if len(buf) != PublicKeySize { return nil, kem.ErrPubKeySize } - var ret PublicKey ret.Unpack(buf) + {{- end }} return &ret, nil } diff --git a/kem/mlkem/acvp_test.go b/kem/mlkem/acvp_test.go new file mode 100644 index 000000000..0b3e51ac3 --- /dev/null +++ b/kem/mlkem/acvp_test.go @@ -0,0 +1,270 @@ +package mlkem + +import ( + "bytes" + "compress/gzip" + "encoding/hex" + "encoding/json" + "io" + "os" + "testing" + + "github.com/cloudflare/circl/kem/schemes" +) + +// []byte but is encoded in hex for JSON +type HexBytes []byte + +func (b HexBytes) MarshalJSON() ([]byte, error) { + return json.Marshal(hex.EncodeToString(b)) +} + +func (b *HexBytes) UnmarshalJSON(data []byte) (err error) { + var s string + if err = json.Unmarshal(data, &s); err != nil { + return err + } + *b, err = hex.DecodeString(s) + return err +} + +func gunzip(in []byte) ([]byte, error) { + buf := bytes.NewBuffer(in) + r, err := gzip.NewReader(buf) + if err != nil { + return nil, err + } + return io.ReadAll(r) +} + +func readGzip(path string) ([]byte, error) { + buf, err := os.ReadFile(path) + if err != nil { + return nil, err + } + return gunzip(buf) +} + +func TestACVP(t *testing.T) { + for _, sub := range []string{ + "keyGen", + "encapDecap", + } { + t.Run(sub, func(t *testing.T) { + testACVP(t, sub) + }) + } +} + +// nolint:funlen,gocyclo +func testACVP(t *testing.T, sub string) { + buf, err := readGzip("testdata/ML-KEM-" + sub + "-FIPS203/prompt.json.gz") + if err != nil { + t.Fatal(err) + } + + var prompt struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err = json.Unmarshal(buf, &prompt); err != nil { + t.Fatal(err) + } + + buf, err = readGzip("testdata/ML-KEM-" + sub + "-FIPS203/expectedResults.json.gz") + if err != nil { + t.Fatal(err) + } + + var results struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err := json.Unmarshal(buf, &results); err != nil { + t.Fatal(err) + } + + rawResults := make(map[int]json.RawMessage) + + for _, rawGroup := range results.TestGroups { + var abstractGroup struct { + Tests []json.RawMessage `json:"tests"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + for _, rawTest := range abstractGroup.Tests { + var abstractTest struct { + TcID int `json:"tcId"` + } + if err := json.Unmarshal(rawTest, &abstractTest); err != nil { + t.Fatal(err) + } + if _, exists := rawResults[abstractTest.TcID]; exists { + t.Fatalf("Duplicate test id: %d", abstractTest.TcID) + } + rawResults[abstractTest.TcID] = rawTest + } + } + + for _, rawGroup := range prompt.TestGroups { + var abstractGroup struct { + TestType string `json:"testType"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + switch { + case abstractGroup.TestType == "AFT" && sub == "keyGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Tests []struct { + TcID int `json:"tcId"` + Z HexBytes `json:"z"` + D HexBytes `json:"d"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + scheme := schemes.ByName(group.ParameterSet) + if scheme == nil { + t.Fatalf("No such scheme: %s", group.ParameterSet) + } + + for _, test := range group.Tests { + var result struct { + Ek HexBytes `json:"ek"` + Dk HexBytes `json:"dk"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + var seed [64]byte + copy(seed[:], test.D) + copy(seed[32:], test.Z) + + ek, dk := scheme.DeriveKeyPair(seed[:]) + + ek2, err := scheme.UnmarshalBinaryPublicKey(result.Ek) + if err != nil { + t.Fatalf("tc=%d: %v", test.TcID, err) + } + dk2, err := scheme.UnmarshalBinaryPrivateKey(result.Dk) + if err != nil { + t.Fatal(err) + } + + if !dk.Equal(dk2) { + t.Fatal("dk does not match") + } + if !ek.Equal(ek2) { + t.Fatal("ek does not match") + } + } + case abstractGroup.TestType == "AFT" && sub == "encapDecap": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Tests []struct { + TcID int `json:"tcId"` + Ek HexBytes `json:"ek"` + M HexBytes `json:"m"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + scheme := schemes.ByName(group.ParameterSet) + if scheme == nil { + t.Fatalf("No such scheme: %s", group.ParameterSet) + } + + for _, test := range group.Tests { + var result struct { + C HexBytes `json:"c"` + K HexBytes `json:"k"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + ek, err := scheme.UnmarshalBinaryPublicKey(test.Ek) + if err != nil { + t.Fatal(err) + } + + ct, ss, err := scheme.EncapsulateDeterministically(ek, test.M) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(ct, result.C) { + t.Fatalf("ciphertext doesn't match: %x ≠ %x", ct, result.C) + } + if !bytes.Equal(ss, result.K) { + t.Fatalf("shared secret doesn't match: %x ≠ %x", ss, result.K) + } + } + case abstractGroup.TestType == "VAL" && sub == "encapDecap": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Dk HexBytes `json:"dk"` + Tests []struct { + TcID int `json:"tcId"` + C HexBytes `json:"c"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + scheme := schemes.ByName(group.ParameterSet) + if scheme == nil { + t.Fatalf("No such scheme: %s", group.ParameterSet) + } + + dk, err := scheme.UnmarshalBinaryPrivateKey(group.Dk) + if err != nil { + t.Fatal(err) + } + + for _, test := range group.Tests { + var result struct { + K HexBytes `json:"k"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing rawResult: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + ss, err := scheme.Decapsulate(dk, test.C) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(ss, result.K) { + t.Fatalf("shared secret doesn't match: %x ≠ %x", ss, result.K) + } + } + default: + t.Fatalf("unknown type %s for %s", abstractGroup.TestType, sub) + } + } +} diff --git a/kem/mlkem/doc.go b/kem/mlkem/doc.go new file mode 100644 index 000000000..563e52f96 --- /dev/null +++ b/kem/mlkem/doc.go @@ -0,0 +1,7 @@ +// Package mlkem implements IND-CCA2 secure ML-KEM key encapsulation +// mechanism (KEM) as defined in FIPS 203. +// +// https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.203.pdf +package mlkem + +// See ../kyber/gen.go and ../kyber/kat_test.go. diff --git a/kem/mlkem/mlkem1024/kyber.go b/kem/mlkem/mlkem1024/kyber.go new file mode 100644 index 000000000..a1e73b892 --- /dev/null +++ b/kem/mlkem/mlkem1024/kyber.go @@ -0,0 +1,394 @@ +// Code generated from pkg.templ.go. DO NOT EDIT. + +// Package mlkem1024 implements the IND-CCA2 secure key encapsulation mechanism +// ML-KEM-1024 as defined in FIPS203. +package mlkem1024 + +import ( + "bytes" + "crypto/subtle" + "io" + + cryptoRand "crypto/rand" + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/kem" + cpapke "github.com/cloudflare/circl/pke/kyber/kyber1024" +) + +const ( + // Size of seed for NewKeyFromSeed + KeySeedSize = cpapke.KeySeedSize + 32 + + // Size of seed for EncapsulateTo. + EncapsulationSeedSize = 32 + + // Size of the established shared key. + SharedKeySize = 32 + + // Size of the encapsulated shared key. + CiphertextSize = cpapke.CiphertextSize + + // Size of a packed public key. + PublicKeySize = cpapke.PublicKeySize + + // Size of a packed private key. + PrivateKeySize = cpapke.PrivateKeySize + cpapke.PublicKeySize + 64 +) + +// Type of a ML-KEM-1024 public key +type PublicKey struct { + pk *cpapke.PublicKey + + hpk [32]byte // H(pk) +} + +// Type of a ML-KEM-1024 private key +type PrivateKey struct { + sk *cpapke.PrivateKey + pk *cpapke.PublicKey + hpk [32]byte // H(pk) + z [32]byte +} + +// NewKeyFromSeed derives a public/private keypair deterministically +// from the given seed. +// +// Panics if seed is not of length KeySeedSize. +func NewKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { + var sk PrivateKey + var pk PublicKey + + if len(seed) != KeySeedSize { + panic("seed must be of length KeySeedSize") + } + + pk.pk, sk.sk = cpapke.NewKeyFromSeedMLKEM(seed[:cpapke.KeySeedSize]) + sk.pk = pk.pk + copy(sk.z[:], seed[cpapke.KeySeedSize:]) + + // Compute H(pk) + var ppk [cpapke.PublicKeySize]byte + sk.pk.Pack(ppk[:]) + h := sha3.New256() + h.Write(ppk[:]) + h.Read(sk.hpk[:]) + copy(pk.hpk[:], sk.hpk[:]) + + return &pk, &sk +} + +// GenerateKeyPair generates public and private keys using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKeyPair(rand io.Reader) (*PublicKey, *PrivateKey, error) { + var seed [KeySeedSize]byte + if rand == nil { + rand = cryptoRand.Reader + } + _, err := io.ReadFull(rand, seed[:]) + if err != nil { + return nil, nil, err + } + pk, sk := NewKeyFromSeed(seed[:]) + return pk, sk, nil +} + +// EncapsulateTo generates a shared key and ciphertext that contains it +// for the public key using randomness from seed and writes the shared key +// to ss and ciphertext to ct. +// +// Panics if ss, ct or seed are not of length SharedKeySize, CiphertextSize +// and EncapsulationSeedSize respectively. +// +// seed may be nil, in which case crypto/rand.Reader is used to generate one. +func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { + if seed == nil { + seed = make([]byte, EncapsulationSeedSize) + if _, err := cryptoRand.Read(seed[:]); err != nil { + panic(err) + } + } else { + if len(seed) != EncapsulationSeedSize { + panic("seed must be of length EncapsulationSeedSize") + } + } + + if len(ct) != CiphertextSize { + panic("ct must be of length CiphertextSize") + } + + if len(ss) != SharedKeySize { + panic("ss must be of length SharedKeySize") + } + + var m [32]byte + copy(m[:], seed) + + // (K', r) = G(m ‖ H(pk)) + var kr [64]byte + g := sha3.New512() + g.Write(m[:]) + g.Write(pk.hpk[:]) + g.Read(kr[:]) + + // c = Kyber.CPAPKE.Enc(pk, m, r) + pk.pk.EncryptTo(ct, m[:], kr[32:]) + + copy(ss, kr[:SharedKeySize]) +} + +// DecapsulateTo computes the shared key which is encapsulated in ct +// for the private key. +// +// Panics if ct or ss are not of length CiphertextSize and SharedKeySize +// respectively. +func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { + if len(ct) != CiphertextSize { + panic("ct must be of length CiphertextSize") + } + + if len(ss) != SharedKeySize { + panic("ss must be of length SharedKeySize") + } + + // m' = Kyber.CPAPKE.Dec(sk, ct) + var m2 [32]byte + sk.sk.DecryptTo(m2[:], ct) + + // (K'', r') = G(m' ‖ H(pk)) + var kr2 [64]byte + g := sha3.New512() + g.Write(m2[:]) + g.Write(sk.hpk[:]) + g.Read(kr2[:]) + + // c' = Kyber.CPAPKE.Enc(pk, m', r') + var ct2 [CiphertextSize]byte + sk.pk.EncryptTo(ct2[:], m2[:], kr2[32:]) + + var ss2 [SharedKeySize]byte + + // Compute shared secret in case of rejection: ss₂ = PRF(z ‖ c) + prf := sha3.NewShake256() + prf.Write(sk.z[:]) + prf.Write(ct[:CiphertextSize]) + prf.Read(ss2[:]) + + // Set ss2 to the real shared secret if c = c'. + subtle.ConstantTimeCopy( + subtle.ConstantTimeCompare(ct, ct2[:]), + ss2[:], + kr2[:SharedKeySize], + ) + + copy(ss, ss2[:]) +} + +// Packs sk to buf. +// +// Panics if buf is not of size PrivateKeySize. +func (sk *PrivateKey) Pack(buf []byte) { + if len(buf) != PrivateKeySize { + panic("buf must be of length PrivateKeySize") + } + + sk.sk.Pack(buf[:cpapke.PrivateKeySize]) + buf = buf[cpapke.PrivateKeySize:] + sk.pk.Pack(buf[:cpapke.PublicKeySize]) + buf = buf[cpapke.PublicKeySize:] + copy(buf, sk.hpk[:]) + buf = buf[32:] + copy(buf, sk.z[:]) +} + +// Unpacks sk from buf. +// +// Panics if buf is not of size PrivateKeySize. +func (sk *PrivateKey) Unpack(buf []byte) { + if len(buf) != PrivateKeySize { + panic("buf must be of length PrivateKeySize") + } + + sk.sk = new(cpapke.PrivateKey) + sk.sk.Unpack(buf[:cpapke.PrivateKeySize]) + buf = buf[cpapke.PrivateKeySize:] + sk.pk = new(cpapke.PublicKey) + sk.pk.Unpack(buf[:cpapke.PublicKeySize]) + buf = buf[cpapke.PublicKeySize:] + copy(sk.hpk[:], buf[:32]) + copy(sk.z[:], buf[32:]) +} + +// Packs pk to buf. +// +// Panics if buf is not of size PublicKeySize. +func (pk *PublicKey) Pack(buf []byte) { + if len(buf) != PublicKeySize { + panic("buf must be of length PublicKeySize") + } + + pk.pk.Pack(buf) +} + +// Unpacks pk from buf. +// +// Returns an error if buf is not of size PublicKeySize, or the public key +// is not normalized. +func (pk *PublicKey) Unpack(buf []byte) error { + if len(buf) != PublicKeySize { + return kem.ErrPubKeySize + } + + pk.pk = new(cpapke.PublicKey) + if err := pk.pk.UnpackMLKEM(buf); err != nil { + return err + } + + // Compute cached H(pk) + h := sha3.New256() + h.Write(buf) + h.Read(pk.hpk[:]) + + return nil +} + +// Boilerplate down below for the KEM scheme API. + +type scheme struct{} + +var sch kem.Scheme = &scheme{} + +// Scheme returns a KEM interface. +func Scheme() kem.Scheme { return sch } + +func (*scheme) Name() string { return "ML-KEM-1024" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SeedSize() int { return KeySeedSize } +func (*scheme) SharedKeySize() int { return SharedKeySize } +func (*scheme) CiphertextSize() int { return CiphertextSize } +func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } + +func (sk *PrivateKey) Scheme() kem.Scheme { return sch } +func (pk *PublicKey) Scheme() kem.Scheme { return sch } + +func (sk *PrivateKey) MarshalBinary() ([]byte, error) { + var ret [PrivateKeySize]byte + sk.Pack(ret[:]) + return ret[:], nil +} + +func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { + oth, ok := other.(*PrivateKey) + if !ok { + return false + } + if sk.pk == nil && oth.pk == nil { + return true + } + if sk.pk == nil || oth.pk == nil { + return false + } + if !bytes.Equal(sk.hpk[:], oth.hpk[:]) || + subtle.ConstantTimeCompare(sk.z[:], oth.z[:]) != 1 { + return false + } + return sk.sk.Equal(oth.sk) +} + +func (pk *PublicKey) Equal(other kem.PublicKey) bool { + oth, ok := other.(*PublicKey) + if !ok { + return false + } + if pk.pk == nil && oth.pk == nil { + return true + } + if pk.pk == nil || oth.pk == nil { + return false + } + return bytes.Equal(pk.hpk[:], oth.hpk[:]) +} + +func (sk *PrivateKey) Public() kem.PublicKey { + pk := new(PublicKey) + pk.pk = sk.pk + copy(pk.hpk[:], sk.hpk[:]) + return pk +} + +func (pk *PublicKey) MarshalBinary() ([]byte, error) { + var ret [PublicKeySize]byte + pk.Pack(ret[:]) + return ret[:], nil +} + +func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { + return GenerateKeyPair(cryptoRand.Reader) +} + +func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { + if len(seed) != KeySeedSize { + panic(kem.ErrSeedSize) + } + return NewKeyFromSeed(seed[:]) +} + +func (*scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { + ct = make([]byte, CiphertextSize) + ss = make([]byte, SharedKeySize) + + pub, ok := pk.(*PublicKey) + if !ok { + return nil, nil, kem.ErrTypeMismatch + } + pub.EncapsulateTo(ct, ss, nil) + return +} + +func (*scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) ( + ct, ss []byte, err error) { + if len(seed) != EncapsulationSeedSize { + return nil, nil, kem.ErrSeedSize + } + + ct = make([]byte, CiphertextSize) + ss = make([]byte, SharedKeySize) + + pub, ok := pk.(*PublicKey) + if !ok { + return nil, nil, kem.ErrTypeMismatch + } + pub.EncapsulateTo(ct, ss, seed) + return +} + +func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { + if len(ct) != CiphertextSize { + return nil, kem.ErrCiphertextSize + } + + priv, ok := sk.(*PrivateKey) + if !ok { + return nil, kem.ErrTypeMismatch + } + ss := make([]byte, SharedKeySize) + priv.DecapsulateTo(ss, ct) + return ss, nil +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { + var ret PublicKey + if err := ret.Unpack(buf); err != nil { + return nil, err + } + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, kem.ErrPrivKeySize + } + var ret PrivateKey + ret.Unpack(buf) + return &ret, nil +} diff --git a/kem/mlkem/mlkem512/kyber.go b/kem/mlkem/mlkem512/kyber.go new file mode 100644 index 000000000..8bb2ce194 --- /dev/null +++ b/kem/mlkem/mlkem512/kyber.go @@ -0,0 +1,394 @@ +// Code generated from pkg.templ.go. DO NOT EDIT. + +// Package mlkem512 implements the IND-CCA2 secure key encapsulation mechanism +// ML-KEM-512 as defined in FIPS203. +package mlkem512 + +import ( + "bytes" + "crypto/subtle" + "io" + + cryptoRand "crypto/rand" + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/kem" + cpapke "github.com/cloudflare/circl/pke/kyber/kyber512" +) + +const ( + // Size of seed for NewKeyFromSeed + KeySeedSize = cpapke.KeySeedSize + 32 + + // Size of seed for EncapsulateTo. + EncapsulationSeedSize = 32 + + // Size of the established shared key. + SharedKeySize = 32 + + // Size of the encapsulated shared key. + CiphertextSize = cpapke.CiphertextSize + + // Size of a packed public key. + PublicKeySize = cpapke.PublicKeySize + + // Size of a packed private key. + PrivateKeySize = cpapke.PrivateKeySize + cpapke.PublicKeySize + 64 +) + +// Type of a ML-KEM-512 public key +type PublicKey struct { + pk *cpapke.PublicKey + + hpk [32]byte // H(pk) +} + +// Type of a ML-KEM-512 private key +type PrivateKey struct { + sk *cpapke.PrivateKey + pk *cpapke.PublicKey + hpk [32]byte // H(pk) + z [32]byte +} + +// NewKeyFromSeed derives a public/private keypair deterministically +// from the given seed. +// +// Panics if seed is not of length KeySeedSize. +func NewKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { + var sk PrivateKey + var pk PublicKey + + if len(seed) != KeySeedSize { + panic("seed must be of length KeySeedSize") + } + + pk.pk, sk.sk = cpapke.NewKeyFromSeedMLKEM(seed[:cpapke.KeySeedSize]) + sk.pk = pk.pk + copy(sk.z[:], seed[cpapke.KeySeedSize:]) + + // Compute H(pk) + var ppk [cpapke.PublicKeySize]byte + sk.pk.Pack(ppk[:]) + h := sha3.New256() + h.Write(ppk[:]) + h.Read(sk.hpk[:]) + copy(pk.hpk[:], sk.hpk[:]) + + return &pk, &sk +} + +// GenerateKeyPair generates public and private keys using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKeyPair(rand io.Reader) (*PublicKey, *PrivateKey, error) { + var seed [KeySeedSize]byte + if rand == nil { + rand = cryptoRand.Reader + } + _, err := io.ReadFull(rand, seed[:]) + if err != nil { + return nil, nil, err + } + pk, sk := NewKeyFromSeed(seed[:]) + return pk, sk, nil +} + +// EncapsulateTo generates a shared key and ciphertext that contains it +// for the public key using randomness from seed and writes the shared key +// to ss and ciphertext to ct. +// +// Panics if ss, ct or seed are not of length SharedKeySize, CiphertextSize +// and EncapsulationSeedSize respectively. +// +// seed may be nil, in which case crypto/rand.Reader is used to generate one. +func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { + if seed == nil { + seed = make([]byte, EncapsulationSeedSize) + if _, err := cryptoRand.Read(seed[:]); err != nil { + panic(err) + } + } else { + if len(seed) != EncapsulationSeedSize { + panic("seed must be of length EncapsulationSeedSize") + } + } + + if len(ct) != CiphertextSize { + panic("ct must be of length CiphertextSize") + } + + if len(ss) != SharedKeySize { + panic("ss must be of length SharedKeySize") + } + + var m [32]byte + copy(m[:], seed) + + // (K', r) = G(m ‖ H(pk)) + var kr [64]byte + g := sha3.New512() + g.Write(m[:]) + g.Write(pk.hpk[:]) + g.Read(kr[:]) + + // c = Kyber.CPAPKE.Enc(pk, m, r) + pk.pk.EncryptTo(ct, m[:], kr[32:]) + + copy(ss, kr[:SharedKeySize]) +} + +// DecapsulateTo computes the shared key which is encapsulated in ct +// for the private key. +// +// Panics if ct or ss are not of length CiphertextSize and SharedKeySize +// respectively. +func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { + if len(ct) != CiphertextSize { + panic("ct must be of length CiphertextSize") + } + + if len(ss) != SharedKeySize { + panic("ss must be of length SharedKeySize") + } + + // m' = Kyber.CPAPKE.Dec(sk, ct) + var m2 [32]byte + sk.sk.DecryptTo(m2[:], ct) + + // (K'', r') = G(m' ‖ H(pk)) + var kr2 [64]byte + g := sha3.New512() + g.Write(m2[:]) + g.Write(sk.hpk[:]) + g.Read(kr2[:]) + + // c' = Kyber.CPAPKE.Enc(pk, m', r') + var ct2 [CiphertextSize]byte + sk.pk.EncryptTo(ct2[:], m2[:], kr2[32:]) + + var ss2 [SharedKeySize]byte + + // Compute shared secret in case of rejection: ss₂ = PRF(z ‖ c) + prf := sha3.NewShake256() + prf.Write(sk.z[:]) + prf.Write(ct[:CiphertextSize]) + prf.Read(ss2[:]) + + // Set ss2 to the real shared secret if c = c'. + subtle.ConstantTimeCopy( + subtle.ConstantTimeCompare(ct, ct2[:]), + ss2[:], + kr2[:SharedKeySize], + ) + + copy(ss, ss2[:]) +} + +// Packs sk to buf. +// +// Panics if buf is not of size PrivateKeySize. +func (sk *PrivateKey) Pack(buf []byte) { + if len(buf) != PrivateKeySize { + panic("buf must be of length PrivateKeySize") + } + + sk.sk.Pack(buf[:cpapke.PrivateKeySize]) + buf = buf[cpapke.PrivateKeySize:] + sk.pk.Pack(buf[:cpapke.PublicKeySize]) + buf = buf[cpapke.PublicKeySize:] + copy(buf, sk.hpk[:]) + buf = buf[32:] + copy(buf, sk.z[:]) +} + +// Unpacks sk from buf. +// +// Panics if buf is not of size PrivateKeySize. +func (sk *PrivateKey) Unpack(buf []byte) { + if len(buf) != PrivateKeySize { + panic("buf must be of length PrivateKeySize") + } + + sk.sk = new(cpapke.PrivateKey) + sk.sk.Unpack(buf[:cpapke.PrivateKeySize]) + buf = buf[cpapke.PrivateKeySize:] + sk.pk = new(cpapke.PublicKey) + sk.pk.Unpack(buf[:cpapke.PublicKeySize]) + buf = buf[cpapke.PublicKeySize:] + copy(sk.hpk[:], buf[:32]) + copy(sk.z[:], buf[32:]) +} + +// Packs pk to buf. +// +// Panics if buf is not of size PublicKeySize. +func (pk *PublicKey) Pack(buf []byte) { + if len(buf) != PublicKeySize { + panic("buf must be of length PublicKeySize") + } + + pk.pk.Pack(buf) +} + +// Unpacks pk from buf. +// +// Returns an error if buf is not of size PublicKeySize, or the public key +// is not normalized. +func (pk *PublicKey) Unpack(buf []byte) error { + if len(buf) != PublicKeySize { + return kem.ErrPubKeySize + } + + pk.pk = new(cpapke.PublicKey) + if err := pk.pk.UnpackMLKEM(buf); err != nil { + return err + } + + // Compute cached H(pk) + h := sha3.New256() + h.Write(buf) + h.Read(pk.hpk[:]) + + return nil +} + +// Boilerplate down below for the KEM scheme API. + +type scheme struct{} + +var sch kem.Scheme = &scheme{} + +// Scheme returns a KEM interface. +func Scheme() kem.Scheme { return sch } + +func (*scheme) Name() string { return "ML-KEM-512" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SeedSize() int { return KeySeedSize } +func (*scheme) SharedKeySize() int { return SharedKeySize } +func (*scheme) CiphertextSize() int { return CiphertextSize } +func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } + +func (sk *PrivateKey) Scheme() kem.Scheme { return sch } +func (pk *PublicKey) Scheme() kem.Scheme { return sch } + +func (sk *PrivateKey) MarshalBinary() ([]byte, error) { + var ret [PrivateKeySize]byte + sk.Pack(ret[:]) + return ret[:], nil +} + +func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { + oth, ok := other.(*PrivateKey) + if !ok { + return false + } + if sk.pk == nil && oth.pk == nil { + return true + } + if sk.pk == nil || oth.pk == nil { + return false + } + if !bytes.Equal(sk.hpk[:], oth.hpk[:]) || + subtle.ConstantTimeCompare(sk.z[:], oth.z[:]) != 1 { + return false + } + return sk.sk.Equal(oth.sk) +} + +func (pk *PublicKey) Equal(other kem.PublicKey) bool { + oth, ok := other.(*PublicKey) + if !ok { + return false + } + if pk.pk == nil && oth.pk == nil { + return true + } + if pk.pk == nil || oth.pk == nil { + return false + } + return bytes.Equal(pk.hpk[:], oth.hpk[:]) +} + +func (sk *PrivateKey) Public() kem.PublicKey { + pk := new(PublicKey) + pk.pk = sk.pk + copy(pk.hpk[:], sk.hpk[:]) + return pk +} + +func (pk *PublicKey) MarshalBinary() ([]byte, error) { + var ret [PublicKeySize]byte + pk.Pack(ret[:]) + return ret[:], nil +} + +func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { + return GenerateKeyPair(cryptoRand.Reader) +} + +func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { + if len(seed) != KeySeedSize { + panic(kem.ErrSeedSize) + } + return NewKeyFromSeed(seed[:]) +} + +func (*scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { + ct = make([]byte, CiphertextSize) + ss = make([]byte, SharedKeySize) + + pub, ok := pk.(*PublicKey) + if !ok { + return nil, nil, kem.ErrTypeMismatch + } + pub.EncapsulateTo(ct, ss, nil) + return +} + +func (*scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) ( + ct, ss []byte, err error) { + if len(seed) != EncapsulationSeedSize { + return nil, nil, kem.ErrSeedSize + } + + ct = make([]byte, CiphertextSize) + ss = make([]byte, SharedKeySize) + + pub, ok := pk.(*PublicKey) + if !ok { + return nil, nil, kem.ErrTypeMismatch + } + pub.EncapsulateTo(ct, ss, seed) + return +} + +func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { + if len(ct) != CiphertextSize { + return nil, kem.ErrCiphertextSize + } + + priv, ok := sk.(*PrivateKey) + if !ok { + return nil, kem.ErrTypeMismatch + } + ss := make([]byte, SharedKeySize) + priv.DecapsulateTo(ss, ct) + return ss, nil +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { + var ret PublicKey + if err := ret.Unpack(buf); err != nil { + return nil, err + } + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, kem.ErrPrivKeySize + } + var ret PrivateKey + ret.Unpack(buf) + return &ret, nil +} diff --git a/kem/mlkem/mlkem768/kyber.go b/kem/mlkem/mlkem768/kyber.go new file mode 100644 index 000000000..61271cd86 --- /dev/null +++ b/kem/mlkem/mlkem768/kyber.go @@ -0,0 +1,394 @@ +// Code generated from pkg.templ.go. DO NOT EDIT. + +// Package mlkem768 implements the IND-CCA2 secure key encapsulation mechanism +// ML-KEM-768 as defined in FIPS203. +package mlkem768 + +import ( + "bytes" + "crypto/subtle" + "io" + + cryptoRand "crypto/rand" + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/kem" + cpapke "github.com/cloudflare/circl/pke/kyber/kyber768" +) + +const ( + // Size of seed for NewKeyFromSeed + KeySeedSize = cpapke.KeySeedSize + 32 + + // Size of seed for EncapsulateTo. + EncapsulationSeedSize = 32 + + // Size of the established shared key. + SharedKeySize = 32 + + // Size of the encapsulated shared key. + CiphertextSize = cpapke.CiphertextSize + + // Size of a packed public key. + PublicKeySize = cpapke.PublicKeySize + + // Size of a packed private key. + PrivateKeySize = cpapke.PrivateKeySize + cpapke.PublicKeySize + 64 +) + +// Type of a ML-KEM-768 public key +type PublicKey struct { + pk *cpapke.PublicKey + + hpk [32]byte // H(pk) +} + +// Type of a ML-KEM-768 private key +type PrivateKey struct { + sk *cpapke.PrivateKey + pk *cpapke.PublicKey + hpk [32]byte // H(pk) + z [32]byte +} + +// NewKeyFromSeed derives a public/private keypair deterministically +// from the given seed. +// +// Panics if seed is not of length KeySeedSize. +func NewKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { + var sk PrivateKey + var pk PublicKey + + if len(seed) != KeySeedSize { + panic("seed must be of length KeySeedSize") + } + + pk.pk, sk.sk = cpapke.NewKeyFromSeedMLKEM(seed[:cpapke.KeySeedSize]) + sk.pk = pk.pk + copy(sk.z[:], seed[cpapke.KeySeedSize:]) + + // Compute H(pk) + var ppk [cpapke.PublicKeySize]byte + sk.pk.Pack(ppk[:]) + h := sha3.New256() + h.Write(ppk[:]) + h.Read(sk.hpk[:]) + copy(pk.hpk[:], sk.hpk[:]) + + return &pk, &sk +} + +// GenerateKeyPair generates public and private keys using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKeyPair(rand io.Reader) (*PublicKey, *PrivateKey, error) { + var seed [KeySeedSize]byte + if rand == nil { + rand = cryptoRand.Reader + } + _, err := io.ReadFull(rand, seed[:]) + if err != nil { + return nil, nil, err + } + pk, sk := NewKeyFromSeed(seed[:]) + return pk, sk, nil +} + +// EncapsulateTo generates a shared key and ciphertext that contains it +// for the public key using randomness from seed and writes the shared key +// to ss and ciphertext to ct. +// +// Panics if ss, ct or seed are not of length SharedKeySize, CiphertextSize +// and EncapsulationSeedSize respectively. +// +// seed may be nil, in which case crypto/rand.Reader is used to generate one. +func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { + if seed == nil { + seed = make([]byte, EncapsulationSeedSize) + if _, err := cryptoRand.Read(seed[:]); err != nil { + panic(err) + } + } else { + if len(seed) != EncapsulationSeedSize { + panic("seed must be of length EncapsulationSeedSize") + } + } + + if len(ct) != CiphertextSize { + panic("ct must be of length CiphertextSize") + } + + if len(ss) != SharedKeySize { + panic("ss must be of length SharedKeySize") + } + + var m [32]byte + copy(m[:], seed) + + // (K', r) = G(m ‖ H(pk)) + var kr [64]byte + g := sha3.New512() + g.Write(m[:]) + g.Write(pk.hpk[:]) + g.Read(kr[:]) + + // c = Kyber.CPAPKE.Enc(pk, m, r) + pk.pk.EncryptTo(ct, m[:], kr[32:]) + + copy(ss, kr[:SharedKeySize]) +} + +// DecapsulateTo computes the shared key which is encapsulated in ct +// for the private key. +// +// Panics if ct or ss are not of length CiphertextSize and SharedKeySize +// respectively. +func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { + if len(ct) != CiphertextSize { + panic("ct must be of length CiphertextSize") + } + + if len(ss) != SharedKeySize { + panic("ss must be of length SharedKeySize") + } + + // m' = Kyber.CPAPKE.Dec(sk, ct) + var m2 [32]byte + sk.sk.DecryptTo(m2[:], ct) + + // (K'', r') = G(m' ‖ H(pk)) + var kr2 [64]byte + g := sha3.New512() + g.Write(m2[:]) + g.Write(sk.hpk[:]) + g.Read(kr2[:]) + + // c' = Kyber.CPAPKE.Enc(pk, m', r') + var ct2 [CiphertextSize]byte + sk.pk.EncryptTo(ct2[:], m2[:], kr2[32:]) + + var ss2 [SharedKeySize]byte + + // Compute shared secret in case of rejection: ss₂ = PRF(z ‖ c) + prf := sha3.NewShake256() + prf.Write(sk.z[:]) + prf.Write(ct[:CiphertextSize]) + prf.Read(ss2[:]) + + // Set ss2 to the real shared secret if c = c'. + subtle.ConstantTimeCopy( + subtle.ConstantTimeCompare(ct, ct2[:]), + ss2[:], + kr2[:SharedKeySize], + ) + + copy(ss, ss2[:]) +} + +// Packs sk to buf. +// +// Panics if buf is not of size PrivateKeySize. +func (sk *PrivateKey) Pack(buf []byte) { + if len(buf) != PrivateKeySize { + panic("buf must be of length PrivateKeySize") + } + + sk.sk.Pack(buf[:cpapke.PrivateKeySize]) + buf = buf[cpapke.PrivateKeySize:] + sk.pk.Pack(buf[:cpapke.PublicKeySize]) + buf = buf[cpapke.PublicKeySize:] + copy(buf, sk.hpk[:]) + buf = buf[32:] + copy(buf, sk.z[:]) +} + +// Unpacks sk from buf. +// +// Panics if buf is not of size PrivateKeySize. +func (sk *PrivateKey) Unpack(buf []byte) { + if len(buf) != PrivateKeySize { + panic("buf must be of length PrivateKeySize") + } + + sk.sk = new(cpapke.PrivateKey) + sk.sk.Unpack(buf[:cpapke.PrivateKeySize]) + buf = buf[cpapke.PrivateKeySize:] + sk.pk = new(cpapke.PublicKey) + sk.pk.Unpack(buf[:cpapke.PublicKeySize]) + buf = buf[cpapke.PublicKeySize:] + copy(sk.hpk[:], buf[:32]) + copy(sk.z[:], buf[32:]) +} + +// Packs pk to buf. +// +// Panics if buf is not of size PublicKeySize. +func (pk *PublicKey) Pack(buf []byte) { + if len(buf) != PublicKeySize { + panic("buf must be of length PublicKeySize") + } + + pk.pk.Pack(buf) +} + +// Unpacks pk from buf. +// +// Returns an error if buf is not of size PublicKeySize, or the public key +// is not normalized. +func (pk *PublicKey) Unpack(buf []byte) error { + if len(buf) != PublicKeySize { + return kem.ErrPubKeySize + } + + pk.pk = new(cpapke.PublicKey) + if err := pk.pk.UnpackMLKEM(buf); err != nil { + return err + } + + // Compute cached H(pk) + h := sha3.New256() + h.Write(buf) + h.Read(pk.hpk[:]) + + return nil +} + +// Boilerplate down below for the KEM scheme API. + +type scheme struct{} + +var sch kem.Scheme = &scheme{} + +// Scheme returns a KEM interface. +func Scheme() kem.Scheme { return sch } + +func (*scheme) Name() string { return "ML-KEM-768" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SeedSize() int { return KeySeedSize } +func (*scheme) SharedKeySize() int { return SharedKeySize } +func (*scheme) CiphertextSize() int { return CiphertextSize } +func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } + +func (sk *PrivateKey) Scheme() kem.Scheme { return sch } +func (pk *PublicKey) Scheme() kem.Scheme { return sch } + +func (sk *PrivateKey) MarshalBinary() ([]byte, error) { + var ret [PrivateKeySize]byte + sk.Pack(ret[:]) + return ret[:], nil +} + +func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { + oth, ok := other.(*PrivateKey) + if !ok { + return false + } + if sk.pk == nil && oth.pk == nil { + return true + } + if sk.pk == nil || oth.pk == nil { + return false + } + if !bytes.Equal(sk.hpk[:], oth.hpk[:]) || + subtle.ConstantTimeCompare(sk.z[:], oth.z[:]) != 1 { + return false + } + return sk.sk.Equal(oth.sk) +} + +func (pk *PublicKey) Equal(other kem.PublicKey) bool { + oth, ok := other.(*PublicKey) + if !ok { + return false + } + if pk.pk == nil && oth.pk == nil { + return true + } + if pk.pk == nil || oth.pk == nil { + return false + } + return bytes.Equal(pk.hpk[:], oth.hpk[:]) +} + +func (sk *PrivateKey) Public() kem.PublicKey { + pk := new(PublicKey) + pk.pk = sk.pk + copy(pk.hpk[:], sk.hpk[:]) + return pk +} + +func (pk *PublicKey) MarshalBinary() ([]byte, error) { + var ret [PublicKeySize]byte + pk.Pack(ret[:]) + return ret[:], nil +} + +func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { + return GenerateKeyPair(cryptoRand.Reader) +} + +func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { + if len(seed) != KeySeedSize { + panic(kem.ErrSeedSize) + } + return NewKeyFromSeed(seed[:]) +} + +func (*scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { + ct = make([]byte, CiphertextSize) + ss = make([]byte, SharedKeySize) + + pub, ok := pk.(*PublicKey) + if !ok { + return nil, nil, kem.ErrTypeMismatch + } + pub.EncapsulateTo(ct, ss, nil) + return +} + +func (*scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) ( + ct, ss []byte, err error) { + if len(seed) != EncapsulationSeedSize { + return nil, nil, kem.ErrSeedSize + } + + ct = make([]byte, CiphertextSize) + ss = make([]byte, SharedKeySize) + + pub, ok := pk.(*PublicKey) + if !ok { + return nil, nil, kem.ErrTypeMismatch + } + pub.EncapsulateTo(ct, ss, seed) + return +} + +func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { + if len(ct) != CiphertextSize { + return nil, kem.ErrCiphertextSize + } + + priv, ok := sk.(*PrivateKey) + if !ok { + return nil, kem.ErrTypeMismatch + } + ss := make([]byte, SharedKeySize) + priv.DecapsulateTo(ss, ct) + return ss, nil +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { + var ret PublicKey + if err := ret.Unpack(buf); err != nil { + return nil, err + } + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, kem.ErrPrivKeySize + } + var ret PrivateKey + ret.Unpack(buf) + return &ret, nil +} diff --git a/kem/mlkem/testdata/ML-KEM-encapDecap-FIPS203/expectedResults.json.gz b/kem/mlkem/testdata/ML-KEM-encapDecap-FIPS203/expectedResults.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..801615debf0653e0161abd5205fa8eaef9032adb GIT binary patch literal 103486 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

`Dph7jdV!J7=2 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 literal 0 HcmV?d00001 diff --git a/kem/mlkem/testdata/ML-KEM-encapDecap-FIPS203/prompt.json.gz b/kem/mlkem/testdata/ML-KEM-encapDecap-FIPS203/prompt.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..5a6469f746267f8de1ca174f2a5b9317c1d56f83 GIT binary patch literal 153136 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

=%x*a$6072y$rZ6>M?hUQj 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 literal 0 HcmV?d00001 diff --git a/kem/mlkem/testdata/ML-KEM-keyGen-FIPS203/expectedResults.json.gz b/kem/mlkem/testdata/ML-KEM-keyGen-FIPS203/expectedResults.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..9b0db3ff6d6716b9f43953de8ce41f37f82d1ccd GIT binary patch literal 211052 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%0D3Y3i8BN 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/kem/mlkem/testdata/ML-KEM-keyGen-FIPS203/prompt.json.gz b/kem/mlkem/testdata/ML-KEM-keyGen-FIPS203/prompt.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..8622efe3f1b35abd2f58ad843670857770b1b308 GIT binary patch literal 6505 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�Mv4_2%@_A&q@=VTFv)dj;JKEDk?!s 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 P{q=tUF Date: Mon, 19 Aug 2024 11:49:59 +0200 Subject: [PATCH 07/45] Add ML-KEM decapsulation key check. Described in section 7.3 of FIPS 203. The check is only required if the private key is from an untrusted source. We do not distinguish between a trusted and untrusted source in the current API, so we'll perform the check every time we unmarshal the private key. --- kem/kem.go | 3 +++ kem/kyber/templates/pkg.templ.go | 28 ++++++++++++++++++++++++++++ kem/mlkem/mlkem1024/kyber.go | 19 ++++++++++++++++--- kem/mlkem/mlkem512/kyber.go | 19 ++++++++++++++++--- kem/mlkem/mlkem768/kyber.go | 19 ++++++++++++++++--- 5 files changed, 79 insertions(+), 9 deletions(-) diff --git a/kem/kem.go b/kem/kem.go index 6ab0aa3ba..a2f6a2aae 100644 --- a/kem/kem.go +++ b/kem/kem.go @@ -113,6 +113,9 @@ var ( // ErrPubKey is the error used if the provided public key is invalid. ErrPubKey = errors.New("invalid public key") + // ErrPrivKey is the error used if the provided private key is invalid. + ErrPrivKey = errors.New("invalid private key") + // ErrCipherText is the error used if the provided ciphertext is invalid. ErrCipherText = errors.New("invalid ciphertext") ) diff --git a/kem/kyber/templates/pkg.templ.go b/kem/kyber/templates/pkg.templ.go index 44a311405..2c9925c41 100644 --- a/kem/kyber/templates/pkg.templ.go +++ b/kem/kyber/templates/pkg.templ.go @@ -256,19 +256,41 @@ func (sk *PrivateKey) Pack(buf []byte) { // Unpacks sk from buf. // // Panics if buf is not of size PrivateKeySize. +{{ if .NIST -}} +// +// Returns an error if buf is not of size PrivateKeySize, or private key +// doesn't pass the ML-KEM decapsulation key check. +func (sk *PrivateKey) Unpack(buf []byte) error { + if len(buf) != PrivateKeySize { + return kem.ErrPrivKeySize + } +{{- else -}} func (sk *PrivateKey) Unpack(buf []byte) { if len(buf) != PrivateKeySize { panic("buf must be of length PrivateKeySize") } +{{- end }} sk.sk = new(cpapke.PrivateKey) sk.sk.Unpack(buf[:cpapke.PrivateKeySize]) buf = buf[cpapke.PrivateKeySize:] sk.pk = new(cpapke.PublicKey) sk.pk.Unpack(buf[:cpapke.PublicKeySize]) +{{ if .NIST -}} + var hpk [32]byte + h := sha3.New256() + h.Write(buf[:cpapke.PublicKeySize]) + h.Read(hpk[:]) +{{ end -}} buf = buf[cpapke.PublicKeySize:] copy(sk.hpk[:], buf[:32]) copy(sk.z[:], buf[32:]) +{{ if .NIST -}} + if !bytes.Equal(hpk[:], sk.hpk[:]) { + return kem.ErrPrivKey + } + return nil +{{ end -}} } // Packs pk to buf. @@ -463,6 +485,12 @@ func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { return nil, kem.ErrPrivKeySize } var ret PrivateKey + {{ if .NIST -}} + if err := ret.Unpack(buf); err != nil { + return nil, err + } + {{- else -}} ret.Unpack(buf) + {{- end }} return &ret, nil } diff --git a/kem/mlkem/mlkem1024/kyber.go b/kem/mlkem/mlkem1024/kyber.go index a1e73b892..c548faa2a 100644 --- a/kem/mlkem/mlkem1024/kyber.go +++ b/kem/mlkem/mlkem1024/kyber.go @@ -203,9 +203,12 @@ func (sk *PrivateKey) Pack(buf []byte) { // Unpacks sk from buf. // // Panics if buf is not of size PrivateKeySize. -func (sk *PrivateKey) Unpack(buf []byte) { +// +// Returns an error if buf is not of size PrivateKeySize, or private key +// doesn't pass the ML-KEM decapsulation key check. +func (sk *PrivateKey) Unpack(buf []byte) error { if len(buf) != PrivateKeySize { - panic("buf must be of length PrivateKeySize") + return kem.ErrPrivKeySize } sk.sk = new(cpapke.PrivateKey) @@ -213,9 +216,17 @@ func (sk *PrivateKey) Unpack(buf []byte) { buf = buf[cpapke.PrivateKeySize:] sk.pk = new(cpapke.PublicKey) sk.pk.Unpack(buf[:cpapke.PublicKeySize]) + var hpk [32]byte + h := sha3.New256() + h.Write(buf[:cpapke.PublicKeySize]) + h.Read(hpk[:]) buf = buf[cpapke.PublicKeySize:] copy(sk.hpk[:], buf[:32]) copy(sk.z[:], buf[32:]) + if !bytes.Equal(hpk[:], sk.hpk[:]) { + return kem.ErrPrivKey + } + return nil } // Packs pk to buf. @@ -389,6 +400,8 @@ func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { return nil, kem.ErrPrivKeySize } var ret PrivateKey - ret.Unpack(buf) + if err := ret.Unpack(buf); err != nil { + return nil, err + } return &ret, nil } diff --git a/kem/mlkem/mlkem512/kyber.go b/kem/mlkem/mlkem512/kyber.go index 8bb2ce194..85f07aba7 100644 --- a/kem/mlkem/mlkem512/kyber.go +++ b/kem/mlkem/mlkem512/kyber.go @@ -203,9 +203,12 @@ func (sk *PrivateKey) Pack(buf []byte) { // Unpacks sk from buf. // // Panics if buf is not of size PrivateKeySize. -func (sk *PrivateKey) Unpack(buf []byte) { +// +// Returns an error if buf is not of size PrivateKeySize, or private key +// doesn't pass the ML-KEM decapsulation key check. +func (sk *PrivateKey) Unpack(buf []byte) error { if len(buf) != PrivateKeySize { - panic("buf must be of length PrivateKeySize") + return kem.ErrPrivKeySize } sk.sk = new(cpapke.PrivateKey) @@ -213,9 +216,17 @@ func (sk *PrivateKey) Unpack(buf []byte) { buf = buf[cpapke.PrivateKeySize:] sk.pk = new(cpapke.PublicKey) sk.pk.Unpack(buf[:cpapke.PublicKeySize]) + var hpk [32]byte + h := sha3.New256() + h.Write(buf[:cpapke.PublicKeySize]) + h.Read(hpk[:]) buf = buf[cpapke.PublicKeySize:] copy(sk.hpk[:], buf[:32]) copy(sk.z[:], buf[32:]) + if !bytes.Equal(hpk[:], sk.hpk[:]) { + return kem.ErrPrivKey + } + return nil } // Packs pk to buf. @@ -389,6 +400,8 @@ func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { return nil, kem.ErrPrivKeySize } var ret PrivateKey - ret.Unpack(buf) + if err := ret.Unpack(buf); err != nil { + return nil, err + } return &ret, nil } diff --git a/kem/mlkem/mlkem768/kyber.go b/kem/mlkem/mlkem768/kyber.go index 61271cd86..afa483156 100644 --- a/kem/mlkem/mlkem768/kyber.go +++ b/kem/mlkem/mlkem768/kyber.go @@ -203,9 +203,12 @@ func (sk *PrivateKey) Pack(buf []byte) { // Unpacks sk from buf. // // Panics if buf is not of size PrivateKeySize. -func (sk *PrivateKey) Unpack(buf []byte) { +// +// Returns an error if buf is not of size PrivateKeySize, or private key +// doesn't pass the ML-KEM decapsulation key check. +func (sk *PrivateKey) Unpack(buf []byte) error { if len(buf) != PrivateKeySize { - panic("buf must be of length PrivateKeySize") + return kem.ErrPrivKeySize } sk.sk = new(cpapke.PrivateKey) @@ -213,9 +216,17 @@ func (sk *PrivateKey) Unpack(buf []byte) { buf = buf[cpapke.PrivateKeySize:] sk.pk = new(cpapke.PublicKey) sk.pk.Unpack(buf[:cpapke.PublicKeySize]) + var hpk [32]byte + h := sha3.New256() + h.Write(buf[:cpapke.PublicKeySize]) + h.Read(hpk[:]) buf = buf[cpapke.PublicKeySize:] copy(sk.hpk[:], buf[:32]) copy(sk.z[:], buf[32:]) + if !bytes.Equal(hpk[:], sk.hpk[:]) { + return kem.ErrPrivKey + } + return nil } // Packs pk to buf. @@ -389,6 +400,8 @@ func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { return nil, kem.ErrPrivKeySize } var ret PrivateKey - ret.Unpack(buf) + if err := ret.Unpack(buf); err != nil { + return nil, err + } return &ret, nil } From c311e4685e7c83e5f127ac24a2195470da2ab490 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 19 Aug 2024 14:46:45 -0700 Subject: [PATCH 08/45] Preparing for release v1.4.0 --- .github/workflows/ci-actions.yml | 2 ++ CITATION.cff | 4 ++-- README.md | 12 ++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index 66cdf39bb..0c024234b 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -95,6 +95,8 @@ jobs: uses: codecov/codecov-action@v4 with: file: ./coverage.txt + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} osCompat: runs-on: ${{ matrix.os }} needs: [amd64_job] diff --git a/CITATION.cff b/CITATION.cff index 46c4f77f8..02ad6abb7 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,6 +1,6 @@ --- cff-version: 1.2.0 -version: 1.3.9 +version: 1.4.0 title: "Introducing CIRCL: An Advanced Cryptographic Library" license: BSD-3-Clause abstract: > @@ -25,6 +25,6 @@ keywords: - golang repository-code: "https://github.com/cloudflare/circl/" type: software -message: "Available at https://github.com/cloudflare/circl. v1.3.9 Accessed Jun, 2024." +message: "Available at https://github.com/cloudflare/circl. v1.4.0 Accessed Aug, 2024." contact: - name: "Cloudflare, Inc." diff --git a/README.md b/README.md index 30e7650a7..a4fd64f95 100644 --- a/README.md +++ b/README.md @@ -81,10 +81,10 @@ Alternatively, look at the [Cloudflare Go](https://github.com/cloudflare/go/tree | KEM: Key Encapsulation Methods | |:---:| - - [CSIDH](./dh/csidh): Post-Quantum Commutative Group Action ([CSIDH](https://csidh.isogeny.org/)). - - [ML-KEM](./kem/mlkem): modes 512, 768, 1024 ([ML-KEM](https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.203.pdf)). + - [ML-KEM](./kem/mlkem): modes 512, 768, 1024 ([FIPS-203](https://doi.org/10.6028/NIST.FIPS.203)). - [Kyber KEM](./kem/kyber): modes 512, 768, 1024 ([KYBER](https://pq-crystals.org/kyber/)). - [FrodoKEM](./kem/frodo): modes 640-SHAKE. ([FrodoKEM](https://frodokem.org/)) + - [CSIDH](./dh/csidh): Post-Quantum Commutative Group Action ([CSIDH](https://csidh.isogeny.org/)). - (**insecure, deprecated**) ~~[SIDH/SIKE](./kem/sike)~~: Supersingular Key Encapsulation with primes p434, p503, p751 ([SIKE](https://sike.org/)). | Digital Signature Schemes | @@ -159,9 +159,9 @@ To cite CIRCL, use one of the following formats and update the version and date APA Style ``` -Faz-Hernández, A. and Kwiatkowski, K. (2019). Introducing CIRCL: +Faz-Hernandez, A. and Kwiatkowski, K. (2019). Introducing CIRCL: An Advanced Cryptographic Library. Cloudflare. Available at -https://github.com/cloudflare/circl. v1.3.9 Accessed Jun, 2024. +https://github.com/cloudflare/circl. v1.4.0 Accessed Aug, 2024. ``` Bibtex Source @@ -169,14 +169,14 @@ Bibtex Source ```bibtex @manual{circl, title = {Introducing CIRCL: An Advanced Cryptographic Library}, - author = {Armando Faz-Hern\'{a}ndez and Kris Kwiatkowski}, + author = {Armando Faz-Hernandez and Kris Kwiatkowski}, organization = {Cloudflare}, abstract = {{CIRCL (Cloudflare Interoperable, Reusable Cryptographic Library) is a collection of cryptographic primitives written in Go. The goal of this library is to be used as a tool for experimental deployment of cryptographic algorithms targeting Post-Quantum (PQ) and Elliptic Curve Cryptography (ECC).}}, - note = {Available at \url{https://github.com/cloudflare/circl}. v1.3.9 Accessed Jun, 2024}, + note = {Available at \url{https://github.com/cloudflare/circl}. v1.4.0 Accessed Aug, 2024}, month = jun, year = {2019} } From 2d6cd9871f69fb5d46d475864174990925bab469 Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Thu, 5 Sep 2024 14:18:35 +0200 Subject: [PATCH 09/45] kem: add X25519MLKEM768 TLS hybrid KEM --- kem/hybrid/hybrid.go | 21 ++++++++++++++++----- kem/schemes/schemes.go | 1 + kem/schemes/schemes_test.go | 1 + 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/kem/hybrid/hybrid.go b/kem/hybrid/hybrid.go index be8251c7f..8be85d70c 100644 --- a/kem/hybrid/hybrid.go +++ b/kem/hybrid/hybrid.go @@ -1,13 +1,13 @@ -// Package hybrid defines several hybrid classical/quantum KEMs. +// Package hybrid defines several hybrid classical/quantum KEMs for use in TLS. // -// KEMs are combined by simple concatenation of shared secrets, cipher texts, -// public keys, etc, see +// Hybrid KEMs in TLS are created by simple concatenation +// of shared secrets, cipher texts, public keys, etc. +// This is safe for TLS, see eg. // // https://datatracker.ietf.org/doc/draft-ietf-tls-hybrid-design/ // https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Cr2.pdf // -// Note that this is only fine if the shared secret is used in its entirety -// in a next step, such as being hashed or used as key. +// Note that this approach is not proven secure in broader context. // // For deriving a KEM keypair deterministically and encapsulating // deterministically, we expand a single seed to both using SHAKE256, @@ -38,6 +38,7 @@ import ( "github.com/cloudflare/circl/kem/kyber/kyber1024" "github.com/cloudflare/circl/kem/kyber/kyber512" "github.com/cloudflare/circl/kem/kyber/kyber768" + "github.com/cloudflare/circl/kem/mlkem/mlkem768" ) var ErrUninitialized = errors.New("public or private key not initialized") @@ -57,6 +58,10 @@ func Kyber1024X448() kem.Scheme { return kyber1024X } // Returns the hybrid KEM of Kyber768Draft00 and P-256. func P256Kyber768Draft00() kem.Scheme { return p256Kyber768Draft00 } +// Returns the hybrid KEM of ML-KEM-768 and X25519. +// https://www.ietf.org/archive/id/draft-kwiatkowski-tls-ecdhe-mlkem-01.html +func X25519MLKEM768() kem.Scheme { return xmlkem768 } + var p256Kyber768Draft00 kem.Scheme = &scheme{ "P256Kyber768Draft00", p256Kem, @@ -87,6 +92,12 @@ var kyber1024X kem.Scheme = &scheme{ kyber1024.Scheme(), } +var xmlkem768 kem.Scheme = &scheme{ + "X25519MLKEM768", + mlkem768.Scheme(), + x25519Kem, +} + // Public key of a hybrid KEM. type publicKey struct { scheme *scheme diff --git a/kem/schemes/schemes.go b/kem/schemes/schemes.go index da5f9839e..747d99e9d 100644 --- a/kem/schemes/schemes.go +++ b/kem/schemes/schemes.go @@ -49,6 +49,7 @@ var allSchemes = [...]kem.Scheme{ hybrid.Kyber768X448(), hybrid.Kyber1024X448(), hybrid.P256Kyber768Draft00(), + hybrid.X25519MLKEM768(), } var allSchemeNames map[string]kem.Scheme diff --git a/kem/schemes/schemes_test.go b/kem/schemes/schemes_test.go index be4c18a54..88a02f31b 100644 --- a/kem/schemes/schemes_test.go +++ b/kem/schemes/schemes_test.go @@ -163,4 +163,5 @@ func Example_schemes() { // Kyber768-X448 // Kyber1024-X448 // P256Kyber768Draft00 + // X25519MLKEM768 } From cfbc69684aff41a36e05a465732e1babd2bbc0df Mon Sep 17 00:00:00 2001 From: hrushikeshdeshpande <161167942+hrushikeshdeshpande@users.noreply.github.com> Date: Sun, 22 Sep 2024 12:51:10 -0400 Subject: [PATCH 10/45] Create semgrep.yml Creating Semgrep.yml file - Semgrep is a tool that will be used to scan Cloudflare's public repos for Supply chain, code and secrets. This work is part of Application & Product Security team's initiative to onboard Semgrep onto all of Cloudflare's public repos. In case of any questions, please reach out to "Hrushikesh Deshpande" on cf internal chat. --- .github/workflows/semgrep.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/semgrep.yml diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml new file mode 100644 index 000000000..b40314b36 --- /dev/null +++ b/.github/workflows/semgrep.yml @@ -0,0 +1,24 @@ +on: + pull_request: {} + workflow_dispatch: {} + push: + branches: + - main + - master + schedule: + - cron: '0 0 * * *' +name: Semgrep config +jobs: + semgrep: + name: semgrep/ci + runs-on: ubuntu-latest + env: + SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }} + SEMGREP_URL: https://cloudflare.semgrep.dev + SEMGREP_APP_URL: https://cloudflare.semgrep.dev + SEMGREP_VERSION_CHECK_URL: https://cloudflare.semgrep.dev/api/check-version + container: + image: returntocorp/semgrep + steps: + - uses: actions/checkout@v4 + - run: semgrep ci From 51a9a338e47f32e66a6503d368baef567878e0aa Mon Sep 17 00:00:00 2001 From: Hrushikesh Deshpande <161167942+hrushikeshdeshpande@users.noreply.github.com> Date: Wed, 25 Sep 2024 00:04:53 -0400 Subject: [PATCH 11/45] Update semgrep.yml --- .github/workflows/semgrep.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index b40314b36..4090692fe 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -18,7 +18,7 @@ jobs: SEMGREP_APP_URL: https://cloudflare.semgrep.dev SEMGREP_VERSION_CHECK_URL: https://cloudflare.semgrep.dev/api/check-version container: - image: returntocorp/semgrep + image: semgrep/semgrep steps: - uses: actions/checkout@v4 - run: semgrep ci From 704059282db1b0c7b8046bf03442207e63c2cd06 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 30 Sep 2024 16:19:57 -0700 Subject: [PATCH 12/45] Adding semgrepignore to also analyse test files. --- .github/workflows/semgrep.yml | 7 +++---- .semgrepignore | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 .semgrepignore diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index 4090692fe..2250f98de 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -1,13 +1,12 @@ on: pull_request: {} workflow_dispatch: {} - push: + push: branches: - main - - master schedule: - cron: '0 0 * * *' -name: Semgrep config +name: Semgrep jobs: semgrep: name: semgrep/ci @@ -21,4 +20,4 @@ jobs: image: semgrep/semgrep steps: - uses: actions/checkout@v4 - - run: semgrep ci + - run: semgrep ci --verbose diff --git a/.semgrepignore b/.semgrepignore new file mode 100644 index 000000000..bb0224d57 --- /dev/null +++ b/.semgrepignore @@ -0,0 +1 @@ +.github/ From 064a9ba6ab0851559e9af0498b7c08ae014e7cbb Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 7 Oct 2024 15:59:31 -0700 Subject: [PATCH 13/45] Bump to go1.22 inner files and ci jobs. --- .github/workflows/ci-actions.yml | 16 ++++++++-------- go.mod | 2 +- pke/kyber/internal/common/asm/go.mod | 6 +++--- pke/kyber/internal/common/asm/go.sum | 8 ++++---- sign/dilithium/internal/common/asm/go.mod | 6 +++--- sign/dilithium/internal/common/asm/go.sum | 8 ++++---- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index 0c024234b..a1105bf1c 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -13,14 +13,14 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - GOVER: ['1.22', '1.21'] + GOVER: ['1.23', '1.22'] steps: + - name: Checkout + uses: actions/checkout@v4 - name: Setup Go-${{ matrix.GOVER }} uses: actions/setup-go@v5 with: go-version: ${{ matrix.GOVER }} - - name: Checkout - uses: actions/checkout@v4 - name: Linting uses: golangci/golangci-lint-action@v4 with: @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - CFG: [[arm64, arm64v8, '1.22']] + CFG: [[arm64, arm64v8, '1.23']] steps: - uses: actions/checkout@v4 - name: Enabling Docker Experimental @@ -72,7 +72,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: '1.23' - name: Build as Static run: make circl_static - name: Build as Plugin @@ -88,7 +88,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: '1.23' - name: Produce Coverage run: go test -coverprofile=./coverage.txt ./... - name: Upload Codecov @@ -110,7 +110,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: '1.23' - name: Building run: go build -v ./... - name: Testing @@ -129,7 +129,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: '1.23' - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: diff --git a/go.mod b/go.mod index c58932dce..0340ede9f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/cloudflare/circl -go 1.21 +go 1.22.0 require ( github.com/bwesterb/go-ristretto v1.2.3 diff --git a/pke/kyber/internal/common/asm/go.mod b/pke/kyber/internal/common/asm/go.mod index ed620578f..12eece759 100644 --- a/pke/kyber/internal/common/asm/go.mod +++ b/pke/kyber/internal/common/asm/go.mod @@ -1,15 +1,15 @@ module github.com/cloudflare/circl/pke/kyber/internal/common/asm -go 1.21 +go 1.22.0 require ( - github.com/cloudflare/circl v1.3.7 + github.com/cloudflare/circl v1.4.0 github.com/mmcloughlin/avo v0.6.0 ) require ( golang.org/x/mod v0.14.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.16.1 // indirect ) replace github.com/cloudflare/circl => ../../../../../ diff --git a/pke/kyber/internal/common/asm/go.sum b/pke/kyber/internal/common/asm/go.sum index d9b5c0cf9..483bba883 100644 --- a/pke/kyber/internal/common/asm/go.sum +++ b/pke/kyber/internal/common/asm/go.sum @@ -2,7 +2,7 @@ github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= diff --git a/sign/dilithium/internal/common/asm/go.mod b/sign/dilithium/internal/common/asm/go.mod index 5638957e6..3f9a8a6d3 100644 --- a/sign/dilithium/internal/common/asm/go.mod +++ b/sign/dilithium/internal/common/asm/go.mod @@ -1,15 +1,15 @@ module github.com/cloudflare/circl/sign/dilithium/internal/common/asm -go 1.21 +go 1.22.0 require ( - github.com/cloudflare/circl v1.3.7 + github.com/cloudflare/circl v1.4.0 github.com/mmcloughlin/avo v0.6.0 ) require ( golang.org/x/mod v0.14.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.16.1 // indirect ) replace github.com/cloudflare/circl => ../../../../../ diff --git a/sign/dilithium/internal/common/asm/go.sum b/sign/dilithium/internal/common/asm/go.sum index d9b5c0cf9..483bba883 100644 --- a/sign/dilithium/internal/common/asm/go.sum +++ b/sign/dilithium/internal/common/asm/go.sum @@ -2,7 +2,7 @@ github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= From ab15f8201026876da5d9ac14d54c2f6634683d07 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 30 Sep 2024 16:25:12 -0700 Subject: [PATCH 14/45] Updates golangci-lint to v1.61.0 and fixes code. --- .github/workflows/ci-actions.yml | 6 +++--- .etc/golangci.yml => .golangci.yaml | 13 ++++++++----- abe/cpabe/tkn20/internal/dsl/lexer.go | 3 ++- group/group_test.go | 1 - group/hash_test.go | 1 - internal/test/test.go | 2 +- kem/frodo/kat_test.go | 1 - kem/kyber/kat_test.go | 1 - kem/schemes/schemes_test.go | 4 ---- math/wnaf_test.go | 2 -- oprf/vectors_test.go | 2 +- pke/kyber/internal/common/poly_test.go | 2 -- pki/pki_test.go | 1 - sign/ed448/ed448.go | 2 +- sign/schemes/schemes_test.go | 4 ---- 15 files changed, 16 insertions(+), 29 deletions(-) rename .etc/golangci.yml => .golangci.yaml (89%) diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index a1105bf1c..88869975d 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -22,10 +22,10 @@ jobs: with: go-version: ${{ matrix.GOVER }} - name: Linting - uses: golangci/golangci-lint-action@v4 + uses: golangci/golangci-lint-action@v6 with: - version: v1.56.2 - args: --config=./.etc/golangci.yml ./... + version: v1.61.0 + install-mode: goinstall - name: Check shadowing run: | go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest diff --git a/.etc/golangci.yml b/.golangci.yaml similarity index 89% rename from .etc/golangci.yml rename to .golangci.yaml index 386ef2781..064024654 100644 --- a/.etc/golangci.yml +++ b/.golangci.yaml @@ -12,11 +12,12 @@ linters: # - structcheck (deprecated since v1.49.0) # - varcheck (deprecated since v1.49.0) # - deadcode (deprecated since v1.49.0) + # - exportloopref (deprecated since v1.60.2) - bodyclose + - copyloopvar - depguard - dogsled - errcheck - - exportloopref - forbidigo - funlen - goconst @@ -56,15 +57,17 @@ linters-settings: goconst: min-occurrences: 4 govet: - check-shadowing: true + enable-all: true + disable: + - fieldalignment staticcheck: # TODO: replace deprecated elliptic.Marshal, elliptic.GenerateKey, # elliptic.Unmarshal, params.ScalarBaseMult before re-enabling SA1019. checks: ["*", "-SA1019"] + gosec: + excludes: + - G115 issues: max-issues-per-linter: 0 max-same-issues: 0 - -output: - format: github-actions diff --git a/abe/cpabe/tkn20/internal/dsl/lexer.go b/abe/cpabe/tkn20/internal/dsl/lexer.go index 43c19d97f..be648ef7a 100644 --- a/abe/cpabe/tkn20/internal/dsl/lexer.go +++ b/abe/cpabe/tkn20/internal/dsl/lexer.go @@ -1,6 +1,7 @@ package dsl import ( + "errors" "fmt" "strings" ) @@ -58,7 +59,7 @@ func (l *Lexer) scanTokens() error { } l.addToken(EOF) if l.hadError { - return fmt.Errorf(strings.TrimSpace(errMsg)) + return errors.New(strings.TrimSpace(errMsg)) } return nil } diff --git a/group/group_test.go b/group/group_test.go index ee7e25059..b48cd507c 100644 --- a/group/group_test.go +++ b/group/group_test.go @@ -20,7 +20,6 @@ var allGroups = []group.Group{ func TestGroup(t *testing.T) { const testTimes = 1 << 7 for _, g := range allGroups { - g := g n := g.(fmt.Stringer).String() t.Run(n+"/Add", func(tt *testing.T) { testAdd(tt, testTimes, g) }) t.Run(n+"/Neg", func(tt *testing.T) { testNeg(tt, testTimes, g) }) diff --git a/group/hash_test.go b/group/hash_test.go index 51b44ad78..1e784e9ef 100644 --- a/group/hash_test.go +++ b/group/hash_test.go @@ -115,7 +115,6 @@ type vector struct { func BenchmarkHash(b *testing.B) { for _, g := range allGroups { - g := g name := g.(fmt.Stringer).String() b.Run(name+"/HashToElement", func(b *testing.B) { for i := 0; i < b.N; i++ { diff --git a/internal/test/test.go b/internal/test/test.go index 576211a9f..9ba73dd74 100644 --- a/internal/test/test.go +++ b/internal/test/test.go @@ -16,7 +16,7 @@ func ReportError(t testing.TB, got, want interface{}, inputs ...interface{}) { } fmt.Fprintf(b, "got: %v\nwant: %v", got, want) t.Helper() - t.Fatalf(b.String()) + t.Fatal(b.String()) } // CheckOk fails the test if result == false. diff --git a/kem/frodo/kat_test.go b/kem/frodo/kat_test.go index 61b0aae25..c4694c8d3 100644 --- a/kem/frodo/kat_test.go +++ b/kem/frodo/kat_test.go @@ -23,7 +23,6 @@ func TestPQCgenKATKem(t *testing.T) { {"FrodoKEM-640-SHAKE", "604a10cfc871dfaed9cb5b057c644ab03b16852cea7f39bc7f9831513b5b1cfa"}, } for _, kat := range kats { - kat := kat t.Run(kat.name, func(t *testing.T) { testPQCgenKATKem(t, kat.name, kat.want) }) diff --git a/kem/kyber/kat_test.go b/kem/kyber/kat_test.go index 5b6d39e86..08726cd79 100644 --- a/kem/kyber/kat_test.go +++ b/kem/kyber/kat_test.go @@ -31,7 +31,6 @@ func TestPQCgenKATKem(t *testing.T) { {"ML-KEM-1024", "3fba7327d0320cb6134badf2a1bcb963a5b3c0026c7dece8f00d6a6155e47b33"}, } for _, kat := range kats { - kat := kat t.Run(kat.name, func(t *testing.T) { testPQCgenKATKem(t, kat.name, kat.want) }) diff --git a/kem/schemes/schemes_test.go b/kem/schemes/schemes_test.go index 88a02f31b..d9caf70a9 100644 --- a/kem/schemes/schemes_test.go +++ b/kem/schemes/schemes_test.go @@ -17,7 +17,6 @@ func TestCaseSensitivity(t *testing.T) { func BenchmarkGenerateKeyPair(b *testing.B) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme b.Run(scheme.Name(), func(b *testing.B) { for i := 0; i < b.N; i++ { _, _, _ = scheme.GenerateKeyPair() @@ -29,7 +28,6 @@ func BenchmarkGenerateKeyPair(b *testing.B) { func BenchmarkEncapsulate(b *testing.B) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme pk, _, _ := scheme.GenerateKeyPair() b.Run(scheme.Name(), func(b *testing.B) { for i := 0; i < b.N; i++ { @@ -42,7 +40,6 @@ func BenchmarkEncapsulate(b *testing.B) { func BenchmarkDecapsulate(b *testing.B) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme pk, sk, _ := scheme.GenerateKeyPair() ct, _, _ := scheme.Encapsulate(pk) b.Run(scheme.Name(), func(b *testing.B) { @@ -56,7 +53,6 @@ func BenchmarkDecapsulate(b *testing.B) { func TestApi(t *testing.T) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme t.Run(scheme.Name(), func(t *testing.T) { if scheme == nil { t.Fatal() diff --git a/math/wnaf_test.go b/math/wnaf_test.go index d397b0640..ad33d20b6 100644 --- a/math/wnaf_test.go +++ b/math/wnaf_test.go @@ -63,7 +63,6 @@ func BenchmarkOmegaNAF(b *testing.B) { Two128.Lsh(Two128, 128) for w := uint(2); w < 6; w++ { - w := w // pin variable b.Run(fmt.Sprintf("%v", w), func(b *testing.B) { x, _ := rand.Int(rand.Reader, Two128) b.ResetTimer() @@ -79,7 +78,6 @@ func BenchmarkOmegaNAFRegular(b *testing.B) { Two128.Lsh(Two128, 128) for w := uint(2); w < 6; w++ { - w := w // pin variable b.Run(fmt.Sprintf("%v", w), func(b *testing.B) { x, _ := rand.Int(rand.Reader, Two128) x.SetBit(x, 0, uint(1)) // odd-numbers diff --git a/oprf/vectors_test.go b/oprf/vectors_test.go index 774dc50fa..2293049e8 100644 --- a/oprf/vectors_test.go +++ b/oprf/vectors_test.go @@ -245,7 +245,7 @@ func TestVectors(t *testing.T) { for i := range v { suite, err := GetSuite(v[i].Identifier) if err != nil { - t.Logf(v[i].Identifier + " not supported yet") + t.Log(v[i].Identifier + " not supported yet") continue } t.Run(fmt.Sprintf("%v/Mode%v", suite, v[i].Mode), v[i].test) diff --git a/pke/kyber/internal/common/poly_test.go b/pke/kyber/internal/common/poly_test.go index 350bef961..cc305d730 100644 --- a/pke/kyber/internal/common/poly_test.go +++ b/pke/kyber/internal/common/poly_test.go @@ -44,7 +44,6 @@ func TestDecompressMessage(t *testing.T) { func TestCompress(t *testing.T) { for _, d := range []int{4, 5, 10, 11} { - d := d t.Run(fmt.Sprintf("d=%d", d), func(t *testing.T) { var p, q Poly bound := (Q + (1 << uint(d))) >> uint(d+1) @@ -351,7 +350,6 @@ func (p *Poly) OldCompressTo(m []byte, d int) { func TestCompressFullInputFirstCoeff(t *testing.T) { for _, d := range []int{4, 5, 10, 11} { - d := d t.Run(fmt.Sprintf("d=%d", d), func(t *testing.T) { var p, q Poly bound := (Q + (1 << uint(d))) >> uint(d+1) diff --git a/pki/pki_test.go b/pki/pki_test.go index 7412dd0ae..64b43759d 100644 --- a/pki/pki_test.go +++ b/pki/pki_test.go @@ -9,7 +9,6 @@ import ( func TestPEM(t *testing.T) { for _, scheme := range schemes.All() { - scheme := scheme t.Run(scheme.Name(), func(t *testing.T) { if scheme == nil { t.Fatal() diff --git a/sign/ed448/ed448.go b/sign/ed448/ed448.go index 324bd8f33..c368b181b 100644 --- a/sign/ed448/ed448.go +++ b/sign/ed448/ed448.go @@ -206,7 +206,7 @@ func newKeyFromSeed(privateKey, seed []byte) { func signAll(signature []byte, privateKey PrivateKey, message, ctx []byte, preHash bool) { if len(ctx) > ContextMaxSize { - panic(fmt.Errorf("ed448: bad context length: " + strconv.Itoa(len(ctx)))) + panic(fmt.Errorf("ed448: bad context length: %v", len(ctx))) } H := sha3.NewShake256() diff --git a/sign/schemes/schemes_test.go b/sign/schemes/schemes_test.go index 2d8e86512..dfa044d78 100644 --- a/sign/schemes/schemes_test.go +++ b/sign/schemes/schemes_test.go @@ -17,7 +17,6 @@ func TestCaseSensitivity(t *testing.T) { func TestApi(t *testing.T) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme t.Run(scheme.Name(), func(t *testing.T) { if scheme == nil { t.Fatal() @@ -122,7 +121,6 @@ func Example() { func BenchmarkGenerateKeyPair(b *testing.B) { allSchemes := schemes.All() for _, scheme := range allSchemes { - scheme := scheme b.Run(scheme.Name(), func(b *testing.B) { for i := 0; i < b.N; i++ { _, _, _ = scheme.GenerateKey() @@ -136,7 +134,6 @@ func BenchmarkSign(b *testing.B) { opts := &sign.SignatureOpts{} for _, scheme := range allSchemes { msg := []byte(fmt.Sprintf("Signing with %s", scheme.Name())) - scheme := scheme _, sk, _ := scheme.GenerateKey() b.Run(scheme.Name(), func(b *testing.B) { for i := 0; i < b.N; i++ { @@ -151,7 +148,6 @@ func BenchmarkVerify(b *testing.B) { opts := &sign.SignatureOpts{} for _, scheme := range allSchemes { msg := []byte(fmt.Sprintf("Signing with %s", scheme.Name())) - scheme := scheme pk, sk, _ := scheme.GenerateKey() sig := scheme.Sign(sk, msg, opts) b.Run(scheme.Name(), func(b *testing.B) { From 2ba992f251cc4d652ce08b2ed0d4c48312b74a09 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 7 Oct 2024 16:47:11 -0700 Subject: [PATCH 15/45] Reverting arm64 jobs since qemu can't run go1.23 binaries yet. See: https://github.com/golang/go/issues/69259 --- .github/workflows/ci-actions.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index 88869975d..fd10e7b4f 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - CFG: [[arm64, arm64v8, '1.23']] + CFG: [[arm64, arm64v8, '1.22']] steps: - uses: actions/checkout@v4 - name: Enabling Docker Experimental @@ -61,7 +61,7 @@ jobs: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - name: Testing run: | - docker run --rm -v `pwd`:`pwd` -w `pwd` ${{matrix.CFG[1]}}/golang:${{matrix.CFG[2]}} go test -v ./... + docker run --rm --platform linux/${{matrix.CFG[0]}} -v `pwd`:`pwd` -w `pwd` ${{matrix.CFG[1]}}/golang:${{matrix.CFG[2]}} go test -v ./... build_modes: needs: [amd64_job] runs-on: ubuntu-22.04 From e2bbd01edd1048d523563c9471e847b5b42b68ee Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Wed, 9 Oct 2024 04:07:09 +0100 Subject: [PATCH 16/45] Add ML-DSA (FIPS204) (#480) Add ML-DSA (FIPS204) The final version of FIPS204 has released. Changes: * Update to final FIPS 204 standard. * Remove old mode API and hook Dilithium and ML-DSA into generic signature API. * Expose support for randomized ML-DSA mode. (It is not exposed in the generic signature API.) * Remove old AES variants of Dilithium. * ML-DSA test against reference implementation. * Fix one bug in key derivation. * dilithium: remove unused AES code * mldsa: add ACVP test vectors * Remove superfluous space * Update ml-dsa documentation * Remove dead code * Avoid to export unsafeSignInternal. * Update command for golangci-lint. --- Makefile | 4 +- README.md | 1 + sign/dilithium/dilithium.go | 102 +---- sign/dilithium/dilithium_test.go | 31 +- sign/dilithium/example_test.go | 56 --- sign/dilithium/gen.go | 138 +++--- sign/dilithium/internal/common/aes.go | 46 -- sign/dilithium/kat_test.go | 51 ++- sign/dilithium/mode2.go | 90 ---- sign/dilithium/mode2/dilithium.go | 138 +++++- sign/dilithium/mode2/internal/dilithium.go | 58 ++- .../mode2/internal/dilithium_test.go | 48 +- sign/dilithium/mode2/internal/mat.go | 2 +- sign/dilithium/mode2/internal/pack.go | 2 +- sign/dilithium/mode2/internal/pack_test.go | 2 +- sign/dilithium/mode2/internal/params.go | 4 +- sign/dilithium/mode2/internal/params_test.go | 2 +- sign/dilithium/mode2/internal/rounding.go | 2 +- .../dilithium/mode2/internal/rounding_test.go | 2 +- sign/dilithium/mode2/internal/sample.go | 103 ++--- sign/dilithium/mode2/internal/sample_test.go | 144 ++---- sign/dilithium/mode2/internal/vec.go | 2 +- sign/dilithium/mode2aes.go | 90 ---- sign/dilithium/mode2aes/dilithium.go | 181 -------- .../mode2aes/internal/params_test.go | 99 ----- .../mode2aes/internal/sample_test.go | 266 ----------- sign/dilithium/mode3.go | 90 ---- sign/dilithium/mode3/dilithium.go | 138 +++++- sign/dilithium/mode3/internal/dilithium.go | 58 ++- .../mode3/internal/dilithium_test.go | 48 +- sign/dilithium/mode3/internal/mat.go | 2 +- sign/dilithium/mode3/internal/pack.go | 2 +- sign/dilithium/mode3/internal/pack_test.go | 2 +- sign/dilithium/mode3/internal/params.go | 4 +- sign/dilithium/mode3/internal/params_test.go | 2 +- sign/dilithium/mode3/internal/rounding.go | 2 +- .../dilithium/mode3/internal/rounding_test.go | 2 +- sign/dilithium/mode3/internal/sample.go | 103 ++--- sign/dilithium/mode3/internal/sample_test.go | 144 ++---- sign/dilithium/mode3/internal/vec.go | 2 +- sign/dilithium/mode3aes.go | 90 ---- sign/dilithium/mode3aes/dilithium.go | 181 -------- .../mode3aes/internal/params_test.go | 101 ----- .../mode3aes/internal/sample_test.go | 266 ----------- sign/dilithium/mode5.go | 90 ---- sign/dilithium/mode5/dilithium.go | 138 +++++- sign/dilithium/mode5/internal/dilithium.go | 58 ++- .../mode5/internal/dilithium_test.go | 48 +- sign/dilithium/mode5/internal/mat.go | 2 +- sign/dilithium/mode5/internal/pack.go | 2 +- sign/dilithium/mode5/internal/pack_test.go | 2 +- sign/dilithium/mode5/internal/params.go | 4 +- sign/dilithium/mode5/internal/params_test.go | 2 +- sign/dilithium/mode5/internal/rounding.go | 2 +- .../dilithium/mode5/internal/rounding_test.go | 2 +- sign/dilithium/mode5/internal/sample.go | 103 ++--- sign/dilithium/mode5/internal/sample_test.go | 144 ++---- sign/dilithium/mode5/internal/vec.go | 2 +- sign/dilithium/mode5aes.go | 90 ---- sign/dilithium/mode5aes/dilithium.go | 181 -------- .../mode5aes/internal/params_test.go | 100 ----- .../mode5aes/internal/sample_test.go | 266 ----------- sign/dilithium/templates/acvp.templ.go | 266 +++++++++++ sign/dilithium/templates/mode.templ.go | 94 ---- sign/dilithium/templates/modePkg.templ.go | 185 -------- sign/dilithium/templates/params.templ.go | 4 +- sign/dilithium/templates/pkg.templ.go | 416 ++++++++++++++++++ .../common => internal/dilithium}/amd64.go | 2 +- .../common => internal/dilithium}/amd64.s | 0 .../common => internal/dilithium}/asm/go.mod | 4 +- .../common => internal/dilithium}/asm/go.sum | 0 .../common => internal/dilithium}/asm/src.go | 4 +- .../common => internal/dilithium}/field.go | 2 +- .../dilithium}/field_test.go | 2 +- .../common => internal/dilithium}/generic.go | 2 +- .../common => internal/dilithium}/ntt.go | 2 +- .../common => internal/dilithium}/ntt_test.go | 2 +- .../common => internal/dilithium}/pack.go | 2 +- .../dilithium}/pack_test.go | 2 +- .../common => internal/dilithium}/params.go | 4 +- .../dilithium}/params/params.go | 0 .../common => internal/dilithium}/poly.go | 2 +- .../dilithium}/poly_test.go | 2 +- .../dilithium}/stubs_amd64.go | 4 +- sign/mldsa/doc.go | 12 + sign/mldsa/mldsa44/acvp_test.go | 262 +++++++++++ sign/mldsa/mldsa44/dilithium.go | 346 +++++++++++++++ .../mldsa44}/internal/dilithium.go | 58 ++- .../mldsa44}/internal/dilithium_test.go | 48 +- .../mldsa44}/internal/mat.go | 2 +- .../mldsa44}/internal/pack.go | 2 +- .../mldsa44}/internal/pack_test.go | 2 +- .../mldsa44}/internal/params.go | 6 +- .../mldsa44}/internal/rounding.go | 2 +- .../mldsa44}/internal/rounding_test.go | 2 +- .../mldsa44}/internal/sample.go | 103 ++--- sign/mldsa/mldsa44/internal/sample_test.go | 218 +++++++++ .../mldsa44}/internal/vec.go | 2 +- sign/mldsa/mldsa65/acvp_test.go | 262 +++++++++++ sign/mldsa/mldsa65/dilithium.go | 346 +++++++++++++++ .../mldsa65}/internal/dilithium.go | 58 ++- .../mldsa65}/internal/dilithium_test.go | 48 +- .../mldsa65}/internal/mat.go | 2 +- .../mldsa65}/internal/pack.go | 2 +- .../mldsa65}/internal/pack_test.go | 2 +- .../mldsa65}/internal/params.go | 6 +- .../mldsa65}/internal/rounding.go | 2 +- .../mldsa65}/internal/rounding_test.go | 2 +- .../mldsa65}/internal/sample.go | 103 ++--- sign/mldsa/mldsa65/internal/sample_test.go | 218 +++++++++ .../mldsa65}/internal/vec.go | 2 +- sign/mldsa/mldsa87/acvp_test.go | 262 +++++++++++ sign/mldsa/mldsa87/dilithium.go | 346 +++++++++++++++ .../mldsa87}/internal/dilithium.go | 58 ++- .../mldsa87}/internal/dilithium_test.go | 48 +- .../mldsa87}/internal/mat.go | 2 +- .../mldsa87}/internal/pack.go | 2 +- .../mldsa87}/internal/pack_test.go | 2 +- .../mldsa87}/internal/params.go | 6 +- .../mldsa87}/internal/rounding.go | 2 +- .../mldsa87}/internal/rounding_test.go | 2 +- .../mldsa87}/internal/sample.go | 103 ++--- sign/mldsa/mldsa87/internal/sample_test.go | 218 +++++++++ .../mldsa87}/internal/vec.go | 2 +- .../expectedResults.json.gz | Bin 0 -> 488247 bytes .../ML-DSA-keyGen-FIPS204/prompt.json.gz | Bin 0 -> 3503 bytes .../expectedResults.json.gz | Bin 0 -> 236767 bytes .../ML-DSA-sigGen-FIPS204/prompt.json.gz | Bin 0 -> 538935 bytes .../expectedResults.json.gz | Bin 0 -> 355 bytes .../ML-DSA-sigVer-FIPS204/prompt.json.gz | Bin 0 -> 191328 bytes sign/schemes/schemes.go | 13 + sign/schemes/schemes_test.go | 6 + sign/sign.go | 3 + 133 files changed, 4557 insertions(+), 3774 deletions(-) delete mode 100644 sign/dilithium/example_test.go delete mode 100644 sign/dilithium/internal/common/aes.go delete mode 100644 sign/dilithium/mode2.go delete mode 100644 sign/dilithium/mode2aes.go delete mode 100644 sign/dilithium/mode2aes/dilithium.go delete mode 100644 sign/dilithium/mode2aes/internal/params_test.go delete mode 100644 sign/dilithium/mode2aes/internal/sample_test.go delete mode 100644 sign/dilithium/mode3.go delete mode 100644 sign/dilithium/mode3aes.go delete mode 100644 sign/dilithium/mode3aes/dilithium.go delete mode 100644 sign/dilithium/mode3aes/internal/params_test.go delete mode 100644 sign/dilithium/mode3aes/internal/sample_test.go delete mode 100644 sign/dilithium/mode5.go delete mode 100644 sign/dilithium/mode5aes.go delete mode 100644 sign/dilithium/mode5aes/dilithium.go delete mode 100644 sign/dilithium/mode5aes/internal/params_test.go delete mode 100644 sign/dilithium/mode5aes/internal/sample_test.go create mode 100644 sign/dilithium/templates/acvp.templ.go delete mode 100644 sign/dilithium/templates/mode.templ.go delete mode 100644 sign/dilithium/templates/modePkg.templ.go create mode 100644 sign/dilithium/templates/pkg.templ.go rename sign/{dilithium/internal/common => internal/dilithium}/amd64.go (99%) rename sign/{dilithium/internal/common => internal/dilithium}/amd64.s (100%) rename sign/{dilithium/internal/common => internal/dilithium}/asm/go.mod (59%) rename sign/{dilithium/internal/common => internal/dilithium}/asm/go.sum (100%) rename sign/{dilithium/internal/common => internal/dilithium}/asm/src.go (99%) rename sign/{dilithium/internal/common => internal/dilithium}/field.go (98%) rename sign/{dilithium/internal/common => internal/dilithium}/field_test.go (98%) rename sign/{dilithium/internal/common => internal/dilithium}/generic.go (99%) rename sign/{dilithium/internal/common => internal/dilithium}/ntt.go (99%) rename sign/{dilithium/internal/common => internal/dilithium}/ntt_test.go (98%) rename sign/{dilithium/internal/common => internal/dilithium}/pack.go (99%) rename sign/{dilithium/internal/common => internal/dilithium}/pack_test.go (96%) rename sign/{dilithium/internal/common => internal/dilithium}/params.go (79%) rename sign/{dilithium/internal/common => internal/dilithium}/params/params.go (100%) rename sign/{dilithium/internal/common => internal/dilithium}/poly.go (99%) rename sign/{dilithium/internal/common => internal/dilithium}/poly_test.go (99%) rename sign/{dilithium/internal/common => internal/dilithium}/stubs_amd64.go (91%) create mode 100644 sign/mldsa/doc.go create mode 100644 sign/mldsa/mldsa44/acvp_test.go create mode 100644 sign/mldsa/mldsa44/dilithium.go rename sign/{dilithium/mode3aes => mldsa/mldsa44}/internal/dilithium.go (89%) rename sign/{dilithium/mode5aes => mldsa/mldsa44}/internal/dilithium_test.go (77%) rename sign/{dilithium/mode5aes => mldsa/mldsa44}/internal/mat.go (95%) rename sign/{dilithium/mode5aes => mldsa/mldsa44}/internal/pack.go (99%) rename sign/{dilithium/mode3aes => mldsa/mldsa44}/internal/pack_test.go (96%) rename sign/{dilithium/mode2aes => mldsa/mldsa44}/internal/params.go (72%) rename sign/{dilithium/mode5aes => mldsa/mldsa44}/internal/rounding.go (98%) rename sign/{dilithium/mode5aes => mldsa/mldsa44}/internal/rounding_test.go (96%) rename sign/{dilithium/mode3aes => mldsa/mldsa44}/internal/sample.go (81%) create mode 100644 sign/mldsa/mldsa44/internal/sample_test.go rename sign/{dilithium/mode2aes => mldsa/mldsa44}/internal/vec.go (99%) create mode 100644 sign/mldsa/mldsa65/acvp_test.go create mode 100644 sign/mldsa/mldsa65/dilithium.go rename sign/{dilithium/mode2aes => mldsa/mldsa65}/internal/dilithium.go (89%) rename sign/{dilithium/mode3aes => mldsa/mldsa65}/internal/dilithium_test.go (77%) rename sign/{dilithium/mode2aes => mldsa/mldsa65}/internal/mat.go (95%) rename sign/{dilithium/mode3aes => mldsa/mldsa65}/internal/pack.go (99%) rename sign/{dilithium/mode5aes => mldsa/mldsa65}/internal/pack_test.go (96%) rename sign/{dilithium/mode3aes => mldsa/mldsa65}/internal/params.go (72%) rename sign/{dilithium/mode2aes => mldsa/mldsa65}/internal/rounding.go (98%) rename sign/{dilithium/mode3aes => mldsa/mldsa65}/internal/rounding_test.go (96%) rename sign/{dilithium/mode5aes => mldsa/mldsa65}/internal/sample.go (81%) create mode 100644 sign/mldsa/mldsa65/internal/sample_test.go rename sign/{dilithium/mode5aes => mldsa/mldsa65}/internal/vec.go (99%) create mode 100644 sign/mldsa/mldsa87/acvp_test.go create mode 100644 sign/mldsa/mldsa87/dilithium.go rename sign/{dilithium/mode5aes => mldsa/mldsa87}/internal/dilithium.go (89%) rename sign/{dilithium/mode2aes => mldsa/mldsa87}/internal/dilithium_test.go (77%) rename sign/{dilithium/mode3aes => mldsa/mldsa87}/internal/mat.go (95%) rename sign/{dilithium/mode2aes => mldsa/mldsa87}/internal/pack.go (99%) rename sign/{dilithium/mode2aes => mldsa/mldsa87}/internal/pack_test.go (96%) rename sign/{dilithium/mode5aes => mldsa/mldsa87}/internal/params.go (72%) rename sign/{dilithium/mode3aes => mldsa/mldsa87}/internal/rounding.go (98%) rename sign/{dilithium/mode2aes => mldsa/mldsa87}/internal/rounding_test.go (96%) rename sign/{dilithium/mode2aes => mldsa/mldsa87}/internal/sample.go (81%) create mode 100644 sign/mldsa/mldsa87/internal/sample_test.go rename sign/{dilithium/mode3aes => mldsa/mldsa87}/internal/vec.go (99%) create mode 100644 sign/mldsa/testdata/ML-DSA-keyGen-FIPS204/expectedResults.json.gz create mode 100644 sign/mldsa/testdata/ML-DSA-keyGen-FIPS204/prompt.json.gz create mode 100644 sign/mldsa/testdata/ML-DSA-sigGen-FIPS204/expectedResults.json.gz create mode 100644 sign/mldsa/testdata/ML-DSA-sigGen-FIPS204/prompt.json.gz create mode 100644 sign/mldsa/testdata/ML-DSA-sigVer-FIPS204/expectedResults.json.gz create mode 100644 sign/mldsa/testdata/ML-DSA-sigVer-FIPS204/prompt.json.gz diff --git a/Makefile b/Makefile index f7dd5e0bb..1117d0471 100644 --- a/Makefile +++ b/Makefile @@ -26,10 +26,10 @@ endif all: build lint: - $(GOLANGCILINT) run --config $(ETC_DIR)/golangci.yml ./... + $(GOLANGCILINT) run lint-fix: - $(GOLANGCILINT) run --config $(ETC_DIR)/golangci.yml --fix ./... + $(GOLANGCILINT) run --fix build: $(GO) build ./... diff --git a/README.md b/README.md index a4fd64f95..271a7d67c 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ Alternatively, look at the [Cloudflare Go](https://github.com/cloudflare/go/tree |:---:| - [Dilithium](./sign/dilithium): modes 2, 3, 5 ([Dilithium](https://pq-crystals.org/dilithium/)). + - [ML-DSA](./sign/mldsa): modes 44, 65, 87 ([FIPS 204](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf)). ### Zero-knowledge Proofs diff --git a/sign/dilithium/dilithium.go b/sign/dilithium/dilithium.go index 2a4b61b28..2814f34d5 100644 --- a/sign/dilithium/dilithium.go +++ b/sign/dilithium/dilithium.go @@ -1,111 +1,31 @@ //go:generate go run gen.go -// dilithium implements the CRYSTALS-Dilithium signature schemes +// Deprecated. This package implements Dilithium, an early proposal +// for what is now ML-DSA (FIPS 204). An implementation of ML-DSA +// can be found in sign/mldsa. +// +// Dilithium implements the CRYSTALS-Dilithium signature schemes // as submitted to round3 of the NIST PQC competition and described in // // https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf // -// Each of the eight different modes of Dilithium is implemented by a +// Each of the three different modes of Dilithium is implemented by a // subpackage. For instance, Dilithium2 (the recommended mode) // can be found in // // github.com/cloudflare/circl/sign/dilithium/mode2 // // If your choice for mode is fixed compile-time, use the subpackages. -// This package provides a convenient wrapper around all of the subpackages -// so one can be chosen at runtime. +// To choose a scheme at runtime, use the generic signatures API under +// +// github.com/cloudflare/circl/sign/schemes // -// The authors of Dilithium recommend to combine it with a "pre-quantum" -// signature scheme. The packages +// The packages // // github.com/cloudflare/circl/sign/eddilithium2 // github.com/cloudflare/circl/sign/eddilithium3 // -// implement such hybrids of Dilithium2 with Ed25519 respectively and +// implement hybrids of Dilithium2 with Ed25519 respectively and // Dilithium3 with Ed448. These packages are a drop in replacements for the // mode subpackages of this package. package dilithium - -import ( - "crypto" - "io" -) - -// PublicKey is a Dilithium public key. -// -// The structure contains values precomputed during unpacking/key generation -// and is therefore significantly larger than a packed public key. -type PublicKey interface { - // Packs public key - Bytes() []byte -} - -// PrivateKey is a Dilithium private key. -// -// The structure contains values precomputed during unpacking/key generation -// and is therefore significantly larger than a packed private key. -type PrivateKey interface { - // Packs private key - Bytes() []byte - - crypto.Signer -} - -// Mode is a certain configuration of the Dilithium signature scheme. -type Mode interface { - // GenerateKey generates a public/private key pair using entropy from rand. - // If rand is nil, crypto/rand.Reader will be used. - GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) - - // NewKeyFromSeed derives a public/private key pair using the given seed. - // Panics if len(seed) != SeedSize() - NewKeyFromSeed(seed []byte) (PublicKey, PrivateKey) - - // Sign signs the given message and returns the signature. - // It will panic if sk has not been generated for this mode. - Sign(sk PrivateKey, msg []byte) []byte - - // Verify checks whether the given signature by pk on msg is valid. - // It will panic if pk is of the wrong mode. - Verify(pk PublicKey, msg []byte, signature []byte) bool - - // Unpacks a public key. Panics if the buffer is not of PublicKeySize() - // length. Precomputes values to speed up subsequent calls to Verify. - PublicKeyFromBytes([]byte) PublicKey - - // Unpacks a private key. Panics if the buffer is not - // of PrivateKeySize() length. Precomputes values to speed up subsequent - // calls to Sign(To). - PrivateKeyFromBytes([]byte) PrivateKey - - // SeedSize returns the size of the seed for NewKeyFromSeed - SeedSize() int - - // PublicKeySize returns the size of a packed PublicKey - PublicKeySize() int - - // PrivateKeySize returns the size of a packed PrivateKey - PrivateKeySize() int - - // SignatureSize returns the size of a signature - SignatureSize() int - - // Name returns the name of this mode - Name() string -} - -var modes = make(map[string]Mode) - -// ModeNames returns the list of supported modes. -func ModeNames() []string { - names := []string{} - for name := range modes { - names = append(names, name) - } - return names -} - -// ModeByName returns the mode with the given name or nil when not supported. -func ModeByName(name string) Mode { - return modes[name] -} diff --git a/sign/dilithium/dilithium_test.go b/sign/dilithium/dilithium_test.go index 59ba804a6..25e11dfec 100644 --- a/sign/dilithium/dilithium_test.go +++ b/sign/dilithium/dilithium_test.go @@ -4,6 +4,8 @@ import ( "encoding/hex" "testing" + "github.com/cloudflare/circl/sign/schemes" + "github.com/cloudflare/circl/internal/sha3" ) @@ -34,29 +36,26 @@ func TestNewKeyFromSeed(t *testing.T) { "Dilithium5", "3956d812a7961af6e5dad16af15c736c", "665388291aa01e12e7f94bdc7769db18", }, - { - "Dilithium2-AES", "8466a752b0a09e63e42f66d3174a6471", - "c3f8e705a0d8dfd489b98b205670f393", - }, - { - "Dilithium3-AES", "2bb713ba7cb15f3ebf05c4c1fbb1b03c", - "eb2bd8d98630835a3b18594ac436368b", - }, - { - "Dilithium5-AES", "a613a08b564ee8717ba4f5ccfddc2693", - "2f541bf6fedd12854d06a6b80090932a", - }, } { t.Run(tc.name, func(t *testing.T) { - mode := ModeByName(tc.name) + mode := schemes.ByName(tc.name) if mode == nil { t.Fatal() } var seed [32]byte - pk, sk := mode.NewKeyFromSeed(seed[:]) + pk, sk := mode.DeriveKey(seed[:]) + + ppk, err := pk.MarshalBinary() + if err != nil { + t.Fatal(err) + } + psk, err := sk.MarshalBinary() + if err != nil { + t.Fatal(err) + } - pkh := hexHash(pk.Bytes()) - skh := hexHash(sk.Bytes()) + pkh := hexHash(ppk) + skh := hexHash(psk) if pkh != tc.epk { t.Fatalf("%s expected pk %s, got %s", tc.name, tc.epk, pkh) } diff --git a/sign/dilithium/example_test.go b/sign/dilithium/example_test.go deleted file mode 100644 index 4f4de0d99..000000000 --- a/sign/dilithium/example_test.go +++ /dev/null @@ -1,56 +0,0 @@ -package dilithium_test - -import ( - "fmt" - "sort" - - "github.com/cloudflare/circl/sign/dilithium" -) - -func Example() { - // Check supported modes - modes := dilithium.ModeNames() - sort.Strings(modes) - fmt.Printf("Supported modes: %v\n", modes) - - // Pick Dilithium mode III. - mode := dilithium.ModeByName("Dilithium3") - if mode == nil { - panic("Mode3 not supported") - } - - // Alternatively one could simply write - // - // mode := dilithium.Mode3 - - // Generates a keypair. - pk, sk, err := mode.GenerateKey(nil) - if err != nil { - panic(err) - } - // (Alternatively one can derive a keypair from a seed, - // see mode.NewKeyFromSeed().) - - // Packs public and private key - packedSk := sk.Bytes() - packedPk := pk.Bytes() - - // Load it again - sk2 := mode.PrivateKeyFromBytes(packedSk) - pk2 := mode.PublicKeyFromBytes(packedPk) - - // Creates a signature on our message with the generated private key. - msg := []byte("Some message") - signature := mode.Sign(sk2, msg) - - // Checks whether a signature is correct - if !mode.Verify(pk2, msg, signature) { - panic("incorrect signature") - } - - fmt.Printf("O.K.") - - // Output: - // Supported modes: [Dilithium2 Dilithium2-AES Dilithium3 Dilithium3-AES Dilithium5 Dilithium5-AES] - // O.K. -} diff --git a/sign/dilithium/gen.go b/sign/dilithium/gen.go index c0d0df378..a817f4a41 100644 --- a/sign/dilithium/gen.go +++ b/sign/dilithium/gen.go @@ -14,12 +14,11 @@ import ( "strings" "text/template" - "github.com/cloudflare/circl/sign/dilithium/internal/common/params" + "github.com/cloudflare/circl/sign/internal/dilithium/params" ) type Mode struct { Name string - UseAES bool K int L int Eta int @@ -28,38 +27,42 @@ type Mode struct { Tau int Gamma1Bits int Gamma2 int + TRSize int + CTildeSize int } func (m Mode) Pkg() string { return strings.ToLower(m.Mode()) } +func (m Mode) PkgPath() string { + if m.NIST() { + return path.Join("..", "mldsa", m.Pkg()) + } + + return m.Pkg() +} + func (m Mode) Impl() string { return "impl" + m.Mode() } func (m Mode) Mode() string { - return strings.ReplaceAll(strings.ReplaceAll(m.Name, - "Dilithium", "Mode"), "-AES", "AES") + if m.NIST() { + return strings.ReplaceAll(m.Name, "-", "") + } + + return strings.ReplaceAll(m.Name, "Dilithium", "Mode") +} + +func (m Mode) NIST() bool { + return strings.HasPrefix(m.Name, "ML-DSA-") } var ( Modes = []Mode{ { Name: "Dilithium2", - UseAES: false, - K: 4, - L: 4, - Eta: 2, - DoubleEtaBits: 3, - Omega: 80, - Tau: 39, - Gamma1Bits: 17, - Gamma2: (params.Q - 1) / 88, - }, - { - Name: "Dilithium2-AES", - UseAES: true, K: 4, L: 4, Eta: 2, @@ -68,22 +71,11 @@ var ( Tau: 39, Gamma1Bits: 17, Gamma2: (params.Q - 1) / 88, + TRSize: 32, + CTildeSize: 32, }, { Name: "Dilithium3", - UseAES: false, - K: 6, - L: 5, - Eta: 4, - DoubleEtaBits: 4, - Omega: 55, - Tau: 49, - Gamma1Bits: 19, - Gamma2: (params.Q - 1) / 32, - }, - { - Name: "Dilithium3-AES", - UseAES: true, K: 6, L: 5, Eta: 4, @@ -92,10 +84,11 @@ var ( Tau: 49, Gamma1Bits: 19, Gamma2: (params.Q - 1) / 32, + TRSize: 32, + CTildeSize: 32, }, { Name: "Dilithium5", - UseAES: false, K: 8, L: 7, Eta: 2, @@ -104,10 +97,37 @@ var ( Tau: 60, Gamma1Bits: 19, Gamma2: (params.Q - 1) / 32, + TRSize: 32, + CTildeSize: 32, }, { - Name: "Dilithium5-AES", - UseAES: true, + Name: "ML-DSA-44", + K: 4, + L: 4, + Eta: 2, + DoubleEtaBits: 3, + Omega: 80, + Tau: 39, + Gamma1Bits: 17, + Gamma2: (params.Q - 1) / 88, + TRSize: 64, + CTildeSize: 32, + }, + { + Name: "ML-DSA-65", + K: 6, + L: 5, + Eta: 4, + DoubleEtaBits: 4, + Omega: 55, + Tau: 49, + Gamma1Bits: 19, + Gamma2: (params.Q - 1) / 32, + TRSize: 64, + CTildeSize: 48, + }, + { + Name: "ML-DSA-87", K: 8, L: 7, Eta: 2, @@ -116,6 +136,8 @@ var ( Tau: 60, Gamma1Bits: 19, Gamma2: (params.Q - 1) / 32, + TRSize: 64, + CTildeSize: 64, }, } TemplateWarning = "// Code generated from" @@ -123,7 +145,7 @@ var ( func main() { generateModePackageFiles() - generateModeToplevelFiles() + generateACVPTest() generateParamsFiles() generateSourceFiles() } @@ -153,7 +175,7 @@ func generateParamsFiles() { if offset == -1 { panic("Missing template warning in params.templ.go") } - err = os.WriteFile(mode.Pkg()+"/internal/params.go", + err = os.WriteFile(mode.PkgPath()+"/internal/params.go", []byte(res[offset:]), 0o644) if err != nil { panic(err) @@ -161,9 +183,9 @@ func generateParamsFiles() { } } -// Generates modeX.go from templates/mode.templ.go -func generateModeToplevelFiles() { - tl, err := template.ParseFiles("templates/mode.templ.go") +// Generates modeX/dilithium.go from templates/pkg.templ.go +func generateModePackageFiles() { + tl, err := template.ParseFiles("templates/pkg.templ.go") if err != nil { panic(err) } @@ -175,38 +197,50 @@ func generateModeToplevelFiles() { panic(err) } - res := string(buf.Bytes()) - offset := strings.Index(res, TemplateWarning) + res, err := format.Source(buf.Bytes()) + if err != nil { + panic("error formating code") + } + + offset := strings.Index(string(res), TemplateWarning) if offset == -1 { - panic("Missing template warning in mode.templ.go") + panic("Missing template warning in pkg.templ.go") } - err = os.WriteFile(mode.Pkg()+".go", []byte(res[offset:]), 0o644) + err = os.WriteFile(mode.PkgPath()+"/dilithium.go", res[offset:], 0o644) if err != nil { panic(err) } } } -// Generates modeX/dilithium.go from templates/modePkg.templ.go -func generateModePackageFiles() { - tl, err := template.ParseFiles("templates/modePkg.templ.go") +// Generates modeX/dilithium.go from templates/pkg.templ.go +func generateACVPTest() { + tl, err := template.ParseFiles("templates/acvp.templ.go") if err != nil { panic(err) } for _, mode := range Modes { + if !strings.HasPrefix(mode.Name, "ML-DSA") { + continue + } + buf := new(bytes.Buffer) err := tl.Execute(buf, mode) if err != nil { panic(err) } - res := string(buf.Bytes()) - offset := strings.Index(res, TemplateWarning) + res, err := format.Source(buf.Bytes()) + if err != nil { + panic("error formating code") + } + + offset := strings.Index(string(res), TemplateWarning) if offset == -1 { - panic("Missing template warning in modePkg.templ.go") + panic("Missing template warning in pkg.templ.go") } - err = os.WriteFile(mode.Pkg()+"/dilithium.go", []byte(res[offset:]), 0o644) + err = os.WriteFile(mode.PkgPath()+"/acvp_test.go", res[offset:], 0o644) if err != nil { panic(err) } @@ -246,10 +280,10 @@ func generateSourceFiles() { continue } - fs, err = os.ReadDir(path.Join(mode.Pkg(), "internal")) + fs, err = os.ReadDir(path.Join(mode.PkgPath(), "internal")) for _, f := range fs { name := f.Name() - fn := path.Join(mode.Pkg(), "internal", name) + fn := path.Join(mode.PkgPath(), "internal", name) if ignored(name) { continue } @@ -273,7 +307,7 @@ func generateSourceFiles() { } } for name, expected := range files { - fn := path.Join(mode.Pkg(), "internal", name) + fn := path.Join(mode.PkgPath(), "internal", name) expected = []byte(fmt.Sprintf( "%s mode3/internal/%s by gen.go\n\n%s", TemplateWarning, diff --git a/sign/dilithium/internal/common/aes.go b/sign/dilithium/internal/common/aes.go deleted file mode 100644 index f5de25425..000000000 --- a/sign/dilithium/internal/common/aes.go +++ /dev/null @@ -1,46 +0,0 @@ -package common - -import ( - "crypto/aes" - "crypto/cipher" - "encoding/binary" -) - -// AES CTR stream used as a replacement for SHAKE in Dilithium[1234]-AES. -type AesStream struct { - c cipher.Block - counter uint64 - nonce uint16 -} - -// Create a new AesStream as a replacement of SHAKE128. (Note that -// not all occurrences of SHAKE are replaced by AES in the AES-variants). -func NewAesStream128(key *[32]byte, nonce uint16) AesStream { - c, _ := aes.NewCipher(key[:]) - return AesStream{c: c, nonce: nonce} -} - -// Create a new AesStream as a replacement of SHAKE256. (Note that -// not all occurrences of SHAKE are replaced by AES in the AES-variants.) -// -// Yes, in an AES mode, Dilithium throws away the last 32 bytes of a seed ... -// See the remark at the end of the caption of Figure 4 in the Round 2 spec. -func NewAesStream256(key *[64]byte, nonce uint16) AesStream { - c, _ := aes.NewCipher(key[:32]) - return AesStream{c: c, nonce: nonce} -} - -// Squeeze some more blocks from the AES CTR stream into buf. -// -// Assumes length of buf is a multiple of 16. -func (s *AesStream) SqueezeInto(buf []byte) { - var tmp [16]byte - binary.LittleEndian.PutUint16(tmp[:], s.nonce) - - for len(buf) != 0 { - binary.BigEndian.PutUint64(tmp[8:], s.counter) - s.counter++ - s.c.Encrypt(buf, tmp[:]) - buf = buf[16:] - } -} diff --git a/sign/dilithium/kat_test.go b/sign/dilithium/kat_test.go index 2280e988d..35571dfea 100644 --- a/sign/dilithium/kat_test.go +++ b/sign/dilithium/kat_test.go @@ -6,27 +6,34 @@ package dilithium import ( "crypto/sha256" "fmt" + "strings" "testing" "github.com/cloudflare/circl/internal/nist" + "github.com/cloudflare/circl/sign/schemes" ) func TestPQCgenKATSign(t *testing.T) { - // Generated from reference implementation commit 61b51a71701b8ae9f546a1e5, - // which can be found at https://github.com/pq-crystals/dilithium for _, tc := range []struct { name string want string }{ + // Generated from reference implementation commit 61b51a71701b8ae9f546a1e5, + // which can be found at https://github.com/pq-crystals/dilithium {"Dilithium2", "38ed991c5ca11e39ab23945ca37af89e059d16c5474bf8ba96b15cb4e948af2a"}, {"Dilithium3", "8196b32212753f525346201ffec1c7a0a852596fa0b57bd4e2746231dab44d55"}, {"Dilithium5", "7ded97a6e6c809b43b54c248171d7504fa6a0cab651bf288bb00034782667481"}, - {"Dilithium2-AES", "b6673f8da5bba7dfae63adbbdf559f4fcfb715d1f91da98d4b52e26203d69196"}, - {"Dilithium3-AES", "482f4d672a9f1dc38cc8bcf8b1731b03fe99fcb6f2b73aa4a376b99faf89ccbe"}, - {"Dilithium5-AES", "54dfa85013d1b3da4f1d7c6dd270bc91a083cfece3d320c97906da125fd2a48f"}, + + // Generated from reference implementation commit cbcd8753a43402885c90343c + // which can be found at https://github.com/pq-crystals/dilithium + // with the DILITHIUM_RANDOMIZED_SIGNING macro unset in ref/config.h + // to disable randomized signing. + {"ML-DSA-44", "14f92c48abc0d63ea263cce3c83183c8360c6ede7cbd5b65bd7c6f31e38f0ea5"}, + {"ML-DSA-65", "595a8eff6988159c94eb5398294458c5d27d21c994fb64cadbee339173abcf63"}, + {"ML-DSA-87", "35e2ce3d88b3311517bf8d41aa2cd24aa0fbda2bb8052ca8af4ad8d7c7344074"}, } { t.Run(tc.name, func(t *testing.T) { - mode := ModeByName(tc.name) + mode := schemes.ByName(tc.name) if mode == nil { t.Fatal() } @@ -38,7 +45,18 @@ func TestPQCgenKATSign(t *testing.T) { } f := sha256.New() g := nist.NewDRBG(&seed) - fmt.Fprintf(f, "# %s\n\n", tc.name) + nameInKat := tc.name + if !strings.HasPrefix(tc.name, "Dilithium") { + switch tc.name { + case "ML-DSA-44": + nameInKat = "Dilithium2" + case "ML-DSA-65": + nameInKat = "Dilithium3" + case "ML-DSA-87": + nameInKat = "Dilithium5" + } + } + fmt.Fprintf(f, "# %s\n\n", nameInKat) for i := 0; i < 100; i++ { mlen := 33 * (i + 1) g.Fill(seed[:]) @@ -52,17 +70,26 @@ func TestPQCgenKATSign(t *testing.T) { g2 := nist.NewDRBG(&seed) g2.Fill(eseed[:]) - pk, sk := mode.NewKeyFromSeed(eseed[:]) + pk, sk := mode.DeriveKey(eseed[:]) + + ppk, err := pk.MarshalBinary() + if err != nil { + t.Fatal(err) + } + psk, err := sk.MarshalBinary() + if err != nil { + t.Fatal(err) + } - fmt.Fprintf(f, "pk = %X\n", pk.Bytes()) - fmt.Fprintf(f, "sk = %X\n", sk.Bytes()) + fmt.Fprintf(f, "pk = %X\n", ppk) + fmt.Fprintf(f, "sk = %X\n", psk) fmt.Fprintf(f, "smlen = %d\n", mlen+mode.SignatureSize()) - sig := mode.Sign(sk, msg[:]) + sig := mode.Sign(sk, msg[:], nil) fmt.Fprintf(f, "sm = %X%X\n\n", sig, msg) - if !mode.Verify(pk, msg[:], sig) { + if !mode.Verify(pk, msg[:], sig, nil) { t.Fatal() } } diff --git a/sign/dilithium/mode2.go b/sign/dilithium/mode2.go deleted file mode 100644 index e88d090b0..000000000 --- a/sign/dilithium/mode2.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode2" -) - -// implMode2 implements the mode.Mode interface for Dilithium2. -type implMode2 struct{} - -// Mode2 is Dilithium in mode "Dilithium2". -var Mode2 Mode = &implMode2{} - -func (m *implMode2) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mode2.GenerateKey(rand) -} - -func (m *implMode2) NewKeyFromSeed(seed []byte) (PublicKey, - PrivateKey) { - if len(seed) != common.SeedSize { - panic(fmt.Sprintf("seed must be of length %d", common.SeedSize)) - } - seedBuf := [common.SeedSize]byte{} - copy(seedBuf[:], seed) - return mode2.NewKeyFromSeed(&seedBuf) -} - -func (m *implMode2) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mode2.PrivateKey) - ret := [mode2.SignatureSize]byte{} - mode2.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMode2) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mode2.PublicKey) - return mode2.Verify(ipk, msg, signature) -} - -func (m *implMode2) PublicKeyFromBytes(data []byte) PublicKey { - var ret mode2.PublicKey - if len(data) != mode2.PublicKeySize { - panic("packed public key must be of mode2.PublicKeySize bytes") - } - var buf [mode2.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode2) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mode2.PrivateKey - if len(data) != mode2.PrivateKeySize { - panic("packed public key must be of mode2.PrivateKeySize bytes") - } - var buf [mode2.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode2) SeedSize() int { - return common.SeedSize -} - -func (m *implMode2) PublicKeySize() int { - return mode2.PublicKeySize -} - -func (m *implMode2) PrivateKeySize() int { - return mode2.PrivateKeySize -} - -func (m *implMode2) SignatureSize() int { - return mode2.SignatureSize -} - -func (m *implMode2) Name() string { - return "Dilithium2" -} - -func init() { - modes["Dilithium2"] = Mode2 -} diff --git a/sign/dilithium/mode2/dilithium.go b/sign/dilithium/mode2/dilithium.go index 13ac869a5..113708a32 100644 --- a/sign/dilithium/mode2/dilithium.go +++ b/sign/dilithium/mode2/dilithium.go @@ -1,4 +1,4 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. +// Code generated from pkg.templ.go. DO NOT EDIT. // mode2 implements the CRYSTALS-Dilithium signature scheme Dilithium2 // as submitted to round3 of the NIST PQC competition and described in @@ -11,8 +11,9 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + "github.com/cloudflare/circl/sign" "github.com/cloudflare/circl/sign/dilithium/mode2/internal" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -50,20 +51,27 @@ func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { // SignTo signs the given message and writes the signature into signature. // It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg, sig []byte) { + var rnd [32]byte + internal.SignTo( (*internal.PrivateKey)(sk), - msg, - signature, + func(w io.Writer) { + w.Write(msg) + }, + rnd, + sig, ) } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +func Verify(pk *PublicKey, msg, sig []byte) bool { return internal.Verify( (*internal.PublicKey)(pk), - msg, - signature, + func(w io.Writer) { + _, _ = w.Write(msg) + }, + sig, ) } @@ -143,15 +151,15 @@ func (sk *PrivateKey) UnmarshalBinary(data []byte) error { // interface. The package-level SignTo function might be more convenient // to use. func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( - signature []byte, err error) { - var sig [SignatureSize]byte + sig []byte, err error) { + var ret [SignatureSize]byte if opts.HashFunc() != crypto.Hash(0) { return nil, errors.New("dilithium: cannot sign hashed message") } + SignTo(sk, msg, ret[:]) - SignTo(sk, msg, sig[:]) - return sig[:], nil + return ret[:], nil } // Computes the public key corresponding to this private key. @@ -179,3 +187,109 @@ func (pk *PublicKey) Equal(other crypto.PublicKey) bool { } return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) } + +// Boilerplate for generic signatures API + +type scheme struct{} + +var sch sign.Scheme = &scheme{} + +// Scheme returns a generic signature interface for Dilithium2. +func Scheme() sign.Scheme { return sch } + +func (*scheme) Name() string { return "Dilithium2" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SignatureSize() int { return SignatureSize } +func (*scheme) SeedSize() int { return SeedSize } + +// TODO TLSIdentifier() and OID() + +func (*scheme) SupportsContext() bool { + return false +} + +func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { + return GenerateKey(nil) +} + +func (*scheme) Sign( + sk sign.PrivateKey, + msg []byte, + opts *sign.SignatureOpts, +) []byte { + sig := make([]byte, SignatureSize) + + priv, ok := sk.(*PrivateKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + panic(sign.ErrContextNotSupported) + } + SignTo(priv, msg, sig) + + return sig +} + +func (*scheme) Verify( + pk sign.PublicKey, + msg, sig []byte, + opts *sign.SignatureOpts, +) bool { + pub, ok := pk.(*PublicKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + panic(sign.ErrContextNotSupported) + } + return Verify(pub, msg, sig) +} + +func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { + if len(seed) != SeedSize { + panic(sign.ErrSeedSize) + } + var seed2 [SeedSize]byte + copy(seed2[:], seed) + return NewKeyFromSeed(&seed2) +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { + if len(buf) != PublicKeySize { + return nil, sign.ErrPubKeySize + } + + var ( + buf2 [PublicKeySize]byte + ret PublicKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, sign.ErrPrivKeySize + } + + var ( + buf2 [PrivateKeySize]byte + ret PrivateKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (sk *PrivateKey) Scheme() sign.Scheme { + return sch +} + +func (sk *PublicKey) Scheme() sign.Scheme { + return sch +} diff --git a/sign/dilithium/mode2/internal/dilithium.go b/sign/dilithium/mode2/internal/dilithium.go index 79a17d504..8f1c8e5cb 100644 --- a/sign/dilithium/mode2/internal/dilithium.go +++ b/sign/dilithium/mode2/internal/dilithium.go @@ -8,7 +8,7 @@ import ( "io" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -29,13 +29,13 @@ const ( Alpha = 2 * Gamma2 // Size of a packed private key - PrivateKeySize = 32 + 32 + 32 + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K + PrivateKeySize = 32 + 32 + TRSize + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K // Size of a packed public key PublicKeySize = 32 + common.PolyT1Size*K // Size of a packed signature - SignatureSize = L*PolyLeGamma1Size + Omega + K + 32 + SignatureSize = L*PolyLeGamma1Size + Omega + K + CTildeSize // Size of packed w₁ PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 @@ -49,7 +49,7 @@ type PublicKey struct { // Cached values t1p [common.PolyT1Size * K]byte A *Mat - tr *[32]byte + tr *[TRSize]byte } // PrivateKey is the type of Dilithium private keys. @@ -59,7 +59,7 @@ type PrivateKey struct { s1 VecL s2 VecK t0 VecK - tr [32]byte + tr [TRSize]byte // Cached values A Mat // ExpandA(ρ) @@ -71,14 +71,14 @@ type PrivateKey struct { type unpackedSignature struct { z VecL hint VecK - c [32]byte + c [CTildeSize]byte } // Packs the signature into buf. func (sig *unpackedSignature) Pack(buf []byte) { copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[32:]) - sig.hint.PackHint(buf[32+L*PolyLeGamma1Size:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) } // Sets sig to the signature encoded in the buffer. @@ -89,11 +89,11 @@ func (sig *unpackedSignature) Unpack(buf []byte) bool { return false } copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[32:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) if sig.z.Exceeds(Gamma1 - Beta) { return false } - if !sig.hint.UnpackHint(buf[32+L*PolyLeGamma1Size:]) { + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { return false } return true @@ -115,7 +115,7 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { pk.A.Derive(&pk.rho) // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([32]byte) + pk.tr = new([TRSize]byte) h := sha3.NewShake256() _, _ = h.Write(buf[:]) _, _ = h.Read(pk.tr[:]) @@ -125,8 +125,8 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { copy(buf[:32], sk.rho[:]) copy(buf[32:64], sk.key[:]) - copy(buf[64:96], sk.tr[:]) - offset := 96 + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize sk.s1.PackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.PackLeqEta(buf[offset:]) @@ -138,8 +138,8 @@ func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { copy(sk.rho[:], buf[:32]) copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:96]) - offset := 96 + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize sk.s1.UnpackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.UnpackLeqEta(buf[offset:]) @@ -180,6 +180,11 @@ func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { h := sha3.NewShake256() _, _ = h.Write(seed[:]) + + if NIST { + _, _ = h.Write([]byte{byte(K), byte(L)}) + } + _, _ = h.Read(eSeed[:]) copy(pk.rho[:], eSeed[:32]) @@ -244,13 +249,16 @@ func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// For Dilithium this is the top-level verification function. +// In ML-DSA, this is ML-DSA.Verify_internal. +func Verify(pk *PublicKey, msg func(io.Writer), signature []byte) bool { var sig unpackedSignature var mu [64]byte var zh VecL var Az, Az2dct1, w1 VecK var ch common.Poly - var cp [32]byte + var cp [CTildeSize]byte var w1Packed [PolyW1Size * K]byte // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β @@ -262,7 +270,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // Compute Az @@ -279,7 +287,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // which is small enough for NTT(). Az2dct1.MulBy2toD(&pk.t1) Az2dct1.NTT() - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +315,11 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // SignTo signs the given message and writes the signature into signature. // +// For Dilithium this is the top-level signing function. For ML-DSA +// this is ML-DSA.Sign_internal. +// //nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg func(io.Writer), rnd [32]byte, signature []byte) { var mu, rhop [64]byte var w1Packed [PolyW1Size * K]byte var y, yh VecL @@ -324,12 +335,15 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + _, _ = h.Write(rnd[:]) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +382,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode2/internal/dilithium_test.go b/sign/dilithium/mode2/internal/dilithium_test.go index ca347a831..47f53d3a0 100644 --- a/sign/dilithium/mode2/internal/dilithium_test.go +++ b/sign/dilithium/mode2/internal/dilithium_test.go @@ -4,9 +4,10 @@ package internal import ( "encoding/binary" + "io" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Checks whether p is normalized. Only used in tests. @@ -36,32 +37,38 @@ func BenchmarkVerify(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of verification (as in the reference // implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) b.ResetTimer() for i := 0; i < b.N; i++ { // We should generate a new signature for every verify attempt, // as this influences the time a little bit. This difference, however, // is small and generating a new signature in between creates a lot // pressure on the allocator which makes an accurate measurement hard. - Verify(pk, msg[:], sig[:]) + Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) } } func BenchmarkSign(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of signing (as in the reference implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) _, sk := NewKeyFromSeed(&seed) b.ResetTimer() for i := 0; i < b.N; i++ { binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) } } @@ -85,13 +92,16 @@ func BenchmarkPublicFromPrivate(b *testing.B) { } func TestSignThenVerifyAndPkSkPacking(t *testing.T) { - var seed [common.SeedSize]byte - var sig [SignatureSize]byte - var msg [8]byte - var pkb [PublicKeySize]byte - var skb [PrivateKeySize]byte - var pk2 PublicKey - var sk2 PrivateKey + var ( + seed [common.SeedSize]byte + sig [SignatureSize]byte + msg [8]byte + pkb [PublicKeySize]byte + skb [PrivateKeySize]byte + pk2 PublicKey + sk2 PrivateKey + rnd [32]byte + ) for i := uint64(0); i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], i) pk, sk := NewKeyFromSeed(&seed) @@ -100,8 +110,8 @@ func TestSignThenVerifyAndPkSkPacking(t *testing.T) { } for j := uint64(0); j < 10; j++ { binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) + if !Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) { t.Fatal() } } diff --git a/sign/dilithium/mode2/internal/mat.go b/sign/dilithium/mode2/internal/mat.go index cb473c149..ceaf634fa 100644 --- a/sign/dilithium/mode2/internal/mat.go +++ b/sign/dilithium/mode2/internal/mat.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A k by l matrix of polynomials. diff --git a/sign/dilithium/mode2/internal/pack.go b/sign/dilithium/mode2/internal/pack.go index 0285dfd8e..1854b4197 100644 --- a/sign/dilithium/mode2/internal/pack.go +++ b/sign/dilithium/mode2/internal/pack.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Writes p with norm less than or equal η into buf, which must be of diff --git a/sign/dilithium/mode2/internal/pack_test.go b/sign/dilithium/mode2/internal/pack_test.go index 24f568e4d..f952c6a09 100644 --- a/sign/dilithium/mode2/internal/pack_test.go +++ b/sign/dilithium/mode2/internal/pack_test.go @@ -5,7 +5,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestPolyPackLeqEta(t *testing.T) { diff --git a/sign/dilithium/mode2/internal/params.go b/sign/dilithium/mode2/internal/params.go index b49db55b3..c3341f6de 100644 --- a/sign/dilithium/mode2/internal/params.go +++ b/sign/dilithium/mode2/internal/params.go @@ -4,7 +4,6 @@ package internal const ( Name = "Dilithium2" - UseAES = false K = 4 L = 4 Eta = 2 @@ -13,4 +12,7 @@ const ( Tau = 39 Gamma1Bits = 17 Gamma2 = 95232 + NIST = false + TRSize = 32 + CTildeSize = 32 ) diff --git a/sign/dilithium/mode2/internal/params_test.go b/sign/dilithium/mode2/internal/params_test.go index 6dbc04cb8..f1f1715b7 100644 --- a/sign/dilithium/mode2/internal/params_test.go +++ b/sign/dilithium/mode2/internal/params_test.go @@ -3,7 +3,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Tests specific to the current mode diff --git a/sign/dilithium/mode2/internal/rounding.go b/sign/dilithium/mode2/internal/rounding.go index 71360cb29..58123c090 100644 --- a/sign/dilithium/mode2/internal/rounding.go +++ b/sign/dilithium/mode2/internal/rounding.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, diff --git a/sign/dilithium/mode2/internal/rounding_test.go b/sign/dilithium/mode2/internal/rounding_test.go index 5824f2656..ad653ca3f 100644 --- a/sign/dilithium/mode2/internal/rounding_test.go +++ b/sign/dilithium/mode2/internal/rounding_test.go @@ -6,7 +6,7 @@ import ( "flag" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") diff --git a/sign/dilithium/mode2/internal/sample.go b/sign/dilithium/mode2/internal/sample.go index c47185ada..b37370a4e 100644 --- a/sign/dilithium/mode2/internal/sample.go +++ b/sign/dilithium/mode2/internal/sample.go @@ -6,13 +6,13 @@ import ( "encoding/binary" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" "github.com/cloudflare/circl/simd/keccakf1600" ) // DeriveX4Available indicates whether the system supports the quick fourway // sampling variants like PolyDeriveUniformX4. -var DeriveX4Available = keccakf1600.IsEnabledX4() && !UseAES +var DeriveX4Available = keccakf1600.IsEnabledX4() // For each i, sample ps[i] uniformly from the given seed and nonces[i]. // ps[i] may be nil and is ignored in that case. @@ -91,13 +91,9 @@ func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { // p will be normalized. func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { var i, length int - var buf [12 * 16]byte // fits 168B SHAKE-128 rate and 12 16B AES blocks + var buf [12 * 16]byte // fits 168B SHAKE-128 rate - if UseAES { - length = 12 * 16 - } else { - length = 168 - } + length = 168 sample := func() { // Note that 3 divides into 168 and 12*16, so we use up buf completely. @@ -113,25 +109,16 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream128(seed, nonce) + var iv [32 + 2]byte // 32 byte seed + uint16 nonce + h := sha3.NewShake128() + copy(iv[:32], seed[:]) + iv[32] = uint8(nonce) + iv[33] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [32 + 2]byte // 32 byte seed + uint16 nonce - h := sha3.NewShake128() - copy(iv[:32], seed[:]) - iv[32] = uint8(nonce) - iv[33] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:168]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:168]) + sample() } } @@ -142,13 +129,9 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { // Assumes 2 < η < 8. var i, length int - var buf [9 * 16]byte // fits 136B SHAKE-256 rate and 9 16B AES blocks + var buf [9 * 16]byte // fits 136B SHAKE-256 rate - if UseAES { - length = 9 * 16 - } else { - length = 136 - } + length = 136 sample := func() { // We use rejection sampling @@ -181,28 +164,19 @@ func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream256(seed, nonce) - - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [64 + 2]byte // 64 byte seed + uint16 nonce + var iv [64 + 2]byte // 64 byte seed + uint16 nonce - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() } } @@ -223,18 +197,13 @@ func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { var buf [PolyLeGamma1Size]byte - if UseAES { - h := common.NewAesStream256(seed, nonce) - h.SqueezeInto(buf[:]) - } else { - var iv [66]byte - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - _, _ = h.Read(buf[:]) - } + var iv [66]byte + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) + _, _ = h.Read(buf[:]) PolyUnpackLeGamma1(p, buf[:]) } @@ -246,12 +215,12 @@ func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { // Can only be called when DeriveX4Available is true. // // This function is currently not used (yet). -func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { +func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { var perm keccakf1600.StateX4 state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 4; i++ { + for i := 0; i < CTildeSize/8; i++ { v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) for j := 0; j < 4; j++ { state[i*4+j] = v @@ -260,7 +229,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[4*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +296,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // Samples p uniformly with τ non-zero coefficients in {q-1,1}. // // The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed *[32]byte) { +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { var buf [136]byte // SHAKE-256 rate is 136 h := sha3.NewShake256() diff --git a/sign/dilithium/mode2/internal/sample_test.go b/sign/dilithium/mode2/internal/sample_test.go index 1a0a4f72c..32931c94f 100644 --- a/sign/dilithium/mode2/internal/sample_test.go +++ b/sign/dilithium/mode2/internal/sample_test.go @@ -6,100 +6,52 @@ import ( "encoding/binary" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestVectorDeriveUniform(t *testing.T) { var p, p2 common.Poly var seed [32]byte - if UseAES { - p2 = common.Poly{ - 6724291, 310295, 6949524, 4464039, 1482136, 2522903, - 7025059, 3006320, 7286364, 7516512, 3361305, 1955529, - 4765954, 1725325, 6933066, 4299100, 6625173, 4272792, - 583034, 4971409, 2259140, 7715362, 3975394, 2341624, - 5481174, 8150082, 365246, 5491939, 1083120, 7517301, - 3104783, 2475292, 184149, 6425226, 4591622, 5964030, - 4729604, 5471092, 1828227, 1082044, 2516245, 1692580, - 3274844, 5443294, 7256740, 4989638, 3191250, 7479519, - 5124211, 5603858, 1230692, 2513454, 2828034, 4254312, - 1512596, 5245430, 5517392, 2814840, 932545, 6826733, - 3511094, 4075348, 3233981, 7268882, 2913733, 4870249, - 4123492, 8124406, 4016949, 5478752, 2750895, 603525, - 5724798, 3985430, 3483012, 6434230, 3136996, 8297976, - 4107616, 7307748, 6962904, 7544473, 1193110, 3448595, - 4814773, 5607932, 8221314, 1054046, 1541208, 1866050, - 8227412, 2925778, 5293953, 2065416, 4972769, 3616283, - 7990594, 1105530, 7121836, 1170740, 7417431, 633146, - 253820, 7235019, 3539504, 6807707, 451390, 5481526, - 2859902, 1063061, 4579730, 7126652, 7033767, 4294814, - 1414604, 7620048, 1953268, 8304556, 1156814, 1182881, - 5311519, 3057534, 5277666, 682843, 2070398, 2874278, - 4859533, 6376664, 6694074, 1590242, 2620706, 8331066, - 5643845, 5037538, 2891516, 7004879, 3754327, 5031296, - 5463118, 2420870, 8116529, 5517696, 7435129, 3873963, - 710407, 713806, 175647, 4274571, 2655021, 7319503, - 3027243, 7129679, 4213435, 2429323, 4643873, 4568526, - 649664, 1720514, 6497260, 2683517, 7672754, 7105190, - 3148405, 5898369, 5667677, 8050874, 1587139, 7315260, - 4337416, 2202680, 2338714, 557467, 6752058, 2469794, - 485071, 1617604, 3590498, 2151466, 2005823, 7727956, - 7776292, 6783433, 6787146, 1732833, 3596857, 7436284, - 4483349, 4970142, 4472608, 6478342, 1236215, 5695744, - 2280717, 2889355, 3233946, 5187812, 978685, 5177364, - 2922353, 4824807, 5302883, 6739803, 8092453, 5883903, - 816553, 6041174, 8317591, 1459178, 5332455, 1835058, - 1368601, 2820950, 3479224, 2589540, 7992934, 3421045, - 4657128, 8292902, 4153567, 3553988, 7830320, 6722913, - 2555309, 4149801, 8328975, 1560545, 7757473, 3106458, - 4310856, 7135453, 3481032, 652626, 1841361, 8126828, - 6250018, 300536, 7380070, 8174419, 1418793, 6208185, - 3906256, 6679016, 1605701, 3561489, 5819724, 5746996, - 8044214, 7087187, 7102330, 4962927, 4253983, 7108567, - 4119736, 6584065, 441634, 6941656, - } - } else { - p2 = common.Poly{ - 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, - 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, - 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, - 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, - 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, - 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, - 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, - 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, - 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, - 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, - 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, - 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, - 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, - 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, - 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, - 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, - 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, - 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, - 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, - 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, - 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, - 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, - 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, - 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, - 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, - 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, - 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, - 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, - 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, - 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, - 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, - 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, - 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, - 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, - 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, - 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, - 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, - 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, - 4352830, - } + p2 = common.Poly{ + 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, + 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, + 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, + 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, + 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, + 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, + 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, + 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, + 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, + 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, + 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, + 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, + 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, + 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, + 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, + 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, + 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, + 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, + 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, + 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, + 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, + 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, + 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, + 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, + 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, + 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, + 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, + 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, + 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, + 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, + 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, + 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, + 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, + 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, + 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, + 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, + 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, + 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, + 4352830, } for i := 0; i < 32; i++ { seed[i] = byte(i) @@ -152,10 +104,10 @@ func TestDeriveUniformLeGamma1(t *testing.T) { func TestDeriveUniformBall(t *testing.T) { var p common.Poly - var seed [32]byte + var seed [CTildeSize]byte for i := 0; i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) nonzero := 0 for j := 0; j < common.N; j++ { if p[j] != 0 { @@ -200,13 +152,13 @@ func TestDeriveUniformBallX4(t *testing.T) { } var ps [4]common.Poly var p common.Poly - var seed [32]byte + var seed [CTildeSize]byte PolyDeriveUniformBallX4( [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, - &seed, + seed[:], ) for j := 0; j < 4; j++ { - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) if ps[j] != p { t.Fatalf("%d\n%v\n%v", j, ps[j], p) } @@ -219,7 +171,7 @@ func BenchmarkPolyDeriveUniformBall(b *testing.B) { var w1 VecK for i := 0; i < b.N; i++ { w1[0][0] = uint32(i) - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) } } @@ -231,7 +183,7 @@ func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { w1[0][0] = uint32(i) PolyDeriveUniformBallX4( [4]*common.Poly{&p, &p, &p, &p}, - &seed, + seed[:], ) } } diff --git a/sign/dilithium/mode2/internal/vec.go b/sign/dilithium/mode2/internal/vec.go index f52973e45..d07d3b245 100644 --- a/sign/dilithium/mode2/internal/vec.go +++ b/sign/dilithium/mode2/internal/vec.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A vector of L polynomials. diff --git a/sign/dilithium/mode2aes.go b/sign/dilithium/mode2aes.go deleted file mode 100644 index e3c996d92..000000000 --- a/sign/dilithium/mode2aes.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode2aes" -) - -// implMode2AES implements the mode.Mode interface for Dilithium2-AES. -type implMode2AES struct{} - -// Mode2AES is Dilithium in mode "Dilithium2-AES". -var Mode2AES Mode = &implMode2AES{} - -func (m *implMode2AES) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mode2aes.GenerateKey(rand) -} - -func (m *implMode2AES) NewKeyFromSeed(seed []byte) (PublicKey, - PrivateKey) { - if len(seed) != common.SeedSize { - panic(fmt.Sprintf("seed must be of length %d", common.SeedSize)) - } - seedBuf := [common.SeedSize]byte{} - copy(seedBuf[:], seed) - return mode2aes.NewKeyFromSeed(&seedBuf) -} - -func (m *implMode2AES) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mode2aes.PrivateKey) - ret := [mode2aes.SignatureSize]byte{} - mode2aes.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMode2AES) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mode2aes.PublicKey) - return mode2aes.Verify(ipk, msg, signature) -} - -func (m *implMode2AES) PublicKeyFromBytes(data []byte) PublicKey { - var ret mode2aes.PublicKey - if len(data) != mode2aes.PublicKeySize { - panic("packed public key must be of mode2aes.PublicKeySize bytes") - } - var buf [mode2aes.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode2AES) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mode2aes.PrivateKey - if len(data) != mode2aes.PrivateKeySize { - panic("packed public key must be of mode2aes.PrivateKeySize bytes") - } - var buf [mode2aes.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode2AES) SeedSize() int { - return common.SeedSize -} - -func (m *implMode2AES) PublicKeySize() int { - return mode2aes.PublicKeySize -} - -func (m *implMode2AES) PrivateKeySize() int { - return mode2aes.PrivateKeySize -} - -func (m *implMode2AES) SignatureSize() int { - return mode2aes.SignatureSize -} - -func (m *implMode2AES) Name() string { - return "Dilithium2-AES" -} - -func init() { - modes["Dilithium2-AES"] = Mode2AES -} diff --git a/sign/dilithium/mode2aes/dilithium.go b/sign/dilithium/mode2aes/dilithium.go deleted file mode 100644 index 0b44077bb..000000000 --- a/sign/dilithium/mode2aes/dilithium.go +++ /dev/null @@ -1,181 +0,0 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. - -// mode2aes implements the CRYSTALS-Dilithium signature scheme Dilithium2-AES -// as submitted to round3 of the NIST PQC competition and described in -// -// https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf -package mode2aes - -import ( - "crypto" - "errors" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode2aes/internal" -) - -const ( - // Size of seed for NewKeyFromSeed - SeedSize = common.SeedSize - - // Size of a packed PublicKey - PublicKeySize = internal.PublicKeySize - - // Size of a packed PrivateKey - PrivateKeySize = internal.PrivateKeySize - - // Size of a signature - SignatureSize = internal.SignatureSize -) - -// PublicKey is the type of Dilithium2-AES public key -type PublicKey internal.PublicKey - -// PrivateKey is the type of Dilithium2-AES private key -type PrivateKey internal.PrivateKey - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { - pk, sk, err := internal.GenerateKey(rand) - return (*PublicKey)(pk), (*PrivateKey)(sk), err -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { - pk, sk := internal.NewKeyFromSeed(seed) - return (*PublicKey)(pk), (*PrivateKey)(sk) -} - -// SignTo signs the given message and writes the signature into signature. -// It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - internal.SignTo( - (*internal.PrivateKey)(sk), - msg, - signature, - ) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - return internal.Verify( - (*internal.PublicKey)(pk), - msg, - signature, - ) -} - -// Sets pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - (*internal.PublicKey)(pk).Unpack(buf) -} - -// Sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - (*internal.PrivateKey)(sk).Unpack(buf) -} - -// Packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - (*internal.PublicKey)(pk).Pack(buf) -} - -// Packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - (*internal.PrivateKey)(sk).Pack(buf) -} - -// Packs the public key. -func (pk *PublicKey) Bytes() []byte { - var buf [PublicKeySize]byte - pk.Pack(&buf) - return buf[:] -} - -// Packs the private key. -func (sk *PrivateKey) Bytes() []byte { - var buf [PrivateKeySize]byte - sk.Pack(&buf) - return buf[:] -} - -// Packs the public key. -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - return pk.Bytes(), nil -} - -// Packs the private key. -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - return sk.Bytes(), nil -} - -// Unpacks the public key from data. -func (pk *PublicKey) UnmarshalBinary(data []byte) error { - if len(data) != PublicKeySize { - return errors.New("packed public key must be of mode2aes.PublicKeySize bytes") - } - var buf [PublicKeySize]byte - copy(buf[:], data) - pk.Unpack(&buf) - return nil -} - -// Unpacks the private key from data. -func (sk *PrivateKey) UnmarshalBinary(data []byte) error { - if len(data) != PrivateKeySize { - return errors.New("packed private key must be of mode2aes.PrivateKeySize bytes") - } - var buf [PrivateKeySize]byte - copy(buf[:], data) - sk.Unpack(&buf) - return nil -} - -// Sign signs the given message. -// -// opts.HashFunc() must return zero, which can be achieved by passing -// crypto.Hash(0) for opts. rand is ignored. Will only return an error -// if opts.HashFunc() is non-zero. -// -// This function is used to make PrivateKey implement the crypto.Signer -// interface. The package-level SignTo function might be more convenient -// to use. -func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( - signature []byte, err error) { - var sig [SignatureSize]byte - - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("dilithium: cannot sign hashed message") - } - - SignTo(sk, msg, sig[:]) - return sig[:], nil -} - -// Computes the public key corresponding to this private key. -// -// Returns a *PublicKey. The type crypto.PublicKey is used to make -// PrivateKey implement the crypto.Signer interface. -func (sk *PrivateKey) Public() crypto.PublicKey { - return (*PublicKey)((*internal.PrivateKey)(sk).Public()) -} - -// Equal returns whether the two private keys equal. -func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { - castOther, ok := other.(*PrivateKey) - if !ok { - return false - } - return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(castOther)) -} - -// Equal returns whether the two public keys equal. -func (pk *PublicKey) Equal(other crypto.PublicKey) bool { - castOther, ok := other.(*PublicKey) - if !ok { - return false - } - return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) -} diff --git a/sign/dilithium/mode2aes/internal/params_test.go b/sign/dilithium/mode2aes/internal/params_test.go deleted file mode 100644 index 50665d6a9..000000000 --- a/sign/dilithium/mode2aes/internal/params_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package internal - -import ( - "testing" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" -) - -// Tests specific to the current mode - -func TestVectorDeriveUniformLeqEta(t *testing.T) { - var p common.Poly - var seed [64]byte - p2 := common.Poly{ - 8380416, 0, 2, 8380415, 1, 1, 0, 1, 0, 1, 8380415, 2, - 8380415, 8380415, 2, 2, 2, 1, 0, 2, 8380416, 1, 8380415, - 8380415, 8380416, 8380415, 8380416, 8380415, 1, 1, 0, 1, - 0, 1, 2, 8380416, 2, 1, 8380416, 1, 1, 2, 0, 8380416, - 8380416, 2, 0, 2, 8380415, 0, 1, 2, 1, 1, 1, 0, 8380415, - 1, 2, 8380415, 8380416, 1, 8380415, 0, 1, 8380416, 8380416, - 8380415, 0, 2, 8380415, 1, 8380416, 0, 8380416, 8380416, - 8380416, 2, 2, 1, 2, 8380415, 2, 0, 8380415, 8380415, 0, - 2, 8380415, 8380415, 1, 8380415, 2, 8380415, 0, 1, 2, - 8380415, 8380416, 8380415, 0, 8380416, 1, 0, 2, 0, 2, - 8380415, 8380416, 2, 1, 8380415, 1, 8380416, 1, 8380415, - 8380415, 0, 8380416, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 8380415, - 8380416, 2, 0, 1, 8380416, 2, 1, 8380416, 2, 1, 8380416, - 0, 2, 8380416, 2, 0, 8380415, 0, 2, 0, 8380415, 1, 0, - 8380415, 2, 8380416, 8380416, 8380415, 0, 0, 8380416, 2, - 2, 1, 8380416, 2, 1, 2, 0, 8380415, 1, 0, 2, 2, 1, 0, 0, - 1, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 8380416, 2, 2, 0, 8380415, - 1, 2, 2, 1, 1, 8380415, 8380415, 2, 2, 1, 8380416, 8380415, - 2, 1, 0, 8380416, 8380415, 8380415, 0, 1, 0, 8380416, - 8380416, 8380416, 8380416, 2, 8380415, 1, 8380415, 0, 1, - 0, 8380416, 2, 8380415, 2, 1, 2, 1, 1, 0, 8380415, 2, - 8380416, 8380416, 8380415, 8380415, 0, 2, 8380416, 1, - 8380416, 8380415, 8380416, 8380415, 2, 8380416, 2, 8380415, - 2, 2, 1, 8380415, - } - for i := 0; i < 64; i++ { - seed[i] = byte(i) - } - PolyDeriveUniformLeqEta(&p, &seed, 30000) - p.Normalize() - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} - -func TestVectorDeriveUniformLeGamma1(t *testing.T) { - var p, p2 common.Poly - var seed [64]byte - p2 = common.Poly{ - 8340798, 8313384, 49077, 22486, 123481, 8288752, 36503, - 8340997, 8302174, 8258535, 13603, 17223, 8335009, 8345989, - 91340, 8349862, 83710, 72846, 89691, 8272088, 26276, 6832, - 29103, 8313655, 72326, 8321983, 113475, 95773, 17886, - 8365924, 8279095, 8343830, 8273195, 8310637, 8253500, - 8374711, 8262430, 17388, 8294137, 8262960, 8290290, 47349, - 44452, 128195, 8377719, 130632, 8256416, 8287230, 120060, - 8323823, 115401, 8351851, 97604, 47772, 8363419, 8353971, - 1956, 8267893, 8362705, 17686, 122170, 101229, 3317, 14205, - 8368014, 97101, 8360617, 111843, 8357331, 16215, 8346959, - 8313944, 8309613, 8348252, 64256, 8294208, 8318089, 8335255, - 8324894, 8273750, 27850, 8260308, 8258591, 80542, 8320495, - 36517, 8340794, 8304320, 8320157, 625, 8292418, 8317653, - 8275617, 8352781, 109921, 121642, 8291715, 129643, 111667, - 8325995, 8368715, 8283849, 8281348, 1417, 8336033, 100081, - 30984, 22277, 8307048, 55908, 50909, 8326533, 34891, 98542, - 121511, 2614, 125602, 59900, 120456, 8351260, 30124, 52065, - 124214, 48354, 8281081, 116665, 17218, 74568, 4798, 8274275, - 8328948, 8269139, 8908, 8276509, 8270063, 8370525, 8257669, - 36128, 8313115, 8325113, 8257382, 77895, 8288147, 8294769, - 8273027, 8370871, 57085, 59514, 82308, 71173, 6475, 8313311, - 27188, 35803, 8296637, 100553, 8333397, 19553, 8373991, - 8361935, 62433, 8300, 8371479, 8297954, 8352934, 8286, - 8355336, 8335507, 8370548, 8301039, 8270317, 26478, 113694, - 8296283, 8271234, 8250245, 8372668, 8284012, 8264500, 85893, - 8322354, 8358407, 130156, 52458, 8291251, 122476, 8308146, - 4252, 118400, 74123, 8333546, 70542, 8325370, 60510, 1874, - 8377673, 50805, 78992, 66936, 8266050, 8367830, 8342582, - 8268085, 65238, 61045, 8312728, 70547, 8309034, 5696, 118654, - 8330845, 29553, 68995, 70518, 8351920, 8269399, 128395, - 122804, 10848, 8291860, 8324935, 3842, 8265342, 8266117, - 8368377, 8311281, 24039, 8343875, 97893, 12670, 8370577, - 92482, 8288562, 8269568, 8371831, 8324316, 76758, 8327193, - 46615, 10323, 8337373, 101795, 88456, 25023, 8351520, 94650, - 8264851, 14881, 104171, 22607, 8379204, 8310533, 8324603, - 8299017, 128723, 8291421, - } - for i := 0; i < 64; i++ { - seed[i] = byte(i) - } - PolyDeriveUniformLeGamma1(&p, &seed, 30000) - p.Normalize() - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} diff --git a/sign/dilithium/mode2aes/internal/sample_test.go b/sign/dilithium/mode2aes/internal/sample_test.go deleted file mode 100644 index 1a0a4f72c..000000000 --- a/sign/dilithium/mode2aes/internal/sample_test.go +++ /dev/null @@ -1,266 +0,0 @@ -// Code generated from mode3/internal/sample_test.go by gen.go - -package internal - -import ( - "encoding/binary" - "testing" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" -) - -func TestVectorDeriveUniform(t *testing.T) { - var p, p2 common.Poly - var seed [32]byte - if UseAES { - p2 = common.Poly{ - 6724291, 310295, 6949524, 4464039, 1482136, 2522903, - 7025059, 3006320, 7286364, 7516512, 3361305, 1955529, - 4765954, 1725325, 6933066, 4299100, 6625173, 4272792, - 583034, 4971409, 2259140, 7715362, 3975394, 2341624, - 5481174, 8150082, 365246, 5491939, 1083120, 7517301, - 3104783, 2475292, 184149, 6425226, 4591622, 5964030, - 4729604, 5471092, 1828227, 1082044, 2516245, 1692580, - 3274844, 5443294, 7256740, 4989638, 3191250, 7479519, - 5124211, 5603858, 1230692, 2513454, 2828034, 4254312, - 1512596, 5245430, 5517392, 2814840, 932545, 6826733, - 3511094, 4075348, 3233981, 7268882, 2913733, 4870249, - 4123492, 8124406, 4016949, 5478752, 2750895, 603525, - 5724798, 3985430, 3483012, 6434230, 3136996, 8297976, - 4107616, 7307748, 6962904, 7544473, 1193110, 3448595, - 4814773, 5607932, 8221314, 1054046, 1541208, 1866050, - 8227412, 2925778, 5293953, 2065416, 4972769, 3616283, - 7990594, 1105530, 7121836, 1170740, 7417431, 633146, - 253820, 7235019, 3539504, 6807707, 451390, 5481526, - 2859902, 1063061, 4579730, 7126652, 7033767, 4294814, - 1414604, 7620048, 1953268, 8304556, 1156814, 1182881, - 5311519, 3057534, 5277666, 682843, 2070398, 2874278, - 4859533, 6376664, 6694074, 1590242, 2620706, 8331066, - 5643845, 5037538, 2891516, 7004879, 3754327, 5031296, - 5463118, 2420870, 8116529, 5517696, 7435129, 3873963, - 710407, 713806, 175647, 4274571, 2655021, 7319503, - 3027243, 7129679, 4213435, 2429323, 4643873, 4568526, - 649664, 1720514, 6497260, 2683517, 7672754, 7105190, - 3148405, 5898369, 5667677, 8050874, 1587139, 7315260, - 4337416, 2202680, 2338714, 557467, 6752058, 2469794, - 485071, 1617604, 3590498, 2151466, 2005823, 7727956, - 7776292, 6783433, 6787146, 1732833, 3596857, 7436284, - 4483349, 4970142, 4472608, 6478342, 1236215, 5695744, - 2280717, 2889355, 3233946, 5187812, 978685, 5177364, - 2922353, 4824807, 5302883, 6739803, 8092453, 5883903, - 816553, 6041174, 8317591, 1459178, 5332455, 1835058, - 1368601, 2820950, 3479224, 2589540, 7992934, 3421045, - 4657128, 8292902, 4153567, 3553988, 7830320, 6722913, - 2555309, 4149801, 8328975, 1560545, 7757473, 3106458, - 4310856, 7135453, 3481032, 652626, 1841361, 8126828, - 6250018, 300536, 7380070, 8174419, 1418793, 6208185, - 3906256, 6679016, 1605701, 3561489, 5819724, 5746996, - 8044214, 7087187, 7102330, 4962927, 4253983, 7108567, - 4119736, 6584065, 441634, 6941656, - } - } else { - p2 = common.Poly{ - 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, - 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, - 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, - 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, - 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, - 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, - 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, - 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, - 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, - 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, - 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, - 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, - 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, - 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, - 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, - 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, - 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, - 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, - 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, - 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, - 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, - 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, - 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, - 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, - 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, - 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, - 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, - 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, - 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, - 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, - 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, - 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, - 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, - 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, - 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, - 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, - 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, - 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, - 4352830, - } - } - for i := 0; i < 32; i++ { - seed[i] = byte(i) - } - PolyDeriveUniform(&p, &seed, 30000) - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} - -func TestDeriveUniform(t *testing.T) { - var p common.Poly - var seed [32]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniform(&p, &seed, uint16(i)) - if !PolyNormalized(&p) { - t.Fatal() - } - } -} - -func TestDeriveUniformLeqEta(t *testing.T) { - var p common.Poly - var seed [64]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformLeqEta(&p, &seed, uint16(i)) - for j := 0; j < common.N; j++ { - if p[j] < common.Q-Eta || p[j] > common.Q+Eta { - t.Fatal() - } - } - } -} - -func TestDeriveUniformLeGamma1(t *testing.T) { - var p common.Poly - var seed [64]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) - for j := 0; j < common.N; j++ { - if (p[j] > Gamma1 && p[j] <= common.Q-Gamma1) || p[j] >= common.Q { - t.Fatal() - } - } - } -} - -func TestDeriveUniformBall(t *testing.T) { - var p common.Poly - var seed [32]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformBall(&p, &seed) - nonzero := 0 - for j := 0; j < common.N; j++ { - if p[j] != 0 { - if p[j] != 1 && p[j] != common.Q-1 { - t.Fatal() - } - nonzero++ - } - } - if nonzero != Tau { - t.Fatal() - } - } -} - -func TestDeriveUniformX4(t *testing.T) { - if !DeriveX4Available { - t.SkipNow() - } - var ps [4]common.Poly - var p common.Poly - var seed [32]byte - nonces := [4]uint16{12345, 54321, 13532, 37377} - - for i := 0; i < len(seed); i++ { - seed[i] = byte(i) - } - - PolyDeriveUniformX4([4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, &seed, - nonces) - for i := 0; i < 4; i++ { - PolyDeriveUniform(&p, &seed, nonces[i]) - if ps[i] != p { - t.Fatal() - } - } -} - -func TestDeriveUniformBallX4(t *testing.T) { - if !DeriveX4Available { - t.SkipNow() - } - var ps [4]common.Poly - var p common.Poly - var seed [32]byte - PolyDeriveUniformBallX4( - [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, - &seed, - ) - for j := 0; j < 4; j++ { - PolyDeriveUniformBall(&p, &seed) - if ps[j] != p { - t.Fatalf("%d\n%v\n%v", j, ps[j], p) - } - } -} - -func BenchmarkPolyDeriveUniformBall(b *testing.B) { - var seed [32]byte - var p common.Poly - var w1 VecK - for i := 0; i < b.N; i++ { - w1[0][0] = uint32(i) - PolyDeriveUniformBall(&p, &seed) - } -} - -func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { - var seed [32]byte - var p common.Poly - var w1 VecK - for i := 0; i < b.N; i++ { - w1[0][0] = uint32(i) - PolyDeriveUniformBallX4( - [4]*common.Poly{&p, &p, &p, &p}, - &seed, - ) - } -} - -func BenchmarkPolyDeriveUniform(b *testing.B) { - var seed [32]byte - var p common.Poly - for i := 0; i < b.N; i++ { - PolyDeriveUniform(&p, &seed, uint16(i)) - } -} - -func BenchmarkPolyDeriveUniformX4(b *testing.B) { - if !DeriveX4Available { - b.SkipNow() - } - var seed [32]byte - var p [4]common.Poly - for i := 0; i < b.N; i++ { - nonce := uint16(4 * i) - PolyDeriveUniformX4([4]*common.Poly{&p[0], &p[1], &p[2], &p[3]}, - &seed, [4]uint16{nonce, nonce + 1, nonce + 2, nonce + 3}) - } -} - -func BenchmarkPolyDeriveUniformLeGamma1(b *testing.B) { - var seed [64]byte - var p common.Poly - for i := 0; i < b.N; i++ { - PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) - } -} diff --git a/sign/dilithium/mode3.go b/sign/dilithium/mode3.go deleted file mode 100644 index fb45a29c2..000000000 --- a/sign/dilithium/mode3.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode3" -) - -// implMode3 implements the mode.Mode interface for Dilithium3. -type implMode3 struct{} - -// Mode3 is Dilithium in mode "Dilithium3". -var Mode3 Mode = &implMode3{} - -func (m *implMode3) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mode3.GenerateKey(rand) -} - -func (m *implMode3) NewKeyFromSeed(seed []byte) (PublicKey, - PrivateKey) { - if len(seed) != common.SeedSize { - panic(fmt.Sprintf("seed must be of length %d", common.SeedSize)) - } - seedBuf := [common.SeedSize]byte{} - copy(seedBuf[:], seed) - return mode3.NewKeyFromSeed(&seedBuf) -} - -func (m *implMode3) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mode3.PrivateKey) - ret := [mode3.SignatureSize]byte{} - mode3.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMode3) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mode3.PublicKey) - return mode3.Verify(ipk, msg, signature) -} - -func (m *implMode3) PublicKeyFromBytes(data []byte) PublicKey { - var ret mode3.PublicKey - if len(data) != mode3.PublicKeySize { - panic("packed public key must be of mode3.PublicKeySize bytes") - } - var buf [mode3.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode3) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mode3.PrivateKey - if len(data) != mode3.PrivateKeySize { - panic("packed public key must be of mode3.PrivateKeySize bytes") - } - var buf [mode3.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode3) SeedSize() int { - return common.SeedSize -} - -func (m *implMode3) PublicKeySize() int { - return mode3.PublicKeySize -} - -func (m *implMode3) PrivateKeySize() int { - return mode3.PrivateKeySize -} - -func (m *implMode3) SignatureSize() int { - return mode3.SignatureSize -} - -func (m *implMode3) Name() string { - return "Dilithium3" -} - -func init() { - modes["Dilithium3"] = Mode3 -} diff --git a/sign/dilithium/mode3/dilithium.go b/sign/dilithium/mode3/dilithium.go index 3ab9d6b53..2e93e9c50 100644 --- a/sign/dilithium/mode3/dilithium.go +++ b/sign/dilithium/mode3/dilithium.go @@ -1,4 +1,4 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. +// Code generated from pkg.templ.go. DO NOT EDIT. // mode3 implements the CRYSTALS-Dilithium signature scheme Dilithium3 // as submitted to round3 of the NIST PQC competition and described in @@ -11,8 +11,9 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + "github.com/cloudflare/circl/sign" "github.com/cloudflare/circl/sign/dilithium/mode3/internal" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -50,20 +51,27 @@ func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { // SignTo signs the given message and writes the signature into signature. // It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg, sig []byte) { + var rnd [32]byte + internal.SignTo( (*internal.PrivateKey)(sk), - msg, - signature, + func(w io.Writer) { + w.Write(msg) + }, + rnd, + sig, ) } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +func Verify(pk *PublicKey, msg, sig []byte) bool { return internal.Verify( (*internal.PublicKey)(pk), - msg, - signature, + func(w io.Writer) { + _, _ = w.Write(msg) + }, + sig, ) } @@ -143,15 +151,15 @@ func (sk *PrivateKey) UnmarshalBinary(data []byte) error { // interface. The package-level SignTo function might be more convenient // to use. func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( - signature []byte, err error) { - var sig [SignatureSize]byte + sig []byte, err error) { + var ret [SignatureSize]byte if opts.HashFunc() != crypto.Hash(0) { return nil, errors.New("dilithium: cannot sign hashed message") } + SignTo(sk, msg, ret[:]) - SignTo(sk, msg, sig[:]) - return sig[:], nil + return ret[:], nil } // Computes the public key corresponding to this private key. @@ -179,3 +187,109 @@ func (pk *PublicKey) Equal(other crypto.PublicKey) bool { } return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) } + +// Boilerplate for generic signatures API + +type scheme struct{} + +var sch sign.Scheme = &scheme{} + +// Scheme returns a generic signature interface for Dilithium3. +func Scheme() sign.Scheme { return sch } + +func (*scheme) Name() string { return "Dilithium3" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SignatureSize() int { return SignatureSize } +func (*scheme) SeedSize() int { return SeedSize } + +// TODO TLSIdentifier() and OID() + +func (*scheme) SupportsContext() bool { + return false +} + +func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { + return GenerateKey(nil) +} + +func (*scheme) Sign( + sk sign.PrivateKey, + msg []byte, + opts *sign.SignatureOpts, +) []byte { + sig := make([]byte, SignatureSize) + + priv, ok := sk.(*PrivateKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + panic(sign.ErrContextNotSupported) + } + SignTo(priv, msg, sig) + + return sig +} + +func (*scheme) Verify( + pk sign.PublicKey, + msg, sig []byte, + opts *sign.SignatureOpts, +) bool { + pub, ok := pk.(*PublicKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + panic(sign.ErrContextNotSupported) + } + return Verify(pub, msg, sig) +} + +func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { + if len(seed) != SeedSize { + panic(sign.ErrSeedSize) + } + var seed2 [SeedSize]byte + copy(seed2[:], seed) + return NewKeyFromSeed(&seed2) +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { + if len(buf) != PublicKeySize { + return nil, sign.ErrPubKeySize + } + + var ( + buf2 [PublicKeySize]byte + ret PublicKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, sign.ErrPrivKeySize + } + + var ( + buf2 [PrivateKeySize]byte + ret PrivateKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (sk *PrivateKey) Scheme() sign.Scheme { + return sch +} + +func (sk *PublicKey) Scheme() sign.Scheme { + return sch +} diff --git a/sign/dilithium/mode3/internal/dilithium.go b/sign/dilithium/mode3/internal/dilithium.go index 59e43cc13..0f9b76dae 100644 --- a/sign/dilithium/mode3/internal/dilithium.go +++ b/sign/dilithium/mode3/internal/dilithium.go @@ -6,7 +6,7 @@ import ( "io" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -27,13 +27,13 @@ const ( Alpha = 2 * Gamma2 // Size of a packed private key - PrivateKeySize = 32 + 32 + 32 + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K + PrivateKeySize = 32 + 32 + TRSize + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K // Size of a packed public key PublicKeySize = 32 + common.PolyT1Size*K // Size of a packed signature - SignatureSize = L*PolyLeGamma1Size + Omega + K + 32 + SignatureSize = L*PolyLeGamma1Size + Omega + K + CTildeSize // Size of packed w₁ PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 @@ -47,7 +47,7 @@ type PublicKey struct { // Cached values t1p [common.PolyT1Size * K]byte A *Mat - tr *[32]byte + tr *[TRSize]byte } // PrivateKey is the type of Dilithium private keys. @@ -57,7 +57,7 @@ type PrivateKey struct { s1 VecL s2 VecK t0 VecK - tr [32]byte + tr [TRSize]byte // Cached values A Mat // ExpandA(ρ) @@ -69,14 +69,14 @@ type PrivateKey struct { type unpackedSignature struct { z VecL hint VecK - c [32]byte + c [CTildeSize]byte } // Packs the signature into buf. func (sig *unpackedSignature) Pack(buf []byte) { copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[32:]) - sig.hint.PackHint(buf[32+L*PolyLeGamma1Size:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) } // Sets sig to the signature encoded in the buffer. @@ -87,11 +87,11 @@ func (sig *unpackedSignature) Unpack(buf []byte) bool { return false } copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[32:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) if sig.z.Exceeds(Gamma1 - Beta) { return false } - if !sig.hint.UnpackHint(buf[32+L*PolyLeGamma1Size:]) { + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { return false } return true @@ -113,7 +113,7 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { pk.A.Derive(&pk.rho) // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([32]byte) + pk.tr = new([TRSize]byte) h := sha3.NewShake256() _, _ = h.Write(buf[:]) _, _ = h.Read(pk.tr[:]) @@ -123,8 +123,8 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { copy(buf[:32], sk.rho[:]) copy(buf[32:64], sk.key[:]) - copy(buf[64:96], sk.tr[:]) - offset := 96 + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize sk.s1.PackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.PackLeqEta(buf[offset:]) @@ -136,8 +136,8 @@ func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { copy(sk.rho[:], buf[:32]) copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:96]) - offset := 96 + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize sk.s1.UnpackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.UnpackLeqEta(buf[offset:]) @@ -178,6 +178,11 @@ func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { h := sha3.NewShake256() _, _ = h.Write(seed[:]) + + if NIST { + _, _ = h.Write([]byte{byte(K), byte(L)}) + } + _, _ = h.Read(eSeed[:]) copy(pk.rho[:], eSeed[:32]) @@ -242,13 +247,16 @@ func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// For Dilithium this is the top-level verification function. +// In ML-DSA, this is ML-DSA.Verify_internal. +func Verify(pk *PublicKey, msg func(io.Writer), signature []byte) bool { var sig unpackedSignature var mu [64]byte var zh VecL var Az, Az2dct1, w1 VecK var ch common.Poly - var cp [32]byte + var cp [CTildeSize]byte var w1Packed [PolyW1Size * K]byte // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β @@ -260,7 +268,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // Compute Az @@ -277,7 +285,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // which is small enough for NTT(). Az2dct1.MulBy2toD(&pk.t1) Az2dct1.NTT() - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -305,8 +313,11 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // SignTo signs the given message and writes the signature into signature. // +// For Dilithium this is the top-level signing function. For ML-DSA +// this is ML-DSA.Sign_internal. +// //nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg func(io.Writer), rnd [32]byte, signature []byte) { var mu, rhop [64]byte var w1Packed [PolyW1Size * K]byte var y, yh VecL @@ -322,12 +333,15 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + _, _ = h.Write(rnd[:]) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -366,7 +380,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode3/internal/dilithium_test.go b/sign/dilithium/mode3/internal/dilithium_test.go index 05320495d..a3f1126dd 100644 --- a/sign/dilithium/mode3/internal/dilithium_test.go +++ b/sign/dilithium/mode3/internal/dilithium_test.go @@ -2,9 +2,10 @@ package internal import ( "encoding/binary" + "io" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Checks whether p is normalized. Only used in tests. @@ -34,32 +35,38 @@ func BenchmarkVerify(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of verification (as in the reference // implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) b.ResetTimer() for i := 0; i < b.N; i++ { // We should generate a new signature for every verify attempt, // as this influences the time a little bit. This difference, however, // is small and generating a new signature in between creates a lot // pressure on the allocator which makes an accurate measurement hard. - Verify(pk, msg[:], sig[:]) + Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) } } func BenchmarkSign(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of signing (as in the reference implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) _, sk := NewKeyFromSeed(&seed) b.ResetTimer() for i := 0; i < b.N; i++ { binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) } } @@ -83,13 +90,16 @@ func BenchmarkPublicFromPrivate(b *testing.B) { } func TestSignThenVerifyAndPkSkPacking(t *testing.T) { - var seed [common.SeedSize]byte - var sig [SignatureSize]byte - var msg [8]byte - var pkb [PublicKeySize]byte - var skb [PrivateKeySize]byte - var pk2 PublicKey - var sk2 PrivateKey + var ( + seed [common.SeedSize]byte + sig [SignatureSize]byte + msg [8]byte + pkb [PublicKeySize]byte + skb [PrivateKeySize]byte + pk2 PublicKey + sk2 PrivateKey + rnd [32]byte + ) for i := uint64(0); i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], i) pk, sk := NewKeyFromSeed(&seed) @@ -98,8 +108,8 @@ func TestSignThenVerifyAndPkSkPacking(t *testing.T) { } for j := uint64(0); j < 10; j++ { binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) + if !Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) { t.Fatal() } } diff --git a/sign/dilithium/mode3/internal/mat.go b/sign/dilithium/mode3/internal/mat.go index ce39b7f9a..3d6cc47b2 100644 --- a/sign/dilithium/mode3/internal/mat.go +++ b/sign/dilithium/mode3/internal/mat.go @@ -1,7 +1,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A k by l matrix of polynomials. diff --git a/sign/dilithium/mode3/internal/pack.go b/sign/dilithium/mode3/internal/pack.go index 6a152d73e..d9c80d0e1 100644 --- a/sign/dilithium/mode3/internal/pack.go +++ b/sign/dilithium/mode3/internal/pack.go @@ -1,7 +1,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Writes p with norm less than or equal η into buf, which must be of diff --git a/sign/dilithium/mode3/internal/pack_test.go b/sign/dilithium/mode3/internal/pack_test.go index 1b6b2a613..d8143c810 100644 --- a/sign/dilithium/mode3/internal/pack_test.go +++ b/sign/dilithium/mode3/internal/pack_test.go @@ -3,7 +3,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestPolyPackLeqEta(t *testing.T) { diff --git a/sign/dilithium/mode3/internal/params.go b/sign/dilithium/mode3/internal/params.go index c22925234..5aa596d15 100644 --- a/sign/dilithium/mode3/internal/params.go +++ b/sign/dilithium/mode3/internal/params.go @@ -4,7 +4,6 @@ package internal const ( Name = "Dilithium3" - UseAES = false K = 6 L = 5 Eta = 4 @@ -13,4 +12,7 @@ const ( Tau = 49 Gamma1Bits = 19 Gamma2 = 261888 + NIST = false + TRSize = 32 + CTildeSize = 32 ) diff --git a/sign/dilithium/mode3/internal/params_test.go b/sign/dilithium/mode3/internal/params_test.go index 43d91c3f4..f1c93e297 100644 --- a/sign/dilithium/mode3/internal/params_test.go +++ b/sign/dilithium/mode3/internal/params_test.go @@ -3,7 +3,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Tests specific to the current mode diff --git a/sign/dilithium/mode3/internal/rounding.go b/sign/dilithium/mode3/internal/rounding.go index f44c951d2..4005e569c 100644 --- a/sign/dilithium/mode3/internal/rounding.go +++ b/sign/dilithium/mode3/internal/rounding.go @@ -1,7 +1,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, diff --git a/sign/dilithium/mode3/internal/rounding_test.go b/sign/dilithium/mode3/internal/rounding_test.go index 387815592..8d2310cb2 100644 --- a/sign/dilithium/mode3/internal/rounding_test.go +++ b/sign/dilithium/mode3/internal/rounding_test.go @@ -4,7 +4,7 @@ import ( "flag" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") diff --git a/sign/dilithium/mode3/internal/sample.go b/sign/dilithium/mode3/internal/sample.go index 256ec731f..f90d211d8 100644 --- a/sign/dilithium/mode3/internal/sample.go +++ b/sign/dilithium/mode3/internal/sample.go @@ -4,13 +4,13 @@ import ( "encoding/binary" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" "github.com/cloudflare/circl/simd/keccakf1600" ) // DeriveX4Available indicates whether the system supports the quick fourway // sampling variants like PolyDeriveUniformX4. -var DeriveX4Available = keccakf1600.IsEnabledX4() && !UseAES +var DeriveX4Available = keccakf1600.IsEnabledX4() // For each i, sample ps[i] uniformly from the given seed and nonces[i]. // ps[i] may be nil and is ignored in that case. @@ -89,13 +89,9 @@ func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { // p will be normalized. func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { var i, length int - var buf [12 * 16]byte // fits 168B SHAKE-128 rate and 12 16B AES blocks + var buf [12 * 16]byte // fits 168B SHAKE-128 rate - if UseAES { - length = 12 * 16 - } else { - length = 168 - } + length = 168 sample := func() { // Note that 3 divides into 168 and 12*16, so we use up buf completely. @@ -111,25 +107,16 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream128(seed, nonce) + var iv [32 + 2]byte // 32 byte seed + uint16 nonce + h := sha3.NewShake128() + copy(iv[:32], seed[:]) + iv[32] = uint8(nonce) + iv[33] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [32 + 2]byte // 32 byte seed + uint16 nonce - h := sha3.NewShake128() - copy(iv[:32], seed[:]) - iv[32] = uint8(nonce) - iv[33] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:168]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:168]) + sample() } } @@ -140,13 +127,9 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { // Assumes 2 < η < 8. var i, length int - var buf [9 * 16]byte // fits 136B SHAKE-256 rate and 9 16B AES blocks + var buf [9 * 16]byte // fits 136B SHAKE-256 rate - if UseAES { - length = 9 * 16 - } else { - length = 136 - } + length = 136 sample := func() { // We use rejection sampling @@ -179,28 +162,19 @@ func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream256(seed, nonce) - - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [64 + 2]byte // 64 byte seed + uint16 nonce + var iv [64 + 2]byte // 64 byte seed + uint16 nonce - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() } } @@ -221,18 +195,13 @@ func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { var buf [PolyLeGamma1Size]byte - if UseAES { - h := common.NewAesStream256(seed, nonce) - h.SqueezeInto(buf[:]) - } else { - var iv [66]byte - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - _, _ = h.Read(buf[:]) - } + var iv [66]byte + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) + _, _ = h.Read(buf[:]) PolyUnpackLeGamma1(p, buf[:]) } @@ -244,12 +213,12 @@ func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { // Can only be called when DeriveX4Available is true. // // This function is currently not used (yet). -func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { +func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { var perm keccakf1600.StateX4 state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 4; i++ { + for i := 0; i < CTildeSize/8; i++ { v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) for j := 0; j < 4; j++ { state[i*4+j] = v @@ -258,7 +227,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[4*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -325,7 +294,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // Samples p uniformly with τ non-zero coefficients in {q-1,1}. // // The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed *[32]byte) { +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { var buf [136]byte // SHAKE-256 rate is 136 h := sha3.NewShake256() diff --git a/sign/dilithium/mode3/internal/sample_test.go b/sign/dilithium/mode3/internal/sample_test.go index bae9d4055..69e56d31a 100644 --- a/sign/dilithium/mode3/internal/sample_test.go +++ b/sign/dilithium/mode3/internal/sample_test.go @@ -4,100 +4,52 @@ import ( "encoding/binary" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestVectorDeriveUniform(t *testing.T) { var p, p2 common.Poly var seed [32]byte - if UseAES { - p2 = common.Poly{ - 6724291, 310295, 6949524, 4464039, 1482136, 2522903, - 7025059, 3006320, 7286364, 7516512, 3361305, 1955529, - 4765954, 1725325, 6933066, 4299100, 6625173, 4272792, - 583034, 4971409, 2259140, 7715362, 3975394, 2341624, - 5481174, 8150082, 365246, 5491939, 1083120, 7517301, - 3104783, 2475292, 184149, 6425226, 4591622, 5964030, - 4729604, 5471092, 1828227, 1082044, 2516245, 1692580, - 3274844, 5443294, 7256740, 4989638, 3191250, 7479519, - 5124211, 5603858, 1230692, 2513454, 2828034, 4254312, - 1512596, 5245430, 5517392, 2814840, 932545, 6826733, - 3511094, 4075348, 3233981, 7268882, 2913733, 4870249, - 4123492, 8124406, 4016949, 5478752, 2750895, 603525, - 5724798, 3985430, 3483012, 6434230, 3136996, 8297976, - 4107616, 7307748, 6962904, 7544473, 1193110, 3448595, - 4814773, 5607932, 8221314, 1054046, 1541208, 1866050, - 8227412, 2925778, 5293953, 2065416, 4972769, 3616283, - 7990594, 1105530, 7121836, 1170740, 7417431, 633146, - 253820, 7235019, 3539504, 6807707, 451390, 5481526, - 2859902, 1063061, 4579730, 7126652, 7033767, 4294814, - 1414604, 7620048, 1953268, 8304556, 1156814, 1182881, - 5311519, 3057534, 5277666, 682843, 2070398, 2874278, - 4859533, 6376664, 6694074, 1590242, 2620706, 8331066, - 5643845, 5037538, 2891516, 7004879, 3754327, 5031296, - 5463118, 2420870, 8116529, 5517696, 7435129, 3873963, - 710407, 713806, 175647, 4274571, 2655021, 7319503, - 3027243, 7129679, 4213435, 2429323, 4643873, 4568526, - 649664, 1720514, 6497260, 2683517, 7672754, 7105190, - 3148405, 5898369, 5667677, 8050874, 1587139, 7315260, - 4337416, 2202680, 2338714, 557467, 6752058, 2469794, - 485071, 1617604, 3590498, 2151466, 2005823, 7727956, - 7776292, 6783433, 6787146, 1732833, 3596857, 7436284, - 4483349, 4970142, 4472608, 6478342, 1236215, 5695744, - 2280717, 2889355, 3233946, 5187812, 978685, 5177364, - 2922353, 4824807, 5302883, 6739803, 8092453, 5883903, - 816553, 6041174, 8317591, 1459178, 5332455, 1835058, - 1368601, 2820950, 3479224, 2589540, 7992934, 3421045, - 4657128, 8292902, 4153567, 3553988, 7830320, 6722913, - 2555309, 4149801, 8328975, 1560545, 7757473, 3106458, - 4310856, 7135453, 3481032, 652626, 1841361, 8126828, - 6250018, 300536, 7380070, 8174419, 1418793, 6208185, - 3906256, 6679016, 1605701, 3561489, 5819724, 5746996, - 8044214, 7087187, 7102330, 4962927, 4253983, 7108567, - 4119736, 6584065, 441634, 6941656, - } - } else { - p2 = common.Poly{ - 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, - 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, - 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, - 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, - 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, - 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, - 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, - 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, - 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, - 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, - 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, - 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, - 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, - 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, - 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, - 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, - 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, - 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, - 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, - 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, - 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, - 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, - 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, - 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, - 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, - 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, - 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, - 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, - 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, - 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, - 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, - 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, - 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, - 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, - 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, - 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, - 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, - 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, - 4352830, - } + p2 = common.Poly{ + 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, + 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, + 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, + 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, + 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, + 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, + 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, + 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, + 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, + 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, + 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, + 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, + 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, + 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, + 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, + 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, + 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, + 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, + 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, + 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, + 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, + 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, + 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, + 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, + 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, + 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, + 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, + 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, + 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, + 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, + 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, + 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, + 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, + 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, + 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, + 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, + 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, + 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, + 4352830, } for i := 0; i < 32; i++ { seed[i] = byte(i) @@ -150,10 +102,10 @@ func TestDeriveUniformLeGamma1(t *testing.T) { func TestDeriveUniformBall(t *testing.T) { var p common.Poly - var seed [32]byte + var seed [CTildeSize]byte for i := 0; i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) nonzero := 0 for j := 0; j < common.N; j++ { if p[j] != 0 { @@ -198,13 +150,13 @@ func TestDeriveUniformBallX4(t *testing.T) { } var ps [4]common.Poly var p common.Poly - var seed [32]byte + var seed [CTildeSize]byte PolyDeriveUniformBallX4( [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, - &seed, + seed[:], ) for j := 0; j < 4; j++ { - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) if ps[j] != p { t.Fatalf("%d\n%v\n%v", j, ps[j], p) } @@ -217,7 +169,7 @@ func BenchmarkPolyDeriveUniformBall(b *testing.B) { var w1 VecK for i := 0; i < b.N; i++ { w1[0][0] = uint32(i) - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) } } @@ -229,7 +181,7 @@ func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { w1[0][0] = uint32(i) PolyDeriveUniformBallX4( [4]*common.Poly{&p, &p, &p, &p}, - &seed, + seed[:], ) } } diff --git a/sign/dilithium/mode3/internal/vec.go b/sign/dilithium/mode3/internal/vec.go index 1a5fe4ca5..5817acb7f 100644 --- a/sign/dilithium/mode3/internal/vec.go +++ b/sign/dilithium/mode3/internal/vec.go @@ -1,7 +1,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A vector of L polynomials. diff --git a/sign/dilithium/mode3aes.go b/sign/dilithium/mode3aes.go deleted file mode 100644 index c4cca1863..000000000 --- a/sign/dilithium/mode3aes.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode3aes" -) - -// implMode3AES implements the mode.Mode interface for Dilithium3-AES. -type implMode3AES struct{} - -// Mode3AES is Dilithium in mode "Dilithium3-AES". -var Mode3AES Mode = &implMode3AES{} - -func (m *implMode3AES) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mode3aes.GenerateKey(rand) -} - -func (m *implMode3AES) NewKeyFromSeed(seed []byte) (PublicKey, - PrivateKey) { - if len(seed) != common.SeedSize { - panic(fmt.Sprintf("seed must be of length %d", common.SeedSize)) - } - seedBuf := [common.SeedSize]byte{} - copy(seedBuf[:], seed) - return mode3aes.NewKeyFromSeed(&seedBuf) -} - -func (m *implMode3AES) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mode3aes.PrivateKey) - ret := [mode3aes.SignatureSize]byte{} - mode3aes.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMode3AES) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mode3aes.PublicKey) - return mode3aes.Verify(ipk, msg, signature) -} - -func (m *implMode3AES) PublicKeyFromBytes(data []byte) PublicKey { - var ret mode3aes.PublicKey - if len(data) != mode3aes.PublicKeySize { - panic("packed public key must be of mode3aes.PublicKeySize bytes") - } - var buf [mode3aes.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode3AES) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mode3aes.PrivateKey - if len(data) != mode3aes.PrivateKeySize { - panic("packed public key must be of mode3aes.PrivateKeySize bytes") - } - var buf [mode3aes.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode3AES) SeedSize() int { - return common.SeedSize -} - -func (m *implMode3AES) PublicKeySize() int { - return mode3aes.PublicKeySize -} - -func (m *implMode3AES) PrivateKeySize() int { - return mode3aes.PrivateKeySize -} - -func (m *implMode3AES) SignatureSize() int { - return mode3aes.SignatureSize -} - -func (m *implMode3AES) Name() string { - return "Dilithium3-AES" -} - -func init() { - modes["Dilithium3-AES"] = Mode3AES -} diff --git a/sign/dilithium/mode3aes/dilithium.go b/sign/dilithium/mode3aes/dilithium.go deleted file mode 100644 index afc5e3e92..000000000 --- a/sign/dilithium/mode3aes/dilithium.go +++ /dev/null @@ -1,181 +0,0 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. - -// mode3aes implements the CRYSTALS-Dilithium signature scheme Dilithium3-AES -// as submitted to round3 of the NIST PQC competition and described in -// -// https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf -package mode3aes - -import ( - "crypto" - "errors" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode3aes/internal" -) - -const ( - // Size of seed for NewKeyFromSeed - SeedSize = common.SeedSize - - // Size of a packed PublicKey - PublicKeySize = internal.PublicKeySize - - // Size of a packed PrivateKey - PrivateKeySize = internal.PrivateKeySize - - // Size of a signature - SignatureSize = internal.SignatureSize -) - -// PublicKey is the type of Dilithium3-AES public key -type PublicKey internal.PublicKey - -// PrivateKey is the type of Dilithium3-AES private key -type PrivateKey internal.PrivateKey - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { - pk, sk, err := internal.GenerateKey(rand) - return (*PublicKey)(pk), (*PrivateKey)(sk), err -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { - pk, sk := internal.NewKeyFromSeed(seed) - return (*PublicKey)(pk), (*PrivateKey)(sk) -} - -// SignTo signs the given message and writes the signature into signature. -// It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - internal.SignTo( - (*internal.PrivateKey)(sk), - msg, - signature, - ) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - return internal.Verify( - (*internal.PublicKey)(pk), - msg, - signature, - ) -} - -// Sets pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - (*internal.PublicKey)(pk).Unpack(buf) -} - -// Sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - (*internal.PrivateKey)(sk).Unpack(buf) -} - -// Packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - (*internal.PublicKey)(pk).Pack(buf) -} - -// Packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - (*internal.PrivateKey)(sk).Pack(buf) -} - -// Packs the public key. -func (pk *PublicKey) Bytes() []byte { - var buf [PublicKeySize]byte - pk.Pack(&buf) - return buf[:] -} - -// Packs the private key. -func (sk *PrivateKey) Bytes() []byte { - var buf [PrivateKeySize]byte - sk.Pack(&buf) - return buf[:] -} - -// Packs the public key. -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - return pk.Bytes(), nil -} - -// Packs the private key. -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - return sk.Bytes(), nil -} - -// Unpacks the public key from data. -func (pk *PublicKey) UnmarshalBinary(data []byte) error { - if len(data) != PublicKeySize { - return errors.New("packed public key must be of mode3aes.PublicKeySize bytes") - } - var buf [PublicKeySize]byte - copy(buf[:], data) - pk.Unpack(&buf) - return nil -} - -// Unpacks the private key from data. -func (sk *PrivateKey) UnmarshalBinary(data []byte) error { - if len(data) != PrivateKeySize { - return errors.New("packed private key must be of mode3aes.PrivateKeySize bytes") - } - var buf [PrivateKeySize]byte - copy(buf[:], data) - sk.Unpack(&buf) - return nil -} - -// Sign signs the given message. -// -// opts.HashFunc() must return zero, which can be achieved by passing -// crypto.Hash(0) for opts. rand is ignored. Will only return an error -// if opts.HashFunc() is non-zero. -// -// This function is used to make PrivateKey implement the crypto.Signer -// interface. The package-level SignTo function might be more convenient -// to use. -func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( - signature []byte, err error) { - var sig [SignatureSize]byte - - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("dilithium: cannot sign hashed message") - } - - SignTo(sk, msg, sig[:]) - return sig[:], nil -} - -// Computes the public key corresponding to this private key. -// -// Returns a *PublicKey. The type crypto.PublicKey is used to make -// PrivateKey implement the crypto.Signer interface. -func (sk *PrivateKey) Public() crypto.PublicKey { - return (*PublicKey)((*internal.PrivateKey)(sk).Public()) -} - -// Equal returns whether the two private keys equal. -func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { - castOther, ok := other.(*PrivateKey) - if !ok { - return false - } - return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(castOther)) -} - -// Equal returns whether the two public keys equal. -func (pk *PublicKey) Equal(other crypto.PublicKey) bool { - castOther, ok := other.(*PublicKey) - if !ok { - return false - } - return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) -} diff --git a/sign/dilithium/mode3aes/internal/params_test.go b/sign/dilithium/mode3aes/internal/params_test.go deleted file mode 100644 index fc246ce73..000000000 --- a/sign/dilithium/mode3aes/internal/params_test.go +++ /dev/null @@ -1,101 +0,0 @@ -package internal - -import ( - "testing" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" -) - -// Tests specific to the current mode - -func TestVectorDeriveUniformLeqEta(t *testing.T) { - var p common.Poly - var seed [64]byte - p2 := common.Poly{ - 1, 8380415, 8380415, 8380414, 3, 0, 4, 0, 4, 8380415, - 8380414, 3, 0, 0, 8380413, 8380415, 3, 8380414, 3, 8380414, - 8380415, 1, 3, 1, 8380415, 4, 8380414, 8380416, 2, 8380415, - 4, 8380415, 3, 2, 3, 0, 1, 8380415, 2, 4, 8380413, 8380413, - 1, 8380416, 3, 0, 8380416, 3, 0, 8380416, 8380414, 3, - 8380416, 8380413, 2, 1, 3, 8380414, 8380416, 8380413, 4, - 3, 0, 0, 8380413, 8380414, 2, 2, 2, 2, 8380416, 8380414, - 2, 8380413, 8380413, 1, 8380415, 2, 1, 8380416, 2, 0, - 8380416, 2, 8380416, 8380413, 1, 1, 8380416, 4, 8380415, - 8380413, 4, 3, 8380416, 8380414, 0, 2, 4, 4, 8380415, 2, - 3, 8380416, 8380416, 2, 8380416, 8380416, 2, 4, 8380413, - 4, 2, 8380415, 4, 4, 3, 8380415, 0, 4, 4, 0, 4, 2, 8380413, - 0, 0, 8380414, 8380414, 1, 1, 8380413, 8380416, 2, 8380413, - 4, 8380416, 3, 8380416, 8380415, 8380415, 2, 0, 1, 8380416, - 8380413, 3, 1, 4, 1, 8380416, 0, 8380415, 8380415, 2, 2, - 0, 2, 3, 4, 1, 4, 2, 2, 8380414, 1, 8380414, 4, 1, 2, 3, - 2, 8380413, 8380416, 0, 8380415, 8380414, 2, 3, 2, 8380416, - 8380415, 2, 4, 8380414, 2, 2, 8380413, 8380415, 4, 0, 0, - 3, 8380414, 8380415, 4, 4, 8380416, 4, 8380416, 4, 1, 0, - 8380413, 8380414, 1, 3, 1, 8380413, 2, 8380413, 8380415, - 1, 1, 8380416, 0, 8380416, 2, 8380413, 8380416, 3, 1, 2, - 3, 8380415, 8380416, 8380416, 8380414, 8380415, 4, 8380416, - 0, 8380415, 1, 8380415, 8380414, 8380414, 8380416, 1, 0, - 4, 8380415, 1, 2, 8380416, 8380413, 8380416, 1, 4, 8380414, - 8380416, 8380414, 8380416, 8380415, 3, 4, - } - for i := 0; i < 64; i++ { - seed[i] = byte(i) - } - PolyDeriveUniformLeqEta(&p, &seed, 30000) - p.Normalize() - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} - -func TestVectorDeriveUniformLeGamma1(t *testing.T) { - var p, p2 common.Poly - var seed [64]byte - p2 = common.Poly{ - 91453, 8134283, 8211453, 8218977, 8362980, 431655, 98537, - 320966, 7892886, 144675, 495826, 7910635, 308711, 8024934, - 8314212, 8323958, 8242606, 7947101, 419492, 427692, 354075, - 21485, 456475, 213575, 362300, 8142303, 8322444, 7885879, - 89158, 181715, 8094655, 8303634, 8060028, 7920325, 192378, - 7910586, 7897074, 8097343, 7899868, 8339413, 73206, 237312, - 8183555, 348083, 8154041, 8364746, 8078364, 8312790, 105195, - 8037823, 8356712, 7994594, 240882, 70742, 8109371, 8176349, - 467152, 51422, 340432, 8030176, 342172, 154911, 64858, - 97614, 212758, 8285880, 521738, 326395, 296748, 8111442, - 8016327, 7953747, 158922, 330421, 8331843, 449771, 168214, - 8198309, 8228760, 7940533, 2498, 305217, 475829, 8037995, - 8250962, 305070, 8217080, 432779, 213808, 8162729, 381514, - 7995827, 7989202, 129047, 246099, 67554, 8233257, 398954, - 223629, 444125, 150369, 223365, 159236, 55259, 172419, - 163583, 354428, 8263789, 8017325, 8229594, 32340, 490228, - 450684, 8069619, 53733, 7932894, 7955848, 8197876, 201557, - 8307246, 446889, 8211538, 7889784, 8071108, 496027, 8159198, - 8037, 7973907, 248186, 4806, 185437, 457847, 138862, 8124477, - 284692, 8255820, 8068729, 8292005, 244272, 8061114, 21475, - 8058902, 421466, 8306487, 455649, 8218652, 7634, 148216, - 7951766, 394889, 8127579, 366374, 8062903, 8139245, 367068, - 8281027, 734, 396374, 7969282, 7977632, 8098596, 343569, - 8191282, 223874, 163783, 203572, 109732, 8229113, 8128208, - 321529, 296492, 8202474, 50404, 8336017, 8190899, 8191497, - 8279167, 336877, 7878526, 7922949, 7974614, 8076047, 8201365, - 8334333, 416495, 8090175, 150066, 7947253, 474615, 7937629, - 8027358, 356569, 191566, 87441, 8219157, 8375553, 8029697, - 8026188, 8193863, 295873, 7906281, 487687, 8363474, 386621, - 282726, 8373831, 50680, 8239505, 7912018, 493972, 8335677, - 8079840, 251210, 263667, 221541, 41291, 88028, 8373098, - 505241, 7981448, 8308113, 299485, 428036, 93865, 90428, - 392003, 80833, 7975521, 336649, 7950328, 8049195, 8332757, - 8205291, 8178296, 7911197, 7925805, 519154, 60176, 54121, - 222738, 464285, 8022604, 8174235, 7856202, 8291898, 473254, - 8106411, 7943812, 267650, 7958173, 372387, 409597, 204263, - 477847, 83925, 111791, - } - for i := 0; i < 64; i++ { - seed[i] = byte(i) - } - PolyDeriveUniformLeGamma1(&p, &seed, 30000) - p.Normalize() - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} diff --git a/sign/dilithium/mode3aes/internal/sample_test.go b/sign/dilithium/mode3aes/internal/sample_test.go deleted file mode 100644 index 1a0a4f72c..000000000 --- a/sign/dilithium/mode3aes/internal/sample_test.go +++ /dev/null @@ -1,266 +0,0 @@ -// Code generated from mode3/internal/sample_test.go by gen.go - -package internal - -import ( - "encoding/binary" - "testing" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" -) - -func TestVectorDeriveUniform(t *testing.T) { - var p, p2 common.Poly - var seed [32]byte - if UseAES { - p2 = common.Poly{ - 6724291, 310295, 6949524, 4464039, 1482136, 2522903, - 7025059, 3006320, 7286364, 7516512, 3361305, 1955529, - 4765954, 1725325, 6933066, 4299100, 6625173, 4272792, - 583034, 4971409, 2259140, 7715362, 3975394, 2341624, - 5481174, 8150082, 365246, 5491939, 1083120, 7517301, - 3104783, 2475292, 184149, 6425226, 4591622, 5964030, - 4729604, 5471092, 1828227, 1082044, 2516245, 1692580, - 3274844, 5443294, 7256740, 4989638, 3191250, 7479519, - 5124211, 5603858, 1230692, 2513454, 2828034, 4254312, - 1512596, 5245430, 5517392, 2814840, 932545, 6826733, - 3511094, 4075348, 3233981, 7268882, 2913733, 4870249, - 4123492, 8124406, 4016949, 5478752, 2750895, 603525, - 5724798, 3985430, 3483012, 6434230, 3136996, 8297976, - 4107616, 7307748, 6962904, 7544473, 1193110, 3448595, - 4814773, 5607932, 8221314, 1054046, 1541208, 1866050, - 8227412, 2925778, 5293953, 2065416, 4972769, 3616283, - 7990594, 1105530, 7121836, 1170740, 7417431, 633146, - 253820, 7235019, 3539504, 6807707, 451390, 5481526, - 2859902, 1063061, 4579730, 7126652, 7033767, 4294814, - 1414604, 7620048, 1953268, 8304556, 1156814, 1182881, - 5311519, 3057534, 5277666, 682843, 2070398, 2874278, - 4859533, 6376664, 6694074, 1590242, 2620706, 8331066, - 5643845, 5037538, 2891516, 7004879, 3754327, 5031296, - 5463118, 2420870, 8116529, 5517696, 7435129, 3873963, - 710407, 713806, 175647, 4274571, 2655021, 7319503, - 3027243, 7129679, 4213435, 2429323, 4643873, 4568526, - 649664, 1720514, 6497260, 2683517, 7672754, 7105190, - 3148405, 5898369, 5667677, 8050874, 1587139, 7315260, - 4337416, 2202680, 2338714, 557467, 6752058, 2469794, - 485071, 1617604, 3590498, 2151466, 2005823, 7727956, - 7776292, 6783433, 6787146, 1732833, 3596857, 7436284, - 4483349, 4970142, 4472608, 6478342, 1236215, 5695744, - 2280717, 2889355, 3233946, 5187812, 978685, 5177364, - 2922353, 4824807, 5302883, 6739803, 8092453, 5883903, - 816553, 6041174, 8317591, 1459178, 5332455, 1835058, - 1368601, 2820950, 3479224, 2589540, 7992934, 3421045, - 4657128, 8292902, 4153567, 3553988, 7830320, 6722913, - 2555309, 4149801, 8328975, 1560545, 7757473, 3106458, - 4310856, 7135453, 3481032, 652626, 1841361, 8126828, - 6250018, 300536, 7380070, 8174419, 1418793, 6208185, - 3906256, 6679016, 1605701, 3561489, 5819724, 5746996, - 8044214, 7087187, 7102330, 4962927, 4253983, 7108567, - 4119736, 6584065, 441634, 6941656, - } - } else { - p2 = common.Poly{ - 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, - 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, - 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, - 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, - 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, - 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, - 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, - 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, - 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, - 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, - 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, - 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, - 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, - 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, - 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, - 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, - 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, - 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, - 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, - 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, - 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, - 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, - 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, - 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, - 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, - 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, - 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, - 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, - 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, - 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, - 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, - 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, - 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, - 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, - 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, - 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, - 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, - 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, - 4352830, - } - } - for i := 0; i < 32; i++ { - seed[i] = byte(i) - } - PolyDeriveUniform(&p, &seed, 30000) - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} - -func TestDeriveUniform(t *testing.T) { - var p common.Poly - var seed [32]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniform(&p, &seed, uint16(i)) - if !PolyNormalized(&p) { - t.Fatal() - } - } -} - -func TestDeriveUniformLeqEta(t *testing.T) { - var p common.Poly - var seed [64]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformLeqEta(&p, &seed, uint16(i)) - for j := 0; j < common.N; j++ { - if p[j] < common.Q-Eta || p[j] > common.Q+Eta { - t.Fatal() - } - } - } -} - -func TestDeriveUniformLeGamma1(t *testing.T) { - var p common.Poly - var seed [64]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) - for j := 0; j < common.N; j++ { - if (p[j] > Gamma1 && p[j] <= common.Q-Gamma1) || p[j] >= common.Q { - t.Fatal() - } - } - } -} - -func TestDeriveUniformBall(t *testing.T) { - var p common.Poly - var seed [32]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformBall(&p, &seed) - nonzero := 0 - for j := 0; j < common.N; j++ { - if p[j] != 0 { - if p[j] != 1 && p[j] != common.Q-1 { - t.Fatal() - } - nonzero++ - } - } - if nonzero != Tau { - t.Fatal() - } - } -} - -func TestDeriveUniformX4(t *testing.T) { - if !DeriveX4Available { - t.SkipNow() - } - var ps [4]common.Poly - var p common.Poly - var seed [32]byte - nonces := [4]uint16{12345, 54321, 13532, 37377} - - for i := 0; i < len(seed); i++ { - seed[i] = byte(i) - } - - PolyDeriveUniformX4([4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, &seed, - nonces) - for i := 0; i < 4; i++ { - PolyDeriveUniform(&p, &seed, nonces[i]) - if ps[i] != p { - t.Fatal() - } - } -} - -func TestDeriveUniformBallX4(t *testing.T) { - if !DeriveX4Available { - t.SkipNow() - } - var ps [4]common.Poly - var p common.Poly - var seed [32]byte - PolyDeriveUniformBallX4( - [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, - &seed, - ) - for j := 0; j < 4; j++ { - PolyDeriveUniformBall(&p, &seed) - if ps[j] != p { - t.Fatalf("%d\n%v\n%v", j, ps[j], p) - } - } -} - -func BenchmarkPolyDeriveUniformBall(b *testing.B) { - var seed [32]byte - var p common.Poly - var w1 VecK - for i := 0; i < b.N; i++ { - w1[0][0] = uint32(i) - PolyDeriveUniformBall(&p, &seed) - } -} - -func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { - var seed [32]byte - var p common.Poly - var w1 VecK - for i := 0; i < b.N; i++ { - w1[0][0] = uint32(i) - PolyDeriveUniformBallX4( - [4]*common.Poly{&p, &p, &p, &p}, - &seed, - ) - } -} - -func BenchmarkPolyDeriveUniform(b *testing.B) { - var seed [32]byte - var p common.Poly - for i := 0; i < b.N; i++ { - PolyDeriveUniform(&p, &seed, uint16(i)) - } -} - -func BenchmarkPolyDeriveUniformX4(b *testing.B) { - if !DeriveX4Available { - b.SkipNow() - } - var seed [32]byte - var p [4]common.Poly - for i := 0; i < b.N; i++ { - nonce := uint16(4 * i) - PolyDeriveUniformX4([4]*common.Poly{&p[0], &p[1], &p[2], &p[3]}, - &seed, [4]uint16{nonce, nonce + 1, nonce + 2, nonce + 3}) - } -} - -func BenchmarkPolyDeriveUniformLeGamma1(b *testing.B) { - var seed [64]byte - var p common.Poly - for i := 0; i < b.N; i++ { - PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) - } -} diff --git a/sign/dilithium/mode5.go b/sign/dilithium/mode5.go deleted file mode 100644 index d6b7a9c73..000000000 --- a/sign/dilithium/mode5.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode5" -) - -// implMode5 implements the mode.Mode interface for Dilithium5. -type implMode5 struct{} - -// Mode5 is Dilithium in mode "Dilithium5". -var Mode5 Mode = &implMode5{} - -func (m *implMode5) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mode5.GenerateKey(rand) -} - -func (m *implMode5) NewKeyFromSeed(seed []byte) (PublicKey, - PrivateKey) { - if len(seed) != common.SeedSize { - panic(fmt.Sprintf("seed must be of length %d", common.SeedSize)) - } - seedBuf := [common.SeedSize]byte{} - copy(seedBuf[:], seed) - return mode5.NewKeyFromSeed(&seedBuf) -} - -func (m *implMode5) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mode5.PrivateKey) - ret := [mode5.SignatureSize]byte{} - mode5.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMode5) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mode5.PublicKey) - return mode5.Verify(ipk, msg, signature) -} - -func (m *implMode5) PublicKeyFromBytes(data []byte) PublicKey { - var ret mode5.PublicKey - if len(data) != mode5.PublicKeySize { - panic("packed public key must be of mode5.PublicKeySize bytes") - } - var buf [mode5.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode5) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mode5.PrivateKey - if len(data) != mode5.PrivateKeySize { - panic("packed public key must be of mode5.PrivateKeySize bytes") - } - var buf [mode5.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode5) SeedSize() int { - return common.SeedSize -} - -func (m *implMode5) PublicKeySize() int { - return mode5.PublicKeySize -} - -func (m *implMode5) PrivateKeySize() int { - return mode5.PrivateKeySize -} - -func (m *implMode5) SignatureSize() int { - return mode5.SignatureSize -} - -func (m *implMode5) Name() string { - return "Dilithium5" -} - -func init() { - modes["Dilithium5"] = Mode5 -} diff --git a/sign/dilithium/mode5/dilithium.go b/sign/dilithium/mode5/dilithium.go index 3a6a0cb93..ce3ec7546 100644 --- a/sign/dilithium/mode5/dilithium.go +++ b/sign/dilithium/mode5/dilithium.go @@ -1,4 +1,4 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. +// Code generated from pkg.templ.go. DO NOT EDIT. // mode5 implements the CRYSTALS-Dilithium signature scheme Dilithium5 // as submitted to round3 of the NIST PQC competition and described in @@ -11,8 +11,9 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + "github.com/cloudflare/circl/sign" "github.com/cloudflare/circl/sign/dilithium/mode5/internal" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -50,20 +51,27 @@ func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { // SignTo signs the given message and writes the signature into signature. // It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg, sig []byte) { + var rnd [32]byte + internal.SignTo( (*internal.PrivateKey)(sk), - msg, - signature, + func(w io.Writer) { + w.Write(msg) + }, + rnd, + sig, ) } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +func Verify(pk *PublicKey, msg, sig []byte) bool { return internal.Verify( (*internal.PublicKey)(pk), - msg, - signature, + func(w io.Writer) { + _, _ = w.Write(msg) + }, + sig, ) } @@ -143,15 +151,15 @@ func (sk *PrivateKey) UnmarshalBinary(data []byte) error { // interface. The package-level SignTo function might be more convenient // to use. func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( - signature []byte, err error) { - var sig [SignatureSize]byte + sig []byte, err error) { + var ret [SignatureSize]byte if opts.HashFunc() != crypto.Hash(0) { return nil, errors.New("dilithium: cannot sign hashed message") } + SignTo(sk, msg, ret[:]) - SignTo(sk, msg, sig[:]) - return sig[:], nil + return ret[:], nil } // Computes the public key corresponding to this private key. @@ -179,3 +187,109 @@ func (pk *PublicKey) Equal(other crypto.PublicKey) bool { } return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) } + +// Boilerplate for generic signatures API + +type scheme struct{} + +var sch sign.Scheme = &scheme{} + +// Scheme returns a generic signature interface for Dilithium5. +func Scheme() sign.Scheme { return sch } + +func (*scheme) Name() string { return "Dilithium5" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SignatureSize() int { return SignatureSize } +func (*scheme) SeedSize() int { return SeedSize } + +// TODO TLSIdentifier() and OID() + +func (*scheme) SupportsContext() bool { + return false +} + +func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { + return GenerateKey(nil) +} + +func (*scheme) Sign( + sk sign.PrivateKey, + msg []byte, + opts *sign.SignatureOpts, +) []byte { + sig := make([]byte, SignatureSize) + + priv, ok := sk.(*PrivateKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + panic(sign.ErrContextNotSupported) + } + SignTo(priv, msg, sig) + + return sig +} + +func (*scheme) Verify( + pk sign.PublicKey, + msg, sig []byte, + opts *sign.SignatureOpts, +) bool { + pub, ok := pk.(*PublicKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + panic(sign.ErrContextNotSupported) + } + return Verify(pub, msg, sig) +} + +func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { + if len(seed) != SeedSize { + panic(sign.ErrSeedSize) + } + var seed2 [SeedSize]byte + copy(seed2[:], seed) + return NewKeyFromSeed(&seed2) +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { + if len(buf) != PublicKeySize { + return nil, sign.ErrPubKeySize + } + + var ( + buf2 [PublicKeySize]byte + ret PublicKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, sign.ErrPrivKeySize + } + + var ( + buf2 [PrivateKeySize]byte + ret PrivateKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (sk *PrivateKey) Scheme() sign.Scheme { + return sch +} + +func (sk *PublicKey) Scheme() sign.Scheme { + return sch +} diff --git a/sign/dilithium/mode5/internal/dilithium.go b/sign/dilithium/mode5/internal/dilithium.go index 79a17d504..8f1c8e5cb 100644 --- a/sign/dilithium/mode5/internal/dilithium.go +++ b/sign/dilithium/mode5/internal/dilithium.go @@ -8,7 +8,7 @@ import ( "io" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -29,13 +29,13 @@ const ( Alpha = 2 * Gamma2 // Size of a packed private key - PrivateKeySize = 32 + 32 + 32 + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K + PrivateKeySize = 32 + 32 + TRSize + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K // Size of a packed public key PublicKeySize = 32 + common.PolyT1Size*K // Size of a packed signature - SignatureSize = L*PolyLeGamma1Size + Omega + K + 32 + SignatureSize = L*PolyLeGamma1Size + Omega + K + CTildeSize // Size of packed w₁ PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 @@ -49,7 +49,7 @@ type PublicKey struct { // Cached values t1p [common.PolyT1Size * K]byte A *Mat - tr *[32]byte + tr *[TRSize]byte } // PrivateKey is the type of Dilithium private keys. @@ -59,7 +59,7 @@ type PrivateKey struct { s1 VecL s2 VecK t0 VecK - tr [32]byte + tr [TRSize]byte // Cached values A Mat // ExpandA(ρ) @@ -71,14 +71,14 @@ type PrivateKey struct { type unpackedSignature struct { z VecL hint VecK - c [32]byte + c [CTildeSize]byte } // Packs the signature into buf. func (sig *unpackedSignature) Pack(buf []byte) { copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[32:]) - sig.hint.PackHint(buf[32+L*PolyLeGamma1Size:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) } // Sets sig to the signature encoded in the buffer. @@ -89,11 +89,11 @@ func (sig *unpackedSignature) Unpack(buf []byte) bool { return false } copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[32:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) if sig.z.Exceeds(Gamma1 - Beta) { return false } - if !sig.hint.UnpackHint(buf[32+L*PolyLeGamma1Size:]) { + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { return false } return true @@ -115,7 +115,7 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { pk.A.Derive(&pk.rho) // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([32]byte) + pk.tr = new([TRSize]byte) h := sha3.NewShake256() _, _ = h.Write(buf[:]) _, _ = h.Read(pk.tr[:]) @@ -125,8 +125,8 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { copy(buf[:32], sk.rho[:]) copy(buf[32:64], sk.key[:]) - copy(buf[64:96], sk.tr[:]) - offset := 96 + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize sk.s1.PackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.PackLeqEta(buf[offset:]) @@ -138,8 +138,8 @@ func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { copy(sk.rho[:], buf[:32]) copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:96]) - offset := 96 + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize sk.s1.UnpackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.UnpackLeqEta(buf[offset:]) @@ -180,6 +180,11 @@ func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { h := sha3.NewShake256() _, _ = h.Write(seed[:]) + + if NIST { + _, _ = h.Write([]byte{byte(K), byte(L)}) + } + _, _ = h.Read(eSeed[:]) copy(pk.rho[:], eSeed[:32]) @@ -244,13 +249,16 @@ func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// For Dilithium this is the top-level verification function. +// In ML-DSA, this is ML-DSA.Verify_internal. +func Verify(pk *PublicKey, msg func(io.Writer), signature []byte) bool { var sig unpackedSignature var mu [64]byte var zh VecL var Az, Az2dct1, w1 VecK var ch common.Poly - var cp [32]byte + var cp [CTildeSize]byte var w1Packed [PolyW1Size * K]byte // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β @@ -262,7 +270,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // Compute Az @@ -279,7 +287,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // which is small enough for NTT(). Az2dct1.MulBy2toD(&pk.t1) Az2dct1.NTT() - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +315,11 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // SignTo signs the given message and writes the signature into signature. // +// For Dilithium this is the top-level signing function. For ML-DSA +// this is ML-DSA.Sign_internal. +// //nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg func(io.Writer), rnd [32]byte, signature []byte) { var mu, rhop [64]byte var w1Packed [PolyW1Size * K]byte var y, yh VecL @@ -324,12 +335,15 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + _, _ = h.Write(rnd[:]) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +382,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode5/internal/dilithium_test.go b/sign/dilithium/mode5/internal/dilithium_test.go index ca347a831..47f53d3a0 100644 --- a/sign/dilithium/mode5/internal/dilithium_test.go +++ b/sign/dilithium/mode5/internal/dilithium_test.go @@ -4,9 +4,10 @@ package internal import ( "encoding/binary" + "io" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Checks whether p is normalized. Only used in tests. @@ -36,32 +37,38 @@ func BenchmarkVerify(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of verification (as in the reference // implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) b.ResetTimer() for i := 0; i < b.N; i++ { // We should generate a new signature for every verify attempt, // as this influences the time a little bit. This difference, however, // is small and generating a new signature in between creates a lot // pressure on the allocator which makes an accurate measurement hard. - Verify(pk, msg[:], sig[:]) + Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) } } func BenchmarkSign(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of signing (as in the reference implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) _, sk := NewKeyFromSeed(&seed) b.ResetTimer() for i := 0; i < b.N; i++ { binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) } } @@ -85,13 +92,16 @@ func BenchmarkPublicFromPrivate(b *testing.B) { } func TestSignThenVerifyAndPkSkPacking(t *testing.T) { - var seed [common.SeedSize]byte - var sig [SignatureSize]byte - var msg [8]byte - var pkb [PublicKeySize]byte - var skb [PrivateKeySize]byte - var pk2 PublicKey - var sk2 PrivateKey + var ( + seed [common.SeedSize]byte + sig [SignatureSize]byte + msg [8]byte + pkb [PublicKeySize]byte + skb [PrivateKeySize]byte + pk2 PublicKey + sk2 PrivateKey + rnd [32]byte + ) for i := uint64(0); i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], i) pk, sk := NewKeyFromSeed(&seed) @@ -100,8 +110,8 @@ func TestSignThenVerifyAndPkSkPacking(t *testing.T) { } for j := uint64(0); j < 10; j++ { binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) + if !Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) { t.Fatal() } } diff --git a/sign/dilithium/mode5/internal/mat.go b/sign/dilithium/mode5/internal/mat.go index cb473c149..ceaf634fa 100644 --- a/sign/dilithium/mode5/internal/mat.go +++ b/sign/dilithium/mode5/internal/mat.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A k by l matrix of polynomials. diff --git a/sign/dilithium/mode5/internal/pack.go b/sign/dilithium/mode5/internal/pack.go index 0285dfd8e..1854b4197 100644 --- a/sign/dilithium/mode5/internal/pack.go +++ b/sign/dilithium/mode5/internal/pack.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Writes p with norm less than or equal η into buf, which must be of diff --git a/sign/dilithium/mode5/internal/pack_test.go b/sign/dilithium/mode5/internal/pack_test.go index 24f568e4d..f952c6a09 100644 --- a/sign/dilithium/mode5/internal/pack_test.go +++ b/sign/dilithium/mode5/internal/pack_test.go @@ -5,7 +5,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestPolyPackLeqEta(t *testing.T) { diff --git a/sign/dilithium/mode5/internal/params.go b/sign/dilithium/mode5/internal/params.go index bad43e320..6f65f0336 100644 --- a/sign/dilithium/mode5/internal/params.go +++ b/sign/dilithium/mode5/internal/params.go @@ -4,7 +4,6 @@ package internal const ( Name = "Dilithium5" - UseAES = false K = 8 L = 7 Eta = 2 @@ -13,4 +12,7 @@ const ( Tau = 60 Gamma1Bits = 19 Gamma2 = 261888 + NIST = false + TRSize = 32 + CTildeSize = 32 ) diff --git a/sign/dilithium/mode5/internal/params_test.go b/sign/dilithium/mode5/internal/params_test.go index daabe6969..ac891117e 100644 --- a/sign/dilithium/mode5/internal/params_test.go +++ b/sign/dilithium/mode5/internal/params_test.go @@ -3,7 +3,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Tests specific to the current mode diff --git a/sign/dilithium/mode5/internal/rounding.go b/sign/dilithium/mode5/internal/rounding.go index 71360cb29..58123c090 100644 --- a/sign/dilithium/mode5/internal/rounding.go +++ b/sign/dilithium/mode5/internal/rounding.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, diff --git a/sign/dilithium/mode5/internal/rounding_test.go b/sign/dilithium/mode5/internal/rounding_test.go index 5824f2656..ad653ca3f 100644 --- a/sign/dilithium/mode5/internal/rounding_test.go +++ b/sign/dilithium/mode5/internal/rounding_test.go @@ -6,7 +6,7 @@ import ( "flag" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") diff --git a/sign/dilithium/mode5/internal/sample.go b/sign/dilithium/mode5/internal/sample.go index c47185ada..b37370a4e 100644 --- a/sign/dilithium/mode5/internal/sample.go +++ b/sign/dilithium/mode5/internal/sample.go @@ -6,13 +6,13 @@ import ( "encoding/binary" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" "github.com/cloudflare/circl/simd/keccakf1600" ) // DeriveX4Available indicates whether the system supports the quick fourway // sampling variants like PolyDeriveUniformX4. -var DeriveX4Available = keccakf1600.IsEnabledX4() && !UseAES +var DeriveX4Available = keccakf1600.IsEnabledX4() // For each i, sample ps[i] uniformly from the given seed and nonces[i]. // ps[i] may be nil and is ignored in that case. @@ -91,13 +91,9 @@ func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { // p will be normalized. func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { var i, length int - var buf [12 * 16]byte // fits 168B SHAKE-128 rate and 12 16B AES blocks + var buf [12 * 16]byte // fits 168B SHAKE-128 rate - if UseAES { - length = 12 * 16 - } else { - length = 168 - } + length = 168 sample := func() { // Note that 3 divides into 168 and 12*16, so we use up buf completely. @@ -113,25 +109,16 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream128(seed, nonce) + var iv [32 + 2]byte // 32 byte seed + uint16 nonce + h := sha3.NewShake128() + copy(iv[:32], seed[:]) + iv[32] = uint8(nonce) + iv[33] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [32 + 2]byte // 32 byte seed + uint16 nonce - h := sha3.NewShake128() - copy(iv[:32], seed[:]) - iv[32] = uint8(nonce) - iv[33] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:168]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:168]) + sample() } } @@ -142,13 +129,9 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { // Assumes 2 < η < 8. var i, length int - var buf [9 * 16]byte // fits 136B SHAKE-256 rate and 9 16B AES blocks + var buf [9 * 16]byte // fits 136B SHAKE-256 rate - if UseAES { - length = 9 * 16 - } else { - length = 136 - } + length = 136 sample := func() { // We use rejection sampling @@ -181,28 +164,19 @@ func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream256(seed, nonce) - - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [64 + 2]byte // 64 byte seed + uint16 nonce + var iv [64 + 2]byte // 64 byte seed + uint16 nonce - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() } } @@ -223,18 +197,13 @@ func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { var buf [PolyLeGamma1Size]byte - if UseAES { - h := common.NewAesStream256(seed, nonce) - h.SqueezeInto(buf[:]) - } else { - var iv [66]byte - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - _, _ = h.Read(buf[:]) - } + var iv [66]byte + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) + _, _ = h.Read(buf[:]) PolyUnpackLeGamma1(p, buf[:]) } @@ -246,12 +215,12 @@ func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { // Can only be called when DeriveX4Available is true. // // This function is currently not used (yet). -func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { +func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { var perm keccakf1600.StateX4 state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 4; i++ { + for i := 0; i < CTildeSize/8; i++ { v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) for j := 0; j < 4; j++ { state[i*4+j] = v @@ -260,7 +229,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[4*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +296,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // Samples p uniformly with τ non-zero coefficients in {q-1,1}. // // The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed *[32]byte) { +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { var buf [136]byte // SHAKE-256 rate is 136 h := sha3.NewShake256() diff --git a/sign/dilithium/mode5/internal/sample_test.go b/sign/dilithium/mode5/internal/sample_test.go index 1a0a4f72c..32931c94f 100644 --- a/sign/dilithium/mode5/internal/sample_test.go +++ b/sign/dilithium/mode5/internal/sample_test.go @@ -6,100 +6,52 @@ import ( "encoding/binary" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestVectorDeriveUniform(t *testing.T) { var p, p2 common.Poly var seed [32]byte - if UseAES { - p2 = common.Poly{ - 6724291, 310295, 6949524, 4464039, 1482136, 2522903, - 7025059, 3006320, 7286364, 7516512, 3361305, 1955529, - 4765954, 1725325, 6933066, 4299100, 6625173, 4272792, - 583034, 4971409, 2259140, 7715362, 3975394, 2341624, - 5481174, 8150082, 365246, 5491939, 1083120, 7517301, - 3104783, 2475292, 184149, 6425226, 4591622, 5964030, - 4729604, 5471092, 1828227, 1082044, 2516245, 1692580, - 3274844, 5443294, 7256740, 4989638, 3191250, 7479519, - 5124211, 5603858, 1230692, 2513454, 2828034, 4254312, - 1512596, 5245430, 5517392, 2814840, 932545, 6826733, - 3511094, 4075348, 3233981, 7268882, 2913733, 4870249, - 4123492, 8124406, 4016949, 5478752, 2750895, 603525, - 5724798, 3985430, 3483012, 6434230, 3136996, 8297976, - 4107616, 7307748, 6962904, 7544473, 1193110, 3448595, - 4814773, 5607932, 8221314, 1054046, 1541208, 1866050, - 8227412, 2925778, 5293953, 2065416, 4972769, 3616283, - 7990594, 1105530, 7121836, 1170740, 7417431, 633146, - 253820, 7235019, 3539504, 6807707, 451390, 5481526, - 2859902, 1063061, 4579730, 7126652, 7033767, 4294814, - 1414604, 7620048, 1953268, 8304556, 1156814, 1182881, - 5311519, 3057534, 5277666, 682843, 2070398, 2874278, - 4859533, 6376664, 6694074, 1590242, 2620706, 8331066, - 5643845, 5037538, 2891516, 7004879, 3754327, 5031296, - 5463118, 2420870, 8116529, 5517696, 7435129, 3873963, - 710407, 713806, 175647, 4274571, 2655021, 7319503, - 3027243, 7129679, 4213435, 2429323, 4643873, 4568526, - 649664, 1720514, 6497260, 2683517, 7672754, 7105190, - 3148405, 5898369, 5667677, 8050874, 1587139, 7315260, - 4337416, 2202680, 2338714, 557467, 6752058, 2469794, - 485071, 1617604, 3590498, 2151466, 2005823, 7727956, - 7776292, 6783433, 6787146, 1732833, 3596857, 7436284, - 4483349, 4970142, 4472608, 6478342, 1236215, 5695744, - 2280717, 2889355, 3233946, 5187812, 978685, 5177364, - 2922353, 4824807, 5302883, 6739803, 8092453, 5883903, - 816553, 6041174, 8317591, 1459178, 5332455, 1835058, - 1368601, 2820950, 3479224, 2589540, 7992934, 3421045, - 4657128, 8292902, 4153567, 3553988, 7830320, 6722913, - 2555309, 4149801, 8328975, 1560545, 7757473, 3106458, - 4310856, 7135453, 3481032, 652626, 1841361, 8126828, - 6250018, 300536, 7380070, 8174419, 1418793, 6208185, - 3906256, 6679016, 1605701, 3561489, 5819724, 5746996, - 8044214, 7087187, 7102330, 4962927, 4253983, 7108567, - 4119736, 6584065, 441634, 6941656, - } - } else { - p2 = common.Poly{ - 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, - 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, - 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, - 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, - 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, - 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, - 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, - 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, - 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, - 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, - 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, - 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, - 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, - 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, - 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, - 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, - 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, - 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, - 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, - 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, - 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, - 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, - 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, - 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, - 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, - 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, - 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, - 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, - 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, - 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, - 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, - 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, - 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, - 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, - 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, - 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, - 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, - 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, - 4352830, - } + p2 = common.Poly{ + 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, + 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, + 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, + 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, + 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, + 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, + 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, + 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, + 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, + 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, + 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, + 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, + 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, + 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, + 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, + 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, + 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, + 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, + 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, + 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, + 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, + 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, + 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, + 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, + 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, + 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, + 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, + 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, + 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, + 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, + 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, + 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, + 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, + 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, + 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, + 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, + 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, + 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, + 4352830, } for i := 0; i < 32; i++ { seed[i] = byte(i) @@ -152,10 +104,10 @@ func TestDeriveUniformLeGamma1(t *testing.T) { func TestDeriveUniformBall(t *testing.T) { var p common.Poly - var seed [32]byte + var seed [CTildeSize]byte for i := 0; i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) nonzero := 0 for j := 0; j < common.N; j++ { if p[j] != 0 { @@ -200,13 +152,13 @@ func TestDeriveUniformBallX4(t *testing.T) { } var ps [4]common.Poly var p common.Poly - var seed [32]byte + var seed [CTildeSize]byte PolyDeriveUniformBallX4( [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, - &seed, + seed[:], ) for j := 0; j < 4; j++ { - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) if ps[j] != p { t.Fatalf("%d\n%v\n%v", j, ps[j], p) } @@ -219,7 +171,7 @@ func BenchmarkPolyDeriveUniformBall(b *testing.B) { var w1 VecK for i := 0; i < b.N; i++ { w1[0][0] = uint32(i) - PolyDeriveUniformBall(&p, &seed) + PolyDeriveUniformBall(&p, seed[:]) } } @@ -231,7 +183,7 @@ func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { w1[0][0] = uint32(i) PolyDeriveUniformBallX4( [4]*common.Poly{&p, &p, &p, &p}, - &seed, + seed[:], ) } } diff --git a/sign/dilithium/mode5/internal/vec.go b/sign/dilithium/mode5/internal/vec.go index f52973e45..d07d3b245 100644 --- a/sign/dilithium/mode5/internal/vec.go +++ b/sign/dilithium/mode5/internal/vec.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A vector of L polynomials. diff --git a/sign/dilithium/mode5aes.go b/sign/dilithium/mode5aes.go deleted file mode 100644 index 258b8a825..000000000 --- a/sign/dilithium/mode5aes.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode5aes" -) - -// implMode5AES implements the mode.Mode interface for Dilithium5-AES. -type implMode5AES struct{} - -// Mode5AES is Dilithium in mode "Dilithium5-AES". -var Mode5AES Mode = &implMode5AES{} - -func (m *implMode5AES) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mode5aes.GenerateKey(rand) -} - -func (m *implMode5AES) NewKeyFromSeed(seed []byte) (PublicKey, - PrivateKey) { - if len(seed) != common.SeedSize { - panic(fmt.Sprintf("seed must be of length %d", common.SeedSize)) - } - seedBuf := [common.SeedSize]byte{} - copy(seedBuf[:], seed) - return mode5aes.NewKeyFromSeed(&seedBuf) -} - -func (m *implMode5AES) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mode5aes.PrivateKey) - ret := [mode5aes.SignatureSize]byte{} - mode5aes.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMode5AES) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mode5aes.PublicKey) - return mode5aes.Verify(ipk, msg, signature) -} - -func (m *implMode5AES) PublicKeyFromBytes(data []byte) PublicKey { - var ret mode5aes.PublicKey - if len(data) != mode5aes.PublicKeySize { - panic("packed public key must be of mode5aes.PublicKeySize bytes") - } - var buf [mode5aes.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode5AES) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mode5aes.PrivateKey - if len(data) != mode5aes.PrivateKeySize { - panic("packed public key must be of mode5aes.PrivateKeySize bytes") - } - var buf [mode5aes.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMode5AES) SeedSize() int { - return common.SeedSize -} - -func (m *implMode5AES) PublicKeySize() int { - return mode5aes.PublicKeySize -} - -func (m *implMode5AES) PrivateKeySize() int { - return mode5aes.PrivateKeySize -} - -func (m *implMode5AES) SignatureSize() int { - return mode5aes.SignatureSize -} - -func (m *implMode5AES) Name() string { - return "Dilithium5-AES" -} - -func init() { - modes["Dilithium5-AES"] = Mode5AES -} diff --git a/sign/dilithium/mode5aes/dilithium.go b/sign/dilithium/mode5aes/dilithium.go deleted file mode 100644 index 2a0f05e7a..000000000 --- a/sign/dilithium/mode5aes/dilithium.go +++ /dev/null @@ -1,181 +0,0 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. - -// mode5aes implements the CRYSTALS-Dilithium signature scheme Dilithium5-AES -// as submitted to round3 of the NIST PQC competition and described in -// -// https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf -package mode5aes - -import ( - "crypto" - "errors" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/mode5aes/internal" -) - -const ( - // Size of seed for NewKeyFromSeed - SeedSize = common.SeedSize - - // Size of a packed PublicKey - PublicKeySize = internal.PublicKeySize - - // Size of a packed PrivateKey - PrivateKeySize = internal.PrivateKeySize - - // Size of a signature - SignatureSize = internal.SignatureSize -) - -// PublicKey is the type of Dilithium5-AES public key -type PublicKey internal.PublicKey - -// PrivateKey is the type of Dilithium5-AES private key -type PrivateKey internal.PrivateKey - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { - pk, sk, err := internal.GenerateKey(rand) - return (*PublicKey)(pk), (*PrivateKey)(sk), err -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { - pk, sk := internal.NewKeyFromSeed(seed) - return (*PublicKey)(pk), (*PrivateKey)(sk) -} - -// SignTo signs the given message and writes the signature into signature. -// It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - internal.SignTo( - (*internal.PrivateKey)(sk), - msg, - signature, - ) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - return internal.Verify( - (*internal.PublicKey)(pk), - msg, - signature, - ) -} - -// Sets pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - (*internal.PublicKey)(pk).Unpack(buf) -} - -// Sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - (*internal.PrivateKey)(sk).Unpack(buf) -} - -// Packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - (*internal.PublicKey)(pk).Pack(buf) -} - -// Packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - (*internal.PrivateKey)(sk).Pack(buf) -} - -// Packs the public key. -func (pk *PublicKey) Bytes() []byte { - var buf [PublicKeySize]byte - pk.Pack(&buf) - return buf[:] -} - -// Packs the private key. -func (sk *PrivateKey) Bytes() []byte { - var buf [PrivateKeySize]byte - sk.Pack(&buf) - return buf[:] -} - -// Packs the public key. -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - return pk.Bytes(), nil -} - -// Packs the private key. -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - return sk.Bytes(), nil -} - -// Unpacks the public key from data. -func (pk *PublicKey) UnmarshalBinary(data []byte) error { - if len(data) != PublicKeySize { - return errors.New("packed public key must be of mode5aes.PublicKeySize bytes") - } - var buf [PublicKeySize]byte - copy(buf[:], data) - pk.Unpack(&buf) - return nil -} - -// Unpacks the private key from data. -func (sk *PrivateKey) UnmarshalBinary(data []byte) error { - if len(data) != PrivateKeySize { - return errors.New("packed private key must be of mode5aes.PrivateKeySize bytes") - } - var buf [PrivateKeySize]byte - copy(buf[:], data) - sk.Unpack(&buf) - return nil -} - -// Sign signs the given message. -// -// opts.HashFunc() must return zero, which can be achieved by passing -// crypto.Hash(0) for opts. rand is ignored. Will only return an error -// if opts.HashFunc() is non-zero. -// -// This function is used to make PrivateKey implement the crypto.Signer -// interface. The package-level SignTo function might be more convenient -// to use. -func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( - signature []byte, err error) { - var sig [SignatureSize]byte - - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("dilithium: cannot sign hashed message") - } - - SignTo(sk, msg, sig[:]) - return sig[:], nil -} - -// Computes the public key corresponding to this private key. -// -// Returns a *PublicKey. The type crypto.PublicKey is used to make -// PrivateKey implement the crypto.Signer interface. -func (sk *PrivateKey) Public() crypto.PublicKey { - return (*PublicKey)((*internal.PrivateKey)(sk).Public()) -} - -// Equal returns whether the two private keys equal. -func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { - castOther, ok := other.(*PrivateKey) - if !ok { - return false - } - return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(castOther)) -} - -// Equal returns whether the two public keys equal. -func (pk *PublicKey) Equal(other crypto.PublicKey) bool { - castOther, ok := other.(*PublicKey) - if !ok { - return false - } - return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) -} diff --git a/sign/dilithium/mode5aes/internal/params_test.go b/sign/dilithium/mode5aes/internal/params_test.go deleted file mode 100644 index a5e746f68..000000000 --- a/sign/dilithium/mode5aes/internal/params_test.go +++ /dev/null @@ -1,100 +0,0 @@ -package internal - -import ( - "testing" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" -) - -// Tests specific to the current mode - -func TestVectorDeriveUniformLeqEta(t *testing.T) { - var p common.Poly - var seed [64]byte - p2 := common.Poly{ - 8380416, 0, 2, 8380415, 1, 1, 0, 1, 0, 1, 8380415, 2, - 8380415, 8380415, 2, 2, 2, 1, 0, 2, 8380416, 1, 8380415, - 8380415, 8380416, 8380415, 8380416, 8380415, 1, 1, 0, 1, - 0, 1, 2, 8380416, 2, 1, 8380416, 1, 1, 2, 0, 8380416, - 8380416, 2, 0, 2, 8380415, 0, 1, 2, 1, 1, 1, 0, 8380415, - 1, 2, 8380415, 8380416, 1, 8380415, 0, 1, 8380416, 8380416, - 8380415, 0, 2, 8380415, 1, 8380416, 0, 8380416, 8380416, - 8380416, 2, 2, 1, 2, 8380415, 2, 0, 8380415, 8380415, 0, - 2, 8380415, 8380415, 1, 8380415, 2, 8380415, 0, 1, 2, - 8380415, 8380416, 8380415, 0, 8380416, 1, 0, 2, 0, 2, - 8380415, 8380416, 2, 1, 8380415, 1, 8380416, 1, 8380415, - 8380415, 0, 8380416, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 8380415, - 8380416, 2, 0, 1, 8380416, 2, 1, 8380416, 2, 1, 8380416, - 0, 2, 8380416, 2, 0, 8380415, 0, 2, 0, 8380415, 1, 0, - 8380415, 2, 8380416, 8380416, 8380415, 0, 0, 8380416, 2, - 2, 1, 8380416, 2, 1, 2, 0, 8380415, 1, 0, 2, 2, 1, 0, 0, - 1, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 8380416, 2, 2, 0, 8380415, - 1, 2, 2, 1, 1, 8380415, 8380415, 2, 2, 1, 8380416, 8380415, - 2, 1, 0, 8380416, 8380415, 8380415, 0, 1, 0, 8380416, - 8380416, 8380416, 8380416, 2, 8380415, 1, 8380415, 0, 1, - 0, 8380416, 2, 8380415, 2, 1, 2, 1, 1, 0, 8380415, 2, - 8380416, 8380416, 8380415, 8380415, 0, 2, 8380416, 1, - 8380416, 8380415, 8380416, 8380415, 2, 8380416, 2, 8380415, - 2, 2, 1, 8380415, - } - for i := 0; i < 64; i++ { - seed[i] = byte(i) - } - PolyDeriveUniformLeqEta(&p, &seed, 30000) - p.Normalize() - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} - -func TestVectorDeriveUniformLeGamma1(t *testing.T) { - var p, p2 common.Poly - var seed [64]byte - p2 = common.Poly{ - 91453, 8134283, 8211453, 8218977, 8362980, 431655, 98537, - 320966, 7892886, 144675, 495826, 7910635, 308711, 8024934, - 8314212, 8323958, 8242606, 7947101, 419492, 427692, 354075, - 21485, 456475, 213575, 362300, 8142303, 8322444, 7885879, - 89158, 181715, 8094655, 8303634, 8060028, 7920325, 192378, - 7910586, 7897074, 8097343, 7899868, 8339413, 73206, 237312, - 8183555, 348083, 8154041, 8364746, 8078364, 8312790, 105195, - 8037823, 8356712, 7994594, 240882, 70742, 8109371, 8176349, - 467152, 51422, 340432, 8030176, 342172, 154911, 64858, - 97614, 212758, 8285880, 521738, 326395, 296748, 8111442, - 8016327, 7953747, 158922, 330421, 8331843, 449771, 168214, - 8198309, 8228760, 7940533, 2498, 305217, 475829, 8037995, - 8250962, 305070, 8217080, 432779, 213808, 8162729, 381514, - 7995827, 7989202, 129047, 246099, 67554, 8233257, 398954, - 223629, 444125, 150369, 223365, 159236, 55259, 172419, - 163583, 354428, 8263789, 8017325, 8229594, 32340, 490228, - 450684, 8069619, 53733, 7932894, 7955848, 8197876, 201557, - 8307246, 446889, 8211538, 7889784, 8071108, 496027, 8159198, - 8037, 7973907, 248186, 4806, 185437, 457847, 138862, 8124477, - 284692, 8255820, 8068729, 8292005, 244272, 8061114, 21475, - 8058902, 421466, 8306487, 455649, 8218652, 7634, 148216, - 7951766, 394889, 8127579, 366374, 8062903, 8139245, 367068, - 8281027, 734, 396374, 7969282, 7977632, 8098596, 343569, - 8191282, 223874, 163783, 203572, 109732, 8229113, 8128208, - 321529, 296492, 8202474, 50404, 8336017, 8190899, 8191497, - 8279167, 336877, 7878526, 7922949, 7974614, 8076047, 8201365, - 8334333, 416495, 8090175, 150066, 7947253, 474615, 7937629, - 8027358, 356569, 191566, 87441, 8219157, 8375553, 8029697, - 8026188, 8193863, 295873, 7906281, 487687, 8363474, 386621, - 282726, 8373831, 50680, 8239505, 7912018, 493972, 8335677, - 8079840, 251210, 263667, 221541, 41291, 88028, 8373098, - 505241, 7981448, 8308113, 299485, 428036, 93865, 90428, - 392003, 80833, 7975521, 336649, 7950328, 8049195, 8332757, - 8205291, 8178296, 7911197, 7925805, 519154, 60176, 54121, - 222738, 464285, 8022604, 8174235, 7856202, 8291898, 473254, - 8106411, 7943812, 267650, 7958173, 372387, 409597, 204263, - 477847, 83925, 111791, - } - for i := 0; i < 64; i++ { - seed[i] = byte(i) - } - PolyDeriveUniformLeGamma1(&p, &seed, 30000) - p.Normalize() - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} diff --git a/sign/dilithium/mode5aes/internal/sample_test.go b/sign/dilithium/mode5aes/internal/sample_test.go deleted file mode 100644 index 1a0a4f72c..000000000 --- a/sign/dilithium/mode5aes/internal/sample_test.go +++ /dev/null @@ -1,266 +0,0 @@ -// Code generated from mode3/internal/sample_test.go by gen.go - -package internal - -import ( - "encoding/binary" - "testing" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" -) - -func TestVectorDeriveUniform(t *testing.T) { - var p, p2 common.Poly - var seed [32]byte - if UseAES { - p2 = common.Poly{ - 6724291, 310295, 6949524, 4464039, 1482136, 2522903, - 7025059, 3006320, 7286364, 7516512, 3361305, 1955529, - 4765954, 1725325, 6933066, 4299100, 6625173, 4272792, - 583034, 4971409, 2259140, 7715362, 3975394, 2341624, - 5481174, 8150082, 365246, 5491939, 1083120, 7517301, - 3104783, 2475292, 184149, 6425226, 4591622, 5964030, - 4729604, 5471092, 1828227, 1082044, 2516245, 1692580, - 3274844, 5443294, 7256740, 4989638, 3191250, 7479519, - 5124211, 5603858, 1230692, 2513454, 2828034, 4254312, - 1512596, 5245430, 5517392, 2814840, 932545, 6826733, - 3511094, 4075348, 3233981, 7268882, 2913733, 4870249, - 4123492, 8124406, 4016949, 5478752, 2750895, 603525, - 5724798, 3985430, 3483012, 6434230, 3136996, 8297976, - 4107616, 7307748, 6962904, 7544473, 1193110, 3448595, - 4814773, 5607932, 8221314, 1054046, 1541208, 1866050, - 8227412, 2925778, 5293953, 2065416, 4972769, 3616283, - 7990594, 1105530, 7121836, 1170740, 7417431, 633146, - 253820, 7235019, 3539504, 6807707, 451390, 5481526, - 2859902, 1063061, 4579730, 7126652, 7033767, 4294814, - 1414604, 7620048, 1953268, 8304556, 1156814, 1182881, - 5311519, 3057534, 5277666, 682843, 2070398, 2874278, - 4859533, 6376664, 6694074, 1590242, 2620706, 8331066, - 5643845, 5037538, 2891516, 7004879, 3754327, 5031296, - 5463118, 2420870, 8116529, 5517696, 7435129, 3873963, - 710407, 713806, 175647, 4274571, 2655021, 7319503, - 3027243, 7129679, 4213435, 2429323, 4643873, 4568526, - 649664, 1720514, 6497260, 2683517, 7672754, 7105190, - 3148405, 5898369, 5667677, 8050874, 1587139, 7315260, - 4337416, 2202680, 2338714, 557467, 6752058, 2469794, - 485071, 1617604, 3590498, 2151466, 2005823, 7727956, - 7776292, 6783433, 6787146, 1732833, 3596857, 7436284, - 4483349, 4970142, 4472608, 6478342, 1236215, 5695744, - 2280717, 2889355, 3233946, 5187812, 978685, 5177364, - 2922353, 4824807, 5302883, 6739803, 8092453, 5883903, - 816553, 6041174, 8317591, 1459178, 5332455, 1835058, - 1368601, 2820950, 3479224, 2589540, 7992934, 3421045, - 4657128, 8292902, 4153567, 3553988, 7830320, 6722913, - 2555309, 4149801, 8328975, 1560545, 7757473, 3106458, - 4310856, 7135453, 3481032, 652626, 1841361, 8126828, - 6250018, 300536, 7380070, 8174419, 1418793, 6208185, - 3906256, 6679016, 1605701, 3561489, 5819724, 5746996, - 8044214, 7087187, 7102330, 4962927, 4253983, 7108567, - 4119736, 6584065, 441634, 6941656, - } - } else { - p2 = common.Poly{ - 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, - 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, - 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, - 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, - 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, - 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, - 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, - 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, - 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, - 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, - 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, - 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, - 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, - 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, - 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, - 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, - 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, - 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, - 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, - 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, - 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, - 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, - 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, - 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, - 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, - 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, - 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, - 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, - 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, - 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, - 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, - 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, - 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, - 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, - 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, - 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, - 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, - 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, - 4352830, - } - } - for i := 0; i < 32; i++ { - seed[i] = byte(i) - } - PolyDeriveUniform(&p, &seed, 30000) - if p != p2 { - t.Fatalf("%v != %v", p, p2) - } -} - -func TestDeriveUniform(t *testing.T) { - var p common.Poly - var seed [32]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniform(&p, &seed, uint16(i)) - if !PolyNormalized(&p) { - t.Fatal() - } - } -} - -func TestDeriveUniformLeqEta(t *testing.T) { - var p common.Poly - var seed [64]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformLeqEta(&p, &seed, uint16(i)) - for j := 0; j < common.N; j++ { - if p[j] < common.Q-Eta || p[j] > common.Q+Eta { - t.Fatal() - } - } - } -} - -func TestDeriveUniformLeGamma1(t *testing.T) { - var p common.Poly - var seed [64]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) - for j := 0; j < common.N; j++ { - if (p[j] > Gamma1 && p[j] <= common.Q-Gamma1) || p[j] >= common.Q { - t.Fatal() - } - } - } -} - -func TestDeriveUniformBall(t *testing.T) { - var p common.Poly - var seed [32]byte - for i := 0; i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - PolyDeriveUniformBall(&p, &seed) - nonzero := 0 - for j := 0; j < common.N; j++ { - if p[j] != 0 { - if p[j] != 1 && p[j] != common.Q-1 { - t.Fatal() - } - nonzero++ - } - } - if nonzero != Tau { - t.Fatal() - } - } -} - -func TestDeriveUniformX4(t *testing.T) { - if !DeriveX4Available { - t.SkipNow() - } - var ps [4]common.Poly - var p common.Poly - var seed [32]byte - nonces := [4]uint16{12345, 54321, 13532, 37377} - - for i := 0; i < len(seed); i++ { - seed[i] = byte(i) - } - - PolyDeriveUniformX4([4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, &seed, - nonces) - for i := 0; i < 4; i++ { - PolyDeriveUniform(&p, &seed, nonces[i]) - if ps[i] != p { - t.Fatal() - } - } -} - -func TestDeriveUniformBallX4(t *testing.T) { - if !DeriveX4Available { - t.SkipNow() - } - var ps [4]common.Poly - var p common.Poly - var seed [32]byte - PolyDeriveUniformBallX4( - [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, - &seed, - ) - for j := 0; j < 4; j++ { - PolyDeriveUniformBall(&p, &seed) - if ps[j] != p { - t.Fatalf("%d\n%v\n%v", j, ps[j], p) - } - } -} - -func BenchmarkPolyDeriveUniformBall(b *testing.B) { - var seed [32]byte - var p common.Poly - var w1 VecK - for i := 0; i < b.N; i++ { - w1[0][0] = uint32(i) - PolyDeriveUniformBall(&p, &seed) - } -} - -func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { - var seed [32]byte - var p common.Poly - var w1 VecK - for i := 0; i < b.N; i++ { - w1[0][0] = uint32(i) - PolyDeriveUniformBallX4( - [4]*common.Poly{&p, &p, &p, &p}, - &seed, - ) - } -} - -func BenchmarkPolyDeriveUniform(b *testing.B) { - var seed [32]byte - var p common.Poly - for i := 0; i < b.N; i++ { - PolyDeriveUniform(&p, &seed, uint16(i)) - } -} - -func BenchmarkPolyDeriveUniformX4(b *testing.B) { - if !DeriveX4Available { - b.SkipNow() - } - var seed [32]byte - var p [4]common.Poly - for i := 0; i < b.N; i++ { - nonce := uint16(4 * i) - PolyDeriveUniformX4([4]*common.Poly{&p[0], &p[1], &p[2], &p[3]}, - &seed, [4]uint16{nonce, nonce + 1, nonce + 2, nonce + 3}) - } -} - -func BenchmarkPolyDeriveUniformLeGamma1(b *testing.B) { - var seed [64]byte - var p common.Poly - for i := 0; i < b.N; i++ { - PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) - } -} diff --git a/sign/dilithium/templates/acvp.templ.go b/sign/dilithium/templates/acvp.templ.go new file mode 100644 index 000000000..a86d8fd8b --- /dev/null +++ b/sign/dilithium/templates/acvp.templ.go @@ -0,0 +1,266 @@ +// +build ignore +// The previous line (and this one up to the warning below) is removed by the +// template generator. + +// Code generated from acvp.templ.go. DO NOT EDIT. + +package {{.Pkg}} + +import ( + "bytes" + "compress/gzip" + "encoding/hex" + "encoding/json" + "io" + "os" + "testing" +) + +// []byte but is encoded in hex for JSON +type HexBytes []byte + +func (b HexBytes) MarshalJSON() ([]byte, error) { + return json.Marshal(hex.EncodeToString(b)) +} + +func (b *HexBytes) UnmarshalJSON(data []byte) (err error) { + var s string + if err = json.Unmarshal(data, &s); err != nil { + return err + } + *b, err = hex.DecodeString(s) + return err +} + +func gunzip(in []byte) ([]byte, error) { + buf := bytes.NewBuffer(in) + r, err := gzip.NewReader(buf) + if err != nil { + return nil, err + } + return io.ReadAll(r) +} + +func readGzip(path string) ([]byte, error) { + buf, err := os.ReadFile(path) + if err != nil { + return nil, err + } + return gunzip(buf) +} + +func TestACVP(t *testing.T) { + for _, sub := range []string{ + "keyGen", + "sigGen", + } { + t.Run(sub, func(t *testing.T) { + testACVP(t, sub) + }) + } +} + +// nolint:funlen,gocyclo +func testACVP(t *testing.T, sub string) { + buf, err := readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/prompt.json.gz") + if err != nil { + t.Fatal(err) + } + + var prompt struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err = json.Unmarshal(buf, &prompt); err != nil { + t.Fatal(err) + } + + buf, err = readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/expectedResults.json.gz") + if err != nil { + t.Fatal(err) + } + + var results struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err := json.Unmarshal(buf, &results); err != nil { + t.Fatal(err) + } + + rawResults := make(map[int]json.RawMessage) + + for _, rawGroup := range results.TestGroups { + var abstractGroup struct { + Tests []json.RawMessage `json:"tests"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + for _, rawTest := range abstractGroup.Tests { + var abstractTest struct { + TcID int `json:"tcId"` + } + if err := json.Unmarshal(rawTest, &abstractTest); err != nil { + t.Fatal(err) + } + if _, exists := rawResults[abstractTest.TcID]; exists { + t.Fatalf("Duplicate test id: %d", abstractTest.TcID) + } + rawResults[abstractTest.TcID] = rawTest + } + } + + scheme := Scheme() + + for _, rawGroup := range prompt.TestGroups { + var abstractGroup struct { + TestType string `json:"testType"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + switch { + case abstractGroup.TestType == "AFT" && sub == "keyGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Tests []struct { + TcID int `json:"tcId"` + Seed HexBytes `json:"seed"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + for _, test := range group.Tests { + var result struct { + Pk HexBytes `json:"pk"` + Sk HexBytes `json:"sk"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + pk, sk := scheme.DeriveKey(test.Seed) + + pk2, err := scheme.UnmarshalBinaryPublicKey(result.Pk) + if err != nil { + t.Fatalf("tc=%d: %v", test.TcID, err) + } + sk2, err := scheme.UnmarshalBinaryPrivateKey(result.Sk) + if err != nil { + t.Fatal(err) + } + + if !pk.Equal(pk2) { + t.Fatal("pk does not match") + } + if !sk.Equal(sk2) { + t.Fatal("sk does not match") + } + } + case abstractGroup.TestType == "AFT" && sub == "sigGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Deterministic bool `json:"deterministic"` + Tests []struct { + TcID int `json:"tcId"` + Sk HexBytes `json:"sk"` + Message HexBytes `json:"message"` + Rnd HexBytes `json:"rnd"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + for _, test := range group.Tests { + var result struct { + Signature HexBytes `json:"signature"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + sk, err := scheme.UnmarshalBinaryPrivateKey(test.Sk) + if err != nil { + t.Fatal(err) + } + + var rnd [32]byte + if !group.Deterministic { + copy(rnd[:], test.Rnd) + } + + sig2 := sk.(*PrivateKey).unsafeSignInternal(test.Message, rnd) + + if !bytes.Equal(sig2, result.Signature) { + t.Fatalf("signature doesn't match: %x ≠ %x", + sig2, result.Signature) + } + } + case abstractGroup.TestType == "AFT" && sub == "sigVer": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Pk HexBytes `json:"pk"` + Tests []struct { + TcID int `json:"tcId"` + Message HexBytes `json:"message"` + Signature HexBytes `json:"signature"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + pk, err := scheme.UnmarshalBinaryPublicKey(group.Pk) + if err != nil { + t.Fatal(err) + } + + for _, test := range group.Tests { + var result struct { + TestPassed bool `json:"testPassed"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + passed2 := scheme.Verify(pk, test.Message, test.Signature, nil) + if passed2 != result.TestPassed { + t.Fatalf("verification %v ≠ %v", passed2, result.TestPassed) + } + } + default: + t.Fatalf("unknown type %s for %s", abstractGroup.TestType, sub) + } + } +} diff --git a/sign/dilithium/templates/mode.templ.go b/sign/dilithium/templates/mode.templ.go deleted file mode 100644 index 8c76b2512..000000000 --- a/sign/dilithium/templates/mode.templ.go +++ /dev/null @@ -1,94 +0,0 @@ -// +build ignore -// The previous line (and this one up to the warning below) is removed by the -// template generator. - -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/{{.Pkg}}" -) - -// {{.Impl}} implements the mode.Mode interface for {{.Name}}. -type {{.Impl}} struct{} - -// {{.Mode}} is Dilithium in mode "{{.Name}}". -var {{.Mode}} Mode = &{{.Impl}}{} - -func (m *{{.Impl}}) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return {{.Pkg}}.GenerateKey(rand) -} - -func (m *{{.Impl}}) NewKeyFromSeed(seed []byte) (PublicKey, - PrivateKey) { - if len(seed) != common.SeedSize { - panic(fmt.Sprintf("seed must be of length %d", common.SeedSize)) - } - seedBuf := [common.SeedSize]byte{} - copy(seedBuf[:], seed) - return {{.Pkg}}.NewKeyFromSeed(&seedBuf) -} - -func (m *{{.Impl}}) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*{{.Pkg}}.PrivateKey) - ret := [{{.Pkg}}.SignatureSize]byte{} - {{.Pkg}}.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *{{.Impl}}) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*{{.Pkg}}.PublicKey) - return {{.Pkg}}.Verify(ipk, msg, signature) -} - -func (m *{{.Impl}}) PublicKeyFromBytes(data []byte) PublicKey { - var ret {{.Pkg}}.PublicKey - if len(data) != {{.Pkg}}.PublicKeySize { - panic("packed public key must be of {{.Pkg}}.PublicKeySize bytes") - } - var buf [{{.Pkg}}.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *{{.Impl}}) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret {{.Pkg}}.PrivateKey - if len(data) != {{.Pkg}}.PrivateKeySize { - panic("packed public key must be of {{.Pkg}}.PrivateKeySize bytes") - } - var buf [{{.Pkg}}.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *{{.Impl}}) SeedSize() int { - return common.SeedSize -} - -func (m *{{.Impl}}) PublicKeySize() int { - return {{.Pkg}}.PublicKeySize -} - -func (m *{{.Impl}}) PrivateKeySize() int { - return {{.Pkg}}.PrivateKeySize -} - -func (m *{{.Impl}}) SignatureSize() int { - return {{.Pkg}}.SignatureSize -} - -func (m *{{.Impl}}) Name() string { - return "{{.Name}}" -} - -func init() { - modes["{{.Name}}"] = {{.Mode}} -} diff --git a/sign/dilithium/templates/modePkg.templ.go b/sign/dilithium/templates/modePkg.templ.go deleted file mode 100644 index 29dc73556..000000000 --- a/sign/dilithium/templates/modePkg.templ.go +++ /dev/null @@ -1,185 +0,0 @@ -// +build ignore -// The previous line (and this one up to the warning below) is removed by the -// template generator. - -// Code generated from modePkg.templ.go. DO NOT EDIT. - -// {{.Pkg}} implements the CRYSTALS-Dilithium signature scheme {{.Name}} -// as submitted to round3 of the NIST PQC competition and described in -// -// https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf -package {{.Pkg}} - -import ( - "crypto" - "errors" - "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" - "github.com/cloudflare/circl/sign/dilithium/{{.Pkg}}/internal" -) - -const ( - // Size of seed for NewKeyFromSeed - SeedSize = common.SeedSize - - // Size of a packed PublicKey - PublicKeySize = internal.PublicKeySize - - // Size of a packed PrivateKey - PrivateKeySize = internal.PrivateKeySize - - // Size of a signature - SignatureSize = internal.SignatureSize -) - -// PublicKey is the type of {{.Name}} public key -type PublicKey internal.PublicKey - -// PrivateKey is the type of {{.Name}} private key -type PrivateKey internal.PrivateKey - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { - pk, sk, err := internal.GenerateKey(rand) - return (*PublicKey)(pk), (*PrivateKey)(sk), err -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { - pk, sk := internal.NewKeyFromSeed(seed) - return (*PublicKey)(pk), (*PrivateKey)(sk) -} - -// SignTo signs the given message and writes the signature into signature. -// It will panic if signature is not of length at least SignatureSize. -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - internal.SignTo( - (*internal.PrivateKey)(sk), - msg, - signature, - ) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - return internal.Verify( - (*internal.PublicKey)(pk), - msg, - signature, - ) -} - -// Sets pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - (*internal.PublicKey)(pk).Unpack(buf) -} - -// Sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - (*internal.PrivateKey)(sk).Unpack(buf) -} - -// Packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - (*internal.PublicKey)(pk).Pack(buf) -} - -// Packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - (*internal.PrivateKey)(sk).Pack(buf) -} - -// Packs the public key. -func (pk *PublicKey) Bytes() []byte { - var buf [PublicKeySize]byte - pk.Pack(&buf) - return buf[:] -} - -// Packs the private key. -func (sk *PrivateKey) Bytes() []byte { - var buf [PrivateKeySize]byte - sk.Pack(&buf) - return buf[:] -} - -// Packs the public key. -func (pk *PublicKey) MarshalBinary() ([]byte, error) { - return pk.Bytes(), nil -} - -// Packs the private key. -func (sk *PrivateKey) MarshalBinary() ([]byte, error) { - return sk.Bytes(), nil -} - -// Unpacks the public key from data. -func (pk *PublicKey) UnmarshalBinary(data []byte) error { - if len(data) != PublicKeySize { - return errors.New("packed public key must be of {{.Pkg}}.PublicKeySize bytes") - } - var buf [PublicKeySize]byte - copy(buf[:], data) - pk.Unpack(&buf) - return nil -} - -// Unpacks the private key from data. -func (sk *PrivateKey) UnmarshalBinary(data []byte) error { - if len(data) != PrivateKeySize { - return errors.New("packed private key must be of {{.Pkg}}.PrivateKeySize bytes") - } - var buf [PrivateKeySize]byte - copy(buf[:], data) - sk.Unpack(&buf) - return nil -} - -// Sign signs the given message. -// -// opts.HashFunc() must return zero, which can be achieved by passing -// crypto.Hash(0) for opts. rand is ignored. Will only return an error -// if opts.HashFunc() is non-zero. -// -// This function is used to make PrivateKey implement the crypto.Signer -// interface. The package-level SignTo function might be more convenient -// to use. -func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( - signature []byte, err error) { - var sig [SignatureSize]byte - - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("dilithium: cannot sign hashed message") - } - - SignTo(sk, msg, sig[:]) - return sig[:], nil -} - -// Computes the public key corresponding to this private key. -// -// Returns a *PublicKey. The type crypto.PublicKey is used to make -// PrivateKey implement the crypto.Signer interface. -func (sk *PrivateKey) Public() crypto.PublicKey { - return (*PublicKey)((*internal.PrivateKey)(sk).Public()) -} - -// Equal returns whether the two private keys equal. -func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { - castOther, ok := other.(*PrivateKey) - if !ok { - return false - } - return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(castOther)) -} - -// Equal returns whether the two public keys equal. -func (pk *PublicKey) Equal(other crypto.PublicKey) bool { - castOther, ok := other.(*PublicKey) - if !ok { - return false - } - return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) -} diff --git a/sign/dilithium/templates/params.templ.go b/sign/dilithium/templates/params.templ.go index 1e0331c25..a7154bae8 100644 --- a/sign/dilithium/templates/params.templ.go +++ b/sign/dilithium/templates/params.templ.go @@ -8,7 +8,6 @@ package internal const ( Name = "{{.Name}}" - UseAES = {{.UseAES}} K = {{.K}} L = {{.L}} Eta = {{.Eta}} @@ -17,4 +16,7 @@ const ( Tau = {{.Tau}} Gamma1Bits = {{.Gamma1Bits}} Gamma2 = {{.Gamma2}} + NIST = {{.NIST}} + TRSize = {{.TRSize}} + CTildeSize = {{.CTildeSize}} ) diff --git a/sign/dilithium/templates/pkg.templ.go b/sign/dilithium/templates/pkg.templ.go new file mode 100644 index 000000000..238de68c7 --- /dev/null +++ b/sign/dilithium/templates/pkg.templ.go @@ -0,0 +1,416 @@ +// +build ignore +// The previous line (and this one up to the warning below) is removed by the +// template generator. + +// Code generated from pkg.templ.go. DO NOT EDIT. + +{{ if .NIST }} +// {{.Pkg}} implements NIST signature scheme {{.Name}} as defined in FIPS204. +{{- else }} +// {{.Pkg}} implements the CRYSTALS-Dilithium signature scheme {{.Name}} +// as submitted to round3 of the NIST PQC competition and described in +// +// https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf +{{- end }} +package {{.Pkg}} + +import ( + "crypto" + "errors" + "io" + +{{- if .NIST }} + cryptoRand "crypto/rand" +{{- end }} + + "github.com/cloudflare/circl/sign" + +{{- if .NIST }} + "github.com/cloudflare/circl/sign/mldsa/{{.Pkg}}/internal" +{{- else }} + "github.com/cloudflare/circl/sign/dilithium/{{.Pkg}}/internal" +{{- end }} + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +const ( + // Size of seed for NewKeyFromSeed + SeedSize = common.SeedSize + + // Size of a packed PublicKey + PublicKeySize = internal.PublicKeySize + + // Size of a packed PrivateKey + PrivateKeySize = internal.PrivateKeySize + + // Size of a signature + SignatureSize = internal.SignatureSize +) + +// PublicKey is the type of {{.Name}} public key +type PublicKey internal.PublicKey + +// PrivateKey is the type of {{.Name}} private key +type PrivateKey internal.PrivateKey + +// GenerateKey generates a public/private key pair using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { + pk, sk, err := internal.GenerateKey(rand) + return (*PublicKey)(pk), (*PrivateKey)(sk), err +} + +// NewKeyFromSeed derives a public/private key pair using the given seed. +func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { + pk, sk := internal.NewKeyFromSeed(seed) + return (*PublicKey)(pk), (*PrivateKey)(sk) +} + +// SignTo signs the given message and writes the signature into signature. +// It will panic if signature is not of length at least SignatureSize. +{{- if .NIST }} +// +// ctx is the optional context string. Errors if ctx is larger than 255 bytes. +// A nil context string is equivalent to an empty context string. +func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error { +{{- else }} +func SignTo(sk *PrivateKey, msg, sig []byte) { +{{- end }} + var rnd [32]byte + + {{- if .NIST }} + if randomized { + _, err := cryptoRand.Read(rnd[:]) + if err != nil { + return err + } + } + + if len(ctx) > 255 { + return sign.ErrContextTooLong + } + {{- end }} + + internal.SignTo( + (*internal.PrivateKey)(sk), + func (w io.Writer) { + {{- if .NIST }} + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + + {{- end }} + w.Write(msg) + }, + rnd, + sig, + ) + + {{- if .NIST }} + return nil + {{- end }} +} + +{{- if .NIST }} +// Do not use. Implements ML-DSA.Sign_internal used for compatibility tests. +func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { + var ret [SignatureSize]byte + internal.SignTo( + (*internal.PrivateKey)(sk), + func (w io.Writer) { + w.Write(msg) + }, + rnd, + ret[:], + ) + return ret[:] +} +{{- end }} + +// Verify checks whether the given signature by pk on msg is valid. +{{- if .NIST }} +// +// ctx is the optional context string. Fails if ctx is larger than 255 bytes. +// A nil context string is equivalent to an empty context string. +func Verify(pk *PublicKey, msg, ctx, sig []byte) bool { + if len(ctx) > 255 { + return false + } +{{- else }} +func Verify(pk *PublicKey, msg, sig []byte) bool { +{{- end }} + return internal.Verify( + (*internal.PublicKey)(pk), + func (w io.Writer) { + {{- if .NIST }} + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + + {{- end }} + _, _ = w.Write(msg) + }, + sig, + ) +} + +// Sets pk to the public key encoded in buf. +func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { + (*internal.PublicKey)(pk).Unpack(buf) +} + +// Sets sk to the private key encoded in buf. +func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { + (*internal.PrivateKey)(sk).Unpack(buf) +} + +// Packs the public key into buf. +func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { + (*internal.PublicKey)(pk).Pack(buf) +} + +// Packs the private key into buf. +func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { + (*internal.PrivateKey)(sk).Pack(buf) +} + +// Packs the public key. +func (pk *PublicKey) Bytes() []byte { + var buf [PublicKeySize]byte + pk.Pack(&buf) + return buf[:] +} + +// Packs the private key. +func (sk *PrivateKey) Bytes() []byte { + var buf [PrivateKeySize]byte + sk.Pack(&buf) + return buf[:] +} + +// Packs the public key. +func (pk *PublicKey) MarshalBinary() ([]byte, error) { + return pk.Bytes(), nil +} + +// Packs the private key. +func (sk *PrivateKey) MarshalBinary() ([]byte, error) { + return sk.Bytes(), nil +} + +// Unpacks the public key from data. +func (pk *PublicKey) UnmarshalBinary(data []byte) error { + if len(data) != PublicKeySize { + return errors.New("packed public key must be of {{.Pkg}}.PublicKeySize bytes") + } + var buf [PublicKeySize]byte + copy(buf[:], data) + pk.Unpack(&buf) + return nil +} + +// Unpacks the private key from data. +func (sk *PrivateKey) UnmarshalBinary(data []byte) error { + if len(data) != PrivateKeySize { + return errors.New("packed private key must be of {{.Pkg}}.PrivateKeySize bytes") + } + var buf [PrivateKeySize]byte + copy(buf[:], data) + sk.Unpack(&buf) + return nil +} + +// Sign signs the given message. +// +// opts.HashFunc() must return zero, which can be achieved by passing +// crypto.Hash(0) for opts. rand is ignored. Will only return an error +// if opts.HashFunc() is non-zero. +// +// This function is used to make PrivateKey implement the crypto.Signer +// interface. The package-level SignTo function might be more convenient +// to use. +func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( + sig []byte, err error) { + var ret [SignatureSize]byte + + if opts.HashFunc() != crypto.Hash(0) { + return nil, errors.New("dilithium: cannot sign hashed message") + } + + {{- if .NIST }} + if err = SignTo(sk, msg, nil, false, ret[:]); err != nil { + return nil, err + } + {{- else }} + SignTo(sk, msg, ret[:]) + {{- end }} + + return ret[:], nil +} + +// Computes the public key corresponding to this private key. +// +// Returns a *PublicKey. The type crypto.PublicKey is used to make +// PrivateKey implement the crypto.Signer interface. +func (sk *PrivateKey) Public() crypto.PublicKey { + return (*PublicKey)((*internal.PrivateKey)(sk).Public()) +} + +// Equal returns whether the two private keys equal. +func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { + castOther, ok := other.(*PrivateKey) + if !ok { + return false + } + return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(castOther)) +} + +// Equal returns whether the two public keys equal. +func (pk *PublicKey) Equal(other crypto.PublicKey) bool { + castOther, ok := other.(*PublicKey) + if !ok { + return false + } + return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) +} + + +// Boilerplate for generic signatures API + +type scheme struct{} +var sch sign.Scheme = &scheme{} + +// Scheme returns a generic signature interface for {{ .Name }}. +func Scheme() sign.Scheme { return sch } + +func (*scheme) Name() string { return "{{ .Name }}" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SignatureSize() int { return SignatureSize } +func (*scheme) SeedSize() int { return SeedSize } +// TODO TLSIdentifier() and OID() + +func (*scheme) SupportsContext() bool { + {{- if .NIST }} + return true + {{- else }} + return false + {{- end }} +} + +func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { + return GenerateKey(nil) +} + +func (*scheme) Sign( + sk sign.PrivateKey, + msg []byte, + opts *sign.SignatureOpts, +) []byte { + {{- if .NIST }} + var ctx []byte + {{- end }} + sig := make([]byte, SignatureSize) + + priv, ok := sk.(*PrivateKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + {{- if .NIST }} + ctx = []byte(opts.Context) + {{- else }} + panic(sign.ErrContextNotSupported) + {{- end }} + } + + {{- if .NIST }} + err := SignTo(priv, msg, ctx, false, sig) + if err != nil { + panic(err) + } + {{- else }} + SignTo(priv, msg, sig) + {{ end }} + + return sig +} + +func (*scheme) Verify( + pk sign.PublicKey, + msg, sig []byte, + opts *sign.SignatureOpts, +) bool { + {{- if .NIST }} + var ctx []byte + {{- end }} + pub, ok := pk.(*PublicKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + {{- if .NIST }} + ctx = []byte(opts.Context) + {{- else }} + panic(sign.ErrContextNotSupported) + {{- end }} + } + {{- if .NIST }} + return Verify(pub, msg, ctx, sig) + {{- else }} + return Verify(pub, msg, sig) + {{- end }} +} + +func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { + if len(seed) != SeedSize { + panic(sign.ErrSeedSize) + } + var seed2 [SeedSize]byte + copy(seed2[:], seed) + return NewKeyFromSeed(&seed2) +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { + if len(buf) != PublicKeySize { + return nil, sign.ErrPubKeySize + } + + var ( + buf2 [PublicKeySize]byte + ret PublicKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, sign.ErrPrivKeySize + } + + var ( + buf2 [PrivateKeySize]byte + ret PrivateKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (sk *PrivateKey) Scheme() sign.Scheme { + return sch +} + +func (sk *PublicKey) Scheme() sign.Scheme { + return sch +} diff --git a/sign/dilithium/internal/common/amd64.go b/sign/internal/dilithium/amd64.go similarity index 99% rename from sign/dilithium/internal/common/amd64.go rename to sign/internal/dilithium/amd64.go index 11f0e3dcf..d5d224ee8 100644 --- a/sign/dilithium/internal/common/amd64.go +++ b/sign/internal/dilithium/amd64.go @@ -1,7 +1,7 @@ //go:build amd64 && !purego // +build amd64,!purego -package common +package dilithium import ( "golang.org/x/sys/cpu" diff --git a/sign/dilithium/internal/common/amd64.s b/sign/internal/dilithium/amd64.s similarity index 100% rename from sign/dilithium/internal/common/amd64.s rename to sign/internal/dilithium/amd64.s diff --git a/sign/dilithium/internal/common/asm/go.mod b/sign/internal/dilithium/asm/go.mod similarity index 59% rename from sign/dilithium/internal/common/asm/go.mod rename to sign/internal/dilithium/asm/go.mod index 3f9a8a6d3..e4e70038e 100644 --- a/sign/dilithium/internal/common/asm/go.mod +++ b/sign/internal/dilithium/asm/go.mod @@ -1,4 +1,4 @@ -module github.com/cloudflare/circl/sign/dilithium/internal/common/asm +module github.com/cloudflare/circl/sign/internal/dilithium/asm go 1.22.0 @@ -12,4 +12,4 @@ require ( golang.org/x/tools v0.16.1 // indirect ) -replace github.com/cloudflare/circl => ../../../../../ +replace github.com/cloudflare/circl => ../../../../ diff --git a/sign/dilithium/internal/common/asm/go.sum b/sign/internal/dilithium/asm/go.sum similarity index 100% rename from sign/dilithium/internal/common/asm/go.sum rename to sign/internal/dilithium/asm/go.sum diff --git a/sign/dilithium/internal/common/asm/src.go b/sign/internal/dilithium/asm/src.go similarity index 99% rename from sign/dilithium/internal/common/asm/src.go rename to sign/internal/dilithium/asm/src.go index ef5f9b7de..31a171a5a 100644 --- a/sign/dilithium/internal/common/asm/src.go +++ b/sign/internal/dilithium/asm/src.go @@ -1,4 +1,4 @@ -//go:generate go run src.go -out ../amd64.s -stubs ../stubs_amd64.go -pkg common +//go:generate go run src.go -out ../amd64.s -stubs ../stubs_amd64.go -pkg dilithium // AVX2 optimized version of Poly.[Inv]NTT(). See the comments on the generic // implementation for details on the maths involved. @@ -9,7 +9,7 @@ import ( . "github.com/mmcloughlin/avo/operand" // nolint:golint,stylecheck . "github.com/mmcloughlin/avo/reg" // nolint:golint,stylecheck - "github.com/cloudflare/circl/sign/dilithium/internal/common/params" + "github.com/cloudflare/circl/sign/internal/dilithium/params" ) // XXX align Poly on 16 bytes such that we can use aligned moves diff --git a/sign/dilithium/internal/common/field.go b/sign/internal/dilithium/field.go similarity index 98% rename from sign/dilithium/internal/common/field.go rename to sign/internal/dilithium/field.go index 2aab16ecb..c2fc6ca72 100644 --- a/sign/dilithium/internal/common/field.go +++ b/sign/internal/dilithium/field.go @@ -1,4 +1,4 @@ -package common +package dilithium // Returns a y with y < 2q and y = x mod q. // Note that in general *not*: ReduceLe2Q(ReduceLe2Q(x)) == x. diff --git a/sign/dilithium/internal/common/field_test.go b/sign/internal/dilithium/field_test.go similarity index 98% rename from sign/dilithium/internal/common/field_test.go rename to sign/internal/dilithium/field_test.go index f9864eabe..85db87960 100644 --- a/sign/dilithium/internal/common/field_test.go +++ b/sign/internal/dilithium/field_test.go @@ -1,4 +1,4 @@ -package common +package dilithium import ( "crypto/rand" diff --git a/sign/dilithium/internal/common/generic.go b/sign/internal/dilithium/generic.go similarity index 99% rename from sign/dilithium/internal/common/generic.go rename to sign/internal/dilithium/generic.go index 2736e1617..25321f5d5 100644 --- a/sign/dilithium/internal/common/generic.go +++ b/sign/internal/dilithium/generic.go @@ -1,7 +1,7 @@ //go:build !amd64 || purego // +build !amd64 purego -package common +package dilithium // Execute an in-place forward NTT on as. // diff --git a/sign/dilithium/internal/common/ntt.go b/sign/internal/dilithium/ntt.go similarity index 99% rename from sign/dilithium/internal/common/ntt.go rename to sign/internal/dilithium/ntt.go index 6f5370ae0..1568ccb4b 100644 --- a/sign/dilithium/internal/common/ntt.go +++ b/sign/internal/dilithium/ntt.go @@ -1,4 +1,4 @@ -package common +package dilithium // Zetas lists precomputed powers of the root of unity in Montgomery // representation used for the NTT: diff --git a/sign/dilithium/internal/common/ntt_test.go b/sign/internal/dilithium/ntt_test.go similarity index 98% rename from sign/dilithium/internal/common/ntt_test.go rename to sign/internal/dilithium/ntt_test.go index 4524f245d..71d736a92 100644 --- a/sign/dilithium/internal/common/ntt_test.go +++ b/sign/internal/dilithium/ntt_test.go @@ -1,4 +1,4 @@ -package common +package dilithium import "testing" diff --git a/sign/dilithium/internal/common/pack.go b/sign/internal/dilithium/pack.go similarity index 99% rename from sign/dilithium/internal/common/pack.go rename to sign/internal/dilithium/pack.go index 6c366089c..4b952a004 100644 --- a/sign/dilithium/internal/common/pack.go +++ b/sign/internal/dilithium/pack.go @@ -1,4 +1,4 @@ -package common +package dilithium // Sets p to the polynomial whose coefficients are less than 1024 encoded // into buf (which must be of size PolyT1Size). diff --git a/sign/dilithium/internal/common/pack_test.go b/sign/internal/dilithium/pack_test.go similarity index 96% rename from sign/dilithium/internal/common/pack_test.go rename to sign/internal/dilithium/pack_test.go index 140d3f134..37d37ce46 100644 --- a/sign/dilithium/internal/common/pack_test.go +++ b/sign/internal/dilithium/pack_test.go @@ -1,4 +1,4 @@ -package common +package dilithium import "testing" diff --git a/sign/dilithium/internal/common/params.go b/sign/internal/dilithium/params.go similarity index 79% rename from sign/dilithium/internal/common/params.go rename to sign/internal/dilithium/params.go index 7713c6da9..f423217f0 100644 --- a/sign/dilithium/internal/common/params.go +++ b/sign/internal/dilithium/params.go @@ -1,7 +1,7 @@ -package common +package dilithium import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common/params" + "github.com/cloudflare/circl/sign/internal/dilithium/params" ) const ( diff --git a/sign/dilithium/internal/common/params/params.go b/sign/internal/dilithium/params/params.go similarity index 100% rename from sign/dilithium/internal/common/params/params.go rename to sign/internal/dilithium/params/params.go diff --git a/sign/dilithium/internal/common/poly.go b/sign/internal/dilithium/poly.go similarity index 99% rename from sign/dilithium/internal/common/poly.go rename to sign/internal/dilithium/poly.go index 7ac8e57da..96c0551b3 100644 --- a/sign/dilithium/internal/common/poly.go +++ b/sign/internal/dilithium/poly.go @@ -1,4 +1,4 @@ -package common +package dilithium // An element of our base ring R which are polynomials over Z_q modulo // the equation Xᴺ = -1, where q=2²³ - 2¹³ + 1 and N=256. diff --git a/sign/dilithium/internal/common/poly_test.go b/sign/internal/dilithium/poly_test.go similarity index 99% rename from sign/dilithium/internal/common/poly_test.go rename to sign/internal/dilithium/poly_test.go index 5601aa276..42e5fc46d 100644 --- a/sign/dilithium/internal/common/poly_test.go +++ b/sign/internal/dilithium/poly_test.go @@ -1,4 +1,4 @@ -package common +package dilithium import "testing" diff --git a/sign/dilithium/internal/common/stubs_amd64.go b/sign/internal/dilithium/stubs_amd64.go similarity index 91% rename from sign/dilithium/internal/common/stubs_amd64.go rename to sign/internal/dilithium/stubs_amd64.go index 3afeda4dd..ca92f15ef 100644 --- a/sign/dilithium/internal/common/stubs_amd64.go +++ b/sign/internal/dilithium/stubs_amd64.go @@ -1,8 +1,8 @@ -// Code generated by command: go run src.go -out ../amd64.s -stubs ../stubs_amd64.go -pkg common. DO NOT EDIT. +// Code generated by command: go run src.go -out ../amd64.s -stubs ../stubs_amd64.go -pkg dilithium. DO NOT EDIT. //go:build amd64 && !purego -package common +package dilithium //go:noescape func nttAVX2(p *[256]uint32) diff --git a/sign/mldsa/doc.go b/sign/mldsa/doc.go new file mode 100644 index 000000000..99b9c20be --- /dev/null +++ b/sign/mldsa/doc.go @@ -0,0 +1,12 @@ +// mldsa implements NIST post-quantum signature scheme ML-DSA (FIPS204) +// +// Each of the three different security levels of ML-DSA is implemented by a +// subpackage. For instance, mldsa44 can be found in +// +// github.com/cloudflare/circl/sign/mldsa/mldsa44 +// +// If your choice for mode is fixed compile-time, use the subpackages. +// To choose a scheme at runtime, use the generic signatures API under +// +// github.com/cloudflare/circl/sign/schemes +package mldsa diff --git a/sign/mldsa/mldsa44/acvp_test.go b/sign/mldsa/mldsa44/acvp_test.go new file mode 100644 index 000000000..09ef2c1af --- /dev/null +++ b/sign/mldsa/mldsa44/acvp_test.go @@ -0,0 +1,262 @@ +// Code generated from acvp.templ.go. DO NOT EDIT. + +package mldsa44 + +import ( + "bytes" + "compress/gzip" + "encoding/hex" + "encoding/json" + "io" + "os" + "testing" +) + +// []byte but is encoded in hex for JSON +type HexBytes []byte + +func (b HexBytes) MarshalJSON() ([]byte, error) { + return json.Marshal(hex.EncodeToString(b)) +} + +func (b *HexBytes) UnmarshalJSON(data []byte) (err error) { + var s string + if err = json.Unmarshal(data, &s); err != nil { + return err + } + *b, err = hex.DecodeString(s) + return err +} + +func gunzip(in []byte) ([]byte, error) { + buf := bytes.NewBuffer(in) + r, err := gzip.NewReader(buf) + if err != nil { + return nil, err + } + return io.ReadAll(r) +} + +func readGzip(path string) ([]byte, error) { + buf, err := os.ReadFile(path) + if err != nil { + return nil, err + } + return gunzip(buf) +} + +func TestACVP(t *testing.T) { + for _, sub := range []string{ + "keyGen", + "sigGen", + } { + t.Run(sub, func(t *testing.T) { + testACVP(t, sub) + }) + } +} + +// nolint:funlen,gocyclo +func testACVP(t *testing.T, sub string) { + buf, err := readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/prompt.json.gz") + if err != nil { + t.Fatal(err) + } + + var prompt struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err = json.Unmarshal(buf, &prompt); err != nil { + t.Fatal(err) + } + + buf, err = readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/expectedResults.json.gz") + if err != nil { + t.Fatal(err) + } + + var results struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err := json.Unmarshal(buf, &results); err != nil { + t.Fatal(err) + } + + rawResults := make(map[int]json.RawMessage) + + for _, rawGroup := range results.TestGroups { + var abstractGroup struct { + Tests []json.RawMessage `json:"tests"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + for _, rawTest := range abstractGroup.Tests { + var abstractTest struct { + TcID int `json:"tcId"` + } + if err := json.Unmarshal(rawTest, &abstractTest); err != nil { + t.Fatal(err) + } + if _, exists := rawResults[abstractTest.TcID]; exists { + t.Fatalf("Duplicate test id: %d", abstractTest.TcID) + } + rawResults[abstractTest.TcID] = rawTest + } + } + + scheme := Scheme() + + for _, rawGroup := range prompt.TestGroups { + var abstractGroup struct { + TestType string `json:"testType"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + switch { + case abstractGroup.TestType == "AFT" && sub == "keyGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Tests []struct { + TcID int `json:"tcId"` + Seed HexBytes `json:"seed"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + for _, test := range group.Tests { + var result struct { + Pk HexBytes `json:"pk"` + Sk HexBytes `json:"sk"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + pk, sk := scheme.DeriveKey(test.Seed) + + pk2, err := scheme.UnmarshalBinaryPublicKey(result.Pk) + if err != nil { + t.Fatalf("tc=%d: %v", test.TcID, err) + } + sk2, err := scheme.UnmarshalBinaryPrivateKey(result.Sk) + if err != nil { + t.Fatal(err) + } + + if !pk.Equal(pk2) { + t.Fatal("pk does not match") + } + if !sk.Equal(sk2) { + t.Fatal("sk does not match") + } + } + case abstractGroup.TestType == "AFT" && sub == "sigGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Deterministic bool `json:"deterministic"` + Tests []struct { + TcID int `json:"tcId"` + Sk HexBytes `json:"sk"` + Message HexBytes `json:"message"` + Rnd HexBytes `json:"rnd"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + for _, test := range group.Tests { + var result struct { + Signature HexBytes `json:"signature"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + sk, err := scheme.UnmarshalBinaryPrivateKey(test.Sk) + if err != nil { + t.Fatal(err) + } + + var rnd [32]byte + if !group.Deterministic { + copy(rnd[:], test.Rnd) + } + + sig2 := sk.(*PrivateKey).unsafeSignInternal(test.Message, rnd) + + if !bytes.Equal(sig2, result.Signature) { + t.Fatalf("signature doesn't match: %x ≠ %x", + sig2, result.Signature) + } + } + case abstractGroup.TestType == "AFT" && sub == "sigVer": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Pk HexBytes `json:"pk"` + Tests []struct { + TcID int `json:"tcId"` + Message HexBytes `json:"message"` + Signature HexBytes `json:"signature"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + pk, err := scheme.UnmarshalBinaryPublicKey(group.Pk) + if err != nil { + t.Fatal(err) + } + + for _, test := range group.Tests { + var result struct { + TestPassed bool `json:"testPassed"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + passed2 := scheme.Verify(pk, test.Message, test.Signature, nil) + if passed2 != result.TestPassed { + t.Fatalf("verification %v ≠ %v", passed2, result.TestPassed) + } + } + default: + t.Fatalf("unknown type %s for %s", abstractGroup.TestType, sub) + } + } +} diff --git a/sign/mldsa/mldsa44/dilithium.go b/sign/mldsa/mldsa44/dilithium.go new file mode 100644 index 000000000..257d824ee --- /dev/null +++ b/sign/mldsa/mldsa44/dilithium.go @@ -0,0 +1,346 @@ +// Code generated from pkg.templ.go. DO NOT EDIT. + +// mldsa44 implements NIST signature scheme ML-DSA-44 as defined in FIPS204. +package mldsa44 + +import ( + "crypto" + cryptoRand "crypto/rand" + "errors" + "io" + + "github.com/cloudflare/circl/sign" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/mldsa/mldsa44/internal" +) + +const ( + // Size of seed for NewKeyFromSeed + SeedSize = common.SeedSize + + // Size of a packed PublicKey + PublicKeySize = internal.PublicKeySize + + // Size of a packed PrivateKey + PrivateKeySize = internal.PrivateKeySize + + // Size of a signature + SignatureSize = internal.SignatureSize +) + +// PublicKey is the type of ML-DSA-44 public key +type PublicKey internal.PublicKey + +// PrivateKey is the type of ML-DSA-44 private key +type PrivateKey internal.PrivateKey + +// GenerateKey generates a public/private key pair using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { + pk, sk, err := internal.GenerateKey(rand) + return (*PublicKey)(pk), (*PrivateKey)(sk), err +} + +// NewKeyFromSeed derives a public/private key pair using the given seed. +func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { + pk, sk := internal.NewKeyFromSeed(seed) + return (*PublicKey)(pk), (*PrivateKey)(sk) +} + +// SignTo signs the given message and writes the signature into signature. +// It will panic if signature is not of length at least SignatureSize. +// +// ctx is the optional context string. Errors if ctx is larger than 255 bytes. +// A nil context string is equivalent to an empty context string. +func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error { + var rnd [32]byte + if randomized { + _, err := cryptoRand.Read(rnd[:]) + if err != nil { + return err + } + } + + if len(ctx) > 255 { + return sign.ErrContextTooLong + } + + internal.SignTo( + (*internal.PrivateKey)(sk), + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + w.Write(msg) + }, + rnd, + sig, + ) + return nil +} + +// Do not use. Implements ML-DSA.Sign_internal used for compatibility tests. +func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { + var ret [SignatureSize]byte + internal.SignTo( + (*internal.PrivateKey)(sk), + func(w io.Writer) { + w.Write(msg) + }, + rnd, + ret[:], + ) + return ret[:] +} + +// Verify checks whether the given signature by pk on msg is valid. +// +// ctx is the optional context string. Fails if ctx is larger than 255 bytes. +// A nil context string is equivalent to an empty context string. +func Verify(pk *PublicKey, msg, ctx, sig []byte) bool { + if len(ctx) > 255 { + return false + } + return internal.Verify( + (*internal.PublicKey)(pk), + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + _, _ = w.Write(msg) + }, + sig, + ) +} + +// Sets pk to the public key encoded in buf. +func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { + (*internal.PublicKey)(pk).Unpack(buf) +} + +// Sets sk to the private key encoded in buf. +func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { + (*internal.PrivateKey)(sk).Unpack(buf) +} + +// Packs the public key into buf. +func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { + (*internal.PublicKey)(pk).Pack(buf) +} + +// Packs the private key into buf. +func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { + (*internal.PrivateKey)(sk).Pack(buf) +} + +// Packs the public key. +func (pk *PublicKey) Bytes() []byte { + var buf [PublicKeySize]byte + pk.Pack(&buf) + return buf[:] +} + +// Packs the private key. +func (sk *PrivateKey) Bytes() []byte { + var buf [PrivateKeySize]byte + sk.Pack(&buf) + return buf[:] +} + +// Packs the public key. +func (pk *PublicKey) MarshalBinary() ([]byte, error) { + return pk.Bytes(), nil +} + +// Packs the private key. +func (sk *PrivateKey) MarshalBinary() ([]byte, error) { + return sk.Bytes(), nil +} + +// Unpacks the public key from data. +func (pk *PublicKey) UnmarshalBinary(data []byte) error { + if len(data) != PublicKeySize { + return errors.New("packed public key must be of mldsa44.PublicKeySize bytes") + } + var buf [PublicKeySize]byte + copy(buf[:], data) + pk.Unpack(&buf) + return nil +} + +// Unpacks the private key from data. +func (sk *PrivateKey) UnmarshalBinary(data []byte) error { + if len(data) != PrivateKeySize { + return errors.New("packed private key must be of mldsa44.PrivateKeySize bytes") + } + var buf [PrivateKeySize]byte + copy(buf[:], data) + sk.Unpack(&buf) + return nil +} + +// Sign signs the given message. +// +// opts.HashFunc() must return zero, which can be achieved by passing +// crypto.Hash(0) for opts. rand is ignored. Will only return an error +// if opts.HashFunc() is non-zero. +// +// This function is used to make PrivateKey implement the crypto.Signer +// interface. The package-level SignTo function might be more convenient +// to use. +func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( + sig []byte, err error) { + var ret [SignatureSize]byte + + if opts.HashFunc() != crypto.Hash(0) { + return nil, errors.New("dilithium: cannot sign hashed message") + } + if err = SignTo(sk, msg, nil, false, ret[:]); err != nil { + return nil, err + } + + return ret[:], nil +} + +// Computes the public key corresponding to this private key. +// +// Returns a *PublicKey. The type crypto.PublicKey is used to make +// PrivateKey implement the crypto.Signer interface. +func (sk *PrivateKey) Public() crypto.PublicKey { + return (*PublicKey)((*internal.PrivateKey)(sk).Public()) +} + +// Equal returns whether the two private keys equal. +func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { + castOther, ok := other.(*PrivateKey) + if !ok { + return false + } + return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(castOther)) +} + +// Equal returns whether the two public keys equal. +func (pk *PublicKey) Equal(other crypto.PublicKey) bool { + castOther, ok := other.(*PublicKey) + if !ok { + return false + } + return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) +} + +// Boilerplate for generic signatures API + +type scheme struct{} + +var sch sign.Scheme = &scheme{} + +// Scheme returns a generic signature interface for ML-DSA-44. +func Scheme() sign.Scheme { return sch } + +func (*scheme) Name() string { return "ML-DSA-44" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SignatureSize() int { return SignatureSize } +func (*scheme) SeedSize() int { return SeedSize } + +// TODO TLSIdentifier() and OID() + +func (*scheme) SupportsContext() bool { + return true +} + +func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { + return GenerateKey(nil) +} + +func (*scheme) Sign( + sk sign.PrivateKey, + msg []byte, + opts *sign.SignatureOpts, +) []byte { + var ctx []byte + sig := make([]byte, SignatureSize) + + priv, ok := sk.(*PrivateKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + ctx = []byte(opts.Context) + } + err := SignTo(priv, msg, ctx, false, sig) + if err != nil { + panic(err) + } + + return sig +} + +func (*scheme) Verify( + pk sign.PublicKey, + msg, sig []byte, + opts *sign.SignatureOpts, +) bool { + var ctx []byte + pub, ok := pk.(*PublicKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + ctx = []byte(opts.Context) + } + return Verify(pub, msg, ctx, sig) +} + +func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { + if len(seed) != SeedSize { + panic(sign.ErrSeedSize) + } + var seed2 [SeedSize]byte + copy(seed2[:], seed) + return NewKeyFromSeed(&seed2) +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { + if len(buf) != PublicKeySize { + return nil, sign.ErrPubKeySize + } + + var ( + buf2 [PublicKeySize]byte + ret PublicKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, sign.ErrPrivKeySize + } + + var ( + buf2 [PrivateKeySize]byte + ret PrivateKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (sk *PrivateKey) Scheme() sign.Scheme { + return sch +} + +func (sk *PublicKey) Scheme() sign.Scheme { + return sch +} diff --git a/sign/dilithium/mode3aes/internal/dilithium.go b/sign/mldsa/mldsa44/internal/dilithium.go similarity index 89% rename from sign/dilithium/mode3aes/internal/dilithium.go rename to sign/mldsa/mldsa44/internal/dilithium.go index 79a17d504..8f1c8e5cb 100644 --- a/sign/dilithium/mode3aes/internal/dilithium.go +++ b/sign/mldsa/mldsa44/internal/dilithium.go @@ -8,7 +8,7 @@ import ( "io" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -29,13 +29,13 @@ const ( Alpha = 2 * Gamma2 // Size of a packed private key - PrivateKeySize = 32 + 32 + 32 + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K + PrivateKeySize = 32 + 32 + TRSize + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K // Size of a packed public key PublicKeySize = 32 + common.PolyT1Size*K // Size of a packed signature - SignatureSize = L*PolyLeGamma1Size + Omega + K + 32 + SignatureSize = L*PolyLeGamma1Size + Omega + K + CTildeSize // Size of packed w₁ PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 @@ -49,7 +49,7 @@ type PublicKey struct { // Cached values t1p [common.PolyT1Size * K]byte A *Mat - tr *[32]byte + tr *[TRSize]byte } // PrivateKey is the type of Dilithium private keys. @@ -59,7 +59,7 @@ type PrivateKey struct { s1 VecL s2 VecK t0 VecK - tr [32]byte + tr [TRSize]byte // Cached values A Mat // ExpandA(ρ) @@ -71,14 +71,14 @@ type PrivateKey struct { type unpackedSignature struct { z VecL hint VecK - c [32]byte + c [CTildeSize]byte } // Packs the signature into buf. func (sig *unpackedSignature) Pack(buf []byte) { copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[32:]) - sig.hint.PackHint(buf[32+L*PolyLeGamma1Size:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) } // Sets sig to the signature encoded in the buffer. @@ -89,11 +89,11 @@ func (sig *unpackedSignature) Unpack(buf []byte) bool { return false } copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[32:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) if sig.z.Exceeds(Gamma1 - Beta) { return false } - if !sig.hint.UnpackHint(buf[32+L*PolyLeGamma1Size:]) { + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { return false } return true @@ -115,7 +115,7 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { pk.A.Derive(&pk.rho) // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([32]byte) + pk.tr = new([TRSize]byte) h := sha3.NewShake256() _, _ = h.Write(buf[:]) _, _ = h.Read(pk.tr[:]) @@ -125,8 +125,8 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { copy(buf[:32], sk.rho[:]) copy(buf[32:64], sk.key[:]) - copy(buf[64:96], sk.tr[:]) - offset := 96 + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize sk.s1.PackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.PackLeqEta(buf[offset:]) @@ -138,8 +138,8 @@ func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { copy(sk.rho[:], buf[:32]) copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:96]) - offset := 96 + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize sk.s1.UnpackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.UnpackLeqEta(buf[offset:]) @@ -180,6 +180,11 @@ func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { h := sha3.NewShake256() _, _ = h.Write(seed[:]) + + if NIST { + _, _ = h.Write([]byte{byte(K), byte(L)}) + } + _, _ = h.Read(eSeed[:]) copy(pk.rho[:], eSeed[:32]) @@ -244,13 +249,16 @@ func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// For Dilithium this is the top-level verification function. +// In ML-DSA, this is ML-DSA.Verify_internal. +func Verify(pk *PublicKey, msg func(io.Writer), signature []byte) bool { var sig unpackedSignature var mu [64]byte var zh VecL var Az, Az2dct1, w1 VecK var ch common.Poly - var cp [32]byte + var cp [CTildeSize]byte var w1Packed [PolyW1Size * K]byte // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β @@ -262,7 +270,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // Compute Az @@ -279,7 +287,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // which is small enough for NTT(). Az2dct1.MulBy2toD(&pk.t1) Az2dct1.NTT() - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +315,11 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // SignTo signs the given message and writes the signature into signature. // +// For Dilithium this is the top-level signing function. For ML-DSA +// this is ML-DSA.Sign_internal. +// //nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg func(io.Writer), rnd [32]byte, signature []byte) { var mu, rhop [64]byte var w1Packed [PolyW1Size * K]byte var y, yh VecL @@ -324,12 +335,15 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + _, _ = h.Write(rnd[:]) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +382,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode5aes/internal/dilithium_test.go b/sign/mldsa/mldsa44/internal/dilithium_test.go similarity index 77% rename from sign/dilithium/mode5aes/internal/dilithium_test.go rename to sign/mldsa/mldsa44/internal/dilithium_test.go index ca347a831..47f53d3a0 100644 --- a/sign/dilithium/mode5aes/internal/dilithium_test.go +++ b/sign/mldsa/mldsa44/internal/dilithium_test.go @@ -4,9 +4,10 @@ package internal import ( "encoding/binary" + "io" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Checks whether p is normalized. Only used in tests. @@ -36,32 +37,38 @@ func BenchmarkVerify(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of verification (as in the reference // implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) b.ResetTimer() for i := 0; i < b.N; i++ { // We should generate a new signature for every verify attempt, // as this influences the time a little bit. This difference, however, // is small and generating a new signature in between creates a lot // pressure on the allocator which makes an accurate measurement hard. - Verify(pk, msg[:], sig[:]) + Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) } } func BenchmarkSign(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of signing (as in the reference implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) _, sk := NewKeyFromSeed(&seed) b.ResetTimer() for i := 0; i < b.N; i++ { binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) } } @@ -85,13 +92,16 @@ func BenchmarkPublicFromPrivate(b *testing.B) { } func TestSignThenVerifyAndPkSkPacking(t *testing.T) { - var seed [common.SeedSize]byte - var sig [SignatureSize]byte - var msg [8]byte - var pkb [PublicKeySize]byte - var skb [PrivateKeySize]byte - var pk2 PublicKey - var sk2 PrivateKey + var ( + seed [common.SeedSize]byte + sig [SignatureSize]byte + msg [8]byte + pkb [PublicKeySize]byte + skb [PrivateKeySize]byte + pk2 PublicKey + sk2 PrivateKey + rnd [32]byte + ) for i := uint64(0); i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], i) pk, sk := NewKeyFromSeed(&seed) @@ -100,8 +110,8 @@ func TestSignThenVerifyAndPkSkPacking(t *testing.T) { } for j := uint64(0); j < 10; j++ { binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) + if !Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) { t.Fatal() } } diff --git a/sign/dilithium/mode5aes/internal/mat.go b/sign/mldsa/mldsa44/internal/mat.go similarity index 95% rename from sign/dilithium/mode5aes/internal/mat.go rename to sign/mldsa/mldsa44/internal/mat.go index cb473c149..ceaf634fa 100644 --- a/sign/dilithium/mode5aes/internal/mat.go +++ b/sign/mldsa/mldsa44/internal/mat.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A k by l matrix of polynomials. diff --git a/sign/dilithium/mode5aes/internal/pack.go b/sign/mldsa/mldsa44/internal/pack.go similarity index 99% rename from sign/dilithium/mode5aes/internal/pack.go rename to sign/mldsa/mldsa44/internal/pack.go index 0285dfd8e..1854b4197 100644 --- a/sign/dilithium/mode5aes/internal/pack.go +++ b/sign/mldsa/mldsa44/internal/pack.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Writes p with norm less than or equal η into buf, which must be of diff --git a/sign/dilithium/mode3aes/internal/pack_test.go b/sign/mldsa/mldsa44/internal/pack_test.go similarity index 96% rename from sign/dilithium/mode3aes/internal/pack_test.go rename to sign/mldsa/mldsa44/internal/pack_test.go index 24f568e4d..f952c6a09 100644 --- a/sign/dilithium/mode3aes/internal/pack_test.go +++ b/sign/mldsa/mldsa44/internal/pack_test.go @@ -5,7 +5,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestPolyPackLeqEta(t *testing.T) { diff --git a/sign/dilithium/mode2aes/internal/params.go b/sign/mldsa/mldsa44/internal/params.go similarity index 72% rename from sign/dilithium/mode2aes/internal/params.go rename to sign/mldsa/mldsa44/internal/params.go index 751ad149b..0485ff0c3 100644 --- a/sign/dilithium/mode2aes/internal/params.go +++ b/sign/mldsa/mldsa44/internal/params.go @@ -3,8 +3,7 @@ package internal const ( - Name = "Dilithium2-AES" - UseAES = true + Name = "ML-DSA-44" K = 4 L = 4 Eta = 2 @@ -13,4 +12,7 @@ const ( Tau = 39 Gamma1Bits = 17 Gamma2 = 95232 + NIST = true + TRSize = 64 + CTildeSize = 32 ) diff --git a/sign/dilithium/mode5aes/internal/rounding.go b/sign/mldsa/mldsa44/internal/rounding.go similarity index 98% rename from sign/dilithium/mode5aes/internal/rounding.go rename to sign/mldsa/mldsa44/internal/rounding.go index 71360cb29..58123c090 100644 --- a/sign/dilithium/mode5aes/internal/rounding.go +++ b/sign/mldsa/mldsa44/internal/rounding.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, diff --git a/sign/dilithium/mode5aes/internal/rounding_test.go b/sign/mldsa/mldsa44/internal/rounding_test.go similarity index 96% rename from sign/dilithium/mode5aes/internal/rounding_test.go rename to sign/mldsa/mldsa44/internal/rounding_test.go index 5824f2656..ad653ca3f 100644 --- a/sign/dilithium/mode5aes/internal/rounding_test.go +++ b/sign/mldsa/mldsa44/internal/rounding_test.go @@ -6,7 +6,7 @@ import ( "flag" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") diff --git a/sign/dilithium/mode3aes/internal/sample.go b/sign/mldsa/mldsa44/internal/sample.go similarity index 81% rename from sign/dilithium/mode3aes/internal/sample.go rename to sign/mldsa/mldsa44/internal/sample.go index c47185ada..b37370a4e 100644 --- a/sign/dilithium/mode3aes/internal/sample.go +++ b/sign/mldsa/mldsa44/internal/sample.go @@ -6,13 +6,13 @@ import ( "encoding/binary" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" "github.com/cloudflare/circl/simd/keccakf1600" ) // DeriveX4Available indicates whether the system supports the quick fourway // sampling variants like PolyDeriveUniformX4. -var DeriveX4Available = keccakf1600.IsEnabledX4() && !UseAES +var DeriveX4Available = keccakf1600.IsEnabledX4() // For each i, sample ps[i] uniformly from the given seed and nonces[i]. // ps[i] may be nil and is ignored in that case. @@ -91,13 +91,9 @@ func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { // p will be normalized. func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { var i, length int - var buf [12 * 16]byte // fits 168B SHAKE-128 rate and 12 16B AES blocks + var buf [12 * 16]byte // fits 168B SHAKE-128 rate - if UseAES { - length = 12 * 16 - } else { - length = 168 - } + length = 168 sample := func() { // Note that 3 divides into 168 and 12*16, so we use up buf completely. @@ -113,25 +109,16 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream128(seed, nonce) + var iv [32 + 2]byte // 32 byte seed + uint16 nonce + h := sha3.NewShake128() + copy(iv[:32], seed[:]) + iv[32] = uint8(nonce) + iv[33] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [32 + 2]byte // 32 byte seed + uint16 nonce - h := sha3.NewShake128() - copy(iv[:32], seed[:]) - iv[32] = uint8(nonce) - iv[33] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:168]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:168]) + sample() } } @@ -142,13 +129,9 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { // Assumes 2 < η < 8. var i, length int - var buf [9 * 16]byte // fits 136B SHAKE-256 rate and 9 16B AES blocks + var buf [9 * 16]byte // fits 136B SHAKE-256 rate - if UseAES { - length = 9 * 16 - } else { - length = 136 - } + length = 136 sample := func() { // We use rejection sampling @@ -181,28 +164,19 @@ func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream256(seed, nonce) - - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [64 + 2]byte // 64 byte seed + uint16 nonce + var iv [64 + 2]byte // 64 byte seed + uint16 nonce - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() } } @@ -223,18 +197,13 @@ func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { var buf [PolyLeGamma1Size]byte - if UseAES { - h := common.NewAesStream256(seed, nonce) - h.SqueezeInto(buf[:]) - } else { - var iv [66]byte - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - _, _ = h.Read(buf[:]) - } + var iv [66]byte + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) + _, _ = h.Read(buf[:]) PolyUnpackLeGamma1(p, buf[:]) } @@ -246,12 +215,12 @@ func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { // Can only be called when DeriveX4Available is true. // // This function is currently not used (yet). -func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { +func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { var perm keccakf1600.StateX4 state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 4; i++ { + for i := 0; i < CTildeSize/8; i++ { v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) for j := 0; j < 4; j++ { state[i*4+j] = v @@ -260,7 +229,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[4*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +296,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // Samples p uniformly with τ non-zero coefficients in {q-1,1}. // // The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed *[32]byte) { +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { var buf [136]byte // SHAKE-256 rate is 136 h := sha3.NewShake256() diff --git a/sign/mldsa/mldsa44/internal/sample_test.go b/sign/mldsa/mldsa44/internal/sample_test.go new file mode 100644 index 000000000..32931c94f --- /dev/null +++ b/sign/mldsa/mldsa44/internal/sample_test.go @@ -0,0 +1,218 @@ +// Code generated from mode3/internal/sample_test.go by gen.go + +package internal + +import ( + "encoding/binary" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +func TestVectorDeriveUniform(t *testing.T) { + var p, p2 common.Poly + var seed [32]byte + p2 = common.Poly{ + 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, + 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, + 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, + 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, + 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, + 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, + 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, + 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, + 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, + 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, + 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, + 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, + 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, + 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, + 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, + 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, + 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, + 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, + 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, + 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, + 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, + 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, + 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, + 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, + 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, + 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, + 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, + 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, + 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, + 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, + 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, + 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, + 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, + 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, + 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, + 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, + 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, + 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, + 4352830, + } + for i := 0; i < 32; i++ { + seed[i] = byte(i) + } + PolyDeriveUniform(&p, &seed, 30000) + if p != p2 { + t.Fatalf("%v != %v", p, p2) + } +} + +func TestDeriveUniform(t *testing.T) { + var p common.Poly + var seed [32]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniform(&p, &seed, uint16(i)) + if !PolyNormalized(&p) { + t.Fatal() + } + } +} + +func TestDeriveUniformLeqEta(t *testing.T) { + var p common.Poly + var seed [64]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformLeqEta(&p, &seed, uint16(i)) + for j := 0; j < common.N; j++ { + if p[j] < common.Q-Eta || p[j] > common.Q+Eta { + t.Fatal() + } + } + } +} + +func TestDeriveUniformLeGamma1(t *testing.T) { + var p common.Poly + var seed [64]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) + for j := 0; j < common.N; j++ { + if (p[j] > Gamma1 && p[j] <= common.Q-Gamma1) || p[j] >= common.Q { + t.Fatal() + } + } + } +} + +func TestDeriveUniformBall(t *testing.T) { + var p common.Poly + var seed [CTildeSize]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformBall(&p, seed[:]) + nonzero := 0 + for j := 0; j < common.N; j++ { + if p[j] != 0 { + if p[j] != 1 && p[j] != common.Q-1 { + t.Fatal() + } + nonzero++ + } + } + if nonzero != Tau { + t.Fatal() + } + } +} + +func TestDeriveUniformX4(t *testing.T) { + if !DeriveX4Available { + t.SkipNow() + } + var ps [4]common.Poly + var p common.Poly + var seed [32]byte + nonces := [4]uint16{12345, 54321, 13532, 37377} + + for i := 0; i < len(seed); i++ { + seed[i] = byte(i) + } + + PolyDeriveUniformX4([4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, &seed, + nonces) + for i := 0; i < 4; i++ { + PolyDeriveUniform(&p, &seed, nonces[i]) + if ps[i] != p { + t.Fatal() + } + } +} + +func TestDeriveUniformBallX4(t *testing.T) { + if !DeriveX4Available { + t.SkipNow() + } + var ps [4]common.Poly + var p common.Poly + var seed [CTildeSize]byte + PolyDeriveUniformBallX4( + [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, + seed[:], + ) + for j := 0; j < 4; j++ { + PolyDeriveUniformBall(&p, seed[:]) + if ps[j] != p { + t.Fatalf("%d\n%v\n%v", j, ps[j], p) + } + } +} + +func BenchmarkPolyDeriveUniformBall(b *testing.B) { + var seed [32]byte + var p common.Poly + var w1 VecK + for i := 0; i < b.N; i++ { + w1[0][0] = uint32(i) + PolyDeriveUniformBall(&p, seed[:]) + } +} + +func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { + var seed [32]byte + var p common.Poly + var w1 VecK + for i := 0; i < b.N; i++ { + w1[0][0] = uint32(i) + PolyDeriveUniformBallX4( + [4]*common.Poly{&p, &p, &p, &p}, + seed[:], + ) + } +} + +func BenchmarkPolyDeriveUniform(b *testing.B) { + var seed [32]byte + var p common.Poly + for i := 0; i < b.N; i++ { + PolyDeriveUniform(&p, &seed, uint16(i)) + } +} + +func BenchmarkPolyDeriveUniformX4(b *testing.B) { + if !DeriveX4Available { + b.SkipNow() + } + var seed [32]byte + var p [4]common.Poly + for i := 0; i < b.N; i++ { + nonce := uint16(4 * i) + PolyDeriveUniformX4([4]*common.Poly{&p[0], &p[1], &p[2], &p[3]}, + &seed, [4]uint16{nonce, nonce + 1, nonce + 2, nonce + 3}) + } +} + +func BenchmarkPolyDeriveUniformLeGamma1(b *testing.B) { + var seed [64]byte + var p common.Poly + for i := 0; i < b.N; i++ { + PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) + } +} diff --git a/sign/dilithium/mode2aes/internal/vec.go b/sign/mldsa/mldsa44/internal/vec.go similarity index 99% rename from sign/dilithium/mode2aes/internal/vec.go rename to sign/mldsa/mldsa44/internal/vec.go index f52973e45..d07d3b245 100644 --- a/sign/dilithium/mode2aes/internal/vec.go +++ b/sign/mldsa/mldsa44/internal/vec.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A vector of L polynomials. diff --git a/sign/mldsa/mldsa65/acvp_test.go b/sign/mldsa/mldsa65/acvp_test.go new file mode 100644 index 000000000..24742cb0e --- /dev/null +++ b/sign/mldsa/mldsa65/acvp_test.go @@ -0,0 +1,262 @@ +// Code generated from acvp.templ.go. DO NOT EDIT. + +package mldsa65 + +import ( + "bytes" + "compress/gzip" + "encoding/hex" + "encoding/json" + "io" + "os" + "testing" +) + +// []byte but is encoded in hex for JSON +type HexBytes []byte + +func (b HexBytes) MarshalJSON() ([]byte, error) { + return json.Marshal(hex.EncodeToString(b)) +} + +func (b *HexBytes) UnmarshalJSON(data []byte) (err error) { + var s string + if err = json.Unmarshal(data, &s); err != nil { + return err + } + *b, err = hex.DecodeString(s) + return err +} + +func gunzip(in []byte) ([]byte, error) { + buf := bytes.NewBuffer(in) + r, err := gzip.NewReader(buf) + if err != nil { + return nil, err + } + return io.ReadAll(r) +} + +func readGzip(path string) ([]byte, error) { + buf, err := os.ReadFile(path) + if err != nil { + return nil, err + } + return gunzip(buf) +} + +func TestACVP(t *testing.T) { + for _, sub := range []string{ + "keyGen", + "sigGen", + } { + t.Run(sub, func(t *testing.T) { + testACVP(t, sub) + }) + } +} + +// nolint:funlen,gocyclo +func testACVP(t *testing.T, sub string) { + buf, err := readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/prompt.json.gz") + if err != nil { + t.Fatal(err) + } + + var prompt struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err = json.Unmarshal(buf, &prompt); err != nil { + t.Fatal(err) + } + + buf, err = readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/expectedResults.json.gz") + if err != nil { + t.Fatal(err) + } + + var results struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err := json.Unmarshal(buf, &results); err != nil { + t.Fatal(err) + } + + rawResults := make(map[int]json.RawMessage) + + for _, rawGroup := range results.TestGroups { + var abstractGroup struct { + Tests []json.RawMessage `json:"tests"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + for _, rawTest := range abstractGroup.Tests { + var abstractTest struct { + TcID int `json:"tcId"` + } + if err := json.Unmarshal(rawTest, &abstractTest); err != nil { + t.Fatal(err) + } + if _, exists := rawResults[abstractTest.TcID]; exists { + t.Fatalf("Duplicate test id: %d", abstractTest.TcID) + } + rawResults[abstractTest.TcID] = rawTest + } + } + + scheme := Scheme() + + for _, rawGroup := range prompt.TestGroups { + var abstractGroup struct { + TestType string `json:"testType"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + switch { + case abstractGroup.TestType == "AFT" && sub == "keyGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Tests []struct { + TcID int `json:"tcId"` + Seed HexBytes `json:"seed"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + for _, test := range group.Tests { + var result struct { + Pk HexBytes `json:"pk"` + Sk HexBytes `json:"sk"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + pk, sk := scheme.DeriveKey(test.Seed) + + pk2, err := scheme.UnmarshalBinaryPublicKey(result.Pk) + if err != nil { + t.Fatalf("tc=%d: %v", test.TcID, err) + } + sk2, err := scheme.UnmarshalBinaryPrivateKey(result.Sk) + if err != nil { + t.Fatal(err) + } + + if !pk.Equal(pk2) { + t.Fatal("pk does not match") + } + if !sk.Equal(sk2) { + t.Fatal("sk does not match") + } + } + case abstractGroup.TestType == "AFT" && sub == "sigGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Deterministic bool `json:"deterministic"` + Tests []struct { + TcID int `json:"tcId"` + Sk HexBytes `json:"sk"` + Message HexBytes `json:"message"` + Rnd HexBytes `json:"rnd"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + for _, test := range group.Tests { + var result struct { + Signature HexBytes `json:"signature"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + sk, err := scheme.UnmarshalBinaryPrivateKey(test.Sk) + if err != nil { + t.Fatal(err) + } + + var rnd [32]byte + if !group.Deterministic { + copy(rnd[:], test.Rnd) + } + + sig2 := sk.(*PrivateKey).unsafeSignInternal(test.Message, rnd) + + if !bytes.Equal(sig2, result.Signature) { + t.Fatalf("signature doesn't match: %x ≠ %x", + sig2, result.Signature) + } + } + case abstractGroup.TestType == "AFT" && sub == "sigVer": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Pk HexBytes `json:"pk"` + Tests []struct { + TcID int `json:"tcId"` + Message HexBytes `json:"message"` + Signature HexBytes `json:"signature"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + pk, err := scheme.UnmarshalBinaryPublicKey(group.Pk) + if err != nil { + t.Fatal(err) + } + + for _, test := range group.Tests { + var result struct { + TestPassed bool `json:"testPassed"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + passed2 := scheme.Verify(pk, test.Message, test.Signature, nil) + if passed2 != result.TestPassed { + t.Fatalf("verification %v ≠ %v", passed2, result.TestPassed) + } + } + default: + t.Fatalf("unknown type %s for %s", abstractGroup.TestType, sub) + } + } +} diff --git a/sign/mldsa/mldsa65/dilithium.go b/sign/mldsa/mldsa65/dilithium.go new file mode 100644 index 000000000..e54459863 --- /dev/null +++ b/sign/mldsa/mldsa65/dilithium.go @@ -0,0 +1,346 @@ +// Code generated from pkg.templ.go. DO NOT EDIT. + +// mldsa65 implements NIST signature scheme ML-DSA-65 as defined in FIPS204. +package mldsa65 + +import ( + "crypto" + cryptoRand "crypto/rand" + "errors" + "io" + + "github.com/cloudflare/circl/sign" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/mldsa/mldsa65/internal" +) + +const ( + // Size of seed for NewKeyFromSeed + SeedSize = common.SeedSize + + // Size of a packed PublicKey + PublicKeySize = internal.PublicKeySize + + // Size of a packed PrivateKey + PrivateKeySize = internal.PrivateKeySize + + // Size of a signature + SignatureSize = internal.SignatureSize +) + +// PublicKey is the type of ML-DSA-65 public key +type PublicKey internal.PublicKey + +// PrivateKey is the type of ML-DSA-65 private key +type PrivateKey internal.PrivateKey + +// GenerateKey generates a public/private key pair using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { + pk, sk, err := internal.GenerateKey(rand) + return (*PublicKey)(pk), (*PrivateKey)(sk), err +} + +// NewKeyFromSeed derives a public/private key pair using the given seed. +func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { + pk, sk := internal.NewKeyFromSeed(seed) + return (*PublicKey)(pk), (*PrivateKey)(sk) +} + +// SignTo signs the given message and writes the signature into signature. +// It will panic if signature is not of length at least SignatureSize. +// +// ctx is the optional context string. Errors if ctx is larger than 255 bytes. +// A nil context string is equivalent to an empty context string. +func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error { + var rnd [32]byte + if randomized { + _, err := cryptoRand.Read(rnd[:]) + if err != nil { + return err + } + } + + if len(ctx) > 255 { + return sign.ErrContextTooLong + } + + internal.SignTo( + (*internal.PrivateKey)(sk), + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + w.Write(msg) + }, + rnd, + sig, + ) + return nil +} + +// Do not use. Implements ML-DSA.Sign_internal used for compatibility tests. +func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { + var ret [SignatureSize]byte + internal.SignTo( + (*internal.PrivateKey)(sk), + func(w io.Writer) { + w.Write(msg) + }, + rnd, + ret[:], + ) + return ret[:] +} + +// Verify checks whether the given signature by pk on msg is valid. +// +// ctx is the optional context string. Fails if ctx is larger than 255 bytes. +// A nil context string is equivalent to an empty context string. +func Verify(pk *PublicKey, msg, ctx, sig []byte) bool { + if len(ctx) > 255 { + return false + } + return internal.Verify( + (*internal.PublicKey)(pk), + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + _, _ = w.Write(msg) + }, + sig, + ) +} + +// Sets pk to the public key encoded in buf. +func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { + (*internal.PublicKey)(pk).Unpack(buf) +} + +// Sets sk to the private key encoded in buf. +func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { + (*internal.PrivateKey)(sk).Unpack(buf) +} + +// Packs the public key into buf. +func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { + (*internal.PublicKey)(pk).Pack(buf) +} + +// Packs the private key into buf. +func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { + (*internal.PrivateKey)(sk).Pack(buf) +} + +// Packs the public key. +func (pk *PublicKey) Bytes() []byte { + var buf [PublicKeySize]byte + pk.Pack(&buf) + return buf[:] +} + +// Packs the private key. +func (sk *PrivateKey) Bytes() []byte { + var buf [PrivateKeySize]byte + sk.Pack(&buf) + return buf[:] +} + +// Packs the public key. +func (pk *PublicKey) MarshalBinary() ([]byte, error) { + return pk.Bytes(), nil +} + +// Packs the private key. +func (sk *PrivateKey) MarshalBinary() ([]byte, error) { + return sk.Bytes(), nil +} + +// Unpacks the public key from data. +func (pk *PublicKey) UnmarshalBinary(data []byte) error { + if len(data) != PublicKeySize { + return errors.New("packed public key must be of mldsa65.PublicKeySize bytes") + } + var buf [PublicKeySize]byte + copy(buf[:], data) + pk.Unpack(&buf) + return nil +} + +// Unpacks the private key from data. +func (sk *PrivateKey) UnmarshalBinary(data []byte) error { + if len(data) != PrivateKeySize { + return errors.New("packed private key must be of mldsa65.PrivateKeySize bytes") + } + var buf [PrivateKeySize]byte + copy(buf[:], data) + sk.Unpack(&buf) + return nil +} + +// Sign signs the given message. +// +// opts.HashFunc() must return zero, which can be achieved by passing +// crypto.Hash(0) for opts. rand is ignored. Will only return an error +// if opts.HashFunc() is non-zero. +// +// This function is used to make PrivateKey implement the crypto.Signer +// interface. The package-level SignTo function might be more convenient +// to use. +func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( + sig []byte, err error) { + var ret [SignatureSize]byte + + if opts.HashFunc() != crypto.Hash(0) { + return nil, errors.New("dilithium: cannot sign hashed message") + } + if err = SignTo(sk, msg, nil, false, ret[:]); err != nil { + return nil, err + } + + return ret[:], nil +} + +// Computes the public key corresponding to this private key. +// +// Returns a *PublicKey. The type crypto.PublicKey is used to make +// PrivateKey implement the crypto.Signer interface. +func (sk *PrivateKey) Public() crypto.PublicKey { + return (*PublicKey)((*internal.PrivateKey)(sk).Public()) +} + +// Equal returns whether the two private keys equal. +func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { + castOther, ok := other.(*PrivateKey) + if !ok { + return false + } + return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(castOther)) +} + +// Equal returns whether the two public keys equal. +func (pk *PublicKey) Equal(other crypto.PublicKey) bool { + castOther, ok := other.(*PublicKey) + if !ok { + return false + } + return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) +} + +// Boilerplate for generic signatures API + +type scheme struct{} + +var sch sign.Scheme = &scheme{} + +// Scheme returns a generic signature interface for ML-DSA-65. +func Scheme() sign.Scheme { return sch } + +func (*scheme) Name() string { return "ML-DSA-65" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SignatureSize() int { return SignatureSize } +func (*scheme) SeedSize() int { return SeedSize } + +// TODO TLSIdentifier() and OID() + +func (*scheme) SupportsContext() bool { + return true +} + +func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { + return GenerateKey(nil) +} + +func (*scheme) Sign( + sk sign.PrivateKey, + msg []byte, + opts *sign.SignatureOpts, +) []byte { + var ctx []byte + sig := make([]byte, SignatureSize) + + priv, ok := sk.(*PrivateKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + ctx = []byte(opts.Context) + } + err := SignTo(priv, msg, ctx, false, sig) + if err != nil { + panic(err) + } + + return sig +} + +func (*scheme) Verify( + pk sign.PublicKey, + msg, sig []byte, + opts *sign.SignatureOpts, +) bool { + var ctx []byte + pub, ok := pk.(*PublicKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + ctx = []byte(opts.Context) + } + return Verify(pub, msg, ctx, sig) +} + +func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { + if len(seed) != SeedSize { + panic(sign.ErrSeedSize) + } + var seed2 [SeedSize]byte + copy(seed2[:], seed) + return NewKeyFromSeed(&seed2) +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { + if len(buf) != PublicKeySize { + return nil, sign.ErrPubKeySize + } + + var ( + buf2 [PublicKeySize]byte + ret PublicKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, sign.ErrPrivKeySize + } + + var ( + buf2 [PrivateKeySize]byte + ret PrivateKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (sk *PrivateKey) Scheme() sign.Scheme { + return sch +} + +func (sk *PublicKey) Scheme() sign.Scheme { + return sch +} diff --git a/sign/dilithium/mode2aes/internal/dilithium.go b/sign/mldsa/mldsa65/internal/dilithium.go similarity index 89% rename from sign/dilithium/mode2aes/internal/dilithium.go rename to sign/mldsa/mldsa65/internal/dilithium.go index 79a17d504..8f1c8e5cb 100644 --- a/sign/dilithium/mode2aes/internal/dilithium.go +++ b/sign/mldsa/mldsa65/internal/dilithium.go @@ -8,7 +8,7 @@ import ( "io" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -29,13 +29,13 @@ const ( Alpha = 2 * Gamma2 // Size of a packed private key - PrivateKeySize = 32 + 32 + 32 + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K + PrivateKeySize = 32 + 32 + TRSize + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K // Size of a packed public key PublicKeySize = 32 + common.PolyT1Size*K // Size of a packed signature - SignatureSize = L*PolyLeGamma1Size + Omega + K + 32 + SignatureSize = L*PolyLeGamma1Size + Omega + K + CTildeSize // Size of packed w₁ PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 @@ -49,7 +49,7 @@ type PublicKey struct { // Cached values t1p [common.PolyT1Size * K]byte A *Mat - tr *[32]byte + tr *[TRSize]byte } // PrivateKey is the type of Dilithium private keys. @@ -59,7 +59,7 @@ type PrivateKey struct { s1 VecL s2 VecK t0 VecK - tr [32]byte + tr [TRSize]byte // Cached values A Mat // ExpandA(ρ) @@ -71,14 +71,14 @@ type PrivateKey struct { type unpackedSignature struct { z VecL hint VecK - c [32]byte + c [CTildeSize]byte } // Packs the signature into buf. func (sig *unpackedSignature) Pack(buf []byte) { copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[32:]) - sig.hint.PackHint(buf[32+L*PolyLeGamma1Size:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) } // Sets sig to the signature encoded in the buffer. @@ -89,11 +89,11 @@ func (sig *unpackedSignature) Unpack(buf []byte) bool { return false } copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[32:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) if sig.z.Exceeds(Gamma1 - Beta) { return false } - if !sig.hint.UnpackHint(buf[32+L*PolyLeGamma1Size:]) { + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { return false } return true @@ -115,7 +115,7 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { pk.A.Derive(&pk.rho) // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([32]byte) + pk.tr = new([TRSize]byte) h := sha3.NewShake256() _, _ = h.Write(buf[:]) _, _ = h.Read(pk.tr[:]) @@ -125,8 +125,8 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { copy(buf[:32], sk.rho[:]) copy(buf[32:64], sk.key[:]) - copy(buf[64:96], sk.tr[:]) - offset := 96 + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize sk.s1.PackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.PackLeqEta(buf[offset:]) @@ -138,8 +138,8 @@ func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { copy(sk.rho[:], buf[:32]) copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:96]) - offset := 96 + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize sk.s1.UnpackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.UnpackLeqEta(buf[offset:]) @@ -180,6 +180,11 @@ func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { h := sha3.NewShake256() _, _ = h.Write(seed[:]) + + if NIST { + _, _ = h.Write([]byte{byte(K), byte(L)}) + } + _, _ = h.Read(eSeed[:]) copy(pk.rho[:], eSeed[:32]) @@ -244,13 +249,16 @@ func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// For Dilithium this is the top-level verification function. +// In ML-DSA, this is ML-DSA.Verify_internal. +func Verify(pk *PublicKey, msg func(io.Writer), signature []byte) bool { var sig unpackedSignature var mu [64]byte var zh VecL var Az, Az2dct1, w1 VecK var ch common.Poly - var cp [32]byte + var cp [CTildeSize]byte var w1Packed [PolyW1Size * K]byte // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β @@ -262,7 +270,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // Compute Az @@ -279,7 +287,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // which is small enough for NTT(). Az2dct1.MulBy2toD(&pk.t1) Az2dct1.NTT() - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +315,11 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // SignTo signs the given message and writes the signature into signature. // +// For Dilithium this is the top-level signing function. For ML-DSA +// this is ML-DSA.Sign_internal. +// //nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg func(io.Writer), rnd [32]byte, signature []byte) { var mu, rhop [64]byte var w1Packed [PolyW1Size * K]byte var y, yh VecL @@ -324,12 +335,15 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + _, _ = h.Write(rnd[:]) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +382,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode3aes/internal/dilithium_test.go b/sign/mldsa/mldsa65/internal/dilithium_test.go similarity index 77% rename from sign/dilithium/mode3aes/internal/dilithium_test.go rename to sign/mldsa/mldsa65/internal/dilithium_test.go index ca347a831..47f53d3a0 100644 --- a/sign/dilithium/mode3aes/internal/dilithium_test.go +++ b/sign/mldsa/mldsa65/internal/dilithium_test.go @@ -4,9 +4,10 @@ package internal import ( "encoding/binary" + "io" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Checks whether p is normalized. Only used in tests. @@ -36,32 +37,38 @@ func BenchmarkVerify(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of verification (as in the reference // implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) b.ResetTimer() for i := 0; i < b.N; i++ { // We should generate a new signature for every verify attempt, // as this influences the time a little bit. This difference, however, // is small and generating a new signature in between creates a lot // pressure on the allocator which makes an accurate measurement hard. - Verify(pk, msg[:], sig[:]) + Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) } } func BenchmarkSign(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of signing (as in the reference implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) _, sk := NewKeyFromSeed(&seed) b.ResetTimer() for i := 0; i < b.N; i++ { binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) } } @@ -85,13 +92,16 @@ func BenchmarkPublicFromPrivate(b *testing.B) { } func TestSignThenVerifyAndPkSkPacking(t *testing.T) { - var seed [common.SeedSize]byte - var sig [SignatureSize]byte - var msg [8]byte - var pkb [PublicKeySize]byte - var skb [PrivateKeySize]byte - var pk2 PublicKey - var sk2 PrivateKey + var ( + seed [common.SeedSize]byte + sig [SignatureSize]byte + msg [8]byte + pkb [PublicKeySize]byte + skb [PrivateKeySize]byte + pk2 PublicKey + sk2 PrivateKey + rnd [32]byte + ) for i := uint64(0); i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], i) pk, sk := NewKeyFromSeed(&seed) @@ -100,8 +110,8 @@ func TestSignThenVerifyAndPkSkPacking(t *testing.T) { } for j := uint64(0); j < 10; j++ { binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) + if !Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) { t.Fatal() } } diff --git a/sign/dilithium/mode2aes/internal/mat.go b/sign/mldsa/mldsa65/internal/mat.go similarity index 95% rename from sign/dilithium/mode2aes/internal/mat.go rename to sign/mldsa/mldsa65/internal/mat.go index cb473c149..ceaf634fa 100644 --- a/sign/dilithium/mode2aes/internal/mat.go +++ b/sign/mldsa/mldsa65/internal/mat.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A k by l matrix of polynomials. diff --git a/sign/dilithium/mode3aes/internal/pack.go b/sign/mldsa/mldsa65/internal/pack.go similarity index 99% rename from sign/dilithium/mode3aes/internal/pack.go rename to sign/mldsa/mldsa65/internal/pack.go index 0285dfd8e..1854b4197 100644 --- a/sign/dilithium/mode3aes/internal/pack.go +++ b/sign/mldsa/mldsa65/internal/pack.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Writes p with norm less than or equal η into buf, which must be of diff --git a/sign/dilithium/mode5aes/internal/pack_test.go b/sign/mldsa/mldsa65/internal/pack_test.go similarity index 96% rename from sign/dilithium/mode5aes/internal/pack_test.go rename to sign/mldsa/mldsa65/internal/pack_test.go index 24f568e4d..f952c6a09 100644 --- a/sign/dilithium/mode5aes/internal/pack_test.go +++ b/sign/mldsa/mldsa65/internal/pack_test.go @@ -5,7 +5,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestPolyPackLeqEta(t *testing.T) { diff --git a/sign/dilithium/mode3aes/internal/params.go b/sign/mldsa/mldsa65/internal/params.go similarity index 72% rename from sign/dilithium/mode3aes/internal/params.go rename to sign/mldsa/mldsa65/internal/params.go index 7523dc09e..8a1f866e6 100644 --- a/sign/dilithium/mode3aes/internal/params.go +++ b/sign/mldsa/mldsa65/internal/params.go @@ -3,8 +3,7 @@ package internal const ( - Name = "Dilithium3-AES" - UseAES = true + Name = "ML-DSA-65" K = 6 L = 5 Eta = 4 @@ -13,4 +12,7 @@ const ( Tau = 49 Gamma1Bits = 19 Gamma2 = 261888 + NIST = true + TRSize = 64 + CTildeSize = 48 ) diff --git a/sign/dilithium/mode2aes/internal/rounding.go b/sign/mldsa/mldsa65/internal/rounding.go similarity index 98% rename from sign/dilithium/mode2aes/internal/rounding.go rename to sign/mldsa/mldsa65/internal/rounding.go index 71360cb29..58123c090 100644 --- a/sign/dilithium/mode2aes/internal/rounding.go +++ b/sign/mldsa/mldsa65/internal/rounding.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, diff --git a/sign/dilithium/mode3aes/internal/rounding_test.go b/sign/mldsa/mldsa65/internal/rounding_test.go similarity index 96% rename from sign/dilithium/mode3aes/internal/rounding_test.go rename to sign/mldsa/mldsa65/internal/rounding_test.go index 5824f2656..ad653ca3f 100644 --- a/sign/dilithium/mode3aes/internal/rounding_test.go +++ b/sign/mldsa/mldsa65/internal/rounding_test.go @@ -6,7 +6,7 @@ import ( "flag" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") diff --git a/sign/dilithium/mode5aes/internal/sample.go b/sign/mldsa/mldsa65/internal/sample.go similarity index 81% rename from sign/dilithium/mode5aes/internal/sample.go rename to sign/mldsa/mldsa65/internal/sample.go index c47185ada..b37370a4e 100644 --- a/sign/dilithium/mode5aes/internal/sample.go +++ b/sign/mldsa/mldsa65/internal/sample.go @@ -6,13 +6,13 @@ import ( "encoding/binary" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" "github.com/cloudflare/circl/simd/keccakf1600" ) // DeriveX4Available indicates whether the system supports the quick fourway // sampling variants like PolyDeriveUniformX4. -var DeriveX4Available = keccakf1600.IsEnabledX4() && !UseAES +var DeriveX4Available = keccakf1600.IsEnabledX4() // For each i, sample ps[i] uniformly from the given seed and nonces[i]. // ps[i] may be nil and is ignored in that case. @@ -91,13 +91,9 @@ func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { // p will be normalized. func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { var i, length int - var buf [12 * 16]byte // fits 168B SHAKE-128 rate and 12 16B AES blocks + var buf [12 * 16]byte // fits 168B SHAKE-128 rate - if UseAES { - length = 12 * 16 - } else { - length = 168 - } + length = 168 sample := func() { // Note that 3 divides into 168 and 12*16, so we use up buf completely. @@ -113,25 +109,16 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream128(seed, nonce) + var iv [32 + 2]byte // 32 byte seed + uint16 nonce + h := sha3.NewShake128() + copy(iv[:32], seed[:]) + iv[32] = uint8(nonce) + iv[33] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [32 + 2]byte // 32 byte seed + uint16 nonce - h := sha3.NewShake128() - copy(iv[:32], seed[:]) - iv[32] = uint8(nonce) - iv[33] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:168]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:168]) + sample() } } @@ -142,13 +129,9 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { // Assumes 2 < η < 8. var i, length int - var buf [9 * 16]byte // fits 136B SHAKE-256 rate and 9 16B AES blocks + var buf [9 * 16]byte // fits 136B SHAKE-256 rate - if UseAES { - length = 9 * 16 - } else { - length = 136 - } + length = 136 sample := func() { // We use rejection sampling @@ -181,28 +164,19 @@ func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream256(seed, nonce) - - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [64 + 2]byte // 64 byte seed + uint16 nonce + var iv [64 + 2]byte // 64 byte seed + uint16 nonce - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() } } @@ -223,18 +197,13 @@ func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { var buf [PolyLeGamma1Size]byte - if UseAES { - h := common.NewAesStream256(seed, nonce) - h.SqueezeInto(buf[:]) - } else { - var iv [66]byte - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - _, _ = h.Read(buf[:]) - } + var iv [66]byte + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) + _, _ = h.Read(buf[:]) PolyUnpackLeGamma1(p, buf[:]) } @@ -246,12 +215,12 @@ func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { // Can only be called when DeriveX4Available is true. // // This function is currently not used (yet). -func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { +func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { var perm keccakf1600.StateX4 state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 4; i++ { + for i := 0; i < CTildeSize/8; i++ { v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) for j := 0; j < 4; j++ { state[i*4+j] = v @@ -260,7 +229,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[4*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +296,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // Samples p uniformly with τ non-zero coefficients in {q-1,1}. // // The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed *[32]byte) { +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { var buf [136]byte // SHAKE-256 rate is 136 h := sha3.NewShake256() diff --git a/sign/mldsa/mldsa65/internal/sample_test.go b/sign/mldsa/mldsa65/internal/sample_test.go new file mode 100644 index 000000000..32931c94f --- /dev/null +++ b/sign/mldsa/mldsa65/internal/sample_test.go @@ -0,0 +1,218 @@ +// Code generated from mode3/internal/sample_test.go by gen.go + +package internal + +import ( + "encoding/binary" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +func TestVectorDeriveUniform(t *testing.T) { + var p, p2 common.Poly + var seed [32]byte + p2 = common.Poly{ + 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, + 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, + 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, + 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, + 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, + 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, + 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, + 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, + 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, + 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, + 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, + 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, + 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, + 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, + 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, + 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, + 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, + 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, + 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, + 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, + 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, + 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, + 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, + 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, + 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, + 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, + 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, + 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, + 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, + 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, + 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, + 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, + 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, + 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, + 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, + 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, + 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, + 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, + 4352830, + } + for i := 0; i < 32; i++ { + seed[i] = byte(i) + } + PolyDeriveUniform(&p, &seed, 30000) + if p != p2 { + t.Fatalf("%v != %v", p, p2) + } +} + +func TestDeriveUniform(t *testing.T) { + var p common.Poly + var seed [32]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniform(&p, &seed, uint16(i)) + if !PolyNormalized(&p) { + t.Fatal() + } + } +} + +func TestDeriveUniformLeqEta(t *testing.T) { + var p common.Poly + var seed [64]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformLeqEta(&p, &seed, uint16(i)) + for j := 0; j < common.N; j++ { + if p[j] < common.Q-Eta || p[j] > common.Q+Eta { + t.Fatal() + } + } + } +} + +func TestDeriveUniformLeGamma1(t *testing.T) { + var p common.Poly + var seed [64]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) + for j := 0; j < common.N; j++ { + if (p[j] > Gamma1 && p[j] <= common.Q-Gamma1) || p[j] >= common.Q { + t.Fatal() + } + } + } +} + +func TestDeriveUniformBall(t *testing.T) { + var p common.Poly + var seed [CTildeSize]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformBall(&p, seed[:]) + nonzero := 0 + for j := 0; j < common.N; j++ { + if p[j] != 0 { + if p[j] != 1 && p[j] != common.Q-1 { + t.Fatal() + } + nonzero++ + } + } + if nonzero != Tau { + t.Fatal() + } + } +} + +func TestDeriveUniformX4(t *testing.T) { + if !DeriveX4Available { + t.SkipNow() + } + var ps [4]common.Poly + var p common.Poly + var seed [32]byte + nonces := [4]uint16{12345, 54321, 13532, 37377} + + for i := 0; i < len(seed); i++ { + seed[i] = byte(i) + } + + PolyDeriveUniformX4([4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, &seed, + nonces) + for i := 0; i < 4; i++ { + PolyDeriveUniform(&p, &seed, nonces[i]) + if ps[i] != p { + t.Fatal() + } + } +} + +func TestDeriveUniformBallX4(t *testing.T) { + if !DeriveX4Available { + t.SkipNow() + } + var ps [4]common.Poly + var p common.Poly + var seed [CTildeSize]byte + PolyDeriveUniformBallX4( + [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, + seed[:], + ) + for j := 0; j < 4; j++ { + PolyDeriveUniformBall(&p, seed[:]) + if ps[j] != p { + t.Fatalf("%d\n%v\n%v", j, ps[j], p) + } + } +} + +func BenchmarkPolyDeriveUniformBall(b *testing.B) { + var seed [32]byte + var p common.Poly + var w1 VecK + for i := 0; i < b.N; i++ { + w1[0][0] = uint32(i) + PolyDeriveUniformBall(&p, seed[:]) + } +} + +func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { + var seed [32]byte + var p common.Poly + var w1 VecK + for i := 0; i < b.N; i++ { + w1[0][0] = uint32(i) + PolyDeriveUniformBallX4( + [4]*common.Poly{&p, &p, &p, &p}, + seed[:], + ) + } +} + +func BenchmarkPolyDeriveUniform(b *testing.B) { + var seed [32]byte + var p common.Poly + for i := 0; i < b.N; i++ { + PolyDeriveUniform(&p, &seed, uint16(i)) + } +} + +func BenchmarkPolyDeriveUniformX4(b *testing.B) { + if !DeriveX4Available { + b.SkipNow() + } + var seed [32]byte + var p [4]common.Poly + for i := 0; i < b.N; i++ { + nonce := uint16(4 * i) + PolyDeriveUniformX4([4]*common.Poly{&p[0], &p[1], &p[2], &p[3]}, + &seed, [4]uint16{nonce, nonce + 1, nonce + 2, nonce + 3}) + } +} + +func BenchmarkPolyDeriveUniformLeGamma1(b *testing.B) { + var seed [64]byte + var p common.Poly + for i := 0; i < b.N; i++ { + PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) + } +} diff --git a/sign/dilithium/mode5aes/internal/vec.go b/sign/mldsa/mldsa65/internal/vec.go similarity index 99% rename from sign/dilithium/mode5aes/internal/vec.go rename to sign/mldsa/mldsa65/internal/vec.go index f52973e45..d07d3b245 100644 --- a/sign/dilithium/mode5aes/internal/vec.go +++ b/sign/mldsa/mldsa65/internal/vec.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A vector of L polynomials. diff --git a/sign/mldsa/mldsa87/acvp_test.go b/sign/mldsa/mldsa87/acvp_test.go new file mode 100644 index 000000000..b124d4553 --- /dev/null +++ b/sign/mldsa/mldsa87/acvp_test.go @@ -0,0 +1,262 @@ +// Code generated from acvp.templ.go. DO NOT EDIT. + +package mldsa87 + +import ( + "bytes" + "compress/gzip" + "encoding/hex" + "encoding/json" + "io" + "os" + "testing" +) + +// []byte but is encoded in hex for JSON +type HexBytes []byte + +func (b HexBytes) MarshalJSON() ([]byte, error) { + return json.Marshal(hex.EncodeToString(b)) +} + +func (b *HexBytes) UnmarshalJSON(data []byte) (err error) { + var s string + if err = json.Unmarshal(data, &s); err != nil { + return err + } + *b, err = hex.DecodeString(s) + return err +} + +func gunzip(in []byte) ([]byte, error) { + buf := bytes.NewBuffer(in) + r, err := gzip.NewReader(buf) + if err != nil { + return nil, err + } + return io.ReadAll(r) +} + +func readGzip(path string) ([]byte, error) { + buf, err := os.ReadFile(path) + if err != nil { + return nil, err + } + return gunzip(buf) +} + +func TestACVP(t *testing.T) { + for _, sub := range []string{ + "keyGen", + "sigGen", + } { + t.Run(sub, func(t *testing.T) { + testACVP(t, sub) + }) + } +} + +// nolint:funlen,gocyclo +func testACVP(t *testing.T, sub string) { + buf, err := readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/prompt.json.gz") + if err != nil { + t.Fatal(err) + } + + var prompt struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err = json.Unmarshal(buf, &prompt); err != nil { + t.Fatal(err) + } + + buf, err = readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/expectedResults.json.gz") + if err != nil { + t.Fatal(err) + } + + var results struct { + TestGroups []json.RawMessage `json:"testGroups"` + } + + if err := json.Unmarshal(buf, &results); err != nil { + t.Fatal(err) + } + + rawResults := make(map[int]json.RawMessage) + + for _, rawGroup := range results.TestGroups { + var abstractGroup struct { + Tests []json.RawMessage `json:"tests"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + for _, rawTest := range abstractGroup.Tests { + var abstractTest struct { + TcID int `json:"tcId"` + } + if err := json.Unmarshal(rawTest, &abstractTest); err != nil { + t.Fatal(err) + } + if _, exists := rawResults[abstractTest.TcID]; exists { + t.Fatalf("Duplicate test id: %d", abstractTest.TcID) + } + rawResults[abstractTest.TcID] = rawTest + } + } + + scheme := Scheme() + + for _, rawGroup := range prompt.TestGroups { + var abstractGroup struct { + TestType string `json:"testType"` + } + if err := json.Unmarshal(rawGroup, &abstractGroup); err != nil { + t.Fatal(err) + } + switch { + case abstractGroup.TestType == "AFT" && sub == "keyGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Tests []struct { + TcID int `json:"tcId"` + Seed HexBytes `json:"seed"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + for _, test := range group.Tests { + var result struct { + Pk HexBytes `json:"pk"` + Sk HexBytes `json:"sk"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + pk, sk := scheme.DeriveKey(test.Seed) + + pk2, err := scheme.UnmarshalBinaryPublicKey(result.Pk) + if err != nil { + t.Fatalf("tc=%d: %v", test.TcID, err) + } + sk2, err := scheme.UnmarshalBinaryPrivateKey(result.Sk) + if err != nil { + t.Fatal(err) + } + + if !pk.Equal(pk2) { + t.Fatal("pk does not match") + } + if !sk.Equal(sk2) { + t.Fatal("sk does not match") + } + } + case abstractGroup.TestType == "AFT" && sub == "sigGen": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Deterministic bool `json:"deterministic"` + Tests []struct { + TcID int `json:"tcId"` + Sk HexBytes `json:"sk"` + Message HexBytes `json:"message"` + Rnd HexBytes `json:"rnd"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + for _, test := range group.Tests { + var result struct { + Signature HexBytes `json:"signature"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + sk, err := scheme.UnmarshalBinaryPrivateKey(test.Sk) + if err != nil { + t.Fatal(err) + } + + var rnd [32]byte + if !group.Deterministic { + copy(rnd[:], test.Rnd) + } + + sig2 := sk.(*PrivateKey).unsafeSignInternal(test.Message, rnd) + + if !bytes.Equal(sig2, result.Signature) { + t.Fatalf("signature doesn't match: %x ≠ %x", + sig2, result.Signature) + } + } + case abstractGroup.TestType == "AFT" && sub == "sigVer": + var group struct { + TgID int `json:"tgId"` + ParameterSet string `json:"parameterSet"` + Pk HexBytes `json:"pk"` + Tests []struct { + TcID int `json:"tcId"` + Message HexBytes `json:"message"` + Signature HexBytes `json:"signature"` + } + } + if err := json.Unmarshal(rawGroup, &group); err != nil { + t.Fatal(err) + } + + if group.ParameterSet != scheme.Name() { + continue + } + + pk, err := scheme.UnmarshalBinaryPublicKey(group.Pk) + if err != nil { + t.Fatal(err) + } + + for _, test := range group.Tests { + var result struct { + TestPassed bool `json:"testPassed"` + } + rawResult, ok := rawResults[test.TcID] + if !ok { + t.Fatalf("Missing result: %d", test.TcID) + } + if err := json.Unmarshal(rawResult, &result); err != nil { + t.Fatal(err) + } + + passed2 := scheme.Verify(pk, test.Message, test.Signature, nil) + if passed2 != result.TestPassed { + t.Fatalf("verification %v ≠ %v", passed2, result.TestPassed) + } + } + default: + t.Fatalf("unknown type %s for %s", abstractGroup.TestType, sub) + } + } +} diff --git a/sign/mldsa/mldsa87/dilithium.go b/sign/mldsa/mldsa87/dilithium.go new file mode 100644 index 000000000..69ab919d8 --- /dev/null +++ b/sign/mldsa/mldsa87/dilithium.go @@ -0,0 +1,346 @@ +// Code generated from pkg.templ.go. DO NOT EDIT. + +// mldsa87 implements NIST signature scheme ML-DSA-87 as defined in FIPS204. +package mldsa87 + +import ( + "crypto" + cryptoRand "crypto/rand" + "errors" + "io" + + "github.com/cloudflare/circl/sign" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/mldsa/mldsa87/internal" +) + +const ( + // Size of seed for NewKeyFromSeed + SeedSize = common.SeedSize + + // Size of a packed PublicKey + PublicKeySize = internal.PublicKeySize + + // Size of a packed PrivateKey + PrivateKeySize = internal.PrivateKeySize + + // Size of a signature + SignatureSize = internal.SignatureSize +) + +// PublicKey is the type of ML-DSA-87 public key +type PublicKey internal.PublicKey + +// PrivateKey is the type of ML-DSA-87 private key +type PrivateKey internal.PrivateKey + +// GenerateKey generates a public/private key pair using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKey(rand io.Reader) (*PublicKey, *PrivateKey, error) { + pk, sk, err := internal.GenerateKey(rand) + return (*PublicKey)(pk), (*PrivateKey)(sk), err +} + +// NewKeyFromSeed derives a public/private key pair using the given seed. +func NewKeyFromSeed(seed *[SeedSize]byte) (*PublicKey, *PrivateKey) { + pk, sk := internal.NewKeyFromSeed(seed) + return (*PublicKey)(pk), (*PrivateKey)(sk) +} + +// SignTo signs the given message and writes the signature into signature. +// It will panic if signature is not of length at least SignatureSize. +// +// ctx is the optional context string. Errors if ctx is larger than 255 bytes. +// A nil context string is equivalent to an empty context string. +func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error { + var rnd [32]byte + if randomized { + _, err := cryptoRand.Read(rnd[:]) + if err != nil { + return err + } + } + + if len(ctx) > 255 { + return sign.ErrContextTooLong + } + + internal.SignTo( + (*internal.PrivateKey)(sk), + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + w.Write(msg) + }, + rnd, + sig, + ) + return nil +} + +// Do not use. Implements ML-DSA.Sign_internal used for compatibility tests. +func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { + var ret [SignatureSize]byte + internal.SignTo( + (*internal.PrivateKey)(sk), + func(w io.Writer) { + w.Write(msg) + }, + rnd, + ret[:], + ) + return ret[:] +} + +// Verify checks whether the given signature by pk on msg is valid. +// +// ctx is the optional context string. Fails if ctx is larger than 255 bytes. +// A nil context string is equivalent to an empty context string. +func Verify(pk *PublicKey, msg, ctx, sig []byte) bool { + if len(ctx) > 255 { + return false + } + return internal.Verify( + (*internal.PublicKey)(pk), + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + _, _ = w.Write(msg) + }, + sig, + ) +} + +// Sets pk to the public key encoded in buf. +func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { + (*internal.PublicKey)(pk).Unpack(buf) +} + +// Sets sk to the private key encoded in buf. +func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { + (*internal.PrivateKey)(sk).Unpack(buf) +} + +// Packs the public key into buf. +func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { + (*internal.PublicKey)(pk).Pack(buf) +} + +// Packs the private key into buf. +func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { + (*internal.PrivateKey)(sk).Pack(buf) +} + +// Packs the public key. +func (pk *PublicKey) Bytes() []byte { + var buf [PublicKeySize]byte + pk.Pack(&buf) + return buf[:] +} + +// Packs the private key. +func (sk *PrivateKey) Bytes() []byte { + var buf [PrivateKeySize]byte + sk.Pack(&buf) + return buf[:] +} + +// Packs the public key. +func (pk *PublicKey) MarshalBinary() ([]byte, error) { + return pk.Bytes(), nil +} + +// Packs the private key. +func (sk *PrivateKey) MarshalBinary() ([]byte, error) { + return sk.Bytes(), nil +} + +// Unpacks the public key from data. +func (pk *PublicKey) UnmarshalBinary(data []byte) error { + if len(data) != PublicKeySize { + return errors.New("packed public key must be of mldsa87.PublicKeySize bytes") + } + var buf [PublicKeySize]byte + copy(buf[:], data) + pk.Unpack(&buf) + return nil +} + +// Unpacks the private key from data. +func (sk *PrivateKey) UnmarshalBinary(data []byte) error { + if len(data) != PrivateKeySize { + return errors.New("packed private key must be of mldsa87.PrivateKeySize bytes") + } + var buf [PrivateKeySize]byte + copy(buf[:], data) + sk.Unpack(&buf) + return nil +} + +// Sign signs the given message. +// +// opts.HashFunc() must return zero, which can be achieved by passing +// crypto.Hash(0) for opts. rand is ignored. Will only return an error +// if opts.HashFunc() is non-zero. +// +// This function is used to make PrivateKey implement the crypto.Signer +// interface. The package-level SignTo function might be more convenient +// to use. +func (sk *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ( + sig []byte, err error) { + var ret [SignatureSize]byte + + if opts.HashFunc() != crypto.Hash(0) { + return nil, errors.New("dilithium: cannot sign hashed message") + } + if err = SignTo(sk, msg, nil, false, ret[:]); err != nil { + return nil, err + } + + return ret[:], nil +} + +// Computes the public key corresponding to this private key. +// +// Returns a *PublicKey. The type crypto.PublicKey is used to make +// PrivateKey implement the crypto.Signer interface. +func (sk *PrivateKey) Public() crypto.PublicKey { + return (*PublicKey)((*internal.PrivateKey)(sk).Public()) +} + +// Equal returns whether the two private keys equal. +func (sk *PrivateKey) Equal(other crypto.PrivateKey) bool { + castOther, ok := other.(*PrivateKey) + if !ok { + return false + } + return (*internal.PrivateKey)(sk).Equal((*internal.PrivateKey)(castOther)) +} + +// Equal returns whether the two public keys equal. +func (pk *PublicKey) Equal(other crypto.PublicKey) bool { + castOther, ok := other.(*PublicKey) + if !ok { + return false + } + return (*internal.PublicKey)(pk).Equal((*internal.PublicKey)(castOther)) +} + +// Boilerplate for generic signatures API + +type scheme struct{} + +var sch sign.Scheme = &scheme{} + +// Scheme returns a generic signature interface for ML-DSA-87. +func Scheme() sign.Scheme { return sch } + +func (*scheme) Name() string { return "ML-DSA-87" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SignatureSize() int { return SignatureSize } +func (*scheme) SeedSize() int { return SeedSize } + +// TODO TLSIdentifier() and OID() + +func (*scheme) SupportsContext() bool { + return true +} + +func (*scheme) GenerateKey() (sign.PublicKey, sign.PrivateKey, error) { + return GenerateKey(nil) +} + +func (*scheme) Sign( + sk sign.PrivateKey, + msg []byte, + opts *sign.SignatureOpts, +) []byte { + var ctx []byte + sig := make([]byte, SignatureSize) + + priv, ok := sk.(*PrivateKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + ctx = []byte(opts.Context) + } + err := SignTo(priv, msg, ctx, false, sig) + if err != nil { + panic(err) + } + + return sig +} + +func (*scheme) Verify( + pk sign.PublicKey, + msg, sig []byte, + opts *sign.SignatureOpts, +) bool { + var ctx []byte + pub, ok := pk.(*PublicKey) + if !ok { + panic(sign.ErrTypeMismatch) + } + if opts != nil && opts.Context != "" { + ctx = []byte(opts.Context) + } + return Verify(pub, msg, ctx, sig) +} + +func (*scheme) DeriveKey(seed []byte) (sign.PublicKey, sign.PrivateKey) { + if len(seed) != SeedSize { + panic(sign.ErrSeedSize) + } + var seed2 [SeedSize]byte + copy(seed2[:], seed) + return NewKeyFromSeed(&seed2) +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { + if len(buf) != PublicKeySize { + return nil, sign.ErrPubKeySize + } + + var ( + buf2 [PublicKeySize]byte + ret PublicKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { + if len(buf) != PrivateKeySize { + return nil, sign.ErrPrivKeySize + } + + var ( + buf2 [PrivateKeySize]byte + ret PrivateKey + ) + + copy(buf2[:], buf) + ret.Unpack(&buf2) + return &ret, nil +} + +func (sk *PrivateKey) Scheme() sign.Scheme { + return sch +} + +func (sk *PublicKey) Scheme() sign.Scheme { + return sch +} diff --git a/sign/dilithium/mode5aes/internal/dilithium.go b/sign/mldsa/mldsa87/internal/dilithium.go similarity index 89% rename from sign/dilithium/mode5aes/internal/dilithium.go rename to sign/mldsa/mldsa87/internal/dilithium.go index 79a17d504..8f1c8e5cb 100644 --- a/sign/dilithium/mode5aes/internal/dilithium.go +++ b/sign/mldsa/mldsa87/internal/dilithium.go @@ -8,7 +8,7 @@ import ( "io" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -29,13 +29,13 @@ const ( Alpha = 2 * Gamma2 // Size of a packed private key - PrivateKeySize = 32 + 32 + 32 + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K + PrivateKeySize = 32 + 32 + TRSize + PolyLeqEtaSize*(L+K) + common.PolyT0Size*K // Size of a packed public key PublicKeySize = 32 + common.PolyT1Size*K // Size of a packed signature - SignatureSize = L*PolyLeGamma1Size + Omega + K + 32 + SignatureSize = L*PolyLeGamma1Size + Omega + K + CTildeSize // Size of packed w₁ PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 @@ -49,7 +49,7 @@ type PublicKey struct { // Cached values t1p [common.PolyT1Size * K]byte A *Mat - tr *[32]byte + tr *[TRSize]byte } // PrivateKey is the type of Dilithium private keys. @@ -59,7 +59,7 @@ type PrivateKey struct { s1 VecL s2 VecK t0 VecK - tr [32]byte + tr [TRSize]byte // Cached values A Mat // ExpandA(ρ) @@ -71,14 +71,14 @@ type PrivateKey struct { type unpackedSignature struct { z VecL hint VecK - c [32]byte + c [CTildeSize]byte } // Packs the signature into buf. func (sig *unpackedSignature) Pack(buf []byte) { copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[32:]) - sig.hint.PackHint(buf[32+L*PolyLeGamma1Size:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) } // Sets sig to the signature encoded in the buffer. @@ -89,11 +89,11 @@ func (sig *unpackedSignature) Unpack(buf []byte) bool { return false } copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[32:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) if sig.z.Exceeds(Gamma1 - Beta) { return false } - if !sig.hint.UnpackHint(buf[32+L*PolyLeGamma1Size:]) { + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { return false } return true @@ -115,7 +115,7 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { pk.A.Derive(&pk.rho) // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([32]byte) + pk.tr = new([TRSize]byte) h := sha3.NewShake256() _, _ = h.Write(buf[:]) _, _ = h.Read(pk.tr[:]) @@ -125,8 +125,8 @@ func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { copy(buf[:32], sk.rho[:]) copy(buf[32:64], sk.key[:]) - copy(buf[64:96], sk.tr[:]) - offset := 96 + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize sk.s1.PackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.PackLeqEta(buf[offset:]) @@ -138,8 +138,8 @@ func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { copy(sk.rho[:], buf[:32]) copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:96]) - offset := 96 + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize sk.s1.UnpackLeqEta(buf[offset:]) offset += PolyLeqEtaSize * L sk.s2.UnpackLeqEta(buf[offset:]) @@ -180,6 +180,11 @@ func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { h := sha3.NewShake256() _, _ = h.Write(seed[:]) + + if NIST { + _, _ = h.Write([]byte{byte(K), byte(L)}) + } + _, _ = h.Read(eSeed[:]) copy(pk.rho[:], eSeed[:32]) @@ -244,13 +249,16 @@ func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// For Dilithium this is the top-level verification function. +// In ML-DSA, this is ML-DSA.Verify_internal. +func Verify(pk *PublicKey, msg func(io.Writer), signature []byte) bool { var sig unpackedSignature var mu [64]byte var zh VecL var Az, Az2dct1, w1 VecK var ch common.Poly - var cp [32]byte + var cp [CTildeSize]byte var w1Packed [PolyW1Size * K]byte // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β @@ -262,7 +270,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // Compute Az @@ -279,7 +287,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // which is small enough for NTT(). Az2dct1.MulBy2toD(&pk.t1) Az2dct1.NTT() - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +315,11 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { // SignTo signs the given message and writes the signature into signature. // +// For Dilithium this is the top-level signing function. For ML-DSA +// this is ML-DSA.Sign_internal. +// //nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { +func SignTo(sk *PrivateKey, msg func(io.Writer), rnd [32]byte, signature []byte) { var mu, rhop [64]byte var w1Packed [PolyW1Size * K]byte var y, yh VecL @@ -324,12 +335,15 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // μ = CRH(tr ‖ msg) h := sha3.NewShake256() _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) + msg(&h) _, _ = h.Read(mu[:]) // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + _, _ = h.Write(rnd[:]) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +382,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode2aes/internal/dilithium_test.go b/sign/mldsa/mldsa87/internal/dilithium_test.go similarity index 77% rename from sign/dilithium/mode2aes/internal/dilithium_test.go rename to sign/mldsa/mldsa87/internal/dilithium_test.go index ca347a831..47f53d3a0 100644 --- a/sign/dilithium/mode2aes/internal/dilithium_test.go +++ b/sign/mldsa/mldsa87/internal/dilithium_test.go @@ -4,9 +4,10 @@ package internal import ( "encoding/binary" + "io" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Checks whether p is normalized. Only used in tests. @@ -36,32 +37,38 @@ func BenchmarkVerify(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of verification (as in the reference // implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) b.ResetTimer() for i := 0; i < b.N; i++ { // We should generate a new signature for every verify attempt, // as this influences the time a little bit. This difference, however, // is small and generating a new signature in between creates a lot // pressure on the allocator which makes an accurate measurement hard. - Verify(pk, msg[:], sig[:]) + Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) } } func BenchmarkSign(b *testing.B) { // Note that the expansion of the matrix A is done at Unpacking/Keygen // instead of at the moment of signing (as in the reference implementation.) - var seed [32]byte - var msg [8]byte - var sig [SignatureSize]byte + var ( + seed [32]byte + msg [8]byte + sig [SignatureSize]byte + rnd [32]byte + ) _, sk := NewKeyFromSeed(&seed) b.ResetTimer() for i := 0; i < b.N; i++ { binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) } } @@ -85,13 +92,16 @@ func BenchmarkPublicFromPrivate(b *testing.B) { } func TestSignThenVerifyAndPkSkPacking(t *testing.T) { - var seed [common.SeedSize]byte - var sig [SignatureSize]byte - var msg [8]byte - var pkb [PublicKeySize]byte - var skb [PrivateKeySize]byte - var pk2 PublicKey - var sk2 PrivateKey + var ( + seed [common.SeedSize]byte + sig [SignatureSize]byte + msg [8]byte + pkb [PublicKeySize]byte + skb [PrivateKeySize]byte + pk2 PublicKey + sk2 PrivateKey + rnd [32]byte + ) for i := uint64(0); i < 100; i++ { binary.LittleEndian.PutUint64(seed[:], i) pk, sk := NewKeyFromSeed(&seed) @@ -100,8 +110,8 @@ func TestSignThenVerifyAndPkSkPacking(t *testing.T) { } for j := uint64(0); j < 10; j++ { binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { + SignTo(sk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, rnd, sig[:]) + if !Verify(pk, func(w io.Writer) { _, _ = w.Write(msg[:]) }, sig[:]) { t.Fatal() } } diff --git a/sign/dilithium/mode3aes/internal/mat.go b/sign/mldsa/mldsa87/internal/mat.go similarity index 95% rename from sign/dilithium/mode3aes/internal/mat.go rename to sign/mldsa/mldsa87/internal/mat.go index cb473c149..ceaf634fa 100644 --- a/sign/dilithium/mode3aes/internal/mat.go +++ b/sign/mldsa/mldsa87/internal/mat.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A k by l matrix of polynomials. diff --git a/sign/dilithium/mode2aes/internal/pack.go b/sign/mldsa/mldsa87/internal/pack.go similarity index 99% rename from sign/dilithium/mode2aes/internal/pack.go rename to sign/mldsa/mldsa87/internal/pack.go index 0285dfd8e..1854b4197 100644 --- a/sign/dilithium/mode2aes/internal/pack.go +++ b/sign/mldsa/mldsa87/internal/pack.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Writes p with norm less than or equal η into buf, which must be of diff --git a/sign/dilithium/mode2aes/internal/pack_test.go b/sign/mldsa/mldsa87/internal/pack_test.go similarity index 96% rename from sign/dilithium/mode2aes/internal/pack_test.go rename to sign/mldsa/mldsa87/internal/pack_test.go index 24f568e4d..f952c6a09 100644 --- a/sign/dilithium/mode2aes/internal/pack_test.go +++ b/sign/mldsa/mldsa87/internal/pack_test.go @@ -5,7 +5,7 @@ package internal import ( "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) func TestPolyPackLeqEta(t *testing.T) { diff --git a/sign/dilithium/mode5aes/internal/params.go b/sign/mldsa/mldsa87/internal/params.go similarity index 72% rename from sign/dilithium/mode5aes/internal/params.go rename to sign/mldsa/mldsa87/internal/params.go index 419cb2a2b..b5dc669ca 100644 --- a/sign/dilithium/mode5aes/internal/params.go +++ b/sign/mldsa/mldsa87/internal/params.go @@ -3,8 +3,7 @@ package internal const ( - Name = "Dilithium5-AES" - UseAES = true + Name = "ML-DSA-87" K = 8 L = 7 Eta = 2 @@ -13,4 +12,7 @@ const ( Tau = 60 Gamma1Bits = 19 Gamma2 = 261888 + NIST = true + TRSize = 64 + CTildeSize = 64 ) diff --git a/sign/dilithium/mode3aes/internal/rounding.go b/sign/mldsa/mldsa87/internal/rounding.go similarity index 98% rename from sign/dilithium/mode3aes/internal/rounding.go rename to sign/mldsa/mldsa87/internal/rounding.go index 71360cb29..58123c090 100644 --- a/sign/dilithium/mode3aes/internal/rounding.go +++ b/sign/mldsa/mldsa87/internal/rounding.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, diff --git a/sign/dilithium/mode2aes/internal/rounding_test.go b/sign/mldsa/mldsa87/internal/rounding_test.go similarity index 96% rename from sign/dilithium/mode2aes/internal/rounding_test.go rename to sign/mldsa/mldsa87/internal/rounding_test.go index 5824f2656..ad653ca3f 100644 --- a/sign/dilithium/mode2aes/internal/rounding_test.go +++ b/sign/mldsa/mldsa87/internal/rounding_test.go @@ -6,7 +6,7 @@ import ( "flag" "testing" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") diff --git a/sign/dilithium/mode2aes/internal/sample.go b/sign/mldsa/mldsa87/internal/sample.go similarity index 81% rename from sign/dilithium/mode2aes/internal/sample.go rename to sign/mldsa/mldsa87/internal/sample.go index c47185ada..b37370a4e 100644 --- a/sign/dilithium/mode2aes/internal/sample.go +++ b/sign/mldsa/mldsa87/internal/sample.go @@ -6,13 +6,13 @@ import ( "encoding/binary" "github.com/cloudflare/circl/internal/sha3" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" "github.com/cloudflare/circl/simd/keccakf1600" ) // DeriveX4Available indicates whether the system supports the quick fourway // sampling variants like PolyDeriveUniformX4. -var DeriveX4Available = keccakf1600.IsEnabledX4() && !UseAES +var DeriveX4Available = keccakf1600.IsEnabledX4() // For each i, sample ps[i] uniformly from the given seed and nonces[i]. // ps[i] may be nil and is ignored in that case. @@ -91,13 +91,9 @@ func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { // p will be normalized. func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { var i, length int - var buf [12 * 16]byte // fits 168B SHAKE-128 rate and 12 16B AES blocks + var buf [12 * 16]byte // fits 168B SHAKE-128 rate - if UseAES { - length = 12 * 16 - } else { - length = 168 - } + length = 168 sample := func() { // Note that 3 divides into 168 and 12*16, so we use up buf completely. @@ -113,25 +109,16 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream128(seed, nonce) + var iv [32 + 2]byte // 32 byte seed + uint16 nonce + h := sha3.NewShake128() + copy(iv[:32], seed[:]) + iv[32] = uint8(nonce) + iv[33] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [32 + 2]byte // 32 byte seed + uint16 nonce - h := sha3.NewShake128() - copy(iv[:32], seed[:]) - iv[32] = uint8(nonce) - iv[33] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:168]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:168]) + sample() } } @@ -142,13 +129,9 @@ func PolyDeriveUniform(p *common.Poly, seed *[32]byte, nonce uint16) { func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { // Assumes 2 < η < 8. var i, length int - var buf [9 * 16]byte // fits 136B SHAKE-256 rate and 9 16B AES blocks + var buf [9 * 16]byte // fits 136B SHAKE-256 rate - if UseAES { - length = 9 * 16 - } else { - length = 136 - } + length = 136 sample := func() { // We use rejection sampling @@ -181,28 +164,19 @@ func PolyDeriveUniformLeqEta(p *common.Poly, seed *[64]byte, nonce uint16) { } } - if UseAES { - h := common.NewAesStream256(seed, nonce) - - for i < common.N { - h.SqueezeInto(buf[:length]) - sample() - } - } else { - var iv [64 + 2]byte // 64 byte seed + uint16 nonce + var iv [64 + 2]byte // 64 byte seed + uint16 nonce - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() } } @@ -223,18 +197,13 @@ func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { var buf [PolyLeGamma1Size]byte - if UseAES { - h := common.NewAesStream256(seed, nonce) - h.SqueezeInto(buf[:]) - } else { - var iv [66]byte - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - _, _ = h.Write(iv[:]) - _, _ = h.Read(buf[:]) - } + var iv [66]byte + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + _, _ = h.Write(iv[:]) + _, _ = h.Read(buf[:]) PolyUnpackLeGamma1(p, buf[:]) } @@ -246,12 +215,12 @@ func PolyDeriveUniformLeGamma1(p *common.Poly, seed *[64]byte, nonce uint16) { // Can only be called when DeriveX4Available is true. // // This function is currently not used (yet). -func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { +func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { var perm keccakf1600.StateX4 state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 4; i++ { + for i := 0; i < CTildeSize/8; i++ { v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) for j := 0; j < 4; j++ { state[i*4+j] = v @@ -260,7 +229,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[4*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +296,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed *[32]byte) { // Samples p uniformly with τ non-zero coefficients in {q-1,1}. // // The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed *[32]byte) { +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { var buf [136]byte // SHAKE-256 rate is 136 h := sha3.NewShake256() diff --git a/sign/mldsa/mldsa87/internal/sample_test.go b/sign/mldsa/mldsa87/internal/sample_test.go new file mode 100644 index 000000000..32931c94f --- /dev/null +++ b/sign/mldsa/mldsa87/internal/sample_test.go @@ -0,0 +1,218 @@ +// Code generated from mode3/internal/sample_test.go by gen.go + +package internal + +import ( + "encoding/binary" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +func TestVectorDeriveUniform(t *testing.T) { + var p, p2 common.Poly + var seed [32]byte + p2 = common.Poly{ + 2901364, 562527, 5258502, 3885002, 4190126, 4460268, 6884052, + 3514511, 5383040, 213206, 2155865, 5179607, 3551954, 2312357, + 6066350, 8126097, 1179080, 4787182, 6552182, 6713644, + 1561067, 7626063, 7859743, 5052321, 7032876, 7815031, 157938, + 1865184, 490802, 5717642, 3451902, 7000218, 3743250, 1677431, + 1875427, 5596150, 671623, 3819041, 6247594, 1014875, 4933545, + 7122446, 6682963, 3388398, 3335295, 943002, 1145083, 3113071, + 105967, 1916675, 7474561, 1107006, 700548, 2147909, 1603855, + 5049181, 437882, 6118899, 5656914, 6731065, 3066622, 865453, + 5427634, 981549, 4650873, 861291, 4003872, 5104220, 6171453, + 3723302, 7426315, 6137283, 4874820, 6052561, 53441, 5032874, + 5614778, 2248550, 1756499, 8280764, 8263880, 7600081, + 5118374, 795344, 7543392, 6869925, 1841187, 4181568, 584562, + 7483939, 4938664, 6863397, 5126354, 5218129, 6236086, + 4149293, 379169, 4368487, 7490569, 3409215, 1580463, 3081737, + 1278732, 7109719, 7371700, 2097931, 399836, 1700274, 7188595, + 6830029, 1548850, 6593138, 6849097, 1518037, 2859442, + 7772265, 7325153, 3281191, 7856131, 4995056, 4684325, + 1351194, 8223904, 6817307, 2484146, 131782, 397032, 7436778, + 7973479, 3171829, 5624626, 3540123, 7150120, 8313283, + 3604714, 1043574, 117692, 7797783, 7909392, 903315, 7335342, + 7501562, 5826142, 2709813, 8245473, 2369045, 2782257, + 5762833, 6474114, 6862031, 424522, 594248, 2626630, 7659983, + 5642869, 4075194, 1592129, 245547, 5271031, 3205046, 982375, + 267873, 1286496, 7230481, 3208972, 7485411, 676111, 4944500, + 2959742, 5934456, 1414847, 6067948, 1709895, 4648315, 126008, + 8258986, 2183134, 2302072, 4674924, 4306056, 7465311, + 6500270, 4247428, 4016815, 4973426, 294287, 2456847, 3289700, + 2732169, 1159447, 5569724, 140001, 3237977, 8007761, 5874533, + 255652, 3119586, 2102434, 6248250, 8152822, 8006066, 7708625, + 6997719, 6260212, 6186962, 6636650, 7836834, 7998017, + 2061516, 1197591, 1706544, 733027, 2392907, 2700000, 8254598, + 4488002, 160495, 2985325, 2036837, 2703633, 6406550, 3579947, + 6195178, 5552390, 6804584, 6305468, 5731980, 6095195, + 3323409, 1322661, 6690942, 3374630, 5615167, 479044, 3136054, + 4380418, 2833144, 7829577, 1770522, 6056687, 240415, 14780, + 3740517, 5224226, 3547288, 2083124, 4699398, 3654239, + 5624978, 585593, 3655369, 2281739, 3338565, 1908093, 7784706, + 4352830, + } + for i := 0; i < 32; i++ { + seed[i] = byte(i) + } + PolyDeriveUniform(&p, &seed, 30000) + if p != p2 { + t.Fatalf("%v != %v", p, p2) + } +} + +func TestDeriveUniform(t *testing.T) { + var p common.Poly + var seed [32]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniform(&p, &seed, uint16(i)) + if !PolyNormalized(&p) { + t.Fatal() + } + } +} + +func TestDeriveUniformLeqEta(t *testing.T) { + var p common.Poly + var seed [64]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformLeqEta(&p, &seed, uint16(i)) + for j := 0; j < common.N; j++ { + if p[j] < common.Q-Eta || p[j] > common.Q+Eta { + t.Fatal() + } + } + } +} + +func TestDeriveUniformLeGamma1(t *testing.T) { + var p common.Poly + var seed [64]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) + for j := 0; j < common.N; j++ { + if (p[j] > Gamma1 && p[j] <= common.Q-Gamma1) || p[j] >= common.Q { + t.Fatal() + } + } + } +} + +func TestDeriveUniformBall(t *testing.T) { + var p common.Poly + var seed [CTildeSize]byte + for i := 0; i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + PolyDeriveUniformBall(&p, seed[:]) + nonzero := 0 + for j := 0; j < common.N; j++ { + if p[j] != 0 { + if p[j] != 1 && p[j] != common.Q-1 { + t.Fatal() + } + nonzero++ + } + } + if nonzero != Tau { + t.Fatal() + } + } +} + +func TestDeriveUniformX4(t *testing.T) { + if !DeriveX4Available { + t.SkipNow() + } + var ps [4]common.Poly + var p common.Poly + var seed [32]byte + nonces := [4]uint16{12345, 54321, 13532, 37377} + + for i := 0; i < len(seed); i++ { + seed[i] = byte(i) + } + + PolyDeriveUniformX4([4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, &seed, + nonces) + for i := 0; i < 4; i++ { + PolyDeriveUniform(&p, &seed, nonces[i]) + if ps[i] != p { + t.Fatal() + } + } +} + +func TestDeriveUniformBallX4(t *testing.T) { + if !DeriveX4Available { + t.SkipNow() + } + var ps [4]common.Poly + var p common.Poly + var seed [CTildeSize]byte + PolyDeriveUniformBallX4( + [4]*common.Poly{&ps[0], &ps[1], &ps[2], &ps[3]}, + seed[:], + ) + for j := 0; j < 4; j++ { + PolyDeriveUniformBall(&p, seed[:]) + if ps[j] != p { + t.Fatalf("%d\n%v\n%v", j, ps[j], p) + } + } +} + +func BenchmarkPolyDeriveUniformBall(b *testing.B) { + var seed [32]byte + var p common.Poly + var w1 VecK + for i := 0; i < b.N; i++ { + w1[0][0] = uint32(i) + PolyDeriveUniformBall(&p, seed[:]) + } +} + +func BenchmarkPolyDeriveUniformBallX4(b *testing.B) { + var seed [32]byte + var p common.Poly + var w1 VecK + for i := 0; i < b.N; i++ { + w1[0][0] = uint32(i) + PolyDeriveUniformBallX4( + [4]*common.Poly{&p, &p, &p, &p}, + seed[:], + ) + } +} + +func BenchmarkPolyDeriveUniform(b *testing.B) { + var seed [32]byte + var p common.Poly + for i := 0; i < b.N; i++ { + PolyDeriveUniform(&p, &seed, uint16(i)) + } +} + +func BenchmarkPolyDeriveUniformX4(b *testing.B) { + if !DeriveX4Available { + b.SkipNow() + } + var seed [32]byte + var p [4]common.Poly + for i := 0; i < b.N; i++ { + nonce := uint16(4 * i) + PolyDeriveUniformX4([4]*common.Poly{&p[0], &p[1], &p[2], &p[3]}, + &seed, [4]uint16{nonce, nonce + 1, nonce + 2, nonce + 3}) + } +} + +func BenchmarkPolyDeriveUniformLeGamma1(b *testing.B) { + var seed [64]byte + var p common.Poly + for i := 0; i < b.N; i++ { + PolyDeriveUniformLeGamma1(&p, &seed, uint16(i)) + } +} diff --git a/sign/dilithium/mode3aes/internal/vec.go b/sign/mldsa/mldsa87/internal/vec.go similarity index 99% rename from sign/dilithium/mode3aes/internal/vec.go rename to sign/mldsa/mldsa87/internal/vec.go index f52973e45..d07d3b245 100644 --- a/sign/dilithium/mode3aes/internal/vec.go +++ b/sign/mldsa/mldsa87/internal/vec.go @@ -3,7 +3,7 @@ package internal import ( - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // A vector of L polynomials. diff --git a/sign/mldsa/testdata/ML-DSA-keyGen-FIPS204/expectedResults.json.gz b/sign/mldsa/testdata/ML-DSA-keyGen-FIPS204/expectedResults.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..2c9bfdad5b785b810e4088721c7d950cc390527b GIT binary patch literal 488247 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%0DH*Um{OU@FI~TH4fXv$Oi!DZ{v~)bkDV;1+DW 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≈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%0Do&~A=Wb0 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

Gh9|bfQs?#KV~LPWFQX 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%0DI>Iq>|@ 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 S|Muq}|M@Q;<{HkRR1E-GY#ML? literal 0 HcmV?d00001 diff --git a/sign/mldsa/testdata/ML-DSA-keyGen-FIPS204/prompt.json.gz b/sign/mldsa/testdata/ML-DSA-keyGen-FIPS204/prompt.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c01d37d97acdfcb3562892d7a7e7cbd108846c53 GIT binary patch literal 3503 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 literal 0 HcmV?d00001 diff --git a/sign/mldsa/testdata/ML-DSA-sigGen-FIPS204/expectedResults.json.gz b/sign/mldsa/testdata/ML-DSA-sigGen-FIPS204/expectedResults.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..97efe1dfd176c4a8a0102cafcff5caba6635839a GIT binary patch literal 236767 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 PUeqcdF`pSn3jVLpSv<8v{iWnf%%hbWlGUyQ z+xvbhwxs$qn3eFw)Skm1$upb+_~$$QU2}G+{k_EJMw5-F88Z98pp7oM2211sVr1s6 z>?j@<1-I0Z$+rYCcYDEhfoPi&+H4j8Xeb1n6m68$kCd?QuGXPcPP#}B#k%u+{Z=N4 zAXb7PL?lb<>75Hpoi#+R&qE0iTmMKxYBu8Y{hGeyrYs_~2wOHe?WVRNI3^ros`8;2 z7Z&uK!=rEKzbD)73pT_1%zZ|it>fmLc#--oEeUo~IfKjjbSNEzSwAUq8jYfK-($KX zr~bfHPaPE$YPSRpo8fC}){Uy>I_GEh5pXFvgWWxPEy1r!| zP=H4+!xJcEU1ZM{ZGSKxdKSI>M53+!`FLpm>+#TM-ACp=4Osr6pT5pVx7 z!BPbDZ*|M>-h%ER?Lw!WbLSwGRL_CZ{GjfCCfE0bLIhF+wjFcs zp0AD0VuWKAP8P`-T#zoO02Y=9RT_%rJ*i(ok<>w%NpE-`3~3MJzLZ`&MTp=CYuPLm zNX%MvOK`Y!?LX7xW9nwGqr@eE0+KBW@$^L3l;6az3pclf>LdAJOC(Jt&VlJALxIH!2(lqG|1sN4T~((l(m1xDB>m>p_3m^IN&-Zxrx%&wf;JN!uY8?% z%97?r-4Ec)Od-+EY(m|V+Ij-c6C=qttkdup+w(P|V6iAtG6p67oubjc^}+sV!^3+9 z5r}->K&G4x$FHOaUkD4W z*HmlD6T=}zU887uAdy})>um#Nb|L@8gN-(GMs+jHPBZ*%dQufow#4i~%o z#HE8nQ%t^A$gN;qWZY?t=TWV~esK5To_(-DIylDm)wp@uZ1z-LWo6;OcuMv+qRII^ z>#b|!fE<+LJ5dya^Uh>!AwQAoEw?nk%w8LV#0OI^$7VJs0)%t$iob<{erv*8A|=?) z)|+VH;3~=?hZ&t!Eh|)C@bShq48(hw?&@cyOy+UMBY;R8#f06AB?p}w-SJGmu;nk2 z;?e`4sLQO$x`m1+sXkXn`8|rEQeY51_8^G5>KmFNghB9Eoa!_t^biCS4q`QGJ72^1i5 zV=w1e7mSx2vWFkMg^e<4z=88T@)$rsA@>rilMspOqg&L5A zAg;uXq&a-6VW!+fSIeIHCOm>JEsJ0%#B{`vgPXG!3S^PzaiHkFM3isD{rv7c!;LlF zTQ1-}f9x34JCgT^-RKr$~5L+}RaRvNn%`N;Kc-ynudM zJbi*>Qi>I$qv;Cu1@IFZ>(3g<^v^3%g9C7!Cp`1 z8l%sjL`wCy^KONNaP2acUhF+4l?L|`|9)m!n6x$9GG9XR+%0GB6Hp0g!NmKt3whX< z?^}87->XCLOW5qLANACIVxs(MAzaDUH^Kje{iZ*jxX?}|F%s?4G=?XGQ1hO>mZ|(iU3vP$yos^;o@tsHo$9B5T^}H#^seA%*CVf3w zEvUnm|9j4=d7T1iNL&bAd1n;IzrGf7K65>3NwKD1QBo0BDi~*?`QlSq<$V=&G+qIn zP19?i(#0CO`8yn}bJ0_eY}jpiu{`QF^0>O&yrq}G`IMCbNT^2`qI9ZmO1R0``U=#GSu@0~-P&n|hMRTA1YXI}(_Q^tIzR?O#uKKVgdMgNF+t1&5C z-T`+dza}wu1p+S2+Lb9Sakh`MfOc#W6aL!A!t>U2Z1#JTnS)9-e%C1o@hUm;^gcSJ zci}7cu=C~?m>^oo4qZC6jUrvH6^2kr2z|9x*g+BpIc{{x%s1(R4R0e+ZhAve1t*!Ff5q8y2xZ!Ki5r7d;BrlAoM-wyA8ZC^HJfDq zdEBW1B%9pk-O9sRQG#<4HbkFPLOyqjW}e7P3Xa6urtMzQdbawgM=H_h#NK3}xlc#& z+BoVnUZTi;dN^w-frOwOFBR|&s2XbcQY4cMq`$ir428l!f^H8l%ZJ=D*r=)Ori4a3$Xe%;m-E4l80{YRqeN9XOz_ujZd1agr^ zpN1rdOY&VC8Wj{!_7ow+?AMQR!IA*O?Re#qVV-vIv$mPYKaZ=$#vw9sWVy8{Efwd= zoQJ*5_Tk&t^{{)9VH!{6`XA5$=p&IXDnJ4=L#55I zDyG zBm~<;OlWS?J?A*4KR21~xmn0ek=Zl(fqXP|id~t08b%tmvvmv3SP$L~ddlCNTX0^t z&P6Ot%upMjOU{^HZz(^Ij!8#i(7o+uzn>J4XR$SC#_W0{9~!_}ld7hC(hu0>S_dba zHdU$>`2>NB6(2RlU!Z+s*d$`wL1=@k`!LG?xGP^qUR==jTbLWdMCN#`6;QxJ=h!!&do!yuaSSp$(Drg-R+WA80t5e(M2Z7fc3b8JqaY8= zqFi1Sqo{=M?XuM8nzS!roX69auUdz)z1(+x#7b$!))kGyN?iJyj@Vp-##s0;=0GQ~ z=f5Q7GG-^{Wb(beSSpDf=ZQzsf-7!*wbMeRn8z1`;r0?SgGNvQ^U3(~=zfalM0 z&+=QH2D{fI?+(M0oZfHpvUa-Xr48OymOIX!&IuX1!@I3YS?n+HY_n zxz#Pluu+n*wZ^ZC9QHD}1}R8rNm=%|EBtG7Ch&+y@tzY2?|KA4me!zLJpT--$HzArN&ON4M`OdvREm!^QT1x)gWr*&F4a)Z%ci>c(4@&Sb}mlu2ne09m5ox4 z0J)0Ib_-_pkv~2HB-rY3?QG}NcRTWJr)OPYG~^zbd$f|P+@=y+&fTf!NJtcAZ%|x# z0^;-+D19Zf4TdTQrjHHCsoLq{t_aHrMM_&a}IdE`n z*9!k0c7%;Cdte~tQHx*ppwJ4FC&|pPrh$&A8@Dm7Of?z|Z0f-q@+LTww>rNqBj7s# z^_fl0lvCw38JKZqXae&LgCO^=ukDIcKZRLl9Ab_Pz_OMTwN#B#Pu5w~`x{fMwaVnWH6NPviJ& zlG-`}WGmd4sG5nq(|XNnK6~Q2nxL>Bd$dE@XTE5oMrteW z8ws(L66eHlO?NDD;@lOx%B|%09N*cG9~^aM_CSTX4q&q)nPjo=m5@zmJICPG9ZZ(J zXS+y`_GRk1z-PRE18xT2h9|cX|KJO@N*duR$nSAFEbR(Rid@%kp7Zip$X_E{m{1M~ zQ4H!r>%4w+>8Op@z~Zb`mq{azRXl{a1r2+$D$`SK1smpFI~Y zC2OCeH-xf-7Ko{Ka627^PC2(3;G!8VlX{c- z_j!!4^LRfb|MFe5C=zN9oequ_)4O>RoqC}iofFwfB4H{n&AcMpA>0sSC7by=fmbHn6<}7Om78Ck_-77DoU5V7x z{Hk@WWl$Tr-YJ{7-*&kI_LD3$c`ob(6tuRII>?{M37skveA);=2EY>~F{@6{Kdsp^ zt4Y01&6BqBYb)(2frB@>jGUTpN*6s$r;_CQMU|Ao9F_dir>CNaldm|?4+4|wi?^&q zTBr~d)^W+tNc2;_I8T(p55mMoexxjCay#h{z8_erxpc{@P&d0=T%|&AMhu%kRCG|$0V5;>1 z#beRL%gHLlyv8&6aU)kGM>aq*UkDi^Pw71-4PF|FvQwm@6RWRgJFgCE1;4kfW{%^J*Cb|StMWPP6{c|!Eo66&_m@)dI+I`30%oXK7{xSQ8wFEX!uPmm7c$d6bl#;4A) z_RQe$vkQ4lxFhLVN~h$Mx`K+ELYcnf7BEOljOr?c9I7OwHBg;nH>=WaE%dT_veI0{zs(6c&NioZ&kC5SNWbZ7YMsIwqrCb=KQBdN%{ zPqCVv!~2#BC^we~MxX%dAm8#8KmHIo*{`saWUzekR>^zw=AY#291xmMJLLl!ShrGm zWhjdAvE#!mdD8indF*xtn(2JtAsT=d)4LlE^k*np&(y{NMvTQ=egk-#0-O^bqpFp? ziJwpCmbX?i_eVMgQ^j`Y#}}eAoX;oWJM| z*pQyw_{r0CvLT!zdTtpRQm+K~uvxE`oB7bK$_*YQk8jOI)Bb)FVoF#&ZU2&wR8{9Z zK!qu-{b~GJ!?nxa1`#(+*IYJ&`-lZbJ%M(DM2_EjeF9#{pz>O{Tkw1y3p2lxao}?hPmLEmzUTQRG^icb9m!ru1O7-AizcD zoBY{%5Q_F(-gFLb&JB^(yfH$FkJU^2!KE^m)c(qW)fU(Z`u5XC5e1b5$3fAIWn%k= zjl2B}x>)BJ@Ll>iMTz_jOJoiGFUKE&x>hR9L?e2(<8SZ&N(%KBN4Y> z0b%Q9MQYGQ+~1&f68JC1eC`-o7Wx@Cndv0Gw?01QRF%&|*;MINat{of^Ih`phzJEE z2p+66Q`m6DqMn!tlb?5+8D05!pRq>El_%Kw92N<9&u_5nhl3Q7zaeg;if6>5N#` zWp+T^KNl!PSYod3MoRKrr6~&wB2ove_CCykS7iR&9hA_8Ch+V+=l%rRbVTo;w9QQi zmxQEQ_rSGU6Z~uNRi616QF>5^YM%!9gtmr6Y0OxdUYU zEN0|^>(?;RSa(L$3x+R2@a3W;hYawc6WXBoZda`S^hGZUSFixCcM`I)ZY-0M=`JF4 z5!+*wozs_Ol>o_dkq*$s&X8t8Vvkje{OZky!LZ7*=QF&D^=-^j^YSciu2Ml1L2jqs zDgF`nTsEigk_wKtbihUa`;%H^oV25;V1GG2d_c_Nbsf(&VKfDNqItmK;4@jYiK)<` z;KNf=(X@}tXY212+DY7FhH0<%d#2T=REp|OdqX!*cf(3n@3I(s9 zb7{&1f~>3hyHfvsR$keNcb`7NU5lJfenoVC%PMD3wCvfV^zD<#U^$cd|CU`mj_ znM%@2O_i1!n8hUnp=|+|>@!kA$A(S{E7j)sK?(0Tr~|4kZ%2sd+uN!`YNFeC*6^TV z8bB7SBM%&Olv2wwl<8;cIx=1yho6(W=S_f~M3^~u03x#IjURF+Pp*oWPGP^G5254L z%BhB8Gfp~_>j!}^UwqwJs=mbd@)~nA5;`uCnl%IxMQZnr6IuaC@&nC^lK%KyY-Up_ zrglys_l~&6+3qF}mXhbe7it_WE!lpPfKSB5SiDlN=hK@yo>w8BLeDWh^f|OYQdSsM zE=Cp{t(jQjz$NkKFw~SuG?F!5Yk921p(_M@-Y7U-?HSobqkq)9>! z@on&Xr2z4kIcFUXDiPs`9Zgse_)ABNwU+1jLSmGH}_Fj{_l7fa@Y}_i2cJnO`TuUea#>;c1gHnK!uY zMDa6!q31ylW5Y(+7*y<1P+9WL_3~`mCiM2i`UJ~hyu6qIt3eaW3VfL!7zY!jl4#4S zF@HNb>!NR9x1lHWS^o^WK%xDZ+$Zgjtm);mRPcO3jTWxR7V&_&37#bw*ZsFs`0z}6 z2p&%I(lXzBa1;}7vNUUQLw*fG_&ne>@6L|Sm#Yxm9(?`n7%0gIk5z?~dQ2ehd;0Zk znuIy5`470OmVtvXazrUDKV;AMvp3_faz)SCxAz`azB*sNL{iKtXy4GY z&_}c3`|SwX!xl!F{)M{Qz)Y}Ay)^6+$`bhKG25xgw`Z~uRFBSbAX;zvCwLQ-o~CtW zazGM9V5Qxp4;_C!9@==m)nWtcnvB@CqnefkPL7i+31aM}VK+6P zA{jW3xv=93l0Jfmh>kpn8NuIt<>9ZqvXc%ARYt@ZYXS@!&6p9b#1U&194_M${jY^KP4HPDz?X!aN;zjQe{135n}jz@#3CBs zvdbdVCj@S^e-ORjT%s}F^DNwr$e(@=ZO-QOFFI~YzKNRU*c<g#_YD z-#HjOQ*vBV!`F-0%vjly?yNt9dv_jp8@`J~o$nIS~*E~d$v<95R$TQbr<8kDtZ(#Ttltw$ntPWQ$s)hcH@ z`!P*rZP6#mu2W*1Q1qk@1jmy#do1|}7HKp0BM<31JG%~+lZn%T*u@Moz-S6(;ZvT7 zo+PR)z$eua&Rgt`w(?NvY`htt8jO@EZ=-s(^l>uTN%c}DXQhEV%F%b4O61LU{f?iN z#$}BbF3l^+DQxCsQ)`5D;U(vN^Dvjkgafniv=y57JAbnd8O4VDMpoknabs#9DY5oS zRq-_)*izcjbQu?ZXPx4aPu}rMp=Ig|mS9yQlOXKmZXyXJ7+xt{uqT1?BAh*IA(71S zYemaR%&iGPG?mE}1!N{R=_MGd;6 z?UAh7$ve!`d=q@x_$;RMJ?t$cQL$isXpOK)r$?4w1@ZM30GNwgl3{nC*fm8r$+t_Y zoI92bZtHMr4Npgkf+v}mOw&85f&rAlzWC;e{?%sLMPm3g&8sh*$B-{);JesD+g~Je z#6c<{N##BIgX72|$7lX3vx^kU6=~_y3CvTwb0w2q?_9)_xNg83FVtf9g>-nIU6J4Q%P1b}5ERiCK1%3##mwYM2G~W2=>O*|U>Ee2*Vv zm_27Ift|E*Uc7>YbrF?oEDZ9L#!@@OmD|Lt=8*>f?clvB;%>aNoeV1oOjf#>`hvkP zKT3HL4PUDO=v=TpAG_G(UmL5X?S5IY+HvQn5t%x@_A@Messal@1g0@e6URssZ?eNlag9y{iJ&G5pFX$*) zBQN&Id9iDdgz;FcJMr#=lX22+MMAEPDd5x|h_NA=t4??1ruf5CHxIDylUe*t9|2^OWV2v9^yh_i+4O<>F2Z*wlT>H4 zpeR3iuE;Pcw>OI-*ma#7YvT;XQhXU|d=eLJeUcPca_T8+^5YW}&@T^d9u|2iGP>67 z9!N)bEKm9pY6BrUz5J0%jjj-Brz9Oy#zf0p;FPB{7ZP!%+fcnU<)=16UQXpdmu#Ly zMj6tqDyNjhxegq4ijQp>6`7I1t+FnJ`lf59?X5)k{6Gqm!Wvq}Ba~g7!MOOn!DNN~ z>Z6H*x$@H1Ye04gTP9CjsI0$ZE*M$Y(Zmf~;jO&eYMH8Uj*Te{P=Y(%O8`+HH4s#E`MV3oY#RS6d~2&_T67R zES&=Otv(QA7XI=Ya>7O+V$H)MeZ!_T_aJvvc&w0_D%`a|wH>s1B z1gy5cC~*N_mvX%21#;H90V_%GvX1c{7EBddbi;37s^*vumKG@&DtXSzJ8nNyU9`Y> zIl2)qNg}yvYusF_lCBem^V7Xzd@Fupu-o0Yjbhcxsl$idQo>n@_zc3$ODlb^UhKeDY_yjnjK>igRf%0U1x(D3&dX=W1TFTZCx24zgVe!^EY9xUm^~ zqWY&-$owI%ih?JF$IB)+R-(1AB2jGDQJ4;#Ci?Zt6}Nm|S}rpE(5EGBRgi=TY0CH8 zK(in7vk{Kwo0pm#l$*HgZKXcpIndOk(H6LSe>8^Dnw zO4uYedj`Me0H%8Dt4+U-!(zGPE%rZ6DM2{Ip2EhSW48suU{_KjUS z4znz?%T$3UGWhrGNs9KS?9L_=kfatYDaG%BFDw@|y7a*F**BtfLd2>}_}KP++EpcB z*RJMN6HbwD!jhB6s;?`~drpl#h!i#KnXIX;*PP1IP|JNzP`#7Sc8Z#GSyL38LC!0I zm4R8Cz#JeDAb;jFQ#{zdNozd0us9=H?|Yjf+%3VqGMo#fP4?IhcD%WFm(D>_>!tOL zg|;wYND8=KAqVkP27}j8Mwok`=Q>PgC)JXvrHl8Kc)z(~Pnua68`z{f#P!j2V*%Ud z&TcN|qS#FiXaSZsr>gACoT2TLKw$th?1|*sGAZz}IVRo-2q`APNd8(<#MOy;FL~4B zVz}b_S3|qtkcS6l30jVd~Qj>u0KVYW#|&$dH4%s0&as?6aj+|l{{KKK{w>Waz@0Ki#fo-9r56y z$iphUwbEZH*)+N6Q50qRi|=F(!~9XEZql3*_>{e zXP#P)bguYf!G9qYaGQN3)_l{d(}Hozz?X7sGITD+->7ptXXPNhr0V>e6!{P19V+^r zDuIdGg)nRZFaIv^l*PH>4RiE`P)AQ}#Kio~kI8EkDLUm!VZB-1v!{}7IyHNzi`L{q zJT1q~7zZN|2hTY|$3EHLreI_yni6wIlQQ$;k}y>R`NtiJj7O)4BVHQT1fMK}5cF=T z3nel|v_m@1T+cyVPA4VT+*V>L#A{)DB7U4SMYl@84O1$Kw*M4i3$w`7KT5OwXvO)) zg(ueqBb+?CIE-ZIJEamjJk-=d$-!Ulv{n5xl~l6zY5nI6PVJn)4G(wpy@SP}53}K5 zewxVo?e(zB&Uu$RQh}(ON34qBuEw&X*jxPUAGI8XT=A5-i8T}<`!wDf#1E^QV*Tx` z8_wT(vMDQ;oI{Q|SCF%3SH&&cz)P4v7nqMVl?itXVPb*cL z2U*9ea{_y}u2T(T1HyykNuV{xN~7vz^DD0~zv*2GtyX^7cJ5n4p?HjNDqG<9pvd>> znFk}Q(RENY{+8Qr`N#QSvj>!Nq!H&x<`3$`&AE8TrV3%sn&NwE@6}+7(%&53moCNB z=Ue7-6>987JAAKPtcUd-w#~<mKvVj6kNWZ=iG$E3_F74 zhC6V&+uvc@PB4=7OWy&)y!yrOw)&lykaFhZ044_pj+5ick)~Zo$^r@L6;;g-%W>w& zzSc^M^`Gxr6S#TI>H7#Xr|L)WBXCxX^{!m#0PbU|Q)v;Tu-GkBHESseMh|@~o8XjkiBwWv@2L0@?Z+O zu|$3pRNW+=XR$`G;p-=zEgiq+!=cLysbuAx7ce&vby=QI$LG{Ygki!BEy!zT&6)|MR2|YpBJVj>m*NK2Jvy z@vtY=cpoi`1ko5c^DV@bE0+pd8ve{P63`YyEAyZ`g@c7nmHoF5a(qe2+cYaSm+RzF zTAh3_`r35GlWHp3)y0Bx!wD@--wOVyRM$H~2eIazxon=$@x7!02pchu4$QvBVaF^* z0vEG{6h3}<>c>r?eNH+8{0+R@GYtg^Q$8Nsyp90ShL@8XHEEg_ z=8aM_&3xEit51{YDwha`2dP+s&*{qSW*6oLIglsgHNKOU?cMSA1ZUzj=6B>ZBp(N; zFT^Z^F&+xq1?#CZD4qHaHWrtOKdZ(UF2%j94E};JjCfYvFvcV3#r>vYSa|^0#=S7) zO;yUP0g2bZ0{YbQ;^A5&7g7z)Ry&HcvDrenvbt){oPb={odT+D|vD2=Q< zAo3e)wS~V@TFl3NHPr%m^Z!-@8FQ4f*eKtz{ph$8-wjG1PEAn_>k211CCRT$X&N(} zpfWtGJaPbI-IlP2Z3dz%KFkA2?V^;t|tEPE*`@5x|H@oRxE@Hm(9nM|Ah z=2xwM)9%lS$;sY>7H$pg6VZ1}Nx7Vp6Di1HWAeo&by0fl`@%zq2YIRNr!0)8{6mr- zRFhb3?1@w5C-7=tAh#<&r}8{9O8rC;7UD<{9lf(pGj>M3T`b(LIWRLA+F7jd;`+$J z*;P1xoj37^Y_6?~o%*u6e4Q&`Q}+nlHHZ~j?Tb}(GRPL4Y~fuPma<&_m<}Q3id~Y< zp`j+l$Kt@^R%fqdS&I!OZH|ROFTe6U)daxcSaJxdc=ow+LZTzdVyB3~=ttizuYDj} zQ*tZo6x5!(C?YIEpKOf=_G*V2G4dg0CV!2xG0Qt*vJom-0PTYSJEgrgbBQ z`ITJcM(lTG(N;u@gyuZ*V4?G2t#%TxAo%j;Tx!83>Tm3V@{i1Nay<@2rhHJsUjd;V zvGCe;k&ex3DNWh{K=W7Z1F1gMW-v<`uI@5L6UkWwtbK!=3Qxr3pA#`?V=&*jIBvMQ zEpP&^ABoau&Y)gwaz;ndV$F!wLeA*4R`HQO3TB)2aiBFmwSg;D+J&2GBJ^r9c3Ac} zm~f!Z;sfNCz<@z7L75Cei;dXEsHB}abJb9tv>iwEZ@q)G_9;!!E_0>?v;;+VW*Q~j zyuBZOxb#0rH{w6ksW3pkxY?>r`NxDl;d4q?kPCb4QkhWD58w`-WIvTV$&<67w<&ZC zYoMQAMAB1A&C3pP4SahaXg%S2O@d6V1(>Qjr}P=wBbMNHZm@+5opSoUOjPqdrglsY zv>C&=eZ#9KEDxS)*a25XMoMIJiGuSn=C{<3myt3#6>d@H(oK_VeXVu9m-b7*aN(lN z9XR*?8-o?PS!S~(H>STsJ~c5>NRtw*Fy_>^?`|xPJv7LB%$&a<~7Jv%AT)9!HJ_Johp@_CTb5C=De_+=Stw z;RV?HhvVUC8w~^1sPgx<8`V|y-g}NjW=3X4MkKVQ{5*^a_Fbi0OHgh}TFWgw^4u?! zP0N-kTMTAC{_v?PQhg}l8^UN$=qFRA>vr*@bX$^MQiSoZIqMx0$go&g}y5|I5a%U+JPfbi*rJH_8 zKHYk!p3N7u=EwAtDj&h{Gt~{ti#pvNgLKKUKLoTA32o$jm>zAmu4fG}v?ceAZq4`5 z%SbdTQ~~D@7&kh#0{TVoQ}u+W^Aw<~R=yv++_^Ur$d$x@LsGf4sg{*3bJ}-u)XR-~ zmo?`yRaZ0TL?$7}<+oXSQl*b=Z z>g>lELno3wLP{m3brAD`&mKF65Q)wJM$K z@&*O6z-eTPMV=f`l$4iN@nscZ-XGdHy5kg^Z#{LqqHSvW*L$wPe$-exM#h#%)SC*{ zeq~P}w^PX)+|EFwfi|}F(=SJh3nBcSIAJYHzl@A?2+lfng|8_`NDKy`xYj9sRgVCQjfo;# z-{*WR+Nr7Dpu+Ak<##Fc_XCOIWn8`EB;mE)+}6)jhTZ6-Scgp_Do94tVIwgFGa#@i z2PJgW_^iQVciFce&u5;~~PUCFRp_D)_cfDsw{+??I1~tn`?~2BrkJ zZhH<@DlYm6Z7!jiJQqq0)f9_6@k&zQ8umLs+m-oC0Dj4vd-I@|&(tx0Bvsx!6WB=j z;TBsHLN7yTVzj%4{-&`%saQc&iF`pPB?)@PB4j$n+af_S^)`a#&e83hbrTuFT|Nn9 z!aNENr}Lada3!D3K67yLj!%;WqRnA3j`4(@>*Yl|?EF$WW8TJC^lB4B(Y_i{CgNn) zn(a<}G(sUvzPLLPs^C8&DVxMYC^`2oi6d3aSN(x~ZuWL!zlKAUAroKT=dx^vgEiNH zAmJ_srxaxXLd2^f?XWnOjNbf%DLY7Kts=rR%u6}CKZEi;Zo}129$RKsr*_iCUvXPS zrgEUU9el`Mabf4Sp%Zjk$fg!}&+;rdbY&DB1m@nBx&7El7+ksuBM*8STHAl$?c979 z(ac3XPl13*Z?fkB8c*TK?ja~-f=Po$I)?#-O~d$$fOi5+Nf~UJ^jW7SMx`S%I2-F9 zws+*+eD)Gjj=XilQoIt%$hN#W#u&eCA$d&Z+xU!iV42W3MP8h{69!CrF9}x!b36&e|4I%G`?=;(!+rW@JS&Xlrb&p@+nhM zr0}-5n0n|(u08->7K1E~Q&2IF$g@jKDkZSACx3o+9(^m0V2AA`2rI{6F*soKwesUk zLQa+9Lk2`&IskM@kCCEbJ(76>q0h@R3s7M`G1m;&q?}Uh&#g}arrjpiQBi58H_Ec#@H>7w}(;VWI&lWATTprTT zfhbAOj3!03K*Dp%>8e%|F@GdJRDt-1?&t#}KxXl=TZieI}<#LaE+F|4&S&~ahz~uc+-F)bQ^f}UO(?gb#Jq6x?>@;fWem_L0u=mdDn+r$rq6f3lz5A8YIIH85Rme z=nlY(jh3fm=0l||bvQur*g7a|{H}E{9xaIkc`qfPGKJ@5w_zbo#U1-42em!8Pz&Q~ zY9crZ;(S8#=lWYb2zE`};M&F48ItOZmQkR^ioKRQFjo+e^6ewplhMevK80 zje%9}dh)QzoH(^iQMNmEErl|!rw=LqC%GrtqBWae-*#RkoGOCJq|{aktemIBPXMST zF7C2lvTG32PCoz@_ennM=DGQcjkCC|Np!ZO^Wb84efP>cq=u&Ckb9>7QWVPs< zSZjeiuR4i`>hpR8+bAgo;Kwxm)CXVG@wqPcIx(PESpIC(7RNZHJM@pr~hh_o_gx3P3MCs=Pi z4Pnb%rL<{&a#8uTHHlj73{Cr){1vcSb1Rc`a;yfywE&Q5?~>VZj(X}2XNse z69A29v9a@FviIp$@~GSLeEOjR^e7+RQ7jjUQeFIw60#7V=DQ0T(QKSsS_I9^D{eBN zos7Gkzp>cI&@WwS8d<<$a}@lr;XEc=?=J(~7wOn~2Zvh91H{G7JGEAjPk=$f|H~sO znUuj|0x9Q6t`YSPz6qk2=`Ks!0oD0@b;`S^D$Xlj^`UGS4+azjI1^EJ{VduAI}MS? zQdojzAdvy?cLxazhLd zJyBB5bMQj%Kf?@d&7jRPb?Z-pf1{F0z1c%)aUxM;EpuOf&#z&?VWil4 z4ip)IBM*fzTqnwL=0QDkG@-Lx_!d41U$%e}>k48|5_M70SBz*jJcF(U%H;$96HrsJ zRn*L#4Bw}tw=Y1({(c*2vOt%6XsoOznUs843*@VhDRCCWoL}05_~H$AzkzZ>F{kDayRm+6sg!cjZzJOIalQ!<9R1dQDwN^( zlH`8ud?;}&tirISqYIwW(@u6^Zn>RIH=}ie7CczUr)}8&KK8*p8+KR;W3Xq$7&utX zUxaB;cnMEhIq{`~mQp(3idx%;bU_}gyVdGs@)8gXTr=>XFVeK29-S&KB1uH&fySO( zCbs21ET6ye>LVZa-mfwzC)><>a2+E2gYnZa*tV^*k=0SzQdnBn`i{9&YInfSRjgNBCxZyaq<>ygE?5`YXStW(`c`jddgh9$20!;7x2Q$E#dQ ztIr$Sb~|0nuLtksPUPDZ{4_--9CfUlj%wdtNQ!8Mn_eH%Dq@ zL#<@}@>7>VhIuxNx%DHV^fe>zky;;VIJYM+6~QDSHwEF%M>qlEM?d?L`rmJIrV2ef zJ`|PaRD#t*Pl~2_F*batf$!9DH=~;zC`x-Uy|?A1pY7t?YtELNqmJ2c+U-FUTq)O$ zggqwU`c37e0Fc|=QRr$_24=7Mn0j0REUDO56;u9c%{$Z&YS{fSmYm;cx+N=8>Y;*e zybw5-pcFt^FVu=Rbptym+%>w$mT8H8%yORHd+nsTRFFn%`aE^U^^KzQ$Bv^G{L$y# z2PI5s{fA`IJ7k>H2j~Wszyl)UF(%B{3k?3=Q6vKeEnqoy4~o zP%U#z8&rl=m=sj;X0EXu0geVU38F2~tCT4mG*p{}kpl#nEzx7Cx8`Xgb?)%WR_Hnc z=2Fp>!sZ7DFNt8fM5L@oiM6~*k}uD7n_8raB&H(??l5ewgUvK{JKJ>i$psAxy@)9! z%8cuINjWcpC+~etKr>jFvWx57%d905__^psaql)Sf8Ud*7g?|cY12@7u3eT+>xx~l zX?sepkIAKJmv%&XgB7Y9->?jtnHDEB1D%A?ByO{{+!DQ~z=x^nfF7|-zpNks?mX<$ z6kgJ|Ygmu9GH~LWa%<2*Fh&ODew%E!s&bOMdvvHGZhsYOKJk16G5&9>ucW>(+3ht zet?81#3YhyEvJsxq{KLwLo>Y9BSB-gn6Z9ztmM0e%C!Ba)!sQ(q&-JAQEs-xb9T8V zjsR^&cpgJ8SmCJmZ4+2?^xgQSv7}rpIjtZqOM=7^7YxtqWG2zqb@{eNPm52nAD!G( zf*Yr$uaZ+(YLpH0HCal z(Q0MAveN?D4hw@x^WV;<E3B=9OP zH>dZRBcsI1^SUf6nmd&s@9D6^kTRu+bU}%!^T$}Hx-q%|3e0f?8U$n|rWj~jhDl-f znLLppWHEWuG(T1gZ8h*^jFN+?y_TPnpm_(PEFbl7ggI)om!a{T;^uNM5(a;zTw;O} zQq7g3KA)zRrrVO^drj}^$G$x8YZKAbL!GQmZ8XcdjxSacgUT>}?$nH=`UCU%lV9`I z1%Q-q>YqK+GJ^&6n2K_54r4w~2{_Hawi(a8b{+|)m2c`4G3q5>m}5rJ>Uom!t>1kY z2N{8K?qRpUK_b4V&it#xy74u<2u8Cw3cBmdIt7KuTxz@TI14YRd|HRSr>u0TRv_+F z9I5?=?ZIXH?2+e}uPsMzTM~g5;zQ$1sj0=Ye`tk9a@*WBF@MNgyB7v4qg|9Hz`~6! zkTkfO&7vK@PyPrM4}~Q21Z1Pl)?w$-POI}wsCiYwL=ys_Y*)S~(co#yt!sWVFGKmb zjEV_F+oW9w0gNd*`N%hUdoA#5Va?DCyof~z_=z)B3Zp($`qoh$DHTuyUxOHOEO<|; z8S!9u`sgVZ_V(uDkHvs9zwIHA#*Bt?%{y(6lMRPmSI%rfpq=>1!W}dJLk;>7&O@uG zV!@KL^EX=a;8-<}NkuwOY4cV8`yFtwj5qVai-BqjOuHK}_{Z zCe0HXIR*Kx7GCO++HqQFubP>YFrlW!z4?;36Bmte1GR$)mO1TZiozc7A*mv(CzEb8 z2XZW{Wr9`j`+l^uy+`5!o*>&_ro-5f0xf@yAj6tWG+)v*(qc|{+G$S$QFfEfwV?F| zg&Is!J|`9Ovcj@q$|P~E_M>yoQkPvFsl4|Dpj^i_(f*?@yBNt9%=CTY;DqeFyz`hl zK!hcer=W1Es*3zK!9uO{q*nZy?6d>`Dph=|(Q+wHCZAKDn-*F*+X;%0J!7eqfjLww zAF=baw495u5O;YjlTs2Xxgl$ih5GT#L%8(ll%C0l`y{so^^zq;+1%9><2r4-(t@)V6mvOJ$40+ z>$jElW=a^V@2NBP;HD$TCRN{OH@2qq{Sf@nkd!XB{XAoz)D`zQ<~DBI7aK-o39pO# zFqhutL4;U6?Hz?@8uDE=&%$u4aICX@^Ii!VXDY7K9OA`i@iTIoc49-5wY;*JO=(3* zwUOw`oy&bqcu$(>rvg1^cjWCicX88~TV`7)^%8&1+p1j?36j~8uU>jy*rvJt8k}fe z77&kouY|F8qaBtK>ErLP5Tp-GUTC6qwykZ70H9U3LsNprQv#gDj6j%t)5L>?V}_YY z@(N4dWOvJXJ2ug+ST}J<_zpax?z<*|rx@6kHD+fY?*Y{Hi>V?Hw48(w0Y8cK;k38Z z9FTW*jrF$&Cy`q`x{Y+HI6u}q@$+v|3W@6kx{1C`hd)jbXToKY&MwE~mOZ+r6yN)1 zIb@7fn`cf34_dYb`AGWF)N9xWAHL^{{}KB9)Sih&uSCq)zG%8qO!%w|j2+mw;Sz$BnYGS{A3|$su}!A4f2V z;vhJ#;kbV+ZWAWTP)FjiKlKSr8fU^AF<@*Mz>w%fy*a$E*S;v~tLvwDs5TiP5NGZQ5EFKw=Lo z72rBedh@<|%}2srNO5sl&>{}{>HuWJll$?Ta z9`KjX5OCP^0rHs06m0KP$oc?TK&HRtzY`Af*wju5g2l*i3T09%%2Ugm+Y0jwhPsRG z;g2%MVNShm7Kc){4XaS5sHc|WUtS<;Nx+Lrul@ybx$}?5Ln#LsNTH79l9~bIzTV$@ zFd@B6DizFuP%k$P6U)Wu{U#oH$pop|mz^*t4N0klm%S;cPX9Ga<=pf@s~bb(A|v^n z%@AZt{Luq8ocRRK_Gsj9&{GnH0F~_6@8_gd6X4IQ2GQh13jBC9?B?qgAv+~P-g3=f z5W^w08{qM`oROj~M~g=UecTh1`r^HM=3eUFr$iERPg18qdf`KqN+q~3*m*}x>XPRB z)&I)U%F-2fyUvXwHa!@LEQt?{= z!Kq8}vhA&Ta`*Rpd?y9)yOn(|JN9=v4mMl4$2iLVlbuf-UJLV>JT#UORTl>{v?JiG zGJE2Ge)rtFeXave$su~5Wvalidk+FfU98IAPL2tB(wQO8PY16(m`{&xPvY7g2u-py*rnTQ zJCn(-v#~9Ii6tkMJg1h%n^L^Mj5A0T3?w7{(Zi*Rz5%fS@ zkU~Ex?|{ia^nfs)7?Yz-+oo|9s+HCFJMVM{_pN;7SaPxx>H^+U&zGa-Y~Wbi z3A%GT77M%bSbk&5rSDy|X{MUCEeKhj_RD>8o~tX-foCVY8$7n9((kmya=osD_-m~l z7JCEj3Cec5Vs}d0!X~0RNn21xNqMz5Hd-tf@&$q#_UYc3n1AG9i{7Tq%Sl!|7>Gjf zY0vLeqVk=!6?1Xg87Y#L6v0YJ-Y+V2(Cl<#T9e9y9CO|SD2}<_kpkXMp{;HcoxpE> zE)a>He&nwiq-n|5dz?0j5TDzeTBpr@SaH2m6Jz82WO8wUar4W;3kD>lKn%^ zUdE)*vstG(XFGws%bQy~WybTZO)7Fe*5tL7phD{RQ6?Yp$*E2?$YH%}@ZB~-w(-$! zH3`=X@cC7^$7a=Vxl)w`C?(x_#!D(QYfqQ$cF~Q*cc(d=r%pX7$gd=mraVb0qfu!w z!ZNspdh50qSH_O+S*K7+g4nlkq{l6O2!0ptN}R~dRD+CC+p8E9LM>6VQ9%;u>X zJvG3(Y`kr6<_$@| zf#P~uJG-1)^Lr~?76>FP54K&m@>n=tNn9z^24HhVTFr>_Lq!0ltYjNDdxZR9j2 z6ZZmxiy>xI$IX|*!V%zo5pd7vEB>|4h1ikfnM`c^+`GN{q~|?PaGAos1!iFPa-iF<{>rtsXklJEloU3*6O+Q4IO~x^wq8DKK8jL-FN=pgkf^= zBy>c@q@J2MbCR8!Mrd2ngQ6uO@o7Np=7iTxq#-FM5WD5UPJb(QBi%e{Ndew<7X{ee zqUc`cY>i$o4YXnI^D#Llk9}LK&2LX&zAK09DY^X;s@mTCWcm^o9&$pzbuc0fY^k>4 zn8+if^eG9uQYL!nrzHpTP-zKUgrF1GDIw*5Z`@<@(wmVucACFC3`jP4??*Yl>NBbbO~%e8jY>Y2$IoMYbtB(&DvOC8wJQSyEb}Cj5gK32YlAuxO!@l-*h=i| z={2&dGgqMhjpCGF!eFS-(OidZ0SR_nC{q(S~>0GG7YH?Yxr?^GA3bB#u{2ieBYxtf77m_ zx&P=8!zD)wdxh4mPjjw61&b45>tXMZNZGw!4Ag`JO*|w-f7)fEqHcn5C3WQZlbpA> zwvVRUI1<{;02&pj1PMntX*z)+ua+=xbdbx+ML17ZHpbA)u|1jGI(z(;l8|;1QuiA>pW4)35ONAgFoqXkuXcmKcn!&?7rf5XjxA! zlNZtep|vhieHR=xTO5HaB}vpeE?KR?J|)j9&-TNKp;);QGD-9%E1Hz8O5~HeAGEA< zJ&D#`31*K4cVwf~8RH16ZQLoDOsoRc}n>+_btER#U#-FYl`D9&rtFHl{pQ3 zu6COxbs7Y=7Wq+NS8Tz@MBuB_+zMmbinE(vlH%x0Aq0JOZlQd9N`QUtHqEruUOQQx zM30j6LR9jzNSt?_(r%T`5M8Mk*hay$<}NZ8t8B=^D~t4N+KRSSDVex_zPnArgkIZL z%yEtek+jn&gTh+_H4qqbc{_cXrZ}6qHK)RUoQF-c{NQML8}aOuG*5+f>dib1<%4JP z@B&Dwd*wb)s!9IM>zdXuRHDeAOuOyrB(%P|P&IFwWHxG|hH+kHz~+fVQj>OR_bkV8n<<7Q~viCIor$3&NL zO-EuHHumW&t&D|8!Tc#_0@iL7*u(NYF4fo?pwgZ1vs z#lJqeux(1me2ajnN#_?K{nIPagbU#tw6jwx;uSR*`mR&r{IvglwWpJJUo;PnG?)XXhJheqt*fnIPnlW4{^hh@~9L%bQ(jPp!hI1Dz~mlLzi$9gS-VjZ6vXG6?R zI!p3M-ZPjV%n_4-Rk%5vDfY-#uvFPk#@H>;bS^E;#jhNx+eSl<)t85F5r>se@YYoT zHI}eRNbHUfg{K_pl>_*`2;s=_4~MH1{CU!V^~!EO7|R|l8$qjjSB?s#QIhaK z>ph%`CEV0KIekSOOWyoWf+0L!UlwsU>V8=U`BJo-Lh$OznKFhdiMWJyuA6_^B)tc9 zE$@WVfydqcp8oPO|7|theCMeLpDRd-oJVfQV-pNhlE2Ayu0e9aSdE>1c@1X9(3lAh z80)mv+GVxze{PVK$kyeAGKVO&FS05>6r;S3+i zRG$?CHvz=unR`<)uZ zte9U?e%j!d;bO5I5v-W2n_>dR=zgaTp}4}wF!+5lb04{J?|P>u23}b21?5lKPMSiG z)k=DFOzCrbPV02VD8;-q_crl$E!WXijg<)=ISJc}Z_-)k&$Q{V@3SLnB|1m{D;ve% z;F^SohPnL($Zu1fke<68q#RSbL)T7#jd^BEab25Be*N)C7Gd9EveSq1LWR4CxNIA$T*!EUdCa^Z3pjN6E14-d=B3?=_;rF zCnuRm2}8~{QK2y`r;_7k2CNy2<@_6u;;cDIcAyUAzDq-sq07zRxB*i;7xQaCB=#UGcyHV_~0kU@gz5RojLEcq6pVD-V#r0f9_ww za&-AqpM3~6v_%r^@=xdZcWAop>zRKs(Wlb@7O|Yu%?jOS!;mp)p3gD;Z&PUipm{U{ zp_^LVnVkCdX;lrQ8yXs(BvJ(2QktHo%#23!tII?2Gp{Xw#iZ97y;f*G(mj|{?8|X9 zSZSLJ1bKsB%CO`rM-REJZbxF`O}UA>@rz--<=W)EnG3KK>0`@#;Z|!Kx8x_O_A6me zzvh?&t{}m@tK1UUBysVe+>&pDbZk$f<+eWwii5h2@oGVfLqj5jQjVog?o;YeOw|iv zv*1)M+D3saDxU_jkUX@@Ky6z`h{~eU<>k$i;$WM75-u?uI`(JF8(=8IB1kh4#V3`? z{uvgQB)#{|Y0r_`XS0NnebD!jLzLwGwz(X#Jq4jZ_2+IY)frArmM}N>o073noMO{|M5~GsI=`T^=WNh$)RrY76e3ToyPlGr;ex#kW+ z;cH6r9HYeAlVC^g-HCo*Zvq5g%Ee_bj7t|*-K?_mt5Rr_tv4fG-Q3U4*E@HewLuQ#Tj$v6F-4Q=!Fo-x;#y}=QQO;+e=9!WmN+;~QG<42p0e3-{+tY3n>i^-I{69f*?J&# zaMwZRfJ7h0oVg*7em2BqE+S`{i)ts^^K#X4yr@>Pxc7?+T83wSH3$ zEpKo1W6BiB-e-?o{JHm*2c;QQKmEx~4}EBo<-F&M=aM!nK6I4>sDgE#hnz_gMRLf# zrCLd{$k9%raHpWz$^Ry8?>}#mgmdiJnjF(ksqdXa^W+;6m-J@Z-~yR*PeKaI{2-|{ z2ri#u%r-|*4`G$S*3IB4W!rOG>9pq$<|RdJ z)7S>xg6yg7Ji`2KPxxY7otR^U*cZulOBl)#x61Jqa&Y;NaxXPjo>xC|KLpuRiH`oc z;}}x)-txencPqrZdn(I3oFu>gaSjjcM)SAG`2?D&(UO5yTJnPgAc~_!cV_m*k;!dp z7yC)FF2MrWQ2FPn$Uc6Z%0jjxI?m;N7`I&k>MS|%5X$Oe(41;J@{OXuvf52?p3~Bb zrbI47N^16$a8t75?1TjXvn1{L*}=|+yl)`G)W-*+?$m9&-J>^IpIKV!LSyGZW)hIL zOO3vd)5|eJSZ2qccuApDL{zNi%*`;#WYz|13Cc~G3OfY~)Jd@n3?(c-jZad^Q@GFR zYIH9JXv!(&$_*pBr!8Ski6wiUof(F1Tw)^Si!-)tkpwkMs+q$-mgClkDdM4@y8Es5Pt^1KR3s|-=s~uAsQ-+zD_PD zcK6`Z!5Xgep-&7mnL16%Zbh`viQ@N>wXk-chh?!p`R$(iVVf-|+}FCokM?o~ zHsom+H5}r(z|}P6VZxO_nq{3DAhgg@0k9u7Jl(=%Aiz$VGil8ra@7q;FuoZ7(J0A< zKMejX^pXuWpmW{GGFCnuy7MoM%x&Z?ZCErsY02=U+PN-*Q6(h=)w-blgL_Ax`-E!n zLm8~Wx!7J#CH~QVAvWkhnB=_s3?iff+vtJ!dY~IYfV>X-Z07kb&yio(vSMcC=7QR` zPS2EC$tAfml;U%M1i<|9+|Tin1-f`GU+v+1li)KVOZUiAcNwkcC?{|oOgY`=oLK6{AEr3VJ0D=r ziI^F2LB*d-nE6KXU$P-i{*`Z2v>Kci4<>iv!_8eQhby)Y4}sN<2h)3V)J}LyS^7-F zCupLucMhlx#`=PErl*4u#F%R(0Y}Xclo{i~HzdVs9lAA_)w~^1^SqKx7uIp-#=en6 zPL8(X(Vl+7)f-f6;n*PN&E>a&-iX#Msf8~dN&%mjX?y3pVEHpQAg{mK^6zxjv4@T+ z`kco@&MuI#+6>Lj57;dj%QhL5%-b>vE+$yeR0=yGcB6hxt>wutJJ*Yh^^dQG_DG*J(L zvL88N4+idqW)Of%j8^GG0w|?YCBTlno)oen+KmfKGi3=ew7cDpg~?>W$876u0h=GU z@WkrdgjnB#%=$Lvc>S9E+aEtXf@S0iafCZlt-!h2rRsB+Gx+2|M9IDSuvx4d-}LQp z9Elqe`$cCeI#{U}ODDC$7LMy&JD8*0HMc~JD>>V0d6k5n>WkKwiGvjfJ;q_+0DNgWtcDGF#$pavF2Hk1OnaX}K1>7pSrs)<9R30&BoB z2_q&MiIJNXNEYGwXKd-UgYNz9+@$T7!O{$|tI>o`^xKal91cA8 zV{;eUC-&-^bQ&64>iK*NQv?-_<%ql&PPr3mIMtkej};w)Ng>hCGk7KS!I#sKc+0Re zCH?e^BT5CRT71yAL8sEJl;4@-WMZ6ir0s>nSZ#M%we|*s;*8 zo05CatPBY)23w?zeMFRRcAzP$cd+Rp49qXHrAocFWavdd<)+4h6rSr4+^p3RbbT=r zrWmus2ppNMij|!OOrvg$=#?Os!`V+d7<|K3OUu;unHd?`n`j(SEmQ8C7n>p{6)4_~ zr+OrLh5zC!^z8g}O@&ZD^uO$3tYgZSA57hb$-$Ku)K`v$eMhQT@YQ-?V#0UI+eC^N z7=)hJCzx;dOFz%*T}KKFvY5#b_-AGc#E7ok-c*_tw=EFh9PVELL;k>Fal%UItvCJI z|4p3heF|HoZa*!IvF;@Is%vecb>-4m>ZCepADO#@cy#@8X|&i`Yah6~fZ(my%p}Z$ z=v)WXLFseO#L3j+P;xJWq;pbvQk^}lj@|~6NV1apqs8kY1QL;nPogtbBxn(^YKJJ1 z>D`A%LdopS%X}HME^qMB=^xVs3aYV-OB#o(rnQ*ID)k{a9&CU1J>T{s^z!8xz^U!! z#c<>;7xtW^2ODs~47MzkFwW^jr-!;@(3+_C6QQr(Bu-747tfkgiwe<0swm z)JfodUgxb*tcfzFdmL@sVjTg|CG{?PSxUC9p~jVAU$_y4UoL8)R~ly%!5gCyVLPa`TDg@#;LD967<9aM@<+ zlUI|{GZ7|Fx_#$jSWz|M`5xzctu(Wqo4|$2c2omzYl)_|Y~B*cG%i#os0H_{AQ?LT zQ@6?#Y%htiZEor(LtR3|;{D_+)V)tXhgV~*dtuXXC3lf%YOc&H-@RlCNLqeWM0xMh z5c@7#h9X)*bjxp8O!OD(Ga3ro(`SFFvL1x=kKn?*#Qe?ovo%yP$MNr;p39|iwCLqh zCU~ec4L(KFHZss_8#YERf*Qd@L>?0t8jl++J3<;(uUr1ss`Z%&Stl`K-8NESeAXT- z6}X2t<<=#rts4>_T@{}=Lp__RxlnC#v8T`ppqrvXE5#xDUc?aeLiB0#QcWWN{QnCG zT)x71y#DF&(7OEbcxY>RY>6!aY!~g27_$qc0_|2S)g~vhy`KF@yeCAv;^d2cr695@vcZ%toAf77q z;ff@xG*+VzZs!QttM=gd0+$4`6qy89ZUe(}w%U_AnNuYn;}hhu9Q=KW;4_Ncrcc3` z0|mCRH}p<7U|VIMjdYS-?f?&c1!|LTN@KD|+tIaa2bqLqEx)K=&z=(VV26_2!$dfz zxG{PTNJC7Q5po@{h?w2=c91|^Q{!G_S?aJjKgfIa!Zq`Hloa$jZ=S38t@(b)w*l@` z%{7I`MisGGYJ7~YnCO-(|7{guTG5bbd9Gxd>HL!)vrWChd`EM_OR>Hal~(MtMn6+H zBq9Zc@Lfxo^ddH*;Ypqc<=w@iD#B?w-suoAIe$4=B}G&6YYy-+3+h$daY5-j%VW_b zrRPaYhY(Nj1xZ(xZPN+ZAL)^LcWI{;l|@T4W$2?&@5r5prJrSVa_~$2h-dD3VY{w9 zd9Qa(`D=xGGt{0UXIQw_YRzEtllH=lbZ)+vfbN&!Xui~v*TMRU2=~F)^_y)+6;smv zoixMzeY&flzcb){?WWI;wT2m;>jisXM`4CE40RKR#Ug`5ZS@+>yg)K3+zH{9pdmJJ zf-*CddTGBC9XOMGd%LEM1Lp(O;N)S{vefZd=4>4HG7X_$!;aK!U3WcM;YM2}7_IpD zcmZ8Oe_z1{e8K6J1;|4;#rT-${aq>ervkE;o)4zX$c>~f7N~!oDcqAZwtRvo)mF7h znw%=$Cb9SB*Xk!pa?zzlqg2=}40#t82G;XZb2h{@3~!n_c~0ue0FA_&YPDl;8=m1o zD)ct-WQ}?c&S^(p+$G@e2ry3|M(6F7p!I2aMQnDO2_>l&RqRE%-IcNeCI#Kxp+}x9y)5=`mx1p^$)wQ7 zol2o>o%JCdv6QG&&i9aTPjp$zbxXG|-#1#83SAoDWA6i@Kkv{2)NV$X_fWPVr<{je zm!mMG{N6mK1?44IfB`1Ha80O0gHGTZQ<}9*=1h(szTY?|J#U7Q%F_khD+Z{AaFwFt z)dm@3NA$&N9x^~)%fg}gWGlMn`*91}0t7bdH4Hs$kU%F#wa>i=Fp`lxSVjhkW4q4H zIgGc)FqzKxjhUW9+V6$RNg0Q(Aq{@!Ly+>Y^-9~CJQ}ZSJJF8z znpQ8<#U&{Co2GN(sjESvomj3S?o#gd9r^zxs&rkwEYc~$T_qJ4! zT%kZ&alPH{K!s=5@!&=j(9JmXr!!YJ-dp_EruL=^HP!MbeOLV9kpuN{5z3>?r^V;G zg+-m&$`PeCKFrDUFYJ`}W(l`(}z)#DE>Hzxe!Z9$}WN23EB9>3G)fF)Z~IR zbz(0HS8dY%_;izbKl*r*#zgUUQF%TelHYl@hb`{<-6=!Yq}+hpLIcQr-5$eug!(Bp+|h>JQZm*iN|7frJGw1Oz!|AHW0y1 zxRE*FeRpGwXOASjzHGJ~tqAMy?>eG|INh3Zm%z;`A=_*u7k}+Fr8sX@)_r-+ma&?g zjRBnu6R^vSLQB0a8pUg( zsN%yt682UM0{qE^`3+2GP5(8aOF+v%`HHmcQXkXZoUtG)%f`WSq_VE-G`w#uxn$X@ zMJpm%%dzR#B`{N{&Aql1VjO4OHZ^!@Id1YsV1q^HDeJ~Vxv*2^_)FlcPpSBoW#|)J zkdsYMEm_4zR44QiXhRa3*00hq6+ln!50={s59w4&cTNks2#pH?k~i4*WtxHBKkNy9`ylDq z*FznC94WgF$piByzrE(*zMRZYs{pA=7W}nbmt6f1kLQj)GI^(Hfq^&PpD2{vRBjycCtV(Q1G3h7_7vCEAh@eq;rE~#kgr| zr5?NkTp{0CtF>pGypke0xp6b>rqBjPrt&TYB>8fTlq8og^WNVMC24b@OulpekpK90 z*M_&WJbC+%n8_reB8{;N+;{#e>tY|)hV?}t?EdY^2^5uyQ_i=6V}S(6dNRvOmYceb zw0uts_K0bsVeU$@QqX`-6X{Q5uD1$4)yloW6eIP3$HKv3PuM6^0z6eJiFg7!JZ)1z zlPDtuxt%$8Iq4UE-ruYMn~Fgn%6P7l2lrCl4SF67)W43jRaD(6`2_K6DrpxRnn@PjeEwBB6#P(Hx!bGy zY3J1M;sWD}KI}?^dg&%J?K=>>%uNCYgJS|o@~SQO4n63gARIKr&ZNWu8q35yCsLP~ z!v+^wYUIgS%*gX)tkoPng{I~5X@oEx!1HWpXDun03GMpa0lE8$!F=Uv)=JNBWqF-o z^yK+)X0ABl8ZbPbSods63_PmFppM^u({uO$&;Y!7l}nl(?v! z%fcd}R7zece9mH?`3+9=+q)muF;hy9C)LQ%9?$LMYPEl;gaxnr#Olw*d7r7xbm!mB z_arf#f61`!VNi5^W!h8cM88SwRBrPAs7f@@^$A+Gntx!35{Ani3&!^8_av?33k1%; z_^fkbnzMAiChH_#Evwci<&%Ci#b^$JfD)Z{UsW4 zI;sWJ`jBjf5j*p0dlnQDIAPFp?F+!c=_->WaW#5*AF*BHHTfkryDg31B>zr^+=~tG zo-d$HmJo1p2R)JvZVS>0kU`A1A(qvQ?_yDeL4Fg_;yz^IK`WN}<2uvAj6-K$hwcUO ziP3ZXZoD;u$Cg4p#ewfj7r)stwdGCuJ&yTG1F2&>x~|o zNn66nO*1!jbp6cfNw~bnmtT{MMpnvXn*(~MSee*7jHe5#s^lUC=jZ1>CZ`brAU}km zIo;~%*W|W-jOZHmwA!SXR7_8!B|Bwc=^kKT+97+pxyNwC0xHMMqNw{pVsA~2nRt*W zSRQMB>*7Y0g=t9g&cc8VV8|&o??MndOma5QhPPPaeCmaqU^W5yhPg7^6zwE8(09Io z1SLps=Np;s2I(+j1SW*CqfE{DkS zz_t&>}@OI{lZgma6K`QOL_k+4B(8VBEkj<+zNhcq~yU$ptv~gkJr+x8}6w z;pIqwcM1Z^Fe*f@_9@a6(d_c*3FjOZe8c>mw;(gDo@FA#Ha*KZy|ydqe|i~g8$*EkRc`zP-=pT4HeB{)-JX|SIxNO z#FefN_LQ+yZ9G!XWgi!Z(;T?gXGO<=t-0I}?gvgP9Q=|+)Y1I$uQ}>&&T|oUlraC1@*?>yoI+wLzadb3_*{Gd%T`YPeWe_9O8yN6- zp2lQV=3v;eWX40ES#IhURQB0Byr+b7a4gj~+IsZ08qE_lqAAC1*PVBWL4UEq&UHIy zlX}m^8IIftefvc3D}xGWX88;Np3+tk{* zGFrJ~ab(*efB0ulK2RlhI}Tgkcg>d|Y_v|nRdTSc>r~~dth3#h>xD=jgtPES@?(O* z`O8#4E_X8+;F&s3*l(Y?WZo-kZobSjXRa61+$|XCy~)Pu2&V#Q?#6zgx09wz-l_Bf z5_pIll_%AX=1=Z%4tnQdi)%QrHd#$w)97&8RV(-lCdPf!FsC69m~!MXH7(5)gq0yl zxAHLhB+9f(7&gh}MkQ`Jrwc{(ME*kiBQUF;x%!9@-9hMkCd@_PTNXd;SKm^Ogp{DZa0jY z00*nQ{`Z@Py3piL@|{j*&W{GIofawFw{MFg8I57BA@yNgxX zhq#2{fQ>xkod+xZ(KpU5w*Gdfb{?*x#md|+-c|2K{PS}gy70zlGf-dV8=4l6FG1q!4lg!C2H%Uub?xGrO~#f${q!G7mfiE7nM7C&%qb*n ziG`BW`tSzH5n4Bb!@6Ax#o*X|BT|C=*;690Ydz=@&s|I)>ooRDNNG>N9tm8Nt|{P` z%<$cm2ZP_SiArF5o*gN^kG>KuwjkhMCxLP&S!gbIkOJS zW+5TJ+71Lp-7{B?0%L+QF{598$z*F&tEZf*2$V_An+#FSW0BdD3vc94^!(f=!t4o| zsUV&cT_82ngXGn63X?T*vJwk}Eta5o1i0s+8Z?(ocOuWpT5p0Bsmqi2(@pZ&e$l+Z@@8%vJ7E#gCS+Zm1$*i+6ITgq06>spPsCdAgbG3mzV z$cg_JlpHcE4sLpn+4)JBUsF;c zzQ456Zj!WP&AYNFnhWs;ksS`{TFB@fwne5s_~=^#RF1@0g}`8{)cc8odAYglZP!hp z5JtgN|JTA4uQ~P@-M}jaqTuod7F&W3#Gr?Db0R+oY>0PL_-z=yOP>BW7OGwy0 zcM8wMwrMF*nWPhE9SrWMXa@-%SDw>_ZmQ{9?Gk87Ceb|no%1;8WZvJf&DI-Dd-C|? z=y^1*_6Y8L_Z-rFGyG^qMadAnj)K`bv87D|)|%F0DfYb3_@{$IB37cqYBN27;0e;x zlunMeRW|aXtz2|YmWlMa554i!#YEaV`=eXe+4iUn8Lrp~+vq#^Ic%rjsTMi-IvuiI zJ@$(&0N<{G-AH1pwRi5I-?{ImXn~m5<({YZ#!q08S~o)Aw}oAcf$XJQFB+>1c9nfo z!zF07r0h#VO;M6cd7&w_XeKRGNJtZH$g+cbl=jYxc6@1?Sd-3mT7#IefC~@z!|<#I zX>g08)4jKqc3?q&)c_Vu@HF&|bNNrE(FpM*4+2`bkha-vyN+ozLG>z$ZF**|vzdDg zvY^Env5cRw1x?1rFcMjXMp=FyPYqhY%aqo?rmRScdoG}jW)S7aD#O*9=#{+raVdG} zo-{Q>K*hkY-LR7LMz6!hNOC0;fsfKI1-?{^bFh$NF)02nIp=HD?Xi?N{DuK(zKLIC z#8VHZFdH(U;WSa-=_pUHJzpSYlAFO` zQW$|5Of))^EZUX9MAsgGJW!$xmXhle@~6?_mr(qfPIg8X=p*+YM3e_nZVO4DKyrW9 z&O4I|w5m3@$n%ZjSc9p#l0S1B-3j}}d42~z940?5L#kA~+v`)ie3rix zY+1+EHD`=wW2Ib+mBJ>G?qr@&QZTs=>Ov;K0~0o}>KmA8c$^+o{`;}hScsSBO(p6* z(*(t6v{Qb-D&Rp6dfGV5@1Y?W*s*Qz^yalqlE8b9kpw|Es9^n#xo-R#a~IyC?{4j7Zmu;Z##^@aN<&g-qHijp)4iRPa+KZZ=73 z{-7ZtS~3i{1#BAb=NhJ>wjfw;+MowniotxU@6^ZeET*Jxe&U-e6xgaJqFA^fQ~UPo zcxnL932}Tua>5)9q6_dpP%gQUi2i6di1O?LauQN!&a!q%rs?^KB(;mk%bASF3szU~ z)t;)i6Y%+_>~ubJVE_ZXb&BxJ-8tjxskyd6r08JiA&gFiDRf#hxib_wrX zEmG?e{@Ru#pE=N-0^X?&6k+SeY1L+ajcZKxM<(0A&g=-=337cMsm${5F~qSOnwAVXq?=Hl|Gy+l;H)pE%nSp zVSvVu(GO{i!R`t@UgeKp=xUJr{K@4#8X;F|%|&MpFHP5*911)PQm3?|D|pf%Q3DQXj2T1|^Yq$?abAgmOn-Ztd@u59{Zc5)`6uA? zoy^8^j_$lg&hds>OR$#VWarh?drPra46DxE21}z7M&8@*pDclpwN$G}=5{Mm-)p{L z415D3xDa_5oL9@R8tw+Nx|qj*cN_7lq5ER{JnYV?Jsfc zhedfy{Zx#T*(1_oS@YzR!BV&O1I3TWqgGie+5FcL5SHuIv=odazLnr%E7N{eyQHMv zyruI*gnIr2R8{AjrghS5@>aE&*9@@eY0RmE7fhO(4AqpD0k$md z)F1()Sf-+Zk^62q3=*Y)Qnja4!_7GPw=h>|7RHK|mw}ryR35~zvGJ#2{PYd-d^SMl(gR@4;TI&ejIip{+C2>1> zTmBBRXwPxK%{_RNeEj1mOA?t!ze~KZX_}&J&v~yYY^Iq_Uuf!Gx8?WKmPlgk@ln<~ zoRJer8-&VLv7H2hEM&%?>Ad*7`j@#723pT_JO6^DD7fw)jRA!VL)}iZ*Iv|Wgw=3u z@(}Er20#qdhg_ZAYR*F4vFFfGCef#?iEX4M0ul4waxzibR?9bo*YWLTlDf#_o)kEz2Fb}5Iib_~%2L4G!PNy9{;oWGPDC};)^}+} zz5xIoFPkY~${8xEmX>n_79Em=;fj3zkgVL5oJF=!q1!Q5q3AePvC#%^V`p&8AHXbn${fTM$k%Lg(f5@qE2iWP$4` z2sqR&#P^Gp#czgyzCr&Z+=gJ zNHRK+l7n>gScu*h>*k9^Ck`MOH`CtWr0$jC>Mdr*JH0mg%GSa1s8y{<)O9Kt-^#Vg zsy+F?>b7tReW!=C5i(X`s_2z;`L2)s5w}=TehB)$pYu{_51hIR^wH5V<_^ z4@U_khv(L#KNhM4+WjMmCRr)RV?#(`??zH4N%f~8Pa(TL?>Wgdo5?vLYXl@~T=zOP z`~#y9f95XR!dpk+9gMy6lmlN=MKcSN}Sh#_l|!-ld))lCZ`ynusSZ&z^XEC4f4K7 zL7z*>bzSSvp!9S+06{>$ztzR|Uyj_qg&SPSJ#p1v=IAT8+s5aCZ)yH{Fab74q3}jp z34bUbJ-@D7Q6bZnGb0P7uoYs|x=BRW9_R~gUEd_!E2BakYY$=X$&l$Ux0?2v0%Q}^cx5>6uKkdG)lT6R3OnGdc}S61witn>V7iC1J!M%4*Kcb)24H}Ajm3Nj&`U|E9I z+snWr72cW1bY2K?MC((MzCngLV8eEmmKnB1V8kc7QqxQRI`s|qX+z9$d2lJ?(tVn< zF+UFItz5idj?*Z3vkU3^?3&SAV8w%@ckl+mE`mKc!at9hS+L4A2=yj9DP9Yom#GXz9|+l8v7=$?dNeaxHsa-AG#Oz6-VCiT7nJ&$@!TL z!kv3igB~OOMLYkNNUk=A*0=o$%D4#>$SVs5eNyi-_W_nvtGObnitcS2Id^L=##kn3 zIZpzOVAMTX^!Gx9^06>+qj#*lZrNT}sxIT@g~N}Wo`O~06@`aUN8U?HF}~H;1Y5a( zJ5x34y`=rucg4_omN}~Y9;))kX>C1^6>wXw*|EeHDPvfz04qo!ZmIlJS8ulIk(vXS ze!ILWk#lg>=Bb17;4iD}W!6#T{vRFF{My9R z*Jf7FgVf4N?qdivYmpo_Crqahiu2UDM+A=t;29C_n$f*(IhIS(;KML|>!TnVCe{az zk`~CDd~@1U=qK~%9KN!Dj@O>L^sD*BNg4cfb`~;&nf79T;AZr;U3L1p2B!pq7#OVI z!WO$*y}lanZZacm_ide3bhoj}R-)F^>LUV?uI(+gK(wX1ui9IF<+k6z|t4^0~F zi7PMFVG3@}YhUdNZTgER395BXNtxizaykbnS+NWA1ruqyrk;w{6(LwoEp!@40W68A z-?&emk34Z~xVq!`rj%vK#|0-~FoEnoC)dCb3R}8P*?}q6^5%iN>I=1`@bOsQ6iiDWelmJ4oUDw$M2QGru^h|ve@_ghi1%GBWzA~Z&isIFVrnA-)z*Noq`cJ50ZQWI z4jLyG_Hmx*8(_pgCeADi2Y!1nu;d~VCtRa@#F-ioC=r^mbQqOtCIu-q2veb1f-rs*&K3= zEUGvp3#2NG%4cHCr%RmpcOvs{$>V%IiF+s9?KgXnl$|^B|74g@NjmfQlAxApve+6! z-=qd@|B+{YXy8b@JWF=y z(u#7ER|jY8p$%QQ{lZP{`0S)BSUhIfIHr~InGXH{o%3TVWbewJv{+gVi_yp z!TgEh0CD%M#UaNVD*U zSX9#WH_Nu?otvt+Y5bb|o>amO{5!NoTTWqZQy!KKW$=|%$1Ps@Y-6>*?Pav@yJKnR8nL{@0`;FPv?7TLR!bqn>NTBfg=gcPIBJ#ZLdR5 ziy`>Y39Q_-uL5gFE@~?OXKmZm(oHHJ!8k9%ui5O&xJIJ$f@-l6>E@=-q58<5bG4z5Ep4ZW$a&;6aq!%ohX~W0N=a_v&RJ8J+w>i^MDkwBw$7Y0W!IXiZFQ7O8V)_2849PMb!#>2?Kcj^|4) zB9J+sJ6SnNbxehgEm7pu<)^(?IaKB|boy~*8Gn3RyLUkkk^`HpI@?eykoo!O6gW=y z9|sx(@yu%%7Z#5>hm6Je^D*D%&Ko4cOR43OZUwr3r@vNx4S^COv4C^V4?_RcRCk1mTV6GX zBHx3GNvVb20@t22R@m+C+z2M|r}T+F^NJ})R>eAA_@e>d+z`H{}^i$^iHn%^W&lQkH`SgU885lmsRh9_q?Vaz8m{ZCnwh;ajx#=Qw3)3OX# zBUd>`GYHQNrAX8Y2-DXRNJC%_q_qyl&_#(_l!*3N*HAkP~w16mBOe>viaQ zbMVed&I48L=Vm6_r_S7_c3tY%`^J>m65GJl)>Hggh?rf$6jeKlb#C(bh>@?!FnNlv zMI96+LxY=8-V#(v#%HsAmx|<0wUEMR>KQCk875%txb&-AfHpDbm7aQ46hBgJE)DC+ z;D|f#m~F*PvFZz!OmUV1An`r5KtHy9vS(At5};vZov)q+gE&ly~E@-50k3kH2jl9L$8(OZ{b<6w$I^-K8vW#Tm`(eaG_ zkd+eN6G%>MGB%ucJKlgd8oSTn9Wt0U7+$M>?fm#He*VFo* z#<0j5bP#m4V3(%i;qd-^iqoJ?XzaB&@J-vf!&+6XaJYFzzE<9;3f^kKpilbpfwHi@ zr5rg2$47#=CfWBI_z>Kq9Z9C?wlBBLcEeyixv?dAj|+riLCjcrM@#wwiBmWfMt1f7 zR{Jpz(e9gN!~Fz1rxx1xU{6h*TAa_!*or~+YmNM~ zZ<~5K80^HFJja6{N%eP7i-O5wVax(e>)Z*|#? zNa>nNtX5U8M#_h4&mK6zPP00Js;Pu?=N9&Zsg%BipQ2h%C3AC9NHvBNk&>RU5d(GT zGta0^9(d0Ota@5Gxd{tp;k{jTk8;?*odid+qt)%x)aXtqEIw8O9X;<8p+f`pNgm6= z`2y67$GDi-9oMuR0+a5%vjkQG`~e_H@GOfNqcGkGZpL*-BQyRok|{~l$Ig2v< zPK?NbsQK-r?Fxchj{aQo`=#V0#nj6w5w7P!cZFOQE`NB+IS*7)o#2m2bV~hH&HC;^ zXr@gMD+kwR`=%Qa6Pg!yiY+>IkwNTA)P|@U<+CL)GdDjMmKBs@##pll@dO2uyGs;V z^GSEwS)2LE(0b#pwPEq*4sc~pb-KxzDZ!pYjrOL5O~%OC+y*MzJ+~$ktnP!}68ABS zP`TA7mSC<^A&nojnfJFdZ~6p>?b_-%4~lUu_yY?@LftW4A2SvUmwgA(5+%5kUgkIf z;c{6`+SI!Ic=-li?}TP4s;2_J-Z`m1IsK8&ACp^yUuSf@qMoI%x&Z<^HBIkZfTeG(r_3bbIn_23*(FeitSp00biFMC~N-Q@xX_tLr<*5X;Z0exV(k zq62j1I6_Q$V^7E@uZzx=M$knrKE)#^i(xl-xmE_Xg_IXhvE%^_yCcE#$fN4t!(e!s zCcL?|%~I0NK+|$v(!ilY$h*ZQCr9^S?TiG(HMoT-(DmTGpf@N-s95CBE3R`zSdrN3 zB9KhE<2<-K3bNR)e!*2XfQpMZb^b(_g?Hrnn3PSA=e&gd0Hut@ zkJaw&LoMk^=~Shlr`v|?IlDn(Ex$+?xzyh3%THulPGMv;9A%3odD1<&=TMT6NWRSt zQ?3u{j^D0JcT!?YGS@#tx*GbzZ9eT>^h+C>`PZ>^!ZhX1*U15)#%VX1443W4BSlc6 zW3Ic{;sS{T-UJn=e>2TE?e<+{T>EV7my`oPYh?C`zoZ2`OAYk{fsTTm)8Fqgj*f=2D*_ zuy+72Fwa4-;_7+L_xEz~u-~1qQ=lmM#OrJ?P-?))9 z^AJsYCSi}8ebTLaPyZ|@y7&7cJ7nQYuQgEu_xi0khbNyMI`afcZAIxeUMNh9wQPKc ze4>QKRe+}fhV@#eK5#%%q2FZ>0Ey$N9&w`V+zkzWdN6VVg_0|BnNE%h)zMk%jT8J` zQ>Jvc^Lkwt&fU^C#s2J35Z*~FCH`m$nU4FGm|^90^VD*lPT6I*p>W#5p^f(?@LrDP zhP8j@CgR%%PqzcJG|%u0@VImG5ic73@#L~xuGjioqa;BHW3`sqh+x>ROwN2;z~pjU z6M6upxsQ6_?Xa#Sg}dg^B%2-fu9A9dp8Km)|8j&Lvw8?LWWrN$xHbmRxPXnuQLc;y zjp@jH@XjhDXvl~Gjww(FESpcV{;?ULe!x7Gv z(mKVEc)rOvx(OIx-`oV!RKlTt31=dqk9@wHRG5vuyr>+ZBmZKlU@l=byJ;JfZT=m! zkLyjeq@(AT7x z6bJ@medldqboxGJD)^6NpTyS|B$uZXIBqB6!lO&7n)~6j)*iZ5U5T)Zje|T;vanXg zK@K4=xfRtneXdk)ua1dBd)fTpe;hdPSKeBpxu{bJD!>`dp9k|RQ;if`4F=*Q1<#R^ zs|=AS&fTff@KRKv&6kBGr_ng$+daTVH8sqazMKX1@>}zf(bDZghW*cH9C|k@S z&T-6sYC(eTQyXz4xF;2o&0fqoi;5T3m)%2{a5k}lJ8Ff1>80;-8uq`wROw- zD=U^asC^AEV$+!vor3LAkL8oT>#Lb?363= zv-sgK_*yJAHU9KLYJ+EFQjTYp06bkUs0MN!ylZDsyKVW1OR}a#Ab#H4$ork6z=P9f zLr6~K(B4c9fht2%FG%jr!@}w-KJTGn^)STKNLl>HRP7sOrhMB?0>|{m5!MjRd)iQ{ z4?a}Si^Q~k=t!lez^QJz?vXzyeh@E_J&-ll-dFiurj;Tq9 zF28>05hrXb!8%JuQjGbp)Y5WmEovgia#Ue{%}e5IN&sf4RN7Ln zeQq7+yyeD=RDpGFCKRY=S&BztgMxA&q5dPG$S670AYt@DoWn=`mKmtxi9NYFmvV43CiE3Km=N z`D)*e@rung81v=}=DuG2n zi+7vK#l&5hJYLXYa%6i@+nj)53_bEYldkSPAEKxBu}az4Pc)n#FLANP)b7Np+{O)W z8B6`Vem)X;m?`H(@&s`xhr~@$1#wGNS2M%5usnNXf&{yW++~bjxw$fDrmGCXk%U`{ zWsA#}wJyG)+2zt3fFF1dCnJrur8CkR*P*R+c(NaE&HIAuPX(vP}RFh@Z0mk^)mKHi;`2gRcu0_5~4 zHsARoM$4M2NzjBRbLLlqPpQ!snt5-+K@P}+dz%!Hq-aKrN|TfwtdQSH-_e#)nOwoc zu6%uygQp5-@KbX{dk{e|r+L32a$@|`3?dezIaF*MfzkiLcqnBy5$J@Nf8bcO{Wr&= zk3@Y^`SNYKtmstOqtd&qTP> z?mvQ8Qcq3%$vep{uu;>jVlkAfR6aJY=$MN%k#@xTq8iBIN)pH+%ad$n*!4b%S?7rp zMjrWixn;q}kJ^w3|KR1-@qoXa;UwZS=RQ&Yu|RCSWlG5(`9immU~oBR_3tlPfHCNDcFYXK@Tw0SP;~L7PyEVZ_@)?~ zEyjd|yvAIqM;=PH*$P*In;r%)i;b}Zr+Bm*9@Yup8^b-yiIeER9C_SBKa*^(TL+qu z^SF~j@_4rd`&8EhyIPCoOd2QwPmB8#RCb=MN6>Z=*MdJDO`XAFD0N)UQC-aKo-dz< zP3>jKXz}~7%SvfGhy)@FoIVJ#T;H`#u`VWWj41N3NQ4|~r^}M3Fs92*&WZsW`dOjZ zMzB|?IE*<0<8U>LB_WbN+r!E?ST9*1X!Fy`$Pe37j_vgeTuLR9$}b5+M>22sP^3;n zrK(y;v6&2$1bdz|yG_pb50dgC zdOVMtUfu+-7d`rr^`3waIYcA`M;0l^Z(R}ck4kS+6ceplH%R;tuwrj0Nm>CDM zC~uD(Y#SVj$0^b1PkdHVfzg~r7dHW$P&ip476YUjwvET0#yPE9F!p7|buSD?*W-G; zz7sjVr${Ec5a?SkTgX?lw9mYXbqwjr#1R6IOd@XTK~K(&`jWFp0!u3RPpPKQdcQ=W zNXQM^7`fCVC9tu9g_C<49#Hwp+0K#6n4{*h|S1C!+vz%`C4>}Yeh zDBaZ!7!t!ONo8e_$k}ZmZyR%*D+#7q62sf4wo$!}B>NZr!Cu>!Dpod5AyhegW+jMm>cLDKPuS3}35)2La9gfQ_^~ogClWaX3>k2H`Yq%KMs=jA`GJ z2cGKM_j+x^Cu5Q|F>HM4jwe-HhRHivWc<%0Bt>0b;LA2-u8e$Mt`M5a7$8LAE~`H# z+>s<#G<3^s+&f0O5fD<71c2F=xOCfy3I(g!vF+EMWMiAc1m=S35)~3^K9U-@33NhI zUY-l`Yaxvk0}FNrFXH_4LYH(c4-Nc0{SxHTl8gfMI7r>LJ}hRpr0c>oaNlSlX)nD2 z*u+m#wysO?ULJX>0<+YEk`iX?k%}yTWXJViZfeJrx?j5255>5p6O6-2AT?4Lp^XHK zlz3OaMqX#7?F4-!=m$6TsejwuJ7 z$41~-`}>(@fGHYCaui}9M{2!5vY?;fzL&e6!TwDXIzjz09)IlBQ|p_ivx!MmxN_Vn zGBj-+c1eM%hlw}e=S4ut0benvnap5|{^*h|uz1@!XLF-2MB>^Y+`HGtp(w9*n~ zILNWL=OVY()P_8FPvW!-&&=I%$i2D){oS@J7jQ*II^@vgofQG2)%^5=iG|8y{rH@F zzZdoJz9rvpTjyqLTLZis@bA@24qo z?Iwrcqsx9x>xYx)G?`pNUL((#nZadIKe6sMq?@wXl(2{8jom)Pi9i<}jBs8s8Fd3E4;mEIfUj%?30Tl}X zgEFA%)B-nC>-%AOEHQ*H7zgIX^!RiU_Y3FkHo3l&GkvF>jbn~+MGa&`ggHatbmcr$ z44i794GjmbZ1uhZnPzt^*F1M~ncDnUe#)-#kTHArb5IhUKUMmv&Ag5`4WmA}gNHz<$81p8iITDitd-y1UUb5mN0kKg;9`?qRtJai*^B48l4>{dPq{ovV7ciz_Vo(DqI=rd zs0SBu-V0i^BeB$Jul*WhQyii~5?r1_B)Kfe?P6+yD^*e!yc$_|sZ$3oA27)Ep|xM; zZ1dV`x7~Vh8XDxble8AygS^h1e;B;$%j6#N?cEu2k)p|Yp7TLs2P+|sO~JoyNo7a3 z*6V$L`9I0pNqou5R<1kqv6WYi&4iWae5G_4m`w+TU<>_O!a|LLAp7H*`mJ*4y6Tnq zyq5gI!6+uFDG#>JM&|Qf3vZsI*Php&4~ouy@fDI+uzgZTX~(`|+bwr(-*oLeENLet zu5(Gaut49oT;W>Dgy(O3iRKH5*BYRB&aV@g@KGdBh&?wQ!NmDRl>d@H7i(~VElD8L ztZyY)v0dA#L^L9*tl((3na)(3EaS_6a+LFHC;k5Zs6>?jCvsA?Sh~3MQgZ%?Z0eKTHT(9;!<@l{xUA0%p7v@R4KiA3p&!UIb zpen(dF3U%4qy^v-9p{r8sFKPKl?MlAAR{XBs_AloN;hm<4V+#W3kO=w+r zuN6l&w>@wn4}DA4PrY$0KstteQI_V#<&Xw+_59yjlEt4@73mY(5JlPzo?LAi?`4uW zPvZ{K*PN0Ao^xK4sP9kLJ-3<+;WPkgc4xUxrobgt&W2TE?85j+^jd=;Qh(*#)FZ_Q zLQ`D=^1s>4y4jzB_p2rE{k5P<4yB;IuXODKOcIIVo&@7W0U{8|<@uL^&U>GvZ2}_! zN_JMQJ3R!y0{;+mmVy?2Sy#;m%6+0ty$$Q@++)UKXiJDmamdbvOX{uHJV{su=3GI2sXwu67Xtz`;wN`4S&tiJ@dfh+%TA4AT?{imeG@J6 zWH%%2v$CST7zMql*B36jN9v3~$Q($<8aE4UMtfl%#gf4vyfne7p{GK(k;@&kxWHU`wmFS>C0Q&&8s|j1T$74mv#l4H-J1 z`M@pW5?y-_-UpR1?MmPyZ*xu3m+{S#gHy=V*IZ~8sR^K%NKL}1GhMFJC-zP{M6)nC z9w`x-w^VX4?Z)^#w6+}Kq{n09(q!Y-ncB4ljYq~~r8-%>6*c|XrdXdj?}zMlX*Q;K z2{il499WT3>bW5HHRk@DtXK5VX51mt`B)VB`f zyJL{$@EkO&eug#g!kIVcJMr*jw(_MY952`Sk9g_0?Rxdsl_H;h-bo#Yo!B#=^X8#p zf^v77M`zc;XZX6I(@>Z5)d!sI`WbCi`Plxt=RFR|#G*LHf3r^G)vVNq~s@aef1dt;DH>LX(_|OUUZPQUEou zr-7n{d#jZLqL5rBh%O}i@9YNi6hEs%B7CLS;G=&wl2Z9|u^@VvY^vX94q+%V?b>q+ zKi+AH$qRMB)UClsM{>hB{^xjzXnkHfhTh+ghuWXVLv!Qout=Gk$?7k`a%B&pT$>fD zp6kY+q)t87%goQZnLA2?dQaA9^s*JD^x6WE_h$PgFIz*)SL?lDY4kdcab-N$qM5p7J_>FXc$G4=PjO*^0BXN*Mfzl8r8Xr{wL< zhc2;}HzD&9qh1m~2@hl_2K16Il=9%fbRuFDb&5ukBIh-= z49rYEpEdGhha?c@xQz66dUlGLmeRvO)pja4dI#;=s~!Y?tYC6L&XqrttsYbVg!xAL zA-}CqXAaDGHET`lMzTTjP||?TgXQTUNw|^mu4de;pb0eEw1IL`rp@uiQvn-M(;=^l z3jq-XzNATW$Exq<}pPWCBOlw%n@_D;y%MMay< zmsOh7j=5J!l=EGnn_vOaWM3EL-DI6nO_Jt9^GNthou)CFi>`TLRXxWNJCS$vvF5kz zm9R1;@`mrY=5hx7roN>X-vhH$9#5)foTB8~#HEYdb)TNsZ!+<Z!>2 zZjTvOFz8}=B_D6%&Vr&+xu+z(oF47rHUu_U2q_d4w5NhBv8a;3N0RMgOMT_vL}1r) zjXgQ1&J1yKuzw`rJgS0kogdl_qY|5JeQ28QsixojffP%huF-CXEx`&Iob*!eOV<*& zXNGD|jHlR8PNXy#3rw$sV5XMyL;Aq#yXe>RZDgOoF+-8V8y%boj=OiVrdsOnw0EN- zICb#elh6qVD{evk8pWpFV@`mQYj-fYM8`7`-7!I;8AVEaEPqP(d|o~sZnXqUkNS;FZOB8V9OvC-F{XB zyAvOzY!(`gX>Ir=!X|!WbT&&~hZ*6OPoMl=thZ@h=p-&2=yEUXRF6%>^Ug0UPV%9w zYC9#&n_}aaaGS`_o~h*n*PWu}GPy+Glw#VPoOPL##Al$F5so=e9IIk4=}y^Cx~g(i zpga36b}nB+Z7F)>)Z7GG-d76aGIwUoLeyo>{K?=Zg?NgJTeo*v5{?t`QWF(v??&2v z_3~d)f#);}q_wh%sBT-bk#x$Po=C3K<}V*qyG#m#jJEtOOP&jRrYUA%6)R7m1RCX1 zaHZ`W6gl5ge`qUxV1#j6l7kl1^Q{{<3AsH)TW;JEpQMx-5g)5gHtmd% zrv?p^hJ^B*k}=Ik-m|qcH(sUmGOj+z#1_ixB+Gc_Qjy4+qwE!cYd!780}SNc^A=&} zyQ9Zaj^~<|ELV4~2;J;?(W%et2vBMV^iN@;*=*o)RPjp7B%+fj9iZ$q#3r}a=(Ev! z%d?zpr&H%xbl`E1J&+Lh7=kI6jcZ@S^$HpqFz z1-6@rz1X&EO|VST3tBs{?)r_T9dMb-u?oid5f2{9#rCk~{|Bq)S@@%s0(?6R74x~; z0rGzyN;mCLXXR<_4Xl5!6$g#CeR7w&=?HRF&5g=FieE$y(3x`ifC5q^=Qk?C*)N`Y z5w-3}{Xx|^{_EDuV$mgsRK$s+T2XrPHGwiT? zeo|3?Qfee{+nl=G;$)W8Ry1yM!e~Y3-~cE_$lDr_MHGr9)YdGKSZupVJcls4< zo!iTnO<`|zklR!_W#R8$Y&i{aQa1MmPP+If-hl|bb6ZhhwWQY+V*xoxNVBb+EI=9H zm>t7B*z*w&^TTqX^POluFk4L)J;kpM5glLy|A7Zl=El#>{Wq<>*SYDC_lqymixFw# zIz+l{YOZMAU+M?gkQ(G1V|Ld=DP0k&*VN-V(HynRJ}sOroC#lEN2wK!;+cUr!Ug57 zQ!J(BEad23buMc)Es9hP`8w8W1)ht{9H$9fGn^Uv{-i=)D#b?-FSntdLx8)Q)0ZE7 zaFwGTrw;s)|IMXHf#yZ$g63i;*KsGI8_Q?=q6V;hjb0QvE7q++SgDY&S(?0zq43&8 z+1+@k=B+N)IBZaw{?gR9r^SrLHv6}dLM42+Q{*O~y96Ebp&wL57h3b%g1E_rfe+tB z#rv4GN-lP8$-06yKs#+slBY>9d{~o{JJT;N#*_A|>(0&d(TW<=(S>g~*&ZScKGCg- zi84G`TrbdkZu@yBz2A-YOEa2U^U^O2x;$8P%RNONpMm`y)?JnyF9zeu#7d*np&mvN zvzeDNWXx?$Ksk4sds2Dx>HWYvG2Z-QJ(7IT7f&u?iD!%xpiRB07i9t+AD8_RBSDkg zWMY3l_BEEdlduf`ngJ!LzjI7`vJ9)m8}*lJxCP&vAm^5Xr%e&jx_x=0bfOcJc4Yh% zBO7hRYcxaAmGe{O&O?fuqcokVkz+C#ZtVzGQ$hv@9+lEE#d6uRUMogWzM_T+MVMpf z1{gS$qmtOq04UcWmmxQF%jtYR8(8aQ*xjs6B^V}y6-#TCJmR)bf2p6>bU~lDki|lG#`{o7{Q7<+E11lBpRO9_N-UUPht_ zo+U#4b03!}Qi{AlebJwDYBJ4sO(z7}Jz9(0&Jt2D0(52iiEC!3p5A*(aO?CrGd4a_ ze6Pa_a2_jj?aE(fu>*k`X0t9I6`Osd{E+j%&hV6LMCa;LK#^eAb=zn)R=m4}n4oRM zIr2s7n6t3Yq{$utn-X*c)@oTzWvTK#>+l@&iWW;KeVxdR?_M*k3qZ44n75OA_2Nm` z1xh@~F~LE@yf7l2@&n5`7tC^)FEgFob^>?-u(iL@t5(8A6!|x@%2k#u;u3j)|>oc+az7Q*4}dj zH%7VSnHUEJl9{jc)T|bM0uRq1hP~u)Z%Jr;?Gqsqs%Kjg`2J3$_~7ozTxt29sZeuZ zzoa0#!6`Dz$((zx5AKXn{NvN!!O6i;cg9kZtw++(*Ou$@@UNYUf!8u+`coaYFZFCa z^B@%HL35?rGOmQe^ARlvTd&1Z+f8eb;r5iMHOGpO-`ZG>S&Oq_Z)Hx#CI|ZA&m8&L za@eRc`2!0xaJw)T zRcQH~>JRe*L)m2~dJ@Rgo3)hSM)YcqbBDbYmBF>K?PdU)%tcHruFe9R#sg0d&|TOb)ityZpAdB~*Tv2(3X2XOeTdyLn2!6pFSE zbHdeEiCS$rUreD>mC@F;AxdSWTyrcO1h^+!SFXx#1UI;g)-dV-eZ?0ix}w130^Rz( z6=pWU?nlAjoMWrGxbUFkpbEZrZ(lAszv;zL6rTZcsm6o+g&sbD?@fW%Mk)v2z}3W| z{MI^4M5aCT?0F#7C%13Xj1w)UEVCxXz9k0d?5caXe);hHRuXX0sd53Q2uUtU+m3u= z^ze?8lYFy3iLZOvN&k?;d~+CI8+(Z*a~<$Nh*wr5H+;3jNBP1>aL=yZBtCsEtEJbE zYz>X41u9;5O_l|ffEpZKseF=~mjcFbDl6v9)=U=%k?B1(EM6o5h;BHEwb1aQ zF6f8F@tkkAGKS{Usd%@fW?31)=%0aPiUUbF_3b{j1FuSso!1=jc zd2&I0DJ?gWUVWLmP5$qS7m>4%)SIyWTpOEfw!;^u@NV}cRl%Mwz4O~h{yIC+@Y+Bp zmIetn`S2xp$%=d`9IH<#*ePW40PHE^E9Usfpt_v-NcYV+n-6BHJVU@Uf%rxP-BZ0E6H<)tKgL5riXy>U{(d~P|9L!g zEvPCF+mtD&b5Ti6pq3NwU*|M8ZRjr)8=pa$`@XT{Cecn-pF%%J)G;WF<@`%zTPJZd zQUB~qEkbZk=7K%)sOWgpmq6&wNjNpf#TjcMT(Kv8N#e;6De9;;)Kr#1NQA0i1EJK4 zd;Lfq68k|%z|38Om{a&%!8~ekzai;NS5`Gna(=hsOAr4b_kOC4=O<1$Z`-HuHQl@y zHf!CGG9?|`!et4X#yr`kZuImR#IyJ&6Z1^y8I%exi*B~5we=D+Pwmn3YUKFu3zJv9 zJ-4137i0Sum&r*0hrUWsR`Q57DD$iw*lNlaK+6<2*>7Eyc^_lVTm{UqRGw_za=6QE zm7L_KJ43FYvYCr4L<=f<4B;#BOo{0C0URiz< z{%>8TH)hI+JL#^Ih~`}Iy%z6snMs}@>!n&sIg5{4EJc!1AHmV=Q~SHVyF3=ClMJb8 zoI7oivwOOE%p7eK>{hbGB+Ljw=Md=5h@Z!L&+WMfnk~;pch8ej~Fa}ZR$qoSS3{3(f3Sr{1ZCwfpq>w8%@P70uv z5CCTBvsopRBUJ?0;QOo&SaA>wcx?{tymnbsqYR}!Bj3GEIl-UO!;4Kth-TsPu*}0} z>w6_cdD&JxeeIQ#0214kOnlSEEXVV6GvQCyZ2adkETmxQHC^j_-2^>yZZF+(EC`N% z8!}YkOvfvGu{=&FnMiHrnWMzYL)Cb`?VK8mrkc9vmI+2TV)t>TKt6(lgLYDkT>Lak zTd5>qL@;$`VN-Lq``cK)_r%3K<1Z;N(OUzTQqr|hdE1lSE(Q}{Y6)8N3-^>a)t|Mm z7k{+ih4rAdM88zBH@DvB=Z|neFad`j$MO^{1a*RfEQcjPEJ$ozrfjoH*?}@|a^t4c zT#=_KYzzV|wf0fo9f1{SWffWX)KkWM+x=mjm1pCI`>iP_TFxX5`aG747p;w#L^JEf&-Sa* zNDDkiGRl*1Kp|b`@e1;|8Aa~QH}i*Q-rJ@DJgGvohuo==td^ReVR8zrB)p-OSb)se z{>MJvxj?xHE&1}Mv0!iD=wnoPBzalSWL=Q_w+5c59dwzJL5Gdcbxsv{O7nWLEcSkO zBXVq~rcToH_NItBE)ALene#BF*X>-<5)%1XZ=@2~@CH+CXpddnq;xGCG082Te~va% z^wxW*PLBKp@5oyFJFME|Sti;Bqui7SpIOIBj45$xau&mPc3$Is14AEfaT-pj0+z|} zEoCzr2BWXC&4-gtW#GW1z4;WBOAmx?XG&w%%ZSKaf%9q;M#-}49yo~ft97Y+%{#wU ztlu}!ZSE{xE9ND{7V>o}{e1F-DIv~>mpTIHLY+&il>p&16N1(>%odhVxm&9>y1a%| zW|qi1dq8vFWCa2kxig8jZ+)kTIdOQ@0J!A#rpk=nkw z4aOYxpkG#qbRiYjfG8GqISEOYi4pv|b_1aUxPb9eF0&bIv@gHI$}jMZ(EU>6NE~@I zW*02T+<^ow4=@`k$m zvGDSc!OHDm4274U2z|_!LS8hSn1i(?B2er*DCO+S{#l*NRdyD0z{d{$=h@|nb}sZR zPLn(HAJ}{O0*gwXB~`Lq!zqfLKL=yi%3Xu;%FZa=!uL@=n-lcUD?MDY=UA#i zgU{FUn8-#f{1%cjhw*#myoM|(50~&Qxi&(mZ{Dp z!vs#II7(D|EQc6PkGU0;lK7rJZ#hHVq>T?&;%@+Ovfo^Rp0X!7nK@6BwUJbwdt3(1 zo0HzeLR0}0w_~6{%!qVrH=JnAK2c(q_SDy=svyEfE_kXqtj(SXSf0emrpV&rk}vpu zTuF97CCLqiBiPf-Lf7shzgjI2RkWq8UC9h(PBZ)T$=+Lz!l}qQ7*M4EW{Z=^mc({z zz@^|9|5E{PQ}%u}LOv5p$rWqW)k(W1Y1)u%%&1xpFh#S(wdo5?oYj_U%8XPpXOfSY z_2tOsOmOEZ0Lb&eL;9+O7w_Y2dceCdxF8w^%3`s8_2;EHu3q`$Fg2iz*@L)qjcM}U z`?sGRb>ko_lGD$JC&4LTmm^6sOk%#p@5CJW=b}I#Sij@8PM6T1Q&pKgOABx>{?uy3|w9Q8|h2h(i=P%^2mlAbVf>^a%m4;YFm3_s! zjg9%G+Wa~RZ>mkFUVWaBSQN;Y#C&=PPB%@)=QFDss~(ml>QpO|EwLfAyt%ip9zajY z`5Y#vG$j*|hRR0ymqdaI<%FRu$emxxa+)P<%%>x};do9#|M&!hYbrAPqd8^);CYC_ zC|piDwIqsvD>H}YJPk`%fr*JxXQQ4#u&gm_8o4HWzD$|c1*s!-h>|vfp)HDU+&D0+ z7ZpZ*XU%m??OR(In$IPu`qOvnJigya1v^t=5^jCVo_j~(DEOsc+rUzAhxbPER&3Q? z3;w6;qepj8pumby1=$&=rM@yUDK9x3spFw(!O=E~#Q=Yudw+!j%chzCnAGR9t2N&ZJv|v9b$`BY01KZ4J~C9}+qzG$ z@i(z?wJTX}f|@zs*d;tA2|k#>-*OYB%lBtYnPWg@1PK5*K*zuKFyWzaFrSG=JIDQ$IIDdo6K^nQ^&%t zh;cF_ssd4^sDg$L=G7~@t2`X^VP<+wX8p;jeVZb&HW8C3b96t=_=A1>SJq|He9n(B z2D_kuhJZI#sJYO~GgUUe_db{XXGc?)&ro9}_yS^_K?c{u^>wv8%bNT_!#nY7S7gV0 ziuL7Snjbt83UW02{Q^#jK`io0YU1zITfg(wIK!=!xiNRISxQ+q_0svJSbQP=z+jI? z06B5m=XuEq8mX}CRX&s`(BOmn4nitV&#g%rQUi53z2u2slvzrW|2jQ`?Jex&e60KC zUMHOpb$N2QUxrR&pFWnhWIC9*8{L1CCUfMSq%;Zqr#Q>WBM>~_Fprr%C7)(BbDd^7 z*E3DW6B-PF0$!Dz$8^GaE@q&?gSIb|pAx`NhRrMYC+gY(rVl%`&AR-uP+eJs2<@E&&BH0tw;a&?n!lfv=yM3EdilkTsO(M@njWX&l)J_jn*H_}jN!=qP{ zr?%U~!p~bs@ocPXmi|=h-E^liRa1E7e5q2(? zn~ClH{eb3$J_G5`d5848Ii?cc)DYgT{LcL$^m!iB9{Bn4sCL%ho9LKCe)|#lfI2n2 z!1M6bqo?M53*5>XOrc41;%t(4uKuRLesi7)#q2zr&AL9s2c+!c$Rw%tTGo+=lVr&r zA@H7-J?fZI3RlHWnBJaeo>}V0maGDlzQGWjjW*MO6!qq?0c52H)Ui`o&?MV6{R49# z&)WtA#hQ<`TVD4~D3@)(l=#M8IY~PnK1ISoo@?h9Q~Ckq>b*64QoVjbG%Z&=i6`HT zzFyTD*z!V`v7)k0muB0TeU%QA^a-Gip7)p9^|nHHQ^YHnVvlBeO3`4aK|iunSZ#b2 z>~tskk*YYz;vEa9On!TRg5~>cX4l#Ruoj{)6#H_rd1W*XRSQRM3>~)Z&trp#Jd?31 zS?;1au}tZA=A0==RW-ii|K&Y&Cs#LftiK-*9e*AV^#sbDN0a^ci!RM%?H;M=J``V* z5uHTfaD3~wK2_f#7=UGHiZHuo)3L&Ud7X-MCy9)XZn@%g-nvdZwUC4sN*YTl!biJ% z?oTB!lhVi!%tgOhiUC^Z8C;Q%MVxM!83ipTU~C4gfmg|>3=rF@2AhcTz%L{#Mf*fQ z+H;UQn_cn2%6w_vVA-eg?ezyhcGAr=}z6RDo7DW&><>FZPS$n9QrP zlAQ}SJuD;lI;BysL4kkY2r+#um69F11bS9pZN&&huy)jR<@BtcTJ3H^d7 z(Vg7rT-N|0MjOfN$@7-AcHLZ?wB1@pZe~NaNX>teW~qe^GM=#DJN4{RE-M{t{Za;{ zg3l8lFn%F3i%ygPnL-j5cHfWbA;aDZ^|3Z1z4qHJZ2YbQVCtK9&vk8o7-7}sIp=g~ zS)Ud{875nAuO=2rR5>7a(hnjuciwN_Wv=x&2!7nqUY;~f-5`JCy*#RCin2^mVy7ul zAwX@mrxX59&g0wUK9xI&FX?&-0IE}b$Gglw(GG9ylJ#ot-K4dE0KEzNwhJch zvoQEoR`YAl8|(z-4(niN$5>q~B{2?IsVoHzOaaDVPL{O|)qH42z8k7g$|`O1oD|&j zrgRxf@%tnqwC7VMa=+7?xVOtz>iMP)?Q}nLWZ9P_`Q&Q$M0<&6A$Oa!{G{459?;Ar zyAX(tN@ss%-E8<6^S~n~#q$&|3C}h>*96}-*78_IuDcoHG|NjpnLLG)imm$`>@lq9O+|OK_w~2j&s6z9VAq=Dpv9w+`CVYuNhGCw zQ-#m}Tk`F%1igU5d*MBL1F;1iI`_Lwfu=(rr6KoxwDmq4zuPyXrCIVxXmK%Fx;N}Q zi)agC)3KMy)EM@qEkP3#dxAAy2k2~p4}mU|kN$$5KwO}^?ZGzOE^?tQk#1^hP!lL@ z5_XUMFdStM)xUS0a(Y&c@&o5mL<;LlnBV$Hv!t?6Pg}3A+5?9>?C&bIlh*@mih<3r z26FF;+f=A4OPG-(th{B~VjmWbgC)^N2f|2=!+naJ*U*zuQKI^udT_f2KPjReEP<#a zknNRd_-7ns28U+F^v2_rbw7NRZv|i;?VDdo7a&>7?nvS~p2~O6ZclUVk|WulP5Y+8 zgeVarXoC&?<%~UJihn+B#uN5X#{H>Uo2}6lWG5Ed&Dd_iO3*N@xm0V86oO@POI}~n z{77uwo@q+I^E1DQY95J9uSvLFe-im*mGgYI_Xl)y7HoYLo+UT~nrg3J#+I8zx#Wzt$-dToF`nEF}zhYqBpdu+&O=Rf8BA658QfBmQq&f=jMZsz7bQhleNv zS1O;nkmvc0llhi$tknisIMd5`sU7p7Z-O$$7kLjl88mKFtR^J6$W$2^47^D@1R$nL z&qdy;@NfjCx^eVI_C0_rC}hVcUtS>Wf!8U710!=glSfkm8O2|(Ce>mDQx_u*LL=8F`|?M!W5kyjHTgiMRDujpiEd zYmUH1h#()XOl^xNrzJlNIgK}X&O5o%MyZJO{Iwy-pEs|yQ!hHFDrE-Ilk3$~4G=yT z^jWzer-aZ+ss*Sn5$sI}D}L{TWU^FqZMGo&&I2p!2? zOEOKsxmo=~XFlIBFf4z+(y9zxPTV~=7NMyHgLn-p^Q?$Jayqk!7339An{da@t1Vrj zko%k8x-RtAY3dz$BO0|hWz3ZmMN^|-zVA~Vo@}0#!vygD?K#z4UNmF*-|)ubEtqes z^d5U6hbbLg!-wXc(|jo0_(xH89@t08rAHx5ZNX{z9(D_oU#j%vp@f5eo%_uwlDVBl zferW%cA6XZ8xPB=WVBBwC0=Fa{=VHB_@RN$e2G3fL7`jGpreX=wjY*^ze+61f;o*o z3zf)!uu#JNK=fz?(<-$(B2~E;*U=a&o(I>IfaHyTYiiez@wH=k+4J6(U`tDH=Q8OT z`GM5n30ap;CE>W{xoyRM7AZ`E{TGAAo*>NoIp;MnmNOlG_(Qxf2rb1~BesqEx0`$N zVq!MlPm^7mlSgVyVi~DikA<)mJr}}en^w=AY?$zs0&cx&c`&};EUa+7PbqyRgKMhZ zBsM;V##?gtLd{$Egyq|c8eVTZjjbaRpkO|fKE zqq5q#+{0kbK4tZSg1+eh9H?K%&3b6trqmCe;)mpJDumQC8_R>`TZmoVq;&EDZHMBs z9FtUWtkb8Z(R0a%+L_kT>)cYj1h_*N13Tz3M9m3AS$#2=yM_AvGoA~W)0J#%@^oTe zr(ns|jOu@-vt?gLyEO?2CwqmiuiH>W%aiT%r6HL>jt&`b5N`bZaQF8l!G}5Zwpv?zk-+Tz z&uP?y(6i;=vW?35Pu|R3XJ={qKDeULL~esjRp44e{jM*S07RIacVV6?-gAB`k7XE& zn{A4${R)!*c-opOvs_wV_H-|qvG!aviqJN4hxR_Dil{3w@%;j!R=!k}&B<2eTxzl7 ziRIvwB>z5%u6t^ygWg>3OtCxsILhrhC!Y=yAm&S;Du**4^yjn3d*{f1NHln-$tda0 zq=b*_;ke%ND=ui3p*fYq?;VG?Lk;)&v_I2w~x7_?#9o)6E3fhD5l$6U)i+-IlPx4eOk#P$>z1clZd`86lq z0<-<0a!$L)H9YJ97b^l((!De@>(hn*5waH8eHHnRz@W=K! zC$}?E91J5y{`zfts;Tl!7T;sp(JM%P zsrZtV#w1wbN>QGGbsM(3?gIEisl`lJDk^=(jYgnvIex*M(Qo+^CgcJ@-RdfgY2Xt8U&`R!aO2cdD!!6oC-L8#enWTS?7HY&tiy;DzXyRbJtrAC$nt zgo%dLbmHcow%U@(8$c6G?z`-srA#}?x8xn>6`^`0vM26*3s5DP-qVoG1IklLIn{`D z1^%y7ynM;Aqv@`3bd!WqCSQytPU@SFj?EKbYh^K2;gna%i@wbT0`|XU4w&$Il?eH* zraAHu%d(MA6x^1l7+|-2M^0gq{K*r8M<8?AB+AUOerjSBl{9bmdIUNt{-sB5I%AF9QX;7Y8Pr_JA@SB>JN}2gLma-&$}%9 z-;am-pT|R#n*v`Fm*~vobLGl@_F*~~!!gaqFwL&*HH-aOgXjBcuOCNJ{C&`=K3_z- z9b1@XakBE|q8(+M&CN3i&4pRWkC0)>gRu`oMKytREO{z?0NzxKgNO5%yawdv;T_q78qM?px-@(vy?+P>1{SL3K!i z1$ntKqa?hBm9;0c@x)7szStl_ji!;;AxQ0`)%IeF=tNk zB3$dpJR9(t&o*5?otH%%7Jy5xJkFXNAb?^ z7IM9tH9S!{NpV&k`TRkLdu~l`Iw|JV#|?S%x+qRrt5gAUF--(mg1(k z@*xUbh`3m1Pvx68GmbOO~I%HHSZ88Wm{^GGL0CfPMf`(de_!&Ubn{FM0#E95zEqJ3i;s(|JiG z;|oz=*E(j)wGKZZRX`5aTp`=ZEsUe*_})IA6+vqh0c##=2Dy^9zHUAYtMc&XC1c(3wb_GU(MjX)WMs%P9CV2jEAE?vEyAzq{y`|b zwwy6rd^>HeKv6C+DRn`?ZSDhf9!S#Fb)|UN@Z!!?Bz0_*sLA6df8?(tHV&&$0flFv z%Yo`E9spJv{8ZZ|$bt5KBBe0n+lc+aq_ojSp0Q=;mwM?amVI*H-Y1VsHm$)~ra>fy zQ;Xx{CkAn9%?}5_wQnA*U!G05wL2FgTwx+4y8VO-$du(fG$zM`dZ^9qovUeLaPAVP zresiFJh?7`@Gt!p`*mv_1jJ5jF6048*Z2t4Wv+6L zq6KBXT(E6&_Z*`{d5bGws;CwH>%oCt{48u0*i>pq{#ne70CDeR@>%MPxhCV06Uue#(pAx zq#DBE&*9Q2;UCBCW6MG4dcVnx*K}&OfIzVhuU@|!>z=$OK|?D#sh0U`P>Eo;oPSQm zCf__5H0h9&)XF58jQKWuV)hWwfvl=Dnq{A{M8mE#sXIj1;~^VhmF>Ot?Kc;1DGhE760sYM4WTNGE$m(owL)W8o&Ql^QnWLS_0 zrXWr#@D@ybJO?k5&i)r+66$zT5$+higp!cV_IyE-{~t5;pceupOx_k=t;Yu8ELW1L z);yWP z-FY$g)JaArVyq_ig~ng~rUIEpwJnTgx5b5cG9CDWjmlyHpjf{#r5PO$@1{ywm0sWD z&l1S(mN`t&h~WeZE2HzXIK3wYCyAt1(>m|#G#PBkfI*_?LpAm_hT$>5z%VHzK^V{B z^RhZMujxY_#B5mz8UD!;NQAo&Ip?Ab^-z+3ICBt$V_ugBbRoZ;pjn>^Pl4ma-(EX@ zLw7|h#i~Nk`FSP=ZFBYLmG|2JeBQz zD$D#q(KLUBU|qh<%Jl8Ild*5(U&NpN$>$6tO3u_RE{=O06DlCU-wo05;7q!q*Md-% zg9E>kw+{}o{O*s3BL4c`M5`C$Mg%B6V6?Z8SOSx6$!}WVCV$Dqr^0!B6va{lv!vn^ zCa6%K+g>6TDIs=q@si(@0P?*DdQd{gf*Zo%GU+{O_T$-^$jS4ONW!{OgjN9HVI|?5 zgx~dMa;HkyXP$$EK!Vvw`YIN1v&fvt#ed@}$TdNWdDg_3^Syd9McxEk_XM1E8cVHo zD)`cfx5=uF*3>$fx3T zS9ODltc8IbR;q(Ky&Zvz+45tjt_E}EpDSnV7uR#o_u#;&Q!`c_U>1DIW-<<{X`iu16BxQ`Z1=t=f~W-<3+g z&HWI@bEIUFqgrlH-VfE9H(_Dhg0hHK--sCX#akW`1XDT}Ge`jBd4P8*~cG}kI?i#*EP>c!!um1C6G4lIp7 z6!PbKCjZBJhZ)!!9QGwn5{vu-*%E&2^quQ%G_Wp_6Ercpt{t(J;>Kf zu~op2OP}iDtHC8OrBQxBkoA~${d|xs8xoC9v5mS>Iy{*ougD# zUs1TSO42Yjxca6-fa^inQdjiu`Sb783jby+GE7{BWM(d0D$==4+22eyJURuge{)@SS!ntAeMNH-(pPN~fhX;rEx>Y;M=HuX%o zAE^KpEH(^=lta#TC7PKVm1M+6!`{b}Oo*wMU-8yF`XtF<1U^cA5W6PwMi}YmMN8tE(F zGlw<}l! z|M__9AzSAJSy!``|IOyPUzqp$ShApT<8Tggj#WZRihZV|NXnXzOm5CEz0-iPeDgqr z1iKTbNJn1iOiX1XNXzslGlD|9Jd9r{Zl>T)RO13lIJ3QmX#v`sHQv;%o%r7dm?Ezx z5bC<$DZ7((0%%wQth_~YT{T`)fwd;Az7{S?+}32g^P^!D9Ish zy3BV?@P2Y+O?gH;>`+tB)dLRzJ_`GKgtBIpp(kB%{#rFm6UC>}`{M>U-f;yFB`3cy)Y>jESE*9OFeB4~1wc&={ zd$McloPd*-M3*G|(NEcrY16gRaaz@%FBwCvG%KTocIb#zW*9U*2GU!eAWl}I_qcg> zCpg@;$n-8QiW;bR8(TU{#|h{adl9rx>f{$in|7m-G0m&#{RK~N?2@**70GdkX+hJS z+u0)V{b`BsrO0#_P(-&sITMV?&B?E_+c-;_z=fTycv~3J_dV%~x75C@7RJC=1>lpg zFjF?XmHOm74pUS1ye33l_vm1RbZwS$i|up_IF36B4_d|#!?wT&xt;04lIVE{<3F9W zjz_4^VOSI>pswA?1HE%Zn7=;Ibe`i)k~*yR2ZaPE?lk(|xfaDUEy0rcAN1j^BcmmL zSQ=jKL-v=ns?l!G`^hg{789vq$x*nRdU#**a8k-Ja%_~_zPUk^XcDBo`F);v3eG)2 zJ8?ZQ!iIw-Rxcl-XN(-V<)UNIyONU>YC!a2_|#ID&V=;fq#Gs(yW zU72F!4hOaGzfN913pa&x5Ut>xcgc^*H92&JN6tlh&Vu^36M0NX%5OiW707fjJ%%RI zi&ps%V^}Irw&0V*m3*s2;+Ga63-v-i%W*q7$$bIJdCPPx^~V;?m}J9`{r3C)gYBUQ zWi{}8{rmCI`RDPFE&uieHC?>DQ-Ur;j_tDrb>vMYS0pVZ*J?!EZ9C>zTf2MN^fv;J zP4usx061Ep5SjKO$stDP96eo!I|zjDXl~(@ZQD{=F2uHJDI0zh3fNapkvSQ6u*z0G z8$kJy;NdcR9zm+4MenKkZ1NO*oLZQa&|Cy4ItL7R6G=a5v!ZdX8zxbL2fHv7@9|Ng z$q!wV2uyTewAtdk2VcCk2U%frFX|xGSx#sExJ~*aRT^P^G{d*`q*>Z`OhEd#nal2T z$DQzLFxy6LWsp6SAnUC=vi8(-Qg@*l;ClwDOwWg@^Kz4l9CykwM>ACfYr@o@`KrMR z54b^7g_DTRN6O2(4~HVSD;RR2LAI=}9D&!?fi0BWBPb;3HqoR|#@%;B=scv&E@FAs zDawYyMO!u{e*S%a9w|lkEC*{na>apx$!xi%_ay!1&gYs_%OL7XZ8W#M@DVL0R+Ia) zv4wiE`|s4WXJYOgPbaTvy&aR>jpF#?y&d9Co5rLm+T{IWqQ`BE0>~M3ouGdNqF*_r zd2M$R`bWSn=@G57VxGo>lV79{UJwO4IYNh;Uma6#d+V0riZFk(Ys zq=sR|G__7(!lySb`x1jACA17ni@ z&FI~5juYuQT;>mlmR|pMXh`O|eQd|y{2U#ZpLN8+$|yg;E3HcXq+N|x+KP01nCTW~ zt@S2s!reLdNOUDt+}ZS9{8-RtU%nMYi&x%!OKR?%J&JzFSixrRRS+)stK7D2Zta0W zrTSXBwZHtD=jU*04wiiKbFxgX;m80vG60q%5K^? z*P7&st9ay_KjY4++omykYUzW82lJkaMfq}xthV|R>JKX-LGPcnsdvnsjgJLJaMyZz zJMHdd@0LSj>RZwI0z__pJ?ou=!nI=Er)gSZ7v6z>Gug{;4yLUP9E=LAfg1{axd%2? zPi&J)S29KaTu&mEywKOBPE6yBe*=Ww&ZQFJ{a}|I zzT6nha{fi!8geb@r{vLKY+lCaEV2Tg$l5+AHz-u5HkYpbGXePfEL(28U-Z;z^H-)T zpnZcR&hNA};xt}Q*|b&gH#Y&8N2093W?|MqnnYw$}yS6u)a zjqlB;>^nXZ`H57PX>VF~NpUNeoRsrxuGJN6$OS~@m3Pe?{1dY1-GN8YY7MTb$tAm~C} z$3As6S-AP}B}3lJH(i-N9u7SRfj3`HQQ*{}4cT+ECA*6eE*-%KfsL#6#~7(_5KZh_ zr(KqgIUOf@I9xGvkv_}0yoG_X=fDqJk^c+rQuYVvVw)(R3euZAlbG`IbBG=~BB@6L znlI8334+VLoc`7~w>zxjw_FCkvLm@ZVJxS$8P*JL*L$bFm*Z4sPHD zM8J~o-i>k;hlDHeBUb}~i?Pv*U6X@Wt$pPLV`!v`+)rz=` zU)SN(1YwNIy3;PwsmV*QL};lp`Fu@g3XoJ;EVOVAEyYQHKWt|*CrrvZQqe!}loDCy ze*EM>q_oNRkq8-dTZ%mgt@ynq_7!3j}NiBJ`K_16l7FZxnT}Bj5*J}b0lP?Z7YfOZQewZ)@Ro*34%vZqA0Pk+pB-r zbSL=Q49fkv1J@Fo4*se~()X2e0It|SOD|W;|Jc6~sK-KY?8&RbYOYjaa`aE;fdOg6 zLF~pfs|GY*Xh z%u~-F+2_Q>_Ru$_%a{C)6end&SIS|BsQ%bS-^>qpHxF-{>v=$%6?Kj=%X>UrJdOKq+6No% zcOF$|@cJ0=C(y7`YrM}2$E1;Om^`*Ub(&pkGfi9U9Hg@LgxJArW44WHf%W7o53h2r zvKdOQduBS~=M)OHLvm^D{Famg`LlCLhn?92uNnj8Q|?COU1u~mC_r|+dD!Pvkk}HX zQlEZiC1twZ(_@)!jZNQ*fP6wKo1bg`#r5MR{aH0n#J%6Qpa`VMSB}0@ojY)5oqAYF zt@*4J|MPv8CnzC^C{OVTAh%jJ4^n528gQv*70mpyILd+v^Ad(Ik-u#7Lkn6@Tts6R8nL?;dP{Bn-Y z%+5Z{v1zTMvZoocbjykPGh`t0NDCR1$_=KRb2Bw{0?oduA&aa<#}t{8?0kM%@WmN` z+7V%L^K767^56Pdk05nX8)JS+vB+krp}2LMmq`{e&ERiq304Y>`&ZV-DU45T#sJku z&Ze$G-}%wDz=K>hkF6Cd`e6bgiWXbs%BMjWYc9vu!!Clu^F1k_ce#P6AIi-D|{3N;tbFe_j4 zB>|v(l($mFB#PJ$s7H#^6mWqAJf(=ysgedhdva;&LfbeAgnAR)GmgDc**7sJC~f^I z?=4X{ac>aoSQ*MD;vro*+vE=>IW_S1WUpPZSEsmf?s2jjYwHsWC+|;D$A*hpg(;SW zm?Yg)PK|!M70py|fg~^Us!9I2DdH+Ol2CQ_0DL5`CqIlt)E78+1TmL<8l8qak&)ZX zk_W+4OQ=GxhktdF>1%hi_p6Fb7M|*l#N9AJ&Uyx%P zy#CljzJA*muPrMD#=11y+l?))dSUyThjy4;Jl0tkN^B|NR&p*#rVkyQ<*7MAd61(y z#NSPA@T4hzUV(D9-*U)Awq$+^m-l8wmAYm!FU^qOQ`uy&7p%DB*9I%>^5}Zs7V`2# zE$jtrtbDTg8muO$c0r#hF*xS>H`kS!Z395b4)B~yW={$7(o4U6uZsZnHLYOYiv)8` zz|8|qX3C)rr0@3H_h%Pb^F&j$(9Ipg4g|tAQGz^!gpiUy{k~Y$PfAav>BsjzSD)Si z`gejxurU?Ue9J|3njcSJpKF0pWkT*{yzwC&UU<5xBDkrtV>isrZ46{c*+bct-A`^d z-N(Tuj+i&f=fP;~I9S7>qFII+Gkl@{nmHRFbDyBAE=B_U+3dcoHM*;L{-Dm#FOho;J2z(63|@tyqspm zst}P6_N|8*W|>SJVA+HqDE%#|pQlQoUDa|_!iP$pC8r`q0rh+?*-7LHjRR=`p@#?I zg(^T2l>=z4Ib9{mnU!x&`Ze^vaV7uDc<9UrwA7c7^w;B|t^9dBWQ#HN*nZ-O`9y@L zOds|T*0G`V}X zM3FkiMhf3K4)ladTi)z2%Dxt==@foGnD1tb7hDg3Bq?y%6Xh>Lxq;~=7jI7?dJ`R% z1*Trb6Lgl-dcyq3g>}raYYO4KwS4X~dB*0^13e8n>{Xtppyqp-D%<&?M?6HKMva%k? zAk25yje3G-gP_U$CSK%~EOTFbqwIW8dP}SlkROtDg~<~`rhIcX2?NEq80d~p^@q)k zHS@1OY$?}iGHLN@OKwWsYY1T0h~88M0Y53!E@qZVAFD}LV9Sx9XAN^3=gyTR7p>-s zsBDvW?kSXK<4>nNWec}p9$i7Xw(p+z;BsbI1))s6-?|&kBE1|NKl_)-;>Uh>z%GMJ zDp8@lnURc^+;HjGrurXKi1pMQuR8AMz|v2hb(rfJ@K%f{EFP+?+-~SxzEfJwT3ypP z)LYP4QK=~m^YjlGD7T&Di8zz|Z{)dRbOY8pQhDq<1ESJpz0G22fV>03=7n4HWd$Kc z?Yda-Vc@=`63?lwuWib%^Ip}@NgX?j<2=-z`eV0i8QhyJ@bZO9)45wNC~iofl?qVq`-XqplrBEy!V%_K1FX?5$vfsa zZJ1lBSMyWJf+T78yw;!&{r+__5=-p+}9W)o+#LWNI%lI;0Ppm7cv$;4iW&~gQLYSBva)$e58s!k0ww9aroZ4N`O zB$VTzm2z=Tz&XTm8@FYbM2b6Dc`{;Czb&s#0iJ0F6nT|P-sm+Aezttx^I^8B5BpIF zdjhLZ7PXzt2PrJ&Q0KinNIqGMylB0q9t^I7RKd)q=f6?z`RUAVBpwACp0&gdr|M#D zdbp{pc1sjFqkJ5c+2`I!0G$}{sWq?N)GisT90woM+(#>22yQn8gv2Hb)@A682WEB4 zO;gL1gL^Y{;G|UYRBrsVpSo3{oB;A3)J`xSJk$>{>|LoC=4M%^I<&p>mOi%57Ko-< z@t#WKDD0HKr#) zLwWupBHH@J;(G*ToKL`gabc`Z=kKH>Nwtda^!?m0k=0VoCm5q!+K5F^Mi84+p=9aN ztAc-$^~$+tK~*K>P^P~u!wyr8I}iM0fzbyMH-rxKkU)=#8A3m+S#&cC#@u|*bGfm3 z@`WzK`emdMP&twJ$ul6j{3IH%F(h`tLoC(KV==# zF}e>ldbZk?>SgYgqgX!X2k)NqE!q=JP5$VFyI70|kXZ8Ky>JBHP=ChNeYm;g{hjTc z=;_`&{f&GM26pF3N_e&JztRJs_+a_;PHmCnxwKJ(295I6JCi~V(bFaz^)-^5`E|pZ zS|WRj8@*plJJxtJSGkKCU;FaspO(+8qB-Vb{^jny7s4JD-E|GFd2Z5^e5LYBh`xTP z$^s3^tHt;(XXmo7yYNDutk0;H*_M8)pPT0dX~Uhi#Z(48Iom18);Upr?VW#InXTNl z!RrAr38xl<@PwXrYC*sB0Rp@y1NFxecYXGtFOO_SYDU~clwq%~ja zvLM|smGe5N3_J;2n7B9Ljrq*Iy8?cgYiw+u6KKocc?LX`+Xw&hB-4dHphRPiN)w%k z|CxHPh$u<|<;ZQ)Kr~%bcfJYxkyHN%+`q{1Ih8zR4Q&oljhNuFiAMTVD>Q$x2?nju$hF z)H%BC`Oua$7Sx zu)g&2iXhs%&}pP0yW3o2_7jY}n&#z(B_ahJC2?|*KL*(xN=AwFL0_~ZQzi}#@|7w~ z5PL77os-*GDU)57ri0dTGEVKwCn!7?tMZ-#P!m&fk#dw%N$}Ck+s=bO9&L66u<4`; z_wY>2edGGN&SgcfW5-MUutSeZv%Q9biG_p!&D*z`Lm34F>yEa;ZD=x`ez{d7uGj=? z)T)DoW=o%}z@DMU(oWY?zlp5HGg2w; zom|DY)KH_t%Q+PE`53~gF^xam%TbXC*^NDQ5X3iX%3HM zwGGo|GSJ5?DfS5>;c${(Vf+1M}3*xLW38<-+kkDItRMk5q~i z1+{yb(c{Yj?Xk_6%GT0@tF;f~>@O*;Q;Iel;j`|Doj(7T+DJ;M_?>DP5}n_ zjxWsww&TIuDR_p9)oJxSh@_|2KP{|Fu7xH2OCCNifDm4eZ9Zj7;X3Fe-xGq!kuo;b z^vVIwAo*kfwdNQyK&88@ZDjCyFdFaq6!sDg1V6gFXPYJ>*hl``l}Fieo~7&^rTwHr z0hd_x%7?UWo>B~1yrHjK(!yya%}b}qa@o4=hFbNQm!vLkFbA#8C%169EzIU0r8??w zky>_k9>L=zzm6j0cK*IISh(6~oRo#!1MSFeNo`Qbaut(vp_`qm2s6h(F7-hGKfY{F z5lQk}M%PJvJUuBs_xoiE-(r>fx}<%J&Fl$*lsb zDUZ`(CI*$#<3R@4_cM>iphpM(UKz|j0WGU4a9fVL;3?#CR+}N6#oTitHP1TjBBn=l zBbc8gNK$oRZAuTa!tZ4+uvlBLd29i6G|m3^MI>2LT_oo2wi2KDAGEY@|Jv6yg=@lQj)n_3;xzc#8l0OZIO66F)4PbQm!N_ z?6om}brhMZ&h_@l7w4EY8=uzbSKW-6feA-~b;)a+QP(fD!#QWFxHBpBCjIlflh0~~ z%sFfMry8G)y@d8Q<@N;TYC{h;)oQ)5iBi}RiXWtH?e@^{J=o?Z|0c(s zlw#gzKJHwFbGPG4u2})5cwm|LeV1)W?20OV7x+4}NAuU#WjfX!^H9 z+G3Zy&|}(Oi9FZYGRpa(W~as=;Dz;&XF(esAR#P#x67t*0n>q*)cN9qlIHC?7OeHRxTxFcI2HS#}e%+Mky#yWRMJMQNB?}MU${_B6#kZApv|N002{+GZ0CI94K|L>vF{KrG3pxc=?r76fk9+{jf zHw{Z8j}kj)@Xd`~O~Cbwf~anzL=&cS!{H$P6NpxOCG#=&0IeLb0R!7+#EF6 zuM*UEs%FZ)@AD>9^nf*%h;tPdGAG-bamHPbIONv$GAAn>j_pbt4?rg$u zis+qh*~@-ft@de61j=x9Nu+g7VyQwAd#AZ z%SG?sgoE1Y;m+Nqh_mH_zob+0?oB?{v9c+`2Foi?;QXw1=NhT)(eYQ+9S!Az3>T~9 zJ29xqA@sv{^yX1Jc<)3L*R{ebx{vQFk;WDKb5u$EwI#(iE>N(?l#)s1Wa;4|+&`sS zVZD+X{TT<5uR{n-@S97jiAY}x{M7c2`op`8W;IpiGqGkewQ-3y0qnTJ+10RgN_fOz zm=V(XAtayz!q-8?;8uXyAx&8^9-g6d!)amoJ*6I&oUO;DV~lZdP7C@+^t8 zTH3dn=T;_P?9KT1?oBsfXj-ZKEtH$pq_E!YI&P)NX#l|IYj-NxKM)i=dlBKT>pk%W z`@9{RQ%msGDDAq9&_U{Y_mrL^o((zR4&mijjH4!WK~-C_B+L5iE0xjL6v2YPNdkoi zl+AJWsvJ;oATHH+j=k^5`N}#gVE)F$=H&4zVHTj zn%pjD($7!rlT=1SPwk1W7V#3AzS0q%f|oaf2e?1{>r%q(@2DlGMqlUJ3*{vmJs%;u z1?iW%`$sU<&4MeLMSfO_QsV80l5M%zWiK?9M=lKtNJpob7b+xv95qRbjL9l^b$#myL(Tq8??>>uCY`EuSkpO<|pOvLFGXXAU zYtCmGc_+hTXgi=+%DzQ(!JU|Q3if9%EL+jfuwDq#bwuU#|~-;h990VzoZn6sFrz^ z)|F@b@*CqG4xrOgL@^rCSlFD=c2sN&@_B@*r}KgveH*Df*#SAClVj5dN{w@U7l+@& z=x4bSK6zYQ)NR%r-kg{Kh$QG!Zz9k+?l0ag&bLei%=xAc z&j$DAGgp>@F4_ggukTLGnDg{JgE)N0GuFm~qPw9)|}<(FjiY5K>6L*PwSv&}HK= zn6S7Bc`uev92V5MluGlLz(w#tKNQI%?@`ptPqUwsf_=YpeNQa@Zs}x3aBJ4Uf-3fe zV7oR`9;TPs+R3thw+H%&llkX~i4)S%U9fkcjv?wNXY=(O%rw4k5^`(h5j6S=xF!c2 zJA?E*u_NIsh4I2LinjMs!sN$HI2UBS+9khEcP=}@TwB&$8n>jH4Z%D0VNl}3ZEbAs zzQ#r};pyA0&zq8LeCN!^&E_pm1>HSuZFa2<72@Lk_m(q)P0pqI{&z{207{41fASN* z*<8K+$2ZkM(%I7z`Ml~a$MLDD#iS`e5{d1cAbYzPfrIFMd^2yF(J7j=%Pr$}UI*Vh zRePCu?@GRM<#^JZ-+Zt@K7KD-?(90(Y%+k0<7{GEo(W4AUU!%`vjzly=={F<^eQ?E zmo#!Qn!k~2G+Dv55m|l6)=*%zsFaimMZsu{ivpn~GfnNCL1=ytp)Q_n7PrurK}ru|~nBh}{Y>xK?Z1G8k)ycAr1Z7JY)%TI0nt+6s&CmNbinj?H& z0lYXCdAhhIgbIl5u7viiJEjUJqP|k>A|U#fc3EngTU+wA5@4wVDL1A1L$M`^fFz}z zO8#t?Y$h%IkNp4&*&KLs2FI|uNp#J{4-TE!our6VUlj(J%x82TnFdJek#9`GQ2okbuzXPTrWwMlaj2JS82c4!rE!t~IvVp9${D z3F4z+k)4goj(1J3Acet6y6Qm9Uawl~*uEf8OQ;x$kUc=2@{i!Tzjmy-mox~!U_?9q zDMpEGT+D`)vxI}N;*Lty=S&PLsB9uXuKj9sada&RnfyZa2*6wet8B*%HkiT4!LW(S zOAg(mUzX4GnhjGs$k$u&+L}HYsa<NJpQ0Vxt<$G_4OE%9l^ZBOrSO4ZhLC~<|FYHG@nzA)y^gPsrEgY z%E0ry+itldG1PVuusd~zEQwJMl}4W9?`+XIHzRexg{YZQh9%`)CN}x5tb4)V>WCXd9))M9#Jol(Gl3QQXY|EOFoG<&Mz}-FyC-xg15o<5B?RJbe7m z@JHudV)5V^b1)Y+2^$<3FZIJr&eS4f0;TqA4hS}VQh73G(s^%7S*Z5c&~e?-u2{s6 zye`M1pA-*Ywzc_U!9qts_RG=kyO&nNRd~oVS3$aqYi|s?JWX6VBf)v4!^p#}ErU$h zt=nlUY^E1pmR%lHPTzs;$`h4mS`K`Wu>L@fqa{PDbp*$#EWQ^;VJ`by!_nFePDz2H zmAU{Qc+XMKwLFeo^n*-HP7eJU#ExL2#QH?FI%6ZlSZnCJ{;&M9jRHs&38@ZK94oUXGo=5%ggxKVF_7p($j;D{QkKM8@ z!Lg~}o&;9mggQb}PtGH2g#dyim6OKEMZcy=9Ab;Q+e&Qt{QJ=Q$(P`U&Vk5W>CS<-224N%42_LRO(5kx{Jku%>{ZRw?HM8E3s^m) ziFD9y&b=|6$pJ`&BptKm{N>YbjPe3dg0>Qgj-?Q0V$$8J6M}QAt>PwObpN5g=u|Br)?S7q~K42bb zez8tn>bl*}xdXKc_#&aY4DS;RooqCEZW@8@9EU)E6USk92=raiNb={HkA1l-DTI>S zcc1FuUBYi|MnoW|X?+D7Hs35r;BAa5S049HA;dyd9bHoZw?AsupGnWhx_KZwk9&rQMi;_d;c`U0^#4&?p!L(ydeg~ zgr9Uo16*zXCvlISZ<2C&{}{<`dBfJt=p7PZs6}G!OfV?DGQA7eY>Z$^naSx8kW! zD+!8x&mhSCOO=xV47@H0!PbbERK0OfbD-rL(jQE{u ze3;A0Orr!U?2okkpHvQDz{pRUVA8~3j10s`D*HMMgEbgA+*HX|X^rPZ5(%}x!Oyyu z@<)EqlB0b;gc&Gcl3e+m=4r+O7IlMOQ z+9VsYnSbW9j4)F;GZ;G=zu%lnIaDVwy;P5L*pqFh(qq|}XYQSN=d#qEHwC+eRVltm zAb+sik=xcfPg70)m-`(aOleRYd4*a+Em)8NJ&*DHB4u%2hMY_U<%WiiPbvyW}cH@WhyIy^q;BGj>WqyN}@pP@qvRsx9GNb0UYZm81Z5DZK4~2-_sPJ??ZL$9m(a5iX-r^e zVx4u`X7q)AkeCQ`X(l0?wiz0F^3HlD7rmXY`?OpqB0EcC+nQ^t=dt9)2g?Lve5sTz z4(Hk?5NWsE?{hu&+w>}P1?}zN;&QZ~EekRf$!kd@-^<%Em)`_4A0s!UmuGbVDOsC< zDz=cOkW1hSnXW|LgSO2{g+h=%^8vQRy96h#y+-RQnDrg^WUP)$m(zJIrk13ItqX3~#T_2) zD)B0hRkt&L#=%&*9C|Rb6M|DkkhE!*%qdTu z6o{LCkVe6J1S`DgsCL1FvMIX zKjnJGbStlgV`VO1{xax_uf0+l474GkjPy+m;)E zbrpnv>#QC7!iO}ka=Y>LOWVkfNCImL@NEVjSMKj&MgbR8F&)CKkV zSw4OBoSOgte<(PVmPk9$qyIdAz5Vg35!3O$HPQgNwRsV#{)n}h!zD^`E;~5FZJmHr zP_AYA+e5y;+@gf}+k(>AnRCtBG0d0GuhgCM%G!-_x}fF&dW}0}PlSF4$WJEOWcFMK zCJ`rt)O-f+jIRk4m_tsE9jzyu5;MAHpA1fRj+UD0sq~&2GV#eZ)U}CWx56U#C}M@wF8YSUblgZub7Cp|Glp1kEHne({=>dxfC)Ud(%i7~0IS4N*srX{^$ zX~)SLr2i86?Fo0o!7+&cCAiVP27K257HVf7yEdyo$;WU%)lKr{TmJKXBm@20sT+;v zg&{jLxixjIe#ES(J8{np$v2*w!96>+l=Yu-3Y|Np9u@P8#Ah+fP7}pHd!V)s#McxT zOCz~40Vc^f`SO8p_WsQw%$!ba0jpfE^%qskd-0t1FtwC4A5%hOT2MZ*W=`gIOSs8t z_)`4Li*-a6jOFk<@&a?m=75IxzsAoRovJwHoZ?&JKsFnYg%lGFxyJ#AergeTB+4o_V=!r|b~{MK}N$MohIY2|_< z=d!073GTF?l5F^r{KS2q?CLOVK7x#y!R6>4;7irq39QMDB=tEJ<;Zg0O{)A_QtdI9 zY9V*mb1fUToU?$?YqzTrklsa%VCc&Z?1om24z}1i*q*$@+)0y~^Xg@vk))Z-IvkpH zkbd2D=4cGJC*@P3_M3{nb1>iJQVXPcmJ9$A$tmv8z6**){~{g0gvhoL;u!(rM|bwy z_#L39=D9ZPJw?lgEv6S&8ZPWQADZ<>*z|ymv+knizL?Fd=@)|aBPA%d`qs4xlZ}EF zr{YfXh)ndpNKDz30|SB&*>Ne6l>1XJCqKquYx49|O7}}mPb~WgReOp;vM9M5j(8tx zl5wLm2bpUC<@+UVu~jSeiIgZtmEF>54kCfDtELYLH4lx|{;`4RIk3%AX+R4v8&Pt&-dxQ?EeDikl|GpE57qto4Q1@2=S%P(}7Z#TZCXZ!H8(knLId0 z5JKY{8&u6DgDpGSTyJv?pFewH+fdI~{A$!|@4nG%BuaYe=Ug)*p#;$T`_-3?&~;fG z+L2hd#PMS##NF<^jLD#Lun@gUHTIpYv-bq6l(&065i&bnp1=ql*?V1a3Wo`bEviSc z67>FA5k7TnZc*PwL!e_qJ?4m%+oaQ?YpW zDYcF|E0qTs?9_HiNjt+dT*lmo*HD7=_GwkZShm^FHGUIY@~7;E=D*=}%uJ^DGJIAU zqFXNbPO2SIpMq3ATCjFPKx(cnm*KrB9Un>Rc7+9?OUXdu(uyqc{XyW8INzlMKdzg* z*sd1I7wkCRd8ovJby%@SQZ1%b+K)P-E5$0?cNWQuE8bV~8mWnQR@fY=0(z7yxyDB_ zR~{nK>XoubN_4E7DPi~}b+BLrIM3iy}sznTA zPLiOvk}OHex)rR*mfyo%>?$Lu}uidJ(intdXir^PN=WFw3*x|9*~wwX_Y3uCUGS=oI5?p8}Tp4no9JN=s4qjVmLIc zy@!TI5an!!u^M7N!AlA5PqiUao+nuvc7HUh6UbR-YBTfpLn=zKebeGSlt3IQQfyr2 zW>3+Kx>+<$uKa*cD~@h#67xkRw4Hp2G|_{H9`uydxCc)eyoDS{3s`U`25Jfbq`6Svo$CLS;9_~nl3XsQxPE608B*4`v{$Dfw+~DpY z8=Kdp-Cs8HykBVY`z=XDjb+rM!H_69Dcth|?a3!8@)R6n1)d+inE_ka$&5aepXS-9 ze6ZC?$h2>InF{fd%{OJ2dQt6R_J{K~`=EShf}Abhb$b7~PLwG;lz7 znC!5=5T04edh509ITC}hDT8-dq>|DbT-f*Fk#w$xAI&~$69M^opC7rwuUIW(Gc$XU zf@s2gnsGUwsUdQ)&r-5W)x8zr>?`5t!Z&4(TILLt+dhW(ds5A375@OAQl%$aKB|fR zO0$&;M z?MLqjOuW7{XrvMkN(Giyl3=MERtL;NW369f5T zN*RE&DI#-Lo2hxS=%xZoDKK!pb1+C01&nKHZD&x{>9p&UQCv*o&~Z_nTy*K4poJ+P z@4)d`4D&iui9qEIE#u+eHVk}I>nu340X;o{`ZB3MIdUCV4wfbH6tX1^|8P7%Y{tyi zwDOls+F$(Hi#6SN4XYUawWP1=iBk>Fv%jfe3}_{{;Ar_m`FhJ#4}wn)VMEdpc~NIB zL~4d9@oP)XlU%XdW1?reUIDlaXm51KB_O=7DZY+!A3kbP$^bX9E~pfT`q1i5d`Yx8 zgVy)`<8fx?l1E4IfE9Z^Ez2yNZf?tMEnzOPFX4YD2J+mquB4rW#b+-4!dz00K{m!; z8_WUZM~7 zw<0i_A51vu`I++mIBzA^ld>cjE|<@D&MV2a{5F1<(<%of`pT5cM;6ss-c)cVF*{4N z7o(bqu>SUlT`t>8m?Tgxh1Ew_&91>g3Y%OC<|dJcHNPOQ*1pPT@HZ#RZWO>FMZSP3 zcxcnD*PYam+dJ7#*u?qeC1*$}g9pnKRKGJ^O(n3}vPs)=+l%r&AEP=uJDOej7Af@~ zu4_m@ja$BLhv7bEIb42Ue}7Awm%y{nSvjHbx?3qV)I>xbB*f zGL|D?)Z8h)7hiHzr{*3Q|K$E+72Ir@l0eFSgPPN^QtJv1O8QLlPLbL*UPLg&WVFh> zb4pMUd)_M~VWgU3qMGx`H6>S{e}^{lxjVaNp24W$Cw;Qr#CUguFOIZ%b-~k5E<_&d zXG6H1K~ZaInN}T=Vm>EwhSu{9SN^UB54nNdH&TjIVh<+zN}J)qR#`fcs!l)gg#3?$ z{PQXzLQMw~mU<%FMqdHC49+VaNA4rl2Ojk;nUqUIlAbQs_!_cdF3D^zXYKWwNW7(T zTRP3ro%0w|gOz6Pb_U&AWwdCW$CzLjY%|q&TS;R)Q4!XHc9aeji+476N)u6~4Ot9+3X_#bVqAV!` zEs@z{DZS90FZM{-$*nD6?=}razo}&Di z%q4P(y7|e$IqRjnL6I|$Gzp%Rdxt(%ad8M?h-*m>xiy>PxRsZe)AV>`lyx|2q@WtrEeXUx z@ynH@fq|B`ihH(&oBc)aFE=?AZI0~CbC+Cl-s`ZY`=szgoH;ou+bc)h+KkDMjqDU` zLl=vfZY!IilW+S>^XIa4M$(*|3vF489VvAt8dX80m(yOF&@+=&8Z3vp>Lt2y=EHd; zvS&W?vX&|ta?M8J!l~gZjCBb~a)}Ri<|eqZ+AtB?kWmS*YR2AF*G>$nM2e4d$@=U% zc<10J6u7^S(uJNE%Q;BO zxF7-N!V($wl&6#~XS0!C=1)nF6V3)liCxna_mXh#w{7-`$*kyB=ciwjHlIc0Iy)Xu z&!ydRmUFTeo%qyfYjt;K29BL4>#h(@rZa`p=E|$4hqDV*VqwM}cWW9qh{As>Q_PdvD`RsrG#& z2dxC7IA6f6I!bGUY{`+*W1;qV^cM;2PQ9Op^#W5nN$@=l#O&9x=3 zZ2e4sbArBr>Y)}5u36CZb1m%O_58GV!t|k%u$1yE405}^!YJ99RDQg=PBJA^(&wi; zGIO4{N{er3$tQp$`QppN{4VYM?jq*!yyXaRkap6KJ8p#T1nY*SiDen|hP4v7{g5hu z?O9qNNchF0+ECg+{1g(k69x!ioDu~MXgJ;^%Vf1ZcZ|GwYNUCmyxA-~e71mcbaPoL zX%w3RjLB2t9oearPQtSWhV6~A@4Iq999o9&~YzoZMROT1WXXVCZp~ca1R~5^|&RK(P^GM z=AsLGb6t!I4r{dMH?oFh)YRo6gB~P73X8%GA}H@haOgW z-tQWpIH9=2DH~s%ETdUc3aP%i zQzi?h9d@faF3rRDEw5@N%aa25Z9B!E^4=Ic-=s zvvP82LlE^lI(YJ60}To{!Nkl4rvQqF-(1q|%Xi|bF2j{S7W`7a7s=*{C!`bi9BCZE z?bcvVtiOwKOg*eKlp_vhl9p7*o^Rz}Min<%;vLj>lMvcmsU@#nDXdnCZOb2hO{3Y_cfnXuf)1f-y4b{FO32M{#aF z({ki0J}p4CJ;CJ(tVs_=XUK2lJNZrdfb&oc(wCf(V78Q#?CkHd>Lop%+JCE2=St)| z3D8KnL}#8n3%=R`O4pYFmnX84O4yQEgE1OCJyWTjZV?sNaRope9hC#cHBk>q%w0*8 z7Bg~+&oYiE=I&*y{Ff^xYf$T%=TAN(Cjf@4MacXfZe5AuOn)eM?lpS*^8MGdtY9`5HU&=Qi+dilGLj)n9@1cwK<~8j_DM~EjGi&y% zLz%y?(UUiE-#XbeA4xD$M?RHgI5dI6A64U-3rA9Od5~-CkigWCW?g?DOBqny0(7dV zgBXH6lk5D=vP&>6aXUfg(!3riN-@yp+RgIPU+VKK5^G{t^8Kk_kh7GxR6AbnvMEeG zKHobJcVg^AZR70M(UEcuw3wylBKIvn7Z!dku`Sde6KJo2;!o>0hpqKSusD%|)WJj6 z?p|lQ9~{5(0g~=IX*Qfdnu{Jp(8(=&ry40j=7lgcFEBnW7#5-9&wHo;_x~&w5$wV+ z%INLSuNw6~UNs_?eA)FYu{X6u$JZ?SXfega#QuajN!ah~^i0$5OECF!@ zWzK~hQ~>l{k2SH1ReGv?_MK=ScCRk_*QH8*(#gq(m|j4JF%jV>HT71t1s{aOVKRp~ z>5J*A;f-g3YMAn(VZSpCO9iae-%>#t_r5&P6JDOn5655FTaotIwST4gQQyI``kLPr%5;(`YS*-hv z;6MDKlxg`0i3cg1UrUd9?{u=R1lJv_MXo~eVvdnu(!cVjUV|Tzn3I}*T2Nc(REE0n zvW8z6!`u@~m(<(2LL@$TE_}L$6Lij)Z=njC43-2-(tEZ)mVzM#1S8VinZ&RK1p+ZK zhl#3ZV0t1F?TrBYpoq4WaS~CL!a9jYL$ZRDlm5u$-#SS7N5)oP=iPbO37prq5ea8e zO!6t!2Pl|-j)^n}ziwx(8|~)@$?jB~Qq`Xi0ie`NLgAol_GAO^;Ej~?%YH;MNcl7mldhG3-AIaNs2v<>xS#xOWAI@0mI%RP z%;K*(m39wkYMsI;8;@e{SISE25m(A8!j+}aHmoC@#)E|p12j8BA><((%T#@z@xGmp zmcu6~;}8038;5zDW7M3_tsLYnGhgUV-I^lxlwA4%4TDilo1nPd=~l(%iY7ffPswaL z4k^rY+gG9QCr9}byy2F%OlYYW4Ql!D7 zXzv{x9=@F{jiqu(5Fdo9NMU{$0}EDT`RXwsSc*KHbCGJ$%<85uTOP&qKZu)9;%F39 z-(7^tXWMhsIJ!`JCQ|ZlOYYJ@=&|N^;v~M0*)pkX`+kjhEGgn3;G_Vwo}gBmJY-Dw z)VisCdEGFaKF^vTBs}EHvkc4MO#Z;6>m@9j7o8tvxr{+qPWP~w^u2@Wa;F@bYB(P& zx1KO_Vo#&ZTJCU-Ks;}g8I>nsdDzOlie>)f9Fc3^6myhL60uY2y!J$-h7-2bD$U2* zk`422ZO8|HpjaxhUP+(j@sU3}O+WtVm{`H=q=2?3g<2Bb%u(sKA)4GkIszl(;82#& zk?Vnnck5yeTG9$JVyb8Ud1DHYq>v;|fBen8%~wlF&t;@nu}44nokj5A0X-obNOKCu zFMr$K0xAFG(v=?hQ9EpViiHWa_j}Byxqk7^2}-osmCsKrXTC|tGhkENy_5*q{p7Od zAUwGTMtx@vfxdr^EqPfxH)k_d+<7@?Tc76gUq z^~+_u_tdh~ogO=I_Yk^rf~mjW)vtJWQr0d1iN1qJGa6UiCwXDoEc$twTX2z8HV~7b zTq<@^vZj>*g@GtL4S>!1#AR=(bR#}n9;6EM8>trWQwpZsr$b}O?34GGP8E!M5cII* z6e185!LS8p_#PKfO7MR0!IU=Qp4nx zT}SO<=cDcU^)&i&OdBuR1gv&l4CmJTO3V z_6H_)AVtc)wO@%TjHKR=|0Q?LR6bUG0#ZISK(4)c_7mN*8krb4Ucb8LK#h5*?u-^_ zG35=F2e|d1ci9NM-97@FcvK5LGBzCf_74T!#`$_})}+tH{NuihtWBDFWz*5kph+&y zhDtocNB$j=oasXP3+jMLn<20U`$6S0(3(hI-(Foa)8eKdgeP_;uh7lQd3VfQ58a}a z@_FdI9BglY>Sd=nG4u*_-^=IQegeA788EVxZuWgm0RkGr`G<7Nj8G0MvbDUF%auwG zt#Z$c*1O^=O%#TEW%9smG?q8~94jd}T;zN=J|X*d)LWsgdH?w7Ctn(z{@jwlrs-%n zNL-QgVfteughq0Zlv2qZ%Q0NJ)&!SN_eSBZUnYnxr+2cde-h^*)QK{0OaCEwnMb+_ zB1^E!jZHJCPuzQoA-;ep@z}!ow|d_=75s)w83F@$gOUUc=#^pRl3#6;Qh#X`t}m9Z z!IoH20e`m{{Z<|dtcH??84D+}U{`DDo>T>eZ@$*rpY1|JVLxzKUJSzETyi?>&wc~J z^?etj<(S<5c`7!NNcl_bmapTdt=%x1H%U>k8hCVI>>jm;gpM7&n7@+1Hu|)&Mm(FU z>LyxGp_!I>5E+YM;;(%+B>fVaION=^VaL7Yh-;tkch@*utuLiMu$`Ny7}R6zwOr?* zg{p^?f;OM?{CFAWpRYwo_$;*`6zAb5%wO0@31s=Z2~vaD42Yg%ZIzB8VXug1bQmPA ze9DE@i#&tdxlvzsg1_7)0y>@MK+EToU$4fAJ^71A$ErsrFTOT^Yw2&Mo_3NM>my(4 zE^?=wI!{!_X8J}0%O$1y8zkNmZF2lqY~fw$o%n)pyU>bML?6`+M4a1nKv_@ak6HFV z^93q(HN?-y_%F}T?7$d5*Yf4oZDgD<+3^x)>Vpg624X8OTQR340F#DqP>lCD3B|Q` z{!OK{!Jj#AZK0HyfR~^1F=w*Plk2dLDPLmB6SqLn@oG+M5vvW@w!2E^cC0cJ29kt2 zGlIzyN`QaRbK*fWcX(}b=hI*K7&OQNiEtdbuCXZRGI{KN$~{;>EeVkM*?Cd+Ugb*W zRr&9!c5KHZyy|xZuuchjDV7tXJ1KOSYo!iK@vV*eS631h|I7JldrnLF2bS;0g=}#$ zs};%f267lxG?UGooR1R+HNPprF9EzayBB0-&mzgct~RQ^{#vs7XXk0bbWJ^xdpvSR zEt1WAx`xi$Yry@jRMJ)Xr*YY}n_Ir;(!rjd1omC^|1-}`=AX(}>8L*DQG`_j;Xv^U zI;a;%veBL(5$MLk%BXQZuPJYAVIY>wn*3%{I&~%0`JA7FZuQozbL)emv2#*OVm&vm z@-(3G>Qk^8c$rlZSLr7^hD28y&`g~jJq4aYGm*j6V}>gBj;%EB2pco`EY$Ga{}fOS z*?QN*pT^B><4YP>mYmB+)iKrKWo@0Py{E=}JJHgJdd<&1b_X}`Es&D6a*%T3X*1iI z_|fG165>rYnq$hYl}t)rj{?K+Vj;AVjGyA`M>w?xrHA&Ylo16d%XRp20XO3cIy&rN z0vC9#`k-5R#iiKp$vfBfGl9Zb`mTj9#Q5;2gPCR&mr4KR=G`^u*yo&@PLUvKrqDIa znwfgSW*6H0T{TlHsdHPManLH;(+ z8e2G@@qKldpIqsmXtRWE<>E|57(BO?kia^hsr?U|URVV)G5_4MkE#l%hG`B=46sIH zV#k^q&t%1u5sJKOCp@Rn%FgX2q!vtfG>=vkxr!T`#E|GT z1qV0e7nf-{aq4JqeE8t4S|=%!azMDv+EhklVI)C~JQ3(3i_RsdW5p+K()&vseX5I? zubF&hFm_OKp6o~jx;0GC`&hdbpge%C(0Ec6Cv2IbByFMQAti63vE`&)rX`{R zJ+DZf$wSM@A|Qcj9k^WBD)YiMbL?Bob4rz;=z#|rD0A$=$+d`_7{Tjj1V9_!p*x;s zVwhm?n%y^=I_pWfJe3ad|6~{vu1}CqLYb-HF>;-gi@)o$9kJM!&PPtcKjjZBL9&bW zx4bk&3DbhS{JbZtj~ok;7@z!iWGLJW=Ja{rTN2|#T7-I6S!CzhCbP1`r9iaKG;kAK zu`e8w+0rjRgFvP>0U@~#B%{}=A5$-&VDU*v9ltTbZAwx|9?Ca) zO2~3%&Uh{5jsn;uZUoF4{Al$Id1qn)l|OqBFU_AHlxK4#4m{VAQG3qRpf~pl^pqS2 zX!TYzueeA#>ssOztnyb=STKa47dthZED6d%$|X;{pf3fw=0*m+Z|!J#FnLt%vmV%Q zqu0%%2FY`)B>5>h>gRI?UIb)>~yBlgq9bH$y(EPvg@|l{m=*a$`md6rcow_h=>qe z`FVNF!3Gx_h&-Hp*l)MKU0bdMc*hY?@mdt&WI&mGf7jGs4_RnjC$yUD-31g2XSoz+ zTs?q}Dm090KirdD?f)i1lw#U+u0Qoqg|TH43;j;%{(I z-)MB~#fki^bWfA@P-J=jjjPe*=HUbe&*)o65_Ab`2d^atb(*H%dr@OMsZAx2mf2t~ zQtEPBr9ttx3g)2nPo!LTHkrdbc0S7hw21Zjg^3!-pi^Z$Td5Zri$Up%tlY{E?=JK2 z%Xrap^;9}LTi$SPc>pp2e-PotA-&SyHI z++4dWHMO6HT0Kpma1Zj$_c<1R3`3`EBcx?Hz~efxsIHuVCJyX)tGQNhWA0+)z2kU2 z0oJ512jB92HMzumwJjf@&I#REYhi(TpgtUTuwN41#>I7|{5809rWDBg`mXCa@uh-i z^2t%~%ZT%(je;^piabZ~JIH{gW~n|Pp7ol8AfqqN~#0hN5AY#xyhV{MQa{mKKptb_t5hn zS~VgeQ{>H3HCq4ts?qYtt41jbN|5wU9>nkpzHQq5H}ar6c6yVHXHt!B0cE-5R2Yw7 z08EvD!ra{@1)+H**g0ONgG3Bo>)5#$XA*e|tvea7S?~_}XAHpX_tLszE0M%tTaLNL zP5LKc;t6CJ=c^VnOf8XR=`xi?DSJ$;OmkN+gB-GFG%j~0F`J(o-CDiAlXq)M!@G1L$DO1% zw<6yjbo#1G^^|=A?T~!fJ+UnRYVWQ=iVFHRd3%%PQ;6=O4;hHoP)kw{AZ)L}O{9sw zQfZlt2t>+7qdtK&Pc)dsZ#ilef8JV2+vp(E%3uO{Qq4@_xOs}7Zy6cU@Kr67F!nT0N@?G~3wA1rTV=`IHfA51jMnFTwZ909v`f5NJ(6xi))(~@I zy8|{aJHu_>ThsTjacR?&)D*yuDADwYb#1w`B+&#=shKBAXZbb;z)3ITtGqU2)&w>s zftgWuM1hf*%VH2QjOcPn(tqw9L%PScd2^=j#E&G3;DTJ4ly7+;2}(h7Iw3@)J0jF; z^_VqcV_FUC3?5p6F2{?qnFMVHo@;FumE<|^^vm+~)pSTHxTVH`-wOukbmef}&xImA zIIqzX`pR{nn@fJ|S!@ailRZ0cV${RDl0=1$@Sc#8DlUMt&())>9Uzie2W0M54ot8u zSmDU8UvJ9DCn3UtyUonUS7)=%d06OTT|fIEP^Wyo zOT6_;;$7G}SU+dkn@2_%hjtE)&(bGJnjivr_ahUtj1_URe6B$qY+KpO~XnLmsT zVco9e%GTp7`11_kTz~Zp`m4HN9$gkS&fKgM%X?b^z|76|w!PYPzOx()dI*dcUH%PjdvUre{ zz7)Uu&7wwi2o3P<2<2#@^ca#aOud6N_Q|ZXE7Z|`sW~D8+{qWIo2Hhxx|baef8e{( z*stb~9&ld$Z2rW1Zr>@*=SAhPrOc-Q2mgIZDn#5H0cQd$Ii@)aLD_^}QYl}(X53|G zMx|~|AWeEqakC__(lqXr*K*086ZtM*I>)tH(YIO|491|3MmgJ3ypHE9+ZFOpcwSTW zH}daag>52G9s`xYK>Q??=ZD%H-uJV{nfTTT&S(I3%=TqPo7CM*k-vQp6;KYk zSq`xzyGI}2Xy{$Uea&}r-FPwb$G}L?c~5%lxJjJi-deFSL*p662~sLd{RH|f_K8}4 zRf?(zDNu3l_a-xQiFi+-4T2TY-c^s>a+jh||*mEyOPc{9S2;>;Ph*BTx2mx7n zodVSoi~CQc4ri=tsA6xCTTNAD$9PkGBpWAEK=d1%mOEwQp30ynUd@+n2XnJKMfG_I zbIO}5m_B5}6H#3pz3O=&Y(9 zEZ&>W7fv+;P~*#5s7pyaj`A0=d5JLvZtWijv+qjKUaV8i&rE4A@Hx2l6N`Whbz!U9AC3|?p3B7^6ws-qW zqB1wo2zWcUqo%?yTS%H4E|8W(nW83TQL2!609<4bBB^a9 zIU#UCOlXJc?CpRrSJ z8MS{i(IrkkWR7&d6CbDqitlVUZ}`E7nXt}mRioQJOhK^_5BNTM_)v63flv2_!TZeP zFmNyjexq@jk|2MP$9#UjP2J$}e9ODeVGzWGu$UMS%u;QHwb4I@$_XI3{ zAGSNKlwixAaKB$s4qt-o@r(l@*Zn1R#RJ>=d#WN(kAx@?AVt?MJ3pE044hL?af6|< zmLjA4;DQ6+s|>bBo&~+B8#n$~xN8LGJScA#*qI-7x<8h~yVZ`3q*NeMFq*+=ei`~m z9%WMOJwbDJAOL8v^Z($drdI6M`ZwP$X{$T^zV?+T?CY#LpW|L~rm?YerYBy4 zEjKYoE*B$M>NJ)RqAq)W4#;brBCkKWd{G7DXB?E+xCs=gH+4d=LJpd7$h2^jTM|3- zPB%)4=ep2W+^C7J1gTE!{XNy=;sVnHx<^%&Jsu zz0`fUH!p`C^0$cun^9XU7)@)GAlF!_QRa-^%UxVcYgHUVK1SjxT=HZNI=wf7G^_ck zuvicV9%2eYE1j(R1}8_&^Wb1dffh$fn~#6F36S;2ZBuy!*jg_-dbfu}bv`&XvG3vM zX5aD5cVs-26OhAEcJ1`IZ=I54k0aqa7y4R@0rNfy+tlQkm zEEh##wUm^CEAWFNKZ~W;D(1;BPj~yv!=*62QhP~ZTDvnn04Dfjy13l1IGCvXTO&M- zpE?hmp#J=O0V`YUZ^3XxD?cUzo{(KW^`{$aU<}~0@KZ}@g?4N>-~Je zx{oS1zw<8Mw2M+oWO>lGs`-ECbDzEi2iZO!N0|%dStkCsjc7vx?@Jqu$1w#It2UiD zz8IQn?kQRUyYnqrKaYCT%%O3)8%Au_SiftvbF*M^mR;>bi_9Jl{>9@B9Pi;{T(%|? z$Dl>BtT{~cm&ckaIU!K{lmPr)JE*U&n3b;;pR8bJ-Y*x@{LP>g3ttCS%V~ev7r)F} zZ4VQmPd$7H43kFlk^|q#!nFP2vz}8Gte7us@pejrr9v5CzMZ_0@KLNGZ1j%yjWu)5 zEOr@$#U%cvBG?i-k5p%G65&*CaLGgjRPRkRqH@tv9djnUccNRLeF^NuMx?1vvp2L} zL6se0q7>`iGJCr6{w5kq)_hV=Gls~w%?F$a(>&ZS;qkL^GK1ZSRMmXB^vUGH=iwcq%X?9P z&R>49iCHPWK<|B??&-sva-dD@NPahhJK-*hIb0J0n?0Q8&|Nf6;#u zYNQZyS#7}`DVjRzhqX;Y)w;g5yv2t;SoWFp_u8*%G-4+-NFvGgkY3vz2PT zy*67PU?x?4pifE#3s5;y77!1c$+_$!*CFv>f9+PJ!e{1U_`6VIUn@>04s_}XcCbO6?~og zq|xaC1))#1G&IyI^E1xWNc!9ySDR+$&0~04%QiVlG#Bqinxv!2IqAKuD5O}Y?<@!Q zQp4VZ@q)VG2jT#LYwlcKEx5MbVj@C^L=F{pI{D_ z2QcHj9SM(IfF2uq!L{cFegyib97+VkO?&glR&r|JnJk#}igC%2KIK9(O%ftGn2odz z-A81(T$EN4=qn=8Ns5UN_*@E8-}M@iEOXJVssDbI@NHr^_8*`Og4+TCA{JV+h$Yl% zgD9dAEs zh;mVlE^_ntj{D2n8d)qUU$RT~nOKJuv9~%QEB&{tl`tdK@BBlS<++DTj)LI>bIQ3) zT$GnOC8S5GA-STcPY7M(( z+hnvW50r)lUzt6yvl&$QaWUb)wzEXqX)EO)r7X_n4EXwXL)4Z){@||KBC{XC7!?imfOC`fcRiC*C}y3HcA`iYBkd+f@$lrwpQGaoCeugwbR^4=fm9jn*cf7G;g!0kp_ zc|=jHd*afshG~ARrJW?6W#-t-WJy)_Vi!&(SjjF6p`AeTYb~Mvmr>cNok_PbsWX>2 zK`zn4kjbt(or%>h;$x&T{wBdndXOw>0{KXJP?OiSSZe_@DN2(ka?5kGjuVC`S6W_g zI_SkqQFc9Nvw6Bgg{-hsbF3(2vsEQ)yMf}VF6Ngm{!Ed?F5k|?VNHV1QLW9FO>3BY z$ubYd1SwIj((b=#i<_R)@Xl+%$QU;B619>hmmKeBeHinU%D!jw0b0~7Y2 zlN8cn0H3cE$avcNVo=KXPl<|lkcf?VS2BH_YQ4%hH~dgVkV@k1z4Th%KXNDXcQ*=o zscLh5Y*mqWCi^yloCu)-svduCYc){#9K4D47Hj~GHtF5za0aYhI}WpvCrOgv2#&&< zK?iP~iZ`eYn>J5Q_Fe+q-+w9l ztZk|8b)Irg_DIG>2S}<2&cISSIcnJ?85WllkUP0qd%}4<`tQjj1Km3rZZ)c~-j$Sl zB(k-4eCu~v{?L@Mt2yEGnZwc5vEtp(QtpzQ%MDo$E44~EhK*wxG=y8bC=7_C$ONGyEm>{cWV5=eb;<)jCaEKJ;UC_gS0EK?G<_dvFs zqm3+Q4%~wKjkcCJ)UFy6BQl-qXZuW}@Oj&*m$I;UNtXChs_8#*3$)&3+aalCy(sqG zgo6Z~+B@kYXJX=>>T5Gq&5?K?T7#XZ5Ab@OS~$4~$fzVkS=c3>CvkHO*EywdeB=?X z5Bc^WuRI$qngnw|kE)a1*_Hk;&0ixD0t5L) zbVc@gvsRPbB`RXAQmssxl(TgupXG-H2ehlCGV}(6z&kzRl)`!1sbQ=U z=q+;y)}kL;>v=Ix-e%D1YY&xrf%QY9kEHMgU2fj!aB{>fD({IKHV9?rU!Lj-U^ubj zee&d!AbCRul2gtn&J&QB9Qv;JmM3wWX3=0Lf|0T+|7&&Kx3UnaeMk(1p8uRWXr_Jq z@lw2tK)$UX{@^uLL6>q5E8s;~+>_V0nniHM%?(&nr?0y;!83ng%9A!B%I!TA=czjq z=zCy@aaLL0a1OB=0e0*OeMz#3(g*FMDH)Fo+J_%eSUe~4!tOa|a{l=hIRbeY9CPv* zms;QcmOSi*h@LfN(=rm7K?^yn@=aUbE79|rgYh2*(>Yv;FLSE9i(%kuLF*`5+soBK zK*HoXgUfUvVTg|wG}_ckVQprqxpD@CM^>(VtfcdzZ&352-uNmM1^r_^vz8Ed^Cl zn3d$7)M%4_W>-#~IFVuKx1TzbXW2Cewx;B@dy*okv`s#ybQ9{^SzLJgc=;tclf#)x zs9Tk>lRstV-%D^QKbe?3suE!y@^1;5XeT`o-}=Bo^66#(5^$bJ_^oVUKdoW|i4<=* zc1KSQlq|j{$(%G3JBP`SPr^iR$=HpoIr)KC!8g4|7{n|Wg3AwW|Bquk!uvwGk-^O9 z6uq=I@+a6O=NYvi=irAcZz=FF-|(dwr6IVNZNY3?`QWyI7Q`!ybyZG%U~{Tf1>wuX zh&|Js>gTqKx-Fgs>zpqzq>&XV0u@F1mop-7uwbN}Kh2Ti{9-sdT`4z6n>KA0Y^}>Y zBUSLT(m?)p+W{$@M%kY&3A={-c}*?%??TI2Y2M90QLLAwoB0Sbv0iAR**sHn-%l*e z{K0_F>eW0YgEhfbWm?qSR6CdoJdWDChu&#Hu* ziJmw)qmVb|RH-8KZCQ~+{MTVmF$K?L3e}UZDK(sy@+=nQfXo&fcidt!sbn&y1i~yr-Xp_XikEBAUyLaW@;iwsJc48k4u*;L8LPe1>G&{mj=qtRV9dIkkIo zF2_Zo|FIbuBph6Xk(q@py(uXgv21i%>*cL@J+#%0$rapb?A`;*-Mf* zHxxD3jH%gE%}3sIlXbc@eJDv<$R}-9dd!d!^&S0wKgj6)|af%Ud$DV5HQrxbECVt5R<{x_|ebz(PYNs3xI& zLR3w3F)*5oYn$V1wQA?ItK7;l+cYuFT`W7~+h561_Q99+4itW{uRG=uQQFVmbyst~ z2l<$Xg4W9EM|+zT138Xl)V%VYcsn=ciltjAb(MVLS?Ycz)f}9bgdXsg|AY>dSat9) zUA6T{TEDDGHl60=`<(zzFc#iyP6V4jxS+)AlH3E0j)T%5U#wGSnq zL}{e^{G*)y#N^dFXVPz?3G2Opgo{?x$}=Db%~lO=^jt1cR0XO7t2t_okdsHQC(A10 z&ivu69}_>ZrqOm&^W{reOZk+?hg_~rov4;ux&?V@nNW4?Ti!%ZMqpQ$)HOzcH8t=_ z)LK*Z=V8o6sMt_oj_Na}KFmuG&Vu~Uhh(wu#5yU}`FgM>JM)(g239#l`H(uAG%o0% z8BwfdN=e!~_4%s!&zCs})tFdXC0(BdgPkPCnWr{$8$;E!R(VSSu7z><)2d+NxOeFd zzc;Ymc+Vsc459~*gDeG1c; z#FAOCUT6WTRiDIL!>a@!nvW)(X7?A1s#G!~mD!GUkvN~Ya&Nzy>>^Q7#)kni`(yhPY(T0&h9Nqa^zM5=$074N06U`?>OCt4|Qb#@$>rb0|QVehK*8>BKc9EgYI^-h!oN@WRxJ`;=>bF#wA(j`GesJ;9K-oZdPc_I&3*R(mdgdK+1fUnHWnORTUgK*)2Do zhD{Jj&Pi&RJvV0|JAK(-Xty`Ywbm`Q=c1>+>@~kXQibJTqA`4=8nAn%rII&3BbR;o z*FFv>cOK$Fk>DwYGAiw=&6+nDgta058~Gc$S<&0_$7fYv3LNn#0T6BW4o0ALkbhy| zeB~(_5aR>{ZJfAL`9co~QnURzpnb_Lon|w&nXmTDTX?dQyByy0$M9oEUt#Ay*R~IN z!IVfRKQ+!1qV`oD2~~s{72aNFO2;S1HOV2b_Z>7b6Qrq! z6}Om(^qy0a2V*d$ea3|%z@5=h3Z8sHyS_Fd-n_Kn*R4^NDDP%8aCTLBwZVb;Q0=xG z_ieQu9Z;>XzEZoCkf$EB9we91V0nTesS!;zx1wY}D~mr$eEAc%)sLA*V?KK@^*S{c zXbT6ihbt6R;Yzv^Q%$697otCX)v zQ5!0L>c~Afd1pAizxg3^a`5)tqhYuny8#ovWsnE|nZcaB;2fl=t^Eot`ZmHLHTx zZF)sT_^4#Gngu<|-)~7Szi6}Nf+i9ry_W1`py9sT08JuGRX$hw|7^>h=zwh*ki!`@ zpY=8I*|F>b4sM!rcRtd={?oKonWO7qAFESYVGL*FHhb<^68rliIf&s%}-jmAhoElHWJY;W>&myO)n!q$HJtoh*x>1M4q1HLj9 zW3EVdyma?On1|L2`kLY>nCnnB8ST#3Dp+ciaWM@lLL7ZTPn!|@Y+3zERLBVo>RK3! z9L#fY7~0Lx;c$ENF>Xv0}f0` z>R5Nh<73@|LeMf>^~$#gY%8K8etJx{kabiEw*EmIfSUF8Wf)%zOcFrF9@5D;TG4V+vHg=?{OxBnmJ6@v= z#|b5Q&+}n(mf~pjExXlJqAZu~MD(ql_V- zPF_}$%-Z>=*`(ij2?w|efZD0ob;Gnz`LpqX?3(_3H;Ry{shXIa-@cVE%i8G)E+huj zAJqT1uhwG{<=N0UBX$I6QL1OFZ@lXJY({wGJ(ETg{vWoGMsWGk6CdYfA0%ZQr_S2$ zv4_XKep*XZ_7V)nwoO49iLi4p_Jq*-sV9TWGz(Mfx(-R{V_T*Z)ias@Aa#ZrNKB42 z&U{)zUJ>i_&2TjI?1IahCS-mKrc3HLgf81eTWkEZpWt-5|L@Z+9oI?}JBS>0^9jy@ z?BcJ15Mx1*=h#L>m;4cE(v`lsV3$?yeYVcL@7MI^q+B^i6w*2x2`|#qL}ksFzLm&j zK1pfitF`zPGc6|~U`2m*S%gKh6IP@H?bsMGzX?hSa{lac-pU1X;|sl_eA0m|69{}8 z=dbTd2fW`jL=qp6-*VVW#O}QqXyxAtlB5o0oR)Ij?1koN;MiA2=g7eU!Zs9xy-3Mg zg|v`nD!iI8xS0f~q@tmt7<*Tb+xpl6H;hO@8#)r&PRZ zE`r9JmDPO62b#`3pa#p`{OTy(+ldpiD1AtED{t=0#-geEu3sE@#28s?eoG)J<#^kG z!*oQGbSVjgJumewh)v^XGONMkwk}9jASJ*olTB7;-xLFPN(MH^GgreLvF-ghAiudn zd4)ubKV#MVY)=wJnb_lSrfz5B%B48hpH9!PdpVZ3H1!xO1#Kpyzc#pM5(KGC?6q9o z{kBYV4D!Z#nE9`re@$>z(@UE3+zmt64-l}~c@VAVnsBS&TO8X@?5R3|0@Td@`a0QQ zJjpL3?=qlO8{}&o6l}Ycx#5-5t{c8nqSErpQONBSxoj+5M2=E=tOsEws&GBeVDJ~# zIsQ)mUfO$8;7qCSBr)Z?7f)p+hs2soD_%v;#)IigYVhDUUd#FdDdTb{re!`8BRFPk zH=brAbsxMC&=B}y8H&Q_#5fya60iKb+Uzi*cFH=DfF zMN>wQR4`R)25kYp`SuFhzLk`+LG@#{d$JOppE^m9{34fgDp-$06JdGQ+u9EAk&V`t zQ8{VZg=}~A8cK{hhdp@+_q z+qI1Il*+VK;ql#M^l!Aln}Oae4&7wz*oDt!)iAKNIHO&lc1e;>0gj)85NrS*Ff|Y6 zBpf(Dd(S0&@x&4a50V&K3T&JO&X)r&QBiKPW6u2wlDxi+%3&bpyj1{o0+Lzt9ms05 ztBhjqgg4S_7QMfZ4-`sDipfC*s;UF_9ygX}&qXD!z8d)1 z-QM&M0~-%|L&@F=)GRYnVe$;;rZsN7FAJaf1&qK>2`8a+V)pWowaqz@7=CJ4DQ=jb zPPN-bau}U*nTgF}2RycB;pe^ls(|v>5(}9D+61WwSS8N+FbU;1ARXMW{#?N^x{@-d z|NlQ64d0exq9=Fv_ur{T+ux~17k46N@h=&Ed-22GZ2%CJp66xao^t0a@!(*Dl~o@? z=9{-{`802lwDw5xjuc^EtsIv(qJ|cU6LJ@;vYoZgMP~LG&odeLkU9L3?^i?bHMOhe zT+fMXphXa6J8|XZ`i0A6&Rc8l_chqA%aGW!R3=kqbv)AclFKKFa+~EM=HC;2e9fPn zC<+xfP10lx?ly~YSVBr-6m`6vU#xFNY&&(xKqRY*KV|NjaGzhdRck$!oGqwCb-RllQQ`1^NcuLo_t+WU3C83hV%)zqc?}B48%d$LeWiv@WPF?MjmyN6BWyO4vt*4(*>1Dm{#&rL zTTetFaFF6W==>NUP>|QvH~&pV4g$_OXTerM6u1>5p~v=2ZV1m|qOJLM)2fFSBxw;; zQx7}Y@QHd8zwuz4Jl|eQR#VPmB0WOe*-8WId(FRtVDsOkwC3EVfayR4R(Z?iWOjUf z%3Hb#DPCTbr%Cr$$9zK5*vT>0xXgA=KqDIU_Og{p;nMih`Z0FZ4+#L{&u5D? zxFdIv`W}bcmBUydDwdYoA;6^(_Si}-DHtliiLD6Ed?E-pmE?SO2vchQpa4_dTaA&x zeA-a{@@Q<+ztc;rYw4_4w=<{dIgX-%YOv}pGp^dGW#tNNHZJhtKN>$Run|x)Xu6Uw z^b}s(qXc?Cz6(cy$a`{qc}ID2?#wn9tMWFCo4tQ?jg=M$4M)rA6mXv$o#aObeR~&U zZ+vi*v(q+6iY#s}&coDbmlhrU8>uUny*$;dQRknmX1xdfX+*>1-^VKSfs=R;-W(<) zNii5~@A3r-=h4|fwR3`dAL{s_WM_J z<2)P+A1M>9loAvgl-73!#<`lEQ_Gp?>xSl(eqRYQ5Kj&s+>_A>qvxXrr7>W*nn`@( zE{h_hjjybi7i)9DZmf?ILRv$}>W0RhgdpuWf!17ZMjR#?T1H{4m{TtDT2}(L1(kM9 zMM8v#SIkGCog~~KCYkGJZ7`wjOJ#JDtjnL-jZRZ^BsjMRmv>j7UnVT$WQDoEMbKJx@E0~=B?Y1ApW!w@EkPrtmRFbh|q(19%Ju^-qc~VnR84vaD91ep6{Gs zXU)Ey9QVlLK6&YB>(hc=O7KgY>Z{OEAOlsJf! za^lb~JaONdDQgP!Y0?n+NDDQj>?6_a$ep|RvhWT|YI_G&zL`B!z`xDhU6}7Ur~OWK zpC7jHVOhw=UD{SJ+3g%3!E}F~M8@;`>~nsz3B9)d=XN6LUtew?jf6e7k#5-7_Lrne#HLM4dxDI={s}+{yBkm6Bk=LI z9Jg9r4&uSXzo9PFK*EcG_CqhL_H1AE6=_@o48tI1kZ-@cRT6$cu8WcHSiO&nc~`zQ zW>!vKu2zmEhL+Wpql$~RthIn*z`4(Nv7G0U&K|fkv|pBUKDFmcI$=9f8jy3OJ)S(+9ga=+ z?s}&6<^G%4HMH&*rS+uv!f2clYW75) zVIS115!O?OSa877q4IxoUSURb<#0T@sn@}napysr(wGHE@#?TdHu8BB__=a5J!UpR z+;%&G?S$!Ip)2)#QY|oZ^7Cpd_5Iow*wI8;NNwc|W&AO*Ax+g{h@Ydip-bKS*5!twTq&z3+O+N+}OzDlt8K_BJM~k~@ zpFFeIYLDbV_dTo@)v{qO%ZsZ!A*1GBhx=DIpO}O6;06xRt9Y>x!I~l==bS2?yn*u`x|VDxeX|hjIliQ_kj!dGSECfAuwr;LD{DLc(B|<<7HrxVwUbv^68#%h3s*+ zGD5p-NG0uSnsI{66UaGP?dAvZ%d{vLLw^`xey@hy7+Pki+OP;OA{z*Ispb zB2JSUa|e_2?EbF#eCB|Z0dhw>kp)~83phM2+Mc>D-@mDB10_=N%r?Cqc9)#J?P1d? z`GThIlT{S7hXzFzV3hE|yRI|@npH3I2OOFCn&lX970!hWy4x6|+{B0ja~pc+hJv{x zYXu=K*4znyl|0`4F=c=4Sm!}bdF&sqE(kz;3Sr^pPcD^`FmK+ zW+Us|F{13I`Rw?A1ek%XNP$sc2xv^MQXtto3U)FoumH!s zqWT$m6ZyHFSMfFu`%@gLG^%=S~{DSV%+>)uM?eGnJp~Gr_?q3aTY!AfaugdsHNAs?2#NNA6!r3-b{h0BBkzzV{K4&cWFd zx<8vLyx_SYQn4wqu=hkld|3FtIq}z;Sh<|JBiivggzuprHQSlXmEsAre#T1QdnYDh za6b9SB+L1K-YFs;dkg*==QI&CXQT&)(K#DbYo(PJH9zl}MP{C2&cE(!Kvx3O=icr_ zNX#lYdEjH&9DCUi*C4|BIjy{)S&B<7u(xwlpp10AJ{UYUIpnxvk7so z6e%`l6_!*3Cu$^my7M4PN}l7*Y@hi zEe}6Sasc@WMxBgM+Nb{hAent(p++K-S8{+Rg50AiJc-Gm%vd;xJC*m5f9p&oy$AABV@3nLc?u>L zo_h2L@6{#0=vL4q?)1~rYF;bDaYn~Mq{*cO1ulZuV|n@5Djjl1*kgZmb6kV`eBODa zHFvrwsS2%n>ma2Db?xz`5zjtCn1K((b&z9kf)UbG?%2a}^~sUllUd+#k_`)U+oRlb zuJ+Kme>O~hgVKHn*IL`ZRo>fRWvdI7G=TiuF49>^jTC%%Q|Ck{YOuE4^6oTzh+}>| zMY7QlxU=^>yko2qhP3Y_)Oa>I4ki_x4qzE)}{Yks6aa@HCzhDC^uBXh{+3;%B)} z&+;U2-kX7Ijh8o`=z6nkR}Qy)vL}~!-E&vFtdxU9i(%erd`!zy+U^#`?vl0)cH7u? z2lOEuQQVmGrl?qb0ihZ|gL@uFhm-+ihBubv$CxSFs+M}v!OyC0u19GcKPL?bttQaC z6c%{!rg$4VHe}sy9f#cq*)ead%~5E{hwt<{r#!&iVD$W1v1GgU4y+hDDU8b!Y7?Au z$H+t7w%%_esa(w<*e4~0>BQSOcqCq>#3D>9CnnSeMJ8kfqKsO#&b53$n{m_WY4`QB zfRr;7B=fM!F(n%MS(HwelrZ*JA7iUtL+hZ96opB^Z_abdF?c-yg`ohZfnHpa`I@x! z;4h&i)Y|)PlAZ`zp{i4|=l;4~SQ_14W?+3XQmUC&&BMpV)!k31L5RC4M9wKFr&gRS zq*H>|`LS0ciSTfDJp+p=akXVLhoMM0CZ1|EhD?b&p$D?B&jia3V^nRCgqWLZVyZz> zv`?v(GhfJId-1b&U77FHZekty63*gwoseOd-|aT;!9}%u-FfKgZGZQZg2V=p5*`2D zeoJmEY9?)s)n;Ixa#BZd+kSELq!msqouh4DW`4R-x7?P`9}8sLYFL+Q8U@P3Hfm3( zpa*9eVdMz_b`-`}UJOh1WtW420rHPMv*fE>Wx2z;*3h9C7Kdnzty|(t?m>bNbKpGw z)O8OIV9rDWZoV!{K{C|ziBd{U)j)fZYEN=qxs?}p>kV6~v(qx_$}u^}Z83#BSz_q! zPY>&={ItB|bsq_K^R{3B=l~^Yri^O*I&2Z=(m$yi@SpDhg&UuOW@%Cp1ND4Nep(0d zSOrZpTC^#IJ)Pu*n zR`|8$ra$=A`h}OR=7)fY)t)Y7ysvGBYsbOfIgvJGbHcbo-X^)1{X`DW z7NNyy)Z7;FvV2U%ch7#6*Ngpn(cIW^4aF{6PvI{Z~TI-)1*lt;}dP+ zJm2BgkOwJu(rbBDE1f%*A7rKHTnmu8%a=J5hcz#~=BIq|%!sN7l#*xs84q$M)hJzw zz+SdF-n@+DFbe=2YT>9PU*W*O zc4@>vT(vEzlzqurL<^zgJs>ZKf1#wD6P8mU66Wq)xEU7X5vWNxHGReFWc;xokHK+D z;h|05IT)U2nZ@SEegU5gnYe>D`4kwELfuNvo${cc7si=2=#ip!rX786FVmQ0`Y#!I z3BZ3qykxC_XeBly&fLY|^27#KA9;dChWVhAg4O8cR;WI#%Di}8uYinDFixj z7wY!tXaqc3@^#YHMTam(OFI22 zqor7$2}t4KvU#~CuDCN-D$dzm+uVP)dEk(A1xc@m>< z+Xdh1?r-^YT-&u&2l>s7B09CQ1XK-q)To|+9wd;mC{_INA#x>0%-W0r#=HUN16WP4 z)i$=dpTN8zr7gu5(o->7zNu=pE*CXI4;(B4+ScH;B*1*I?V&kr9~c*+_LY=Gr2>(( zTsq9}XgMq7t`kdwf#+Q1R5mH8o}?ZLdHb(aqfJ8&p(QaVPyFAhM&s{Pqx{7327TlX zip^bTO-GXu^vC}E)f4}C%`5$Lwf7U+;d*iNSYplD3x zg~u71?@8qN;K!Y7o!C+a04k0Ypp+O56!O$Cm(~w)oV|Vi;5SLVq)8c{thqH$$?@cP zC;gc5Y|C4;wfRIZ?_5AqW~N-V5*q-M7=6AZdGZa+F_*eidvJ#&{3LR2bJ_VN^rYnD z2hs!7lpl>GFO?}vvYkxdRt7t_2@6Lo6!H`xg42FA+|r}bGDsq4F-PDe(U9^H6VQ}h zbAEnD<>)y**wv3wNwVBL_QxnOPut9q+r{;kWNrdEC$_{g*_7M*sZ$=5;bA8sGkhgY zQbIP@YI*#~^G&IA@J!nClY)w08+wg=dQuc#N@BuIQgD45hrwj0D<#^5y8WJZM>+mX ziS68z%XKnAcP@;lG;TrCw{kb>BPE0qjona?tet>PT-W&7w)48&y7?`@secQLha&(_ zG}r@*-e3aw%f6GhZwF#1Q*Zsr{FX8W4)S{Qz?F6>(B!d`SLYIp)VZ5j49TxLZtykM3${gXv!MzghQ%1S-G}}S%&Imd6-DWIpkBF1G zMILf~lv^g=DXFtH2k?XXsBwmY4esogSV?B`V|f#B6*PS3V@{YfWm}T!SNFE@Y9d#C ztHt-@V4rQXHaTxld3*bpocRXzoi&cP@p7__A_Y%v zASnCT*I73z0V-EHPu%o9b?!yA8Mon6R2!amfGqLMQos6lubrnNGBJWX?Lu(3*cOa< zi>I>@() zH;Mi;dewSp@UZ60o1y1v1q<0BcPl8w5~JY@0h2kEP!J>`xjRqtF@MXGpOcMxjzCGF zw}4n~KCFmu)*<){TkhRjlHGw^M_*Rl#$cvY?tvSR1rqM(Im1c)R$Q1*ue2kY={((P z94fPguQ4lTvGrPHOhs&jd+M_QgzlZk@~K4p*>DXv30{k)fX zP9^ar)t4Gto-Oa?k0R-;Yn$VhCp)Q;z7;Wd1PqL_acV7BYoiGP0FvQ<%s$YOYl77t zYwwl>dh;-h)h7EdTdo-+hhfigGH7{G>hssEGbkjL{>+TaHaac&e4!VgU`pUUj366= z^Thdf%fCmudN|s(i_4g1Pf>QfC5|g4n6guLnRR`G54Z&x;|~M76ZFh2?rV-dXtQ2ittweduq;?zC{2ob*bd606Qw*)6w#* zM@qQ>h_ThI_P`m>-KOs||r;n$!@FZA7d4=rJq!(Fhya z*2`(3J#`VOnA)`?CIppH+Sx5^=F})5`8-t~q;zOrPW(QQm=ed4$p1b$Y_$YeZ0&~) zdvy+3MUiR^#1UM$rjD!L4UL+I7sPVqV_(IsD=;^KT_R2rPrH~W~C*Sk83qEAY*d|DJ`xXg|vw< z&PO;xedD zo<)C|0Q6g3Ih_`lZXAM(W@jJB&==X8gyV$B;44c9wdmjT4wgixT3AGiJc5gFm3QAR zlZJfS*|6{`!<4)hGUZ80`Cm3wQcGa@_A3XE9>_HpnSXy7U?$jKB$+noBR7F<%4eN( z4y?X5bMCX9@5i|kOD(r0$9oS-&N~Xi%a2f$6tf^z2<=I`K6wOK|kjz#^Q$T1A>)H)(&(dSNu8kO!mhRHYOP;JdR(_F7Eeg*ZlI|SD)u4q| z`!xq)cw|%XOkQob1@!Qb51OJ?km$jr^T;Qjn8A$OI5+2Gr(f$cpZIpRR`X4UzFXh` zGjMwsh@mXE%W0WpU9jY%<&+eapn@ZN@wC=FV^x@x0&eC&%m|M!bQ?68H~oA_{z;xm zY*Z=y3uL0?!i28(u)eJrFH@hgPgIumbW)f^P4h>NJb4xF8VD? z%A-^pw^RX1L-tqSm752pnzaMNg9=0LhfC z_UX<*g4&=jb+{avH)rf!SrAhIr{0s~c`RNjK_#dSPUo0*}G zaL(yzjgcr@kRuX^NekhLCskc5?Tp#>tE%g@0dDw1a@!0FM*%ZT?UJ*OKVIa%mC?Qsfgsuybqa2dp6U%yq?3ijQ`pIAwD7 zsRV;!PoAWw=3hRF7=oCtx^D?k4dbaC$0cyx1-779lbI?$6`iHKKzP(<1;bwexv z&?LOC^D1ChY<~>{Sfe|&UfxLmHr7Z)asvHwV{?4xYP}DXOnSakjZ=6I^r?hs>Dgkd z`oJ>Ze&?oQ1;BHHjy=1 z?a*+zcun5gq(e0E%$>F=(EP+?$bGQVwI6o?#itJmaZ^o7xWeb!EF%wf!n}TzM((PP zDM_=Dnb^{<*u#zZeJ+IwWU6cNIA7Kpzz#nrwmf7IrUDc>j~L>4k~<;zgirEL#1U>2 zevTd0L`=>O(no(lH5{x9Onrp`6)hv z!d|oSJu z5iSl?kL8QJ8_cGyMysg>uVKu#%%oj!MlQ)EZAXKf#L>imLh%U@$xC)RC{G@=@W;x= zV67(mC=}F=QnSo&X3Dy6#m6l%;Lc~}2_B}5kj$urx^+BOqu5o~DcKJ<<@T+TKhJ}} zdrC}TKsEWQh%5PodBlZ}wrjZm4ilW!oo4KkyF9p^Ii`L_h+HkA)nvOkTA z-SUHdEnU>atCN*=s@^q!>&PMduH9@VMgC)ia(2`s+wwB=X%RhHVU*ki%7M=PTLz(} zu0L|{Ys#J9ma+$tPb;;An^NPAcRh*jAMh7#wf+E~rW{lLGN~^(rff|ZlyYIrx!ASJ zXz!ogOE=)`>K9>LP7$pH8ym@V$zPi>$ArWQH{XLhc-cedL8Xc%aV>+RsT^q2ow!(M zUinxA5_y9;gK>$H(wNzMk{KuYJeKn%%P$i0dChOvy&lw2r>hxs;RQ2Qp!CIYK&!-Z z_?pzq3}s_|%`fikIZkv*Qmj!fn0%8rag*?!dB?R<@1aI~=k5gkCWDtU2PSb(q1MjL z(o$~mK`us{mKbRMXduBGgn2zKY;IA)NKWIWd6LH|q?QWsZnJ9kLbi#B#b?|2sB@bb}%V&~H`BvzNBJ-ZuLbx&? zDc8^?3pBE+)VAV0?dwk{3pj2D>A+`>o$r$89gvV$OrRvEvT@_&u#{6dSSJT4VKnBJ zt@3rJ`7o{5Pf{lEYOiVpUwbF;*fjkEw}W~=SEXqXuo28ZX78Q)|6R&BD_1(VJy>F> zf62Ayng^#OLW@ZGX_{1Addk8zr{E-WtrPIg&x`4uN^3=x%ZtscS!zWdF3O=jm*B)bV7E4vWhr9HHSuShac-#HHuBC#z+&)@aVqJ?nI6FkX@M$q z8&48j`s`dV=Xd9bvw2fkGsJ;*WVu#_Z7!Ud-AMMZJh&5;N`ao3JR|J944;}k+HTz5 zmM3Z3yeG$z7ag{_LQc;kCqAV>n+Sjgq_W=%#5zTxX$z#*9Zk4Ml3TIf1F$cGO!+-I z|hzNpVrwp(&X%uitEorq540Ux4qZ4w&t-0yEa zC#vA=5H3D-0nUerpNmeVCV}LkZO~1cc>+^evof<~1A-ZY$U{ih<-bupTaSbKcU2_6N7>o5`+%OKY;8LJ2&3BZBA8|7l!t6 zqsMRePj)TG)c^QWQsts@=*wNhAo(_3A-nSK(Fl5C{*ahR*R2>lEg_RWcjCPzIUE!c zD*!Z)@w>d*W;k5;cEP9WJC#mu!+qo?#XuI!;l6OyOG!p#tDcHqR zpW}j&xN}p7T5{3RIA%6#GTeIrp%$|lKz|_1p7PhiHQ%E|l7k3#g3ERfXFKO-Xk+Ks z-hRT(ZGjub!GCLCAiGKbM-L!Dl`jBV5A%$XhqJ$Tj>; z&I3*!Xqf^NVM)tnCq$ojr-`&Aw6b8$PYJpff?DpS(WHUAn&!}%Y?G0t-GEU$=&T?E zdgh}@twePtkWVimw`fW%>;#)GfsB)Tvet7qohP$VeLT*=wzVtxkpY%ZZ)0w9D;!GuNV25wIW(HKj_0%0B<(J zo*K#W&AS|B2ayPI(%`bbBt*g5ZLy(~(7$5ES>W3e@}~n(P5z~Gis~{^IeoaRo!l#w zdygry)+gz~eA|)*KlkdY7{(@=@Sj-eyqHJv=;`vuxp5cOj?S&iJqxdFiQFmO$`5!GIHSpxu1sc|K#aj!EBpWl!oz(+H+JwcFO^oVLmu!gOM8jh^#d z>0_KZvU!$wTZ>wSOrH~9)V9lwO&}h5Ds0p~P3>VSxN)U!ihqMIl+qyj6^SV!{u%*D z>sxY5)a#Nu@*|qf=iGZXu&Jc|R%Dn7mu#%bU=yvr+*Qt0xi-sYw3qCS1Dygw-)k+! zB^U+S#>RAQnFwo1To%BRr)OnBLcCQrTC5d+^o&wK>iUsihu~*6d8C^I6*|MK$He0@ zg@LI5LNy8s$)CFj4y00@{+(*H|D9@tkBOE%Q7R75o777D9zXhwD?wy*bShuo#55WBwkD4K}uL1UG5VpP!q`=P)x7Q81f)G5X`*jrlmY;sD2a2Iyv*I8A~IP z{4HHjX;aA)+ICn&=u|smF;g$e6mN^D?JqMh0(> zp!-}83B!4|N3~K(Ni;j2U@|?efUg9OmjYVwi>cF_5IxGH(k5F?sImMzaQ)H5PEty( zQW9CI3r~`j6U8(m)dWdIK=L=OWGpT6_GG+N?W;jLxT7ChX6P546CBL-u@-yho!ry} zs9ug$SPc|9=Zh%^+C|O3^A{CohFDdbNE|!3;2qO}iJQ{K3cI%6Z38n^ z4`-lqyr*Cj)NfC;HtHz+p11<3uJU&iXC~&nLDVa=#52L3pCiTeuh#yA_PiTTW>yWz zPLQkOSjc&8+ZD-Si#rq=5?SgndN zW9Guf*2dV!CnJK3!?2p(C!Lo(00l|X3m3D#=v3}nP>rT`Kt~GBR4&-^$IcMlLiDCE zdwxS`V(2ECIB)rYIYg5sG9KeeF9|YlPrafY)cgp$iOdVj&N0z8#TVsws^h)58n5nr z>8RQk9Q?kn+SlC@v)0`t3Q)wYWa`8%Qf!Wwpd4Jel zUw%p|tB=s*L*N)QFd#ZVl~bk8KqKjS!NjR*f^>H7iwVIyr;j-=|L)9WgP|^4v13Xt zLBpxp2M=1$U1HUlh@?@QxBTQ$66Y3HOIAZGtRs;H&L-$T?>g6_s`B~cL;S5&%W{rf zaGzog#vNu1=9G)=gxA6>r_lTu))lq)Ms$}GmcsEKI}5QK@nFBwSr&!u=1u!aa>Rn> zUH)?k=x5`z<$ng2(_-j*{*6SyoCTY)!E0MN_oU+4H1Si5Ico{=?b`xTHjW%Q8H2uMYr3)9<;_3z_%k zhL)Z0-UGhZ#K}N^o^%YMPc*B`@4R!j^VGhF%AF#s5qHhW{s>%<2)Pmu5`z-1cjWx! z;~l(7+S%R!4bbi+I-6t4yd&4{%Kgi=xb(&?1RQ1r`Knkg79eigMT0=ZMCEa%xn@xQ z(7bzYqYUN*DHNI|u+)h&)c`A?99m|3QWrshfR7V_(|h0hPW_FZxC#T?Ms@MXyhQ=r zr{efeHEK@&rIES14o}HU+{qpDR1&5g`)a9`3dYUrPw1aH)Y)qpneLW6R8&~7%n4)O z{wOIDI}U1g2nz1@;(Z5oQ~TeH&nEWd^jm^}UsGbD7FJO5CE=)CnGh}$Qdjn zpXY}PR7l8t?KIg&>D^Ar(H(zn;!60~6Hex)4}S(ZBLdC1llF366XH+c72l>j@Qs6R0$u=fN{jWdX14+x31XUz7Y%q8zJqH9KHZ(GWYsAd zIH71SiTyQUzr%J8&5ks%?yu_qt$SIEtU9lyw*ETi)S3vmOQ+ZeR=H~Ay&fm&m7-lGsh`?q_<&<;FAhYY4!`!5))a}UM2NRE1qj%#3y)sQ zBisR>jatmIl&U%vgF_~0oig6p?9nw|9xZk0b5Nw5cXXvKe#f|)5_s`y2vJo5Ar`ZroQ=nR%MdFgD*;Dez%@1es$x_t|;=pqUR zqy-wNVpFb8v|vE*# z(;ja(*jKXKA|9#S_(|kg7>2Q2$S*MH9n4+E#)PJpu#yV2SeNI1dqNOYZa*%y>qqW- zXG)ah!&Y#6ZwT`xRGk};hZjJ_y|b&t6ZwMa0-rwCj@=GtrNpO`Ul!VNlgb|6TNGu??>X@hZYvBNV|hwjNbIC(SFd_ z5lIlA`~I+CVLBHyRdl0?lVJ+L&HB$vTs`HwU$o^(1QcO?G7!32$!9&dqCdFrefuUbnw_FIL3#dF>=rVrcc_t)c*c9Rht?4 ze&V4~&M;sgu!qSvI`RXFl`mCZ{wAZ@k5|ieya%!o`JLTNZ_@(px+=uhh-uMcA_Q!* z)>dWc`SM*FUGqTMhfPX zb6aiB1(f8uOiR$_v|Ct6_NAFR@_#F0RU%8Gw2*SC3Y}gH#2YbzMntOVehxB7CUS|GB;84LJY@KKV`zI3 zt>ODf_~W!)Okr)anb&myn{2`yJt^b*%AoBD&KS2NaayF#IVy2Mk;TnU!TR*XaRO|) z^@NxMg!cSzx1G0Zg5<5!uM<~dJ9|0nkkTh|d}`z5Li3T>HWsjqc_$r87VG(RioAI- z2A^`Xv4K-0ni=N)P03)jLX)dueSpy~anvMY@-_$OyJQ@?OCL+6SF+x1N9PYs^xqhg zCA{WAQ>t5$GT4`)a;0dYh?sXc5Tk;_Yx+dhb|>t4Q?(g-Elx#>O+V}kG`!B67m_tZ z6t3b5AN2I{lxOvj^g$lGMxAgxPC_byRuadPW#OQUgZSv8sh(5T=|bkt+Wpu_gQp(7@Tjhb_Twnm z6;cKh%32Z~qX^AmO+dv^0uKm5B|Bm8pk%_-y&2-?C*VeP zC@Gl!B?b2&yuMdd&PkfE!STBi0YXV$ngDA^-KDZ3m8049f4} z;jCa#y;1wSQnV~so)?n1LdydIjLra zhZCJ%8lgCoUsF53EZaCDvM)?&Wl=0xE8obx7^8`>@Pc^B+^vNq=VmFqx`RYc6+ILJoygn^00#x4WE75+do|Mgq6_9 zrH8(p=dT_l{+w`?t9V-oO-Rr}58Nqn!BZ>80!2sZNKD}UU1p*>Pb=THX9UZcBRBZJ zZT3`CQ62;biLT`_>Ve+}-`~NTD3CZQex?^}rI&Xvv)4SD1lp6SBFny7$CY+@7Ct#u zbZHmR9Ed-ua#_r!%sqHXP5JV~#Gr1=BXi?vt3i6TiJ)07HzCY3l>@f9QthL-e-nuf zygs<8Aa1f~O9nt=MOR5~L`a%f^r=;Ko?DLvnwKH&(TGc?%XbU3ypLoL8b?cIdF<*- z`+MewyC<-or{-b7!NGAaFfE`V=YWs*`vn>4-&|#I(@2%C)dS3-c&{XbM1q!AlyH0n zP-#fr2?5A@jAVn)mQ?I)*U93{q|MlNPN%I}R7Z*$H=Ek;DTvk&F6^ii?LLdBV#m-X z88P)>!eH$ykmo|pU9O_#1*GV@F;O*ctL&j#$e_h-!wsPOuFUqU&@O_?v(1^Sq7zBd9JoS zr(#Xw^GD9ywLu{y4`nGV1bNT7b;+WiUh)IzO$qf0ih1oOp!o>)>3hN(QN{OITT)E| zP@7JfWiZ7~a$#^}wH(&^#yi=)wXD6|Ov{#%wM@|7mxQoM%02N3gA5!0N&?ol&hM;t`*%)dpm^W`emjjC|MX~Z9-8yVS7^i4KXB~wGHE4htTR9lc;`hOj7;Glf)CrtLvDRtnWIC{cE9(Qoo z!0IFdq+Cr#M5#!mZ*<_kyKK(`f|DUuA3rZGk%5WuVGBg7og0wYZjUaNVB3k_bK}gf z&G~-!WXIGg8yDc!V@^HHV()t_Yga{)@;+btFh5EC9iYKqF-Kp{+L!4})I3Z;m>)52 zRm`)~DJgx@CIpF-3U)h@OTuglg5VL3bO)9tLHdPOzG|20#txGPkRBfahR(dYJrCjK zKwH|NNh1^WJ-5cRfOkaMzP z^_*{629krHIkI2mwoBaS3L5sO529}iJyd6SzJyRr5*u(Q5zHjzyu4h~oP?B++|?6S z$3n>HCODR0?bEFaG5m4RWnI1mX_LO7+6^yzV>|w0r}(FqXNjYnXA+C`T;3+TwGWj= zGI9RKy)lv4DNkB#dEhTT6{yABQoEh1mLNsc%mPc2f6=`*<2H0|KXYSc``9d)=h2Q5 z75&Hm*ssfpr$A>D^xvsQ$KR<&>X4<8Vc?-a!tvfykWP7e+?JVe&E(FA25wf!&$q%& z?;pZR^2aHiu(I1(+*(%7K}`*V@0=tJ*bTr%VZ^@&`naq#d>RsR0p1`S9 zzjB#F5&)sLBR?&v@VPFvIc??<=zKDGepmpL*taCm4NGnsN*LgJ@SPNh+J_==(06hy zJ-nOz48issiXF*kwf?Y-b;yAl+$Eo|gHd|e^udxWawQT44~BwCdkeYXGxzf}x3nob z)m}u`?L^}{>=8b82yRuQd9lPW>)u%bx`c{Uq-*XzX6vOK>I4!K-HDCQ7hz$f#blGa zWQY@C*K%sXy`UhFPmn*X_lx9YLf=T(Un3bTmGENSGSzxeZORO=J6W&4iI5sI`Iom7 zk!j<3&Aa0&8`Z0fZZ(2!1kKzbd0>s7c^A>bm&E&1wYMn6LgBSDo;;9*(oehgy84$I z#)#NH{9)pQg3(xnrAnq@mw-bTc8oO-;$pC&cuR5(OjsCjHpXKd89%dL#(SN%I#Uy$ z=W_uQ-xhsrT>2cVDX{z8t5HV?!NMdL#5}Xvl=vaPz{cyD?0xZ>e3kr$ob%rOr{R8ir(v#WQMSzGeXJZrns?I)RrWf(1PDL1@?;+43fXx1Rj$ zoRGW3J-Xe7Vp7j^-v~5{-YNca7@f7G@{QHdQ0U+5$q>KM$&gc2dACW_}E$n55kmAPw+)v zX3txG*%G|T@~I2%w^Uq%Yf{a&Kt_vtFWsjJEmo(0ne7)H7CP=Q` zhGuYWs=yx9(Qfu5SKtoc&<$6< zrC_wwaJ+YLWh!90?%!duM(eK82cXd#)Mk5}0(O!KWx}U=K%6Y(N{xH0P$Fb6@^i}n zma*JLo1qqbs(6wvIpxgPed zxfyv>{6GoJ9~`a;l|QNWa}B;6%3}#mPgyl>gm#MK3FvD2JSIfT!AE0m!84Yr^}|*$ z=1x#Y8aY3uLn6;zd$2DT>;(Ay_Uk5$uC1PTX@4liXx^yx?%b<<)WCfv!n5JG?rFYN z4ozTG4!ix~!4o%N>>(!JbH**L#F>e} z$&xB7;QZ!4dmF7=8QKzj&=PI*Y&nCe=if>0(1T57$XVv%!g1;0C!GZ0B%kC>i)RVY z$*wl#wf^%%xBUKl%a6!QOv!;9*>D&W3dWjx63ROSuhfUlXoQFdvF&>~{b_q3mqqDe z^M{KPiLe0SK8U*HOXcMqH;;$JL%U0Y@+Xc5K5#dj=}F7PrkuH!X8dn^sqKDzQ3D*- zwHmfOekS=b6`|d)D{p=+&(SFuMkWJM6w2fp?)5?Vl0PArxU@OQ(uc;@lRruwS7UimG ztFbzz%SD1SKn5dvXtv(g2)GH5Yus`Vp43{?%lt6aX3*qaqQp$6zwx#{UN>V$s=QCC zG`qFi6s^dIfk}DZsVq~IB-A7WP>|B6PPS%{e4;Ps)3uR&zvo8ZGZV?xe#f#V{MjL) z-}O>9B!NwBI#`WF?)#*qD*`n;%#DEfCMT;gflOk?lNI-X$FF2(0(62{^LhzGZWf0e z4uVUi)RNHS^Vn}rIgq@25Kd0?z4NUo*Rb4MIhN@=KL*GwnqHJHb5R}qmy2nlfwEvR zUU&x(njFKMI9GMKipgz_b|NY8CgCR8%uM;Xlu-8Txr-{}TnyVD3^2zxRFJ`*PnDi* zZ6A(~Ai;)P&2Ogs&PlLRmmby>%dacwX{D*K`$->*A`O`_)m~MwWS$F0%&Askm*GSv z(lVIIxobSQldwL?){pF`N^QILz{#uDm+z#Nm%>#0w5?LJDR9TdYj(=Z;7fnr!{SuJ zZQ$^U3YyHuC?Pck)5H%oWKbKWhLKN9sL!C!M!JoYCm(273ZRUt+j>0tIBTQel|Yg^ zMrto#^W~i#s6PqtsVXdZeklOX7fqxg>Fm!%T)EYf+C|dAM87{Ac3%AT$xd?~j9Pjm&+-|<&66B?>0p2xH>H)gnr2KFmr13O�G~Bk>VT$dTqXnd)kCc=Vokh742~ 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 oG=$#U9zRk%O1R_G*&rTe(?IhT!@Q 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 literal 0 HcmV?d00001 diff --git a/sign/mldsa/testdata/ML-DSA-sigGen-FIPS204/prompt.json.gz b/sign/mldsa/testdata/ML-DSA-sigGen-FIPS204/prompt.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..99aced4107f814217fd0498f9d3591d1c13b6079 GIT binary patch literal 538935 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

_8qbP;I+A&FuwUyY}Q&mwhftS#|9IN0@NZ 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�Yff7OL`2uJ80_S^-pkSh9 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

44I^<(E5l1B|4L-*h-OMx9$~C} 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 V{_8*g?eD+-^>0ufJIE-J4gjZx6pR1> literal 0 HcmV?d00001 diff --git a/sign/mldsa/testdata/ML-DSA-sigVer-FIPS204/expectedResults.json.gz b/sign/mldsa/testdata/ML-DSA-sigVer-FIPS204/expectedResults.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..b2f8ba949282bb0f05cb6e3c0a4e6cd2a4059755 GIT binary patch literal 355 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⁡johIkm7PymAwU1E;WOHR%?W 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 literal 0 HcmV?d00001 diff --git a/sign/schemes/schemes.go b/sign/schemes/schemes.go index 66ee61253..d01d8ca2a 100644 --- a/sign/schemes/schemes.go +++ b/sign/schemes/schemes.go @@ -16,6 +16,13 @@ import ( "github.com/cloudflare/circl/sign/ed448" "github.com/cloudflare/circl/sign/eddilithium2" "github.com/cloudflare/circl/sign/eddilithium3" + + dilithium2 "github.com/cloudflare/circl/sign/dilithium/mode2" + dilithium3 "github.com/cloudflare/circl/sign/dilithium/mode3" + dilithium5 "github.com/cloudflare/circl/sign/dilithium/mode5" + "github.com/cloudflare/circl/sign/mldsa/mldsa44" + "github.com/cloudflare/circl/sign/mldsa/mldsa65" + "github.com/cloudflare/circl/sign/mldsa/mldsa87" ) var allSchemes = [...]sign.Scheme{ @@ -23,6 +30,12 @@ var allSchemes = [...]sign.Scheme{ ed448.Scheme(), eddilithium2.Scheme(), eddilithium3.Scheme(), + dilithium2.Scheme(), + dilithium3.Scheme(), + dilithium5.Scheme(), + mldsa44.Scheme(), + mldsa65.Scheme(), + mldsa87.Scheme(), } var allSchemeNames map[string]sign.Scheme diff --git a/sign/schemes/schemes_test.go b/sign/schemes/schemes_test.go index dfa044d78..3242c7966 100644 --- a/sign/schemes/schemes_test.go +++ b/sign/schemes/schemes_test.go @@ -116,6 +116,12 @@ func Example() { // Ed448 // Ed25519-Dilithium2 // Ed448-Dilithium3 + // Dilithium2 + // Dilithium3 + // Dilithium5 + // ML-DSA-44 + // ML-DSA-65 + // ML-DSA-87 } func BenchmarkGenerateKeyPair(b *testing.B) { diff --git a/sign/sign.go b/sign/sign.go index 13b20fa4b..557d6f096 100644 --- a/sign/sign.go +++ b/sign/sign.go @@ -107,4 +107,7 @@ var ( // ErrContextNotSupported is the error used if a context is not // supported. ErrContextNotSupported = errors.New("context not supported") + + // ErrContextTooLong is the error used if the context string is too long. + ErrContextTooLong = errors.New("context string too long") ) From 0246d594e034d4774a58ce2e4d2780201d2f283d Mon Sep 17 00:00:00 2001 From: armfazh Date: Wed, 9 Oct 2024 08:43:38 -0700 Subject: [PATCH 17/45] Add test for ML-DSA signature verification. --- sign/dilithium/templates/acvp.templ.go | 3 ++- sign/dilithium/templates/pkg.templ.go | 13 ++++++++++++- sign/mldsa/mldsa44/acvp_test.go | 3 ++- sign/mldsa/mldsa44/dilithium.go | 13 ++++++++++++- sign/mldsa/mldsa65/acvp_test.go | 3 ++- sign/mldsa/mldsa65/dilithium.go | 13 ++++++++++++- sign/mldsa/mldsa87/acvp_test.go | 3 ++- sign/mldsa/mldsa87/dilithium.go | 13 ++++++++++++- 8 files changed, 56 insertions(+), 8 deletions(-) diff --git a/sign/dilithium/templates/acvp.templ.go b/sign/dilithium/templates/acvp.templ.go index a86d8fd8b..266527384 100644 --- a/sign/dilithium/templates/acvp.templ.go +++ b/sign/dilithium/templates/acvp.templ.go @@ -53,6 +53,7 @@ func TestACVP(t *testing.T) { for _, sub := range []string{ "keyGen", "sigGen", + "sigVer", } { t.Run(sub, func(t *testing.T) { testACVP(t, sub) @@ -254,7 +255,7 @@ func testACVP(t *testing.T, sub string) { t.Fatal(err) } - passed2 := scheme.Verify(pk, test.Message, test.Signature, nil) + passed2 := unsafeVerifyInternal(pk.(*PublicKey), test.Message, test.Signature) if passed2 != result.TestPassed { t.Fatalf("verification %v ≠ %v", passed2, result.TestPassed) } diff --git a/sign/dilithium/templates/pkg.templ.go b/sign/dilithium/templates/pkg.templ.go index 238de68c7..a48578e8e 100644 --- a/sign/dilithium/templates/pkg.templ.go +++ b/sign/dilithium/templates/pkg.templ.go @@ -121,13 +121,24 @@ func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { internal.SignTo( (*internal.PrivateKey)(sk), func (w io.Writer) { - w.Write(msg) + _, _ = w.Write(msg) }, rnd, ret[:], ) return ret[:] } + +// Do not use. Implements ML-DSA.Verify_internal used for compatibility tests. +func unsafeVerifyInternal(pk *PublicKey, msg, sig []byte) bool { + return internal.Verify( + (*internal.PublicKey)(pk), + func(w io.Writer) { + _, _ = w.Write(msg) + }, + sig, + ) +} {{- end }} // Verify checks whether the given signature by pk on msg is valid. diff --git a/sign/mldsa/mldsa44/acvp_test.go b/sign/mldsa/mldsa44/acvp_test.go index 09ef2c1af..a8de9b157 100644 --- a/sign/mldsa/mldsa44/acvp_test.go +++ b/sign/mldsa/mldsa44/acvp_test.go @@ -49,6 +49,7 @@ func TestACVP(t *testing.T) { for _, sub := range []string{ "keyGen", "sigGen", + "sigVer", } { t.Run(sub, func(t *testing.T) { testACVP(t, sub) @@ -250,7 +251,7 @@ func testACVP(t *testing.T, sub string) { t.Fatal(err) } - passed2 := scheme.Verify(pk, test.Message, test.Signature, nil) + passed2 := unsafeVerifyInternal(pk.(*PublicKey), test.Message, test.Signature) if passed2 != result.TestPassed { t.Fatalf("verification %v ≠ %v", passed2, result.TestPassed) } diff --git a/sign/mldsa/mldsa44/dilithium.go b/sign/mldsa/mldsa44/dilithium.go index 257d824ee..eb01c6ba9 100644 --- a/sign/mldsa/mldsa44/dilithium.go +++ b/sign/mldsa/mldsa44/dilithium.go @@ -88,7 +88,7 @@ func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { internal.SignTo( (*internal.PrivateKey)(sk), func(w io.Writer) { - w.Write(msg) + _, _ = w.Write(msg) }, rnd, ret[:], @@ -96,6 +96,17 @@ func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { return ret[:] } +// Do not use. Implements ML-DSA.Verify_internal used for compatibility tests. +func unsafeVerifyInternal(pk *PublicKey, msg, sig []byte) bool { + return internal.Verify( + (*internal.PublicKey)(pk), + func(w io.Writer) { + _, _ = w.Write(msg) + }, + sig, + ) +} + // Verify checks whether the given signature by pk on msg is valid. // // ctx is the optional context string. Fails if ctx is larger than 255 bytes. diff --git a/sign/mldsa/mldsa65/acvp_test.go b/sign/mldsa/mldsa65/acvp_test.go index 24742cb0e..48699c983 100644 --- a/sign/mldsa/mldsa65/acvp_test.go +++ b/sign/mldsa/mldsa65/acvp_test.go @@ -49,6 +49,7 @@ func TestACVP(t *testing.T) { for _, sub := range []string{ "keyGen", "sigGen", + "sigVer", } { t.Run(sub, func(t *testing.T) { testACVP(t, sub) @@ -250,7 +251,7 @@ func testACVP(t *testing.T, sub string) { t.Fatal(err) } - passed2 := scheme.Verify(pk, test.Message, test.Signature, nil) + passed2 := unsafeVerifyInternal(pk.(*PublicKey), test.Message, test.Signature) if passed2 != result.TestPassed { t.Fatalf("verification %v ≠ %v", passed2, result.TestPassed) } diff --git a/sign/mldsa/mldsa65/dilithium.go b/sign/mldsa/mldsa65/dilithium.go index e54459863..282c3623e 100644 --- a/sign/mldsa/mldsa65/dilithium.go +++ b/sign/mldsa/mldsa65/dilithium.go @@ -88,7 +88,7 @@ func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { internal.SignTo( (*internal.PrivateKey)(sk), func(w io.Writer) { - w.Write(msg) + _, _ = w.Write(msg) }, rnd, ret[:], @@ -96,6 +96,17 @@ func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { return ret[:] } +// Do not use. Implements ML-DSA.Verify_internal used for compatibility tests. +func unsafeVerifyInternal(pk *PublicKey, msg, sig []byte) bool { + return internal.Verify( + (*internal.PublicKey)(pk), + func(w io.Writer) { + _, _ = w.Write(msg) + }, + sig, + ) +} + // Verify checks whether the given signature by pk on msg is valid. // // ctx is the optional context string. Fails if ctx is larger than 255 bytes. diff --git a/sign/mldsa/mldsa87/acvp_test.go b/sign/mldsa/mldsa87/acvp_test.go index b124d4553..63d4249cf 100644 --- a/sign/mldsa/mldsa87/acvp_test.go +++ b/sign/mldsa/mldsa87/acvp_test.go @@ -49,6 +49,7 @@ func TestACVP(t *testing.T) { for _, sub := range []string{ "keyGen", "sigGen", + "sigVer", } { t.Run(sub, func(t *testing.T) { testACVP(t, sub) @@ -250,7 +251,7 @@ func testACVP(t *testing.T, sub string) { t.Fatal(err) } - passed2 := scheme.Verify(pk, test.Message, test.Signature, nil) + passed2 := unsafeVerifyInternal(pk.(*PublicKey), test.Message, test.Signature) if passed2 != result.TestPassed { t.Fatalf("verification %v ≠ %v", passed2, result.TestPassed) } diff --git a/sign/mldsa/mldsa87/dilithium.go b/sign/mldsa/mldsa87/dilithium.go index 69ab919d8..2d5c466d3 100644 --- a/sign/mldsa/mldsa87/dilithium.go +++ b/sign/mldsa/mldsa87/dilithium.go @@ -88,7 +88,7 @@ func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { internal.SignTo( (*internal.PrivateKey)(sk), func(w io.Writer) { - w.Write(msg) + _, _ = w.Write(msg) }, rnd, ret[:], @@ -96,6 +96,17 @@ func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { return ret[:] } +// Do not use. Implements ML-DSA.Verify_internal used for compatibility tests. +func unsafeVerifyInternal(pk *PublicKey, msg, sig []byte) bool { + return internal.Verify( + (*internal.PublicKey)(pk), + func(w io.Writer) { + _, _ = w.Write(msg) + }, + sig, + ) +} + // Verify checks whether the given signature by pk on msg is valid. // // ctx is the optional context string. Fails if ctx is larger than 255 bytes. From 1310edfc1c8a602380c10a469095a3c0b2bd7213 Mon Sep 17 00:00:00 2001 From: armfazh Date: Thu, 10 Oct 2024 11:50:46 -0700 Subject: [PATCH 18/45] Release v1.5.0 --- CITATION.cff | 6 +++--- README.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 02ad6abb7..806c6ca1c 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,6 +1,6 @@ --- cff-version: 1.2.0 -version: 1.4.0 +version: 1.5.0 title: "Introducing CIRCL: An Advanced Cryptographic Library" license: BSD-3-Clause abstract: > @@ -10,7 +10,7 @@ abstract: > deployment of cryptographic algorithms targeting Post-Quantum (PQ) and Elliptic Curve Cryptography (ECC). authors: - - family-names: Faz-Hernández + - family-names: Faz-Hernandez given-names: Armando affiliation: Cloudflare, Inc. orcid: "https://orcid.org/0000-0001-5502-8666" @@ -25,6 +25,6 @@ keywords: - golang repository-code: "https://github.com/cloudflare/circl/" type: software -message: "Available at https://github.com/cloudflare/circl. v1.4.0 Accessed Aug, 2024." +message: "Available at https://github.com/cloudflare/circl. v1.5.0 Accessed Oct, 2024." contact: - name: "Cloudflare, Inc." diff --git a/README.md b/README.md index 271a7d67c..9469de22b 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ APA Style ``` Faz-Hernandez, A. and Kwiatkowski, K. (2019). Introducing CIRCL: An Advanced Cryptographic Library. Cloudflare. Available at -https://github.com/cloudflare/circl. v1.4.0 Accessed Aug, 2024. +https://github.com/cloudflare/circl. v1.5.0 Accessed Oct, 2024. ``` Bibtex Source @@ -177,7 +177,7 @@ Bibtex Source of this library is to be used as a tool for experimental deployment of cryptographic algorithms targeting Post-Quantum (PQ) and Elliptic Curve Cryptography (ECC).}}, - note = {Available at \url{https://github.com/cloudflare/circl}. v1.4.0 Accessed Aug, 2024}, + note = {Available at \url{https://github.com/cloudflare/circl}. v1.5.0 Accessed Oct, 2024}, month = jun, year = {2019} } From 392a38c5846174fd4403e3864480776d0132a22f Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Wed, 16 Oct 2024 13:01:56 +0200 Subject: [PATCH 19/45] Add OIDs to ML-DSA --- sign/dilithium/gen.go | 19 +++++++++++++++++++ sign/dilithium/mode2/dilithium.go | 2 +- sign/dilithium/mode3/dilithium.go | 2 +- sign/dilithium/mode5/dilithium.go | 2 +- sign/dilithium/templates/pkg.templ.go | 11 ++++++++++- sign/mldsa/mldsa44/dilithium.go | 6 +++++- sign/mldsa/mldsa65/dilithium.go | 6 +++++- sign/mldsa/mldsa87/dilithium.go | 6 +++++- 8 files changed, 47 insertions(+), 7 deletions(-) diff --git a/sign/dilithium/gen.go b/sign/dilithium/gen.go index a817f4a41..4cc690825 100644 --- a/sign/dilithium/gen.go +++ b/sign/dilithium/gen.go @@ -7,6 +7,7 @@ package main import ( "bytes" + "encoding/asn1" "fmt" "go/format" "os" @@ -29,6 +30,7 @@ type Mode struct { Gamma2 int TRSize int CTildeSize int + Oid asn1.ObjectIdentifier } func (m Mode) Pkg() string { @@ -59,6 +61,20 @@ func (m Mode) NIST() bool { return strings.HasPrefix(m.Name, "ML-DSA-") } +func (m Mode) OidGo() string { + ret := "asn1.ObjectIdentifier{" + first := true + for _, b := range m.Oid { + if first { + first = false + } else { + ret += ", " + } + ret += fmt.Sprintf("%d", b) + } + return ret + "}" +} + var ( Modes = []Mode{ { @@ -112,6 +128,7 @@ var ( Gamma2: (params.Q - 1) / 88, TRSize: 64, CTildeSize: 32, + Oid: asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 17}, }, { Name: "ML-DSA-65", @@ -125,6 +142,7 @@ var ( Gamma2: (params.Q - 1) / 32, TRSize: 64, CTildeSize: 48, + Oid: asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 18}, }, { Name: "ML-DSA-87", @@ -138,6 +156,7 @@ var ( Gamma2: (params.Q - 1) / 32, TRSize: 64, CTildeSize: 64, + Oid: asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 19}, }, } TemplateWarning = "// Code generated from" diff --git a/sign/dilithium/mode2/dilithium.go b/sign/dilithium/mode2/dilithium.go index 113708a32..5e693895d 100644 --- a/sign/dilithium/mode2/dilithium.go +++ b/sign/dilithium/mode2/dilithium.go @@ -203,7 +203,7 @@ func (*scheme) PrivateKeySize() int { return PrivateKeySize } func (*scheme) SignatureSize() int { return SignatureSize } func (*scheme) SeedSize() int { return SeedSize } -// TODO TLSIdentifier() and OID() +// TODO TLSIdentifier() func (*scheme) SupportsContext() bool { return false diff --git a/sign/dilithium/mode3/dilithium.go b/sign/dilithium/mode3/dilithium.go index 2e93e9c50..5a3356125 100644 --- a/sign/dilithium/mode3/dilithium.go +++ b/sign/dilithium/mode3/dilithium.go @@ -203,7 +203,7 @@ func (*scheme) PrivateKeySize() int { return PrivateKeySize } func (*scheme) SignatureSize() int { return SignatureSize } func (*scheme) SeedSize() int { return SeedSize } -// TODO TLSIdentifier() and OID() +// TODO TLSIdentifier() func (*scheme) SupportsContext() bool { return false diff --git a/sign/dilithium/mode5/dilithium.go b/sign/dilithium/mode5/dilithium.go index ce3ec7546..3058692e2 100644 --- a/sign/dilithium/mode5/dilithium.go +++ b/sign/dilithium/mode5/dilithium.go @@ -203,7 +203,7 @@ func (*scheme) PrivateKeySize() int { return PrivateKeySize } func (*scheme) SignatureSize() int { return SignatureSize } func (*scheme) SeedSize() int { return SeedSize } -// TODO TLSIdentifier() and OID() +// TODO TLSIdentifier() func (*scheme) SupportsContext() bool { return false diff --git a/sign/dilithium/templates/pkg.templ.go b/sign/dilithium/templates/pkg.templ.go index a48578e8e..bb3b009d1 100644 --- a/sign/dilithium/templates/pkg.templ.go +++ b/sign/dilithium/templates/pkg.templ.go @@ -17,6 +17,9 @@ package {{.Pkg}} import ( "crypto" "errors" +{{- if .Oid }} + "encoding/asn1" +{{- end }} "io" {{- if .NIST }} @@ -305,7 +308,13 @@ func (*scheme) PublicKeySize() int { return PublicKeySize } func (*scheme) PrivateKeySize() int { return PrivateKeySize } func (*scheme) SignatureSize() int { return SignatureSize } func (*scheme) SeedSize() int { return SeedSize } -// TODO TLSIdentifier() and OID() +// TODO TLSIdentifier() + +{{- if .Oid }} +func (*scheme) Oid() asn1.ObjectIdentifier { + return {{ .OidGo }} +} +{{- end }} func (*scheme) SupportsContext() bool { {{- if .NIST }} diff --git a/sign/mldsa/mldsa44/dilithium.go b/sign/mldsa/mldsa44/dilithium.go index eb01c6ba9..4b640f0c1 100644 --- a/sign/mldsa/mldsa44/dilithium.go +++ b/sign/mldsa/mldsa44/dilithium.go @@ -6,6 +6,7 @@ package mldsa44 import ( "crypto" cryptoRand "crypto/rand" + "encoding/asn1" "errors" "io" @@ -260,7 +261,10 @@ func (*scheme) PrivateKeySize() int { return PrivateKeySize } func (*scheme) SignatureSize() int { return SignatureSize } func (*scheme) SeedSize() int { return SeedSize } -// TODO TLSIdentifier() and OID() +// TODO TLSIdentifier() +func (*scheme) Oid() asn1.ObjectIdentifier { + return asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 17} +} func (*scheme) SupportsContext() bool { return true diff --git a/sign/mldsa/mldsa65/dilithium.go b/sign/mldsa/mldsa65/dilithium.go index 282c3623e..23a7b9a1f 100644 --- a/sign/mldsa/mldsa65/dilithium.go +++ b/sign/mldsa/mldsa65/dilithium.go @@ -6,6 +6,7 @@ package mldsa65 import ( "crypto" cryptoRand "crypto/rand" + "encoding/asn1" "errors" "io" @@ -260,7 +261,10 @@ func (*scheme) PrivateKeySize() int { return PrivateKeySize } func (*scheme) SignatureSize() int { return SignatureSize } func (*scheme) SeedSize() int { return SeedSize } -// TODO TLSIdentifier() and OID() +// TODO TLSIdentifier() +func (*scheme) Oid() asn1.ObjectIdentifier { + return asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 18} +} func (*scheme) SupportsContext() bool { return true diff --git a/sign/mldsa/mldsa87/dilithium.go b/sign/mldsa/mldsa87/dilithium.go index 2d5c466d3..cb016e73d 100644 --- a/sign/mldsa/mldsa87/dilithium.go +++ b/sign/mldsa/mldsa87/dilithium.go @@ -6,6 +6,7 @@ package mldsa87 import ( "crypto" cryptoRand "crypto/rand" + "encoding/asn1" "errors" "io" @@ -260,7 +261,10 @@ func (*scheme) PrivateKeySize() int { return PrivateKeySize } func (*scheme) SignatureSize() int { return SignatureSize } func (*scheme) SeedSize() int { return SeedSize } -// TODO TLSIdentifier() and OID() +// TODO TLSIdentifier() +func (*scheme) Oid() asn1.ObjectIdentifier { + return asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 19} +} func (*scheme) SupportsContext() bool { return true From 91946a37b9b8da646abe6252153d918707cda136 Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Thu, 17 Oct 2024 00:02:51 +0200 Subject: [PATCH 20/45] Update sign/dilithium/gen.go Co-authored-by: Armando Faz --- sign/dilithium/gen.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sign/dilithium/gen.go b/sign/dilithium/gen.go index 4cc690825..41ede82c1 100644 --- a/sign/dilithium/gen.go +++ b/sign/dilithium/gen.go @@ -61,6 +61,7 @@ func (m Mode) NIST() bool { return strings.HasPrefix(m.Name, "ML-DSA-") } +// https://csrc.nist.gov/Projects/computer-security-objects-register/algorithm-registration func (m Mode) OidGo() string { ret := "asn1.ObjectIdentifier{" first := true From f203c3c24d37a0f5699fbb03d475413ae62f98a2 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 16 Dec 2024 22:47:34 -0800 Subject: [PATCH 21/45] Adds Prio3 a set of verifiable distributed aggregation functions. Prio3 supports several variants for aggregating data measurements in a privacy preserving manner. This implementation is compliant with v13 of CRFG draft VDAF https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#name-prio3 --- vdaf/prio3/arith/arith.go | 133 + vdaf/prio3/arith/field_test.go | 335 +++ vdaf/prio3/arith/fp128/fiatMont.go | 288 ++ vdaf/prio3/arith/fp128/fp.go | 277 ++ vdaf/prio3/arith/fp128/inverse.go | 27 + vdaf/prio3/arith/fp128/poly.go | 68 + vdaf/prio3/arith/fp128/vector.go | 222 ++ vdaf/prio3/arith/fp128_test.go | 21 + vdaf/prio3/arith/fp64/fiatMont.go | 171 ++ vdaf/prio3/arith/fp64/fp.go | 242 ++ vdaf/prio3/arith/fp64/inverse.go | 25 + vdaf/prio3/arith/fp64/poly.go | 68 + vdaf/prio3/arith/fp64/vector.go | 221 ++ vdaf/prio3/arith/fp64_test.go | 21 + vdaf/prio3/arith/gen.go | 182 ++ vdaf/prio3/arith/genFiatMont.go | 79 + vdaf/prio3/arith/poly_test.go | 153 ++ vdaf/prio3/arith/templates/fp.go.tmpl | 217 ++ vdaf/prio3/arith/templates/fp_test.go.tmpl | 25 + vdaf/prio3/arith/templates/poly.go.tmpl | 72 + vdaf/prio3/arith/templates/vector.go.tmpl | 233 ++ vdaf/prio3/arith/vector_test.go | 158 ++ vdaf/prio3/common_test.go | 110 + vdaf/prio3/count/count.go | 121 + vdaf/prio3/doc.go | 13 + vdaf/prio3/histogram/histogram.go | 137 + vdaf/prio3/internal/cursor/cursor.go | 15 + vdaf/prio3/internal/flp/flp.go | 144 + vdaf/prio3/internal/flp/gadgets.go | 140 + vdaf/prio3/internal/flp/valid.go | 97 + vdaf/prio3/internal/prio3/prio3.go | 537 ++++ vdaf/prio3/internal/prio3/types.go | 390 +++ vdaf/prio3/internal/prio3/xof.go | 216 ++ vdaf/prio3/mhcv/mhcv.go | 200 ++ vdaf/prio3/prio3_test.go | 234 ++ vdaf/prio3/sum/sum.go | 160 ++ vdaf/prio3/sumvec/sumvec.go | 152 ++ vdaf/prio3/testdata/Prio3Count_0.json | 40 + vdaf/prio3/testdata/Prio3Count_1.json | 46 + vdaf/prio3/testdata/Prio3Count_2.json | 148 ++ vdaf/prio3/testdata/Prio3Histogram_0.json | 53 + vdaf/prio3/testdata/Prio3Histogram_1.json | 90 + vdaf/prio3/testdata/Prio3Histogram_2.json | 2366 +++++++++++++++++ .../testdata/Prio3MultihotCountVec_0.json | 59 + .../testdata/Prio3MultihotCountVec_1.json | 113 + .../testdata/Prio3MultihotCountVec_2.json | 211 ++ vdaf/prio3/testdata/Prio3SumVec_0.json | 195 ++ vdaf/prio3/testdata/Prio3SumVec_1.json | 147 + vdaf/prio3/testdata/Prio3Sum_0.json | 41 + vdaf/prio3/testdata/Prio3Sum_1.json | 47 + vdaf/prio3/testdata/Prio3Sum_2.json | 230 ++ vdaf/prio3/testdata/XofTurboShake128.json | 8 + vdaf/prio3/vectors_test.go | 219 ++ vdaf/prio3/xof_test.go | 95 + 54 files changed, 10012 insertions(+) create mode 100644 vdaf/prio3/arith/arith.go create mode 100644 vdaf/prio3/arith/field_test.go create mode 100644 vdaf/prio3/arith/fp128/fiatMont.go create mode 100644 vdaf/prio3/arith/fp128/fp.go create mode 100644 vdaf/prio3/arith/fp128/inverse.go create mode 100644 vdaf/prio3/arith/fp128/poly.go create mode 100644 vdaf/prio3/arith/fp128/vector.go create mode 100644 vdaf/prio3/arith/fp128_test.go create mode 100644 vdaf/prio3/arith/fp64/fiatMont.go create mode 100644 vdaf/prio3/arith/fp64/fp.go create mode 100644 vdaf/prio3/arith/fp64/inverse.go create mode 100644 vdaf/prio3/arith/fp64/poly.go create mode 100644 vdaf/prio3/arith/fp64/vector.go create mode 100644 vdaf/prio3/arith/fp64_test.go create mode 100644 vdaf/prio3/arith/gen.go create mode 100644 vdaf/prio3/arith/genFiatMont.go create mode 100644 vdaf/prio3/arith/poly_test.go create mode 100644 vdaf/prio3/arith/templates/fp.go.tmpl create mode 100644 vdaf/prio3/arith/templates/fp_test.go.tmpl create mode 100644 vdaf/prio3/arith/templates/poly.go.tmpl create mode 100644 vdaf/prio3/arith/templates/vector.go.tmpl create mode 100644 vdaf/prio3/arith/vector_test.go create mode 100644 vdaf/prio3/common_test.go create mode 100644 vdaf/prio3/count/count.go create mode 100644 vdaf/prio3/doc.go create mode 100644 vdaf/prio3/histogram/histogram.go create mode 100644 vdaf/prio3/internal/cursor/cursor.go create mode 100644 vdaf/prio3/internal/flp/flp.go create mode 100644 vdaf/prio3/internal/flp/gadgets.go create mode 100644 vdaf/prio3/internal/flp/valid.go create mode 100644 vdaf/prio3/internal/prio3/prio3.go create mode 100644 vdaf/prio3/internal/prio3/types.go create mode 100644 vdaf/prio3/internal/prio3/xof.go create mode 100644 vdaf/prio3/mhcv/mhcv.go create mode 100644 vdaf/prio3/prio3_test.go create mode 100644 vdaf/prio3/sum/sum.go create mode 100644 vdaf/prio3/sumvec/sumvec.go create mode 100644 vdaf/prio3/testdata/Prio3Count_0.json create mode 100644 vdaf/prio3/testdata/Prio3Count_1.json create mode 100644 vdaf/prio3/testdata/Prio3Count_2.json create mode 100644 vdaf/prio3/testdata/Prio3Histogram_0.json create mode 100644 vdaf/prio3/testdata/Prio3Histogram_1.json create mode 100644 vdaf/prio3/testdata/Prio3Histogram_2.json create mode 100644 vdaf/prio3/testdata/Prio3MultihotCountVec_0.json create mode 100644 vdaf/prio3/testdata/Prio3MultihotCountVec_1.json create mode 100644 vdaf/prio3/testdata/Prio3MultihotCountVec_2.json create mode 100644 vdaf/prio3/testdata/Prio3SumVec_0.json create mode 100644 vdaf/prio3/testdata/Prio3SumVec_1.json create mode 100644 vdaf/prio3/testdata/Prio3Sum_0.json create mode 100644 vdaf/prio3/testdata/Prio3Sum_1.json create mode 100644 vdaf/prio3/testdata/Prio3Sum_2.json create mode 100644 vdaf/prio3/testdata/XofTurboShake128.json create mode 100644 vdaf/prio3/vectors_test.go create mode 100644 vdaf/prio3/xof_test.go diff --git a/vdaf/prio3/arith/arith.go b/vdaf/prio3/arith/arith.go new file mode 100644 index 000000000..d9f6feef4 --- /dev/null +++ b/vdaf/prio3/arith/arith.go @@ -0,0 +1,133 @@ +//go:generate go run gen.go + +// Package arith provides arithmetic operations over prime fields, vectors, +// and polynomials. +package arith + +import ( + "encoding" + "io" + + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/internal/sha3" + "golang.org/x/crypto/cryptobyte" +) + +// Elt is any type that stores a prime field element. +type Elt any + +// Fp lists the functionality that a prime field element must have denoting +// methods with a pointer receiver. +type Fp[E Elt] interface { + *E + // Size returns the number of bytes to encode a field element. + Size() uint + // Returns true if the element is the neutral additive element. + IsZero() bool + // Returns true if the element is the neutral multiplicative element. + IsOne() bool + // Returns true if the element is equivalent to x. + IsEqual(x *E) bool + // Set the element to the neutral additive element. + SetOne() + // Set the element to x if x < Order(). + SetUint64(uint64) error + // Returns the integer representative of the element if x < 2^64. + GetUint64() (x uint64, err error) + // Set the element to the principal root of unity of order 2^n. + SetRootOfUnityTwoN(n uint) + // AddAssing calculates z = z + x. + AddAssign(x *E) + // SubAssign calculates z = z - x. + SubAssign(x *E) + // MulAssign calculates z = z * x. + MulAssign(x *E) + // Add calculates z = x + y. + Add(x, y *E) + // Sub calculates z = x - y. + Sub(x, y *E) + // Mul calculates z = x * y. + Mul(x, y *E) + // Sqr calculates z = x * x. + Sqr(x *E) + // Inv calculates z = 1 / x. + Inv(x *E) + // InvUint64 calculates z = 1 / x. + InvUint64(x uint64) + // InvTwoN calculates z = 1 / 2^n. + InvTwoN(x uint) + // Random samples an element from an io.Reader. + Random(io.Reader) error + // RandomSHA3 samples an element from a SHA3 state. + RandomSHA3(*sha3.State) error + // Encodes an element to bytes. + encoding.BinaryMarshaler + // Decodes an element from bytes. + encoding.BinaryUnmarshaler + // Encodes an element using a cryptobyte.Builder. + cryptobyte.MarshalingValue + // Decodes an element from a cryptobyte.String. + conv.UnmarshalingValue +} + +// NewVec returns a vector of length n. +func NewVec[V Vec[V, E], E Elt](n uint) V { return make(V, n) } + +// Vec list the funtionality of a vector of field elements. +type Vec[Vec ~[]E, E Elt] interface { + ~[]E + // Size returns the number of bytes to encode a vector. + Size() uint + // AddAssing calculates z = z + x. + AddAssign(x Vec) + // SubAssign calculates z = z - x. + SubAssign(x Vec) + // ScalarMul calculates z[i] = z[i] * x. + ScalarMul(x *E) + // DotProduct calculates z[i] = z[i] * x[i]. + DotProduct(x Vec) E + // NTT calculates the number theoretic transform on values. + NTT(Vec) + // InvNTT calculates the inverse number theoretic transform on values. + InvNTT(Vec) + // SplitBits sets the vector of elements corresponding to the bits of n. + SplitBits(n uint64) error + // JoinBits calculates the element sum( 2^i * z[i] ). + JoinBits() E + // Random samples a vector from an io.Reader. + Random(io.Reader) error + // RandomSHA3 samples a vector from a SHA3 state. + RandomSHA3(*sha3.State) error + // RandomSHA3Bytes reads a vector from a SHA3 state copying the bytes read. + RandomSHA3Bytes([]byte, *sha3.State) error + // Encodes a vector to bytes. + encoding.BinaryMarshaler + // Decodes a vector from bytes. + encoding.BinaryUnmarshaler + // Encodes a vector using a cryptobyte.Builder. + cryptobyte.MarshalingValue + // Decodes a vector from a cryptobyte.String. + conv.UnmarshalingValue +} + +// NewPoly returns a polynomial of the given degree. +func NewPoly[P Poly[P, E], E Elt](degree uint) P { return make(P, degree+1) } + +// Poly lists the funtionality of polynomials with coefficients in a field. +type Poly[Poly ~[]E, E Elt] interface { + ~[]E + // AddAssing calculates z = z + x. + AddAssign(Poly) + // SubAssign calculates z = z - x. + SubAssign(Poly) + // Mul calculates z = x * y. + Mul(x, y Poly) + // Sqr calculates z = x * x. + Sqr(Poly) + // Evaluate calculates the polynomial evaluation p(x). + Evaluate(x *E) E + // Strip removes the higher-degree zero terms. + Strip() Poly + // Interpolate a polynomial on given the values. + Interpolate([]E) +} diff --git a/vdaf/prio3/arith/field_test.go b/vdaf/prio3/arith/field_test.go new file mode 100644 index 000000000..635cff90d --- /dev/null +++ b/vdaf/prio3/arith/field_test.go @@ -0,0 +1,335 @@ +package arith + +import ( + "crypto/rand" + "fmt" + "io" + "math/big" + "slices" + "testing" + + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/internal/test" + "golang.org/x/crypto/cryptobyte" +) + +type EltTest interface { + comparable + fmt.Stringer + OrderRootUnity() uint + Order() []byte +} + +const testTimes = 1 << 10 + +func testFp[E EltTest, F Fp[E]](t *testing.T) { + t.Run("randomNum", randomNum[E, F]) + t.Run("noAlias", noAlias[E, F]) + t.Run("addSub", addSub[E, F]) + t.Run("mulInv", mulInv[E, F]) + t.Run("invTwoN", invTwoN[E, F]) + t.Run("expInv", expInv[E, F]) + t.Run("mulSqr", mulSqr[E, F]) + t.Run("marshal", marshal[E, F]) + t.Run("rootsUnity", rootsUnityTwoN[E, F]) + t.Run("stringer", stringer[E, F]) +} + +func mustRead[T interface{ Random(io.Reader) error }](t testing.TB, x T) { + err := x.Random(rand.Reader) + if err != nil { + t.Fatal(err) + } +} + +func randomNum[E Elt, F Fp[E]](t *testing.T) { + err := F(new(E)).Random(io.LimitReader(rand.Reader, 0)) + test.CheckIsErr(t, err, "random should fail") + + r := sha3.NewShake128() + r.Reset() + got := F(new(E)) + err = got.Random(&r) + test.CheckNoErr(t, err, "Random failed") + + r.Reset() + want := F(new(E)) + err = want.RandomSHA3(&r) + test.CheckNoErr(t, err, "RandomSHA3 failed") + + if !got.IsEqual(want) { + test.ReportError(t, got, want) + } +} + +func noAlias[E Elt, F Fp[E]](t *testing.T) { + x := F(new(E)) + mustRead(t, x) + y := *x + var got F = &y + got.Sqr(got) + z := *x + want := F(&z) + want.Mul(want, want) + + if !got.IsEqual(want) { + test.ReportError(t, got, want, x) + } +} + +func addSub[E Elt, F Fp[E]](t *testing.T) { + got := F(new(E)) + want := F(new(E)) + x := F(new(E)) + y := F(new(E)) + for i := 0; i < testTimes; i++ { + mustRead(t, x) + mustRead(t, y) + + // 2x = (x + y) + x - y + // = (x - y) + x + y + got.Add(x, y) + got.AddAssign(x) + got.SubAssign(y) + want.Sub(x, y) + want.AddAssign(x) + want.AddAssign(y) + + if !got.IsEqual(want) { + test.ReportError(t, got, want, x, y) + } + } +} + +func mulInv[E Elt, F Fp[E]](t *testing.T) { + x := F(new(E)) + y := F(new(E)) + z := F(new(E)) + for i := 0; i < testTimes; i++ { + mustRead(t, x) + mustRead(t, y) + + // x*y*x^1 = y + z.Inv(x) + z.Mul(z, y) + z.Mul(z, x) + got := z + want := y + if !got.IsEqual(want) { + test.ReportError(t, got, want, x, y) + } + } +} + +func invTwoN[E Elt, F Fp[E]](t *testing.T) { + got := F(new(E)) + want := F(new(E)) + for i := 0; i < 64; i++ { + pow2 := uint64(1) << i + + got.InvTwoN(uint(i)) + + err := want.SetUint64(pow2) + test.CheckNoErr(t, err, "setuint64 failed") + want.Inv(want) + + if !got.IsEqual(want) { + test.ReportError(t, got, want, i) + } + } +} + +func expInv[E Elt, F Fp[E]](t *testing.T) { + got := F(new(E)) + want := F(new(E)) + x := F(new(E)) + for i := 0; i < testTimes; i++ { + mustRead(t, x) + + // (1/x) * x = 1 + got.Inv(x) + got.MulAssign(x) + want.SetOne() + if !got.IsEqual(want) { + test.ReportError(t, got, want, x) + } + } + + for i := uint64(0); i < 8; i++ { + got.InvUint64(i) + _ = want.SetUint64(i) + want.Inv(want) + + if !got.IsEqual(want) { + test.ReportError(t, got, want, i) + } + } +} + +func mulSqr[E Elt, F Fp[E]](t *testing.T) { + x := F(new(E)) + y := F(new(E)) + l0 := F(new(E)) + l1 := F(new(E)) + r0 := F(new(E)) + r1 := F(new(E)) + for i := 0; i < testTimes; i++ { + mustRead(t, x) + mustRead(t, y) + + // (x+y)(x-y) = (x^2-y^2) + l0.Add(x, y) + l1.Sub(x, y) + l0.Mul(l0, l1) + r0.Sqr(x) + r1.Sqr(y) + r0.Sub(r0, r1) + got := l0 + want := r0 + if !got.IsEqual(want) { + test.ReportError(t, got, want, x, y) + } + } +} + +func rootsUnityTwoN[E EltTest, F Fp[E]](t *testing.T) { + w := F(new(E)) + x := F(new(E)) + + w.SetRootOfUnityTwoN(0) + test.CheckOk(w.IsOne(), "incorrect order of the root of unity", t) + + order := (*w).OrderRootUnity() + for i := uint(1); i <= order; i++ { + w.SetRootOfUnityTwoN(i) + + x.Sqr(w) + for range i - 1 { + test.CheckOk(!x.IsOne(), "incorrect order of the root of unity", t) + x.Sqr(x) + } + + test.CheckOk(x.IsOne(), "incorrect order of the root of unity", t) + } +} + +func marshal[E EltTest, F Fp[E]](t *testing.T) { + x := F(new(E)) + y := F(new(E)) + for i := 0; i < testTimes; i++ { + mustRead(t, x) + s, err := x.MarshalBinary() + test.CheckNoErr(t, err, "MarshalBinary failed") + test.CheckOk(uint(len(s)) == x.Size(), "wrong byte length", t) + + err = y.UnmarshalBinary(s) + test.CheckNoErr(t, err, "UnmarshalBinary failed") + if !x.IsEqual(y) { + test.ReportError(t, x, y) + } + // check for invalid size + err = y.UnmarshalBinary(s[1:]) + test.CheckIsErr(t, err, "UnmarshalBinary should failed") + + // check for invalid element + order := (*x).Order() + slices.Reverse(order) + err = y.UnmarshalBinary(order) + test.CheckIsErr(t, err, "UnmarshalBinary should failed") + } +} + +func stringer[E EltTest, F Fp[E]](t *testing.T) { + minusOne := F(new(E)) + minusOne.SetOne() + minusOne.Sub(new(E), minusOne) + got := (*minusOne).String() + + fpOrder := new(big.Int).SetBytes((*minusOne).Order()) + pMinusOne := new(big.Int).Sub(fpOrder, big.NewInt(1)) + want := "0x" + pMinusOne.Text(16) + + if got != want { + test.ReportError(t, got, want) + } +} + +func benchmarkFp[E EltTest, F Fp[E]](b *testing.B) { + x := F(new(E)) + y := F(new(E)) + z := F(new(E)) + mustRead(b, x) + mustRead(b, y) + mustRead(b, z) + + b.Run("Marshal", func(b *testing.B) { + for i := 0; i < b.N; i++ { + var builder cryptobyte.Builder + _ = z.Marshal(&builder) + } + }) + b.Run("MarshalBinary", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _, _ = z.MarshalBinary() + } + }) + b.Run("Unmarshal", func(b *testing.B) { + buf := make([]byte, z.Size()) + for i := 0; i < b.N; i++ { + s := cryptobyte.String(buf) + _ = z.Unmarshal(&s) + } + }) + b.Run("UnmarshalBinary", func(b *testing.B) { + buf := make([]byte, z.Size()) + for i := 0; i < b.N; i++ { + _ = z.UnmarshalBinary(buf) + } + }) + b.Run("Random", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = z.Random(rand.Reader) + } + }) + b.Run("RandomSHA3", func(b *testing.B) { + r := sha3.NewShake128() + for i := 0; i < b.N; i++ { + _ = z.RandomSHA3(&r) + } + }) + b.Run("Add", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.Add(x, y) + } + }) + b.Run("Sub", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.Sub(x, y) + } + }) + b.Run("Mul", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.Mul(x, y) + } + }) + b.Run("Sqr", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.Sqr(x) + } + }) + b.Run("InvUint64", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.InvUint64(5) + } + }) + b.Run("InvTwoN", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.InvTwoN(16) + } + }) + b.Run("Inv", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.Inv(x) + } + }) +} diff --git a/vdaf/prio3/arith/fp128/fiatMont.go b/vdaf/prio3/arith/fp128/fiatMont.go new file mode 100644 index 000000000..dbc750628 --- /dev/null +++ b/vdaf/prio3/arith/fp128/fiatMont.go @@ -0,0 +1,288 @@ +// Code generated by fiat.go using fiat-crypto v0.1.4. +// +// Autogenerated: './FiatCrypto_v.0.1.4-issue1672' word-by-word-montgomery --output 'fp128/fiatMont.go' --lang Go --package-name fp128 --doc-prepend-header 'Code generated by fiat.go using fiat-crypto v0.1.4.' --package-case lowerCamelCase --public-function-case lowerCamelCase --public-type-case lowerCamelCase --doc-newline-before-package-declaration --no-primitives --widen-carry --no-field-element-typedefs --relax-primitive-carry-to-bitwidth 64 Fp 64 0xffffffffffffffe40000000000000001 add sub mul square +// +// curve description: Fp +// +// machine_wordsize = 64 (from "64") +// +// requested operations: add, sub, mul, square +// +// m = 0xffffffffffffffe40000000000000001 (from "0xffffffffffffffe40000000000000001") +// +// +// +// NOTE: In addition to the bounds specified above each function, all +// +// functions synthesized for this Montgomery arithmetic require the +// +// input to be strictly less than the prime modulus (m), and also +// +// require the input to be in the unique saturated representation. +// +// All functions also ensure that these two properties are true of +// +// return values. +// +// +// +// Computed values: +// +// eval z = z[0] + (z[1] << 64) +// +// bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) +// +// twos_complement_eval z = let x1 := z[0] + (z[1] << 64) in +// +// if x1 & (2^128-1) < 2^127 then x1 & (2^128-1) else (x1 & (2^128-1)) - 2^128 + +package fp128 + +import "math/bits" + +// The function fiatFpAdd adds two field elements in the Montgomery domain. +// +// Preconditions: +// 0 ≤ eval arg1 < m +// 0 ≤ eval arg2 < m +// Postconditions: +// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m +// 0 ≤ eval out1 < m +// +// Input Bounds: +// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +// Output Bounds: +// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +func fiatFpAdd(out1 *Fp, arg1 *Fp, arg2 *Fp) { + var x1 uint64 + var x2 uint64 + x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) + var x3 uint64 + var x4 uint64 + x3, x4 = bits.Add64(arg1[1], arg2[1], uint64(x2)) + var x5 uint64 + var x6 uint64 + x5, x6 = bits.Sub64(x1, 0x1, uint64(uint64(0x0))) + var x7 uint64 + var x8 uint64 + x7, x8 = bits.Sub64(x3, 0xffffffffffffffe4, uint64(x6)) + var x10 uint64 + _, x10 = bits.Sub64(x4, uint64(0x0), uint64(x8)) + var x11 uint64 + fiatFpCmovznzU64(&x11, x10, x5, x1) + var x12 uint64 + fiatFpCmovznzU64(&x12, x10, x7, x3) + out1[0] = x11 + out1[1] = x12 +} + +// The function fiatFpSub subtracts two field elements in the Montgomery domain. +// +// Preconditions: +// 0 ≤ eval arg1 < m +// 0 ≤ eval arg2 < m +// Postconditions: +// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m +// 0 ≤ eval out1 < m +// +// Input Bounds: +// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +// Output Bounds: +// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +func fiatFpSub(out1 *Fp, arg1 *Fp, arg2 *Fp) { + x1 := arg2[1] + x2 := arg2[0] + var x3 uint64 + var x4 uint64 + x3, x4 = bits.Sub64(arg1[0], x2, uint64(0x0)) + var x5 uint64 + var x6 uint64 + x5, x6 = bits.Sub64(arg1[1], x1, uint64(x4)) + var x7 uint64 + fiatFpCmovznzU64(&x7, x6, uint64(0x0), 0xffffffffffffffff) + var x8 uint64 + var x9 uint64 + x8, x9 = bits.Add64(x3, (x7 & 0x1), uint64(0x0)) + var x10 uint64 + x10, _ = bits.Add64(x5, (x7 & 0xffffffffffffffe4), uint64(x9)) + out1[0] = x8 + out1[1] = x10 +} + +// The function fiatFpMul multiplies two field elements in the Montgomery domain. +// +// Preconditions: +// 0 ≤ eval arg1 < m +// 0 ≤ eval arg2 < m +// Postconditions: +// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m +// 0 ≤ eval out1 < m +// +// Input Bounds: +// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +// Output Bounds: +// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +func fiatFpMul(out1 *Fp, arg1 *Fp, arg2 *Fp) { + x1 := arg1[1] + x2 := arg1[0] + var x3 uint64 + var x4 uint64 + x4, x3 = bits.Mul64(x2, arg2[1]) + var x5 uint64 + var x6 uint64 + x6, x5 = bits.Mul64(x2, arg2[0]) + var x7 uint64 + var x8 uint64 + x7, x8 = bits.Add64(x6, x3, uint64(0x0)) + x9 := (x8 + x4) + var x10 uint64 + _, x10 = bits.Mul64(x5, 0xffffffffffffffff) + var x12 uint64 + var x13 uint64 + x13, x12 = bits.Mul64(x10, 0xffffffffffffffe4) + var x15 uint64 + _, x15 = bits.Add64(x5, x10, uint64(0x0)) + var x16 uint64 + var x17 uint64 + x16, x17 = bits.Add64(x7, x12, uint64(x15)) + var x18 uint64 + var x19 uint64 + x18, x19 = bits.Add64(x9, x13, uint64(x17)) + var x20 uint64 + var x21 uint64 + x21, x20 = bits.Mul64(x1, arg2[1]) + var x22 uint64 + var x23 uint64 + x23, x22 = bits.Mul64(x1, arg2[0]) + var x24 uint64 + var x25 uint64 + x24, x25 = bits.Add64(x23, x20, uint64(0x0)) + x26 := (x25 + x21) + var x27 uint64 + var x28 uint64 + x27, x28 = bits.Add64(x16, x22, uint64(0x0)) + var x29 uint64 + var x30 uint64 + x29, x30 = bits.Add64(x18, x24, uint64(x28)) + var x31 uint64 + var x32 uint64 + x31, x32 = bits.Add64(x19, x26, uint64(x30)) + var x33 uint64 + _, x33 = bits.Mul64(x27, 0xffffffffffffffff) + var x35 uint64 + var x36 uint64 + x36, x35 = bits.Mul64(x33, 0xffffffffffffffe4) + var x38 uint64 + _, x38 = bits.Add64(x27, x33, uint64(0x0)) + var x39 uint64 + var x40 uint64 + x39, x40 = bits.Add64(x29, x35, uint64(x38)) + var x41 uint64 + var x42 uint64 + x41, x42 = bits.Add64(x31, x36, uint64(x40)) + x43 := (x42 + x32) + var x44 uint64 + var x45 uint64 + x44, x45 = bits.Sub64(x39, 0x1, uint64(uint64(0x0))) + var x46 uint64 + var x47 uint64 + x46, x47 = bits.Sub64(x41, 0xffffffffffffffe4, uint64(x45)) + var x49 uint64 + _, x49 = bits.Sub64(x43, uint64(0x0), uint64(x47)) + var x50 uint64 + fiatFpCmovznzU64(&x50, x49, x44, x39) + var x51 uint64 + fiatFpCmovznzU64(&x51, x49, x46, x41) + out1[0] = x50 + out1[1] = x51 +} + +// The function fiatFpSquare squares a field element in the Montgomery domain. +// +// Preconditions: +// 0 ≤ eval arg1 < m +// Postconditions: +// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m +// 0 ≤ eval out1 < m +// +// Input Bounds: +// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +// Output Bounds: +// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] +func fiatFpSquare(out1 *Fp, arg1 *Fp) { + x1 := arg1[1] + x2 := arg1[0] + var x3 uint64 + var x4 uint64 + x4, x3 = bits.Mul64(x2, arg1[1]) + var x5 uint64 + var x6 uint64 + x6, x5 = bits.Mul64(x2, arg1[0]) + var x7 uint64 + var x8 uint64 + x7, x8 = bits.Add64(x6, x3, uint64(0x0)) + x9 := (x8 + x4) + var x10 uint64 + _, x10 = bits.Mul64(x5, 0xffffffffffffffff) + var x12 uint64 + var x13 uint64 + x13, x12 = bits.Mul64(x10, 0xffffffffffffffe4) + var x15 uint64 + _, x15 = bits.Add64(x5, x10, uint64(0x0)) + var x16 uint64 + var x17 uint64 + x16, x17 = bits.Add64(x7, x12, uint64(x15)) + var x18 uint64 + var x19 uint64 + x18, x19 = bits.Add64(x9, x13, uint64(x17)) + var x20 uint64 + var x21 uint64 + x21, x20 = bits.Mul64(x1, arg1[1]) + var x22 uint64 + var x23 uint64 + x23, x22 = bits.Mul64(x1, arg1[0]) + var x24 uint64 + var x25 uint64 + x24, x25 = bits.Add64(x23, x20, uint64(0x0)) + x26 := (x25 + x21) + var x27 uint64 + var x28 uint64 + x27, x28 = bits.Add64(x16, x22, uint64(0x0)) + var x29 uint64 + var x30 uint64 + x29, x30 = bits.Add64(x18, x24, uint64(x28)) + var x31 uint64 + var x32 uint64 + x31, x32 = bits.Add64(x19, x26, uint64(x30)) + var x33 uint64 + _, x33 = bits.Mul64(x27, 0xffffffffffffffff) + var x35 uint64 + var x36 uint64 + x36, x35 = bits.Mul64(x33, 0xffffffffffffffe4) + var x38 uint64 + _, x38 = bits.Add64(x27, x33, uint64(0x0)) + var x39 uint64 + var x40 uint64 + x39, x40 = bits.Add64(x29, x35, uint64(x38)) + var x41 uint64 + var x42 uint64 + x41, x42 = bits.Add64(x31, x36, uint64(x40)) + x43 := (x42 + x32) + var x44 uint64 + var x45 uint64 + x44, x45 = bits.Sub64(x39, 0x1, uint64(uint64(0x0))) + var x46 uint64 + var x47 uint64 + x46, x47 = bits.Sub64(x41, 0xffffffffffffffe4, uint64(x45)) + var x49 uint64 + _, x49 = bits.Sub64(x43, uint64(0x0), uint64(x47)) + var x50 uint64 + fiatFpCmovznzU64(&x50, x49, x44, x39) + var x51 uint64 + fiatFpCmovznzU64(&x51, x49, x46, x41) + out1[0] = x50 + out1[1] = x51 +} diff --git a/vdaf/prio3/arith/fp128/fp.go b/vdaf/prio3/arith/fp128/fp.go new file mode 100644 index 000000000..e8bb0e086 --- /dev/null +++ b/vdaf/prio3/arith/fp128/fp.go @@ -0,0 +1,277 @@ +// Code generated from ./templates/field.go.tmpl. DO NOT EDIT. + +package fp128 + +import ( + "bytes" + "crypto/subtle" + "encoding/binary" + "errors" + "io" + + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/internal/sha3" + "golang.org/x/crypto/cryptobyte" +) + +// Size is the length in bytes of an Fp128 element. +const Size = 16 + +// Fp represents a prime field element as a positive integer less than Order. +type Fp [2]uint64 + +func (z Fp) String() string { x := z.fromMont(); return conv.Uint64Le2Hex(x[:]) } +func (z Fp) Size() uint { return Size } +func (z Fp) OrderRootUnity() uint { return numRootsUnity } +func (z *Fp) AddAssign(x *Fp) { fiatFpAdd(z, z, x) } +func (z *Fp) SubAssign(x *Fp) { fiatFpSub(z, z, x) } +func (z *Fp) MulAssign(x *Fp) { fiatFpMul(z, z, x) } +func (z *Fp) Add(x, y *Fp) { fiatFpAdd(z, x, y) } +func (z *Fp) Sub(x, y *Fp) { fiatFpSub(z, x, y) } +func (z *Fp) Mul(x, y *Fp) { fiatFpMul(z, x, y) } +func (z *Fp) Sqr(x *Fp) { fiatFpSquare(z, x) } +func (z *Fp) IsZero() bool { return ctEqual(z, &Fp{}) } +func (z *Fp) IsOne() bool { return ctEqual(z, &rootOfUnityTwoN[0]) } +func (z *Fp) IsEqual(x *Fp) bool { return ctEqual(z, x) } +func (z *Fp) SetOne() { *z = rootOfUnityTwoN[0] } +func (z *Fp) toMont() { fiatFpMul(z, z, &rSquare) } +func (z *Fp) fromMont() (out Fp) { fiatFpMul(&out, z, &Fp{1}); return } +func (z *Fp) MarshalBinary() ([]byte, error) { return conv.MarshalBinaryLen(z, Size) } +func (z *Fp) UnmarshalBinary(b []byte) error { return conv.UnmarshalBinary(z, b) } +func (z *Fp) Marshal(b *cryptobyte.Builder) error { + var x [Size]byte + for i, zi := range z.fromMont() { + binary.LittleEndian.PutUint64(x[8*i:], zi) + } + b.AddBytes(x[:]) + return nil +} + +func (z *Fp) Unmarshal(s *cryptobyte.String) bool { + var b [Size]byte + if s.CopyBytes(b[:]) { + n, ok := isInRange(&b) + if ok { + *z = n + z.toMont() + return true + } + } + return false +} + +func (z *Fp) Random(r io.Reader) error { + var b [Size]byte + var ok bool + for range maxNumTries { + _, err := r.Read(b[:]) + if err != nil { + return err + } + + *z, ok = isInRange(&b) + if ok { + z.toMont() + return nil + } + } + + return ErrMaxNumTries +} + +func (z *Fp) RandomSHA3(s *sha3.State) error { + var b [Size]byte + var ok bool + for range maxNumTries { + _, err := s.Read(b[:]) + if err != nil { + return err + } + + *z, ok = isInRange(&b) + if ok { + z.toMont() + return nil + } + } + + return ErrMaxNumTries +} + +func (z *Fp) InvUint64(x uint64) { + if 0 < x && x <= numInverseInt { + *z = inverseInt[x-1] + } else { + err := z.SetUint64(x) + if err != nil { + panic(ErrFieldEltDecode) + } + z.Inv(z) + } +} + +func (z *Fp) InvTwoN(n uint) { + z.SetOne() + for range n { + z.Mul(z, &half) + } +} + +func (z *Fp) SetUint64(n uint64) error { + *z = Fp{n} + z.toMont() + return nil +} + +func (z *Fp) GetUint64() (uint64, error) { + x := z.fromMont() + if x[1] != 0 { + return 0, ErrNumberTooLarge + } + return x[0], nil +} + +func (z *Fp) SetRootOfUnityTwoN(n uint) { + if n > numRootsUnity { + panic(ErrRootsOfUnity) + } + *z = rootOfUnityTwoN[n] +} + +func (z Fp) Order() []byte { + var x [Size]byte + binary.Write(bytes.NewBuffer(x[:0]), binary.BigEndian, []uint64{orderP1, orderP0}) + return x[:] +} + +func (z *Fp) sqri(x *Fp, n uint) { + z.Sqr(x) + for range n - 1 { + z.Sqr(z) + } +} + +func fiatFpCmovznzU64(z *uint64, b, x, y uint64) { *z = (x &^ (-b)) | (y & (-b)) } + +func ctEqual(x, y *Fp) bool { + var v uint64 + for i := 0; i < len(*x); i++ { + v |= (*x)[i] ^ (*y)[i] + } + v32 := uint32(v>>32) | uint32(v) + return subtle.ConstantTimeEq(int32(v32), 0) == 1 +} + +const ( + // order is the order of the Fp128 field. + orderP1 = uint64(0xffffffffffffffe4) + orderP0 = uint64(0x1) + // numRootsUnity is .. + numRootsUnity = 66 + // numInverseIntFp128 is the number of precomputed inverses. + numInverseInt = 8 + // maxNumTries is the maximum tries for rejection sampling. + maxNumTries = 10 +) + +var ( + // rSquare is R^2 mod Fp128Order, where R=2^128 (little-endian). + rSquare = Fp{0xfffffffffffffcf1, 0x0000000000005587} + // half is 1/2 mod Order. + half = Fp{0x0000000000000000, 0x8000000000000000} + // rootOfUnityTwoN are the (principal) roots of unity that generate + // a multiplicative group of order 2^n. + // i.e., rootOfUnityTwoN[i] generates a group of order 2^i. + // Thus, by definition, + // - rootOfUnityTwoN[0] = One + // - rootOfUnityTwoN[numRoots] = Generator + // Constants are encoded in Montgomery domain (little-endian). + rootOfUnityTwoN = [numRootsUnity + 1]Fp{ + {0xffffffffffffffff, 0x000000000000001b}, + {0x0000000000000002, 0xffffffffffffffc8}, + {0x8ff94ea745b7d9d6, 0x6171e408747992c7}, + {0x1323bb095fba9556, 0x7f2a4e6655e5a49c}, + {0xd1c455956aafabfc, 0x3d661493c5e89442}, + {0x416d53fbcdfcc65c, 0x5c159e1cffd5eca0}, + {0x1428d15e766f5f3e, 0x960d5c8696ec3aa3}, + {0x8f0cef59f8c23f3e, 0xcce83f596bb28730}, + {0x432d8d01ae187081, 0x12b496afe629224c}, + {0x0edc26fa686e3d3b, 0xc2026e57b1554ea9}, + {0x79663ccecfe8c86c, 0xf38c95d1e57405ea}, + {0xfecc377cf0f47a9f, 0x2b486d42d73283bd}, + {0x0ab1068497116540, 0x70866815dbf52bac}, + {0x2d9420dc5196c01a, 0x852c9b234b09c7df}, + {0x1a491a6cf3399115, 0xca4b831e2e621692}, + {0xb99152aabeebd757, 0xb7fbf514f82e2269}, + {0xb8da2f851dfd594a, 0x597c0e93a246d640}, + {0xf2888c210ef9f1c4, 0x97f929a5d52ab886}, + {0xe6a0ccbc956fc7fb, 0xfa4748aea960d0eb}, + {0xe53d6d96e1ec92a0, 0xc24ed95c3c013bcc}, + {0x6cc6e9129e1679c0, 0x6f825f88648b270c}, + {0x2c4d04cc40a2bd04, 0x17c2af4df9629e3d}, + {0x843747925bd7da8e, 0xdcd8c9979b888e8a}, + {0x4a1b1730d0aa77a0, 0x391696912d85b368}, + {0x68fb2b7e053e9500, 0x8ab5e54096ca012c}, + {0x1ccc0958442d4cd2, 0x819909091849c5c1}, + {0x25e9f8eeb3a11b26, 0x741eb9f6cfde0f02}, + {0x57b7921d9d4d0d66, 0x681f358ffad3a90d}, + {0x9bd3b6be3602bfe2, 0x294e31a63bbd8bb1}, + {0xe36811a2b6dd2f4d, 0x402946e8dcc86185}, + {0x468354d0ce6f4f42, 0xdc3971476a49c161}, + {0xd42c20d91e16ba3b, 0x16849c909ba2920d}, + {0x488a61cbe76f8796, 0xe0312b455090dc3d}, + {0x34d592b2d95461c7, 0x69ff23c4ae8a9ae2}, + {0xab1c9df91252cfb0, 0x3a71deec98434255}, + {0x1c5f61d837a9ff92, 0x4ec0bbb14b4943fc}, + {0x2550c6695de272ea, 0x4e7f5d927ad2bb46}, + {0x786b6c965e58be0d, 0xfbb47d3729647361}, + {0xbbfba318618fff40, 0x58938d40e16fc273}, + {0x0c8b4baee9a2907f, 0x2b0dddcff641c0c4}, + {0xf0d881f5c07b45fc, 0x33044b6b9af79104}, + {0x530f1c8d85c53b49, 0x7277db26e889f0c0}, + {0xefe24ff8e3caacf0, 0xd39b9320d2172567}, + {0xee7e1fbb71e9b04c, 0x105d0de0eba9ed48}, + {0x743424fea03af69b, 0xff50f6975f58d667}, + {0x1e55f4c8165fa615, 0x60d0d6428bc526f6}, + {0xf89e2f45fe30a628, 0xd35040e25d621120}, + {0x93a9b9bfa0ba47e5, 0xa14eda13d2c9f218}, + {0x7184aca1f5b7d796, 0x3067d899e53ae149}, + {0x48c135bbd45c9f78, 0x0231ec7261c6fe5e}, + {0xace311a714d11f45, 0x985458a22fc7b74f}, + {0xebd8c0f65c3941c7, 0x9253e8d60d138145}, + {0xa22ef3d3cf82d6ff, 0xf616691696239dad}, + {0xeb43ea48a880c558, 0x4c33bc414d65c622}, + {0xb02ca157db2f5773, 0x0ca75daa548fab25}, + {0x2e2d3b5d3d7fd880, 0xe709ce35344480a0}, + {0x04febe6d0fed06db, 0x82de81148eada3d0}, + {0xc549b2f670e7fe80, 0xef7c7c796a560813}, + {0x420d567cfa7dd71d, 0xd10bc78478e67eba}, + {0xd4e1bfae0eae0e5d, 0x69c02ae2b2189664}, + {0xee5aab9df23ad495, 0xe7fa9150bd2dd0bb}, + {0xdbe38168360cebac, 0x612d7349f49997ad}, + {0x9e4fc0f4006111e3, 0x54879fe858345e92}, + {0x3c5dd0cda73814c2, 0x1a29ef0cd721372e}, + {0x8b45f6e90b16542d, 0xd9b5db39af523ffb}, + {0x336824df50a3e9de, 0x1f70898af1701972}, + {0xf0111fb98c6b9875, 0x50f8f7f554db309c}, + } + // inverseInt has the inverse of the first `numInverseInt` integers. + inverseInt = [numInverseInt]Fp{ + {0xffffffffffffffff, 0x000000000000001b}, + {0x0000000000000000, 0x8000000000000000}, + {0x5555555555555555, 0x0000000000000009}, + {0x0000000000000000, 0x4000000000000000}, + {0xcccccccccccccccd, 0x6666666666666660}, + {0xaaaaaaaaaaaaaaab, 0x7ffffffffffffff6}, + {0xdb6db6db6db6db6e, 0x6db6db6db6db6dae}, + {0x0000000000000000, 0x2000000000000000}, + } +) + +var ( + ErrMatchLen = errors.New("inputs mismatched length") + ErrFieldEltDecode = errors.New("incorrect field element value") + ErrNumberTooLarge = errors.New("number of bits is not enough to represent the number") + ErrMaxNumTries = errors.New("random rejection sampling reached maximum number of tries") + ErrRootsOfUnity = errors.New("Fp has no roots of unity of order larger than 2^66") +) diff --git a/vdaf/prio3/arith/fp128/inverse.go b/vdaf/prio3/arith/fp128/inverse.go new file mode 100644 index 000000000..748ed960f --- /dev/null +++ b/vdaf/prio3/arith/fp128/inverse.go @@ -0,0 +1,27 @@ +package fp128 + +func (z *Fp) Inv(x *Fp) { + // Addition chain found using mmcloughlin/addchain: v0.4.0 + // (McLoughlin, 2021). https://doi.org/10.5281/zenodo.4758226 + var t, t0, t1, t2 Fp + t.Sqr(x) + t.Mul(x, &t) + t.Sqr(&t) + t0.Mul(x, &t) + t.Sqr(&t0) + t1.sqri(&t, 3) + t.Mul(&t, &t1) + t.Mul(x, &t) + t1.sqri(&t, 3) + t2.sqri(&t1, 7) + t1.Mul(&t1, &t2) + t2.sqri(&t1, 14) + t1.Mul(&t1, &t2) + t2.sqri(&t1, 28) + t1.Mul(&t1, &t2) + t0.Mul(&t0, &t1) + t1.sqri(&t0, 62) + t0.Mul(&t0, &t1) + t0.sqri(&t0, 7) + z.Mul(&t, &t0) +} diff --git a/vdaf/prio3/arith/fp128/poly.go b/vdaf/prio3/arith/fp128/poly.go new file mode 100644 index 000000000..f9a3ac570 --- /dev/null +++ b/vdaf/prio3/arith/fp128/poly.go @@ -0,0 +1,68 @@ +// Code generated from ./templates/poly.go.tmpl. DO NOT EDIT. + +package fp128 + +import "github.com/cloudflare/circl/math" + +type Poly []Fp + +func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } +func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } +func (p Poly) Mul(x, y Poly) { + mustSumLen(p, x, y) + clear(p) + var xiyj Fp + for i := range x { + for j := range y { + xiyj.Mul(&x[i], &y[j]) + p[i+j].AddAssign(&xiyj) + } + } +} + +func (p Poly) Sqr(x Poly) { + mustSumLen(p, x, x) + clear(p) + for i := range x { + p[2*i].Sqr(&x[i]) + } + + var xixj Fp + for i := 0; i < len(x); i++ { + for j := i + 1; j < len(x); j++ { + xixj.Mul(&x[i], &x[j]) + xixj.AddAssign(&xixj) + p[i+j].AddAssign(&xixj) + } + } +} + +func (p Poly) Evaluate(x *Fp) (px Fp) { + if l := len(p); l != 0 { + px = p[l-1] + for i := l - 2; i >= 0; i-- { + px.MulAssign(x) + px.AddAssign(&p[i]) + } + } + + return +} + +func (p Poly) Strip() Poly { + for i := len(p) - 1; i >= 0; i-- { + if !p[i].IsZero() { + return p[:i+1] + } + } + + return p[:0] +} + +func (p Poly) Interpolate(values []Fp) { + _, logN := math.NextPow2(uint(len(values))) + Vec(p).InvNTT(values) + var invN Fp + invN.InvTwoN(logN) + Vec(p).ScalarMul(&invN) +} diff --git a/vdaf/prio3/arith/fp128/vector.go b/vdaf/prio3/arith/fp128/vector.go new file mode 100644 index 000000000..76f55ed42 --- /dev/null +++ b/vdaf/prio3/arith/fp128/vector.go @@ -0,0 +1,222 @@ +// Code generated from ./templates/vector.go.tmpl. DO NOT EDIT. + +package fp128 + +import ( + "encoding/binary" + "io" + "math/bits" + + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/math" + "golang.org/x/crypto/cryptobyte" +) + +type Vec []Fp + +func (v Vec) Size() uint { return Size * uint(len(v)) } + +func (v Vec) AddAssign(x Vec) { + mustSameLen(v, x) + for i := range v { + v[i].AddAssign(&x[i]) + } +} + +func (v Vec) SubAssign(x Vec) { + mustSameLen(v, x) + for i := range v { + v[i].SubAssign(&x[i]) + } +} + +func (v Vec) ScalarMul(x *Fp) { + for i := range v { + v[i].MulAssign(x) + } +} + +func (v Vec) DotProduct(x Vec) (out Fp) { + mustSameLen(v, x) + var t Fp + for i := range v { + t.Mul(&v[i], &x[i]) + out.AddAssign(&t) + } + return +} + +func bitRev(x uint, numBits uint) uint { + return bits.Reverse(x) >> (bits.UintSize - numBits) +} + +func (v Vec) NTT(values Vec) { v.doNTT(values, false) } +func (v Vec) InvNTT(values Vec) { v.doNTT(values, true) } +func (v Vec) doNTT(values Vec, isInvNTT bool) { + valuesLen := uint(len(values)) + _, logN := math.NextPow2(valuesLen) + + for i := range v { + j := bitRev(uint(i), logN) + if j < valuesLen { + v[i] = values[j] + } + } + + var t, w, wn, iwn Fp + r := &wn + if isInvNTT { + r = &iwn + iwn.SetOne() + } + + for l := uint(1); l <= logN; l++ { + y := uint(1) << (l - 1) + chunk := uint(1) << (logN - l) + + for j := range chunk { + x := j << l + u := v[x] + v[x+0].Add(&u, &v[x+y]) + v[x+y].Sub(&u, &v[x+y]) + } + + w.SetOne() + wn.SetRootOfUnityTwoN(l) + iwn.MulAssign(&wn) + for i := uint(1); i < y; i++ { + w.MulAssign(r) + for j := range chunk { + x := (j << l) + i + u := v[x] + t.Mul(&w, &v[x+y]) + v[x+0].Add(&u, &t) + v[x+y].Sub(&u, &t) + } + } + } +} + +func (v Vec) SplitBits(n uint64) error { + if bits.Len64(n) > len(v) { + return ErrNumberTooLarge + } + + clear(v) + for i := range v { + if (n>>i)&0x1 == 1 { + v[i].SetOne() + } + } + + return nil +} + +func (v Vec) JoinBits() Fp { + var two Fp + _ = two.SetUint64(2) + return Poly(v).Evaluate(&two) +} + +func (v Vec) Random(rnd io.Reader) error { + var b [Size]byte + var ok bool +forVec: + for i := range v { + for range maxNumTries { + _, err := rnd.Read(b[:]) + if err != nil { + return err + } + + v[i], ok = isInRange(&b) + if ok { + v[i].toMont() + continue forVec + } + } + return ErrMaxNumTries + } + + return nil +} + +func (v Vec) RandomSHA3(s *sha3.State) error { + for i := range v { + err := v[i].RandomSHA3(s) + if err != nil { + return err + } + } + + return nil +} + +func (v Vec) RandomSHA3Bytes(out []byte, s *sha3.State) error { + var b [Size]byte + var ok bool + +forVec: + for i := range v { + for range maxNumTries { + _, err := s.Read(b[:]) + if err != nil { + return err + } + + v[i], ok = isInRange(&b) + if ok { + out = append(out, b[:]...) + v[i].toMont() + continue forVec + } + } + + return ErrMaxNumTries + } + return nil +} + +func (v Vec) MarshalBinary() ([]byte, error) { + return conv.MarshalBinaryLen(v, v.Size()) +} + +func (v Vec) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(v, b) +} + +func (v Vec) Marshal(b *cryptobyte.Builder) error { + for i := range v { + v[i].Marshal(b) + } + return nil +} + +func (v Vec) Unmarshal(s *cryptobyte.String) bool { + for i := range v { + if !v[i].Unmarshal(s) { + return false + } + } + return true +} + +func isInRange(b *[Size]byte) (out [2]uint64, ok bool) { + out[0] = binary.LittleEndian.Uint64(b[:8]) + out[1] = binary.LittleEndian.Uint64(b[8:]) + ok = out[1] < orderP1 || (out[1] == orderP1 && out[0] < orderP0) + return +} + +func mustSameLen[T ~[]E, E any](x, y T) { + if len(x) != len(y) { + panic(ErrMatchLen) + } +} + +func mustSumLen[T ~[]E, E any](z, x, y T) { + if len(z) != len(x)+len(y)-1 { + panic(ErrMatchLen) + } +} diff --git a/vdaf/prio3/arith/fp128_test.go b/vdaf/prio3/arith/fp128_test.go new file mode 100644 index 000000000..d1633b5a0 --- /dev/null +++ b/vdaf/prio3/arith/fp128_test.go @@ -0,0 +1,21 @@ +// Code generated from ./templates/field_test.go.tmpl. DO NOT EDIT. + +package arith + +import ( + "testing" + + "github.com/cloudflare/circl/vdaf/prio3/arith/fp128" +) + +func TestFp128(t *testing.T) { + t.Run("Fp", testFp[fp128.Fp]) + t.Run("Vec", testVec[fp128.Vec]) + t.Run("Poly", testPoly[fp128.Poly, fp128.Vec]) +} + +func BenchmarkFp128(b *testing.B) { + b.Run("Fp", benchmarkFp[fp128.Fp]) + b.Run("Vec", benchmarkVec[fp128.Vec]) + b.Run("Poly", benchmarkPoly[fp128.Poly, fp128.Vec]) +} diff --git a/vdaf/prio3/arith/fp64/fiatMont.go b/vdaf/prio3/arith/fp64/fiatMont.go new file mode 100644 index 000000000..f49771535 --- /dev/null +++ b/vdaf/prio3/arith/fp64/fiatMont.go @@ -0,0 +1,171 @@ +// Code generated by fiat.go using fiat-crypto v0.1.4. +// +// Autogenerated: './FiatCrypto_v.0.1.4-issue1672' word-by-word-montgomery --output 'fp64/fiatMont.go' --lang Go --package-name fp64 --doc-prepend-header 'Code generated by fiat.go using fiat-crypto v0.1.4.' --package-case lowerCamelCase --public-function-case lowerCamelCase --public-type-case lowerCamelCase --doc-newline-before-package-declaration --no-primitives --widen-carry --no-field-element-typedefs --relax-primitive-carry-to-bitwidth 64 Fp 64 0xffffffff00000001 add sub mul square +// +// curve description: Fp +// +// machine_wordsize = 64 (from "64") +// +// requested operations: add, sub, mul, square +// +// m = 0xffffffff00000001 (from "0xffffffff00000001") +// +// +// +// NOTE: In addition to the bounds specified above each function, all +// +// functions synthesized for this Montgomery arithmetic require the +// +// input to be strictly less than the prime modulus (m), and also +// +// require the input to be in the unique saturated representation. +// +// All functions also ensure that these two properties are true of +// +// return values. +// +// +// +// Computed values: +// +// eval z = z[0] +// +// bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) +// +// twos_complement_eval z = let x1 := z[0] in +// +// if x1 & (2^64-1) < 2^63 then x1 & (2^64-1) else (x1 & (2^64-1)) - 2^64 + +package fp64 + +import "math/bits" + +// The function fiatFpAdd adds two field elements in the Montgomery domain. +// +// Preconditions: +// 0 ≤ eval arg1 < m +// 0 ≤ eval arg2 < m +// Postconditions: +// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m +// 0 ≤ eval out1 < m +// +// Input Bounds: +// arg1: [[0x0 ~> 0xffffffffffffffff]] +// arg2: [[0x0 ~> 0xffffffffffffffff]] +// Output Bounds: +// out1: [[0x0 ~> 0xffffffffffffffff]] +func fiatFpAdd(out1 *Fp, arg1 *Fp, arg2 *Fp) { + var x1 uint64 + var x2 uint64 + x1, x2 = bits.Add64(arg1[0], arg2[0], uint64(0x0)) + var x3 uint64 + var x4 uint64 + x3, x4 = bits.Sub64(x1, 0xffffffff00000001, uint64(uint64(0x0))) + var x6 uint64 + _, x6 = bits.Sub64(x2, uint64(0x0), uint64(x4)) + var x7 uint64 + fiatFpCmovznzU64(&x7, x6, x3, x1) + out1[0] = x7 +} + +// The function fiatFpSub subtracts two field elements in the Montgomery domain. +// +// Preconditions: +// 0 ≤ eval arg1 < m +// 0 ≤ eval arg2 < m +// Postconditions: +// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m +// 0 ≤ eval out1 < m +// +// Input Bounds: +// arg1: [[0x0 ~> 0xffffffffffffffff]] +// arg2: [[0x0 ~> 0xffffffffffffffff]] +// Output Bounds: +// out1: [[0x0 ~> 0xffffffffffffffff]] +func fiatFpSub(out1 *Fp, arg1 *Fp, arg2 *Fp) { + x1 := arg2[0] + var x2 uint64 + var x3 uint64 + x2, x3 = bits.Sub64(arg1[0], x1, uint64(0x0)) + var x4 uint64 + fiatFpCmovznzU64(&x4, x3, uint64(0x0), 0xffffffffffffffff) + var x5 uint64 + x5, _ = bits.Add64(x2, (x4 & 0xffffffff00000001), uint64(0x0)) + out1[0] = x5 +} + +// The function fiatFpMul multiplies two field elements in the Montgomery domain. +// +// Preconditions: +// 0 ≤ eval arg1 < m +// 0 ≤ eval arg2 < m +// Postconditions: +// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m +// 0 ≤ eval out1 < m +// +// Input Bounds: +// arg1: [[0x0 ~> 0xffffffffffffffff]] +// arg2: [[0x0 ~> 0xffffffffffffffff]] +// Output Bounds: +// out1: [[0x0 ~> 0xffffffffffffffff]] +func fiatFpMul(out1 *Fp, arg1 *Fp, arg2 *Fp) { + x1 := arg1[0] + var x2 uint64 + var x3 uint64 + x3, x2 = bits.Mul64(x1, arg2[0]) + var x4 uint64 + _, x4 = bits.Mul64(x2, 0xfffffffeffffffff) + var x6 uint64 + var x7 uint64 + x7, x6 = bits.Mul64(x4, 0xffffffff00000001) + var x9 uint64 + _, x9 = bits.Add64(x2, x6, uint64(0x0)) + var x10 uint64 + var x11 uint64 + x10, x11 = bits.Add64(x3, x7, uint64(x9)) + var x12 uint64 + var x13 uint64 + x12, x13 = bits.Sub64(x10, 0xffffffff00000001, uint64(uint64(0x0))) + var x15 uint64 + _, x15 = bits.Sub64(x11, uint64(0x0), uint64(x13)) + var x16 uint64 + fiatFpCmovznzU64(&x16, x15, x12, x10) + out1[0] = x16 +} + +// The function fiatFpSquare squares a field element in the Montgomery domain. +// +// Preconditions: +// 0 ≤ eval arg1 < m +// Postconditions: +// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m +// 0 ≤ eval out1 < m +// +// Input Bounds: +// arg1: [[0x0 ~> 0xffffffffffffffff]] +// Output Bounds: +// out1: [[0x0 ~> 0xffffffffffffffff]] +func fiatFpSquare(out1 *Fp, arg1 *Fp) { + x1 := arg1[0] + var x2 uint64 + var x3 uint64 + x3, x2 = bits.Mul64(x1, arg1[0]) + var x4 uint64 + _, x4 = bits.Mul64(x2, 0xfffffffeffffffff) + var x6 uint64 + var x7 uint64 + x7, x6 = bits.Mul64(x4, 0xffffffff00000001) + var x9 uint64 + _, x9 = bits.Add64(x2, x6, uint64(0x0)) + var x10 uint64 + var x11 uint64 + x10, x11 = bits.Add64(x3, x7, uint64(x9)) + var x12 uint64 + var x13 uint64 + x12, x13 = bits.Sub64(x10, 0xffffffff00000001, uint64(uint64(0x0))) + var x15 uint64 + _, x15 = bits.Sub64(x11, uint64(0x0), uint64(x13)) + var x16 uint64 + fiatFpCmovznzU64(&x16, x15, x12, x10) + out1[0] = x16 +} diff --git a/vdaf/prio3/arith/fp64/fp.go b/vdaf/prio3/arith/fp64/fp.go new file mode 100644 index 000000000..881c4b992 --- /dev/null +++ b/vdaf/prio3/arith/fp64/fp.go @@ -0,0 +1,242 @@ +// Code generated from ./templates/field.go.tmpl. DO NOT EDIT. + +package fp64 + +import ( + "bytes" + "crypto/subtle" + "encoding/binary" + "errors" + "io" + + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/internal/sha3" + "golang.org/x/crypto/cryptobyte" +) + +// Size is the length in bytes of an Fp64 element. +const Size = 8 + +// Fp represents a prime field element as a positive integer less than Order. +type Fp [1]uint64 + +func (z Fp) String() string { x := z.fromMont(); return conv.Uint64Le2Hex(x[:]) } +func (z Fp) Size() uint { return Size } +func (z Fp) OrderRootUnity() uint { return numRootsUnity } +func (z *Fp) AddAssign(x *Fp) { fiatFpAdd(z, z, x) } +func (z *Fp) SubAssign(x *Fp) { fiatFpSub(z, z, x) } +func (z *Fp) MulAssign(x *Fp) { fiatFpMul(z, z, x) } +func (z *Fp) Add(x, y *Fp) { fiatFpAdd(z, x, y) } +func (z *Fp) Sub(x, y *Fp) { fiatFpSub(z, x, y) } +func (z *Fp) Mul(x, y *Fp) { fiatFpMul(z, x, y) } +func (z *Fp) Sqr(x *Fp) { fiatFpSquare(z, x) } +func (z *Fp) IsZero() bool { return ctEqual(z, &Fp{}) } +func (z *Fp) IsOne() bool { return ctEqual(z, &rootOfUnityTwoN[0]) } +func (z *Fp) IsEqual(x *Fp) bool { return ctEqual(z, x) } +func (z *Fp) SetOne() { *z = rootOfUnityTwoN[0] } +func (z *Fp) toMont() { fiatFpMul(z, z, &rSquare) } +func (z *Fp) fromMont() (out Fp) { fiatFpMul(&out, z, &Fp{1}); return } +func (z *Fp) MarshalBinary() ([]byte, error) { return conv.MarshalBinaryLen(z, Size) } +func (z *Fp) UnmarshalBinary(b []byte) error { return conv.UnmarshalBinary(z, b) } +func (z *Fp) Marshal(b *cryptobyte.Builder) error { + var x [Size]byte + for i, zi := range z.fromMont() { + binary.LittleEndian.PutUint64(x[8*i:], zi) + } + b.AddBytes(x[:]) + return nil +} + +func (z *Fp) Unmarshal(s *cryptobyte.String) bool { + var b [Size]byte + if s.CopyBytes(b[:]) { + n, ok := isInRange(&b) + if ok { + *z = n + z.toMont() + return true + } + } + return false +} + +func (z *Fp) Random(r io.Reader) error { + var b [Size]byte + var ok bool + for range maxNumTries { + _, err := r.Read(b[:]) + if err != nil { + return err + } + + *z, ok = isInRange(&b) + if ok { + z.toMont() + return nil + } + } + + return ErrMaxNumTries +} + +func (z *Fp) RandomSHA3(s *sha3.State) error { + var b [Size]byte + var ok bool + for range maxNumTries { + _, err := s.Read(b[:]) + if err != nil { + return err + } + + *z, ok = isInRange(&b) + if ok { + z.toMont() + return nil + } + } + + return ErrMaxNumTries +} + +func (z *Fp) InvUint64(x uint64) { + if 0 < x && x <= numInverseInt { + *z = inverseInt[x-1] + } else { + err := z.SetUint64(x) + if err != nil { + panic(ErrFieldEltDecode) + } + z.Inv(z) + } +} + +func (z *Fp) InvTwoN(n uint) { + z.SetOne() + for range n { + z.Mul(z, &half) + } +} + +func (z *Fp) SetUint64(n uint64) error { + if n >= orderP0 { + return ErrFieldEltDecode + } + *z = Fp{n} + z.toMont() + return nil +} + +func (z *Fp) GetUint64() (uint64, error) { + x := z.fromMont() + return x[0], nil +} + +func (z *Fp) SetRootOfUnityTwoN(n uint) { + if n > numRootsUnity { + panic(ErrRootsOfUnity) + } + *z = rootOfUnityTwoN[n] +} + +func (z Fp) Order() []byte { + var x [Size]byte + binary.Write(bytes.NewBuffer(x[:0]), binary.BigEndian, []uint64{orderP0}) + return x[:] +} + +func (z *Fp) sqri(x *Fp, n uint) { + z.Sqr(x) + for range n - 1 { + z.Sqr(z) + } +} + +func fiatFpCmovznzU64(z *uint64, b, x, y uint64) { *z = (x &^ (-b)) | (y & (-b)) } + +func ctEqual(x, y *Fp) bool { + var v uint64 + for i := 0; i < len(*x); i++ { + v |= (*x)[i] ^ (*y)[i] + } + v32 := uint32(v>>32) | uint32(v) + return subtle.ConstantTimeEq(int32(v32), 0) == 1 +} + +const ( + // order is the order of the Fp64 field. + orderP0 = uint64(0xffffffff00000001) + // numRootsUnity is .. + numRootsUnity = 32 + // numInverseIntFp64 is the number of precomputed inverses. + numInverseInt = 8 + // maxNumTries is the maximum tries for rejection sampling. + maxNumTries = 10 +) + +var ( + // rSquare is R^2 mod Fp64Order, where R=2^64 (little-endian). + rSquare = Fp{0xfffffffe00000001} + // half is 1/2 mod Order. + half = Fp{0x8000000000000000} + // rootOfUnityTwoN are the (principal) roots of unity that generate + // a multiplicative group of order 2^n. + // i.e., rootOfUnityTwoN[i] generates a group of order 2^i. + // Thus, by definition, + // - rootOfUnityTwoN[0] = One + // - rootOfUnityTwoN[numRoots] = Generator + // Constants are encoded in Montgomery domain (little-endian). + rootOfUnityTwoN = [numRootsUnity + 1]Fp{ + {0x00000000ffffffff}, + {0xfffffffe00000002}, + {0xfffffffeffff0001}, + {0xfeffffff01000001}, + {0x0000000010000000}, + {0xffffbfff00000001}, + {0xfffffffeffffff81}, + {0x07fffffffffff800}, + {0xe60ca9645a7a425e}, + {0x5c411f4d8ab91088}, + {0x8bfed970d671fbb7}, + {0x1da1c8cedc0a82b1}, + {0x959dfcb4779eb1b1}, + {0x35d17996b4e99746}, + {0x10bba1e10e56548b}, + {0x2306baaae6467556}, + {0xbf79450ceba724c2}, + {0xaa3d8a0ca9f1cf0a}, + {0x05f9beab78de26d9}, + {0x8caa33007781b093}, + {0x5e93e76c70b1e9c6}, + {0x32322652d8cb2ab7}, + {0xe67246b3ce63a09e}, + {0x36fbc989de66dc62}, + {0xc307e16fb62a525e}, + {0x6ecfefd745751a91}, + {0x78d6e28499e74d1f}, + {0x915a171c5dce5b0b}, + {0x004a4484a6b1267b}, + {0xa46d26647bea105f}, + {0xb86a0843c8fa27b2}, + {0x5588e6586a6c9a32}, + {0xda58878b0d514e98}, + } + // inverseInt has the inverse of the first `numInverseInt` integers. + inverseInt = [numInverseInt]Fp{ + {0x00000000ffffffff}, + {0x8000000000000000}, + {0x0000000055555555}, + {0x4000000000000000}, + {0x0000000033333333}, + {0x7fffffffaaaaaaab}, + {0x6db6db6d6db6db6e}, + {0x2000000000000000}, + } +) + +var ( + ErrMatchLen = errors.New("inputs mismatched length") + ErrFieldEltDecode = errors.New("incorrect field element value") + ErrNumberTooLarge = errors.New("number of bits is not enough to represent the number") + ErrMaxNumTries = errors.New("random rejection sampling reached maximum number of tries") + ErrRootsOfUnity = errors.New("Fp has no roots of unity of order larger than 2^32") +) diff --git a/vdaf/prio3/arith/fp64/inverse.go b/vdaf/prio3/arith/fp64/inverse.go new file mode 100644 index 000000000..be1e467c3 --- /dev/null +++ b/vdaf/prio3/arith/fp64/inverse.go @@ -0,0 +1,25 @@ +package fp64 + +func (z *Fp) Inv(x *Fp) { + // Addition chain found using mmcloughlin/addchain: v0.4.0 + // (McLoughlin, 2021). https://doi.org/10.5281/zenodo.4758226 + var t, t0, t1 Fp + t.Sqr(x) + t.Mul(x, &t) + t.Sqr(&t) + t.Mul(x, &t) + t0.sqri(&t, 3) + t0.Mul(&t, &t0) + t1.Sqr(&t0) + t.Mul(x, &t1) + t1.sqri(&t1, 5) + t0.Mul(&t0, &t1) + t1.sqri(&t0, 12) + t0.Mul(&t0, &t1) + t0.sqri(&t0, 7) + t.Mul(&t, &t0) + t0.sqri(&t, 32) + t.Mul(&t, &t0) + t.Sqr(&t) + z.Mul(x, &t) +} diff --git a/vdaf/prio3/arith/fp64/poly.go b/vdaf/prio3/arith/fp64/poly.go new file mode 100644 index 000000000..ab9d3ec9b --- /dev/null +++ b/vdaf/prio3/arith/fp64/poly.go @@ -0,0 +1,68 @@ +// Code generated from ./templates/poly.go.tmpl. DO NOT EDIT. + +package fp64 + +import "github.com/cloudflare/circl/math" + +type Poly []Fp + +func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } +func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } +func (p Poly) Mul(x, y Poly) { + mustSumLen(p, x, y) + clear(p) + var xiyj Fp + for i := range x { + for j := range y { + xiyj.Mul(&x[i], &y[j]) + p[i+j].AddAssign(&xiyj) + } + } +} + +func (p Poly) Sqr(x Poly) { + mustSumLen(p, x, x) + clear(p) + for i := range x { + p[2*i].Sqr(&x[i]) + } + + var xixj Fp + for i := 0; i < len(x); i++ { + for j := i + 1; j < len(x); j++ { + xixj.Mul(&x[i], &x[j]) + xixj.AddAssign(&xixj) + p[i+j].AddAssign(&xixj) + } + } +} + +func (p Poly) Evaluate(x *Fp) (px Fp) { + if l := len(p); l != 0 { + px = p[l-1] + for i := l - 2; i >= 0; i-- { + px.MulAssign(x) + px.AddAssign(&p[i]) + } + } + + return +} + +func (p Poly) Strip() Poly { + for i := len(p) - 1; i >= 0; i-- { + if !p[i].IsZero() { + return p[:i+1] + } + } + + return p[:0] +} + +func (p Poly) Interpolate(values []Fp) { + _, logN := math.NextPow2(uint(len(values))) + Vec(p).InvNTT(values) + var invN Fp + invN.InvTwoN(logN) + Vec(p).ScalarMul(&invN) +} diff --git a/vdaf/prio3/arith/fp64/vector.go b/vdaf/prio3/arith/fp64/vector.go new file mode 100644 index 000000000..3ec7ef683 --- /dev/null +++ b/vdaf/prio3/arith/fp64/vector.go @@ -0,0 +1,221 @@ +// Code generated from ./templates/vector.go.tmpl. DO NOT EDIT. + +package fp64 + +import ( + "encoding/binary" + "io" + "math/bits" + + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/math" + "golang.org/x/crypto/cryptobyte" +) + +type Vec []Fp + +func (v Vec) Size() uint { return Size * uint(len(v)) } + +func (v Vec) AddAssign(x Vec) { + mustSameLen(v, x) + for i := range v { + v[i].AddAssign(&x[i]) + } +} + +func (v Vec) SubAssign(x Vec) { + mustSameLen(v, x) + for i := range v { + v[i].SubAssign(&x[i]) + } +} + +func (v Vec) ScalarMul(x *Fp) { + for i := range v { + v[i].MulAssign(x) + } +} + +func (v Vec) DotProduct(x Vec) (out Fp) { + mustSameLen(v, x) + var t Fp + for i := range v { + t.Mul(&v[i], &x[i]) + out.AddAssign(&t) + } + return +} + +func bitRev(x uint, numBits uint) uint { + return bits.Reverse(x) >> (bits.UintSize - numBits) +} + +func (v Vec) NTT(values Vec) { v.doNTT(values, false) } +func (v Vec) InvNTT(values Vec) { v.doNTT(values, true) } +func (v Vec) doNTT(values Vec, isInvNTT bool) { + valuesLen := uint(len(values)) + _, logN := math.NextPow2(valuesLen) + + for i := range v { + j := bitRev(uint(i), logN) + if j < valuesLen { + v[i] = values[j] + } + } + + var t, w, wn, iwn Fp + r := &wn + if isInvNTT { + r = &iwn + iwn.SetOne() + } + + for l := uint(1); l <= logN; l++ { + y := uint(1) << (l - 1) + chunk := uint(1) << (logN - l) + + for j := range chunk { + x := j << l + u := v[x] + v[x+0].Add(&u, &v[x+y]) + v[x+y].Sub(&u, &v[x+y]) + } + + w.SetOne() + wn.SetRootOfUnityTwoN(l) + iwn.MulAssign(&wn) + for i := uint(1); i < y; i++ { + w.MulAssign(r) + for j := range chunk { + x := (j << l) + i + u := v[x] + t.Mul(&w, &v[x+y]) + v[x+0].Add(&u, &t) + v[x+y].Sub(&u, &t) + } + } + } +} + +func (v Vec) SplitBits(n uint64) error { + if bits.Len64(n) > len(v) { + return ErrNumberTooLarge + } + + clear(v) + for i := range v { + if (n>>i)&0x1 == 1 { + v[i].SetOne() + } + } + + return nil +} + +func (v Vec) JoinBits() Fp { + var two Fp + _ = two.SetUint64(2) + return Poly(v).Evaluate(&two) +} + +func (v Vec) Random(rnd io.Reader) error { + var b [Size]byte + var ok bool +forVec: + for i := range v { + for range maxNumTries { + _, err := rnd.Read(b[:]) + if err != nil { + return err + } + + v[i], ok = isInRange(&b) + if ok { + v[i].toMont() + continue forVec + } + } + return ErrMaxNumTries + } + + return nil +} + +func (v Vec) RandomSHA3(s *sha3.State) error { + for i := range v { + err := v[i].RandomSHA3(s) + if err != nil { + return err + } + } + + return nil +} + +func (v Vec) RandomSHA3Bytes(out []byte, s *sha3.State) error { + var b [Size]byte + var ok bool + +forVec: + for i := range v { + for range maxNumTries { + _, err := s.Read(b[:]) + if err != nil { + return err + } + + v[i], ok = isInRange(&b) + if ok { + out = append(out, b[:]...) + v[i].toMont() + continue forVec + } + } + + return ErrMaxNumTries + } + return nil +} + +func (v Vec) MarshalBinary() ([]byte, error) { + return conv.MarshalBinaryLen(v, v.Size()) +} + +func (v Vec) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(v, b) +} + +func (v Vec) Marshal(b *cryptobyte.Builder) error { + for i := range v { + v[i].Marshal(b) + } + return nil +} + +func (v Vec) Unmarshal(s *cryptobyte.String) bool { + for i := range v { + if !v[i].Unmarshal(s) { + return false + } + } + return true +} + +func isInRange(b *[Size]byte) (out [1]uint64, ok bool) { + out[0] = binary.LittleEndian.Uint64(b[:8]) + ok = out[0] < orderP0 + return +} + +func mustSameLen[T ~[]E, E any](x, y T) { + if len(x) != len(y) { + panic(ErrMatchLen) + } +} + +func mustSumLen[T ~[]E, E any](z, x, y T) { + if len(z) != len(x)+len(y)-1 { + panic(ErrMatchLen) + } +} diff --git a/vdaf/prio3/arith/fp64_test.go b/vdaf/prio3/arith/fp64_test.go new file mode 100644 index 000000000..3ff6df39d --- /dev/null +++ b/vdaf/prio3/arith/fp64_test.go @@ -0,0 +1,21 @@ +// Code generated from ./templates/field_test.go.tmpl. DO NOT EDIT. + +package arith + +import ( + "testing" + + "github.com/cloudflare/circl/vdaf/prio3/arith/fp64" +) + +func TestFp64(t *testing.T) { + t.Run("Fp", testFp[fp64.Fp]) + t.Run("Vec", testVec[fp64.Vec]) + t.Run("Poly", testPoly[fp64.Poly, fp64.Vec]) +} + +func BenchmarkFp64(b *testing.B) { + b.Run("Fp", benchmarkFp[fp64.Fp]) + b.Run("Vec", benchmarkVec[fp64.Vec]) + b.Run("Poly", benchmarkPoly[fp64.Poly, fp64.Vec]) +} diff --git a/vdaf/prio3/arith/gen.go b/vdaf/prio3/arith/gen.go new file mode 100644 index 000000000..3c105601a --- /dev/null +++ b/vdaf/prio3/arith/gen.go @@ -0,0 +1,182 @@ +//go:build ignore + +package main + +import ( + "bytes" + "fmt" + "go/format" + "math/big" + "os" + "path" + "strings" + "text/template" +) + +type Fp struct { + Name string + Bits uint + NumRootsUnity uint + NumInverseInt uint + Modulus string + Generator string +} + +func (f Fp) NumUint64() int { return int(f.Bits) / 64 } + +func (f Fp) NumUint8() int { return int(f.Bits) / 8 } + +func (f Fp) OrderConst() (s string) { + d := baseTwo64(f.Prime()) + for i := f.NumUint64() - 1; i >= 0; i-- { + s += fmt.Sprintf("orderP%v = uint64(0x%v)\n", i, d[i].Text(16)) + } + return +} + +func (f Fp) OrderVar() string { + var s []string + for i := f.NumUint64() - 1; i >= 0; i-- { + s = append(s, fmt.Sprintf("orderP%v", i)) + } + return strings.Join(s, ",") +} + +func (f Fp) Prime() *big.Int { + p, _ := new(big.Int).SetString(f.Modulus, 16) + return p +} + +func (f Fp) Half() string { + p := f.Prime() + half := big.NewInt(2) + half.ModInverse(half, p) + f.toMont(half, p) + return printDigits(half) +} + +func (f Fp) RSquare() string { + p := f.Prime() + R2 := big.NewInt(1) + R2.Lsh(R2, f.Bits) + R2.Mul(R2, R2).Mod(R2, p) + return printDigits(R2) +} + +func (f Fp) RootsOfUnity() (s string) { + p := f.Prime() + g, _ := new(big.Int).SetString(f.Generator, 16) + for i := range f.NumRootsUnity + 1 { + twoI := big.NewInt(1) + twoI.Lsh(twoI, f.NumRootsUnity-i) + gi := new(big.Int).Exp(g, twoI, p) + f.toMont(gi, p) + s += "{" + printDigits(gi) + "},\n" + } + return +} + +func (f Fp) InverseInt() (s string) { + p := f.Prime() + for i := range f.NumInverseInt { + invI := new(big.Int).ModInverse(big.NewInt(int64(i+1)), p) + f.toMont(invI, p) + s += "{" + printDigits(invI) + "},\n" + } + return +} + +func (f Fp) toMont(x, p *big.Int) { + R := big.NewInt(1) + R.Lsh(R, f.Bits) + x.Mul(x, R).Mod(x, p) +} + +func baseTwo64(v *big.Int) (d []*big.Int) { + n := new(big.Int).Set(v) + two64 := new(big.Int).Lsh(big.NewInt(1), 64) + for n.Sign() > 0 { + x := new(big.Int).Mod(n, two64) + n.Rsh(n, 64) + d = append(d, x) + } + return +} + +func printDigits(n *big.Int) (s string) { + for _, d := range baseTwo64(n) { + s += fmt.Sprintf("0x%016x,", d) + } + return +} + +func main() { + const TemplateWarning = "// Code generated from" + + fields := []Fp{ + { + Name: "Fp64", + Bits: 64, + NumRootsUnity: 32, + NumInverseInt: 8, + // Modulus: 2^32 * 4294967295 + 1 + Modulus: "ffffffff00000001", + // Generator: 7^4294967295 + Generator: "185629dcda58878c", + }, + { + Name: "Fp128", + Bits: 128, + NumRootsUnity: 66, + NumInverseInt: 8, + // Modulus: 2^66 * 4611686018427387897 + 1 + Modulus: "ffffffffffffffe40000000000000001", + // Generator: 7^4611686018427387897 + Generator: "6d278fbf4f60228b1f9b2759c5109f06", + }, + } + + for _, file := range []string{"fp_test", "fp", "vector", "poly"} { + tName := "templates/" + file + ".go.tmpl" + tl, err := template. + New(path.Base(tName)). + Funcs(template.FuncMap{"ToLower": strings.ToLower}). + ParseFiles(tName) + if err != nil { + panic(err) + } + + for _, f := range fields { + buf := new(bytes.Buffer) + err := tl.Execute(buf, f) + if err != nil { + panic(err) + } + + code := buf.Bytes() + code, err = format.Source(code) + if err != nil { + panic("error formating code") + } + + res := string(code) + offset := strings.Index(res, TemplateWarning) + if offset == -1 { + panic("Missing template warning") + } + + folder := strings.ToLower(f.Name) + fileName := file + if file == "fp_test" { + folder = "." + fileName = strings.ToLower(f.Name) + "_test" + } + + path := fmt.Sprintf("%v/%v.go", folder, fileName) + err = os.WriteFile(path, []byte(res[offset:]), 0o600) + if err != nil { + panic(err) + } + } + } +} diff --git a/vdaf/prio3/arith/genFiatMont.go b/vdaf/prio3/arith/genFiatMont.go new file mode 100644 index 000000000..1b2f3def9 --- /dev/null +++ b/vdaf/prio3/arith/genFiatMont.go @@ -0,0 +1,79 @@ +//go:build ignore +// +build ignore + +// Code Generation using fiat-crypto +// +// Download and unpack Fiat Cryptography v0.1.4 from +// https://github.com/mit-plv/fiat-crypto/releases/tag/v0.1.4 +// +// Then run this program specifying the path to the Fiat Cryptography v0.1.4 binary. +// $ FIAT_BINARY= go run genFiatMont.go +// +// References: +// [1] Erbsen et al. "Simple High-Level Code For Cryptographic Arithmetic – With +// Proofs, Without Compromises" https://github.com/mit-plv/fiat-crypto + +package main + +import ( + "log" + "os" + "os/exec" + "strings" + "text/template" +) + +const headerCIRCL = "Code generated by fiat.go using fiat-crypto v0.1.4." + +var FIAT_PARAMS = []string{ + "word-by-word-montgomery", + "--output", "{{.Pkg}}/fiatMont.go", + "--lang", "Go", + "--package-name", "{{.Pkg}}", + "--doc-prepend-header", headerCIRCL, + "--package-case", "lowerCamelCase", + "--public-function-case", "lowerCamelCase", + "--public-type-case", "lowerCamelCase", + "--doc-newline-before-package-declaration", + "--no-primitives", + "--widen-carry", + "--no-field-element-typedefs", + "--relax-primitive-carry-to-bitwidth", "64", + "Fp", "64", "{{.Prime}}", "add", "sub", "mul", "square", +} + +var fields = []struct{ Pkg, Prime string }{ + { + Pkg: "fp64", + Prime: "0xffffffff00000001", // 2^32 * 4294967295 + 1 + }, + { + Pkg: "fp128", + Prime: "0xffffffffffffffe40000000000000001", // 2^66 * 4611686018427387897 + 1 + }, +} + +func main() { + FIAT_BINARY := os.Getenv("FIAT_BINARY") + if FIAT_BINARY == "" { + log.Fatal("error: must specify the path to the Fiat Cryptography binary.") + } + + paramsTmpl := strings.Join(FIAT_PARAMS, ",") + + for _, f := range fields { + var buf strings.Builder + t := template.Must(new(template.Template).Parse(paramsTmpl)) + err := t.Execute(&buf, f) + if err != nil { + log.Fatalf("error: executing template: %v", err) + } + + cmdParams := strings.Split(buf.String(), ",") + cmd := exec.Command(FIAT_BINARY, cmdParams...) + out, err := cmd.CombinedOutput() + if len(out) != 0 || err != nil { + log.Fatalf("command output: %s\n command error: %v\n", out, err) + } + } +} diff --git a/vdaf/prio3/arith/poly_test.go b/vdaf/prio3/arith/poly_test.go new file mode 100644 index 000000000..5d7b90160 --- /dev/null +++ b/vdaf/prio3/arith/poly_test.go @@ -0,0 +1,153 @@ +package arith + +import ( + "slices" + "testing" + + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/math" +) + +const Degree = 1024 + +func testPoly[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { + t.Run("interpolate", interpolate[P, V, E, F]) + t.Run("strip", strip[P, E, F]) + t.Run("mulSqr", mulSqrPoly[P, V, E, F]) +} + +func mulSqrPoly[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { + const Deg = 4 + x := NewPoly[P](Deg) + y := NewPoly[P](Deg) + l0 := NewPoly[P](Deg) + l1 := NewPoly[P](Deg) + l2 := NewPoly[P](2 * Deg) + r0 := NewPoly[P](2 * Deg) + r1 := NewPoly[P](2 * Deg) + + for i := 0; i < testTimes; i++ { + mustRead(t, V(x)) + mustRead(t, V(y)) + + // (x+y)(x-y) = (x^2-y^2) + copy(l0, x) + copy(l1, x) + l0.AddAssign(y) + l1.SubAssign(y) + l2.Mul(l0, l1) + + r0.Sqr(x) + r1.Sqr(y) + r0.SubAssign(r1) + got := l2 + want := r0 + if !slices.Equal(got, want) { + test.ReportError(t, got, want, x, y) + } + } +} + +func evalRootsUnity[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](p P) V { + // evaluate p on the powers of the root of unity. + // p(w^0), p(w^1), p(w^2), ... + N, logN := math.NextPow2(uint(len(p))) + var wi, wn F = new(E), new(E) + wi.SetOne() + wn.SetRootOfUnityTwoN(logN) + values := NewVec[V](N) + + for i := range values { + values[i] = p.Evaluate(wi) + wi.MulAssign(wn) + } + + return values +} + +func interpolate[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { + const Max = 10 + for logN := range Max { + N := uint(1) << logN + p := NewPoly[P](N - 1) + mustRead(t, V(p)) + values := evalRootsUnity[P, V, E, F](p) + + y := NewVec[V](N) + y.NTT(V(p)) + if !slices.Equal(y, values) { + test.ReportError(t, y, values) + } + + p2 := NewPoly[P](N - 1) + p2.Interpolate(values) + if !slices.Equal(p, p2) { + test.ReportError(t, p, p2) + } + } +} + +func strip[P Poly[P, E], E Elt, F Fp[E]](t *testing.T) { + N := 4 + p := NewPoly[P](uint(N)) + p = p.Strip() + test.CheckOk(len(p) == 0, "strip failed", t) + + for i := range N + 1 { + p := NewPoly[P](uint(N)) + F(&p[i]).SetOne() + p = p.Strip() + test.CheckOk(len(p) == i+1, "strip failed", t) + } +} + +func benchmarkPoly[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](b *testing.B) { + x := F(new(E)) + p := NewPoly[P](Degree) + q := NewPoly[P](Degree) + pq := NewPoly[P](2 * Degree) + mustRead(b, x) + mustRead(b, V(p)) + mustRead(b, V(q)) + + N, _ := math.NextPow2(Degree) + pol := NewPoly[P](N - 1) + mustRead(b, V(pol)) + values := evalRootsUnity[P, V, E, F](pol) + + b.Run("AddAssign", func(b *testing.B) { + for i := 0; i < b.N; i++ { + q.AddAssign(p) + } + }) + b.Run("Sqr", func(b *testing.B) { + for i := 0; i < b.N; i++ { + pq.Sqr(p) + } + }) + b.Run("Mul", func(b *testing.B) { + for i := 0; i < b.N; i++ { + pq.Mul(p, q) + } + }) + b.Run("Evaluate", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = p.Evaluate(x) + } + }) + b.Run("NTT", func(b *testing.B) { + for i := 0; i < b.N; i++ { + V(p).NTT(values) + } + }) + b.Run("InvNTT", func(b *testing.B) { + for i := 0; i < b.N; i++ { + V(p).InvNTT(values) + } + }) + b.Run("Interpolate", func(b *testing.B) { + for i := 0; i < b.N; i++ { + pol.Interpolate(values) + } + }) +} diff --git a/vdaf/prio3/arith/templates/fp.go.tmpl b/vdaf/prio3/arith/templates/fp.go.tmpl new file mode 100644 index 000000000..aaac41e3a --- /dev/null +++ b/vdaf/prio3/arith/templates/fp.go.tmpl @@ -0,0 +1,217 @@ +// +build ignore +// The previous line (and this one up to the warning below) is removed by the +// template generator. + +// Code generated from ./templates/field.go.tmpl. DO NOT EDIT. + +package {{.Name | ToLower}} + +import ( + "bytes" + "crypto/subtle" + "encoding/binary" + "errors" + "io" + + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/internal/sha3" + "golang.org/x/crypto/cryptobyte" +) + +// Size is the length in bytes of an {{.Name}} element. +const Size = {{.NumUint8}} + +// Fp represents a prime field element as a positive integer less than Order. +type Fp [{{.NumUint64}}]uint64 + +func (z Fp) String() string { x := z.fromMont(); return conv.Uint64Le2Hex(x[:]) } +func (z Fp) Size() uint { return Size } +func (z Fp) OrderRootUnity() uint { return numRootsUnity } +func (z *Fp) AddAssign(x *Fp) { fiatFpAdd(z, z, x) } +func (z *Fp) SubAssign(x *Fp) { fiatFpSub(z, z, x) } +func (z *Fp) MulAssign(x *Fp) { fiatFpMul(z, z, x) } +func (z *Fp) Add(x, y *Fp) { fiatFpAdd(z, x, y) } +func (z *Fp) Sub(x, y *Fp) { fiatFpSub(z, x, y) } +func (z *Fp) Mul(x, y *Fp) { fiatFpMul(z, x, y) } +func (z *Fp) Sqr(x *Fp) { fiatFpSquare(z, x) } +func (z *Fp) IsZero() bool { return ctEqual(z, &Fp{}) } +func (z *Fp) IsOne() bool { return ctEqual(z, &rootOfUnityTwoN[0]) } +func (z *Fp) IsEqual(x *Fp) bool { return ctEqual(z, x) } +func (z *Fp) SetOne() { *z = rootOfUnityTwoN[0] } +func (z *Fp) toMont() { fiatFpMul(z, z, &rSquare) } +func (z *Fp) fromMont() (out Fp) { fiatFpMul(&out, z, &Fp{1}); return } +func (z *Fp) MarshalBinary() ([]byte, error) { return conv.MarshalBinaryLen(z, Size) } +func (z *Fp) UnmarshalBinary(b []byte) error { return conv.UnmarshalBinary(z, b) } +func (z *Fp) Marshal(b *cryptobyte.Builder) error { + var x [Size]byte + for i, zi := range z.fromMont() { + binary.LittleEndian.PutUint64(x[8*i:], zi) + } + b.AddBytes(x[:]) + return nil +} + +func (z* Fp) Unmarshal(s *cryptobyte.String) bool{ + var b [Size]byte + if s.CopyBytes(b[:]) { + n, ok := isInRange(&b) + if ok { + *z = n + z.toMont() + return true + } + } + return false +} + +func (z* Fp) Random(r io.Reader) error { + var b [Size]byte + var ok bool + for range maxNumTries { + _, err := r.Read(b[:]) + if err != nil { + return err + } + + *z, ok = isInRange(&b) + if ok { + z.toMont() + return nil + } + } + + return ErrMaxNumTries +} + +func (z* Fp) RandomSHA3(s *sha3.State) error { + var b [Size]byte + var ok bool + for range maxNumTries { + _, err := s.Read(b[:]) + if err != nil { + return err + } + + *z, ok = isInRange(&b) + if ok { + z.toMont() + return nil + } + } + + return ErrMaxNumTries +} + +func (z* Fp) InvUint64(x uint64) { + if 0 < x && x <= numInverseInt { + *z = inverseInt[x-1] + } else { + err := z.SetUint64(x) + if err != nil { + panic(ErrFieldEltDecode) + } + z.Inv(z) + } +} + +func (z* Fp) InvTwoN(n uint) { + z.SetOne() + for range n { + z.Mul(z, &half) + } +} + +func (z* Fp) SetUint64(n uint64) error { + {{- if eq .Bits 64 }} + if n >= {{.OrderVar}} { + return ErrFieldEltDecode + } + {{- end }} + *z = Fp{n} + z.toMont() + return nil +} + +func (z* Fp) GetUint64() (uint64, error) { + x := z.fromMont(); + {{- if eq .Bits 128 }} + if x[1] != 0 { + return 0, ErrNumberTooLarge + } + {{- end }} + return x[0], nil +} + +func (z* Fp) SetRootOfUnityTwoN(n uint) { + if n > numRootsUnity { + panic(ErrRootsOfUnity) + } + *z = rootOfUnityTwoN[n] +} + + +func (z Fp) Order() []byte { + var x [Size]byte + binary.Write(bytes.NewBuffer(x[:0]), binary.BigEndian, []uint64{ {{.OrderVar}} }) + return x[:] +} + +func (z* Fp) sqri(x *Fp, n uint) { + z.Sqr(x) + for range n - 1 { + z.Sqr(z) + } +} + +func fiatFpCmovznzU64(z *uint64, b, x, y uint64) { *z = (x &^ (-b)) | (y & (-b)) } + +func ctEqual(x, y *Fp) bool { + var v uint64 + for i := 0; i < len(*x); i++ { + v |= (*x)[i] ^ (*y)[i] + } + v32 := uint32(v>>32) | uint32(v) + return subtle.ConstantTimeEq(int32(v32), 0) == 1 +} + + +const ( + // order is the order of the {{.Name}} field. + {{.OrderConst -}} + // numRootsUnity is .. + numRootsUnity = {{.NumRootsUnity}} + // numInverseInt{{.Name}} is the number of precomputed inverses. + numInverseInt = {{.NumInverseInt}} + // maxNumTries is the maximum tries for rejection sampling. + maxNumTries = 10 +) + +var ( + // rSquare is R^2 mod {{.Name}}Order, where R=2^{{.Bits}} (little-endian). + rSquare = Fp{ {{.RSquare}} } + // half is 1/2 mod Order. + half = Fp{ {{.Half}} } + // rootOfUnityTwoN are the (principal) roots of unity that generate + // a multiplicative group of order 2^n. + // i.e., rootOfUnityTwoN[i] generates a group of order 2^i. + // Thus, by definition, + // - rootOfUnityTwoN[0] = One + // - rootOfUnityTwoN[numRoots] = Generator + // Constants are encoded in Montgomery domain (little-endian). + rootOfUnityTwoN = [numRootsUnity + 1]Fp{ + {{.RootsOfUnity}} + } + // inverseInt has the inverse of the first `numInverseInt` integers. + inverseInt = [numInverseInt]Fp{ + {{.InverseInt}} + } +) + + +var ( + ErrMatchLen = errors.New("inputs mismatched length") + ErrFieldEltDecode = errors.New("incorrect field element value") + ErrNumberTooLarge = errors.New("number of bits is not enough to represent the number") + ErrMaxNumTries = errors.New("random rejection sampling reached maximum number of tries") + ErrRootsOfUnity = errors.New("Fp has no roots of unity of order larger than 2^{{.NumRootsUnity}}") +) diff --git a/vdaf/prio3/arith/templates/fp_test.go.tmpl b/vdaf/prio3/arith/templates/fp_test.go.tmpl new file mode 100644 index 000000000..827cabbee --- /dev/null +++ b/vdaf/prio3/arith/templates/fp_test.go.tmpl @@ -0,0 +1,25 @@ +// +build ignore +// The previous line (and this one up to the warning below) is removed by the +// template generator. + +// Code generated from ./templates/field_test.go.tmpl. DO NOT EDIT. + +package arith + +import ( + "testing" + + "github.com/cloudflare/circl/vdaf/prio3/arith/{{.Name | ToLower}}" +) + +func Test{{.Name}}(t *testing.T) { + t.Run("Fp", testFp[{{.Name | ToLower}}.Fp]) + t.Run("Vec", testVec[{{.Name | ToLower}}.Vec]) + t.Run("Poly",testPoly[{{.Name | ToLower}}.Poly, {{.Name | ToLower}}.Vec]) +} + +func Benchmark{{.Name}}(b *testing.B) { + b.Run("Fp", benchmarkFp[{{.Name | ToLower}}.Fp]) + b.Run("Vec", benchmarkVec[{{.Name | ToLower}}.Vec]) + b.Run("Poly", benchmarkPoly[{{.Name | ToLower}}.Poly, {{.Name | ToLower}}.Vec]) +} diff --git a/vdaf/prio3/arith/templates/poly.go.tmpl b/vdaf/prio3/arith/templates/poly.go.tmpl new file mode 100644 index 000000000..6e145be29 --- /dev/null +++ b/vdaf/prio3/arith/templates/poly.go.tmpl @@ -0,0 +1,72 @@ +// +build ignore +// The previous line (and this one up to the warning below) is removed by the +// template generator. + +// Code generated from ./templates/poly.go.tmpl. DO NOT EDIT. + +package {{.Name | ToLower}} + +import "github.com/cloudflare/circl/math" + +type Poly []Fp + +func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } +func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } +func (p Poly) Mul(x, y Poly) { + mustSumLen(p, x, y) + clear(p) + var xiyj Fp + for i := range x { + for j := range y { + xiyj.Mul(&x[i], &y[j]) + p[i+j].AddAssign(&xiyj) + } + } +} + +func (p Poly) Sqr(x Poly) { + mustSumLen(p, x, x) + clear(p) + for i := range x { + p[2*i].Sqr(&x[i]) + } + + var xixj Fp + for i := 0; i < len(x); i++ { + for j := i + 1; j < len(x); j++ { + xixj.Mul(&x[i], &x[j]) + xixj.AddAssign(&xixj) + p[i+j].AddAssign(&xixj) + } + } +} + +func (p Poly) Evaluate(x *Fp) (px Fp) { + if l := len(p); l != 0 { + px = p[l-1] + for i := l - 2; i >= 0; i-- { + px.MulAssign(x) + px.AddAssign(&p[i]) + } + } + + return +} + +func (p Poly) Strip() Poly { + for i := len(p) - 1; i >= 0; i-- { + if !p[i].IsZero() { + return p[:i+1] + } + } + + return p[:0] +} + +func (p Poly) Interpolate(values []Fp) { + _, logN := math.NextPow2(uint(len(values))) + Vec(p).InvNTT(values) + var invN Fp + invN.InvTwoN(logN) + Vec(p).ScalarMul(&invN) +} diff --git a/vdaf/prio3/arith/templates/vector.go.tmpl b/vdaf/prio3/arith/templates/vector.go.tmpl new file mode 100644 index 000000000..c1d0aa5c0 --- /dev/null +++ b/vdaf/prio3/arith/templates/vector.go.tmpl @@ -0,0 +1,233 @@ +// +build ignore +// The previous line (and this one up to the warning below) is removed by the +// template generator. + +// Code generated from ./templates/vector.go.tmpl. DO NOT EDIT. + +package {{.Name | ToLower}} + +import ( + "io" + "encoding/binary" + "math/bits" + + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/math" + "golang.org/x/crypto/cryptobyte" +) + +type Vec []Fp + +func (v Vec) Size() uint { return Size*uint(len(v)) } + +func (v Vec) AddAssign(x Vec) { + mustSameLen(v, x) + for i := range v { + v[i].AddAssign(&x[i]) + } +} + +func (v Vec) SubAssign(x Vec) { + mustSameLen(v, x) + for i := range v { + v[i].SubAssign(&x[i]) + } +} + +func (v Vec) ScalarMul(x *Fp) { + for i := range v { + v[i].MulAssign(x) + } +} + +func (v Vec) DotProduct(x Vec) (out Fp) { + mustSameLen(v, x) + var t Fp + for i := range v { + t.Mul(&v[i], &x[i]) + out.AddAssign(&t) + } + return +} + +func bitRev(x uint, numBits uint) uint { + return bits.Reverse(x) >> (bits.UintSize - numBits) +} + +func (v Vec) NTT(values Vec) { v.doNTT(values, false) } +func (v Vec) InvNTT(values Vec) { v.doNTT(values, true) } +func (v Vec) doNTT(values Vec, isInvNTT bool) { + valuesLen := uint(len(values)) + _, logN := math.NextPow2(valuesLen) + + for i := range v { + j := bitRev(uint(i), logN) + if j < valuesLen { + v[i] = values[j] + } + } + + var t, w, wn, iwn Fp + r := &wn + if isInvNTT { + r = &iwn + iwn.SetOne() + } + + for l := uint(1); l <= logN; l++ { + y := uint(1) << (l - 1) + chunk := uint(1) << (logN - l) + + for j := range chunk { + x := j << l + u := v[x] + v[x+0].Add(&u, &v[x+y]) + v[x+y].Sub(&u, &v[x+y]) + } + + w.SetOne() + wn.SetRootOfUnityTwoN(l) + iwn.MulAssign(&wn) + for i := uint(1); i < y; i++ { + w.MulAssign(r) + for j := range chunk { + x := (j << l) + i + u := v[x] + t.Mul(&w, &v[x+y]) + v[x+0].Add(&u, &t) + v[x+y].Sub(&u, &t) + } + } + } +} + +func (v Vec) SplitBits(n uint64) error { + if bits.Len64(n) > len(v) { + return ErrNumberTooLarge + } + + clear(v) + for i := range v { + if (n>>i)&0x1 == 1 { + v[i].SetOne() + } + } + + return nil +} + +func (v Vec) JoinBits() Fp { + var two Fp + _ = two.SetUint64(2) + return Poly(v).Evaluate(&two) +} + + +func (v Vec) Random(rnd io.Reader) error { + var b [Size]byte + var ok bool +forVec: + for i := range v { + for range maxNumTries { + _, err := rnd.Read(b[:]) + if err != nil { + return err + } + + v[i], ok = isInRange(&b) + if ok { + v[i].toMont() + continue forVec + } + } + return ErrMaxNumTries + } + + return nil +} + +func (v Vec) RandomSHA3(s *sha3.State) error { + for i := range v { + err := v[i].RandomSHA3(s) + if err != nil { + return err + } + } + + return nil +} + +func (v Vec) RandomSHA3Bytes(out []byte, s *sha3.State) error { + var b [Size]byte + var ok bool + +forVec: + for i := range v { + for range maxNumTries { + _, err := s.Read(b[:]) + if err != nil { + return err + } + + v[i], ok = isInRange(&b) + if ok { + out = append(out, b[:]...) + v[i].toMont() + continue forVec + } + } + + return ErrMaxNumTries + } + return nil +} + +func (v Vec) MarshalBinary() ([]byte, error) { + return conv.MarshalBinaryLen(v, v.Size()) +} + +func (v Vec) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(v, b) +} + +func (v Vec) Marshal(b *cryptobyte.Builder) error { + for i := range v { + v[i].Marshal(b) + } + return nil +} + +func (v Vec) Unmarshal(s *cryptobyte.String) bool{ + for i := range v { + if !v[i].Unmarshal(s) { + return false + } + } + return true +} + + +func isInRange(b *[Size]byte) (out [{{.NumUint64}}]uint64, ok bool) { + {{- if eq .Bits 64}} + out[0] = binary.LittleEndian.Uint64(b[:8]) + ok = out[0] < orderP0 + {{- else if eq .Bits 128}} + out[0] = binary.LittleEndian.Uint64(b[:8]) + out[1] = binary.LittleEndian.Uint64(b[8:]) + ok = out[1] < orderP1 || (out[1] == orderP1 && out[0] < orderP0) + {{- end }} + return +} + +func mustSameLen[T ~[]E, E any](x, y T) { + if len(x) != len(y) { + panic(ErrMatchLen) + } +} + +func mustSumLen[T ~[]E, E any](z, x, y T) { + if len(z) != len(x)+len(y)-1 { + panic(ErrMatchLen) + } +} diff --git a/vdaf/prio3/arith/vector_test.go b/vdaf/prio3/arith/vector_test.go new file mode 100644 index 000000000..93cc3a364 --- /dev/null +++ b/vdaf/prio3/arith/vector_test.go @@ -0,0 +1,158 @@ +package arith + +import ( + "crypto/rand" + "io" + "slices" + "testing" + + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/internal/test" +) + +func testVec[V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { + t.Run("marshal", marshalVec[V, E, F]) + t.Run("bitRepresentation", bitRepresentation[V, E, F]) + t.Run("random", random[V, E, F]) +} + +func marshalVec[V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { + const N = 4 + x := NewVec[V](N) + y := NewVec[V](N) + for i := 0; i < testTimes; i++ { + mustRead(t, x) + s, err := x.MarshalBinary() + test.CheckNoErr(t, err, "MarshalBinary failed") + test.CheckOk(uint(len(s)) == x.Size(), "wrong byte length", t) + + err = y.UnmarshalBinary(s) + test.CheckNoErr(t, err, "UnmarshalBinary failed") + if !slices.Equal(x, y) { + test.ReportError(t, x, y) + } + + // check for invalid size + err = y.UnmarshalBinary(s[1:]) + test.CheckIsErr(t, err, "UnmarshalBinary should failed") + } +} + +func bitRepresentation[V Vec[V, E], E Elt, F Fp[E]](t *testing.T) { + N := uint64(0x0F) + eightBits := NewVec[V](8) + err := eightBits.SplitBits(N) + test.CheckNoErr(t, err, "failed to split number in bits") + + for i := range eightBits { + if i < 4 { + test.CheckOk(F(&eightBits[i]).IsOne(), "vector element should be one", t) + } else { + test.CheckOk(F(&eightBits[i]).IsZero(), "vector element should be zero", t) + } + } + + num := eightBits.JoinBits() + test.CheckNoErr(t, err, "JoinBits failed") + + got, err := F(&num).GetUint64() + test.CheckNoErr(t, err, "failed to recover uint64") + + want := N + if got != want { + test.ReportError(t, got, want, eightBits, num) + } + + fourBits := NewVec[V](4) + err = fourBits.SplitBits(0xFF) + test.CheckIsErr(t, err, "SplitBits should return an error") +} + +func random[V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { + r := sha3.NewShake128() + v := NewVec[V](4) + err := v.Random(io.LimitReader(&r, 0)) + test.CheckIsErr(t, err, "generating random vector should failed") + + r.Reset() + got := NewVec[V](4) + err = got.Random(&r) + test.CheckNoErr(t, err, "Random failed") + + r.Reset() + want := NewVec[V](4) + err = want.RandomSHA3(&r) + test.CheckNoErr(t, err, "RandomSHA3 failed") + + if !slices.Equal(got, want) { + test.ReportError(t, got, want) + } +} + +func benchmarkVec[V Vec[V, E], E Elt, F Fp[E]](b *testing.B) { + const N = 1024 + k := F(new(E)) + x := NewVec[V](N) + z := NewVec[V](N) + + mustRead(b, k) + mustRead(b, x) + mustRead(b, z) + + const Bits = uint64(0x0F) + eightBits := NewVec[V](8) + _ = eightBits.SplitBits(Bits) + buf, _ := x.MarshalBinary() + + b.Run("MarshalBinary", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _, _ = z.MarshalBinary() + } + }) + b.Run("UnmarshalBinary", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = z.UnmarshalBinary(buf) + } + }) + b.Run("Random", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = z.Random(rand.Reader) + } + }) + b.Run("RandomSHA3", func(b *testing.B) { + r := sha3.NewShake128() + for i := 0; i < b.N; i++ { + _ = z.RandomSHA3(&r) + } + }) + b.Run("AddAssign", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.AddAssign(x) + } + }) + b.Run("SubAssign", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.SubAssign(x) + } + }) + b.Run("ScalarMul", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.ScalarMul(k) + } + }) + b.Run("DotProduct", func(b *testing.B) { + for i := 0; i < b.N; i++ { + z.DotProduct(x) + } + }) + b.Run("SplitBits", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = eightBits.SplitBits(Bits) + } + }) + b.Run("JoinBits", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = eightBits.JoinBits() + } + }) +} diff --git a/vdaf/prio3/common_test.go b/vdaf/prio3/common_test.go new file mode 100644 index 000000000..910aac086 --- /dev/null +++ b/vdaf/prio3/common_test.go @@ -0,0 +1,110 @@ +package prio3 + +import ( + "bytes" + "encoding" + "encoding/hex" + "encoding/json" + "io" + "os" + "slices" + "testing" + + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" + "golang.org/x/crypto/cryptobyte" +) + +type marshaler interface { + encoding.BinaryMarshaler + encoding.BinaryUnmarshaler +} + +func testMarshal[T any](t testing.TB, x *T, p *prio3.Params, extra ...uint) { + t.Helper() + bm := any(x).(marshaler) + b0, err := bm.MarshalBinary() + test.CheckNoErr(t, err, "first MarshalBinary failed") + + y := new(T) + yy, ok := any(y).(interface{ New(*prio3.Params) *T }) + if ok { + yy.New(p) + } else { + yy, ok := any(y).(interface{ New(*prio3.Params, uint) *T }) + if ok { + yy.New(p, extra[0]) + } + } + + bm = any(y).(marshaler) + err = bm.UnmarshalBinary(b0) + test.CheckNoErr(t, err, "UnmarshalBinary failed") + + b1, err := bm.MarshalBinary() + test.CheckNoErr(t, err, "second MarshalBinary failed") + + if !bytes.Equal(b0, b1) { + test.ReportError(t, b0, b1) + } + + // check for invalid size + err = bm.UnmarshalBinary(nil) + test.CheckIsErr(t, err, "UnmarshalBinary should failed") +} + +type Hex []byte + +func (b *Hex) UnmarshalJSON(data []byte) (err error) { + var s string + if err = json.Unmarshal(data, &s); err != nil { + return err + } + *b, err = hex.DecodeString(s) + return err +} + +func readFile[V any](t *testing.T, fileName string) (v V) { + t.Helper() + jsonFile, err := os.Open(fileName) + if err != nil { + t.Fatalf("File %v can not be opened. Error: %v", fileName, err) + } + defer jsonFile.Close() + input, err := io.ReadAll(jsonFile) + if err != nil { + t.Fatalf("File %v can not be read. Error: %v", fileName, err) + } + + err = json.Unmarshal(input, &v) + if err != nil { + t.Fatalf("File %v can not be loaded. Error: %v", fileName, err) + } + + return +} + +func checkEqual[T any](t *testing.T, a T, b []byte) { + t.Helper() + aa, err := conv.MarshalBinary(any(a).(cryptobyte.MarshalingValue)) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(aa, b) { + test.ReportError(t, hex.EncodeToString(aa), hex.EncodeToString(b)) + } +} + +func isEqual[T any](t *testing.T, a, b T) bool { + switch aa := any(a).(type) { + case uint64: + return aa == any(b).(uint64) + case []uint64: + return slices.Equal(aa, any(b).([]uint64)) + default: + t.Fatalf("unrecognized aggregate type: %T\n", a) + return false + } +} diff --git a/vdaf/prio3/count/count.go b/vdaf/prio3/count/count.go new file mode 100644 index 000000000..846390a07 --- /dev/null +++ b/vdaf/prio3/count/count.go @@ -0,0 +1,121 @@ +// Package count is a VDAF for counting boolean measurements. +package count + +import ( + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/arith/fp64" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" +) + +type ( + poly = fp64.Poly + Vec = fp64.Vec + Fp = fp64.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + OutShare = prio3.OutShare[Vec, Fp] + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] +) + +// Count is a verifiable distributed aggregation function in which each +// measurement is either one or zero and the aggregate result is the sum of +// the measurements. +type Count struct { + p prio3.Prio3[bool, uint64, *flpCount, Vec, Fp, *Fp] +} + +func New(numShares uint8, context []byte) (c *Count, err error) { + const countID uint8 = 1 + c = new(Count) + c.p, err = prio3.New(newFlpCount(), countID, numShares, context) + if err != nil { + return nil, err + } + + return c, nil +} + +func (c *Count) Params() prio3.Params { return c.p.Params() } + +func (c *Count) Shard(measurement bool, nonce *prio3.Nonce, rand []byte, +) (prio3.PublicShare, []InputShare, error) { + return c.p.Shard(measurement, nonce, rand) +} + +func (c *Count) PrepInit( + verifyKey *prio3.VerifyKey, + nonce *prio3.Nonce, + aggID uint8, + publicShare prio3.PublicShare, + inputShare InputShare, +) (*PrepState, *PrepShare, error) { + return c.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) +} + +func (c *Count) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { + return c.p.PrepSharesToPrep(prepShares) +} + +func (c *Count) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { + return c.p.PrepNext(state, msg) +} + +func (c *Count) AggregationInit() AggShare { return c.p.AggregationInit() } + +func (c *Count) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { + c.p.AggregationUpdate(aggShare, outShare) +} + +func (c *Count) Unshard(aggShares []AggShare, numMeas uint) (aggregate *uint64, err error) { + return c.p.Unshard(aggShares, numMeas) +} + +type flpCount struct { + flp.FLP[flp.GadgetMulFp64, poly, Vec, Fp, *Fp] +} + +func newFlpCount() *flpCount { + c := new(flpCount) + c.Valid.MeasurementLen = 1 + c.Valid.JointRandLen = 0 + c.Valid.OutputLen = 1 + c.Valid.EvalOutputLen = 1 + c.Gadget = flp.GadgetMulFp64{} + c.NumCalls = 1 + c.FLP.Eval = c.Eval + return c +} + +func (c *flpCount) Eval( + out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], _numCalls uint, + meas, _jointRand Vec, _shares uint8, +) { + g.Eval(&out[0], Vec{meas[0], meas[0]}) + out[0].SubAssign(&meas[0]) +} + +func (c *flpCount) Encode(measurement bool) (Vec, error) { + out := arith.NewVec[Vec](1) + if measurement { + out[0].SetOne() + } + + return out, nil +} + +func (c *flpCount) Truncate(meas Vec) Vec { return meas } + +func (c *flpCount) Decode(output Vec, numMeas uint) (*uint64, error) { + if len(output) < int(c.Valid.OutputLen) { + return nil, flp.ErrOutputLen + } + + n, err := output[0].GetUint64() + if err != nil { + return nil, err + } + + return &n, nil +} diff --git a/vdaf/prio3/doc.go b/vdaf/prio3/doc.go new file mode 100644 index 000000000..cd82a0394 --- /dev/null +++ b/vdaf/prio3/doc.go @@ -0,0 +1,13 @@ +// Package prio3 implements Prio3 a set of Verifiable Distributed +// Aggregation Functions. +// +// Prio3 provides several variants of Verifiable Distributed Aggregation +// Functions (VDAF) as described in draft-irtf-cfrg-vdaf [v13] +// - Count [github.com/cloudflare/circl/vdaf/prio3/count] +// - Sum [github.com/cloudflare/circl/vdaf/prio3/sum] +// - SumVec [github.com/cloudflare/circl/vdaf/prio3/sumvec] +// - Histogram [github.com/cloudflare/circl/vdaf/prio3/mhcv] +// - MultiHotCountVec [github.com/cloudflare/circl/vdaf/prio3/histogram] +// +// [v13]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13 +package prio3 diff --git a/vdaf/prio3/histogram/histogram.go b/vdaf/prio3/histogram/histogram.go new file mode 100644 index 000000000..4f6fab036 --- /dev/null +++ b/vdaf/prio3/histogram/histogram.go @@ -0,0 +1,137 @@ +// Package histogram is a VDAF for aggregating integer measurements into buckets. +package histogram + +import ( + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/arith/fp128" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" +) + +type ( + poly = fp128.Poly + Vec = fp128.Vec + Fp = fp128.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + OutShare = prio3.OutShare[Vec, Fp] + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] +) + +// Histogram is a verifiable distributed aggregation function in which each +// measurement increments by one the histogram bucket, out of a set of fixed +// buckets, and the aggregate result counts the number of measurements in each +// bucket. +type Histogram struct { + p prio3.Prio3[uint64, []uint64, *flpHistogram, Vec, Fp, *Fp] +} + +func New(numShares uint8, length, chunkLen uint, context []byte) (h *Histogram, err error) { + const histogramID uint8 = 4 + h = new(Histogram) + h.p, err = prio3.New(newFlpHistogram(length, chunkLen), histogramID, numShares, context) + if err != nil { + return nil, err + } + + return h, nil +} + +func (h *Histogram) Params() prio3.Params { return h.p.Params() } + +func (h *Histogram) Shard(measurement uint64, nonce *prio3.Nonce, rand []byte, +) (prio3.PublicShare, []InputShare, error) { + return h.p.Shard(measurement, nonce, rand) +} + +func (h *Histogram) PrepInit( + verifyKey *prio3.VerifyKey, + nonce *prio3.Nonce, + aggID uint8, + publicShare prio3.PublicShare, + inputShare InputShare, +) (*PrepState, *PrepShare, error) { + return h.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) +} + +func (h *Histogram) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { + return h.p.PrepSharesToPrep(prepShares) +} + +func (h *Histogram) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { + return h.p.PrepNext(state, msg) +} + +func (h *Histogram) AggregationInit() AggShare { return h.p.AggregationInit() } + +func (h *Histogram) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { + h.p.AggregationUpdate(aggShare, outShare) +} + +func (h *Histogram) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { + return h.p.Unshard(aggShares, numMeas) +} + +type flpHistogram struct { + flp.FLP[flp.GadgetParallelSum, poly, Vec, Fp, *Fp] + length uint + chunkLen uint +} + +func newFlpHistogram(length, chunkLen uint) *flpHistogram { + h := new(flpHistogram) + numCalls := (length + chunkLen - 1) / chunkLen + h.length = length + h.chunkLen = chunkLen + h.Valid.MeasurementLen = length + h.Valid.JointRandLen = numCalls + h.Valid.OutputLen = length + h.Valid.EvalOutputLen = 2 + h.Gadget = flp.GadgetParallelSum{Count: chunkLen} + h.NumCalls = numCalls + h.FLP.Eval = h.Eval + return h +} + +func (h *flpHistogram) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, shares uint8) { + var invShares Fp + invShares.InvUint64(uint64(shares)) + out[0] = flp.RangeCheck(g, numCalls, h.chunkLen, &invShares, meas, jointRand) + + sumCheck := &out[1] + sumCheck.SubAssign(&invShares) + for i := range meas { + sumCheck.AddAssign(&meas[i]) + } +} + +func (h *flpHistogram) Encode(measurement uint64) (out Vec, err error) { + if measurement > uint64(h.length) { + return nil, flp.ErrMeasurementValue + } + + out = arith.NewVec[Vec](h.Valid.MeasurementLen) + out[measurement].SetOne() + + return +} + +func (h *flpHistogram) Truncate(meas Vec) Vec { return meas } + +func (h *flpHistogram) Decode(output Vec, numMeas uint) (*[]uint64, error) { + if len(output) < int(h.Valid.OutputLen) { + return nil, flp.ErrOutputLen + } + + var err error + out := make([]uint64, len(output)) + for i := range output { + out[i], err = output[i].GetUint64() + if err != nil { + return nil, err + } + } + + return &out, nil +} diff --git a/vdaf/prio3/internal/cursor/cursor.go b/vdaf/prio3/internal/cursor/cursor.go new file mode 100644 index 000000000..fb3fa45f1 --- /dev/null +++ b/vdaf/prio3/internal/cursor/cursor.go @@ -0,0 +1,15 @@ +// Package cursor aids with iteration of slices. +package cursor + +type Cursor[V ~[]E, E any] []E + +func New[V ~[]E, E any](x V) Cursor[V, E] { return Cursor[V, E](x) } + +// Next return an slice of size n and advances the pointer. +func (s *Cursor[V, E]) Next(n uint) (out V) { + if uint(len(*s)) >= n { + out = V(*s)[:n] + *s = (*s)[n:] + } + return +} diff --git a/vdaf/prio3/internal/flp/flp.go b/vdaf/prio3/internal/flp/flp.go new file mode 100644 index 000000000..d497df665 --- /dev/null +++ b/vdaf/prio3/internal/flp/flp.go @@ -0,0 +1,144 @@ +// Package flp provides a Fully-Linear Proof (FLP) system. +package flp + +import ( + "errors" + + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" +) + +// FLP is an instance of a FLP by Boneh et al. Crypto, 2019 paper +// "Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs", +// https://ia.cr/2019/188 +// plus some changes described in VDAFs CFRG draft. +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.1 +type FLP[ + G Gadget[P, V, E, F], + P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +] struct { + // Eval evaluates the arithmetic circuit on a measurement and joint randomness. + Eval func(out V, g Gadget[P, V, E, F], numCalls uint, meas, jointRand V, shares uint8) + Valid[G, P, V, E, F] +} + +// Prove returns a proof attesting validity to the given measurement. +// Prove randomness must be provided. +// Some statements may require joint randomness too. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.3.3 +func (f *FLP[G, P, V, E, F]) Prove(meas, proveRand, jointRand V) V { + proof := arith.NewVec[V](f.ProofLength()) + proofCur := cursor.New(proof) + + g := f.Valid.wrapProve(proveRand) + out := arith.NewVec[V](f.EvalOutputLength()) + f.Eval(out, g, f.Valid.NumCalls, meas, jointRand, 1) + + invN := F(new(E)) + invN.InvTwoN(g.log2p) // since p is always a power of 2. + + arity := g.Arity() + wirePoly := make([]P, arity) + wirePolyN := arith.NewVec[V](arity * g.p) + wirePolyNCur := cursor.New(wirePolyN) + wiresCur := cursor.New(g.wires) + for i := range wirePoly { + wire := wiresCur.Next(g.p) + wirePolyI := wirePolyNCur.Next(g.p) + wirePolyI.InvNTT(wire) + // Extracts the constant factor (1/N) to be multiplied after + // polynomial interpolation. + wirePolyI.ScalarMul(invN) + wirePoly[i] = P(wirePolyI) + proofCur.Next(1)[0] = wire[0] + } + + gadgetPoly := P(proofCur.Next(f.gadgetPolyLen())) + g.EvalPoly(gadgetPoly, wirePoly) + return proof +} + +// Query is the linear Query algorithm run by the verifier on a share of the +// measurement and proof. +// Query randomness must be provided. +// Some statements may require joint randomness too. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.3.4 +func (f *FLP[G, P, V, E, F]) Query( + measShare, proofShare, queryRand, jointRand V, numShares uint8, +) (verifierMsg V, err error) { + verifierMsg = arith.NewVec[V](f.VerifierLength()) + verifierCur := cursor.New(verifierMsg) + queryRandCur := cursor.New(queryRand) + + g := f.Valid.wrapQuery(proofShare) + outLen := f.EvalOutputLength() + out := arith.NewVec[V](outLen) + f.Eval(out, g, f.Valid.NumCalls, measShare, jointRand, numShares) + + v := verifierCur.Next(1) + if outLen > 1 { + v[0] = out.DotProduct(queryRandCur.Next(outLen)) + } else { + v[0] = out[0] + } + + // Check that t^p != 1. Since p=2^log2p, this requires log2P squares. + t := &queryRandCur.Next(1)[0] + tp := F(new(E)) + *tp = *t + for range g.log2p { + tp.Sqr(tp) + } + + if tp.IsOne() { + return nil, ErrInvalidEval + } + + invN := F(new(E)) + invN.InvTwoN(g.log2p) + + wireChecks := verifierCur.Next(g.Arity()) + wirePoly := arith.NewPoly[P](g.p - 1) + wirei := cursor.New(g.wires) + for i := range wireChecks { + V(wirePoly).InvNTT(wirei.Next(g.p)) + wireChecks[i] = wirePoly.Evaluate(t) + // Extracts the constant factor (1/N) to be multiplied after + // polynomial interpolation and evaluation. + F(&wireChecks[i]).MulAssign(invN) + } + + gadgetCheck := &verifierCur.Next(1)[0] + *gadgetCheck = g.poly.Evaluate(t) + return verifierMsg, nil +} + +// Decide returns true if the measurement from which it was generated is valid. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.3.5 +func (f *FLP[G, P, V, E, F]) Decide(verifierMsg V) bool { + if len(verifierMsg) != int(f.VerifierLength()) { + return false + } + + verifierMsgCur := cursor.New(verifierMsg) + v := F(&verifierMsgCur.Next(1)[0]) + if !v.IsZero() { + return false + } + + wireChecks := verifierMsgCur.Next(f.Valid.Gadget.Arity()) + gadgetCheck := &verifierMsgCur.Next(1)[0] + check := F(new(E)) + f.Valid.Gadget.Eval(check, wireChecks) + return check.IsEqual(gadgetCheck) +} + +var ( + ErrOutputLen = errors.New("wrong output length") + ErrMeasurementLen = errors.New("invalid measurement length") + ErrMeasurementValue = errors.New("invalid measurement value") + ErrInvalidEval = errors.New("invalid evaluation point") +) diff --git a/vdaf/prio3/internal/flp/gadgets.go b/vdaf/prio3/internal/flp/gadgets.go new file mode 100644 index 000000000..64e201386 --- /dev/null +++ b/vdaf/prio3/internal/flp/gadgets.go @@ -0,0 +1,140 @@ +package flp + +import ( + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/arith/fp128" + "github.com/cloudflare/circl/vdaf/prio3/arith/fp64" + "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" +) + +type Gadget[ + P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +] interface { + // Arity is the number of input wires. + Arity() uint + // Degree is the arithmetic degree of the gadget circuit. + Degree() uint + // Eval is evaluates the gadget over the given inputs. + Eval(out *E, in V) + // EvalPoly is evaluates the circuit over the polynomial ring of the field. + EvalPoly(out P, in []P) +} + +type gadgetMul struct{} + +func (gadgetMul) Arity() uint { return 2 } +func (gadgetMul) Degree() uint { return 2 } + +type GadgetMulFp64 struct{ gadgetMul } + +func (GadgetMulFp64) Eval(out *fp64.Fp, in fp64.Vec) { + out.Mul(&in[0], &in[1]) +} + +func (GadgetMulFp64) EvalPoly(out fp64.Poly, in []fp64.Poly) { + out.Mul(in[0], in[1]) +} + +type gadgetMulFp128 struct{ gadgetMul } + +func (gadgetMulFp128) Eval(out *fp128.Fp, in fp128.Vec) { + out.Mul(&in[0], &in[1]) +} + +func (gadgetMulFp128) EvalPoly(out fp128.Poly, in []fp128.Poly) { + out.Mul(in[0], in[1]) +} + +// PolyEval gadget for p(x) = x^2-x. +type GadgetPolyEvalx2x struct{} + +func (GadgetPolyEvalx2x) Arity() uint { return 1 } +func (GadgetPolyEvalx2x) Degree() uint { return 2 } +func (GadgetPolyEvalx2x) Eval(out *fp64.Fp, in fp64.Vec) { + out.Sqr(&in[0]) + out.SubAssign(&in[0]) +} + +func (GadgetPolyEvalx2x) EvalPoly(out fp64.Poly, in []fp64.Poly) { + out.Sqr(in[0]) + outShort := out[:len(in[0])] + outShort.SubAssign(in[0]) + out.Strip() +} + +type GadgetParallelSum struct { + inner gadgetMulFp128 + Count uint +} + +func (g GadgetParallelSum) Arity() uint { return g.inner.Arity() * g.Count } +func (g GadgetParallelSum) Degree() uint { return g.inner.Degree() } +func (g GadgetParallelSum) Eval(out *fp128.Fp, in fp128.Vec) { + inCur := cursor.New(in) + arity := g.inner.Arity() + var e fp128.Fp + for range g.Count { + g.inner.Eval(&e, inCur.Next(arity)) + out.AddAssign(&e) + } +} + +func (g GadgetParallelSum) EvalPoly(out fp128.Poly, in []fp128.Poly) { + inCur := cursor.New(in) + arity := g.inner.Arity() + e := arith.NewPoly[fp128.Poly](uint(len(out) - 1)) + for range g.Count { + g.inner.EvalPoly(e, inCur.Next(arity)) + out.AddAssign(e) + } + + out.Strip() +} + +type wrapperGadget[ + G Gadget[P, V, E, F], + P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +] struct { + inner G + wires V + p, log2p uint + k uint +} + +func (g *wrapperGadget[G, P, V, E, F]) Arity() uint { return g.inner.Arity() } +func (g *wrapperGadget[G, P, V, E, F]) Degree() uint { return g.inner.Degree() } +func (g *wrapperGadget[G, P, V, E, F]) EvalPoly(out P, in []P) { g.inner.EvalPoly(out, in) } +func (g *wrapperGadget[G, P, V, E, F]) eval(input V) { + g.k++ + wiresCur := cursor.New(g.wires) + for i := range input { + wiresCur.Next(g.p)[g.k] = input[i] + } +} + +type ProveGadget[ + G Gadget[P, V, E, F], + P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +] struct { + wrapperGadget[G, P, V, E, F] +} + +func (g *ProveGadget[G, P, V, E, F]) Eval(out *E, input V) { + g.wrapperGadget.eval(input) + g.inner.Eval(out, input) +} + +type QueryGadget[ + G Gadget[P, V, E, F], + P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +] struct { + poly P + alpha, alphaK E + wrapperGadget[G, P, V, E, F] +} + +func (g *QueryGadget[G, P, V, E, F]) Eval(out *E, input V) { + g.wrapperGadget.eval(input) + F(&g.alphaK).MulAssign(&g.alpha) + *out = g.poly.Evaluate(&g.alphaK) +} diff --git a/vdaf/prio3/internal/flp/valid.go b/vdaf/prio3/internal/flp/valid.go new file mode 100644 index 000000000..ab11cea3a --- /dev/null +++ b/vdaf/prio3/internal/flp/valid.go @@ -0,0 +1,97 @@ +package flp + +import ( + "github.com/cloudflare/circl/math" + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/arith/fp128" + "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" +) + +type Params struct { + MeasurementLen uint + JointRandLen uint + EvalOutputLen uint + OutputLen uint +} + +func (p Params) MeasurementLength() uint { return p.MeasurementLen } +func (p Params) JointRandLength() uint { return p.JointRandLen } +func (p Params) OutputLength() uint { return p.OutputLen } +func (p Params) EvalOutputLength() uint { return p.EvalOutputLen } +func (p Params) QueryRandLength() uint { return 1 + p.EvalOutputLen } + +type Valid[ + G Gadget[P, V, E, F], + P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +] struct { + Gadget G // Gadget to be evaluated + NumCalls uint // Number of times each gadget is called. + Params +} + +func (v *Valid[G, P, V, E, F]) ProveRandLength() uint { return v.Gadget.Arity() } +func (v *Valid[G, P, V, E, F]) ProofLength() uint { return v.Gadget.Arity() + v.gadgetPolyLen() } +func (v *Valid[G, P, V, E, F]) VerifierLength() uint { return 1 + 1 + v.Gadget.Arity() } +func (v *Valid[G, P, V, E, F]) gadgetPolyLen() uint { + p, _ := math.NextPow2(1 + v.NumCalls) + return 1 + v.Gadget.Degree()*(p-1) +} + +func (v *Valid[G, P, V, E, F]) wrapProve(proveRand V) *ProveGadget[G, P, V, E, F] { + g := new(ProveGadget[G, P, V, E, F]) + proveRandCur := cursor.New(proveRand) + wireSeeds := proveRandCur.Next(v.Gadget.Arity()) + g.wrapperGadget = v.wrap(wireSeeds) + return g +} + +func (v *Valid[G, P, V, E, F]) wrapQuery(proof V) *QueryGadget[G, P, V, E, F] { + g := new(QueryGadget[G, P, V, E, F]) + proofCur := cursor.New(proof) + wireSeeds := proofCur.Next(v.Gadget.Arity()) + g.wrapperGadget = v.wrap(wireSeeds) + g.poly = P(proofCur.Next(v.gadgetPolyLen())) + F(&g.alpha).SetRootOfUnityTwoN(g.log2p) + F(&g.alphaK).SetOne() + return g +} + +func (v *Valid[G, P, V, E, F]) wrap(wireSeeds V) (g wrapperGadget[G, P, V, E, F]) { + g.inner = v.Gadget + g.p, g.log2p = math.NextPow2(1 + v.NumCalls) + g.wires = arith.NewVec[V](uint(len(wireSeeds)) * g.p) + wiresCur := cursor.New(g.wires) + for i := range wireSeeds { + wiresCur.Next(g.p)[0] = wireSeeds[i] + } + return +} + +func RangeCheck( + g Gadget[fp128.Poly, fp128.Vec, fp128.Fp, *fp128.Fp], + numCalls uint, + chunkLen uint, sharesInv *fp128.Fp, + meas, jointRand fp128.Vec, +) (out fp128.Fp) { + inputs := arith.NewVec[fp128.Vec](2 * chunkLen) + var evalOut, rPower fp128.Fp + for i := range numCalls { + rPower.SetOne() + for j := range chunkLen { + index := i*chunkLen + j + var measElem fp128.Fp + if index < uint(len(meas)) { + measElem = meas[index] + } + + rPower.MulAssign(&jointRand[i]) + inputs[2*j+0].Mul(&rPower, &measElem) + inputs[2*j+1].Sub(&measElem, sharesInv) + } + + g.Eval(&evalOut, inputs) + out.AddAssign(&evalOut) + } + + return out +} diff --git a/vdaf/prio3/internal/prio3/prio3.go b/vdaf/prio3/internal/prio3/prio3.go new file mode 100644 index 000000000..7600d4471 --- /dev/null +++ b/vdaf/prio3/internal/prio3/prio3.go @@ -0,0 +1,537 @@ +// Package prio3 supports a variety of verifiable distributed aggregation functions. +// +// Clients protect the privacy of their measurements by secret sharing them +// and distributing the shares among the Aggregators. +// To ensure each measurement is valid, the Aggregators run a multi-party +// computation on their shares, the result of which is the output of the +// arithmetic circuit. +// This involves verification of a Fully Linear Proof (FLP) which specify +// the types of measurements. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7 +package prio3 + +import ( + "crypto/subtle" + "errors" + + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" +) + +// Number of proofs to generate. +const numProofs = 1 + +// Prio3 supports a variety of verifiable distributed aggregation functions. +// An instance is parametrized by the type of measurement and aggregated data, +// as well as the field to perform arithmetic operations. +type Prio3[ + Measurement, Aggregate any, + T flp[Measurement, Aggregate, V, E, F], + V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +] struct { + flp T + xof xofTS[V, E] + randSize uint + shares uint8 +} + +func New[ + T flp[Measurement, Aggregate, V, E, F], + Measurement, Aggregate any, + V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +](f T, id uint8, numShares uint8, context []byte, +) (v Prio3[Measurement, Aggregate, T, V, E, F], err error) { + if numShares < 2 { + return v, ErrNumShares + } + + v.flp = f + v.xof, err = NewXof[V, E](uint32(id), context) + if err != nil { + return v, err + } + + v.shares = numShares + v.randSize = SeedSize * uint(numShares) + if f.JointRandLength() > 0 { + v.randSize *= 2 + } + + return v, nil +} + +// Shard takes a measurement and return a set of shares and a public share +// used for verification. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.1 +func (v *Prio3[M, A, T, V, E, F]) Shard( + measurement M, nonce *Nonce, rand []byte, +) (PublicShare, []InputShare[V, E], error) { + if len(rand) != int(v.randSize) { + return nil, nil, ErrRandSize + } + + meas, err := v.flp.Encode(measurement) + if err != nil { + return nil, nil, err + } + + if v.flp.JointRandLength() == 0 { + inputShare, err := v.shardNoJointRand(meas, rand) + return nil, inputShare, err + } else { + return v.shardWithJointRand(meas, nonce, rand) + } +} + +// FLPs Without Joint Randomness. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.1.1 +func (v *Prio3[M, A, T, V, E, F]) shardNoJointRand( + meas V, seeds []byte, +) ([]InputShare[V, E], error) { + // Each Aggregator's input share contains its measurement share + // and its share of the proof(s). + params := v.Params() + inputShares := make([]InputShare[V, E], v.shares) + inputShares[0].leader = new(InputShareLeader[V, E]).New(¶ms) + + seedsCur := cursor.New(seeds) + for i := 1; i < len(inputShares); i++ { + inputShares[i].helper = &InputShareHelper{ + share: Seed(seedsCur.Next(SeedSize)), + blind: nil, + } + } + + // Generate proof of valid measurement. + proveSeed := Seed(seedsCur.Next(SeedSize)) + proveRands := arith.NewVec[V](params.ProveRandLength() * numProofs) + err := v.xof.proveRands(proveRands, &proveSeed) + if err != nil { + return nil, err + } + + proveRand := proveRands[:params.ProveRandLength()] + proof := v.flp.Prove(meas, proveRand, nil) + + // Shard the encoded measurement and proof into shares. + copy(inputShares[0].leader.measShare, meas) + copy(inputShares[0].leader.proofShare, proof) + m := arith.NewVec[V](params.MeasurementLength()) + p := arith.NewVec[V](params.ProofLength() * numProofs) + for i := 1; i < len(inputShares); i++ { + share := &inputShares[i].helper.share + err = v.xof.helperMeasShare(m, uint8(i), share) + if err != nil { + return nil, err + } + + inputShares[0].leader.measShare.SubAssign(m) + + err = v.xof.helperProofsShare(p, uint8(i), share) + if err != nil { + return nil, err + } + + inputShares[0].leader.proofShare.SubAssign(p) + } + + return inputShares, nil +} + +// FLPs With Joint Randomness. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.1.2 +func (v *Prio3[M, A, T, V, E, F]) shardWithJointRand( + meas V, nonce *Nonce, seeds []byte, +) (PublicShare, []InputShare[V, E], error) { + // Each Aggregator's input share contains its measurement share, + // share of proof(s), and blind. The public share contains the + // Aggregators' joint randomness parts. + params := v.Params() + inputShares := make([]InputShare[V, E], v.shares) + inputShares[0].leader = new(InputShareLeader[V, E]).New(¶ms) + + seedsCur := cursor.New(seeds) + for i := 1; i < len(inputShares); i++ { + inputShares[i].helper = &InputShareHelper{ + share: Seed(seedsCur.Next(SeedSize)), + blind: (*Seed)(seedsCur.Next(SeedSize)), + } + } + inputShares[0].leader.blind = (*Seed)(seedsCur.Next(SeedSize)) + + // Shard the encoded measurement into shares and compute the + // joint randomness parts. + copy(inputShares[0].leader.measShare, meas) + + var jointRandParts PublicShare + jointRandParts.New(¶ms) + jointRandPartsCur := cursor.New(jointRandParts) + jrpLeader := jointRandPartsCur.Next(SeedSize) + + m := arith.NewVec[V](params.MeasurementLength()) + encM := make([]byte, m.Size()) + for i := 1; i < len(inputShares); i++ { + err := v.xof.helperMeasShareEnc( + encM[:0], m, uint8(i), &inputShares[i].helper.share) + if err != nil { + return nil, nil, err + } + + err = v.xof.jointRandPart(jointRandPartsCur.Next(SeedSize), + inputShares[i].helper.blind, uint8(i), nonce, encM) + if err != nil { + return nil, nil, err + } + + inputShares[0].leader.measShare.SubAssign(m) + } + + // Calculate leader's jointRandPart after leader's measurementShare + // has been calculated. + measShareEnc, err := inputShares[0].leader.measShare.MarshalBinary() + if err != nil { + return nil, nil, err + } + + err = v.xof.jointRandPart( + jrpLeader, inputShares[0].leader.blind, 0, nonce, measShareEnc) + if err != nil { + return nil, nil, err + } + + // Generate proof of valid measurement. + proveSeed := Seed(seedsCur.Next(SeedSize)) + proveRands := arith.NewVec[V](params.ProveRandLength() * numProofs) + err = v.xof.proveRands(proveRands, &proveSeed) + if err != nil { + return nil, nil, err + } + + proveRand := proveRands[:params.ProveRandLength()] + + jrSeed, err := v.xof.jointRandSeed(jointRandParts) + if err != nil { + return nil, nil, err + } + + jointRands := arith.NewVec[V](params.JointRandLength() * numProofs) + err = v.xof.jointRands(jointRands, &jrSeed) + if err != nil { + return nil, nil, err + } + + jointRand := jointRands[:params.JointRandLength()] + proof := v.flp.Prove(meas, proveRand, jointRand) + + // Shard the proof into shares. + copy(inputShares[0].leader.proofShare, proof) + p := arith.NewVec[V](params.ProofLength() * numProofs) + for i := 1; i < len(inputShares); i++ { + err = v.xof.helperProofsShare(p, uint8(i), &inputShares[i].helper.share) + if err != nil { + return nil, nil, err + } + + inputShares[0].leader.proofShare.SubAssign(p) + } + + return jointRandParts, inputShares, nil +} + +// PrepInit used by aggregator for preparation phase. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 +func (v *Prio3[M, A, T, V, E, F]) PrepInit( + verifyKey *VerifyKey, nonce *Nonce, aggID uint8, + ps PublicShare, inputShare InputShare[V, E], +) (*PrepState[V, E], *PrepShare[V, E], error) { + params := v.Params() + if aggID > v.shares { + return nil, nil, ErrAggID + } + + share, err := v.getInputShareContent(aggID, inputShare, ¶ms) + if err != nil { + return nil, nil, err + } + + prepShare := new(PrepShare[V, E]) + prepState := new(PrepState[V, E]) + prepState.outShare = v.flp.Truncate(share.measShare) + + // Compute the joint randomness. + var jointRand V + jointRandLen := params.JointRandLength() + if jointRandLen > 0 { + if share.blind == nil || len(ps) == 0 { + return nil, nil, ErrJointRand + } + + var measShareEnc []byte + measShareEnc, err = share.measShare.MarshalBinary() + if err != nil { + return nil, nil, err + } + + prepShare.jointRandPart = &Seed{} + err = v.xof.jointRandPart(prepShare.jointRandPart[:], + share.blind, aggID, nonce, measShareEnc) + if err != nil { + return nil, nil, err + } + + prepState.correctedJointRandSeed = &Seed{} + *prepState.correctedJointRandSeed, err = v.xof.jointRandSeed(ps) + if err != nil { + return nil, nil, err + } + + jointRands := arith.NewVec[V](params.JointRandLength() * numProofs) + err = v.xof.jointRands(jointRands, prepState.correctedJointRandSeed) + if err != nil { + return nil, nil, err + } + + jointRand = jointRands[:jointRandLen] + } + + // Query the measurement and proof(s) share(s). + queryRands := arith.NewVec[V](params.QueryRandLength() * numProofs) + err = v.xof.queryRands(queryRands, verifyKey, nonce) + if err != nil { + return nil, nil, err + } + + proofShare := share.proofShare[:params.ProofLength()] + queryRand := queryRands[:params.QueryRandLength()] + + prepShare.verifiersShare, err = v.flp.Query( + share.measShare, proofShare, queryRand, jointRand, v.shares) + if err != nil { + return nil, nil, err + } + + return prepState, prepShare, nil +} + +// PrepSharesToPrep used by aggregator for aggregate shares. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 +func (v *Prio3[M, A, T, V, E, F]) PrepSharesToPrep( + prepShares []PrepShare[V, E], +) (*PrepMessage, error) { + params := v.Params() + msg := new(PrepMessage) + // Unshard each set of verifier shares into each verifier message. + verifierLen := params.VerifierLength() + verifiers := arith.NewVec[V](verifierLen * numProofs) + for i := range prepShares { + verifiers.AddAssign(prepShares[i].verifiersShare) + } + + // Verify that each proof is well-formed and input is valid. + verifier := verifiers[:verifierLen] + if !v.flp.Decide(verifier) { + return nil, ErrProofVerify + } + + // Combine the joint randomness parts computed by the + // Aggregators into the true joint randomness seed. This is + // used in the last step. + if params.JointRandLength() > 0 { + jointRandParts := make([]byte, 0, SeedSize*uint(v.shares)) + for i := range prepShares { + if prepShares[i].jointRandPart == nil { + return nil, ErrJointRand + } + + jointRandParts = append( + jointRandParts, prepShares[i].jointRandPart[:]...) + } + + jointRandSeed, err := v.xof.jointRandSeed(jointRandParts) + if err != nil { + return nil, err + } + + msg.joinRand = &jointRandSeed + } + + return msg, nil +} + +// PrepNext used by aggregator to produce an output share. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 +func (v *Prio3[M, A, T, V, E, F]) PrepNext( + state *PrepState[V, E], msg *PrepMessage, +) (*OutShare[V, E], error) { + if msg != nil && state != nil && msg.joinRand != nil && + state.correctedJointRandSeed != nil { + if subtle.ConstantTimeCompare( + msg.joinRand[:], state.correctedJointRandSeed[:]) != 1 { + return nil, ErrJointRand + } + } + + return &OutShare[V, E]{state.outShare}, nil +} + +// AggregationInit is used to start aggregation. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 +func (v *Prio3[M, A, T, V, E, F]) AggregationInit() (s AggShare[V, E]) { + s.share = arith.NewVec[V](v.flp.OutputLength()) + return +} + +// AggregationUpdate aggregates an output share into an aggregation share. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 +func (v *Prio3[M, A, T, V, E, F]) AggregationUpdate( + aggShare *AggShare[V, E], outShare *OutShare[V, E], +) { + aggShare.share.AddAssign(outShare.share) +} + +// AggregationMerge merges several aggregation shares. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 +func (v *Prio3[M, A, T, V, E, F]) aggregationMerge( + aggShares []AggShare[V, E], +) (s AggShare[V, E]) { + s = v.AggregationInit() + for i := range aggShares { + s.share.AddAssign(aggShares[i].share) + } + + return +} + +// Unshard is used by the Collector to recover the aggregate result from a set +// of aggregation shares. +// +// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.5 +func (v *Prio3[M, A, T, V, E, F]) Unshard( + aggShares []AggShare[V, E], numMeas uint, +) (*A, error) { + if len(aggShares) != int(v.shares) { + return nil, ErrAggShareSize + } + + s := v.aggregationMerge(aggShares) + return v.flp.Decode(s.share, numMeas) +} + +func (v *Prio3[M, A, T, V, E, F]) getInputShareContent( + aggID uint8, inShare InputShare[V, E], params *Params, +) (s inputShareContent[V, E], err error) { + switch true { + case aggID == 0 && inShare.leader != nil: + return inShare.leader.inputShareContent, nil + case aggID != 0 && inShare.helper != nil: + s.New(params) + share := &inShare.helper.share + err = v.xof.helperMeasShare(s.measShare, aggID, share) + if err != nil { + return s, err + } + + err = v.xof.helperProofsShare(s.proofShare, aggID, share) + if err != nil { + return s, err + } + + s.blind = inShare.helper.blind + return s, nil + default: + return s, ErrShare + } +} + +type Params struct { + jointRandLen uint + measurementLen uint + outputLen uint + evalOutputLen uint + queryRandLen uint + proveRandLen uint + proofLen uint + verifierLen uint + randSize uint + shares uint8 +} + +func (p *Params) JointRandLength() uint { return p.jointRandLen } +func (p *Params) MeasurementLength() uint { return p.measurementLen } +func (p *Params) OutputLength() uint { return p.outputLen } +func (p *Params) EvalOutputLength() uint { return p.evalOutputLen } +func (p *Params) QueryRandLength() uint { return p.queryRandLen } +func (p *Params) ProveRandLength() uint { return p.proveRandLen } +func (p *Params) ProofLength() uint { return p.proofLen } +func (p *Params) VerifierLength() uint { return p.verifierLen } +func (p *Params) RandSize() uint { return p.randSize } +func (p *Params) Shares() uint8 { return p.shares } + +func (v *Prio3[M, A, T, V, E, F]) Params() Params { + return Params{ + jointRandLen: v.flp.JointRandLength(), + measurementLen: v.flp.MeasurementLength(), + outputLen: v.flp.OutputLength(), + evalOutputLen: v.flp.EvalOutputLength(), + queryRandLen: v.flp.QueryRandLength(), + proveRandLen: v.flp.ProveRandLength(), + proofLen: v.flp.ProofLength(), + verifierLen: v.flp.VerifierLength(), + randSize: v.randSize, + shares: v.shares, + } +} + +type flp[ + Measurement, AggResult any, + V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +] interface { + MeasurementLength() uint + JointRandLength() uint + OutputLength() uint + EvalOutputLength() uint + ProveRandLength() uint + ProofLength() uint + VerifierLength() uint + QueryRandLength() uint + // Prove returns a proof attesting validity to the given measurement. + Prove(meas, proveRand, jointRand V) V + // Query is the linear Query algorithm run by the verifier on a share of + // the measurement and proof. + Query(measShare, proofShare, queryRnd, jointRnd V, shares uint8) (V, error) + // Decide returns true if the measurement from which it was generated is + // valid. + Decide(V) bool + // Encode returns a vector of MeasurementLength() elements representing + // a measurement of type [Measurement]. + Encode(Measurement) (V, error) + // Truncate returns a vector of OutputLength() elements representing + // (a share of) an aggregatable output. + Truncate(V) V + // Decode returns an aggregate result of type [AggResult]. + // This computation may depend on the number of outputs aggregated. + Decode(V, uint) (*AggResult, error) +} + +var ( + ErrNumShares = errors.New("invalid numshares, must be greater than 1") + ErrContextSize = errors.New("invalid context length, (0, MaxContextSize)") + ErrNonceSize = errors.New("invalid nonce length, (NonceSize)") + ErrVerifyKeySize = errors.New("invalid verify key length, (VerifyKeySize)") + ErrRandSize = errors.New("invalid randomness length") + ErrAggShareSize = errors.New("invalid aggregate shares length") + ErrAggID = errors.New("invalid aggregation ID") + ErrJointRand = errors.New("invalid joint randomness") + ErrShare = errors.New("share was not provided") + ErrProofVerify = errors.New("proof verifier check failed") +) diff --git a/vdaf/prio3/internal/prio3/types.go b/vdaf/prio3/internal/prio3/types.go new file mode 100644 index 000000000..f58d92573 --- /dev/null +++ b/vdaf/prio3/internal/prio3/types.go @@ -0,0 +1,390 @@ +package prio3 + +import ( + "github.com/cloudflare/circl/internal/conv" + "github.com/cloudflare/circl/vdaf/prio3/arith" + "golang.org/x/crypto/cryptobyte" +) + +const ( + SeedSize uint = 32 // Size of Seed in bytes. + NonceSize uint = 16 // Size of Nonce in bytes. + VerifyKeySize uint = 32 // Size of VerifyKey in bytes. +) + +type ( + // Nonce is a public random value associated with the report. + Nonce [NonceSize]byte + // VerifyKey is a secret verification key held by each of the Aggregators. + // This key is used to verify validity of the output shares they compute. + VerifyKey [VerifyKeySize]byte + // Seed is used to feed an extnedable output function. + Seed [SeedSize]byte +) + +func (s *Seed) Marshal(b *cryptobyte.Builder) error { + b.AddBytes(s[:]) + return nil +} + +func (s *Seed) Unmarshal(str *cryptobyte.String) bool { + return str.CopyBytes((*s)[:]) +} + +// PublicShare must be distributed to each of the Aggregators. +// Its content depends on whether joint randomness is required for the +// underlying FLP. +// If joint randomness is not used, then the public share is an empty slice. +// +// struct { +// Prio3Seed joint_rand_parts[SEED_SIZE * prio3.SHARES]; +// } Prio3PublicShareWithJointRand; +type PublicShare []byte + +func (s *PublicShare) New(p *Params) *PublicShare { + var n uint + if p.JointRandLength() > 0 { + n = SeedSize * uint(p.shares) + } + *s = make([]byte, n) + return s +} + +func (s *PublicShare) Marshal(b *cryptobyte.Builder) error { + b.AddBytes(*s) + return nil +} + +func (s *PublicShare) MarshalBinary() ([]byte, error) { + return conv.MarshalBinaryLen(s, uint(len(*s))) +} + +func (s *PublicShare) Unmarshal(str *cryptobyte.String) bool { + return str.CopyBytes(*s) +} + +func (s *PublicShare) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(s, b) +} + +type inputShareContent[V arith.Vec[V, E], E arith.Elt] struct { + blind *Seed + proofShare V + measShare V +} + +func (s *inputShareContent[V, E]) New(p *Params) *inputShareContent[V, E] { + s.measShare = arith.NewVec[V](p.MeasurementLength()) + s.proofShare = arith.NewVec[V](p.ProofLength() * numProofs) + if p.JointRandLength() > 0 { + s.blind = &Seed{} + } else { + s.blind = nil + } + return s +} + +func (s *inputShareContent[V, E]) Marshal(b *cryptobyte.Builder) error { + b.AddValue(s.measShare) + b.AddValue(s.proofShare) + if s.blind != nil { + b.AddValue(s.blind) + } + return nil +} + +func (s *inputShareContent[V, E]) Unmarshal(str *cryptobyte.String) bool { + ok := s.measShare.Unmarshal(str) && s.proofShare.Unmarshal(str) + if s.blind != nil { + ok = ok && s.blind.Unmarshal(str) + } + return ok +} + +// InputShareLeader represents one of these two structures. +// +// struct { +// Prio3Field meas_share[F * prio3.flp.MEAS_LEN]; +// Prio3Field proofs_share[F * prio3.flp.PROOF_LEN * prio3.PROOFS]; +// } Prio3LeaderShare; +// +// struct { +// Prio3LeaderShare inner; +// Prio3Seed blind; +// } Prio3LeaderShareWithJointRand; +type InputShareLeader[V arith.Vec[V, E], E arith.Elt] struct { + inputShareContent[V, E] +} + +func (s *InputShareLeader[V, E]) New(p *Params) *InputShareLeader[V, E] { + s.inputShareContent.New(p) + return s +} + +// InputShareHelper represents one of these two structures. +// +// struct { +// Prio3Seed share; +// } Prio3HelperShare; +// +// struct { +// Prio3HelperShare inner; +// Prio3Seed blind; +// } Prio3HelperShareWithJointRand; +type InputShareHelper struct { + blind *Seed + share Seed +} + +func (s *InputShareHelper) New(p *Params) *InputShareHelper { + s.share = Seed{} + if p.JointRandLength() > 0 { + s.blind = &Seed{} + } else { + s.blind = nil + } + return s +} + +func (s *InputShareHelper) Marshal(b *cryptobyte.Builder) error { + b.AddValue(&s.share) + if s.blind != nil { + b.AddValue(s.blind) + } + return nil +} + +func (s *InputShareHelper) Unmarshal(str *cryptobyte.String) bool { + ok := s.share.Unmarshal(str) + if s.blind != nil { + ok = ok && s.blind.Unmarshal(str) + } + return ok +} + +// InputShare is a generic struct that stores shares for the leader or helper. +type InputShare[V arith.Vec[V, E], E arith.Elt] struct { + leader *InputShareLeader[V, E] + helper *InputShareHelper +} + +func (s *InputShare[V, E]) New(p *Params, aggID uint) *InputShare[V, E] { + if aggID == 0 { + s.leader = new(InputShareLeader[V, E]).New(p) + s.helper = nil + } else { + s.helper = new(InputShareHelper).New(p) + s.leader = nil + } + return s +} + +func (s *InputShare[V, E]) MarshalBinary() ([]byte, error) { + return conv.MarshalBinary(s) +} + +func (s *InputShare[V, E]) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(s, b) +} + +func (s *InputShare[V, E]) Marshal(b *cryptobyte.Builder) error { + switch true { + case s.leader != nil && s.helper == nil: + b.AddValue(s.leader) + case s.leader == nil && s.helper != nil: + b.AddValue(s.helper) + default: + return ErrShare + } + return nil +} + +func (s *InputShare[V, E]) Unmarshal(str *cryptobyte.String) bool { + switch true { + case s.leader != nil && s.helper == nil: + return s.leader.Unmarshal(str) + case s.leader == nil && s.helper != nil: + return s.helper.Unmarshal(str) + default: + return false + } +} + +// InputShareHelper represents one of these two structures. +// +// struct { +// Prio3Field verifiers_share[F * V]; +// } Prio3PrepShare; +// +// struct { +// Prio3Field verifiers_share[F * V]; +// Prio3Seed joint_rand_part; +// } Prio3PrepShareWithJointRand; +type PrepShare[V arith.Vec[V, E], E arith.Elt] struct { + jointRandPart *Seed + verifiersShare V +} + +func (s *PrepShare[V, E]) New(p *Params) *PrepShare[V, E] { + s.verifiersShare = arith.NewVec[V](p.VerifierLength() * numProofs) + if p.JointRandLength() > 0 { + s.jointRandPart = &Seed{} + } else { + s.jointRandPart = nil + } + return s +} + +func (s *PrepShare[V, E]) MarshalBinary() ([]byte, error) { + return conv.MarshalBinary(s) +} + +func (s *PrepShare[V, E]) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(s, b) +} + +func (s *PrepShare[V, E]) Marshal(b *cryptobyte.Builder) error { + b.AddValue(s.verifiersShare) + if s.jointRandPart != nil { + b.AddValue(s.jointRandPart) + } + return nil +} + +func (s *PrepShare[V, E]) Unmarshal(str *cryptobyte.String) bool { + ok := s.verifiersShare.Unmarshal(str) + if s.jointRandPart != nil { + ok = ok && s.jointRandPart.Unmarshal(str) + } + return ok +} + +type PrepState[V arith.Vec[V, E], E arith.Elt] struct { + correctedJointRandSeed *Seed + outShare V +} + +func (s *PrepState[V, E]) New(p *Params) *PrepState[V, E] { + s.outShare = arith.NewVec[V](p.OutputLength()) + if p.JointRandLength() > 0 { + s.correctedJointRandSeed = &Seed{} + } else { + s.correctedJointRandSeed = nil + } + return s +} + +func (s *PrepState[V, E]) MarshalBinary() ([]byte, error) { + return conv.MarshalBinary(s) +} + +func (s *PrepState[V, E]) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(s, b) +} + +func (s *PrepState[V, E]) Marshal(b *cryptobyte.Builder) error { + b.AddValue(s.outShare) + if s.correctedJointRandSeed != nil { + b.AddValue(s.correctedJointRandSeed) + } + return nil +} + +func (s *PrepState[V, E]) Unmarshal(str *cryptobyte.String) bool { + ok := s.outShare.Unmarshal(str) + if s.correctedJointRandSeed != nil { + ok = ok && s.correctedJointRandSeed.Unmarshal(str) + } + return ok +} + +// PrepMessage represents the following structure. +// +// struct { +// Prio3Seed joint_rand; +// } Prio3PrepMessageWithJointRand; +type PrepMessage struct{ joinRand *Seed } + +func (s *PrepMessage) New(p *Params) *PrepMessage { + if p.JointRandLength() > 0 { + s.joinRand = &Seed{} + } else { + s.joinRand = nil + } + return s +} + +func (s *PrepMessage) MarshalBinary() ([]byte, error) { + return conv.MarshalBinary(s) +} + +func (s *PrepMessage) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(s, b) +} + +func (s *PrepMessage) Marshal(b *cryptobyte.Builder) error { + if s.joinRand != nil { + b.AddValue(s.joinRand) + } + return nil +} + +func (s *PrepMessage) Unmarshal(str *cryptobyte.String) bool { + if s.joinRand != nil { + return s.joinRand.Unmarshal(str) + } + return true +} + +type OutShare[V arith.Vec[V, E], E arith.Elt] struct{ share V } + +func (s *OutShare[V, E]) New(p *Params) *OutShare[V, E] { + s.share = arith.NewVec[V](p.OutputLength()) + return s +} + +func (s *OutShare[V, E]) MarshalBinary() ([]byte, error) { + return conv.MarshalBinaryLen(s, s.share.Size()) +} + +func (s *OutShare[V, E]) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(s, b) +} + +func (s *OutShare[V, E]) Marshal(b *cryptobyte.Builder) error { + b.AddValue(s.share) + return nil +} + +func (s *OutShare[V, E]) Unmarshal(str *cryptobyte.String) bool { + return s.share.Unmarshal(str) +} + +// AggShare represents the following structure. +// +// struct { +// Prio3Field agg_share[F * prio3.flp.OUTPUT_LEN]; +// } Prio3AggShare; +type AggShare[V arith.Vec[V, E], E arith.Elt] struct{ share V } + +func (s *AggShare[V, E]) New(p *Params) *AggShare[V, E] { + s.share = arith.NewVec[V](p.OutputLength()) + return s +} + +func (s *AggShare[V, E]) MarshalBinary() ([]byte, error) { + return conv.MarshalBinaryLen(s, s.share.Size()) +} + +func (s *AggShare[V, E]) UnmarshalBinary(b []byte) error { + return conv.UnmarshalBinary(s, b) +} + +func (s *AggShare[V, E]) Marshal(b *cryptobyte.Builder) error { + b.AddValue(s.share) + return nil +} + +func (s *AggShare[V, E]) Unmarshal(str *cryptobyte.String) bool { + return s.share.Unmarshal(str) +} diff --git a/vdaf/prio3/internal/prio3/xof.go b/vdaf/prio3/internal/prio3/xof.go new file mode 100644 index 000000000..6465bb9bb --- /dev/null +++ b/vdaf/prio3/internal/prio3/xof.go @@ -0,0 +1,216 @@ +package prio3 + +import ( + "encoding/binary" + "math" + + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/vdaf/prio3/arith" +) + +// xofTS allows to derive seeds and vector of elements from TurboSHAKE. +type xofTS[V arith.Vec[V, E], E arith.Elt] struct { + usage *[2]byte + Header []byte + sha3.State +} + +// NewXof returns an xofTS from an ID and context. +func NewXof[V arith.Vec[V, E], E arith.Elt]( + id uint32, context []byte, +) (x xofTS[V, E], err error) { + const ( + Version = 12 + AlgoClass = 0 + TurboShake128DS = 1 + dstPrefixLen uint = 8 + maxContextSize uint = math.MaxUint16 - dstPrefixLen + ) + + if len(context) > int(maxContextSize) { + return x, ErrContextSize + } + + lenDST := dstPrefixLen + uint(len(context)) + usagePos := dstPrefixLen + headerLen := 2 + lenDST + 1 + x.Header = make([]byte, 0, headerLen) + // | 2 | uint16(len(dst)) | little-endian | + // | 1 | Version | + // | 1 | AlgoClass | + // | 4 | ID | big-endian | + // | 2 | Usage | big-endian | + // | * | context | + // | 1 | SeedSize | + x.Header = binary.LittleEndian.AppendUint16(x.Header, uint16(lenDST)) + x.Header = append(x.Header, Version) + x.Header = append(x.Header, AlgoClass) + x.Header = binary.BigEndian.AppendUint32(x.Header, id) + x.Header = binary.BigEndian.AppendUint16(x.Header, 0) + x.Header = append(x.Header, context...) + x.Header = append(x.Header, uint8(SeedSize)) + x.usage = (*[2]byte)(x.Header[usagePos : usagePos+2]) + x.State = sha3.NewTurboShake128(TurboShake128DS) + return x, nil +} + +func (x *xofTS[V, E]) Init(usage uint16, s *Seed) error { + binary.BigEndian.PutUint16(x.usage[:], usage) + x.Reset() + _, err := x.Write(x.Header) + if err != nil { + return err + } + + _, err = x.Write(s[:]) + if err != nil { + return err + } + + return nil +} + +func (x *xofTS[V, E]) SetBinderByte(binder ...byte) error { + _, err := x.Write(binder) + return err +} + +func (x *xofTS[V, E]) SetBinderBytes(binder ...[]byte) error { + for i := range binder { + _, err := x.Write(binder[i]) + if err != nil { + return err + } + } + + return nil +} + +func (x *xofTS[V, E]) helperMeasShareEnc( + encOut []byte, out V, aggID uint8, s *Seed, +) error { + err := x.Init(usageMeasuShare, s) + if err != nil { + return err + } + + err = x.SetBinderByte(aggID) + if err != nil { + return err + } + + return out.RandomSHA3Bytes(encOut, &x.State) +} + +func (x *xofTS[V, E]) helperMeasShare(out V, aggID uint8, s *Seed) error { + err := x.Init(usageMeasuShare, s) + if err != nil { + return err + } + + err = x.SetBinderByte(aggID) + if err != nil { + return err + } + + return out.RandomSHA3(&x.State) +} + +func (x *xofTS[V, E]) helperProofsShare(out V, aggID uint8, s *Seed) error { + err := x.Init(usageProofShare, s) + if err != nil { + return err + } + + err = x.SetBinderByte(numProofs, aggID) + if err != nil { + return err + } + + return out.RandomSHA3(&x.State) +} + +func (x *xofTS[V, E]) proveRands(out V, proveSeed *Seed) error { + err := x.Init(usageProveRandomness, proveSeed) + if err != nil { + return err + } + + err = x.SetBinderByte(numProofs) + if err != nil { + return err + } + + return out.RandomSHA3(&x.State) +} + +func (x *xofTS[V, E]) queryRands(out V, k *VerifyKey, nonce *Nonce) error { + err := x.Init(usageQueryRandomness, (*Seed)(k)) + if err != nil { + return err + } + + err = x.SetBinderBytes([]byte{numProofs}, nonce[:]) + if err != nil { + return err + } + + return out.RandomSHA3(&x.State) +} + +func (x *xofTS[V, E]) jointRandPart( + out []byte, blind *Seed, aggID uint8, nonce *Nonce, measShareEnc []byte, +) error { + err := x.Init(usageJointRandPart, blind) + if err != nil { + return err + } + + err = x.SetBinderBytes([]byte{aggID}, nonce[:], measShareEnc) + if err != nil { + return err + } + + _, err = x.Read(out) + return err +} + +func (x *xofTS[V, E]) jointRandSeed(jointRandParts []byte) (s Seed, err error) { + var zeros Seed + err = x.Init(usageJointRandSeed, &zeros) + if err != nil { + return s, err + } + + err = x.SetBinderBytes(jointRandParts) + if err != nil { + return s, err + } + + _, err = x.Read(s[:]) + return +} + +func (x *xofTS[V, E]) jointRands(out V, jointRandSeed *Seed) error { + err := x.Init(usageJointRandomness, jointRandSeed) + if err != nil { + return err + } + + err = x.SetBinderByte(numProofs) + if err != nil { + return err + } + + return out.RandomSHA3(&x.State) +} + +const ( + usageMeasuShare uint16 = iota + 1 + usageProofShare + usageJointRandomness + usageProveRandomness + usageQueryRandomness + usageJointRandSeed + usageJointRandPart +) diff --git a/vdaf/prio3/mhcv/mhcv.go b/vdaf/prio3/mhcv/mhcv.go new file mode 100644 index 000000000..3f3a5a526 --- /dev/null +++ b/vdaf/prio3/mhcv/mhcv.go @@ -0,0 +1,200 @@ +// Package mhcv is a VDAF for aggregating bounded vectors of Booleans into buckets. +package mhcv + +import ( + "math/big" + "math/bits" + + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/arith/fp128" + "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" +) + +type ( + poly = fp128.Poly + Vec = fp128.Vec + Fp = fp128.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + OutShare = prio3.OutShare[Vec, Fp] + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] +) + +// MultiHotCountVec is a verifiable distributed aggregation function in which +// each measurement is a vector of Boolean values, where the number of True +// values is bounded. +// This provides a functionality similar to Histogram except that more than +// one entry (or none at all) may be non-zero. +type MultiHotCountVec struct { + p prio3.Prio3[[]bool, []uint64, *flpMultiHotCountVec, Vec, Fp, *Fp] +} + +func New(numShares uint8, length, maxWeight, chunkLen uint, context []byte) (m *MultiHotCountVec, err error) { + const multihotCountVecID uint8 = 5 + m = new(MultiHotCountVec) + m.p, err = prio3.New( + newFlpMultiCountHotVec(length, maxWeight, chunkLen), + multihotCountVecID, numShares, context) + if err != nil { + return nil, err + } + + return m, nil +} + +func (m *MultiHotCountVec) Params() prio3.Params { return m.p.Params() } + +func (m *MultiHotCountVec) Shard(measurement []bool, nonce *prio3.Nonce, rand []byte, +) (prio3.PublicShare, []InputShare, error) { + return m.p.Shard(measurement, nonce, rand) +} + +func (m *MultiHotCountVec) PrepInit( + verifyKey *prio3.VerifyKey, + nonce *prio3.Nonce, + aggID uint8, + publicShare prio3.PublicShare, + inputShare InputShare, +) (*PrepState, *PrepShare, error) { + return m.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) +} + +func (m *MultiHotCountVec) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { + return m.p.PrepSharesToPrep(prepShares) +} + +func (m *MultiHotCountVec) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { + return m.p.PrepNext(state, msg) +} + +func (m *MultiHotCountVec) AggregationInit() AggShare { return m.p.AggregationInit() } + +func (m *MultiHotCountVec) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { + m.p.AggregationUpdate(aggShare, outShare) +} + +func (m *MultiHotCountVec) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { + return m.p.Unshard(aggShares, numMeas) +} + +type flpMultiHotCountVec struct { + flp.FLP[flp.GadgetParallelSum, poly, Vec, Fp, *Fp] + bits uint + chunkLen uint + length uint + offset Fp +} + +func newFlpMultiCountHotVec(length, maxWeight, chunkLen uint) *flpMultiHotCountVec { + m := new(flpMultiHotCountVec) + if length == 0 { + panic("length cannot be zero") + } + if maxWeight > length { + panic("maxWeight cannot be greater than length") + } + if chunkLen == 0 { + panic("chunkLen cannot be zero") + } + + bits := uint(bits.Len64(uint64(maxWeight))) + offset := (uint64(1) << uint64(bits)) - 1 - uint64(maxWeight) + + b := new(big.Int).SetBytes(new(Fp).Order()) + b.Sub(b, big.NewInt(int64(offset))) + if b.Cmp(big.NewInt(int64(length))) <= 0 { + panic("length and maxWeight are too large for the current field size") + } + + numCalls := (length + bits + chunkLen - 1) / chunkLen + + m.bits = bits + m.length = length + m.chunkLen = chunkLen + err := m.offset.SetUint64(offset) + if err != nil { + panic(err) + } + + m.Valid.MeasurementLen = length + bits + m.Valid.JointRandLen = numCalls + m.Valid.OutputLen = length + m.Valid.EvalOutputLen = 2 + m.Gadget = flp.GadgetParallelSum{Count: chunkLen} + m.NumCalls = numCalls + m.FLP.Eval = m.Eval + return m +} + +func (m *flpMultiHotCountVec) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, shares uint8) { + var invShares Fp + invShares.InvUint64(uint64(shares)) + out[0] = flp.RangeCheck(g, numCalls, m.chunkLen, &invShares, meas, jointRand) + + measCur := cursor.New(meas) + countVec := measCur.Next(m.length) + var weight Fp + for i := range countVec { + weight.AddAssign(&countVec[i]) + } + + weightReported := measCur.Next(m.bits).JoinBits() + weightCheck := &out[1] + weightCheck.Mul(&m.offset, &invShares) + weightCheck.AddAssign(&weight) + weightCheck.SubAssign(&weightReported) +} + +func (m *flpMultiHotCountVec) Encode(measurement []bool) (out Vec, err error) { + n := m.length + if n != uint(len(measurement)) { + return nil, flp.ErrMeasurementLen + } + + out = arith.NewVec[Vec](m.Valid.MeasurementLen) + outCur := cursor.New(out) + first := outCur.Next(n) + weight := uint64(0) + for i := range measurement { + if measurement[i] { + first[i].SetOne() + weight++ + } + } + + offset, err := m.offset.GetUint64() + if err != nil { + return nil, err + } + + err = outCur.Next(m.bits).SplitBits(offset + weight) + if err != nil { + return nil, err + } + + return out, nil +} + +func (m *flpMultiHotCountVec) Truncate(meas Vec) Vec { + return meas[:m.length] +} + +func (m *flpMultiHotCountVec) Decode(output Vec, numMeas uint) (*[]uint64, error) { + if len(output) < int(m.Valid.OutputLen) { + return nil, flp.ErrOutputLen + } + + var err error + out := make([]uint64, len(output)) + for i := range output { + out[i], err = output[i].GetUint64() + if err != nil { + return nil, err + } + } + + return &out, nil +} diff --git a/vdaf/prio3/prio3_test.go b/vdaf/prio3/prio3_test.go new file mode 100644 index 000000000..f2bb331f4 --- /dev/null +++ b/vdaf/prio3/prio3_test.go @@ -0,0 +1,234 @@ +package prio3 + +import ( + "crypto/rand" + "io" + "slices" + "testing" + + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/vdaf/prio3/count" + "github.com/cloudflare/circl/vdaf/prio3/histogram" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" + "github.com/cloudflare/circl/vdaf/prio3/mhcv" + "github.com/cloudflare/circl/vdaf/prio3/sum" + "github.com/cloudflare/circl/vdaf/prio3/sumvec" +) + +type Prio3[ + Measurement, Aggregate any, + AggShare, InputShare, OutShare, PrepShare, PrepState any, +] interface { + Params() prio3.Params + Shard( + Measurement, *prio3.Nonce, []byte, + ) (prio3.PublicShare, []InputShare, error) + PrepInit( + *prio3.VerifyKey, *prio3.Nonce, uint8, prio3.PublicShare, InputShare, + ) (*PrepState, *PrepShare, error) + PrepSharesToPrep([]PrepShare) (*prio3.PrepMessage, error) + PrepNext(*PrepState, *prio3.PrepMessage) (*OutShare, error) + AggregationInit() AggShare + AggregationUpdate(*AggShare, *OutShare) + Unshard([]AggShare, uint) (*Aggregate, error) +} + +const NumShares = 2 + +var Context = []byte("TestingPrio3") + +func TestCount(t *testing.T) { + input := []bool{true, true, false} + want := uint64(2) // Hamming weight of binary inputs. + c, err := count.New(NumShares, Context) + test.CheckNoErr(t, err, "new count failed") + got := testPrio3(t, c, input) + test.CheckOk(got != nil, "prio3 count failed", t) + if *got != want { + test.ReportError(t, *got, want) + } +} + +func TestSum(t *testing.T) { + const MaxMeas = 4 + input := []uint64{1, 2, 3} + want := uint64(6) // Sum of each input. + s, err := sum.New(NumShares, MaxMeas, Context) + test.CheckNoErr(t, err, "new sum failed") + got := testPrio3(t, s, input) + test.CheckOk(got != nil, "prio3 sum failed", t) + if *got != want { + test.ReportError(t, *got, want) + } +} + +func TestSumVec(t *testing.T) { + input := [][]uint64{ + {1, 2, 3, 0}, + {1, 4, 6, 1}, + {1, 6, 9, 2}, + } + want := []uint64{3, 12, 18, 3} // Element-wise sum of input vectors. + s, err := sumvec.New(NumShares, 4, 4, 3, Context) + test.CheckNoErr(t, err, "new sumvec failed") + got := testPrio3(t, s, input) + test.CheckOk(got != nil, "prio3 sumvec failed", t) + if !slices.Equal(*got, want) { + test.ReportError(t, *got, want) + } +} + +func TestHistogram(t *testing.T) { + input := []uint64{2, 1, 1, 2, 0, 3, 3, 3, 3, 3} + want := []uint64{ + 1, // how many zeros + 2, // how many ones + 2, // how many twos + 5, // how many threes + } + h, err := histogram.New(NumShares, 4, 3, Context) + test.CheckNoErr(t, err, "new histogram failed") + got := testPrio3(t, h, input) + test.CheckOk(got != nil, "prio3 histogram failed", t) + if !slices.Equal(*got, want) { + test.ReportError(t, *got, want) + } +} + +func TestMultiHotCountVec(t *testing.T) { + const MaxWeight = 2 + input := [][]bool{ + {false, false, false, false, false}, // Hamming weight = 0 <= MaxWeight + {false, false, false, false, true}, // Hamming weight = 1 <= MaxWeight + {true, false, false, false, true}, // Hamming weight = 2 <= MaxWeight + } + // Element-wise count of binary vectors of weight at most MaxWeight. + want := []uint64{1, 0, 0, 0, 2} + m, err := mhcv.New(NumShares, 5, MaxWeight, 3, Context) + test.CheckNoErr(t, err, "new MultiHotCountVec failed") + got := testPrio3(t, m, input) + test.CheckOk(got != nil, "prio3 multiHotCountVec failed", t) + if !slices.Equal(*got, want) { + test.ReportError(t, *got, want) + } +} + +func testPrio3[ + P Prio3[ + Measurement, Aggregate, + AggShare, InputShare, OutShare, PrepShare, PrepState, + ], + Measurement, Aggregate any, + AggShare, InputShare, OutShare, PrepShare, PrepState any, +](t testing.TB, p P, measurements []Measurement) *Aggregate { + params := p.Params() + shares := params.Shares() + var verifyKey prio3.VerifyKey + _, err := io.ReadFull(rand.Reader, verifyKey[:]) + test.CheckNoErr(t, err, "read verifyKey failed") + + aggShares := make([]AggShare, shares) + for i := range aggShares { + aggShares[i] = p.AggregationInit() + } + + for _, mi := range measurements { + var nonce prio3.Nonce + _, err = io.ReadFull(rand.Reader, nonce[:]) + test.CheckNoErr(t, err, "read nonce failed") + + randb := make([]byte, params.RandSize()) + _, err = io.ReadFull(rand.Reader, randb) + test.CheckNoErr(t, err, "read rand bytes failed") + + var pubShare prio3.PublicShare + var inputShares []InputShare + pubShare, inputShares, err = p.Shard(mi, &nonce, randb) + test.CheckNoErr(t, err, "shard failed") + testMarshal(t, &pubShare, ¶ms) + for i := range inputShares { + testMarshal(t, &inputShares[i], ¶ms, uint(i)) + } + + var prepStates []*PrepState + var outboundPrepShares []PrepShare + for i := range shares { + state, share, errx := p.PrepInit( + &verifyKey, &nonce, i, pubShare, inputShares[i]) + test.CheckNoErr(t, errx, "prepare init failed") + + prepStates = append(prepStates, state) + outboundPrepShares = append(outboundPrepShares, *share) + } + + testMarshal(t, prepStates[0], ¶ms) + testMarshal(t, &outboundPrepShares[0], ¶ms) + + var prepMsg *prio3.PrepMessage + prepMsg, err = p.PrepSharesToPrep(outboundPrepShares) + test.CheckNoErr(t, err, "PrepSharesToPrep failed") + testMarshal(t, prepMsg, ¶ms) + + var outShare *OutShare + for i := range shares { + outShare, err = p.PrepNext(prepStates[i], prepMsg) + test.CheckNoErr(t, err, "PrepNext failed") + testMarshal(t, outShare, ¶ms) + p.AggregationUpdate(&aggShares[i], outShare) + } + } + + testMarshal(t, &aggShares[0], ¶ms) + numMeas := uint(len(measurements)) + aggResult, err := p.Unshard(aggShares, numMeas) + test.CheckNoErr(t, err, "unshard failed") + + return aggResult +} + +func BenchmarkCount(b *testing.B) { + c, err := count.New(NumShares, Context) + test.CheckNoErr(b, err, "new Count failed") + benchmarkPrio3(b, c, []bool{true, true, false}) +} + +func BenchmarkSum(b *testing.B) { + s, err := sum.New(NumShares, 4, Context) + test.CheckNoErr(b, err, "new Sum failed") + benchmarkPrio3(b, s, []uint64{1, 2, 3}) +} + +func BenchmarkSumVec(b *testing.B) { + s, err := sumvec.New(NumShares, 2, 3, 2, Context) + test.CheckNoErr(b, err, "new SumVec failed") + benchmarkPrio3(b, s, [][]uint64{{1, 2}, {2, 0}}) +} + +func BenchmarkHistogram(b *testing.B) { + h, err := histogram.New(NumShares, 4, 2, Context) + test.CheckNoErr(b, err, "new Histogram failed") + benchmarkPrio3(b, h, []uint64{1, 2, 2, 0}) +} + +func BenchmarkMultiHotCountVec(b *testing.B) { + m, err := mhcv.New(NumShares, 3, 2, 3, Context) + test.CheckNoErr(b, err, "new MultiHotCountVec failed") + benchmarkPrio3(b, m, [][]bool{ + {false, false, true}, + {false, true, false}, + {false, false, true}, + }) +} + +func benchmarkPrio3[ + T Prio3[ + Measurement, Aggregate, + AggShare, InputShare, OutShare, PrepShare, PrepState, + ], + Measurement, Aggregate any, + AggShare, InputShare, OutShare, PrepShare, PrepState any, +](b *testing.B, v T, meas []Measurement) { + for i := 0; i < b.N; i++ { + _ = testPrio3(b, v, meas) + } +} diff --git a/vdaf/prio3/sum/sum.go b/vdaf/prio3/sum/sum.go new file mode 100644 index 000000000..aad2897bf --- /dev/null +++ b/vdaf/prio3/sum/sum.go @@ -0,0 +1,160 @@ +// Package sum is a VDAF for aggregating integers in a pre-determined range. +package sum + +import ( + "math/bits" + + "github.com/cloudflare/circl/vdaf/prio3/arith/fp64" + "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" +) + +type ( + poly = fp64.Poly + Vec = fp64.Vec + Fp = fp64.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + OutShare = prio3.OutShare[Vec, Fp] + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] +) + +// Sum is a verifiable distributed aggregation function in which each +// measurement is an integer in the range [0, maxMeasurement], where +// maxMeasurement defines the largest valid measurement, the aggregated result +// is the sum of all the measurements. +type Sum struct { + p prio3.Prio3[uint64, uint64, *flpSum, Vec, Fp, *Fp] +} + +func New(numShares uint8, maxMeasurement uint64, context []byte) (s *Sum, err error) { + const sumID uint8 = 2 + s = new(Sum) + s.p, err = prio3.New(newFlpSum(maxMeasurement), sumID, numShares, context) + if err != nil { + return nil, err + } + + return s, nil +} + +func (s *Sum) Params() prio3.Params { return s.p.Params() } + +func (s *Sum) Shard(measurement uint64, nonce *prio3.Nonce, rand []byte, +) (prio3.PublicShare, []InputShare, error) { + return s.p.Shard(measurement, nonce, rand) +} + +func (s *Sum) PrepInit( + verifyKey *prio3.VerifyKey, + nonce *prio3.Nonce, + aggID uint8, + publicShare prio3.PublicShare, + inputShare InputShare, +) (*PrepState, *PrepShare, error) { + return s.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) +} + +func (s *Sum) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { + return s.p.PrepSharesToPrep(prepShares) +} + +func (s *Sum) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { + return s.p.PrepNext(state, msg) +} + +func (s *Sum) AggregationInit() AggShare { return s.p.AggregationInit() } + +func (s *Sum) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { + s.p.AggregationUpdate(aggShare, outShare) +} + +func (s *Sum) Unshard(aggShares []AggShare, numMeas uint) (aggregate *uint64, err error) { + return s.p.Unshard(aggShares, numMeas) +} + +type flpSum struct { + flp.FLP[flp.GadgetPolyEvalx2x, poly, Vec, Fp, *Fp] + bits uint + offset Fp +} + +func newFlpSum(maxMeasurement uint64) *flpSum { + s := new(flpSum) + bits := uint(bits.Len64(maxMeasurement)) + offset := (uint64(1) << uint64(bits)) - 1 - maxMeasurement + + s.bits = bits + err := s.offset.SetUint64(offset) + if err != nil { + panic(err) + } + + s.Valid.MeasurementLen = 2 * bits + s.Valid.JointRandLen = 0 + s.Valid.OutputLen = 1 + s.Valid.EvalOutputLen = 2*bits + 1 + s.Gadget = flp.GadgetPolyEvalx2x{} + s.NumCalls = 2 * bits + s.FLP.Eval = s.Eval + return s +} + +func (s *flpSum) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, shares uint8) { + var input [1]Fp + for i := range meas { + input[0] = meas[i] + g.Eval(&out[i], input[:]) + } + + measCur := cursor.New(meas) + a := measCur.Next(s.bits).JoinBits() + b := measCur.Next(s.bits).JoinBits() + + var invShares Fp + invShares.InvUint64(uint64(shares)) + rangeCheck := &out[len(meas)] + rangeCheck.Mul(&s.offset, &invShares) + rangeCheck.AddAssign(&a) + rangeCheck.SubAssign(&b) +} + +func (s *flpSum) Encode(measurement uint64) (Vec, error) { + offset, err := s.offset.GetUint64() + if err != nil { + return nil, err + } + + out := make(Vec, s.Valid.MeasurementLen) + outCur := cursor.New(out) + err = outCur.Next(s.bits).SplitBits(measurement) + if err != nil { + return nil, err + } + + err = outCur.Next(s.bits).SplitBits(measurement + offset) + if err != nil { + return nil, err + } + + return out, nil +} + +func (s *flpSum) Truncate(meas Vec) Vec { + return Vec{meas[:s.bits].JoinBits()} +} + +func (s *flpSum) Decode(output Vec, numMeas uint) (*uint64, error) { + if len(output) < int(s.Valid.OutputLen) { + return nil, flp.ErrOutputLen + } + + n, err := output[0].GetUint64() + if err != nil { + return nil, err + } + + return &n, nil +} diff --git a/vdaf/prio3/sumvec/sumvec.go b/vdaf/prio3/sumvec/sumvec.go new file mode 100644 index 000000000..8c27007e7 --- /dev/null +++ b/vdaf/prio3/sumvec/sumvec.go @@ -0,0 +1,152 @@ +// Package sumvec is a VDAF for aggregating vectors of integers in a pre-determined range. +package sumvec + +import ( + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/arith/fp128" + "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" +) + +type ( + poly = fp128.Poly + Vec = fp128.Vec + Fp = fp128.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + OutShare = prio3.OutShare[Vec, Fp] + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] +) + +// SumVec is a verifiable distributed aggregation function in which each +// measurement is a fixed-length vector of integers in the range [0, 2^bits). +// the aggregated result is the sum of all the vectors. +type SumVec struct { + p prio3.Prio3[[]uint64, []uint64, *flpSumVec, Vec, Fp, *Fp] +} + +func New(numShares uint8, length, bits, chunkLen uint, context []byte) (s *SumVec, err error) { + const sumVecID uint8 = 3 + s = new(SumVec) + s.p, err = prio3.New(newFlpSumVec(length, bits, chunkLen), sumVecID, numShares, context) + if err != nil { + return nil, err + } + + return s, nil +} + +func (s *SumVec) Params() prio3.Params { return s.p.Params() } + +func (s *SumVec) Shard(measurement []uint64, nonce *prio3.Nonce, rand []byte, +) (prio3.PublicShare, []InputShare, error) { + return s.p.Shard(measurement, nonce, rand) +} + +func (s *SumVec) PrepInit( + verifyKey *prio3.VerifyKey, + nonce *prio3.Nonce, + aggID uint8, + publicShare prio3.PublicShare, + inputShare InputShare, +) (*PrepState, *PrepShare, error) { + return s.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) +} + +func (s *SumVec) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { + return s.p.PrepSharesToPrep(prepShares) +} + +func (s *SumVec) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { + return s.p.PrepNext(state, msg) +} + +func (s *SumVec) AggregationInit() AggShare { return s.p.AggregationInit() } + +func (s *SumVec) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { + s.p.AggregationUpdate(aggShare, outShare) +} + +func (s *SumVec) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { + return s.p.Unshard(aggShares, numMeas) +} + +type flpSumVec struct { + flp.FLP[flp.GadgetParallelSum, poly, Vec, Fp, *Fp] + length uint + bits uint + chunkLen uint +} + +func newFlpSumVec(length, bits, chunkLen uint) *flpSumVec { + if bits > 64 { + panic("bits larger than 64 is not supported") + } + + s := new(flpSumVec) + numCalls := (length*bits + chunkLen - 1) / chunkLen + + s.length = length + s.bits = bits + s.chunkLen = chunkLen + s.Valid.MeasurementLen = length * bits + s.Valid.JointRandLen = numCalls + s.Valid.OutputLen = length + s.Valid.EvalOutputLen = 1 + s.Gadget = flp.GadgetParallelSum{Count: chunkLen} + s.NumCalls = numCalls + s.FLP.Eval = s.Eval + return s +} + +func (s *flpSumVec) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, shares uint8) { + var invShares Fp + invShares.InvUint64(uint64(shares)) + out[0] = flp.RangeCheck(g, numCalls, s.chunkLen, &invShares, meas, jointRand) +} + +func (s *flpSumVec) Encode(measurement []uint64) (out Vec, err error) { + if len(measurement) != int(s.length) { + return nil, flp.ErrMeasurementLen + } + + out = make(Vec, s.Valid.MeasurementLen) + outCur := cursor.New(out) + for i := range measurement { + err = outCur.Next(s.bits).SplitBits(measurement[i]) + if err != nil { + return nil, err + } + } + + return +} + +func (s *flpSumVec) Truncate(meas Vec) (out Vec) { + out = arith.NewVec[Vec](s.length) + measCur := cursor.New(meas) + for i := range out { + out[i] = measCur.Next(s.bits).JoinBits() + } + + return +} + +func (s *flpSumVec) Decode(output Vec, numMeas uint) (*[]uint64, error) { + if len(output) < int(s.Valid.OutputLen) { + return nil, flp.ErrOutputLen + } + + var err error + out := make([]uint64, len(output)) + for i := range output { + out[i], err = output[i].GetUint64() + if err != nil { + return nil, err + } + } + + return &out, nil +} diff --git a/vdaf/prio3/testdata/Prio3Count_0.json b/vdaf/prio3/testdata/Prio3Count_0.json new file mode 100644 index 000000000..81249048a --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Count_0.json @@ -0,0 +1,40 @@ +{ + "agg_param": "", + "agg_result": 1, + "agg_shares": [ + "e369056891a9fd95", + "1f96fa976d56026a" + ], + "ctx": "736f6d65206170706c69636174696f6e", + "prep": [ + { + "input_shares": [ + "e369056891a9fd95d44e6fadb3b75e6774b666d312bcc59b57694d189321ffe06f46b37d26db61d056b17152e3726a2e", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 1, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e369056891a9fd95" + ], + [ + "1f96fa976d56026a" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "5c6a0685bd0f0aa9b19b8c1c4431ec49eca02338e5e05da8fc91575311627200", + "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3Count_1.json b/vdaf/prio3/testdata/Prio3Count_1.json new file mode 100644 index 000000000..18f53370a --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Count_1.json @@ -0,0 +1,46 @@ +{ + "agg_param": "", + "agg_result": 1, + "agg_shares": [ + "afccf0c22c8901be", + "1f96fa976d56026a", + "359d14a56320fcd7" + ], + "ctx": "736f6d65206170706c69636174696f6e", + "prep": [ + { + "input_shares": [ + "afccf0c22c8901be040bc9d44987fd40085bf595185a34267ec8e975e8fdfa331abaaecc9d7104785e186102448192ad", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 1, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "afccf0c22c8901be" + ], + [ + "1f96fa976d56026a" + ], + [ + "359d14a56320fcd7" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "145aabe8608487ab66ff1e11a196662b0d268a8dbd2b01481daf7d190bf1b0b6", + "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad", + "49105b9c5b8b82fd30916e72506a0c5679b07c05a3255a85103f30cfd5ab310e" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f" + } + ], + "shares": 3, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3Count_2.json b/vdaf/prio3/testdata/Prio3Count_2.json new file mode 100644 index 000000000..ced47bc65 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Count_2.json @@ -0,0 +1,148 @@ +{ + "agg_param": "", + "agg_result": 3, + "agg_shares": [ + "6b111b08d94ff4ed", + "99eee4f725b00b12" + ], + "ctx": "736f6d65206170706c69636174696f6e", + "prep": [ + { + "input_shares": [ + "e269056891a9fd95d44e6fadb3b75e6774b666d312bcc59b04b52413d9e5e26d6f46b3fd26db6150a8659ad79dae8621", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 0, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e269056891a9fd95" + ], + [ + "1f96fa976d56026a" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "5c6a0685bd0f0aa98bb9c0942022d854c6be57b0c1d149b3d5a14867e2750b29", + "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "e369056891a9fd95d44e6fadb3b75e6774b666d312bcc59b57694d189321ffe06f46b37d26db61d056b17152e3726a2e", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 1, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e369056891a9fd95" + ], + [ + "1f96fa976d56026a" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "5c6a0685bd0f0aa9b19b8c1c4431ec49eca02338e5e05da8fc91575311627200", + "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "e369056891a9fd95d44e6fadb3b75e6774b666d312bcc59b57694d189321ffe06f46b37d26db61d056b17152e3726a2e", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 1, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e369056891a9fd95" + ], + [ + "1f96fa976d56026a" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "5c6a0685bd0f0aa9b19b8c1c4431ec49eca02338e5e05da8fc91575311627200", + "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "e269056891a9fd95d44e6fadb3b75e6774b666d312bcc59b04b52413d9e5e26d6f46b3fd26db6150a8659ad79dae8621", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 0, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e269056891a9fd95" + ], + [ + "1f96fa976d56026a" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "5c6a0685bd0f0aa98bb9c0942022d854c6be57b0c1d149b3d5a14867e2750b29", + "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "e369056891a9fd95d44e6fadb3b75e6774b666d312bcc59b57694d189321ffe06f46b37d26db61d056b17152e3726a2e", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 1, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e369056891a9fd95" + ], + [ + "1f96fa976d56026a" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "5c6a0685bd0f0aa9b19b8c1c4431ec49eca02338e5e05da8fc91575311627200", + "a595f97a41f0f5565abc07086ef01d5b3cb2629a3c534bd4dbd8f5187ad75aad" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3Histogram_0.json b/vdaf/prio3/testdata/Prio3Histogram_0.json new file mode 100644 index 000000000..64a2cb786 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Histogram_0.json @@ -0,0 +1,53 @@ +{ + "agg_param": "", + "agg_result": [ + 0, + 0, + 1, + 0 + ], + "agg_shares": [ + "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0d8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad1", + "1adf0d29da11c354159e2a7c373bfab17f17b78fda89bcb7e1fd9b86d4c2eff0f5738909a350fb11d5ddc8c41f29e53a0791d0d799f874ce2afac81dbbe9052e" + ], + "chunk_length": 2, + "ctx": "736f6d65206170706c69636174696f6e", + "length": 4, + "prep": [ + { + "input_shares": [ + "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0d8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad1d878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e6a4d6942338c87ab5336de984fca87d6315bd0cd55be021a5e8c95cb2f58d403209e06a16b0e535a34828e56812b7a3f995ffd32815553c38fc0ce8a7963e9758fc2a45b02b69ec05eb19de856357e3a3fd3063b2501f1c7e5791e3350f60a5e870c1d8d239707d61f61f6f3f8413185404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 2, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e720f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0d8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e" + ] + ], + "prep_messages": [ + "915cca74703d352a8e12e7441aa3896efbd633bf8eacd9a101ab922f6481404b" + ], + "prep_shares": [ + [ + "d94d1f36d8d2f9867208928069335f0957497c6df0fe6568d4304b27f51456acf8093e765dfe404541c27935c03bf8677569234022700212e1112ad5b4a474126b01b5b1be78d897a9e616bcb21c5644fad4b87f09bc65f0c46ec41e29b19ffd064ddc2301a2ff2176338dd52a09fdadd442cddcbe5d10dafe0d92551d81eac7", + "28b2e0c9272d067971f76d7f96cca0f6bef7d43878716b3fcee1d230515956acdd7ced66a61a897483b4b233e4fe32b48babf43d070fc14b1c7fc4e1a386fd223f58eec1544973c9f39e871c48543e979da23642e48ae655de8c7e6b008ab43bc27dda399f3c8341c7476370573e51b6ebe601061807bb886fc55c2161ce436e" + ] + ], + "public_share": "064ddc2301a2ff2176338dd52a09fdadd442cddcbe5d10dafe0d92551d81eac7c27dda399f3c8341c7476370573e51b6ebe601061807bb886fc55c2161ce436e", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3Histogram_1.json b/vdaf/prio3/testdata/Prio3Histogram_1.json new file mode 100644 index 000000000..8568c4f84 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Histogram_1.json @@ -0,0 +1,90 @@ +{ + "agg_param": "", + "agg_result": [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "agg_shares": [ + "7c81185c4933c0c53be9489a06fe6f271c677e2d2f3469491cd4a5df164da7898ab986810546eb5f44d266bab7912eec02afbee3faa2fc691c60e08cb5b4fc441550907d4b1c16f374bda4acec4f4285934b3867956e39a671054936d1d35a7f4e834925c9aab4102a4d4869bdd3adf4c87230df479eadc9d8fd5113f230d1535754c64ae50e7acf66d0d49d6668f99d862a872d07d7c5e5bba254be6eaa867af95b6a6fe60b4cc1011e0fc2acd1c239", + "1adf0d29da11c354159e2a7c373bfab17f17b78fda89bcb7e1fd9b86d4c2eff0f5738909a350fb11d5ddc8c41f29e53a0791d0d799f874ce2afac81dbbe9052ed75bb48b448e3dab58ea08704f275cf79253d1b055657dfd4862c648d1385a5b7b61459c9aeb8d5c9565370551c67bdea48ce598f7e3c93be4d48ecf19ee20a146a80033c3bbc8feb23771e908b528c13b5d8363939cd7df29d312b4ff9e453e7e3bce6b34722b6d70a389c1ab4724ef", + "6b9fd97adcba7ce592788ce9c1c695266781ca42f641dafec92dbe9914f0688584d2ef745769198eae4fd0802845ecd8f8bf70446b648ec79ca556558f61fd8c1654bbf66f55ac61fa5752e3c3886183dc60f6e7142c495c2998f0805df34a25391b713e9c69bd92084d8091f165d62c9500ea87c07d88fa262d1f1df4e00d0b650339825735bd31aef7b97890e2dda04078f56e658c623afe89988d91b633478b68c724e58188d1553e677ca7e618d7" + ], + "chunk_length": 3, + "ctx": "736f6d65206170706c69636174696f6e", + "length": 11, + "prep": [ + { + "input_shares": [ + "7c81185c4933c0c53be9489a06fe6f271c677e2d2f3469491cd4a5df164da7898ab986810546eb5f44d266bab7912eec02afbee3faa2fc691c60e08cb5b4fc441550907d4b1c16f374bda4acec4f4285934b3867956e39a671054936d1d35a7f4e834925c9aab4102a4d4869bdd3adf4c87230df479eadc9d8fd5113f230d1535754c64ae50e7acf66d0d49d6668f99d862a872d07d7c5e5bba254be6eaa867af95b6a6fe60b4cc1011e0fc2acd1c239bbc08eaa2f65a321aab41077ee2ee67cf916f12d74bd3e0db0b7f053c6000e42e127a7a9d766608fcfefe7741ad8098f7e4180cc5a7af54b4e1a2f6385bc3205c60cd615037620637b96a87b6277db02df81cfa9389ae42515dc02f26bd54d4f6d22ce1c37ba89287248bdde8c71cba5e08cf30d48fab7a600fb27d441ec60788419a3c2fe4f162404a45cbc6a759d71bb3537e109dd50d2810cd3bee8e3ed828646009b0d11310b6dbf5d768d4da864950b09ec34d39e9bde8d9a4496031a33a6452188885035ee869560aee14cd02c484588f5399d364dacfc2e63dbfa2844418722107a38f8af774f4b334ddafd699d3ff3aeb1653f19c0cba384337b114a290ea69463793a5f9986c22bea8ef77b51358adb52e8a61c9f8046504a6156ff82fe86b3868cb262b8db8fdfc07444132c7c42f3dce18d99f6b221319e54a908e7d458925900d23c120489a930b802aa808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + ], + "measurement": 2, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "7c81185c4933c0c53be9489a06fe6f27", + "1c677e2d2f3469491cd4a5df164da789", + "8ab986810546eb5f44d266bab7912eec", + "02afbee3faa2fc691c60e08cb5b4fc44", + "1550907d4b1c16f374bda4acec4f4285", + "934b3867956e39a671054936d1d35a7f", + "4e834925c9aab4102a4d4869bdd3adf4", + "c87230df479eadc9d8fd5113f230d153", + "5754c64ae50e7acf66d0d49d6668f99d", + "862a872d07d7c5e5bba254be6eaa867a", + "f95b6a6fe60b4cc1011e0fc2acd1c239" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef" + ], + [ + "6b9fd97adcba7ce592788ce9c1c69526", + "6781ca42f641dafec92dbe9914f06885", + "84d2ef745769198eae4fd0802845ecd8", + "f8bf70446b648ec79ca556558f61fd8c", + "1654bbf66f55ac61fa5752e3c3886183", + "dc60f6e7142c495c2998f0805df34a25", + "391b713e9c69bd92084d8091f165d62c", + "9500ea87c07d88fa262d1f1df4e00d0b", + "650339825735bd31aef7b97890e2dda0", + "4078f56e658c623afe89988d91b63347", + "8b68c724e58188d1553e677ca7e618d7" + ] + ], + "prep_messages": [ + "8794e3c89b479fd38914037c778563366e9c90f61a47f52e02e51003048af9e1" + ], + "prep_shares": [ + [ + "9c992f824ce7e69496d40dfa1da358109a3472a03ed58dc33d5426b0115bc7834b72373b9e78170ed075be80bd7842796b25594ce5825c4166bffa9165a98e40a56d6d17e0ca74af36cb5dbdb3a2f3c7d246b8f5bd78acc9f6c26ffde64d4817cdd9b28b742924c79516ca016098492df7580a49dd091f4f6e81fcf9d9fc148365b3e30205531b610d546de28a6b7c7cc058087324206afad931cea724e2285c", + "5db683a2145d865bdcf7b710ffb7e5ebb0bd9384c53299aae2cfe91888654d713fb6f1f7c85c5cfeaad11f1231a6ad8af800be32effc0abc03e33cd8160323e080e98fdc84db0024002bf3aec21c8a9ba3d69a20bbf18d9ff7234d6b03e993f5ef0c2dad87518e4f16634da8f1d947a518540775525c97a3d8d4323fa0f488b782c591e1ce996072e1f096b5991133f1d6ab883b98ec6a028b1de85eefed6989", + "08b04cdb9ebb920f71333af5e2a4c1037e6f5e776923d04de57b5c3ae70c15ad22f5380db9898c43134eb63198f64d67b47df6087bf19d0f85c2f729bb3235bc92bf9dc3a0f5ded0191ae397b5a2553a7ce4a518a7928893a51dc7dbfbdcb3b0d59aaa9ee4849b9d94faab5b691dc86fca19867ae82f97927ff5eece600cd002ed585479d34bf381eb8c5a1655338d24d04951ef27510d46ac2d45d22b5fc6c2" + ] + ], + "public_share": "65b3e30205531b610d546de28a6b7c7cc058087324206afad931cea724e2285c82c591e1ce996072e1f096b5991133f1d6ab883b98ec6a028b1de85eefed6989ed585479d34bf381eb8c5a1655338d24d04951ef27510d46ac2d45d22b5fc6c2", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + } + ], + "shares": 3, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3Histogram_2.json b/vdaf/prio3/testdata/Prio3Histogram_2.json new file mode 100644 index 000000000..b6317d208 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Histogram_2.json @@ -0,0 +1,2366 @@ +{ + "agg_param": "", + "agg_result": [ + 3, + 1, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + "agg_shares": [ + "064975657a4d61b066d25526d5af390c1515d962769da2d21614e8bdb263a2967378a1a0a1d92e4c59552750c2640cb3bc55da91fd496eef1b3a26d6b0dec433a469f48a5271984f71d7a69fe576665650bcd217a70a1a19b6284028d3c7796e3b314ae5f5cb74622e07d6cbd5402a4f9f81080754181daa51ae6be4fdb2b6b44c6df90160aa280c22d293e1a6ed6874b55bde1c3ee2934109c043f702ca47911eadf1c9f3894dbc839c9f704a3395a8c36292db0c8bd9bb77fb172f8c6d68db9635d15f16feb6478098f9fd89b0fb1ebb6b41d0f9a423dab914dc455051d7dafe151be7921237bf8541a34c3a64155a554d489370cf8bfe2b0894480382360b05c1d0f02dbbd7bab9ad9d39936a1bca5db320fc9e9f153ac9d4c2de65e6fdb78d75cbc8c97893ca0a55f98b9abf8127f3b827e86baee8d73c1b60e996e036e599d249a0efd766bf834c0f7412f82a7f6fa95139bf136762ad219910d9df127f5018711487c9811297abc354a76a4f2cf428e90176b5024aca6d22f86cb05c5eac715e398d7d374fb1999ea7fb64f1533289ebec40337ef35a1ba1f078ad45500fd52df11fb888952211d3e81839c6a2ac6879588d0c48f5bed22a3b2eed0d8132c1e8206e933058419ed596a1275a235127ac04561d7f14ab9ed9db40aedd0eb9c1ec994cf1a66dcc05437d34cfb8ff0c129ae4e04d4321aeea613d1ff68f8eb809fce39f697b9cf5b309e4a034340f9b6993ef83604714ef257f21341a1511bb2a25f805136e4425355c23f636f7f54f3ccfbf357c633c687e6a5008c7a26a76c4f6cd640526cb87b17fdf186a0f9d71f377ea0738c820235ac540ea2949ca4d738dcd651e9950fb5ceb32a18ff4c9601c28c91d962df915616aa64dcc80c440fe3fafaf3778ed85e25d2101f6f7cf84f82d65aaaa7b1df384aced53d386724be89e0071795c946b84fe8dcfab2e32f7e36cfcb24912f24b016c8c303228bc01281d4577765ddea7c8666678d9f3d7d04a64c4760b885d7e64314fb1fef8c496b63c3a6547ff64d6509b947c9386ae366c589f8e2ed9f25729aff3cb58cc496598e496c7e2a39d4be2462231b0f86b29eb9263ef4f9ed695037d4a2ceed4a574956a49a66164cafc553cebecad474dbea137470478b630e4c948925fdd903934afbe75bd0cd58906d3a727dcb7ad0f88825883607796c8310ca1a5dc74d154996841060dd54e1c24c0e9e98ef14fc588a1f44ab55d4fb4de70e7936aff49387a27549c626dba13810ae616b366549473b0d51ab89065e62a37b69993b3f03391ce7bbf9e4cd1ccb3c744b8fa9bfea3193223753acd06579d9a27b9671b05421780b1a6e20a57142389e5757419d95b02b52c713e9e0fbe6171e5c65fcbf99459eff9f5d5f318e5a15dfae05faafd027480062ad28e27b5f89641c0de4f4613d541a6d3ae51ee51c3d410445d7b3a1bd303c04177b90b03f519badadb73803e13aa052fa03680d63f17d94337809d96e8938f09fb9495c7ba02ae5fd5e38f1472d30acfe65e804c3478b2884987c765c47969d45647adc5331f9dcc61b8f5c8bc5f923efcd4702b4ed12acaec677bf908c88eac20437e8da1b31eff280fe601fbecf7e59d156b165e4b3d29a5b8e85ccc4f0b16f7cc351ae5e5ab06ceec96231eb3b0fb99a1f73ab7c9e7b985c59635e4b86f39c0c1d9a715529c9f3158c02bb7e80401104a8bd31230be6c7b8ae744cd383e1df09d6be5ad1c3341d780ae09a575a717e96bf805ae53ab6b56aa0616c684982929e00e7a4fcf66ca43654372ad8e670214fb6e25a94e4326ff67c8d0b0e74d7a9e1effb2823a467e9a0aa7d2304f0276136e8ac9de327688a4a9237e235630ae0d0fe4b6a109c3a52c959c6687ebf9d70228ab0af8f727915971575bcc020e6b8b4c68273ee5d609694bbe65e61cf5bc4534d31b0f9f9e0ac2e2a4c9d5222319dde59b95ff9c8fc945ba4d0c055cc3482e015436992410641ac093d912e604cff721700646eef5bbf483cdd57034a6099fc2cc7fe97f54193f3818b9bb263e69fcbe224410998cb927e067ab8713353863ec188118e97dd8ccd008aceb13f68e6ee98400da21966bd831b15078b5c773aada17512b2265c5d1ea6078e5b541184c080a211dd135d59d0da5a578a924aa096759f0c942a67038ec6d2cd085f4b8d2c87aae5e3b6493c4b2016b6e08c31f8c5f277953576532f845fcebb88047be2633475989413bb5d280e88a", + "feb68a9a85b29e4f7d2daad92a50c6f3edea269d89625d2dcdeb17424d9c5d6990875e5f5e26d1b38aaad8af3d9bf34c45aa256e02b69110c8c5d9294f213bcc5d960b75ad8e67b0722859601a8999a9b1432de858f5e5e62dd7bfd72c388691c6ceb51a0a348b9db5f829342abfd5b0627ef7f8abe7e2559251941b024d494bb59206fe9f55d7f3c12d6c1e5912978b4ca421e3c11d6cbeda3fbc08fd35b86ee3520e360c76b2436063608fb5cc6a573e9d6d24f37426446c04e8d0739297246bca2ea0e90149b863670602764f04e14694be2f065bdc252aeb23baafae282503eae4186dedc8405ebe5cb3c59beaa5acb2b76c8f307401b8f76bb7fc7dc9f4fc3e2f0fd24428452a5262c66c95e435a54cdf036160eac51a2b3d219a190248748a343736876c35d9aa067465407ed80e47d81794511728a7e49f16691fc91a682db65f1028994060b3f08bed07d5809256aec640ec989d36de66ef2620ed80b1e78eeb78367eed4c543cab5895b0d30dd716fe894afdb51992dd07934fa3a1558ea1c67282c8b032666158049b0eaccf761413bfcc810c89e45e0f8752baaff22ad20ee047776ac1ee2c17e7c6395d559786a772f3b70a252dd5c4d112f27ecf3e17df916ccfa7a2612a695ed8a5dcb0d853fba9e280eb38612624bf5122f1483e1366b30e599217fabc82cb304700f5ed651b1fb2bcde35159ec2e009707149f6031c60968463ee4bf61b5fcbcbf066966c107c9fb8ebf4d980decbe5eaee46d5da07faec91bbbecaa3dc09c9080ab2c33040ca839cc37b8195aff7385d958b3b09329bfad9345c4e8020e795f062900c8815f8c737dfc0a53abf15d6b635b48c72329ae166afe8a214cd5e700b36a1e3d736e269d206ce9e9559b2337f3bc101c05050c887125e1da2defe0908307d07d29a555584e2f07a5312ac2c798db71761ff8e86a36b787b01723054d1cd0a1c93034db6ed0d98fe9373cfcdd74300d8e2ba8889a2213c37999987260c2831b59b3b89f477a2659bceb04e01073b6b49c3c59ab8009b0daf646b836c7951cb93a76071d1260d8cd6500c34a733b69c671b69381d5c62981db9ddce4f0794d8146d9c10b061294efc82b5d3112b5a8d6a95b6599e9b35e7a9c3141352b8b2435ec8b8fb8749cfff35b76da0226fc6cd50418a42f32a76dd2c58d8234852f0797da77c9f886937b2f35e5a238b2eab6897bef9f22ab1e3bf3f1616710eb03a795e0bb54aa2b04b058f186c9500b6c787d8ab639d9245ec62f519e94c99ab6b8e4f2ae5476f9a19b9c849666c4c0fcc7031844061b32e333038bb470564015ce8cddc8ac532f9a84665d84698e4fabdea7f4e591df5a8ebc0761a8a8be626a4ff4ad38ec161f041828e1a39a034066ba810060a2a0ce71a42a2051fa05502fd8d7ff9d52d71d84aeb68be3f21b0b9ec2cbe592c51ae11ae202befbba284c5e42efc3fbe8846f4fceee54525248c7fc1ee55fad05fc97f29a4e826bcc87f6269196c70f6046b6a3829fd51a02a1c70eb8f2cf53019a17fb3af874d77b678389a3d86962ba9b8523ab0e062339e470a3745a06dc1032b8fd4952ed53513988406f9377153dfbc8172424ce100d7f019fe0613081a62ea94e985b4c2d65a4717a335b0f4e90833cae5fe1954f9311369dce34c4f04665e08c52c3618467a3a69ca1d4790c63f3e2658cead6360cea73fd44a17fbfeefb5742cd1cf4193847518bb34c7c1e20f62941a36e3ccbe287f51f65c8a58e8169407fa35ac5494a955f9e93b7b67d6d61ff18594309935bc9abc8d547198fdeb0491da3ab1bcd90098372f5118b28561e1004d61c5b98165f5582dd1b0fd89ec91753605cd89775b56dc81dea9cf51f2f01b4942f63c5ad36a63997a140628fdd754f5eb07d86ea68ea8a435fdf19474b397d8a51a29f696b4419a1be30a43bacb2ce4d46061f53d1d5b362cdddce6221a646ae4627036ba45b2f3fca33cb7d1feabc94adbef9be53f6c26ef19fb3008de8ff99d110a440b7c322a91cb59f6603d3380fa7fabe6c0c7e74646d9c1960341ddbbd3667346d81f98547aeccac79c13e77ecb168227332ff75316ec097191167bff09de699427ce4eaf894a388c5525e8aeb8dd9a3a2e159f871c4abee7b3f7f5dec62eca2a62f25a5a8956db55f698a60f1abd598fc71392d3317a0b472d37855185c49b6c3b4dfe9493f73ce073a0d88690a89acd07ba03144b7fb841d9ccb8a65abec44a2d7f1775" + ], + "chunk_length": 10, + "ctx": "736f6d65206170706c69636174696f6e", + "length": 100, + "prep": [ + { + "input_shares": [ + "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0d8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a9f4d10c3a0130028e99c355bc4da57b4fa22195bda8151b0ae8901ceb458c28964b2d2d19d109d8c1c2a03dd251e4a2c48312ae66e609e3a8f4cc40d84d7f928a3f0ace6fc07e05ab17c01b9fa7906249d3c0d59e05cd71d020c7263100c4d3ece5cd1d7deb7255413ce7a2e20eb514ef6ee6a3af1bd50aece20562b0a1bf5f9f6d0801166978bbd9d6d17b9925cf7bf53a7385370f960daad1dafd4931eaa5b43ff628a3ae52b4e38067b0d1317954381a9fd9cd1581296425be048e507f51bc1febf332f32d8d3d0d77802b9de5e77963081199c99952dc46ca4e7f92c3986f64902d7dfd243dd388dfc44c95ce461d23684d519da66012bc1d0ce4e3c0072437ea43ce2ff34c688206fc5918c90b236c74664ca28fd0e50daefb7e025a934ab88e6dca644649fb870305df8ab2311461368f2fd837c9d8deedaa811e511ea2f417a2841e3c1796f5c3db316abd070bf049b98e27d023ee0351bc747622556e706968efac792a7792d37cc89ad154e464cd7a6e1fbe278b14d5509a5ed0046e6f1af095a53d238f0427efa87b64ad5ca7a0cc7f649f7be83731b85608946ef03ac01588a2af6533647e24c07b8d8654aeecffb6a2ba11603e101cc708ee80ecb4695457826ae70ce830a5622d3551d7e37eabac8ec2e735dbee213a5b26050e1bdc52d21f7be9578668d3044484180404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 2, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e720f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0d8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "df8c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "baa2841ddb7c9165f4a782633dd7e92b49dd1b3442de0069c780f74a63cb53e6" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37f27eba1c272bf7ca7ab0768e3d1f75404ae6456b732d066ab74d4f2da6dcaa2494b444ff6c14e6773609eabc32282d9d456cc565ec94950085319139daef29568e2fa6699702a0d3aa4018d71a3c28b9cdf73ee692130d39de44328e3e4d49af0a5bd4b6f62bb3357eacc129f8e358c99388813e1976784d821d2babaedcd760d02a6fce712900190c3b95ccee4938267eca51216da0b13cd6c9c7978189efda79f847e987c4b6a31778cd1466a2967e22b6143d62e4e1229aa7f5ea7853901c6d542b0d5ab0fd6de397ae38bf935dd3b3521e9a9f0eb93b2a26dbdf9654d6c68562725cf6aeea09fed87fe61ed35d8d570a03cdeee9719af30cf68bd18cf728ad989db144725a3b8b81f6c7f12c1af0bdb7b5dead163e4ce99128251a44a6476b4a46cee9fd105411657e6dd313dc90a8bc37948a39bc02ee7a80168be082b4667085e83d49c770521af5a4baff811b9fa66d5dbb62e46d22ecd373679b0025334b8c93cb5aca96774a571d0601ab77d", + "9b1eb2c736f96b1335291e191ab00c80c464d3dc55c52b9f6d0a6c5d7ed0f01ccac1655435b03aec8c6f8aa8c6798e053ee915cb8a8b70d1582b242961f39b401db842439560a70ce333a273d4da9b37dc5fc812448a68f27bf39ef221b32b8c1d51e55b553ea3a4056d627a2e5b2ced712688d79553a0321c32cb1fb474da3b12ba32779614365afdfd645a8b3fa5178c2702c30745ab64a048340a733022bc5e4d60fbae27377187a09ee9d933ce06bb5851772b2f9c71d9e37a28078db2bd1f97bf8466cbf7dda8442d7f7af37c32b79c7d70e993ac0f2f44ece039290c13345318abde99a7db7b9fee2a33d5938d4b71eda2201dce4b4626e2f47757834fe9761e56d960409a891124141f1ff5a194b2245749a34f12514f0cf75774a86a4c3d78cad0829883f6c1f520ec2808c7279e2949fdb4d2ed8c2c519332588fc00d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "fa66d5dbb62e46d22ecd373679b0025334b8c93cb5aca96774a571d0601ab77d40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7de08c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001adca7981fce37c38b216b2674cdf08e34a305dd18a5027553155ed527d6789e1b25a7b45e058ef22d4e3e352f008437c677e133839a824b3bf853bbf3a0a00f129037ff071aa7f85d8a68b8f2fb9f9b0cd9865270d4d64dce6f95d8206f8154bb3f7900f6fc5163edf7541f0421c5cec6752a580f2f4405aaef5d0a53324a8c5b7231d06018ed66ac4302eb0418001761c438288ca5606fee8d061c9c08c9874f6bc7f96802eae1af0b4b962cdb936179f589efdfb9293f0d90a559184d311562d8cee42e499e432705ef48f7a7f607fbcb02db1627dc54902e2db34de1ced1d27558386e1e0cf29a9062dae33e3ac72ad23684d519da66012bc1d0ce4e3c007205241ce0b4db71626c527eac887659328de482a6ffa7d96be9051c5ebf05cda2eb9304503fc70efe6a5cfe0a1e46367716635e55d261cf9c40e7e3c2f41bfc0042fa27072444a9769670867915853b8884ba5581ee038c8d56acb409e9ec1dd977ea6670dc2d550e79a692f688d398d5c710ead1a3752e7d9010a1e17cbe69e4699160baa7fdf64966aeaaae02132b3459e91c8ec1e2e8aaa38aaebdebde68fbdbe36a79c22540f26202c72d3f3b0c30d70ddeb8825a749f999688fc0865c8c8b576704a5eba421d7e6c3a6133bbac99496590bd3daa6f10f3fdd3adbd10c80362af8f96e2bd10d82091af91ce6a5eb7404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 99, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e720f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0c8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "e08c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "0900d619e75cda06ed8b38db0a1d1ada2c3570643374d4d0223b63bd9f4ed7b6" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37fce4abb3d00eb8a7dd7c26bc25d0fffaeae6456b732d066ab74d4f2da6dcaa249f8525a13e33a3bd9950fde34fd1f1d3256cc565ec94950085319139daef29568048c2943883dfda634b6ff5c49709e1f1771b890a81981bd862ff9eb352d2c7a39f5100e20caac624a0e0279a449195f388813e1976784d821d2babaedcd760db60e161a0259afafd537e1db1485813ceca51216da0b13cd6c9c7978189efda752c1051f95d025b237f3884902f3e8842b6143d62e4e1229aa7f5ea7853901c63f6afb66440558221790880305179b633521e9a9f0eb93b2a26dbdf9654d6c688698126d4789f557989863634d3ca19f70a03cdeee9719af30cf68bd18cf728afda6370e8e6197bd6c7390d0aefb3f3adb7b5dead163e4ce99128251a44a64763141fa7df5e74394166bc1636804bef37b44255378dc49c5a4cae709ea3485165a149b4a733d2c76efca5b9af9ea34342fecd68b2f22c7d563da5c4e5206638d88f2b13480cc62d18a56960eae5848ce", + "9b1eb2c736f96b1335291e191ab00c801e05ba61c8991dc9254f687ef2b84672cac1655435b03aec8c6f8aa8c6798e0591da0aae699f9c6b23baf1b7865558e31db842439560a70ce333a273d4da9b37dbcf3289b790c1c043355fec8cc50a591d51e55b553ea3a4056d627a2e5b2cedddeec238d8442727bcf0db459e604d7612ba32779614365afdfd645a8b3fa517d8bee890187cfd448ecaaffc423f23e75e4d60fbae27377187a09ee9d933ce06071ccaf012aae0f0347dc3256fc3301b1f97bf8466cbf7dda8442d7f7af37c324e7532df509e2acc352e47692e484eeb345318abde99a7db7b9fee2a33d5938d1b000005448279939b157df31751ba85e9761e56d960409a891124141f1ff5a17095c85d02675b0d9dfbe7a5bb39183c4c3d78cad0829883f6c1f520ec2808c73aa5446dd7c86fa6e62df1e1a69033d40d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "2fecd68b2f22c7d563da5c4e5206638d88f2b13480cc62d18a56960eae5848ce40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7de08c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001adca7981fce37c38b216b2674cdf08e34a305dd18a5027553155ed527d6789e1b25a7b45e058ef22d4e3e352f008437c677e133839a824b3bf853bbf3a0a00f129037ff071aa7f85d8a68b8f2fb9f9b0cd9865270d4d64dce6f95d8206f8154bb3f7900f6fc5163edf7541f0421c5cec6752a580f2f4405aaef5d0a53324a8c5b7231d06018ed66ac4302eb0418001761c438288ca5606fee8d061c9c08c9874f6bc7f96802eae1af0b4b962cdb936179f589efdfb9293f0d90a559184d311562d8cee42e499e432705ef48f7a7f607fbcb02db1627dc54902e2db34de1ced1d27558386e1e0cf29a9062dae33e3ac72ad23684d519da66012bc1d0ce4e3c007205241ce0b4db71626c527eac887659328de482a6ffa7d96be9051c5ebf05cda2eb9304503fc70efe6a5cfe0a1e46367716635e55d261cf9c40e7e3c2f41bfc0042fa27072444a9769670867915853b8884ba5581ee038c8d56acb409e9ec1dd977ea6670dc2d550e79a692f688d398d5c710ead1a3752e7d9010a1e17cbe69e4699160baa7fdf64966aeaaae02132b3459e91c8ec1e2e8aaa38aaebdebde68fbdbe36a79c22540f26202c72d3f3b0c30d70ddeb8825a749f999688fc0865c8c8b576704a5eba421d7e6c3a6133bbac99496590bd3daa6f10f3fdd3adbd10c80362af8f96e2bd10d82091af91ce6a5eb7404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 99, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e720f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0c8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "e08c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "0900d619e75cda06ed8b38db0a1d1ada2c3570643374d4d0223b63bd9f4ed7b6" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37fce4abb3d00eb8a7dd7c26bc25d0fffaeae6456b732d066ab74d4f2da6dcaa249f8525a13e33a3bd9950fde34fd1f1d3256cc565ec94950085319139daef29568048c2943883dfda634b6ff5c49709e1f1771b890a81981bd862ff9eb352d2c7a39f5100e20caac624a0e0279a449195f388813e1976784d821d2babaedcd760db60e161a0259afafd537e1db1485813ceca51216da0b13cd6c9c7978189efda752c1051f95d025b237f3884902f3e8842b6143d62e4e1229aa7f5ea7853901c63f6afb66440558221790880305179b633521e9a9f0eb93b2a26dbdf9654d6c688698126d4789f557989863634d3ca19f70a03cdeee9719af30cf68bd18cf728afda6370e8e6197bd6c7390d0aefb3f3adb7b5dead163e4ce99128251a44a64763141fa7df5e74394166bc1636804bef37b44255378dc49c5a4cae709ea3485165a149b4a733d2c76efca5b9af9ea34342fecd68b2f22c7d563da5c4e5206638d88f2b13480cc62d18a56960eae5848ce", + "9b1eb2c736f96b1335291e191ab00c801e05ba61c8991dc9254f687ef2b84672cac1655435b03aec8c6f8aa8c6798e0591da0aae699f9c6b23baf1b7865558e31db842439560a70ce333a273d4da9b37dbcf3289b790c1c043355fec8cc50a591d51e55b553ea3a4056d627a2e5b2cedddeec238d8442727bcf0db459e604d7612ba32779614365afdfd645a8b3fa517d8bee890187cfd448ecaaffc423f23e75e4d60fbae27377187a09ee9d933ce06071ccaf012aae0f0347dc3256fc3301b1f97bf8466cbf7dda8442d7f7af37c324e7532df509e2acc352e47692e484eeb345318abde99a7db7b9fee2a33d5938d1b000005448279939b157df31751ba85e9761e56d960409a891124141f1ff5a17095c85d02675b0d9dfbe7a5bb39183c4c3d78cad0829883f6c1f520ec2808c73aa5446dd7c86fa6e62df1e1a69033d40d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "2fecd68b2f22c7d563da5c4e5206638d88f2b13480cc62d18a56960eae5848ce40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261244503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a785a976259a56ae8545d25e052340eb42df29fc6dd5f7a7c2b73b4dab6529ad6474e50e7f2da3b37b4d73776a9ff5ad21dc3e54cd105e84f6ac65d9a756a62eb74c7f8f07913500787e86362eaafe41991d7bf6e0d9e2238f4ad039be13d7b81d9b2f7286791ef0e2489534b4c3c45768133a889ea2d927558d693aed7579981be372640ec8de6ad058e146a94d8209943db7fb7cc744f74656c6a875654f22e7a92feb75933a9881f570d5cb2e8e55cf8bc0f1a77719131969ed8806bdac47ad04543e5b7c67ec0011b1a3e85a3744be567d6de453af3b7ec5adf294ab21b49368738a3c8fd89820eaafbe94cbfb75ad23684d519da66012bc1d0ce4e3c00726a711d9d296eca051d607f400333dab204f8bff8c64ad442b7f03cabde2bd1e7c9ec68c7517ac5f404c3fbc374ca126b7181ac8b9bde3288b274411c2052a9275e6a2e1ec4d751cd99f0da092775f27acb69e882b53cb723ee93898f7630f712dcb06f3d72eec8ec68725eaf5d5c2226bb079a57e88ba1b127981786d7b05cbe1e8b0adbd35c774888228149863a21fcd946c5629ace0825e82460d29d53fe1bcc18662a6bdc78194ff64ffe67e6874cd4dabd7ec512227b939d0994eabb18b0bcff1194ef9107849d40691a560e40492f0095f51e4cd1e834d0a7d1542d7e8da1808f6138cc78f0a2498e8bc0e56d87404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 17, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e720f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0c8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "244503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "df8c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "baef7355f66644fe751d36705981dfacf26c987691c76409c848808bdff226f2" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37fa2196c3106d421c1951bae3b75e1e0c1ae6456b732d066ab74d4f2da6dcaa249b8a39312c2b26c426fc71b6d8a27b0a956cc565ec94950085319139daef295688de0e8fef0420811156670019b67583b1771b890a81981bd862ff9eb352d2c7a16b7131e254fad27c3aa073ba1a21190388813e1976784d821d2babaedcd760d9e251bc0442029a5e82cf338cfd31cbbeca51216da0b13cd6c9c7978189efda72e734f48def48e3afbe610f55d131a972b6143d62e4e1229aa7f5ea7853901c671bc334e444ad084b6f3b54b0d18b4e63521e9a9f0eb93b2a26dbdf9654d6c68bb7f9f61b6d16cef2972ae3421f6c47470707f9adc16da4a980e632f64377a5e5fcc4d8ec24afe5a4fb34fddbd79fd82db7b5dead163e4ce99128251a44a64762312440d0f878486adf5a925baf613fa8bc37948a39bc02ee7a80168be082b462498ad784d9a7a6c9ab8ef92028d1b3ad6b284d1755b860b5ec7195f6ec52c9e940fa71e761c80b2060cf9aeb681f373", + "9b1eb2c736f96b1335291e191ab00c804a36096ec2b0868567f62505dbe6645fcac1655435b03aec8c6f8aa8c6798e05d189d1ae8a276b024a02b47ff94dc56b1db842439560a70ce333a273d4da9b37527b73cd4e8bb6566385ee473bce503d1d51e55b553ea3a4056d627a2e5b2ced002dc028d3bf26624354d683a107554512ba32779614365afdfd645a8b3fa517f0a7e3ead5b4834f7bd59d9f88f087685e4d60fbae27377187a09ee9d933ce062b6a80c7c985776871893b7a13a3ff081f97bf8466cbf7dda8442d7f7af37c321c23faf75059b26996ca192126473568345318abde99a7db7b9fee2a33d5938d601b30f3d41d8b55c7f087fa5ba5a10fe9761e56d960409a891124141f1ff5a10f70b2ddcd7df46f9ebb2899acbb5af34c3d78cad0829883f6c1f520ec2808c7b930522a8eff53a8d98d8d4baa9e44d10d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "d6b284d1755b860b5ec7195f6ec52c9e940fa71e761c80b2060cf9aeb681f37340ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7109e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a06bf37862adea5bddcb77042b1735aaf2f6c899b7fd125ac3573513e3c7460b729bc674b9bafd3e8f9ef9a7db45a3c246462a6d7b4add7047df653b7a5a2ca02859c83a4c28695d82f12b4f7fe7f286a824a027b516857688ddf7f615e40817471f3c37abded4f51d58fab456ee0e0a72ae10f9316f2599ae0e2e7b221db4bbfd2f32a6eb860729a125dc504a640f9396767511aad9f91bcd3c36b8765d25e6fafcbdf34c1416882cd79d9464ac2850d2bb27f8e5f64902dbbdeb7b3f0d8afb95132020792359690002ac258773cc87fa47ae8441aecf28413a66505b00d3a4e7905259803966520fcf0cf940742ace4d23684d519da66012bc1d0ce4e3c0072dc0c7d7958358f30950534dea4f38db7017ed62325d92813c9f09f47590a0b07e67e5163a9a52d43dbaa98bc696f311929e2eb00b83643d3bb444bffef1941104d95a36a7b640cfcf0c68a7412a5ae2adaf6a576717282f354620dc9f92df11f4570a3eb1b9268aa9b6b06b53bb886f4125a324ebcc7d98c9f8bc3818d2daa8009cf05ad078aeb5b9753d0ae74d2485bb6baf3ffb9a3c6dc5dcd5ed28ed591db97df84ad03ceb91fa1d38313d00ce89ba1e54d0add1f237f6e5d2a6165bd2d713b1353721523f0b39e31c1ff6375ec1470ed828f4a9ad11b0e8521f6eed15f885f02a36cfd339d529902bae0056379fd404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 42, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e720f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0c8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "09e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "df8c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "f1bd870009988050f4ef94cdeeb766a2311f7e59f1f3ca0efd4ec7334d439314" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37f144c5c68db22629297bcd826fb529288ae6456b732d066ab74d4f2da6dcaa249a6da44a507c53b943e0f77e8e4b4b15956cc565ec94950085319139daef2956849da90a79b6e54d488aae905f16d67501123dd856722e6b3ffdb9d0fc0fa3cc824d506ce843469f16c35d57de5d01b75388813e1976784d821d2babaedcd760db4935cd97da241e35e720387dd8721feeca51216da0b13cd6c9c7978189efda71d20eff4cd3c0e1f4c9ed2d3ac0c49c62b6143d62e4e1229aa7f5ea7853901c641b7558cda57f9d4b5cb36b5d0b9af1e3521e9a9f0eb93b2a26dbdf9654d6c682ab96dc5cb93b5b007e36d08f0f1f51e70a03cdeee9719af30cf68bd18cf728a10302f2ad0eb70b76df1703e692f854bdb7b5dead163e4ce99128251a44a6476ba4367b0e3c675c70bfdeaaea65123958bc37948a39bc02ee7a80168be082b46ef1f787cc439e143cb4442f818ea6fcf67199ce6418d9555c9cfe6e4ba826631ea5379d4235d8113e9a364960d6c742e", + "9b1eb2c736f96b1335291e191ab00c80d8031937ed6146b46555fb195575b398cac1655435b03aec8c6f8aa8c6798e05e352201c45159cb07aba58049fc0c3bb1db842439560a70ce333a273d4da9b37508e897f49f6c4a906b355a6810564bc1d51e55b553ea3a4056d627a2e5b2cedf20ecd7873da6a9899c908415dd94a6012ba32779614365afdfd645a8b3fa517da39a2d19c326b1105908d517a3c83255e4d60fbae27377187a09ee9d933ce063dbde01ada3df88304d2799bc4a9d0d91f97bf8466cbf7dda8442d7f7af37c324b28d8b9ba4b8919b3f298b762a53930345318abde99a7db7b9fee2a33d5938d76dfa4acbf77b93a48cb724e759b6506e9761e56d960409a891124141f1ff5a15d0cd141c0dc81139c7d07380106d32a4c3d78cad0829883f6c1f520ec2808c721ff2e87b9bf626797864cc2bd4335360d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "67199ce6418d9555c9cfe6e4ba826631ea5379d4235d8113e9a364960d6c742e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e820f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001ad93e89cf70b750049d40bf4f5f5703784a5d5a60d7918cafb4415a98d9dc69dee763053753e06b715ebdd2bf303fd0791c77038ca967c886722fd5c76f65091139160af6525d206b6c8aea3f08d866ba4b0254d20b231f4f3eae6358fdfc94dbb43cf964e343f06614dc433770765b3bd75395f8d8759c1e79535686ee0aa06ef60f3735629bfdd883c4461496439d5aea53039970021213373e401bd16705c50e97b76c6532d8bf0fc04489d7ae2090b084cee663c1fd87cf57d40f9da1dd035236a8f76dc9c52aa5a2de290316b81f8bcb800861619f6dd87afb591b0c4748cada2ac5e756842f416cdfa2f3007807d23684d519da66012bc1d0ce4e3c0072098d2b30125ce4e9d47ce5d0f60fe5eee78c055fcd18c20f2e2297edbba101e029d7b377f17495ba5add607aed8a9dc371cd8e4cc37c5251c60bcaee255702029a1b1d19eb8d8169984e542c094d70da123f541fb7b7ba0c889329d25a71ddb801276e01f63bc894781f6ec339220c6165e7ace8f9439708071b55aec0fd55d1e5b2f9e55d4f601d26ec4e9f84cfa43a33ce4181f6404686fa528a3e2340eb853814ad755fdd49e25e8d18d142204d191b13ffb1d8c2b52476e40d05b9f4ff263a0fad81398fc019fab8a42ed89bfc74899ceacb0325253349b08ba183d3528e0d2d9d3f19737e437087aad219a4adda404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 0, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e820f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0c8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "df8c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "774e1ebb45b1c0e11bf01b23d0a2f1822a68e27345e3f5ff256e9253dad417ad" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37f626cd891b3b1ffe20bacaa5741a9b19676678c90abe6b88bd2e821d21c7211c061da7b45ff16d851eb4ef88cc3f89ecd56cc565ec94950085319139daef295682a34ee3b89f4b71ca6e8bf5930ff033b1771b890a81981bd862ff9eb352d2c7a7f98b8e30631d46d75eda32a07f681fa388813e1976784d821d2babaedcd760dba72a20438b47e581667aed24ff37a22eca51216da0b13cd6c9c7978189efda7293867a3a10cde89e65ac695e94983832b6143d62e4e1229aa7f5ea7853901c6046e04bf993f1b75c67623131ff658f43521e9a9f0eb93b2a26dbdf9654d6c6859ebb4f2ba4cece36f8bd4d93ad9fb5970a03cdeee9719af30cf68bd18cf728ad26a549be48bd7203945fb904d6aed93db7b5dead163e4ce99128251a44a6476921b916493511ee254c5c44bd0793bcd8bc37948a39bc02ee7a80168be082b46ccbeeadfaa954a31a899367aed48f364225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc79", + "9b1eb2c736f96b1335291e191ab00c80e550c1b959b141150218275087013144cac1655435b03aec8c6f8aa8c6798e052853e97b4dc3fff2cd7ad75fc07cd6471db842439560a70ce333a273d4da9b37b5276e90b6d9064bd2029fefa536a53d1d51e55b553ea3a4056d627a2e5b2ced984b1b63f1ddff1b75113a943bb4e4da12ba32779614365afdfd645a8b3fa517d35a5ca6e2202e9c699be20508d129015e4d60fbae27377187a09ee9d933ce0630a5686c066e2819861586d9876c961c1f97bf8466cbf7dda8442d7f7af37c3289712987fb6367798647ac591469905a345318abde99a7db7b9fee2a33d5938d48ad5d7fd0be8207c4220c7d2ab45fcbe9761e56d960409a891124141f1ff5a19cd1abd0ab3c1baab4297de51ccb6ae24c3d78cad0829883f6c1f520ec2808c74a2705d30935ba4c32be7225941b1dfe0d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc7940ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e820f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001ad93e89cf70b750049d40bf4f5f5703784a5d5a60d7918cafb4415a98d9dc69dee763053753e06b715ebdd2bf303fd0791c77038ca967c886722fd5c76f65091139160af6525d206b6c8aea3f08d866ba4b0254d20b231f4f3eae6358fdfc94dbb43cf964e343f06614dc433770765b3bd75395f8d8759c1e79535686ee0aa06ef60f3735629bfdd883c4461496439d5aea53039970021213373e401bd16705c50e97b76c6532d8bf0fc04489d7ae2090b084cee663c1fd87cf57d40f9da1dd035236a8f76dc9c52aa5a2de290316b81f8bcb800861619f6dd87afb591b0c4748cada2ac5e756842f416cdfa2f3007807d23684d519da66012bc1d0ce4e3c0072098d2b30125ce4e9d47ce5d0f60fe5eee78c055fcd18c20f2e2297edbba101e029d7b377f17495ba5add607aed8a9dc371cd8e4cc37c5251c60bcaee255702029a1b1d19eb8d8169984e542c094d70da123f541fb7b7ba0c889329d25a71ddb801276e01f63bc894781f6ec339220c6165e7ace8f9439708071b55aec0fd55d1e5b2f9e55d4f601d26ec4e9f84cfa43a33ce4181f6404686fa528a3e2340eb853814ad755fdd49e25e8d18d142204d191b13ffb1d8c2b52476e40d05b9f4ff263a0fad81398fc019fab8a42ed89bfc74899ceacb0325253349b08ba183d3528e0d2d9d3f19737e437087aad219a4adda404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 0, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e820f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0c8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "df8c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "774e1ebb45b1c0e11bf01b23d0a2f1822a68e27345e3f5ff256e9253dad417ad" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37f626cd891b3b1ffe20bacaa5741a9b19676678c90abe6b88bd2e821d21c7211c061da7b45ff16d851eb4ef88cc3f89ecd56cc565ec94950085319139daef295682a34ee3b89f4b71ca6e8bf5930ff033b1771b890a81981bd862ff9eb352d2c7a7f98b8e30631d46d75eda32a07f681fa388813e1976784d821d2babaedcd760dba72a20438b47e581667aed24ff37a22eca51216da0b13cd6c9c7978189efda7293867a3a10cde89e65ac695e94983832b6143d62e4e1229aa7f5ea7853901c6046e04bf993f1b75c67623131ff658f43521e9a9f0eb93b2a26dbdf9654d6c6859ebb4f2ba4cece36f8bd4d93ad9fb5970a03cdeee9719af30cf68bd18cf728ad26a549be48bd7203945fb904d6aed93db7b5dead163e4ce99128251a44a6476921b916493511ee254c5c44bd0793bcd8bc37948a39bc02ee7a80168be082b46ccbeeadfaa954a31a899367aed48f364225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc79", + "9b1eb2c736f96b1335291e191ab00c80e550c1b959b141150218275087013144cac1655435b03aec8c6f8aa8c6798e052853e97b4dc3fff2cd7ad75fc07cd6471db842439560a70ce333a273d4da9b37b5276e90b6d9064bd2029fefa536a53d1d51e55b553ea3a4056d627a2e5b2ced984b1b63f1ddff1b75113a943bb4e4da12ba32779614365afdfd645a8b3fa517d35a5ca6e2202e9c699be20508d129015e4d60fbae27377187a09ee9d933ce0630a5686c066e2819861586d9876c961c1f97bf8466cbf7dda8442d7f7af37c3289712987fb6367798647ac591469905a345318abde99a7db7b9fee2a33d5938d48ad5d7fd0be8207c4220c7d2ab45fcbe9761e56d960409a891124141f1ff5a19cd1abd0ab3c1baab4297de51ccb6ae24c3d78cad0829883f6c1f520ec2808c74a2705d30935ba4c32be7225941b1dfe0d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc7940ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e720f2d625ee3cabce61d583c8c4054e83e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a92228f3ccf7a882871c5980e660230bac0d8dea0fc22f19353fb54c7e29323ed695a9287c7f97fa5d28f831c0644eee64859883b45bcb72cde0f94bf15e4f1a0ca010d171f73ac7729747974c545d7e8424eae6e64080a799fcf6cf3887a52c66fe9ef132718818e5db2daf9e68d2ec01bdffc16380204204b42692a36fed01cfa2fbcf7ec15347c1181ad8928e8cd7e8d8ab83b31f0c7462a13e62fa3f57e89ded227e903176d2d86969a88ac3e0a0a86506a1ad970838c0190ca339e71bdc639a7507812dcc08b75df9c660d872476272e22a5484f52c4118fbcf097916d4f84d013b22419c79894a19f858ce82b8ad23684d519da66012bc1d0ce4e3c007250a925c3b398acc500f80b12f064b8ac7111811ea8875d2b8f689cbeb2ea47d1a7e026277d5b8186e60ab01d18867f5646eb099d272863ab3e2b0bf77fd8197209301af81e78f55cdb64c5f74bdfffab1bf3f9825ed2cfe226722037cff31fce477a7752b267376d1349d700c30a39dc205c45ca9ab72f07512c420a790a2523e1927423d3d4297a982fe829f22a741690978cde35539052077ee42951b271c168d83cf9c0f8b474e8b6c2d16d90639f4647637e6313302028ac17e1b7242064539e0401957cc5b8297ce6f1cd2a901eed39492f1c3772dc0f9cca0a074e2c875337b452dcb03bda1c52eaef80bcf957404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 1, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e720f2d625ee3cabce61d583c8c4054e", + "83e8487025764348020264792b3d100f", + "0c8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "df8c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "53fdf4849decb971572e581c89b1ddf6dedbb87edb4e6b5d9370a01cf699f6cc" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37f27956e1c8eb8563e3aa9b40b4cb8a9ecae6456b732d066ab74d4f2da6dcaa2490bd8efabe604227964f93c7fda2018491ecf8c374260a2e8b02d42945d9a04dfb687ce23c5997481d638953ded113f6f1771b890a81981bd862ff9eb352d2c7a18671782ba5244a37a2d39459a4d569a388813e1976784d821d2babaedcd760dd5204e80577d20d34168d5c01313bceaeca51216da0b13cd6c9c7978189efda703eec10fa13a87a27255b92840afa37f2b6143d62e4e1229aa7f5ea7853901c661f14c6b32c050fefec7b32f27a2ceaa3521e9a9f0eb93b2a26dbdf9654d6c68e1293ae4a208fe272e7336755020396670a03cdeee9719af30cf68bd18cf728a9df3e85a22c27adf964ed51d038dc106db7b5dead163e4ce99128251a44a647610d1d4b9eb8091d09bc6fe90de2083138bc37948a39bc02ee7a80168be082b46868174607af7260d5656f7ff5993fa45a4861a1383ebd01daf71ae010ddf00beba2bdbdb6cd3ebb6f6204d65ce9ea173", + "9b1eb2c736f96b1335291e191ab00c80c5ba06833acc5108c3681f3504109c34cac1655435b03aec8c6f8aa8c6798e052bf97a5a52e23df7718591b64d320aa41db842439560a70ce333a273d4da9b3729d48da87a344ae6a1b2c90be9236a091d51e55b553ea3a4056d627a2e5b2cedfe7cbcc43dbc8fe68bd1a479a85c103b12ba32779614365afdfd645a8b3fa517b9acb02ac3578c21229abb1744b1e8385e4d60fbae27377187a09ee9d933ce0656ef0d0007407f00fa1a9346310776201f97bf8466cbf7dda8442d7f7af37c322ceee0da62e331f04df61b3d0cbd1aa4345318abde99a7db7b9fee2a33d5938dc06ed88de80271c3053baae1146d22bfe9761e56d960409a891124141f1ff5a1d04817116e0678eb7220a35867a8966f4c3d78cad0829883f6c1f520ec2808c7cb71c17db105475e07bd38e08574d5b70d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "a4861a1383ebd01daf71ae010ddf00beba2bdbdb6cd3ebb6f6204d65ce9ea17340ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e720f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0d8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001a9f4d10c3a0130028e99c355bc4da57b4fa22195bda8151b0ae8901ceb458c28964b2d2d19d109d8c1c2a03dd251e4a2c48312ae66e609e3a8f4cc40d84d7f928a3f0ace6fc07e05ab17c01b9fa7906249d3c0d59e05cd71d020c7263100c4d3ece5cd1d7deb7255413ce7a2e20eb514ef6ee6a3af1bd50aece20562b0a1bf5f9f6d0801166978bbd9d6d17b9925cf7bf53a7385370f960daad1dafd4931eaa5b43ff628a3ae52b4e38067b0d1317954381a9fd9cd1581296425be048e507f51bc1febf332f32d8d3d0d77802b9de5e77963081199c99952dc46ca4e7f92c3986f64902d7dfd243dd388dfc44c95ce461d23684d519da66012bc1d0ce4e3c0072437ea43ce2ff34c688206fc5918c90b236c74664ca28fd0e50daefb7e025a934ab88e6dca644649fb870305df8ab2311461368f2fd837c9d8deedaa811e511ea2f417a2841e3c1796f5c3db316abd070bf049b98e27d023ee0351bc747622556e706968efac792a7792d37cc89ad154e464cd7a6e1fbe278b14d5509a5ed0046e6f1af095a53d238f0427efa87b64ad5ca7a0cc7f649f7be83731b85608946ef03ac01588a2af6533647e24c07b8d8654aeecffb6a2ba11603e101cc708ee80ecb4695457826ae70ce830a5622d3551d7e37eabac8ec2e735dbee213a5b26050e1bdc52d21f7be9578668d3044484180404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 2, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e720f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0d8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "df8c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "baa2841ddb7c9165f4a782633dd7e92b49dd1b3442de0069c780f74a63cb53e6" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37f27eba1c272bf7ca7ab0768e3d1f75404ae6456b732d066ab74d4f2da6dcaa2494b444ff6c14e6773609eabc32282d9d456cc565ec94950085319139daef29568e2fa6699702a0d3aa4018d71a3c28b9cdf73ee692130d39de44328e3e4d49af0a5bd4b6f62bb3357eacc129f8e358c99388813e1976784d821d2babaedcd760d02a6fce712900190c3b95ccee4938267eca51216da0b13cd6c9c7978189efda79f847e987c4b6a31778cd1466a2967e22b6143d62e4e1229aa7f5ea7853901c6d542b0d5ab0fd6de397ae38bf935dd3b3521e9a9f0eb93b2a26dbdf9654d6c68562725cf6aeea09fed87fe61ed35d8d570a03cdeee9719af30cf68bd18cf728ad989db144725a3b8b81f6c7f12c1af0bdb7b5dead163e4ce99128251a44a6476b4a46cee9fd105411657e6dd313dc90a8bc37948a39bc02ee7a80168be082b4667085e83d49c770521af5a4baff811b9fa66d5dbb62e46d22ecd373679b0025334b8c93cb5aca96774a571d0601ab77d", + "9b1eb2c736f96b1335291e191ab00c80c464d3dc55c52b9f6d0a6c5d7ed0f01ccac1655435b03aec8c6f8aa8c6798e053ee915cb8a8b70d1582b242961f39b401db842439560a70ce333a273d4da9b37dc5fc812448a68f27bf39ef221b32b8c1d51e55b553ea3a4056d627a2e5b2ced712688d79553a0321c32cb1fb474da3b12ba32779614365afdfd645a8b3fa5178c2702c30745ab64a048340a733022bc5e4d60fbae27377187a09ee9d933ce06bb5851772b2f9c71d9e37a28078db2bd1f97bf8466cbf7dda8442d7f7af37c32b79c7d70e993ac0f2f44ece039290c13345318abde99a7db7b9fee2a33d5938d4b71eda2201dce4b4626e2f47757834fe9761e56d960409a891124141f1ff5a194b2245749a34f12514f0cf75774a86a4c3d78cad0829883f6c1f520ec2808c7279e2949fdb4d2ed8c2c519332588fc00d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "fa66d5dbb62e46d22ecd373679b0025334b8c93cb5aca96774a571d0601ab77d40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e820f2d625ee3cabce61d583c8c4054e82e8487025764348020264792b3d100f0c8c76f65caf04ee0e22373be0d61ac5fa6e2f2866078b31b90537e24416fad12aa44b74bb71c2548b15f78fb0d8a3086fac2e4faa9a82029b9d39b72ec7a5a4869eba63651472a34e9ac8faae3984215d731a67081c36c4ff2a7130e611df5ebb57ffcc3c44370131c88e16f74ad73ec6a27c9c6c632820ba2ced4b0061bac183c43194cb8dd492735c763e54b8db10143d28498127fcc54acce837c1d7f0955c852ea368195f3a075cff32745e4c36c68a06c8e5f6692f7668fc0688ee7b2fcd1be9e341e8eb5fb5b976d4058a686f56a1ed418b617499bd004287334052b4b479ae311ef97b5fbdf7c285dbbd0261234503e68f2902b94115adfcd6639945c28b47c7ad2575473a55ff0d299326b7e6f80364a4449715a002f0b0a84952fda92ed45cfe7bbd2cd7ba34a5ce1851268c2a8852c64e0abd11500fe8c87c1bf3d5e8a41b2794a64e56c44655aa8aa1371984ca99584500a1b6d769b2d74409a3c5718952c1bfb854e7a85c2a198afea15227b1172005f3b1b682767ef22a3a3b1c6251cb9c4527426a4e48171c6cadf645573fefda9aed7e3548849f846481a6ecac7d36be0e38ef28f6ae28909d229d556a44cdbb4fa61bdb8f627c062b161bc679640feee4c3d7584d20a6eb475f6635680f4a6321ed9c0031f0523632dba72c349963f6f0a58f982b347d76388501f6f0c16440230782fbb68c3605e94e1be01d6a321a353eeda86bbc36b2b898983cb994f99ebfd6d28a0c716e1a4710f13fad98148a00b7faf3c48c49cfbdb40fbffe0b3167d2e01c8f227a0631843a94eff15a613db675eeff55e451c37498faa4cf50c7cf5b51ff9e09715da14773e03a66869191058c64353056836665327b74321e0a1191bf4f400d5e315548da7108e40f80bea56f282d0d338e61449e9e66b0d7b25e0735987966a4a7d1d1d09234b74fed0bbf6fc996ad703dbf95cbc848d4d646f2cdc06fd956eb87de7fb213431206b92387190aff870f4259a840de9fd788a97451affebb1d2b65143c6107d7a8e35b7a63905c9e16071d38ab652451e4c156fe074362bfe672079ee42e2a264224d4c3090ae182088617fe2a87d493f6ebd36672456b3014d4c1bcafc105ec77f9bedf1a62a7a82ef70396c5f767dbd98873567275fac01a901016f214a2768a06e71ae20736fb5f974a8efe8760f4dc7e87f8223b451658ca0ef1ffa0052637d542f00af9813a344a82ab7008423f2be235dff4d6e37b055f8f5b78fe51a994bfacdcbae1faabe006ac32a9ccf69d1e1d721fae8055c3f58392bd8200edd08cde43b01a6fe803f496d8beb595ef1a121ed89f5cce5fb7f116c7bcfa1842bd64fffe2ee5e89610d6e5fc6ff7b2e60c409a6a7bc15045a728a079c9d453682fa0907b916e3188ddae01baefa5521cc966c6b9585fb4e68402792fc93e73b969f7e63743d20c2fd91bfcb938f342c2985b8e1a19c25b7a2f002b236230dbcebfae1a7b7d0940a193a5dec0edf39370fa58d7ae88ed2afa51b60f2e709218149309753919e224d11b4804e1caf0254ccee0a777b606f35aeb118319840197661afecb632982d79bd6ed52b743dfb0ef62eecd1b7f94381c1acaaa007be45bd0b7dec4325cc318b948c7302c5aad28d2e4f8579ff92cfcc3c3a18f29386fc66ae0b0b3990121c1aee83746f1a55a4aed489fec02985c24cad582ebec7ba6c44d2bf2c3e83071329ade2191d73b449ae87b408fead07c01593eae70c786f039d8abf4a366e8e5571d0ebb06b7cc707a2ec5306e3f76e97fab3a6c6dd975e74348b8d4995868712714e3d10b74902a9d0cd13b6b91b4347dc5af4d60ddea0e76bdf4fd9815cd504434c9981d28bcf1bb22ae66815774d4f003537d951a24a12c0ae48218c6d31e954fe20f4334e0495d474950504fc9635cf5715c8efa06f93a8167bc4607ebcc6e850c6aced635935b2f354a4d2eff9c71cdd39798dffe596115d89e901a43e0fabffd3f554f066c8212add01fa47f79033aa175f4f8033057c4f481381f3db1b5d9b2fd72e27aaecd2a6568e5a724e4a699e89c287162eb44bbf35efa71772f4fbb2650bd93ae4aa3a53192069c0734b4e9742e52955c819090f3106af780bdd564036ddda405fe0a9e9540e5787b7a3fde839f2375e091e63da54d6036c1bc50bf16efd6d198a0ff7ddf8c6d791d85ed885a53ecdee10ce40dd878d8b7b93954e80a0a008ae08698e74409c646c5089bf508d7b32589a4442c84c94b77dd83e10d4cbdcb0a8e9084ba58812ef6c40e078587f3c82140facd7e4a942a967e09580a4969fe4ff18a3c0156538253cf7271ee1be187ac03023eeb037d6b09093308cd5d6ebfccf11f43f9a9963431d1745088180bcd4d59e2bcb9241f4e73c5d72d390b47511a90b3e07f49dae42a11096070f11692f20f77c53b6067dba2171d959b5a2275debdd1a9c7a010efeb75b84ba5a7660b401376022d56817e423ccc9db1bc6b1d2b956782349d7c500986d7f0654e8fe3643715b99ec7334da180d4c011dcf727b2e0bacab1df94afd33a4b8f7bb66cda5811ea1500a00b158d660483287bc26bc04d01ae548ec804478df047de419cbfec2bde1051e1b50b8df92be4909a300094555983dcacf615ca79f394923721f1d9c3bf001ad93e89cf70b750049d40bf4f5f5703784a5d5a60d7918cafb4415a98d9dc69dee763053753e06b715ebdd2bf303fd0791c77038ca967c886722fd5c76f65091139160af6525d206b6c8aea3f08d866ba4b0254d20b231f4f3eae6358fdfc94dbb43cf964e343f06614dc433770765b3bd75395f8d8759c1e79535686ee0aa06ef60f3735629bfdd883c4461496439d5aea53039970021213373e401bd16705c50e97b76c6532d8bf0fc04489d7ae2090b084cee663c1fd87cf57d40f9da1dd035236a8f76dc9c52aa5a2de290316b81f8bcb800861619f6dd87afb591b0c4748cada2ac5e756842f416cdfa2f3007807d23684d519da66012bc1d0ce4e3c0072098d2b30125ce4e9d47ce5d0f60fe5eee78c055fcd18c20f2e2297edbba101e029d7b377f17495ba5add607aed8a9dc371cd8e4cc37c5251c60bcaee255702029a1b1d19eb8d8169984e542c094d70da123f541fb7b7ba0c889329d25a71ddb801276e01f63bc894781f6ec339220c6165e7ace8f9439708071b55aec0fd55d1e5b2f9e55d4f601d26ec4e9f84cfa43a33ce4181f6404686fa528a3e2340eb853814ad755fdd49e25e8d18d142204d191b13ffb1d8c2b52476e40d05b9f4ff263a0fad81398fc019fab8a42ed89bfc74899ceacb0325253349b08ba183d3528e0d2d9d3f19737e437087aad219a4adda404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 0, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e820f2d625ee3cabce61d583c8c4054e", + "82e8487025764348020264792b3d100f", + "0c8c76f65caf04ee0e22373be0d61ac5", + "fa6e2f2866078b31b90537e24416fad1", + "2aa44b74bb71c2548b15f78fb0d8a308", + "6fac2e4faa9a82029b9d39b72ec7a5a4", + "869eba63651472a34e9ac8faae398421", + "5d731a67081c36c4ff2a7130e611df5e", + "bb57ffcc3c44370131c88e16f74ad73e", + "c6a27c9c6c632820ba2ced4b0061bac1", + "83c43194cb8dd492735c763e54b8db10", + "143d28498127fcc54acce837c1d7f095", + "5c852ea368195f3a075cff32745e4c36", + "c68a06c8e5f6692f7668fc0688ee7b2f", + "cd1be9e341e8eb5fb5b976d4058a686f", + "56a1ed418b617499bd004287334052b4", + "b479ae311ef97b5fbdf7c285dbbd0261", + "234503e68f2902b94115adfcd6639945", + "c28b47c7ad2575473a55ff0d299326b7", + "e6f80364a4449715a002f0b0a84952fd", + "a92ed45cfe7bbd2cd7ba34a5ce185126", + "8c2a8852c64e0abd11500fe8c87c1bf3", + "d5e8a41b2794a64e56c44655aa8aa137", + "1984ca99584500a1b6d769b2d74409a3", + "c5718952c1bfb854e7a85c2a198afea1", + "5227b1172005f3b1b682767ef22a3a3b", + "1c6251cb9c4527426a4e48171c6cadf6", + "45573fefda9aed7e3548849f846481a6", + "ecac7d36be0e38ef28f6ae28909d229d", + "556a44cdbb4fa61bdb8f627c062b161b", + "c679640feee4c3d7584d20a6eb475f66", + "35680f4a6321ed9c0031f0523632dba7", + "2c349963f6f0a58f982b347d76388501", + "f6f0c16440230782fbb68c3605e94e1b", + "e01d6a321a353eeda86bbc36b2b89898", + "3cb994f99ebfd6d28a0c716e1a4710f1", + "3fad98148a00b7faf3c48c49cfbdb40f", + "bffe0b3167d2e01c8f227a0631843a94", + "eff15a613db675eeff55e451c37498fa", + "a4cf50c7cf5b51ff9e09715da14773e0", + "3a66869191058c64353056836665327b", + "74321e0a1191bf4f400d5e315548da71", + "08e40f80bea56f282d0d338e61449e9e", + "66b0d7b25e0735987966a4a7d1d1d092", + "34b74fed0bbf6fc996ad703dbf95cbc8", + "48d4d646f2cdc06fd956eb87de7fb213", + "431206b92387190aff870f4259a840de", + "9fd788a97451affebb1d2b65143c6107", + "d7a8e35b7a63905c9e16071d38ab6524", + "51e4c156fe074362bfe672079ee42e2a", + "264224d4c3090ae182088617fe2a87d4", + "93f6ebd36672456b3014d4c1bcafc105", + "ec77f9bedf1a62a7a82ef70396c5f767", + "dbd98873567275fac01a901016f214a2", + "768a06e71ae20736fb5f974a8efe8760", + "f4dc7e87f8223b451658ca0ef1ffa005", + "2637d542f00af9813a344a82ab700842", + "3f2be235dff4d6e37b055f8f5b78fe51", + "a994bfacdcbae1faabe006ac32a9ccf6", + "9d1e1d721fae8055c3f58392bd8200ed", + "d08cde43b01a6fe803f496d8beb595ef", + "1a121ed89f5cce5fb7f116c7bcfa1842", + "bd64fffe2ee5e89610d6e5fc6ff7b2e6", + "0c409a6a7bc15045a728a079c9d45368", + "2fa0907b916e3188ddae01baefa5521c", + "c966c6b9585fb4e68402792fc93e73b9", + "69f7e63743d20c2fd91bfcb938f342c2", + "985b8e1a19c25b7a2f002b236230dbce", + "bfae1a7b7d0940a193a5dec0edf39370", + "fa58d7ae88ed2afa51b60f2e70921814", + "9309753919e224d11b4804e1caf0254c", + "cee0a777b606f35aeb11831984019766", + "1afecb632982d79bd6ed52b743dfb0ef", + "62eecd1b7f94381c1acaaa007be45bd0", + "b7dec4325cc318b948c7302c5aad28d2", + "e4f8579ff92cfcc3c3a18f29386fc66a", + "e0b0b3990121c1aee83746f1a55a4aed", + "489fec02985c24cad582ebec7ba6c44d", + "2bf2c3e83071329ade2191d73b449ae8", + "7b408fead07c01593eae70c786f039d8", + "abf4a366e8e5571d0ebb06b7cc707a2e", + "c5306e3f76e97fab3a6c6dd975e74348", + "b8d4995868712714e3d10b74902a9d0c", + "d13b6b91b4347dc5af4d60ddea0e76bd", + "f4fd9815cd504434c9981d28bcf1bb22", + "ae66815774d4f003537d951a24a12c0a", + "e48218c6d31e954fe20f4334e0495d47", + "4950504fc9635cf5715c8efa06f93a81", + "67bc4607ebcc6e850c6aced635935b2f", + "354a4d2eff9c71cdd39798dffe596115", + "d89e901a43e0fabffd3f554f066c8212", + "add01fa47f79033aa175f4f8033057c4", + "f481381f3db1b5d9b2fd72e27aaecd2a", + "6568e5a724e4a699e89c287162eb44bb", + "f35efa71772f4fbb2650bd93ae4aa3a5", + "3192069c0734b4e9742e52955c819090", + "f3106af780bdd564036ddda405fe0a9e", + "9540e5787b7a3fde839f2375e091e63d", + "a54d6036c1bc50bf16efd6d198a0ff7d", + "df8c6d791d85ed885a53ecdee10ce40d" + ], + [ + "1adf0d29da11c354159e2a7c373bfab1", + "7f17b78fda89bcb7e1fd9b86d4c2eff0", + "f5738909a350fb11d5ddc8c41f29e53a", + "0791d0d799f874ce2afac81dbbe9052e", + "d75bb48b448e3dab58ea08704f275cf7", + "9253d1b055657dfd4862c648d1385a5b", + "7b61459c9aeb8d5c9565370551c67bde", + "a48ce598f7e3c93be4d48ecf19ee20a1", + "46a80033c3bbc8feb23771e908b528c1", + "3b5d8363939cd7df29d312b4ff9e453e", + "7e3bce6b34722b6d70a389c1ab4724ef", + "edc2d7b67ed8033a993317c83e280f6a", + "a57ad15c97e6a0c5dca300cd8ba1b3c9", + "3b75f9371a0996d06d9703f9771184d0", + "34e4161cbe1714a02e46892bfa759790", + "ab5e12be749e8b6626ffbd78ccbfad4b", + "4d8651cee10684a026083d7a2442fd9e", + "debafc1970d6fd46a2ea5203299c66ba", + "3f74b83852da8ab8a9aa00f2d66cd948", + "1b07fc9b5bbb68ea43fd0f4f57b6ad02", + "58d12ba3018442d30c45cb5a31e7aed9", + "75d577ad39b1f542d2aff0173783e40c", + "2c175be4d86b59b18d3bb9aa55755ec8", + "e87b3566a7baff5e2d28964d28bbf65c", + "3c8e76ad3e4047abfc56a3d5e675015e", + "afd84ee8dffa0c4e2d7d89810dd5c5c4", + "e59dae3463bad8bd79b1b7e8e3935209", + "bca8c01025651281aeb77b607b9b7e59", + "155382c941f1c710bb0951d76f62dd62", + "ac95bb3244b059e408709d83f9d4e9e4", + "3b869bf0111b3c288bb2df5914b8a099", + "cc97f0b59cde1263e3ce0fadc9cd2458", + "d5cb669c090f5a704bd4cb8289c77afe", + "0b0f3e9bbfdcf87de84873c9fa16b1e4", + "21e295cde5cac1123b9443c94d476767", + "c5466b066140292d59f38e91e5b8ef0e", + "c25267eb75ff4805f03a73b630424bf0", + "4201f4ce982d1fe354dd85f9ce7bc56b", + "120ea59ec2498a11e4a91bae3c8b6705", + "5d30af3830a4ae0045f68ea25eb88c1f", + "c799796e6efa739baecfa97c999acd84", + "8dcde1f5ee6e40b0a3f2a1ceaab7258e", + "f91bf07f415a90d7b6f2cc719ebb6161", + "9b4f284da1f8ca676a995b582e2e2f6d", + "cd48b012f44090364d528fc2406a3437", + "b92b29b90d323f900aa9147821804dec", + "beedf946dc78e6f5e477f0bda657bf21", + "622877568bae500128e2d49aebc39ef8", + "2a571ca4859c6fa345e9f8e2c7549adb", + "b01b3ea901f8bc9d24198df8611bd1d5", + "dbbddb2b3cf6f51e61f779e801d5782b", + "6e09142c998dba94b3eb2b3e43503efa", + "1588064120e59d583bd108fc693a0898", + "2626778ca98d8a0523e56fefe90deb5d", + "8b75f918e51df8c9e89f68b57101789f", + "0d23817807ddc4bacda735f10e005ffa", + "dbc82abd0ff5067ea9cbb57d548ff7bd", + "c2d41dca200b291c68faa070a48701ae", + "586b405323451e05381ff953cd563309", + "64e1e28de0517faa200a7c6d427dff12", + "317321bc4fe59017e00b6927414a6a10", + "e7ede12760a331a02c0ee9384305e7bd", + "449b0001d11a1769d3291a0390084d19", + "f5bf6595843eafba3cd75f86362bac97", + "d25f6f846e91ce770651fe45105aade3", + "38993946a7a04b195ffd86d036c18c46", + "980819c8bc2df3d00ae40346c70cbd3d", + "69a471e5e63da485b4ffd4dc9dcf2431", + "4251e58482f6bf5e505a213f120c6c8f", + "07a728517712d5059249f0d18f6de7eb", + "6ef68ac6e61ddb2ec8b7fb1e350fdab3", + "331f588849f90ca5f8ed7ce67bfe6899", + "e701349cd67d28640d12ad48bc204f10", + "9f1132e4806bc7e3c93555ff841ba42f", + "4a213bcda33ce7469b38cfd3a552d72d", + "1d07a86006d3033c205e70d6c7903995", + "214f4c66fede3e51fbc7b90e5aa5b512", + "b96013fd67a3db350e7d141384593bb2", + "d60d3c17cf8ecd6505de6e28c4bb6517", + "86bf70152f83fea6a5518f38790fc627", + "560b5c99171aa8e2d544f948338f85d1", + "3ccf91c089168054a99392268a18bcb7", + "492b66a7978ed8eb002ef48b6fd562f3", + "30c4946e4bcb823a34b29f2215f18942", + "0d0267ea32afbbcb1a67e2d7430e44dd", + "53997ea88b2b0ffc90826ae5db5ed3f5", + "1d7de7392ce16ab001f0bccb1fb6a2b8", + "b8afafb0369ca30a72a37105f906c57e", + "9a43b9f81433917ad7953129ca6ca4d0", + "ccb5b2d100638e321068672001a69eea", + "29616fe5bc1f0540e6bfaab0f9937ded", + "542fe05b8086fcc5428a0b07fccfa83b", + "0d7ec7e0c24e4a2631028d1d855132d5", + "9c971a58db1b5966fb62d78e9d14bb44", + "0ea1058e88d0b044bdaf426c51b55c5a", + "d06df963f8cb4b166fd1ad6aa37e6f6f", + "0eef95087f422a9be092225bfa01f561", + "6cbf1a878485c0216060dc8a1f6e19c2", + "5cb29fc93e43af40cd10292e675f0082", + "22739286e27a127789ac13211ef31bf2" + ] + ], + "prep_messages": [ + "774e1ebb45b1c0e11bf01b23d0a2f1822a68e27345e3f5ff256e9253dad417ad" + ], + "prep_shares": [ + [ + "66e14d38c90694ecaed6e1e6e54ff37f626cd891b3b1ffe20bacaa5741a9b19676678c90abe6b88bd2e821d21c7211c061da7b45ff16d851eb4ef88cc3f89ecd56cc565ec94950085319139daef295682a34ee3b89f4b71ca6e8bf5930ff033b1771b890a81981bd862ff9eb352d2c7a7f98b8e30631d46d75eda32a07f681fa388813e1976784d821d2babaedcd760dba72a20438b47e581667aed24ff37a22eca51216da0b13cd6c9c7978189efda7293867a3a10cde89e65ac695e94983832b6143d62e4e1229aa7f5ea7853901c6046e04bf993f1b75c67623131ff658f43521e9a9f0eb93b2a26dbdf9654d6c6859ebb4f2ba4cece36f8bd4d93ad9fb5970a03cdeee9719af30cf68bd18cf728ad26a549be48bd7203945fb904d6aed93db7b5dead163e4ce99128251a44a6476921b916493511ee254c5c44bd0793bcd8bc37948a39bc02ee7a80168be082b46ccbeeadfaa954a31a899367aed48f364225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc79", + "9b1eb2c736f96b1335291e191ab00c80e550c1b959b141150218275087013144cac1655435b03aec8c6f8aa8c6798e052853e97b4dc3fff2cd7ad75fc07cd6471db842439560a70ce333a273d4da9b37b5276e90b6d9064bd2029fefa536a53d1d51e55b553ea3a4056d627a2e5b2ced984b1b63f1ddff1b75113a943bb4e4da12ba32779614365afdfd645a8b3fa517d35a5ca6e2202e9c699be20508d129015e4d60fbae27377187a09ee9d933ce0630a5686c066e2819861586d9876c961c1f97bf8466cbf7dda8442d7f7af37c3289712987fb6367798647ac591469905a345318abde99a7db7b9fee2a33d5938d48ad5d7fd0be8207c4220c7d2ab45fcbe9761e56d960409a891124141f1ff5a19cd1abd0ab3c1baab4297de51ccb6ae24c3d78cad0829883f6c1f520ec2808c74a2705d30935ba4c32be7225941b1dfe0d61f8fc19a8f4829a1853b60eba481c3177450712ccb1da331bd9ad3fd98d3e40ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18" + ] + ], + "public_share": "225526ab0a748466845abda64883baf691a577e092b36c8178a3e3c4f7fecc7940ae4be243e624b1ffde96162c2fa48392128bd79d2861098ffc5ab20af7ec18", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3MultihotCountVec_0.json b/vdaf/prio3/testdata/Prio3MultihotCountVec_0.json new file mode 100644 index 000000000..8fdb1baa2 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3MultihotCountVec_0.json @@ -0,0 +1,59 @@ +{ + "agg_param": "", + "agg_result": [ + 0, + 1, + 1, + 0 + ], + "agg_shares": [ + "e2bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb3", + "1f448be65753695e1d210e41287234f8bda85078dc9bbdc9a95b641b02cae4ee4cb4121def41aa4d90355df5f08a8fc1d8a55cd6329af47d86c2bb6d2b92d04c" + ], + "chunk_length": 2, + "ctx": "736f6d65206170706c69636174696f6e", + "length": 4, + "max_weight": 2, + "prep": [ + { + "input_shares": [ + "e2bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb362d5c7a84cb3dc77420ae9fb319a83b91a5ed94b3fee03d209e78f1b2561041a66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cffdd56552a27dab37d3921be5ad85e990d6182143dd4b359053d6b41b58a260a36444c50596526e58032cf8d75335a776d8e856f751d5b9972dcb6d5e9df41e1a13612efca2bf4dc3a35d88e64bde741e93d680d9a3e0261d17a21ccdee91bde85440901071218a3ab71661cef25d4275b17fdfedfdd8a9e6e48a0ebcb73f8fec09f6945689cb0a789221792d689e2ab2404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + false, + true, + true, + false + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e2bb7419a8ac96a1c6def1bed78dcb07", + "4557af87236442363aa49be4fd351b11", + "b64bede210be55b253caa20a0f75703e", + "295aa329cd650b825d3d4492d46d2fb3" + ], + [ + "1f448be65753695e1d210e41287234f8", + "bda85078dc9bbdc9a95b641b02cae4ee", + "4cb4121def41aa4d90355df5f08a8fc1", + "d8a55cd6329af47d86c2bb6d2b92d04c" + ] + ], + "prep_messages": [ + "407dd84e19e24c5dd58e2a735bade1c3feaa768f055f553e0767e8f8066ddc8b" + ], + "prep_shares": [ + [ + "0c82e0cc5f690b9caafa428dd6d85ec0cb91386cb2e980e5475e84dc83a874724d0ec28fc8583fcd3d2049ed82fe4cb49b774302bf9e3f22840fdcae9eda08edf34af1e39cf607549e72d9603c9064bd1ce6bcc5c3cff0cd2404afaa25d39fbef626f32389f3abd8f1007f22683246938f85d46fdcf067e79c9b6b088a0c70ba", + "f57d1f33a096f4633905bd722927a13f27c3d26278454e1a5238c31d07b79cfb65698f64c871fc3ae4f3ec5c948d0436d2d857e9751199e9364d6f9097174bf6f551d066f30ae33ed61f9b4bed3609d6fd20479675bf4583e46fa4df4e93182f5728b4e324470bb29993bf18e20714421c8e06f4c0622e3641eb50f24fed1117" + ] + ], + "public_share": "f626f32389f3abd8f1007f22683246938f85d46fdcf067e79c9b6b088a0c70ba5728b4e324470bb29993bf18e20714421c8e06f4c0622e3641eb50f24fed1117", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3MultihotCountVec_1.json b/vdaf/prio3/testdata/Prio3MultihotCountVec_1.json new file mode 100644 index 000000000..127c76377 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3MultihotCountVec_1.json @@ -0,0 +1,113 @@ +{ + "agg_param": "", + "agg_result": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "agg_shares": [ + "781bcdf49ab6cc3905ddc9468ba3770da93b52b6850a6d98fda820b899e3b66db99c81ef1b1c865cb5efd83a31c2f04aece94430b7ca762c1d136c4b324ccb133c414a50f7c6842f5ace7c4e063a40a143d8d7d2a451a3a38efe662c928909bb51615b73d0634675c28073fe8bbc903ed3aafb155bc2662a9f3a62e83641da00da4853618f6664e1553c949cc5b836685f02f3396816e79747e3be5fbc28e193", + "1f448be65753695e1d210e41287234f8bda85078dc9bbdc9a95b641b02cae4ee4cb4121def41aa4d90355df5f08a8fc1d8a55cd6329af47d86c2bb6d2b92d04ca02a3857b34c2388a1f51604ce657c46e8a126b4c011fc2dda1870e4da9efbe54ecaad63670383735c9147d029a5ce03f744adcd817d8b8193701eb0e5205a85c5dfa58103daa2c7b771ceea8337b2214082f4c93b0bc641415917797dbc38e2", + "ff2f6b009697e49299e90da15ae5290a2942cae56bd275a2d8f03559a786b6f201695f5dc2ffc6494de65a25135f6dad9a94d87862672aa862450f061067d3abda47a8cbb895558b4ffc871bb1abe7f6d68d52c7927b3f5462d4c91b100a4acbb29c41730607fea082660c46ca6921ca52dc64d21f01a65da0e10e20647d07d56487f50aac1a09052234e204a03d30561d8abcc6d4e4b3d6c801b5b1a584553c", + "6c703c24775ee5d40b181ad7f1042af075d992eb31875ffb2b0a45d3bccbadb0fc450c9632a2080c35f46eaaca531246a4db8580b3336aadc1e4c84092ba90f34c4cd58c9c5602bd7c3fe4917ab45b2102f8aeb1072121dae0135fd382cdb093b137b5b5c1913876268738eb7f347ff3e633f24903bf67f6f47270477f20c4a4fe4f1112c1a4ef51b41dbb7316d2e61f47f15b3587f99e4f76c174752096904d" + ], + "chunk_length": 3, + "ctx": "736f6d65206170706c69636174696f6e", + "length": 10, + "max_weight": 2, + "prep": [ + { + "input_shares": [ + "781bcdf49ab6cc3905ddc9468ba3770da93b52b6850a6d98fda820b899e3b66db99c81ef1b1c865cb5efd83a31c2f04aece94430b7ca762c1d136c4b324ccb133c414a50f7c6842f5ace7c4e063a40a143d8d7d2a451a3a38efe662c928909bb51615b73d0634675c28073fe8bbc903ed3aafb155bc2662a9f3a62e83641da00da4853618f6664e1553c949cc5b836685f02f3396816e79747e3be5fbc28e193d6ef25e6111cbe64d8aa9bb7d1e45d4018d4e09983efb42009e731d7876edd0fb51db5d367cba65352cd4e8a467599c00ffffc9ce9bd8fc86b6cd630c0acf18e79dca744bc07b49fb78affea16190c112049cc4bbc5ccaf14c4a2f96c38b60f3f8fe14301095168d635be5bf3265507825c030369182e08d747fc6b9d0353f89e4ac4b881c81cf8d0721196a71068b3c28c753ec8fcb7b0446ad514a92136515c16f287f616ba0f83d1c6f06774886e2b21e0fe7e34f6b7d076bcda1e515f6a5d9912f0526f0ed0751f25648ba2b3b2119bf68d6746da1030416f32cefe8259cb0fc365b409eb8dc0640ef36a2aeef3124b3dbf37e6eaddde55b4d9dff1d13a65e8874c77d8ba000a934a6c2220d9b22106db138a2024fb830146e74c385964dcde91517e010303ad4c575ded39da50f25f36b2756145ebffb50f591935cd81274705ab2a21ab3b52b72689817c2eeb50ddb567e4947035aeafbdca5707a27ef0189eefa973d7c70bf542004e4eedcb5c0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f", + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + ], + "measurement": [ + false, + true, + false, + false, + false, + false, + false, + false, + false, + true + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "781bcdf49ab6cc3905ddc9468ba3770d", + "a93b52b6850a6d98fda820b899e3b66d", + "b99c81ef1b1c865cb5efd83a31c2f04a", + "ece94430b7ca762c1d136c4b324ccb13", + "3c414a50f7c6842f5ace7c4e063a40a1", + "43d8d7d2a451a3a38efe662c928909bb", + "51615b73d0634675c28073fe8bbc903e", + "d3aafb155bc2662a9f3a62e83641da00", + "da4853618f6664e1553c949cc5b83668", + "5f02f3396816e79747e3be5fbc28e193" + ], + [ + "1f448be65753695e1d210e41287234f8", + "bda85078dc9bbdc9a95b641b02cae4ee", + "4cb4121def41aa4d90355df5f08a8fc1", + "d8a55cd6329af47d86c2bb6d2b92d04c", + "a02a3857b34c2388a1f51604ce657c46", + "e8a126b4c011fc2dda1870e4da9efbe5", + "4ecaad63670383735c9147d029a5ce03", + "f744adcd817d8b8193701eb0e5205a85", + "c5dfa58103daa2c7b771ceea8337b221", + "4082f4c93b0bc641415917797dbc38e2" + ], + [ + "ff2f6b009697e49299e90da15ae5290a", + "2942cae56bd275a2d8f03559a786b6f2", + "01695f5dc2ffc6494de65a25135f6dad", + "9a94d87862672aa862450f061067d3ab", + "da47a8cbb895558b4ffc871bb1abe7f6", + "d68d52c7927b3f5462d4c91b100a4acb", + "b29c41730607fea082660c46ca6921ca", + "52dc64d21f01a65da0e10e20647d07d5", + "6487f50aac1a09052234e204a03d3056", + "1d8abcc6d4e4b3d6c801b5b1a584553c" + ], + [ + "6c703c24775ee5d40b181ad7f1042af0", + "75d992eb31875ffb2b0a45d3bccbadb0", + "fc450c9632a2080c35f46eaaca531246", + "a4db8580b3336aadc1e4c84092ba90f3", + "4c4cd58c9c5602bd7c3fe4917ab45b21", + "02f8aeb1072121dae0135fd382cdb093", + "b137b5b5c1913876268738eb7f347ff3", + "e633f24903bf67f6f47270477f20c4a4", + "fe4f1112c1a4ef51b41dbb7316d2e61f", + "47f15b3587f99e4f76c174752096904d" + ] + ], + "prep_messages": [ + "aa3d8e6257c466bc3173d454e46493c662d2e2377c60b1eb53808cdc231e8292" + ], + "prep_shares": [ + [ + "3d641c737846ac6347415a39f0460706161b78f45441c4f571c675ad977c1e569acfdbefed88b73e37d374da9b35abf7001afb1320dc90678b166811f357c7ec30a0a8be486b56d79d35d4a84f5e51864b829f9c74d386e114fd8592d083b93313a2198ec71058793b0405c971d3f9bca7c044481ad26366abdf9a305efe9eeefe81d25365b05a7d6f2cfd118c387e52584e3fc90e73acc0c17673b63bf98656", + "ff861e22d4bedb6cb50fd8d45398283fc31e12b09efa9b1d25f9c9b1ae98d2df263eebbea09201393c0c4f56e4797c22bf656006ee88b2a3873340c5821753d0bab172e5a332467bc77ff5bb585c4209900f1790247cd23eb1c3d4a0e314466cf96c4358c10e3d54bcdb9cf9fe3421d302c84b82f9b7aacbce9c9411539265961c03081b9e0b8b0a5dfdec6485969578f8704a628d19d074992f4a7374e9d534", + "0f67a601dcedd6767d4d28a6ccf47249444fb33d24d5949ed3691d49e1b87f4f3c3d080f87ea23f04d73dd2d65a2c058b221d50bbe74a3fb8ce8b7dc8c4fcb9cff59b081e848f598fd8256091b56b30cc9ad83d14e35b4aa58390d0deecbc452ca662416b4648fa177154ea775bf07e09f45276e775cb1105c81ef86c26e3b00d462ef6d88b6578c2b1ffb6471ab9d20379901919c448fb43c4463b26de3422d", + "b6ad1e69d70ca1b86961a54bef2b5d71e42954395b808a34b8747594131bf6212199d7d40829fdff5745dffd4fdf781fd9cad9d28c45e8053b25a5955b941fb6ae0172cfc2bd07f81108815a8772bf0ecf24fa93147007bdae65fb6384544be21e13d421a9685db56769a24a029d4791a8207cddd30e695e44c1fd9c9eac1ab10ff631cd5510a3b15c117d3914e8943dee24437b6abc6c04bd58b4d6239185aa" + ] + ], + "public_share": "fe81d25365b05a7d6f2cfd118c387e52584e3fc90e73acc0c17673b63bf986561c03081b9e0b8b0a5dfdec6485969578f8704a628d19d074992f4a7374e9d534d462ef6d88b6578c2b1ffb6471ab9d20379901919c448fb43c4463b26de3422d0ff631cd5510a3b15c117d3914e8943dee24437b6abc6c04bd58b4d6239185aa", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" + } + ], + "shares": 4, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3MultihotCountVec_2.json b/vdaf/prio3/testdata/Prio3MultihotCountVec_2.json new file mode 100644 index 000000000..d7ccb03ef --- /dev/null +++ b/vdaf/prio3/testdata/Prio3MultihotCountVec_2.json @@ -0,0 +1,211 @@ +{ + "agg_param": "", + "agg_result": [ + 2, + 3, + 4, + 1 + ], + "agg_shares": [ + "6cab477f485ff127e159b9ba36c5f92657b46ca6b1f44b0f23350a77f50d88558c7aa26e54b6ac7bbef32d354b493238cbc230d001fd388a273355db2625ed7f", + "9754b880b7a00ed802a64645c93a06d9ad4b93594e0bb4f0c0caf5880af277aa79855d91ab495384250cd2cab4b6cdc7373dcf2ffe02c775bcccaa24d9da1280" + ], + "chunk_length": 1, + "ctx": "736f6d65206170706c69636174696f6e", + "length": 4, + "max_weight": 4, + "prep": [ + { + "input_shares": [ + "e2bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb362d5c7a84cb3dc77420ae9fb319a83b9195ed94b3fee03d209e78f1b2561041ab435529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cf8e705bd868a6285c8f72784c197180fdcb1b50029d910e62f6d3bebbd091725f687ed53430cb0818cdada631d9bd1e370ab5a6c2a2b6d543e0e918131c67aedd5b77cb75ce71d8c8dd5ec9028440226d124bc44458e5c4e329096c1ab250ff75b66121e927d624d471d2e7e648928016920efc2d378dc0e8ee13a36d87fbdd35d4a88e6c937da0cc54fd49e9e3f4f4e971bda86ce701e9ab267195ca19bd9b318358d9d6de83a3f8be79f370a3aba801a3d79af7d7df1fb0d61dffd8d00627f7c75fc765e1ec4579c1fb4c907feff49b99198983ece8440b5d6ea9fde97a2020094a42dac99c8f0c1a6267d25128b21b404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + false, + true, + true, + false + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e2bb7419a8ac96a1c6def1bed78dcb07", + "4557af87236442363aa49be4fd351b11", + "b64bede210be55b253caa20a0f75703e", + "295aa329cd650b825d3d4492d46d2fb3" + ], + [ + "1f448be65753695e1d210e41287234f8", + "bda85078dc9bbdc9a95b641b02cae4ee", + "4cb4121def41aa4d90355df5f08a8fc1", + "d8a55cd6329af47d86c2bb6d2b92d04c" + ] + ], + "prep_messages": [ + "1cb5c0b55decfe04be8c9c84c9e29614449ed43534727e7f6189a7206287bf59" + ], + "prep_shares": [ + [ + "e54359db132ef59eec785c12afbcd0c41095ec67b32f42ca286f3dba81d2f4d52a403e1b48dfa7f4a5a6d23ae37d1051dce6452e9ae476eb0764deecce8a40db7b547c43a9891dd84dbbbfe39840e7baabd2e24b618d91e6404723c5cd8ae26c", + "1cbca624ecd10a61f786a3ed50432f3bda4bbbc57edf2cddf1ff2a876ff1b8a00822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" + ] + ], + "public_share": "7b547c43a9891dd84dbbbfe39840e7baabd2e24b618d91e6404723c5cd8ae26c59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e2bb7419a8ac96a1c6def1bed78dcb074457af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb361d5c7a84cb3dc77420ae9fb319a83b9195ed94b3fee03d209e78f1b2561041ab435529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cf4dd9d294fe4b5dfe6a035bf7c093bc3739e06b1224caa5b68b0a3240016a62d1e13cd4750741b83bf16614e687fb4ad6d08a9104fc57825d867cb6e43082cc5356dc187c4e7ff7bc9f68ccdcd074f42b37f5b9cb574739ec6152bf68e5ef8f1c1e4a446d5dbcb1233c30c7db5ce97888920efc2d378dc0e8ee13a36d87fbdd35144017b0fdd76b2a956c673e3cd2b8af04f98c5c60c95157753a2246e9e4abbf0b9ada95070ef4d47ec085bcf46d7c62dc01b0b57e3e73964c8b6107bceb0881ccfa795f61df2685fff149b632bb22dd746f93fcec86d002252556afb6db8f79a2611f5694b602bd330488dd3dd1b9a9404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + false, + false, + true, + false + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e2bb7419a8ac96a1c6def1bed78dcb07", + "4457af87236442363aa49be4fd351b11", + "b64bede210be55b253caa20a0f75703e", + "295aa329cd650b825d3d4492d46d2fb3" + ], + [ + "1f448be65753695e1d210e41287234f8", + "bda85078dc9bbdc9a95b641b02cae4ee", + "4cb4121def41aa4d90355df5f08a8fc1", + "d8a55cd6329af47d86c2bb6d2b92d04c" + ] + ], + "prep_messages": [ + "c24bc83b6d97bf557b590fea3e93b567b122a1cd957bcaa9aec448aca7726899" + ], + "prep_shares": [ + [ + "e54359db132ef59eec785c12afbcd0c4bc8093f51d55c746fd0ddc2e937ec2f330b04b8b772f62ab1ec1adc762c94ff9608a58476c33ec43cbd673643576dd2e42ab6d3c84a37c14bfadd7d17006387b1398149b4d736d6727f455ddeb0e8d62", + "1cbca624ecd10a61f786a3ed50432f3b96ae6b20fffa93bcf425c53e822b4ff50822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" + ] + ], + "public_share": "42ab6d3c84a37c14bfadd7d17006387b1398149b4d736d6727f455ddeb0e8d6259339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e2bb7419a8ac96a1c6def1bed78dcb074457af87236442363aa49be4fd351b11b54bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb362d5c7a84cb3dc77420ae9fb319a83b91a5ed94b3fee03d209e78f1b2561041ab335529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cf4025a91e2e42deba4c317240c77fb80fde5dcd86b144bb2df213d72a8bf2baea3a4dd9ae180d83470a22d9d4eaa1b0c4dbddfc151145b025cc0ce900a1bd0c9baadd792e2991654a51e51ead894211fc50964f986c2042f74a1fda80c3ecf0f412cf7551c6f265123271a4353820ee94920efc2d378dc0e8ee13a36d87fbdd3521f44026cee1ea6db33e50f535e6bcd75f7b2be8d24e3ce00e317d5b5f5c53a6b289d55cf64129c96505c1cd91c71674d1ae44a4695145ce06fb2eeb4bb0c83978f918ad86cdb8f74d75f7e579ed050d5ccefd2fd8adc7f71f583b97d8de2ea1aedced712b804ece3dc3aa83629a449d404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + false, + false, + false, + false + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e2bb7419a8ac96a1c6def1bed78dcb07", + "4457af87236442363aa49be4fd351b11", + "b54bede210be55b253caa20a0f75703e", + "295aa329cd650b825d3d4492d46d2fb3" + ], + [ + "1f448be65753695e1d210e41287234f8", + "bda85078dc9bbdc9a95b641b02cae4ee", + "4cb4121def41aa4d90355df5f08a8fc1", + "d8a55cd6329af47d86c2bb6d2b92d04c" + ] + ], + "prep_messages": [ + "c3b3331981af8ffa017c3fc4acdf8275c2dd31484200de3098f3e9560d00a943" + ], + "prep_shares": [ + [ + "e54359db132ef59eec785c12afbcd0c424c727ac2cdaafc3813020484c7bc9b6c45ada8371c5d4dbd4f9d77e2064e8061992d56621092be95a40e591a2615d8ba8b2abd7d94ff6a85516e59a79b71c229c13b132bd251e1302a6fe5d02817927", + "1cbca624ecd10a61f786a3ed50432f3b2efb430cd6b5d98874bfc62d858c1b060822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" + ] + ], + "public_share": "a8b2abd7d94ff6a85516e59a79b71c229c13b132bd251e1302a6fe5d0281792759339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e3bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e295aa329cd650b825d3d4492d46d2fb361d5c7a84cb3dc77420ae9fb319a83b91a5ed94b3fee03d209e78f1b2561041ab435529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cf1d40bde9925d4b17c846dd3594fed83dc892ca94d3c04183fa3e3e9c30b20a8c4747be8800152c9d08ddb4916ad19cfb3bfbf22858f63ff68dbf8f300abcd3c1523cea0e97d0e81f3e130785696b0fd20edd6849bb3aa68707bf11e59d1733ada4ae070d7c35a4aa785b4359d92c94e9920efc2d378dc0e8ee13a36d87fbdd3544d92c5b69c67d113829e5ff68679ca974462edab0d2b58a220616eab99c0305a58ff0820e3a8073674ae51012982a3d71914e9122a0b5fd444888bbe2b10113d09aa8cc188e352261470f0e9ac407379e87e47e8993636763b80333feb3ece81cfd5bb6753d1036f7d80b60c18d9e48404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + true, + true, + true, + false + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e3bb7419a8ac96a1c6def1bed78dcb07", + "4557af87236442363aa49be4fd351b11", + "b64bede210be55b253caa20a0f75703e", + "295aa329cd650b825d3d4492d46d2fb3" + ], + [ + "1f448be65753695e1d210e41287234f8", + "bda85078dc9bbdc9a95b641b02cae4ee", + "4cb4121def41aa4d90355df5f08a8fc1", + "d8a55cd6329af47d86c2bb6d2b92d04c" + ] + ], + "prep_messages": [ + "ffa6aa6631a9caed44243158a9b823cd6d03ccd9c0061e32905f64878a71657b" + ], + "prep_shares": [ + [ + "e54359db132ef59eec785c12afbcd0c46afdfeebb2cfb53fe66ec386a655dbc7998879597006242af323ee8edbdc70e9aa8f8db407bca86ae285576865be82a58e7a554c0e2fa5553f86ee96de11b6fa1f973b14695dfffdd21490e09765686d", + "1cbca624ecd10a61f786a3ed50432f3b6dddb72e222cee22981333990002d1cc0822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" + ] + ], + "public_share": "8e7a554c0e2fa5553f86ee96de11b6fa1f973b14695dfffdd21490e09765686d59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "e3bb7419a8ac96a1c6def1bed78dcb074557af87236442363aa49be4fd351b11b64bede210be55b253caa20a0f75703e2a5aa329cd650b825d3d4492d46d2fb362d5c7a84cb3dc77420ae9fb319a83b91a5ed94b3fee03d209e78f1b2561041ab435529c98fc7c8c876eb82fd65a31fc66cf7dff4a43e15165bcaed22955b547461b80bb28663b502ad8b1536aa6d3cfb8918ed5588ae5657f52706150b90f3b7563a4e1847a3252288d55ed722f9efc30fb18f33cf498ed14cd6ed91437e035bbc19908859c3b9169ad78dc32fa1cd00225523ffa19a72ceea504b22886fe4a5f4a4af495e251e6266d18ea3a62c6194d30914ad76eaca4cc68911472efa372920efc2d378dc0e8ee13a36d87fbdd35a9875b6fa399e3c2801d52d4acac65acc875548dff18c5bbd8b7fe98771f7094bbdb9518d25a1323775a2bc96732e702f1caa7b1f5f9b962695a9f0fba73b80420b2409cb5447715b1b411e1daa918be4c1a03d4aeebb708600afd2d6169597c737bd2781a04083ca3cbbda428cb8ebf404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + true, + true, + true, + true + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "e3bb7419a8ac96a1c6def1bed78dcb07", + "4557af87236442363aa49be4fd351b11", + "b64bede210be55b253caa20a0f75703e", + "2a5aa329cd650b825d3d4492d46d2fb3" + ], + [ + "1f448be65753695e1d210e41287234f8", + "bda85078dc9bbdc9a95b641b02cae4ee", + "4cb4121def41aa4d90355df5f08a8fc1", + "d8a55cd6329af47d86c2bb6d2b92d04c" + ] + ], + "prep_messages": [ + "8168d1e866a10ff4cc68c5a974e74b30d03faf32df83d833bf44fc7069430654" + ], + "prep_shares": [ + [ + "e54359db132ef59eec785c12afbcd0c4631e1fa996b00e4ef539d7b7e668113d9b63c65b32e40c5f03b4f8f527ad35bc595cdf351c8fb3f0f6ac9d6701a1bac7718dc7f5c50b4119fb6c3c767cae0c30a69a3166f4c6ecb28c535766c93dbb2e", + "1cbca624ecd10a61f786a3ed50432f3b7f34b51d5bf17a64064e62b7470b71e00822fcd3fd0c9087a94588084d124e91105ac0f6e69e7f327f9c989a03c990fa59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091" + ] + ], + "public_share": "718dc7f5c50b4119fb6c3c767cae0c30a69a3166f4c6ecb28c535766c93dbb2e59339032814730865c9eb4e827d6c696e3e6b53a2039714fa507e920708af091", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3SumVec_0.json b/vdaf/prio3/testdata/Prio3SumVec_0.json new file mode 100644 index 000000000..b847122df --- /dev/null +++ b/vdaf/prio3/testdata/Prio3SumVec_0.json @@ -0,0 +1,195 @@ +{ + "agg_param": "", + "agg_result": [ + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265 + ], + "agg_shares": [ + "de30a92af16bc2ab4da894e09426019d0d3cd9897a4e0ed38a1e7cde38fed1fd78b6df5176e37263f7cecb715966820a07045939da773b834c226dfa7c324916427edcf2eebf55d4a4fd9b3897e35851827dd8ebd784d3099d17d54de4c0a71a77842e8666086c4daac340201a50386b8435787649d598d01d2b4e0dae72c58eb2096da354a19135170a7adb3dcf2ba4312a75565a4e3a2e39bfdad5f9f9099f", + "23d056d50e943d5496576b1f6bd9fe62f5c4267685b1f12c59e18321c7012e028b4a20ae891c8d9cec30348ea6997df5fdfca6c62588c47c97dd920583cdb6e9c382230d1140aa2b3f0264c7681ca7ae84832714287b2cf646e82ab21b3f58e5907cd17999f793b2393cbfdfe5afc79484cb8789b62a672fc6d4b1f2518d3a7157f7925cab5e6ecaccf58524c230d45bd9d68aa9a5b1c5d1aa40252a0606f660" + ], + "bits": 8, + "chunk_length": 9, + "ctx": "736f6d65206170706c69636174696f6e", + "length": 10, + "prep": [ + { + "input_shares": [ + "25592c04bc72803500f284c48149d3ae04827becc1530c74619388f1bb3c344f752b1e4ed693306c0a1d1f90001355d3c8727fc06c49304726df59bba46a0b4be4f4582f29855bc8df63723589d3c218ef20bad7c095a97d43abf967f81bf1fa100c59dd138c132d8be8aadb1521aa11a91463adbed40dd4051fe39bac22d9d56374166a0d709d638ab7afe476ab9a0067f3eb19b9a0c5f4313370bb94fb302020f12fbf60e297d00d5c7831258b53d6669dfb8b9a62de9228a2812abb345910c32548120b3429ea2a7294a7dd40942ee3de3ad8a918d701a656573ec43f523c9ea8a6451d190a3686c45223dc902819fd69e67daf19d544e139228844adf3aeece03b4a6ce137bf87e921e282b1200d963687bee8150815450de7a6365ed10330a17ac17dbc32ca4c3dda00c1eda43c1b3a46cc6b48389511be8996f8f275a281a83cc701ff2581db833e467e543cec113074f9ce8815b80460c5e7a0169dbccbdf37e7044ebf18c87f756de3360803398c4c68512e966132fc5d1021b348e8b04a76bcce82b55271b076c76421bb524789a5cf6a9cc17e82539a7aa9ab417e47b241db44cb7dcefbbae6227cd1ad204a53f1c3863856db4dc682fb0827b755195db4bf44991563ef4c28e15fa4432a0b1075e2b091b05cf8f6a77fa93f292d9744d3fa5f2c1bf2a4056923d4519a673b79ade7db4bf1fa35b09a5ad33a5ab3c2854dede1ad8d7b26cfd1a03c0b0a70b036ad24dcaf6ebdb5d225ab14e6270836730ad27c36a009b66c08d8f768f86197f79b6f4659d18fda078e3fa4f34e9c2aa2833c9a4e9cd890b356d9da9eabf0feed22dd69703132f2e72d60ed1ea9b073e92a47cdec7eaceee61be29796a2ee333691651d9acc121ac5e4f12ececff86a0d567741f62d23d6c8bc59c510de1660e5ce64138e8b7a66760ff100d28f1689d01fa394df1056a8ee5e308b29b1775cefaded40616270c6fcad2487f57243bc51f532b26ea1548329b4b8b6e86cbcf8e14ff20657a03fabe78dc1ac4933163c7ed1724f2e112dc097d5718bdf84ba0114ccf90d7b1a4d9c89897d2a878da614bbccd6561e6e1fee8274a4215490f6d517f516cf9f57521d7f0154d0ff00124223dc7c8e30f68cc696f048c1b473c0f3b771e4da9ab08d11fafa5c6eed3a445e2faaa5825e1273036ffc23ceb2f9422fef32d0ab3fef2a010f10d03e7b105d0eaa74b0ccfe482012fc1ef3281bd50180087becf5b6d006cea2a7aafd263d0dbe915d11c68b9d49720706264ecf948b309ad241982e5f61aced1e9d7f9709cc43fc940836202004a067c24610dacc5b99ed77366f07e75aafd69ad67e3ced52c65897eee947d9b13347043764322ff2bb866efa8fc4e8ae9c192a20196a7da1ab90fdd1c9ba2caf31a969b0ec56bcc2bfce602568dac1c35bb288426e370724e402fcbdfc3bb9867ab5af81852b4d2df064ff3321fb98f57d0abbd0938cf82ebd916a0ccbad2eef8bb16f8ef5e0f715e9df13d4d71c2f4d9f9e1475bde2751d2cd47296be913250860771e28f9ef50c9554d751dc26dd408c5f8b155df7734c2f645cfa7d4471982c36d93f617bee89c95e5f559d3a7d22a7ff3e141e94c761d7908b0789780eb505d59d87e69beca4722a940a5e37dfb8963ed4109e02199abc3775db924cf005ade382bd6da1133bb2a4ce0ffd1aeec4c61bbeac5253a97c67d00f50e2d12b87b07f84ca0702ea13dd68fb5d112193dabbf5b35b4997ce413e53ebcc7c9afb2a6e98e99f3aea33c0ba293142926ef548505dfcd29d66b43e2aaa7fe93c27c1fe909f3851571a485ebbad9e8c158bb2b64f56ae1b48bb0cab150d407a1e769c08324904718ba20b174f65e8e285624612451b7de187a464bf693603e9280d0ae64e91212e94350e046b8fa4155ee8880e0352db01fac55b4e7cdbc2fb87f5bf938b03a9d44e51e4457ea6c50d244da2a0f2d5b1ca8e532813873cc4156598f104df7da1dcdc5e25e290145a0a022c91e88eaba277bcae82a44c8678bfefe760dd3c44d9dfa81666393d70d59eb243727b38f6592614008c679eba7e20a2bfb0eba90a5982f60fc45873bbf44828731ab80494af99d59badba8344948ffbc4f2cfdd4e79248415793748e126f3ffe0de1bb4d0c87aa3d0ec9bc9f85bddb69f6924dd362589a576ce1b53e37d8de7d64396594c3a5ba927cce1d7e6530d1d941683a4f0a55513439f68841bcc23b568a017ee1aa4dada33df061d8dca19df2e3047cfa13f7a9b9a9ea1e500b533e8362765af09de80b565e7cfa259cac403afc3c87ca9aa588f9b2abd9f97c936ecc18a995b111486f679249669e462b5f142808d2d8702ba43578c5fcc7777fcf58f1aa11cd36e7356448ea2392de9c3c3cac6d2f7b6ce6b3b449844f8001be366b30743e405f840e51803656f1a8f355fb28de8142b1ac65e429a22f981495dba52804768275f50a39453a69422304831853cf2c41b87048acc6c96d09ef6493296f68149756fbffcc0d2142ba12d106fc21073786a9afe0351361063882038c176e0d78099b3ba035b6b978c299279db0298ca1e1ef992d9fd28ca31631c8fc75791ad5d4439997f59c139e06eb8459295887603836a4db2fe75360a746fcc84375e5c773adae0f7f339c73689de9e9e12eaa294a55ef638881990d90e8803c1b58c77774753e269eb99c08484a2a7ec0a84eb7a37713c9ee50e45e4ee88bd076a49d206b9cb920361887ab0e904e1f7a05d5f08efcb0ab249cef54d6fdc7498882cb5cfcbd342903913a422b86daf7522a8138497993d52bdf14ef51972c494739b749288100f5534b46675b9f1836f962765ad1163220bbf88964bc225931899a6345fae8cf56a870227fc635a48f03b93ab4d00c07d11b3f3b9404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "4a65380efb23968ec4e286f586b75534", + "05694883d3c404f1d8b47e9fbd549b54", + "7f3cf5c57cf6d0cbf34499d01d22d658", + "5a56c8bd487dbe2b10b67953d410c35c", + "6ed49efba4ea71f136ff336832a11d1b", + "da7e9d4e9d81460377b2f1194c408db3", + "81d664d7cc02246fe3eb6ab50870bd23", + "861128d26d9cdd9ab4636f043a26972f", + "415824e1c635db11a958d3f3699a0e8c", + "6cb8d11c1e1abe64b43f9e9ca8a8588a" + ], + [ + "b79ac7f104dc69711f1d790a7948aacb", + "fd96b77c2c3bfb0e0b4b816042ab64ab", + "84c30a3a83092f34f0ba662fe2dd29a7", + "aaa93742b78241d4d34986ac2bef3ca3", + "972b61045b158e0ead00cc97cd5ee2e4", + "2c8162b1627eb9fc6c4d0ee6b3bf724c", + "86299b2833fddb900014954af78f42dc", + "82eed72d926322652f9c90fbc5d968d0", + "c8a7db1e39ca24ee3aa72c0c9665f173", + "9e472ee3e1e5419b2fc061635757a775" + ] + ], + "prep_messages": [ + "51b574601d2f7035e0c8a968e34e81cf949327f932a8fde13451f29aa7f9a2ac" + ], + "prep_shares": [ + [ + "30851472f3bdc07a4959bdfad085ddda3281c00d82d49622b634b22d1eef6d60f1ad80968db3f79ad81b0118fc88244fdebcb8c5155c84c275b9198d451faed352503eab54be0e1edc54ef2bb64e9a14076c4d7b8c45b64b08f2aef8bf0d0f14fe2b765a5af438ad81287fa54dc69a6f9090d54ef8b8326c7bb1de86da0a136ce01be313a26b3bf6f806ae40d5b8a42fa7c37fbaa057b0be8dbfaf8deb60dfe8462e47f72e56307e875305f445761211a216f0254108c6a2cf9026513be0552b8b3c93295aba7032a4e586e03a9e3032612cc0a5253c96ea0f141eed61a7955867f8d0e793e8db4418a504d33aa7f0e73705ace21ea56a0ad9ec9441f9e2b349d13349f0a6fe33ef5dbbb2e6fedf3d4697233f6c10eb723fe20565fe5f8ff759aeeb86681f49ad0ffcdee9e3a9ec2a90b365eab313a08a9e9867b26ff583e7a33dc7f458d6780bfb6e59801b3098aa5a51d4d87a0a3526a965bb01215988ac57", + "d17aeb8d0c423f859aa642052f7a2225996887bbb8c5e974168e8d32e89774afcf60c3ce65047c215a8ecd78cad6516556cdbdf20bea9d316a1662c8a2374c0f766297cf9f7c1df20768eef0302af42e566a04c54032235e7aa81cf952829e1336a7bada320159a2e224bacef11ba00aee542fe815df02579733deb63f8d321203e4190b73e2738340da8b81d7b229f999c841a5d07cd16fe4d30824dd3ead1906a4aeb88f360ec3388d7bf7835c9b4a01e087c01140e705a48902ec50684b2a5c8c3d07dcff55afc8a2a278e0993b9399e63b3729a507b636d2b777b4d09a1e381331cffcf0259930e14973f1d4795b4222b39302830134199c166cd3d020a7486c4be8d29b37fabcf73229c95d3ee7ae211b08e5e02e1c34316d92e6fafdc5698629f9db0d7ef317efcfcc20bc1c61a25ac48e8b2090ad4b965d239f3fdd4352636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75" + ] + ], + "public_share": "3dc7f458d6780bfb6e59801b3098aa5a51d4d87a0a3526a965bb01215988ac5752636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "26592c04bc72803500f284c48149d3ae04827becc1530c74619388f1bb3c344f752b1e4ed693306c0a1d1f90001355d3c8727fc06c49304726df59bba46a0b4be4f4582f29855bc8df63723589d3c218ef20bad7c095a97d43abf967f81bf1fa100c59dd138c132d8be8aadb1521aa11a91463adbed40dd4051fe39bac22d9d56374166a0d709d638ab7afe476ab9a0067f3eb19b9a0c5f4313370bb94fb302020f12fbf60e297d00d5c7831258b53d6669dfb8b9a62de9228a2812abb345910c32548120b3429ea2a7294a7dd40942ee3de3ad8a918d701a656573ec43f523c9ea8a6451d190a3686c45223dc902819fd69e67daf19d544e139228844adf3aeede03b4a6ce137bf87e921e282b1200d953687bee8150815450de7a6365ed10330a17ac17dbc32ca4c3dda00c1eda43c1b3a46cc6b48389511be8996f8f275a281a83cc701ff2581db833e467e543cec113074f9ce8815b80460c5e7a0169dbccbdf37e7044ebf18c87f756de3360803398c4c68512e966132fc5d1021b348e8b04a76bcce82b55271b076c76421bb524689a5cf6a9cc17e82539a7aa9ab417e47b241db44cb7dcefbbae6227cd1ad204a53f1c3863856db4dc682fb0827b755195db4bf44991563ef4c28e15fa4432a0b1075e2b091b05cf8f6a77fa93f292d9744d3fa5f2c1bf2a4056923d4519a673b79ade7db4bf1fa35b09a5ad33a5ab3c3854dede1ad8d7b26cfd1a03c0b0a70b036ad24dcaf6ebdb5d225ab14e6270835730ad27c36a009b66c08d8f768f86197f79b6f4659d18fda078e3fa4f34e9c2aa2833c9a4e9cd890b356d9da9eabf0feed22dd69703132f2e72d60ed1ea9b073e92a47cdec7eaceee61be29796a2ee333691651d9acc121ac5e4f12ececff86a0d567741f62d23d6c8bc59c510de1660e5ce64138e8b7a66760ff100d28f1688d01fa394df1056a8ee5e308b29b1775cefaded40616270c6fcad2487f57243bc51f532b26ea1548329b4b8b6e86cbcf8e14ff20657a03fabe78dc1ac4933163c7ed1724f2e112dc097d5718bdf84ba0114ccf90d7b1a4d9c89897d2a878da615bbccd6561e6e1fee8274a4215490f6d417f516cf9f57521d7f0154d0ff00124123dc7c8e30f68cc696f048c1b473c0f3b771e4da9ab08d11fafa5c6eed3a445e2faaa5825e1273036ffc23ceb2f9422fef32d0ab3fef2a010f10d03e7b105d0eaa74b0ccfe482012fc1ef3281bd50180087becf5b6d006cea2a7aafd263d0dbe915d11c68b9d49720706264ecf948b2f9ad241982e5f61aced1e9d7f9709cc42fc940836202004a067c24610dacc5b99ed77366f07e75aafd69ad67e3ced52c65897eee947d9b13347043764322ff2bb866efa8fc4e8ae9c192a20196a7da1ab90fdd1c9ba2caf31a969b0ec56bcc2bfce602568dac1c35bb288426e370724e502fcbdfc3bb9867ab5af81852b4d2df064ff3321fb98f57d0abbd0938cf82ebd916a0ccbad2eef8bb16f8ef5e0f715e8df13d4d71c2f4d9f9e1475bde2751d2cd47296be913250860771e28f9ef50c9554d751dc26dd408c5f8b155df7734c2f645cfa7d4471982c36d93f617bee89c95e5f559d3a7d22a7ff3e141e94c761d7908b0789780eb505d59d87e69beca4722a940a5e37dfb8963ed4109e02199abc3775db924cf005ade382bd6da1133bb1a4ce0ffd1aeec4c61bbeac5253a97c67d00f50e2d12b87b07f84ca0702ea13dd68fb5d112193dabbf5b35b4997ce413e53ebcc7c9afb2a6e98e99f3aea33c0ba293142926ef548505dfcd29d66b43e2aaa7fe93c27c1fe909f3851571a485ebbad9e8c158bb2b64f56ae1b48bb0cab150d407a1e769c08324904718ba20b174f65e8e285624612451b7de187a464bf693603e9280d0ae64e91212e94350e046b8fa4155ee8880e0352db01fac55b4e7cdbc2fb87f5bf938b03a9d44e51e4457ea6c50d244da2a0f2d5b1ca8e532813873cc4156598f104df7da1dcdc5e25e290145a0a022c91e88eaba277bcae82a44c8678bfefe760dd3c44d9dfa81666393d70d59eb243727b38f6592614008c679eba7e20a2bfb0eba90a5982f60fc45873bbf44828731ab80494af99d59badba8344948ffbc4f2cfdd4e79248415793748e126f3ffe0de1bb4d0c87aa3d0ec9bc9f85bddb69f6924dd362589a576ce1b53e37d8de7d64396594c3a5ba927cce13265f695cfd229a96012061cdcc64f574e81b3a8f5ddd47e0a9a058683f30df0aa8e7157e53d2077c499b8b02b3720dce6ede68bbb5f5341f21df5e723bc855ab19fe500ab7bc1a6c7b80cba425a63f261eed6fbc959417e3c75ba835ee07ac93c11b6d677fe7a4d48f5380b31a9203484f36ed44deca03bc94255feb435398623b6d2be2eee3982d383780dd0f82376cac99cb53a48a5b4de0618f07a8aeffb552511020de0ec9c53e1214a44a655e01d24b0db83fe4384194c651184a1ebb8a36bd5b1b5a1c9c8b9890b018752c2b8a10cb0942b350fcec86de9247d5bfbb61566449886e9cedaad77f43ab9bffca363882038c176e0d78099b3ba035b6b9731abeff028c484a462fc98cc107a78db68fd340a87e25c4625c5d7edd6999250546d11088c869846f28af1162262f4fb08873d74b10e32805026c379899d9b3c2743c362f745ecc44996fc9485c9e05a17b87a3ee31dd69296e3ace40185438db1574f86664f892b60c93aebb0937a702c7391e5af0dc3375a49e507a56fdd96c6601be68c7deaaf2c2222691d9542c47ba65aa2c4f38e43d5cab393fac7260d3dadebe2c7f4485f29e191b96c593691d1770b46cbc7d737e1630a4e74271c5466704c1aeb799a8eb8a3de250e3933747b546c481ffa8de8c3b51290eaecd984129f43c0d814d54318f365415c442d26404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "4b65380efb23968ec4e286f586b75534", + "05694883d3c404f1d8b47e9fbd549b54", + "7e3cf5c57cf6d0cbf34499d01d22d658", + "5856c8bd487dbe2b10b67953d410c35c", + "6bd49efba4ea71f136ff336832a11d1b", + "d67e9d4e9d81460377b2f1194c408db3", + "7cd664d7cc02246fe3eb6ab50870bd23", + "801128d26d9cdd9ab4636f043a26972f", + "3a5824e1c635db11a958d3f3699a0e8c", + "64b8d11c1e1abe64b43f9e9ca8a8588a" + ], + [ + "b79ac7f104dc69711f1d790a7948aacb", + "fd96b77c2c3bfb0e0b4b816042ab64ab", + "84c30a3a83092f34f0ba662fe2dd29a7", + "aaa93742b78241d4d34986ac2bef3ca3", + "972b61045b158e0ead00cc97cd5ee2e4", + "2c8162b1627eb9fc6c4d0ee6b3bf724c", + "86299b2833fddb900014954af78f42dc", + "82eed72d926322652f9c90fbc5d968d0", + "c8a7db1e39ca24ee3aa72c0c9665f173", + "9e472ee3e1e5419b2fc061635757a775" + ] + ], + "prep_messages": [ + "742127e29a1b5e1189d4cdfda9ac8009d685c5a8c7e47c69876c5e79b22b5da8" + ], + "prep_shares": [ + [ + "30851472f3bdc07a4959bdfad085dddaabaa1bd83533d5731c3c1950389bb43e4469a50551796869287af7eca4a9c95499634bbd72fec4b858b7a272d7330838fa40ea557ef27460d92849406d429bd9bf139934d4f4eb941558b8ca631551bdfe2b765a5af438ad81287fa54dc69a6f74facac550b1882eaa28db2fd30a4ad16f05c1e6391ac3dbd009688250a28c34b4e3be87d3e293d46255d30598d73f222052b3c7b74177996498a8e52797815076c8eddd5b9111f0702f376d5cfbe852bbc1f5ef4e2318e589b808b106be3db0f1f89c7ed14a03be33bea9d592fc30c7f9530ee022aaa402651919cbc369f50e9c310b7e884c60d8f44dd4eaecbc81144661a8416f0672dbfe851e902590381cadb8227d92bc01e7e62b4e1c2a8577432c7159d74f1bf520bdf934b0bf23dadbacbc8254d5a255c0818c3e1e7190137a20e05d4f8235480af044b72b301d44e65378b4ba410d36aa85f4fcfb9deb7c39", + "d17aeb8d0c423f859aa642052f7a2225b210c9a6fdc9936ae13a7ab41bc21732cf60c3ce65047c215a8ecd78cad65165834d2bcf9ae252af25e03314f993dc77766297cf9f7c1df20768eef0302af42ee2bcda8f9b88a97bb8793101a38b149c36a7bada320159a2e224bacef11ba00a6de383887d13260c5b1600de3fd6e6a603e4190b73e2738340da8b81d7b229f98a572393e4c02dbacfca54406ec565e906a4aeb88f360ec3388d7bf7835c9b4abcdf43643287a03d41d34ad6941173155c8c3d07dcff55afc8a2a278e0993b93e2eb193b501db62fc13ce2fe4e686c50381331cffcf0259930e14973f1d4795b93548b77b345e1e5e0e6ccd85c18be86486c4be8d29b37fabcf73229c95d3ee76258b7cb151e9e50638881b31539c2f5698629f9db0d7ef317efcfcc20bc1c61a25ac48e8b2090ad4b965d239f3fdd4352636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75" + ] + ], + "public_share": "20e05d4f8235480af044b72b301d44e65378b4ba410d36aa85f4fcfb9deb7c3952636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + }, + { + "input_shares": [ + "26592c04bc72803500f284c48149d3ae05827becc1530c74619388f1bb3c344f762b1e4ed693306c0a1d1f90001355d3c9727fc06c49304726df59bba46a0b4be5f4582f29855bc8df63723589d3c218f020bad7c095a97d43abf967f81bf1fa110c59dd138c132d8be8aadb1521aa11aa1463adbed40dd4051fe39bac22d9d56374166a0d709d638ab7afe476ab9a0068f3eb19b9a0c5f4313370bb94fb302021f12fbf60e297d00d5c7831258b53d6679dfb8b9a62de9228a2812abb345910c42548120b3429ea2a7294a7dd40942ee4de3ad8a918d701a656573ec43f523c9fa8a6451d190a3686c45223dc902819fe69e67daf19d544e139228844adf3aeede03b4a6ce137bf87e921e282b1200d963687bee8150815450de7a6365ed10331a17ac17dbc32ca4c3dda00c1eda43c1c3a46cc6b48389511be8996f8f275a282a83cc701ff2581db833e467e543cec123074f9ce8815b80460c5e7a0169dbcccdf37e7044ebf18c87f756de33608033a8c4c68512e966132fc5d1021b348e8b04a76bcce82b55271b076c76421bb524789a5cf6a9cc17e82539a7aa9ab417e48b241db44cb7dcefbbae6227cd1ad204b53f1c3863856db4dc682fb0827b7551a5db4bf44991563ef4c28e15fa4432a0c1075e2b091b05cf8f6a77fa93f292d9844d3fa5f2c1bf2a4056923d4519a673c79ade7db4bf1fa35b09a5ad33a5ab3c3854dede1ad8d7b26cfd1a03c0b0a70b136ad24dcaf6ebdb5d225ab14e6270836730ad27c36a009b66c08d8f768f86198f79b6f4659d18fda078e3fa4f34e9c2ba2833c9a4e9cd890b356d9da9eabf0ffed22dd69703132f2e72d60ed1ea9b074e92a47cdec7eaceee61be29796a2ee343691651d9acc121ac5e4f12ececff86a0d567741f62d23d6c8bc59c510de1661e5ce64138e8b7a66760ff100d28f1689d01fa394df1056a8ee5e308b29b1775defaded40616270c6fcad2487f57243bd51f532b26ea1548329b4b8b6e86cbcf9e14ff20657a03fabe78dc1ac4933163d7ed1724f2e112dc097d5718bdf84ba0214ccf90d7b1a4d9c89897d2a878da615bbccd6561e6e1fee8274a4215490f6d517f516cf9f57521d7f0154d0ff00124223dc7c8e30f68cc696f048c1b473c0f4b771e4da9ab08d11fafa5c6eed3a445f2faaa5825e1273036ffc23ceb2f94230ef32d0ab3fef2a010f10d03e7b105d0faa74b0ccfe482012fc1ef3281bd50181087becf5b6d006cea2a7aafd263d0dbe915d11c68b9d49720706264ecf948b309ad241982e5f61aced1e9d7f9709cc43fc940836202004a067c24610dacc5b9aed77366f07e75aafd69ad67e3ced52c75897eee947d9b13347043764322ff2bc866efa8fc4e8ae9c192a20196a7da1ac90fdd1c9ba2caf31a969b0ec56bcc2c0ce602568dac1c35bb288426e370724e502fcbdfc3bb9867ab5af81852b4d2df164ff3321fb98f57d0abbd0938cf82ebe916a0ccbad2eef8bb16f8ef5e0f715e9df13d4d71c2f4d9f9e1475bde2751d2dd47296be913250860771e28f9ef50c9654d751dc26dd408c5f8b155df7734c30645cfa7d4471982c36d93f617bee89ca5e5f559d3a7d22a7ff3e141e94c761d7908b0789780eb505d59d87e69beca4732a940a5e37dfb8963ed4109e02199abd3775db924cf005ade382bd6da1133bb2a4ce0ffd1aeec4c61bbeac5253a97c68d00f50e2d12b87b07f84ca0702ea13de68fb5d112193dabbf5b35b4997ce413f53ebcc7c9afb2a6e98e99f3aea33c0bb293142926ef548505dfcd29d66b43e2aaa7fe93c27c1fe909f3851571a485ebbad9e8c158bb2b64f56ae1b48bb0cab150d407a1e769c08324904718ba20b174f65e8e285624612451b7de187a464bf693603e9280d0ae64e91212e94350e046b8fa4155ee8880e0352db01fac55b4e7cdbc2fb87f5bf938b03a9d44e51e4457ea6c50d244da2a0f2d5b1ca8e532813873cc4156598f104df7da1dcdc5e25e290145a0a022c91e88eaba277bcae82a44c8678bfefe760dd3c44d9dfa81666393d70d59eb243727b38f6592614008c679eba7e20a2bfb0eba90a5982f60fc45873bbf44828731ab80494af99d59badba8344948ffbc4f2cfdd4e79248415793748e126f3ffe0de1bb4d0c87aa3d0ec9bc9f85bddb69f6924dd362589a576ce1b53e37d8de7d64396594c3a5ba927cce11a00c3eccbdb49f940fdc81b40cecc32285f00a3875226d335ee52bfc0f970d48bb36863e6c44819b3df4e50c35867d9aa1e1dcb9f5ad91374adaa984b12c65b8e769d358d5cf3a5017414a185b5dbca117ff597dfb823f65f348d69bb532c82b25714d2a62616c14b6551689e80aa73e413c0f635c9e6828a4c8910b790ad5deb477e71de50ccb035e812430cb830e3e55eba2a16af62683394c15614a6f4d50f6dc319b0bd50bc25a59a96819fab494c35753b1b4bc7c23bb083102e4c802f27bdeddcc1c58275d0d6f105c2270f738fd8b4d95336f381f93e8908ba68bb532041d1e44f126859fe72ba496e0e4d0d63882038c176e0d78099b3ba035b6b974910239a2cbb64548211d6ccac72fbff8e1fe80ff56d0bf2f9708ab499932f6c73481afc8aff6fa403455b778a40adfe44560735cd13acadce960dc961475b3b4a6c0b2e1565bac50fdbf4ad426e688267275ca2cdbef31a7324dafea41192d43b11f18a3727eeb75c59228e43bcf030cc5240c3c7307df0983fb1f5a21469bffece6f33dd1a5881cabd8733e1d5355760113d2de98cd18f803d0a2d61ac2133826539cb2417e53f731d196d2f60e027a26646e6337b54f9beffeb4eca7c87dde21e34efde55e1e1a156f820d363e6b98d886703f7f8a93493e472acaddf19e807c4b6730fec3bc5c7f79f32a7f5dcbc404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": [ + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255 + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "4966380efb23968ec4e286f586b75534", + "036a4883d3c404f1d8b47e9fbd549b54", + "7c3df5c57cf6d0cbf34499d01d22d658", + "5657c8bd487dbe2b10b67953d410c35c", + "69d59efba4ea71f136ff336832a11d1b", + "d47f9d4e9d81460377b2f1194c408db3", + "7ad764d7cc02246fe3eb6ab50870bd23", + "7e1228d26d9cdd9ab4636f043a26972f", + "385924e1c635db11a958d3f3699a0e8c", + "62b9d11c1e1abe64b43f9e9ca8a8588a" + ], + [ + "b79ac7f104dc69711f1d790a7948aacb", + "fd96b77c2c3bfb0e0b4b816042ab64ab", + "84c30a3a83092f34f0ba662fe2dd29a7", + "aaa93742b78241d4d34986ac2bef3ca3", + "972b61045b158e0ead00cc97cd5ee2e4", + "2c8162b1627eb9fc6c4d0ee6b3bf724c", + "86299b2833fddb900014954af78f42dc", + "82eed72d926322652f9c90fbc5d968d0", + "c8a7db1e39ca24ee3aa72c0c9665f173", + "9e472ee3e1e5419b2fc061635757a775" + ] + ], + "prep_messages": [ + "b872bdbca9e832071e6ab0a90939e9210fc7d681bbc3346469b97e161022217c" + ], + "prep_shares": [ + [ + "30851472f3bdc07a4959bdfad085ddda9a06b806845b7af3bb01a3f0f24f7f6567b1f70d10208b81dbc03dc1e7a7fc80e127e9791b34e34069a02b62fdcf87e025478289e580d3375ce797bb49682c39588a3fd355bae1a0f46b434218ddba63879b1b9317c93082b53f394c3fdc35122c2bd265657a91b82246f8b57b277dbe0d98bbe550ea01989330fc001fd485df81100910daf35dfa6ba05a2d4b69e0c486a4349ed7c50471159f656d4473189cc15d444072002bd1bb07aa6ccb730ae729cf8d28718aafee660c1b5f09d029dda581d449b11aacb84c107811b30f929024e72f241ba21c2aeacf0eb22472d74cd7a8299552ebeaa02fad6623117d389097ddbe8e309b7e06403312eccee0798cffe073cbab5a9ee5f4f03acac562147f4eb9abdf0ec217398c407b8402220d08a0480f806f55ffb452ffd3ae495e41f41fcda512f21c14d0d6f7ee6f3411c34a788f8d9cbd8a7b3d6b44b4ff7b1ca0ef", + "d17aeb8d0c423f859aa642052f7a2225ca5b009cd7de275c61ecee672a873134cf60c3ce65047c215a8ecd78cad6516527941d2e7706ff22a0b5b6d4e319f969766297cf9f7c1df20768eef0302af42e8256f7782ac0d2abac96e11bc359a63236a7bada320159a2e224bacef11ba00aec1d4c7d8888d1018be9b0e043105ac403e4190b73e2738340da8b81d7b229f9b78d088b9e29d2b0267727444ba7377506a4aeb88f360ec3388d7bf7835c9b4afd18c571cf85d75d10333bc86fdb830e5c8c3d07dcff55afc8a2a278e0993b93357bbac1ce5c784e5f6f92ed22fd55e8381331cffcf0259930e14973f1d4795bb2bc7c75a022a242bdba746734a2ebb9486c4be8d29b37fabcf73229c95d3ee7b7b485f702b007e23fe6ecbe295ffd86698629f9db0d7ef317efcfcc20bc1c61a25ac48e8b2090ad4b965d239f3fdd4352636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75" + ] + ], + "public_share": "1fcda512f21c14d0d6f7ee6f3411c34a788f8d9cbd8a7b3d6b44b4ff7b1ca0ef52636c2e157a7bb1671ac81f34de5805a84147336c6c2c783ad3b2bdee3d3c75", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3SumVec_1.json b/vdaf/prio3/testdata/Prio3SumVec_1.json new file mode 100644 index 000000000..865c26580 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3SumVec_1.json @@ -0,0 +1,147 @@ +{ + "agg_param": "", + "agg_result": [ + 45328, + 76286, + 26980 + ], + "agg_shares": [ + "1804634db47edf168657b3954adfe41316ac15c1a9746b5e78002e5e9c25b59c790ca00130c66787bd77eb5cfff9cc42", + "21c51bfc8419ef45fbb04ca38ca00091a1461d555042156101e21121ac1c4bacdd05a734256825585d624cf21a38e606", + "d8e781b6c66731a362f7ffc628801a5b4937cee905497f404e1dc080b7bdffb60f57b9c9aad17220c925c8b0e5cd4cb6" + ], + "bits": 16, + "chunk_length": 7, + "ctx": "736f6d65206170706c69636174696f6e", + "length": 3, + "prep": [ + { + "input_shares": [ + "85d237df3416b710eaf3a8de047980d218fc28c39f5fbdc7aee7b838034e2ea98dba20fb535040a21d805c78b8322906c8466acbbcd3a641dd4fec7fab05a795dacdef8c4cb6e6d1bf77b2a2559ad3e926540dfd13e8879173995a3b17c6a6622ee49768084ab70a6e423614bee0b6780036300b36517532168778de9ba321669ca5f321fcf73afbdc9c6255ef66d37d1ce1c390dff9607aabca6a32253aa447de9cfe68ca30827938402d0394cd892bef1e4dce1bdc57534069593d91430c2c85936d12debb90b07f1d32bcc28d8567b53ea47fd94ec9b90cfde39cada3ebba6f0d309e8aee29b9634b596880de0a02e8f44feab8f1144bfb3ce4e9002d1e2611e1ca567c63786f2c062f3540a0050a17f3459e79ab568caf1a5b1c52d29220352eeecc342967ef412a96894c8dd0ea8819c00bedcc2219b5b95e21e67e5aa0edf98064dab57378adeec40ebe5982234825b2f5908a4a7efc07ef57f1187f5e64ae268bfa646ecd80b6df6fac333cc00f42d8348600bb607321323d7124b7a2fa0bacbf03f6cc690f4cf3be68868e97076828c70b0a9ab0d5e3599aa879957d3cbd7e6a59e677b3a4da26762aeeeb4c153f9241696613516f5d482f2d4246dd3944219e92bb6ba6d949af52205d6c7d9b567cf84d1fe21b3f19ebc1914904134e69146421b186095e05d395b64bbecf9bf21fee1a693853cccc0470e54001fd61fa4a5ad4be1b4f19b64e21111480b44538cbe6c5bce974ec414b8df52c839034f2fbff2ed7d67718d30778989eaf5b1c8fb01416cec455ed2c6416177e584ee49dd204f3778d1ef9ab9470c30e647eecbf80ab482bbf1ca41f6c4b00d62768ece36f6fb8a8ce3aa5e8f9207bec4e86db5cb574a5ad703c679969032234468443414ffe96ca893f500eedda1fb53ad4716099b995e120e7dc403f80ff4d814d90dcd1303a74b17aba4cc44c095d8c6b456b0a2ac415109f50290159a9a921816e85d9247a41f37f4afdaa4228312229285108a505a3981051f69430896bc9c760345d6602926413d003ad380e568f3fd365382c314b3076d34a9458cce0183ed096ab0f8259502653ba7eb6be635cf02306340bb5c0d658db16ebac3afad4d415f0fd316a153fcce9b964ac4d870a7160989de29100e87fafba45028201fe8fb1290b3de20651f31ed9dcb835d1089489f3369181a57c34c979a40d13c46c4969bd4b798e004453664618d913a7c34894ba39657863680ea27a3538cae4403847043556c67a98eadfbadc8baab039f00d7b760f8a884faee09fdd838680892ab9760212182dc94aa845c4283a3216d7b8faea7a3457ca7d25d5d9040ac222bc99731d3c8060a2d375e308d66669ac94ae5dea63d994b2a1066a22b8ed121f1d2826506cd8021805e0b8d9b0fd336f736c95f3c09ca69acf80cbc3902c82deb1aad46069966473963266d6bd940b111f6e32519adaf794df9b12ad363ce1e6fc3ff5adf4fafaa3ff9ede2fe8ef168fb4da702baf8ebddaf3fee4bc268256fca2dada5cb790e2b90c9149ebf1cdb799d83c2b7f36bd78e5604a4357f94d613ecade628f07d234d01c5fc1d6a2f92a97a90221012a0c778ddfba30030d577ab6a3cc314b60c8f1dae1010f7e1bf5c8733dffcadb3e3188dc67527433da7638d0151a9e55a7d33f676ebda360cc9910beee90adae1cd3a3f473e696a95b8dfa41a1af4dbbdbc36e3830ec21a81451030e35808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + ], + "measurement": [ + 10000, + 32000, + 9 + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "1398cb193c2af55c231d91dc18f5f65b", + "b3fdb195387cce74c9aa641f34b79189", + "bb8b8a001042cdd7357d4e74aaa8996b" + ], + [ + "0b975ea98108a56cfe3ac48bd98a5530", + "e16cb471c5c0b17598a0b0b58e0919e4", + "4a57e2660c780cc8157619a6b312a257" + ], + [ + "f3f7d53c42cd6536c2a7aa970d80b373", + "6e129af801c37f1566b4ea2a3d3f5592", + "051d9398e3452660980c98e5a144c43c" + ] + ], + "prep_messages": [ + "5f149db2819d9d191f3cd67607cd4caef93159eccca7b4d6e361c7600788f808" + ], + "prep_shares": [ + [ + "51ffd96b532bbf0a52b2f58afc18ea46b1bcc466517198a06a5bb42070cf1d65b68dc64cd0b7bdff12d1453c0054ec535bbd88534d772a2adf54b1591a86bef0e111287229a4312f5cab84dbc74d9eb98226ef05a212f9e1ea5e51000f58ce01ff9441e04969bfe462477158c315340247f6ab86ec35cbca52ae725052a638f93a92bffa1fb71b5df9e430cae0faaaf98a2680a08468768a63abd64a833cd957663b0692b883cf48b4842d80726ad72071fd0bb8ed32ee320abaabed6a432cb6e8844ccf827cc82d67ceaba64c90747004682cb73f9257471f56eb7cd3ad350c3d4644f2575d9b9990869c8bc6d2d4b5afcdedcb1020ce9c886fb1c9db93294cb242c3cfaa7fc6323782d2222eed6660ef11346f78130b02403982d787950aea", + "aab8956a8796a121e384dd5b9dc2e196871d3ab10076502513f46fd7a72f373d141a07a44f86f00b2cda02dd817a2f85a87766501ac368bc9f29a862143b7c1c5a3e85c1d31a279ed84cdc4d85c2d8f59005187b9df36e720282b51a0460def5198aa0dfed40b6a0773b3ce324359ebf7ae08d19b50ed5a58c41503e6a3443c20e2c33641f01626049d3db97f76f821391f766c07cbd2c46ce5c81024ce0f77aae872b1c5d6d756b9c775ac1323c62b123c770aca3a88e68953eed6d4fd76e70c2ee08eefab0858accb535da8cf86797537149a9c2e3e896542a47b359450b59e4c0a111242a58794b041e62036641582ad14b4e015b35082a9189535becf26364431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33", + "06489029253e9fd3aec82c1966243422e4f448da422e967346db1ad2b1e3f68330ba45d7f57de164b3aa9ece4b77a8902e0f799d8d206f26f5f6e7dddfd20394f7a49102dd52135c07ef99e633b2848fb893bbaaaf0fe6a07608847875034e20795b72dfef7b53cb39a6208babe70df25ceb088e02abebc02c3a22a62e0f3e540831d61e841d524e544f908c340bd58e3ee4dd62b4d09aaf04df00ab5bd68ac2e644b746b9f82276c8f72826491ab372e7adce3e529bdccae0b827d13e4b6caac61a73afaf94c56913006bc1df239fd541b66337484cd54ede29ecb2d95bd253afc72b98fe4b97278f0eae2ba038a2d60064cd25924c14665cc237834039da18c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77" + ] + ], + "public_share": "b242c3cfaa7fc6323782d2222eed6660ef11346f78130b02403982d787950aea64431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + }, + { + "input_shares": [ + "85d237df3416b710eaf3a8de047980d219fc28c39f5fbdc7aee7b838034e2ea98eba20fb535040a21d805c78b8322906c9466acbbcd3a641dd4fec7fab05a795d9cdef8c4cb6e6d1bf77b2a2559ad3e926540dfd13e8879173995a3b17c6a6622ee49768084ab70a6e423614bee0b6780136300b36517532168778de9ba321669ca5f321fcf73afbdc9c6255ef66d37d1ce1c390dff9607aabca6a32253aa447dd9cfe68ca30827938402d0394cd892bf01e4dce1bdc57534069593d91430c2c85936d12debb90b07f1d32bcc28d8567b43ea47fd94ec9b90cfde39cada3ebba700d309e8aee29b9634b596880de0a02e8f44feab8f1144bfb3ce4e9002d1e2612e1ca567c63786f2c062f3540a0050a18f3459e79ab568caf1a5b1c52d29220362eeecc342967ef412a96894c8dd0ea8919c00bedcc2219b5b95e21e67e5aa0eef98064dab57378adeec40ebe5982234825b2f5908a4a7efc07ef57f1187f5e64ae268bfa646ecd80b6df6fac333cc01042d8348600bb607321323d7124b7a2f90bacbf03f6cc690f4cf3be68868e97076828c70b0a9ab0d5e3599aa879957d3cbd7e6a59e677b3a4da26762aeeeb4c153f9241696613516f5d482f2d4246dd3844219e92bb6ba6d949af52205d6c7d9a567cf84d1fe21b3f19ebc1914904134e69146421b186095e05d395b64bbecf9bf21fee1a693853cccc0470e54001fd61fa4a5ad4be1b4f19b64e21111480b44538cbe6c5bce974ec414b8df52c839035f2fbff2ed7d67718d30778989eaf5b1b8fb01416cec455ed2c6416177e584ee59dd204f3778d1ef9ab9470c30e647eedbf80ab482bbf1ca41f6c4b00d62768ede36f6fb8a8ce3aa5e8f9207bec4e86dc5cb574a5ad703c679969032234468444414ffe96ca893f500eedda1fb53ad4726099b995e120e7dc403f80ff4d814d90dcd1303a74b17aba4cc44c095d8c6b466b0a2ac415109f50290159a9a921816e85d9247a41f37f4afdaa4228312229285108a505a3981051f69430896bc9c760345d6602926413d003ad380e568f3fd365382c314b3076d34a9458cce0183ed096ab0f8259502653ba7eb6be635cf02306340bb5c0d658db16ebac3afad4d415f0fd316a153fcce9b964ac4d870a7160989de29100e87fafba45028201fe8fb1290b3de20651f31ed9dcb835d1089489f3369181a57c34c979a40d13c46c4969bd4b798e004453664618d913a7c34894ba39657863680ea27a3538cae4403847043556c67a98eadfbadc8baab039f00d7b760f8a884faee09fdd838680892ab9760212182dc94aa845c4283a3216d7b8faea7a3457ca7d25d5d9040ac222bc99731d3c8060a2d375e308d66669ac94ae5dea63d994b2a1066a22b8ed121f1dd3ae400cae0e1383886d41136d0e6071a071c5be582ad8dfc9d9102e3e1e53341bf0ca7e57c66ba20b621ff971210cee0f1349f273c8d9ba27a3d86e00f5371c61a66b6f7871d1f68b74a51e3268af1530080d8c95a17b8b2175af159619bf5389a18c7f2cf48b2496e527b5f83ea4123c2b7f36bd78e5604a4357f94d613eca33da9e67fc28d59eb60c6f408a50a6abcd442f2c50f34fcf8d22b66f45de41215c16e14a0790e2d50c1335e017b3786e5eeae3e697b7978cc6e307a2b2247ff6f7ec972c56c93977ec0deb9557bf9d8d3a16cd3fccbf53dcc306b76c79377ff000878b13285d6618e7856b51267c03fb808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + ], + "measurement": [ + 19342, + 19615, + 3061 + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "91bccb193c2af55c231d91dc18f5f65b", + "52cdb195387cce74c9aa641f34b79189", + "a7978a001042cdd7357d4e74aaa8996b" + ], + [ + "0b975ea98108a56cfe3ac48bd98a5530", + "e16cb471c5c0b17598a0b0b58e0919e4", + "4a57e2660c780cc8157619a6b312a257" + ], + [ + "f3f7d53c42cd6536c2a7aa970d80b373", + "6e129af801c37f1566b4ea2a3d3f5592", + "051d9398e3452660980c98e5a144c43c" + ] + ], + "prep_messages": [ + "41e9ead9a8d4e83123f351ac162baee8858e3fbcee01e3e8e13395366342b087" + ], + "prep_shares": [ + [ + "51ffd96b532bbf0a52b2f58afc18ea46a7db6073a8e4f3f865b395dc0cd1d058a4234ca38722c594b0703d09cb9459f5a22eb285bbd2b0ee4f5e3bdf2d4ae2d2512f455169be0941be0732caab35d6da9f2c9776928454e1d3fc0cd81a24eb5863d164f547fa99f707b07d7c8026e94a1377e42283ab96c6f87b1381744d9ef9ade7d4310a98df24bb1872685ecf4bbc882679a0c0362cf08d39087cb2d04e5648bdd61c75604deb6a46c7603c8f438058da54fbb71d7d7aeca16630d4fd8e4c8c8a19a2654e04e85c86318413bcad9f27214639b1ce14d2aa5a8c6b46e81a54bef63b9d274521fc0e140a4dd8c9fc3d392397dabc861a9f444bcdffe48ac0e57bbadfa788aa88120a30d451bacc73bd95c77e9064fb21ec1a6283cd6241849c", + "aab8956a8796a121e384dd5b9dc2e196802208434ffa07ff6587ccc3c1fe8b58141a07a44f86f00b2cda02dd817a2f85ae6d940e21f1c96da205eccbab7602ab5a3e85c1d31a279ed84cdc4d85c2d8f52563bd07c9e0b151b4fdcc2cd5a3d70a198aa0dfed40b6a0773b3ce324359ebf1d76b0e274e051994c1a2e52e7815c4f0e2c33641f01626049d3db97f76f8213adb74cb2a3df578f6167df6e23ec6a3eae872b1c5d6d756b9c775ac1323c62b18f008a01fecf62323f15646a128a03e1c2ee08eefab0858accb535da8cf86797c44358b7cded05599af684c58a71f9a7e4c0a111242a58794b041e62036641582ad14b4e015b35082a9189535becf26364431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33", + "06489029253e9fd3aec82c19662434225c32244c91840c8e5c34b2c8b4a4fdda30ba45d7f57de164b3aa9ece4b77a89098e5c001b43ee1a8859f1209a558442af7a49102dd52135c07ef99e633b2848ff4fa08143e1db73c9f4e3b20dd54d500795b72dfef7b53cb39a6208babe70df241530c60fe60d633c1550d3d3abb9bb30831d61e841d524e544f908c340bd58e30de8e27e9159683932fecc6b204b185e644b746b9f82276c8f72826491ab3720d708a06b466290917f1380aee393ac0c61a73afaf94c56913006bc1df239fd5b8fdcfecff6c7df4dbefb49a8b7c77a5afc72b98fe4b97278f0eae2ba038a2d60064cd25924c14665cc237834039da18c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77" + ] + ], + "public_share": "7bbadfa788aa88120a30d451bacc73bd95c77e9064fb21ec1a6283cd6241849c64431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + }, + { + "input_shares": [ + "85d237df3416b710eaf3a8de047980d219fc28c39f5fbdc7aee7b838034e2ea98dba20fb535040a21d805c78b8322906c8466acbbcd3a641dd4fec7fab05a795dacdef8c4cb6e6d1bf77b2a2559ad3e927540dfd13e8879173995a3b17c6a6622fe49768084ab70a6e423614bee0b6780036300b36517532168778de9ba321669ba5f321fcf73afbdc9c6255ef66d37d1ce1c390dff9607aabca6a32253aa447de9cfe68ca30827938402d0394cd892bf01e4dce1bdc57534069593d91430c2c86936d12debb90b07f1d32bcc28d8567b53ea47fd94ec9b90cfde39cada3ebba6f0d309e8aee29b9634b596880de0a02e8f44feab8f1144bfb3ce4e9002d1e2612e1ca567c63786f2c062f3540a0050a18f3459e79ab568caf1a5b1c52d29220362eeecc342967ef412a96894c8dd0ea8919c00bedcc2219b5b95e21e67e5aa0eef98064dab57378adeec40ebe5982234825b2f5908a4a7efc07ef57f1187f5e65ae268bfa646ecd80b6df6fac333cc00f42d8348600bb607321323d7124b7a2f90bacbf03f6cc690f4cf3be68868e97076828c70b0a9ab0d5e3599aa879957d3bbd7e6a59e677b3a4da26762aeeeb4c143f9241696613516f5d482f2d4246dd3844219e92bb6ba6d949af52205d6c7d9b567cf84d1fe21b3f19ebc1914904134e69146421b186095e05d395b64bbecf9bf21fee1a693853cccc0470e54001fd60fa4a5ad4be1b4f19b64e21111480b44638cbe6c5bce974ec414b8df52c839035f2fbff2ed7d67718d30778989eaf5b1b8fb01416cec455ed2c6416177e584ee49dd204f3778d1ef9ab9470c30e647eedbf80ab482bbf1ca41f6c4b00d62768ede36f6fb8a8ce3aa5e8f9207bec4e86db5cb574a5ad703c679969032234468444414ffe96ca893f500eedda1fb53ad4716099b995e120e7dc403f80ff4d814d91dcd1303a74b17aba4cc44c095d8c6b466b0a2ac415109f50290159a9a921816f85d9247a41f37f4afdaa4228312229285108a505a3981051f69430896bc9c761345d6602926413d003ad380e568f3fd365382c314b3076d34a9458cce0183ed096ab0f8259502653ba7eb6be635cf02306340bb5c0d658db16ebac3afad4d415f0fd316a153fcce9b964ac4d870a7160989de29100e87fafba45028201fe8fb1290b3de20651f31ed9dcb835d1089489f3369181a57c34c979a40d13c46c4969bd4b798e004453664618d913a7c34894ba39657863680ea27a3538cae4403847043556c67a98eadfbadc8baab039f00d7b760f8a884faee09fdd838680892ab9760212182dc94aa845c4283a3216d7b8faea7a3457ca7d25d5d9040ac222bc99731d3c8060a2d375e308d66669ac94ae5dea63d994b2a1066a22b8ed121f1d3d88e532ff5ad471ce5611e1cef203e86db1315be762648ecb578a09df60921c2192a42ba72f618d3ff11ec21dfb5400b6a1797b6878b0f676e414da6d5daeb53abb0efb3e9ee48da608dcc3a87b27cb86fd833c034ade3db7cdb647b2b3d32996abb215aa7ca129b68c82477c96aa6c3c2b7f36bd78e5604a4357f94d613ecac900fa40abdc13b070239f72286c02350005c38fc1bac3208ca43c94a49b02395574079eb726edeaf48335176cd92f5cb75bb35da307c15077a2cb3645bc085d1fd8f4a08f9c26e0b579b4f0e0ab25d8e320568f5e17f1294aaeaf3a5d9d6a1af37c657daad45013c7de10bfa224fda0808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" + ], + "measurement": [ + 15986, + 24671, + 23910 + ], + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "75afcb193c2af55c231d91dc18f5f65b", + "12e1b195387cce74c9aa641f34b79189", + "18e98a001042cdd7357d4e74aaa8996b" + ], + [ + "0b975ea98108a56cfe3ac48bd98a5530", + "e16cb471c5c0b17598a0b0b58e0919e4", + "4a57e2660c780cc8157619a6b312a257" + ], + [ + "f3f7d53c42cd6536c2a7aa970d80b373", + "6e129af801c37f1566b4ea2a3d3f5592", + "051d9398e3452660980c98e5a144c43c" + ] + ], + "prep_messages": [ + "9cccd419e212147f7e2caed91fbf740e30f2c0b9f644a87d0fc821fbd4d1aa5e" + ], + "prep_shares": [ + [ + "51ffd96b532bbf0a52b2f58afc18ea46e5ce4000200771e413f4cb24396df1a980e32429d5a7424669b4f6f382953063689d00cfef825fdb7baaf88dc5cb203fb5ab15bbd59114354436f75364cfbbd5ff35161ad479308b2ff312c74571caadc27c4bd0934dea828e194d75e35d58411e7a622a90facb38774ac5379205a898eb63d8e9e3a2210d7c22866b61c87eec8cf85dd11a18dfc671bccd58013f06ecdf15d75776293b80fd5fce226f579e6c3bab427d7bfd99e140be2fa1b2e244545a027d22dc1ed7418d9713512eafe0b3d73ab915ae58a08fea6ec80335cc6b1437e2c0dc3bf389b85fee46921ce28851a4fdb3535e345d369838f07ebcf08cdc8f4a5eed4b1e0e0ebaab6a40b65d4241a95c71dfb8f60fcb6bd19f45194478af", + "aab8956a8796a121e384dd5b9dc2e1960ce03fd2e16533a01365b236961d2415141a07a44f86f00b2cda02dd817a2f8537c237958110c96d2102807b0548e9ff5a3e85c1d31a279ed84cdc4d85c2d8f56fd7e1a0188accc8a4776d94782f2431198aa0dfed40b6a0773b3ce324359ebfd5816fc12f785be11f10952ae7129e680e2c33641f01626049d3db97f76f821397efa1f9703b923a4abd8a57ded162ffae872b1c5d6d756b9c775ac1323c62b167c309d1516223a712dfecf56eaef3d5c2ee08eefab0858accb535da8cf867971796f7cbf8bb8b6a03cde19192a18518e4c0a111242a58794b041e62036641582ad14b4e015b35082a9189535becf26364431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33", + "06489029253e9fd3aec82c196624342279049ceb3f21fd8c7d73c37d120de61530ba45d7f57de164b3aa9ece4b77a8904082bda778407df26d1241d8e5cf2e9cf7a49102dd52135c07ef99e633b2848f81d3bbb9d291e6ea6a7652efb15f189d795b72dfef7b53cb39a6208babe70df2a6dd97f9a9c0cb4a5db69df5229872ac0831d61e841d524e544f908c340bd58e500a50c4a2217580795f4d353dee2d34e644b746b9f82276c8f72826491ab372301ad37817bed53aa717e639f8418b63c61a73afaf94c56913006bc1df239fd5d944e2c21c01e3278b1699df9c4290bdafc72b98fe4b97278f0eae2ba038a2d60064cd25924c14665cc237834039da18c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77" + ] + ], + "public_share": "8f4a5eed4b1e0e0ebaab6a40b65d4241a95c71dfb8f60fcb6bd19f45194478af64431e50f84337393bc357c54663ecd37a782e41bc39fc532d5e10c817752c33c5d05045a2b15b194640d6871bb714f4693ee2ee8d0e5861ec969310aa2bcc77", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + } + ], + "shares": 3, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3Sum_0.json b/vdaf/prio3/testdata/Prio3Sum_0.json new file mode 100644 index 000000000..dea8ec7c0 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Sum_0.json @@ -0,0 +1,41 @@ +{ + "agg_param": "", + "agg_result": 100, + "agg_shares": [ + "21d79fba22fcea2e", + "44296045dc0315d1" + ], + "ctx": "736f6d65206170706c69636174696f6e", + "max_measurement": 255, + "prep": [ + { + "input_shares": [ + "43126178225dca30c56c892f4cef3ca6f627cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28eb1156127a87cb71feca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa2ab3bdc62c1db973fabd7f72169d6d5dbe73437837c1c0662bb24addf7e07e6ae56db956b47ccc755b7c35912f67fb1b50659e637f1034ee3214ff4916ea9d1298a119d0e44c922bd17cc333224c31e67dc3282b61b9aab42ca71062aea44000cf3d13d667e8223477604725e654230e2a7fe703f610869e9f65d5a00203af41da5120d8850de22994a3f5de88910257bf11730c7721c63d712f309ff1a16961a6870876f89b7aece0a7aae9726c957a3bbde29775ad0e4159e2cdfaa741f3f8562468e879f0f4e50829d16ade458e32e321f2b7ab80348c4fcd23a2aeb3921b4b6c297d0e0e10ba6ac3839d9be19018012dfcce38bfb12d0caefc81b0bf2901638317c0a708b0d73f45b43aaf7cc1f7eb7ea6bd7f8e1248ef49224f1735c8112e1f740fc7020d3185ed3c588611aa6aed0f49ac90d908e28213b754fc64e330998b132579ea55c4d5be49e026fcb6e962377d3d540fa2d45116efa46182b7175e29f95499362aa5b631a4b504c7289a7cbf673f2f9d0f0e224f37a862ae822b5359c93de1a40e52e142897dcf25ee5bfaf4132019c1ad28f128186fd48b49eeca0ba9c31e25a025e2d5999e2654a02b6d1bd07d2a2095045cbd367a00a2d34976dc10effb80228afb1c3a7f05943053d65bd900b7a4bfd3833a93f1e0c3c0ecc469d10fbc05ac7881c68f0e3229efdc0e7d15d08a63d9c6de25377f4e01bdc64748dcfc1381977f323cce3c0d453c6a97df87718f54f386228fa70b978c331be3c4af998645e68b00d1f95bb7fedd7", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 100, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "21d79fba22fcea2e" + ], + [ + "44296045dc0315d1" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "3930d34b74e6676f0158033969b58f5f113b356a799287a5", + "c8cf2cb48a199890ca5a3a856a34c034919f038dd5483648" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3Sum_1.json b/vdaf/prio3/testdata/Prio3Sum_1.json new file mode 100644 index 000000000..130166210 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Sum_1.json @@ -0,0 +1,47 @@ +{ + "agg_param": "", + "agg_result": 100, + "agg_shares": [ + "0838d7ed77cd6687", + "44296045dc0315d1", + "1a9fc8cca92e84a7" + ], + "ctx": "736f6d65206170706c69636174696f6e", + "max_measurement": 255, + "prep": [ + { + "input_shares": [ + "c7fb0bdef5bfe20176af571fbc49515389eaadd4df90c3529f06e993f24e7938e710c770d2dbd06f9b2523f00213f7baaa65475354cb73e7a5d9f889974b2e776e8b996484aeb62b04576947b5a96b0a72189f03c37c2a8309fee95bc15681c9115ee8147e871e4f1edb0ec1e56b68ad083182c17baa213f17a8d8624f21213c55a404746658fb100e1cb0a086315bbcba60c6e3ed3018ed8e7e837f2033bb8284a440d0822e5aaf2cc0dc43c6fc7f78a9a9b2471a4db243f8de37a30b6bcc6c8369f1c6d0c80cc096d25fff0aee3a6e2f9d6da165b01cfe2d7141caa00439e110b68fdd94556d1506ef1499cd969438d98b641f9c132ed547da7eab49dff9c0545f57abbf971f52ccd2e993781cd0cd2c8788b5279e5f70339731ac86ed9195cd3c60836b6dd9698fd1e4ad7050a698df611eee9c5ba98f10e6b64485d7c82bf48968aacfabf982c4b8d98196e25c276dd5e31ee61144266c66d2d2889047cf0b509d0e447e378c179bbd18386eb389c10cfc815ce724b01e47aafef1bb8e52753548f77626a0af40b75036ad6518e293284f82ccb28b4baa512c45276c2986908c87cc69c53f9ac7e0d6850ee756cd430745239b545552c8776d6bd3e2573415e89d96f6b4064456d4cdeb577f87eff828e008e6b1ec0b5943abef717959c0816e12f771fe4feac12ebf5eebb6a268182d25e08027a8dc01a81fbfff43b5604d034cb8d0ba775899a9b6e02bb5542e7ccbeaedf230cedfadf50a541b51281b4d85f67b6c8cfbe1b5e77f95b70053553d7686ee34f5bc6462a0121af4d61057bdea117ebc86fb37f8ac45955a6b73d7dfa2a193033b4524a106de810ac96c754ffc1e46b09c6310564f3a58cfcc123f9fc6d9a530bd16fcbfe45a0dd91b929f", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", + "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + ], + "measurement": 100, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "0838d7ed77cd6687" + ], + [ + "44296045dc0315d1" + ], + [ + "1a9fc8cca92e84a7" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "bc2b0bbf09338766f8abb2e591e5b779587a4647599932a2", + "c8cf2cb48a199890ca5a3a856a34c034919f038dd5483648", + "7d04c88c6ab3e008f1ee26ce020902b52a880fe76f72d29a" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f" + } + ], + "shares": 3, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/Prio3Sum_2.json b/vdaf/prio3/testdata/Prio3Sum_2.json new file mode 100644 index 000000000..e98afe5c2 --- /dev/null +++ b/vdaf/prio3/testdata/Prio3Sum_2.json @@ -0,0 +1,230 @@ +{ + "agg_param": "", + "agg_result": 1521, + "agg_shares": [ + "3d90b1d19acf1386", + "b5754e2e6430ec79" + ], + "ctx": "736f6d65206170706c69636174696f6e", + "max_measurement": 1337, + "prep": [ + { + "input_shares": [ + "43126178225dca30c56c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28ea1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ad56db956b47ccc755b7c35912f67fb18ef8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e1f16577d02c362b788f2ba75655f48c3de2deca86d4c16dcb7ad16ee9be9abefb92edfc5ff3f936fb870dfe8d010e933b3d757755f70869463b12f0fee4391df94d8c3eaea71cb9eb448cebdcf1a9389aaffdf0add9c1ba4a3395ee3552988f68f846abd0d4c21d80797b31b3c093280a6dab8f6eb620cc224271c24a8e837b46c41d7448f92e8544b91b9258da94f10f9cc0c289acc1ca98e4921970f4645da92de8c4f01ceed91f67287a63c48f0efe31870630655eb8e771eae674a07d9208c92248153875c1a173ec6d0dbac7277d81f7d42fe00695163970bd22113a1fe897d45d0ae3ecd9232fc2f27cfe06c208fc152c37ff03f7daed0f49ac90d908eec2c33ecde71954dab2f085aff8226bc2d45c429c64678b147529367ef72e8e9ceac003b71c2dc01c96492eade00fc99ef01c7474f412e2526c2c5d54317487a37438dea9bd856781e92e0e296508b7e1d5f87e9e7df53669767fb7e72e5ae3ed7a009d3ee17a95cff7177086562e030875d1a518d2907983566800da114a280ee272902bcec631ed13e4e77f9aec2650667549603727f3fdd4dbb2476ec096b6b51ef2a4629889d8b8ad8018e594ce34bb030c6b68ccc6fc9db02c3a12a608eb01a1fbfbd64b152636ef87af0fb310d8ef8aae46ccbb794c59dd711cdda905e679f47c5fbad52209d211213c7f4111b38aa9f97c5f0c700", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 0, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "4a3136daf279c290" + ], + [ + "b7cec9250c863d6f" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "fc4370f72d35fb2151811ef413c956ff342b7195eb58731e", + "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "44126178225dca30c56c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28ea1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db9740abd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ad56db956b47ccc755b7c35912f67fb18ef8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034ea72dc76b211a70eb7fe9fdf23cf0bcce943e3cf677b2b53094dcd6fb6ac97ec4a05af004e87f92c6b406483756e68cb6325ddf6eb8da274f53ad4ca0581ebd88f82e66c767a58d0db89ff54c7319f5a2375a9f0d03890626247e02d2b5d3052be84c40b561eb5dbff61791c03271b92aef7f8973c1b2dd8bfd71a06e7d20198578a0d8ff103a4daae2f7ef838ba428d310c7e6f08dc4251b9ee657be8ff079b8ee17832393d334fc3f5254aec43a035d6944ba57c76d7ac9e02595222da66e469ad2edf1793434b1603d183b8fbb1d2699cf69935df52598abe65d9a0db52afbd1f1fc495705efe608118cda6d9e946349c54f32cea15eb2aed0f49ac90d908e6415c3fdbf1a8819b438c5dc27f2b1b0763474dcbce0d85c6923d35921931515e880effb8782ddaacdce299c592b5817707c3f4ef6d68c6a36c6a844d93c1cd1d2ecea0d20a594091a3bb953f35129659004c8e6c1f368e415235790133b310a7ed833db9a786c7510f199636efa58863eb849d4b7d935ce5c1bfcc2cbdcc0afe3c827473945ffc83bd81719fab3e9a2ef6c7acd0f7a76cdcdb084fdf541d58c0f18f956b423413341ab0bfa06673976c584e6d1f5733d3560d41b08bf8bca68a3da554e96b7d9bb1a6fa6103ded865ecd48be930dd7fa4d7d4e8549e1380762202b904b52e730ccc80cb65f2737ead77fa6a228763fa9cb", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 1, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "4b3136daf279c290" + ], + [ + "b7cec9250c863d6f" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "fc4370f72d35fb211eb662209e58e2405d1a1b206c9f3fc5", + "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "44126178225dca30c56c892f4cef3ca6f527cae360f77d4b2a94ee7fbe779a5893f97897b3c5ff28eb1156127a87cb71fdca3aa67f3f66472914077ef4bb37488345444045a2293f2c51f6d5d497646aa2ab3bdc62c1db9740abd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ae56db956b47ccc756b7c35912f67fb18ff8f9f52712c3080f914b74f00382004b165013481acf8be9175a22a882aa0eb80e78e0de28541109838a52471413dfb50659e637f1034e4ea3f731bdcdb2d15cde40b82ae8b2f958cf9926b84d1f101b2aacba2766ca4f0211a744f01ad937622bca186d7448311074990955f2f6cdde5c72c7790e6c1950807b95f52c6638327753e1ffa6a80bcf15500c8d5dcee16ad2d9a8374b9dbbf4eb9fe829c7607f5301f9b7e4aace4447dc7eb670e39324605c593843aa1ca2a846e48361529f2ac54ff9e68652a1b4b5e81d20835332fc2f405d2586293bb2266a5659025590a010a73442884f49010e7f6f3a71dfc5936fe02415e08651a00f20b7f6ecdda5921f2c3d4a2c5fb6529036b0e54c25f2c52e13d722c7e29d2ec197666a44f8fea894e4bb0d47c340e5778ac90f3d6d5709aed0f49ac90d908ebd9f923724674533d74382173afabb85b2a316ac7c456f7de2d5fd9a64f6c98985ca38bc80e796391faaa7ba429d9c9c936585b358bfbdebaa16831db94c6d407b9bd53f911dbcdea0635bbf66c475fcf84817e8371fa128d0ce7fb990c399797239d4a7d29c69b5b307326cbcc0436ce55b549109a97f35f93043f90553bd92b2221cc3e92cad4858800eb6fe0571c14b4b439e19eb69ec3c577f96ff081493d7c5252145a2e58e70562b664352f3d1204a31ef4b02f26ad1198c150cabe70e2e8d8c49230e68da5b808101a049ee31d6e177411ea72e20f9210cc1280b942e2f85262b66f4200a3c39862c4e123e5650e1284b0874b074", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 1337, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "833636daf279c290" + ], + [ + "b7cec9250c863d6f" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "fc4370f72d35fb21d1a2b4da13818ff19ae1da2daa52e440", + "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "44126178225dca30c66c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28eb1156127a87cb71feca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db9740abd7f72169d6d5dbe73437837c1c0661bb24addf7e07e6ae56db956b47ccc755b7c35912f67fb18ff8f9f52712c3080e914b74f00382004a165013481acf8be9175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e2e45375c41717d1d236e9d21e14c017ce572e18159e66d4eb3dbc784f8d5abc618c775703bf481a0599570c8ceb21ce9d4ab6c6d423578fa1198c7d8a5c499db443c9d9bf0d159bd25689231e5676d85e579ce0c032e9418bcd1daf6f248e470b12101afcbee6af953382fe0e8ed45b45730df5fe92bebb2e5fe76d958ecb1ec6af571ab2275371c13488a57f0e44966f75bf52dbc97383a702a187d53f95aa7273000c599ab06bba08836d40c710a2d140f38ae642a38bbab722dfd95b361dbd10373448b601da441085f7fa5afe5eabe4ce2e4f921dddcf6311a3afb1c7f671a819380aa3aaff841b6e05d27348a3396e9a69fa7f02e9daed0f49ac90d908eddfd520da0c37ae70fb425ae84956d032500cf50dbac203f4a24e2d09386e81270146a90340eeed02940010be05ec8e4cf2db24f6b7c3cbf78db2d0c8c963f7e87dfb3399678c859ad721c6f8103b182e2e498e7c14edbf17ecf7e6bd5c552c4b50373e130755f3bb4d0fb43b77dccfcd607f4e78f6028a7748e2558f0102848f0738e9b280a155709887d459673c80f08d86b90e1a663aefb6cc43e3239f49dd6ff7bb5ad4b6f74e07429d4be3032a61aba687b58b77f439687832d557ed7d36ca9d0fb848bf0c83aa45fcc25f9be99a8cb454271aa43093203c9a9f3d0b2f5d79bf914ffb170ba8e6761dc6ea1f40732824bbb9cf0d8e0", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 99, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "ad3136daf279c290" + ], + [ + "b7cec9250c863d6f" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "fc4370f72d35fb21738306b80716f2e4c51acbcc0158dd8a", + "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "43126178225dca30c66c892f4cef3ca6f527cae360f77d4b2a94ee7fbe779a5892f97897b3c5ff28eb1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dbe73437837c1c0661bb24addf7e07e6ad56db956b47ccc756b7c35912f67fb18ff8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e6a39bfe3b1c5b6044408bc17a9684a3c18667bebbb630aa6fef4ccb832bd20d3c926cd7027dad49c10591913ff0ed8c3b77648981e143b75c377f97ca7ad0df4552fecfc97236770bb0a78e08c3aadd08948040da9f2180727ac0999c3b05f11766438b2bf602a6f17d9a978b17667a56daba815bfb4e1978db9ec3a1c118b311eb30dd8572d7015bcfcffe27b6643b377d38d5bf15eb72ab23051b008a16062bf867d586cd07168a115b887ba9970fe7fbf34858ac4c6e967cc9e2c72cdf43f5f4ca960e60585bce5f1ccf5073e49fafddc6cdb16573e9453415cbcdcbaed30c85793400e4962c27e27482776a443fde4e6ca5e373f7dbaaed0f49ac90d908ea009cb85306f4100ee1907b8bc792443f30c35e7772f84e7ff0add9c599f7306bfb4129048289bd4717c58c0b0020d0aeb62d624909d7944c6fbfb678aadcb6576ec64d8ee26bba617d036c0d93071373d1663e71c8a560312f54fc9055ed723f0c03bde3c03a0c5ef2f81abeff4aa0bc08c2a32bad731c2cbd3aff62dec4e033cb6f26ef351dc5d61d307ba09f2cec28860d362acdfe4bdb9668b0b7d91eee23ea9fe21db2604c7e0e7a7201008ccd4af096ca4321df114d92d12fe7964446fde609adf29e688b096baf155c36a5b8a693bbb4b5475e251d4f386271333442c29c5f9549ba3bdf052f6f9121f313b3ee48427fc0ca28ac3", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 42, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "743136daf279c290" + ], + [ + "b7cec9250c863d6f" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "fc4370f72d35fb2167e02e21452d6637328672ffd0423630", + "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "43126178225dca30c56c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28ea1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ad56db956b47ccc755b7c35912f67fb18ef8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e1f16577d02c362b788f2ba75655f48c3de2deca86d4c16dcb7ad16ee9be9abefb92edfc5ff3f936fb870dfe8d010e933b3d757755f70869463b12f0fee4391df94d8c3eaea71cb9eb448cebdcf1a9389aaffdf0add9c1ba4a3395ee3552988f68f846abd0d4c21d80797b31b3c093280a6dab8f6eb620cc224271c24a8e837b46c41d7448f92e8544b91b9258da94f10f9cc0c289acc1ca98e4921970f4645da92de8c4f01ceed91f67287a63c48f0efe31870630655eb8e771eae674a07d9208c92248153875c1a173ec6d0dbac7277d81f7d42fe00695163970bd22113a1fe897d45d0ae3ecd9232fc2f27cfe06c208fc152c37ff03f7daed0f49ac90d908eec2c33ecde71954dab2f085aff8226bc2d45c429c64678b147529367ef72e8e9ceac003b71c2dc01c96492eade00fc99ef01c7474f412e2526c2c5d54317487a37438dea9bd856781e92e0e296508b7e1d5f87e9e7df53669767fb7e72e5ae3ed7a009d3ee17a95cff7177086562e030875d1a518d2907983566800da114a280ee272902bcec631ed13e4e77f9aec2650667549603727f3fdd4dbb2476ec096b6b51ef2a4629889d8b8ad8018e594ce34bb030c6b68ccc6fc9db02c3a12a608eb01a1fbfbd64b152636ef87af0fb310d8ef8aae46ccbb794c59dd711cdda905e679f47c5fbad52209d211213c7f4111b38aa9f97c5f0c700", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 0, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "4a3136daf279c290" + ], + [ + "b7cec9250c863d6f" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "fc4370f72d35fb2151811ef413c956ff342b7195eb58731e", + "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "43126178225dca30c56c892f4cef3ca6f527cae360f77d4b2994ee7fbe779a5892f97897b3c5ff28ea1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dce73437837c1c0662bb24addf7e07e6ad56db956b47ccc755b7c35912f67fb18ef8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e1f16577d02c362b788f2ba75655f48c3de2deca86d4c16dcb7ad16ee9be9abefb92edfc5ff3f936fb870dfe8d010e933b3d757755f70869463b12f0fee4391df94d8c3eaea71cb9eb448cebdcf1a9389aaffdf0add9c1ba4a3395ee3552988f68f846abd0d4c21d80797b31b3c093280a6dab8f6eb620cc224271c24a8e837b46c41d7448f92e8544b91b9258da94f10f9cc0c289acc1ca98e4921970f4645da92de8c4f01ceed91f67287a63c48f0efe31870630655eb8e771eae674a07d9208c92248153875c1a173ec6d0dbac7277d81f7d42fe00695163970bd22113a1fe897d45d0ae3ecd9232fc2f27cfe06c208fc152c37ff03f7daed0f49ac90d908eec2c33ecde71954dab2f085aff8226bc2d45c429c64678b147529367ef72e8e9ceac003b71c2dc01c96492eade00fc99ef01c7474f412e2526c2c5d54317487a37438dea9bd856781e92e0e296508b7e1d5f87e9e7df53669767fb7e72e5ae3ed7a009d3ee17a95cff7177086562e030875d1a518d2907983566800da114a280ee272902bcec631ed13e4e77f9aec2650667549603727f3fdd4dbb2476ec096b6b51ef2a4629889d8b8ad8018e594ce34bb030c6b68ccc6fc9db02c3a12a608eb01a1fbfbd64b152636ef87af0fb310d8ef8aae46ccbb794c59dd711cdda905e679f47c5fbad52209d211213c7f4111b38aa9f97c5f0c700", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 0, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "4a3136daf279c290" + ], + [ + "b7cec9250c863d6f" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "fc4370f72d35fb2151811ef413c956ff342b7195eb58731e", + "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + }, + { + "input_shares": [ + "43126178225dca30c66c892f4cef3ca6f527cae360f77d4b2a94ee7fbe779a5892f97897b3c5ff28eb1156127a87cb71fdca3aa67f3f66472914077ef4bb37488245444045a2293f2c51f6d5d497646aa1ab3bdc62c1db973fabd7f72169d6d5dbe73437837c1c0661bb24addf7e07e6ad56db956b47ccc756b7c35912f67fb18ff8f9f52712c3080f914b74f00382004b165013481acf8be8175a22a882aa0eb80e78e0de28541108838a52471413dfb50659e637f1034e6a39bfe3b1c5b6044408bc17a9684a3c18667bebbb630aa6fef4ccb832bd20d3c926cd7027dad49c10591913ff0ed8c3b77648981e143b75c377f97ca7ad0df4552fecfc97236770bb0a78e08c3aadd08948040da9f2180727ac0999c3b05f11766438b2bf602a6f17d9a978b17667a56daba815bfb4e1978db9ec3a1c118b311eb30dd8572d7015bcfcffe27b6643b377d38d5bf15eb72ab23051b008a16062bf867d586cd07168a115b887ba9970fe7fbf34858ac4c6e967cc9e2c72cdf43f5f4ca960e60585bce5f1ccf5073e49fafddc6cdb16573e9453415cbcdcbaed30c85793400e4962c27e27482776a443fde4e6ca5e373f7dbaaed0f49ac90d908ea009cb85306f4100ee1907b8bc792443f30c35e7772f84e7ff0add9c599f7306bfb4129048289bd4717c58c0b0020d0aeb62d624909d7944c6fbfb678aadcb6576ec64d8ee26bba617d036c0d93071373d1663e71c8a560312f54fc9055ed723f0c03bde3c03a0c5ef2f81abeff4aa0bc08c2a32bad731c2cbd3aff62dec4e033cb6f26ef351dc5d61d307ba09f2cec28860d362acdfe4bdb9668b0b7d91eee23ea9fe21db2604c7e0e7a7201008ccd4af096ca4321df114d92d12fe7964446fde609adf29e688b096baf155c36a5b8a693bbb4b5475e251d4f386271333442c29c5f9549ba3bdf052f6f9121f313b3ee48427fc0ca28ac3", + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" + ], + "measurement": 42, + "nonce": "000102030405060708090a0b0c0d0e0f", + "out_shares": [ + [ + "743136daf279c290" + ], + [ + "b7cec9250c863d6f" + ] + ], + "prep_messages": [ + "" + ], + "prep_shares": [ + [ + "fc4370f72d35fb2167e02e21452d6637328672ffd0423630", + "05bc8f08d1ca04de00af93b17bde18cbad698b7a7dd6d58d" + ] + ], + "public_share": "", + "rand": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" + } + ], + "shares": 2, + "verify_key": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/testdata/XofTurboShake128.json b/vdaf/prio3/testdata/XofTurboShake128.json new file mode 100644 index 000000000..bfd78ffeb --- /dev/null +++ b/vdaf/prio3/testdata/XofTurboShake128.json @@ -0,0 +1,8 @@ +{ + "binder": "62696e64657220737472696e67", + "derived_seed": "b62ef0a2778190792d4d42d8c167ba20e0c37a3f319ba79645829c427d70eea5", + "dst": "646f6d61696e2073657061726174696f6e20746167", + "expanded_vec_field128": "b62ef0a2778190792d4d42d8c167ba20e0c37a3f319ba79645829c427d70eea56d92fef65a07b17a0438e25452cdc7f15f63caf0e8a2a3c72ac69524729e64e03c7ec3a3afa7eb21cb6da6abf0a3b73630a91a5fa05dcbd33da3476f1c8bf4fd66fe5a80dd04bc95f0f02cb8fc9035b9e16e3a5c373bf81c820af513e0c832ca672c66dcc3b302fb8b27a48f09e0a843f5caf87b3c6c1c4b6765b5923e1d152c2e695601abbc69dbe810860fb30e871a2549861110672335ce50ee632264cbb21f62595298d1d1ad9303b84664801e52112989dfce93f0f9dc833ee0f4a0672ffe47cb0a13f80f9e9b7a2e267db7f7890ccd064bf2458cd4e27162d13e60dbc1b6cae71635a3e603f2c15d1c64a12d4e8235f7bf0a8efe6bb15f3e2adae06f7dd1c4d63ac6cecae731250f73c063c6e59aef630a7b6f4bc64bddadc8b8a479bfdb64ea31e6ab44540a52a8d3399d64a060d50190d66cac1335d739e5f8d508201058a2e0cc1ed90e23cfdc7a253f24710ef3b1604688606386dcc4c90e8476be9daac3271ac51301868df71a719a5f32184145d70fec31b4693d527f53875a2ea013523d3daa33bc49c22f66c9ae70dd7f06f227f50515ea9ab1fbe0162cf761e596d8999809cf672cd2d82b22231f841c36e494d7e44f7c6f07e29758b1b73ce95b202325116f04067a54aa767eab2e00ce55b3abcd5c3d5b05040a6bf5d4ba8a61267004bb82b12d43b08fed8f9aced3e833a58fc01004526631b0f4192d8754a397e1096511ee23761a29fcd6511ad2e5020683ca877e4075fe6bc5907f7df1ed4b6c97e0f897d781e850da0cf584842c124cdb6011fe8660e3b8c354cd659985332ea158ffcba83253d39803fa7efb9fcd02cea38089f239f68404814973", + "length": 40, + "seed": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" +} diff --git a/vdaf/prio3/vectors_test.go b/vdaf/prio3/vectors_test.go new file mode 100644 index 000000000..e867a1e86 --- /dev/null +++ b/vdaf/prio3/vectors_test.go @@ -0,0 +1,219 @@ +package prio3 + +import ( + "path/filepath" + "slices" + "strings" + "testing" + + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/vdaf/prio3/count" + "github.com/cloudflare/circl/vdaf/prio3/histogram" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" + "github.com/cloudflare/circl/vdaf/prio3/mhcv" + "github.com/cloudflare/circl/vdaf/prio3/sum" + "github.com/cloudflare/circl/vdaf/prio3/sumvec" +) + +type VectorCount struct { + VectorBase[uint64, uint64] +} + +type VectorSum struct { + VectorBase[uint64, uint64] + MaxMeas uint64 `json:"max_measurement"` +} + +type VectorSumVec struct { + VectorBase[[]uint64, []uint64] + Length uint `json:"length"` + Bits uint `json:"bits"` + ChunkLen uint `json:"chunk_length"` +} + +type VectorHistogram struct { + VectorBase[uint64, []uint64] + Length uint `json:"length"` + ChunkLen uint `json:"chunk_length"` +} + +type VectorMultiHotCountVec struct { + VectorBase[[]bool, []uint64] + Length uint `json:"length"` + MaxWeight uint `json:"max_weight"` + ChunkLen uint `json:"chunk_length"` +} + +type VectorBase[Measurement, Aggregate any] struct { + Prep []Prepare[Measurement] `json:"prep"` + Params[Aggregate] +} + +type Params[Aggregate any] struct { + AggParam string `json:"agg_param"` + AggResult Aggregate `json:"agg_result"` + AggShares []Hex `json:"agg_shares"` + Ctx Hex `json:"ctx"` + VerifyKey Hex `json:"verify_key"` + Shares uint8 `json:"shares"` +} + +type Prepare2[Measurement any] struct { + Measurement Measurement `json:"measurement"` + PrepareParams +} + +type Prepare[Measurement any] struct { + Measurement Measurement `json:"measurement"` + PrepareParams +} + +type PrepareParams struct { + InputShares []Hex `json:"input_shares"` + Nonce Hex `json:"nonce"` + OutShares [][]Hex `json:"out_shares"` + PrepMessages []Hex `json:"prep_messages"` + PrepShares [][]Hex `json:"prep_shares"` + PublicShare Hex `json:"public_share"` + Rand Hex `json:"rand"` +} + +func convert[Aggregate any]( + t testing.TB, in *VectorBase[uint64, Aggregate], +) (out VectorBase[bool, Aggregate]) { + out.Params = in.Params + out.Prep = make([]Prepare[bool], len(in.Prep)) + for i := range in.Prep { + out.Prep[i].PrepareParams = in.Prep[i].PrepareParams + switch in.Prep[i].Measurement { + case 0: + out.Prep[i].Measurement = false + case 1: + out.Prep[i].Measurement = true + default: + t.Fatal("invalid measurement") + } + } + + return +} + +func TestVector(t *testing.T) { + fileNames, err := filepath.Glob("./testdata/Prio3*.json") + if err != nil { + t.Fatal(err) + } + + for _, fileName := range fileNames { + testName := strings.TrimSuffix(filepath.Base(fileName), ".json") + + t.Run(testName, func(t *testing.T) { + vdaf := strings.Split(strings.TrimPrefix(testName, "Prio3"), "_")[0] + + switch vdaf { + case "Count": + v := readFile[VectorCount](t, fileName) + c, err := count.New(v.Shares, v.Ctx) + test.CheckNoErr(t, err, "new Count failed") + runPrio3(t, c, convert(t, &v.VectorBase)) + + case "Sum": + v := readFile[VectorSum](t, fileName) + s, err := sum.New(v.Shares, v.MaxMeas, v.Ctx) + test.CheckNoErr(t, err, "new Sum failed") + runPrio3(t, s, v.VectorBase) + + case "SumVec": + v := readFile[VectorSumVec](t, fileName) + s, err := sumvec.New( + v.Shares, v.Length, v.Bits, v.ChunkLen, v.Ctx) + test.CheckNoErr(t, err, "new SumVec failed") + runPrio3(t, s, v.VectorBase) + + case "Histogram": + v := readFile[VectorHistogram](t, fileName) + h, err := histogram.New(v.Shares, v.Length, v.ChunkLen, v.Ctx) + test.CheckNoErr(t, err, "new Histogram failed") + runPrio3(t, h, v.VectorBase) + + case "MultihotCountVec": + v := readFile[VectorMultiHotCountVec](t, fileName) + m, err := mhcv.New( + v.Shares, v.Length, v.MaxWeight, v.ChunkLen, v.Ctx) + test.CheckNoErr(t, err, "new MultiHotCountVec failed") + runPrio3(t, m, v.VectorBase) + + default: + t.Fatal("unexpected test v for " + vdaf) + } + }) + } +} + +func runPrio3[ + P Prio3[ + Measurement, Aggregate, + AggShare, InputShare, OutShare, PrepShare, PrepState, + ], + Measurement, Aggregate any, + AggShare, InputShare, OutShare, PrepShare, PrepState any, +](t *testing.T, p P, v VectorBase[Measurement, Aggregate]) { + params := p.Params() + shares := params.Shares() + verifyKey := prio3.VerifyKey(v.VerifyKey) + + aggShares := make([]AggShare, shares) + for i := range aggShares { + aggShares[i] = p.AggregationInit() + } + + for _, instance := range v.Prep { + nonce := prio3.Nonce(instance.Nonce) + randb := instance.Rand + meas := instance.Measurement + + pubShare, inputShares, err := p.Shard(meas, &nonce, randb) + test.CheckNoErr(t, err, "shard failed") + checkEqual(t, &pubShare, instance.PublicShare) + for i := range inputShares { + checkEqual(t, &inputShares[i], instance.InputShares[i]) + } + + var prepStates []*PrepState + var outboundPrepShares []PrepShare + for i := range shares { + state, share, errx := p.PrepInit( + &verifyKey, &nonce, i, pubShare, inputShares[i]) + test.CheckNoErr(t, errx, "prepare init failed") + + prepStates = append(prepStates, state) + outboundPrepShares = append(outboundPrepShares, *share) + } + + for i := range outboundPrepShares { + checkEqual(t, &outboundPrepShares[i], instance.PrepShares[0][i]) + } + + prepMsg, err := p.PrepSharesToPrep(outboundPrepShares) + test.CheckNoErr(t, err, "PrepSharesToPrep failed") + checkEqual(t, prepMsg, instance.PrepMessages[0]) + + for i := range shares { + outShare, err := p.PrepNext(prepStates[i], prepMsg) + test.CheckNoErr(t, err, "PrepNext failed") + checkEqual(t, outShare, slices.Concat(instance.OutShares[i]...)) + + p.AggregationUpdate(&aggShares[i], outShare) + } + } + + numMeas := uint(len(v.Prep)) + aggResult, err := p.Unshard(aggShares, numMeas) + test.CheckNoErr(t, err, "unshard failed") + + got := *aggResult + want := v.AggResult + if !isEqual(t, got, want) { + test.ReportError(t, got, want) + } +} diff --git a/vdaf/prio3/xof_test.go b/vdaf/prio3/xof_test.go new file mode 100644 index 000000000..992da0e6d --- /dev/null +++ b/vdaf/prio3/xof_test.go @@ -0,0 +1,95 @@ +package prio3 + +import ( + "bytes" + "encoding/binary" + "testing" + + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/arith/fp128" + "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" +) + +type VecXof struct { + Binder Hex `json:"binder"` + DerivedSeed Hex `json:"derived_seed"` + Dst Hex `json:"dst"` + ExpVecField128 Hex `json:"expanded_vec_field128"` + Seed Hex `json:"seed"` + Length uint `json:"length"` +} + +func prepXof( + t *testing.T, seed *prio3.Seed, dst, binder []byte, +) (*sha3.State, error) { + context := dst[8:] + usage := binary.BigEndian.Uint16(dst[6:]) + + x, err := prio3.NewXof[fp128.Vec](0, context) + test.CheckNoErr(t, err, "NewXof failed") + copy(x.Header[2:], dst) + + err = x.Init(usage, seed) + if err != nil { + return nil, err + } + + err = x.SetBinderBytes(binder) + if err != nil { + return nil, err + } + + return &x.State, nil +} + +func TestXof(t *testing.T) { + v := readFile[VecXof](t, "testdata/XofTurboShake128.json") + + t.Run("DeriveSeed", func(t *testing.T) { + r, err := prepXof(t, (*prio3.Seed)(v.Seed), v.Dst, v.Binder) + test.CheckNoErr(t, err, "create xof failed") + + var got prio3.Seed + _, err = r.Read(got[:]) + test.CheckNoErr(t, err, "deriving seed failed") + + want := prio3.Seed(v.DerivedSeed) + if got != want { + test.ReportError(t, got, want) + } + }) + + t.Run("VecFp128/RandomSHA3", func(t *testing.T) { + r, err := prepXof(t, (*prio3.Seed)(v.Seed), v.Dst, v.Binder) + test.CheckNoErr(t, err, "create xof failed") + + a := arith.NewVec[fp128.Vec](v.Length) + err = a.RandomSHA3(r) + test.CheckNoErr(t, err, "random vector failed") + + got, err := a.MarshalBinary() + test.CheckNoErr(t, err, "MarshalBinary failed") + + want := v.ExpVecField128 + if !bytes.Equal(got, want) { + test.ReportError(t, got, want) + } + }) + + t.Run("VecFp128/RandomSHA3Bytes", func(t *testing.T) { + r, err := prepXof(t, (*prio3.Seed)(v.Seed), v.Dst, v.Binder) + test.CheckNoErr(t, err, "create xof failed") + + a := arith.NewVec[fp128.Vec](v.Length) + got := make([]byte, a.Size()) + err = a.RandomSHA3Bytes(got[:0], r) + test.CheckNoErr(t, err, "random vector failed") + + want := v.ExpVecField128 + if !bytes.Equal(got, want) { + test.ReportError(t, got, want) + } + }) +} From d17d891682afccb3420564e081a7da21d9e8f8ea Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 16 Dec 2024 22:54:20 -0800 Subject: [PATCH 22/45] Adds auxiliary functions for marshalling data. --- internal/conv/conv.go | 33 +++++++++++++++++++++++++++++++++ math/integer.go | 12 ++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 math/integer.go diff --git a/internal/conv/conv.go b/internal/conv/conv.go index 649a8e931..3fd0df496 100644 --- a/internal/conv/conv.go +++ b/internal/conv/conv.go @@ -5,6 +5,8 @@ import ( "fmt" "math/big" "strings" + + "golang.org/x/crypto/cryptobyte" ) // BytesLe2Hex returns an hexadecimal string of a number stored in a @@ -138,3 +140,34 @@ func BigInt2Uint64Le(z []uint64, x *big.Int) { z[i] = 0 } } + +// MarshalBinary encodes a value into a byte array in a format readable by UnmarshalBinary. +func MarshalBinary(v cryptobyte.MarshalingValue) ([]byte, error) { + const DefaultSize = 32 + b := cryptobyte.NewBuilder(make([]byte, 0, DefaultSize)) + b.AddValue(v) + return b.Bytes() +} + +// MarshalBinaryLen encodes a value into an array of n bytes in a format readable by UnmarshalBinary. +func MarshalBinaryLen(v cryptobyte.MarshalingValue, length uint) ([]byte, error) { + b := cryptobyte.NewFixedBuilder(make([]byte, 0, length)) + b.AddValue(v) + return b.Bytes() +} + +// A UnmarshalingValue decodes itself from a cryptobyte.String and advances the pointer. +// It reports whether the read was successful. +type UnmarshalingValue interface { + Unmarshal(*cryptobyte.String) bool +} + +// UnmarshalBinary recovers a value from a byte array. +// It returns an error if the read was unsuccessful. +func UnmarshalBinary(v UnmarshalingValue, data []byte) (err error) { + s := cryptobyte.String(data) + if data == nil || !v.Unmarshal(&s) || !s.Empty() { + err = fmt.Errorf("cannot read %T from input string", v) + } + return +} diff --git a/math/integer.go b/math/integer.go new file mode 100644 index 000000000..db00215af --- /dev/null +++ b/math/integer.go @@ -0,0 +1,12 @@ +package math + +import "math/bits" + +func NextPow2(n uint) (twoN uint, N uint) { + if bits.OnesCount(n) == 1 { + return n, uint(bits.TrailingZeros(n)) + } else { + N = uint(bits.Len(n)) + return uint(1) << N, N + } +} From f99433a3664cd102608f301aa400b516f45a37b7 Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 16 Dec 2024 22:59:40 -0800 Subject: [PATCH 23/45] Adding doc file for VDAF. --- vdaf/doc.go | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 vdaf/doc.go diff --git a/vdaf/doc.go b/vdaf/doc.go new file mode 100644 index 000000000..5aba7fd1b --- /dev/null +++ b/vdaf/doc.go @@ -0,0 +1,2 @@ +// Package vdaf provides verifiable distributed aggregation functions. +package vdaf From 39b014f4872353ebaeaadb415f978edbeaafb404 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 20 Dec 2024 12:58:13 -0600 Subject: [PATCH 24/45] Add documention to NextPow2 function. --- math/integer.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/math/integer.go b/math/integer.go index db00215af..9c80c23b5 100644 --- a/math/integer.go +++ b/math/integer.go @@ -2,11 +2,15 @@ package math import "math/bits" -func NextPow2(n uint) (twoN uint, N uint) { +// NextPow2 finds the next power of two (N=2^k, k>=0) greater than n. +// If n is already a power of two, then this function returns n, and log2(n). +func NextPow2(n uint) (N uint, k uint) { if bits.OnesCount(n) == 1 { - return n, uint(bits.TrailingZeros(n)) + k = uint(bits.TrailingZeros(n)) + N = n } else { - N = uint(bits.Len(n)) - return uint(1) << N, N + k = uint(bits.Len(n)) + N = uint(1) << k } + return } From cfcf3a7b72db0effd76134817ca6acdd634549e4 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 20 Dec 2024 12:59:57 -0600 Subject: [PATCH 25/45] Add documentation to vdaf package. --- vdaf/doc.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vdaf/doc.go b/vdaf/doc.go index 5aba7fd1b..45894ccdc 100644 --- a/vdaf/doc.go +++ b/vdaf/doc.go @@ -1,2 +1,5 @@ // Package vdaf provides verifiable distributed aggregation functions. +// +// This package supports Prio3 as specified in [v13]. +// [v13]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13 package vdaf From 37860ae972d8948d660fa6f41eff78dbd16b38c3 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 20 Dec 2024 13:22:13 -0600 Subject: [PATCH 26/45] Add documentation to field, vector and poly. --- vdaf/prio3/arith/arith.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/vdaf/prio3/arith/arith.go b/vdaf/prio3/arith/arith.go index d9f6feef4..1d4a8285f 100644 --- a/vdaf/prio3/arith/arith.go +++ b/vdaf/prio3/arith/arith.go @@ -18,6 +18,8 @@ type Elt any // Fp lists the functionality that a prime field element must have denoting // methods with a pointer receiver. +// This interface considers the modulus is an NTT-friendly prime, i.e., +// there exists a multiplicative subgroup formed by the N-th roots of unity. type Fp[E Elt] interface { *E // Size returns the number of bytes to encode a field element. @@ -26,9 +28,9 @@ type Fp[E Elt] interface { IsZero() bool // Returns true if the element is the neutral multiplicative element. IsOne() bool - // Returns true if the element is equivalent to x. + // Returns true if the element is equal to x. IsEqual(x *E) bool - // Set the element to the neutral additive element. + // Set the element to the neutral multiplicative element. SetOne() // Set the element to x if x < Order(). SetUint64(uint64) error @@ -70,13 +72,13 @@ type Fp[E Elt] interface { conv.UnmarshalingValue } -// NewVec returns a vector of length n. +// NewVec returns a vector of length n with all elements set to zero. func NewVec[V Vec[V, E], E Elt](n uint) V { return make(V, n) } -// Vec list the funtionality of a vector of field elements. +// Vec lists the funtionality of a vector of field elements. type Vec[Vec ~[]E, E Elt] interface { ~[]E - // Size returns the number of bytes to encode a vector. + // Size returns the number of bytes to encode the vector. Size() uint // AddAssing calculates z = z + x. AddAssign(x Vec) @@ -86,11 +88,13 @@ type Vec[Vec ~[]E, E Elt] interface { ScalarMul(x *E) // DotProduct calculates z[i] = z[i] * x[i]. DotProduct(x Vec) E - // NTT calculates the number theoretic transform on values. + // NTT calculates the number theoretic transform of the vector. NTT(Vec) // InvNTT calculates the inverse number theoretic transform on values. InvNTT(Vec) // SplitBits sets the vector of elements corresponding to the bits of n. + // The receiving vector sets v[i] = SetUint64(n(i)), where n(i) is the i-th + // bit of n, and len(v) >= log2(n). SplitBits(n uint64) error // JoinBits calculates the element sum( 2^i * z[i] ). JoinBits() E @@ -110,7 +114,8 @@ type Vec[Vec ~[]E, E Elt] interface { conv.UnmarshalingValue } -// NewPoly returns a polynomial of the given degree. +// NewPoly returns a polynomial of the given degree with all coefficients set +// to zero. func NewPoly[P Poly[P, E], E Elt](degree uint) P { return make(P, degree+1) } // Poly lists the funtionality of polynomials with coefficients in a field. @@ -128,6 +133,8 @@ type Poly[Poly ~[]E, E Elt] interface { Evaluate(x *E) E // Strip removes the higher-degree zero terms. Strip() Poly - // Interpolate a polynomial on given the values. - Interpolate([]E) + // Interpolate a polynomial passing through the points (x[i], y[i]), where + // x are the powers of an N-th root of unity, y are the values, and + // N = len(y) must be a power of two. + Interpolate(y []E) } From 0727b1480f0f182897ebe701708885a45ec6aeb5 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 20 Dec 2024 14:03:33 -0600 Subject: [PATCH 27/45] Expose types needed in Prio3 public API. --- vdaf/prio3/count/count.go | 48 +++++++++++---------- vdaf/prio3/doc.go | 8 ++-- vdaf/prio3/histogram/histogram.go | 59 ++++++++++++++------------ vdaf/prio3/internal/prio3/prio3.go | 68 +++++++++++++++--------------- vdaf/prio3/internal/prio3/types.go | 6 +-- vdaf/prio3/internal/prio3/xof.go | 11 +++-- vdaf/prio3/mhcv/mhcv.go | 63 +++++++++++++++------------ vdaf/prio3/prio3_test.go | 8 ++-- vdaf/prio3/sum/sum.go | 51 ++++++++++++---------- vdaf/prio3/sumvec/sumvec.go | 59 ++++++++++++++------------ vdaf/prio3/vectors_test.go | 4 +- 11 files changed, 210 insertions(+), 175 deletions(-) diff --git a/vdaf/prio3/count/count.go b/vdaf/prio3/count/count.go index 846390a07..b8db181f5 100644 --- a/vdaf/prio3/count/count.go +++ b/vdaf/prio3/count/count.go @@ -9,14 +9,18 @@ import ( ) type ( - poly = fp64.Poly - Vec = fp64.Vec - Fp = fp64.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - OutShare = prio3.OutShare[Vec, Fp] - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] + poly = fp64.Poly + Vec = fp64.Vec + Fp = fp64.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + Nonce = prio3.Nonce + OutShare = prio3.OutShare[Vec, Fp] + PrepMessage = prio3.PrepMessage + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] + PublicShare = prio3.PublicShare + VerifyKey = prio3.VerifyKey ) // Count is a verifiable distributed aggregation function in which each @@ -27,7 +31,7 @@ type Count struct { } func New(numShares uint8, context []byte) (c *Count, err error) { - const countID uint8 = 1 + const countID = 1 c = new(Count) c.p, err = prio3.New(newFlpCount(), countID, numShares, context) if err != nil { @@ -39,33 +43,33 @@ func New(numShares uint8, context []byte) (c *Count, err error) { func (c *Count) Params() prio3.Params { return c.p.Params() } -func (c *Count) Shard(measurement bool, nonce *prio3.Nonce, rand []byte, -) (prio3.PublicShare, []InputShare, error) { +func (c *Count) Shard(measurement bool, nonce *Nonce, rand []byte, +) (PublicShare, []InputShare, error) { return c.p.Shard(measurement, nonce, rand) } func (c *Count) PrepInit( - verifyKey *prio3.VerifyKey, - nonce *prio3.Nonce, + verifyKey *VerifyKey, + nonce *Nonce, aggID uint8, - publicShare prio3.PublicShare, + publicShare PublicShare, inputShare InputShare, ) (*PrepState, *PrepShare, error) { return c.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) } -func (c *Count) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { +func (c *Count) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { return c.p.PrepSharesToPrep(prepShares) } -func (c *Count) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { +func (c *Count) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { return c.p.PrepNext(state, msg) } -func (c *Count) AggregationInit() AggShare { return c.p.AggregationInit() } +func (c *Count) AggregateInit() AggShare { return c.p.AggregateInit() } -func (c *Count) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { - c.p.AggregationUpdate(aggShare, outShare) +func (c *Count) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { + c.p.AggregateUpdate(aggShare, outShare) } func (c *Count) Unshard(aggShares []AggShare, numMeas uint) (aggregate *uint64, err error) { @@ -83,14 +87,14 @@ func newFlpCount() *flpCount { c.Valid.OutputLen = 1 c.Valid.EvalOutputLen = 1 c.Gadget = flp.GadgetMulFp64{} - c.NumCalls = 1 + c.NumGadgetCalls = 1 c.FLP.Eval = c.Eval return c } func (c *flpCount) Eval( - out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], _numCalls uint, - meas, _jointRand Vec, _shares uint8, + out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, + meas, jointRand Vec, numShares uint8, ) { g.Eval(&out[0], Vec{meas[0], meas[0]}) out[0].SubAssign(&meas[0]) diff --git a/vdaf/prio3/doc.go b/vdaf/prio3/doc.go index cd82a0394..4797f8b4f 100644 --- a/vdaf/prio3/doc.go +++ b/vdaf/prio3/doc.go @@ -1,8 +1,6 @@ -// Package prio3 implements Prio3 a set of Verifiable Distributed -// Aggregation Functions. -// -// Prio3 provides several variants of Verifiable Distributed Aggregation -// Functions (VDAF) as described in draft-irtf-cfrg-vdaf [v13] +// Package prio3 implements Prio3, a set of Verifiable Distributed +// Aggregation Functions (VDAFs). It provides several concrete VDAFs +// described in draft-irtf-cfrg-vdaf [v13]: // - Count [github.com/cloudflare/circl/vdaf/prio3/count] // - Sum [github.com/cloudflare/circl/vdaf/prio3/sum] // - SumVec [github.com/cloudflare/circl/vdaf/prio3/sumvec] diff --git a/vdaf/prio3/histogram/histogram.go b/vdaf/prio3/histogram/histogram.go index 4f6fab036..84ff644db 100644 --- a/vdaf/prio3/histogram/histogram.go +++ b/vdaf/prio3/histogram/histogram.go @@ -9,14 +9,18 @@ import ( ) type ( - poly = fp128.Poly - Vec = fp128.Vec - Fp = fp128.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - OutShare = prio3.OutShare[Vec, Fp] - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] + poly = fp128.Poly + Vec = fp128.Vec + Fp = fp128.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + Nonce = prio3.Nonce + OutShare = prio3.OutShare[Vec, Fp] + PrepMessage = prio3.PrepMessage + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] + PublicShare = prio3.PublicShare + VerifyKey = prio3.VerifyKey ) // Histogram is a verifiable distributed aggregation function in which each @@ -28,7 +32,7 @@ type Histogram struct { } func New(numShares uint8, length, chunkLen uint, context []byte) (h *Histogram, err error) { - const histogramID uint8 = 4 + const histogramID = 4 h = new(Histogram) h.p, err = prio3.New(newFlpHistogram(length, chunkLen), histogramID, numShares, context) if err != nil { @@ -40,33 +44,33 @@ func New(numShares uint8, length, chunkLen uint, context []byte) (h *Histogram, func (h *Histogram) Params() prio3.Params { return h.p.Params() } -func (h *Histogram) Shard(measurement uint64, nonce *prio3.Nonce, rand []byte, -) (prio3.PublicShare, []InputShare, error) { +func (h *Histogram) Shard(measurement uint64, nonce *Nonce, rand []byte, +) (PublicShare, []InputShare, error) { return h.p.Shard(measurement, nonce, rand) } func (h *Histogram) PrepInit( - verifyKey *prio3.VerifyKey, - nonce *prio3.Nonce, + verifyKey *VerifyKey, + nonce *Nonce, aggID uint8, - publicShare prio3.PublicShare, + publicShare PublicShare, inputShare InputShare, ) (*PrepState, *PrepShare, error) { return h.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) } -func (h *Histogram) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { +func (h *Histogram) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { return h.p.PrepSharesToPrep(prepShares) } -func (h *Histogram) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { +func (h *Histogram) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { return h.p.PrepNext(state, msg) } -func (h *Histogram) AggregationInit() AggShare { return h.p.AggregationInit() } +func (h *Histogram) AggregateInit() AggShare { return h.p.AggregateInit() } -func (h *Histogram) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { - h.p.AggregationUpdate(aggShare, outShare) +func (h *Histogram) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { + h.p.AggregateUpdate(aggShare, outShare) } func (h *Histogram) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { @@ -74,29 +78,32 @@ func (h *Histogram) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]ui } type flpHistogram struct { - flp.FLP[flp.GadgetParallelSum, poly, Vec, Fp, *Fp] + flp.FLP[flp.GadgetParallelSumInnerMul, poly, Vec, Fp, *Fp] length uint chunkLen uint } func newFlpHistogram(length, chunkLen uint) *flpHistogram { h := new(flpHistogram) - numCalls := (length + chunkLen - 1) / chunkLen + numGadgetCalls := (length + chunkLen - 1) / chunkLen h.length = length h.chunkLen = chunkLen h.Valid.MeasurementLen = length - h.Valid.JointRandLen = numCalls + h.Valid.JointRandLen = numGadgetCalls h.Valid.OutputLen = length h.Valid.EvalOutputLen = 2 - h.Gadget = flp.GadgetParallelSum{Count: chunkLen} - h.NumCalls = numCalls + h.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLen} + h.NumGadgetCalls = numGadgetCalls h.FLP.Eval = h.Eval return h } -func (h *flpHistogram) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, shares uint8) { +func (h *flpHistogram) EvalEval( + out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, + meas, jointRand Vec, numShares uint8, +) { var invShares Fp - invShares.InvUint64(uint64(shares)) + invShares.InvUint64(uint64(numShares)) out[0] = flp.RangeCheck(g, numCalls, h.chunkLen, &invShares, meas, jointRand) sumCheck := &out[1] diff --git a/vdaf/prio3/internal/prio3/prio3.go b/vdaf/prio3/internal/prio3/prio3.go index 7600d4471..6ac63f7b2 100644 --- a/vdaf/prio3/internal/prio3/prio3.go +++ b/vdaf/prio3/internal/prio3/prio3.go @@ -5,7 +5,7 @@ // To ensure each measurement is valid, the Aggregators run a multi-party // computation on their shares, the result of which is the output of the // arithmetic circuit. -// This involves verification of a Fully Linear Proof (FLP) which specify +// This involves verification of a Fully Linear Proof (FLP) that specifies // the types of measurements. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7 @@ -19,9 +19,6 @@ import ( "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" ) -// Number of proofs to generate. -const numProofs = 1 - // Prio3 supports a variety of verifiable distributed aggregation functions. // An instance is parametrized by the type of measurement and aggregated data, // as well as the field to perform arithmetic operations. @@ -40,14 +37,14 @@ func New[ T flp[Measurement, Aggregate, V, E, F], Measurement, Aggregate any, V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], -](f T, id uint8, numShares uint8, context []byte, +](f T, algorithmID uint32, numShares uint8, context []byte, ) (v Prio3[Measurement, Aggregate, T, V, E, F], err error) { if numShares < 2 { return v, ErrNumShares } v.flp = f - v.xof, err = NewXof[V, E](uint32(id), context) + v.xof, err = NewXof[V](algorithmID, context) if err != nil { return v, err } @@ -85,14 +82,14 @@ func (v *Prio3[M, A, T, V, E, F]) Shard( } } -// FLPs Without Joint Randomness. +// FLPs without joint randomness. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.1.1 func (v *Prio3[M, A, T, V, E, F]) shardNoJointRand( meas V, seeds []byte, ) ([]InputShare[V, E], error) { // Each Aggregator's input share contains its measurement share - // and its share of the proof(s). + // and its share of the proof. params := v.Params() inputShares := make([]InputShare[V, E], v.shares) inputShares[0].leader = new(InputShareLeader[V, E]).New(¶ms) @@ -107,7 +104,7 @@ func (v *Prio3[M, A, T, V, E, F]) shardNoJointRand( // Generate proof of valid measurement. proveSeed := Seed(seedsCur.Next(SeedSize)) - proveRands := arith.NewVec[V](params.ProveRandLength() * numProofs) + proveRands := arith.NewVec[V](params.ProveRandLength()) err := v.xof.proveRands(proveRands, &proveSeed) if err != nil { return nil, err @@ -120,7 +117,7 @@ func (v *Prio3[M, A, T, V, E, F]) shardNoJointRand( copy(inputShares[0].leader.measShare, meas) copy(inputShares[0].leader.proofShare, proof) m := arith.NewVec[V](params.MeasurementLength()) - p := arith.NewVec[V](params.ProofLength() * numProofs) + p := arith.NewVec[V](params.ProofLength()) for i := 1; i < len(inputShares); i++ { share := &inputShares[i].helper.share err = v.xof.helperMeasShare(m, uint8(i), share) @@ -141,14 +138,14 @@ func (v *Prio3[M, A, T, V, E, F]) shardNoJointRand( return inputShares, nil } -// FLPs With Joint Randomness. +// FLPs with joint randomness. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.1.2 func (v *Prio3[M, A, T, V, E, F]) shardWithJointRand( meas V, nonce *Nonce, seeds []byte, ) (PublicShare, []InputShare[V, E], error) { // Each Aggregator's input share contains its measurement share, - // share of proof(s), and blind. The public share contains the + // share of proof, and blind. The public share contains the // Aggregators' joint randomness parts. params := v.Params() inputShares := make([]InputShare[V, E], v.shares) @@ -190,7 +187,7 @@ func (v *Prio3[M, A, T, V, E, F]) shardWithJointRand( inputShares[0].leader.measShare.SubAssign(m) } - // Calculate leader's jointRandPart after leader's measurementShare + // Calculate leader's jointRandPart after leader's measShare // has been calculated. measShareEnc, err := inputShares[0].leader.measShare.MarshalBinary() if err != nil { @@ -205,7 +202,7 @@ func (v *Prio3[M, A, T, V, E, F]) shardWithJointRand( // Generate proof of valid measurement. proveSeed := Seed(seedsCur.Next(SeedSize)) - proveRands := arith.NewVec[V](params.ProveRandLength() * numProofs) + proveRands := arith.NewVec[V](params.ProveRandLength()) err = v.xof.proveRands(proveRands, &proveSeed) if err != nil { return nil, nil, err @@ -218,7 +215,7 @@ func (v *Prio3[M, A, T, V, E, F]) shardWithJointRand( return nil, nil, err } - jointRands := arith.NewVec[V](params.JointRandLength() * numProofs) + jointRands := arith.NewVec[V](params.JointRandLength()) err = v.xof.jointRands(jointRands, &jrSeed) if err != nil { return nil, nil, err @@ -229,7 +226,7 @@ func (v *Prio3[M, A, T, V, E, F]) shardWithJointRand( // Shard the proof into shares. copy(inputShares[0].leader.proofShare, proof) - p := arith.NewVec[V](params.ProofLength() * numProofs) + p := arith.NewVec[V](params.ProofLength()) for i := 1; i < len(inputShares); i++ { err = v.xof.helperProofsShare(p, uint8(i), &inputShares[i].helper.share) if err != nil { @@ -242,7 +239,7 @@ func (v *Prio3[M, A, T, V, E, F]) shardWithJointRand( return jointRandParts, inputShares, nil } -// PrepInit used by aggregator for preparation phase. +// PrepInit is used by each aggregator to begin the preparation phase. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 func (v *Prio3[M, A, T, V, E, F]) PrepInit( @@ -290,7 +287,7 @@ func (v *Prio3[M, A, T, V, E, F]) PrepInit( return nil, nil, err } - jointRands := arith.NewVec[V](params.JointRandLength() * numProofs) + jointRands := arith.NewVec[V](params.JointRandLength()) err = v.xof.jointRands(jointRands, prepState.correctedJointRandSeed) if err != nil { return nil, nil, err @@ -299,8 +296,8 @@ func (v *Prio3[M, A, T, V, E, F]) PrepInit( jointRand = jointRands[:jointRandLen] } - // Query the measurement and proof(s) share(s). - queryRands := arith.NewVec[V](params.QueryRandLength() * numProofs) + // Query the measurement and proof share. + queryRands := arith.NewVec[V](params.QueryRandLength()) err = v.xof.queryRands(queryRands, verifyKey, nonce) if err != nil { return nil, nil, err @@ -318,7 +315,10 @@ func (v *Prio3[M, A, T, V, E, F]) PrepInit( return prepState, prepShare, nil } -// PrepSharesToPrep used by aggregator for aggregate shares. +// PrepSharesToPrep is the deterministic preparation message pre-processing +// algorithm. It combines the prep shares produced by the Aggregators in the +// previous round into the prep message consumed by each Aggregator to start +// the next round. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 func (v *Prio3[M, A, T, V, E, F]) PrepSharesToPrep( @@ -326,9 +326,9 @@ func (v *Prio3[M, A, T, V, E, F]) PrepSharesToPrep( ) (*PrepMessage, error) { params := v.Params() msg := new(PrepMessage) - // Unshard each set of verifier shares into each verifier message. + // Unshard the verifier shares into the verifier message. verifierLen := params.VerifierLength() - verifiers := arith.NewVec[V](verifierLen * numProofs) + verifiers := arith.NewVec[V](verifierLen) for i := range prepShares { verifiers.AddAssign(prepShares[i].verifiersShare) } @@ -364,7 +364,7 @@ func (v *Prio3[M, A, T, V, E, F]) PrepSharesToPrep( return msg, nil } -// PrepNext used by aggregator to produce an output share. +// PrepNext is used by each aggregator to produce its output share. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.2 func (v *Prio3[M, A, T, V, E, F]) PrepNext( @@ -381,30 +381,30 @@ func (v *Prio3[M, A, T, V, E, F]) PrepNext( return &OutShare[V, E]{state.outShare}, nil } -// AggregationInit is used to start aggregation. +// AggregateInit is used to start aggregation. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 -func (v *Prio3[M, A, T, V, E, F]) AggregationInit() (s AggShare[V, E]) { +func (v *Prio3[M, A, T, V, E, F]) AggregateInit() (s AggShare[V, E]) { s.share = arith.NewVec[V](v.flp.OutputLength()) return } -// AggregationUpdate aggregates an output share into an aggregation share. +// AggregateUpdate aggregates an output share into an aggregation share. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 -func (v *Prio3[M, A, T, V, E, F]) AggregationUpdate( +func (v *Prio3[M, A, T, V, E, F]) AggregateUpdate( aggShare *AggShare[V, E], outShare *OutShare[V, E], ) { aggShare.share.AddAssign(outShare.share) } -// AggregationMerge merges several aggregation shares. +// aggregateMerge merges several aggregation shares. // // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.2.4 -func (v *Prio3[M, A, T, V, E, F]) aggregationMerge( +func (v *Prio3[M, A, T, V, E, F]) aggregateMerge( aggShares []AggShare[V, E], ) (s AggShare[V, E]) { - s = v.AggregationInit() + s = v.AggregateInit() for i := range aggShares { s.share.AddAssign(aggShares[i].share) } @@ -423,7 +423,7 @@ func (v *Prio3[M, A, T, V, E, F]) Unshard( return nil, ErrAggShareSize } - s := v.aggregationMerge(aggShares) + s := v.aggregateMerge(aggShares) return v.flp.Decode(s.share, numMeas) } @@ -504,9 +504,9 @@ type flp[ ProofLength() uint VerifierLength() uint QueryRandLength() uint - // Prove returns a proof attesting validity to the given measurement. + // Prove returns a proof attesting to the validity of the given measurement. Prove(meas, proveRand, jointRand V) V - // Query is the linear Query algorithm run by the verifier on a share of + // Query is the linear Query algorithm run by each verifier on its share of // the measurement and proof. Query(measShare, proofShare, queryRnd, jointRnd V, shares uint8) (V, error) // Decide returns true if the measurement from which it was generated is diff --git a/vdaf/prio3/internal/prio3/types.go b/vdaf/prio3/internal/prio3/types.go index f58d92573..94e49cbbc 100644 --- a/vdaf/prio3/internal/prio3/types.go +++ b/vdaf/prio3/internal/prio3/types.go @@ -18,7 +18,7 @@ type ( // VerifyKey is a secret verification key held by each of the Aggregators. // This key is used to verify validity of the output shares they compute. VerifyKey [VerifyKeySize]byte - // Seed is used to feed an extnedable output function. + // Seed is used to feed an extendable output function. Seed [SeedSize]byte ) @@ -75,7 +75,7 @@ type inputShareContent[V arith.Vec[V, E], E arith.Elt] struct { func (s *inputShareContent[V, E]) New(p *Params) *inputShareContent[V, E] { s.measShare = arith.NewVec[V](p.MeasurementLength()) - s.proofShare = arith.NewVec[V](p.ProofLength() * numProofs) + s.proofShare = arith.NewVec[V](p.ProofLength()) if p.JointRandLength() > 0 { s.blind = &Seed{} } else { @@ -226,7 +226,7 @@ type PrepShare[V arith.Vec[V, E], E arith.Elt] struct { } func (s *PrepShare[V, E]) New(p *Params) *PrepShare[V, E] { - s.verifiersShare = arith.NewVec[V](p.VerifierLength() * numProofs) + s.verifiersShare = arith.NewVec[V](p.VerifierLength()) if p.JointRandLength() > 0 { s.jointRandPart = &Seed{} } else { diff --git a/vdaf/prio3/internal/prio3/xof.go b/vdaf/prio3/internal/prio3/xof.go index 6465bb9bb..a51588614 100644 --- a/vdaf/prio3/internal/prio3/xof.go +++ b/vdaf/prio3/internal/prio3/xof.go @@ -15,9 +15,10 @@ type xofTS[V arith.Vec[V, E], E arith.Elt] struct { sha3.State } -// NewXof returns an xofTS from an ID and context. +// NewXof returns an xof based on TurboSHAKE given a VDAF ID and an application +// context string. func NewXof[V arith.Vec[V, E], E arith.Elt]( - id uint32, context []byte, + algorithmID uint32, context []byte, ) (x xofTS[V, E], err error) { const ( Version = 12 @@ -45,7 +46,7 @@ func NewXof[V arith.Vec[V, E], E arith.Elt]( x.Header = binary.LittleEndian.AppendUint16(x.Header, uint16(lenDST)) x.Header = append(x.Header, Version) x.Header = append(x.Header, AlgoClass) - x.Header = binary.BigEndian.AppendUint32(x.Header, id) + x.Header = binary.BigEndian.AppendUint32(x.Header, algorithmID) x.Header = binary.BigEndian.AppendUint16(x.Header, 0) x.Header = append(x.Header, context...) x.Header = append(x.Header, uint8(SeedSize)) @@ -117,6 +118,7 @@ func (x *xofTS[V, E]) helperMeasShare(out V, aggID uint8, s *Seed) error { } func (x *xofTS[V, E]) helperProofsShare(out V, aggID uint8, s *Seed) error { + const numProofs = 1 err := x.Init(usageProofShare, s) if err != nil { return err @@ -131,6 +133,7 @@ func (x *xofTS[V, E]) helperProofsShare(out V, aggID uint8, s *Seed) error { } func (x *xofTS[V, E]) proveRands(out V, proveSeed *Seed) error { + const numProofs = 1 err := x.Init(usageProveRandomness, proveSeed) if err != nil { return err @@ -145,6 +148,7 @@ func (x *xofTS[V, E]) proveRands(out V, proveSeed *Seed) error { } func (x *xofTS[V, E]) queryRands(out V, k *VerifyKey, nonce *Nonce) error { + const numProofs = 1 err := x.Init(usageQueryRandomness, (*Seed)(k)) if err != nil { return err @@ -192,6 +196,7 @@ func (x *xofTS[V, E]) jointRandSeed(jointRandParts []byte) (s Seed, err error) { } func (x *xofTS[V, E]) jointRands(out V, jointRandSeed *Seed) error { + const numProofs = 1 err := x.Init(usageJointRandomness, jointRandSeed) if err != nil { return err diff --git a/vdaf/prio3/mhcv/mhcv.go b/vdaf/prio3/mhcv/mhcv.go index 3f3a5a526..d5f590469 100644 --- a/vdaf/prio3/mhcv/mhcv.go +++ b/vdaf/prio3/mhcv/mhcv.go @@ -1,4 +1,4 @@ -// Package mhcv is a VDAF for aggregating bounded vectors of Booleans into buckets. +// Package mhcv is a VDAF for aggregating vectors of Booleans with bounded weight. package mhcv import ( @@ -13,18 +13,22 @@ import ( ) type ( - poly = fp128.Poly - Vec = fp128.Vec - Fp = fp128.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - OutShare = prio3.OutShare[Vec, Fp] - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] + poly = fp128.Poly + Vec = fp128.Vec + Fp = fp128.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + Nonce = prio3.Nonce + OutShare = prio3.OutShare[Vec, Fp] + PrepMessage = prio3.PrepMessage + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] + PublicShare = prio3.PublicShare + VerifyKey = prio3.VerifyKey ) // MultiHotCountVec is a verifiable distributed aggregation function in which -// each measurement is a vector of Boolean values, where the number of True +// each measurement is a vector of Booleans, where the number of True // values is bounded. // This provides a functionality similar to Histogram except that more than // one entry (or none at all) may be non-zero. @@ -33,7 +37,7 @@ type MultiHotCountVec struct { } func New(numShares uint8, length, maxWeight, chunkLen uint, context []byte) (m *MultiHotCountVec, err error) { - const multihotCountVecID uint8 = 5 + const multihotCountVecID = 5 m = new(MultiHotCountVec) m.p, err = prio3.New( newFlpMultiCountHotVec(length, maxWeight, chunkLen), @@ -47,33 +51,33 @@ func New(numShares uint8, length, maxWeight, chunkLen uint, context []byte) (m * func (m *MultiHotCountVec) Params() prio3.Params { return m.p.Params() } -func (m *MultiHotCountVec) Shard(measurement []bool, nonce *prio3.Nonce, rand []byte, -) (prio3.PublicShare, []InputShare, error) { +func (m *MultiHotCountVec) Shard(measurement []bool, nonce *Nonce, rand []byte, +) (PublicShare, []InputShare, error) { return m.p.Shard(measurement, nonce, rand) } func (m *MultiHotCountVec) PrepInit( - verifyKey *prio3.VerifyKey, - nonce *prio3.Nonce, + verifyKey *VerifyKey, + nonce *Nonce, aggID uint8, - publicShare prio3.PublicShare, + publicShare PublicShare, inputShare InputShare, ) (*PrepState, *PrepShare, error) { return m.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) } -func (m *MultiHotCountVec) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { +func (m *MultiHotCountVec) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { return m.p.PrepSharesToPrep(prepShares) } -func (m *MultiHotCountVec) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { +func (m *MultiHotCountVec) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { return m.p.PrepNext(state, msg) } -func (m *MultiHotCountVec) AggregationInit() AggShare { return m.p.AggregationInit() } +func (m *MultiHotCountVec) AggregateInit() AggShare { return m.p.AggregateInit() } -func (m *MultiHotCountVec) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { - m.p.AggregationUpdate(aggShare, outShare) +func (m *MultiHotCountVec) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { + m.p.AggregateUpdate(aggShare, outShare) } func (m *MultiHotCountVec) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { @@ -81,7 +85,7 @@ func (m *MultiHotCountVec) Unshard(aggShares []AggShare, numMeas uint) (aggregat } type flpMultiHotCountVec struct { - flp.FLP[flp.GadgetParallelSum, poly, Vec, Fp, *Fp] + flp.FLP[flp.GadgetParallelSumInnerMul, poly, Vec, Fp, *Fp] bits uint chunkLen uint length uint @@ -109,7 +113,7 @@ func newFlpMultiCountHotVec(length, maxWeight, chunkLen uint) *flpMultiHotCountV panic("length and maxWeight are too large for the current field size") } - numCalls := (length + bits + chunkLen - 1) / chunkLen + numGadgetCalls := (length + bits + chunkLen - 1) / chunkLen m.bits = bits m.length = length @@ -120,18 +124,21 @@ func newFlpMultiCountHotVec(length, maxWeight, chunkLen uint) *flpMultiHotCountV } m.Valid.MeasurementLen = length + bits - m.Valid.JointRandLen = numCalls + m.Valid.JointRandLen = numGadgetCalls m.Valid.OutputLen = length m.Valid.EvalOutputLen = 2 - m.Gadget = flp.GadgetParallelSum{Count: chunkLen} - m.NumCalls = numCalls + m.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLen} + m.NumGadgetCalls = numGadgetCalls m.FLP.Eval = m.Eval return m } -func (m *flpMultiHotCountVec) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, shares uint8) { +func (m *flpMultiHotCountVec) Eval( + out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, + meas, jointRand Vec, numShares uint8, +) { var invShares Fp - invShares.InvUint64(uint64(shares)) + invShares.InvUint64(uint64(numShares)) out[0] = flp.RangeCheck(g, numCalls, m.chunkLen, &invShares, meas, jointRand) measCur := cursor.New(meas) diff --git a/vdaf/prio3/prio3_test.go b/vdaf/prio3/prio3_test.go index f2bb331f4..881bb3b72 100644 --- a/vdaf/prio3/prio3_test.go +++ b/vdaf/prio3/prio3_test.go @@ -28,8 +28,8 @@ type Prio3[ ) (*PrepState, *PrepShare, error) PrepSharesToPrep([]PrepShare) (*prio3.PrepMessage, error) PrepNext(*PrepState, *prio3.PrepMessage) (*OutShare, error) - AggregationInit() AggShare - AggregationUpdate(*AggShare, *OutShare) + AggregateInit() AggShare + AggregateUpdate(*AggShare, *OutShare) Unshard([]AggShare, uint) (*Aggregate, error) } @@ -129,7 +129,7 @@ func testPrio3[ aggShares := make([]AggShare, shares) for i := range aggShares { - aggShares[i] = p.AggregationInit() + aggShares[i] = p.AggregateInit() } for _, mi := range measurements { @@ -174,7 +174,7 @@ func testPrio3[ outShare, err = p.PrepNext(prepStates[i], prepMsg) test.CheckNoErr(t, err, "PrepNext failed") testMarshal(t, outShare, ¶ms) - p.AggregationUpdate(&aggShares[i], outShare) + p.AggregateUpdate(&aggShares[i], outShare) } } diff --git a/vdaf/prio3/sum/sum.go b/vdaf/prio3/sum/sum.go index aad2897bf..c0b9b9865 100644 --- a/vdaf/prio3/sum/sum.go +++ b/vdaf/prio3/sum/sum.go @@ -11,14 +11,18 @@ import ( ) type ( - poly = fp64.Poly - Vec = fp64.Vec - Fp = fp64.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - OutShare = prio3.OutShare[Vec, Fp] - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] + poly = fp64.Poly + Vec = fp64.Vec + Fp = fp64.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + Nonce = prio3.Nonce + OutShare = prio3.OutShare[Vec, Fp] + PrepMessage = prio3.PrepMessage + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] + PublicShare = prio3.PublicShare + VerifyKey = prio3.VerifyKey ) // Sum is a verifiable distributed aggregation function in which each @@ -30,7 +34,7 @@ type Sum struct { } func New(numShares uint8, maxMeasurement uint64, context []byte) (s *Sum, err error) { - const sumID uint8 = 2 + const sumID = 2 s = new(Sum) s.p, err = prio3.New(newFlpSum(maxMeasurement), sumID, numShares, context) if err != nil { @@ -42,33 +46,33 @@ func New(numShares uint8, maxMeasurement uint64, context []byte) (s *Sum, err er func (s *Sum) Params() prio3.Params { return s.p.Params() } -func (s *Sum) Shard(measurement uint64, nonce *prio3.Nonce, rand []byte, -) (prio3.PublicShare, []InputShare, error) { +func (s *Sum) Shard(measurement uint64, nonce *Nonce, rand []byte, +) (PublicShare, []InputShare, error) { return s.p.Shard(measurement, nonce, rand) } func (s *Sum) PrepInit( - verifyKey *prio3.VerifyKey, - nonce *prio3.Nonce, + verifyKey *VerifyKey, + nonce *Nonce, aggID uint8, - publicShare prio3.PublicShare, + publicShare PublicShare, inputShare InputShare, ) (*PrepState, *PrepShare, error) { return s.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) } -func (s *Sum) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { +func (s *Sum) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { return s.p.PrepSharesToPrep(prepShares) } -func (s *Sum) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { +func (s *Sum) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { return s.p.PrepNext(state, msg) } -func (s *Sum) AggregationInit() AggShare { return s.p.AggregationInit() } +func (s *Sum) AggregateInit() AggShare { return s.p.AggregateInit() } -func (s *Sum) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { - s.p.AggregationUpdate(aggShare, outShare) +func (s *Sum) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { + s.p.AggregateUpdate(aggShare, outShare) } func (s *Sum) Unshard(aggShares []AggShare, numMeas uint) (aggregate *uint64, err error) { @@ -97,12 +101,15 @@ func newFlpSum(maxMeasurement uint64) *flpSum { s.Valid.OutputLen = 1 s.Valid.EvalOutputLen = 2*bits + 1 s.Gadget = flp.GadgetPolyEvalx2x{} - s.NumCalls = 2 * bits + s.NumGadgetCalls = 2 * bits s.FLP.Eval = s.Eval return s } -func (s *flpSum) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, shares uint8) { +func (s *flpSum) EvalEval( + out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, + meas, jointRand Vec, numShares uint8, +) { var input [1]Fp for i := range meas { input[0] = meas[i] @@ -114,7 +121,7 @@ func (s *flpSum) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, b := measCur.Next(s.bits).JoinBits() var invShares Fp - invShares.InvUint64(uint64(shares)) + invShares.InvUint64(uint64(numShares)) rangeCheck := &out[len(meas)] rangeCheck.Mul(&s.offset, &invShares) rangeCheck.AddAssign(&a) diff --git a/vdaf/prio3/sumvec/sumvec.go b/vdaf/prio3/sumvec/sumvec.go index 8c27007e7..94fcfaffa 100644 --- a/vdaf/prio3/sumvec/sumvec.go +++ b/vdaf/prio3/sumvec/sumvec.go @@ -10,14 +10,18 @@ import ( ) type ( - poly = fp128.Poly - Vec = fp128.Vec - Fp = fp128.Fp - AggShare = prio3.AggShare[Vec, Fp] - InputShare = prio3.InputShare[Vec, Fp] - OutShare = prio3.OutShare[Vec, Fp] - PrepShare = prio3.PrepShare[Vec, Fp] - PrepState = prio3.PrepState[Vec, Fp] + poly = fp128.Poly + Vec = fp128.Vec + Fp = fp128.Fp + AggShare = prio3.AggShare[Vec, Fp] + InputShare = prio3.InputShare[Vec, Fp] + Nonce = prio3.Nonce + OutShare = prio3.OutShare[Vec, Fp] + PrepMessage = prio3.PrepMessage + PrepShare = prio3.PrepShare[Vec, Fp] + PrepState = prio3.PrepState[Vec, Fp] + PublicShare = prio3.PublicShare + VerifyKey = prio3.VerifyKey ) // SumVec is a verifiable distributed aggregation function in which each @@ -28,7 +32,7 @@ type SumVec struct { } func New(numShares uint8, length, bits, chunkLen uint, context []byte) (s *SumVec, err error) { - const sumVecID uint8 = 3 + const sumVecID = 3 s = new(SumVec) s.p, err = prio3.New(newFlpSumVec(length, bits, chunkLen), sumVecID, numShares, context) if err != nil { @@ -40,33 +44,33 @@ func New(numShares uint8, length, bits, chunkLen uint, context []byte) (s *SumVe func (s *SumVec) Params() prio3.Params { return s.p.Params() } -func (s *SumVec) Shard(measurement []uint64, nonce *prio3.Nonce, rand []byte, -) (prio3.PublicShare, []InputShare, error) { +func (s *SumVec) Shard(measurement []uint64, nonce *Nonce, rand []byte, +) (PublicShare, []InputShare, error) { return s.p.Shard(measurement, nonce, rand) } func (s *SumVec) PrepInit( - verifyKey *prio3.VerifyKey, - nonce *prio3.Nonce, + verifyKey *VerifyKey, + nonce *Nonce, aggID uint8, - publicShare prio3.PublicShare, + publicShare PublicShare, inputShare InputShare, ) (*PrepState, *PrepShare, error) { return s.p.PrepInit(verifyKey, nonce, aggID, publicShare, inputShare) } -func (s *SumVec) PrepSharesToPrep(prepShares []PrepShare) (*prio3.PrepMessage, error) { +func (s *SumVec) PrepSharesToPrep(prepShares []PrepShare) (*PrepMessage, error) { return s.p.PrepSharesToPrep(prepShares) } -func (s *SumVec) PrepNext(state *PrepState, msg *prio3.PrepMessage) (*OutShare, error) { +func (s *SumVec) PrepNext(state *PrepState, msg *PrepMessage) (*OutShare, error) { return s.p.PrepNext(state, msg) } -func (s *SumVec) AggregationInit() AggShare { return s.p.AggregationInit() } +func (s *SumVec) AggregateInit() AggShare { return s.p.AggregateInit() } -func (s *SumVec) AggregationUpdate(aggShare *AggShare, outShare *OutShare) { - s.p.AggregationUpdate(aggShare, outShare) +func (s *SumVec) AggregateUpdate(aggShare *AggShare, outShare *OutShare) { + s.p.AggregateUpdate(aggShare, outShare) } func (s *SumVec) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint64, err error) { @@ -74,7 +78,7 @@ func (s *SumVec) Unshard(aggShares []AggShare, numMeas uint) (aggregate *[]uint6 } type flpSumVec struct { - flp.FLP[flp.GadgetParallelSum, poly, Vec, Fp, *Fp] + flp.FLP[flp.GadgetParallelSumInnerMul, poly, Vec, Fp, *Fp] length uint bits uint chunkLen uint @@ -86,24 +90,27 @@ func newFlpSumVec(length, bits, chunkLen uint) *flpSumVec { } s := new(flpSumVec) - numCalls := (length*bits + chunkLen - 1) / chunkLen + numGadgetCalls := (length*bits + chunkLen - 1) / chunkLen s.length = length s.bits = bits s.chunkLen = chunkLen s.Valid.MeasurementLen = length * bits - s.Valid.JointRandLen = numCalls + s.Valid.JointRandLen = numGadgetCalls s.Valid.OutputLen = length s.Valid.EvalOutputLen = 1 - s.Gadget = flp.GadgetParallelSum{Count: chunkLen} - s.NumCalls = numCalls + s.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLen} + s.NumGadgetCalls = numGadgetCalls s.FLP.Eval = s.Eval return s } -func (s *flpSumVec) Eval(out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, shares uint8) { +func (s *flpSumVec) Eval( + out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, + meas, jointRand Vec, numShares uint8, +) { var invShares Fp - invShares.InvUint64(uint64(shares)) + invShares.InvUint64(uint64(numShares)) out[0] = flp.RangeCheck(g, numCalls, s.chunkLen, &invShares, meas, jointRand) } diff --git a/vdaf/prio3/vectors_test.go b/vdaf/prio3/vectors_test.go index e867a1e86..85a0d71c1 100644 --- a/vdaf/prio3/vectors_test.go +++ b/vdaf/prio3/vectors_test.go @@ -164,7 +164,7 @@ func runPrio3[ aggShares := make([]AggShare, shares) for i := range aggShares { - aggShares[i] = p.AggregationInit() + aggShares[i] = p.AggregateInit() } for _, instance := range v.Prep { @@ -203,7 +203,7 @@ func runPrio3[ test.CheckNoErr(t, err, "PrepNext failed") checkEqual(t, outShare, slices.Concat(instance.OutShares[i]...)) - p.AggregationUpdate(&aggShares[i], outShare) + p.AggregateUpdate(&aggShares[i], outShare) } } From 6f2ebb32ea90e8ff5362337555627438021e6d44 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 20 Dec 2024 14:37:53 -0600 Subject: [PATCH 28/45] Addressing comments to FLP package. --- vdaf/prio3/arith/arith.go | 4 ++-- vdaf/prio3/internal/flp/flp.go | 19 +++++++++++++------ vdaf/prio3/internal/flp/gadgets.go | 10 +++++----- vdaf/prio3/internal/flp/valid.go | 8 ++++---- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/vdaf/prio3/arith/arith.go b/vdaf/prio3/arith/arith.go index 1d4a8285f..2fc84781d 100644 --- a/vdaf/prio3/arith/arith.go +++ b/vdaf/prio3/arith/arith.go @@ -56,8 +56,8 @@ type Fp[E Elt] interface { Inv(x *E) // InvUint64 calculates z = 1 / x. InvUint64(x uint64) - // InvTwoN calculates z = 1 / 2^n. - InvTwoN(x uint) + // InvTwoN calculates z = 1 / (2^n). + InvTwoN(n uint) // Random samples an element from an io.Reader. Random(io.Reader) error // RandomSHA3 samples an element from a SHA3 state. diff --git a/vdaf/prio3/internal/flp/flp.go b/vdaf/prio3/internal/flp/flp.go index d497df665..335671a15 100644 --- a/vdaf/prio3/internal/flp/flp.go +++ b/vdaf/prio3/internal/flp/flp.go @@ -11,14 +11,15 @@ import ( // FLP is an instance of a FLP by Boneh et al. Crypto, 2019 paper // "Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs", // https://ia.cr/2019/188 -// plus some changes described in VDAFs CFRG draft. +// plus some changes described in VDAF specification. +// // https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13#section-7.1 type FLP[ G Gadget[P, V, E, F], P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], ] struct { // Eval evaluates the arithmetic circuit on a measurement and joint randomness. - Eval func(out V, g Gadget[P, V, E, F], numCalls uint, meas, jointRand V, shares uint8) + Eval func(out V, g Gadget[P, V, E, F], numCalls uint, meas, jointRand V, numShares uint8) Valid[G, P, V, E, F] } @@ -33,10 +34,13 @@ func (f *FLP[G, P, V, E, F]) Prove(meas, proveRand, jointRand V) V { g := f.Valid.wrapProve(proveRand) out := arith.NewVec[V](f.EvalOutputLength()) - f.Eval(out, g, f.Valid.NumCalls, meas, jointRand, 1) + f.Eval(out, g, f.Valid.NumGadgetCalls, meas, jointRand, 1) + // invN is the inverse of N = g.p. + // Also, since g.p is always a power of two, we call a faster inversion + // method that receives the log2 of g.p. invN := F(new(E)) - invN.InvTwoN(g.log2p) // since p is always a power of 2. + invN.InvTwoN(g.log2p) arity := g.Arity() wirePoly := make([]P, arity) @@ -59,7 +63,7 @@ func (f *FLP[G, P, V, E, F]) Prove(meas, proveRand, jointRand V) V { return proof } -// Query is the linear Query algorithm run by the verifier on a share of the +// Query is the linear Query algorithm run by each verifier on a share of the // measurement and proof. // Query randomness must be provided. // Some statements may require joint randomness too. @@ -75,7 +79,7 @@ func (f *FLP[G, P, V, E, F]) Query( g := f.Valid.wrapQuery(proofShare) outLen := f.EvalOutputLength() out := arith.NewVec[V](outLen) - f.Eval(out, g, f.Valid.NumCalls, measShare, jointRand, numShares) + f.Eval(out, g, f.Valid.NumGadgetCalls, measShare, jointRand, numShares) v := verifierCur.Next(1) if outLen > 1 { @@ -96,6 +100,9 @@ func (f *FLP[G, P, V, E, F]) Query( return nil, ErrInvalidEval } + // invN is the inverse of N = g.p. + // Also, since g.p is always a power of two, we call a faster inversion + // method that receives the log2 of g.p. invN := F(new(E)) invN.InvTwoN(g.log2p) diff --git a/vdaf/prio3/internal/flp/gadgets.go b/vdaf/prio3/internal/flp/gadgets.go index 64e201386..cb7317e62 100644 --- a/vdaf/prio3/internal/flp/gadgets.go +++ b/vdaf/prio3/internal/flp/gadgets.go @@ -62,14 +62,14 @@ func (GadgetPolyEvalx2x) EvalPoly(out fp64.Poly, in []fp64.Poly) { out.Strip() } -type GadgetParallelSum struct { +type GadgetParallelSumInnerMul struct { inner gadgetMulFp128 Count uint } -func (g GadgetParallelSum) Arity() uint { return g.inner.Arity() * g.Count } -func (g GadgetParallelSum) Degree() uint { return g.inner.Degree() } -func (g GadgetParallelSum) Eval(out *fp128.Fp, in fp128.Vec) { +func (g GadgetParallelSumInnerMul) Arity() uint { return g.inner.Arity() * g.Count } +func (g GadgetParallelSumInnerMul) Degree() uint { return g.inner.Degree() } +func (g GadgetParallelSumInnerMul) Eval(out *fp128.Fp, in fp128.Vec) { inCur := cursor.New(in) arity := g.inner.Arity() var e fp128.Fp @@ -79,7 +79,7 @@ func (g GadgetParallelSum) Eval(out *fp128.Fp, in fp128.Vec) { } } -func (g GadgetParallelSum) EvalPoly(out fp128.Poly, in []fp128.Poly) { +func (g GadgetParallelSumInnerMul) EvalPoly(out fp128.Poly, in []fp128.Poly) { inCur := cursor.New(in) arity := g.inner.Arity() e := arith.NewPoly[fp128.Poly](uint(len(out) - 1)) diff --git a/vdaf/prio3/internal/flp/valid.go b/vdaf/prio3/internal/flp/valid.go index ab11cea3a..12af60521 100644 --- a/vdaf/prio3/internal/flp/valid.go +++ b/vdaf/prio3/internal/flp/valid.go @@ -24,8 +24,8 @@ type Valid[ G Gadget[P, V, E, F], P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], ] struct { - Gadget G // Gadget to be evaluated - NumCalls uint // Number of times each gadget is called. + Gadget G // Gadget to be evaluated + NumGadgetCalls uint // Number of times each gadget is called. Params } @@ -33,7 +33,7 @@ func (v *Valid[G, P, V, E, F]) ProveRandLength() uint { return v.Gadget.Arity() func (v *Valid[G, P, V, E, F]) ProofLength() uint { return v.Gadget.Arity() + v.gadgetPolyLen() } func (v *Valid[G, P, V, E, F]) VerifierLength() uint { return 1 + 1 + v.Gadget.Arity() } func (v *Valid[G, P, V, E, F]) gadgetPolyLen() uint { - p, _ := math.NextPow2(1 + v.NumCalls) + p, _ := math.NextPow2(1 + v.NumGadgetCalls) return 1 + v.Gadget.Degree()*(p-1) } @@ -58,7 +58,7 @@ func (v *Valid[G, P, V, E, F]) wrapQuery(proof V) *QueryGadget[G, P, V, E, F] { func (v *Valid[G, P, V, E, F]) wrap(wireSeeds V) (g wrapperGadget[G, P, V, E, F]) { g.inner = v.Gadget - g.p, g.log2p = math.NextPow2(1 + v.NumCalls) + g.p, g.log2p = math.NextPow2(1 + v.NumGadgetCalls) g.wires = arith.NewVec[V](uint(len(wireSeeds)) * g.p) wiresCur := cursor.New(g.wires) for i := range wireSeeds { From bf2c328011c191cfe06ba773989aeafe04fa8e40 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 20 Dec 2024 14:50:03 -0600 Subject: [PATCH 29/45] Returning error on wrong parameters rather than panic. --- vdaf/prio3/mhcv/mhcv.go | 53 ++++++++++++++++++++++--------------- vdaf/prio3/sum/sum.go | 15 +++++++---- vdaf/prio3/sumvec/sumvec.go | 21 ++++++++++----- 3 files changed, 57 insertions(+), 32 deletions(-) diff --git a/vdaf/prio3/mhcv/mhcv.go b/vdaf/prio3/mhcv/mhcv.go index d5f590469..fdd4c3a4f 100644 --- a/vdaf/prio3/mhcv/mhcv.go +++ b/vdaf/prio3/mhcv/mhcv.go @@ -2,6 +2,7 @@ package mhcv import ( + "errors" "math/big" "math/bits" @@ -36,12 +37,15 @@ type MultiHotCountVec struct { p prio3.Prio3[[]bool, []uint64, *flpMultiHotCountVec, Vec, Fp, *Fp] } -func New(numShares uint8, length, maxWeight, chunkLen uint, context []byte) (m *MultiHotCountVec, err error) { +func New(numShares uint8, length, maxWeight, chunkLength uint, context []byte) (m *MultiHotCountVec, err error) { const multihotCountVecID = 5 + flp, err := newFlpMultiCountHotVec(length, maxWeight, chunkLength) + if err != nil { + return nil, err + } + m = new(MultiHotCountVec) - m.p, err = prio3.New( - newFlpMultiCountHotVec(length, maxWeight, chunkLen), - multihotCountVecID, numShares, context) + m.p, err = prio3.New(flp, multihotCountVecID, numShares, context) if err != nil { return nil, err } @@ -86,22 +90,21 @@ func (m *MultiHotCountVec) Unshard(aggShares []AggShare, numMeas uint) (aggregat type flpMultiHotCountVec struct { flp.FLP[flp.GadgetParallelSumInnerMul, poly, Vec, Fp, *Fp] - bits uint - chunkLen uint - length uint - offset Fp + bits uint + chunkLength uint + length uint + offset Fp } -func newFlpMultiCountHotVec(length, maxWeight, chunkLen uint) *flpMultiHotCountVec { - m := new(flpMultiHotCountVec) +func newFlpMultiCountHotVec(length, maxWeight, chunkLength uint) (*flpMultiHotCountVec, error) { if length == 0 { - panic("length cannot be zero") + return nil, ErrLength } if maxWeight > length { - panic("maxWeight cannot be greater than length") + return nil, ErrMaxWeight } - if chunkLen == 0 { - panic("chunkLen cannot be zero") + if chunkLength == 0 { + return nil, ErrChunkLength } bits := uint(bits.Len64(uint64(maxWeight))) @@ -110,27 +113,28 @@ func newFlpMultiCountHotVec(length, maxWeight, chunkLen uint) *flpMultiHotCountV b := new(big.Int).SetBytes(new(Fp).Order()) b.Sub(b, big.NewInt(int64(offset))) if b.Cmp(big.NewInt(int64(length))) <= 0 { - panic("length and maxWeight are too large for the current field size") + return nil, ErrFieldSize } - numGadgetCalls := (length + bits + chunkLen - 1) / chunkLen + numGadgetCalls := (length + bits + chunkLength - 1) / chunkLength + m := new(flpMultiHotCountVec) m.bits = bits m.length = length - m.chunkLen = chunkLen + m.chunkLength = chunkLength err := m.offset.SetUint64(offset) if err != nil { - panic(err) + return nil, err } m.Valid.MeasurementLen = length + bits m.Valid.JointRandLen = numGadgetCalls m.Valid.OutputLen = length m.Valid.EvalOutputLen = 2 - m.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLen} + m.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLength} m.NumGadgetCalls = numGadgetCalls m.FLP.Eval = m.Eval - return m + return m, nil } func (m *flpMultiHotCountVec) Eval( @@ -139,7 +143,7 @@ func (m *flpMultiHotCountVec) Eval( ) { var invShares Fp invShares.InvUint64(uint64(numShares)) - out[0] = flp.RangeCheck(g, numCalls, m.chunkLen, &invShares, meas, jointRand) + out[0] = flp.RangeCheck(g, numCalls, m.chunkLength, &invShares, meas, jointRand) measCur := cursor.New(meas) countVec := measCur.Next(m.length) @@ -205,3 +209,10 @@ func (m *flpMultiHotCountVec) Decode(output Vec, numMeas uint) (*[]uint64, error return &out, nil } + +var ( + ErrLength = errors.New("length cannot be zero") + ErrMaxWeight = errors.New("maxWeight cannot be greater than length") + ErrChunkLength = errors.New("chunkLength cannot be zero") + ErrFieldSize = errors.New("length and maxWeight are too large for the current field size") +) diff --git a/vdaf/prio3/sum/sum.go b/vdaf/prio3/sum/sum.go index c0b9b9865..177391d11 100644 --- a/vdaf/prio3/sum/sum.go +++ b/vdaf/prio3/sum/sum.go @@ -35,8 +35,13 @@ type Sum struct { func New(numShares uint8, maxMeasurement uint64, context []byte) (s *Sum, err error) { const sumID = 2 + flp, err := newFlpSum(maxMeasurement) + if err != nil { + return nil, err + } + s = new(Sum) - s.p, err = prio3.New(newFlpSum(maxMeasurement), sumID, numShares, context) + s.p, err = prio3.New(flp, sumID, numShares, context) if err != nil { return nil, err } @@ -85,15 +90,15 @@ type flpSum struct { offset Fp } -func newFlpSum(maxMeasurement uint64) *flpSum { - s := new(flpSum) +func newFlpSum(maxMeasurement uint64) (*flpSum, error) { bits := uint(bits.Len64(maxMeasurement)) offset := (uint64(1) << uint64(bits)) - 1 - maxMeasurement + s := new(flpSum) s.bits = bits err := s.offset.SetUint64(offset) if err != nil { - panic(err) + return nil, err } s.Valid.MeasurementLen = 2 * bits @@ -103,7 +108,7 @@ func newFlpSum(maxMeasurement uint64) *flpSum { s.Gadget = flp.GadgetPolyEvalx2x{} s.NumGadgetCalls = 2 * bits s.FLP.Eval = s.Eval - return s + return s, nil } func (s *flpSum) EvalEval( diff --git a/vdaf/prio3/sumvec/sumvec.go b/vdaf/prio3/sumvec/sumvec.go index 94fcfaffa..9cb9cb62d 100644 --- a/vdaf/prio3/sumvec/sumvec.go +++ b/vdaf/prio3/sumvec/sumvec.go @@ -2,6 +2,8 @@ package sumvec import ( + "errors" + "github.com/cloudflare/circl/vdaf/prio3/arith" "github.com/cloudflare/circl/vdaf/prio3/arith/fp128" "github.com/cloudflare/circl/vdaf/prio3/internal/cursor" @@ -31,10 +33,15 @@ type SumVec struct { p prio3.Prio3[[]uint64, []uint64, *flpSumVec, Vec, Fp, *Fp] } -func New(numShares uint8, length, bits, chunkLen uint, context []byte) (s *SumVec, err error) { +func New(numShares uint8, length, bits, chunkLength uint, context []byte) (s *SumVec, err error) { const sumVecID = 3 + flp, err := newFlpSumVec(length, bits, chunkLength) + if err != nil { + return nil, err + } + s = new(SumVec) - s.p, err = prio3.New(newFlpSumVec(length, bits, chunkLen), sumVecID, numShares, context) + s.p, err = prio3.New(flp, sumVecID, numShares, context) if err != nil { return nil, err } @@ -84,14 +91,14 @@ type flpSumVec struct { chunkLen uint } -func newFlpSumVec(length, bits, chunkLen uint) *flpSumVec { +func newFlpSumVec(length, bits, chunkLen uint) (*flpSumVec, error) { if bits > 64 { - panic("bits larger than 64 is not supported") + return nil, ErrBits } - s := new(flpSumVec) numGadgetCalls := (length*bits + chunkLen - 1) / chunkLen + s := new(flpSumVec) s.length = length s.bits = bits s.chunkLen = chunkLen @@ -102,7 +109,7 @@ func newFlpSumVec(length, bits, chunkLen uint) *flpSumVec { s.Gadget = flp.GadgetParallelSumInnerMul{Count: chunkLen} s.NumGadgetCalls = numGadgetCalls s.FLP.Eval = s.Eval - return s + return s, nil } func (s *flpSumVec) Eval( @@ -157,3 +164,5 @@ func (s *flpSumVec) Decode(output Vec, numMeas uint) (*[]uint64, error) { return &out, nil } + +var ErrBits = errors.New("bits larger than 64 is not supported") From 18e3d656fd7b5ba47d6104e5353a66385d14d85e Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 20 Dec 2024 15:39:33 -0600 Subject: [PATCH 30/45] Fix prio3 testing. --- vdaf/prio3/common_test.go | 29 ++++++++++++++++ vdaf/prio3/histogram/histogram.go | 2 +- vdaf/prio3/prio3_test.go | 55 +++++++++++++++---------------- vdaf/prio3/sum/sum.go | 2 +- vdaf/prio3/vectors_test.go | 11 ++++--- 5 files changed, 63 insertions(+), 36 deletions(-) diff --git a/vdaf/prio3/common_test.go b/vdaf/prio3/common_test.go index 910aac086..66c07c09c 100644 --- a/vdaf/prio3/common_test.go +++ b/vdaf/prio3/common_test.go @@ -5,6 +5,7 @@ import ( "encoding" "encoding/hex" "encoding/json" + "errors" "io" "os" "slices" @@ -54,6 +55,34 @@ func testMarshal[T any](t testing.TB, x *T, p *prio3.Params, extra ...uint) { test.CheckIsErr(t, err, "UnmarshalBinary should failed") } +func fromReader[T any](t testing.TB, r io.Reader) (z T) { + var err error + switch zz := any(&z).(type) { + case *prio3.Nonce: + _, err = r.Read(zz[:]) + case *prio3.VerifyKey: + _, err = r.Read(zz[:]) + default: + err = errors.New("wrong type") + } + test.CheckNoErr(t, err, "fromReader failed") + return +} + +func fromHex[T any](t testing.TB, x Hex) (z T) { + var err error + switch zz := any(&z).(type) { + case *prio3.Nonce: + copy(zz[:], x[:prio3.NonceSize]) + case *prio3.VerifyKey: + copy(zz[:], x[:prio3.VerifyKeySize]) + default: + err = errors.New("wrong type") + } + test.CheckNoErr(t, err, "fromHex failed") + return +} + type Hex []byte func (b *Hex) UnmarshalJSON(data []byte) (err error) { diff --git a/vdaf/prio3/histogram/histogram.go b/vdaf/prio3/histogram/histogram.go index 84ff644db..b5278b592 100644 --- a/vdaf/prio3/histogram/histogram.go +++ b/vdaf/prio3/histogram/histogram.go @@ -98,7 +98,7 @@ func newFlpHistogram(length, chunkLen uint) *flpHistogram { return h } -func (h *flpHistogram) EvalEval( +func (h *flpHistogram) Eval( out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, numShares uint8, ) { diff --git a/vdaf/prio3/prio3_test.go b/vdaf/prio3/prio3_test.go index 881bb3b72..012fe06a2 100644 --- a/vdaf/prio3/prio3_test.go +++ b/vdaf/prio3/prio3_test.go @@ -17,17 +17,16 @@ import ( type Prio3[ Measurement, Aggregate any, - AggShare, InputShare, OutShare, PrepShare, PrepState any, + AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, + PublicShare, VerifyKey any, ] interface { Params() prio3.Params - Shard( - Measurement, *prio3.Nonce, []byte, - ) (prio3.PublicShare, []InputShare, error) + Shard(Measurement, *Nonce, []byte) (PublicShare, []InputShare, error) PrepInit( - *prio3.VerifyKey, *prio3.Nonce, uint8, prio3.PublicShare, InputShare, + *VerifyKey, *Nonce, uint8, PublicShare, InputShare, ) (*PrepState, *PrepShare, error) - PrepSharesToPrep([]PrepShare) (*prio3.PrepMessage, error) - PrepNext(*PrepState, *prio3.PrepMessage) (*OutShare, error) + PrepSharesToPrep([]PrepShare) (*PrepMessage, error) + PrepNext(*PrepState, *PrepMessage) (*OutShare, error) AggregateInit() AggShare AggregateUpdate(*AggShare, *OutShare) Unshard([]AggShare, uint) (*Aggregate, error) @@ -116,16 +115,16 @@ func TestMultiHotCountVec(t *testing.T) { func testPrio3[ P Prio3[ Measurement, Aggregate, - AggShare, InputShare, OutShare, PrepShare, PrepState, + AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, + PublicShare, VerifyKey, ], Measurement, Aggregate any, - AggShare, InputShare, OutShare, PrepShare, PrepState any, + AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, + PublicShare, VerifyKey any, ](t testing.TB, p P, measurements []Measurement) *Aggregate { params := p.Params() shares := params.Shares() - var verifyKey prio3.VerifyKey - _, err := io.ReadFull(rand.Reader, verifyKey[:]) - test.CheckNoErr(t, err, "read verifyKey failed") + verifyKey := fromReader[VerifyKey](t, rand.Reader) aggShares := make([]AggShare, shares) for i := range aggShares { @@ -133,18 +132,15 @@ func testPrio3[ } for _, mi := range measurements { - var nonce prio3.Nonce - _, err = io.ReadFull(rand.Reader, nonce[:]) - test.CheckNoErr(t, err, "read nonce failed") - + nonce := fromReader[Nonce](t, rand.Reader) randb := make([]byte, params.RandSize()) - _, err = io.ReadFull(rand.Reader, randb) + _, err := io.ReadFull(rand.Reader, randb) test.CheckNoErr(t, err, "read rand bytes failed") - var pubShare prio3.PublicShare + var pubShare PublicShare var inputShares []InputShare pubShare, inputShares, err = p.Shard(mi, &nonce, randb) - test.CheckNoErr(t, err, "shard failed") + test.CheckNoErr(t, err, "Shard failed") testMarshal(t, &pubShare, ¶ms) for i := range inputShares { testMarshal(t, &inputShares[i], ¶ms, uint(i)) @@ -155,16 +151,15 @@ func testPrio3[ for i := range shares { state, share, errx := p.PrepInit( &verifyKey, &nonce, i, pubShare, inputShares[i]) - test.CheckNoErr(t, errx, "prepare init failed") + test.CheckNoErr(t, errx, "PrepInit failed") + testMarshal(t, state, ¶ms) + testMarshal(t, share, ¶ms) prepStates = append(prepStates, state) outboundPrepShares = append(outboundPrepShares, *share) } - testMarshal(t, prepStates[0], ¶ms) - testMarshal(t, &outboundPrepShares[0], ¶ms) - - var prepMsg *prio3.PrepMessage + var prepMsg *PrepMessage prepMsg, err = p.PrepSharesToPrep(outboundPrepShares) test.CheckNoErr(t, err, "PrepSharesToPrep failed") testMarshal(t, prepMsg, ¶ms) @@ -221,14 +216,16 @@ func BenchmarkMultiHotCountVec(b *testing.B) { } func benchmarkPrio3[ - T Prio3[ + P Prio3[ Measurement, Aggregate, - AggShare, InputShare, OutShare, PrepShare, PrepState, + AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, + PublicShare, VerifyKey, ], Measurement, Aggregate any, - AggShare, InputShare, OutShare, PrepShare, PrepState any, -](b *testing.B, v T, meas []Measurement) { + AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, + PublicShare, VerifyKey any, +](b *testing.B, p P, meas []Measurement) { for i := 0; i < b.N; i++ { - _ = testPrio3(b, v, meas) + _ = testPrio3(b, p, meas) } } diff --git a/vdaf/prio3/sum/sum.go b/vdaf/prio3/sum/sum.go index 177391d11..ee6d18751 100644 --- a/vdaf/prio3/sum/sum.go +++ b/vdaf/prio3/sum/sum.go @@ -111,7 +111,7 @@ func newFlpSum(maxMeasurement uint64) (*flpSum, error) { return s, nil } -func (s *flpSum) EvalEval( +func (s *flpSum) Eval( out Vec, g flp.Gadget[poly, Vec, Fp, *Fp], numCalls uint, meas, jointRand Vec, numShares uint8, ) { diff --git a/vdaf/prio3/vectors_test.go b/vdaf/prio3/vectors_test.go index 85a0d71c1..7616e8b77 100644 --- a/vdaf/prio3/vectors_test.go +++ b/vdaf/prio3/vectors_test.go @@ -9,7 +9,6 @@ import ( "github.com/cloudflare/circl/internal/test" "github.com/cloudflare/circl/vdaf/prio3/count" "github.com/cloudflare/circl/vdaf/prio3/histogram" - "github.com/cloudflare/circl/vdaf/prio3/internal/prio3" "github.com/cloudflare/circl/vdaf/prio3/mhcv" "github.com/cloudflare/circl/vdaf/prio3/sum" "github.com/cloudflare/circl/vdaf/prio3/sumvec" @@ -153,14 +152,16 @@ func TestVector(t *testing.T) { func runPrio3[ P Prio3[ Measurement, Aggregate, - AggShare, InputShare, OutShare, PrepShare, PrepState, + AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, + PublicShare, VerifyKey, ], Measurement, Aggregate any, - AggShare, InputShare, OutShare, PrepShare, PrepState any, + AggShare, InputShare, Nonce, OutShare, PrepMessage, PrepShare, PrepState, + PublicShare, VerifyKey any, ](t *testing.T, p P, v VectorBase[Measurement, Aggregate]) { params := p.Params() shares := params.Shares() - verifyKey := prio3.VerifyKey(v.VerifyKey) + verifyKey := fromHex[VerifyKey](t, v.VerifyKey) aggShares := make([]AggShare, shares) for i := range aggShares { @@ -168,7 +169,7 @@ func runPrio3[ } for _, instance := range v.Prep { - nonce := prio3.Nonce(instance.Nonce) + nonce := fromHex[Nonce](t, instance.Nonce) randb := instance.Rand meas := instance.Measurement From 73555a5c02aac6bd6186d4c52d9d77dbe24259b6 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 20 Dec 2024 16:46:21 -0600 Subject: [PATCH 31/45] Warn about masking before decoding. Note that masking does not apply to fp64 nor fp128 packages. --- vdaf/prio3/arith/fp128/vector.go | 2 +- vdaf/prio3/arith/gen.go | 7 ++++++- vdaf/prio3/arith/templates/vector.go.tmpl | 6 +++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/vdaf/prio3/arith/fp128/vector.go b/vdaf/prio3/arith/fp128/vector.go index 76f55ed42..648e3fd79 100644 --- a/vdaf/prio3/arith/fp128/vector.go +++ b/vdaf/prio3/arith/fp128/vector.go @@ -203,8 +203,8 @@ func (v Vec) Unmarshal(s *cryptobyte.String) bool { } func isInRange(b *[Size]byte) (out [2]uint64, ok bool) { - out[0] = binary.LittleEndian.Uint64(b[:8]) out[1] = binary.LittleEndian.Uint64(b[8:]) + out[0] = binary.LittleEndian.Uint64(b[:8]) ok = out[1] < orderP1 || (out[1] == orderP1 && out[0] < orderP0) return } diff --git a/vdaf/prio3/arith/gen.go b/vdaf/prio3/arith/gen.go index 3c105601a..069c78783 100644 --- a/vdaf/prio3/arith/gen.go +++ b/vdaf/prio3/arith/gen.go @@ -24,7 +24,12 @@ type Fp struct { func (f Fp) NumUint64() int { return int(f.Bits) / 64 } -func (f Fp) NumUint8() int { return int(f.Bits) / 8 } +func (f Fp) NumUint8() int { return int(f.Bits+7) / 8 } + +func (f Fp) NeedsMasking() bool { + p := f.Prime() + return p.BitLen() < 8*f.NumUint8() +} func (f Fp) OrderConst() (s string) { d := baseTwo64(f.Prime()) diff --git a/vdaf/prio3/arith/templates/vector.go.tmpl b/vdaf/prio3/arith/templates/vector.go.tmpl index c1d0aa5c0..ce0c410a2 100644 --- a/vdaf/prio3/arith/templates/vector.go.tmpl +++ b/vdaf/prio3/arith/templates/vector.go.tmpl @@ -209,14 +209,18 @@ func (v Vec) Unmarshal(s *cryptobyte.String) bool{ func isInRange(b *[Size]byte) (out [{{.NumUint64}}]uint64, ok bool) { + {{- if .NeedsMasking}} + panic("unimplemented: recall to implement masking before decoding") + {{- else }} {{- if eq .Bits 64}} out[0] = binary.LittleEndian.Uint64(b[:8]) ok = out[0] < orderP0 {{- else if eq .Bits 128}} - out[0] = binary.LittleEndian.Uint64(b[:8]) out[1] = binary.LittleEndian.Uint64(b[8:]) + out[0] = binary.LittleEndian.Uint64(b[:8]) ok = out[1] < orderP1 || (out[1] == orderP1 && out[0] < orderP0) {{- end }} + {{- end }} return } From ff8b93449519e1a04f609581df8ce810a25056cb Mon Sep 17 00:00:00 2001 From: armfazh Date: Thu, 16 Jan 2025 13:24:28 -0800 Subject: [PATCH 32/45] Adds unit test for FLP.Query to detect invalid testing points. --- vdaf/prio3/count/count.go | 2 +- vdaf/prio3/count/count_test.go | 14 ++++++++ vdaf/prio3/histogram/histogram_test.go | 14 ++++++++ vdaf/prio3/internal/flp_test/query.go | 48 ++++++++++++++++++++++++++ vdaf/prio3/mhcv/mhcv_test.go | 17 +++++++++ vdaf/prio3/sum/sum_test.go | 17 +++++++++ vdaf/prio3/sumvec/sumvec_test.go | 16 +++++++++ 7 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 vdaf/prio3/count/count_test.go create mode 100644 vdaf/prio3/histogram/histogram_test.go create mode 100644 vdaf/prio3/internal/flp_test/query.go create mode 100644 vdaf/prio3/mhcv/mhcv_test.go create mode 100644 vdaf/prio3/sum/sum_test.go create mode 100644 vdaf/prio3/sumvec/sumvec_test.go diff --git a/vdaf/prio3/count/count.go b/vdaf/prio3/count/count.go index b8db181f5..12ec2e528 100644 --- a/vdaf/prio3/count/count.go +++ b/vdaf/prio3/count/count.go @@ -1,4 +1,4 @@ -// Package count is a VDAF for counting boolean measurements. +// Package count is a VDAF for counting Boolean measurements. package count import ( diff --git a/vdaf/prio3/count/count_test.go b/vdaf/prio3/count/count_test.go new file mode 100644 index 000000000..533ff8404 --- /dev/null +++ b/vdaf/prio3/count/count_test.go @@ -0,0 +1,14 @@ +package count + +import ( + "testing" + + "github.com/cloudflare/circl/vdaf/prio3/internal/flp_test" +) + +func TestCount(t *testing.T) { + t.Run("Query", func(t *testing.T) { + c := newFlpCount() + flp_test.TestInvalidQuery(t, &c.FLP) + }) +} diff --git a/vdaf/prio3/histogram/histogram_test.go b/vdaf/prio3/histogram/histogram_test.go new file mode 100644 index 000000000..653784b55 --- /dev/null +++ b/vdaf/prio3/histogram/histogram_test.go @@ -0,0 +1,14 @@ +package histogram + +import ( + "testing" + + "github.com/cloudflare/circl/vdaf/prio3/internal/flp_test" +) + +func TestHistogram(t *testing.T) { + t.Run("Query", func(t *testing.T) { + h := newFlpHistogram(4, 3) + flp_test.TestInvalidQuery(t, &h.FLP) + }) +} diff --git a/vdaf/prio3/internal/flp_test/query.go b/vdaf/prio3/internal/flp_test/query.go new file mode 100644 index 000000000..c0e6482dd --- /dev/null +++ b/vdaf/prio3/internal/flp_test/query.go @@ -0,0 +1,48 @@ +package flp_test + +import ( + "testing" + + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/math" + "github.com/cloudflare/circl/vdaf/prio3/arith" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp" +) + +func TestInvalidQuery[ + G flp.Gadget[P, V, E, F], + P arith.Poly[P, E], V arith.Vec[V, E], E arith.Elt, F arith.Fp[E], +](t *testing.T, f *flp.FLP[G, P, V, E, F]) { + const NumShares = 2 + measShare := arith.NewVec[V](f.MeasurementLength()) + proofShare := arith.NewVec[V](f.ProofLength()) + queryRand := arith.NewVec[V](f.QueryRandLength()) + jointRand := arith.NewVec[V](f.JointRandLength()) + + s := sha3.NewShake128() + test.CheckNoErr(t, measShare.Random(&s), "measShare random failed") + test.CheckNoErr(t, proofShare.Random(&s), "proofShare random failed") + test.CheckNoErr(t, queryRand.Random(&s), "queryRand random failed") + test.CheckNoErr(t, jointRand.Random(&s), "jointRand random failed") + + var index uint + if f.EvalOutputLength() > 1 { + index = f.EvalOutputLength() + } + + invalidEvaluationPoint := F(&queryRand[index]) + _, logP := math.NextPow2(1 + f.Valid.NumGadgetCalls) + root := F(new(E)) + // Check all subgroups of order 2^logN. + for logN := range logP + 1 { + root.SetRootOfUnityTwoN(logN) + invalidEvaluationPoint.SetOne() + // Check any element in the subgroup of order 2^logN. + for range 1 << logN { + _, err := f.Query(measShare, proofShare, queryRand, jointRand, NumShares) + test.CheckIsErr(t, err, "Query should failed") + invalidEvaluationPoint.MulAssign(root) + } + } +} diff --git a/vdaf/prio3/mhcv/mhcv_test.go b/vdaf/prio3/mhcv/mhcv_test.go new file mode 100644 index 000000000..bd59fa15f --- /dev/null +++ b/vdaf/prio3/mhcv/mhcv_test.go @@ -0,0 +1,17 @@ +package mhcv + +import ( + "testing" + + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp_test" +) + +func TestMhcv(t *testing.T) { + t.Run("Query", func(t *testing.T) { + const MaxWeight = 2 + m, err := newFlpMultiCountHotVec(5, MaxWeight, 3) + test.CheckNoErr(t, err, "new flp failed") + flp_test.TestInvalidQuery(t, &m.FLP) + }) +} diff --git a/vdaf/prio3/sum/sum_test.go b/vdaf/prio3/sum/sum_test.go new file mode 100644 index 000000000..10f5c1d65 --- /dev/null +++ b/vdaf/prio3/sum/sum_test.go @@ -0,0 +1,17 @@ +package sum + +import ( + "testing" + + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp_test" +) + +func TestSum(t *testing.T) { + t.Run("Query", func(t *testing.T) { + const MaxMeas = 4 + s, err := newFlpSum(MaxMeas) + test.CheckNoErr(t, err, "new flp failed") + flp_test.TestInvalidQuery(t, &s.FLP) + }) +} diff --git a/vdaf/prio3/sumvec/sumvec_test.go b/vdaf/prio3/sumvec/sumvec_test.go new file mode 100644 index 000000000..b9ba0eb4c --- /dev/null +++ b/vdaf/prio3/sumvec/sumvec_test.go @@ -0,0 +1,16 @@ +package sumvec + +import ( + "testing" + + "github.com/cloudflare/circl/internal/test" + "github.com/cloudflare/circl/vdaf/prio3/internal/flp_test" +) + +func TestSumVec(t *testing.T) { + t.Run("Query", func(t *testing.T) { + s, err := newFlpSumVec(4, 4, 3) + test.CheckNoErr(t, err, "new flp failed") + flp_test.TestInvalidQuery(t, &s.FLP) + }) +} From d8e00c06bdb85920eb470dcce049b996299530c2 Mon Sep 17 00:00:00 2001 From: armfazh Date: Thu, 16 Jan 2025 15:59:58 -0800 Subject: [PATCH 33/45] Encoding uses constant time copy. --- vdaf/prio3/count/count.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/vdaf/prio3/count/count.go b/vdaf/prio3/count/count.go index 12ec2e528..b0ec17e4e 100644 --- a/vdaf/prio3/count/count.go +++ b/vdaf/prio3/count/count.go @@ -2,6 +2,8 @@ package count import ( + "crypto/subtle" + "github.com/cloudflare/circl/vdaf/prio3/arith" "github.com/cloudflare/circl/vdaf/prio3/arith/fp64" "github.com/cloudflare/circl/vdaf/prio3/internal/flp" @@ -101,9 +103,25 @@ func (c *flpCount) Eval( } func (c *flpCount) Encode(measurement bool) (Vec, error) { - out := arith.NewVec[Vec](1) + var one Fp + one.SetOne() + y, err := one.MarshalBinary() + if err != nil { + return nil, err + } + + var b int if measurement { - out[0].SetOne() + b = 1 + } + + var x [fp64.Size]byte + subtle.ConstantTimeCopy(b, x[:], y) + + out := arith.NewVec[Vec](1) + err = out[0].UnmarshalBinary(x[:]) + if err != nil { + return nil, err } return out, nil From a64a146b5e5edf4f91225458168018a5526be0b5 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 17 Jan 2025 12:44:41 -0800 Subject: [PATCH 34/45] Ensure that Query testing returns ErrInvalidEval. --- vdaf/prio3/internal/flp_test/query.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vdaf/prio3/internal/flp_test/query.go b/vdaf/prio3/internal/flp_test/query.go index c0e6482dd..0a421a131 100644 --- a/vdaf/prio3/internal/flp_test/query.go +++ b/vdaf/prio3/internal/flp_test/query.go @@ -1,6 +1,7 @@ package flp_test import ( + "errors" "testing" "github.com/cloudflare/circl/internal/sha3" @@ -34,14 +35,17 @@ func TestInvalidQuery[ invalidEvaluationPoint := F(&queryRand[index]) _, logP := math.NextPow2(1 + f.Valid.NumGadgetCalls) root := F(new(E)) - // Check all subgroups of order 2^logN. + // Check all subgroups of order 2^logN <= 2^logP. for logN := range logP + 1 { root.SetRootOfUnityTwoN(logN) invalidEvaluationPoint.SetOne() - // Check any element in the subgroup of order 2^logN. + // Check every element in the subgroup of order 2^logN. for range 1 << logN { _, err := f.Query(measShare, proofShare, queryRand, jointRand, NumShares) - test.CheckIsErr(t, err, "Query should failed") + if !errors.Is(err, flp.ErrInvalidEval) { + test.ReportError(t, err, flp.ErrInvalidEval) + } + invalidEvaluationPoint.MulAssign(root) } } From 3d8cc9889057c81b9a9ed52ff18f7025e64ee961 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 17 Jan 2025 14:18:36 -0800 Subject: [PATCH 35/45] Bump to v14. --- vdaf/prio3/doc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vdaf/prio3/doc.go b/vdaf/prio3/doc.go index 4797f8b4f..2e1a320a3 100644 --- a/vdaf/prio3/doc.go +++ b/vdaf/prio3/doc.go @@ -1,11 +1,11 @@ // Package prio3 implements Prio3, a set of Verifiable Distributed // Aggregation Functions (VDAFs). It provides several concrete VDAFs -// described in draft-irtf-cfrg-vdaf [v13]: +// described in draft-irtf-cfrg-vdaf [v14]: // - Count [github.com/cloudflare/circl/vdaf/prio3/count] // - Sum [github.com/cloudflare/circl/vdaf/prio3/sum] // - SumVec [github.com/cloudflare/circl/vdaf/prio3/sumvec] // - Histogram [github.com/cloudflare/circl/vdaf/prio3/mhcv] // - MultiHotCountVec [github.com/cloudflare/circl/vdaf/prio3/histogram] // -// [v13]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-13 +// [v14]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-14 package prio3 From cd157f01521052745975fb4451c3df14dbc1016d Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 17 Jan 2025 14:55:12 -0800 Subject: [PATCH 36/45] Run semgrep cronjob only in upstream repository. --- .github/workflows/semgrep.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index 2250f98de..44a37c0f8 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -11,6 +11,7 @@ jobs: semgrep: name: semgrep/ci runs-on: ubuntu-latest + if: github.repository == 'cloudflare/circl' env: SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }} SEMGREP_URL: https://cloudflare.semgrep.dev From 964fefa14b77a0c79abab31c0fd5a1158f20054d Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Fri, 5 Jan 2024 16:29:09 +0100 Subject: [PATCH 37/45] X-Wing PQ/T hybrid Implements final version (-05) https://datatracker.ietf.org/doc/draft-connolly-cfrg-xwing-kem/ Also includes HPKE integration with final IANA codepoint (which is different from the one requested in -05.) --- hpke/algs.go | 12 +- hpke/genericnoauthkem.go | 78 +++++++++ hpke/hpke_test.go | 1 + kem/schemes/schemes.go | 2 + kem/schemes/schemes_test.go | 1 + kem/xwing/scheme.go | 142 +++++++++++++++++ kem/xwing/xwing.go | 310 ++++++++++++++++++++++++++++++++++++ kem/xwing/xwing_test.go | 79 +++++++++ 8 files changed, 624 insertions(+), 1 deletion(-) create mode 100644 hpke/genericnoauthkem.go create mode 100644 kem/xwing/scheme.go create mode 100644 kem/xwing/xwing.go create mode 100644 kem/xwing/xwing_test.go diff --git a/hpke/algs.go b/hpke/algs.go index a9fbc6612..106ffef26 100644 --- a/hpke/algs.go +++ b/hpke/algs.go @@ -16,6 +16,7 @@ import ( "github.com/cloudflare/circl/ecc/p384" "github.com/cloudflare/circl/kem" "github.com/cloudflare/circl/kem/kyber/kyber768" + "github.com/cloudflare/circl/kem/xwing" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/hkdf" ) @@ -39,6 +40,8 @@ const ( // KEM_X25519_KYBER768_DRAFT00 is a hybrid KEM built on DHKEM(X25519, HKDF-SHA256) // and Kyber768Draft00 KEM_X25519_KYBER768_DRAFT00 KEM = 0x30 + // KEM_XWING is a hybrid KEM using X25519 and ML-KEM-768. + KEM_XWING KEM = 0x647a ) // IsValid returns true if the KEM identifier is supported by the HPKE package. @@ -49,7 +52,8 @@ func (k KEM) IsValid() bool { KEM_P521_HKDF_SHA512, KEM_X25519_HKDF_SHA256, KEM_X448_HKDF_SHA512, - KEM_X25519_KYBER768_DRAFT00: + KEM_X25519_KYBER768_DRAFT00, + KEM_XWING: return true default: return false @@ -72,6 +76,8 @@ func (k KEM) Scheme() kem.AuthScheme { return dhkemx448hkdfsha512 case KEM_X25519_KYBER768_DRAFT00: return hybridkemX25519Kyber768 + case KEM_XWING: + return kemXwing default: panic(ErrInvalidKEM) } @@ -237,6 +243,7 @@ var ( dhkemp256hkdfsha256, dhkemp384hkdfsha384, dhkemp521hkdfsha512 shortKEM dhkemx25519hkdfsha256, dhkemx448hkdfsha512 xKEM hybridkemX25519Kyber768 hybridKEM + kemXwing genericNoAuthKEM ) func init() { @@ -275,4 +282,7 @@ func init() { hybridkemX25519Kyber768.kemBase.Hash = crypto.SHA256 hybridkemX25519Kyber768.kemA = dhkemx25519hkdfsha256 hybridkemX25519Kyber768.kemB = kyber768.Scheme() + + kemXwing.kem = xwing.Scheme() + kemXwing.name = "HPKE_KEM_XWING" } diff --git a/hpke/genericnoauthkem.go b/hpke/genericnoauthkem.go new file mode 100644 index 000000000..861176529 --- /dev/null +++ b/hpke/genericnoauthkem.go @@ -0,0 +1,78 @@ +package hpke + +// Shim to use generic KEM (kem.Scheme) as HPKE KEM. + +import ( + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/kem" +) + +// genericNoAuthKEM wraps a generic KEM (kem.Scheme) to be used as a HPKE KEM. +type genericNoAuthKEM struct { + kem kem.Scheme + name string +} + +func (h genericNoAuthKEM) PrivateKeySize() int { return h.kem.PrivateKeySize() } +func (h genericNoAuthKEM) SeedSize() int { return h.kem.SeedSize() } +func (h genericNoAuthKEM) CiphertextSize() int { return h.kem.CiphertextSize() } +func (h genericNoAuthKEM) PublicKeySize() int { return h.kem.PublicKeySize() } +func (h genericNoAuthKEM) EncapsulationSeedSize() int { return h.kem.EncapsulationSeedSize() } +func (h genericNoAuthKEM) SharedKeySize() int { return h.kem.SharedKeySize() } +func (h genericNoAuthKEM) Name() string { return h.name } + +func (h genericNoAuthKEM) AuthDecapsulate(skR kem.PrivateKey, + ct []byte, + pkS kem.PublicKey, +) ([]byte, error) { + panic("AuthDecapsulate is not supported for this KEM") +} + +func (h genericNoAuthKEM) AuthEncapsulate(pkr kem.PublicKey, sks kem.PrivateKey) ( + ct []byte, ss []byte, err error, +) { + panic("AuthEncapsulate is not supported for this KEM") +} + +func (h genericNoAuthKEM) AuthEncapsulateDeterministically(pkr kem.PublicKey, sks kem.PrivateKey, seed []byte) (ct, ss []byte, err error) { + panic("AuthEncapsulateDeterministically is not supported for this KEM") +} + +func (h genericNoAuthKEM) Encapsulate(pkr kem.PublicKey) ( + ct []byte, ss []byte, err error, +) { + return h.kem.Encapsulate(pkr) +} + +func (h genericNoAuthKEM) Decapsulate(skr kem.PrivateKey, ct []byte) ([]byte, error) { + return h.kem.Decapsulate(skr, ct) +} + +func (h genericNoAuthKEM) EncapsulateDeterministically( + pkr kem.PublicKey, seed []byte, +) (ct, ss []byte, err error) { + return h.kem.EncapsulateDeterministically(pkr, seed) +} + +// HPKE requires DeriveKeyPair() to take any seed larger than the private key +// size, whereas typical KEMs expect a specific seed size. We'll just use +// SHAKE256 to hash it to the right size as in X-Wing. +func (h genericNoAuthKEM) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { + seed2 := make([]byte, h.kem.SeedSize()) + hh := sha3.NewShake256() + _, _ = hh.Write(seed) + _, _ = hh.Read(seed2) + return h.kem.DeriveKeyPair(seed2) +} + +func (h genericNoAuthKEM) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { + return h.kem.GenerateKeyPair() +} + +func (h genericNoAuthKEM) UnmarshalBinaryPrivateKey(data []byte) (kem.PrivateKey, error) { + return h.kem.UnmarshalBinaryPrivateKey(data) +} + +func (h genericNoAuthKEM) UnmarshalBinaryPublicKey(data []byte) (kem.PublicKey, error) { + return h.kem.UnmarshalBinaryPublicKey(data) +} diff --git a/hpke/hpke_test.go b/hpke/hpke_test.go index b679c825c..23d782af0 100644 --- a/hpke/hpke_test.go +++ b/hpke/hpke_test.go @@ -160,6 +160,7 @@ func BenchmarkHpkeRoundTrip(b *testing.B) { }{ {hpke.KEM_X25519_HKDF_SHA256, hpke.KDF_HKDF_SHA256, hpke.AEAD_AES128GCM}, {hpke.KEM_X25519_KYBER768_DRAFT00, hpke.KDF_HKDF_SHA256, hpke.AEAD_AES128GCM}, + {hpke.KEM_XWING, hpke.KDF_HKDF_SHA256, hpke.AEAD_AES128GCM}, } for _, test := range tests { runHpkeBenchmark(b, test.kem, test.kdf, test.aead) diff --git a/kem/schemes/schemes.go b/kem/schemes/schemes.go index 747d99e9d..836948259 100644 --- a/kem/schemes/schemes.go +++ b/kem/schemes/schemes.go @@ -29,6 +29,7 @@ import ( "github.com/cloudflare/circl/kem/mlkem/mlkem1024" "github.com/cloudflare/circl/kem/mlkem/mlkem512" "github.com/cloudflare/circl/kem/mlkem/mlkem768" + "github.com/cloudflare/circl/kem/xwing" ) var allSchemes = [...]kem.Scheme{ @@ -50,6 +51,7 @@ var allSchemes = [...]kem.Scheme{ hybrid.Kyber1024X448(), hybrid.P256Kyber768Draft00(), hybrid.X25519MLKEM768(), + xwing.Scheme(), } var allSchemeNames map[string]kem.Scheme diff --git a/kem/schemes/schemes_test.go b/kem/schemes/schemes_test.go index d9caf70a9..e81896c53 100644 --- a/kem/schemes/schemes_test.go +++ b/kem/schemes/schemes_test.go @@ -160,4 +160,5 @@ func Example_schemes() { // Kyber1024-X448 // P256Kyber768Draft00 // X25519MLKEM768 + // X-Wing } diff --git a/kem/xwing/scheme.go b/kem/xwing/scheme.go new file mode 100644 index 000000000..a9a574a57 --- /dev/null +++ b/kem/xwing/scheme.go @@ -0,0 +1,142 @@ +package xwing + +import ( + "bytes" + cryptoRand "crypto/rand" + "crypto/subtle" + + "github.com/cloudflare/circl/kem" + "github.com/cloudflare/circl/kem/mlkem/mlkem768" +) + +// This file contains the boilerplate code to connect X-Wing to the +// generic KEM API. + +// Returns the generic KEM interface for X-Wing PQ/T hybrid KEM. +func Scheme() kem.Scheme { return &xwing } + +type scheme struct{} + +var xwing scheme + +func (*scheme) Name() string { return "X-Wing" } +func (*scheme) PublicKeySize() int { return PublicKeySize } +func (*scheme) PrivateKeySize() int { return PrivateKeySize } +func (*scheme) SeedSize() int { return SeedSize } +func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } +func (*scheme) SharedKeySize() int { return SharedKeySize } +func (*scheme) CiphertextSize() int { return CiphertextSize } +func (*PrivateKey) Scheme() kem.Scheme { return &xwing } +func (*PublicKey) Scheme() kem.Scheme { return &xwing } + +func (sch *scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { + var seed [EncapsulationSeedSize]byte + _, err = cryptoRand.Read(seed[:]) + if err != nil { + return + } + return sch.EncapsulateDeterministically(pk, seed[:]) +} + +func (sch *scheme) EncapsulateDeterministically( + pk kem.PublicKey, seed []byte, +) ([]byte, []byte, error) { + if len(seed) != EncapsulationSeedSize { + return nil, nil, kem.ErrSeedSize + } + pub, ok := pk.(*PublicKey) + if !ok { + return nil, nil, kem.ErrTypeMismatch + } + var ( + ct [CiphertextSize]byte + ss [SharedKeySize]byte + ) + pub.EncapsulateTo(ct[:], ss[:], seed) + return ct[:], ss[:], nil +} + +func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { + var pk PublicKey + if len(buf) != PublicKeySize { + return nil, kem.ErrPubKeySize + } + + if err := pk.Unpack(buf); err != nil { + return nil, err + } + return &pk, nil +} + +func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { + var sk PrivateKey + if len(buf) != PrivateKeySize { + return nil, kem.ErrPrivKeySize + } + + sk.Unpack(buf) + return &sk, nil +} + +func (sk *PrivateKey) MarshalBinary() ([]byte, error) { + var ret [PrivateKeySize]byte + sk.Pack(ret[:]) + return ret[:], nil +} + +func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { + oth, ok := other.(*PrivateKey) + if !ok { + return false + } + return sk.m.Equal(&oth.m) && + subtle.ConstantTimeCompare(oth.x[:], sk.x[:]) == 1 +} + +func (sk *PrivateKey) Public() kem.PublicKey { + var pk PublicKey + pk.m = *(sk.m.Public().(*mlkem768.PublicKey)) + pk.x = sk.xpk + return &pk +} + +func (pk *PublicKey) Equal(other kem.PublicKey) bool { + oth, ok := other.(*PublicKey) + if !ok { + return false + } + return pk.m.Equal(&oth.m) && bytes.Equal(pk.x[:], oth.x[:]) +} + +func (pk *PublicKey) MarshalBinary() ([]byte, error) { + var ret [PublicKeySize]byte + pk.Pack(ret[:]) + return ret[:], nil +} + +func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { + sk, pk := DeriveKeyPair(seed) + return pk, sk +} + +func (sch *scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { + sk, pk, err := GenerateKeyPair(nil) + return pk, sk, err +} + +func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { + if len(ct) != CiphertextSize { + return nil, kem.ErrCiphertextSize + } + + var ss [SharedKeySize]byte + + priv, ok := sk.(*PrivateKey) + if !ok { + return nil, kem.ErrTypeMismatch + } + + priv.DecapsulateTo(ss[:], ct[:]) + + return ss[:], nil +} diff --git a/kem/xwing/xwing.go b/kem/xwing/xwing.go new file mode 100644 index 000000000..7e2807907 --- /dev/null +++ b/kem/xwing/xwing.go @@ -0,0 +1,310 @@ +// Package xwing implements the X-Wing PQ/T hybrid KEM +// +// https://datatracker.ietf.org/doc/draft-connolly-cfrg-xwing-kem +// +// Implements the final version (-05). +package xwing + +import ( + cryptoRand "crypto/rand" + "errors" + "io" + + "github.com/cloudflare/circl/dh/x25519" + "github.com/cloudflare/circl/internal/sha3" + "github.com/cloudflare/circl/kem" + "github.com/cloudflare/circl/kem/mlkem/mlkem768" +) + +// An X-Wing private key. +type PrivateKey struct { + seed [32]byte + m mlkem768.PrivateKey + x x25519.Key + xpk x25519.Key +} + +// An X-Wing public key. +type PublicKey struct { + m mlkem768.PublicKey + x x25519.Key +} + +const ( + // Size of a seed of a keypair + SeedSize = 32 + + // Size of an X-Wing public key + PublicKeySize = 1216 + + // Size of an X-Wing private key + PrivateKeySize = 32 + + // Size of the seed passed to EncapsulateTo + EncapsulationSeedSize = 64 + + // Size of the established shared key + SharedKeySize = 32 + + // Size of an X-Wing ciphertext. + CiphertextSize = 1120 +) + +func combiner( + out []byte, + ssm *[mlkem768.SharedKeySize]byte, + ssx *x25519.Key, + ctx *x25519.Key, + pkx *x25519.Key, +) { + h := sha3.New256() + _, _ = h.Write(ssm[:]) + _, _ = h.Write(ssx[:]) + _, _ = h.Write(ctx[:]) + _, _ = h.Write(pkx[:]) + + // \./ + // /^\ + _, _ = h.Write([]byte(`\.//^\`)) + + _, _ = h.Read(out[:]) +} + +// Packs sk to buf. +// +// Panics if buf is not of size PrivateKeySize +func (sk *PrivateKey) Pack(buf []byte) { + if len(buf) != PrivateKeySize { + panic(kem.ErrPrivKeySize) + } + copy(buf, sk.seed[:]) +} + +// Packs pk to buf. +// +// Panics if buf is not of size PublicKeySize. +func (pk *PublicKey) Pack(buf []byte) { + if len(buf) != PublicKeySize { + panic(kem.ErrPubKeySize) + } + pk.m.Pack(buf[:mlkem768.PublicKeySize]) + copy(buf[mlkem768.PublicKeySize:], pk.x[:]) +} + +// DeriveKeyPair derives a public/private keypair deterministically +// from the given seed. +// +// Panics if seed is not of length SeedSize. +func DeriveKeyPair(seed []byte) (*PrivateKey, *PublicKey) { + var ( + sk PrivateKey + pk PublicKey + ) + + deriveKeyPair(seed, &sk, &pk) + + return &sk, &pk +} + +func deriveKeyPair(seed []byte, sk *PrivateKey, pk *PublicKey) { + if len(seed) != SeedSize { + panic(kem.ErrSeedSize) + } + + var seedm [mlkem768.KeySeedSize]byte + + copy(sk.seed[:], seed) + + h := sha3.NewShake256() + _, _ = h.Write(seed) + _, _ = h.Read(seedm[:]) + _, _ = h.Read(sk.x[:]) + + pkm, skm := mlkem768.NewKeyFromSeed(seedm[:]) + sk.m = *skm + pk.m = *pkm + + x25519.KeyGen(&pk.x, &sk.x) + sk.xpk = pk.x +} + +// DeriveKeyPairPacked derives a keypair like DeriveKeyPair, and +// returns them packed. +func DeriveKeyPairPacked(seed []byte) ([]byte, []byte) { + sk, pk := DeriveKeyPair(seed) + var ( + ppk [PublicKeySize]byte + psk [PrivateKeySize]byte + ) + pk.Pack(ppk[:]) + sk.Pack(psk[:]) + return psk[:], ppk[:] +} + +// GenerateKeyPair generates public and private keys using entropy from rand. +// If rand is nil, crypto/rand.Reader will be used. +func GenerateKeyPair(rand io.Reader) (*PrivateKey, *PublicKey, error) { + var seed [SeedSize]byte + if rand == nil { + rand = cryptoRand.Reader + } + _, err := io.ReadFull(rand, seed[:]) + if err != nil { + return nil, nil, err + } + sk, pk := DeriveKeyPair(seed[:]) + return sk, pk, nil +} + +// GenerateKeyPairPacked generates a keypair like GenerateKeyPair, and +// returns them packed. +func GenerateKeyPairPacked(rand io.Reader) ([]byte, []byte, error) { + sk, pk, err := GenerateKeyPair(rand) + if err != nil { + return nil, nil, err + } + var ( + ppk [PublicKeySize]byte + psk [PrivateKeySize]byte + ) + pk.Pack(ppk[:]) + sk.Pack(psk[:]) + return psk[:], ppk[:], nil +} + +// Encapsulate generates a shared key and ciphertext that contains it +// for the public key pk using randomness from seed. +// +// seed may be nil, in which case crypto/rand.Reader is used. +// +// Warning: note that the order of the returned ss and ct matches the +// X-Wing standard, which is the reverse of the Circl KEM API. +// +// Returns ErrPubKey if ML-KEM encapsulation key check fails. +// +// Panics if pk is not of size PublicKeySize, or randomness could not +// be read from crypto/rand.Reader. +func Encapsulate(pk, seed []byte) (ss, ct []byte, err error) { + var pub PublicKey + if err := pub.Unpack(pk); err != nil { + return nil, nil, err + } + ct = make([]byte, CiphertextSize) + ss = make([]byte, SharedKeySize) + pub.EncapsulateTo(ct, ss, seed) + return ss, ct, nil +} + +// Decapsulate computes the shared key which is encapsulated in ct +// for the private key sk. +// +// Panics if sk or ct are not of length PrivateKeySize and CiphertextSize +// respectively. +func Decapsulate(ct, sk []byte) (ss []byte) { + var priv PrivateKey + priv.Unpack(sk) + ss = make([]byte, SharedKeySize) + priv.DecapsulateTo(ss, ct) + return ss +} + +// Raised when passing a byte slice of the wrong size for the shared +// secret to the EncapsulateTo or DecapsulateTo functions. +var ErrSharedKeySize = errors.New("wrong size for shared key") + +// EncapsulateTo generates a shared key and ciphertext that contains it +// for the public key using randomness from seed and writes the shared key +// to ss and ciphertext to ct. +// +// Panics if ss, ct or seed are not of length SharedKeySize, CiphertextSize +// and EncapsulationSeedSize respectively. +// +// seed may be nil, in which case crypto/rand.Reader is used to generate one. +func (pk *PublicKey) EncapsulateTo(ct, ss, seed []byte) { + if seed == nil { + seed = make([]byte, EncapsulationSeedSize) + if _, err := cryptoRand.Read(seed[:]); err != nil { + panic(err) + } + } else { + if len(seed) != EncapsulationSeedSize { + panic(kem.ErrSeedSize) + } + } + + if len(ct) != CiphertextSize { + panic(kem.ErrCiphertextSize) + } + + if len(ss) != SharedKeySize { + panic(ErrSharedKeySize) + } + + var ( + seedm [32]byte + ekx x25519.Key + ctx x25519.Key + ssx x25519.Key + ssm [mlkem768.SharedKeySize]byte + ) + + copy(seedm[:], seed[:32]) + copy(ekx[:], seed[32:]) + + x25519.KeyGen(&ctx, &ekx) + x25519.Shared(&ssx, &ekx, &pk.x) + pk.m.EncapsulateTo(ct[:mlkem768.CiphertextSize], ssm[:], seedm[:]) + + combiner(ss, &ssm, &ssx, &ctx, &pk.x) + copy(ct[mlkem768.CiphertextSize:], ctx[:]) +} + +// DecapsulateTo computes the shared key which is encapsulated in ct +// for the private key. +// +// Panics if ct or ss are not of length CiphertextSize and SharedKeySize +// respectively. +func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { + if len(ct) != CiphertextSize { + panic(kem.ErrCiphertextSize) + } + if len(ss) != SharedKeySize { + panic(ErrSharedKeySize) + } + + ctm := ct[:mlkem768.CiphertextSize] + + var ( + ssm [mlkem768.SharedKeySize]byte + ssx x25519.Key + ctx x25519.Key + ) + + copy(ctx[:], ct[mlkem768.CiphertextSize:]) + + sk.m.DecapsulateTo(ssm[:], ctm) + x25519.Shared(&ssx, &sk.x, &ctx) + combiner(ss, &ssm, &ssx, &ctx, &sk.xpk) +} + +// Unpacks pk from buf. +// +// Panics if buf is not of size PublicKeySize. +// +// Returns ErrPubKey if pk fails the ML-KEM encapsulation key check. +func (pk *PublicKey) Unpack(buf []byte) error { + if len(buf) != PublicKeySize { + panic(kem.ErrPubKeySize) + } + + copy(pk.x[:], buf[mlkem768.PublicKeySize:]) + return pk.m.Unpack(buf[:mlkem768.PublicKeySize]) +} + +// Unpacks sk from buf. +// +// Panics if buf is not of size PrivateKeySize. +func (sk *PrivateKey) Unpack(buf []byte) { + var pk PublicKey + deriveKeyPair(buf, sk, &pk) +} diff --git a/kem/xwing/xwing_test.go b/kem/xwing/xwing_test.go new file mode 100644 index 000000000..760c75a0d --- /dev/null +++ b/kem/xwing/xwing_test.go @@ -0,0 +1,79 @@ +package xwing + +import ( + "bytes" + "fmt" + "io" + "testing" + + "github.com/cloudflare/circl/internal/sha3" +) + +func writeHex(w io.Writer, prefix string, val interface{}) { + indent := " " + width := 74 + hex := fmt.Sprintf("%x", val) + if len(prefix)+len(hex)+5 < width { + fmt.Fprintf(w, "%s %s\n", prefix, hex) + return + } + fmt.Fprintf(w, "%s\n", prefix) + for len(hex) != 0 { + var toPrint string + if len(hex) < width-len(indent) { + toPrint = hex + hex = "" + } else { + toPrint = hex[:width-len(indent)] + hex = hex[width-len(indent):] + } + fmt.Fprintf(w, "%s%s\n", indent, toPrint) + } +} + +func TestVectors(t *testing.T) { + h := sha3.NewShake128() + w := new(bytes.Buffer) + + for i := 0; i < 3; i++ { + var seed [SeedSize]byte + _, _ = h.Read(seed[:]) + writeHex(w, "seed", seed) + + sk, pk := DeriveKeyPairPacked(seed[:]) + writeHex(w, "sk", sk) + writeHex(w, "pk", pk) + + var eseed [EncapsulationSeedSize]byte + _, _ = h.Read(eseed[:]) + writeHex(w, "eseed", eseed) + + ss, ct, err := Encapsulate(pk, eseed[:]) + if err != nil { + t.Fatal(err) + } + writeHex(w, "ct", ct) + writeHex(w, "ss", ss) + + ss2 := Decapsulate(ct, sk) + if !bytes.Equal(ss, ss2) { + t.Fatal() + } + + fmt.Fprintf(w, "\n") + } + + t.Logf("%s", w.String()) + h.Reset() + _, _ = h.Write(w.Bytes()) + var cs [32]byte + _, _ = h.Read(cs[:]) + got := fmt.Sprintf("%x", cs) + + // shake128 of spec/test-vectors.txt from X-Wing spec at + // https://github.com/dconnolly/draft-connolly-cfrg-xwing-kem + want := "1bcd0057d861d6b866239936cadcaeee1ec0164dedc181c386e9e54fe46156fe" + if got != want { + t.Fatalf("%s ≠ %s", got, want) + } +} From 934044546cbe134a0d45e019808ee414607346a1 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 17 Jan 2025 18:46:10 -0800 Subject: [PATCH 38/45] Relax kem constaint from kem.AuthScheme to kem.Scheme. --- hpke/algs.go | 4 +-- hpke/genericnoauthkem.go | 59 +++------------------------------------- hpke/hpke.go | 15 ++++++++-- kem/xwing/scheme.go | 38 ++++++++++++-------------- 4 files changed, 37 insertions(+), 79 deletions(-) diff --git a/hpke/algs.go b/hpke/algs.go index 106ffef26..865fb8c3c 100644 --- a/hpke/algs.go +++ b/hpke/algs.go @@ -62,7 +62,7 @@ func (k KEM) IsValid() bool { // Scheme returns an instance of a KEM that supports authentication. Panics if // the KEM identifier is invalid. -func (k KEM) Scheme() kem.AuthScheme { +func (k KEM) Scheme() kem.Scheme { switch k { case KEM_P256_HKDF_SHA256: return dhkemp256hkdfsha256 @@ -283,6 +283,6 @@ func init() { hybridkemX25519Kyber768.kemA = dhkemx25519hkdfsha256 hybridkemX25519Kyber768.kemB = kyber768.Scheme() - kemXwing.kem = xwing.Scheme() + kemXwing.Scheme = xwing.Scheme() kemXwing.name = "HPKE_KEM_XWING" } diff --git a/hpke/genericnoauthkem.go b/hpke/genericnoauthkem.go index 861176529..88e12352f 100644 --- a/hpke/genericnoauthkem.go +++ b/hpke/genericnoauthkem.go @@ -9,70 +9,19 @@ import ( // genericNoAuthKEM wraps a generic KEM (kem.Scheme) to be used as a HPKE KEM. type genericNoAuthKEM struct { - kem kem.Scheme + kem.Scheme name string } -func (h genericNoAuthKEM) PrivateKeySize() int { return h.kem.PrivateKeySize() } -func (h genericNoAuthKEM) SeedSize() int { return h.kem.SeedSize() } -func (h genericNoAuthKEM) CiphertextSize() int { return h.kem.CiphertextSize() } -func (h genericNoAuthKEM) PublicKeySize() int { return h.kem.PublicKeySize() } -func (h genericNoAuthKEM) EncapsulationSeedSize() int { return h.kem.EncapsulationSeedSize() } -func (h genericNoAuthKEM) SharedKeySize() int { return h.kem.SharedKeySize() } -func (h genericNoAuthKEM) Name() string { return h.name } - -func (h genericNoAuthKEM) AuthDecapsulate(skR kem.PrivateKey, - ct []byte, - pkS kem.PublicKey, -) ([]byte, error) { - panic("AuthDecapsulate is not supported for this KEM") -} - -func (h genericNoAuthKEM) AuthEncapsulate(pkr kem.PublicKey, sks kem.PrivateKey) ( - ct []byte, ss []byte, err error, -) { - panic("AuthEncapsulate is not supported for this KEM") -} - -func (h genericNoAuthKEM) AuthEncapsulateDeterministically(pkr kem.PublicKey, sks kem.PrivateKey, seed []byte) (ct, ss []byte, err error) { - panic("AuthEncapsulateDeterministically is not supported for this KEM") -} - -func (h genericNoAuthKEM) Encapsulate(pkr kem.PublicKey) ( - ct []byte, ss []byte, err error, -) { - return h.kem.Encapsulate(pkr) -} - -func (h genericNoAuthKEM) Decapsulate(skr kem.PrivateKey, ct []byte) ([]byte, error) { - return h.kem.Decapsulate(skr, ct) -} - -func (h genericNoAuthKEM) EncapsulateDeterministically( - pkr kem.PublicKey, seed []byte, -) (ct, ss []byte, err error) { - return h.kem.EncapsulateDeterministically(pkr, seed) -} +func (h genericNoAuthKEM) Name() string { return h.name } // HPKE requires DeriveKeyPair() to take any seed larger than the private key // size, whereas typical KEMs expect a specific seed size. We'll just use // SHAKE256 to hash it to the right size as in X-Wing. func (h genericNoAuthKEM) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { - seed2 := make([]byte, h.kem.SeedSize()) + seed2 := make([]byte, h.Scheme.SeedSize()) hh := sha3.NewShake256() _, _ = hh.Write(seed) _, _ = hh.Read(seed2) - return h.kem.DeriveKeyPair(seed2) -} - -func (h genericNoAuthKEM) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { - return h.kem.GenerateKeyPair() -} - -func (h genericNoAuthKEM) UnmarshalBinaryPrivateKey(data []byte) (kem.PrivateKey, error) { - return h.kem.UnmarshalBinaryPrivateKey(data) -} - -func (h genericNoAuthKEM) UnmarshalBinaryPublicKey(data []byte) (kem.PublicKey, error) { - return h.kem.UnmarshalBinaryPublicKey(data) + return h.Scheme.DeriveKeyPair(seed2) } diff --git a/hpke/hpke.go b/hpke/hpke.go index 4075b285e..ccd50d2cd 100644 --- a/hpke/hpke.go +++ b/hpke/hpke.go @@ -224,7 +224,12 @@ func (s *Sender) allSetup(rnd io.Reader) ([]byte, Sealer, error) { case modeBase, modePSK: enc, ss, err = scheme.EncapsulateDeterministically(s.pkR, seed) case modeAuth, modeAuthPSK: - enc, ss, err = scheme.AuthEncapsulateDeterministically(s.pkR, s.skS, seed) + authScheme, ok := scheme.(kem.AuthScheme) + if !ok { + return nil, nil, ErrInvalidAuthKEM + } + + enc, ss, err = authScheme.AuthEncapsulateDeterministically(s.pkR, s.skS, seed) } if err != nil { return nil, nil, err @@ -246,7 +251,12 @@ func (r *Receiver) allSetup() (Opener, error) { case modeBase, modePSK: ss, err = scheme.Decapsulate(r.skR, r.enc) case modeAuth, modeAuthPSK: - ss, err = scheme.AuthDecapsulate(r.skR, r.enc, r.pkS) + authScheme, ok := scheme.(kem.AuthScheme) + if !ok { + return nil, ErrInvalidAuthKEM + } + + ss, err = authScheme.AuthDecapsulate(r.skR, r.enc, r.pkS) } if err != nil { return nil, err @@ -263,6 +273,7 @@ var ( ErrInvalidHPKESuite = errors.New("hpke: invalid HPKE suite") ErrInvalidKDF = errors.New("hpke: invalid KDF identifier") ErrInvalidKEM = errors.New("hpke: invalid KEM identifier") + ErrInvalidAuthKEM = errors.New("hpke: KEM does not support Auth mode") ErrInvalidAEAD = errors.New("hpke: invalid AEAD identifier") ErrInvalidKEMPublicKey = errors.New("hpke: invalid KEM public key") ErrInvalidKEMPrivateKey = errors.New("hpke: invalid KEM private key") diff --git a/kem/xwing/scheme.go b/kem/xwing/scheme.go index a9a574a57..6c01477b3 100644 --- a/kem/xwing/scheme.go +++ b/kem/xwing/scheme.go @@ -13,23 +13,21 @@ import ( // generic KEM API. // Returns the generic KEM interface for X-Wing PQ/T hybrid KEM. -func Scheme() kem.Scheme { return &xwing } +func Scheme() kem.Scheme { return scheme{} } type scheme struct{} -var xwing scheme - -func (*scheme) Name() string { return "X-Wing" } -func (*scheme) PublicKeySize() int { return PublicKeySize } -func (*scheme) PrivateKeySize() int { return PrivateKeySize } -func (*scheme) SeedSize() int { return SeedSize } -func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } -func (*scheme) SharedKeySize() int { return SharedKeySize } -func (*scheme) CiphertextSize() int { return CiphertextSize } -func (*PrivateKey) Scheme() kem.Scheme { return &xwing } -func (*PublicKey) Scheme() kem.Scheme { return &xwing } - -func (sch *scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { +func (scheme) Name() string { return "X-Wing" } +func (scheme) PublicKeySize() int { return PublicKeySize } +func (scheme) PrivateKeySize() int { return PrivateKeySize } +func (scheme) SeedSize() int { return SeedSize } +func (scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } +func (scheme) SharedKeySize() int { return SharedKeySize } +func (scheme) CiphertextSize() int { return CiphertextSize } +func (*PrivateKey) Scheme() kem.Scheme { return scheme{} } +func (*PublicKey) Scheme() kem.Scheme { return scheme{} } + +func (sch scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { var seed [EncapsulationSeedSize]byte _, err = cryptoRand.Read(seed[:]) if err != nil { @@ -38,7 +36,7 @@ func (sch *scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { return sch.EncapsulateDeterministically(pk, seed[:]) } -func (sch *scheme) EncapsulateDeterministically( +func (scheme) EncapsulateDeterministically( pk kem.PublicKey, seed []byte, ) ([]byte, []byte, error) { if len(seed) != EncapsulationSeedSize { @@ -56,7 +54,7 @@ func (sch *scheme) EncapsulateDeterministically( return ct[:], ss[:], nil } -func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { +func (scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { var pk PublicKey if len(buf) != PublicKeySize { return nil, kem.ErrPubKeySize @@ -68,7 +66,7 @@ func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { return &pk, nil } -func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { +func (scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { var sk PrivateKey if len(buf) != PrivateKeySize { return nil, kem.ErrPrivKeySize @@ -114,17 +112,17 @@ func (pk *PublicKey) MarshalBinary() ([]byte, error) { return ret[:], nil } -func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { +func (scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { sk, pk := DeriveKeyPair(seed) return pk, sk } -func (sch *scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { +func (scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { sk, pk, err := GenerateKeyPair(nil) return pk, sk, err } -func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { +func (scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { if len(ct) != CiphertextSize { return nil, kem.ErrCiphertextSize } From 49878032247b8206e7d8b0b60acc4d367e5e6aaf Mon Sep 17 00:00:00 2001 From: MingLLuo Date: Thu, 23 Jan 2025 06:07:58 +0800 Subject: [PATCH 39/45] ckem: move crypto/elliptic to crypto/ecdh (#529) ckem: change crypto/elliptic to crypto/ecdh changes: * gofumpt with ckem.go * add dash for cScheme Name * fix redundancy in cPrivateKey.Public * ckem: opt code * ckem: Refactor cPk,cSk,cScheme to use value semantics --- kem/hybrid/ckem.go | 136 +++++++++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 60 deletions(-) diff --git a/kem/hybrid/ckem.go b/kem/hybrid/ckem.go index c0620e8db..1cae4b5cd 100644 --- a/kem/hybrid/ckem.go +++ b/kem/hybrid/ckem.go @@ -1,64 +1,79 @@ package hybrid -// TODO move over to crypto/ecdh once we can assume Go 1.20. - import ( - "crypto/elliptic" + "crypto/ecdh" cryptoRand "crypto/rand" - "crypto/subtle" - "math/big" "github.com/cloudflare/circl/kem" "github.com/cloudflare/circl/xof" ) type cPublicKey struct { - scheme *cScheme - x, y *big.Int + scheme cScheme + key *ecdh.PublicKey } type cPrivateKey struct { - scheme *cScheme - key []byte + scheme cScheme + key *ecdh.PrivateKey } type cScheme struct { - curve elliptic.Curve + curve ecdh.Curve } -var p256Kem = &cScheme{elliptic.P256()} - -func (sch *cScheme) scSize() int { - return (sch.curve.Params().N.BitLen() + 7) / 8 -} - -func (sch *cScheme) ptSize() int { - return (sch.curve.Params().BitSize + 7) / 8 -} +var p256Kem = &cScheme{ecdh.P256()} -func (sch *cScheme) Name() string { - return sch.curve.Params().Name +func (sch cScheme) Name() string { + switch sch.curve { + case ecdh.P256(): + return "P-256" + case ecdh.P384(): + return "P-384" + case ecdh.P521(): + return "P-521" + default: + panic("unsupported curve") + } } -func (sch *cScheme) PublicKeySize() int { - return 2*sch.ptSize() + 1 +func (sch cScheme) PublicKeySize() int { + switch sch.curve { + case ecdh.P256(): + return 65 + case ecdh.P384(): + return 97 + case ecdh.P521(): + return 133 + default: + panic("unsupported curve") + } } -func (sch *cScheme) PrivateKeySize() int { - return sch.scSize() +func (sch cScheme) PrivateKeySize() int { + switch sch.curve { + case ecdh.P256(): + return 32 + case ecdh.P384(): + return 48 + case ecdh.P521(): + return 66 + default: + panic("unsupported curve") + } } -func (sch *cScheme) SeedSize() int { +func (sch cScheme) SeedSize() int { return sch.PrivateKeySize() } -func (sch *cScheme) SharedKeySize() int { - return sch.ptSize() +func (sch cScheme) SharedKeySize() int { + return sch.PrivateKeySize() } -func (sch *cScheme) CiphertextSize() int { +func (sch cScheme) CiphertextSize() int { return sch.PublicKeySize() } -func (sch *cScheme) EncapsulationSeedSize() int { +func (sch cScheme) EncapsulationSeedSize() int { return sch.SeedSize() } @@ -66,9 +81,7 @@ func (sk *cPrivateKey) Scheme() kem.Scheme { return sk.scheme } func (pk *cPublicKey) Scheme() kem.Scheme { return pk.scheme } func (sk *cPrivateKey) MarshalBinary() ([]byte, error) { - ret := make([]byte, len(sk.key)) - copy(ret, sk.key) - return ret, nil + return sk.key.Bytes(), nil } func (sk *cPrivateKey) Equal(other kem.PrivateKey) bool { @@ -79,16 +92,12 @@ func (sk *cPrivateKey) Equal(other kem.PrivateKey) bool { if oth.scheme != sk.scheme { return false } - return subtle.ConstantTimeCompare(oth.key, sk.key) == 1 + return oth.key.Equal(sk.key) } func (sk *cPrivateKey) Public() kem.PublicKey { - x, y := sk.scheme.curve.ScalarBaseMult(sk.key) - return &cPublicKey{ - sk.scheme, - x, - y, - } + pk := sk.key.PublicKey() + return &cPublicKey{scheme: sk.scheme, key: pk} } func (pk *cPublicKey) Equal(other kem.PublicKey) bool { @@ -99,14 +108,14 @@ func (pk *cPublicKey) Equal(other kem.PublicKey) bool { if oth.scheme != pk.scheme { return false } - return oth.x.Cmp(pk.x) == 0 && oth.y.Cmp(pk.y) == 0 + return oth.key.Equal(pk.key) } func (pk *cPublicKey) MarshalBinary() ([]byte, error) { - return elliptic.Marshal(pk.scheme.curve, pk.x, pk.y), nil + return pk.key.Bytes(), nil } -func (sch *cScheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { +func (sch cScheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { seed := make([]byte, sch.SeedSize()) _, err := cryptoRand.Read(seed) if err != nil { @@ -116,24 +125,25 @@ func (sch *cScheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { return pk, sk, nil } -func (sch *cScheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { +func (sch cScheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { if len(seed) != sch.SeedSize() { panic(kem.ErrSeedSize) } h := xof.SHAKE256.New() _, _ = h.Write(seed) - key, x, y, err := elliptic.GenerateKey(sch.curve, h) + privKey, err := sch.curve.GenerateKey(h) if err != nil { panic(err) } + pubKey := privKey.PublicKey() - sk := cPrivateKey{scheme: sch, key: key} - pk := cPublicKey{scheme: sch, x: x, y: y} + sk := cPrivateKey{scheme: sch, key: privKey} + pk := cPublicKey{scheme: sch, key: pubKey} return &pk, &sk } -func (sch *cScheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { +func (sch cScheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { seed := make([]byte, sch.EncapsulationSeedSize()) _, err = cryptoRand.Read(seed) if err != nil { @@ -147,13 +157,14 @@ func (pk *cPublicKey) X(sk *cPrivateKey) []byte { panic(kem.ErrTypeMismatch) } - sharedKey := make([]byte, pk.scheme.SharedKeySize()) - xShared, _ := pk.scheme.curve.ScalarMult(pk.x, pk.y, sk.key) - xShared.FillBytes(sharedKey) + sharedKey, err := sk.key.ECDH(pk.key) + if err != nil { + panic(err) + } return sharedKey } -func (sch *cScheme) EncapsulateDeterministically( +func (sch cScheme) EncapsulateDeterministically( pk kem.PublicKey, seed []byte, ) (ct, ss []byte, err error) { if len(seed) != sch.EncapsulationSeedSize() { @@ -170,7 +181,7 @@ func (sch *cScheme) EncapsulateDeterministically( return } -func (sch *cScheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { +func (sch cScheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { if len(ct) != sch.CiphertextSize() { return nil, kem.ErrCiphertextSize } @@ -189,19 +200,24 @@ func (sch *cScheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { return ss, nil } -func (sch *cScheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { +func (sch cScheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { if len(buf) != sch.PublicKeySize() { return nil, kem.ErrPubKeySize } - x, y := elliptic.Unmarshal(sch.curve, buf) - return &cPublicKey{sch, x, y}, nil + key, err := sch.curve.NewPublicKey(buf) + if err != nil { + return nil, err + } + return &cPublicKey{sch, key}, nil } -func (sch *cScheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { +func (sch cScheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { if len(buf) != sch.PrivateKeySize() { return nil, kem.ErrPrivKeySize } - ret := cPrivateKey{sch, make([]byte, sch.PrivateKeySize())} - copy(ret.key, buf) - return &ret, nil + key, err := sch.curve.NewPrivateKey(buf) + if err != nil { + return nil, err + } + return &cPrivateKey{sch, key}, nil } From 342ad81204fc580bd54aec19f09cb55b214b7d39 Mon Sep 17 00:00:00 2001 From: armfazh Date: Tue, 21 Jan 2025 18:00:49 -0800 Subject: [PATCH 40/45] Update HPKE code to use ecdh stdlib package. --- hpke/algs.go | 9 ++- hpke/hpke.go | 1 + hpke/hpke_test.go | 3 + hpke/shortkem.go | 155 ++++++++++++++++++++-------------------------- 4 files changed, 76 insertions(+), 92 deletions(-) diff --git a/hpke/algs.go b/hpke/algs.go index 865fb8c3c..6ae246549 100644 --- a/hpke/algs.go +++ b/hpke/algs.go @@ -4,7 +4,7 @@ import ( "crypto" "crypto/aes" "crypto/cipher" - "crypto/elliptic" + "crypto/ecdh" _ "crypto/sha256" // Linking sha256. _ "crypto/sha512" // Linking sha512. "fmt" @@ -13,7 +13,6 @@ import ( "github.com/cloudflare/circl/dh/x25519" "github.com/cloudflare/circl/dh/x448" - "github.com/cloudflare/circl/ecc/p384" "github.com/cloudflare/circl/kem" "github.com/cloudflare/circl/kem/kyber/kyber768" "github.com/cloudflare/circl/kem/xwing" @@ -247,19 +246,19 @@ var ( ) func init() { - dhkemp256hkdfsha256.Curve = elliptic.P256() + dhkemp256hkdfsha256.Curve = ecdh.P256() dhkemp256hkdfsha256.dhKemBase.id = KEM_P256_HKDF_SHA256 dhkemp256hkdfsha256.dhKemBase.name = "HPKE_KEM_P256_HKDF_SHA256" dhkemp256hkdfsha256.dhKemBase.Hash = crypto.SHA256 dhkemp256hkdfsha256.dhKemBase.dhKEM = dhkemp256hkdfsha256 - dhkemp384hkdfsha384.Curve = p384.P384() + dhkemp384hkdfsha384.Curve = ecdh.P384() dhkemp384hkdfsha384.dhKemBase.id = KEM_P384_HKDF_SHA384 dhkemp384hkdfsha384.dhKemBase.name = "HPKE_KEM_P384_HKDF_SHA384" dhkemp384hkdfsha384.dhKemBase.Hash = crypto.SHA384 dhkemp384hkdfsha384.dhKemBase.dhKEM = dhkemp384hkdfsha384 - dhkemp521hkdfsha512.Curve = elliptic.P521() + dhkemp521hkdfsha512.Curve = ecdh.P521() dhkemp521hkdfsha512.dhKemBase.id = KEM_P521_HKDF_SHA512 dhkemp521hkdfsha512.dhKemBase.name = "HPKE_KEM_P521_HKDF_SHA512" dhkemp521hkdfsha512.dhKemBase.Hash = crypto.SHA512 diff --git a/hpke/hpke.go b/hpke/hpke.go index ccd50d2cd..ac70dc729 100644 --- a/hpke/hpke.go +++ b/hpke/hpke.go @@ -278,5 +278,6 @@ var ( ErrInvalidKEMPublicKey = errors.New("hpke: invalid KEM public key") ErrInvalidKEMPrivateKey = errors.New("hpke: invalid KEM private key") ErrInvalidKEMSharedSecret = errors.New("hpke: invalid KEM shared secret") + ErrInvalidKEMDeriveKey = errors.New("hpke: too many tries to derive KEM key") ErrAEADSeqOverflows = errors.New("hpke: AEAD sequence number overflows") ) diff --git a/hpke/hpke_test.go b/hpke/hpke_test.go index 23d782af0..55f0b0fe9 100644 --- a/hpke/hpke_test.go +++ b/hpke/hpke_test.go @@ -158,6 +158,9 @@ func BenchmarkHpkeRoundTrip(b *testing.B) { kdf hpke.KDF aead hpke.AEAD }{ + {hpke.KEM_P256_HKDF_SHA256, hpke.KDF_HKDF_SHA256, hpke.AEAD_AES128GCM}, + {hpke.KEM_P384_HKDF_SHA384, hpke.KDF_HKDF_SHA384, hpke.AEAD_AES256GCM}, + {hpke.KEM_P521_HKDF_SHA512, hpke.KDF_HKDF_SHA512, hpke.AEAD_AES256GCM}, {hpke.KEM_X25519_HKDF_SHA256, hpke.KDF_HKDF_SHA256, hpke.AEAD_AES128GCM}, {hpke.KEM_X25519_KYBER768_DRAFT00, hpke.KDF_HKDF_SHA256, hpke.AEAD_AES128GCM}, {hpke.KEM_XWING, hpke.KDF_HKDF_SHA256, hpke.AEAD_AES128GCM}, diff --git a/hpke/shortkem.go b/hpke/shortkem.go index e5c55e991..2a0787e0b 100644 --- a/hpke/shortkem.go +++ b/hpke/shortkem.go @@ -1,18 +1,16 @@ package hpke import ( - "crypto/elliptic" + "crypto/ecdh" "crypto/rand" - "crypto/subtle" "fmt" - "math/big" "github.com/cloudflare/circl/kem" ) type shortKEM struct { dhKemBase - elliptic.Curve + ecdh.Curve } func (s shortKEM) PrivateKeySize() int { return s.byteSize() } @@ -21,19 +19,40 @@ func (s shortKEM) CiphertextSize() int { return 1 + 2*s.byteSize() } func (s shortKEM) PublicKeySize() int { return 1 + 2*s.byteSize() } func (s shortKEM) EncapsulationSeedSize() int { return s.byteSize() } -func (s shortKEM) byteSize() int { return (s.Params().BitSize + 7) / 8 } +func (s shortKEM) byteSize() int { + var bits int + switch s.Curve { + case ecdh.P256(): + bits = 256 + case ecdh.P384(): + bits = 384 + case ecdh.P521(): + bits = 521 + default: + panic(ErrInvalidKEM) + } + + return (bits + 7) / 8 +} func (s shortKEM) sizeDH() int { return s.byteSize() } func (s shortKEM) calcDH(dh []byte, sk kem.PrivateKey, pk kem.PublicKey) error { - PK := pk.(*shortKEMPubKey) - SK := sk.(*shortKEMPrivKey) - l := len(dh) - x, _ := s.ScalarMult(PK.x, PK.y, SK.priv) // only x-coordinate is used. - if x.Sign() == 0 { - return ErrInvalidKEMSharedSecret + PK, ok := pk.(*shortKEMPubKey) + if !ok { + return ErrInvalidKEMPublicKey + } + + SK, ok := sk.(*shortKEMPrivKey) + if !ok { + return ErrInvalidKEMPrivateKey + } + + x, err := SK.priv.ECDH(&PK.pub) + if err != nil { + return err } - b := x.Bytes() - copy(dh[l-len(b):l], b) + + copy(dh, x) return nil } @@ -49,122 +68,84 @@ func (s shortKEM) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { } bitmask := byte(0xFF) - if s.Params().BitSize == 521 { + if s.Curve == ecdh.P521() { bitmask = 0x01 } dkpPrk := s.labeledExtract([]byte(""), []byte("dkp_prk"), seed) - var bytes []byte - ctr := 0 - for skBig := new(big.Int); skBig.Sign() == 0 || skBig.Cmp(s.Params().N) >= 0; ctr++ { - if ctr > 255 { - panic("derive key error") - } - bytes = s.labeledExpand( + for ctr := 0; ctr <= 255; ctr++ { + bytes := s.labeledExpand( dkpPrk, []byte("candidate"), []byte{byte(ctr)}, uint16(s.byteSize()), ) bytes[0] &= bitmask - skBig.SetBytes(bytes) + sk, err := s.UnmarshalBinaryPrivateKey(bytes) + if err == nil { + return sk.Public(), sk + } } - l := s.PrivateKeySize() - sk := &shortKEMPrivKey{s, make([]byte, l), nil} - copy(sk.priv[l-len(bytes):], bytes) - return sk.Public(), sk + + panic(ErrInvalidKEMDeriveKey) } func (s shortKEM) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { - sk, x, y, err := elliptic.GenerateKey(s, rand.Reader) - pub := &shortKEMPubKey{s, x, y} - return pub, &shortKEMPrivKey{s, sk, pub}, err + key, err := s.Curve.GenerateKey(rand.Reader) + if err != nil { + return nil, nil, err + } + + sk := &shortKEMPrivKey{s, key} + return sk.Public(), sk, err } func (s shortKEM) UnmarshalBinaryPrivateKey(data []byte) (kem.PrivateKey, error) { - l := s.PrivateKeySize() - if len(data) < l { - return nil, ErrInvalidKEMPrivateKey - } - sk := &shortKEMPrivKey{s, make([]byte, l), nil} - copy(sk.priv[l-len(data):l], data[:l]) - if !sk.validate() { - return nil, ErrInvalidKEMPrivateKey + key, err := s.Curve.NewPrivateKey(data) + if err != nil { + return nil, err } - return sk, nil + return &shortKEMPrivKey{s, key}, nil } func (s shortKEM) UnmarshalBinaryPublicKey(data []byte) (kem.PublicKey, error) { - x, y := elliptic.Unmarshal(s, data) - if x == nil { - return nil, ErrInvalidKEMPublicKey - } - key := &shortKEMPubKey{s, x, y} - if !key.validate() { - return nil, ErrInvalidKEMPublicKey + key, err := s.Curve.NewPublicKey(data) + if err != nil { + return nil, err } - return key, nil + + return &shortKEMPubKey{s, *key}, nil } type shortKEMPubKey struct { scheme shortKEM - x, y *big.Int + pub ecdh.PublicKey } -func (k *shortKEMPubKey) String() string { - return fmt.Sprintf("x: %v\ny: %v", k.x.Text(16), k.y.Text(16)) -} -func (k *shortKEMPubKey) Scheme() kem.Scheme { return k.scheme } -func (k *shortKEMPubKey) MarshalBinary() ([]byte, error) { - return elliptic.Marshal(k.scheme, k.x, k.y), nil -} +func (k *shortKEMPubKey) String() string { return fmt.Sprintf("%x", k.pub.Bytes()) } +func (k *shortKEMPubKey) Scheme() kem.Scheme { return k.scheme } +func (k *shortKEMPubKey) MarshalBinary() ([]byte, error) { return k.pub.Bytes(), nil } func (k *shortKEMPubKey) Equal(pk kem.PublicKey) bool { k1, ok := pk.(*shortKEMPubKey) - return ok && - k.scheme.Params().Name == k1.scheme.Params().Name && - k.x.Cmp(k1.x) == 0 && - k.y.Cmp(k1.y) == 0 -} - -func (k *shortKEMPubKey) validate() bool { - p := k.scheme.Params().P - notAtInfinity := k.x.Sign() > 0 && k.y.Sign() > 0 - lessThanP := k.x.Cmp(p) < 0 && k.y.Cmp(p) < 0 - onCurve := k.scheme.IsOnCurve(k.x, k.y) - return notAtInfinity && lessThanP && onCurve + return ok && k.scheme == k1.scheme && k.pub.Equal(&k1.pub) } type shortKEMPrivKey struct { scheme shortKEM - priv []byte - pub *shortKEMPubKey + priv *ecdh.PrivateKey } -func (k *shortKEMPrivKey) String() string { return fmt.Sprintf("%x", k.priv) } -func (k *shortKEMPrivKey) Scheme() kem.Scheme { return k.scheme } -func (k *shortKEMPrivKey) MarshalBinary() ([]byte, error) { - return append(make([]byte, 0, k.scheme.PrivateKeySize()), k.priv...), nil -} +func (k *shortKEMPrivKey) String() string { return fmt.Sprintf("%x", k.priv.Bytes()) } +func (k *shortKEMPrivKey) Scheme() kem.Scheme { return k.scheme } +func (k *shortKEMPrivKey) MarshalBinary() ([]byte, error) { return k.priv.Bytes(), nil } func (k *shortKEMPrivKey) Equal(pk kem.PrivateKey) bool { k1, ok := pk.(*shortKEMPrivKey) - return ok && - k.scheme.Params().Name == k1.scheme.Params().Name && - subtle.ConstantTimeCompare(k.priv, k1.priv) == 1 + return ok && k.scheme == k1.scheme && k.priv.Equal(k1.priv) } func (k *shortKEMPrivKey) Public() kem.PublicKey { - if k.pub == nil { - x, y := k.scheme.ScalarBaseMult(k.priv) - k.pub = &shortKEMPubKey{k.scheme, x, y} - } - return k.pub -} - -func (k *shortKEMPrivKey) validate() bool { - n := new(big.Int).SetBytes(k.priv) - order := k.scheme.Curve.Params().N - return len(k.priv) == k.scheme.PrivateKeySize() && n.Cmp(order) < 0 + return &shortKEMPubKey{k.scheme, *k.priv.PublicKey()} } From 0a61b66c046bde9375e74f5510c4dbd268e50436 Mon Sep 17 00:00:00 2001 From: armfazh Date: Wed, 22 Jan 2025 14:17:36 -0800 Subject: [PATCH 41/45] Removing deprecated use of elliptic in P384. --- ecc/p384/point_test.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/ecc/p384/point_test.go b/ecc/p384/point_test.go index 219522d6d..d3c133ca0 100644 --- a/ecc/p384/point_test.go +++ b/ecc/p384/point_test.go @@ -4,18 +4,30 @@ package p384 import ( + "crypto/ecdh" "crypto/elliptic" "crypto/rand" "encoding/binary" + "slices" "testing" "github.com/cloudflare/circl/internal/test" ) func randomAffine() *affinePoint { - params := elliptic.P384().Params() - k, _ := rand.Int(rand.Reader, params.N) - return newAffinePoint(params.ScalarBaseMult(k.Bytes())) + sk, err := ecdh.P384().GenerateKey(rand.Reader) + if err != nil { + panic(err) + } + + b := sk.PublicKey().Bytes() + x, y := b[1:1+sizeFp], b[1+sizeFp:1+2*sizeFp] + slices.Reverse(x) + slices.Reverse(y) + p := new(affinePoint) + montEncode(&p.x, (*fp384)(x)) + montEncode(&p.y, (*fp384)(y)) + return p } func randomJacobian() *jacobianPoint { From 830152f3dcf79e54548c6530c9f291be360149ef Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 27 Jan 2025 00:54:09 -0800 Subject: [PATCH 42/45] Passing NTT size. --- vdaf/prio3/arith/arith.go | 4 ++-- vdaf/prio3/arith/fp128/poly.go | 4 ++-- vdaf/prio3/arith/fp128/vector.go | 8 ++++---- vdaf/prio3/arith/fp64/poly.go | 4 ++-- vdaf/prio3/arith/fp64/vector.go | 8 ++++---- vdaf/prio3/arith/poly_test.go | 6 +++--- vdaf/prio3/arith/templates/poly.go.tmpl | 4 ++-- vdaf/prio3/arith/templates/vector.go.tmpl | 8 ++++---- vdaf/prio3/internal/flp/flp.go | 4 ++-- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/vdaf/prio3/arith/arith.go b/vdaf/prio3/arith/arith.go index 2fc84781d..84dff35fd 100644 --- a/vdaf/prio3/arith/arith.go +++ b/vdaf/prio3/arith/arith.go @@ -89,9 +89,9 @@ type Vec[Vec ~[]E, E Elt] interface { // DotProduct calculates z[i] = z[i] * x[i]. DotProduct(x Vec) E // NTT calculates the number theoretic transform of the vector. - NTT(Vec) + NTT(Vec, uint) // InvNTT calculates the inverse number theoretic transform on values. - InvNTT(Vec) + InvNTT(Vec, uint) // SplitBits sets the vector of elements corresponding to the bits of n. // The receiving vector sets v[i] = SetUint64(n(i)), where n(i) is the i-th // bit of n, and len(v) >= log2(n). diff --git a/vdaf/prio3/arith/fp128/poly.go b/vdaf/prio3/arith/fp128/poly.go index f9a3ac570..66d42f373 100644 --- a/vdaf/prio3/arith/fp128/poly.go +++ b/vdaf/prio3/arith/fp128/poly.go @@ -60,8 +60,8 @@ func (p Poly) Strip() Poly { } func (p Poly) Interpolate(values []Fp) { - _, logN := math.NextPow2(uint(len(values))) - Vec(p).InvNTT(values) + N, logN := math.NextPow2(uint(len(values))) + Vec(p).InvNTT(values, N) var invN Fp invN.InvTwoN(logN) Vec(p).ScalarMul(&invN) diff --git a/vdaf/prio3/arith/fp128/vector.go b/vdaf/prio3/arith/fp128/vector.go index 648e3fd79..526272b25 100644 --- a/vdaf/prio3/arith/fp128/vector.go +++ b/vdaf/prio3/arith/fp128/vector.go @@ -51,11 +51,11 @@ func bitRev(x uint, numBits uint) uint { return bits.Reverse(x) >> (bits.UintSize - numBits) } -func (v Vec) NTT(values Vec) { v.doNTT(values, false) } -func (v Vec) InvNTT(values Vec) { v.doNTT(values, true) } -func (v Vec) doNTT(values Vec, isInvNTT bool) { +func (v Vec) NTT(values Vec, n uint) { v.doNTT(values, n, false) } +func (v Vec) InvNTT(values Vec, n uint) { v.doNTT(values, n, true) } +func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { valuesLen := uint(len(values)) - _, logN := math.NextPow2(valuesLen) + _, logN := math.NextPow2(n) for i := range v { j := bitRev(uint(i), logN) diff --git a/vdaf/prio3/arith/fp64/poly.go b/vdaf/prio3/arith/fp64/poly.go index ab9d3ec9b..9aef28041 100644 --- a/vdaf/prio3/arith/fp64/poly.go +++ b/vdaf/prio3/arith/fp64/poly.go @@ -60,8 +60,8 @@ func (p Poly) Strip() Poly { } func (p Poly) Interpolate(values []Fp) { - _, logN := math.NextPow2(uint(len(values))) - Vec(p).InvNTT(values) + N, logN := math.NextPow2(uint(len(values))) + Vec(p).InvNTT(values, N) var invN Fp invN.InvTwoN(logN) Vec(p).ScalarMul(&invN) diff --git a/vdaf/prio3/arith/fp64/vector.go b/vdaf/prio3/arith/fp64/vector.go index 3ec7ef683..84a2920d4 100644 --- a/vdaf/prio3/arith/fp64/vector.go +++ b/vdaf/prio3/arith/fp64/vector.go @@ -51,11 +51,11 @@ func bitRev(x uint, numBits uint) uint { return bits.Reverse(x) >> (bits.UintSize - numBits) } -func (v Vec) NTT(values Vec) { v.doNTT(values, false) } -func (v Vec) InvNTT(values Vec) { v.doNTT(values, true) } -func (v Vec) doNTT(values Vec, isInvNTT bool) { +func (v Vec) NTT(values Vec, n uint) { v.doNTT(values, n, false) } +func (v Vec) InvNTT(values Vec, n uint) { v.doNTT(values, n, true) } +func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { valuesLen := uint(len(values)) - _, logN := math.NextPow2(valuesLen) + _, logN := math.NextPow2(n) for i := range v { j := bitRev(uint(i), logN) diff --git a/vdaf/prio3/arith/poly_test.go b/vdaf/prio3/arith/poly_test.go index 5d7b90160..682b133a2 100644 --- a/vdaf/prio3/arith/poly_test.go +++ b/vdaf/prio3/arith/poly_test.go @@ -74,7 +74,7 @@ func interpolate[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { values := evalRootsUnity[P, V, E, F](p) y := NewVec[V](N) - y.NTT(V(p)) + y.NTT(V(p), N) if !slices.Equal(y, values) { test.ReportError(t, y, values) } @@ -137,12 +137,12 @@ func benchmarkPoly[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](b *testing.B) { }) b.Run("NTT", func(b *testing.B) { for i := 0; i < b.N; i++ { - V(p).NTT(values) + V(p).NTT(values, N) } }) b.Run("InvNTT", func(b *testing.B) { for i := 0; i < b.N; i++ { - V(p).InvNTT(values) + V(p).InvNTT(values, N) } }) b.Run("Interpolate", func(b *testing.B) { diff --git a/vdaf/prio3/arith/templates/poly.go.tmpl b/vdaf/prio3/arith/templates/poly.go.tmpl index 6e145be29..9e66ff5bf 100644 --- a/vdaf/prio3/arith/templates/poly.go.tmpl +++ b/vdaf/prio3/arith/templates/poly.go.tmpl @@ -64,8 +64,8 @@ func (p Poly) Strip() Poly { } func (p Poly) Interpolate(values []Fp) { - _, logN := math.NextPow2(uint(len(values))) - Vec(p).InvNTT(values) + N, logN := math.NextPow2(uint(len(values))) + Vec(p).InvNTT(values, N) var invN Fp invN.InvTwoN(logN) Vec(p).ScalarMul(&invN) diff --git a/vdaf/prio3/arith/templates/vector.go.tmpl b/vdaf/prio3/arith/templates/vector.go.tmpl index ce0c410a2..2aaa7034d 100644 --- a/vdaf/prio3/arith/templates/vector.go.tmpl +++ b/vdaf/prio3/arith/templates/vector.go.tmpl @@ -55,11 +55,11 @@ func bitRev(x uint, numBits uint) uint { return bits.Reverse(x) >> (bits.UintSize - numBits) } -func (v Vec) NTT(values Vec) { v.doNTT(values, false) } -func (v Vec) InvNTT(values Vec) { v.doNTT(values, true) } -func (v Vec) doNTT(values Vec, isInvNTT bool) { +func (v Vec) NTT(values Vec, n uint) { v.doNTT(values, n, false) } +func (v Vec) InvNTT(values Vec, n uint) { v.doNTT(values, n, true) } +func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { valuesLen := uint(len(values)) - _, logN := math.NextPow2(valuesLen) + _, logN := math.NextPow2(n) for i := range v { j := bitRev(uint(i), logN) diff --git a/vdaf/prio3/internal/flp/flp.go b/vdaf/prio3/internal/flp/flp.go index 335671a15..70b6c247f 100644 --- a/vdaf/prio3/internal/flp/flp.go +++ b/vdaf/prio3/internal/flp/flp.go @@ -50,7 +50,7 @@ func (f *FLP[G, P, V, E, F]) Prove(meas, proveRand, jointRand V) V { for i := range wirePoly { wire := wiresCur.Next(g.p) wirePolyI := wirePolyNCur.Next(g.p) - wirePolyI.InvNTT(wire) + wirePolyI.InvNTT(wire, g.p) // Extracts the constant factor (1/N) to be multiplied after // polynomial interpolation. wirePolyI.ScalarMul(invN) @@ -110,7 +110,7 @@ func (f *FLP[G, P, V, E, F]) Query( wirePoly := arith.NewPoly[P](g.p - 1) wirei := cursor.New(g.wires) for i := range wireChecks { - V(wirePoly).InvNTT(wirei.Next(g.p)) + V(wirePoly).InvNTT(wirei.Next(g.p), g.p) wireChecks[i] = wirePoly.Evaluate(t) // Extracts the constant factor (1/N) to be multiplied after // polynomial interpolation and evaluation. From 4e35591bc105bc827183a7a2841d851c71b36cfd Mon Sep 17 00:00:00 2001 From: armfazh Date: Mon, 27 Jan 2025 02:29:15 -0800 Subject: [PATCH 43/45] Adding polynomial multiplication based on NTT. --- vdaf/prio3/arith/arith.go | 4 -- vdaf/prio3/arith/fp128/poly.go | 35 +++++++++++---- vdaf/prio3/arith/fp128/vector.go | 21 ++++----- vdaf/prio3/arith/fp64/poly.go | 35 +++++++++++---- vdaf/prio3/arith/fp64/vector.go | 21 ++++----- vdaf/prio3/arith/poly_test.go | 52 ++++++++++++++++++----- vdaf/prio3/arith/templates/poly.go.tmpl | 34 ++++++++++++--- vdaf/prio3/arith/templates/vector.go.tmpl | 21 ++++----- vdaf/prio3/internal/flp/flp.go | 2 - 9 files changed, 150 insertions(+), 75 deletions(-) diff --git a/vdaf/prio3/arith/arith.go b/vdaf/prio3/arith/arith.go index 84dff35fd..eb66f7130 100644 --- a/vdaf/prio3/arith/arith.go +++ b/vdaf/prio3/arith/arith.go @@ -133,8 +133,4 @@ type Poly[Poly ~[]E, E Elt] interface { Evaluate(x *E) E // Strip removes the higher-degree zero terms. Strip() Poly - // Interpolate a polynomial passing through the points (x[i], y[i]), where - // x are the powers of an N-th root of unity, y are the values, and - // N = len(y) must be a power of two. - Interpolate(y []E) } diff --git a/vdaf/prio3/arith/fp128/poly.go b/vdaf/prio3/arith/fp128/poly.go index 66d42f373..67b304f5f 100644 --- a/vdaf/prio3/arith/fp128/poly.go +++ b/vdaf/prio3/arith/fp128/poly.go @@ -9,6 +9,15 @@ type Poly []Fp func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } func (p Poly) Mul(x, y Poly) { + const thresholdPolyMul = 128 + if len(x)+len(y)-1 < thresholdPolyMul { + p.MulNSquare(x, y) + } else { + p.MulNlogN(x, y) + } +} + +func (p Poly) MulNSquare(x, y Poly) { mustSumLen(p, x, y) clear(p) var xiyj Fp @@ -20,6 +29,24 @@ func (p Poly) Mul(x, y Poly) { } } +func (p Poly) MulNlogN(x, y Poly) { + mustSumLen(p, x, y) + N, logN := math.NextPow2(uint(len(x) + len(y) - 1)) + buf := make(Vec, 2*N) + lx, ly := buf[:N], buf[N:] + lx.NTT(Vec(x), N) + ly.NTT(Vec(y), N) + for i := range lx { + lx[i].MulAssign(&ly[i]) + } + + ly.InvNTT(lx, N) + var invN Fp + invN.InvTwoN(logN) + copy(p, ly) + Vec(p).ScalarMul(&invN) +} + func (p Poly) Sqr(x Poly) { mustSumLen(p, x, x) clear(p) @@ -58,11 +85,3 @@ func (p Poly) Strip() Poly { return p[:0] } - -func (p Poly) Interpolate(values []Fp) { - N, logN := math.NextPow2(uint(len(values))) - Vec(p).InvNTT(values, N) - var invN Fp - invN.InvTwoN(logN) - Vec(p).ScalarMul(&invN) -} diff --git a/vdaf/prio3/arith/fp128/vector.go b/vdaf/prio3/arith/fp128/vector.go index 526272b25..b69898e22 100644 --- a/vdaf/prio3/arith/fp128/vector.go +++ b/vdaf/prio3/arith/fp128/vector.go @@ -6,6 +6,7 @@ import ( "encoding/binary" "io" "math/bits" + "slices" "github.com/cloudflare/circl/internal/conv" "github.com/cloudflare/circl/internal/sha3" @@ -51,9 +52,12 @@ func bitRev(x uint, numBits uint) uint { return bits.Reverse(x) >> (bits.UintSize - numBits) } -func (v Vec) NTT(values Vec, n uint) { v.doNTT(values, n, false) } -func (v Vec) InvNTT(values Vec, n uint) { v.doNTT(values, n, true) } -func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { +func (v Vec) InvNTT(values Vec, n uint) { + v.NTT(values, n) + slices.Reverse(v[1:]) +} + +func (v Vec) NTT(values Vec, n uint) { valuesLen := uint(len(values)) _, logN := math.NextPow2(n) @@ -64,13 +68,7 @@ func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { } } - var t, w, wn, iwn Fp - r := &wn - if isInvNTT { - r = &iwn - iwn.SetOne() - } - + var t, w, wn Fp for l := uint(1); l <= logN; l++ { y := uint(1) << (l - 1) chunk := uint(1) << (logN - l) @@ -84,9 +82,8 @@ func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { w.SetOne() wn.SetRootOfUnityTwoN(l) - iwn.MulAssign(&wn) for i := uint(1); i < y; i++ { - w.MulAssign(r) + w.MulAssign(&wn) for j := range chunk { x := (j << l) + i u := v[x] diff --git a/vdaf/prio3/arith/fp64/poly.go b/vdaf/prio3/arith/fp64/poly.go index 9aef28041..c61b67197 100644 --- a/vdaf/prio3/arith/fp64/poly.go +++ b/vdaf/prio3/arith/fp64/poly.go @@ -9,6 +9,15 @@ type Poly []Fp func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } func (p Poly) Mul(x, y Poly) { + const thresholdPolyMul = 128 + if len(x)+len(y)-1 < thresholdPolyMul { + p.MulNSquare(x, y) + } else { + p.MulNlogN(x, y) + } +} + +func (p Poly) MulNSquare(x, y Poly) { mustSumLen(p, x, y) clear(p) var xiyj Fp @@ -20,6 +29,24 @@ func (p Poly) Mul(x, y Poly) { } } +func (p Poly) MulNlogN(x, y Poly) { + mustSumLen(p, x, y) + N, logN := math.NextPow2(uint(len(x) + len(y) - 1)) + buf := make(Vec, 2*N) + lx, ly := buf[:N], buf[N:] + lx.NTT(Vec(x), N) + ly.NTT(Vec(y), N) + for i := range lx { + lx[i].MulAssign(&ly[i]) + } + + ly.InvNTT(lx, N) + var invN Fp + invN.InvTwoN(logN) + copy(p, ly) + Vec(p).ScalarMul(&invN) +} + func (p Poly) Sqr(x Poly) { mustSumLen(p, x, x) clear(p) @@ -58,11 +85,3 @@ func (p Poly) Strip() Poly { return p[:0] } - -func (p Poly) Interpolate(values []Fp) { - N, logN := math.NextPow2(uint(len(values))) - Vec(p).InvNTT(values, N) - var invN Fp - invN.InvTwoN(logN) - Vec(p).ScalarMul(&invN) -} diff --git a/vdaf/prio3/arith/fp64/vector.go b/vdaf/prio3/arith/fp64/vector.go index 84a2920d4..608a8f4ec 100644 --- a/vdaf/prio3/arith/fp64/vector.go +++ b/vdaf/prio3/arith/fp64/vector.go @@ -6,6 +6,7 @@ import ( "encoding/binary" "io" "math/bits" + "slices" "github.com/cloudflare/circl/internal/conv" "github.com/cloudflare/circl/internal/sha3" @@ -51,9 +52,12 @@ func bitRev(x uint, numBits uint) uint { return bits.Reverse(x) >> (bits.UintSize - numBits) } -func (v Vec) NTT(values Vec, n uint) { v.doNTT(values, n, false) } -func (v Vec) InvNTT(values Vec, n uint) { v.doNTT(values, n, true) } -func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { +func (v Vec) InvNTT(values Vec, n uint) { + v.NTT(values, n) + slices.Reverse(v[1:]) +} + +func (v Vec) NTT(values Vec, n uint) { valuesLen := uint(len(values)) _, logN := math.NextPow2(n) @@ -64,13 +68,7 @@ func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { } } - var t, w, wn, iwn Fp - r := &wn - if isInvNTT { - r = &iwn - iwn.SetOne() - } - + var t, w, wn Fp for l := uint(1); l <= logN; l++ { y := uint(1) << (l - 1) chunk := uint(1) << (logN - l) @@ -84,9 +82,8 @@ func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { w.SetOne() wn.SetRootOfUnityTwoN(l) - iwn.MulAssign(&wn) for i := uint(1); i < y; i++ { - w.MulAssign(r) + w.MulAssign(&wn) for j := range chunk { x := (j << l) + i u := v[x] diff --git a/vdaf/prio3/arith/poly_test.go b/vdaf/prio3/arith/poly_test.go index 682b133a2..801bcab7d 100644 --- a/vdaf/prio3/arith/poly_test.go +++ b/vdaf/prio3/arith/poly_test.go @@ -14,6 +14,7 @@ func testPoly[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { t.Run("interpolate", interpolate[P, V, E, F]) t.Run("strip", strip[P, E, F]) t.Run("mulSqr", mulSqrPoly[P, V, E, F]) + t.Run("mulNTT", mulNTT[P, V, E, F]) } func mulSqrPoly[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { @@ -48,10 +49,10 @@ func mulSqrPoly[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { } } -func evalRootsUnity[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](p P) V { +func evalRootsUnity[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](p P, n uint) V { // evaluate p on the powers of the root of unity. // p(w^0), p(w^1), p(w^2), ... - N, logN := math.NextPow2(uint(len(p))) + N, logN := math.NextPow2(n) var wi, wn F = new(E), new(E) wi.SetOne() wn.SetRootOfUnityTwoN(logN) @@ -71,7 +72,7 @@ func interpolate[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { N := uint(1) << logN p := NewPoly[P](N - 1) mustRead(t, V(p)) - values := evalRootsUnity[P, V, E, F](p) + values := evalRootsUnity[P, V, E, F](p, N) y := NewVec[V](N) y.NTT(V(p), N) @@ -79,8 +80,12 @@ func interpolate[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { test.ReportError(t, y, values) } + var invN F = new(E) + invN.InvTwoN(uint(logN)) + p2 := NewPoly[P](N - 1) - p2.Interpolate(values) + V(p2).InvNTT(values, N) + V(p2).ScalarMul(invN) if !slices.Equal(p, p2) { test.ReportError(t, p, p2) } @@ -101,6 +106,38 @@ func strip[P Poly[P, E], E Elt, F Fp[E]](t *testing.T) { } } +type polyTest[P any] interface { + MulNlogN(x, y P) + MulNSquare(x, y P) +} + +func mulNTT[P Poly[P, E], V Vec[V, E], E EltTest, F Fp[E]](t *testing.T) { + const DegX uint = 16 + const DegY uint = 16 + + for degX := range DegX { + for degY := range DegY { + degZ := degX + degY + x := NewPoly[P](degX) + y := NewPoly[P](degY) + got := NewPoly[P](degZ) + want := NewPoly[P](degZ) + + mustRead(t, V(x)) + mustRead(t, V(y)) + + any(got).(polyTest[P]).MulNlogN(x, y) + any(want).(polyTest[P]).MulNSquare(x, y) + + if !slices.EqualFunc(got, want, + func(x, y E) bool { return F(&x).IsEqual(&y) }, + ) { + test.ReportError(t, got, want, degX, degY) + } + } + } +} + func benchmarkPoly[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](b *testing.B) { x := F(new(E)) p := NewPoly[P](Degree) @@ -113,7 +150,7 @@ func benchmarkPoly[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](b *testing.B) { N, _ := math.NextPow2(Degree) pol := NewPoly[P](N - 1) mustRead(b, V(pol)) - values := evalRootsUnity[P, V, E, F](pol) + values := evalRootsUnity[P, V, E, F](pol, N) b.Run("AddAssign", func(b *testing.B) { for i := 0; i < b.N; i++ { @@ -145,9 +182,4 @@ func benchmarkPoly[P Poly[P, E], V Vec[V, E], E Elt, F Fp[E]](b *testing.B) { V(p).InvNTT(values, N) } }) - b.Run("Interpolate", func(b *testing.B) { - for i := 0; i < b.N; i++ { - pol.Interpolate(values) - } - }) } diff --git a/vdaf/prio3/arith/templates/poly.go.tmpl b/vdaf/prio3/arith/templates/poly.go.tmpl index 9e66ff5bf..8ad8a2966 100644 --- a/vdaf/prio3/arith/templates/poly.go.tmpl +++ b/vdaf/prio3/arith/templates/poly.go.tmpl @@ -13,6 +13,15 @@ type Poly []Fp func (p Poly) AddAssign(x Poly) { Vec(p).AddAssign(Vec(x)) } func (p Poly) SubAssign(x Poly) { Vec(p).SubAssign(Vec(x)) } func (p Poly) Mul(x, y Poly) { + const thresholdPolyMul = 128 + if len(x) + len(y) - 1 < thresholdPolyMul { + p.MulNSquare(x, y) + } else{ + p.MulNlogN(x, y) + } +} + +func (p Poly) MulNSquare(x, y Poly) { mustSumLen(p, x, y) clear(p) var xiyj Fp @@ -24,6 +33,24 @@ func (p Poly) Mul(x, y Poly) { } } +func (p Poly) MulNlogN(x, y Poly) { + mustSumLen(p, x, y) + N, logN := math.NextPow2(uint(len(x) + len(y) - 1)) + buf := make(Vec, 2*N) + lx, ly := buf[:N], buf[N:] + lx.NTT(Vec(x), N) + ly.NTT(Vec(y), N) + for i := range lx { + lx[i].MulAssign(&ly[i]) + } + + ly.InvNTT(lx, N) + var invN Fp + invN.InvTwoN(logN) + copy(p, ly) + Vec(p).ScalarMul(&invN) +} + func (p Poly) Sqr(x Poly) { mustSumLen(p, x, x) clear(p) @@ -63,10 +90,3 @@ func (p Poly) Strip() Poly { return p[:0] } -func (p Poly) Interpolate(values []Fp) { - N, logN := math.NextPow2(uint(len(values))) - Vec(p).InvNTT(values, N) - var invN Fp - invN.InvTwoN(logN) - Vec(p).ScalarMul(&invN) -} diff --git a/vdaf/prio3/arith/templates/vector.go.tmpl b/vdaf/prio3/arith/templates/vector.go.tmpl index 2aaa7034d..e7f78e742 100644 --- a/vdaf/prio3/arith/templates/vector.go.tmpl +++ b/vdaf/prio3/arith/templates/vector.go.tmpl @@ -10,6 +10,7 @@ import ( "io" "encoding/binary" "math/bits" + "slices" "github.com/cloudflare/circl/internal/conv" "github.com/cloudflare/circl/internal/sha3" @@ -55,9 +56,12 @@ func bitRev(x uint, numBits uint) uint { return bits.Reverse(x) >> (bits.UintSize - numBits) } -func (v Vec) NTT(values Vec, n uint) { v.doNTT(values, n, false) } -func (v Vec) InvNTT(values Vec, n uint) { v.doNTT(values, n, true) } -func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { +func (v Vec) InvNTT(values Vec, n uint) { + v.NTT(values, n) + slices.Reverse(v[1:]) +} + +func (v Vec) NTT(values Vec, n uint) { valuesLen := uint(len(values)) _, logN := math.NextPow2(n) @@ -68,13 +72,7 @@ func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { } } - var t, w, wn, iwn Fp - r := &wn - if isInvNTT { - r = &iwn - iwn.SetOne() - } - + var t, w, wn Fp for l := uint(1); l <= logN; l++ { y := uint(1) << (l - 1) chunk := uint(1) << (logN - l) @@ -88,9 +86,8 @@ func (v Vec) doNTT(values Vec, n uint, isInvNTT bool) { w.SetOne() wn.SetRootOfUnityTwoN(l) - iwn.MulAssign(&wn) for i := uint(1); i < y; i++ { - w.MulAssign(r) + w.MulAssign(&wn) for j := range chunk { x := (j << l) + i u := v[x] diff --git a/vdaf/prio3/internal/flp/flp.go b/vdaf/prio3/internal/flp/flp.go index 70b6c247f..58c11eaa1 100644 --- a/vdaf/prio3/internal/flp/flp.go +++ b/vdaf/prio3/internal/flp/flp.go @@ -51,8 +51,6 @@ func (f *FLP[G, P, V, E, F]) Prove(meas, proveRand, jointRand V) V { wire := wiresCur.Next(g.p) wirePolyI := wirePolyNCur.Next(g.p) wirePolyI.InvNTT(wire, g.p) - // Extracts the constant factor (1/N) to be multiplied after - // polynomial interpolation. wirePolyI.ScalarMul(invN) wirePoly[i] = P(wirePolyI) proofCur.Next(1)[0] = wire[0] From 6e910fdf334c16920d0ddbd9160834954587a8d2 Mon Sep 17 00:00:00 2001 From: armfazh Date: Fri, 17 Jan 2025 15:03:33 -0800 Subject: [PATCH 44/45] Add Prio3 in readme. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9469de22b..0b771bad3 100644 --- a/README.md +++ b/README.md @@ -71,10 +71,11 @@ Alternatively, look at the [Cloudflare Go](https://github.com/cloudflare/go/tree - [HPKE](./hpke): Hybrid Public-Key Encryption ([RFC-9180]) - [VOPRF](./oprf): Verifiable Oblivious Pseudorandom functions. ([RFC-9497]) - [RSA Blind Signatures](./blindsign/blindrsa). ([RFC-9474]) - - [Partilly-blind](./blindsign/blindrsa/partiallyblindrsa/) Signatures. ([draft-cfrg-partially-blind-rsa](https://datatracker.ietf.org/doc/draft-amjad-cfrg-partially-blind-rsa/)) + - [Partially-blind](./blindsign/blindrsa/partiallyblindrsa/) RSA Signatures. ([draft-cfrg-partially-blind-rsa](https://datatracker.ietf.org/doc/draft-amjad-cfrg-partially-blind-rsa/)) - [CPABE](./abe/cpabe): Ciphertext-Policy Attribute-Based Encryption. ([ia.cr/2019/966]) - [OT](./ot/simot): Simplest Oblivious Transfer ([ia.cr/2015/267]). - [Threshold RSA](./tss/rsa) Signatures ([Shoup Eurocrypt 2000](https://www.iacr.org/archive/eurocrypt2000/1807/18070209-new.pdf)). + - [Prio3](./vdaf/prio3) Verifiable Distributed Aggregation Function ([draft-irtf-cfrg-vdaf](https://datatracker.ietf.org/doc/draft-irtf-cfrg-vdaf/)). ### Post-Quantum Cryptography From 89e658c2ea39d3cfea7b7c7c8b34ebdbd6d21942 Mon Sep 17 00:00:00 2001 From: armfazh Date: Tue, 21 Jan 2025 16:02:03 -0800 Subject: [PATCH 45/45] Add X-Wing to the readme and bump version. --- CITATION.cff | 4 ++-- README.md | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 806c6ca1c..af4cb9585 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,6 +1,6 @@ --- cff-version: 1.2.0 -version: 1.5.0 +version: 1.6.0 title: "Introducing CIRCL: An Advanced Cryptographic Library" license: BSD-3-Clause abstract: > @@ -25,6 +25,6 @@ keywords: - golang repository-code: "https://github.com/cloudflare/circl/" type: software -message: "Available at https://github.com/cloudflare/circl. v1.5.0 Accessed Oct, 2024." +message: "Available at https://github.com/cloudflare/circl. v1.6.0 Accessed Jan, 2025." contact: - name: "Cloudflare, Inc." diff --git a/README.md b/README.md index 0b771bad3..b2020190c 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Alternatively, look at the [Cloudflare Go](https://github.com/cloudflare/go/tree |:---:| - [ML-KEM](./kem/mlkem): modes 512, 768, 1024 ([FIPS-203](https://doi.org/10.6028/NIST.FIPS.203)). + - [X-Wing](./kem/xwing) ([draft-connolly-cfrg-xwing-kem](https://datatracker.ietf.org/doc/draft-connolly-cfrg-xwing-kem/)). - [Kyber KEM](./kem/kyber): modes 512, 768, 1024 ([KYBER](https://pq-crystals.org/kyber/)). - [FrodoKEM](./kem/frodo): modes 640-SHAKE. ([FrodoKEM](https://frodokem.org/)) - [CSIDH](./dh/csidh): Post-Quantum Commutative Group Action ([CSIDH](https://csidh.isogeny.org/)). @@ -163,10 +164,10 @@ APA Style ``` Faz-Hernandez, A. and Kwiatkowski, K. (2019). Introducing CIRCL: An Advanced Cryptographic Library. Cloudflare. Available at -https://github.com/cloudflare/circl. v1.5.0 Accessed Oct, 2024. +https://github.com/cloudflare/circl. v1.6.0 Accessed Jan, 2025. ``` -Bibtex Source +BibTeX Source ```bibtex @manual{circl, @@ -178,7 +179,7 @@ Bibtex Source of this library is to be used as a tool for experimental deployment of cryptographic algorithms targeting Post-Quantum (PQ) and Elliptic Curve Cryptography (ECC).}}, - note = {Available at \url{https://github.com/cloudflare/circl}. v1.5.0 Accessed Oct, 2024}, + note = {Available at \url{https://github.com/cloudflare/circl}. v1.6.0 Accessed Jan, 2025}, month = jun, year = {2019} }