From 62302ce6db75aa0737477ce579e4b9e720a64878 Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Thu, 15 Feb 2024 13:51:05 +0100 Subject: [PATCH 01/11] [WIP] Add ML-DSA (FIPS204) The final version of FIPS204 has not been released, thus this implementation is not yet final. --- sign/dilithium/example_test.go | 2 +- sign/dilithium/gen.go | 92 +++- sign/dilithium/kat_test.go | 25 +- sign/dilithium/mldsa44.go | 91 ++++ sign/dilithium/mldsa65.go | 91 ++++ sign/dilithium/mldsa87.go | 91 ++++ sign/dilithium/mode2.go | 2 +- sign/dilithium/mode2/dilithium.go | 6 +- sign/dilithium/mode2/internal/dilithium.go | 41 +- .../mode2/internal/dilithium_test.go | 2 +- 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 | 3 + 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 | 10 +- sign/dilithium/mode2/internal/sample_test.go | 12 +- sign/dilithium/mode2/internal/vec.go | 2 +- sign/dilithium/mode2aes.go | 2 +- sign/dilithium/mode2aes/dilithium.go | 6 +- sign/dilithium/mode2aes/internal/dilithium.go | 41 +- .../mode2aes/internal/dilithium_test.go | 2 +- sign/dilithium/mode2aes/internal/mat.go | 2 +- sign/dilithium/mode2aes/internal/pack.go | 2 +- sign/dilithium/mode2aes/internal/pack_test.go | 2 +- sign/dilithium/mode2aes/internal/params.go | 3 + .../mode2aes/internal/params_test.go | 2 +- sign/dilithium/mode2aes/internal/rounding.go | 2 +- .../mode2aes/internal/rounding_test.go | 2 +- sign/dilithium/mode2aes/internal/sample.go | 10 +- .../mode2aes/internal/sample_test.go | 12 +- sign/dilithium/mode2aes/internal/vec.go | 2 +- sign/dilithium/mode3.go | 2 +- sign/dilithium/mode3/dilithium.go | 6 +- sign/dilithium/mode3/internal/dilithium.go | 41 +- .../mode3/internal/dilithium_test.go | 2 +- 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 | 3 + 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 | 10 +- sign/dilithium/mode3/internal/sample_test.go | 12 +- sign/dilithium/mode3/internal/vec.go | 2 +- sign/dilithium/mode3aes.go | 2 +- sign/dilithium/mode3aes/dilithium.go | 6 +- sign/dilithium/mode3aes/internal/dilithium.go | 41 +- .../mode3aes/internal/dilithium_test.go | 2 +- sign/dilithium/mode3aes/internal/mat.go | 2 +- sign/dilithium/mode3aes/internal/pack.go | 2 +- sign/dilithium/mode3aes/internal/pack_test.go | 2 +- sign/dilithium/mode3aes/internal/params.go | 3 + .../mode3aes/internal/params_test.go | 2 +- sign/dilithium/mode3aes/internal/rounding.go | 2 +- .../mode3aes/internal/rounding_test.go | 2 +- sign/dilithium/mode3aes/internal/sample.go | 10 +- .../mode3aes/internal/sample_test.go | 12 +- sign/dilithium/mode3aes/internal/vec.go | 2 +- sign/dilithium/mode5.go | 2 +- sign/dilithium/mode5/dilithium.go | 6 +- sign/dilithium/mode5/internal/dilithium.go | 41 +- .../mode5/internal/dilithium_test.go | 2 +- 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 | 3 + 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 | 10 +- sign/dilithium/mode5/internal/sample_test.go | 12 +- sign/dilithium/mode5/internal/vec.go | 2 +- sign/dilithium/mode5aes.go | 2 +- sign/dilithium/mode5aes/dilithium.go | 6 +- sign/dilithium/mode5aes/internal/dilithium.go | 41 +- .../mode5aes/internal/dilithium_test.go | 2 +- sign/dilithium/mode5aes/internal/mat.go | 2 +- sign/dilithium/mode5aes/internal/pack.go | 2 +- sign/dilithium/mode5aes/internal/pack_test.go | 2 +- sign/dilithium/mode5aes/internal/params.go | 3 + .../mode5aes/internal/params_test.go | 2 +- sign/dilithium/mode5aes/internal/rounding.go | 2 +- .../mode5aes/internal/rounding_test.go | 2 +- sign/dilithium/mode5aes/internal/sample.go | 10 +- .../mode5aes/internal/sample_test.go | 12 +- sign/dilithium/mode5aes/internal/vec.go | 2 +- sign/dilithium/templates/mode.templ.go | 12 +- sign/dilithium/templates/modePkg.templ.go | 10 +- sign/dilithium/templates/params.templ.go | 3 + .../common => internal/dilithium}/aes.go | 2 +- .../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 | 2 + sign/mldsa/mldsa44/dilithium.go | 182 +++++++ sign/mldsa/mldsa44/internal/dilithium.go | 482 ++++++++++++++++++ sign/mldsa/mldsa44/internal/dilithium_test.go | 144 ++++++ sign/mldsa/mldsa44/internal/mat.go | 59 +++ sign/mldsa/mldsa44/internal/pack.go | 270 ++++++++++ sign/mldsa/mldsa44/internal/pack_test.go | 93 ++++ sign/mldsa/mldsa44/internal/params.go | 19 + sign/mldsa/mldsa44/internal/rounding.go | 142 ++++++ sign/mldsa/mldsa44/internal/rounding_test.go | 81 +++ sign/mldsa/mldsa44/internal/sample.go | 370 ++++++++++++++ sign/mldsa/mldsa44/internal/sample_test.go | 266 ++++++++++ sign/mldsa/mldsa44/internal/vec.go | 281 ++++++++++ sign/mldsa/mldsa65/dilithium.go | 182 +++++++ sign/mldsa/mldsa65/internal/dilithium.go | 482 ++++++++++++++++++ sign/mldsa/mldsa65/internal/dilithium_test.go | 144 ++++++ sign/mldsa/mldsa65/internal/mat.go | 59 +++ sign/mldsa/mldsa65/internal/pack.go | 270 ++++++++++ sign/mldsa/mldsa65/internal/pack_test.go | 93 ++++ sign/mldsa/mldsa65/internal/params.go | 19 + sign/mldsa/mldsa65/internal/rounding.go | 142 ++++++ sign/mldsa/mldsa65/internal/rounding_test.go | 81 +++ sign/mldsa/mldsa65/internal/sample.go | 370 ++++++++++++++ sign/mldsa/mldsa65/internal/sample_test.go | 266 ++++++++++ sign/mldsa/mldsa65/internal/vec.go | 281 ++++++++++ sign/mldsa/mldsa87/dilithium.go | 182 +++++++ sign/mldsa/mldsa87/internal/dilithium.go | 482 ++++++++++++++++++ sign/mldsa/mldsa87/internal/dilithium_test.go | 144 ++++++ sign/mldsa/mldsa87/internal/mat.go | 59 +++ sign/mldsa/mldsa87/internal/pack.go | 270 ++++++++++ sign/mldsa/mldsa87/internal/pack_test.go | 93 ++++ sign/mldsa/mldsa87/internal/params.go | 19 + sign/mldsa/mldsa87/internal/rounding.go | 142 ++++++ sign/mldsa/mldsa87/internal/rounding_test.go | 81 +++ sign/mldsa/mldsa87/internal/sample.go | 370 ++++++++++++++ sign/mldsa/mldsa87/internal/sample_test.go | 266 ++++++++++ sign/mldsa/mldsa87/internal/vec.go | 281 ++++++++++ 148 files changed, 7890 insertions(+), 274 deletions(-) create mode 100644 sign/dilithium/mldsa44.go create mode 100644 sign/dilithium/mldsa65.go create mode 100644 sign/dilithium/mldsa87.go rename sign/{dilithium/internal/common => internal/dilithium}/aes.go (98%) 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/dilithium.go create mode 100644 sign/mldsa/mldsa44/internal/dilithium.go create mode 100644 sign/mldsa/mldsa44/internal/dilithium_test.go create mode 100644 sign/mldsa/mldsa44/internal/mat.go create mode 100644 sign/mldsa/mldsa44/internal/pack.go create mode 100644 sign/mldsa/mldsa44/internal/pack_test.go create mode 100644 sign/mldsa/mldsa44/internal/params.go create mode 100644 sign/mldsa/mldsa44/internal/rounding.go create mode 100644 sign/mldsa/mldsa44/internal/rounding_test.go create mode 100644 sign/mldsa/mldsa44/internal/sample.go create mode 100644 sign/mldsa/mldsa44/internal/sample_test.go create mode 100644 sign/mldsa/mldsa44/internal/vec.go create mode 100644 sign/mldsa/mldsa65/dilithium.go create mode 100644 sign/mldsa/mldsa65/internal/dilithium.go create mode 100644 sign/mldsa/mldsa65/internal/dilithium_test.go create mode 100644 sign/mldsa/mldsa65/internal/mat.go create mode 100644 sign/mldsa/mldsa65/internal/pack.go create mode 100644 sign/mldsa/mldsa65/internal/pack_test.go create mode 100644 sign/mldsa/mldsa65/internal/params.go create mode 100644 sign/mldsa/mldsa65/internal/rounding.go create mode 100644 sign/mldsa/mldsa65/internal/rounding_test.go create mode 100644 sign/mldsa/mldsa65/internal/sample.go create mode 100644 sign/mldsa/mldsa65/internal/sample_test.go create mode 100644 sign/mldsa/mldsa65/internal/vec.go create mode 100644 sign/mldsa/mldsa87/dilithium.go create mode 100644 sign/mldsa/mldsa87/internal/dilithium.go create mode 100644 sign/mldsa/mldsa87/internal/dilithium_test.go create mode 100644 sign/mldsa/mldsa87/internal/mat.go create mode 100644 sign/mldsa/mldsa87/internal/pack.go create mode 100644 sign/mldsa/mldsa87/internal/pack_test.go create mode 100644 sign/mldsa/mldsa87/internal/params.go create mode 100644 sign/mldsa/mldsa87/internal/rounding.go create mode 100644 sign/mldsa/mldsa87/internal/rounding_test.go create mode 100644 sign/mldsa/mldsa87/internal/sample.go create mode 100644 sign/mldsa/mldsa87/internal/sample_test.go create mode 100644 sign/mldsa/mldsa87/internal/vec.go diff --git a/sign/dilithium/example_test.go b/sign/dilithium/example_test.go index 4f4de0d99..bf687b202 100644 --- a/sign/dilithium/example_test.go +++ b/sign/dilithium/example_test.go @@ -51,6 +51,6 @@ func Example() { fmt.Printf("O.K.") // Output: - // Supported modes: [Dilithium2 Dilithium2-AES Dilithium3 Dilithium3-AES Dilithium5 Dilithium5-AES] + // Supported modes: [Dilithium2 Dilithium2-AES Dilithium3 Dilithium3-AES Dilithium5 Dilithium5-AES ML-DSA-44 ML-DSA-65 ML-DSA-87] // O.K. } diff --git a/sign/dilithium/gen.go b/sign/dilithium/gen.go index c0d0df378..64d134714 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,26 +27,47 @@ 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 { + if m.NIST() { + return strings.ReplaceAll(m.Name, "-", "") + } + return strings.ReplaceAll(strings.ReplaceAll(m.Name, "Dilithium", "Mode"), "-AES", "AES") } +func (m Mode) UseAES() bool { + return strings.HasSuffix(m.Name, "-AES") +} + +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, @@ -56,10 +76,11 @@ var ( Tau: 39, Gamma1Bits: 17, Gamma2: (params.Q - 1) / 88, + TRSize: 32, + CTildeSize: 32, }, { Name: "Dilithium2-AES", - UseAES: true, K: 4, L: 4, Eta: 2, @@ -68,10 +89,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, @@ -80,10 +102,11 @@ var ( Tau: 49, Gamma1Bits: 19, Gamma2: (params.Q - 1) / 32, + TRSize: 32, + CTildeSize: 32, }, { Name: "Dilithium3-AES", - UseAES: true, K: 6, L: 5, Eta: 4, @@ -92,10 +115,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 +128,11 @@ var ( Tau: 60, Gamma1Bits: 19, Gamma2: (params.Q - 1) / 32, + TRSize: 32, + CTildeSize: 32, }, { Name: "Dilithium5-AES", - UseAES: true, K: 8, L: 7, Eta: 2, @@ -116,6 +141,47 @@ var ( Tau: 60, Gamma1Bits: 19, Gamma2: (params.Q - 1) / 32, + TRSize: 32, + CTildeSize: 32, + }, + { + 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, + DoubleEtaBits: 3, + Omega: 75, + Tau: 60, + Gamma1Bits: 19, + Gamma2: (params.Q - 1) / 32, + TRSize: 64, + CTildeSize: 64, }, } TemplateWarning = "// Code generated from" @@ -153,7 +219,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) @@ -206,7 +272,7 @@ func generateModePackageFiles() { if offset == -1 { panic("Missing template warning in modePkg.templ.go") } - err = os.WriteFile(mode.Pkg()+"/dilithium.go", []byte(res[offset:]), 0o644) + err = os.WriteFile(mode.PkgPath()+"/dilithium.go", []byte(res[offset:]), 0o644) if err != nil { panic(err) } @@ -246,10 +312,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 +339,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/kat_test.go b/sign/dilithium/kat_test.go index 2280e988d..dae3690ac 100644 --- a/sign/dilithium/kat_test.go +++ b/sign/dilithium/kat_test.go @@ -6,24 +6,32 @@ package dilithium import ( "crypto/sha256" "fmt" + "strings" "testing" "github.com/cloudflare/circl/internal/nist" ) 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 e7bed6258b9a3703ce78d4ec3, + // which can be found on the standard branch + // of https://github.com/pq-crystals/dilithium + {"ML-DSA-44", "4657f244d1204e5847b3cacea4fc6116579571bee8ac89b8cba6771f303ee260"}, + {"ML-DSA-65", "99a95d7ef804020a666f455c5003232d0c0200dfc4f5df85dceb8f56256dcba8"}, + {"ML-DSA-87", "3377835fffb7cf9aac52947225c8974335bc05532ddf672a8b706ab8991435a2"}, } { t.Run(tc.name, func(t *testing.T) { mode := ModeByName(tc.name) @@ -38,7 +46,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[:]) diff --git a/sign/dilithium/mldsa44.go b/sign/dilithium/mldsa44.go new file mode 100644 index 000000000..1cbaf0174 --- /dev/null +++ b/sign/dilithium/mldsa44.go @@ -0,0 +1,91 @@ +// Code generated from mode.templ.go. DO NOT EDIT. + +package dilithium + +import ( + "fmt" + "io" + + "github.com/cloudflare/circl/sign/mldsa/mldsa44" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// implMLDSA44 implements the mode.Mode interface for ML-DSA-44. +type implMLDSA44 struct{} + +// MLDSA44 is ML-DSA-44. +var MLDSA44 Mode = &implMLDSA44{} + +func (m *implMLDSA44) GenerateKey(rand io.Reader) ( + PublicKey, PrivateKey, error) { + return mldsa44.GenerateKey(rand) +} + +func (m *implMLDSA44) 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 mldsa44.NewKeyFromSeed(&seedBuf) +} + +func (m *implMLDSA44) Sign(sk PrivateKey, msg []byte) []byte { + isk := sk.(*mldsa44.PrivateKey) + ret := [mldsa44.SignatureSize]byte{} + mldsa44.SignTo(isk, msg, ret[:]) + return ret[:] +} + +func (m *implMLDSA44) Verify(pk PublicKey, msg []byte, signature []byte) bool { + ipk := pk.(*mldsa44.PublicKey) + return mldsa44.Verify(ipk, msg, signature) +} + +func (m *implMLDSA44) PublicKeyFromBytes(data []byte) PublicKey { + var ret mldsa44.PublicKey + if len(data) != mldsa44.PublicKeySize { + panic("packed public key must be of mldsa44.PublicKeySize bytes") + } + var buf [mldsa44.PublicKeySize]byte + copy(buf[:], data) + ret.Unpack(&buf) + return &ret +} + +func (m *implMLDSA44) PrivateKeyFromBytes(data []byte) PrivateKey { + var ret mldsa44.PrivateKey + if len(data) != mldsa44.PrivateKeySize { + panic("packed public key must be of mldsa44.PrivateKeySize bytes") + } + var buf [mldsa44.PrivateKeySize]byte + copy(buf[:], data) + ret.Unpack(&buf) + return &ret +} + +func (m *implMLDSA44) SeedSize() int { + return common.SeedSize +} + +func (m *implMLDSA44) PublicKeySize() int { + return mldsa44.PublicKeySize +} + +func (m *implMLDSA44) PrivateKeySize() int { + return mldsa44.PrivateKeySize +} + +func (m *implMLDSA44) SignatureSize() int { + return mldsa44.SignatureSize +} + +func (m *implMLDSA44) Name() string { + return "ML-DSA-44" +} + +func init() { + modes["ML-DSA-44"] = MLDSA44 +} diff --git a/sign/dilithium/mldsa65.go b/sign/dilithium/mldsa65.go new file mode 100644 index 000000000..8c39363e8 --- /dev/null +++ b/sign/dilithium/mldsa65.go @@ -0,0 +1,91 @@ +// Code generated from mode.templ.go. DO NOT EDIT. + +package dilithium + +import ( + "fmt" + "io" + + "github.com/cloudflare/circl/sign/mldsa/mldsa65" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// implMLDSA65 implements the mode.Mode interface for ML-DSA-65. +type implMLDSA65 struct{} + +// MLDSA65 is ML-DSA-65. +var MLDSA65 Mode = &implMLDSA65{} + +func (m *implMLDSA65) GenerateKey(rand io.Reader) ( + PublicKey, PrivateKey, error) { + return mldsa65.GenerateKey(rand) +} + +func (m *implMLDSA65) 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 mldsa65.NewKeyFromSeed(&seedBuf) +} + +func (m *implMLDSA65) Sign(sk PrivateKey, msg []byte) []byte { + isk := sk.(*mldsa65.PrivateKey) + ret := [mldsa65.SignatureSize]byte{} + mldsa65.SignTo(isk, msg, ret[:]) + return ret[:] +} + +func (m *implMLDSA65) Verify(pk PublicKey, msg []byte, signature []byte) bool { + ipk := pk.(*mldsa65.PublicKey) + return mldsa65.Verify(ipk, msg, signature) +} + +func (m *implMLDSA65) PublicKeyFromBytes(data []byte) PublicKey { + var ret mldsa65.PublicKey + if len(data) != mldsa65.PublicKeySize { + panic("packed public key must be of mldsa65.PublicKeySize bytes") + } + var buf [mldsa65.PublicKeySize]byte + copy(buf[:], data) + ret.Unpack(&buf) + return &ret +} + +func (m *implMLDSA65) PrivateKeyFromBytes(data []byte) PrivateKey { + var ret mldsa65.PrivateKey + if len(data) != mldsa65.PrivateKeySize { + panic("packed public key must be of mldsa65.PrivateKeySize bytes") + } + var buf [mldsa65.PrivateKeySize]byte + copy(buf[:], data) + ret.Unpack(&buf) + return &ret +} + +func (m *implMLDSA65) SeedSize() int { + return common.SeedSize +} + +func (m *implMLDSA65) PublicKeySize() int { + return mldsa65.PublicKeySize +} + +func (m *implMLDSA65) PrivateKeySize() int { + return mldsa65.PrivateKeySize +} + +func (m *implMLDSA65) SignatureSize() int { + return mldsa65.SignatureSize +} + +func (m *implMLDSA65) Name() string { + return "ML-DSA-65" +} + +func init() { + modes["ML-DSA-65"] = MLDSA65 +} diff --git a/sign/dilithium/mldsa87.go b/sign/dilithium/mldsa87.go new file mode 100644 index 000000000..bc125430b --- /dev/null +++ b/sign/dilithium/mldsa87.go @@ -0,0 +1,91 @@ +// Code generated from mode.templ.go. DO NOT EDIT. + +package dilithium + +import ( + "fmt" + "io" + + "github.com/cloudflare/circl/sign/mldsa/mldsa87" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// implMLDSA87 implements the mode.Mode interface for ML-DSA-87. +type implMLDSA87 struct{} + +// MLDSA87 is ML-DSA-87. +var MLDSA87 Mode = &implMLDSA87{} + +func (m *implMLDSA87) GenerateKey(rand io.Reader) ( + PublicKey, PrivateKey, error) { + return mldsa87.GenerateKey(rand) +} + +func (m *implMLDSA87) 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 mldsa87.NewKeyFromSeed(&seedBuf) +} + +func (m *implMLDSA87) Sign(sk PrivateKey, msg []byte) []byte { + isk := sk.(*mldsa87.PrivateKey) + ret := [mldsa87.SignatureSize]byte{} + mldsa87.SignTo(isk, msg, ret[:]) + return ret[:] +} + +func (m *implMLDSA87) Verify(pk PublicKey, msg []byte, signature []byte) bool { + ipk := pk.(*mldsa87.PublicKey) + return mldsa87.Verify(ipk, msg, signature) +} + +func (m *implMLDSA87) PublicKeyFromBytes(data []byte) PublicKey { + var ret mldsa87.PublicKey + if len(data) != mldsa87.PublicKeySize { + panic("packed public key must be of mldsa87.PublicKeySize bytes") + } + var buf [mldsa87.PublicKeySize]byte + copy(buf[:], data) + ret.Unpack(&buf) + return &ret +} + +func (m *implMLDSA87) PrivateKeyFromBytes(data []byte) PrivateKey { + var ret mldsa87.PrivateKey + if len(data) != mldsa87.PrivateKeySize { + panic("packed public key must be of mldsa87.PrivateKeySize bytes") + } + var buf [mldsa87.PrivateKeySize]byte + copy(buf[:], data) + ret.Unpack(&buf) + return &ret +} + +func (m *implMLDSA87) SeedSize() int { + return common.SeedSize +} + +func (m *implMLDSA87) PublicKeySize() int { + return mldsa87.PublicKeySize +} + +func (m *implMLDSA87) PrivateKeySize() int { + return mldsa87.PrivateKeySize +} + +func (m *implMLDSA87) SignatureSize() int { + return mldsa87.SignatureSize +} + +func (m *implMLDSA87) Name() string { + return "ML-DSA-87" +} + +func init() { + modes["ML-DSA-87"] = MLDSA87 +} diff --git a/sign/dilithium/mode2.go b/sign/dilithium/mode2.go index e88d090b0..7e27eff2c 100644 --- a/sign/dilithium/mode2.go +++ b/sign/dilithium/mode2.go @@ -6,8 +6,8 @@ import ( "fmt" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" "github.com/cloudflare/circl/sign/dilithium/mode2" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // implMode2 implements the mode.Mode interface for Dilithium2. diff --git a/sign/dilithium/mode2/dilithium.go b/sign/dilithium/mode2/dilithium.go index 13ac869a5..16ce78351 100644 --- a/sign/dilithium/mode2/dilithium.go +++ b/sign/dilithium/mode2/dilithium.go @@ -1,9 +1,11 @@ // Code generated from modePkg.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 // // https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf + package mode2 import ( @@ -11,8 +13,10 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/dilithium/mode2/internal" + ) const ( diff --git a/sign/dilithium/mode2/internal/dilithium.go b/sign/dilithium/mode2/internal/dilithium.go index 79a17d504..7869d0475 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:]) @@ -250,7 +250,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { 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‖_∞ < γ₁ - β @@ -279,7 +279,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[:32]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -330,6 +330,11 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +373,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:32]) 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..825e7da08 100644 --- a/sign/dilithium/mode2/internal/dilithium_test.go +++ b/sign/dilithium/mode2/internal/dilithium_test.go @@ -6,7 +6,7 @@ import ( "encoding/binary" "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. 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..74810fbad 100644 --- a/sign/dilithium/mode2/internal/params.go +++ b/sign/dilithium/mode2/internal/params.go @@ -13,4 +13,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..62c261332 100644 --- a/sign/dilithium/mode2/internal/sample.go +++ b/sign/dilithium/mode2/internal/sample.go @@ -6,7 +6,7 @@ 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" ) @@ -246,12 +246,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 < 32/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 +260,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[(32/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +327,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..2059599eb 100644 --- a/sign/dilithium/mode2/internal/sample_test.go +++ b/sign/dilithium/mode2/internal/sample_test.go @@ -6,7 +6,7 @@ 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) { @@ -155,7 +155,7 @@ func TestDeriveUniformBall(t *testing.T) { var seed [32]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 { @@ -203,10 +203,10 @@ func TestDeriveUniformBallX4(t *testing.T) { var seed [32]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 +219,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 +231,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 index e3c996d92..e973a70f6 100644 --- a/sign/dilithium/mode2aes.go +++ b/sign/dilithium/mode2aes.go @@ -6,8 +6,8 @@ import ( "fmt" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" "github.com/cloudflare/circl/sign/dilithium/mode2aes" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // implMode2AES implements the mode.Mode interface for Dilithium2-AES. diff --git a/sign/dilithium/mode2aes/dilithium.go b/sign/dilithium/mode2aes/dilithium.go index 0b44077bb..93e5058d5 100644 --- a/sign/dilithium/mode2aes/dilithium.go +++ b/sign/dilithium/mode2aes/dilithium.go @@ -1,9 +1,11 @@ // 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 ( @@ -11,8 +13,10 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/dilithium/mode2aes/internal" + ) const ( diff --git a/sign/dilithium/mode2aes/internal/dilithium.go b/sign/dilithium/mode2aes/internal/dilithium.go index 79a17d504..7869d0475 100644 --- a/sign/dilithium/mode2aes/internal/dilithium.go +++ b/sign/dilithium/mode2aes/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:]) @@ -250,7 +250,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { 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‖_∞ < γ₁ - β @@ -279,7 +279,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[:32]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -330,6 +330,11 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +373,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:32]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode2aes/internal/dilithium_test.go b/sign/dilithium/mode2aes/internal/dilithium_test.go index ca347a831..825e7da08 100644 --- a/sign/dilithium/mode2aes/internal/dilithium_test.go +++ b/sign/dilithium/mode2aes/internal/dilithium_test.go @@ -6,7 +6,7 @@ import ( "encoding/binary" "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. diff --git a/sign/dilithium/mode2aes/internal/mat.go b/sign/dilithium/mode2aes/internal/mat.go index cb473c149..ceaf634fa 100644 --- a/sign/dilithium/mode2aes/internal/mat.go +++ b/sign/dilithium/mode2aes/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/dilithium/mode2aes/internal/pack.go index 0285dfd8e..1854b4197 100644 --- a/sign/dilithium/mode2aes/internal/pack.go +++ b/sign/dilithium/mode2aes/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/dilithium/mode2aes/internal/pack_test.go index 24f568e4d..f952c6a09 100644 --- a/sign/dilithium/mode2aes/internal/pack_test.go +++ b/sign/dilithium/mode2aes/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/dilithium/mode2aes/internal/params.go index 751ad149b..77305b51b 100644 --- a/sign/dilithium/mode2aes/internal/params.go +++ b/sign/dilithium/mode2aes/internal/params.go @@ -13,4 +13,7 @@ const ( Tau = 39 Gamma1Bits = 17 Gamma2 = 95232 + NIST = false + TRSize = 32 + CTildeSize = 32 ) diff --git a/sign/dilithium/mode2aes/internal/params_test.go b/sign/dilithium/mode2aes/internal/params_test.go index 50665d6a9..14d70d1a7 100644 --- a/sign/dilithium/mode2aes/internal/params_test.go +++ b/sign/dilithium/mode2aes/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/mode2aes/internal/rounding.go b/sign/dilithium/mode2aes/internal/rounding.go index 71360cb29..58123c090 100644 --- a/sign/dilithium/mode2aes/internal/rounding.go +++ b/sign/dilithium/mode2aes/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/dilithium/mode2aes/internal/rounding_test.go index 5824f2656..ad653ca3f 100644 --- a/sign/dilithium/mode2aes/internal/rounding_test.go +++ b/sign/dilithium/mode2aes/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/dilithium/mode2aes/internal/sample.go index c47185ada..62c261332 100644 --- a/sign/dilithium/mode2aes/internal/sample.go +++ b/sign/dilithium/mode2aes/internal/sample.go @@ -6,7 +6,7 @@ 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" ) @@ -246,12 +246,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 < 32/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 +260,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[(32/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +327,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/mode2aes/internal/sample_test.go b/sign/dilithium/mode2aes/internal/sample_test.go index 1a0a4f72c..2059599eb 100644 --- a/sign/dilithium/mode2aes/internal/sample_test.go +++ b/sign/dilithium/mode2aes/internal/sample_test.go @@ -6,7 +6,7 @@ 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) { @@ -155,7 +155,7 @@ func TestDeriveUniformBall(t *testing.T) { var seed [32]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 { @@ -203,10 +203,10 @@ func TestDeriveUniformBallX4(t *testing.T) { var seed [32]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 +219,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 +231,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/mode2aes/internal/vec.go b/sign/dilithium/mode2aes/internal/vec.go index f52973e45..d07d3b245 100644 --- a/sign/dilithium/mode2aes/internal/vec.go +++ b/sign/dilithium/mode2aes/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/mode3.go b/sign/dilithium/mode3.go index fb45a29c2..147678612 100644 --- a/sign/dilithium/mode3.go +++ b/sign/dilithium/mode3.go @@ -6,8 +6,8 @@ import ( "fmt" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" "github.com/cloudflare/circl/sign/dilithium/mode3" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // implMode3 implements the mode.Mode interface for Dilithium3. diff --git a/sign/dilithium/mode3/dilithium.go b/sign/dilithium/mode3/dilithium.go index 3ab9d6b53..de98b5dd2 100644 --- a/sign/dilithium/mode3/dilithium.go +++ b/sign/dilithium/mode3/dilithium.go @@ -1,9 +1,11 @@ // Code generated from modePkg.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 // // https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf + package mode3 import ( @@ -11,8 +13,10 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/dilithium/mode3/internal" + ) const ( diff --git a/sign/dilithium/mode3/internal/dilithium.go b/sign/dilithium/mode3/internal/dilithium.go index 59e43cc13..da4ec6262 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:]) @@ -248,7 +248,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { 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‖_∞ < γ₁ - β @@ -277,7 +277,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[:32]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -328,6 +328,11 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -366,7 +371,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:32]) 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..9707772be 100644 --- a/sign/dilithium/mode3/internal/dilithium_test.go +++ b/sign/dilithium/mode3/internal/dilithium_test.go @@ -4,7 +4,7 @@ import ( "encoding/binary" "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. 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..77452958f 100644 --- a/sign/dilithium/mode3/internal/params.go +++ b/sign/dilithium/mode3/internal/params.go @@ -13,4 +13,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..b2b0bbe13 100644 --- a/sign/dilithium/mode3/internal/sample.go +++ b/sign/dilithium/mode3/internal/sample.go @@ -4,7 +4,7 @@ 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" ) @@ -244,12 +244,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 < 32/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 +258,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[(32/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -325,7 +325,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..1adfaf535 100644 --- a/sign/dilithium/mode3/internal/sample_test.go +++ b/sign/dilithium/mode3/internal/sample_test.go @@ -4,7 +4,7 @@ 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) { @@ -153,7 +153,7 @@ func TestDeriveUniformBall(t *testing.T) { var seed [32]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 { @@ -201,10 +201,10 @@ func TestDeriveUniformBallX4(t *testing.T) { var seed [32]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 +217,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 +229,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 index c4cca1863..bdbe19020 100644 --- a/sign/dilithium/mode3aes.go +++ b/sign/dilithium/mode3aes.go @@ -6,8 +6,8 @@ import ( "fmt" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" "github.com/cloudflare/circl/sign/dilithium/mode3aes" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // implMode3AES implements the mode.Mode interface for Dilithium3-AES. diff --git a/sign/dilithium/mode3aes/dilithium.go b/sign/dilithium/mode3aes/dilithium.go index afc5e3e92..0503f7673 100644 --- a/sign/dilithium/mode3aes/dilithium.go +++ b/sign/dilithium/mode3aes/dilithium.go @@ -1,9 +1,11 @@ // 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 ( @@ -11,8 +13,10 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/dilithium/mode3aes/internal" + ) const ( diff --git a/sign/dilithium/mode3aes/internal/dilithium.go b/sign/dilithium/mode3aes/internal/dilithium.go index 79a17d504..7869d0475 100644 --- a/sign/dilithium/mode3aes/internal/dilithium.go +++ b/sign/dilithium/mode3aes/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:]) @@ -250,7 +250,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { 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‖_∞ < γ₁ - β @@ -279,7 +279,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[:32]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -330,6 +330,11 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +373,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:32]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode3aes/internal/dilithium_test.go b/sign/dilithium/mode3aes/internal/dilithium_test.go index ca347a831..825e7da08 100644 --- a/sign/dilithium/mode3aes/internal/dilithium_test.go +++ b/sign/dilithium/mode3aes/internal/dilithium_test.go @@ -6,7 +6,7 @@ import ( "encoding/binary" "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. diff --git a/sign/dilithium/mode3aes/internal/mat.go b/sign/dilithium/mode3aes/internal/mat.go index cb473c149..ceaf634fa 100644 --- a/sign/dilithium/mode3aes/internal/mat.go +++ b/sign/dilithium/mode3aes/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/dilithium/mode3aes/internal/pack.go index 0285dfd8e..1854b4197 100644 --- a/sign/dilithium/mode3aes/internal/pack.go +++ b/sign/dilithium/mode3aes/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/dilithium/mode3aes/internal/pack_test.go index 24f568e4d..f952c6a09 100644 --- a/sign/dilithium/mode3aes/internal/pack_test.go +++ b/sign/dilithium/mode3aes/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/dilithium/mode3aes/internal/params.go index 7523dc09e..425cea3b3 100644 --- a/sign/dilithium/mode3aes/internal/params.go +++ b/sign/dilithium/mode3aes/internal/params.go @@ -13,4 +13,7 @@ const ( Tau = 49 Gamma1Bits = 19 Gamma2 = 261888 + NIST = false + TRSize = 32 + CTildeSize = 32 ) diff --git a/sign/dilithium/mode3aes/internal/params_test.go b/sign/dilithium/mode3aes/internal/params_test.go index fc246ce73..8e71ef60d 100644 --- a/sign/dilithium/mode3aes/internal/params_test.go +++ b/sign/dilithium/mode3aes/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/mode3aes/internal/rounding.go b/sign/dilithium/mode3aes/internal/rounding.go index 71360cb29..58123c090 100644 --- a/sign/dilithium/mode3aes/internal/rounding.go +++ b/sign/dilithium/mode3aes/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/dilithium/mode3aes/internal/rounding_test.go index 5824f2656..ad653ca3f 100644 --- a/sign/dilithium/mode3aes/internal/rounding_test.go +++ b/sign/dilithium/mode3aes/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/dilithium/mode3aes/internal/sample.go index c47185ada..62c261332 100644 --- a/sign/dilithium/mode3aes/internal/sample.go +++ b/sign/dilithium/mode3aes/internal/sample.go @@ -6,7 +6,7 @@ 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" ) @@ -246,12 +246,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 < 32/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 +260,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[(32/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +327,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/mode3aes/internal/sample_test.go b/sign/dilithium/mode3aes/internal/sample_test.go index 1a0a4f72c..2059599eb 100644 --- a/sign/dilithium/mode3aes/internal/sample_test.go +++ b/sign/dilithium/mode3aes/internal/sample_test.go @@ -6,7 +6,7 @@ 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) { @@ -155,7 +155,7 @@ func TestDeriveUniformBall(t *testing.T) { var seed [32]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 { @@ -203,10 +203,10 @@ func TestDeriveUniformBallX4(t *testing.T) { var seed [32]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 +219,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 +231,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/mode3aes/internal/vec.go b/sign/dilithium/mode3aes/internal/vec.go index f52973e45..d07d3b245 100644 --- a/sign/dilithium/mode3aes/internal/vec.go +++ b/sign/dilithium/mode3aes/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/mode5.go b/sign/dilithium/mode5.go index d6b7a9c73..c9b55dd30 100644 --- a/sign/dilithium/mode5.go +++ b/sign/dilithium/mode5.go @@ -6,8 +6,8 @@ import ( "fmt" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" "github.com/cloudflare/circl/sign/dilithium/mode5" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // implMode5 implements the mode.Mode interface for Dilithium5. diff --git a/sign/dilithium/mode5/dilithium.go b/sign/dilithium/mode5/dilithium.go index 3a6a0cb93..7271ad17d 100644 --- a/sign/dilithium/mode5/dilithium.go +++ b/sign/dilithium/mode5/dilithium.go @@ -1,9 +1,11 @@ // Code generated from modePkg.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 // // https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf + package mode5 import ( @@ -11,8 +13,10 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/dilithium/mode5/internal" + ) const ( diff --git a/sign/dilithium/mode5/internal/dilithium.go b/sign/dilithium/mode5/internal/dilithium.go index 79a17d504..7869d0475 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:]) @@ -250,7 +250,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { 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‖_∞ < γ₁ - β @@ -279,7 +279,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[:32]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -330,6 +330,11 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +373,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:32]) 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..825e7da08 100644 --- a/sign/dilithium/mode5/internal/dilithium_test.go +++ b/sign/dilithium/mode5/internal/dilithium_test.go @@ -6,7 +6,7 @@ import ( "encoding/binary" "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. 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..e8a2b143e 100644 --- a/sign/dilithium/mode5/internal/params.go +++ b/sign/dilithium/mode5/internal/params.go @@ -13,4 +13,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..62c261332 100644 --- a/sign/dilithium/mode5/internal/sample.go +++ b/sign/dilithium/mode5/internal/sample.go @@ -6,7 +6,7 @@ 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" ) @@ -246,12 +246,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 < 32/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 +260,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[(32/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +327,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..2059599eb 100644 --- a/sign/dilithium/mode5/internal/sample_test.go +++ b/sign/dilithium/mode5/internal/sample_test.go @@ -6,7 +6,7 @@ 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) { @@ -155,7 +155,7 @@ func TestDeriveUniformBall(t *testing.T) { var seed [32]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 { @@ -203,10 +203,10 @@ func TestDeriveUniformBallX4(t *testing.T) { var seed [32]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 +219,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 +231,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 index 258b8a825..0dfd3854f 100644 --- a/sign/dilithium/mode5aes.go +++ b/sign/dilithium/mode5aes.go @@ -6,8 +6,8 @@ import ( "fmt" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" "github.com/cloudflare/circl/sign/dilithium/mode5aes" + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // implMode5AES implements the mode.Mode interface for Dilithium5-AES. diff --git a/sign/dilithium/mode5aes/dilithium.go b/sign/dilithium/mode5aes/dilithium.go index 2a0f05e7a..c0300f2e6 100644 --- a/sign/dilithium/mode5aes/dilithium.go +++ b/sign/dilithium/mode5aes/dilithium.go @@ -1,9 +1,11 @@ // 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 ( @@ -11,8 +13,10 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" + "github.com/cloudflare/circl/sign/dilithium/mode5aes/internal" + ) const ( diff --git a/sign/dilithium/mode5aes/internal/dilithium.go b/sign/dilithium/mode5aes/internal/dilithium.go index 79a17d504..7869d0475 100644 --- a/sign/dilithium/mode5aes/internal/dilithium.go +++ b/sign/dilithium/mode5aes/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:]) @@ -250,7 +250,7 @@ func Verify(pk *PublicKey, msg []byte, signature []byte) bool { 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‖_∞ < γ₁ - β @@ -279,7 +279,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[:32]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -330,6 +330,11 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { // ρ' = CRH(key ‖ μ) h.Reset() _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -368,7 +373,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, &sig.c) + PolyDeriveUniformBall(&ch, sig.c[:32]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/dilithium/mode5aes/internal/dilithium_test.go b/sign/dilithium/mode5aes/internal/dilithium_test.go index ca347a831..825e7da08 100644 --- a/sign/dilithium/mode5aes/internal/dilithium_test.go +++ b/sign/dilithium/mode5aes/internal/dilithium_test.go @@ -6,7 +6,7 @@ import ( "encoding/binary" "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. diff --git a/sign/dilithium/mode5aes/internal/mat.go b/sign/dilithium/mode5aes/internal/mat.go index cb473c149..ceaf634fa 100644 --- a/sign/dilithium/mode5aes/internal/mat.go +++ b/sign/dilithium/mode5aes/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/dilithium/mode5aes/internal/pack.go index 0285dfd8e..1854b4197 100644 --- a/sign/dilithium/mode5aes/internal/pack.go +++ b/sign/dilithium/mode5aes/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/dilithium/mode5aes/internal/pack_test.go index 24f568e4d..f952c6a09 100644 --- a/sign/dilithium/mode5aes/internal/pack_test.go +++ b/sign/dilithium/mode5aes/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/dilithium/mode5aes/internal/params.go index 419cb2a2b..340b6d73a 100644 --- a/sign/dilithium/mode5aes/internal/params.go +++ b/sign/dilithium/mode5aes/internal/params.go @@ -13,4 +13,7 @@ const ( Tau = 60 Gamma1Bits = 19 Gamma2 = 261888 + NIST = false + TRSize = 32 + CTildeSize = 32 ) diff --git a/sign/dilithium/mode5aes/internal/params_test.go b/sign/dilithium/mode5aes/internal/params_test.go index a5e746f68..57e14f820 100644 --- a/sign/dilithium/mode5aes/internal/params_test.go +++ b/sign/dilithium/mode5aes/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/mode5aes/internal/rounding.go b/sign/dilithium/mode5aes/internal/rounding.go index 71360cb29..58123c090 100644 --- a/sign/dilithium/mode5aes/internal/rounding.go +++ b/sign/dilithium/mode5aes/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/dilithium/mode5aes/internal/rounding_test.go index 5824f2656..ad653ca3f 100644 --- a/sign/dilithium/mode5aes/internal/rounding_test.go +++ b/sign/dilithium/mode5aes/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/dilithium/mode5aes/internal/sample.go index c47185ada..62c261332 100644 --- a/sign/dilithium/mode5aes/internal/sample.go +++ b/sign/dilithium/mode5aes/internal/sample.go @@ -6,7 +6,7 @@ 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" ) @@ -246,12 +246,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 < 32/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 +260,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[(32/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() @@ -327,7 +327,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/mode5aes/internal/sample_test.go b/sign/dilithium/mode5aes/internal/sample_test.go index 1a0a4f72c..2059599eb 100644 --- a/sign/dilithium/mode5aes/internal/sample_test.go +++ b/sign/dilithium/mode5aes/internal/sample_test.go @@ -6,7 +6,7 @@ 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) { @@ -155,7 +155,7 @@ func TestDeriveUniformBall(t *testing.T) { var seed [32]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 { @@ -203,10 +203,10 @@ func TestDeriveUniformBallX4(t *testing.T) { var seed [32]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 +219,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 +231,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/mode5aes/internal/vec.go b/sign/dilithium/mode5aes/internal/vec.go index f52973e45..d07d3b245 100644 --- a/sign/dilithium/mode5aes/internal/vec.go +++ b/sign/dilithium/mode5aes/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/templates/mode.templ.go b/sign/dilithium/templates/mode.templ.go index 8c76b2512..fb7930de9 100644 --- a/sign/dilithium/templates/mode.templ.go +++ b/sign/dilithium/templates/mode.templ.go @@ -9,15 +9,21 @@ package dilithium import ( "fmt" "io" - - "github.com/cloudflare/circl/sign/dilithium/internal/common" +{{ if .NIST }} + "github.com/cloudflare/circl/sign/mldsa/{{.Pkg}}" +{{ else }} "github.com/cloudflare/circl/sign/dilithium/{{.Pkg}}" +{{- end }} + common "github.com/cloudflare/circl/sign/internal/dilithium" ) // {{.Impl}} implements the mode.Mode interface for {{.Name}}. type {{.Impl}} struct{} - +{{ if .NIST }} +// {{.Mode}} is {{.Name}}. +{{- else }} // {{.Mode}} is Dilithium in mode "{{.Name}}". +{{- end }} var {{.Mode}} Mode = &{{.Impl}}{} func (m *{{.Impl}}) GenerateKey(rand io.Reader) ( diff --git a/sign/dilithium/templates/modePkg.templ.go b/sign/dilithium/templates/modePkg.templ.go index 29dc73556..fbaa89746 100644 --- a/sign/dilithium/templates/modePkg.templ.go +++ b/sign/dilithium/templates/modePkg.templ.go @@ -4,10 +4,14 @@ // Code generated from modePkg.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 ( @@ -15,8 +19,12 @@ import ( "errors" "io" - "github.com/cloudflare/circl/sign/dilithium/internal/common" + common "github.com/cloudflare/circl/sign/internal/dilithium" +{{ if .NIST }} + "github.com/cloudflare/circl/sign/mldsa/{{.Pkg}}/internal" +{{ else }} "github.com/cloudflare/circl/sign/dilithium/{{.Pkg}}/internal" +{{ end }} ) const ( diff --git a/sign/dilithium/templates/params.templ.go b/sign/dilithium/templates/params.templ.go index 1e0331c25..faeae3aac 100644 --- a/sign/dilithium/templates/params.templ.go +++ b/sign/dilithium/templates/params.templ.go @@ -17,4 +17,7 @@ const ( Tau = {{.Tau}} Gamma1Bits = {{.Gamma1Bits}} Gamma2 = {{.Gamma2}} + NIST = {{.NIST}} + TRSize = {{.TRSize}} + CTildeSize = {{.CTildeSize}} ) diff --git a/sign/dilithium/internal/common/aes.go b/sign/internal/dilithium/aes.go similarity index 98% rename from sign/dilithium/internal/common/aes.go rename to sign/internal/dilithium/aes.go index f5de25425..895a20597 100644 --- a/sign/dilithium/internal/common/aes.go +++ b/sign/internal/dilithium/aes.go @@ -1,4 +1,4 @@ -package common +package dilithium import ( "crypto/aes" 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..d5dce5749 --- /dev/null +++ b/sign/mldsa/doc.go @@ -0,0 +1,2 @@ +// mldsa implements NIST post-quantum signature scheme ML-DSA. +package mldsa diff --git a/sign/mldsa/mldsa44/dilithium.go b/sign/mldsa/mldsa44/dilithium.go new file mode 100644 index 000000000..71e2b7906 --- /dev/null +++ b/sign/mldsa/mldsa44/dilithium.go @@ -0,0 +1,182 @@ +// Code generated from modePkg.templ.go. DO NOT EDIT. + + +// mldsa44 implements NIST signature scheme ML-DSA-44 as defined in FIPS204. + +package mldsa44 + +import ( + "crypto" + "errors" + "io" + + 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. +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 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) ( + 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/mldsa/mldsa44/internal/dilithium.go b/sign/mldsa/mldsa44/internal/dilithium.go new file mode 100644 index 000000000..7869d0475 --- /dev/null +++ b/sign/mldsa/mldsa44/internal/dilithium.go @@ -0,0 +1,482 @@ +// Code generated from mode3/internal/dilithium.go by gen.go + +package internal + +import ( + cryptoRand "crypto/rand" + "crypto/subtle" + "io" + + "github.com/cloudflare/circl/internal/sha3" + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +const ( + // Size of a packed polynomial of norm ≤η. + // (Note that the formula is not valid in general.) + PolyLeqEtaSize = (common.N * DoubleEtaBits) / 8 + + // β = τη, the maximum size of c s₂. + Beta = Tau * Eta + + // γ₁ range of y + Gamma1 = 1 << Gamma1Bits + + // Size of packed polynomial of norm <γ₁ such as z + PolyLeGamma1Size = (Gamma1Bits + 1) * common.N / 8 + + // α = 2γ₂ parameter for decompose + Alpha = 2 * Gamma2 + + // Size of a packed private key + 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 + CTildeSize + + // Size of packed w₁ + PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 +) + +// PublicKey is the type of Dilithium public keys. +type PublicKey struct { + rho [32]byte + t1 VecK + + // Cached values + t1p [common.PolyT1Size * K]byte + A *Mat + tr *[TRSize]byte +} + +// PrivateKey is the type of Dilithium private keys. +type PrivateKey struct { + rho [32]byte + key [32]byte + s1 VecL + s2 VecK + t0 VecK + tr [TRSize]byte + + // Cached values + A Mat // ExpandA(ρ) + s1h VecL // NTT(s₁) + s2h VecK // NTT(s₂) + t0h VecK // NTT(t₀) +} + +type unpackedSignature struct { + z VecL + hint VecK + c [CTildeSize]byte +} + +// Packs the signature into buf. +func (sig *unpackedSignature) Pack(buf []byte) { + copy(buf[:], sig.c[:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) +} + +// Sets sig to the signature encoded in the buffer. +// +// Returns whether buf contains a properly packed signature. +func (sig *unpackedSignature) Unpack(buf []byte) bool { + if len(buf) < SignatureSize { + return false + } + copy(sig.c[:], buf[:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) + if sig.z.Exceeds(Gamma1 - Beta) { + return false + } + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { + return false + } + return true +} + +// Packs the public key into buf. +func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { + copy(buf[:32], pk.rho[:]) + copy(buf[32:], pk.t1p[:]) +} + +// Sets pk to the public key encoded in buf. +func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { + copy(pk.rho[:], buf[:32]) + copy(pk.t1p[:], buf[32:]) + + pk.t1.UnpackT1(pk.t1p[:]) + pk.A = new(Mat) + pk.A.Derive(&pk.rho) + + // tr = CRH(ρ ‖ t1) = CRH(pk) + pk.tr = new([TRSize]byte) + h := sha3.NewShake256() + _, _ = h.Write(buf[:]) + _, _ = h.Read(pk.tr[:]) +} + +// Packs the private key into buf. +func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { + copy(buf[:32], sk.rho[:]) + copy(buf[32:64], sk.key[:]) + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize + sk.s1.PackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * L + sk.s2.PackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * K + sk.t0.PackT0(buf[offset:]) +} + +// Sets sk to the private key encoded in buf. +func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { + copy(sk.rho[:], buf[:32]) + copy(sk.key[:], buf[32:64]) + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize + sk.s1.UnpackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * L + sk.s2.UnpackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * K + sk.t0.UnpackT0(buf[offset:]) + + // Cached values + sk.A.Derive(&sk.rho) + sk.t0h = sk.t0 + sk.t0h.NTT() + sk.s1h = sk.s1 + sk.s1h.NTT() + sk.s2h = sk.s2 + sk.s2h.NTT() +} + +// 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) { + var seed [32]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 +} + +// NewKeyFromSeed derives a public/private key pair using the given seed. +func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { + var eSeed [128]byte // expanded seed + var pk PublicKey + var sk PrivateKey + var sSeed [64]byte + + h := sha3.NewShake256() + _, _ = h.Write(seed[:]) + _, _ = h.Read(eSeed[:]) + + copy(pk.rho[:], eSeed[:32]) + copy(sSeed[:], eSeed[32:96]) + copy(sk.key[:], eSeed[96:]) + copy(sk.rho[:], pk.rho[:]) + + sk.A.Derive(&pk.rho) + + for i := uint16(0); i < L; i++ { + PolyDeriveUniformLeqEta(&sk.s1[i], &sSeed, i) + } + + for i := uint16(0); i < K; i++ { + PolyDeriveUniformLeqEta(&sk.s2[i], &sSeed, i+L) + } + + sk.s1h = sk.s1 + sk.s1h.NTT() + sk.s2h = sk.s2 + sk.s2h.NTT() + + sk.computeT0andT1(&sk.t0, &pk.t1) + + sk.t0h = sk.t0 + sk.t0h.NTT() + + // Complete public key far enough to be packed + pk.t1.PackT1(pk.t1p[:]) + pk.A = &sk.A + + // Finish private key + var packedPk [PublicKeySize]byte + pk.Pack(&packedPk) + + // tr = CRH(ρ ‖ t1) = CRH(pk) + h.Reset() + _, _ = h.Write(packedPk[:]) + _, _ = h.Read(sk.tr[:]) + + // Finish cache of public key + pk.tr = &sk.tr + + return &pk, &sk +} + +// Computes t0 and t1 from sk.s1h, sk.s2 and sk.A. +func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { + var t VecK + + // Set t to A s₁ + s₂ + for i := 0; i < K; i++ { + PolyDotHat(&t[i], &sk.A[i], &sk.s1h) + t[i].ReduceLe2Q() + t[i].InvNTT() + } + t.Add(&t, &sk.s2) + t.Normalize() + + // Compute t₀, t₁ = Power2Round(t) + t.Power2Round(t0, t1) +} + +// Verify checks whether the given signature by pk on msg is valid. +func Verify(pk *PublicKey, msg []byte, signature []byte) bool { + var sig unpackedSignature + var mu [64]byte + var zh VecL + var Az, Az2dct1, w1 VecK + var ch common.Poly + var cp [CTildeSize]byte + var w1Packed [PolyW1Size * K]byte + + // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β + // and ensured that there at most ω ones in pk.hint. + if !sig.Unpack(signature) { + return false + } + + // μ = CRH(tr ‖ msg) + h := sha3.NewShake256() + _, _ = h.Write(pk.tr[:]) + _, _ = h.Write(msg) + _, _ = h.Read(mu[:]) + + // Compute Az + zh = sig.z + zh.NTT() + + for i := 0; i < K; i++ { + PolyDotHat(&Az[i], &pk.A[i], &zh) + } + + // Next, we compute Az - 2ᵈ·c·t₁. + // Note that the coefficients of t₁ are bounded by 256 = 2⁹, + // so the coefficients of Az2dct1 will bounded by 2⁹⁺ᵈ = 2²³ < 2q, + // which is small enough for NTT(). + Az2dct1.MulBy2toD(&pk.t1) + Az2dct1.NTT() + PolyDeriveUniformBall(&ch, sig.c[:32]) + ch.NTT() + for i := 0; i < K; i++ { + Az2dct1[i].MulHat(&Az2dct1[i], &ch) + } + Az2dct1.Sub(&Az, &Az2dct1) + Az2dct1.ReduceLe2Q() + Az2dct1.InvNTT() + Az2dct1.NormalizeAssumingLe2Q() + + // UseHint(pk.hint, Az - 2ᵈ·c·t₁) + // = UseHint(pk.hint, w - c·s₂ + c·t₀) + // = UseHint(pk.hint, r + c·t₀) + // = r₁ = w₁. + w1.UseHint(&Az2dct1, &sig.hint) + w1.PackW1(w1Packed[:]) + + // c' = H(μ, w₁) + h.Reset() + _, _ = h.Write(mu[:]) + _, _ = h.Write(w1Packed[:]) + _, _ = h.Read(cp[:]) + + return sig.c == cp +} + +// SignTo signs the given message and writes the signature into signature. +// +//nolint:funlen +func SignTo(sk *PrivateKey, msg []byte, signature []byte) { + var mu, rhop [64]byte + var w1Packed [PolyW1Size * K]byte + var y, yh VecL + var w, w0, w1, w0mcs2, ct0, w0mcs2pct0 VecK + var ch common.Poly + var yNonce uint16 + var sig unpackedSignature + + if len(signature) < SignatureSize { + panic("Signature does not fit in that byteslice") + } + + // μ = CRH(tr ‖ msg) + h := sha3.NewShake256() + _, _ = h.Write(sk.tr[:]) + _, _ = h.Write(msg) + _, _ = h.Read(mu[:]) + + // ρ' = CRH(key ‖ μ) + h.Reset() + _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } + _, _ = h.Write(mu[:]) + _, _ = h.Read(rhop[:]) + + // Main rejection loop + attempt := 0 + for { + attempt++ + if attempt >= 576 { + // Depending on the mode, one try has a chance between 1/7 and 1/4 + // of succeeding. Thus it is safe to say that 576 iterations + // are enough as (6/7)⁵⁷⁶ < 2⁻¹²⁸. + panic("This should only happen 1 in 2^{128}: something is wrong.") + } + + // y = ExpandMask(ρ', key) + VecLDeriveUniformLeGamma1(&y, &rhop, yNonce) + yNonce += uint16(L) + + // Set w to A y + yh = y + yh.NTT() + for i := 0; i < K; i++ { + PolyDotHat(&w[i], &sk.A[i], &yh) + w[i].ReduceLe2Q() + w[i].InvNTT() + } + + // Decompose w into w₀ and w₁ + w.NormalizeAssumingLe2Q() + w.Decompose(&w0, &w1) + + // c~ = H(μ ‖ w₁) + w1.PackW1(w1Packed[:]) + h.Reset() + _, _ = h.Write(mu[:]) + _, _ = h.Write(w1Packed[:]) + _, _ = h.Read(sig.c[:]) + + PolyDeriveUniformBall(&ch, sig.c[:32]) + ch.NTT() + + // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. + // + // By Lemma 3 of the specification this is equivalent to checking that + // both ‖ r₀ ‖_∞ < γ₂ - β and r₁ = w₁, for the decomposition + // w - c·s₂ = r₁ α + r₀ as computed by decompose(). + // See also §4.1 of the specification. + for i := 0; i < K; i++ { + w0mcs2[i].MulHat(&ch, &sk.s2h[i]) + w0mcs2[i].InvNTT() + } + w0mcs2.Sub(&w0, &w0mcs2) + w0mcs2.Normalize() + + if w0mcs2.Exceeds(Gamma2 - Beta) { + continue + } + + // z = y + c·s₁ + for i := 0; i < L; i++ { + sig.z[i].MulHat(&ch, &sk.s1h[i]) + sig.z[i].InvNTT() + } + sig.z.Add(&sig.z, &y) + sig.z.Normalize() + + // Ensure ‖z‖_∞ < γ₁ - β + if sig.z.Exceeds(Gamma1 - Beta) { + continue + } + + // Compute c·t₀ + for i := 0; i < K; i++ { + ct0[i].MulHat(&ch, &sk.t0h[i]) + ct0[i].InvNTT() + } + ct0.NormalizeAssumingLe2Q() + + // Ensure ‖c·t₀‖_∞ < γ₂. + if ct0.Exceeds(Gamma2) { + continue + } + + // Create the hint to be able to reconstruct w₁ from w - c·s₂ + c·t0. + // Note that we're not using makeHint() in the obvious way as we + // do not know whether ‖ sc·s₂ - c·t₀ ‖_∞ < γ₂. Instead we note + // that our makeHint() is actually the same as a makeHint for a + // different decomposition: + // + // Earlier we ensured indirectly with a check that r₁ = w₁ where + // r = w - c·s₂. Hence r₀ = r - r₁ α = w - c·s₂ - w₁ α = w₀ - c·s₂. + // Thus MakeHint(w₀ - c·s₂ + c·t₀, w₁) = MakeHint(r0 + c·t₀, r₁) + // and UseHint(w - c·s₂ + c·t₀, w₁) = UseHint(r + c·t₀, r₁). + // As we just ensured that ‖ c·t₀ ‖_∞ < γ₂ our usage is correct. + w0mcs2pct0.Add(&w0mcs2, &ct0) + w0mcs2pct0.NormalizeAssumingLe2Q() + hintPop := sig.hint.MakeHint(&w0mcs2pct0, &w1) + if hintPop > Omega { + continue + } + + break + } + + sig.Pack(signature[:]) +} + +// Computes the public key corresponding to this private key. +func (sk *PrivateKey) Public() *PublicKey { + var t0 VecK + pk := &PublicKey{ + rho: sk.rho, + A: &sk.A, + tr: &sk.tr, + } + sk.computeT0andT1(&t0, &pk.t1) + pk.t1.PackT1(pk.t1p[:]) + return pk +} + +// Equal returns whether the two public keys are equal +func (pk *PublicKey) Equal(other *PublicKey) bool { + return pk.rho == other.rho && pk.t1 == other.t1 +} + +// Equal returns whether the two private keys are equal +func (sk *PrivateKey) Equal(other *PrivateKey) bool { + ret := (subtle.ConstantTimeCompare(sk.rho[:], other.rho[:]) & + subtle.ConstantTimeCompare(sk.key[:], other.key[:]) & + subtle.ConstantTimeCompare(sk.tr[:], other.tr[:])) + + acc := uint32(0) + for i := 0; i < L; i++ { + for j := 0; j < common.N; j++ { + acc |= sk.s1[i][j] ^ other.s1[i][j] + } + } + for i := 0; i < K; i++ { + for j := 0; j < common.N; j++ { + acc |= sk.s2[i][j] ^ other.s2[i][j] + acc |= sk.t0[i][j] ^ other.t0[i][j] + } + } + return (ret & subtle.ConstantTimeEq(int32(acc), 0)) == 1 +} diff --git a/sign/mldsa/mldsa44/internal/dilithium_test.go b/sign/mldsa/mldsa44/internal/dilithium_test.go new file mode 100644 index 000000000..825e7da08 --- /dev/null +++ b/sign/mldsa/mldsa44/internal/dilithium_test.go @@ -0,0 +1,144 @@ +// Code generated from mode3/internal/dilithium_test.go by gen.go + +package internal + +import ( + "encoding/binary" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Checks whether p is normalized. Only used in tests. +func PolyNormalized(p *common.Poly) bool { + p2 := *p + p2.Normalize() + return p2 == *p +} + +func BenchmarkSkUnpack(b *testing.B) { + var buf [PrivateKeySize]byte + var sk PrivateKey + for i := 0; i < b.N; i++ { + sk.Unpack(&buf) + } +} + +func BenchmarkPkUnpack(b *testing.B) { + var buf [PublicKeySize]byte + var pk PublicKey + for i := 0; i < b.N; i++ { + pk.Unpack(&buf) + } +} + +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 + pk, sk := NewKeyFromSeed(&seed) + SignTo(sk, msg[:], 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[:]) + } +} + +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 + _, sk := NewKeyFromSeed(&seed) + b.ResetTimer() + for i := 0; i < b.N; i++ { + binary.LittleEndian.PutUint64(msg[:], uint64(i)) + SignTo(sk, msg[:], sig[:]) + } +} + +func BenchmarkGenerateKey(b *testing.B) { + var seed [32]byte + for i := 0; i < b.N; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + NewKeyFromSeed(&seed) + } +} + +func BenchmarkPublicFromPrivate(b *testing.B) { + var seed [32]byte + for i := 0; i < b.N; i++ { + b.StopTimer() + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + _, sk := NewKeyFromSeed(&seed) + b.StartTimer() + sk.Public() + } +} + +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 + for i := uint64(0); i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], i) + pk, sk := NewKeyFromSeed(&seed) + if !sk.Equal(sk) { + t.Fatal() + } + for j := uint64(0); j < 10; j++ { + binary.LittleEndian.PutUint64(msg[:], j) + SignTo(sk, msg[:], sig[:]) + if !Verify(pk, msg[:], sig[:]) { + t.Fatal() + } + } + pk.Pack(&pkb) + pk2.Unpack(&pkb) + if !pk.Equal(&pk2) { + t.Fatal() + } + sk.Pack(&skb) + sk2.Unpack(&skb) + if !sk.Equal(&sk2) { + t.Fatal() + } + } +} + +func TestPublicFromPrivate(t *testing.T) { + var seed [common.SeedSize]byte + for i := uint64(0); i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], i) + pk, sk := NewKeyFromSeed(&seed) + pk2 := sk.Public() + if !pk.Equal(pk2) { + t.Fatal() + } + } +} + +func TestGamma1Size(t *testing.T) { + var expected int + switch Gamma1Bits { + case 17: + expected = 576 + case 19: + expected = 640 + } + if expected != PolyLeGamma1Size { + t.Fatal() + } +} diff --git a/sign/mldsa/mldsa44/internal/mat.go b/sign/mldsa/mldsa44/internal/mat.go new file mode 100644 index 000000000..ceaf634fa --- /dev/null +++ b/sign/mldsa/mldsa44/internal/mat.go @@ -0,0 +1,59 @@ +// Code generated from mode3/internal/mat.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// A k by l matrix of polynomials. +type Mat [K]VecL + +// Expands the given seed to a complete matrix. +// +// This function is called ExpandA in the specification. +func (m *Mat) Derive(seed *[32]byte) { + if !DeriveX4Available { + for i := uint16(0); i < K; i++ { + for j := uint16(0); j < L; j++ { + PolyDeriveUniform(&m[i][j], seed, (i<<8)+j) + } + } + return + } + + idx := 0 + var nonces [4]uint16 + var ps [4]*common.Poly + for i := uint16(0); i < K; i++ { + for j := uint16(0); j < L; j++ { + nonces[idx] = (i << 8) + j + ps[idx] = &m[i][j] + idx++ + if idx == 4 { + idx = 0 + PolyDeriveUniformX4(ps, seed, nonces) + } + } + } + if idx != 0 { + for i := idx; i < 4; i++ { + ps[i] = nil + } + PolyDeriveUniformX4(ps, seed, nonces) + } +} + +// Set p to the inner product of a and b using pointwise multiplication. +// +// Assumes a and b are in Montgomery form and their coefficients are +// pairwise sufficiently small to multiply, see Poly.MulHat(). Resulting +// coefficients are bounded by 2Lq. +func PolyDotHat(p *common.Poly, a, b *VecL) { + var t common.Poly + *p = common.Poly{} // zero p + for i := 0; i < L; i++ { + t.MulHat(&a[i], &b[i]) + p.Add(&t, p) + } +} diff --git a/sign/mldsa/mldsa44/internal/pack.go b/sign/mldsa/mldsa44/internal/pack.go new file mode 100644 index 000000000..1854b4197 --- /dev/null +++ b/sign/mldsa/mldsa44/internal/pack.go @@ -0,0 +1,270 @@ +// Code generated from mode3/internal/pack.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Writes p with norm less than or equal η into buf, which must be of +// size PolyLeqEtaSize. +// +// Assumes coefficients of p are not normalized, but in [q-η,q+η]. +func PolyPackLeqEta(p *common.Poly, buf []byte) { + if DoubleEtaBits == 4 { // compiler eliminates branch + j := 0 + for i := 0; i < PolyLeqEtaSize; i++ { + buf[i] = (byte(common.Q+Eta-p[j]) | + byte(common.Q+Eta-p[j+1])<<4) + j += 2 + } + } else if DoubleEtaBits == 3 { + j := 0 + for i := 0; i < PolyLeqEtaSize; i += 3 { + buf[i] = (byte(common.Q+Eta-p[j]) | + (byte(common.Q+Eta-p[j+1]) << 3) | + (byte(common.Q+Eta-p[j+2]) << 6)) + buf[i+1] = ((byte(common.Q+Eta-p[j+2]) >> 2) | + (byte(common.Q+Eta-p[j+3]) << 1) | + (byte(common.Q+Eta-p[j+4]) << 4) | + (byte(common.Q+Eta-p[j+5]) << 7)) + buf[i+2] = ((byte(common.Q+Eta-p[j+5]) >> 1) | + (byte(common.Q+Eta-p[j+6]) << 2) | + (byte(common.Q+Eta-p[j+7]) << 5)) + j += 8 + } + } else { + panic("eta not supported") + } +} + +// Sets p to the polynomial of norm less than or equal η encoded in the +// given buffer of size PolyLeqEtaSize. +// +// Output coefficients of p are not normalized, but in [q-η,q+η] provided +// buf was created using PackLeqEta. +// +// Beware, for arbitrary buf the coefficients of p might end up in +// the interval [q-2^b,q+2^b] where b is the least b with η≤2^b. +func PolyUnpackLeqEta(p *common.Poly, buf []byte) { + if DoubleEtaBits == 4 { // compiler eliminates branch + j := 0 + for i := 0; i < PolyLeqEtaSize; i++ { + p[j] = common.Q + Eta - uint32(buf[i]&15) + p[j+1] = common.Q + Eta - uint32(buf[i]>>4) + j += 2 + } + } else if DoubleEtaBits == 3 { + j := 0 + for i := 0; i < PolyLeqEtaSize; i += 3 { + p[j] = common.Q + Eta - uint32(buf[i]&7) + p[j+1] = common.Q + Eta - uint32((buf[i]>>3)&7) + p[j+2] = common.Q + Eta - uint32((buf[i]>>6)|((buf[i+1]<<2)&7)) + p[j+3] = common.Q + Eta - uint32((buf[i+1]>>1)&7) + p[j+4] = common.Q + Eta - uint32((buf[i+1]>>4)&7) + p[j+5] = common.Q + Eta - uint32((buf[i+1]>>7)|((buf[i+2]<<1)&7)) + p[j+6] = common.Q + Eta - uint32((buf[i+2]>>2)&7) + p[j+7] = common.Q + Eta - uint32((buf[i+2]>>5)&7) + j += 8 + } + } else { + panic("eta not supported") + } +} + +// Writes v with coefficients in {0, 1} of which at most ω non-zero +// to buf, which must have length ω+k. +func (v *VecK) PackHint(buf []byte) { + // The packed hint starts with the indices of the non-zero coefficients + // For instance: + // + // (x⁵⁶ + x¹⁰⁰, x²⁵⁵, 0, x² + x²³, x¹) + // + // Yields + // + // 56, 100, 255, 2, 23, 1 + // + // Then we pad with zeroes until we have a list of ω items: + // // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0 + // + // Then we finish with a list of the switch-over-indices in this + // list between polynomials, so: + // + // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0, 2, 3, 3, 5, 6 + + off := uint8(0) + for i := 0; i < K; i++ { + for j := uint16(0); j < common.N; j++ { + if v[i][j] != 0 { + buf[off] = uint8(j) + off++ + } + } + buf[Omega+i] = off + } + for ; off < Omega; off++ { + buf[off] = 0 + } +} + +// Sets v to the vector encoded using VecK.PackHint() +// +// Returns whether unpacking was successful. +func (v *VecK) UnpackHint(buf []byte) bool { + // A priori, there would be several reasonable ways to encode the same + // hint vector. We take care to only allow only one encoding, to ensure + // "strong unforgeability". + // + // See PackHint() source for description of the encoding. + *v = VecK{} // zero v + prevSOP := uint8(0) // previous switch-over-point + for i := 0; i < K; i++ { + SOP := buf[Omega+i] + if SOP < prevSOP || SOP > Omega { + return false // ensures switch-over-points are increasing + } + for j := prevSOP; j < SOP; j++ { + if j > prevSOP && buf[j] <= buf[j-1] { + return false // ensures indices are increasing (within a poly) + } + v[i][buf[j]] = 1 + } + prevSOP = SOP + } + for j := prevSOP; j < Omega; j++ { + if buf[j] != 0 { + return false // ensures padding indices are zero + } + } + + return true +} + +// Sets p to the polynomial packed into buf by PolyPackLeGamma1. +// +// p will be normalized. +func PolyUnpackLeGamma1(p *common.Poly, buf []byte) { + if Gamma1Bits == 17 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 9 { + p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | + (uint32(buf[i+2]&0x3) << 16) + p1 := uint32(buf[i+2]>>2) | (uint32(buf[i+3]) << 6) | + (uint32(buf[i+4]&0xf) << 14) + p2 := uint32(buf[i+4]>>4) | (uint32(buf[i+5]) << 4) | + (uint32(buf[i+6]&0x3f) << 12) + p3 := uint32(buf[i+6]>>6) | (uint32(buf[i+7]) << 2) | + (uint32(buf[i+8]) << 10) + + // coefficients in [0,…,2γ₁) + p0 = Gamma1 - p0 // (-γ₁,…,γ₁] + p1 = Gamma1 - p1 + p2 = Gamma1 - p2 + p3 = Gamma1 - p3 + + p0 += uint32(int32(p0)>>31) & common.Q // normalize + p1 += uint32(int32(p1)>>31) & common.Q + p2 += uint32(int32(p2)>>31) & common.Q + p3 += uint32(int32(p3)>>31) & common.Q + + p[j] = p0 + p[j+1] = p1 + p[j+2] = p2 + p[j+3] = p3 + + j += 4 + } + } else if Gamma1Bits == 19 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 5 { + p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | + (uint32(buf[i+2]&0xf) << 16) + p1 := uint32(buf[i+2]>>4) | (uint32(buf[i+3]) << 4) | + (uint32(buf[i+4]) << 12) + + p0 = Gamma1 - p0 + p1 = Gamma1 - p1 + + p0 += uint32(int32(p0)>>31) & common.Q + p1 += uint32(int32(p1)>>31) & common.Q + + p[j] = p0 + p[j+1] = p1 + + j += 2 + } + } else { + panic("γ₁ not supported") + } +} + +// Writes p whose coefficients are in (-γ₁,γ₁] into buf +// which has to be of length PolyLeGamma1Size. +// +// Assumes p is normalized. +func PolyPackLeGamma1(p *common.Poly, buf []byte) { + if Gamma1Bits == 17 { + j := 0 + // coefficients in [0,…,γ₁] ∪ (q-γ₁,…,q) + for i := 0; i < PolyLeGamma1Size; i += 9 { + p0 := Gamma1 - p[j] // [0,…,γ₁] ∪ (γ₁-q,…,2γ₁-q) + p0 += uint32(int32(p0)>>31) & common.Q // [0,…,2γ₁) + p1 := Gamma1 - p[j+1] + p1 += uint32(int32(p1)>>31) & common.Q + p2 := Gamma1 - p[j+2] + p2 += uint32(int32(p2)>>31) & common.Q + p3 := Gamma1 - p[j+3] + p3 += uint32(int32(p3)>>31) & common.Q + + buf[i+0] = byte(p0) + buf[i+1] = byte(p0 >> 8) + buf[i+2] = byte(p0>>16) | byte(p1<<2) + buf[i+3] = byte(p1 >> 6) + buf[i+4] = byte(p1>>14) | byte(p2<<4) + buf[i+5] = byte(p2 >> 4) + buf[i+6] = byte(p2>>12) | byte(p3<<6) + buf[i+7] = byte(p3 >> 2) + buf[i+8] = byte(p3 >> 10) + + j += 4 + } + } else if Gamma1Bits == 19 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 5 { + // Coefficients are in [0, γ₁] ∪ (Q-γ₁, Q) + p0 := Gamma1 - p[j] + p0 += uint32(int32(p0)>>31) & common.Q + p1 := Gamma1 - p[j+1] + p1 += uint32(int32(p1)>>31) & common.Q + + buf[i+0] = byte(p0) + buf[i+1] = byte(p0 >> 8) + buf[i+2] = byte(p0>>16) | byte(p1<<4) + buf[i+3] = byte(p1 >> 4) + buf[i+4] = byte(p1 >> 12) + + j += 2 + } + } else { + panic("γ₁ not supported") + } +} + +// Pack w₁ into buf, which must be of length PolyW1Size. +// +// Assumes w₁ is normalized. +func PolyPackW1(p *common.Poly, buf []byte) { + if Gamma1Bits == 19 { + p.PackLe16(buf) + } else if Gamma1Bits == 17 { + j := 0 + for i := 0; i < PolyW1Size; i += 3 { + buf[i] = byte(p[j]) | byte(p[j+1]<<6) + buf[i+1] = byte(p[j+1]>>2) | byte(p[j+2]<<4) + buf[i+2] = byte(p[j+2]>>4) | byte(p[j+3]<<2) + j += 4 + } + } else { + panic("unsupported γ₁") + } +} diff --git a/sign/mldsa/mldsa44/internal/pack_test.go b/sign/mldsa/mldsa44/internal/pack_test.go new file mode 100644 index 000000000..f952c6a09 --- /dev/null +++ b/sign/mldsa/mldsa44/internal/pack_test.go @@ -0,0 +1,93 @@ +// Code generated from mode3/internal/pack_test.go by gen.go + +package internal + +import ( + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +func TestPolyPackLeqEta(t *testing.T) { + var p1, p2 common.Poly + var seed [64]byte + var buf [PolyLeqEtaSize]byte + + for i := uint16(0); i < 100; i++ { + // Note that DeriveUniformLeqEta sets p to the right kind of + // unnormalized vector. + PolyDeriveUniformLeqEta(&p1, &seed, i) + for j := 0; j < PolyLeqEtaSize; j++ { + if p1[j] < common.Q-Eta || p1[j] > common.Q+Eta { + t.Fatalf("DerveUniformLeqEta out of bounds") + } + } + PolyPackLeqEta(&p1, buf[:]) + PolyUnpackLeqEta(&p2, buf[:]) + if p1 != p2 { + t.Fatalf("%v != %v", p1, p2) + } + } +} + +func TestPolyPackT1(t *testing.T) { + var p1, p2 common.Poly + var seed [32]byte + var buf [common.PolyT1Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniform(&p1, &seed, i) + p1.Normalize() + for j := 0; j < common.N; j++ { + p1[j] &= 0x1ff + } + p1.PackT1(buf[:]) + p2.UnpackT1(buf[:]) + if p1 != p2 { + t.Fatalf("%v != %v", p1, p2) + } + } +} + +func TestPolyPackT0(t *testing.T) { + var p, p0, p1, p2 common.Poly + var seed [32]byte + var buf [common.PolyT0Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniform(&p, &seed, i) + p.Normalize() + p.Power2Round(&p0, &p1) + + p0.PackT0(buf[:]) + p2.UnpackT0(buf[:]) + if p0 != p2 { + t.Fatalf("%v !=\n%v", p0, p2) + } + } +} + +func BenchmarkUnpackLeGamma1(b *testing.B) { + var p common.Poly + var buf [PolyLeGamma1Size]byte + for i := 0; i < b.N; i++ { + PolyUnpackLeGamma1(&p, buf[:]) + } +} + +func TestPolyPackLeGamma1(t *testing.T) { + var p0, p1 common.Poly + var seed [64]byte + var buf [PolyLeGamma1Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniformLeGamma1(&p0, &seed, i) + p0.Normalize() + + PolyPackLeGamma1(&p0, buf[:]) + PolyUnpackLeGamma1(&p1, buf[:]) + if p0 != p1 { + t.Fatalf("%v != %v", p0, p1) + } + } +} diff --git a/sign/mldsa/mldsa44/internal/params.go b/sign/mldsa/mldsa44/internal/params.go new file mode 100644 index 000000000..fec07cbbe --- /dev/null +++ b/sign/mldsa/mldsa44/internal/params.go @@ -0,0 +1,19 @@ +// Code generated from params.templ.go. DO NOT EDIT. + +package internal + +const ( + Name = "ML-DSA-44" + UseAES = false + K = 4 + L = 4 + Eta = 2 + DoubleEtaBits = 3 + Omega = 80 + Tau = 39 + Gamma1Bits = 17 + Gamma2 = 95232 + NIST = true + TRSize = 64 + CTildeSize = 32 +) diff --git a/sign/mldsa/mldsa44/internal/rounding.go b/sign/mldsa/mldsa44/internal/rounding.go new file mode 100644 index 000000000..58123c090 --- /dev/null +++ b/sign/mldsa/mldsa44/internal/rounding.go @@ -0,0 +1,142 @@ +// Code generated from mode3/internal/rounding.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, +// except for when we would have a₁ = (q-1)/α in which case a₁=0 is taken +// and -α/2 ≤ a₀ < 0. Returns a₀ + q. Note 0 ≤ a₁ < (q-1)/α. +// Recall α = 2γ₂. +func decompose(a uint32) (a0plusQ, a1 uint32) { + // a₁ = ⌈a / 128⌉ + a1 = (a + 127) >> 7 + + if Alpha == 523776 { + // 1025/2²² is close enough to 1/4092 so that a₁ + // becomes a/α rounded down. + a1 = ((a1*1025 + (1 << 21)) >> 22) + + // For the corner-case a₁ = (q-1)/α = 16, we have to set a₁=0. + a1 &= 15 + } else if Alpha == 190464 { + // 1488/2²⁴ is close enough to 1/1488 so that a₁ + // becomes a/α rounded down. + a1 = ((a1 * 11275) + (1 << 23)) >> 24 + + // For the corner-case a₁ = (q-1)/α = 44, we have to set a₁=0. + a1 ^= uint32(int32(43-a1)>>31) & a1 + } else { + panic("unsupported α") + } + + a0plusQ = a - a1*Alpha + + // In the corner-case, when we set a₁=0, we will incorrectly + // have a₀ > (q-1)/2 and we'll need to subtract q. As we + // return a₀ + q, that comes down to adding q if a₀ < (q-1)/2. + a0plusQ += uint32(int32(a0plusQ-(common.Q-1)/2)>>31) & common.Q + + return +} + +// Assume 0 ≤ r, f < Q with ‖f‖_∞ ≤ α/2. Decompose r as r = r1*α + r0 as +// computed by decompose(). Write r' := r - f (mod Q). Now, decompose +// r'=r-f again as r' = r'1*α + r'0 using decompose(). As f is small, we +// have r'1 = r1 + h, where h ∈ {-1, 0, 1}. makeHint() computes |h| +// given z0 := r0 - f (mod Q) and r1. With |h|, which is called the hint, +// we can reconstruct r1 using only r' = r - f, which is done by useHint(). +// To wit: +// +// useHint( r - f, makeHint( r0 - f, r1 ) ) = r1. +// +// Assumes 0 ≤ z0 < Q. +func makeHint(z0, r1 uint32) uint32 { + // If -α/2 < r0 - f ≤ α/2, then r1*α + r0 - f is a valid decomposition of r' + // with the restrictions of decompose() and so r'1 = r1. So the hint + // should be 0. This is covered by the first two inequalities. + // There is one other case: if r0 - f = -α/2, then r1*α + r0 - f is also + // a valid decomposition if r1 = 0. In the other cases a one is carried + // and the hint should be 1. + if z0 <= Gamma2 || z0 > common.Q-Gamma2 || (z0 == common.Q-Gamma2 && r1 == 0) { + return 0 + } + return 1 +} + +// Uses the hint created by makeHint() to reconstruct r1 from r'=r-f; see +// documentation of makeHint() for context. +// Assumes 0 ≤ r' < Q. +func useHint(rp uint32, hint uint32) uint32 { + rp0plusQ, rp1 := decompose(rp) + if hint == 0 { + return rp1 + } + if rp0plusQ > common.Q { + return (rp1 + 1) & 15 + } + return (rp1 - 1) & 15 +} + +// Sets p to the hint polynomial for p0 the modified low bits and p1 +// the unmodified high bits --- see makeHint(). +// +// Returns the number of ones in the hint polynomial. +func PolyMakeHint(p, p0, p1 *common.Poly) (pop uint32) { + for i := 0; i < common.N; i++ { + h := makeHint(p0[i], p1[i]) + pop += h + p[i] = h + } + return +} + +// Computes corrections to the high bits of the polynomial q according +// to the hints in h and sets p to the corrected high bits. Returns p. +func PolyUseHint(p, q, hint *common.Poly) { + var q0PlusQ common.Poly + + // See useHint() and makeHint() for an explanation. We reimplement it + // here so that we can call Poly.Decompose(), which might be way faster + // than calling decompose() in a loop (for instance when having AVX2.) + + PolyDecompose(q, &q0PlusQ, p) + + for i := 0; i < common.N; i++ { + if hint[i] == 0 { + continue + } + if Gamma2 == 261888 { + if q0PlusQ[i] > common.Q { + p[i] = (p[i] + 1) & 15 + } else { + p[i] = (p[i] - 1) & 15 + } + } else if Gamma2 == 95232 { + if q0PlusQ[i] > common.Q { + if p[i] == 43 { + p[i] = 0 + } else { + p[i]++ + } + } else { + if p[i] == 0 { + p[i] = 43 + } else { + p[i]-- + } + } + } else { + panic("unsupported γ₂") + } + } +} + +// Splits each of the coefficients of p using decompose. +func PolyDecompose(p, p0PlusQ, p1 *common.Poly) { + for i := 0; i < common.N; i++ { + p0PlusQ[i], p1[i] = decompose(p[i]) + } +} diff --git a/sign/mldsa/mldsa44/internal/rounding_test.go b/sign/mldsa/mldsa44/internal/rounding_test.go new file mode 100644 index 000000000..ad653ca3f --- /dev/null +++ b/sign/mldsa/mldsa44/internal/rounding_test.go @@ -0,0 +1,81 @@ +// Code generated from mode3/internal/rounding_test.go by gen.go + +package internal + +import ( + "flag" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") + +func TestDecompose(t *testing.T) { + for a := uint32(0); a < common.Q; a++ { + a0PlusQ, a1 := decompose(a) + a0 := int32(a0PlusQ) - int32(common.Q) + recombined := a0 + int32(Alpha*a1) + if a1 == 0 && recombined < 0 { + recombined += common.Q + if -(Alpha/2) > a0 || a0 >= 0 { + t.Fatalf("decompose(%v): a0 out of bounds", a) + } + } else { + if (-(Alpha / 2) >= a0) || (a0 > Alpha/2) { + t.Fatalf("decompose(%v): a0 out of bounds", a) + } + } + if int32(a) != recombined { + t.Fatalf("decompose(%v) doesn't recombine %v %v", a, a0, a1) + } + } +} + +func TestMakeHint(t *testing.T) { + if !*runVeryLongTest { + t.SkipNow() + } + for w := uint32(0); w < common.Q; w++ { + w0, w1 := decompose(w) + for fn := uint32(0); fn <= Gamma2; fn++ { + fsign := false + for { + var f uint32 + if fsign { + if fn == 0 { + break + } + f = common.Q - fn + } else { + f = fn + } + + hint := makeHint(common.ReduceLe2Q(w0+common.Q-f), w1) + w1p := useHint(common.ReduceLe2Q(w+common.Q-f), hint) + if w1p != w1 { + t.Fatal() + } + + if fsign { + break + } + fsign = true + } + } + } +} + +func BenchmarkDecompose(b *testing.B) { + var p, p0, p1 common.Poly + for i := 0; i < b.N; i++ { + PolyDecompose(&p, &p0, &p1) + } +} + +func BenchmarkMakeHint(b *testing.B) { + var p, p0, p1 common.Poly + for i := 0; i < b.N; i++ { + PolyMakeHint(&p, &p0, &p1) + } +} diff --git a/sign/mldsa/mldsa44/internal/sample.go b/sign/mldsa/mldsa44/internal/sample.go new file mode 100644 index 000000000..62c261332 --- /dev/null +++ b/sign/mldsa/mldsa44/internal/sample.go @@ -0,0 +1,370 @@ +// Code generated from mode3/internal/sample.go by gen.go + +package internal + +import ( + "encoding/binary" + + "github.com/cloudflare/circl/internal/sha3" + 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 + +// 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. +// +// Can only be called when DeriveX4Available is true. +func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { + var perm keccakf1600.StateX4 + state := perm.Initialize(false) + + // Absorb the seed in the four states + for i := 0; i < 4; i++ { + v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) + for j := 0; j < 4; j++ { + state[i*4+j] = v + } + } + + // Absorb the nonces, the SHAKE128 domain separator (0b1111), the + // start of the padding (0b...001) and the end of the padding 0b100... + // Recall that the rate of SHAKE128 is 168 --- i.e. 21 uint64s. + for j := 0; j < 4; j++ { + state[4*4+j] = uint64(nonces[j]) | (0x1f << 16) + state[20*4+j] = 0x80 << 56 + } + + var idx [4]int // indices into ps + for j := 0; j < 4; j++ { + if ps[j] == nil { + idx[j] = common.N // mark nil polynomial as completed + } + } + + done := false + for !done { + // Applies KeccaK-f[1600] to state to get the next 21 uint64s of each + // of the four SHAKE128 streams. + perm.Permute() + + done = true + + PolyLoop: + for j := 0; j < 4; j++ { + if idx[j] == common.N { + continue + } + for i := 0; i < 7; i++ { + var t [8]uint32 + t[0] = uint32(state[i*3*4+j] & 0x7fffff) + t[1] = uint32((state[i*3*4+j] >> 24) & 0x7fffff) + t[2] = uint32((state[i*3*4+j] >> 48) | + ((state[(i*3+1)*4+j] & 0x7f) << 16)) + t[3] = uint32((state[(i*3+1)*4+j] >> 8) & 0x7fffff) + t[4] = uint32((state[(i*3+1)*4+j] >> 32) & 0x7fffff) + t[5] = uint32((state[(i*3+1)*4+j] >> 56) | + ((state[(i*3+2)*4+j] & 0x7fff) << 8)) + t[6] = uint32((state[(i*3+2)*4+j] >> 16) & 0x7fffff) + t[7] = uint32((state[(i*3+2)*4+j] >> 40) & 0x7fffff) + + for k := 0; k < 8; k++ { + if t[k] < common.Q { + ps[j][idx[j]] = t[k] + idx[j]++ + if idx[j] == common.N { + continue PolyLoop + } + } + } + } + done = false + } + } +} + +// Sample p uniformly from the given seed and nonce. +// +// 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 + + if UseAES { + length = 12 * 16 + } else { + length = 168 + } + + sample := func() { + // Note that 3 divides into 168 and 12*16, so we use up buf completely. + for j := 0; j < length && i < common.N; j += 3 { + t := (uint32(buf[j]) | (uint32(buf[j+1]) << 8) | + (uint32(buf[j+2]) << 16)) & 0x7fffff + + // We use rejection sampling + if t < common.Q { + p[i] = t + i++ + } + } + } + + if UseAES { + h := common.NewAesStream128(seed, nonce) + + 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() + } + } +} + +// Sample p uniformly with coefficients of norm less than or equal η, +// using the given seed and nonce. +// +// p will not be normalized, but will have coefficients in [q-η,q+η]. +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 + + if UseAES { + length = 9 * 16 + } else { + length = 136 + } + + sample := func() { + // We use rejection sampling + for j := 0; j < length && i < common.N; j++ { + t1 := uint32(buf[j]) & 15 + t2 := uint32(buf[j]) >> 4 + if Eta == 2 { // branch is eliminated by compiler + if t1 <= 14 { + t1 -= ((205 * t1) >> 10) * 5 // reduce mod 5 + p[i] = common.Q + Eta - t1 + i++ + } + if t2 <= 14 && i < common.N { + t2 -= ((205 * t2) >> 10) * 5 // reduce mod 5 + p[i] = common.Q + Eta - t2 + i++ + } + } else if Eta == 4 { + if t1 <= 2*Eta { + p[i] = common.Q + Eta - t1 + i++ + } + if t2 <= 2*Eta && i < common.N { + p[i] = common.Q + Eta - t2 + i++ + } + } else { + panic("unsupported η") + } + } + } + + 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 + + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) + + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() + } + } +} + +// Sample v[i] uniformly with coefficients in (-γ₁,…,γ₁] using the +// given seed and nonce+i +// +// p will be normalized. +func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { + for i := 0; i < L; i++ { + PolyDeriveUniformLeGamma1(&v[i], seed, nonce+uint16(i)) + } +} + +// Sample p uniformly with coefficients in (-γ₁,…,γK1s] using the +// given seed and nonce. +// +// p will be normalized. +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[:]) + } + + PolyUnpackLeGamma1(p, buf[:]) +} + +// For each i, sample ps[i] uniformly with τ non-zero coefficients in {q-1,1} +// using the given seed and w1[i]. ps[i] may be nil and is ignored +// in that case. ps[i] will be normalized. +// +// Can only be called when DeriveX4Available is true. +// +// This function is currently not used (yet). +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 < 32/8; i++ { + v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) + for j := 0; j < 4; j++ { + state[i*4+j] = v + } + } + + // SHAKE256 domain separator and padding + for j := 0; j < 4; j++ { + state[(32/8)*4+j] ^= 0x1f + state[16*4+j] ^= 0x80 << 56 + } + perm.Permute() + + var signs [4]uint64 + var idx [4]uint16 // indices into ps + + for j := 0; j < 4; j++ { + if ps[j] != nil { + signs[j] = state[j] + *ps[j] = common.Poly{} // zero ps[j] + idx[j] = common.N - Tau + } else { + idx[j] = common.N // mark as completed + } + } + + stateOffset := 1 + for { + done := true + + PolyLoop: + for j := 0; j < 4; j++ { + if idx[j] == common.N { + continue + } + + for i := stateOffset; i < 17; i++ { + var bs [8]byte + binary.LittleEndian.PutUint64(bs[:], state[4*i+j]) + for k := 0; k < 8; k++ { + b := uint16(bs[k]) + + if b > idx[j] { + continue + } + + ps[j][idx[j]] = ps[j][b] + ps[j][b] = 1 + // Takes least significant bit of signs and uses it for the sign. + // Note 1 ^ (1 | (Q-1)) = Q-1. + ps[j][b] ^= uint32((-(signs[j] & 1)) & (1 | (common.Q - 1))) + signs[j] >>= 1 + + idx[j]++ + if idx[j] == common.N { + continue PolyLoop + } + } + } + + done = false + } + + if done { + break + } + + perm.Permute() + stateOffset = 0 + } +} + +// Samples p uniformly with τ non-zero coefficients in {q-1,1}. +// +// The polynomial p will be normalized. +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { + var buf [136]byte // SHAKE-256 rate is 136 + + h := sha3.NewShake256() + _, _ = h.Write(seed[:]) + _, _ = h.Read(buf[:]) + + // Essentially we generate a sequence of τ ones or minus ones, + // prepend 196 zeroes and shuffle the concatenation using the + // usual algorithm (Fisher--Yates.) + signs := binary.LittleEndian.Uint64(buf[:]) + bufOff := 8 // offset into buf + + *p = common.Poly{} // zero p + for i := uint16(common.N - Tau); i < common.N; i++ { + var b uint16 + + // Find location of where to move the new coefficient to using + // rejection sampling. + for { + if bufOff >= 136 { + _, _ = h.Read(buf[:]) + bufOff = 0 + } + + b = uint16(buf[bufOff]) + bufOff++ + + if b <= i { + break + } + } + + p[i] = p[b] + p[b] = 1 + // Takes least significant bit of signs and uses it for the sign. + // Note 1 ^ (1 | (Q-1)) = Q-1. + p[b] ^= uint32((-(signs & 1)) & (1 | (common.Q - 1))) + signs >>= 1 + } +} diff --git a/sign/mldsa/mldsa44/internal/sample_test.go b/sign/mldsa/mldsa44/internal/sample_test.go new file mode 100644 index 000000000..2059599eb --- /dev/null +++ b/sign/mldsa/mldsa44/internal/sample_test.go @@ -0,0 +1,266 @@ +// 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 + 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/mldsa/mldsa44/internal/vec.go b/sign/mldsa/mldsa44/internal/vec.go new file mode 100644 index 000000000..d07d3b245 --- /dev/null +++ b/sign/mldsa/mldsa44/internal/vec.go @@ -0,0 +1,281 @@ +// Code generated from mode3/internal/vec.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// A vector of L polynomials. +type VecL [L]common.Poly + +// A vector of K polynomials. +type VecK [K]common.Poly + +// Normalize the polynomials in this vector. +func (v *VecL) Normalize() { + for i := 0; i < L; i++ { + v[i].Normalize() + } +} + +// Normalize the polynomials in this vector assuming their coefficients +// are already bounded by 2q. +func (v *VecL) NormalizeAssumingLe2Q() { + for i := 0; i < L; i++ { + v[i].NormalizeAssumingLe2Q() + } +} + +// Sets v to w + u. Does not normalize. +func (v *VecL) Add(w, u *VecL) { + for i := 0; i < L; i++ { + v[i].Add(&w[i], &u[i]) + } +} + +// Applies NTT componentwise. See Poly.NTT() for details. +func (v *VecL) NTT() { + for i := 0; i < L; i++ { + v[i].NTT() + } +} + +// Checks whether any of the coefficients exceeds the given bound in supnorm +// +// Requires the vector to be normalized. +func (v *VecL) Exceeds(bound uint32) bool { + for i := 0; i < L; i++ { + if v[i].Exceeds(bound) { + return true + } + } + return false +} + +// Applies Poly.Power2Round componentwise. +// +// Requires the vector to be normalized. +func (v *VecL) Power2Round(v0PlusQ, v1 *VecL) { + for i := 0; i < L; i++ { + v[i].Power2Round(&v0PlusQ[i], &v1[i]) + } +} + +// Applies Poly.Decompose componentwise. +// +// Requires the vector to be normalized. +func (v *VecL) Decompose(v0PlusQ, v1 *VecL) { + for i := 0; i < L; i++ { + PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) + } +} + +// Sequentially packs each polynomial using Poly.PackLeqEta(). +func (v *VecL) PackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyPackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sets v to the polynomials packed in buf using VecL.PackLeqEta(). +func (v *VecL) UnpackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyUnpackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sequentially packs each polynomial using PolyPackLeGamma1(). +func (v *VecL) PackLeGamma1(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyPackLeGamma1(&v[i], buf[offset:]) + offset += PolyLeGamma1Size + } +} + +// Sets v to the polynomials packed in buf using VecL.PackLeGamma1(). +func (v *VecL) UnpackLeGamma1(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyUnpackLeGamma1(&v[i], buf[offset:]) + offset += PolyLeGamma1Size + } +} + +// Normalize the polynomials in this vector. +func (v *VecK) Normalize() { + for i := 0; i < K; i++ { + v[i].Normalize() + } +} + +// Normalize the polynomials in this vector assuming their coefficients +// are already bounded by 2q. +func (v *VecK) NormalizeAssumingLe2Q() { + for i := 0; i < K; i++ { + v[i].NormalizeAssumingLe2Q() + } +} + +// Sets v to w + u. Does not normalize. +func (v *VecK) Add(w, u *VecK) { + for i := 0; i < K; i++ { + v[i].Add(&w[i], &u[i]) + } +} + +// Checks whether any of the coefficients exceeds the given bound in supnorm +// +// Requires the vector to be normalized. +func (v *VecK) Exceeds(bound uint32) bool { + for i := 0; i < K; i++ { + if v[i].Exceeds(bound) { + return true + } + } + return false +} + +// Applies Poly.Power2Round componentwise. +// +// Requires the vector to be normalized. +func (v *VecK) Power2Round(v0PlusQ, v1 *VecK) { + for i := 0; i < K; i++ { + v[i].Power2Round(&v0PlusQ[i], &v1[i]) + } +} + +// Applies Poly.Decompose componentwise. +// +// Requires the vector to be normalized. +func (v *VecK) Decompose(v0PlusQ, v1 *VecK) { + for i := 0; i < K; i++ { + PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) + } +} + +// Sets v to the hint vector for v0 the modified low bits and v1 +// the unmodified high bits --- see makeHint(). +// +// Returns the number of ones in the hint vector. +func (v *VecK) MakeHint(v0, v1 *VecK) (pop uint32) { + for i := 0; i < K; i++ { + pop += PolyMakeHint(&v[i], &v0[i], &v1[i]) + } + return +} + +// Computes corrections to the high bits of the polynomials in the vector +// w using the hints in h and sets v to the corrected high bits. Returns v. +// See useHint(). +func (v *VecK) UseHint(q, hint *VecK) *VecK { + for i := 0; i < K; i++ { + PolyUseHint(&v[i], &q[i], &hint[i]) + } + return v +} + +// Sequentially packs each polynomial using Poly.PackT1(). +func (v *VecK) PackT1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].PackT1(buf[offset:]) + offset += common.PolyT1Size + } +} + +// Sets v to the vector packed into buf by PackT1(). +func (v *VecK) UnpackT1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].UnpackT1(buf[offset:]) + offset += common.PolyT1Size + } +} + +// Sequentially packs each polynomial using Poly.PackT0(). +func (v *VecK) PackT0(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].PackT0(buf[offset:]) + offset += common.PolyT0Size + } +} + +// Sets v to the vector packed into buf by PackT0(). +func (v *VecK) UnpackT0(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].UnpackT0(buf[offset:]) + offset += common.PolyT0Size + } +} + +// Sequentially packs each polynomial using Poly.PackLeqEta(). +func (v *VecK) PackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyPackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sets v to the polynomials packed in buf using VecK.PackLeqEta(). +func (v *VecK) UnpackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyUnpackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Applies NTT componentwise. See Poly.NTT() for details. +func (v *VecK) NTT() { + for i := 0; i < K; i++ { + v[i].NTT() + } +} + +// Sequentially packs each polynomial using PolyPackW1(). +func (v *VecK) PackW1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyPackW1(&v[i], buf[offset:]) + offset += PolyW1Size + } +} + +// Sets v to a - b. +// +// Warning: assumes coefficients of the polynomials of b are less than 2q. +func (v *VecK) Sub(a, b *VecK) { + for i := 0; i < K; i++ { + v[i].Sub(&a[i], &b[i]) + } +} + +// Sets v to 2ᵈ w without reducing. +func (v *VecK) MulBy2toD(w *VecK) { + for i := 0; i < K; i++ { + v[i].MulBy2toD(&w[i]) + } +} + +// Applies InvNTT componentwise. See Poly.InvNTT() for details. +func (v *VecK) InvNTT() { + for i := 0; i < K; i++ { + v[i].InvNTT() + } +} + +// Applies Poly.ReduceLe2Q() componentwise. +func (v *VecK) ReduceLe2Q() { + for i := 0; i < K; i++ { + v[i].ReduceLe2Q() + } +} diff --git a/sign/mldsa/mldsa65/dilithium.go b/sign/mldsa/mldsa65/dilithium.go new file mode 100644 index 000000000..9411e84a7 --- /dev/null +++ b/sign/mldsa/mldsa65/dilithium.go @@ -0,0 +1,182 @@ +// Code generated from modePkg.templ.go. DO NOT EDIT. + + +// mldsa65 implements NIST signature scheme ML-DSA-65 as defined in FIPS204. + +package mldsa65 + +import ( + "crypto" + "errors" + "io" + + 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. +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 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) ( + 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/mldsa/mldsa65/internal/dilithium.go b/sign/mldsa/mldsa65/internal/dilithium.go new file mode 100644 index 000000000..7869d0475 --- /dev/null +++ b/sign/mldsa/mldsa65/internal/dilithium.go @@ -0,0 +1,482 @@ +// Code generated from mode3/internal/dilithium.go by gen.go + +package internal + +import ( + cryptoRand "crypto/rand" + "crypto/subtle" + "io" + + "github.com/cloudflare/circl/internal/sha3" + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +const ( + // Size of a packed polynomial of norm ≤η. + // (Note that the formula is not valid in general.) + PolyLeqEtaSize = (common.N * DoubleEtaBits) / 8 + + // β = τη, the maximum size of c s₂. + Beta = Tau * Eta + + // γ₁ range of y + Gamma1 = 1 << Gamma1Bits + + // Size of packed polynomial of norm <γ₁ such as z + PolyLeGamma1Size = (Gamma1Bits + 1) * common.N / 8 + + // α = 2γ₂ parameter for decompose + Alpha = 2 * Gamma2 + + // Size of a packed private key + 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 + CTildeSize + + // Size of packed w₁ + PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 +) + +// PublicKey is the type of Dilithium public keys. +type PublicKey struct { + rho [32]byte + t1 VecK + + // Cached values + t1p [common.PolyT1Size * K]byte + A *Mat + tr *[TRSize]byte +} + +// PrivateKey is the type of Dilithium private keys. +type PrivateKey struct { + rho [32]byte + key [32]byte + s1 VecL + s2 VecK + t0 VecK + tr [TRSize]byte + + // Cached values + A Mat // ExpandA(ρ) + s1h VecL // NTT(s₁) + s2h VecK // NTT(s₂) + t0h VecK // NTT(t₀) +} + +type unpackedSignature struct { + z VecL + hint VecK + c [CTildeSize]byte +} + +// Packs the signature into buf. +func (sig *unpackedSignature) Pack(buf []byte) { + copy(buf[:], sig.c[:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) +} + +// Sets sig to the signature encoded in the buffer. +// +// Returns whether buf contains a properly packed signature. +func (sig *unpackedSignature) Unpack(buf []byte) bool { + if len(buf) < SignatureSize { + return false + } + copy(sig.c[:], buf[:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) + if sig.z.Exceeds(Gamma1 - Beta) { + return false + } + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { + return false + } + return true +} + +// Packs the public key into buf. +func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { + copy(buf[:32], pk.rho[:]) + copy(buf[32:], pk.t1p[:]) +} + +// Sets pk to the public key encoded in buf. +func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { + copy(pk.rho[:], buf[:32]) + copy(pk.t1p[:], buf[32:]) + + pk.t1.UnpackT1(pk.t1p[:]) + pk.A = new(Mat) + pk.A.Derive(&pk.rho) + + // tr = CRH(ρ ‖ t1) = CRH(pk) + pk.tr = new([TRSize]byte) + h := sha3.NewShake256() + _, _ = h.Write(buf[:]) + _, _ = h.Read(pk.tr[:]) +} + +// Packs the private key into buf. +func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { + copy(buf[:32], sk.rho[:]) + copy(buf[32:64], sk.key[:]) + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize + sk.s1.PackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * L + sk.s2.PackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * K + sk.t0.PackT0(buf[offset:]) +} + +// Sets sk to the private key encoded in buf. +func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { + copy(sk.rho[:], buf[:32]) + copy(sk.key[:], buf[32:64]) + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize + sk.s1.UnpackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * L + sk.s2.UnpackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * K + sk.t0.UnpackT0(buf[offset:]) + + // Cached values + sk.A.Derive(&sk.rho) + sk.t0h = sk.t0 + sk.t0h.NTT() + sk.s1h = sk.s1 + sk.s1h.NTT() + sk.s2h = sk.s2 + sk.s2h.NTT() +} + +// 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) { + var seed [32]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 +} + +// NewKeyFromSeed derives a public/private key pair using the given seed. +func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { + var eSeed [128]byte // expanded seed + var pk PublicKey + var sk PrivateKey + var sSeed [64]byte + + h := sha3.NewShake256() + _, _ = h.Write(seed[:]) + _, _ = h.Read(eSeed[:]) + + copy(pk.rho[:], eSeed[:32]) + copy(sSeed[:], eSeed[32:96]) + copy(sk.key[:], eSeed[96:]) + copy(sk.rho[:], pk.rho[:]) + + sk.A.Derive(&pk.rho) + + for i := uint16(0); i < L; i++ { + PolyDeriveUniformLeqEta(&sk.s1[i], &sSeed, i) + } + + for i := uint16(0); i < K; i++ { + PolyDeriveUniformLeqEta(&sk.s2[i], &sSeed, i+L) + } + + sk.s1h = sk.s1 + sk.s1h.NTT() + sk.s2h = sk.s2 + sk.s2h.NTT() + + sk.computeT0andT1(&sk.t0, &pk.t1) + + sk.t0h = sk.t0 + sk.t0h.NTT() + + // Complete public key far enough to be packed + pk.t1.PackT1(pk.t1p[:]) + pk.A = &sk.A + + // Finish private key + var packedPk [PublicKeySize]byte + pk.Pack(&packedPk) + + // tr = CRH(ρ ‖ t1) = CRH(pk) + h.Reset() + _, _ = h.Write(packedPk[:]) + _, _ = h.Read(sk.tr[:]) + + // Finish cache of public key + pk.tr = &sk.tr + + return &pk, &sk +} + +// Computes t0 and t1 from sk.s1h, sk.s2 and sk.A. +func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { + var t VecK + + // Set t to A s₁ + s₂ + for i := 0; i < K; i++ { + PolyDotHat(&t[i], &sk.A[i], &sk.s1h) + t[i].ReduceLe2Q() + t[i].InvNTT() + } + t.Add(&t, &sk.s2) + t.Normalize() + + // Compute t₀, t₁ = Power2Round(t) + t.Power2Round(t0, t1) +} + +// Verify checks whether the given signature by pk on msg is valid. +func Verify(pk *PublicKey, msg []byte, signature []byte) bool { + var sig unpackedSignature + var mu [64]byte + var zh VecL + var Az, Az2dct1, w1 VecK + var ch common.Poly + var cp [CTildeSize]byte + var w1Packed [PolyW1Size * K]byte + + // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β + // and ensured that there at most ω ones in pk.hint. + if !sig.Unpack(signature) { + return false + } + + // μ = CRH(tr ‖ msg) + h := sha3.NewShake256() + _, _ = h.Write(pk.tr[:]) + _, _ = h.Write(msg) + _, _ = h.Read(mu[:]) + + // Compute Az + zh = sig.z + zh.NTT() + + for i := 0; i < K; i++ { + PolyDotHat(&Az[i], &pk.A[i], &zh) + } + + // Next, we compute Az - 2ᵈ·c·t₁. + // Note that the coefficients of t₁ are bounded by 256 = 2⁹, + // so the coefficients of Az2dct1 will bounded by 2⁹⁺ᵈ = 2²³ < 2q, + // which is small enough for NTT(). + Az2dct1.MulBy2toD(&pk.t1) + Az2dct1.NTT() + PolyDeriveUniformBall(&ch, sig.c[:32]) + ch.NTT() + for i := 0; i < K; i++ { + Az2dct1[i].MulHat(&Az2dct1[i], &ch) + } + Az2dct1.Sub(&Az, &Az2dct1) + Az2dct1.ReduceLe2Q() + Az2dct1.InvNTT() + Az2dct1.NormalizeAssumingLe2Q() + + // UseHint(pk.hint, Az - 2ᵈ·c·t₁) + // = UseHint(pk.hint, w - c·s₂ + c·t₀) + // = UseHint(pk.hint, r + c·t₀) + // = r₁ = w₁. + w1.UseHint(&Az2dct1, &sig.hint) + w1.PackW1(w1Packed[:]) + + // c' = H(μ, w₁) + h.Reset() + _, _ = h.Write(mu[:]) + _, _ = h.Write(w1Packed[:]) + _, _ = h.Read(cp[:]) + + return sig.c == cp +} + +// SignTo signs the given message and writes the signature into signature. +// +//nolint:funlen +func SignTo(sk *PrivateKey, msg []byte, signature []byte) { + var mu, rhop [64]byte + var w1Packed [PolyW1Size * K]byte + var y, yh VecL + var w, w0, w1, w0mcs2, ct0, w0mcs2pct0 VecK + var ch common.Poly + var yNonce uint16 + var sig unpackedSignature + + if len(signature) < SignatureSize { + panic("Signature does not fit in that byteslice") + } + + // μ = CRH(tr ‖ msg) + h := sha3.NewShake256() + _, _ = h.Write(sk.tr[:]) + _, _ = h.Write(msg) + _, _ = h.Read(mu[:]) + + // ρ' = CRH(key ‖ μ) + h.Reset() + _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } + _, _ = h.Write(mu[:]) + _, _ = h.Read(rhop[:]) + + // Main rejection loop + attempt := 0 + for { + attempt++ + if attempt >= 576 { + // Depending on the mode, one try has a chance between 1/7 and 1/4 + // of succeeding. Thus it is safe to say that 576 iterations + // are enough as (6/7)⁵⁷⁶ < 2⁻¹²⁸. + panic("This should only happen 1 in 2^{128}: something is wrong.") + } + + // y = ExpandMask(ρ', key) + VecLDeriveUniformLeGamma1(&y, &rhop, yNonce) + yNonce += uint16(L) + + // Set w to A y + yh = y + yh.NTT() + for i := 0; i < K; i++ { + PolyDotHat(&w[i], &sk.A[i], &yh) + w[i].ReduceLe2Q() + w[i].InvNTT() + } + + // Decompose w into w₀ and w₁ + w.NormalizeAssumingLe2Q() + w.Decompose(&w0, &w1) + + // c~ = H(μ ‖ w₁) + w1.PackW1(w1Packed[:]) + h.Reset() + _, _ = h.Write(mu[:]) + _, _ = h.Write(w1Packed[:]) + _, _ = h.Read(sig.c[:]) + + PolyDeriveUniformBall(&ch, sig.c[:32]) + ch.NTT() + + // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. + // + // By Lemma 3 of the specification this is equivalent to checking that + // both ‖ r₀ ‖_∞ < γ₂ - β and r₁ = w₁, for the decomposition + // w - c·s₂ = r₁ α + r₀ as computed by decompose(). + // See also §4.1 of the specification. + for i := 0; i < K; i++ { + w0mcs2[i].MulHat(&ch, &sk.s2h[i]) + w0mcs2[i].InvNTT() + } + w0mcs2.Sub(&w0, &w0mcs2) + w0mcs2.Normalize() + + if w0mcs2.Exceeds(Gamma2 - Beta) { + continue + } + + // z = y + c·s₁ + for i := 0; i < L; i++ { + sig.z[i].MulHat(&ch, &sk.s1h[i]) + sig.z[i].InvNTT() + } + sig.z.Add(&sig.z, &y) + sig.z.Normalize() + + // Ensure ‖z‖_∞ < γ₁ - β + if sig.z.Exceeds(Gamma1 - Beta) { + continue + } + + // Compute c·t₀ + for i := 0; i < K; i++ { + ct0[i].MulHat(&ch, &sk.t0h[i]) + ct0[i].InvNTT() + } + ct0.NormalizeAssumingLe2Q() + + // Ensure ‖c·t₀‖_∞ < γ₂. + if ct0.Exceeds(Gamma2) { + continue + } + + // Create the hint to be able to reconstruct w₁ from w - c·s₂ + c·t0. + // Note that we're not using makeHint() in the obvious way as we + // do not know whether ‖ sc·s₂ - c·t₀ ‖_∞ < γ₂. Instead we note + // that our makeHint() is actually the same as a makeHint for a + // different decomposition: + // + // Earlier we ensured indirectly with a check that r₁ = w₁ where + // r = w - c·s₂. Hence r₀ = r - r₁ α = w - c·s₂ - w₁ α = w₀ - c·s₂. + // Thus MakeHint(w₀ - c·s₂ + c·t₀, w₁) = MakeHint(r0 + c·t₀, r₁) + // and UseHint(w - c·s₂ + c·t₀, w₁) = UseHint(r + c·t₀, r₁). + // As we just ensured that ‖ c·t₀ ‖_∞ < γ₂ our usage is correct. + w0mcs2pct0.Add(&w0mcs2, &ct0) + w0mcs2pct0.NormalizeAssumingLe2Q() + hintPop := sig.hint.MakeHint(&w0mcs2pct0, &w1) + if hintPop > Omega { + continue + } + + break + } + + sig.Pack(signature[:]) +} + +// Computes the public key corresponding to this private key. +func (sk *PrivateKey) Public() *PublicKey { + var t0 VecK + pk := &PublicKey{ + rho: sk.rho, + A: &sk.A, + tr: &sk.tr, + } + sk.computeT0andT1(&t0, &pk.t1) + pk.t1.PackT1(pk.t1p[:]) + return pk +} + +// Equal returns whether the two public keys are equal +func (pk *PublicKey) Equal(other *PublicKey) bool { + return pk.rho == other.rho && pk.t1 == other.t1 +} + +// Equal returns whether the two private keys are equal +func (sk *PrivateKey) Equal(other *PrivateKey) bool { + ret := (subtle.ConstantTimeCompare(sk.rho[:], other.rho[:]) & + subtle.ConstantTimeCompare(sk.key[:], other.key[:]) & + subtle.ConstantTimeCompare(sk.tr[:], other.tr[:])) + + acc := uint32(0) + for i := 0; i < L; i++ { + for j := 0; j < common.N; j++ { + acc |= sk.s1[i][j] ^ other.s1[i][j] + } + } + for i := 0; i < K; i++ { + for j := 0; j < common.N; j++ { + acc |= sk.s2[i][j] ^ other.s2[i][j] + acc |= sk.t0[i][j] ^ other.t0[i][j] + } + } + return (ret & subtle.ConstantTimeEq(int32(acc), 0)) == 1 +} diff --git a/sign/mldsa/mldsa65/internal/dilithium_test.go b/sign/mldsa/mldsa65/internal/dilithium_test.go new file mode 100644 index 000000000..825e7da08 --- /dev/null +++ b/sign/mldsa/mldsa65/internal/dilithium_test.go @@ -0,0 +1,144 @@ +// Code generated from mode3/internal/dilithium_test.go by gen.go + +package internal + +import ( + "encoding/binary" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Checks whether p is normalized. Only used in tests. +func PolyNormalized(p *common.Poly) bool { + p2 := *p + p2.Normalize() + return p2 == *p +} + +func BenchmarkSkUnpack(b *testing.B) { + var buf [PrivateKeySize]byte + var sk PrivateKey + for i := 0; i < b.N; i++ { + sk.Unpack(&buf) + } +} + +func BenchmarkPkUnpack(b *testing.B) { + var buf [PublicKeySize]byte + var pk PublicKey + for i := 0; i < b.N; i++ { + pk.Unpack(&buf) + } +} + +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 + pk, sk := NewKeyFromSeed(&seed) + SignTo(sk, msg[:], 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[:]) + } +} + +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 + _, sk := NewKeyFromSeed(&seed) + b.ResetTimer() + for i := 0; i < b.N; i++ { + binary.LittleEndian.PutUint64(msg[:], uint64(i)) + SignTo(sk, msg[:], sig[:]) + } +} + +func BenchmarkGenerateKey(b *testing.B) { + var seed [32]byte + for i := 0; i < b.N; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + NewKeyFromSeed(&seed) + } +} + +func BenchmarkPublicFromPrivate(b *testing.B) { + var seed [32]byte + for i := 0; i < b.N; i++ { + b.StopTimer() + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + _, sk := NewKeyFromSeed(&seed) + b.StartTimer() + sk.Public() + } +} + +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 + for i := uint64(0); i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], i) + pk, sk := NewKeyFromSeed(&seed) + if !sk.Equal(sk) { + t.Fatal() + } + for j := uint64(0); j < 10; j++ { + binary.LittleEndian.PutUint64(msg[:], j) + SignTo(sk, msg[:], sig[:]) + if !Verify(pk, msg[:], sig[:]) { + t.Fatal() + } + } + pk.Pack(&pkb) + pk2.Unpack(&pkb) + if !pk.Equal(&pk2) { + t.Fatal() + } + sk.Pack(&skb) + sk2.Unpack(&skb) + if !sk.Equal(&sk2) { + t.Fatal() + } + } +} + +func TestPublicFromPrivate(t *testing.T) { + var seed [common.SeedSize]byte + for i := uint64(0); i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], i) + pk, sk := NewKeyFromSeed(&seed) + pk2 := sk.Public() + if !pk.Equal(pk2) { + t.Fatal() + } + } +} + +func TestGamma1Size(t *testing.T) { + var expected int + switch Gamma1Bits { + case 17: + expected = 576 + case 19: + expected = 640 + } + if expected != PolyLeGamma1Size { + t.Fatal() + } +} diff --git a/sign/mldsa/mldsa65/internal/mat.go b/sign/mldsa/mldsa65/internal/mat.go new file mode 100644 index 000000000..ceaf634fa --- /dev/null +++ b/sign/mldsa/mldsa65/internal/mat.go @@ -0,0 +1,59 @@ +// Code generated from mode3/internal/mat.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// A k by l matrix of polynomials. +type Mat [K]VecL + +// Expands the given seed to a complete matrix. +// +// This function is called ExpandA in the specification. +func (m *Mat) Derive(seed *[32]byte) { + if !DeriveX4Available { + for i := uint16(0); i < K; i++ { + for j := uint16(0); j < L; j++ { + PolyDeriveUniform(&m[i][j], seed, (i<<8)+j) + } + } + return + } + + idx := 0 + var nonces [4]uint16 + var ps [4]*common.Poly + for i := uint16(0); i < K; i++ { + for j := uint16(0); j < L; j++ { + nonces[idx] = (i << 8) + j + ps[idx] = &m[i][j] + idx++ + if idx == 4 { + idx = 0 + PolyDeriveUniformX4(ps, seed, nonces) + } + } + } + if idx != 0 { + for i := idx; i < 4; i++ { + ps[i] = nil + } + PolyDeriveUniformX4(ps, seed, nonces) + } +} + +// Set p to the inner product of a and b using pointwise multiplication. +// +// Assumes a and b are in Montgomery form and their coefficients are +// pairwise sufficiently small to multiply, see Poly.MulHat(). Resulting +// coefficients are bounded by 2Lq. +func PolyDotHat(p *common.Poly, a, b *VecL) { + var t common.Poly + *p = common.Poly{} // zero p + for i := 0; i < L; i++ { + t.MulHat(&a[i], &b[i]) + p.Add(&t, p) + } +} diff --git a/sign/mldsa/mldsa65/internal/pack.go b/sign/mldsa/mldsa65/internal/pack.go new file mode 100644 index 000000000..1854b4197 --- /dev/null +++ b/sign/mldsa/mldsa65/internal/pack.go @@ -0,0 +1,270 @@ +// Code generated from mode3/internal/pack.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Writes p with norm less than or equal η into buf, which must be of +// size PolyLeqEtaSize. +// +// Assumes coefficients of p are not normalized, but in [q-η,q+η]. +func PolyPackLeqEta(p *common.Poly, buf []byte) { + if DoubleEtaBits == 4 { // compiler eliminates branch + j := 0 + for i := 0; i < PolyLeqEtaSize; i++ { + buf[i] = (byte(common.Q+Eta-p[j]) | + byte(common.Q+Eta-p[j+1])<<4) + j += 2 + } + } else if DoubleEtaBits == 3 { + j := 0 + for i := 0; i < PolyLeqEtaSize; i += 3 { + buf[i] = (byte(common.Q+Eta-p[j]) | + (byte(common.Q+Eta-p[j+1]) << 3) | + (byte(common.Q+Eta-p[j+2]) << 6)) + buf[i+1] = ((byte(common.Q+Eta-p[j+2]) >> 2) | + (byte(common.Q+Eta-p[j+3]) << 1) | + (byte(common.Q+Eta-p[j+4]) << 4) | + (byte(common.Q+Eta-p[j+5]) << 7)) + buf[i+2] = ((byte(common.Q+Eta-p[j+5]) >> 1) | + (byte(common.Q+Eta-p[j+6]) << 2) | + (byte(common.Q+Eta-p[j+7]) << 5)) + j += 8 + } + } else { + panic("eta not supported") + } +} + +// Sets p to the polynomial of norm less than or equal η encoded in the +// given buffer of size PolyLeqEtaSize. +// +// Output coefficients of p are not normalized, but in [q-η,q+η] provided +// buf was created using PackLeqEta. +// +// Beware, for arbitrary buf the coefficients of p might end up in +// the interval [q-2^b,q+2^b] where b is the least b with η≤2^b. +func PolyUnpackLeqEta(p *common.Poly, buf []byte) { + if DoubleEtaBits == 4 { // compiler eliminates branch + j := 0 + for i := 0; i < PolyLeqEtaSize; i++ { + p[j] = common.Q + Eta - uint32(buf[i]&15) + p[j+1] = common.Q + Eta - uint32(buf[i]>>4) + j += 2 + } + } else if DoubleEtaBits == 3 { + j := 0 + for i := 0; i < PolyLeqEtaSize; i += 3 { + p[j] = common.Q + Eta - uint32(buf[i]&7) + p[j+1] = common.Q + Eta - uint32((buf[i]>>3)&7) + p[j+2] = common.Q + Eta - uint32((buf[i]>>6)|((buf[i+1]<<2)&7)) + p[j+3] = common.Q + Eta - uint32((buf[i+1]>>1)&7) + p[j+4] = common.Q + Eta - uint32((buf[i+1]>>4)&7) + p[j+5] = common.Q + Eta - uint32((buf[i+1]>>7)|((buf[i+2]<<1)&7)) + p[j+6] = common.Q + Eta - uint32((buf[i+2]>>2)&7) + p[j+7] = common.Q + Eta - uint32((buf[i+2]>>5)&7) + j += 8 + } + } else { + panic("eta not supported") + } +} + +// Writes v with coefficients in {0, 1} of which at most ω non-zero +// to buf, which must have length ω+k. +func (v *VecK) PackHint(buf []byte) { + // The packed hint starts with the indices of the non-zero coefficients + // For instance: + // + // (x⁵⁶ + x¹⁰⁰, x²⁵⁵, 0, x² + x²³, x¹) + // + // Yields + // + // 56, 100, 255, 2, 23, 1 + // + // Then we pad with zeroes until we have a list of ω items: + // // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0 + // + // Then we finish with a list of the switch-over-indices in this + // list between polynomials, so: + // + // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0, 2, 3, 3, 5, 6 + + off := uint8(0) + for i := 0; i < K; i++ { + for j := uint16(0); j < common.N; j++ { + if v[i][j] != 0 { + buf[off] = uint8(j) + off++ + } + } + buf[Omega+i] = off + } + for ; off < Omega; off++ { + buf[off] = 0 + } +} + +// Sets v to the vector encoded using VecK.PackHint() +// +// Returns whether unpacking was successful. +func (v *VecK) UnpackHint(buf []byte) bool { + // A priori, there would be several reasonable ways to encode the same + // hint vector. We take care to only allow only one encoding, to ensure + // "strong unforgeability". + // + // See PackHint() source for description of the encoding. + *v = VecK{} // zero v + prevSOP := uint8(0) // previous switch-over-point + for i := 0; i < K; i++ { + SOP := buf[Omega+i] + if SOP < prevSOP || SOP > Omega { + return false // ensures switch-over-points are increasing + } + for j := prevSOP; j < SOP; j++ { + if j > prevSOP && buf[j] <= buf[j-1] { + return false // ensures indices are increasing (within a poly) + } + v[i][buf[j]] = 1 + } + prevSOP = SOP + } + for j := prevSOP; j < Omega; j++ { + if buf[j] != 0 { + return false // ensures padding indices are zero + } + } + + return true +} + +// Sets p to the polynomial packed into buf by PolyPackLeGamma1. +// +// p will be normalized. +func PolyUnpackLeGamma1(p *common.Poly, buf []byte) { + if Gamma1Bits == 17 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 9 { + p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | + (uint32(buf[i+2]&0x3) << 16) + p1 := uint32(buf[i+2]>>2) | (uint32(buf[i+3]) << 6) | + (uint32(buf[i+4]&0xf) << 14) + p2 := uint32(buf[i+4]>>4) | (uint32(buf[i+5]) << 4) | + (uint32(buf[i+6]&0x3f) << 12) + p3 := uint32(buf[i+6]>>6) | (uint32(buf[i+7]) << 2) | + (uint32(buf[i+8]) << 10) + + // coefficients in [0,…,2γ₁) + p0 = Gamma1 - p0 // (-γ₁,…,γ₁] + p1 = Gamma1 - p1 + p2 = Gamma1 - p2 + p3 = Gamma1 - p3 + + p0 += uint32(int32(p0)>>31) & common.Q // normalize + p1 += uint32(int32(p1)>>31) & common.Q + p2 += uint32(int32(p2)>>31) & common.Q + p3 += uint32(int32(p3)>>31) & common.Q + + p[j] = p0 + p[j+1] = p1 + p[j+2] = p2 + p[j+3] = p3 + + j += 4 + } + } else if Gamma1Bits == 19 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 5 { + p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | + (uint32(buf[i+2]&0xf) << 16) + p1 := uint32(buf[i+2]>>4) | (uint32(buf[i+3]) << 4) | + (uint32(buf[i+4]) << 12) + + p0 = Gamma1 - p0 + p1 = Gamma1 - p1 + + p0 += uint32(int32(p0)>>31) & common.Q + p1 += uint32(int32(p1)>>31) & common.Q + + p[j] = p0 + p[j+1] = p1 + + j += 2 + } + } else { + panic("γ₁ not supported") + } +} + +// Writes p whose coefficients are in (-γ₁,γ₁] into buf +// which has to be of length PolyLeGamma1Size. +// +// Assumes p is normalized. +func PolyPackLeGamma1(p *common.Poly, buf []byte) { + if Gamma1Bits == 17 { + j := 0 + // coefficients in [0,…,γ₁] ∪ (q-γ₁,…,q) + for i := 0; i < PolyLeGamma1Size; i += 9 { + p0 := Gamma1 - p[j] // [0,…,γ₁] ∪ (γ₁-q,…,2γ₁-q) + p0 += uint32(int32(p0)>>31) & common.Q // [0,…,2γ₁) + p1 := Gamma1 - p[j+1] + p1 += uint32(int32(p1)>>31) & common.Q + p2 := Gamma1 - p[j+2] + p2 += uint32(int32(p2)>>31) & common.Q + p3 := Gamma1 - p[j+3] + p3 += uint32(int32(p3)>>31) & common.Q + + buf[i+0] = byte(p0) + buf[i+1] = byte(p0 >> 8) + buf[i+2] = byte(p0>>16) | byte(p1<<2) + buf[i+3] = byte(p1 >> 6) + buf[i+4] = byte(p1>>14) | byte(p2<<4) + buf[i+5] = byte(p2 >> 4) + buf[i+6] = byte(p2>>12) | byte(p3<<6) + buf[i+7] = byte(p3 >> 2) + buf[i+8] = byte(p3 >> 10) + + j += 4 + } + } else if Gamma1Bits == 19 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 5 { + // Coefficients are in [0, γ₁] ∪ (Q-γ₁, Q) + p0 := Gamma1 - p[j] + p0 += uint32(int32(p0)>>31) & common.Q + p1 := Gamma1 - p[j+1] + p1 += uint32(int32(p1)>>31) & common.Q + + buf[i+0] = byte(p0) + buf[i+1] = byte(p0 >> 8) + buf[i+2] = byte(p0>>16) | byte(p1<<4) + buf[i+3] = byte(p1 >> 4) + buf[i+4] = byte(p1 >> 12) + + j += 2 + } + } else { + panic("γ₁ not supported") + } +} + +// Pack w₁ into buf, which must be of length PolyW1Size. +// +// Assumes w₁ is normalized. +func PolyPackW1(p *common.Poly, buf []byte) { + if Gamma1Bits == 19 { + p.PackLe16(buf) + } else if Gamma1Bits == 17 { + j := 0 + for i := 0; i < PolyW1Size; i += 3 { + buf[i] = byte(p[j]) | byte(p[j+1]<<6) + buf[i+1] = byte(p[j+1]>>2) | byte(p[j+2]<<4) + buf[i+2] = byte(p[j+2]>>4) | byte(p[j+3]<<2) + j += 4 + } + } else { + panic("unsupported γ₁") + } +} diff --git a/sign/mldsa/mldsa65/internal/pack_test.go b/sign/mldsa/mldsa65/internal/pack_test.go new file mode 100644 index 000000000..f952c6a09 --- /dev/null +++ b/sign/mldsa/mldsa65/internal/pack_test.go @@ -0,0 +1,93 @@ +// Code generated from mode3/internal/pack_test.go by gen.go + +package internal + +import ( + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +func TestPolyPackLeqEta(t *testing.T) { + var p1, p2 common.Poly + var seed [64]byte + var buf [PolyLeqEtaSize]byte + + for i := uint16(0); i < 100; i++ { + // Note that DeriveUniformLeqEta sets p to the right kind of + // unnormalized vector. + PolyDeriveUniformLeqEta(&p1, &seed, i) + for j := 0; j < PolyLeqEtaSize; j++ { + if p1[j] < common.Q-Eta || p1[j] > common.Q+Eta { + t.Fatalf("DerveUniformLeqEta out of bounds") + } + } + PolyPackLeqEta(&p1, buf[:]) + PolyUnpackLeqEta(&p2, buf[:]) + if p1 != p2 { + t.Fatalf("%v != %v", p1, p2) + } + } +} + +func TestPolyPackT1(t *testing.T) { + var p1, p2 common.Poly + var seed [32]byte + var buf [common.PolyT1Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniform(&p1, &seed, i) + p1.Normalize() + for j := 0; j < common.N; j++ { + p1[j] &= 0x1ff + } + p1.PackT1(buf[:]) + p2.UnpackT1(buf[:]) + if p1 != p2 { + t.Fatalf("%v != %v", p1, p2) + } + } +} + +func TestPolyPackT0(t *testing.T) { + var p, p0, p1, p2 common.Poly + var seed [32]byte + var buf [common.PolyT0Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniform(&p, &seed, i) + p.Normalize() + p.Power2Round(&p0, &p1) + + p0.PackT0(buf[:]) + p2.UnpackT0(buf[:]) + if p0 != p2 { + t.Fatalf("%v !=\n%v", p0, p2) + } + } +} + +func BenchmarkUnpackLeGamma1(b *testing.B) { + var p common.Poly + var buf [PolyLeGamma1Size]byte + for i := 0; i < b.N; i++ { + PolyUnpackLeGamma1(&p, buf[:]) + } +} + +func TestPolyPackLeGamma1(t *testing.T) { + var p0, p1 common.Poly + var seed [64]byte + var buf [PolyLeGamma1Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniformLeGamma1(&p0, &seed, i) + p0.Normalize() + + PolyPackLeGamma1(&p0, buf[:]) + PolyUnpackLeGamma1(&p1, buf[:]) + if p0 != p1 { + t.Fatalf("%v != %v", p0, p1) + } + } +} diff --git a/sign/mldsa/mldsa65/internal/params.go b/sign/mldsa/mldsa65/internal/params.go new file mode 100644 index 000000000..c7872fc11 --- /dev/null +++ b/sign/mldsa/mldsa65/internal/params.go @@ -0,0 +1,19 @@ +// Code generated from params.templ.go. DO NOT EDIT. + +package internal + +const ( + Name = "ML-DSA-65" + UseAES = false + K = 6 + L = 5 + Eta = 4 + DoubleEtaBits = 4 + Omega = 55 + Tau = 49 + Gamma1Bits = 19 + Gamma2 = 261888 + NIST = true + TRSize = 64 + CTildeSize = 48 +) diff --git a/sign/mldsa/mldsa65/internal/rounding.go b/sign/mldsa/mldsa65/internal/rounding.go new file mode 100644 index 000000000..58123c090 --- /dev/null +++ b/sign/mldsa/mldsa65/internal/rounding.go @@ -0,0 +1,142 @@ +// Code generated from mode3/internal/rounding.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, +// except for when we would have a₁ = (q-1)/α in which case a₁=0 is taken +// and -α/2 ≤ a₀ < 0. Returns a₀ + q. Note 0 ≤ a₁ < (q-1)/α. +// Recall α = 2γ₂. +func decompose(a uint32) (a0plusQ, a1 uint32) { + // a₁ = ⌈a / 128⌉ + a1 = (a + 127) >> 7 + + if Alpha == 523776 { + // 1025/2²² is close enough to 1/4092 so that a₁ + // becomes a/α rounded down. + a1 = ((a1*1025 + (1 << 21)) >> 22) + + // For the corner-case a₁ = (q-1)/α = 16, we have to set a₁=0. + a1 &= 15 + } else if Alpha == 190464 { + // 1488/2²⁴ is close enough to 1/1488 so that a₁ + // becomes a/α rounded down. + a1 = ((a1 * 11275) + (1 << 23)) >> 24 + + // For the corner-case a₁ = (q-1)/α = 44, we have to set a₁=0. + a1 ^= uint32(int32(43-a1)>>31) & a1 + } else { + panic("unsupported α") + } + + a0plusQ = a - a1*Alpha + + // In the corner-case, when we set a₁=0, we will incorrectly + // have a₀ > (q-1)/2 and we'll need to subtract q. As we + // return a₀ + q, that comes down to adding q if a₀ < (q-1)/2. + a0plusQ += uint32(int32(a0plusQ-(common.Q-1)/2)>>31) & common.Q + + return +} + +// Assume 0 ≤ r, f < Q with ‖f‖_∞ ≤ α/2. Decompose r as r = r1*α + r0 as +// computed by decompose(). Write r' := r - f (mod Q). Now, decompose +// r'=r-f again as r' = r'1*α + r'0 using decompose(). As f is small, we +// have r'1 = r1 + h, where h ∈ {-1, 0, 1}. makeHint() computes |h| +// given z0 := r0 - f (mod Q) and r1. With |h|, which is called the hint, +// we can reconstruct r1 using only r' = r - f, which is done by useHint(). +// To wit: +// +// useHint( r - f, makeHint( r0 - f, r1 ) ) = r1. +// +// Assumes 0 ≤ z0 < Q. +func makeHint(z0, r1 uint32) uint32 { + // If -α/2 < r0 - f ≤ α/2, then r1*α + r0 - f is a valid decomposition of r' + // with the restrictions of decompose() and so r'1 = r1. So the hint + // should be 0. This is covered by the first two inequalities. + // There is one other case: if r0 - f = -α/2, then r1*α + r0 - f is also + // a valid decomposition if r1 = 0. In the other cases a one is carried + // and the hint should be 1. + if z0 <= Gamma2 || z0 > common.Q-Gamma2 || (z0 == common.Q-Gamma2 && r1 == 0) { + return 0 + } + return 1 +} + +// Uses the hint created by makeHint() to reconstruct r1 from r'=r-f; see +// documentation of makeHint() for context. +// Assumes 0 ≤ r' < Q. +func useHint(rp uint32, hint uint32) uint32 { + rp0plusQ, rp1 := decompose(rp) + if hint == 0 { + return rp1 + } + if rp0plusQ > common.Q { + return (rp1 + 1) & 15 + } + return (rp1 - 1) & 15 +} + +// Sets p to the hint polynomial for p0 the modified low bits and p1 +// the unmodified high bits --- see makeHint(). +// +// Returns the number of ones in the hint polynomial. +func PolyMakeHint(p, p0, p1 *common.Poly) (pop uint32) { + for i := 0; i < common.N; i++ { + h := makeHint(p0[i], p1[i]) + pop += h + p[i] = h + } + return +} + +// Computes corrections to the high bits of the polynomial q according +// to the hints in h and sets p to the corrected high bits. Returns p. +func PolyUseHint(p, q, hint *common.Poly) { + var q0PlusQ common.Poly + + // See useHint() and makeHint() for an explanation. We reimplement it + // here so that we can call Poly.Decompose(), which might be way faster + // than calling decompose() in a loop (for instance when having AVX2.) + + PolyDecompose(q, &q0PlusQ, p) + + for i := 0; i < common.N; i++ { + if hint[i] == 0 { + continue + } + if Gamma2 == 261888 { + if q0PlusQ[i] > common.Q { + p[i] = (p[i] + 1) & 15 + } else { + p[i] = (p[i] - 1) & 15 + } + } else if Gamma2 == 95232 { + if q0PlusQ[i] > common.Q { + if p[i] == 43 { + p[i] = 0 + } else { + p[i]++ + } + } else { + if p[i] == 0 { + p[i] = 43 + } else { + p[i]-- + } + } + } else { + panic("unsupported γ₂") + } + } +} + +// Splits each of the coefficients of p using decompose. +func PolyDecompose(p, p0PlusQ, p1 *common.Poly) { + for i := 0; i < common.N; i++ { + p0PlusQ[i], p1[i] = decompose(p[i]) + } +} diff --git a/sign/mldsa/mldsa65/internal/rounding_test.go b/sign/mldsa/mldsa65/internal/rounding_test.go new file mode 100644 index 000000000..ad653ca3f --- /dev/null +++ b/sign/mldsa/mldsa65/internal/rounding_test.go @@ -0,0 +1,81 @@ +// Code generated from mode3/internal/rounding_test.go by gen.go + +package internal + +import ( + "flag" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") + +func TestDecompose(t *testing.T) { + for a := uint32(0); a < common.Q; a++ { + a0PlusQ, a1 := decompose(a) + a0 := int32(a0PlusQ) - int32(common.Q) + recombined := a0 + int32(Alpha*a1) + if a1 == 0 && recombined < 0 { + recombined += common.Q + if -(Alpha/2) > a0 || a0 >= 0 { + t.Fatalf("decompose(%v): a0 out of bounds", a) + } + } else { + if (-(Alpha / 2) >= a0) || (a0 > Alpha/2) { + t.Fatalf("decompose(%v): a0 out of bounds", a) + } + } + if int32(a) != recombined { + t.Fatalf("decompose(%v) doesn't recombine %v %v", a, a0, a1) + } + } +} + +func TestMakeHint(t *testing.T) { + if !*runVeryLongTest { + t.SkipNow() + } + for w := uint32(0); w < common.Q; w++ { + w0, w1 := decompose(w) + for fn := uint32(0); fn <= Gamma2; fn++ { + fsign := false + for { + var f uint32 + if fsign { + if fn == 0 { + break + } + f = common.Q - fn + } else { + f = fn + } + + hint := makeHint(common.ReduceLe2Q(w0+common.Q-f), w1) + w1p := useHint(common.ReduceLe2Q(w+common.Q-f), hint) + if w1p != w1 { + t.Fatal() + } + + if fsign { + break + } + fsign = true + } + } + } +} + +func BenchmarkDecompose(b *testing.B) { + var p, p0, p1 common.Poly + for i := 0; i < b.N; i++ { + PolyDecompose(&p, &p0, &p1) + } +} + +func BenchmarkMakeHint(b *testing.B) { + var p, p0, p1 common.Poly + for i := 0; i < b.N; i++ { + PolyMakeHint(&p, &p0, &p1) + } +} diff --git a/sign/mldsa/mldsa65/internal/sample.go b/sign/mldsa/mldsa65/internal/sample.go new file mode 100644 index 000000000..62c261332 --- /dev/null +++ b/sign/mldsa/mldsa65/internal/sample.go @@ -0,0 +1,370 @@ +// Code generated from mode3/internal/sample.go by gen.go + +package internal + +import ( + "encoding/binary" + + "github.com/cloudflare/circl/internal/sha3" + 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 + +// 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. +// +// Can only be called when DeriveX4Available is true. +func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { + var perm keccakf1600.StateX4 + state := perm.Initialize(false) + + // Absorb the seed in the four states + for i := 0; i < 4; i++ { + v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) + for j := 0; j < 4; j++ { + state[i*4+j] = v + } + } + + // Absorb the nonces, the SHAKE128 domain separator (0b1111), the + // start of the padding (0b...001) and the end of the padding 0b100... + // Recall that the rate of SHAKE128 is 168 --- i.e. 21 uint64s. + for j := 0; j < 4; j++ { + state[4*4+j] = uint64(nonces[j]) | (0x1f << 16) + state[20*4+j] = 0x80 << 56 + } + + var idx [4]int // indices into ps + for j := 0; j < 4; j++ { + if ps[j] == nil { + idx[j] = common.N // mark nil polynomial as completed + } + } + + done := false + for !done { + // Applies KeccaK-f[1600] to state to get the next 21 uint64s of each + // of the four SHAKE128 streams. + perm.Permute() + + done = true + + PolyLoop: + for j := 0; j < 4; j++ { + if idx[j] == common.N { + continue + } + for i := 0; i < 7; i++ { + var t [8]uint32 + t[0] = uint32(state[i*3*4+j] & 0x7fffff) + t[1] = uint32((state[i*3*4+j] >> 24) & 0x7fffff) + t[2] = uint32((state[i*3*4+j] >> 48) | + ((state[(i*3+1)*4+j] & 0x7f) << 16)) + t[3] = uint32((state[(i*3+1)*4+j] >> 8) & 0x7fffff) + t[4] = uint32((state[(i*3+1)*4+j] >> 32) & 0x7fffff) + t[5] = uint32((state[(i*3+1)*4+j] >> 56) | + ((state[(i*3+2)*4+j] & 0x7fff) << 8)) + t[6] = uint32((state[(i*3+2)*4+j] >> 16) & 0x7fffff) + t[7] = uint32((state[(i*3+2)*4+j] >> 40) & 0x7fffff) + + for k := 0; k < 8; k++ { + if t[k] < common.Q { + ps[j][idx[j]] = t[k] + idx[j]++ + if idx[j] == common.N { + continue PolyLoop + } + } + } + } + done = false + } + } +} + +// Sample p uniformly from the given seed and nonce. +// +// 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 + + if UseAES { + length = 12 * 16 + } else { + length = 168 + } + + sample := func() { + // Note that 3 divides into 168 and 12*16, so we use up buf completely. + for j := 0; j < length && i < common.N; j += 3 { + t := (uint32(buf[j]) | (uint32(buf[j+1]) << 8) | + (uint32(buf[j+2]) << 16)) & 0x7fffff + + // We use rejection sampling + if t < common.Q { + p[i] = t + i++ + } + } + } + + if UseAES { + h := common.NewAesStream128(seed, nonce) + + 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() + } + } +} + +// Sample p uniformly with coefficients of norm less than or equal η, +// using the given seed and nonce. +// +// p will not be normalized, but will have coefficients in [q-η,q+η]. +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 + + if UseAES { + length = 9 * 16 + } else { + length = 136 + } + + sample := func() { + // We use rejection sampling + for j := 0; j < length && i < common.N; j++ { + t1 := uint32(buf[j]) & 15 + t2 := uint32(buf[j]) >> 4 + if Eta == 2 { // branch is eliminated by compiler + if t1 <= 14 { + t1 -= ((205 * t1) >> 10) * 5 // reduce mod 5 + p[i] = common.Q + Eta - t1 + i++ + } + if t2 <= 14 && i < common.N { + t2 -= ((205 * t2) >> 10) * 5 // reduce mod 5 + p[i] = common.Q + Eta - t2 + i++ + } + } else if Eta == 4 { + if t1 <= 2*Eta { + p[i] = common.Q + Eta - t1 + i++ + } + if t2 <= 2*Eta && i < common.N { + p[i] = common.Q + Eta - t2 + i++ + } + } else { + panic("unsupported η") + } + } + } + + 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 + + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) + + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() + } + } +} + +// Sample v[i] uniformly with coefficients in (-γ₁,…,γ₁] using the +// given seed and nonce+i +// +// p will be normalized. +func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { + for i := 0; i < L; i++ { + PolyDeriveUniformLeGamma1(&v[i], seed, nonce+uint16(i)) + } +} + +// Sample p uniformly with coefficients in (-γ₁,…,γK1s] using the +// given seed and nonce. +// +// p will be normalized. +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[:]) + } + + PolyUnpackLeGamma1(p, buf[:]) +} + +// For each i, sample ps[i] uniformly with τ non-zero coefficients in {q-1,1} +// using the given seed and w1[i]. ps[i] may be nil and is ignored +// in that case. ps[i] will be normalized. +// +// Can only be called when DeriveX4Available is true. +// +// This function is currently not used (yet). +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 < 32/8; i++ { + v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) + for j := 0; j < 4; j++ { + state[i*4+j] = v + } + } + + // SHAKE256 domain separator and padding + for j := 0; j < 4; j++ { + state[(32/8)*4+j] ^= 0x1f + state[16*4+j] ^= 0x80 << 56 + } + perm.Permute() + + var signs [4]uint64 + var idx [4]uint16 // indices into ps + + for j := 0; j < 4; j++ { + if ps[j] != nil { + signs[j] = state[j] + *ps[j] = common.Poly{} // zero ps[j] + idx[j] = common.N - Tau + } else { + idx[j] = common.N // mark as completed + } + } + + stateOffset := 1 + for { + done := true + + PolyLoop: + for j := 0; j < 4; j++ { + if idx[j] == common.N { + continue + } + + for i := stateOffset; i < 17; i++ { + var bs [8]byte + binary.LittleEndian.PutUint64(bs[:], state[4*i+j]) + for k := 0; k < 8; k++ { + b := uint16(bs[k]) + + if b > idx[j] { + continue + } + + ps[j][idx[j]] = ps[j][b] + ps[j][b] = 1 + // Takes least significant bit of signs and uses it for the sign. + // Note 1 ^ (1 | (Q-1)) = Q-1. + ps[j][b] ^= uint32((-(signs[j] & 1)) & (1 | (common.Q - 1))) + signs[j] >>= 1 + + idx[j]++ + if idx[j] == common.N { + continue PolyLoop + } + } + } + + done = false + } + + if done { + break + } + + perm.Permute() + stateOffset = 0 + } +} + +// Samples p uniformly with τ non-zero coefficients in {q-1,1}. +// +// The polynomial p will be normalized. +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { + var buf [136]byte // SHAKE-256 rate is 136 + + h := sha3.NewShake256() + _, _ = h.Write(seed[:]) + _, _ = h.Read(buf[:]) + + // Essentially we generate a sequence of τ ones or minus ones, + // prepend 196 zeroes and shuffle the concatenation using the + // usual algorithm (Fisher--Yates.) + signs := binary.LittleEndian.Uint64(buf[:]) + bufOff := 8 // offset into buf + + *p = common.Poly{} // zero p + for i := uint16(common.N - Tau); i < common.N; i++ { + var b uint16 + + // Find location of where to move the new coefficient to using + // rejection sampling. + for { + if bufOff >= 136 { + _, _ = h.Read(buf[:]) + bufOff = 0 + } + + b = uint16(buf[bufOff]) + bufOff++ + + if b <= i { + break + } + } + + p[i] = p[b] + p[b] = 1 + // Takes least significant bit of signs and uses it for the sign. + // Note 1 ^ (1 | (Q-1)) = Q-1. + p[b] ^= uint32((-(signs & 1)) & (1 | (common.Q - 1))) + signs >>= 1 + } +} diff --git a/sign/mldsa/mldsa65/internal/sample_test.go b/sign/mldsa/mldsa65/internal/sample_test.go new file mode 100644 index 000000000..2059599eb --- /dev/null +++ b/sign/mldsa/mldsa65/internal/sample_test.go @@ -0,0 +1,266 @@ +// 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 + 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/mldsa/mldsa65/internal/vec.go b/sign/mldsa/mldsa65/internal/vec.go new file mode 100644 index 000000000..d07d3b245 --- /dev/null +++ b/sign/mldsa/mldsa65/internal/vec.go @@ -0,0 +1,281 @@ +// Code generated from mode3/internal/vec.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// A vector of L polynomials. +type VecL [L]common.Poly + +// A vector of K polynomials. +type VecK [K]common.Poly + +// Normalize the polynomials in this vector. +func (v *VecL) Normalize() { + for i := 0; i < L; i++ { + v[i].Normalize() + } +} + +// Normalize the polynomials in this vector assuming their coefficients +// are already bounded by 2q. +func (v *VecL) NormalizeAssumingLe2Q() { + for i := 0; i < L; i++ { + v[i].NormalizeAssumingLe2Q() + } +} + +// Sets v to w + u. Does not normalize. +func (v *VecL) Add(w, u *VecL) { + for i := 0; i < L; i++ { + v[i].Add(&w[i], &u[i]) + } +} + +// Applies NTT componentwise. See Poly.NTT() for details. +func (v *VecL) NTT() { + for i := 0; i < L; i++ { + v[i].NTT() + } +} + +// Checks whether any of the coefficients exceeds the given bound in supnorm +// +// Requires the vector to be normalized. +func (v *VecL) Exceeds(bound uint32) bool { + for i := 0; i < L; i++ { + if v[i].Exceeds(bound) { + return true + } + } + return false +} + +// Applies Poly.Power2Round componentwise. +// +// Requires the vector to be normalized. +func (v *VecL) Power2Round(v0PlusQ, v1 *VecL) { + for i := 0; i < L; i++ { + v[i].Power2Round(&v0PlusQ[i], &v1[i]) + } +} + +// Applies Poly.Decompose componentwise. +// +// Requires the vector to be normalized. +func (v *VecL) Decompose(v0PlusQ, v1 *VecL) { + for i := 0; i < L; i++ { + PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) + } +} + +// Sequentially packs each polynomial using Poly.PackLeqEta(). +func (v *VecL) PackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyPackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sets v to the polynomials packed in buf using VecL.PackLeqEta(). +func (v *VecL) UnpackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyUnpackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sequentially packs each polynomial using PolyPackLeGamma1(). +func (v *VecL) PackLeGamma1(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyPackLeGamma1(&v[i], buf[offset:]) + offset += PolyLeGamma1Size + } +} + +// Sets v to the polynomials packed in buf using VecL.PackLeGamma1(). +func (v *VecL) UnpackLeGamma1(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyUnpackLeGamma1(&v[i], buf[offset:]) + offset += PolyLeGamma1Size + } +} + +// Normalize the polynomials in this vector. +func (v *VecK) Normalize() { + for i := 0; i < K; i++ { + v[i].Normalize() + } +} + +// Normalize the polynomials in this vector assuming their coefficients +// are already bounded by 2q. +func (v *VecK) NormalizeAssumingLe2Q() { + for i := 0; i < K; i++ { + v[i].NormalizeAssumingLe2Q() + } +} + +// Sets v to w + u. Does not normalize. +func (v *VecK) Add(w, u *VecK) { + for i := 0; i < K; i++ { + v[i].Add(&w[i], &u[i]) + } +} + +// Checks whether any of the coefficients exceeds the given bound in supnorm +// +// Requires the vector to be normalized. +func (v *VecK) Exceeds(bound uint32) bool { + for i := 0; i < K; i++ { + if v[i].Exceeds(bound) { + return true + } + } + return false +} + +// Applies Poly.Power2Round componentwise. +// +// Requires the vector to be normalized. +func (v *VecK) Power2Round(v0PlusQ, v1 *VecK) { + for i := 0; i < K; i++ { + v[i].Power2Round(&v0PlusQ[i], &v1[i]) + } +} + +// Applies Poly.Decompose componentwise. +// +// Requires the vector to be normalized. +func (v *VecK) Decompose(v0PlusQ, v1 *VecK) { + for i := 0; i < K; i++ { + PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) + } +} + +// Sets v to the hint vector for v0 the modified low bits and v1 +// the unmodified high bits --- see makeHint(). +// +// Returns the number of ones in the hint vector. +func (v *VecK) MakeHint(v0, v1 *VecK) (pop uint32) { + for i := 0; i < K; i++ { + pop += PolyMakeHint(&v[i], &v0[i], &v1[i]) + } + return +} + +// Computes corrections to the high bits of the polynomials in the vector +// w using the hints in h and sets v to the corrected high bits. Returns v. +// See useHint(). +func (v *VecK) UseHint(q, hint *VecK) *VecK { + for i := 0; i < K; i++ { + PolyUseHint(&v[i], &q[i], &hint[i]) + } + return v +} + +// Sequentially packs each polynomial using Poly.PackT1(). +func (v *VecK) PackT1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].PackT1(buf[offset:]) + offset += common.PolyT1Size + } +} + +// Sets v to the vector packed into buf by PackT1(). +func (v *VecK) UnpackT1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].UnpackT1(buf[offset:]) + offset += common.PolyT1Size + } +} + +// Sequentially packs each polynomial using Poly.PackT0(). +func (v *VecK) PackT0(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].PackT0(buf[offset:]) + offset += common.PolyT0Size + } +} + +// Sets v to the vector packed into buf by PackT0(). +func (v *VecK) UnpackT0(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].UnpackT0(buf[offset:]) + offset += common.PolyT0Size + } +} + +// Sequentially packs each polynomial using Poly.PackLeqEta(). +func (v *VecK) PackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyPackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sets v to the polynomials packed in buf using VecK.PackLeqEta(). +func (v *VecK) UnpackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyUnpackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Applies NTT componentwise. See Poly.NTT() for details. +func (v *VecK) NTT() { + for i := 0; i < K; i++ { + v[i].NTT() + } +} + +// Sequentially packs each polynomial using PolyPackW1(). +func (v *VecK) PackW1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyPackW1(&v[i], buf[offset:]) + offset += PolyW1Size + } +} + +// Sets v to a - b. +// +// Warning: assumes coefficients of the polynomials of b are less than 2q. +func (v *VecK) Sub(a, b *VecK) { + for i := 0; i < K; i++ { + v[i].Sub(&a[i], &b[i]) + } +} + +// Sets v to 2ᵈ w without reducing. +func (v *VecK) MulBy2toD(w *VecK) { + for i := 0; i < K; i++ { + v[i].MulBy2toD(&w[i]) + } +} + +// Applies InvNTT componentwise. See Poly.InvNTT() for details. +func (v *VecK) InvNTT() { + for i := 0; i < K; i++ { + v[i].InvNTT() + } +} + +// Applies Poly.ReduceLe2Q() componentwise. +func (v *VecK) ReduceLe2Q() { + for i := 0; i < K; i++ { + v[i].ReduceLe2Q() + } +} diff --git a/sign/mldsa/mldsa87/dilithium.go b/sign/mldsa/mldsa87/dilithium.go new file mode 100644 index 000000000..a0aa0cf99 --- /dev/null +++ b/sign/mldsa/mldsa87/dilithium.go @@ -0,0 +1,182 @@ +// Code generated from modePkg.templ.go. DO NOT EDIT. + + +// mldsa87 implements NIST signature scheme ML-DSA-87 as defined in FIPS204. + +package mldsa87 + +import ( + "crypto" + "errors" + "io" + + 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. +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 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) ( + 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/mldsa/mldsa87/internal/dilithium.go b/sign/mldsa/mldsa87/internal/dilithium.go new file mode 100644 index 000000000..7869d0475 --- /dev/null +++ b/sign/mldsa/mldsa87/internal/dilithium.go @@ -0,0 +1,482 @@ +// Code generated from mode3/internal/dilithium.go by gen.go + +package internal + +import ( + cryptoRand "crypto/rand" + "crypto/subtle" + "io" + + "github.com/cloudflare/circl/internal/sha3" + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +const ( + // Size of a packed polynomial of norm ≤η. + // (Note that the formula is not valid in general.) + PolyLeqEtaSize = (common.N * DoubleEtaBits) / 8 + + // β = τη, the maximum size of c s₂. + Beta = Tau * Eta + + // γ₁ range of y + Gamma1 = 1 << Gamma1Bits + + // Size of packed polynomial of norm <γ₁ such as z + PolyLeGamma1Size = (Gamma1Bits + 1) * common.N / 8 + + // α = 2γ₂ parameter for decompose + Alpha = 2 * Gamma2 + + // Size of a packed private key + 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 + CTildeSize + + // Size of packed w₁ + PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 +) + +// PublicKey is the type of Dilithium public keys. +type PublicKey struct { + rho [32]byte + t1 VecK + + // Cached values + t1p [common.PolyT1Size * K]byte + A *Mat + tr *[TRSize]byte +} + +// PrivateKey is the type of Dilithium private keys. +type PrivateKey struct { + rho [32]byte + key [32]byte + s1 VecL + s2 VecK + t0 VecK + tr [TRSize]byte + + // Cached values + A Mat // ExpandA(ρ) + s1h VecL // NTT(s₁) + s2h VecK // NTT(s₂) + t0h VecK // NTT(t₀) +} + +type unpackedSignature struct { + z VecL + hint VecK + c [CTildeSize]byte +} + +// Packs the signature into buf. +func (sig *unpackedSignature) Pack(buf []byte) { + copy(buf[:], sig.c[:]) + sig.z.PackLeGamma1(buf[CTildeSize:]) + sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) +} + +// Sets sig to the signature encoded in the buffer. +// +// Returns whether buf contains a properly packed signature. +func (sig *unpackedSignature) Unpack(buf []byte) bool { + if len(buf) < SignatureSize { + return false + } + copy(sig.c[:], buf[:]) + sig.z.UnpackLeGamma1(buf[CTildeSize:]) + if sig.z.Exceeds(Gamma1 - Beta) { + return false + } + if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { + return false + } + return true +} + +// Packs the public key into buf. +func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { + copy(buf[:32], pk.rho[:]) + copy(buf[32:], pk.t1p[:]) +} + +// Sets pk to the public key encoded in buf. +func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { + copy(pk.rho[:], buf[:32]) + copy(pk.t1p[:], buf[32:]) + + pk.t1.UnpackT1(pk.t1p[:]) + pk.A = new(Mat) + pk.A.Derive(&pk.rho) + + // tr = CRH(ρ ‖ t1) = CRH(pk) + pk.tr = new([TRSize]byte) + h := sha3.NewShake256() + _, _ = h.Write(buf[:]) + _, _ = h.Read(pk.tr[:]) +} + +// Packs the private key into buf. +func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { + copy(buf[:32], sk.rho[:]) + copy(buf[32:64], sk.key[:]) + copy(buf[64:64+TRSize], sk.tr[:]) + offset := 64 + TRSize + sk.s1.PackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * L + sk.s2.PackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * K + sk.t0.PackT0(buf[offset:]) +} + +// Sets sk to the private key encoded in buf. +func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { + copy(sk.rho[:], buf[:32]) + copy(sk.key[:], buf[32:64]) + copy(sk.tr[:], buf[64:64+TRSize]) + offset := 64 + TRSize + sk.s1.UnpackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * L + sk.s2.UnpackLeqEta(buf[offset:]) + offset += PolyLeqEtaSize * K + sk.t0.UnpackT0(buf[offset:]) + + // Cached values + sk.A.Derive(&sk.rho) + sk.t0h = sk.t0 + sk.t0h.NTT() + sk.s1h = sk.s1 + sk.s1h.NTT() + sk.s2h = sk.s2 + sk.s2h.NTT() +} + +// 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) { + var seed [32]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 +} + +// NewKeyFromSeed derives a public/private key pair using the given seed. +func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { + var eSeed [128]byte // expanded seed + var pk PublicKey + var sk PrivateKey + var sSeed [64]byte + + h := sha3.NewShake256() + _, _ = h.Write(seed[:]) + _, _ = h.Read(eSeed[:]) + + copy(pk.rho[:], eSeed[:32]) + copy(sSeed[:], eSeed[32:96]) + copy(sk.key[:], eSeed[96:]) + copy(sk.rho[:], pk.rho[:]) + + sk.A.Derive(&pk.rho) + + for i := uint16(0); i < L; i++ { + PolyDeriveUniformLeqEta(&sk.s1[i], &sSeed, i) + } + + for i := uint16(0); i < K; i++ { + PolyDeriveUniformLeqEta(&sk.s2[i], &sSeed, i+L) + } + + sk.s1h = sk.s1 + sk.s1h.NTT() + sk.s2h = sk.s2 + sk.s2h.NTT() + + sk.computeT0andT1(&sk.t0, &pk.t1) + + sk.t0h = sk.t0 + sk.t0h.NTT() + + // Complete public key far enough to be packed + pk.t1.PackT1(pk.t1p[:]) + pk.A = &sk.A + + // Finish private key + var packedPk [PublicKeySize]byte + pk.Pack(&packedPk) + + // tr = CRH(ρ ‖ t1) = CRH(pk) + h.Reset() + _, _ = h.Write(packedPk[:]) + _, _ = h.Read(sk.tr[:]) + + // Finish cache of public key + pk.tr = &sk.tr + + return &pk, &sk +} + +// Computes t0 and t1 from sk.s1h, sk.s2 and sk.A. +func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { + var t VecK + + // Set t to A s₁ + s₂ + for i := 0; i < K; i++ { + PolyDotHat(&t[i], &sk.A[i], &sk.s1h) + t[i].ReduceLe2Q() + t[i].InvNTT() + } + t.Add(&t, &sk.s2) + t.Normalize() + + // Compute t₀, t₁ = Power2Round(t) + t.Power2Round(t0, t1) +} + +// Verify checks whether the given signature by pk on msg is valid. +func Verify(pk *PublicKey, msg []byte, signature []byte) bool { + var sig unpackedSignature + var mu [64]byte + var zh VecL + var Az, Az2dct1, w1 VecK + var ch common.Poly + var cp [CTildeSize]byte + var w1Packed [PolyW1Size * K]byte + + // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β + // and ensured that there at most ω ones in pk.hint. + if !sig.Unpack(signature) { + return false + } + + // μ = CRH(tr ‖ msg) + h := sha3.NewShake256() + _, _ = h.Write(pk.tr[:]) + _, _ = h.Write(msg) + _, _ = h.Read(mu[:]) + + // Compute Az + zh = sig.z + zh.NTT() + + for i := 0; i < K; i++ { + PolyDotHat(&Az[i], &pk.A[i], &zh) + } + + // Next, we compute Az - 2ᵈ·c·t₁. + // Note that the coefficients of t₁ are bounded by 256 = 2⁹, + // so the coefficients of Az2dct1 will bounded by 2⁹⁺ᵈ = 2²³ < 2q, + // which is small enough for NTT(). + Az2dct1.MulBy2toD(&pk.t1) + Az2dct1.NTT() + PolyDeriveUniformBall(&ch, sig.c[:32]) + ch.NTT() + for i := 0; i < K; i++ { + Az2dct1[i].MulHat(&Az2dct1[i], &ch) + } + Az2dct1.Sub(&Az, &Az2dct1) + Az2dct1.ReduceLe2Q() + Az2dct1.InvNTT() + Az2dct1.NormalizeAssumingLe2Q() + + // UseHint(pk.hint, Az - 2ᵈ·c·t₁) + // = UseHint(pk.hint, w - c·s₂ + c·t₀) + // = UseHint(pk.hint, r + c·t₀) + // = r₁ = w₁. + w1.UseHint(&Az2dct1, &sig.hint) + w1.PackW1(w1Packed[:]) + + // c' = H(μ, w₁) + h.Reset() + _, _ = h.Write(mu[:]) + _, _ = h.Write(w1Packed[:]) + _, _ = h.Read(cp[:]) + + return sig.c == cp +} + +// SignTo signs the given message and writes the signature into signature. +// +//nolint:funlen +func SignTo(sk *PrivateKey, msg []byte, signature []byte) { + var mu, rhop [64]byte + var w1Packed [PolyW1Size * K]byte + var y, yh VecL + var w, w0, w1, w0mcs2, ct0, w0mcs2pct0 VecK + var ch common.Poly + var yNonce uint16 + var sig unpackedSignature + + if len(signature) < SignatureSize { + panic("Signature does not fit in that byteslice") + } + + // μ = CRH(tr ‖ msg) + h := sha3.NewShake256() + _, _ = h.Write(sk.tr[:]) + _, _ = h.Write(msg) + _, _ = h.Read(mu[:]) + + // ρ' = CRH(key ‖ μ) + h.Reset() + _, _ = h.Write(sk.key[:]) + if NIST { + // We implement the deterministic variant where rnd is all zeroes. + // TODO expose randomized variant? + _, _ = h.Write(make([]byte, 32)) + } + _, _ = h.Write(mu[:]) + _, _ = h.Read(rhop[:]) + + // Main rejection loop + attempt := 0 + for { + attempt++ + if attempt >= 576 { + // Depending on the mode, one try has a chance between 1/7 and 1/4 + // of succeeding. Thus it is safe to say that 576 iterations + // are enough as (6/7)⁵⁷⁶ < 2⁻¹²⁸. + panic("This should only happen 1 in 2^{128}: something is wrong.") + } + + // y = ExpandMask(ρ', key) + VecLDeriveUniformLeGamma1(&y, &rhop, yNonce) + yNonce += uint16(L) + + // Set w to A y + yh = y + yh.NTT() + for i := 0; i < K; i++ { + PolyDotHat(&w[i], &sk.A[i], &yh) + w[i].ReduceLe2Q() + w[i].InvNTT() + } + + // Decompose w into w₀ and w₁ + w.NormalizeAssumingLe2Q() + w.Decompose(&w0, &w1) + + // c~ = H(μ ‖ w₁) + w1.PackW1(w1Packed[:]) + h.Reset() + _, _ = h.Write(mu[:]) + _, _ = h.Write(w1Packed[:]) + _, _ = h.Read(sig.c[:]) + + PolyDeriveUniformBall(&ch, sig.c[:32]) + ch.NTT() + + // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. + // + // By Lemma 3 of the specification this is equivalent to checking that + // both ‖ r₀ ‖_∞ < γ₂ - β and r₁ = w₁, for the decomposition + // w - c·s₂ = r₁ α + r₀ as computed by decompose(). + // See also §4.1 of the specification. + for i := 0; i < K; i++ { + w0mcs2[i].MulHat(&ch, &sk.s2h[i]) + w0mcs2[i].InvNTT() + } + w0mcs2.Sub(&w0, &w0mcs2) + w0mcs2.Normalize() + + if w0mcs2.Exceeds(Gamma2 - Beta) { + continue + } + + // z = y + c·s₁ + for i := 0; i < L; i++ { + sig.z[i].MulHat(&ch, &sk.s1h[i]) + sig.z[i].InvNTT() + } + sig.z.Add(&sig.z, &y) + sig.z.Normalize() + + // Ensure ‖z‖_∞ < γ₁ - β + if sig.z.Exceeds(Gamma1 - Beta) { + continue + } + + // Compute c·t₀ + for i := 0; i < K; i++ { + ct0[i].MulHat(&ch, &sk.t0h[i]) + ct0[i].InvNTT() + } + ct0.NormalizeAssumingLe2Q() + + // Ensure ‖c·t₀‖_∞ < γ₂. + if ct0.Exceeds(Gamma2) { + continue + } + + // Create the hint to be able to reconstruct w₁ from w - c·s₂ + c·t0. + // Note that we're not using makeHint() in the obvious way as we + // do not know whether ‖ sc·s₂ - c·t₀ ‖_∞ < γ₂. Instead we note + // that our makeHint() is actually the same as a makeHint for a + // different decomposition: + // + // Earlier we ensured indirectly with a check that r₁ = w₁ where + // r = w - c·s₂. Hence r₀ = r - r₁ α = w - c·s₂ - w₁ α = w₀ - c·s₂. + // Thus MakeHint(w₀ - c·s₂ + c·t₀, w₁) = MakeHint(r0 + c·t₀, r₁) + // and UseHint(w - c·s₂ + c·t₀, w₁) = UseHint(r + c·t₀, r₁). + // As we just ensured that ‖ c·t₀ ‖_∞ < γ₂ our usage is correct. + w0mcs2pct0.Add(&w0mcs2, &ct0) + w0mcs2pct0.NormalizeAssumingLe2Q() + hintPop := sig.hint.MakeHint(&w0mcs2pct0, &w1) + if hintPop > Omega { + continue + } + + break + } + + sig.Pack(signature[:]) +} + +// Computes the public key corresponding to this private key. +func (sk *PrivateKey) Public() *PublicKey { + var t0 VecK + pk := &PublicKey{ + rho: sk.rho, + A: &sk.A, + tr: &sk.tr, + } + sk.computeT0andT1(&t0, &pk.t1) + pk.t1.PackT1(pk.t1p[:]) + return pk +} + +// Equal returns whether the two public keys are equal +func (pk *PublicKey) Equal(other *PublicKey) bool { + return pk.rho == other.rho && pk.t1 == other.t1 +} + +// Equal returns whether the two private keys are equal +func (sk *PrivateKey) Equal(other *PrivateKey) bool { + ret := (subtle.ConstantTimeCompare(sk.rho[:], other.rho[:]) & + subtle.ConstantTimeCompare(sk.key[:], other.key[:]) & + subtle.ConstantTimeCompare(sk.tr[:], other.tr[:])) + + acc := uint32(0) + for i := 0; i < L; i++ { + for j := 0; j < common.N; j++ { + acc |= sk.s1[i][j] ^ other.s1[i][j] + } + } + for i := 0; i < K; i++ { + for j := 0; j < common.N; j++ { + acc |= sk.s2[i][j] ^ other.s2[i][j] + acc |= sk.t0[i][j] ^ other.t0[i][j] + } + } + return (ret & subtle.ConstantTimeEq(int32(acc), 0)) == 1 +} diff --git a/sign/mldsa/mldsa87/internal/dilithium_test.go b/sign/mldsa/mldsa87/internal/dilithium_test.go new file mode 100644 index 000000000..825e7da08 --- /dev/null +++ b/sign/mldsa/mldsa87/internal/dilithium_test.go @@ -0,0 +1,144 @@ +// Code generated from mode3/internal/dilithium_test.go by gen.go + +package internal + +import ( + "encoding/binary" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Checks whether p is normalized. Only used in tests. +func PolyNormalized(p *common.Poly) bool { + p2 := *p + p2.Normalize() + return p2 == *p +} + +func BenchmarkSkUnpack(b *testing.B) { + var buf [PrivateKeySize]byte + var sk PrivateKey + for i := 0; i < b.N; i++ { + sk.Unpack(&buf) + } +} + +func BenchmarkPkUnpack(b *testing.B) { + var buf [PublicKeySize]byte + var pk PublicKey + for i := 0; i < b.N; i++ { + pk.Unpack(&buf) + } +} + +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 + pk, sk := NewKeyFromSeed(&seed) + SignTo(sk, msg[:], 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[:]) + } +} + +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 + _, sk := NewKeyFromSeed(&seed) + b.ResetTimer() + for i := 0; i < b.N; i++ { + binary.LittleEndian.PutUint64(msg[:], uint64(i)) + SignTo(sk, msg[:], sig[:]) + } +} + +func BenchmarkGenerateKey(b *testing.B) { + var seed [32]byte + for i := 0; i < b.N; i++ { + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + NewKeyFromSeed(&seed) + } +} + +func BenchmarkPublicFromPrivate(b *testing.B) { + var seed [32]byte + for i := 0; i < b.N; i++ { + b.StopTimer() + binary.LittleEndian.PutUint64(seed[:], uint64(i)) + _, sk := NewKeyFromSeed(&seed) + b.StartTimer() + sk.Public() + } +} + +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 + for i := uint64(0); i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], i) + pk, sk := NewKeyFromSeed(&seed) + if !sk.Equal(sk) { + t.Fatal() + } + for j := uint64(0); j < 10; j++ { + binary.LittleEndian.PutUint64(msg[:], j) + SignTo(sk, msg[:], sig[:]) + if !Verify(pk, msg[:], sig[:]) { + t.Fatal() + } + } + pk.Pack(&pkb) + pk2.Unpack(&pkb) + if !pk.Equal(&pk2) { + t.Fatal() + } + sk.Pack(&skb) + sk2.Unpack(&skb) + if !sk.Equal(&sk2) { + t.Fatal() + } + } +} + +func TestPublicFromPrivate(t *testing.T) { + var seed [common.SeedSize]byte + for i := uint64(0); i < 100; i++ { + binary.LittleEndian.PutUint64(seed[:], i) + pk, sk := NewKeyFromSeed(&seed) + pk2 := sk.Public() + if !pk.Equal(pk2) { + t.Fatal() + } + } +} + +func TestGamma1Size(t *testing.T) { + var expected int + switch Gamma1Bits { + case 17: + expected = 576 + case 19: + expected = 640 + } + if expected != PolyLeGamma1Size { + t.Fatal() + } +} diff --git a/sign/mldsa/mldsa87/internal/mat.go b/sign/mldsa/mldsa87/internal/mat.go new file mode 100644 index 000000000..ceaf634fa --- /dev/null +++ b/sign/mldsa/mldsa87/internal/mat.go @@ -0,0 +1,59 @@ +// Code generated from mode3/internal/mat.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// A k by l matrix of polynomials. +type Mat [K]VecL + +// Expands the given seed to a complete matrix. +// +// This function is called ExpandA in the specification. +func (m *Mat) Derive(seed *[32]byte) { + if !DeriveX4Available { + for i := uint16(0); i < K; i++ { + for j := uint16(0); j < L; j++ { + PolyDeriveUniform(&m[i][j], seed, (i<<8)+j) + } + } + return + } + + idx := 0 + var nonces [4]uint16 + var ps [4]*common.Poly + for i := uint16(0); i < K; i++ { + for j := uint16(0); j < L; j++ { + nonces[idx] = (i << 8) + j + ps[idx] = &m[i][j] + idx++ + if idx == 4 { + idx = 0 + PolyDeriveUniformX4(ps, seed, nonces) + } + } + } + if idx != 0 { + for i := idx; i < 4; i++ { + ps[i] = nil + } + PolyDeriveUniformX4(ps, seed, nonces) + } +} + +// Set p to the inner product of a and b using pointwise multiplication. +// +// Assumes a and b are in Montgomery form and their coefficients are +// pairwise sufficiently small to multiply, see Poly.MulHat(). Resulting +// coefficients are bounded by 2Lq. +func PolyDotHat(p *common.Poly, a, b *VecL) { + var t common.Poly + *p = common.Poly{} // zero p + for i := 0; i < L; i++ { + t.MulHat(&a[i], &b[i]) + p.Add(&t, p) + } +} diff --git a/sign/mldsa/mldsa87/internal/pack.go b/sign/mldsa/mldsa87/internal/pack.go new file mode 100644 index 000000000..1854b4197 --- /dev/null +++ b/sign/mldsa/mldsa87/internal/pack.go @@ -0,0 +1,270 @@ +// Code generated from mode3/internal/pack.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Writes p with norm less than or equal η into buf, which must be of +// size PolyLeqEtaSize. +// +// Assumes coefficients of p are not normalized, but in [q-η,q+η]. +func PolyPackLeqEta(p *common.Poly, buf []byte) { + if DoubleEtaBits == 4 { // compiler eliminates branch + j := 0 + for i := 0; i < PolyLeqEtaSize; i++ { + buf[i] = (byte(common.Q+Eta-p[j]) | + byte(common.Q+Eta-p[j+1])<<4) + j += 2 + } + } else if DoubleEtaBits == 3 { + j := 0 + for i := 0; i < PolyLeqEtaSize; i += 3 { + buf[i] = (byte(common.Q+Eta-p[j]) | + (byte(common.Q+Eta-p[j+1]) << 3) | + (byte(common.Q+Eta-p[j+2]) << 6)) + buf[i+1] = ((byte(common.Q+Eta-p[j+2]) >> 2) | + (byte(common.Q+Eta-p[j+3]) << 1) | + (byte(common.Q+Eta-p[j+4]) << 4) | + (byte(common.Q+Eta-p[j+5]) << 7)) + buf[i+2] = ((byte(common.Q+Eta-p[j+5]) >> 1) | + (byte(common.Q+Eta-p[j+6]) << 2) | + (byte(common.Q+Eta-p[j+7]) << 5)) + j += 8 + } + } else { + panic("eta not supported") + } +} + +// Sets p to the polynomial of norm less than or equal η encoded in the +// given buffer of size PolyLeqEtaSize. +// +// Output coefficients of p are not normalized, but in [q-η,q+η] provided +// buf was created using PackLeqEta. +// +// Beware, for arbitrary buf the coefficients of p might end up in +// the interval [q-2^b,q+2^b] where b is the least b with η≤2^b. +func PolyUnpackLeqEta(p *common.Poly, buf []byte) { + if DoubleEtaBits == 4 { // compiler eliminates branch + j := 0 + for i := 0; i < PolyLeqEtaSize; i++ { + p[j] = common.Q + Eta - uint32(buf[i]&15) + p[j+1] = common.Q + Eta - uint32(buf[i]>>4) + j += 2 + } + } else if DoubleEtaBits == 3 { + j := 0 + for i := 0; i < PolyLeqEtaSize; i += 3 { + p[j] = common.Q + Eta - uint32(buf[i]&7) + p[j+1] = common.Q + Eta - uint32((buf[i]>>3)&7) + p[j+2] = common.Q + Eta - uint32((buf[i]>>6)|((buf[i+1]<<2)&7)) + p[j+3] = common.Q + Eta - uint32((buf[i+1]>>1)&7) + p[j+4] = common.Q + Eta - uint32((buf[i+1]>>4)&7) + p[j+5] = common.Q + Eta - uint32((buf[i+1]>>7)|((buf[i+2]<<1)&7)) + p[j+6] = common.Q + Eta - uint32((buf[i+2]>>2)&7) + p[j+7] = common.Q + Eta - uint32((buf[i+2]>>5)&7) + j += 8 + } + } else { + panic("eta not supported") + } +} + +// Writes v with coefficients in {0, 1} of which at most ω non-zero +// to buf, which must have length ω+k. +func (v *VecK) PackHint(buf []byte) { + // The packed hint starts with the indices of the non-zero coefficients + // For instance: + // + // (x⁵⁶ + x¹⁰⁰, x²⁵⁵, 0, x² + x²³, x¹) + // + // Yields + // + // 56, 100, 255, 2, 23, 1 + // + // Then we pad with zeroes until we have a list of ω items: + // // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0 + // + // Then we finish with a list of the switch-over-indices in this + // list between polynomials, so: + // + // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0, 2, 3, 3, 5, 6 + + off := uint8(0) + for i := 0; i < K; i++ { + for j := uint16(0); j < common.N; j++ { + if v[i][j] != 0 { + buf[off] = uint8(j) + off++ + } + } + buf[Omega+i] = off + } + for ; off < Omega; off++ { + buf[off] = 0 + } +} + +// Sets v to the vector encoded using VecK.PackHint() +// +// Returns whether unpacking was successful. +func (v *VecK) UnpackHint(buf []byte) bool { + // A priori, there would be several reasonable ways to encode the same + // hint vector. We take care to only allow only one encoding, to ensure + // "strong unforgeability". + // + // See PackHint() source for description of the encoding. + *v = VecK{} // zero v + prevSOP := uint8(0) // previous switch-over-point + for i := 0; i < K; i++ { + SOP := buf[Omega+i] + if SOP < prevSOP || SOP > Omega { + return false // ensures switch-over-points are increasing + } + for j := prevSOP; j < SOP; j++ { + if j > prevSOP && buf[j] <= buf[j-1] { + return false // ensures indices are increasing (within a poly) + } + v[i][buf[j]] = 1 + } + prevSOP = SOP + } + for j := prevSOP; j < Omega; j++ { + if buf[j] != 0 { + return false // ensures padding indices are zero + } + } + + return true +} + +// Sets p to the polynomial packed into buf by PolyPackLeGamma1. +// +// p will be normalized. +func PolyUnpackLeGamma1(p *common.Poly, buf []byte) { + if Gamma1Bits == 17 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 9 { + p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | + (uint32(buf[i+2]&0x3) << 16) + p1 := uint32(buf[i+2]>>2) | (uint32(buf[i+3]) << 6) | + (uint32(buf[i+4]&0xf) << 14) + p2 := uint32(buf[i+4]>>4) | (uint32(buf[i+5]) << 4) | + (uint32(buf[i+6]&0x3f) << 12) + p3 := uint32(buf[i+6]>>6) | (uint32(buf[i+7]) << 2) | + (uint32(buf[i+8]) << 10) + + // coefficients in [0,…,2γ₁) + p0 = Gamma1 - p0 // (-γ₁,…,γ₁] + p1 = Gamma1 - p1 + p2 = Gamma1 - p2 + p3 = Gamma1 - p3 + + p0 += uint32(int32(p0)>>31) & common.Q // normalize + p1 += uint32(int32(p1)>>31) & common.Q + p2 += uint32(int32(p2)>>31) & common.Q + p3 += uint32(int32(p3)>>31) & common.Q + + p[j] = p0 + p[j+1] = p1 + p[j+2] = p2 + p[j+3] = p3 + + j += 4 + } + } else if Gamma1Bits == 19 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 5 { + p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | + (uint32(buf[i+2]&0xf) << 16) + p1 := uint32(buf[i+2]>>4) | (uint32(buf[i+3]) << 4) | + (uint32(buf[i+4]) << 12) + + p0 = Gamma1 - p0 + p1 = Gamma1 - p1 + + p0 += uint32(int32(p0)>>31) & common.Q + p1 += uint32(int32(p1)>>31) & common.Q + + p[j] = p0 + p[j+1] = p1 + + j += 2 + } + } else { + panic("γ₁ not supported") + } +} + +// Writes p whose coefficients are in (-γ₁,γ₁] into buf +// which has to be of length PolyLeGamma1Size. +// +// Assumes p is normalized. +func PolyPackLeGamma1(p *common.Poly, buf []byte) { + if Gamma1Bits == 17 { + j := 0 + // coefficients in [0,…,γ₁] ∪ (q-γ₁,…,q) + for i := 0; i < PolyLeGamma1Size; i += 9 { + p0 := Gamma1 - p[j] // [0,…,γ₁] ∪ (γ₁-q,…,2γ₁-q) + p0 += uint32(int32(p0)>>31) & common.Q // [0,…,2γ₁) + p1 := Gamma1 - p[j+1] + p1 += uint32(int32(p1)>>31) & common.Q + p2 := Gamma1 - p[j+2] + p2 += uint32(int32(p2)>>31) & common.Q + p3 := Gamma1 - p[j+3] + p3 += uint32(int32(p3)>>31) & common.Q + + buf[i+0] = byte(p0) + buf[i+1] = byte(p0 >> 8) + buf[i+2] = byte(p0>>16) | byte(p1<<2) + buf[i+3] = byte(p1 >> 6) + buf[i+4] = byte(p1>>14) | byte(p2<<4) + buf[i+5] = byte(p2 >> 4) + buf[i+6] = byte(p2>>12) | byte(p3<<6) + buf[i+7] = byte(p3 >> 2) + buf[i+8] = byte(p3 >> 10) + + j += 4 + } + } else if Gamma1Bits == 19 { + j := 0 + for i := 0; i < PolyLeGamma1Size; i += 5 { + // Coefficients are in [0, γ₁] ∪ (Q-γ₁, Q) + p0 := Gamma1 - p[j] + p0 += uint32(int32(p0)>>31) & common.Q + p1 := Gamma1 - p[j+1] + p1 += uint32(int32(p1)>>31) & common.Q + + buf[i+0] = byte(p0) + buf[i+1] = byte(p0 >> 8) + buf[i+2] = byte(p0>>16) | byte(p1<<4) + buf[i+3] = byte(p1 >> 4) + buf[i+4] = byte(p1 >> 12) + + j += 2 + } + } else { + panic("γ₁ not supported") + } +} + +// Pack w₁ into buf, which must be of length PolyW1Size. +// +// Assumes w₁ is normalized. +func PolyPackW1(p *common.Poly, buf []byte) { + if Gamma1Bits == 19 { + p.PackLe16(buf) + } else if Gamma1Bits == 17 { + j := 0 + for i := 0; i < PolyW1Size; i += 3 { + buf[i] = byte(p[j]) | byte(p[j+1]<<6) + buf[i+1] = byte(p[j+1]>>2) | byte(p[j+2]<<4) + buf[i+2] = byte(p[j+2]>>4) | byte(p[j+3]<<2) + j += 4 + } + } else { + panic("unsupported γ₁") + } +} diff --git a/sign/mldsa/mldsa87/internal/pack_test.go b/sign/mldsa/mldsa87/internal/pack_test.go new file mode 100644 index 000000000..f952c6a09 --- /dev/null +++ b/sign/mldsa/mldsa87/internal/pack_test.go @@ -0,0 +1,93 @@ +// Code generated from mode3/internal/pack_test.go by gen.go + +package internal + +import ( + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +func TestPolyPackLeqEta(t *testing.T) { + var p1, p2 common.Poly + var seed [64]byte + var buf [PolyLeqEtaSize]byte + + for i := uint16(0); i < 100; i++ { + // Note that DeriveUniformLeqEta sets p to the right kind of + // unnormalized vector. + PolyDeriveUniformLeqEta(&p1, &seed, i) + for j := 0; j < PolyLeqEtaSize; j++ { + if p1[j] < common.Q-Eta || p1[j] > common.Q+Eta { + t.Fatalf("DerveUniformLeqEta out of bounds") + } + } + PolyPackLeqEta(&p1, buf[:]) + PolyUnpackLeqEta(&p2, buf[:]) + if p1 != p2 { + t.Fatalf("%v != %v", p1, p2) + } + } +} + +func TestPolyPackT1(t *testing.T) { + var p1, p2 common.Poly + var seed [32]byte + var buf [common.PolyT1Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniform(&p1, &seed, i) + p1.Normalize() + for j := 0; j < common.N; j++ { + p1[j] &= 0x1ff + } + p1.PackT1(buf[:]) + p2.UnpackT1(buf[:]) + if p1 != p2 { + t.Fatalf("%v != %v", p1, p2) + } + } +} + +func TestPolyPackT0(t *testing.T) { + var p, p0, p1, p2 common.Poly + var seed [32]byte + var buf [common.PolyT0Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniform(&p, &seed, i) + p.Normalize() + p.Power2Round(&p0, &p1) + + p0.PackT0(buf[:]) + p2.UnpackT0(buf[:]) + if p0 != p2 { + t.Fatalf("%v !=\n%v", p0, p2) + } + } +} + +func BenchmarkUnpackLeGamma1(b *testing.B) { + var p common.Poly + var buf [PolyLeGamma1Size]byte + for i := 0; i < b.N; i++ { + PolyUnpackLeGamma1(&p, buf[:]) + } +} + +func TestPolyPackLeGamma1(t *testing.T) { + var p0, p1 common.Poly + var seed [64]byte + var buf [PolyLeGamma1Size]byte + + for i := uint16(0); i < 100; i++ { + PolyDeriveUniformLeGamma1(&p0, &seed, i) + p0.Normalize() + + PolyPackLeGamma1(&p0, buf[:]) + PolyUnpackLeGamma1(&p1, buf[:]) + if p0 != p1 { + t.Fatalf("%v != %v", p0, p1) + } + } +} diff --git a/sign/mldsa/mldsa87/internal/params.go b/sign/mldsa/mldsa87/internal/params.go new file mode 100644 index 000000000..e60c4d35f --- /dev/null +++ b/sign/mldsa/mldsa87/internal/params.go @@ -0,0 +1,19 @@ +// Code generated from params.templ.go. DO NOT EDIT. + +package internal + +const ( + Name = "ML-DSA-87" + UseAES = false + K = 8 + L = 7 + Eta = 2 + DoubleEtaBits = 3 + Omega = 75 + Tau = 60 + Gamma1Bits = 19 + Gamma2 = 261888 + NIST = true + TRSize = 64 + CTildeSize = 64 +) diff --git a/sign/mldsa/mldsa87/internal/rounding.go b/sign/mldsa/mldsa87/internal/rounding.go new file mode 100644 index 000000000..58123c090 --- /dev/null +++ b/sign/mldsa/mldsa87/internal/rounding.go @@ -0,0 +1,142 @@ +// Code generated from mode3/internal/rounding.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, +// except for when we would have a₁ = (q-1)/α in which case a₁=0 is taken +// and -α/2 ≤ a₀ < 0. Returns a₀ + q. Note 0 ≤ a₁ < (q-1)/α. +// Recall α = 2γ₂. +func decompose(a uint32) (a0plusQ, a1 uint32) { + // a₁ = ⌈a / 128⌉ + a1 = (a + 127) >> 7 + + if Alpha == 523776 { + // 1025/2²² is close enough to 1/4092 so that a₁ + // becomes a/α rounded down. + a1 = ((a1*1025 + (1 << 21)) >> 22) + + // For the corner-case a₁ = (q-1)/α = 16, we have to set a₁=0. + a1 &= 15 + } else if Alpha == 190464 { + // 1488/2²⁴ is close enough to 1/1488 so that a₁ + // becomes a/α rounded down. + a1 = ((a1 * 11275) + (1 << 23)) >> 24 + + // For the corner-case a₁ = (q-1)/α = 44, we have to set a₁=0. + a1 ^= uint32(int32(43-a1)>>31) & a1 + } else { + panic("unsupported α") + } + + a0plusQ = a - a1*Alpha + + // In the corner-case, when we set a₁=0, we will incorrectly + // have a₀ > (q-1)/2 and we'll need to subtract q. As we + // return a₀ + q, that comes down to adding q if a₀ < (q-1)/2. + a0plusQ += uint32(int32(a0plusQ-(common.Q-1)/2)>>31) & common.Q + + return +} + +// Assume 0 ≤ r, f < Q with ‖f‖_∞ ≤ α/2. Decompose r as r = r1*α + r0 as +// computed by decompose(). Write r' := r - f (mod Q). Now, decompose +// r'=r-f again as r' = r'1*α + r'0 using decompose(). As f is small, we +// have r'1 = r1 + h, where h ∈ {-1, 0, 1}. makeHint() computes |h| +// given z0 := r0 - f (mod Q) and r1. With |h|, which is called the hint, +// we can reconstruct r1 using only r' = r - f, which is done by useHint(). +// To wit: +// +// useHint( r - f, makeHint( r0 - f, r1 ) ) = r1. +// +// Assumes 0 ≤ z0 < Q. +func makeHint(z0, r1 uint32) uint32 { + // If -α/2 < r0 - f ≤ α/2, then r1*α + r0 - f is a valid decomposition of r' + // with the restrictions of decompose() and so r'1 = r1. So the hint + // should be 0. This is covered by the first two inequalities. + // There is one other case: if r0 - f = -α/2, then r1*α + r0 - f is also + // a valid decomposition if r1 = 0. In the other cases a one is carried + // and the hint should be 1. + if z0 <= Gamma2 || z0 > common.Q-Gamma2 || (z0 == common.Q-Gamma2 && r1 == 0) { + return 0 + } + return 1 +} + +// Uses the hint created by makeHint() to reconstruct r1 from r'=r-f; see +// documentation of makeHint() for context. +// Assumes 0 ≤ r' < Q. +func useHint(rp uint32, hint uint32) uint32 { + rp0plusQ, rp1 := decompose(rp) + if hint == 0 { + return rp1 + } + if rp0plusQ > common.Q { + return (rp1 + 1) & 15 + } + return (rp1 - 1) & 15 +} + +// Sets p to the hint polynomial for p0 the modified low bits and p1 +// the unmodified high bits --- see makeHint(). +// +// Returns the number of ones in the hint polynomial. +func PolyMakeHint(p, p0, p1 *common.Poly) (pop uint32) { + for i := 0; i < common.N; i++ { + h := makeHint(p0[i], p1[i]) + pop += h + p[i] = h + } + return +} + +// Computes corrections to the high bits of the polynomial q according +// to the hints in h and sets p to the corrected high bits. Returns p. +func PolyUseHint(p, q, hint *common.Poly) { + var q0PlusQ common.Poly + + // See useHint() and makeHint() for an explanation. We reimplement it + // here so that we can call Poly.Decompose(), which might be way faster + // than calling decompose() in a loop (for instance when having AVX2.) + + PolyDecompose(q, &q0PlusQ, p) + + for i := 0; i < common.N; i++ { + if hint[i] == 0 { + continue + } + if Gamma2 == 261888 { + if q0PlusQ[i] > common.Q { + p[i] = (p[i] + 1) & 15 + } else { + p[i] = (p[i] - 1) & 15 + } + } else if Gamma2 == 95232 { + if q0PlusQ[i] > common.Q { + if p[i] == 43 { + p[i] = 0 + } else { + p[i]++ + } + } else { + if p[i] == 0 { + p[i] = 43 + } else { + p[i]-- + } + } + } else { + panic("unsupported γ₂") + } + } +} + +// Splits each of the coefficients of p using decompose. +func PolyDecompose(p, p0PlusQ, p1 *common.Poly) { + for i := 0; i < common.N; i++ { + p0PlusQ[i], p1[i] = decompose(p[i]) + } +} diff --git a/sign/mldsa/mldsa87/internal/rounding_test.go b/sign/mldsa/mldsa87/internal/rounding_test.go new file mode 100644 index 000000000..ad653ca3f --- /dev/null +++ b/sign/mldsa/mldsa87/internal/rounding_test.go @@ -0,0 +1,81 @@ +// Code generated from mode3/internal/rounding_test.go by gen.go + +package internal + +import ( + "flag" + "testing" + + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") + +func TestDecompose(t *testing.T) { + for a := uint32(0); a < common.Q; a++ { + a0PlusQ, a1 := decompose(a) + a0 := int32(a0PlusQ) - int32(common.Q) + recombined := a0 + int32(Alpha*a1) + if a1 == 0 && recombined < 0 { + recombined += common.Q + if -(Alpha/2) > a0 || a0 >= 0 { + t.Fatalf("decompose(%v): a0 out of bounds", a) + } + } else { + if (-(Alpha / 2) >= a0) || (a0 > Alpha/2) { + t.Fatalf("decompose(%v): a0 out of bounds", a) + } + } + if int32(a) != recombined { + t.Fatalf("decompose(%v) doesn't recombine %v %v", a, a0, a1) + } + } +} + +func TestMakeHint(t *testing.T) { + if !*runVeryLongTest { + t.SkipNow() + } + for w := uint32(0); w < common.Q; w++ { + w0, w1 := decompose(w) + for fn := uint32(0); fn <= Gamma2; fn++ { + fsign := false + for { + var f uint32 + if fsign { + if fn == 0 { + break + } + f = common.Q - fn + } else { + f = fn + } + + hint := makeHint(common.ReduceLe2Q(w0+common.Q-f), w1) + w1p := useHint(common.ReduceLe2Q(w+common.Q-f), hint) + if w1p != w1 { + t.Fatal() + } + + if fsign { + break + } + fsign = true + } + } + } +} + +func BenchmarkDecompose(b *testing.B) { + var p, p0, p1 common.Poly + for i := 0; i < b.N; i++ { + PolyDecompose(&p, &p0, &p1) + } +} + +func BenchmarkMakeHint(b *testing.B) { + var p, p0, p1 common.Poly + for i := 0; i < b.N; i++ { + PolyMakeHint(&p, &p0, &p1) + } +} diff --git a/sign/mldsa/mldsa87/internal/sample.go b/sign/mldsa/mldsa87/internal/sample.go new file mode 100644 index 000000000..62c261332 --- /dev/null +++ b/sign/mldsa/mldsa87/internal/sample.go @@ -0,0 +1,370 @@ +// Code generated from mode3/internal/sample.go by gen.go + +package internal + +import ( + "encoding/binary" + + "github.com/cloudflare/circl/internal/sha3" + 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 + +// 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. +// +// Can only be called when DeriveX4Available is true. +func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { + var perm keccakf1600.StateX4 + state := perm.Initialize(false) + + // Absorb the seed in the four states + for i := 0; i < 4; i++ { + v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) + for j := 0; j < 4; j++ { + state[i*4+j] = v + } + } + + // Absorb the nonces, the SHAKE128 domain separator (0b1111), the + // start of the padding (0b...001) and the end of the padding 0b100... + // Recall that the rate of SHAKE128 is 168 --- i.e. 21 uint64s. + for j := 0; j < 4; j++ { + state[4*4+j] = uint64(nonces[j]) | (0x1f << 16) + state[20*4+j] = 0x80 << 56 + } + + var idx [4]int // indices into ps + for j := 0; j < 4; j++ { + if ps[j] == nil { + idx[j] = common.N // mark nil polynomial as completed + } + } + + done := false + for !done { + // Applies KeccaK-f[1600] to state to get the next 21 uint64s of each + // of the four SHAKE128 streams. + perm.Permute() + + done = true + + PolyLoop: + for j := 0; j < 4; j++ { + if idx[j] == common.N { + continue + } + for i := 0; i < 7; i++ { + var t [8]uint32 + t[0] = uint32(state[i*3*4+j] & 0x7fffff) + t[1] = uint32((state[i*3*4+j] >> 24) & 0x7fffff) + t[2] = uint32((state[i*3*4+j] >> 48) | + ((state[(i*3+1)*4+j] & 0x7f) << 16)) + t[3] = uint32((state[(i*3+1)*4+j] >> 8) & 0x7fffff) + t[4] = uint32((state[(i*3+1)*4+j] >> 32) & 0x7fffff) + t[5] = uint32((state[(i*3+1)*4+j] >> 56) | + ((state[(i*3+2)*4+j] & 0x7fff) << 8)) + t[6] = uint32((state[(i*3+2)*4+j] >> 16) & 0x7fffff) + t[7] = uint32((state[(i*3+2)*4+j] >> 40) & 0x7fffff) + + for k := 0; k < 8; k++ { + if t[k] < common.Q { + ps[j][idx[j]] = t[k] + idx[j]++ + if idx[j] == common.N { + continue PolyLoop + } + } + } + } + done = false + } + } +} + +// Sample p uniformly from the given seed and nonce. +// +// 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 + + if UseAES { + length = 12 * 16 + } else { + length = 168 + } + + sample := func() { + // Note that 3 divides into 168 and 12*16, so we use up buf completely. + for j := 0; j < length && i < common.N; j += 3 { + t := (uint32(buf[j]) | (uint32(buf[j+1]) << 8) | + (uint32(buf[j+2]) << 16)) & 0x7fffff + + // We use rejection sampling + if t < common.Q { + p[i] = t + i++ + } + } + } + + if UseAES { + h := common.NewAesStream128(seed, nonce) + + 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() + } + } +} + +// Sample p uniformly with coefficients of norm less than or equal η, +// using the given seed and nonce. +// +// p will not be normalized, but will have coefficients in [q-η,q+η]. +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 + + if UseAES { + length = 9 * 16 + } else { + length = 136 + } + + sample := func() { + // We use rejection sampling + for j := 0; j < length && i < common.N; j++ { + t1 := uint32(buf[j]) & 15 + t2 := uint32(buf[j]) >> 4 + if Eta == 2 { // branch is eliminated by compiler + if t1 <= 14 { + t1 -= ((205 * t1) >> 10) * 5 // reduce mod 5 + p[i] = common.Q + Eta - t1 + i++ + } + if t2 <= 14 && i < common.N { + t2 -= ((205 * t2) >> 10) * 5 // reduce mod 5 + p[i] = common.Q + Eta - t2 + i++ + } + } else if Eta == 4 { + if t1 <= 2*Eta { + p[i] = common.Q + Eta - t1 + i++ + } + if t2 <= 2*Eta && i < common.N { + p[i] = common.Q + Eta - t2 + i++ + } + } else { + panic("unsupported η") + } + } + } + + 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 + + h := sha3.NewShake256() + copy(iv[:64], seed[:]) + iv[64] = uint8(nonce) + iv[65] = uint8(nonce >> 8) + + // 136 is SHAKE-256 rate + _, _ = h.Write(iv[:]) + + for i < common.N { + _, _ = h.Read(buf[:136]) + sample() + } + } +} + +// Sample v[i] uniformly with coefficients in (-γ₁,…,γ₁] using the +// given seed and nonce+i +// +// p will be normalized. +func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { + for i := 0; i < L; i++ { + PolyDeriveUniformLeGamma1(&v[i], seed, nonce+uint16(i)) + } +} + +// Sample p uniformly with coefficients in (-γ₁,…,γK1s] using the +// given seed and nonce. +// +// p will be normalized. +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[:]) + } + + PolyUnpackLeGamma1(p, buf[:]) +} + +// For each i, sample ps[i] uniformly with τ non-zero coefficients in {q-1,1} +// using the given seed and w1[i]. ps[i] may be nil and is ignored +// in that case. ps[i] will be normalized. +// +// Can only be called when DeriveX4Available is true. +// +// This function is currently not used (yet). +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 < 32/8; i++ { + v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) + for j := 0; j < 4; j++ { + state[i*4+j] = v + } + } + + // SHAKE256 domain separator and padding + for j := 0; j < 4; j++ { + state[(32/8)*4+j] ^= 0x1f + state[16*4+j] ^= 0x80 << 56 + } + perm.Permute() + + var signs [4]uint64 + var idx [4]uint16 // indices into ps + + for j := 0; j < 4; j++ { + if ps[j] != nil { + signs[j] = state[j] + *ps[j] = common.Poly{} // zero ps[j] + idx[j] = common.N - Tau + } else { + idx[j] = common.N // mark as completed + } + } + + stateOffset := 1 + for { + done := true + + PolyLoop: + for j := 0; j < 4; j++ { + if idx[j] == common.N { + continue + } + + for i := stateOffset; i < 17; i++ { + var bs [8]byte + binary.LittleEndian.PutUint64(bs[:], state[4*i+j]) + for k := 0; k < 8; k++ { + b := uint16(bs[k]) + + if b > idx[j] { + continue + } + + ps[j][idx[j]] = ps[j][b] + ps[j][b] = 1 + // Takes least significant bit of signs and uses it for the sign. + // Note 1 ^ (1 | (Q-1)) = Q-1. + ps[j][b] ^= uint32((-(signs[j] & 1)) & (1 | (common.Q - 1))) + signs[j] >>= 1 + + idx[j]++ + if idx[j] == common.N { + continue PolyLoop + } + } + } + + done = false + } + + if done { + break + } + + perm.Permute() + stateOffset = 0 + } +} + +// Samples p uniformly with τ non-zero coefficients in {q-1,1}. +// +// The polynomial p will be normalized. +func PolyDeriveUniformBall(p *common.Poly, seed []byte) { + var buf [136]byte // SHAKE-256 rate is 136 + + h := sha3.NewShake256() + _, _ = h.Write(seed[:]) + _, _ = h.Read(buf[:]) + + // Essentially we generate a sequence of τ ones or minus ones, + // prepend 196 zeroes and shuffle the concatenation using the + // usual algorithm (Fisher--Yates.) + signs := binary.LittleEndian.Uint64(buf[:]) + bufOff := 8 // offset into buf + + *p = common.Poly{} // zero p + for i := uint16(common.N - Tau); i < common.N; i++ { + var b uint16 + + // Find location of where to move the new coefficient to using + // rejection sampling. + for { + if bufOff >= 136 { + _, _ = h.Read(buf[:]) + bufOff = 0 + } + + b = uint16(buf[bufOff]) + bufOff++ + + if b <= i { + break + } + } + + p[i] = p[b] + p[b] = 1 + // Takes least significant bit of signs and uses it for the sign. + // Note 1 ^ (1 | (Q-1)) = Q-1. + p[b] ^= uint32((-(signs & 1)) & (1 | (common.Q - 1))) + signs >>= 1 + } +} diff --git a/sign/mldsa/mldsa87/internal/sample_test.go b/sign/mldsa/mldsa87/internal/sample_test.go new file mode 100644 index 000000000..2059599eb --- /dev/null +++ b/sign/mldsa/mldsa87/internal/sample_test.go @@ -0,0 +1,266 @@ +// 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 + 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/mldsa/mldsa87/internal/vec.go b/sign/mldsa/mldsa87/internal/vec.go new file mode 100644 index 000000000..d07d3b245 --- /dev/null +++ b/sign/mldsa/mldsa87/internal/vec.go @@ -0,0 +1,281 @@ +// Code generated from mode3/internal/vec.go by gen.go + +package internal + +import ( + common "github.com/cloudflare/circl/sign/internal/dilithium" +) + +// A vector of L polynomials. +type VecL [L]common.Poly + +// A vector of K polynomials. +type VecK [K]common.Poly + +// Normalize the polynomials in this vector. +func (v *VecL) Normalize() { + for i := 0; i < L; i++ { + v[i].Normalize() + } +} + +// Normalize the polynomials in this vector assuming their coefficients +// are already bounded by 2q. +func (v *VecL) NormalizeAssumingLe2Q() { + for i := 0; i < L; i++ { + v[i].NormalizeAssumingLe2Q() + } +} + +// Sets v to w + u. Does not normalize. +func (v *VecL) Add(w, u *VecL) { + for i := 0; i < L; i++ { + v[i].Add(&w[i], &u[i]) + } +} + +// Applies NTT componentwise. See Poly.NTT() for details. +func (v *VecL) NTT() { + for i := 0; i < L; i++ { + v[i].NTT() + } +} + +// Checks whether any of the coefficients exceeds the given bound in supnorm +// +// Requires the vector to be normalized. +func (v *VecL) Exceeds(bound uint32) bool { + for i := 0; i < L; i++ { + if v[i].Exceeds(bound) { + return true + } + } + return false +} + +// Applies Poly.Power2Round componentwise. +// +// Requires the vector to be normalized. +func (v *VecL) Power2Round(v0PlusQ, v1 *VecL) { + for i := 0; i < L; i++ { + v[i].Power2Round(&v0PlusQ[i], &v1[i]) + } +} + +// Applies Poly.Decompose componentwise. +// +// Requires the vector to be normalized. +func (v *VecL) Decompose(v0PlusQ, v1 *VecL) { + for i := 0; i < L; i++ { + PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) + } +} + +// Sequentially packs each polynomial using Poly.PackLeqEta(). +func (v *VecL) PackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyPackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sets v to the polynomials packed in buf using VecL.PackLeqEta(). +func (v *VecL) UnpackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyUnpackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sequentially packs each polynomial using PolyPackLeGamma1(). +func (v *VecL) PackLeGamma1(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyPackLeGamma1(&v[i], buf[offset:]) + offset += PolyLeGamma1Size + } +} + +// Sets v to the polynomials packed in buf using VecL.PackLeGamma1(). +func (v *VecL) UnpackLeGamma1(buf []byte) { + offset := 0 + for i := 0; i < L; i++ { + PolyUnpackLeGamma1(&v[i], buf[offset:]) + offset += PolyLeGamma1Size + } +} + +// Normalize the polynomials in this vector. +func (v *VecK) Normalize() { + for i := 0; i < K; i++ { + v[i].Normalize() + } +} + +// Normalize the polynomials in this vector assuming their coefficients +// are already bounded by 2q. +func (v *VecK) NormalizeAssumingLe2Q() { + for i := 0; i < K; i++ { + v[i].NormalizeAssumingLe2Q() + } +} + +// Sets v to w + u. Does not normalize. +func (v *VecK) Add(w, u *VecK) { + for i := 0; i < K; i++ { + v[i].Add(&w[i], &u[i]) + } +} + +// Checks whether any of the coefficients exceeds the given bound in supnorm +// +// Requires the vector to be normalized. +func (v *VecK) Exceeds(bound uint32) bool { + for i := 0; i < K; i++ { + if v[i].Exceeds(bound) { + return true + } + } + return false +} + +// Applies Poly.Power2Round componentwise. +// +// Requires the vector to be normalized. +func (v *VecK) Power2Round(v0PlusQ, v1 *VecK) { + for i := 0; i < K; i++ { + v[i].Power2Round(&v0PlusQ[i], &v1[i]) + } +} + +// Applies Poly.Decompose componentwise. +// +// Requires the vector to be normalized. +func (v *VecK) Decompose(v0PlusQ, v1 *VecK) { + for i := 0; i < K; i++ { + PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) + } +} + +// Sets v to the hint vector for v0 the modified low bits and v1 +// the unmodified high bits --- see makeHint(). +// +// Returns the number of ones in the hint vector. +func (v *VecK) MakeHint(v0, v1 *VecK) (pop uint32) { + for i := 0; i < K; i++ { + pop += PolyMakeHint(&v[i], &v0[i], &v1[i]) + } + return +} + +// Computes corrections to the high bits of the polynomials in the vector +// w using the hints in h and sets v to the corrected high bits. Returns v. +// See useHint(). +func (v *VecK) UseHint(q, hint *VecK) *VecK { + for i := 0; i < K; i++ { + PolyUseHint(&v[i], &q[i], &hint[i]) + } + return v +} + +// Sequentially packs each polynomial using Poly.PackT1(). +func (v *VecK) PackT1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].PackT1(buf[offset:]) + offset += common.PolyT1Size + } +} + +// Sets v to the vector packed into buf by PackT1(). +func (v *VecK) UnpackT1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].UnpackT1(buf[offset:]) + offset += common.PolyT1Size + } +} + +// Sequentially packs each polynomial using Poly.PackT0(). +func (v *VecK) PackT0(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].PackT0(buf[offset:]) + offset += common.PolyT0Size + } +} + +// Sets v to the vector packed into buf by PackT0(). +func (v *VecK) UnpackT0(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + v[i].UnpackT0(buf[offset:]) + offset += common.PolyT0Size + } +} + +// Sequentially packs each polynomial using Poly.PackLeqEta(). +func (v *VecK) PackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyPackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Sets v to the polynomials packed in buf using VecK.PackLeqEta(). +func (v *VecK) UnpackLeqEta(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyUnpackLeqEta(&v[i], buf[offset:]) + offset += PolyLeqEtaSize + } +} + +// Applies NTT componentwise. See Poly.NTT() for details. +func (v *VecK) NTT() { + for i := 0; i < K; i++ { + v[i].NTT() + } +} + +// Sequentially packs each polynomial using PolyPackW1(). +func (v *VecK) PackW1(buf []byte) { + offset := 0 + for i := 0; i < K; i++ { + PolyPackW1(&v[i], buf[offset:]) + offset += PolyW1Size + } +} + +// Sets v to a - b. +// +// Warning: assumes coefficients of the polynomials of b are less than 2q. +func (v *VecK) Sub(a, b *VecK) { + for i := 0; i < K; i++ { + v[i].Sub(&a[i], &b[i]) + } +} + +// Sets v to 2ᵈ w without reducing. +func (v *VecK) MulBy2toD(w *VecK) { + for i := 0; i < K; i++ { + v[i].MulBy2toD(&w[i]) + } +} + +// Applies InvNTT componentwise. See Poly.InvNTT() for details. +func (v *VecK) InvNTT() { + for i := 0; i < K; i++ { + v[i].InvNTT() + } +} + +// Applies Poly.ReduceLe2Q() componentwise. +func (v *VecK) ReduceLe2Q() { + for i := 0; i < K; i++ { + v[i].ReduceLe2Q() + } +} From bf96f6ee69114807751a0e951127b099cdb463c5 Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Wed, 28 Feb 2024 23:59:31 +0100 Subject: [PATCH 02/11] dilithium: fix typo in privkey size panic Thanks-to: @wussler --- sign/dilithium/mldsa44.go | 2 +- sign/dilithium/mldsa65.go | 2 +- sign/dilithium/mldsa87.go | 2 +- sign/dilithium/mode2.go | 2 +- sign/dilithium/mode2aes.go | 2 +- sign/dilithium/mode3.go | 2 +- sign/dilithium/mode3aes.go | 2 +- sign/dilithium/mode5.go | 2 +- sign/dilithium/mode5aes.go | 2 +- sign/dilithium/templates/mode.templ.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sign/dilithium/mldsa44.go b/sign/dilithium/mldsa44.go index 1cbaf0174..5df54821e 100644 --- a/sign/dilithium/mldsa44.go +++ b/sign/dilithium/mldsa44.go @@ -58,7 +58,7 @@ func (m *implMLDSA44) PublicKeyFromBytes(data []byte) PublicKey { func (m *implMLDSA44) PrivateKeyFromBytes(data []byte) PrivateKey { var ret mldsa44.PrivateKey if len(data) != mldsa44.PrivateKeySize { - panic("packed public key must be of mldsa44.PrivateKeySize bytes") + panic("packed private key must be of mldsa44.PrivateKeySize bytes") } var buf [mldsa44.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/mldsa65.go b/sign/dilithium/mldsa65.go index 8c39363e8..bb035227b 100644 --- a/sign/dilithium/mldsa65.go +++ b/sign/dilithium/mldsa65.go @@ -58,7 +58,7 @@ func (m *implMLDSA65) PublicKeyFromBytes(data []byte) PublicKey { func (m *implMLDSA65) PrivateKeyFromBytes(data []byte) PrivateKey { var ret mldsa65.PrivateKey if len(data) != mldsa65.PrivateKeySize { - panic("packed public key must be of mldsa65.PrivateKeySize bytes") + panic("packed private key must be of mldsa65.PrivateKeySize bytes") } var buf [mldsa65.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/mldsa87.go b/sign/dilithium/mldsa87.go index bc125430b..d3d98420a 100644 --- a/sign/dilithium/mldsa87.go +++ b/sign/dilithium/mldsa87.go @@ -58,7 +58,7 @@ func (m *implMLDSA87) PublicKeyFromBytes(data []byte) PublicKey { func (m *implMLDSA87) PrivateKeyFromBytes(data []byte) PrivateKey { var ret mldsa87.PrivateKey if len(data) != mldsa87.PrivateKeySize { - panic("packed public key must be of mldsa87.PrivateKeySize bytes") + panic("packed private key must be of mldsa87.PrivateKeySize bytes") } var buf [mldsa87.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/mode2.go b/sign/dilithium/mode2.go index 7e27eff2c..113715025 100644 --- a/sign/dilithium/mode2.go +++ b/sign/dilithium/mode2.go @@ -57,7 +57,7 @@ func (m *implMode2) PublicKeyFromBytes(data []byte) PublicKey { 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") + panic("packed private key must be of mode2.PrivateKeySize bytes") } var buf [mode2.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/mode2aes.go b/sign/dilithium/mode2aes.go index e973a70f6..6985ccf84 100644 --- a/sign/dilithium/mode2aes.go +++ b/sign/dilithium/mode2aes.go @@ -57,7 +57,7 @@ func (m *implMode2AES) PublicKeyFromBytes(data []byte) PublicKey { 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") + panic("packed private key must be of mode2aes.PrivateKeySize bytes") } var buf [mode2aes.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/mode3.go b/sign/dilithium/mode3.go index 147678612..7726023f2 100644 --- a/sign/dilithium/mode3.go +++ b/sign/dilithium/mode3.go @@ -57,7 +57,7 @@ func (m *implMode3) PublicKeyFromBytes(data []byte) PublicKey { 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") + panic("packed private key must be of mode3.PrivateKeySize bytes") } var buf [mode3.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/mode3aes.go b/sign/dilithium/mode3aes.go index bdbe19020..f7414f15b 100644 --- a/sign/dilithium/mode3aes.go +++ b/sign/dilithium/mode3aes.go @@ -57,7 +57,7 @@ func (m *implMode3AES) PublicKeyFromBytes(data []byte) PublicKey { 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") + panic("packed private key must be of mode3aes.PrivateKeySize bytes") } var buf [mode3aes.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/mode5.go b/sign/dilithium/mode5.go index c9b55dd30..2e282fe8f 100644 --- a/sign/dilithium/mode5.go +++ b/sign/dilithium/mode5.go @@ -57,7 +57,7 @@ func (m *implMode5) PublicKeyFromBytes(data []byte) PublicKey { 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") + panic("packed private key must be of mode5.PrivateKeySize bytes") } var buf [mode5.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/mode5aes.go b/sign/dilithium/mode5aes.go index 0dfd3854f..b7f1cb485 100644 --- a/sign/dilithium/mode5aes.go +++ b/sign/dilithium/mode5aes.go @@ -57,7 +57,7 @@ func (m *implMode5AES) PublicKeyFromBytes(data []byte) PublicKey { 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") + panic("packed private key must be of mode5aes.PrivateKeySize bytes") } var buf [mode5aes.PrivateKeySize]byte copy(buf[:], data) diff --git a/sign/dilithium/templates/mode.templ.go b/sign/dilithium/templates/mode.templ.go index fb7930de9..445514bcc 100644 --- a/sign/dilithium/templates/mode.templ.go +++ b/sign/dilithium/templates/mode.templ.go @@ -67,7 +67,7 @@ func (m *{{.Impl}}) PublicKeyFromBytes(data []byte) PublicKey { 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") + panic("packed private key must be of {{.Pkg}}.PrivateKeySize bytes") } var buf [{{.Pkg}}.PrivateKeySize]byte copy(buf[:], data) From 3b018a4cc752a84d934d251c14413c57e1753341 Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Tue, 20 Aug 2024 14:25:25 +0200 Subject: [PATCH 03/11] 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. Does not add the HashML-DSA variants (yet). --- README.md | 1 + sign/dilithium/dilithium.go | 84 --- sign/dilithium/dilithium_test.go | 31 +- sign/dilithium/example_test.go | 56 -- sign/dilithium/gen.go | 85 +-- sign/dilithium/kat_test.go | 33 +- sign/dilithium/mldsa44.go | 91 ---- sign/dilithium/mldsa65.go | 91 ---- sign/dilithium/mldsa87.go | 91 ---- sign/dilithium/mode2.go | 90 ---- sign/dilithium/mode2/dilithium.go | 142 +++++- sign/dilithium/mode2/internal/dilithium.go | 22 +- .../mode2/internal/dilithium_test.go | 46 +- sign/dilithium/mode2/internal/params.go | 1 - sign/dilithium/mode2/internal/sample.go | 97 ++-- sign/dilithium/mode2/internal/sample_test.go | 132 ++--- sign/dilithium/mode2aes.go | 90 ---- sign/dilithium/mode2aes/dilithium.go | 185 ------- sign/dilithium/mode2aes/internal/dilithium.go | 482 ------------------ .../mode2aes/internal/dilithium_test.go | 144 ------ sign/dilithium/mode2aes/internal/mat.go | 59 --- sign/dilithium/mode2aes/internal/pack.go | 270 ---------- sign/dilithium/mode2aes/internal/pack_test.go | 93 ---- sign/dilithium/mode2aes/internal/params.go | 19 - .../mode2aes/internal/params_test.go | 99 ---- sign/dilithium/mode2aes/internal/rounding.go | 142 ------ .../mode2aes/internal/rounding_test.go | 81 --- sign/dilithium/mode2aes/internal/sample.go | 370 -------------- .../mode2aes/internal/sample_test.go | 266 ---------- sign/dilithium/mode2aes/internal/vec.go | 281 ---------- sign/dilithium/mode3.go | 90 ---- sign/dilithium/mode3/dilithium.go | 142 +++++- sign/dilithium/mode3/internal/dilithium.go | 22 +- .../mode3/internal/dilithium_test.go | 46 +- sign/dilithium/mode3/internal/params.go | 1 - sign/dilithium/mode3/internal/sample.go | 97 ++-- sign/dilithium/mode3/internal/sample_test.go | 132 ++--- sign/dilithium/mode3aes.go | 90 ---- sign/dilithium/mode3aes/dilithium.go | 185 ------- sign/dilithium/mode3aes/internal/dilithium.go | 482 ------------------ .../mode3aes/internal/dilithium_test.go | 144 ------ sign/dilithium/mode3aes/internal/mat.go | 59 --- sign/dilithium/mode3aes/internal/pack.go | 270 ---------- sign/dilithium/mode3aes/internal/pack_test.go | 93 ---- sign/dilithium/mode3aes/internal/params.go | 19 - .../mode3aes/internal/params_test.go | 101 ---- sign/dilithium/mode3aes/internal/rounding.go | 142 ------ .../mode3aes/internal/rounding_test.go | 81 --- sign/dilithium/mode3aes/internal/sample.go | 370 -------------- .../mode3aes/internal/sample_test.go | 266 ---------- sign/dilithium/mode3aes/internal/vec.go | 281 ---------- sign/dilithium/mode5.go | 90 ---- sign/dilithium/mode5/dilithium.go | 142 +++++- sign/dilithium/mode5/internal/dilithium.go | 22 +- .../mode5/internal/dilithium_test.go | 46 +- sign/dilithium/mode5/internal/params.go | 1 - sign/dilithium/mode5/internal/sample.go | 97 ++-- sign/dilithium/mode5/internal/sample_test.go | 132 ++--- sign/dilithium/mode5aes.go | 90 ---- sign/dilithium/mode5aes/dilithium.go | 185 ------- sign/dilithium/mode5aes/internal/dilithium.go | 482 ------------------ .../mode5aes/internal/dilithium_test.go | 144 ------ sign/dilithium/mode5aes/internal/mat.go | 59 --- sign/dilithium/mode5aes/internal/pack.go | 270 ---------- sign/dilithium/mode5aes/internal/pack_test.go | 93 ---- sign/dilithium/mode5aes/internal/params.go | 19 - .../mode5aes/internal/params_test.go | 100 ---- sign/dilithium/mode5aes/internal/rounding.go | 142 ------ .../mode5aes/internal/rounding_test.go | 81 --- sign/dilithium/mode5aes/internal/sample.go | 370 -------------- .../mode5aes/internal/sample_test.go | 266 ---------- sign/dilithium/mode5aes/internal/vec.go | 281 ---------- sign/dilithium/templates/mode.templ.go | 100 ---- sign/dilithium/templates/params.templ.go | 1 - .../{modePkg.templ.go => pkg.templ.go} | 241 ++++++++- sign/mldsa/mldsa44/dilithium.go | 180 ++++++- sign/mldsa/mldsa44/internal/dilithium.go | 22 +- sign/mldsa/mldsa44/internal/dilithium_test.go | 46 +- sign/mldsa/mldsa44/internal/params.go | 1 - sign/mldsa/mldsa44/internal/sample.go | 97 ++-- sign/mldsa/mldsa44/internal/sample_test.go | 132 ++--- sign/mldsa/mldsa65/dilithium.go | 180 ++++++- sign/mldsa/mldsa65/internal/dilithium.go | 22 +- sign/mldsa/mldsa65/internal/dilithium_test.go | 46 +- sign/mldsa/mldsa65/internal/params.go | 1 - sign/mldsa/mldsa65/internal/sample.go | 97 ++-- sign/mldsa/mldsa65/internal/sample_test.go | 132 ++--- sign/mldsa/mldsa87/dilithium.go | 180 ++++++- sign/mldsa/mldsa87/internal/dilithium.go | 22 +- sign/mldsa/mldsa87/internal/dilithium_test.go | 46 +- sign/mldsa/mldsa87/internal/params.go | 1 - sign/mldsa/mldsa87/internal/sample.go | 97 ++-- sign/mldsa/mldsa87/internal/sample_test.go | 132 ++--- sign/schemes/schemes.go | 14 + sign/schemes/schemes_test.go | 6 + sign/sign.go | 3 + 96 files changed, 1862 insertions(+), 9836 deletions(-) delete mode 100644 sign/dilithium/example_test.go delete mode 100644 sign/dilithium/mldsa44.go delete mode 100644 sign/dilithium/mldsa65.go delete mode 100644 sign/dilithium/mldsa87.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/dilithium.go delete mode 100644 sign/dilithium/mode2aes/internal/dilithium_test.go delete mode 100644 sign/dilithium/mode2aes/internal/mat.go delete mode 100644 sign/dilithium/mode2aes/internal/pack.go delete mode 100644 sign/dilithium/mode2aes/internal/pack_test.go delete mode 100644 sign/dilithium/mode2aes/internal/params.go delete mode 100644 sign/dilithium/mode2aes/internal/params_test.go delete mode 100644 sign/dilithium/mode2aes/internal/rounding.go delete mode 100644 sign/dilithium/mode2aes/internal/rounding_test.go delete mode 100644 sign/dilithium/mode2aes/internal/sample.go delete mode 100644 sign/dilithium/mode2aes/internal/sample_test.go delete mode 100644 sign/dilithium/mode2aes/internal/vec.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/dilithium.go delete mode 100644 sign/dilithium/mode3aes/internal/dilithium_test.go delete mode 100644 sign/dilithium/mode3aes/internal/mat.go delete mode 100644 sign/dilithium/mode3aes/internal/pack.go delete mode 100644 sign/dilithium/mode3aes/internal/pack_test.go delete mode 100644 sign/dilithium/mode3aes/internal/params.go delete mode 100644 sign/dilithium/mode3aes/internal/params_test.go delete mode 100644 sign/dilithium/mode3aes/internal/rounding.go delete mode 100644 sign/dilithium/mode3aes/internal/rounding_test.go delete mode 100644 sign/dilithium/mode3aes/internal/sample.go delete mode 100644 sign/dilithium/mode3aes/internal/sample_test.go delete mode 100644 sign/dilithium/mode3aes/internal/vec.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/dilithium.go delete mode 100644 sign/dilithium/mode5aes/internal/dilithium_test.go delete mode 100644 sign/dilithium/mode5aes/internal/mat.go delete mode 100644 sign/dilithium/mode5aes/internal/pack.go delete mode 100644 sign/dilithium/mode5aes/internal/pack_test.go delete mode 100644 sign/dilithium/mode5aes/internal/params.go delete mode 100644 sign/dilithium/mode5aes/internal/params_test.go delete mode 100644 sign/dilithium/mode5aes/internal/rounding.go delete mode 100644 sign/dilithium/mode5aes/internal/rounding_test.go delete mode 100644 sign/dilithium/mode5aes/internal/sample.go delete mode 100644 sign/dilithium/mode5aes/internal/sample_test.go delete mode 100644 sign/dilithium/mode5aes/internal/vec.go delete mode 100644 sign/dilithium/templates/mode.templ.go rename sign/dilithium/templates/{modePkg.templ.go => pkg.templ.go} (53%) 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..9a4334e24 100644 --- a/sign/dilithium/dilithium.go +++ b/sign/dilithium/dilithium.go @@ -25,87 +25,3 @@ // 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 bf687b202..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 ML-DSA-44 ML-DSA-65 ML-DSA-87] - // O.K. -} diff --git a/sign/dilithium/gen.go b/sign/dilithium/gen.go index 64d134714..6b136ec07 100644 --- a/sign/dilithium/gen.go +++ b/sign/dilithium/gen.go @@ -52,12 +52,7 @@ func (m Mode) Mode() string { return strings.ReplaceAll(m.Name, "-", "") } - return strings.ReplaceAll(strings.ReplaceAll(m.Name, - "Dilithium", "Mode"), "-AES", "AES") -} - -func (m Mode) UseAES() bool { - return strings.HasSuffix(m.Name, "-AES") + return strings.ReplaceAll(m.Name, "Dilithium", "Mode") } func (m Mode) NIST() bool { @@ -79,19 +74,6 @@ var ( TRSize: 32, CTildeSize: 32, }, - { - Name: "Dilithium2-AES", - K: 4, - L: 4, - Eta: 2, - DoubleEtaBits: 3, - Omega: 80, - Tau: 39, - Gamma1Bits: 17, - Gamma2: (params.Q - 1) / 88, - TRSize: 32, - CTildeSize: 32, - }, { Name: "Dilithium3", K: 6, @@ -105,19 +87,6 @@ var ( TRSize: 32, CTildeSize: 32, }, - { - Name: "Dilithium3-AES", - K: 6, - L: 5, - Eta: 4, - DoubleEtaBits: 4, - Omega: 55, - Tau: 49, - Gamma1Bits: 19, - Gamma2: (params.Q - 1) / 32, - TRSize: 32, - CTildeSize: 32, - }, { Name: "Dilithium5", K: 8, @@ -131,19 +100,6 @@ var ( TRSize: 32, CTildeSize: 32, }, - { - Name: "Dilithium5-AES", - K: 8, - L: 7, - Eta: 2, - DoubleEtaBits: 3, - Omega: 75, - Tau: 60, - Gamma1Bits: 19, - Gamma2: (params.Q - 1) / 32, - TRSize: 32, - CTildeSize: 32, - }, { Name: "ML-DSA-44", K: 4, @@ -189,7 +145,6 @@ var ( func main() { generateModePackageFiles() - generateModeToplevelFiles() generateParamsFiles() generateSourceFiles() } @@ -227,9 +182,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) } @@ -241,38 +196,16 @@ func generateModeToplevelFiles() { panic(err) } - res := string(buf.Bytes()) - offset := strings.Index(res, TemplateWarning) - if offset == -1 { - panic("Missing template warning in mode.templ.go") - } - err = os.WriteFile(mode.Pkg()+".go", []byte(res[offset:]), 0o644) + res, err := format.Source(buf.Bytes()) if err != nil { - panic(err) - } - } -} - -// Generates modeX/dilithium.go from templates/modePkg.templ.go -func generateModePackageFiles() { - tl, err := template.ParseFiles("templates/modePkg.templ.go") - if err != nil { - panic(err) - } - - for _, mode := range Modes { - buf := new(bytes.Buffer) - err := tl.Execute(buf, mode) - if err != nil { - panic(err) + panic("error formating code") } - res := string(buf.Bytes()) - offset := strings.Index(res, TemplateWarning) + 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.PkgPath()+"/dilithium.go", []byte(res[offset:]), 0o644) + err = os.WriteFile(mode.PkgPath()+"/dilithium.go", res[offset:], 0o644) if err != nil { panic(err) } diff --git a/sign/dilithium/kat_test.go b/sign/dilithium/kat_test.go index dae3690ac..3bb9adae1 100644 --- a/sign/dilithium/kat_test.go +++ b/sign/dilithium/kat_test.go @@ -10,6 +10,7 @@ import ( "testing" "github.com/cloudflare/circl/internal/nist" + "github.com/cloudflare/circl/sign/schemes" ) func TestPQCgenKATSign(t *testing.T) { @@ -22,19 +23,18 @@ func TestPQCgenKATSign(t *testing.T) { {"Dilithium2", "38ed991c5ca11e39ab23945ca37af89e059d16c5474bf8ba96b15cb4e948af2a"}, {"Dilithium3", "8196b32212753f525346201ffec1c7a0a852596fa0b57bd4e2746231dab44d55"}, {"Dilithium5", "7ded97a6e6c809b43b54c248171d7504fa6a0cab651bf288bb00034782667481"}, - {"Dilithium2-AES", "b6673f8da5bba7dfae63adbbdf559f4fcfb715d1f91da98d4b52e26203d69196"}, - {"Dilithium3-AES", "482f4d672a9f1dc38cc8bcf8b1731b03fe99fcb6f2b73aa4a376b99faf89ccbe"}, - {"Dilithium5-AES", "54dfa85013d1b3da4f1d7c6dd270bc91a083cfece3d320c97906da125fd2a48f"}, + // TODO Update to final FIPS 204 standard. Test vectors below are for the IPD. + // // Generated from reference implementation commit e7bed6258b9a3703ce78d4ec3, // which can be found on the standard branch // of https://github.com/pq-crystals/dilithium - {"ML-DSA-44", "4657f244d1204e5847b3cacea4fc6116579571bee8ac89b8cba6771f303ee260"}, - {"ML-DSA-65", "99a95d7ef804020a666f455c5003232d0c0200dfc4f5df85dceb8f56256dcba8"}, - {"ML-DSA-87", "3377835fffb7cf9aac52947225c8974335bc05532ddf672a8b706ab8991435a2"}, + // {"ML-DSA-44", "4657f244d1204e5847b3cacea4fc6116579571bee8ac89b8cba6771f303ee260"}, + // {"ML-DSA-65", "99a95d7ef804020a666f455c5003232d0c0200dfc4f5df85dceb8f56256dcba8"}, + // {"ML-DSA-87", "3377835fffb7cf9aac52947225c8974335bc05532ddf672a8b706ab8991435a2"}, } { t.Run(tc.name, func(t *testing.T) { - mode := ModeByName(tc.name) + mode := schemes.ByName(tc.name) if mode == nil { t.Fatal() } @@ -71,17 +71,26 @@ func TestPQCgenKATSign(t *testing.T) { g2 := nist.NewDRBG(&seed) g2.Fill(eseed[:]) - pk, sk := mode.NewKeyFromSeed(eseed[:]) + pk, sk := mode.DeriveKey(eseed[:]) - fmt.Fprintf(f, "pk = %X\n", pk.Bytes()) - fmt.Fprintf(f, "sk = %X\n", sk.Bytes()) + 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", 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/mldsa44.go b/sign/dilithium/mldsa44.go deleted file mode 100644 index 5df54821e..000000000 --- a/sign/dilithium/mldsa44.go +++ /dev/null @@ -1,91 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/mldsa/mldsa44" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// implMLDSA44 implements the mode.Mode interface for ML-DSA-44. -type implMLDSA44 struct{} - -// MLDSA44 is ML-DSA-44. -var MLDSA44 Mode = &implMLDSA44{} - -func (m *implMLDSA44) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mldsa44.GenerateKey(rand) -} - -func (m *implMLDSA44) 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 mldsa44.NewKeyFromSeed(&seedBuf) -} - -func (m *implMLDSA44) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mldsa44.PrivateKey) - ret := [mldsa44.SignatureSize]byte{} - mldsa44.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMLDSA44) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mldsa44.PublicKey) - return mldsa44.Verify(ipk, msg, signature) -} - -func (m *implMLDSA44) PublicKeyFromBytes(data []byte) PublicKey { - var ret mldsa44.PublicKey - if len(data) != mldsa44.PublicKeySize { - panic("packed public key must be of mldsa44.PublicKeySize bytes") - } - var buf [mldsa44.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMLDSA44) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mldsa44.PrivateKey - if len(data) != mldsa44.PrivateKeySize { - panic("packed private key must be of mldsa44.PrivateKeySize bytes") - } - var buf [mldsa44.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMLDSA44) SeedSize() int { - return common.SeedSize -} - -func (m *implMLDSA44) PublicKeySize() int { - return mldsa44.PublicKeySize -} - -func (m *implMLDSA44) PrivateKeySize() int { - return mldsa44.PrivateKeySize -} - -func (m *implMLDSA44) SignatureSize() int { - return mldsa44.SignatureSize -} - -func (m *implMLDSA44) Name() string { - return "ML-DSA-44" -} - -func init() { - modes["ML-DSA-44"] = MLDSA44 -} diff --git a/sign/dilithium/mldsa65.go b/sign/dilithium/mldsa65.go deleted file mode 100644 index bb035227b..000000000 --- a/sign/dilithium/mldsa65.go +++ /dev/null @@ -1,91 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/mldsa/mldsa65" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// implMLDSA65 implements the mode.Mode interface for ML-DSA-65. -type implMLDSA65 struct{} - -// MLDSA65 is ML-DSA-65. -var MLDSA65 Mode = &implMLDSA65{} - -func (m *implMLDSA65) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mldsa65.GenerateKey(rand) -} - -func (m *implMLDSA65) 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 mldsa65.NewKeyFromSeed(&seedBuf) -} - -func (m *implMLDSA65) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mldsa65.PrivateKey) - ret := [mldsa65.SignatureSize]byte{} - mldsa65.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMLDSA65) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mldsa65.PublicKey) - return mldsa65.Verify(ipk, msg, signature) -} - -func (m *implMLDSA65) PublicKeyFromBytes(data []byte) PublicKey { - var ret mldsa65.PublicKey - if len(data) != mldsa65.PublicKeySize { - panic("packed public key must be of mldsa65.PublicKeySize bytes") - } - var buf [mldsa65.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMLDSA65) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mldsa65.PrivateKey - if len(data) != mldsa65.PrivateKeySize { - panic("packed private key must be of mldsa65.PrivateKeySize bytes") - } - var buf [mldsa65.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMLDSA65) SeedSize() int { - return common.SeedSize -} - -func (m *implMLDSA65) PublicKeySize() int { - return mldsa65.PublicKeySize -} - -func (m *implMLDSA65) PrivateKeySize() int { - return mldsa65.PrivateKeySize -} - -func (m *implMLDSA65) SignatureSize() int { - return mldsa65.SignatureSize -} - -func (m *implMLDSA65) Name() string { - return "ML-DSA-65" -} - -func init() { - modes["ML-DSA-65"] = MLDSA65 -} diff --git a/sign/dilithium/mldsa87.go b/sign/dilithium/mldsa87.go deleted file mode 100644 index d3d98420a..000000000 --- a/sign/dilithium/mldsa87.go +++ /dev/null @@ -1,91 +0,0 @@ -// Code generated from mode.templ.go. DO NOT EDIT. - -package dilithium - -import ( - "fmt" - "io" - - "github.com/cloudflare/circl/sign/mldsa/mldsa87" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// implMLDSA87 implements the mode.Mode interface for ML-DSA-87. -type implMLDSA87 struct{} - -// MLDSA87 is ML-DSA-87. -var MLDSA87 Mode = &implMLDSA87{} - -func (m *implMLDSA87) GenerateKey(rand io.Reader) ( - PublicKey, PrivateKey, error) { - return mldsa87.GenerateKey(rand) -} - -func (m *implMLDSA87) 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 mldsa87.NewKeyFromSeed(&seedBuf) -} - -func (m *implMLDSA87) Sign(sk PrivateKey, msg []byte) []byte { - isk := sk.(*mldsa87.PrivateKey) - ret := [mldsa87.SignatureSize]byte{} - mldsa87.SignTo(isk, msg, ret[:]) - return ret[:] -} - -func (m *implMLDSA87) Verify(pk PublicKey, msg []byte, signature []byte) bool { - ipk := pk.(*mldsa87.PublicKey) - return mldsa87.Verify(ipk, msg, signature) -} - -func (m *implMLDSA87) PublicKeyFromBytes(data []byte) PublicKey { - var ret mldsa87.PublicKey - if len(data) != mldsa87.PublicKeySize { - panic("packed public key must be of mldsa87.PublicKeySize bytes") - } - var buf [mldsa87.PublicKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMLDSA87) PrivateKeyFromBytes(data []byte) PrivateKey { - var ret mldsa87.PrivateKey - if len(data) != mldsa87.PrivateKeySize { - panic("packed private key must be of mldsa87.PrivateKeySize bytes") - } - var buf [mldsa87.PrivateKeySize]byte - copy(buf[:], data) - ret.Unpack(&buf) - return &ret -} - -func (m *implMLDSA87) SeedSize() int { - return common.SeedSize -} - -func (m *implMLDSA87) PublicKeySize() int { - return mldsa87.PublicKeySize -} - -func (m *implMLDSA87) PrivateKeySize() int { - return mldsa87.PrivateKeySize -} - -func (m *implMLDSA87) SignatureSize() int { - return mldsa87.SignatureSize -} - -func (m *implMLDSA87) Name() string { - return "ML-DSA-87" -} - -func init() { - modes["ML-DSA-87"] = MLDSA87 -} diff --git a/sign/dilithium/mode2.go b/sign/dilithium/mode2.go deleted file mode 100644 index 113715025..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/mode2" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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 private 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 16ce78351..113708a32 100644 --- a/sign/dilithium/mode2/dilithium.go +++ b/sign/dilithium/mode2/dilithium.go @@ -1,11 +1,9 @@ -// 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 // // https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf - package mode2 import ( @@ -13,10 +11,9 @@ import ( "errors" "io" - common "github.com/cloudflare/circl/sign/internal/dilithium" - + "github.com/cloudflare/circl/sign" "github.com/cloudflare/circl/sign/dilithium/mode2/internal" - + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -54,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, ) } @@ -147,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. @@ -183,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 7869d0475..609ab3a4c 100644 --- a/sign/dilithium/mode2/internal/dilithium.go +++ b/sign/dilithium/mode2/internal/dilithium.go @@ -244,7 +244,10 @@ 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 @@ -262,7 +265,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 +282,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[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +310,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,16 +330,14 @@ 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 { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) + _, _ = h.Write(rnd[:]) } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -373,7 +377,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, sig.c[:32]) + 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 825e7da08..47f53d3a0 100644 --- a/sign/dilithium/mode2/internal/dilithium_test.go +++ b/sign/dilithium/mode2/internal/dilithium_test.go @@ -4,6 +4,7 @@ package internal import ( "encoding/binary" + "io" "testing" common "github.com/cloudflare/circl/sign/internal/dilithium" @@ -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/params.go b/sign/dilithium/mode2/internal/params.go index 74810fbad..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 diff --git a/sign/dilithium/mode2/internal/sample.go b/sign/dilithium/mode2/internal/sample.go index 62c261332..b37370a4e 100644 --- a/sign/dilithium/mode2/internal/sample.go +++ b/sign/dilithium/mode2/internal/sample.go @@ -12,7 +12,7 @@ import ( // 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[:]) } @@ -251,7 +220,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 32/8; 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 []byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() diff --git a/sign/dilithium/mode2/internal/sample_test.go b/sign/dilithium/mode2/internal/sample_test.go index 2059599eb..32931c94f 100644 --- a/sign/dilithium/mode2/internal/sample_test.go +++ b/sign/dilithium/mode2/internal/sample_test.go @@ -12,94 +12,46 @@ import ( 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,7 +104,7 @@ 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[:]) @@ -200,7 +152,7 @@ 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[:], diff --git a/sign/dilithium/mode2aes.go b/sign/dilithium/mode2aes.go deleted file mode 100644 index 6985ccf84..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/mode2aes" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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 private 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 93e5058d5..000000000 --- a/sign/dilithium/mode2aes/dilithium.go +++ /dev/null @@ -1,185 +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" - - common "github.com/cloudflare/circl/sign/internal/dilithium" - - "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/dilithium.go b/sign/dilithium/mode2aes/internal/dilithium.go deleted file mode 100644 index 7869d0475..000000000 --- a/sign/dilithium/mode2aes/internal/dilithium.go +++ /dev/null @@ -1,482 +0,0 @@ -// Code generated from mode3/internal/dilithium.go by gen.go - -package internal - -import ( - cryptoRand "crypto/rand" - "crypto/subtle" - "io" - - "github.com/cloudflare/circl/internal/sha3" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -const ( - // Size of a packed polynomial of norm ≤η. - // (Note that the formula is not valid in general.) - PolyLeqEtaSize = (common.N * DoubleEtaBits) / 8 - - // β = τη, the maximum size of c s₂. - Beta = Tau * Eta - - // γ₁ range of y - Gamma1 = 1 << Gamma1Bits - - // Size of packed polynomial of norm <γ₁ such as z - PolyLeGamma1Size = (Gamma1Bits + 1) * common.N / 8 - - // α = 2γ₂ parameter for decompose - Alpha = 2 * Gamma2 - - // Size of a packed private key - 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 + CTildeSize - - // Size of packed w₁ - PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 -) - -// PublicKey is the type of Dilithium public keys. -type PublicKey struct { - rho [32]byte - t1 VecK - - // Cached values - t1p [common.PolyT1Size * K]byte - A *Mat - tr *[TRSize]byte -} - -// PrivateKey is the type of Dilithium private keys. -type PrivateKey struct { - rho [32]byte - key [32]byte - s1 VecL - s2 VecK - t0 VecK - tr [TRSize]byte - - // Cached values - A Mat // ExpandA(ρ) - s1h VecL // NTT(s₁) - s2h VecK // NTT(s₂) - t0h VecK // NTT(t₀) -} - -type unpackedSignature struct { - z VecL - hint VecK - c [CTildeSize]byte -} - -// Packs the signature into buf. -func (sig *unpackedSignature) Pack(buf []byte) { - copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[CTildeSize:]) - sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) -} - -// Sets sig to the signature encoded in the buffer. -// -// Returns whether buf contains a properly packed signature. -func (sig *unpackedSignature) Unpack(buf []byte) bool { - if len(buf) < SignatureSize { - return false - } - copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[CTildeSize:]) - if sig.z.Exceeds(Gamma1 - Beta) { - return false - } - if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { - return false - } - return true -} - -// Packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - copy(buf[:32], pk.rho[:]) - copy(buf[32:], pk.t1p[:]) -} - -// Sets pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - copy(pk.rho[:], buf[:32]) - copy(pk.t1p[:], buf[32:]) - - pk.t1.UnpackT1(pk.t1p[:]) - pk.A = new(Mat) - pk.A.Derive(&pk.rho) - - // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([TRSize]byte) - h := sha3.NewShake256() - _, _ = h.Write(buf[:]) - _, _ = h.Read(pk.tr[:]) -} - -// Packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - copy(buf[:32], sk.rho[:]) - copy(buf[32:64], sk.key[:]) - copy(buf[64:64+TRSize], sk.tr[:]) - offset := 64 + TRSize - sk.s1.PackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * L - sk.s2.PackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * K - sk.t0.PackT0(buf[offset:]) -} - -// Sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - copy(sk.rho[:], buf[:32]) - copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:64+TRSize]) - offset := 64 + TRSize - sk.s1.UnpackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * L - sk.s2.UnpackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * K - sk.t0.UnpackT0(buf[offset:]) - - // Cached values - sk.A.Derive(&sk.rho) - sk.t0h = sk.t0 - sk.t0h.NTT() - sk.s1h = sk.s1 - sk.s1h.NTT() - sk.s2h = sk.s2 - sk.s2h.NTT() -} - -// 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) { - var seed [32]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 -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { - var eSeed [128]byte // expanded seed - var pk PublicKey - var sk PrivateKey - var sSeed [64]byte - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - _, _ = h.Read(eSeed[:]) - - copy(pk.rho[:], eSeed[:32]) - copy(sSeed[:], eSeed[32:96]) - copy(sk.key[:], eSeed[96:]) - copy(sk.rho[:], pk.rho[:]) - - sk.A.Derive(&pk.rho) - - for i := uint16(0); i < L; i++ { - PolyDeriveUniformLeqEta(&sk.s1[i], &sSeed, i) - } - - for i := uint16(0); i < K; i++ { - PolyDeriveUniformLeqEta(&sk.s2[i], &sSeed, i+L) - } - - sk.s1h = sk.s1 - sk.s1h.NTT() - sk.s2h = sk.s2 - sk.s2h.NTT() - - sk.computeT0andT1(&sk.t0, &pk.t1) - - sk.t0h = sk.t0 - sk.t0h.NTT() - - // Complete public key far enough to be packed - pk.t1.PackT1(pk.t1p[:]) - pk.A = &sk.A - - // Finish private key - var packedPk [PublicKeySize]byte - pk.Pack(&packedPk) - - // tr = CRH(ρ ‖ t1) = CRH(pk) - h.Reset() - _, _ = h.Write(packedPk[:]) - _, _ = h.Read(sk.tr[:]) - - // Finish cache of public key - pk.tr = &sk.tr - - return &pk, &sk -} - -// Computes t0 and t1 from sk.s1h, sk.s2 and sk.A. -func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { - var t VecK - - // Set t to A s₁ + s₂ - for i := 0; i < K; i++ { - PolyDotHat(&t[i], &sk.A[i], &sk.s1h) - t[i].ReduceLe2Q() - t[i].InvNTT() - } - t.Add(&t, &sk.s2) - t.Normalize() - - // Compute t₀, t₁ = Power2Round(t) - t.Power2Round(t0, t1) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - var sig unpackedSignature - var mu [64]byte - var zh VecL - var Az, Az2dct1, w1 VecK - var ch common.Poly - var cp [CTildeSize]byte - var w1Packed [PolyW1Size * K]byte - - // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β - // and ensured that there at most ω ones in pk.hint. - if !sig.Unpack(signature) { - return false - } - - // μ = CRH(tr ‖ msg) - h := sha3.NewShake256() - _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) - _, _ = h.Read(mu[:]) - - // Compute Az - zh = sig.z - zh.NTT() - - for i := 0; i < K; i++ { - PolyDotHat(&Az[i], &pk.A[i], &zh) - } - - // Next, we compute Az - 2ᵈ·c·t₁. - // Note that the coefficients of t₁ are bounded by 256 = 2⁹, - // so the coefficients of Az2dct1 will bounded by 2⁹⁺ᵈ = 2²³ < 2q, - // which is small enough for NTT(). - Az2dct1.MulBy2toD(&pk.t1) - Az2dct1.NTT() - PolyDeriveUniformBall(&ch, sig.c[:32]) - ch.NTT() - for i := 0; i < K; i++ { - Az2dct1[i].MulHat(&Az2dct1[i], &ch) - } - Az2dct1.Sub(&Az, &Az2dct1) - Az2dct1.ReduceLe2Q() - Az2dct1.InvNTT() - Az2dct1.NormalizeAssumingLe2Q() - - // UseHint(pk.hint, Az - 2ᵈ·c·t₁) - // = UseHint(pk.hint, w - c·s₂ + c·t₀) - // = UseHint(pk.hint, r + c·t₀) - // = r₁ = w₁. - w1.UseHint(&Az2dct1, &sig.hint) - w1.PackW1(w1Packed[:]) - - // c' = H(μ, w₁) - h.Reset() - _, _ = h.Write(mu[:]) - _, _ = h.Write(w1Packed[:]) - _, _ = h.Read(cp[:]) - - return sig.c == cp -} - -// SignTo signs the given message and writes the signature into signature. -// -//nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - var mu, rhop [64]byte - var w1Packed [PolyW1Size * K]byte - var y, yh VecL - var w, w0, w1, w0mcs2, ct0, w0mcs2pct0 VecK - var ch common.Poly - var yNonce uint16 - var sig unpackedSignature - - if len(signature) < SignatureSize { - panic("Signature does not fit in that byteslice") - } - - // μ = CRH(tr ‖ msg) - h := sha3.NewShake256() - _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) - _, _ = h.Read(mu[:]) - - // ρ' = CRH(key ‖ μ) - h.Reset() - _, _ = h.Write(sk.key[:]) - if NIST { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) - } - _, _ = h.Write(mu[:]) - _, _ = h.Read(rhop[:]) - - // Main rejection loop - attempt := 0 - for { - attempt++ - if attempt >= 576 { - // Depending on the mode, one try has a chance between 1/7 and 1/4 - // of succeeding. Thus it is safe to say that 576 iterations - // are enough as (6/7)⁵⁷⁶ < 2⁻¹²⁸. - panic("This should only happen 1 in 2^{128}: something is wrong.") - } - - // y = ExpandMask(ρ', key) - VecLDeriveUniformLeGamma1(&y, &rhop, yNonce) - yNonce += uint16(L) - - // Set w to A y - yh = y - yh.NTT() - for i := 0; i < K; i++ { - PolyDotHat(&w[i], &sk.A[i], &yh) - w[i].ReduceLe2Q() - w[i].InvNTT() - } - - // Decompose w into w₀ and w₁ - w.NormalizeAssumingLe2Q() - w.Decompose(&w0, &w1) - - // c~ = H(μ ‖ w₁) - w1.PackW1(w1Packed[:]) - h.Reset() - _, _ = h.Write(mu[:]) - _, _ = h.Write(w1Packed[:]) - _, _ = h.Read(sig.c[:]) - - PolyDeriveUniformBall(&ch, sig.c[:32]) - ch.NTT() - - // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. - // - // By Lemma 3 of the specification this is equivalent to checking that - // both ‖ r₀ ‖_∞ < γ₂ - β and r₁ = w₁, for the decomposition - // w - c·s₂ = r₁ α + r₀ as computed by decompose(). - // See also §4.1 of the specification. - for i := 0; i < K; i++ { - w0mcs2[i].MulHat(&ch, &sk.s2h[i]) - w0mcs2[i].InvNTT() - } - w0mcs2.Sub(&w0, &w0mcs2) - w0mcs2.Normalize() - - if w0mcs2.Exceeds(Gamma2 - Beta) { - continue - } - - // z = y + c·s₁ - for i := 0; i < L; i++ { - sig.z[i].MulHat(&ch, &sk.s1h[i]) - sig.z[i].InvNTT() - } - sig.z.Add(&sig.z, &y) - sig.z.Normalize() - - // Ensure ‖z‖_∞ < γ₁ - β - if sig.z.Exceeds(Gamma1 - Beta) { - continue - } - - // Compute c·t₀ - for i := 0; i < K; i++ { - ct0[i].MulHat(&ch, &sk.t0h[i]) - ct0[i].InvNTT() - } - ct0.NormalizeAssumingLe2Q() - - // Ensure ‖c·t₀‖_∞ < γ₂. - if ct0.Exceeds(Gamma2) { - continue - } - - // Create the hint to be able to reconstruct w₁ from w - c·s₂ + c·t0. - // Note that we're not using makeHint() in the obvious way as we - // do not know whether ‖ sc·s₂ - c·t₀ ‖_∞ < γ₂. Instead we note - // that our makeHint() is actually the same as a makeHint for a - // different decomposition: - // - // Earlier we ensured indirectly with a check that r₁ = w₁ where - // r = w - c·s₂. Hence r₀ = r - r₁ α = w - c·s₂ - w₁ α = w₀ - c·s₂. - // Thus MakeHint(w₀ - c·s₂ + c·t₀, w₁) = MakeHint(r0 + c·t₀, r₁) - // and UseHint(w - c·s₂ + c·t₀, w₁) = UseHint(r + c·t₀, r₁). - // As we just ensured that ‖ c·t₀ ‖_∞ < γ₂ our usage is correct. - w0mcs2pct0.Add(&w0mcs2, &ct0) - w0mcs2pct0.NormalizeAssumingLe2Q() - hintPop := sig.hint.MakeHint(&w0mcs2pct0, &w1) - if hintPop > Omega { - continue - } - - break - } - - sig.Pack(signature[:]) -} - -// Computes the public key corresponding to this private key. -func (sk *PrivateKey) Public() *PublicKey { - var t0 VecK - pk := &PublicKey{ - rho: sk.rho, - A: &sk.A, - tr: &sk.tr, - } - sk.computeT0andT1(&t0, &pk.t1) - pk.t1.PackT1(pk.t1p[:]) - return pk -} - -// Equal returns whether the two public keys are equal -func (pk *PublicKey) Equal(other *PublicKey) bool { - return pk.rho == other.rho && pk.t1 == other.t1 -} - -// Equal returns whether the two private keys are equal -func (sk *PrivateKey) Equal(other *PrivateKey) bool { - ret := (subtle.ConstantTimeCompare(sk.rho[:], other.rho[:]) & - subtle.ConstantTimeCompare(sk.key[:], other.key[:]) & - subtle.ConstantTimeCompare(sk.tr[:], other.tr[:])) - - acc := uint32(0) - for i := 0; i < L; i++ { - for j := 0; j < common.N; j++ { - acc |= sk.s1[i][j] ^ other.s1[i][j] - } - } - for i := 0; i < K; i++ { - for j := 0; j < common.N; j++ { - acc |= sk.s2[i][j] ^ other.s2[i][j] - acc |= sk.t0[i][j] ^ other.t0[i][j] - } - } - return (ret & subtle.ConstantTimeEq(int32(acc), 0)) == 1 -} diff --git a/sign/dilithium/mode2aes/internal/dilithium_test.go b/sign/dilithium/mode2aes/internal/dilithium_test.go deleted file mode 100644 index 825e7da08..000000000 --- a/sign/dilithium/mode2aes/internal/dilithium_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Code generated from mode3/internal/dilithium_test.go by gen.go - -package internal - -import ( - "encoding/binary" - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Checks whether p is normalized. Only used in tests. -func PolyNormalized(p *common.Poly) bool { - p2 := *p - p2.Normalize() - return p2 == *p -} - -func BenchmarkSkUnpack(b *testing.B) { - var buf [PrivateKeySize]byte - var sk PrivateKey - for i := 0; i < b.N; i++ { - sk.Unpack(&buf) - } -} - -func BenchmarkPkUnpack(b *testing.B) { - var buf [PublicKeySize]byte - var pk PublicKey - for i := 0; i < b.N; i++ { - pk.Unpack(&buf) - } -} - -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 - pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], 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[:]) - } -} - -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 - _, sk := NewKeyFromSeed(&seed) - b.ResetTimer() - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) - } -} - -func BenchmarkGenerateKey(b *testing.B) { - var seed [32]byte - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - NewKeyFromSeed(&seed) - } -} - -func BenchmarkPublicFromPrivate(b *testing.B) { - var seed [32]byte - for i := 0; i < b.N; i++ { - b.StopTimer() - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - _, sk := NewKeyFromSeed(&seed) - b.StartTimer() - sk.Public() - } -} - -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 - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := NewKeyFromSeed(&seed) - if !sk.Equal(sk) { - t.Fatal() - } - for j := uint64(0); j < 10; j++ { - binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { - t.Fatal() - } - } - pk.Pack(&pkb) - pk2.Unpack(&pkb) - if !pk.Equal(&pk2) { - t.Fatal() - } - sk.Pack(&skb) - sk2.Unpack(&skb) - if !sk.Equal(&sk2) { - t.Fatal() - } - } -} - -func TestPublicFromPrivate(t *testing.T) { - var seed [common.SeedSize]byte - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := NewKeyFromSeed(&seed) - pk2 := sk.Public() - if !pk.Equal(pk2) { - t.Fatal() - } - } -} - -func TestGamma1Size(t *testing.T) { - var expected int - switch Gamma1Bits { - case 17: - expected = 576 - case 19: - expected = 640 - } - if expected != PolyLeGamma1Size { - t.Fatal() - } -} diff --git a/sign/dilithium/mode2aes/internal/mat.go b/sign/dilithium/mode2aes/internal/mat.go deleted file mode 100644 index ceaf634fa..000000000 --- a/sign/dilithium/mode2aes/internal/mat.go +++ /dev/null @@ -1,59 +0,0 @@ -// Code generated from mode3/internal/mat.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// A k by l matrix of polynomials. -type Mat [K]VecL - -// Expands the given seed to a complete matrix. -// -// This function is called ExpandA in the specification. -func (m *Mat) Derive(seed *[32]byte) { - if !DeriveX4Available { - for i := uint16(0); i < K; i++ { - for j := uint16(0); j < L; j++ { - PolyDeriveUniform(&m[i][j], seed, (i<<8)+j) - } - } - return - } - - idx := 0 - var nonces [4]uint16 - var ps [4]*common.Poly - for i := uint16(0); i < K; i++ { - for j := uint16(0); j < L; j++ { - nonces[idx] = (i << 8) + j - ps[idx] = &m[i][j] - idx++ - if idx == 4 { - idx = 0 - PolyDeriveUniformX4(ps, seed, nonces) - } - } - } - if idx != 0 { - for i := idx; i < 4; i++ { - ps[i] = nil - } - PolyDeriveUniformX4(ps, seed, nonces) - } -} - -// Set p to the inner product of a and b using pointwise multiplication. -// -// Assumes a and b are in Montgomery form and their coefficients are -// pairwise sufficiently small to multiply, see Poly.MulHat(). Resulting -// coefficients are bounded by 2Lq. -func PolyDotHat(p *common.Poly, a, b *VecL) { - var t common.Poly - *p = common.Poly{} // zero p - for i := 0; i < L; i++ { - t.MulHat(&a[i], &b[i]) - p.Add(&t, p) - } -} diff --git a/sign/dilithium/mode2aes/internal/pack.go b/sign/dilithium/mode2aes/internal/pack.go deleted file mode 100644 index 1854b4197..000000000 --- a/sign/dilithium/mode2aes/internal/pack.go +++ /dev/null @@ -1,270 +0,0 @@ -// Code generated from mode3/internal/pack.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Writes p with norm less than or equal η into buf, which must be of -// size PolyLeqEtaSize. -// -// Assumes coefficients of p are not normalized, but in [q-η,q+η]. -func PolyPackLeqEta(p *common.Poly, buf []byte) { - if DoubleEtaBits == 4 { // compiler eliminates branch - j := 0 - for i := 0; i < PolyLeqEtaSize; i++ { - buf[i] = (byte(common.Q+Eta-p[j]) | - byte(common.Q+Eta-p[j+1])<<4) - j += 2 - } - } else if DoubleEtaBits == 3 { - j := 0 - for i := 0; i < PolyLeqEtaSize; i += 3 { - buf[i] = (byte(common.Q+Eta-p[j]) | - (byte(common.Q+Eta-p[j+1]) << 3) | - (byte(common.Q+Eta-p[j+2]) << 6)) - buf[i+1] = ((byte(common.Q+Eta-p[j+2]) >> 2) | - (byte(common.Q+Eta-p[j+3]) << 1) | - (byte(common.Q+Eta-p[j+4]) << 4) | - (byte(common.Q+Eta-p[j+5]) << 7)) - buf[i+2] = ((byte(common.Q+Eta-p[j+5]) >> 1) | - (byte(common.Q+Eta-p[j+6]) << 2) | - (byte(common.Q+Eta-p[j+7]) << 5)) - j += 8 - } - } else { - panic("eta not supported") - } -} - -// Sets p to the polynomial of norm less than or equal η encoded in the -// given buffer of size PolyLeqEtaSize. -// -// Output coefficients of p are not normalized, but in [q-η,q+η] provided -// buf was created using PackLeqEta. -// -// Beware, for arbitrary buf the coefficients of p might end up in -// the interval [q-2^b,q+2^b] where b is the least b with η≤2^b. -func PolyUnpackLeqEta(p *common.Poly, buf []byte) { - if DoubleEtaBits == 4 { // compiler eliminates branch - j := 0 - for i := 0; i < PolyLeqEtaSize; i++ { - p[j] = common.Q + Eta - uint32(buf[i]&15) - p[j+1] = common.Q + Eta - uint32(buf[i]>>4) - j += 2 - } - } else if DoubleEtaBits == 3 { - j := 0 - for i := 0; i < PolyLeqEtaSize; i += 3 { - p[j] = common.Q + Eta - uint32(buf[i]&7) - p[j+1] = common.Q + Eta - uint32((buf[i]>>3)&7) - p[j+2] = common.Q + Eta - uint32((buf[i]>>6)|((buf[i+1]<<2)&7)) - p[j+3] = common.Q + Eta - uint32((buf[i+1]>>1)&7) - p[j+4] = common.Q + Eta - uint32((buf[i+1]>>4)&7) - p[j+5] = common.Q + Eta - uint32((buf[i+1]>>7)|((buf[i+2]<<1)&7)) - p[j+6] = common.Q + Eta - uint32((buf[i+2]>>2)&7) - p[j+7] = common.Q + Eta - uint32((buf[i+2]>>5)&7) - j += 8 - } - } else { - panic("eta not supported") - } -} - -// Writes v with coefficients in {0, 1} of which at most ω non-zero -// to buf, which must have length ω+k. -func (v *VecK) PackHint(buf []byte) { - // The packed hint starts with the indices of the non-zero coefficients - // For instance: - // - // (x⁵⁶ + x¹⁰⁰, x²⁵⁵, 0, x² + x²³, x¹) - // - // Yields - // - // 56, 100, 255, 2, 23, 1 - // - // Then we pad with zeroes until we have a list of ω items: - // // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0 - // - // Then we finish with a list of the switch-over-indices in this - // list between polynomials, so: - // - // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0, 2, 3, 3, 5, 6 - - off := uint8(0) - for i := 0; i < K; i++ { - for j := uint16(0); j < common.N; j++ { - if v[i][j] != 0 { - buf[off] = uint8(j) - off++ - } - } - buf[Omega+i] = off - } - for ; off < Omega; off++ { - buf[off] = 0 - } -} - -// Sets v to the vector encoded using VecK.PackHint() -// -// Returns whether unpacking was successful. -func (v *VecK) UnpackHint(buf []byte) bool { - // A priori, there would be several reasonable ways to encode the same - // hint vector. We take care to only allow only one encoding, to ensure - // "strong unforgeability". - // - // See PackHint() source for description of the encoding. - *v = VecK{} // zero v - prevSOP := uint8(0) // previous switch-over-point - for i := 0; i < K; i++ { - SOP := buf[Omega+i] - if SOP < prevSOP || SOP > Omega { - return false // ensures switch-over-points are increasing - } - for j := prevSOP; j < SOP; j++ { - if j > prevSOP && buf[j] <= buf[j-1] { - return false // ensures indices are increasing (within a poly) - } - v[i][buf[j]] = 1 - } - prevSOP = SOP - } - for j := prevSOP; j < Omega; j++ { - if buf[j] != 0 { - return false // ensures padding indices are zero - } - } - - return true -} - -// Sets p to the polynomial packed into buf by PolyPackLeGamma1. -// -// p will be normalized. -func PolyUnpackLeGamma1(p *common.Poly, buf []byte) { - if Gamma1Bits == 17 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 9 { - p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | - (uint32(buf[i+2]&0x3) << 16) - p1 := uint32(buf[i+2]>>2) | (uint32(buf[i+3]) << 6) | - (uint32(buf[i+4]&0xf) << 14) - p2 := uint32(buf[i+4]>>4) | (uint32(buf[i+5]) << 4) | - (uint32(buf[i+6]&0x3f) << 12) - p3 := uint32(buf[i+6]>>6) | (uint32(buf[i+7]) << 2) | - (uint32(buf[i+8]) << 10) - - // coefficients in [0,…,2γ₁) - p0 = Gamma1 - p0 // (-γ₁,…,γ₁] - p1 = Gamma1 - p1 - p2 = Gamma1 - p2 - p3 = Gamma1 - p3 - - p0 += uint32(int32(p0)>>31) & common.Q // normalize - p1 += uint32(int32(p1)>>31) & common.Q - p2 += uint32(int32(p2)>>31) & common.Q - p3 += uint32(int32(p3)>>31) & common.Q - - p[j] = p0 - p[j+1] = p1 - p[j+2] = p2 - p[j+3] = p3 - - j += 4 - } - } else if Gamma1Bits == 19 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 5 { - p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | - (uint32(buf[i+2]&0xf) << 16) - p1 := uint32(buf[i+2]>>4) | (uint32(buf[i+3]) << 4) | - (uint32(buf[i+4]) << 12) - - p0 = Gamma1 - p0 - p1 = Gamma1 - p1 - - p0 += uint32(int32(p0)>>31) & common.Q - p1 += uint32(int32(p1)>>31) & common.Q - - p[j] = p0 - p[j+1] = p1 - - j += 2 - } - } else { - panic("γ₁ not supported") - } -} - -// Writes p whose coefficients are in (-γ₁,γ₁] into buf -// which has to be of length PolyLeGamma1Size. -// -// Assumes p is normalized. -func PolyPackLeGamma1(p *common.Poly, buf []byte) { - if Gamma1Bits == 17 { - j := 0 - // coefficients in [0,…,γ₁] ∪ (q-γ₁,…,q) - for i := 0; i < PolyLeGamma1Size; i += 9 { - p0 := Gamma1 - p[j] // [0,…,γ₁] ∪ (γ₁-q,…,2γ₁-q) - p0 += uint32(int32(p0)>>31) & common.Q // [0,…,2γ₁) - p1 := Gamma1 - p[j+1] - p1 += uint32(int32(p1)>>31) & common.Q - p2 := Gamma1 - p[j+2] - p2 += uint32(int32(p2)>>31) & common.Q - p3 := Gamma1 - p[j+3] - p3 += uint32(int32(p3)>>31) & common.Q - - buf[i+0] = byte(p0) - buf[i+1] = byte(p0 >> 8) - buf[i+2] = byte(p0>>16) | byte(p1<<2) - buf[i+3] = byte(p1 >> 6) - buf[i+4] = byte(p1>>14) | byte(p2<<4) - buf[i+5] = byte(p2 >> 4) - buf[i+6] = byte(p2>>12) | byte(p3<<6) - buf[i+7] = byte(p3 >> 2) - buf[i+8] = byte(p3 >> 10) - - j += 4 - } - } else if Gamma1Bits == 19 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 5 { - // Coefficients are in [0, γ₁] ∪ (Q-γ₁, Q) - p0 := Gamma1 - p[j] - p0 += uint32(int32(p0)>>31) & common.Q - p1 := Gamma1 - p[j+1] - p1 += uint32(int32(p1)>>31) & common.Q - - buf[i+0] = byte(p0) - buf[i+1] = byte(p0 >> 8) - buf[i+2] = byte(p0>>16) | byte(p1<<4) - buf[i+3] = byte(p1 >> 4) - buf[i+4] = byte(p1 >> 12) - - j += 2 - } - } else { - panic("γ₁ not supported") - } -} - -// Pack w₁ into buf, which must be of length PolyW1Size. -// -// Assumes w₁ is normalized. -func PolyPackW1(p *common.Poly, buf []byte) { - if Gamma1Bits == 19 { - p.PackLe16(buf) - } else if Gamma1Bits == 17 { - j := 0 - for i := 0; i < PolyW1Size; i += 3 { - buf[i] = byte(p[j]) | byte(p[j+1]<<6) - buf[i+1] = byte(p[j+1]>>2) | byte(p[j+2]<<4) - buf[i+2] = byte(p[j+2]>>4) | byte(p[j+3]<<2) - j += 4 - } - } else { - panic("unsupported γ₁") - } -} diff --git a/sign/dilithium/mode2aes/internal/pack_test.go b/sign/dilithium/mode2aes/internal/pack_test.go deleted file mode 100644 index f952c6a09..000000000 --- a/sign/dilithium/mode2aes/internal/pack_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Code generated from mode3/internal/pack_test.go by gen.go - -package internal - -import ( - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -func TestPolyPackLeqEta(t *testing.T) { - var p1, p2 common.Poly - var seed [64]byte - var buf [PolyLeqEtaSize]byte - - for i := uint16(0); i < 100; i++ { - // Note that DeriveUniformLeqEta sets p to the right kind of - // unnormalized vector. - PolyDeriveUniformLeqEta(&p1, &seed, i) - for j := 0; j < PolyLeqEtaSize; j++ { - if p1[j] < common.Q-Eta || p1[j] > common.Q+Eta { - t.Fatalf("DerveUniformLeqEta out of bounds") - } - } - PolyPackLeqEta(&p1, buf[:]) - PolyUnpackLeqEta(&p2, buf[:]) - if p1 != p2 { - t.Fatalf("%v != %v", p1, p2) - } - } -} - -func TestPolyPackT1(t *testing.T) { - var p1, p2 common.Poly - var seed [32]byte - var buf [common.PolyT1Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniform(&p1, &seed, i) - p1.Normalize() - for j := 0; j < common.N; j++ { - p1[j] &= 0x1ff - } - p1.PackT1(buf[:]) - p2.UnpackT1(buf[:]) - if p1 != p2 { - t.Fatalf("%v != %v", p1, p2) - } - } -} - -func TestPolyPackT0(t *testing.T) { - var p, p0, p1, p2 common.Poly - var seed [32]byte - var buf [common.PolyT0Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniform(&p, &seed, i) - p.Normalize() - p.Power2Round(&p0, &p1) - - p0.PackT0(buf[:]) - p2.UnpackT0(buf[:]) - if p0 != p2 { - t.Fatalf("%v !=\n%v", p0, p2) - } - } -} - -func BenchmarkUnpackLeGamma1(b *testing.B) { - var p common.Poly - var buf [PolyLeGamma1Size]byte - for i := 0; i < b.N; i++ { - PolyUnpackLeGamma1(&p, buf[:]) - } -} - -func TestPolyPackLeGamma1(t *testing.T) { - var p0, p1 common.Poly - var seed [64]byte - var buf [PolyLeGamma1Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniformLeGamma1(&p0, &seed, i) - p0.Normalize() - - PolyPackLeGamma1(&p0, buf[:]) - PolyUnpackLeGamma1(&p1, buf[:]) - if p0 != p1 { - t.Fatalf("%v != %v", p0, p1) - } - } -} diff --git a/sign/dilithium/mode2aes/internal/params.go b/sign/dilithium/mode2aes/internal/params.go deleted file mode 100644 index 77305b51b..000000000 --- a/sign/dilithium/mode2aes/internal/params.go +++ /dev/null @@ -1,19 +0,0 @@ -// Code generated from params.templ.go. DO NOT EDIT. - -package internal - -const ( - Name = "Dilithium2-AES" - UseAES = true - K = 4 - L = 4 - Eta = 2 - DoubleEtaBits = 3 - Omega = 80 - Tau = 39 - Gamma1Bits = 17 - Gamma2 = 95232 - NIST = false - TRSize = 32 - CTildeSize = 32 -) diff --git a/sign/dilithium/mode2aes/internal/params_test.go b/sign/dilithium/mode2aes/internal/params_test.go deleted file mode 100644 index 14d70d1a7..000000000 --- a/sign/dilithium/mode2aes/internal/params_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package internal - -import ( - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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/rounding.go b/sign/dilithium/mode2aes/internal/rounding.go deleted file mode 100644 index 58123c090..000000000 --- a/sign/dilithium/mode2aes/internal/rounding.go +++ /dev/null @@ -1,142 +0,0 @@ -// Code generated from mode3/internal/rounding.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, -// except for when we would have a₁ = (q-1)/α in which case a₁=0 is taken -// and -α/2 ≤ a₀ < 0. Returns a₀ + q. Note 0 ≤ a₁ < (q-1)/α. -// Recall α = 2γ₂. -func decompose(a uint32) (a0plusQ, a1 uint32) { - // a₁ = ⌈a / 128⌉ - a1 = (a + 127) >> 7 - - if Alpha == 523776 { - // 1025/2²² is close enough to 1/4092 so that a₁ - // becomes a/α rounded down. - a1 = ((a1*1025 + (1 << 21)) >> 22) - - // For the corner-case a₁ = (q-1)/α = 16, we have to set a₁=0. - a1 &= 15 - } else if Alpha == 190464 { - // 1488/2²⁴ is close enough to 1/1488 so that a₁ - // becomes a/α rounded down. - a1 = ((a1 * 11275) + (1 << 23)) >> 24 - - // For the corner-case a₁ = (q-1)/α = 44, we have to set a₁=0. - a1 ^= uint32(int32(43-a1)>>31) & a1 - } else { - panic("unsupported α") - } - - a0plusQ = a - a1*Alpha - - // In the corner-case, when we set a₁=0, we will incorrectly - // have a₀ > (q-1)/2 and we'll need to subtract q. As we - // return a₀ + q, that comes down to adding q if a₀ < (q-1)/2. - a0plusQ += uint32(int32(a0plusQ-(common.Q-1)/2)>>31) & common.Q - - return -} - -// Assume 0 ≤ r, f < Q with ‖f‖_∞ ≤ α/2. Decompose r as r = r1*α + r0 as -// computed by decompose(). Write r' := r - f (mod Q). Now, decompose -// r'=r-f again as r' = r'1*α + r'0 using decompose(). As f is small, we -// have r'1 = r1 + h, where h ∈ {-1, 0, 1}. makeHint() computes |h| -// given z0 := r0 - f (mod Q) and r1. With |h|, which is called the hint, -// we can reconstruct r1 using only r' = r - f, which is done by useHint(). -// To wit: -// -// useHint( r - f, makeHint( r0 - f, r1 ) ) = r1. -// -// Assumes 0 ≤ z0 < Q. -func makeHint(z0, r1 uint32) uint32 { - // If -α/2 < r0 - f ≤ α/2, then r1*α + r0 - f is a valid decomposition of r' - // with the restrictions of decompose() and so r'1 = r1. So the hint - // should be 0. This is covered by the first two inequalities. - // There is one other case: if r0 - f = -α/2, then r1*α + r0 - f is also - // a valid decomposition if r1 = 0. In the other cases a one is carried - // and the hint should be 1. - if z0 <= Gamma2 || z0 > common.Q-Gamma2 || (z0 == common.Q-Gamma2 && r1 == 0) { - return 0 - } - return 1 -} - -// Uses the hint created by makeHint() to reconstruct r1 from r'=r-f; see -// documentation of makeHint() for context. -// Assumes 0 ≤ r' < Q. -func useHint(rp uint32, hint uint32) uint32 { - rp0plusQ, rp1 := decompose(rp) - if hint == 0 { - return rp1 - } - if rp0plusQ > common.Q { - return (rp1 + 1) & 15 - } - return (rp1 - 1) & 15 -} - -// Sets p to the hint polynomial for p0 the modified low bits and p1 -// the unmodified high bits --- see makeHint(). -// -// Returns the number of ones in the hint polynomial. -func PolyMakeHint(p, p0, p1 *common.Poly) (pop uint32) { - for i := 0; i < common.N; i++ { - h := makeHint(p0[i], p1[i]) - pop += h - p[i] = h - } - return -} - -// Computes corrections to the high bits of the polynomial q according -// to the hints in h and sets p to the corrected high bits. Returns p. -func PolyUseHint(p, q, hint *common.Poly) { - var q0PlusQ common.Poly - - // See useHint() and makeHint() for an explanation. We reimplement it - // here so that we can call Poly.Decompose(), which might be way faster - // than calling decompose() in a loop (for instance when having AVX2.) - - PolyDecompose(q, &q0PlusQ, p) - - for i := 0; i < common.N; i++ { - if hint[i] == 0 { - continue - } - if Gamma2 == 261888 { - if q0PlusQ[i] > common.Q { - p[i] = (p[i] + 1) & 15 - } else { - p[i] = (p[i] - 1) & 15 - } - } else if Gamma2 == 95232 { - if q0PlusQ[i] > common.Q { - if p[i] == 43 { - p[i] = 0 - } else { - p[i]++ - } - } else { - if p[i] == 0 { - p[i] = 43 - } else { - p[i]-- - } - } - } else { - panic("unsupported γ₂") - } - } -} - -// Splits each of the coefficients of p using decompose. -func PolyDecompose(p, p0PlusQ, p1 *common.Poly) { - for i := 0; i < common.N; i++ { - p0PlusQ[i], p1[i] = decompose(p[i]) - } -} diff --git a/sign/dilithium/mode2aes/internal/rounding_test.go b/sign/dilithium/mode2aes/internal/rounding_test.go deleted file mode 100644 index ad653ca3f..000000000 --- a/sign/dilithium/mode2aes/internal/rounding_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Code generated from mode3/internal/rounding_test.go by gen.go - -package internal - -import ( - "flag" - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") - -func TestDecompose(t *testing.T) { - for a := uint32(0); a < common.Q; a++ { - a0PlusQ, a1 := decompose(a) - a0 := int32(a0PlusQ) - int32(common.Q) - recombined := a0 + int32(Alpha*a1) - if a1 == 0 && recombined < 0 { - recombined += common.Q - if -(Alpha/2) > a0 || a0 >= 0 { - t.Fatalf("decompose(%v): a0 out of bounds", a) - } - } else { - if (-(Alpha / 2) >= a0) || (a0 > Alpha/2) { - t.Fatalf("decompose(%v): a0 out of bounds", a) - } - } - if int32(a) != recombined { - t.Fatalf("decompose(%v) doesn't recombine %v %v", a, a0, a1) - } - } -} - -func TestMakeHint(t *testing.T) { - if !*runVeryLongTest { - t.SkipNow() - } - for w := uint32(0); w < common.Q; w++ { - w0, w1 := decompose(w) - for fn := uint32(0); fn <= Gamma2; fn++ { - fsign := false - for { - var f uint32 - if fsign { - if fn == 0 { - break - } - f = common.Q - fn - } else { - f = fn - } - - hint := makeHint(common.ReduceLe2Q(w0+common.Q-f), w1) - w1p := useHint(common.ReduceLe2Q(w+common.Q-f), hint) - if w1p != w1 { - t.Fatal() - } - - if fsign { - break - } - fsign = true - } - } - } -} - -func BenchmarkDecompose(b *testing.B) { - var p, p0, p1 common.Poly - for i := 0; i < b.N; i++ { - PolyDecompose(&p, &p0, &p1) - } -} - -func BenchmarkMakeHint(b *testing.B) { - var p, p0, p1 common.Poly - for i := 0; i < b.N; i++ { - PolyMakeHint(&p, &p0, &p1) - } -} diff --git a/sign/dilithium/mode2aes/internal/sample.go b/sign/dilithium/mode2aes/internal/sample.go deleted file mode 100644 index 62c261332..000000000 --- a/sign/dilithium/mode2aes/internal/sample.go +++ /dev/null @@ -1,370 +0,0 @@ -// Code generated from mode3/internal/sample.go by gen.go - -package internal - -import ( - "encoding/binary" - - "github.com/cloudflare/circl/internal/sha3" - 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 - -// 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. -// -// Can only be called when DeriveX4Available is true. -func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { - var perm keccakf1600.StateX4 - state := perm.Initialize(false) - - // Absorb the seed in the four states - for i := 0; i < 4; i++ { - v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) - for j := 0; j < 4; j++ { - state[i*4+j] = v - } - } - - // Absorb the nonces, the SHAKE128 domain separator (0b1111), the - // start of the padding (0b...001) and the end of the padding 0b100... - // Recall that the rate of SHAKE128 is 168 --- i.e. 21 uint64s. - for j := 0; j < 4; j++ { - state[4*4+j] = uint64(nonces[j]) | (0x1f << 16) - state[20*4+j] = 0x80 << 56 - } - - var idx [4]int // indices into ps - for j := 0; j < 4; j++ { - if ps[j] == nil { - idx[j] = common.N // mark nil polynomial as completed - } - } - - done := false - for !done { - // Applies KeccaK-f[1600] to state to get the next 21 uint64s of each - // of the four SHAKE128 streams. - perm.Permute() - - done = true - - PolyLoop: - for j := 0; j < 4; j++ { - if idx[j] == common.N { - continue - } - for i := 0; i < 7; i++ { - var t [8]uint32 - t[0] = uint32(state[i*3*4+j] & 0x7fffff) - t[1] = uint32((state[i*3*4+j] >> 24) & 0x7fffff) - t[2] = uint32((state[i*3*4+j] >> 48) | - ((state[(i*3+1)*4+j] & 0x7f) << 16)) - t[3] = uint32((state[(i*3+1)*4+j] >> 8) & 0x7fffff) - t[4] = uint32((state[(i*3+1)*4+j] >> 32) & 0x7fffff) - t[5] = uint32((state[(i*3+1)*4+j] >> 56) | - ((state[(i*3+2)*4+j] & 0x7fff) << 8)) - t[6] = uint32((state[(i*3+2)*4+j] >> 16) & 0x7fffff) - t[7] = uint32((state[(i*3+2)*4+j] >> 40) & 0x7fffff) - - for k := 0; k < 8; k++ { - if t[k] < common.Q { - ps[j][idx[j]] = t[k] - idx[j]++ - if idx[j] == common.N { - continue PolyLoop - } - } - } - } - done = false - } - } -} - -// Sample p uniformly from the given seed and nonce. -// -// 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 - - if UseAES { - length = 12 * 16 - } else { - length = 168 - } - - sample := func() { - // Note that 3 divides into 168 and 12*16, so we use up buf completely. - for j := 0; j < length && i < common.N; j += 3 { - t := (uint32(buf[j]) | (uint32(buf[j+1]) << 8) | - (uint32(buf[j+2]) << 16)) & 0x7fffff - - // We use rejection sampling - if t < common.Q { - p[i] = t - i++ - } - } - } - - if UseAES { - h := common.NewAesStream128(seed, nonce) - - 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() - } - } -} - -// Sample p uniformly with coefficients of norm less than or equal η, -// using the given seed and nonce. -// -// p will not be normalized, but will have coefficients in [q-η,q+η]. -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 - - if UseAES { - length = 9 * 16 - } else { - length = 136 - } - - sample := func() { - // We use rejection sampling - for j := 0; j < length && i < common.N; j++ { - t1 := uint32(buf[j]) & 15 - t2 := uint32(buf[j]) >> 4 - if Eta == 2 { // branch is eliminated by compiler - if t1 <= 14 { - t1 -= ((205 * t1) >> 10) * 5 // reduce mod 5 - p[i] = common.Q + Eta - t1 - i++ - } - if t2 <= 14 && i < common.N { - t2 -= ((205 * t2) >> 10) * 5 // reduce mod 5 - p[i] = common.Q + Eta - t2 - i++ - } - } else if Eta == 4 { - if t1 <= 2*Eta { - p[i] = common.Q + Eta - t1 - i++ - } - if t2 <= 2*Eta && i < common.N { - p[i] = common.Q + Eta - t2 - i++ - } - } else { - panic("unsupported η") - } - } - } - - 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 - - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } - } -} - -// Sample v[i] uniformly with coefficients in (-γ₁,…,γ₁] using the -// given seed and nonce+i -// -// p will be normalized. -func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { - for i := 0; i < L; i++ { - PolyDeriveUniformLeGamma1(&v[i], seed, nonce+uint16(i)) - } -} - -// Sample p uniformly with coefficients in (-γ₁,…,γK1s] using the -// given seed and nonce. -// -// p will be normalized. -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[:]) - } - - PolyUnpackLeGamma1(p, buf[:]) -} - -// For each i, sample ps[i] uniformly with τ non-zero coefficients in {q-1,1} -// using the given seed and w1[i]. ps[i] may be nil and is ignored -// in that case. ps[i] will be normalized. -// -// Can only be called when DeriveX4Available is true. -// -// This function is currently not used (yet). -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 < 32/8; i++ { - v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) - for j := 0; j < 4; j++ { - state[i*4+j] = v - } - } - - // SHAKE256 domain separator and padding - for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f - state[16*4+j] ^= 0x80 << 56 - } - perm.Permute() - - var signs [4]uint64 - var idx [4]uint16 // indices into ps - - for j := 0; j < 4; j++ { - if ps[j] != nil { - signs[j] = state[j] - *ps[j] = common.Poly{} // zero ps[j] - idx[j] = common.N - Tau - } else { - idx[j] = common.N // mark as completed - } - } - - stateOffset := 1 - for { - done := true - - PolyLoop: - for j := 0; j < 4; j++ { - if idx[j] == common.N { - continue - } - - for i := stateOffset; i < 17; i++ { - var bs [8]byte - binary.LittleEndian.PutUint64(bs[:], state[4*i+j]) - for k := 0; k < 8; k++ { - b := uint16(bs[k]) - - if b > idx[j] { - continue - } - - ps[j][idx[j]] = ps[j][b] - ps[j][b] = 1 - // Takes least significant bit of signs and uses it for the sign. - // Note 1 ^ (1 | (Q-1)) = Q-1. - ps[j][b] ^= uint32((-(signs[j] & 1)) & (1 | (common.Q - 1))) - signs[j] >>= 1 - - idx[j]++ - if idx[j] == common.N { - continue PolyLoop - } - } - } - - done = false - } - - if done { - break - } - - perm.Permute() - stateOffset = 0 - } -} - -// Samples p uniformly with τ non-zero coefficients in {q-1,1}. -// -// The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed []byte) { - var buf [136]byte // SHAKE-256 rate is 136 - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - _, _ = h.Read(buf[:]) - - // Essentially we generate a sequence of τ ones or minus ones, - // prepend 196 zeroes and shuffle the concatenation using the - // usual algorithm (Fisher--Yates.) - signs := binary.LittleEndian.Uint64(buf[:]) - bufOff := 8 // offset into buf - - *p = common.Poly{} // zero p - for i := uint16(common.N - Tau); i < common.N; i++ { - var b uint16 - - // Find location of where to move the new coefficient to using - // rejection sampling. - for { - if bufOff >= 136 { - _, _ = h.Read(buf[:]) - bufOff = 0 - } - - b = uint16(buf[bufOff]) - bufOff++ - - if b <= i { - break - } - } - - p[i] = p[b] - p[b] = 1 - // Takes least significant bit of signs and uses it for the sign. - // Note 1 ^ (1 | (Q-1)) = Q-1. - p[b] ^= uint32((-(signs & 1)) & (1 | (common.Q - 1))) - signs >>= 1 - } -} diff --git a/sign/dilithium/mode2aes/internal/sample_test.go b/sign/dilithium/mode2aes/internal/sample_test.go deleted file mode 100644 index 2059599eb..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" - - 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, - } - } - 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/mode2aes/internal/vec.go b/sign/dilithium/mode2aes/internal/vec.go deleted file mode 100644 index d07d3b245..000000000 --- a/sign/dilithium/mode2aes/internal/vec.go +++ /dev/null @@ -1,281 +0,0 @@ -// Code generated from mode3/internal/vec.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// A vector of L polynomials. -type VecL [L]common.Poly - -// A vector of K polynomials. -type VecK [K]common.Poly - -// Normalize the polynomials in this vector. -func (v *VecL) Normalize() { - for i := 0; i < L; i++ { - v[i].Normalize() - } -} - -// Normalize the polynomials in this vector assuming their coefficients -// are already bounded by 2q. -func (v *VecL) NormalizeAssumingLe2Q() { - for i := 0; i < L; i++ { - v[i].NormalizeAssumingLe2Q() - } -} - -// Sets v to w + u. Does not normalize. -func (v *VecL) Add(w, u *VecL) { - for i := 0; i < L; i++ { - v[i].Add(&w[i], &u[i]) - } -} - -// Applies NTT componentwise. See Poly.NTT() for details. -func (v *VecL) NTT() { - for i := 0; i < L; i++ { - v[i].NTT() - } -} - -// Checks whether any of the coefficients exceeds the given bound in supnorm -// -// Requires the vector to be normalized. -func (v *VecL) Exceeds(bound uint32) bool { - for i := 0; i < L; i++ { - if v[i].Exceeds(bound) { - return true - } - } - return false -} - -// Applies Poly.Power2Round componentwise. -// -// Requires the vector to be normalized. -func (v *VecL) Power2Round(v0PlusQ, v1 *VecL) { - for i := 0; i < L; i++ { - v[i].Power2Round(&v0PlusQ[i], &v1[i]) - } -} - -// Applies Poly.Decompose componentwise. -// -// Requires the vector to be normalized. -func (v *VecL) Decompose(v0PlusQ, v1 *VecL) { - for i := 0; i < L; i++ { - PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) - } -} - -// Sequentially packs each polynomial using Poly.PackLeqEta(). -func (v *VecL) PackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyPackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sets v to the polynomials packed in buf using VecL.PackLeqEta(). -func (v *VecL) UnpackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyUnpackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sequentially packs each polynomial using PolyPackLeGamma1(). -func (v *VecL) PackLeGamma1(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyPackLeGamma1(&v[i], buf[offset:]) - offset += PolyLeGamma1Size - } -} - -// Sets v to the polynomials packed in buf using VecL.PackLeGamma1(). -func (v *VecL) UnpackLeGamma1(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyUnpackLeGamma1(&v[i], buf[offset:]) - offset += PolyLeGamma1Size - } -} - -// Normalize the polynomials in this vector. -func (v *VecK) Normalize() { - for i := 0; i < K; i++ { - v[i].Normalize() - } -} - -// Normalize the polynomials in this vector assuming their coefficients -// are already bounded by 2q. -func (v *VecK) NormalizeAssumingLe2Q() { - for i := 0; i < K; i++ { - v[i].NormalizeAssumingLe2Q() - } -} - -// Sets v to w + u. Does not normalize. -func (v *VecK) Add(w, u *VecK) { - for i := 0; i < K; i++ { - v[i].Add(&w[i], &u[i]) - } -} - -// Checks whether any of the coefficients exceeds the given bound in supnorm -// -// Requires the vector to be normalized. -func (v *VecK) Exceeds(bound uint32) bool { - for i := 0; i < K; i++ { - if v[i].Exceeds(bound) { - return true - } - } - return false -} - -// Applies Poly.Power2Round componentwise. -// -// Requires the vector to be normalized. -func (v *VecK) Power2Round(v0PlusQ, v1 *VecK) { - for i := 0; i < K; i++ { - v[i].Power2Round(&v0PlusQ[i], &v1[i]) - } -} - -// Applies Poly.Decompose componentwise. -// -// Requires the vector to be normalized. -func (v *VecK) Decompose(v0PlusQ, v1 *VecK) { - for i := 0; i < K; i++ { - PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) - } -} - -// Sets v to the hint vector for v0 the modified low bits and v1 -// the unmodified high bits --- see makeHint(). -// -// Returns the number of ones in the hint vector. -func (v *VecK) MakeHint(v0, v1 *VecK) (pop uint32) { - for i := 0; i < K; i++ { - pop += PolyMakeHint(&v[i], &v0[i], &v1[i]) - } - return -} - -// Computes corrections to the high bits of the polynomials in the vector -// w using the hints in h and sets v to the corrected high bits. Returns v. -// See useHint(). -func (v *VecK) UseHint(q, hint *VecK) *VecK { - for i := 0; i < K; i++ { - PolyUseHint(&v[i], &q[i], &hint[i]) - } - return v -} - -// Sequentially packs each polynomial using Poly.PackT1(). -func (v *VecK) PackT1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].PackT1(buf[offset:]) - offset += common.PolyT1Size - } -} - -// Sets v to the vector packed into buf by PackT1(). -func (v *VecK) UnpackT1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].UnpackT1(buf[offset:]) - offset += common.PolyT1Size - } -} - -// Sequentially packs each polynomial using Poly.PackT0(). -func (v *VecK) PackT0(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].PackT0(buf[offset:]) - offset += common.PolyT0Size - } -} - -// Sets v to the vector packed into buf by PackT0(). -func (v *VecK) UnpackT0(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].UnpackT0(buf[offset:]) - offset += common.PolyT0Size - } -} - -// Sequentially packs each polynomial using Poly.PackLeqEta(). -func (v *VecK) PackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyPackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sets v to the polynomials packed in buf using VecK.PackLeqEta(). -func (v *VecK) UnpackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyUnpackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Applies NTT componentwise. See Poly.NTT() for details. -func (v *VecK) NTT() { - for i := 0; i < K; i++ { - v[i].NTT() - } -} - -// Sequentially packs each polynomial using PolyPackW1(). -func (v *VecK) PackW1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyPackW1(&v[i], buf[offset:]) - offset += PolyW1Size - } -} - -// Sets v to a - b. -// -// Warning: assumes coefficients of the polynomials of b are less than 2q. -func (v *VecK) Sub(a, b *VecK) { - for i := 0; i < K; i++ { - v[i].Sub(&a[i], &b[i]) - } -} - -// Sets v to 2ᵈ w without reducing. -func (v *VecK) MulBy2toD(w *VecK) { - for i := 0; i < K; i++ { - v[i].MulBy2toD(&w[i]) - } -} - -// Applies InvNTT componentwise. See Poly.InvNTT() for details. -func (v *VecK) InvNTT() { - for i := 0; i < K; i++ { - v[i].InvNTT() - } -} - -// Applies Poly.ReduceLe2Q() componentwise. -func (v *VecK) ReduceLe2Q() { - for i := 0; i < K; i++ { - v[i].ReduceLe2Q() - } -} diff --git a/sign/dilithium/mode3.go b/sign/dilithium/mode3.go deleted file mode 100644 index 7726023f2..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/mode3" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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 private 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 de98b5dd2..2e93e9c50 100644 --- a/sign/dilithium/mode3/dilithium.go +++ b/sign/dilithium/mode3/dilithium.go @@ -1,11 +1,9 @@ -// 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 // // https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf - package mode3 import ( @@ -13,10 +11,9 @@ import ( "errors" "io" - common "github.com/cloudflare/circl/sign/internal/dilithium" - + "github.com/cloudflare/circl/sign" "github.com/cloudflare/circl/sign/dilithium/mode3/internal" - + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -54,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, ) } @@ -147,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. @@ -183,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 da4ec6262..63f53a966 100644 --- a/sign/dilithium/mode3/internal/dilithium.go +++ b/sign/dilithium/mode3/internal/dilithium.go @@ -242,7 +242,10 @@ 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 @@ -260,7 +263,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 +280,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[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -305,8 +308,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,16 +328,14 @@ 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 { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) + _, _ = h.Write(rnd[:]) } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -371,7 +375,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, sig.c[:32]) + 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 9707772be..a3f1126dd 100644 --- a/sign/dilithium/mode3/internal/dilithium_test.go +++ b/sign/dilithium/mode3/internal/dilithium_test.go @@ -2,6 +2,7 @@ package internal import ( "encoding/binary" + "io" "testing" common "github.com/cloudflare/circl/sign/internal/dilithium" @@ -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/params.go b/sign/dilithium/mode3/internal/params.go index 77452958f..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 diff --git a/sign/dilithium/mode3/internal/sample.go b/sign/dilithium/mode3/internal/sample.go index b2b0bbe13..f90d211d8 100644 --- a/sign/dilithium/mode3/internal/sample.go +++ b/sign/dilithium/mode3/internal/sample.go @@ -10,7 +10,7 @@ import ( // 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[:]) } @@ -249,7 +218,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 32/8; 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 []byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() diff --git a/sign/dilithium/mode3/internal/sample_test.go b/sign/dilithium/mode3/internal/sample_test.go index 1adfaf535..69e56d31a 100644 --- a/sign/dilithium/mode3/internal/sample_test.go +++ b/sign/dilithium/mode3/internal/sample_test.go @@ -10,94 +10,46 @@ import ( 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,7 +102,7 @@ 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[:]) @@ -198,7 +150,7 @@ 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[:], diff --git a/sign/dilithium/mode3aes.go b/sign/dilithium/mode3aes.go deleted file mode 100644 index f7414f15b..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/mode3aes" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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 private 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 0503f7673..000000000 --- a/sign/dilithium/mode3aes/dilithium.go +++ /dev/null @@ -1,185 +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" - - common "github.com/cloudflare/circl/sign/internal/dilithium" - - "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/dilithium.go b/sign/dilithium/mode3aes/internal/dilithium.go deleted file mode 100644 index 7869d0475..000000000 --- a/sign/dilithium/mode3aes/internal/dilithium.go +++ /dev/null @@ -1,482 +0,0 @@ -// Code generated from mode3/internal/dilithium.go by gen.go - -package internal - -import ( - cryptoRand "crypto/rand" - "crypto/subtle" - "io" - - "github.com/cloudflare/circl/internal/sha3" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -const ( - // Size of a packed polynomial of norm ≤η. - // (Note that the formula is not valid in general.) - PolyLeqEtaSize = (common.N * DoubleEtaBits) / 8 - - // β = τη, the maximum size of c s₂. - Beta = Tau * Eta - - // γ₁ range of y - Gamma1 = 1 << Gamma1Bits - - // Size of packed polynomial of norm <γ₁ such as z - PolyLeGamma1Size = (Gamma1Bits + 1) * common.N / 8 - - // α = 2γ₂ parameter for decompose - Alpha = 2 * Gamma2 - - // Size of a packed private key - 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 + CTildeSize - - // Size of packed w₁ - PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 -) - -// PublicKey is the type of Dilithium public keys. -type PublicKey struct { - rho [32]byte - t1 VecK - - // Cached values - t1p [common.PolyT1Size * K]byte - A *Mat - tr *[TRSize]byte -} - -// PrivateKey is the type of Dilithium private keys. -type PrivateKey struct { - rho [32]byte - key [32]byte - s1 VecL - s2 VecK - t0 VecK - tr [TRSize]byte - - // Cached values - A Mat // ExpandA(ρ) - s1h VecL // NTT(s₁) - s2h VecK // NTT(s₂) - t0h VecK // NTT(t₀) -} - -type unpackedSignature struct { - z VecL - hint VecK - c [CTildeSize]byte -} - -// Packs the signature into buf. -func (sig *unpackedSignature) Pack(buf []byte) { - copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[CTildeSize:]) - sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) -} - -// Sets sig to the signature encoded in the buffer. -// -// Returns whether buf contains a properly packed signature. -func (sig *unpackedSignature) Unpack(buf []byte) bool { - if len(buf) < SignatureSize { - return false - } - copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[CTildeSize:]) - if sig.z.Exceeds(Gamma1 - Beta) { - return false - } - if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { - return false - } - return true -} - -// Packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - copy(buf[:32], pk.rho[:]) - copy(buf[32:], pk.t1p[:]) -} - -// Sets pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - copy(pk.rho[:], buf[:32]) - copy(pk.t1p[:], buf[32:]) - - pk.t1.UnpackT1(pk.t1p[:]) - pk.A = new(Mat) - pk.A.Derive(&pk.rho) - - // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([TRSize]byte) - h := sha3.NewShake256() - _, _ = h.Write(buf[:]) - _, _ = h.Read(pk.tr[:]) -} - -// Packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - copy(buf[:32], sk.rho[:]) - copy(buf[32:64], sk.key[:]) - copy(buf[64:64+TRSize], sk.tr[:]) - offset := 64 + TRSize - sk.s1.PackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * L - sk.s2.PackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * K - sk.t0.PackT0(buf[offset:]) -} - -// Sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - copy(sk.rho[:], buf[:32]) - copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:64+TRSize]) - offset := 64 + TRSize - sk.s1.UnpackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * L - sk.s2.UnpackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * K - sk.t0.UnpackT0(buf[offset:]) - - // Cached values - sk.A.Derive(&sk.rho) - sk.t0h = sk.t0 - sk.t0h.NTT() - sk.s1h = sk.s1 - sk.s1h.NTT() - sk.s2h = sk.s2 - sk.s2h.NTT() -} - -// 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) { - var seed [32]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 -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { - var eSeed [128]byte // expanded seed - var pk PublicKey - var sk PrivateKey - var sSeed [64]byte - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - _, _ = h.Read(eSeed[:]) - - copy(pk.rho[:], eSeed[:32]) - copy(sSeed[:], eSeed[32:96]) - copy(sk.key[:], eSeed[96:]) - copy(sk.rho[:], pk.rho[:]) - - sk.A.Derive(&pk.rho) - - for i := uint16(0); i < L; i++ { - PolyDeriveUniformLeqEta(&sk.s1[i], &sSeed, i) - } - - for i := uint16(0); i < K; i++ { - PolyDeriveUniformLeqEta(&sk.s2[i], &sSeed, i+L) - } - - sk.s1h = sk.s1 - sk.s1h.NTT() - sk.s2h = sk.s2 - sk.s2h.NTT() - - sk.computeT0andT1(&sk.t0, &pk.t1) - - sk.t0h = sk.t0 - sk.t0h.NTT() - - // Complete public key far enough to be packed - pk.t1.PackT1(pk.t1p[:]) - pk.A = &sk.A - - // Finish private key - var packedPk [PublicKeySize]byte - pk.Pack(&packedPk) - - // tr = CRH(ρ ‖ t1) = CRH(pk) - h.Reset() - _, _ = h.Write(packedPk[:]) - _, _ = h.Read(sk.tr[:]) - - // Finish cache of public key - pk.tr = &sk.tr - - return &pk, &sk -} - -// Computes t0 and t1 from sk.s1h, sk.s2 and sk.A. -func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { - var t VecK - - // Set t to A s₁ + s₂ - for i := 0; i < K; i++ { - PolyDotHat(&t[i], &sk.A[i], &sk.s1h) - t[i].ReduceLe2Q() - t[i].InvNTT() - } - t.Add(&t, &sk.s2) - t.Normalize() - - // Compute t₀, t₁ = Power2Round(t) - t.Power2Round(t0, t1) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - var sig unpackedSignature - var mu [64]byte - var zh VecL - var Az, Az2dct1, w1 VecK - var ch common.Poly - var cp [CTildeSize]byte - var w1Packed [PolyW1Size * K]byte - - // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β - // and ensured that there at most ω ones in pk.hint. - if !sig.Unpack(signature) { - return false - } - - // μ = CRH(tr ‖ msg) - h := sha3.NewShake256() - _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) - _, _ = h.Read(mu[:]) - - // Compute Az - zh = sig.z - zh.NTT() - - for i := 0; i < K; i++ { - PolyDotHat(&Az[i], &pk.A[i], &zh) - } - - // Next, we compute Az - 2ᵈ·c·t₁. - // Note that the coefficients of t₁ are bounded by 256 = 2⁹, - // so the coefficients of Az2dct1 will bounded by 2⁹⁺ᵈ = 2²³ < 2q, - // which is small enough for NTT(). - Az2dct1.MulBy2toD(&pk.t1) - Az2dct1.NTT() - PolyDeriveUniformBall(&ch, sig.c[:32]) - ch.NTT() - for i := 0; i < K; i++ { - Az2dct1[i].MulHat(&Az2dct1[i], &ch) - } - Az2dct1.Sub(&Az, &Az2dct1) - Az2dct1.ReduceLe2Q() - Az2dct1.InvNTT() - Az2dct1.NormalizeAssumingLe2Q() - - // UseHint(pk.hint, Az - 2ᵈ·c·t₁) - // = UseHint(pk.hint, w - c·s₂ + c·t₀) - // = UseHint(pk.hint, r + c·t₀) - // = r₁ = w₁. - w1.UseHint(&Az2dct1, &sig.hint) - w1.PackW1(w1Packed[:]) - - // c' = H(μ, w₁) - h.Reset() - _, _ = h.Write(mu[:]) - _, _ = h.Write(w1Packed[:]) - _, _ = h.Read(cp[:]) - - return sig.c == cp -} - -// SignTo signs the given message and writes the signature into signature. -// -//nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - var mu, rhop [64]byte - var w1Packed [PolyW1Size * K]byte - var y, yh VecL - var w, w0, w1, w0mcs2, ct0, w0mcs2pct0 VecK - var ch common.Poly - var yNonce uint16 - var sig unpackedSignature - - if len(signature) < SignatureSize { - panic("Signature does not fit in that byteslice") - } - - // μ = CRH(tr ‖ msg) - h := sha3.NewShake256() - _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) - _, _ = h.Read(mu[:]) - - // ρ' = CRH(key ‖ μ) - h.Reset() - _, _ = h.Write(sk.key[:]) - if NIST { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) - } - _, _ = h.Write(mu[:]) - _, _ = h.Read(rhop[:]) - - // Main rejection loop - attempt := 0 - for { - attempt++ - if attempt >= 576 { - // Depending on the mode, one try has a chance between 1/7 and 1/4 - // of succeeding. Thus it is safe to say that 576 iterations - // are enough as (6/7)⁵⁷⁶ < 2⁻¹²⁸. - panic("This should only happen 1 in 2^{128}: something is wrong.") - } - - // y = ExpandMask(ρ', key) - VecLDeriveUniformLeGamma1(&y, &rhop, yNonce) - yNonce += uint16(L) - - // Set w to A y - yh = y - yh.NTT() - for i := 0; i < K; i++ { - PolyDotHat(&w[i], &sk.A[i], &yh) - w[i].ReduceLe2Q() - w[i].InvNTT() - } - - // Decompose w into w₀ and w₁ - w.NormalizeAssumingLe2Q() - w.Decompose(&w0, &w1) - - // c~ = H(μ ‖ w₁) - w1.PackW1(w1Packed[:]) - h.Reset() - _, _ = h.Write(mu[:]) - _, _ = h.Write(w1Packed[:]) - _, _ = h.Read(sig.c[:]) - - PolyDeriveUniformBall(&ch, sig.c[:32]) - ch.NTT() - - // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. - // - // By Lemma 3 of the specification this is equivalent to checking that - // both ‖ r₀ ‖_∞ < γ₂ - β and r₁ = w₁, for the decomposition - // w - c·s₂ = r₁ α + r₀ as computed by decompose(). - // See also §4.1 of the specification. - for i := 0; i < K; i++ { - w0mcs2[i].MulHat(&ch, &sk.s2h[i]) - w0mcs2[i].InvNTT() - } - w0mcs2.Sub(&w0, &w0mcs2) - w0mcs2.Normalize() - - if w0mcs2.Exceeds(Gamma2 - Beta) { - continue - } - - // z = y + c·s₁ - for i := 0; i < L; i++ { - sig.z[i].MulHat(&ch, &sk.s1h[i]) - sig.z[i].InvNTT() - } - sig.z.Add(&sig.z, &y) - sig.z.Normalize() - - // Ensure ‖z‖_∞ < γ₁ - β - if sig.z.Exceeds(Gamma1 - Beta) { - continue - } - - // Compute c·t₀ - for i := 0; i < K; i++ { - ct0[i].MulHat(&ch, &sk.t0h[i]) - ct0[i].InvNTT() - } - ct0.NormalizeAssumingLe2Q() - - // Ensure ‖c·t₀‖_∞ < γ₂. - if ct0.Exceeds(Gamma2) { - continue - } - - // Create the hint to be able to reconstruct w₁ from w - c·s₂ + c·t0. - // Note that we're not using makeHint() in the obvious way as we - // do not know whether ‖ sc·s₂ - c·t₀ ‖_∞ < γ₂. Instead we note - // that our makeHint() is actually the same as a makeHint for a - // different decomposition: - // - // Earlier we ensured indirectly with a check that r₁ = w₁ where - // r = w - c·s₂. Hence r₀ = r - r₁ α = w - c·s₂ - w₁ α = w₀ - c·s₂. - // Thus MakeHint(w₀ - c·s₂ + c·t₀, w₁) = MakeHint(r0 + c·t₀, r₁) - // and UseHint(w - c·s₂ + c·t₀, w₁) = UseHint(r + c·t₀, r₁). - // As we just ensured that ‖ c·t₀ ‖_∞ < γ₂ our usage is correct. - w0mcs2pct0.Add(&w0mcs2, &ct0) - w0mcs2pct0.NormalizeAssumingLe2Q() - hintPop := sig.hint.MakeHint(&w0mcs2pct0, &w1) - if hintPop > Omega { - continue - } - - break - } - - sig.Pack(signature[:]) -} - -// Computes the public key corresponding to this private key. -func (sk *PrivateKey) Public() *PublicKey { - var t0 VecK - pk := &PublicKey{ - rho: sk.rho, - A: &sk.A, - tr: &sk.tr, - } - sk.computeT0andT1(&t0, &pk.t1) - pk.t1.PackT1(pk.t1p[:]) - return pk -} - -// Equal returns whether the two public keys are equal -func (pk *PublicKey) Equal(other *PublicKey) bool { - return pk.rho == other.rho && pk.t1 == other.t1 -} - -// Equal returns whether the two private keys are equal -func (sk *PrivateKey) Equal(other *PrivateKey) bool { - ret := (subtle.ConstantTimeCompare(sk.rho[:], other.rho[:]) & - subtle.ConstantTimeCompare(sk.key[:], other.key[:]) & - subtle.ConstantTimeCompare(sk.tr[:], other.tr[:])) - - acc := uint32(0) - for i := 0; i < L; i++ { - for j := 0; j < common.N; j++ { - acc |= sk.s1[i][j] ^ other.s1[i][j] - } - } - for i := 0; i < K; i++ { - for j := 0; j < common.N; j++ { - acc |= sk.s2[i][j] ^ other.s2[i][j] - acc |= sk.t0[i][j] ^ other.t0[i][j] - } - } - return (ret & subtle.ConstantTimeEq(int32(acc), 0)) == 1 -} diff --git a/sign/dilithium/mode3aes/internal/dilithium_test.go b/sign/dilithium/mode3aes/internal/dilithium_test.go deleted file mode 100644 index 825e7da08..000000000 --- a/sign/dilithium/mode3aes/internal/dilithium_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Code generated from mode3/internal/dilithium_test.go by gen.go - -package internal - -import ( - "encoding/binary" - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Checks whether p is normalized. Only used in tests. -func PolyNormalized(p *common.Poly) bool { - p2 := *p - p2.Normalize() - return p2 == *p -} - -func BenchmarkSkUnpack(b *testing.B) { - var buf [PrivateKeySize]byte - var sk PrivateKey - for i := 0; i < b.N; i++ { - sk.Unpack(&buf) - } -} - -func BenchmarkPkUnpack(b *testing.B) { - var buf [PublicKeySize]byte - var pk PublicKey - for i := 0; i < b.N; i++ { - pk.Unpack(&buf) - } -} - -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 - pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], 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[:]) - } -} - -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 - _, sk := NewKeyFromSeed(&seed) - b.ResetTimer() - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) - } -} - -func BenchmarkGenerateKey(b *testing.B) { - var seed [32]byte - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - NewKeyFromSeed(&seed) - } -} - -func BenchmarkPublicFromPrivate(b *testing.B) { - var seed [32]byte - for i := 0; i < b.N; i++ { - b.StopTimer() - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - _, sk := NewKeyFromSeed(&seed) - b.StartTimer() - sk.Public() - } -} - -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 - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := NewKeyFromSeed(&seed) - if !sk.Equal(sk) { - t.Fatal() - } - for j := uint64(0); j < 10; j++ { - binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { - t.Fatal() - } - } - pk.Pack(&pkb) - pk2.Unpack(&pkb) - if !pk.Equal(&pk2) { - t.Fatal() - } - sk.Pack(&skb) - sk2.Unpack(&skb) - if !sk.Equal(&sk2) { - t.Fatal() - } - } -} - -func TestPublicFromPrivate(t *testing.T) { - var seed [common.SeedSize]byte - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := NewKeyFromSeed(&seed) - pk2 := sk.Public() - if !pk.Equal(pk2) { - t.Fatal() - } - } -} - -func TestGamma1Size(t *testing.T) { - var expected int - switch Gamma1Bits { - case 17: - expected = 576 - case 19: - expected = 640 - } - if expected != PolyLeGamma1Size { - t.Fatal() - } -} diff --git a/sign/dilithium/mode3aes/internal/mat.go b/sign/dilithium/mode3aes/internal/mat.go deleted file mode 100644 index ceaf634fa..000000000 --- a/sign/dilithium/mode3aes/internal/mat.go +++ /dev/null @@ -1,59 +0,0 @@ -// Code generated from mode3/internal/mat.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// A k by l matrix of polynomials. -type Mat [K]VecL - -// Expands the given seed to a complete matrix. -// -// This function is called ExpandA in the specification. -func (m *Mat) Derive(seed *[32]byte) { - if !DeriveX4Available { - for i := uint16(0); i < K; i++ { - for j := uint16(0); j < L; j++ { - PolyDeriveUniform(&m[i][j], seed, (i<<8)+j) - } - } - return - } - - idx := 0 - var nonces [4]uint16 - var ps [4]*common.Poly - for i := uint16(0); i < K; i++ { - for j := uint16(0); j < L; j++ { - nonces[idx] = (i << 8) + j - ps[idx] = &m[i][j] - idx++ - if idx == 4 { - idx = 0 - PolyDeriveUniformX4(ps, seed, nonces) - } - } - } - if idx != 0 { - for i := idx; i < 4; i++ { - ps[i] = nil - } - PolyDeriveUniformX4(ps, seed, nonces) - } -} - -// Set p to the inner product of a and b using pointwise multiplication. -// -// Assumes a and b are in Montgomery form and their coefficients are -// pairwise sufficiently small to multiply, see Poly.MulHat(). Resulting -// coefficients are bounded by 2Lq. -func PolyDotHat(p *common.Poly, a, b *VecL) { - var t common.Poly - *p = common.Poly{} // zero p - for i := 0; i < L; i++ { - t.MulHat(&a[i], &b[i]) - p.Add(&t, p) - } -} diff --git a/sign/dilithium/mode3aes/internal/pack.go b/sign/dilithium/mode3aes/internal/pack.go deleted file mode 100644 index 1854b4197..000000000 --- a/sign/dilithium/mode3aes/internal/pack.go +++ /dev/null @@ -1,270 +0,0 @@ -// Code generated from mode3/internal/pack.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Writes p with norm less than or equal η into buf, which must be of -// size PolyLeqEtaSize. -// -// Assumes coefficients of p are not normalized, but in [q-η,q+η]. -func PolyPackLeqEta(p *common.Poly, buf []byte) { - if DoubleEtaBits == 4 { // compiler eliminates branch - j := 0 - for i := 0; i < PolyLeqEtaSize; i++ { - buf[i] = (byte(common.Q+Eta-p[j]) | - byte(common.Q+Eta-p[j+1])<<4) - j += 2 - } - } else if DoubleEtaBits == 3 { - j := 0 - for i := 0; i < PolyLeqEtaSize; i += 3 { - buf[i] = (byte(common.Q+Eta-p[j]) | - (byte(common.Q+Eta-p[j+1]) << 3) | - (byte(common.Q+Eta-p[j+2]) << 6)) - buf[i+1] = ((byte(common.Q+Eta-p[j+2]) >> 2) | - (byte(common.Q+Eta-p[j+3]) << 1) | - (byte(common.Q+Eta-p[j+4]) << 4) | - (byte(common.Q+Eta-p[j+5]) << 7)) - buf[i+2] = ((byte(common.Q+Eta-p[j+5]) >> 1) | - (byte(common.Q+Eta-p[j+6]) << 2) | - (byte(common.Q+Eta-p[j+7]) << 5)) - j += 8 - } - } else { - panic("eta not supported") - } -} - -// Sets p to the polynomial of norm less than or equal η encoded in the -// given buffer of size PolyLeqEtaSize. -// -// Output coefficients of p are not normalized, but in [q-η,q+η] provided -// buf was created using PackLeqEta. -// -// Beware, for arbitrary buf the coefficients of p might end up in -// the interval [q-2^b,q+2^b] where b is the least b with η≤2^b. -func PolyUnpackLeqEta(p *common.Poly, buf []byte) { - if DoubleEtaBits == 4 { // compiler eliminates branch - j := 0 - for i := 0; i < PolyLeqEtaSize; i++ { - p[j] = common.Q + Eta - uint32(buf[i]&15) - p[j+1] = common.Q + Eta - uint32(buf[i]>>4) - j += 2 - } - } else if DoubleEtaBits == 3 { - j := 0 - for i := 0; i < PolyLeqEtaSize; i += 3 { - p[j] = common.Q + Eta - uint32(buf[i]&7) - p[j+1] = common.Q + Eta - uint32((buf[i]>>3)&7) - p[j+2] = common.Q + Eta - uint32((buf[i]>>6)|((buf[i+1]<<2)&7)) - p[j+3] = common.Q + Eta - uint32((buf[i+1]>>1)&7) - p[j+4] = common.Q + Eta - uint32((buf[i+1]>>4)&7) - p[j+5] = common.Q + Eta - uint32((buf[i+1]>>7)|((buf[i+2]<<1)&7)) - p[j+6] = common.Q + Eta - uint32((buf[i+2]>>2)&7) - p[j+7] = common.Q + Eta - uint32((buf[i+2]>>5)&7) - j += 8 - } - } else { - panic("eta not supported") - } -} - -// Writes v with coefficients in {0, 1} of which at most ω non-zero -// to buf, which must have length ω+k. -func (v *VecK) PackHint(buf []byte) { - // The packed hint starts with the indices of the non-zero coefficients - // For instance: - // - // (x⁵⁶ + x¹⁰⁰, x²⁵⁵, 0, x² + x²³, x¹) - // - // Yields - // - // 56, 100, 255, 2, 23, 1 - // - // Then we pad with zeroes until we have a list of ω items: - // // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0 - // - // Then we finish with a list of the switch-over-indices in this - // list between polynomials, so: - // - // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0, 2, 3, 3, 5, 6 - - off := uint8(0) - for i := 0; i < K; i++ { - for j := uint16(0); j < common.N; j++ { - if v[i][j] != 0 { - buf[off] = uint8(j) - off++ - } - } - buf[Omega+i] = off - } - for ; off < Omega; off++ { - buf[off] = 0 - } -} - -// Sets v to the vector encoded using VecK.PackHint() -// -// Returns whether unpacking was successful. -func (v *VecK) UnpackHint(buf []byte) bool { - // A priori, there would be several reasonable ways to encode the same - // hint vector. We take care to only allow only one encoding, to ensure - // "strong unforgeability". - // - // See PackHint() source for description of the encoding. - *v = VecK{} // zero v - prevSOP := uint8(0) // previous switch-over-point - for i := 0; i < K; i++ { - SOP := buf[Omega+i] - if SOP < prevSOP || SOP > Omega { - return false // ensures switch-over-points are increasing - } - for j := prevSOP; j < SOP; j++ { - if j > prevSOP && buf[j] <= buf[j-1] { - return false // ensures indices are increasing (within a poly) - } - v[i][buf[j]] = 1 - } - prevSOP = SOP - } - for j := prevSOP; j < Omega; j++ { - if buf[j] != 0 { - return false // ensures padding indices are zero - } - } - - return true -} - -// Sets p to the polynomial packed into buf by PolyPackLeGamma1. -// -// p will be normalized. -func PolyUnpackLeGamma1(p *common.Poly, buf []byte) { - if Gamma1Bits == 17 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 9 { - p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | - (uint32(buf[i+2]&0x3) << 16) - p1 := uint32(buf[i+2]>>2) | (uint32(buf[i+3]) << 6) | - (uint32(buf[i+4]&0xf) << 14) - p2 := uint32(buf[i+4]>>4) | (uint32(buf[i+5]) << 4) | - (uint32(buf[i+6]&0x3f) << 12) - p3 := uint32(buf[i+6]>>6) | (uint32(buf[i+7]) << 2) | - (uint32(buf[i+8]) << 10) - - // coefficients in [0,…,2γ₁) - p0 = Gamma1 - p0 // (-γ₁,…,γ₁] - p1 = Gamma1 - p1 - p2 = Gamma1 - p2 - p3 = Gamma1 - p3 - - p0 += uint32(int32(p0)>>31) & common.Q // normalize - p1 += uint32(int32(p1)>>31) & common.Q - p2 += uint32(int32(p2)>>31) & common.Q - p3 += uint32(int32(p3)>>31) & common.Q - - p[j] = p0 - p[j+1] = p1 - p[j+2] = p2 - p[j+3] = p3 - - j += 4 - } - } else if Gamma1Bits == 19 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 5 { - p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | - (uint32(buf[i+2]&0xf) << 16) - p1 := uint32(buf[i+2]>>4) | (uint32(buf[i+3]) << 4) | - (uint32(buf[i+4]) << 12) - - p0 = Gamma1 - p0 - p1 = Gamma1 - p1 - - p0 += uint32(int32(p0)>>31) & common.Q - p1 += uint32(int32(p1)>>31) & common.Q - - p[j] = p0 - p[j+1] = p1 - - j += 2 - } - } else { - panic("γ₁ not supported") - } -} - -// Writes p whose coefficients are in (-γ₁,γ₁] into buf -// which has to be of length PolyLeGamma1Size. -// -// Assumes p is normalized. -func PolyPackLeGamma1(p *common.Poly, buf []byte) { - if Gamma1Bits == 17 { - j := 0 - // coefficients in [0,…,γ₁] ∪ (q-γ₁,…,q) - for i := 0; i < PolyLeGamma1Size; i += 9 { - p0 := Gamma1 - p[j] // [0,…,γ₁] ∪ (γ₁-q,…,2γ₁-q) - p0 += uint32(int32(p0)>>31) & common.Q // [0,…,2γ₁) - p1 := Gamma1 - p[j+1] - p1 += uint32(int32(p1)>>31) & common.Q - p2 := Gamma1 - p[j+2] - p2 += uint32(int32(p2)>>31) & common.Q - p3 := Gamma1 - p[j+3] - p3 += uint32(int32(p3)>>31) & common.Q - - buf[i+0] = byte(p0) - buf[i+1] = byte(p0 >> 8) - buf[i+2] = byte(p0>>16) | byte(p1<<2) - buf[i+3] = byte(p1 >> 6) - buf[i+4] = byte(p1>>14) | byte(p2<<4) - buf[i+5] = byte(p2 >> 4) - buf[i+6] = byte(p2>>12) | byte(p3<<6) - buf[i+7] = byte(p3 >> 2) - buf[i+8] = byte(p3 >> 10) - - j += 4 - } - } else if Gamma1Bits == 19 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 5 { - // Coefficients are in [0, γ₁] ∪ (Q-γ₁, Q) - p0 := Gamma1 - p[j] - p0 += uint32(int32(p0)>>31) & common.Q - p1 := Gamma1 - p[j+1] - p1 += uint32(int32(p1)>>31) & common.Q - - buf[i+0] = byte(p0) - buf[i+1] = byte(p0 >> 8) - buf[i+2] = byte(p0>>16) | byte(p1<<4) - buf[i+3] = byte(p1 >> 4) - buf[i+4] = byte(p1 >> 12) - - j += 2 - } - } else { - panic("γ₁ not supported") - } -} - -// Pack w₁ into buf, which must be of length PolyW1Size. -// -// Assumes w₁ is normalized. -func PolyPackW1(p *common.Poly, buf []byte) { - if Gamma1Bits == 19 { - p.PackLe16(buf) - } else if Gamma1Bits == 17 { - j := 0 - for i := 0; i < PolyW1Size; i += 3 { - buf[i] = byte(p[j]) | byte(p[j+1]<<6) - buf[i+1] = byte(p[j+1]>>2) | byte(p[j+2]<<4) - buf[i+2] = byte(p[j+2]>>4) | byte(p[j+3]<<2) - j += 4 - } - } else { - panic("unsupported γ₁") - } -} diff --git a/sign/dilithium/mode3aes/internal/pack_test.go b/sign/dilithium/mode3aes/internal/pack_test.go deleted file mode 100644 index f952c6a09..000000000 --- a/sign/dilithium/mode3aes/internal/pack_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Code generated from mode3/internal/pack_test.go by gen.go - -package internal - -import ( - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -func TestPolyPackLeqEta(t *testing.T) { - var p1, p2 common.Poly - var seed [64]byte - var buf [PolyLeqEtaSize]byte - - for i := uint16(0); i < 100; i++ { - // Note that DeriveUniformLeqEta sets p to the right kind of - // unnormalized vector. - PolyDeriveUniformLeqEta(&p1, &seed, i) - for j := 0; j < PolyLeqEtaSize; j++ { - if p1[j] < common.Q-Eta || p1[j] > common.Q+Eta { - t.Fatalf("DerveUniformLeqEta out of bounds") - } - } - PolyPackLeqEta(&p1, buf[:]) - PolyUnpackLeqEta(&p2, buf[:]) - if p1 != p2 { - t.Fatalf("%v != %v", p1, p2) - } - } -} - -func TestPolyPackT1(t *testing.T) { - var p1, p2 common.Poly - var seed [32]byte - var buf [common.PolyT1Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniform(&p1, &seed, i) - p1.Normalize() - for j := 0; j < common.N; j++ { - p1[j] &= 0x1ff - } - p1.PackT1(buf[:]) - p2.UnpackT1(buf[:]) - if p1 != p2 { - t.Fatalf("%v != %v", p1, p2) - } - } -} - -func TestPolyPackT0(t *testing.T) { - var p, p0, p1, p2 common.Poly - var seed [32]byte - var buf [common.PolyT0Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniform(&p, &seed, i) - p.Normalize() - p.Power2Round(&p0, &p1) - - p0.PackT0(buf[:]) - p2.UnpackT0(buf[:]) - if p0 != p2 { - t.Fatalf("%v !=\n%v", p0, p2) - } - } -} - -func BenchmarkUnpackLeGamma1(b *testing.B) { - var p common.Poly - var buf [PolyLeGamma1Size]byte - for i := 0; i < b.N; i++ { - PolyUnpackLeGamma1(&p, buf[:]) - } -} - -func TestPolyPackLeGamma1(t *testing.T) { - var p0, p1 common.Poly - var seed [64]byte - var buf [PolyLeGamma1Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniformLeGamma1(&p0, &seed, i) - p0.Normalize() - - PolyPackLeGamma1(&p0, buf[:]) - PolyUnpackLeGamma1(&p1, buf[:]) - if p0 != p1 { - t.Fatalf("%v != %v", p0, p1) - } - } -} diff --git a/sign/dilithium/mode3aes/internal/params.go b/sign/dilithium/mode3aes/internal/params.go deleted file mode 100644 index 425cea3b3..000000000 --- a/sign/dilithium/mode3aes/internal/params.go +++ /dev/null @@ -1,19 +0,0 @@ -// Code generated from params.templ.go. DO NOT EDIT. - -package internal - -const ( - Name = "Dilithium3-AES" - UseAES = true - K = 6 - L = 5 - Eta = 4 - DoubleEtaBits = 4 - Omega = 55 - Tau = 49 - Gamma1Bits = 19 - Gamma2 = 261888 - NIST = false - TRSize = 32 - CTildeSize = 32 -) diff --git a/sign/dilithium/mode3aes/internal/params_test.go b/sign/dilithium/mode3aes/internal/params_test.go deleted file mode 100644 index 8e71ef60d..000000000 --- a/sign/dilithium/mode3aes/internal/params_test.go +++ /dev/null @@ -1,101 +0,0 @@ -package internal - -import ( - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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/rounding.go b/sign/dilithium/mode3aes/internal/rounding.go deleted file mode 100644 index 58123c090..000000000 --- a/sign/dilithium/mode3aes/internal/rounding.go +++ /dev/null @@ -1,142 +0,0 @@ -// Code generated from mode3/internal/rounding.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, -// except for when we would have a₁ = (q-1)/α in which case a₁=0 is taken -// and -α/2 ≤ a₀ < 0. Returns a₀ + q. Note 0 ≤ a₁ < (q-1)/α. -// Recall α = 2γ₂. -func decompose(a uint32) (a0plusQ, a1 uint32) { - // a₁ = ⌈a / 128⌉ - a1 = (a + 127) >> 7 - - if Alpha == 523776 { - // 1025/2²² is close enough to 1/4092 so that a₁ - // becomes a/α rounded down. - a1 = ((a1*1025 + (1 << 21)) >> 22) - - // For the corner-case a₁ = (q-1)/α = 16, we have to set a₁=0. - a1 &= 15 - } else if Alpha == 190464 { - // 1488/2²⁴ is close enough to 1/1488 so that a₁ - // becomes a/α rounded down. - a1 = ((a1 * 11275) + (1 << 23)) >> 24 - - // For the corner-case a₁ = (q-1)/α = 44, we have to set a₁=0. - a1 ^= uint32(int32(43-a1)>>31) & a1 - } else { - panic("unsupported α") - } - - a0plusQ = a - a1*Alpha - - // In the corner-case, when we set a₁=0, we will incorrectly - // have a₀ > (q-1)/2 and we'll need to subtract q. As we - // return a₀ + q, that comes down to adding q if a₀ < (q-1)/2. - a0plusQ += uint32(int32(a0plusQ-(common.Q-1)/2)>>31) & common.Q - - return -} - -// Assume 0 ≤ r, f < Q with ‖f‖_∞ ≤ α/2. Decompose r as r = r1*α + r0 as -// computed by decompose(). Write r' := r - f (mod Q). Now, decompose -// r'=r-f again as r' = r'1*α + r'0 using decompose(). As f is small, we -// have r'1 = r1 + h, where h ∈ {-1, 0, 1}. makeHint() computes |h| -// given z0 := r0 - f (mod Q) and r1. With |h|, which is called the hint, -// we can reconstruct r1 using only r' = r - f, which is done by useHint(). -// To wit: -// -// useHint( r - f, makeHint( r0 - f, r1 ) ) = r1. -// -// Assumes 0 ≤ z0 < Q. -func makeHint(z0, r1 uint32) uint32 { - // If -α/2 < r0 - f ≤ α/2, then r1*α + r0 - f is a valid decomposition of r' - // with the restrictions of decompose() and so r'1 = r1. So the hint - // should be 0. This is covered by the first two inequalities. - // There is one other case: if r0 - f = -α/2, then r1*α + r0 - f is also - // a valid decomposition if r1 = 0. In the other cases a one is carried - // and the hint should be 1. - if z0 <= Gamma2 || z0 > common.Q-Gamma2 || (z0 == common.Q-Gamma2 && r1 == 0) { - return 0 - } - return 1 -} - -// Uses the hint created by makeHint() to reconstruct r1 from r'=r-f; see -// documentation of makeHint() for context. -// Assumes 0 ≤ r' < Q. -func useHint(rp uint32, hint uint32) uint32 { - rp0plusQ, rp1 := decompose(rp) - if hint == 0 { - return rp1 - } - if rp0plusQ > common.Q { - return (rp1 + 1) & 15 - } - return (rp1 - 1) & 15 -} - -// Sets p to the hint polynomial for p0 the modified low bits and p1 -// the unmodified high bits --- see makeHint(). -// -// Returns the number of ones in the hint polynomial. -func PolyMakeHint(p, p0, p1 *common.Poly) (pop uint32) { - for i := 0; i < common.N; i++ { - h := makeHint(p0[i], p1[i]) - pop += h - p[i] = h - } - return -} - -// Computes corrections to the high bits of the polynomial q according -// to the hints in h and sets p to the corrected high bits. Returns p. -func PolyUseHint(p, q, hint *common.Poly) { - var q0PlusQ common.Poly - - // See useHint() and makeHint() for an explanation. We reimplement it - // here so that we can call Poly.Decompose(), which might be way faster - // than calling decompose() in a loop (for instance when having AVX2.) - - PolyDecompose(q, &q0PlusQ, p) - - for i := 0; i < common.N; i++ { - if hint[i] == 0 { - continue - } - if Gamma2 == 261888 { - if q0PlusQ[i] > common.Q { - p[i] = (p[i] + 1) & 15 - } else { - p[i] = (p[i] - 1) & 15 - } - } else if Gamma2 == 95232 { - if q0PlusQ[i] > common.Q { - if p[i] == 43 { - p[i] = 0 - } else { - p[i]++ - } - } else { - if p[i] == 0 { - p[i] = 43 - } else { - p[i]-- - } - } - } else { - panic("unsupported γ₂") - } - } -} - -// Splits each of the coefficients of p using decompose. -func PolyDecompose(p, p0PlusQ, p1 *common.Poly) { - for i := 0; i < common.N; i++ { - p0PlusQ[i], p1[i] = decompose(p[i]) - } -} diff --git a/sign/dilithium/mode3aes/internal/rounding_test.go b/sign/dilithium/mode3aes/internal/rounding_test.go deleted file mode 100644 index ad653ca3f..000000000 --- a/sign/dilithium/mode3aes/internal/rounding_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Code generated from mode3/internal/rounding_test.go by gen.go - -package internal - -import ( - "flag" - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") - -func TestDecompose(t *testing.T) { - for a := uint32(0); a < common.Q; a++ { - a0PlusQ, a1 := decompose(a) - a0 := int32(a0PlusQ) - int32(common.Q) - recombined := a0 + int32(Alpha*a1) - if a1 == 0 && recombined < 0 { - recombined += common.Q - if -(Alpha/2) > a0 || a0 >= 0 { - t.Fatalf("decompose(%v): a0 out of bounds", a) - } - } else { - if (-(Alpha / 2) >= a0) || (a0 > Alpha/2) { - t.Fatalf("decompose(%v): a0 out of bounds", a) - } - } - if int32(a) != recombined { - t.Fatalf("decompose(%v) doesn't recombine %v %v", a, a0, a1) - } - } -} - -func TestMakeHint(t *testing.T) { - if !*runVeryLongTest { - t.SkipNow() - } - for w := uint32(0); w < common.Q; w++ { - w0, w1 := decompose(w) - for fn := uint32(0); fn <= Gamma2; fn++ { - fsign := false - for { - var f uint32 - if fsign { - if fn == 0 { - break - } - f = common.Q - fn - } else { - f = fn - } - - hint := makeHint(common.ReduceLe2Q(w0+common.Q-f), w1) - w1p := useHint(common.ReduceLe2Q(w+common.Q-f), hint) - if w1p != w1 { - t.Fatal() - } - - if fsign { - break - } - fsign = true - } - } - } -} - -func BenchmarkDecompose(b *testing.B) { - var p, p0, p1 common.Poly - for i := 0; i < b.N; i++ { - PolyDecompose(&p, &p0, &p1) - } -} - -func BenchmarkMakeHint(b *testing.B) { - var p, p0, p1 common.Poly - for i := 0; i < b.N; i++ { - PolyMakeHint(&p, &p0, &p1) - } -} diff --git a/sign/dilithium/mode3aes/internal/sample.go b/sign/dilithium/mode3aes/internal/sample.go deleted file mode 100644 index 62c261332..000000000 --- a/sign/dilithium/mode3aes/internal/sample.go +++ /dev/null @@ -1,370 +0,0 @@ -// Code generated from mode3/internal/sample.go by gen.go - -package internal - -import ( - "encoding/binary" - - "github.com/cloudflare/circl/internal/sha3" - 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 - -// 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. -// -// Can only be called when DeriveX4Available is true. -func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { - var perm keccakf1600.StateX4 - state := perm.Initialize(false) - - // Absorb the seed in the four states - for i := 0; i < 4; i++ { - v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) - for j := 0; j < 4; j++ { - state[i*4+j] = v - } - } - - // Absorb the nonces, the SHAKE128 domain separator (0b1111), the - // start of the padding (0b...001) and the end of the padding 0b100... - // Recall that the rate of SHAKE128 is 168 --- i.e. 21 uint64s. - for j := 0; j < 4; j++ { - state[4*4+j] = uint64(nonces[j]) | (0x1f << 16) - state[20*4+j] = 0x80 << 56 - } - - var idx [4]int // indices into ps - for j := 0; j < 4; j++ { - if ps[j] == nil { - idx[j] = common.N // mark nil polynomial as completed - } - } - - done := false - for !done { - // Applies KeccaK-f[1600] to state to get the next 21 uint64s of each - // of the four SHAKE128 streams. - perm.Permute() - - done = true - - PolyLoop: - for j := 0; j < 4; j++ { - if idx[j] == common.N { - continue - } - for i := 0; i < 7; i++ { - var t [8]uint32 - t[0] = uint32(state[i*3*4+j] & 0x7fffff) - t[1] = uint32((state[i*3*4+j] >> 24) & 0x7fffff) - t[2] = uint32((state[i*3*4+j] >> 48) | - ((state[(i*3+1)*4+j] & 0x7f) << 16)) - t[3] = uint32((state[(i*3+1)*4+j] >> 8) & 0x7fffff) - t[4] = uint32((state[(i*3+1)*4+j] >> 32) & 0x7fffff) - t[5] = uint32((state[(i*3+1)*4+j] >> 56) | - ((state[(i*3+2)*4+j] & 0x7fff) << 8)) - t[6] = uint32((state[(i*3+2)*4+j] >> 16) & 0x7fffff) - t[7] = uint32((state[(i*3+2)*4+j] >> 40) & 0x7fffff) - - for k := 0; k < 8; k++ { - if t[k] < common.Q { - ps[j][idx[j]] = t[k] - idx[j]++ - if idx[j] == common.N { - continue PolyLoop - } - } - } - } - done = false - } - } -} - -// Sample p uniformly from the given seed and nonce. -// -// 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 - - if UseAES { - length = 12 * 16 - } else { - length = 168 - } - - sample := func() { - // Note that 3 divides into 168 and 12*16, so we use up buf completely. - for j := 0; j < length && i < common.N; j += 3 { - t := (uint32(buf[j]) | (uint32(buf[j+1]) << 8) | - (uint32(buf[j+2]) << 16)) & 0x7fffff - - // We use rejection sampling - if t < common.Q { - p[i] = t - i++ - } - } - } - - if UseAES { - h := common.NewAesStream128(seed, nonce) - - 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() - } - } -} - -// Sample p uniformly with coefficients of norm less than or equal η, -// using the given seed and nonce. -// -// p will not be normalized, but will have coefficients in [q-η,q+η]. -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 - - if UseAES { - length = 9 * 16 - } else { - length = 136 - } - - sample := func() { - // We use rejection sampling - for j := 0; j < length && i < common.N; j++ { - t1 := uint32(buf[j]) & 15 - t2 := uint32(buf[j]) >> 4 - if Eta == 2 { // branch is eliminated by compiler - if t1 <= 14 { - t1 -= ((205 * t1) >> 10) * 5 // reduce mod 5 - p[i] = common.Q + Eta - t1 - i++ - } - if t2 <= 14 && i < common.N { - t2 -= ((205 * t2) >> 10) * 5 // reduce mod 5 - p[i] = common.Q + Eta - t2 - i++ - } - } else if Eta == 4 { - if t1 <= 2*Eta { - p[i] = common.Q + Eta - t1 - i++ - } - if t2 <= 2*Eta && i < common.N { - p[i] = common.Q + Eta - t2 - i++ - } - } else { - panic("unsupported η") - } - } - } - - 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 - - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } - } -} - -// Sample v[i] uniformly with coefficients in (-γ₁,…,γ₁] using the -// given seed and nonce+i -// -// p will be normalized. -func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { - for i := 0; i < L; i++ { - PolyDeriveUniformLeGamma1(&v[i], seed, nonce+uint16(i)) - } -} - -// Sample p uniformly with coefficients in (-γ₁,…,γK1s] using the -// given seed and nonce. -// -// p will be normalized. -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[:]) - } - - PolyUnpackLeGamma1(p, buf[:]) -} - -// For each i, sample ps[i] uniformly with τ non-zero coefficients in {q-1,1} -// using the given seed and w1[i]. ps[i] may be nil and is ignored -// in that case. ps[i] will be normalized. -// -// Can only be called when DeriveX4Available is true. -// -// This function is currently not used (yet). -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 < 32/8; i++ { - v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) - for j := 0; j < 4; j++ { - state[i*4+j] = v - } - } - - // SHAKE256 domain separator and padding - for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f - state[16*4+j] ^= 0x80 << 56 - } - perm.Permute() - - var signs [4]uint64 - var idx [4]uint16 // indices into ps - - for j := 0; j < 4; j++ { - if ps[j] != nil { - signs[j] = state[j] - *ps[j] = common.Poly{} // zero ps[j] - idx[j] = common.N - Tau - } else { - idx[j] = common.N // mark as completed - } - } - - stateOffset := 1 - for { - done := true - - PolyLoop: - for j := 0; j < 4; j++ { - if idx[j] == common.N { - continue - } - - for i := stateOffset; i < 17; i++ { - var bs [8]byte - binary.LittleEndian.PutUint64(bs[:], state[4*i+j]) - for k := 0; k < 8; k++ { - b := uint16(bs[k]) - - if b > idx[j] { - continue - } - - ps[j][idx[j]] = ps[j][b] - ps[j][b] = 1 - // Takes least significant bit of signs and uses it for the sign. - // Note 1 ^ (1 | (Q-1)) = Q-1. - ps[j][b] ^= uint32((-(signs[j] & 1)) & (1 | (common.Q - 1))) - signs[j] >>= 1 - - idx[j]++ - if idx[j] == common.N { - continue PolyLoop - } - } - } - - done = false - } - - if done { - break - } - - perm.Permute() - stateOffset = 0 - } -} - -// Samples p uniformly with τ non-zero coefficients in {q-1,1}. -// -// The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed []byte) { - var buf [136]byte // SHAKE-256 rate is 136 - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - _, _ = h.Read(buf[:]) - - // Essentially we generate a sequence of τ ones or minus ones, - // prepend 196 zeroes and shuffle the concatenation using the - // usual algorithm (Fisher--Yates.) - signs := binary.LittleEndian.Uint64(buf[:]) - bufOff := 8 // offset into buf - - *p = common.Poly{} // zero p - for i := uint16(common.N - Tau); i < common.N; i++ { - var b uint16 - - // Find location of where to move the new coefficient to using - // rejection sampling. - for { - if bufOff >= 136 { - _, _ = h.Read(buf[:]) - bufOff = 0 - } - - b = uint16(buf[bufOff]) - bufOff++ - - if b <= i { - break - } - } - - p[i] = p[b] - p[b] = 1 - // Takes least significant bit of signs and uses it for the sign. - // Note 1 ^ (1 | (Q-1)) = Q-1. - p[b] ^= uint32((-(signs & 1)) & (1 | (common.Q - 1))) - signs >>= 1 - } -} diff --git a/sign/dilithium/mode3aes/internal/sample_test.go b/sign/dilithium/mode3aes/internal/sample_test.go deleted file mode 100644 index 2059599eb..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" - - 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, - } - } - 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/mode3aes/internal/vec.go b/sign/dilithium/mode3aes/internal/vec.go deleted file mode 100644 index d07d3b245..000000000 --- a/sign/dilithium/mode3aes/internal/vec.go +++ /dev/null @@ -1,281 +0,0 @@ -// Code generated from mode3/internal/vec.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// A vector of L polynomials. -type VecL [L]common.Poly - -// A vector of K polynomials. -type VecK [K]common.Poly - -// Normalize the polynomials in this vector. -func (v *VecL) Normalize() { - for i := 0; i < L; i++ { - v[i].Normalize() - } -} - -// Normalize the polynomials in this vector assuming their coefficients -// are already bounded by 2q. -func (v *VecL) NormalizeAssumingLe2Q() { - for i := 0; i < L; i++ { - v[i].NormalizeAssumingLe2Q() - } -} - -// Sets v to w + u. Does not normalize. -func (v *VecL) Add(w, u *VecL) { - for i := 0; i < L; i++ { - v[i].Add(&w[i], &u[i]) - } -} - -// Applies NTT componentwise. See Poly.NTT() for details. -func (v *VecL) NTT() { - for i := 0; i < L; i++ { - v[i].NTT() - } -} - -// Checks whether any of the coefficients exceeds the given bound in supnorm -// -// Requires the vector to be normalized. -func (v *VecL) Exceeds(bound uint32) bool { - for i := 0; i < L; i++ { - if v[i].Exceeds(bound) { - return true - } - } - return false -} - -// Applies Poly.Power2Round componentwise. -// -// Requires the vector to be normalized. -func (v *VecL) Power2Round(v0PlusQ, v1 *VecL) { - for i := 0; i < L; i++ { - v[i].Power2Round(&v0PlusQ[i], &v1[i]) - } -} - -// Applies Poly.Decompose componentwise. -// -// Requires the vector to be normalized. -func (v *VecL) Decompose(v0PlusQ, v1 *VecL) { - for i := 0; i < L; i++ { - PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) - } -} - -// Sequentially packs each polynomial using Poly.PackLeqEta(). -func (v *VecL) PackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyPackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sets v to the polynomials packed in buf using VecL.PackLeqEta(). -func (v *VecL) UnpackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyUnpackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sequentially packs each polynomial using PolyPackLeGamma1(). -func (v *VecL) PackLeGamma1(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyPackLeGamma1(&v[i], buf[offset:]) - offset += PolyLeGamma1Size - } -} - -// Sets v to the polynomials packed in buf using VecL.PackLeGamma1(). -func (v *VecL) UnpackLeGamma1(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyUnpackLeGamma1(&v[i], buf[offset:]) - offset += PolyLeGamma1Size - } -} - -// Normalize the polynomials in this vector. -func (v *VecK) Normalize() { - for i := 0; i < K; i++ { - v[i].Normalize() - } -} - -// Normalize the polynomials in this vector assuming their coefficients -// are already bounded by 2q. -func (v *VecK) NormalizeAssumingLe2Q() { - for i := 0; i < K; i++ { - v[i].NormalizeAssumingLe2Q() - } -} - -// Sets v to w + u. Does not normalize. -func (v *VecK) Add(w, u *VecK) { - for i := 0; i < K; i++ { - v[i].Add(&w[i], &u[i]) - } -} - -// Checks whether any of the coefficients exceeds the given bound in supnorm -// -// Requires the vector to be normalized. -func (v *VecK) Exceeds(bound uint32) bool { - for i := 0; i < K; i++ { - if v[i].Exceeds(bound) { - return true - } - } - return false -} - -// Applies Poly.Power2Round componentwise. -// -// Requires the vector to be normalized. -func (v *VecK) Power2Round(v0PlusQ, v1 *VecK) { - for i := 0; i < K; i++ { - v[i].Power2Round(&v0PlusQ[i], &v1[i]) - } -} - -// Applies Poly.Decompose componentwise. -// -// Requires the vector to be normalized. -func (v *VecK) Decompose(v0PlusQ, v1 *VecK) { - for i := 0; i < K; i++ { - PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) - } -} - -// Sets v to the hint vector for v0 the modified low bits and v1 -// the unmodified high bits --- see makeHint(). -// -// Returns the number of ones in the hint vector. -func (v *VecK) MakeHint(v0, v1 *VecK) (pop uint32) { - for i := 0; i < K; i++ { - pop += PolyMakeHint(&v[i], &v0[i], &v1[i]) - } - return -} - -// Computes corrections to the high bits of the polynomials in the vector -// w using the hints in h and sets v to the corrected high bits. Returns v. -// See useHint(). -func (v *VecK) UseHint(q, hint *VecK) *VecK { - for i := 0; i < K; i++ { - PolyUseHint(&v[i], &q[i], &hint[i]) - } - return v -} - -// Sequentially packs each polynomial using Poly.PackT1(). -func (v *VecK) PackT1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].PackT1(buf[offset:]) - offset += common.PolyT1Size - } -} - -// Sets v to the vector packed into buf by PackT1(). -func (v *VecK) UnpackT1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].UnpackT1(buf[offset:]) - offset += common.PolyT1Size - } -} - -// Sequentially packs each polynomial using Poly.PackT0(). -func (v *VecK) PackT0(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].PackT0(buf[offset:]) - offset += common.PolyT0Size - } -} - -// Sets v to the vector packed into buf by PackT0(). -func (v *VecK) UnpackT0(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].UnpackT0(buf[offset:]) - offset += common.PolyT0Size - } -} - -// Sequentially packs each polynomial using Poly.PackLeqEta(). -func (v *VecK) PackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyPackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sets v to the polynomials packed in buf using VecK.PackLeqEta(). -func (v *VecK) UnpackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyUnpackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Applies NTT componentwise. See Poly.NTT() for details. -func (v *VecK) NTT() { - for i := 0; i < K; i++ { - v[i].NTT() - } -} - -// Sequentially packs each polynomial using PolyPackW1(). -func (v *VecK) PackW1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyPackW1(&v[i], buf[offset:]) - offset += PolyW1Size - } -} - -// Sets v to a - b. -// -// Warning: assumes coefficients of the polynomials of b are less than 2q. -func (v *VecK) Sub(a, b *VecK) { - for i := 0; i < K; i++ { - v[i].Sub(&a[i], &b[i]) - } -} - -// Sets v to 2ᵈ w without reducing. -func (v *VecK) MulBy2toD(w *VecK) { - for i := 0; i < K; i++ { - v[i].MulBy2toD(&w[i]) - } -} - -// Applies InvNTT componentwise. See Poly.InvNTT() for details. -func (v *VecK) InvNTT() { - for i := 0; i < K; i++ { - v[i].InvNTT() - } -} - -// Applies Poly.ReduceLe2Q() componentwise. -func (v *VecK) ReduceLe2Q() { - for i := 0; i < K; i++ { - v[i].ReduceLe2Q() - } -} diff --git a/sign/dilithium/mode5.go b/sign/dilithium/mode5.go deleted file mode 100644 index 2e282fe8f..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/mode5" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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 private 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 7271ad17d..ce3ec7546 100644 --- a/sign/dilithium/mode5/dilithium.go +++ b/sign/dilithium/mode5/dilithium.go @@ -1,11 +1,9 @@ -// 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 // // https://pq-crystals.org/dilithium/data/dilithium-specification-round3-20210208.pdf - package mode5 import ( @@ -13,10 +11,9 @@ import ( "errors" "io" - common "github.com/cloudflare/circl/sign/internal/dilithium" - + "github.com/cloudflare/circl/sign" "github.com/cloudflare/circl/sign/dilithium/mode5/internal" - + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -54,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, ) } @@ -147,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. @@ -183,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 7869d0475..609ab3a4c 100644 --- a/sign/dilithium/mode5/internal/dilithium.go +++ b/sign/dilithium/mode5/internal/dilithium.go @@ -244,7 +244,10 @@ 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 @@ -262,7 +265,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 +282,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[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +310,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,16 +330,14 @@ 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 { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) + _, _ = h.Write(rnd[:]) } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -373,7 +377,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, sig.c[:32]) + 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 825e7da08..47f53d3a0 100644 --- a/sign/dilithium/mode5/internal/dilithium_test.go +++ b/sign/dilithium/mode5/internal/dilithium_test.go @@ -4,6 +4,7 @@ package internal import ( "encoding/binary" + "io" "testing" common "github.com/cloudflare/circl/sign/internal/dilithium" @@ -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/params.go b/sign/dilithium/mode5/internal/params.go index e8a2b143e..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 diff --git a/sign/dilithium/mode5/internal/sample.go b/sign/dilithium/mode5/internal/sample.go index 62c261332..b37370a4e 100644 --- a/sign/dilithium/mode5/internal/sample.go +++ b/sign/dilithium/mode5/internal/sample.go @@ -12,7 +12,7 @@ import ( // 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[:]) } @@ -251,7 +220,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 32/8; 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 []byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() diff --git a/sign/dilithium/mode5/internal/sample_test.go b/sign/dilithium/mode5/internal/sample_test.go index 2059599eb..32931c94f 100644 --- a/sign/dilithium/mode5/internal/sample_test.go +++ b/sign/dilithium/mode5/internal/sample_test.go @@ -12,94 +12,46 @@ import ( 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,7 +104,7 @@ 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[:]) @@ -200,7 +152,7 @@ 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[:], diff --git a/sign/dilithium/mode5aes.go b/sign/dilithium/mode5aes.go deleted file mode 100644 index b7f1cb485..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/mode5aes" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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 private 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 c0300f2e6..000000000 --- a/sign/dilithium/mode5aes/dilithium.go +++ /dev/null @@ -1,185 +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" - - common "github.com/cloudflare/circl/sign/internal/dilithium" - - "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/dilithium.go b/sign/dilithium/mode5aes/internal/dilithium.go deleted file mode 100644 index 7869d0475..000000000 --- a/sign/dilithium/mode5aes/internal/dilithium.go +++ /dev/null @@ -1,482 +0,0 @@ -// Code generated from mode3/internal/dilithium.go by gen.go - -package internal - -import ( - cryptoRand "crypto/rand" - "crypto/subtle" - "io" - - "github.com/cloudflare/circl/internal/sha3" - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -const ( - // Size of a packed polynomial of norm ≤η. - // (Note that the formula is not valid in general.) - PolyLeqEtaSize = (common.N * DoubleEtaBits) / 8 - - // β = τη, the maximum size of c s₂. - Beta = Tau * Eta - - // γ₁ range of y - Gamma1 = 1 << Gamma1Bits - - // Size of packed polynomial of norm <γ₁ such as z - PolyLeGamma1Size = (Gamma1Bits + 1) * common.N / 8 - - // α = 2γ₂ parameter for decompose - Alpha = 2 * Gamma2 - - // Size of a packed private key - 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 + CTildeSize - - // Size of packed w₁ - PolyW1Size = (common.N * (common.QBits - Gamma1Bits)) / 8 -) - -// PublicKey is the type of Dilithium public keys. -type PublicKey struct { - rho [32]byte - t1 VecK - - // Cached values - t1p [common.PolyT1Size * K]byte - A *Mat - tr *[TRSize]byte -} - -// PrivateKey is the type of Dilithium private keys. -type PrivateKey struct { - rho [32]byte - key [32]byte - s1 VecL - s2 VecK - t0 VecK - tr [TRSize]byte - - // Cached values - A Mat // ExpandA(ρ) - s1h VecL // NTT(s₁) - s2h VecK // NTT(s₂) - t0h VecK // NTT(t₀) -} - -type unpackedSignature struct { - z VecL - hint VecK - c [CTildeSize]byte -} - -// Packs the signature into buf. -func (sig *unpackedSignature) Pack(buf []byte) { - copy(buf[:], sig.c[:]) - sig.z.PackLeGamma1(buf[CTildeSize:]) - sig.hint.PackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) -} - -// Sets sig to the signature encoded in the buffer. -// -// Returns whether buf contains a properly packed signature. -func (sig *unpackedSignature) Unpack(buf []byte) bool { - if len(buf) < SignatureSize { - return false - } - copy(sig.c[:], buf[:]) - sig.z.UnpackLeGamma1(buf[CTildeSize:]) - if sig.z.Exceeds(Gamma1 - Beta) { - return false - } - if !sig.hint.UnpackHint(buf[CTildeSize+L*PolyLeGamma1Size:]) { - return false - } - return true -} - -// Packs the public key into buf. -func (pk *PublicKey) Pack(buf *[PublicKeySize]byte) { - copy(buf[:32], pk.rho[:]) - copy(buf[32:], pk.t1p[:]) -} - -// Sets pk to the public key encoded in buf. -func (pk *PublicKey) Unpack(buf *[PublicKeySize]byte) { - copy(pk.rho[:], buf[:32]) - copy(pk.t1p[:], buf[32:]) - - pk.t1.UnpackT1(pk.t1p[:]) - pk.A = new(Mat) - pk.A.Derive(&pk.rho) - - // tr = CRH(ρ ‖ t1) = CRH(pk) - pk.tr = new([TRSize]byte) - h := sha3.NewShake256() - _, _ = h.Write(buf[:]) - _, _ = h.Read(pk.tr[:]) -} - -// Packs the private key into buf. -func (sk *PrivateKey) Pack(buf *[PrivateKeySize]byte) { - copy(buf[:32], sk.rho[:]) - copy(buf[32:64], sk.key[:]) - copy(buf[64:64+TRSize], sk.tr[:]) - offset := 64 + TRSize - sk.s1.PackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * L - sk.s2.PackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * K - sk.t0.PackT0(buf[offset:]) -} - -// Sets sk to the private key encoded in buf. -func (sk *PrivateKey) Unpack(buf *[PrivateKeySize]byte) { - copy(sk.rho[:], buf[:32]) - copy(sk.key[:], buf[32:64]) - copy(sk.tr[:], buf[64:64+TRSize]) - offset := 64 + TRSize - sk.s1.UnpackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * L - sk.s2.UnpackLeqEta(buf[offset:]) - offset += PolyLeqEtaSize * K - sk.t0.UnpackT0(buf[offset:]) - - // Cached values - sk.A.Derive(&sk.rho) - sk.t0h = sk.t0 - sk.t0h.NTT() - sk.s1h = sk.s1 - sk.s1h.NTT() - sk.s2h = sk.s2 - sk.s2h.NTT() -} - -// 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) { - var seed [32]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 -} - -// NewKeyFromSeed derives a public/private key pair using the given seed. -func NewKeyFromSeed(seed *[common.SeedSize]byte) (*PublicKey, *PrivateKey) { - var eSeed [128]byte // expanded seed - var pk PublicKey - var sk PrivateKey - var sSeed [64]byte - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - _, _ = h.Read(eSeed[:]) - - copy(pk.rho[:], eSeed[:32]) - copy(sSeed[:], eSeed[32:96]) - copy(sk.key[:], eSeed[96:]) - copy(sk.rho[:], pk.rho[:]) - - sk.A.Derive(&pk.rho) - - for i := uint16(0); i < L; i++ { - PolyDeriveUniformLeqEta(&sk.s1[i], &sSeed, i) - } - - for i := uint16(0); i < K; i++ { - PolyDeriveUniformLeqEta(&sk.s2[i], &sSeed, i+L) - } - - sk.s1h = sk.s1 - sk.s1h.NTT() - sk.s2h = sk.s2 - sk.s2h.NTT() - - sk.computeT0andT1(&sk.t0, &pk.t1) - - sk.t0h = sk.t0 - sk.t0h.NTT() - - // Complete public key far enough to be packed - pk.t1.PackT1(pk.t1p[:]) - pk.A = &sk.A - - // Finish private key - var packedPk [PublicKeySize]byte - pk.Pack(&packedPk) - - // tr = CRH(ρ ‖ t1) = CRH(pk) - h.Reset() - _, _ = h.Write(packedPk[:]) - _, _ = h.Read(sk.tr[:]) - - // Finish cache of public key - pk.tr = &sk.tr - - return &pk, &sk -} - -// Computes t0 and t1 from sk.s1h, sk.s2 and sk.A. -func (sk *PrivateKey) computeT0andT1(t0, t1 *VecK) { - var t VecK - - // Set t to A s₁ + s₂ - for i := 0; i < K; i++ { - PolyDotHat(&t[i], &sk.A[i], &sk.s1h) - t[i].ReduceLe2Q() - t[i].InvNTT() - } - t.Add(&t, &sk.s2) - t.Normalize() - - // Compute t₀, t₁ = Power2Round(t) - t.Power2Round(t0, t1) -} - -// Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { - var sig unpackedSignature - var mu [64]byte - var zh VecL - var Az, Az2dct1, w1 VecK - var ch common.Poly - var cp [CTildeSize]byte - var w1Packed [PolyW1Size * K]byte - - // Note that Unpack() checked whether ‖z‖_∞ < γ₁ - β - // and ensured that there at most ω ones in pk.hint. - if !sig.Unpack(signature) { - return false - } - - // μ = CRH(tr ‖ msg) - h := sha3.NewShake256() - _, _ = h.Write(pk.tr[:]) - _, _ = h.Write(msg) - _, _ = h.Read(mu[:]) - - // Compute Az - zh = sig.z - zh.NTT() - - for i := 0; i < K; i++ { - PolyDotHat(&Az[i], &pk.A[i], &zh) - } - - // Next, we compute Az - 2ᵈ·c·t₁. - // Note that the coefficients of t₁ are bounded by 256 = 2⁹, - // so the coefficients of Az2dct1 will bounded by 2⁹⁺ᵈ = 2²³ < 2q, - // which is small enough for NTT(). - Az2dct1.MulBy2toD(&pk.t1) - Az2dct1.NTT() - PolyDeriveUniformBall(&ch, sig.c[:32]) - ch.NTT() - for i := 0; i < K; i++ { - Az2dct1[i].MulHat(&Az2dct1[i], &ch) - } - Az2dct1.Sub(&Az, &Az2dct1) - Az2dct1.ReduceLe2Q() - Az2dct1.InvNTT() - Az2dct1.NormalizeAssumingLe2Q() - - // UseHint(pk.hint, Az - 2ᵈ·c·t₁) - // = UseHint(pk.hint, w - c·s₂ + c·t₀) - // = UseHint(pk.hint, r + c·t₀) - // = r₁ = w₁. - w1.UseHint(&Az2dct1, &sig.hint) - w1.PackW1(w1Packed[:]) - - // c' = H(μ, w₁) - h.Reset() - _, _ = h.Write(mu[:]) - _, _ = h.Write(w1Packed[:]) - _, _ = h.Read(cp[:]) - - return sig.c == cp -} - -// SignTo signs the given message and writes the signature into signature. -// -//nolint:funlen -func SignTo(sk *PrivateKey, msg []byte, signature []byte) { - var mu, rhop [64]byte - var w1Packed [PolyW1Size * K]byte - var y, yh VecL - var w, w0, w1, w0mcs2, ct0, w0mcs2pct0 VecK - var ch common.Poly - var yNonce uint16 - var sig unpackedSignature - - if len(signature) < SignatureSize { - panic("Signature does not fit in that byteslice") - } - - // μ = CRH(tr ‖ msg) - h := sha3.NewShake256() - _, _ = h.Write(sk.tr[:]) - _, _ = h.Write(msg) - _, _ = h.Read(mu[:]) - - // ρ' = CRH(key ‖ μ) - h.Reset() - _, _ = h.Write(sk.key[:]) - if NIST { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) - } - _, _ = h.Write(mu[:]) - _, _ = h.Read(rhop[:]) - - // Main rejection loop - attempt := 0 - for { - attempt++ - if attempt >= 576 { - // Depending on the mode, one try has a chance between 1/7 and 1/4 - // of succeeding. Thus it is safe to say that 576 iterations - // are enough as (6/7)⁵⁷⁶ < 2⁻¹²⁸. - panic("This should only happen 1 in 2^{128}: something is wrong.") - } - - // y = ExpandMask(ρ', key) - VecLDeriveUniformLeGamma1(&y, &rhop, yNonce) - yNonce += uint16(L) - - // Set w to A y - yh = y - yh.NTT() - for i := 0; i < K; i++ { - PolyDotHat(&w[i], &sk.A[i], &yh) - w[i].ReduceLe2Q() - w[i].InvNTT() - } - - // Decompose w into w₀ and w₁ - w.NormalizeAssumingLe2Q() - w.Decompose(&w0, &w1) - - // c~ = H(μ ‖ w₁) - w1.PackW1(w1Packed[:]) - h.Reset() - _, _ = h.Write(mu[:]) - _, _ = h.Write(w1Packed[:]) - _, _ = h.Read(sig.c[:]) - - PolyDeriveUniformBall(&ch, sig.c[:32]) - ch.NTT() - - // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. - // - // By Lemma 3 of the specification this is equivalent to checking that - // both ‖ r₀ ‖_∞ < γ₂ - β and r₁ = w₁, for the decomposition - // w - c·s₂ = r₁ α + r₀ as computed by decompose(). - // See also §4.1 of the specification. - for i := 0; i < K; i++ { - w0mcs2[i].MulHat(&ch, &sk.s2h[i]) - w0mcs2[i].InvNTT() - } - w0mcs2.Sub(&w0, &w0mcs2) - w0mcs2.Normalize() - - if w0mcs2.Exceeds(Gamma2 - Beta) { - continue - } - - // z = y + c·s₁ - for i := 0; i < L; i++ { - sig.z[i].MulHat(&ch, &sk.s1h[i]) - sig.z[i].InvNTT() - } - sig.z.Add(&sig.z, &y) - sig.z.Normalize() - - // Ensure ‖z‖_∞ < γ₁ - β - if sig.z.Exceeds(Gamma1 - Beta) { - continue - } - - // Compute c·t₀ - for i := 0; i < K; i++ { - ct0[i].MulHat(&ch, &sk.t0h[i]) - ct0[i].InvNTT() - } - ct0.NormalizeAssumingLe2Q() - - // Ensure ‖c·t₀‖_∞ < γ₂. - if ct0.Exceeds(Gamma2) { - continue - } - - // Create the hint to be able to reconstruct w₁ from w - c·s₂ + c·t0. - // Note that we're not using makeHint() in the obvious way as we - // do not know whether ‖ sc·s₂ - c·t₀ ‖_∞ < γ₂. Instead we note - // that our makeHint() is actually the same as a makeHint for a - // different decomposition: - // - // Earlier we ensured indirectly with a check that r₁ = w₁ where - // r = w - c·s₂. Hence r₀ = r - r₁ α = w - c·s₂ - w₁ α = w₀ - c·s₂. - // Thus MakeHint(w₀ - c·s₂ + c·t₀, w₁) = MakeHint(r0 + c·t₀, r₁) - // and UseHint(w - c·s₂ + c·t₀, w₁) = UseHint(r + c·t₀, r₁). - // As we just ensured that ‖ c·t₀ ‖_∞ < γ₂ our usage is correct. - w0mcs2pct0.Add(&w0mcs2, &ct0) - w0mcs2pct0.NormalizeAssumingLe2Q() - hintPop := sig.hint.MakeHint(&w0mcs2pct0, &w1) - if hintPop > Omega { - continue - } - - break - } - - sig.Pack(signature[:]) -} - -// Computes the public key corresponding to this private key. -func (sk *PrivateKey) Public() *PublicKey { - var t0 VecK - pk := &PublicKey{ - rho: sk.rho, - A: &sk.A, - tr: &sk.tr, - } - sk.computeT0andT1(&t0, &pk.t1) - pk.t1.PackT1(pk.t1p[:]) - return pk -} - -// Equal returns whether the two public keys are equal -func (pk *PublicKey) Equal(other *PublicKey) bool { - return pk.rho == other.rho && pk.t1 == other.t1 -} - -// Equal returns whether the two private keys are equal -func (sk *PrivateKey) Equal(other *PrivateKey) bool { - ret := (subtle.ConstantTimeCompare(sk.rho[:], other.rho[:]) & - subtle.ConstantTimeCompare(sk.key[:], other.key[:]) & - subtle.ConstantTimeCompare(sk.tr[:], other.tr[:])) - - acc := uint32(0) - for i := 0; i < L; i++ { - for j := 0; j < common.N; j++ { - acc |= sk.s1[i][j] ^ other.s1[i][j] - } - } - for i := 0; i < K; i++ { - for j := 0; j < common.N; j++ { - acc |= sk.s2[i][j] ^ other.s2[i][j] - acc |= sk.t0[i][j] ^ other.t0[i][j] - } - } - return (ret & subtle.ConstantTimeEq(int32(acc), 0)) == 1 -} diff --git a/sign/dilithium/mode5aes/internal/dilithium_test.go b/sign/dilithium/mode5aes/internal/dilithium_test.go deleted file mode 100644 index 825e7da08..000000000 --- a/sign/dilithium/mode5aes/internal/dilithium_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Code generated from mode3/internal/dilithium_test.go by gen.go - -package internal - -import ( - "encoding/binary" - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Checks whether p is normalized. Only used in tests. -func PolyNormalized(p *common.Poly) bool { - p2 := *p - p2.Normalize() - return p2 == *p -} - -func BenchmarkSkUnpack(b *testing.B) { - var buf [PrivateKeySize]byte - var sk PrivateKey - for i := 0; i < b.N; i++ { - sk.Unpack(&buf) - } -} - -func BenchmarkPkUnpack(b *testing.B) { - var buf [PublicKeySize]byte - var pk PublicKey - for i := 0; i < b.N; i++ { - pk.Unpack(&buf) - } -} - -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 - pk, sk := NewKeyFromSeed(&seed) - SignTo(sk, msg[:], 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[:]) - } -} - -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 - _, sk := NewKeyFromSeed(&seed) - b.ResetTimer() - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(msg[:], uint64(i)) - SignTo(sk, msg[:], sig[:]) - } -} - -func BenchmarkGenerateKey(b *testing.B) { - var seed [32]byte - for i := 0; i < b.N; i++ { - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - NewKeyFromSeed(&seed) - } -} - -func BenchmarkPublicFromPrivate(b *testing.B) { - var seed [32]byte - for i := 0; i < b.N; i++ { - b.StopTimer() - binary.LittleEndian.PutUint64(seed[:], uint64(i)) - _, sk := NewKeyFromSeed(&seed) - b.StartTimer() - sk.Public() - } -} - -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 - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := NewKeyFromSeed(&seed) - if !sk.Equal(sk) { - t.Fatal() - } - for j := uint64(0); j < 10; j++ { - binary.LittleEndian.PutUint64(msg[:], j) - SignTo(sk, msg[:], sig[:]) - if !Verify(pk, msg[:], sig[:]) { - t.Fatal() - } - } - pk.Pack(&pkb) - pk2.Unpack(&pkb) - if !pk.Equal(&pk2) { - t.Fatal() - } - sk.Pack(&skb) - sk2.Unpack(&skb) - if !sk.Equal(&sk2) { - t.Fatal() - } - } -} - -func TestPublicFromPrivate(t *testing.T) { - var seed [common.SeedSize]byte - for i := uint64(0); i < 100; i++ { - binary.LittleEndian.PutUint64(seed[:], i) - pk, sk := NewKeyFromSeed(&seed) - pk2 := sk.Public() - if !pk.Equal(pk2) { - t.Fatal() - } - } -} - -func TestGamma1Size(t *testing.T) { - var expected int - switch Gamma1Bits { - case 17: - expected = 576 - case 19: - expected = 640 - } - if expected != PolyLeGamma1Size { - t.Fatal() - } -} diff --git a/sign/dilithium/mode5aes/internal/mat.go b/sign/dilithium/mode5aes/internal/mat.go deleted file mode 100644 index ceaf634fa..000000000 --- a/sign/dilithium/mode5aes/internal/mat.go +++ /dev/null @@ -1,59 +0,0 @@ -// Code generated from mode3/internal/mat.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// A k by l matrix of polynomials. -type Mat [K]VecL - -// Expands the given seed to a complete matrix. -// -// This function is called ExpandA in the specification. -func (m *Mat) Derive(seed *[32]byte) { - if !DeriveX4Available { - for i := uint16(0); i < K; i++ { - for j := uint16(0); j < L; j++ { - PolyDeriveUniform(&m[i][j], seed, (i<<8)+j) - } - } - return - } - - idx := 0 - var nonces [4]uint16 - var ps [4]*common.Poly - for i := uint16(0); i < K; i++ { - for j := uint16(0); j < L; j++ { - nonces[idx] = (i << 8) + j - ps[idx] = &m[i][j] - idx++ - if idx == 4 { - idx = 0 - PolyDeriveUniformX4(ps, seed, nonces) - } - } - } - if idx != 0 { - for i := idx; i < 4; i++ { - ps[i] = nil - } - PolyDeriveUniformX4(ps, seed, nonces) - } -} - -// Set p to the inner product of a and b using pointwise multiplication. -// -// Assumes a and b are in Montgomery form and their coefficients are -// pairwise sufficiently small to multiply, see Poly.MulHat(). Resulting -// coefficients are bounded by 2Lq. -func PolyDotHat(p *common.Poly, a, b *VecL) { - var t common.Poly - *p = common.Poly{} // zero p - for i := 0; i < L; i++ { - t.MulHat(&a[i], &b[i]) - p.Add(&t, p) - } -} diff --git a/sign/dilithium/mode5aes/internal/pack.go b/sign/dilithium/mode5aes/internal/pack.go deleted file mode 100644 index 1854b4197..000000000 --- a/sign/dilithium/mode5aes/internal/pack.go +++ /dev/null @@ -1,270 +0,0 @@ -// Code generated from mode3/internal/pack.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Writes p with norm less than or equal η into buf, which must be of -// size PolyLeqEtaSize. -// -// Assumes coefficients of p are not normalized, but in [q-η,q+η]. -func PolyPackLeqEta(p *common.Poly, buf []byte) { - if DoubleEtaBits == 4 { // compiler eliminates branch - j := 0 - for i := 0; i < PolyLeqEtaSize; i++ { - buf[i] = (byte(common.Q+Eta-p[j]) | - byte(common.Q+Eta-p[j+1])<<4) - j += 2 - } - } else if DoubleEtaBits == 3 { - j := 0 - for i := 0; i < PolyLeqEtaSize; i += 3 { - buf[i] = (byte(common.Q+Eta-p[j]) | - (byte(common.Q+Eta-p[j+1]) << 3) | - (byte(common.Q+Eta-p[j+2]) << 6)) - buf[i+1] = ((byte(common.Q+Eta-p[j+2]) >> 2) | - (byte(common.Q+Eta-p[j+3]) << 1) | - (byte(common.Q+Eta-p[j+4]) << 4) | - (byte(common.Q+Eta-p[j+5]) << 7)) - buf[i+2] = ((byte(common.Q+Eta-p[j+5]) >> 1) | - (byte(common.Q+Eta-p[j+6]) << 2) | - (byte(common.Q+Eta-p[j+7]) << 5)) - j += 8 - } - } else { - panic("eta not supported") - } -} - -// Sets p to the polynomial of norm less than or equal η encoded in the -// given buffer of size PolyLeqEtaSize. -// -// Output coefficients of p are not normalized, but in [q-η,q+η] provided -// buf was created using PackLeqEta. -// -// Beware, for arbitrary buf the coefficients of p might end up in -// the interval [q-2^b,q+2^b] where b is the least b with η≤2^b. -func PolyUnpackLeqEta(p *common.Poly, buf []byte) { - if DoubleEtaBits == 4 { // compiler eliminates branch - j := 0 - for i := 0; i < PolyLeqEtaSize; i++ { - p[j] = common.Q + Eta - uint32(buf[i]&15) - p[j+1] = common.Q + Eta - uint32(buf[i]>>4) - j += 2 - } - } else if DoubleEtaBits == 3 { - j := 0 - for i := 0; i < PolyLeqEtaSize; i += 3 { - p[j] = common.Q + Eta - uint32(buf[i]&7) - p[j+1] = common.Q + Eta - uint32((buf[i]>>3)&7) - p[j+2] = common.Q + Eta - uint32((buf[i]>>6)|((buf[i+1]<<2)&7)) - p[j+3] = common.Q + Eta - uint32((buf[i+1]>>1)&7) - p[j+4] = common.Q + Eta - uint32((buf[i+1]>>4)&7) - p[j+5] = common.Q + Eta - uint32((buf[i+1]>>7)|((buf[i+2]<<1)&7)) - p[j+6] = common.Q + Eta - uint32((buf[i+2]>>2)&7) - p[j+7] = common.Q + Eta - uint32((buf[i+2]>>5)&7) - j += 8 - } - } else { - panic("eta not supported") - } -} - -// Writes v with coefficients in {0, 1} of which at most ω non-zero -// to buf, which must have length ω+k. -func (v *VecK) PackHint(buf []byte) { - // The packed hint starts with the indices of the non-zero coefficients - // For instance: - // - // (x⁵⁶ + x¹⁰⁰, x²⁵⁵, 0, x² + x²³, x¹) - // - // Yields - // - // 56, 100, 255, 2, 23, 1 - // - // Then we pad with zeroes until we have a list of ω items: - // // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0 - // - // Then we finish with a list of the switch-over-indices in this - // list between polynomials, so: - // - // 56, 100, 255, 2, 23, 1, 0, 0, ..., 0, 2, 3, 3, 5, 6 - - off := uint8(0) - for i := 0; i < K; i++ { - for j := uint16(0); j < common.N; j++ { - if v[i][j] != 0 { - buf[off] = uint8(j) - off++ - } - } - buf[Omega+i] = off - } - for ; off < Omega; off++ { - buf[off] = 0 - } -} - -// Sets v to the vector encoded using VecK.PackHint() -// -// Returns whether unpacking was successful. -func (v *VecK) UnpackHint(buf []byte) bool { - // A priori, there would be several reasonable ways to encode the same - // hint vector. We take care to only allow only one encoding, to ensure - // "strong unforgeability". - // - // See PackHint() source for description of the encoding. - *v = VecK{} // zero v - prevSOP := uint8(0) // previous switch-over-point - for i := 0; i < K; i++ { - SOP := buf[Omega+i] - if SOP < prevSOP || SOP > Omega { - return false // ensures switch-over-points are increasing - } - for j := prevSOP; j < SOP; j++ { - if j > prevSOP && buf[j] <= buf[j-1] { - return false // ensures indices are increasing (within a poly) - } - v[i][buf[j]] = 1 - } - prevSOP = SOP - } - for j := prevSOP; j < Omega; j++ { - if buf[j] != 0 { - return false // ensures padding indices are zero - } - } - - return true -} - -// Sets p to the polynomial packed into buf by PolyPackLeGamma1. -// -// p will be normalized. -func PolyUnpackLeGamma1(p *common.Poly, buf []byte) { - if Gamma1Bits == 17 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 9 { - p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | - (uint32(buf[i+2]&0x3) << 16) - p1 := uint32(buf[i+2]>>2) | (uint32(buf[i+3]) << 6) | - (uint32(buf[i+4]&0xf) << 14) - p2 := uint32(buf[i+4]>>4) | (uint32(buf[i+5]) << 4) | - (uint32(buf[i+6]&0x3f) << 12) - p3 := uint32(buf[i+6]>>6) | (uint32(buf[i+7]) << 2) | - (uint32(buf[i+8]) << 10) - - // coefficients in [0,…,2γ₁) - p0 = Gamma1 - p0 // (-γ₁,…,γ₁] - p1 = Gamma1 - p1 - p2 = Gamma1 - p2 - p3 = Gamma1 - p3 - - p0 += uint32(int32(p0)>>31) & common.Q // normalize - p1 += uint32(int32(p1)>>31) & common.Q - p2 += uint32(int32(p2)>>31) & common.Q - p3 += uint32(int32(p3)>>31) & common.Q - - p[j] = p0 - p[j+1] = p1 - p[j+2] = p2 - p[j+3] = p3 - - j += 4 - } - } else if Gamma1Bits == 19 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 5 { - p0 := uint32(buf[i]) | (uint32(buf[i+1]) << 8) | - (uint32(buf[i+2]&0xf) << 16) - p1 := uint32(buf[i+2]>>4) | (uint32(buf[i+3]) << 4) | - (uint32(buf[i+4]) << 12) - - p0 = Gamma1 - p0 - p1 = Gamma1 - p1 - - p0 += uint32(int32(p0)>>31) & common.Q - p1 += uint32(int32(p1)>>31) & common.Q - - p[j] = p0 - p[j+1] = p1 - - j += 2 - } - } else { - panic("γ₁ not supported") - } -} - -// Writes p whose coefficients are in (-γ₁,γ₁] into buf -// which has to be of length PolyLeGamma1Size. -// -// Assumes p is normalized. -func PolyPackLeGamma1(p *common.Poly, buf []byte) { - if Gamma1Bits == 17 { - j := 0 - // coefficients in [0,…,γ₁] ∪ (q-γ₁,…,q) - for i := 0; i < PolyLeGamma1Size; i += 9 { - p0 := Gamma1 - p[j] // [0,…,γ₁] ∪ (γ₁-q,…,2γ₁-q) - p0 += uint32(int32(p0)>>31) & common.Q // [0,…,2γ₁) - p1 := Gamma1 - p[j+1] - p1 += uint32(int32(p1)>>31) & common.Q - p2 := Gamma1 - p[j+2] - p2 += uint32(int32(p2)>>31) & common.Q - p3 := Gamma1 - p[j+3] - p3 += uint32(int32(p3)>>31) & common.Q - - buf[i+0] = byte(p0) - buf[i+1] = byte(p0 >> 8) - buf[i+2] = byte(p0>>16) | byte(p1<<2) - buf[i+3] = byte(p1 >> 6) - buf[i+4] = byte(p1>>14) | byte(p2<<4) - buf[i+5] = byte(p2 >> 4) - buf[i+6] = byte(p2>>12) | byte(p3<<6) - buf[i+7] = byte(p3 >> 2) - buf[i+8] = byte(p3 >> 10) - - j += 4 - } - } else if Gamma1Bits == 19 { - j := 0 - for i := 0; i < PolyLeGamma1Size; i += 5 { - // Coefficients are in [0, γ₁] ∪ (Q-γ₁, Q) - p0 := Gamma1 - p[j] - p0 += uint32(int32(p0)>>31) & common.Q - p1 := Gamma1 - p[j+1] - p1 += uint32(int32(p1)>>31) & common.Q - - buf[i+0] = byte(p0) - buf[i+1] = byte(p0 >> 8) - buf[i+2] = byte(p0>>16) | byte(p1<<4) - buf[i+3] = byte(p1 >> 4) - buf[i+4] = byte(p1 >> 12) - - j += 2 - } - } else { - panic("γ₁ not supported") - } -} - -// Pack w₁ into buf, which must be of length PolyW1Size. -// -// Assumes w₁ is normalized. -func PolyPackW1(p *common.Poly, buf []byte) { - if Gamma1Bits == 19 { - p.PackLe16(buf) - } else if Gamma1Bits == 17 { - j := 0 - for i := 0; i < PolyW1Size; i += 3 { - buf[i] = byte(p[j]) | byte(p[j+1]<<6) - buf[i+1] = byte(p[j+1]>>2) | byte(p[j+2]<<4) - buf[i+2] = byte(p[j+2]>>4) | byte(p[j+3]<<2) - j += 4 - } - } else { - panic("unsupported γ₁") - } -} diff --git a/sign/dilithium/mode5aes/internal/pack_test.go b/sign/dilithium/mode5aes/internal/pack_test.go deleted file mode 100644 index f952c6a09..000000000 --- a/sign/dilithium/mode5aes/internal/pack_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Code generated from mode3/internal/pack_test.go by gen.go - -package internal - -import ( - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -func TestPolyPackLeqEta(t *testing.T) { - var p1, p2 common.Poly - var seed [64]byte - var buf [PolyLeqEtaSize]byte - - for i := uint16(0); i < 100; i++ { - // Note that DeriveUniformLeqEta sets p to the right kind of - // unnormalized vector. - PolyDeriveUniformLeqEta(&p1, &seed, i) - for j := 0; j < PolyLeqEtaSize; j++ { - if p1[j] < common.Q-Eta || p1[j] > common.Q+Eta { - t.Fatalf("DerveUniformLeqEta out of bounds") - } - } - PolyPackLeqEta(&p1, buf[:]) - PolyUnpackLeqEta(&p2, buf[:]) - if p1 != p2 { - t.Fatalf("%v != %v", p1, p2) - } - } -} - -func TestPolyPackT1(t *testing.T) { - var p1, p2 common.Poly - var seed [32]byte - var buf [common.PolyT1Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniform(&p1, &seed, i) - p1.Normalize() - for j := 0; j < common.N; j++ { - p1[j] &= 0x1ff - } - p1.PackT1(buf[:]) - p2.UnpackT1(buf[:]) - if p1 != p2 { - t.Fatalf("%v != %v", p1, p2) - } - } -} - -func TestPolyPackT0(t *testing.T) { - var p, p0, p1, p2 common.Poly - var seed [32]byte - var buf [common.PolyT0Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniform(&p, &seed, i) - p.Normalize() - p.Power2Round(&p0, &p1) - - p0.PackT0(buf[:]) - p2.UnpackT0(buf[:]) - if p0 != p2 { - t.Fatalf("%v !=\n%v", p0, p2) - } - } -} - -func BenchmarkUnpackLeGamma1(b *testing.B) { - var p common.Poly - var buf [PolyLeGamma1Size]byte - for i := 0; i < b.N; i++ { - PolyUnpackLeGamma1(&p, buf[:]) - } -} - -func TestPolyPackLeGamma1(t *testing.T) { - var p0, p1 common.Poly - var seed [64]byte - var buf [PolyLeGamma1Size]byte - - for i := uint16(0); i < 100; i++ { - PolyDeriveUniformLeGamma1(&p0, &seed, i) - p0.Normalize() - - PolyPackLeGamma1(&p0, buf[:]) - PolyUnpackLeGamma1(&p1, buf[:]) - if p0 != p1 { - t.Fatalf("%v != %v", p0, p1) - } - } -} diff --git a/sign/dilithium/mode5aes/internal/params.go b/sign/dilithium/mode5aes/internal/params.go deleted file mode 100644 index 340b6d73a..000000000 --- a/sign/dilithium/mode5aes/internal/params.go +++ /dev/null @@ -1,19 +0,0 @@ -// Code generated from params.templ.go. DO NOT EDIT. - -package internal - -const ( - Name = "Dilithium5-AES" - UseAES = true - K = 8 - L = 7 - Eta = 2 - DoubleEtaBits = 3 - Omega = 75 - Tau = 60 - Gamma1Bits = 19 - Gamma2 = 261888 - NIST = false - TRSize = 32 - CTildeSize = 32 -) diff --git a/sign/dilithium/mode5aes/internal/params_test.go b/sign/dilithium/mode5aes/internal/params_test.go deleted file mode 100644 index 57e14f820..000000000 --- a/sign/dilithium/mode5aes/internal/params_test.go +++ /dev/null @@ -1,100 +0,0 @@ -package internal - -import ( - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// 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/rounding.go b/sign/dilithium/mode5aes/internal/rounding.go deleted file mode 100644 index 58123c090..000000000 --- a/sign/dilithium/mode5aes/internal/rounding.go +++ /dev/null @@ -1,142 +0,0 @@ -// Code generated from mode3/internal/rounding.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// Splits 0 ≤ a < q into a₀ and a₁ with a = a₁*α + a₀ with -α/2 < a₀ ≤ α/2, -// except for when we would have a₁ = (q-1)/α in which case a₁=0 is taken -// and -α/2 ≤ a₀ < 0. Returns a₀ + q. Note 0 ≤ a₁ < (q-1)/α. -// Recall α = 2γ₂. -func decompose(a uint32) (a0plusQ, a1 uint32) { - // a₁ = ⌈a / 128⌉ - a1 = (a + 127) >> 7 - - if Alpha == 523776 { - // 1025/2²² is close enough to 1/4092 so that a₁ - // becomes a/α rounded down. - a1 = ((a1*1025 + (1 << 21)) >> 22) - - // For the corner-case a₁ = (q-1)/α = 16, we have to set a₁=0. - a1 &= 15 - } else if Alpha == 190464 { - // 1488/2²⁴ is close enough to 1/1488 so that a₁ - // becomes a/α rounded down. - a1 = ((a1 * 11275) + (1 << 23)) >> 24 - - // For the corner-case a₁ = (q-1)/α = 44, we have to set a₁=0. - a1 ^= uint32(int32(43-a1)>>31) & a1 - } else { - panic("unsupported α") - } - - a0plusQ = a - a1*Alpha - - // In the corner-case, when we set a₁=0, we will incorrectly - // have a₀ > (q-1)/2 and we'll need to subtract q. As we - // return a₀ + q, that comes down to adding q if a₀ < (q-1)/2. - a0plusQ += uint32(int32(a0plusQ-(common.Q-1)/2)>>31) & common.Q - - return -} - -// Assume 0 ≤ r, f < Q with ‖f‖_∞ ≤ α/2. Decompose r as r = r1*α + r0 as -// computed by decompose(). Write r' := r - f (mod Q). Now, decompose -// r'=r-f again as r' = r'1*α + r'0 using decompose(). As f is small, we -// have r'1 = r1 + h, where h ∈ {-1, 0, 1}. makeHint() computes |h| -// given z0 := r0 - f (mod Q) and r1. With |h|, which is called the hint, -// we can reconstruct r1 using only r' = r - f, which is done by useHint(). -// To wit: -// -// useHint( r - f, makeHint( r0 - f, r1 ) ) = r1. -// -// Assumes 0 ≤ z0 < Q. -func makeHint(z0, r1 uint32) uint32 { - // If -α/2 < r0 - f ≤ α/2, then r1*α + r0 - f is a valid decomposition of r' - // with the restrictions of decompose() and so r'1 = r1. So the hint - // should be 0. This is covered by the first two inequalities. - // There is one other case: if r0 - f = -α/2, then r1*α + r0 - f is also - // a valid decomposition if r1 = 0. In the other cases a one is carried - // and the hint should be 1. - if z0 <= Gamma2 || z0 > common.Q-Gamma2 || (z0 == common.Q-Gamma2 && r1 == 0) { - return 0 - } - return 1 -} - -// Uses the hint created by makeHint() to reconstruct r1 from r'=r-f; see -// documentation of makeHint() for context. -// Assumes 0 ≤ r' < Q. -func useHint(rp uint32, hint uint32) uint32 { - rp0plusQ, rp1 := decompose(rp) - if hint == 0 { - return rp1 - } - if rp0plusQ > common.Q { - return (rp1 + 1) & 15 - } - return (rp1 - 1) & 15 -} - -// Sets p to the hint polynomial for p0 the modified low bits and p1 -// the unmodified high bits --- see makeHint(). -// -// Returns the number of ones in the hint polynomial. -func PolyMakeHint(p, p0, p1 *common.Poly) (pop uint32) { - for i := 0; i < common.N; i++ { - h := makeHint(p0[i], p1[i]) - pop += h - p[i] = h - } - return -} - -// Computes corrections to the high bits of the polynomial q according -// to the hints in h and sets p to the corrected high bits. Returns p. -func PolyUseHint(p, q, hint *common.Poly) { - var q0PlusQ common.Poly - - // See useHint() and makeHint() for an explanation. We reimplement it - // here so that we can call Poly.Decompose(), which might be way faster - // than calling decompose() in a loop (for instance when having AVX2.) - - PolyDecompose(q, &q0PlusQ, p) - - for i := 0; i < common.N; i++ { - if hint[i] == 0 { - continue - } - if Gamma2 == 261888 { - if q0PlusQ[i] > common.Q { - p[i] = (p[i] + 1) & 15 - } else { - p[i] = (p[i] - 1) & 15 - } - } else if Gamma2 == 95232 { - if q0PlusQ[i] > common.Q { - if p[i] == 43 { - p[i] = 0 - } else { - p[i]++ - } - } else { - if p[i] == 0 { - p[i] = 43 - } else { - p[i]-- - } - } - } else { - panic("unsupported γ₂") - } - } -} - -// Splits each of the coefficients of p using decompose. -func PolyDecompose(p, p0PlusQ, p1 *common.Poly) { - for i := 0; i < common.N; i++ { - p0PlusQ[i], p1[i] = decompose(p[i]) - } -} diff --git a/sign/dilithium/mode5aes/internal/rounding_test.go b/sign/dilithium/mode5aes/internal/rounding_test.go deleted file mode 100644 index ad653ca3f..000000000 --- a/sign/dilithium/mode5aes/internal/rounding_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Code generated from mode3/internal/rounding_test.go by gen.go - -package internal - -import ( - "flag" - "testing" - - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests") - -func TestDecompose(t *testing.T) { - for a := uint32(0); a < common.Q; a++ { - a0PlusQ, a1 := decompose(a) - a0 := int32(a0PlusQ) - int32(common.Q) - recombined := a0 + int32(Alpha*a1) - if a1 == 0 && recombined < 0 { - recombined += common.Q - if -(Alpha/2) > a0 || a0 >= 0 { - t.Fatalf("decompose(%v): a0 out of bounds", a) - } - } else { - if (-(Alpha / 2) >= a0) || (a0 > Alpha/2) { - t.Fatalf("decompose(%v): a0 out of bounds", a) - } - } - if int32(a) != recombined { - t.Fatalf("decompose(%v) doesn't recombine %v %v", a, a0, a1) - } - } -} - -func TestMakeHint(t *testing.T) { - if !*runVeryLongTest { - t.SkipNow() - } - for w := uint32(0); w < common.Q; w++ { - w0, w1 := decompose(w) - for fn := uint32(0); fn <= Gamma2; fn++ { - fsign := false - for { - var f uint32 - if fsign { - if fn == 0 { - break - } - f = common.Q - fn - } else { - f = fn - } - - hint := makeHint(common.ReduceLe2Q(w0+common.Q-f), w1) - w1p := useHint(common.ReduceLe2Q(w+common.Q-f), hint) - if w1p != w1 { - t.Fatal() - } - - if fsign { - break - } - fsign = true - } - } - } -} - -func BenchmarkDecompose(b *testing.B) { - var p, p0, p1 common.Poly - for i := 0; i < b.N; i++ { - PolyDecompose(&p, &p0, &p1) - } -} - -func BenchmarkMakeHint(b *testing.B) { - var p, p0, p1 common.Poly - for i := 0; i < b.N; i++ { - PolyMakeHint(&p, &p0, &p1) - } -} diff --git a/sign/dilithium/mode5aes/internal/sample.go b/sign/dilithium/mode5aes/internal/sample.go deleted file mode 100644 index 62c261332..000000000 --- a/sign/dilithium/mode5aes/internal/sample.go +++ /dev/null @@ -1,370 +0,0 @@ -// Code generated from mode3/internal/sample.go by gen.go - -package internal - -import ( - "encoding/binary" - - "github.com/cloudflare/circl/internal/sha3" - 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 - -// 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. -// -// Can only be called when DeriveX4Available is true. -func PolyDeriveUniformX4(ps [4]*common.Poly, seed *[32]byte, nonces [4]uint16) { - var perm keccakf1600.StateX4 - state := perm.Initialize(false) - - // Absorb the seed in the four states - for i := 0; i < 4; i++ { - v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) - for j := 0; j < 4; j++ { - state[i*4+j] = v - } - } - - // Absorb the nonces, the SHAKE128 domain separator (0b1111), the - // start of the padding (0b...001) and the end of the padding 0b100... - // Recall that the rate of SHAKE128 is 168 --- i.e. 21 uint64s. - for j := 0; j < 4; j++ { - state[4*4+j] = uint64(nonces[j]) | (0x1f << 16) - state[20*4+j] = 0x80 << 56 - } - - var idx [4]int // indices into ps - for j := 0; j < 4; j++ { - if ps[j] == nil { - idx[j] = common.N // mark nil polynomial as completed - } - } - - done := false - for !done { - // Applies KeccaK-f[1600] to state to get the next 21 uint64s of each - // of the four SHAKE128 streams. - perm.Permute() - - done = true - - PolyLoop: - for j := 0; j < 4; j++ { - if idx[j] == common.N { - continue - } - for i := 0; i < 7; i++ { - var t [8]uint32 - t[0] = uint32(state[i*3*4+j] & 0x7fffff) - t[1] = uint32((state[i*3*4+j] >> 24) & 0x7fffff) - t[2] = uint32((state[i*3*4+j] >> 48) | - ((state[(i*3+1)*4+j] & 0x7f) << 16)) - t[3] = uint32((state[(i*3+1)*4+j] >> 8) & 0x7fffff) - t[4] = uint32((state[(i*3+1)*4+j] >> 32) & 0x7fffff) - t[5] = uint32((state[(i*3+1)*4+j] >> 56) | - ((state[(i*3+2)*4+j] & 0x7fff) << 8)) - t[6] = uint32((state[(i*3+2)*4+j] >> 16) & 0x7fffff) - t[7] = uint32((state[(i*3+2)*4+j] >> 40) & 0x7fffff) - - for k := 0; k < 8; k++ { - if t[k] < common.Q { - ps[j][idx[j]] = t[k] - idx[j]++ - if idx[j] == common.N { - continue PolyLoop - } - } - } - } - done = false - } - } -} - -// Sample p uniformly from the given seed and nonce. -// -// 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 - - if UseAES { - length = 12 * 16 - } else { - length = 168 - } - - sample := func() { - // Note that 3 divides into 168 and 12*16, so we use up buf completely. - for j := 0; j < length && i < common.N; j += 3 { - t := (uint32(buf[j]) | (uint32(buf[j+1]) << 8) | - (uint32(buf[j+2]) << 16)) & 0x7fffff - - // We use rejection sampling - if t < common.Q { - p[i] = t - i++ - } - } - } - - if UseAES { - h := common.NewAesStream128(seed, nonce) - - 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() - } - } -} - -// Sample p uniformly with coefficients of norm less than or equal η, -// using the given seed and nonce. -// -// p will not be normalized, but will have coefficients in [q-η,q+η]. -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 - - if UseAES { - length = 9 * 16 - } else { - length = 136 - } - - sample := func() { - // We use rejection sampling - for j := 0; j < length && i < common.N; j++ { - t1 := uint32(buf[j]) & 15 - t2 := uint32(buf[j]) >> 4 - if Eta == 2 { // branch is eliminated by compiler - if t1 <= 14 { - t1 -= ((205 * t1) >> 10) * 5 // reduce mod 5 - p[i] = common.Q + Eta - t1 - i++ - } - if t2 <= 14 && i < common.N { - t2 -= ((205 * t2) >> 10) * 5 // reduce mod 5 - p[i] = common.Q + Eta - t2 - i++ - } - } else if Eta == 4 { - if t1 <= 2*Eta { - p[i] = common.Q + Eta - t1 - i++ - } - if t2 <= 2*Eta && i < common.N { - p[i] = common.Q + Eta - t2 - i++ - } - } else { - panic("unsupported η") - } - } - } - - 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 - - h := sha3.NewShake256() - copy(iv[:64], seed[:]) - iv[64] = uint8(nonce) - iv[65] = uint8(nonce >> 8) - - // 136 is SHAKE-256 rate - _, _ = h.Write(iv[:]) - - for i < common.N { - _, _ = h.Read(buf[:136]) - sample() - } - } -} - -// Sample v[i] uniformly with coefficients in (-γ₁,…,γ₁] using the -// given seed and nonce+i -// -// p will be normalized. -func VecLDeriveUniformLeGamma1(v *VecL, seed *[64]byte, nonce uint16) { - for i := 0; i < L; i++ { - PolyDeriveUniformLeGamma1(&v[i], seed, nonce+uint16(i)) - } -} - -// Sample p uniformly with coefficients in (-γ₁,…,γK1s] using the -// given seed and nonce. -// -// p will be normalized. -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[:]) - } - - PolyUnpackLeGamma1(p, buf[:]) -} - -// For each i, sample ps[i] uniformly with τ non-zero coefficients in {q-1,1} -// using the given seed and w1[i]. ps[i] may be nil and is ignored -// in that case. ps[i] will be normalized. -// -// Can only be called when DeriveX4Available is true. -// -// This function is currently not used (yet). -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 < 32/8; i++ { - v := binary.LittleEndian.Uint64(seed[8*i : 8*(i+1)]) - for j := 0; j < 4; j++ { - state[i*4+j] = v - } - } - - // SHAKE256 domain separator and padding - for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f - state[16*4+j] ^= 0x80 << 56 - } - perm.Permute() - - var signs [4]uint64 - var idx [4]uint16 // indices into ps - - for j := 0; j < 4; j++ { - if ps[j] != nil { - signs[j] = state[j] - *ps[j] = common.Poly{} // zero ps[j] - idx[j] = common.N - Tau - } else { - idx[j] = common.N // mark as completed - } - } - - stateOffset := 1 - for { - done := true - - PolyLoop: - for j := 0; j < 4; j++ { - if idx[j] == common.N { - continue - } - - for i := stateOffset; i < 17; i++ { - var bs [8]byte - binary.LittleEndian.PutUint64(bs[:], state[4*i+j]) - for k := 0; k < 8; k++ { - b := uint16(bs[k]) - - if b > idx[j] { - continue - } - - ps[j][idx[j]] = ps[j][b] - ps[j][b] = 1 - // Takes least significant bit of signs and uses it for the sign. - // Note 1 ^ (1 | (Q-1)) = Q-1. - ps[j][b] ^= uint32((-(signs[j] & 1)) & (1 | (common.Q - 1))) - signs[j] >>= 1 - - idx[j]++ - if idx[j] == common.N { - continue PolyLoop - } - } - } - - done = false - } - - if done { - break - } - - perm.Permute() - stateOffset = 0 - } -} - -// Samples p uniformly with τ non-zero coefficients in {q-1,1}. -// -// The polynomial p will be normalized. -func PolyDeriveUniformBall(p *common.Poly, seed []byte) { - var buf [136]byte // SHAKE-256 rate is 136 - - h := sha3.NewShake256() - _, _ = h.Write(seed[:]) - _, _ = h.Read(buf[:]) - - // Essentially we generate a sequence of τ ones or minus ones, - // prepend 196 zeroes and shuffle the concatenation using the - // usual algorithm (Fisher--Yates.) - signs := binary.LittleEndian.Uint64(buf[:]) - bufOff := 8 // offset into buf - - *p = common.Poly{} // zero p - for i := uint16(common.N - Tau); i < common.N; i++ { - var b uint16 - - // Find location of where to move the new coefficient to using - // rejection sampling. - for { - if bufOff >= 136 { - _, _ = h.Read(buf[:]) - bufOff = 0 - } - - b = uint16(buf[bufOff]) - bufOff++ - - if b <= i { - break - } - } - - p[i] = p[b] - p[b] = 1 - // Takes least significant bit of signs and uses it for the sign. - // Note 1 ^ (1 | (Q-1)) = Q-1. - p[b] ^= uint32((-(signs & 1)) & (1 | (common.Q - 1))) - signs >>= 1 - } -} diff --git a/sign/dilithium/mode5aes/internal/sample_test.go b/sign/dilithium/mode5aes/internal/sample_test.go deleted file mode 100644 index 2059599eb..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" - - 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, - } - } - 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/mode5aes/internal/vec.go b/sign/dilithium/mode5aes/internal/vec.go deleted file mode 100644 index d07d3b245..000000000 --- a/sign/dilithium/mode5aes/internal/vec.go +++ /dev/null @@ -1,281 +0,0 @@ -// Code generated from mode3/internal/vec.go by gen.go - -package internal - -import ( - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// A vector of L polynomials. -type VecL [L]common.Poly - -// A vector of K polynomials. -type VecK [K]common.Poly - -// Normalize the polynomials in this vector. -func (v *VecL) Normalize() { - for i := 0; i < L; i++ { - v[i].Normalize() - } -} - -// Normalize the polynomials in this vector assuming their coefficients -// are already bounded by 2q. -func (v *VecL) NormalizeAssumingLe2Q() { - for i := 0; i < L; i++ { - v[i].NormalizeAssumingLe2Q() - } -} - -// Sets v to w + u. Does not normalize. -func (v *VecL) Add(w, u *VecL) { - for i := 0; i < L; i++ { - v[i].Add(&w[i], &u[i]) - } -} - -// Applies NTT componentwise. See Poly.NTT() for details. -func (v *VecL) NTT() { - for i := 0; i < L; i++ { - v[i].NTT() - } -} - -// Checks whether any of the coefficients exceeds the given bound in supnorm -// -// Requires the vector to be normalized. -func (v *VecL) Exceeds(bound uint32) bool { - for i := 0; i < L; i++ { - if v[i].Exceeds(bound) { - return true - } - } - return false -} - -// Applies Poly.Power2Round componentwise. -// -// Requires the vector to be normalized. -func (v *VecL) Power2Round(v0PlusQ, v1 *VecL) { - for i := 0; i < L; i++ { - v[i].Power2Round(&v0PlusQ[i], &v1[i]) - } -} - -// Applies Poly.Decompose componentwise. -// -// Requires the vector to be normalized. -func (v *VecL) Decompose(v0PlusQ, v1 *VecL) { - for i := 0; i < L; i++ { - PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) - } -} - -// Sequentially packs each polynomial using Poly.PackLeqEta(). -func (v *VecL) PackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyPackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sets v to the polynomials packed in buf using VecL.PackLeqEta(). -func (v *VecL) UnpackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyUnpackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sequentially packs each polynomial using PolyPackLeGamma1(). -func (v *VecL) PackLeGamma1(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyPackLeGamma1(&v[i], buf[offset:]) - offset += PolyLeGamma1Size - } -} - -// Sets v to the polynomials packed in buf using VecL.PackLeGamma1(). -func (v *VecL) UnpackLeGamma1(buf []byte) { - offset := 0 - for i := 0; i < L; i++ { - PolyUnpackLeGamma1(&v[i], buf[offset:]) - offset += PolyLeGamma1Size - } -} - -// Normalize the polynomials in this vector. -func (v *VecK) Normalize() { - for i := 0; i < K; i++ { - v[i].Normalize() - } -} - -// Normalize the polynomials in this vector assuming their coefficients -// are already bounded by 2q. -func (v *VecK) NormalizeAssumingLe2Q() { - for i := 0; i < K; i++ { - v[i].NormalizeAssumingLe2Q() - } -} - -// Sets v to w + u. Does not normalize. -func (v *VecK) Add(w, u *VecK) { - for i := 0; i < K; i++ { - v[i].Add(&w[i], &u[i]) - } -} - -// Checks whether any of the coefficients exceeds the given bound in supnorm -// -// Requires the vector to be normalized. -func (v *VecK) Exceeds(bound uint32) bool { - for i := 0; i < K; i++ { - if v[i].Exceeds(bound) { - return true - } - } - return false -} - -// Applies Poly.Power2Round componentwise. -// -// Requires the vector to be normalized. -func (v *VecK) Power2Round(v0PlusQ, v1 *VecK) { - for i := 0; i < K; i++ { - v[i].Power2Round(&v0PlusQ[i], &v1[i]) - } -} - -// Applies Poly.Decompose componentwise. -// -// Requires the vector to be normalized. -func (v *VecK) Decompose(v0PlusQ, v1 *VecK) { - for i := 0; i < K; i++ { - PolyDecompose(&v[i], &v0PlusQ[i], &v1[i]) - } -} - -// Sets v to the hint vector for v0 the modified low bits and v1 -// the unmodified high bits --- see makeHint(). -// -// Returns the number of ones in the hint vector. -func (v *VecK) MakeHint(v0, v1 *VecK) (pop uint32) { - for i := 0; i < K; i++ { - pop += PolyMakeHint(&v[i], &v0[i], &v1[i]) - } - return -} - -// Computes corrections to the high bits of the polynomials in the vector -// w using the hints in h and sets v to the corrected high bits. Returns v. -// See useHint(). -func (v *VecK) UseHint(q, hint *VecK) *VecK { - for i := 0; i < K; i++ { - PolyUseHint(&v[i], &q[i], &hint[i]) - } - return v -} - -// Sequentially packs each polynomial using Poly.PackT1(). -func (v *VecK) PackT1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].PackT1(buf[offset:]) - offset += common.PolyT1Size - } -} - -// Sets v to the vector packed into buf by PackT1(). -func (v *VecK) UnpackT1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].UnpackT1(buf[offset:]) - offset += common.PolyT1Size - } -} - -// Sequentially packs each polynomial using Poly.PackT0(). -func (v *VecK) PackT0(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].PackT0(buf[offset:]) - offset += common.PolyT0Size - } -} - -// Sets v to the vector packed into buf by PackT0(). -func (v *VecK) UnpackT0(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - v[i].UnpackT0(buf[offset:]) - offset += common.PolyT0Size - } -} - -// Sequentially packs each polynomial using Poly.PackLeqEta(). -func (v *VecK) PackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyPackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Sets v to the polynomials packed in buf using VecK.PackLeqEta(). -func (v *VecK) UnpackLeqEta(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyUnpackLeqEta(&v[i], buf[offset:]) - offset += PolyLeqEtaSize - } -} - -// Applies NTT componentwise. See Poly.NTT() for details. -func (v *VecK) NTT() { - for i := 0; i < K; i++ { - v[i].NTT() - } -} - -// Sequentially packs each polynomial using PolyPackW1(). -func (v *VecK) PackW1(buf []byte) { - offset := 0 - for i := 0; i < K; i++ { - PolyPackW1(&v[i], buf[offset:]) - offset += PolyW1Size - } -} - -// Sets v to a - b. -// -// Warning: assumes coefficients of the polynomials of b are less than 2q. -func (v *VecK) Sub(a, b *VecK) { - for i := 0; i < K; i++ { - v[i].Sub(&a[i], &b[i]) - } -} - -// Sets v to 2ᵈ w without reducing. -func (v *VecK) MulBy2toD(w *VecK) { - for i := 0; i < K; i++ { - v[i].MulBy2toD(&w[i]) - } -} - -// Applies InvNTT componentwise. See Poly.InvNTT() for details. -func (v *VecK) InvNTT() { - for i := 0; i < K; i++ { - v[i].InvNTT() - } -} - -// Applies Poly.ReduceLe2Q() componentwise. -func (v *VecK) ReduceLe2Q() { - for i := 0; i < K; i++ { - v[i].ReduceLe2Q() - } -} diff --git a/sign/dilithium/templates/mode.templ.go b/sign/dilithium/templates/mode.templ.go deleted file mode 100644 index 445514bcc..000000000 --- a/sign/dilithium/templates/mode.templ.go +++ /dev/null @@ -1,100 +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" -{{ if .NIST }} - "github.com/cloudflare/circl/sign/mldsa/{{.Pkg}}" -{{ else }} - "github.com/cloudflare/circl/sign/dilithium/{{.Pkg}}" -{{- end }} - common "github.com/cloudflare/circl/sign/internal/dilithium" -) - -// {{.Impl}} implements the mode.Mode interface for {{.Name}}. -type {{.Impl}} struct{} -{{ if .NIST }} -// {{.Mode}} is {{.Name}}. -{{- else }} -// {{.Mode}} is Dilithium in mode "{{.Name}}". -{{- end }} -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 private 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/params.templ.go b/sign/dilithium/templates/params.templ.go index faeae3aac..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}} diff --git a/sign/dilithium/templates/modePkg.templ.go b/sign/dilithium/templates/pkg.templ.go similarity index 53% rename from sign/dilithium/templates/modePkg.templ.go rename to sign/dilithium/templates/pkg.templ.go index fbaa89746..4ad538565 100644 --- a/sign/dilithium/templates/modePkg.templ.go +++ b/sign/dilithium/templates/pkg.templ.go @@ -2,16 +2,16 @@ // 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. +// Code generated from pkg.templ.go. DO NOT EDIT. {{ if .NIST }} // {{.Pkg}} implements NIST signature scheme {{.Name}} as defined in FIPS204. -{{ else }} +{{- 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 }} +{{- end }} package {{.Pkg}} import ( @@ -19,12 +19,18 @@ import ( "errors" "io" - common "github.com/cloudflare/circl/sign/internal/dilithium" -{{ if .NIST }} +{{- if .NIST }} + cryptoRand "crypto/rand" +{{- end }} + + "github.com/cloudflare/circl/sign" + +{{- if .NIST }} "github.com/cloudflare/circl/sign/mldsa/{{.Pkg}}/internal" -{{ else }} +{{- else }} "github.com/cloudflare/circl/sign/dilithium/{{.Pkg}}/internal" -{{ end }} +{{- end }} + common "github.com/cloudflare/circl/sign/internal/dilithium" ) const ( @@ -62,20 +68,79 @@ 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) { +{{- 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), - msg, - signature, + 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 }} } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +{{- 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), - msg, - signature, + 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, ) } @@ -155,15 +220,22 @@ 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, sig[:]) - return sig[:], nil + {{- 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. @@ -191,3 +263,138 @@ 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 {{ .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/mldsa/mldsa44/dilithium.go b/sign/mldsa/mldsa44/dilithium.go index 71e2b7906..866f8b6ee 100644 --- a/sign/mldsa/mldsa44/dilithium.go +++ b/sign/mldsa/mldsa44/dilithium.go @@ -1,19 +1,17 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. - +// 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 ( @@ -51,20 +49,59 @@ 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) { +// +// 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), - msg, - signature, + 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 } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// 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), - msg, - signature, + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + _, _ = w.Write(msg) + }, + sig, ) } @@ -144,15 +181,17 @@ 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") } + if err = SignTo(sk, msg, nil, false, ret[:]); err != nil { + return nil, err + } - SignTo(sk, msg, sig[:]) - return sig[:], nil + return ret[:], nil } // Computes the public key corresponding to this private key. @@ -180,3 +219,114 @@ 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 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/mldsa/mldsa44/internal/dilithium.go b/sign/mldsa/mldsa44/internal/dilithium.go index 7869d0475..609ab3a4c 100644 --- a/sign/mldsa/mldsa44/internal/dilithium.go +++ b/sign/mldsa/mldsa44/internal/dilithium.go @@ -244,7 +244,10 @@ 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 @@ -262,7 +265,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 +282,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[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +310,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,16 +330,14 @@ 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 { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) + _, _ = h.Write(rnd[:]) } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -373,7 +377,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, sig.c[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/mldsa/mldsa44/internal/dilithium_test.go b/sign/mldsa/mldsa44/internal/dilithium_test.go index 825e7da08..47f53d3a0 100644 --- a/sign/mldsa/mldsa44/internal/dilithium_test.go +++ b/sign/mldsa/mldsa44/internal/dilithium_test.go @@ -4,6 +4,7 @@ package internal import ( "encoding/binary" + "io" "testing" common "github.com/cloudflare/circl/sign/internal/dilithium" @@ -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/mldsa/mldsa44/internal/params.go b/sign/mldsa/mldsa44/internal/params.go index fec07cbbe..0485ff0c3 100644 --- a/sign/mldsa/mldsa44/internal/params.go +++ b/sign/mldsa/mldsa44/internal/params.go @@ -4,7 +4,6 @@ package internal const ( Name = "ML-DSA-44" - UseAES = false K = 4 L = 4 Eta = 2 diff --git a/sign/mldsa/mldsa44/internal/sample.go b/sign/mldsa/mldsa44/internal/sample.go index 62c261332..b37370a4e 100644 --- a/sign/mldsa/mldsa44/internal/sample.go +++ b/sign/mldsa/mldsa44/internal/sample.go @@ -12,7 +12,7 @@ import ( // 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[:]) } @@ -251,7 +220,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 32/8; 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 []byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() diff --git a/sign/mldsa/mldsa44/internal/sample_test.go b/sign/mldsa/mldsa44/internal/sample_test.go index 2059599eb..32931c94f 100644 --- a/sign/mldsa/mldsa44/internal/sample_test.go +++ b/sign/mldsa/mldsa44/internal/sample_test.go @@ -12,94 +12,46 @@ import ( 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,7 +104,7 @@ 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[:]) @@ -200,7 +152,7 @@ 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[:], diff --git a/sign/mldsa/mldsa65/dilithium.go b/sign/mldsa/mldsa65/dilithium.go index 9411e84a7..7d6312a15 100644 --- a/sign/mldsa/mldsa65/dilithium.go +++ b/sign/mldsa/mldsa65/dilithium.go @@ -1,19 +1,17 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. - +// 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 ( @@ -51,20 +49,59 @@ 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) { +// +// 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), - msg, - signature, + 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 } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// 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), - msg, - signature, + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + _, _ = w.Write(msg) + }, + sig, ) } @@ -144,15 +181,17 @@ 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") } + if err = SignTo(sk, msg, nil, false, ret[:]); err != nil { + return nil, err + } - SignTo(sk, msg, sig[:]) - return sig[:], nil + return ret[:], nil } // Computes the public key corresponding to this private key. @@ -180,3 +219,114 @@ 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 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/mldsa/mldsa65/internal/dilithium.go b/sign/mldsa/mldsa65/internal/dilithium.go index 7869d0475..609ab3a4c 100644 --- a/sign/mldsa/mldsa65/internal/dilithium.go +++ b/sign/mldsa/mldsa65/internal/dilithium.go @@ -244,7 +244,10 @@ 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 @@ -262,7 +265,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 +282,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[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +310,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,16 +330,14 @@ 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 { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) + _, _ = h.Write(rnd[:]) } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -373,7 +377,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, sig.c[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/mldsa/mldsa65/internal/dilithium_test.go b/sign/mldsa/mldsa65/internal/dilithium_test.go index 825e7da08..47f53d3a0 100644 --- a/sign/mldsa/mldsa65/internal/dilithium_test.go +++ b/sign/mldsa/mldsa65/internal/dilithium_test.go @@ -4,6 +4,7 @@ package internal import ( "encoding/binary" + "io" "testing" common "github.com/cloudflare/circl/sign/internal/dilithium" @@ -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/mldsa/mldsa65/internal/params.go b/sign/mldsa/mldsa65/internal/params.go index c7872fc11..8a1f866e6 100644 --- a/sign/mldsa/mldsa65/internal/params.go +++ b/sign/mldsa/mldsa65/internal/params.go @@ -4,7 +4,6 @@ package internal const ( Name = "ML-DSA-65" - UseAES = false K = 6 L = 5 Eta = 4 diff --git a/sign/mldsa/mldsa65/internal/sample.go b/sign/mldsa/mldsa65/internal/sample.go index 62c261332..b37370a4e 100644 --- a/sign/mldsa/mldsa65/internal/sample.go +++ b/sign/mldsa/mldsa65/internal/sample.go @@ -12,7 +12,7 @@ import ( // 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[:]) } @@ -251,7 +220,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 32/8; 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 []byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() diff --git a/sign/mldsa/mldsa65/internal/sample_test.go b/sign/mldsa/mldsa65/internal/sample_test.go index 2059599eb..32931c94f 100644 --- a/sign/mldsa/mldsa65/internal/sample_test.go +++ b/sign/mldsa/mldsa65/internal/sample_test.go @@ -12,94 +12,46 @@ import ( 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,7 +104,7 @@ 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[:]) @@ -200,7 +152,7 @@ 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[:], diff --git a/sign/mldsa/mldsa87/dilithium.go b/sign/mldsa/mldsa87/dilithium.go index a0aa0cf99..0c3c2ef7b 100644 --- a/sign/mldsa/mldsa87/dilithium.go +++ b/sign/mldsa/mldsa87/dilithium.go @@ -1,19 +1,17 @@ -// Code generated from modePkg.templ.go. DO NOT EDIT. - +// 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 ( @@ -51,20 +49,59 @@ 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) { +// +// 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), - msg, - signature, + 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 } // Verify checks whether the given signature by pk on msg is valid. -func Verify(pk *PublicKey, msg []byte, signature []byte) bool { +// +// 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), - msg, - signature, + func(w io.Writer) { + _, _ = w.Write([]byte{0}) + _, _ = w.Write([]byte{byte(len(ctx))}) + + if ctx != nil { + _, _ = w.Write(ctx) + } + _, _ = w.Write(msg) + }, + sig, ) } @@ -144,15 +181,17 @@ 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") } + if err = SignTo(sk, msg, nil, false, ret[:]); err != nil { + return nil, err + } - SignTo(sk, msg, sig[:]) - return sig[:], nil + return ret[:], nil } // Computes the public key corresponding to this private key. @@ -180,3 +219,114 @@ 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 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/mldsa/mldsa87/internal/dilithium.go b/sign/mldsa/mldsa87/internal/dilithium.go index 7869d0475..609ab3a4c 100644 --- a/sign/mldsa/mldsa87/internal/dilithium.go +++ b/sign/mldsa/mldsa87/internal/dilithium.go @@ -244,7 +244,10 @@ 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 @@ -262,7 +265,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 +282,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[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() for i := 0; i < K; i++ { Az2dct1[i].MulHat(&Az2dct1[i], &ch) @@ -307,8 +310,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,16 +330,14 @@ 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 { - // We implement the deterministic variant where rnd is all zeroes. - // TODO expose randomized variant? - _, _ = h.Write(make([]byte, 32)) + _, _ = h.Write(rnd[:]) } _, _ = h.Write(mu[:]) _, _ = h.Read(rhop[:]) @@ -373,7 +377,7 @@ func SignTo(sk *PrivateKey, msg []byte, signature []byte) { _, _ = h.Write(w1Packed[:]) _, _ = h.Read(sig.c[:]) - PolyDeriveUniformBall(&ch, sig.c[:32]) + PolyDeriveUniformBall(&ch, sig.c[:]) ch.NTT() // Ensure ‖ w₀ - c·s2 ‖_∞ < γ₂ - β. diff --git a/sign/mldsa/mldsa87/internal/dilithium_test.go b/sign/mldsa/mldsa87/internal/dilithium_test.go index 825e7da08..47f53d3a0 100644 --- a/sign/mldsa/mldsa87/internal/dilithium_test.go +++ b/sign/mldsa/mldsa87/internal/dilithium_test.go @@ -4,6 +4,7 @@ package internal import ( "encoding/binary" + "io" "testing" common "github.com/cloudflare/circl/sign/internal/dilithium" @@ -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/mldsa/mldsa87/internal/params.go b/sign/mldsa/mldsa87/internal/params.go index e60c4d35f..b5dc669ca 100644 --- a/sign/mldsa/mldsa87/internal/params.go +++ b/sign/mldsa/mldsa87/internal/params.go @@ -4,7 +4,6 @@ package internal const ( Name = "ML-DSA-87" - UseAES = false K = 8 L = 7 Eta = 2 diff --git a/sign/mldsa/mldsa87/internal/sample.go b/sign/mldsa/mldsa87/internal/sample.go index 62c261332..b37370a4e 100644 --- a/sign/mldsa/mldsa87/internal/sample.go +++ b/sign/mldsa/mldsa87/internal/sample.go @@ -12,7 +12,7 @@ import ( // 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[:]) } @@ -251,7 +220,7 @@ func PolyDeriveUniformBallX4(ps [4]*common.Poly, seed []byte) { state := perm.Initialize(false) // Absorb the seed in the four states - for i := 0; i < 32/8; 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 []byte) { // SHAKE256 domain separator and padding for j := 0; j < 4; j++ { - state[(32/8)*4+j] ^= 0x1f + state[(CTildeSize/8)*4+j] ^= 0x1f state[16*4+j] ^= 0x80 << 56 } perm.Permute() diff --git a/sign/mldsa/mldsa87/internal/sample_test.go b/sign/mldsa/mldsa87/internal/sample_test.go index 2059599eb..32931c94f 100644 --- a/sign/mldsa/mldsa87/internal/sample_test.go +++ b/sign/mldsa/mldsa87/internal/sample_test.go @@ -12,94 +12,46 @@ import ( 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,7 +104,7 @@ 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[:]) @@ -200,7 +152,7 @@ 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[:], diff --git a/sign/schemes/schemes.go b/sign/schemes/schemes.go index 66ee61253..1abdd9532 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,13 @@ 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 ecf119605ff28587f34d5fffd7e0a9ab8906b6be Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Wed, 25 Sep 2024 11:59:20 +0200 Subject: [PATCH 04/11] ML-DSA test against reference implementation. Fix one bug in key derivation. --- sign/dilithium/kat_test.go | 15 +++++++-------- sign/dilithium/mode2/internal/dilithium.go | 5 +++++ sign/dilithium/mode3/internal/dilithium.go | 5 +++++ sign/dilithium/mode5/internal/dilithium.go | 5 +++++ sign/mldsa/mldsa44/internal/dilithium.go | 5 +++++ sign/mldsa/mldsa65/internal/dilithium.go | 5 +++++ sign/mldsa/mldsa87/internal/dilithium.go | 5 +++++ 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/sign/dilithium/kat_test.go b/sign/dilithium/kat_test.go index 3bb9adae1..35571dfea 100644 --- a/sign/dilithium/kat_test.go +++ b/sign/dilithium/kat_test.go @@ -24,14 +24,13 @@ func TestPQCgenKATSign(t *testing.T) { {"Dilithium3", "8196b32212753f525346201ffec1c7a0a852596fa0b57bd4e2746231dab44d55"}, {"Dilithium5", "7ded97a6e6c809b43b54c248171d7504fa6a0cab651bf288bb00034782667481"}, - // TODO Update to final FIPS 204 standard. Test vectors below are for the IPD. - // - // Generated from reference implementation commit e7bed6258b9a3703ce78d4ec3, - // which can be found on the standard branch - // of https://github.com/pq-crystals/dilithium - // {"ML-DSA-44", "4657f244d1204e5847b3cacea4fc6116579571bee8ac89b8cba6771f303ee260"}, - // {"ML-DSA-65", "99a95d7ef804020a666f455c5003232d0c0200dfc4f5df85dceb8f56256dcba8"}, - // {"ML-DSA-87", "3377835fffb7cf9aac52947225c8974335bc05532ddf672a8b706ab8991435a2"}, + // 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 := schemes.ByName(tc.name) diff --git a/sign/dilithium/mode2/internal/dilithium.go b/sign/dilithium/mode2/internal/dilithium.go index 609ab3a4c..8f1c8e5cb 100644 --- a/sign/dilithium/mode2/internal/dilithium.go +++ b/sign/dilithium/mode2/internal/dilithium.go @@ -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]) diff --git a/sign/dilithium/mode3/internal/dilithium.go b/sign/dilithium/mode3/internal/dilithium.go index 63f53a966..0f9b76dae 100644 --- a/sign/dilithium/mode3/internal/dilithium.go +++ b/sign/dilithium/mode3/internal/dilithium.go @@ -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]) diff --git a/sign/dilithium/mode5/internal/dilithium.go b/sign/dilithium/mode5/internal/dilithium.go index 609ab3a4c..8f1c8e5cb 100644 --- a/sign/dilithium/mode5/internal/dilithium.go +++ b/sign/dilithium/mode5/internal/dilithium.go @@ -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]) diff --git a/sign/mldsa/mldsa44/internal/dilithium.go b/sign/mldsa/mldsa44/internal/dilithium.go index 609ab3a4c..8f1c8e5cb 100644 --- a/sign/mldsa/mldsa44/internal/dilithium.go +++ b/sign/mldsa/mldsa44/internal/dilithium.go @@ -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]) diff --git a/sign/mldsa/mldsa65/internal/dilithium.go b/sign/mldsa/mldsa65/internal/dilithium.go index 609ab3a4c..8f1c8e5cb 100644 --- a/sign/mldsa/mldsa65/internal/dilithium.go +++ b/sign/mldsa/mldsa65/internal/dilithium.go @@ -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]) diff --git a/sign/mldsa/mldsa87/internal/dilithium.go b/sign/mldsa/mldsa87/internal/dilithium.go index 609ab3a4c..8f1c8e5cb 100644 --- a/sign/mldsa/mldsa87/internal/dilithium.go +++ b/sign/mldsa/mldsa87/internal/dilithium.go @@ -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]) From 63eb44c008823d2a2f9792ac655562f40bc5bdc1 Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Tue, 8 Oct 2024 12:40:17 +0200 Subject: [PATCH 05/11] dilithium: remove unused AES code --- sign/internal/dilithium/aes.go | 46 ---------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 sign/internal/dilithium/aes.go diff --git a/sign/internal/dilithium/aes.go b/sign/internal/dilithium/aes.go deleted file mode 100644 index 895a20597..000000000 --- a/sign/internal/dilithium/aes.go +++ /dev/null @@ -1,46 +0,0 @@ -package dilithium - -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:] - } -} From f1674c777aebcf21587cf8c621e49bc36707a337 Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Tue, 8 Oct 2024 14:33:55 +0200 Subject: [PATCH 06/11] mldsa: add ACVP test vectors --- sign/dilithium/templates/pkg.templ.go | 16 + sign/mldsa/acvp_test.go | 276 ++++++++++++++++++ sign/mldsa/mldsa44/dilithium.go | 14 + sign/mldsa/mldsa65/dilithium.go | 14 + sign/mldsa/mldsa87/dilithium.go | 14 + .../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 11 files changed, 334 insertions(+) create mode 100644 sign/mldsa/acvp_test.go 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/sign/dilithium/templates/pkg.templ.go b/sign/dilithium/templates/pkg.templ.go index 4ad538565..f07a08ccf 100644 --- a/sign/dilithium/templates/pkg.templ.go +++ b/sign/dilithium/templates/pkg.templ.go @@ -114,6 +114,22 @@ func SignTo(sk *PrivateKey, msg, sig []byte) { {{- 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 }} // diff --git a/sign/mldsa/acvp_test.go b/sign/mldsa/acvp_test.go new file mode 100644 index 000000000..b0b78068a --- /dev/null +++ b/sign/mldsa/acvp_test.go @@ -0,0 +1,276 @@ +package mldsa + +import ( + "bytes" + "compress/gzip" + "encoding/hex" + "encoding/json" + "io" + "os" + "testing" + + "github.com/cloudflare/circl/sign/schemes" +) + +// Implemented by ML-DSA's private key. Allows us to access the internal +// signing function. +type mldsaSigner interface { + SignTo( + msg func(io.Writer), + rnd [32]byte, + signature []byte, + ) +} + +// []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 + } + } + + 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) + } + + scheme := schemes.ByName(group.ParameterSet) + if scheme == nil { + t.Fatalf("No such scheme: %s", group.ParameterSet) + } + + 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) + } + + scheme := schemes.ByName(group.ParameterSet) + if scheme == nil { + t.Fatalf("No such scheme: %s", group.ParameterSet) + } + + 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) + } + + isk := sk.(interface { + UnsafeSignInternal(msg []byte, rnd [32]byte) []byte + }) + sig2 := isk.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) + } + + scheme := schemes.ByName(group.ParameterSet) + if scheme == nil { + t.Fatalf("No such scheme: %s", group.ParameterSet) + } + + 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 index 866f8b6ee..497e2c769 100644 --- a/sign/mldsa/mldsa44/dilithium.go +++ b/sign/mldsa/mldsa44/dilithium.go @@ -82,6 +82,20 @@ func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error 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. diff --git a/sign/mldsa/mldsa65/dilithium.go b/sign/mldsa/mldsa65/dilithium.go index 7d6312a15..cbbfb0d09 100644 --- a/sign/mldsa/mldsa65/dilithium.go +++ b/sign/mldsa/mldsa65/dilithium.go @@ -82,6 +82,20 @@ func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error 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. diff --git a/sign/mldsa/mldsa87/dilithium.go b/sign/mldsa/mldsa87/dilithium.go index 0c3c2ef7b..1f17dce37 100644 --- a/sign/mldsa/mldsa87/dilithium.go +++ b/sign/mldsa/mldsa87/dilithium.go @@ -82,6 +82,20 @@ func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error 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. 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 zcmV(lK=i*KiwFoD4+Uoe17&z{Wn*+@WKv~wb!>EVE^2dcZUC&ENvm$nd7kI_6+&YN zR;^mqWmc^*BoOd0BNHo*a3f0P6ywBPjh655$#g|CdB%Xm-c?|VHv*R#&9GpEtl?sGgXgwSGNr`OWH zRqCmmd*-)?`L)$6ms%~gUCzTV-zUy5nA^_uKb;v zYh1mxJ$nl8`;4d0{#IV+Y3-!1%;zn|H!iDwJvINfSLwC4H^(?jT2Gm!#j^{qHWHs2 zC-;!{4qtl8PMa4vJVyT3)B3FCEj_R2d&7AqkN@oVj5FU5S3F~t=X|G?{LVekd1KgZ z*3Q2xzpiXXD#KUde>=Zy(VpXc&r{#p#);qe#GDg5*B}1BQm=_OdQWSkkG50f-)GD@ z&-ab;%_p?XYkVoaWlwfEuO8m|%x@3g`f2m*xaT*%7M_vcJz5Q^e{W)&+H>aDeeUtT zsU$=ooS8Cj9BSER@x{H**aI;MW3@05f!%X&fj#HyWo$O>jQ)(%B70U?v^5`A^_#u7 z!M3uAZ_D|dzzv`Femj-6KEL!1WT2#!*nW0$KTisAm#4DSW6Tl)pL%!6UrU8czWuEE ze&dvn&#~vZ_LbMjA;eL5z83mv>&f9qYFCa=EhQ(m>itd#gOyk_auwd;c}|X8=x>id#`7rsc(w?#5XrIJ||Wzm&1;heZG92C%>sby!^!6?A6B` zK7=u00@`|!g)g$6TzJo?vz#-By}$96HUoyJ^WVY>nuv?+t_No)gOtbF@Rg)PX) z$rH-Key|n@8$WC1eO7qWKvW`nGh>ciztpGZ#ZF@?LhRUxS`kW&-1xZM;%94M0zz4A zPknn#VKmn5#{!_o9!8d@{4yJf!eFQ3 zi(K<{-kHt$5bLk9D7^a0tTZb1p4lJtkHuv#8=|yJIVWaT54FMogueIOi`NYwCVH{j zA&Rj1C(VHk z=|S0P6} zGHb971|9$VvWf|Ju@Of+&6_tKrhcuy*l%U-eb}O2)`!yQ?lGX4-3OzOrC7KT{Fb(9 zr4ciBoqc6l66QJLe}|6x!Ki+yY{R-l)bRUqM~^CN^Tn6z9o)xZ8_V6v6Lub`VS84J zna?A^@0a3Jc+?q2SH={S@cmdIOe$k47xn zU?W1{R#?oQo*1#Bm=K<}g^iiRMB?v&a5Yb~mqqWa>5A*Y2e1)9!<^X&tWf+xu>XoF zfB$cSDY4HZ;l;n4Qr`O=<;6;4e8vEh@x*ImW6wa+*_OzEvullLeU)uMryKef^3!+1 zd>8ybs10zo5{o&J5&jy(0tmVuIJVv~5?=*PHr5Q?LKYLx^n!7YGBRSsMk&MqHZ&D0 zSG9>5TawaHb+OP`od<)5Cqu_O_OU*=3d}k0#yVhO04y(%xjpZPp71gLgD=1M1V4Zp zbiRboz>hxKaV7J^7&c%fi~Qd2!`g!b0iU(_jhy)-qz_ZvpAax3UkUhj zkO?mE{QwYvrl-c3>j#!dNH-n;XVCD_*x|oBb1F3@Vu#6ZOpaT!fdbP&QdF|mReYwa5V*z;bF4>Ehm&XSvVRa_bfU4w- zyRH$F{pdeG6b-Y*?qi1nmTK(~9)1cI`*_uW8iHhA90|TE-M4!#l&WCrh{+8d$Q~*m zcv=dIgIbQQ`qU4eidRgmdwTgda)Tb_cUAoO1HSjOd_=$gz0o_s8(gM>zxxIc_f)O` zRl!nYUOsrs>iurTV7JADeEdO+bXt-vqe2r@?`ft5i+ zggWB8Ue^poWPiC$1zho3n8gIjsU7{`0enx3oKT7@jKuPq(o$ZD4_3PQT}`b)@k9_U@5FPix-BfRqtJE0;IKKYvlgq~L0)V?*_W%L7=LTvc{H#5s z40{L%1gocf05a7j=n>PEF^#wc1o%zx@=&p*?EGXO00TI7_u@V+$`hp&R`u zc=!dlJ=7juo3I8zSU*omDd3Z^dbj~}0eyrj!$WE?V9|=k_?%RXo6WmKn0&H7dB>O?gl+?CY zVgn-#f+fTzfizhbkU%tg1yuRKT(baWa3TQ^h)N4Q7N%+d#{mxs6sv+F?WG8yaK-rR z(1FA$?UGoG6$|qCJSC)h`dYB$biSB)G2X7HK2OBf*0`Vy8-#XUXgts&v;xx!P-AC9 zoGXASA|$QDL#iQbof{8y+dMjy2&+cn5SE6NITq0i*GL<>jJxVynS~VAO0L?x;8|+Ucter+g zATUTu-CT9^`wH1A;G2Ywbrcnca!!CV@jMvVC+hq`PT)5T2{5d&se1u;p^@Cghj>|D zK34z=kRFx<{{=cNH@y8Bp+@O=tbkF}k3}#@bGUB#A^rJetz*gOs<<5a$n^k~ln-YFVA#aqQ~>}3pG z24o52i;v^d2K$Vb&$$x#8ll#dY;E3$IXuvVsy{GpY0hB-2^ZhRrHoIhM5i&q0NOkt z>qus;JM*GEQo_ZHG*F|ySW*lP-e74;4uGY=3SZ0{kh8J5rEj(g=Le(gQj>sZz?mBN z=CNV^NaN%YKpY#P3D9_KcNlr&_hES4em^|2kPG9I-oxU3^}a0l4z0v1K|l-Q^aa>D zKp2*8{1E4j;hvc3dwI2NEVdJf1jx*y-Mo3~m;L4zsBi+Vl-O8^{=G0TLoQC)BH-h#W z>K`4rgQD!TzZ-u`OIm$BdYU)zjA)4pUX4sfzR`aa4#n!Y$%FOgDbfKJm!|-uVABi3 z2TWiQrcrnk5LuJ4P4RpY>B601)nGrlfausmOxom=LN@dO4zk{Oumk3i@WMQvX*V!6 z3u~qb7nJJ-`yn45N^$^wZ0~d0+-v|qsGcl!TD@lQ3QwqI1*7i{pgBNctPd8!81BK3 zV}%7Jp@6JD;MEwo+JNA%Po?A!j0iH4`D<&!3K%sa(^;b42UZz^7FZQPjz*+!?g2U< z+xXs-TM`lud?Z|qD{Pp3fwW=kky{`>(%?8(UM`&17vrOOOd3k{zp9RMF>evJCiqik2 z9N2StQo~3?j>{UR!B|lJe*nevBe8N9M=o3fk_Y&Kw`-z~K^yi9{q8-)vJpKT8N!bD z2FHQ&fEG9&tbG9u6y49KJhcbAKGrDsRDd3^4(-M*R90?HRXj*AQ66C0$4(9Q7R-Wv zeIoA%GlK_@7?5dn9C6%6w(5f!*{P!;=y_WO(fTft*ha{WS%5y;um3e9_`m+-|C^A0 ze<2}_=z@ezo0^>j9Y6yy)8Gui5H9z@a>wt8H0LP(3hin-1a>rHaKUsRtgPVRo@Ksj zvQJsKmkdZ}*g9%~H3qSy2RS(l{=vqzucsZ)CuL5jwQ?pd3)=)nKrm6Njl2lvjHti> zqU2CV)gtBK*ko+Gnx>7(df>hiGVl^?+kUkT@tDFZNPo zHbLt^vpH~zc>1XwDpd0p4i^L9Jh1Z#@R-IdLNm`BhX7nA zgwn64*JMTapmDt0NF-%qHgn5 zH6aGPpUxfe?5J`b?9L~?#AAcg(M$jH%tru`0(857j7UwlP>~6a9?PwMysDA zUdG~M+i}C77;JfyFPSb2XssC=b}vUh{i?4M6abQZa889ifE-u~V=$Tqx87@9;qS;Nyr5B&|=r3{{9cXZ>xf@bh`$;BvhE9{u0?7CHHXI&rj!^;2o&e0`U2)QE_Jopa&R|%WAL|1U zbmOMlKa>awxV8c(0t^O79c2p~fCD#`1_Y00Igl&eEzTMv2^vDEQspi{MpJVb1Ktp0~ANNFUg^L5X5CVYE;hP>97l=x2g5L@Xo^z>Twco&az(@{5&D3tux&U{kUeK%-cVWTX`a z4GD#{J_(dp3_7Dsi8VF~!Tw02myu`S3-{_96u|A?X#yXtH)a&bAN(Xw4^vBQ5fX?U z32c4`i3R9k=kL7fS`B+Y!hX&Ec3dLd1+3P_qlM=!ar+4Ny%_J0!2&e5G&_Kxr~YBm zIc`5@o#f#M=wdUyyV*IDh{V0(WqaK4%p!jaMG>q*5r<4H+f(8phc|X7;PYxh? z*1-m%9MCHC+Bzo?T5jHBe(T916D@V!FTw>F!c>E+@C3k12oJA{70rER3^5BPfUKCv zFd>G=f+?5{u=MGtbpL>HbYospMP6`y1yl(@3vGvH@~*n8OZ8uoX~^`aB@$Dg*(H%cEt>1iUFMs`vUjfYzS)I-&$%rK97 zaJ{^fMit4nDz0nSQ1E#Gzjfa_Dkuj_0&K_SVv0cc8SlRu$_SYKWa_~6QED?{4vlm1Hy=|2`zmO8-FICo(E>uPPDXW;}uZcyVG z(6ou8WLa5PND4$4|G01c60-63AfV7cBblJcdj-tX6Ej}1fR(29I2%HP8YLuYgcq3s zWSI!c3TOk3n+q$lX#^d3P)!}+QsKQOSDR%=37dq+PtTV@fUfGNrwdm&^r#Xc!#sk_@3s zp(B9UBzbhPCH>}fSS@qG5=%S_n~?)>19?InfCjI5OngrLOgtOj!u@>@q6)gg0r8+g|K1+`I2(U20$m=^L5FDX}%s$ z2e^LB2=`|F1~?6{iiJnt*^@13fd6sLY7u14X>s3LrT@r07KcB%Z^mIGjYg81*>BUO zX3T>5@gz2lpRp9H3}6w!eb52>3Kue2ZB7^i#4Dzo*aq9T=O(1zx=kdtoBL;lBlgKW zH5S`oHILHG#wR!`6a=>u-5d57w$3X;u7Vgif@4`#vtu2_;|6T?8*Vh`H8A`nH5QRG zg81BmKm`L{fM0xM6-L!e$6E@AckxL+jC?bh9fvviamyV(T_7*a1E2aB{R+PsH^3r0h|x2v4>5S3B0 zqinF+i0rrtdsFfa$8Uhru(bTdcz91;wzSfxofYaD$4&0H@4`nX+aBQ59GefS6%Nb{VL^H{BAf>ErUE zWhRV8;g5QOL}4Of#PzAJ7eZws{IPr%xpNJ>F;5;&%EE)8JpMFeHob&8g}H6+7pr%z zROK`4vj~Q3E2yGTz}Miy!BR*pTtmViv+Wk>S^cp_GfH9#munb@@4TrGIjk6oT>{yw z6(znL7}5G&*6J09RVl2FACucObyx+TZz%b`r_BEQmWhAhlZKs*vg92`VZalx#^15q z>BT>`SNF>u&0xoax*L?j%W&@kXxLqgzZa}aRA==f`(T_0d~Wv9Vvh>pTmpxPZjTr2 zV$BDqD}}TLfRauL=i2iN2uaCu zIEl-*Oeo?RgYgzjIjDx$tg8VT@SZjAX;Dh8rEDwTMX<}V)*6kk>^ZDwHQc?-*!Mh4 zCt~|hJJ3vVF}a4po5CyY&tO_K%!15Y1s#3+_p?-|S9cyqfki?$Gh~Wq$Rk1mhLzs~ zmyIN|-Q^7P0~VE+EeU{VmEE>h0_`&1X_mh57S@dbI3kpEf}A3x{@u`KbaTVCprufD z3j|<}U?N^`nWQb?rDVm?Yn^B}OJ(7Z6+@{42O^xSLD(xou?)5tltD?RKi@oL+@Q}J z;(S%`Z|vH0Kjz4Ag7r+)T^Oc2A9A96Dq@1S&nC0@|jXF zbk(!*D^^)t(Ge1#d&C#u_B87o4WB{Ir43k2I30|ZHGbgZDDVsB4EP!NA}sjhT?bp% z#s`0Q4YKsw&JtiKen!DuR@}m&7ij*uG!8gt^%>A6_ij*szYvSDHVEWn?F;5-?_fz@ zer34TY$%I`zXdFTCG!GLlvKhlreg#>)2I8gaV8`Q;Q;wSPtZqmuRk?F=-OBCa2TV+ z)zhwVl&o3LsR6f;=mUbp=As#*iE5pWbrZ)r`rNSQ81KG#q7!ccT*cS#$9hq?{)>{s z4IYH_0Okv(z7B+J)MVcV`gq`vcrv8oHnHHTM&f;|6bCRt#_9o^0hVd^ zer(ZTQP^zEc2u4KeQb>72B99VoOv2}{bNBu-P%J%j5R~0hQ(tG_KwkXm$m_uZ3WZn z( zk7yz1kF{sR-0uNSVla_CD1ASJw?D=j$FT;^w7b;_XuG9JRuz`>F6d!?#va;XXc~_9 z<6;$6DMITB$+?w=!Y$r}pY3j{r_ZEd>roIDD_N`}opoEykYRPmg88s+4c_E>5Ypva zf#V0J?R7bTQ3VpV*FZ z?Cr7#ZCHP;X)HIzHEr!Oi^3=Md?3qbO;+*N#z6VgYitc_wOK$s0}m4IV|qXA5xe9= zZM%zbN0ySXX{~aP+3@2)8GDCNbm8#<@GeO!2#Q^XaKO}zexglZ*u7y}j^)EpzV9_F zR510COH7O@EF1e6CqAoV4q1uO0lKidlOgTTF}a|Z0Lp7hF|(jRWEIgIn7NFB*mEI5 z*uV^vLc$vc-oWd@YuLAA)wvN(5DNYX?Z>(V4Zf8eSXn>9zvDNy1-0+(eKY5qq#>sm z=Kx3IO@P&MymbRahy(h*4cLOW@CK|x|5CKJYlRZSIG0+UwX$_hfW`zQiKcu@1m@e! zfICUwsRn0nwT~4$$afe3=ymHvEPq6E&hE9`Tr0vC%}NyO7H~vq7}bRV*j6zC7tvlj zHU#~>HDRpogF>Odx7Q0^bxVnxc>1|)2!{Z0J1+v7%jDO6YZU?{&Z;Q$DE1aWbv|}S zT!XE-v0mUbkOjkKjcxAdr&%fBgOim(@Wh=Xb{Ab8AjdJH5O09i=laSXJz~gbxG`UY zsN!B+xg2*{B-9$u4rt{uGQcXmKrK8J{$%1tY*e$v;@Gi;zv6u{7g-l>4GFjH*6Sf% zmP4KbM2uLMj#xf$#nKpl0h01qWukNkzrb7Ib&+_`FGe5tfRbV`z&A+3KmST4%}C+rJL@tEd@ zguub$IH%}#%dr<{%a3<>i^(iZ{2c2RfS7D9){Dpj_tWf{2(ei$KV3;IzLl$}by`;3 zf}il<5hnv@#Uw?`F@$Edm^|nhJ09A~e6Ydw9x($M! zLVGx!1@F;Bdg~3@#PHyqx|ws+|Me3(+r)@{K=an^GJF0~=@GcfmhmZI(Vh2Oww95-%c|2kzy4YYH(F z%_d+RS=xp5xsk;`I3XQ>sYAN14o9$Y7FB`)jAwvB@Q&@VaVBOXIl*#jKpIv&T1E^E z0gVkrTe{6&;*OpHST?WP2PPQ=cd#h~lO$JxK;4o+{H-<{8OILso@Zhcqg+rHhCjoP zm|_@MP2aif7g)0m0$?I6NiQZ}QF`mifP9i^?H&fg=ochoLF=Q%Q9D_44wD5U-DYf% z7ibEC1lnK|jf>U~+-uY%*>F3w6B+$1Nsb*cQu#7Uw#nQK*TTI*M8KiAq-g>NJp%?d z9AANS^H$CDeCciw)(bmw`Y`NzY!!k_+sTMKf8pZkt8yaL@I;gc>pZlZ1+n0@^T0l! z7m~neaD&@IA*|eCnfd23R6i0P0V`@*KDHrG%js8rBdW5BA#wdBI}9Y+wkVxtKQ~@( ziD2+hFu#?opT`aBj1rc)CL5L5^x5$nmTZGLq4qfA>$HJmASvN6zz7?S2Ey9_rdHU4 zG#WlI*}HIoR5E*p{jBDYKtRS|?8D9Q7%bv8zYg6h!$1kBg+=F4Lj8)(m&=w&kh;|Y zuN8N;tKl}G!RASQjls3Mcm)~5_1YK}P%5n4V&m#u9kUb_QJFrd|N@Zk+D-bt02Ws^h z42KkaI0WPvgKCk%N!>{Sh24Xxqdh6x3u!07{@#4lS5Tw;_SGR&5kOX*e38cq3N;2x z`p`r(WxI9p3?lFZYxzKDtd2uE4t5#y7tLV<3?a?8vfGvdIEZN{Fs20FOlqz&?7WN( zKPO^=b$=EbfrJ9aY7g@U6S9rTF*7EJvEk7&|2eK7Ikpz&>AfJmG0vKtA_1GK!Pefy z6<=Gc8*gN9Vtd(aq&hD#WhnML>|?tJl8$sg7J8cQG!FM3Fl&YDCd?n0tH59&&SNa0 z3n;~~1-Q0yWt2I(*au9sg)oqERJMKW2)ywz^i<((rZ5(U);vNl=G((E~D>;k^?>AcBTfK5EpTO<_Op#c-5U`*?^ zo-7&zd926cQaChoJ=5mSvTTnu)xYe+X8o$!iiLi%bGX6pdCh4%xdXj(ihw%U9zY2S zwQ|WZ4I`p;@3E|}20hxMVzeY5UWT=*&TMc#z~XEDSdjZ+3l6lyPI)B2@Y=zu9|I@` zjIee9ZFZLR#A|Mcx;!?pKW{HOZtFEWJaJm+b-LqRmPMtQ^iMv?>tc#qg+M|fVFumD zZ|JnmGfu_$-gT4s03XLafIQv!0OXASK`$)Ne@oyBLCjNAZT zI9OU}+B-2O_I+XJmd0x*0Ad2$H=A#3`?iBcu+>-@(3GPSqSHz?^cjl$-V|dG)+5{d z+u&6eVt-Ezu-KSv{H%sFtDV2Bk!cURK)JD>zo|PrV(q>)gcmH#;PW%!T&D>kQ=1j^ zFs*v2wwPKG^_U);W~-{EifI9odtdTWWTxaWHXu@{W%He zHEnDotJOK+rSL)CZEbd9NB%@mz&Ur)l%5@2I0#dU)0q8(n7VqVz{6)3zR?2Ey9M;< z+M9~#9)EvJF<8{e<0Z3@RhYu^TSCVZj@P<_SJ5owB-W;1`KT9A<;rFIEh2jX}m6aVb0 z7rv#(8G`kiz@5+Cezg3#8Qz6I`<&r%Ybk8Vo_1X~^CyPQVOaCd>}pmme7+qk?>H^4 zZ<5}5QD#^9NeQgX?F$b^P~9(UT#Dm4jJ<0rK>1b$FJ~tp|5KclU55vr!e?0J8^E!c z>YAruX9N$9J*}YPSL>uHY9_f~t1>K$F;i^c3VPapg5j{9W>ycCUc=RRa5emi*4sd0 z7yEOQ+!hK&J3p$lX4oTsyW6uZ`BrK8tr(Qv$6}HEx%ZgZ#~%HTanhL9TfF?)c=6t4 zvU6I;5N@w|258&X#no9`?0|J27KmWw9?KGuinYwX1)H;-&}Oxe3idsBvf8@S2$q)3 zUd$*xNA2=+JNq4?lN|2TSbj{#vO^QSvY93B-P6LAnn&hU=6W667HyjpZQ+n^i`K^U zVmTZ@6nRq~foC}o8vq&57Rm>icd!9|iiPUHi(bGA2EMSZ#o8R}g)?Mh?g{|?U>+Fe zVz!_iX)8BFBTXXMZ!)4`_2Rl7fu0#C{_FNKm_{>cS?5> z9UPH=quUn57iYT#o}{-MA;y#(Fl~XD!fUMz+fRVhsKs_#pMm58hKJRys1aO1KV5%RV>wJ%#It2QeQ!?l~=!QaAmFpBeVO0;IS zfKB?y>#S*V40 zvpX5MZRp8L-3j^N!ylmD5HA$4y(8E=WW@tN+Sw?htQkfDn&X4eoO-)EKMRX7x^JmY zD&p$xI8&=0M@gYv6Z%)me#-{dn)e3Ap#kUZ7UC7-7C#dRt zQ8rRu?_3v*RIvoo@l1KU*xi^soCMfgo*O}9oy#ljd2Np1A&=!5sFJ+dfp&Mw11h9H z!BmfW0L)Oi-jQ0kh}Aa$^~ZTHS~dwIAn#|o8y2EKR>0)CBHNFgyaxj}-SXOa>ll?s ztPNbm=2Z)n;kzb&5mK8N+8PhPtF;&$FRzPaYWex>9SzY$;of$nJt*AlD9~rRNCsMM zaUO_Q0gn_p!^<12>1>D3I!!2v1jDKd01K=Z`+~tv=Flz3hwDn1c$hPr#@a^OZC8S7 zULASRM>9GfV8bm%Vj%{ zmE`tl<5-GhA9BHuu|cOl*6cZQ0i$T+7&2r#JTx%vR?TVGU^uuN3PmRD^~Q0?=HcdJ z;uN`hb1>59%rh$_ZHcQ#19B-{v(yd@5fV@wvHE6>g&i4E)VjAPMZUP*#r2js@9Hd9#T z?dA!DbP*Zh3QOt&bhl7{Jra{Hf9R|;z(F66H}Bmkci0*Tj05qOy;cinRr<01%jq!L z8Y7IvaomvbGv84W{57O*uXV(B+i7g3AhL=muSKzg<$wYfXA?-OyjkBk04Sw(NE^oe zcFRYRr&0{F!s^;S&2;@^3p>9;7ywe)){rMG%kS}34oV$mTE%KmE<2QSIvVut>?G_g zI4cAK^4c4lZ=|juN}F|Xs8CXKfw;lMd6S4ZHnCXMGn$SJ>Lm;b`G`F6F*9IJ4Ff`J zxWg^_-x#JhwTQ)sS0feN^mSULV^Q%yIE|9+&*0^NUzi;us@Z@R`htvsiV>Jc2XRa5 z@{6ZIQj6sc5hR4qvRuZ%9{M+UOFX5>{UBMsF4W#WAN=LJ?O=Bj-pf)-47dDQr=;z+ ziWQH5_r)lskS+Y2+a3i_>{D;a);qLWPn(AqFNZJLhL@pGYZxdw*=91s42FUdi+ol}!*OoQX;F@=u!e22TyPB`(XerX zmjTJgpPbu+S!ZLmgL?w2{dt*F3uej+D!d9n6#vE=L~g;_?X)b)L0T*uY%H05MHUGO zsm8HF59xL4Lij1{j)<{KGmW~Qv@Nu1pv-PhBCh}`@kQdQGY?hC>Rm(x8N4Gb&@{H$ z44csiha`R8bLhZW@MM{jmPp$-dQvMedveL1t|>Ae229MK7^U_5;thSLyI5^I(lZvlXJ=7DX4?XKs=A7W+h)qZIHcN^F0C+lMrTxU4Fwq_K9JX^Lo$gQ{C;1x628a6oJe~Fr zJF>N6CpjDf?Ry-70|lFw(t}TjDF|7ep$~Jag3ZWf9A|aRV$|(SVVsmjm!KcF4$VB$ z;|+Ex?fk(B>F*a3(m3FK5*|*k$2(=vwB=9NB?Z?V>VcW!7uA_(!9f?>s{7?|;uV}n z0%yU(0iztdi8INMWnya>>_>FpbSGWg`_h7wZ8hf2LDlU26de|aukhLi83$$)cxe~X zjE*ilU;)*J>bYIJRG`%{r|1T-`wIPmrv_R|^h&cX^U=9k1I6KZ7pWN++Om}L}aqi~w+(>MQV^cm%{^?XKuF$#jFf{c1qVD&%Ne2*N}T5ng0ZPC zeGYH^vJ_`HX%zkMqH{bo{y5v$YN-S$A>O`A09&~+4^&#;<0KQCy|L()!LDq6A9{f~ zWEby9q5-Tx)+BbczMSfX?s+G85fami26q2f(Ii+nHxh&4W0 zx?Oz4aI*z#IYS06XQ$(N`gKrku?Cn=i@S{P?1Jwy8MG|NFvnqCsO4@zSEqXdSWKk~ zD{3=Ogbg_$VcRhwqWEr`YjKZqNhi@GhY-Hvkfl_O-(C4~q%4ad%18FA&7X*vv+T{o zRo5~&P0tEUAai%h({^#TV-$jb8&SYx*klQA=(hSg7#m#z=2>u&tg&fM><_{E;AwiT zIYwpb-z-${7y$#1#z&BO@IPn;TWu97P{kZ73&V%vGD3upcqbsq;!8bpEt)!*Ht54B zRJO#W+5@<~IqbLeEd>h>5O$}m9%8l$G5%ZPk1l<=q2 z=fT55f`|POC?MZL?wT2s?QnH#mT)8E%AcD{*xAd2D6cNj8WusZ^X9J6jihU@}Z3I4UPtcltzzvI-My%(kaW-RA| zp+5?VO*8!QT6MWax2+h`M``WID^|sRU+PBZI;040jZgWOwHm45!Ygb-j& z6R$jGK~TUXVDo`Qd=@SniLLv!Cg>bJd=~cMhVgw6@Z-v6#|C5O4uFIMH+Czn~c;CcM#3dpk#uoxRRF z1v#=cy*Yltw4coRaqfR}Xp=243p<0+z-B&ST%;ebK&skIUZ8sZ`Jq^Jm>w7ug?b)(DReZri$(fp1nQH`7 z!hXw^aC4>tug#BeQJwm(Orn80(azEQQ;p45i_{BBG2oFE$`d3d-x ze|no|ET+Rv=U_}talKiXP>Zq0=LbUYudc%u#at_o(ayk1jlh-@@>}I=Bco5>fI`WoVh)h zMK!+1v@V7rH6EfN(8iOhc{1g}ssWbJs#S{#SQw$vd(+wTb|g>N%7g$G!x8JwPOc6@ ztY#7&po&wmJ@$6=+6SL4DX@mu0ocjJCpYSN{&c4u2ZzHy$u-Y)yUgY<-z*+@t;}P~ zlTYlVF~_@aqbzo*rYD(MtGCd-noX9`vHX}DJZZhN*sa;PJ?E?#?||(w+vUJ5Lw#;P zCd^{odgq>-Z#SDhgPBJFj7`bY^MA|(IZHk`)ZYS3_~JDCVKUf`S+lFis@>{#9=qn4 zA7e^fAIl0zdz`k7nRg&Ia`duyck=qI&N^?l-Vq9z^%}*mUjLe z!BUiVIL@;0-X5J`dcNB&_eNL1;z&=CdM%x^dc?t8&M3vSVLospIoL$(=yi}_u&vsP zlG{J!WCdgri*Y+OSeoisY}2`pelt;xa$4^9HO+3neTtAl^l;kaX>Z<+F%+QT^C$4^+42)xl(nzr9qCZXm%y4RILPFnEnEcA$RHexf@NkzjoaYcYe<80^!w-RixAuT`Gc;Epp4kX6S9 z+B&Qwe*98(k_M`P=JCmT55KZ^0a%?qF2FeQa^82ft|vH~f$gfdm(@OSQ;gQp*d6jd z_X!A^5vwb*w=XmxG zz-hQA0~`r-hw6gAz$#F#-Hg=NTSkjqI!N}hd$X9ByiMq(I-wi?ARzosK(~di&JFRz zv*m!IB%ri|q&vn}w`x8kUW9XwN7lsYnPpqkira&eIqDsx?4+sJVYDo>Gw=Bs z5RmQM_7kmXw<^2`*fw#)77SQeo@;RsmB`cL`-6Q3V8J=@UOX%kWq2BwjqA5Hb&Wgm z2fSAtJ!$szGhUpXHfXjlC#$2a0c!v(K-0g@;u`S=k&W`zA3Gfsr0vNl?cA!K zV@mlXOAbv9WuWmksKOK6G>?Vp=KG9d0ZswG*Q*`DE+}`?3o3qrDwP0hrrA=+b$V5oGg52rZy*dL^h~j`N!5@6L2T4+N`t ze3YZmf_<#U(L4{p_I`l9^(c?^m^N)#5S&#;4=;p{b;nyeJkYTapH=<9jo_dKhjYKS zjDe)kTQ^>szcg*VISC6N_nAkv)#Vv*=htN2zSRcEFGng^!`D2#Fz?K^-Uglr z8g7Aow!TA0g^d*|IppLx2ON8cg>=}qJ)RZ2Z6M0S6+Jc3IiyZ)(}nZP^g6p6}$Ouj99zrtqwL5`z}ap}f|U+3Q_B_#w4h7j?4bQtRNv z^$D@Dte$&UJl+itr3n$qt0BOAkAlSDpo{5-I9>->VN|KTOZp+7sC#=a*?U>Fe5?0F|D-(#I2Zict90ifEZ3_p}Q z+minEbNwja$R6&1LEX;1NS;gu?QJ&0E+@M`!Fc!5*JEk$j>pe~{@g&68;A_4i%35wUwpHvN+2{a!55GN* z70n(sdCPvl2=^RDV5hYz>#w+Sxd1J1oHRB^}4=($_{hHXD{T2|fS)t`h`C8Vrr8SSFTjP;izGT-wnRsQT50+&Pi+KbFH1X)Re`gcsUC)&65HcE zmXd|Sla;lSZ)12I{-UhG`gnqAnUfVf{g$s<<+f~t#sGmm7Z&d^E#z49Z4S5@rT%;h zN3;fW**m>f!FrOBMI&ffzI}yg%5ltdwL#1pk<#q}0eZD26IpjmLctuPRLPcO9;7t> zapy6D3wWXpVOSn?6>jZ*H%KICFf0ZJO;~4#f8MQcKIa=e<<^OU-H9&QCKwMwz{v38 z7!Yin{olc9%bEp;e&eQtaoS@52rO&?E*uEme?4yD_Hw2O)1MyWUHPbAh#0GMX9Qq3 zco5?)*v5?K58FWj@?s}c;d3*H!?8{M&N9B8Fl<(IjO}MMp2c}Q*I-|c1F!^zxP;in z=0uxkI3XIO>#1x`J3Y51?6Z6DhBrPB@98%Sih`fp9~!D#DFl^&x zbuzcO(pidWXUy1k2v@gVWpu~&IQ#zS?Gnm=Zei-5F}@nyzlrj3;B;JtzgE`cA6`JcGJerO_;zH&%hrXXnjBEKy~Z7L4#jD{<9R zCz>G1z{fB!qMpWVb^^D9&%jZC4hc@Sr}2!%>}PXcXK=;~dt|Zwht?`4rFe)`FhP%E z$mg6HWDwH=^o)n8jve(333LtuQ|ho8_?Rw)y*QD?ID*r1jL%?HTY2pSVEdg9V_SFr zl8ry0@?kqKgaG^=E?XHJ#qamL6V~9BbT(_IUUMW?i+V1OZRGL<$>1Dp?c>NTF_t3* z>m5t#Y0aojPZpU!$0H0pDXz%7%60$MNiM6~iTPPgV6C(bA}p}-iwfdncaew8Pmh!dxt-C&03G7qJ`3&YHsy?C_uyvCIhHuxN)YFZiZj7t z$;r5P2oVe{A3XXJL3m!0M_*S@qnsYoc`OaxucuE3&)|`*c{Dc|2Iz~4!InD6pgMRh zJHiqvu!GG35jG@a_g~u#J#@p&>rHzCX@}a9wCW!0<=Hn}6=(f*TZJ5>JRRp?cxnqa z3}zj{5~j$so2|!om`@fQR_F+3M8z<{bei?{h*S%tq1+Z^oMR7%CtP{(21YXgdGJ`c zlN%kf?-LN&#i#vdFdmQP-A}%QishzF!(t#2tQo(Xp1K3Gb*liNVf8K44CPo(F)NO{ zL?O@@OS4Renlm2z1+$HArp^v-{&+k@4=H}{1fJ@6b8C^CXBDPf2VtHP3T8Fi`e84@>#*>d^Zvbcf zVssow@;nk7+gftw7BI}=dQP^mBq~kdyP$74rDk>GJ02(iZIuu|Ab1Bqgqv>b!5UvP z29EeZcGErh<#CVIhlXwCI+XIHSe`BY3af709VW+bu9@9`bJd)8@hN zPUkEI*#11SeRpY7e!vp?|O8LEWInf2k(3ZnC9gEXYa{gDDQ* z`E2tx6lH&-2*}nS=SsGVCO(f) zFVA$O2d@n8QIf2Y=fypZ5K^VUpdg-7hC!}Quq&PfV~q`u=-t;=?nLw_e=?r?3pmUbtnz7!+W~p8YvY^$X+vOj0w-s4&G z&v0scQlET#D1RCrQMqQZCf>&$)7z0UJr&b&&^Kl1Ijo;kmpsGU@g^p?*LTbQf*G2o z_cM(glLrbrTQ__BQJo@le5UBkD;ZiTFNV426igU9_NC=&PwhPt*#wU*!H*eyuriGGHbIsxKW8R53+uVvnGW&hvlg^g;uQJI`R}v=h`iH+X+eCJt}B9V~aR z?I8EaU)zK%ymczr&6C|`T{~;pD%{O$rGV9Yj_DQ@tE0S{!x2o-zMwyr%oED{vgScS zx2*@Di6A+eE;tj8wHjDwu#$bZ&Ao2_(rw)Dsm!xG_qxs7pKVT>{e6WicJ|qs3YB)) zH2R~ZGR}TGmjFzT0Y-E^gJ7n6{DD=&kGa+_-4WBaLOHehy~km%*M?ZHTGSM>-DWy?JTVK||#IUrg`EUr&kW)5HMceFB?vp)D|U#<|0a@6e&S)YivB>DSZK zi-(R|9AG*baO0649!m47f6i#NgWETC9zak?wbVA8M-N6xB83;aTzwRaOH9^yJf&y3 z7^K4(nDfW~*!>VJg7`c)-Hwy#;0Z%^JP$qqq4Vg4{8N2{z~@`2dvNNuQddu!;8mpw z0;n6ttq{(|7JH-y9urU@k2kdZS|b8&cBBWg0?mOmy@ng1;nRaxoRS6Ycd93!bwrn) zJ*N9Vht0trwo_(3;Rs0pW43#6>IychqJt6amqc)%hb3<-cjJ+f|$r&t!|& z91Y$Yk4>oN`GIj;`*5zdC98=L^>WIc7%+3R2;}1bq~IfbyKjdvzm6KuPWaBNfTlgK ztvlMn5M(ODLts5&!dc8vcXPUXq;0_=PzO3>cQL*QGCp^4C=|dGrszEN?;ei^SULBI z35%$WE5Mn0iNoH%1CDA|qdTF-12=Zb&=hOan_>T9Q;hQ`?@8bWX1e`*2M6RxcHk>C z9j@8|jO>@XUOW$HI(8>E&yRNiE#|?KBtq`xeL;80;iBvPJl+t>)C?SdcQ_u@%yZnj zlO-I|HaFJP{yE?4z`a&n270l33kK$?u2|n&9Uhc24M$? zHAaRRszsmK(^D5)=MlS(hrls;8V;1oAnR=mZ2~eQ9jqzTcsWY(cp$k)Ii6#{{7idG z4_MSLzV}j*j<+11NDJXl&LiBAB`Zjy!_9dT3$u-MIT_Hg8_3t4TkQGovLV(NEa*X= zkb$!d<$2iLoq&zn&2$dfuU zGS1_UcR2B!M_a}Ug5A;C#H$s?9(oGRdw=##Hk;Z-oJ?%&&F4*w!!sbao{t23 zR$=E^$+C)J{-!wo@XmAUcVyhRU%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 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�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 From a43f90bfe1e4c1c3d848f1465edbd613f7cf8f0b Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Tue, 8 Oct 2024 14:46:42 +0200 Subject: [PATCH 07/11] Remove superfluous space --- sign/schemes/schemes.go | 1 - 1 file changed, 1 deletion(-) diff --git a/sign/schemes/schemes.go b/sign/schemes/schemes.go index 1abdd9532..d01d8ca2a 100644 --- a/sign/schemes/schemes.go +++ b/sign/schemes/schemes.go @@ -30,7 +30,6 @@ var allSchemes = [...]sign.Scheme{ ed448.Scheme(), eddilithium2.Scheme(), eddilithium3.Scheme(), - dilithium2.Scheme(), dilithium3.Scheme(), dilithium5.Scheme(), From 016979235dbea073bbe844fe8766a0f63cbf061c Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Tue, 8 Oct 2024 14:52:51 +0200 Subject: [PATCH 08/11] Update ml-dsa documentation --- sign/dilithium/dilithium.go | 18 +++++++++++------- sign/mldsa/doc.go | 12 +++++++++++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/sign/dilithium/dilithium.go b/sign/dilithium/dilithium.go index 9a4334e24..2814f34d5 100644 --- a/sign/dilithium/dilithium.go +++ b/sign/dilithium/dilithium.go @@ -1,27 +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 diff --git a/sign/mldsa/doc.go b/sign/mldsa/doc.go index d5dce5749..99b9c20be 100644 --- a/sign/mldsa/doc.go +++ b/sign/mldsa/doc.go @@ -1,2 +1,12 @@ -// mldsa implements NIST post-quantum signature scheme ML-DSA. +// 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 From bef250218be3b856299d6630262238862ca8a2db Mon Sep 17 00:00:00 2001 From: Bas Westerbaan Date: Tue, 8 Oct 2024 14:54:29 +0200 Subject: [PATCH 09/11] Remove dead code --- sign/mldsa/acvp_test.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/sign/mldsa/acvp_test.go b/sign/mldsa/acvp_test.go index b0b78068a..bc2dfa186 100644 --- a/sign/mldsa/acvp_test.go +++ b/sign/mldsa/acvp_test.go @@ -12,16 +12,6 @@ import ( "github.com/cloudflare/circl/sign/schemes" ) -// Implemented by ML-DSA's private key. Allows us to access the internal -// signing function. -type mldsaSigner interface { - SignTo( - msg func(io.Writer), - rnd [32]byte, - signature []byte, - ) -} - // []byte but is encoded in hex for JSON type HexBytes []byte From d55a0aacd1ce94c093c3f16adb27db709e45d586 Mon Sep 17 00:00:00 2001 From: armfazh Date: Tue, 8 Oct 2024 18:06:12 -0700 Subject: [PATCH 10/11] Avoid to export unsafeSignInternal. --- sign/dilithium/gen.go | 35 ++++ sign/dilithium/templates/acvp.templ.go | 266 +++++++++++++++++++++++++ sign/dilithium/templates/pkg.templ.go | 6 +- sign/mldsa/{ => mldsa44}/acvp_test.go | 32 ++- sign/mldsa/mldsa44/dilithium.go | 2 +- sign/mldsa/mldsa65/acvp_test.go | 262 ++++++++++++++++++++++++ sign/mldsa/mldsa65/dilithium.go | 2 +- sign/mldsa/mldsa87/acvp_test.go | 262 ++++++++++++++++++++++++ sign/mldsa/mldsa87/dilithium.go | 2 +- 9 files changed, 845 insertions(+), 24 deletions(-) create mode 100644 sign/dilithium/templates/acvp.templ.go rename sign/mldsa/{ => mldsa44}/acvp_test.go (88%) create mode 100644 sign/mldsa/mldsa65/acvp_test.go create mode 100644 sign/mldsa/mldsa87/acvp_test.go diff --git a/sign/dilithium/gen.go b/sign/dilithium/gen.go index 6b136ec07..a817f4a41 100644 --- a/sign/dilithium/gen.go +++ b/sign/dilithium/gen.go @@ -145,6 +145,7 @@ var ( func main() { generateModePackageFiles() + generateACVPTest() generateParamsFiles() generateSourceFiles() } @@ -212,6 +213,40 @@ func generateModePackageFiles() { } } +// 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, 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 pkg.templ.go") + } + err = os.WriteFile(mode.PkgPath()+"/acvp_test.go", res[offset:], 0o644) + if err != nil { + panic(err) + } + } +} + // Copies mode3 source files to other modes func generateSourceFiles() { files := make(map[string][]byte) 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/pkg.templ.go b/sign/dilithium/templates/pkg.templ.go index f07a08ccf..238de68c7 100644 --- a/sign/dilithium/templates/pkg.templ.go +++ b/sign/dilithium/templates/pkg.templ.go @@ -116,7 +116,7 @@ func SignTo(sk *PrivateKey, msg, sig []byte) { {{- if .NIST }} // Do not use. Implements ML-DSA.Sign_internal used for compatibility tests. -func (sk *PrivateKey) UnsafeSignInternal(msg []byte, rnd [32]byte) []byte { +func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { var ret [SignatureSize]byte internal.SignTo( (*internal.PrivateKey)(sk), @@ -386,7 +386,7 @@ func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (sign.PublicKey, error) { buf2 [PublicKeySize]byte ret PublicKey ) - + copy(buf2[:], buf) ret.Unpack(&buf2) return &ret, nil @@ -401,7 +401,7 @@ func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (sign.PrivateKey, error) { buf2 [PrivateKeySize]byte ret PrivateKey ) - + copy(buf2[:], buf) ret.Unpack(&buf2) return &ret, nil diff --git a/sign/mldsa/acvp_test.go b/sign/mldsa/mldsa44/acvp_test.go similarity index 88% rename from sign/mldsa/acvp_test.go rename to sign/mldsa/mldsa44/acvp_test.go index bc2dfa186..09ef2c1af 100644 --- a/sign/mldsa/acvp_test.go +++ b/sign/mldsa/mldsa44/acvp_test.go @@ -1,4 +1,6 @@ -package mldsa +// Code generated from acvp.templ.go. DO NOT EDIT. + +package mldsa44 import ( "bytes" @@ -8,8 +10,6 @@ import ( "io" "os" "testing" - - "github.com/cloudflare/circl/sign/schemes" ) // []byte but is encoded in hex for JSON @@ -58,7 +58,7 @@ func TestACVP(t *testing.T) { // nolint:funlen,gocyclo func testACVP(t *testing.T, sub string) { - buf, err := readGzip("testdata/ML-DSA-" + sub + "-FIPS204/prompt.json.gz") + buf, err := readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/prompt.json.gz") if err != nil { t.Fatal(err) } @@ -71,7 +71,7 @@ func testACVP(t *testing.T, sub string) { t.Fatal(err) } - buf, err = readGzip("testdata/ML-DSA-" + sub + "-FIPS204/expectedResults.json.gz") + buf, err = readGzip("../testdata/ML-DSA-" + sub + "-FIPS204/expectedResults.json.gz") if err != nil { t.Fatal(err) } @@ -107,6 +107,8 @@ func testACVP(t *testing.T, sub string) { } } + scheme := Scheme() + for _, rawGroup := range prompt.TestGroups { var abstractGroup struct { TestType string `json:"testType"` @@ -128,9 +130,8 @@ func testACVP(t *testing.T, sub string) { t.Fatal(err) } - scheme := schemes.ByName(group.ParameterSet) - if scheme == nil { - t.Fatalf("No such scheme: %s", group.ParameterSet) + if group.ParameterSet != scheme.Name() { + continue } for _, test := range group.Tests { @@ -180,9 +181,8 @@ func testACVP(t *testing.T, sub string) { t.Fatal(err) } - scheme := schemes.ByName(group.ParameterSet) - if scheme == nil { - t.Fatalf("No such scheme: %s", group.ParameterSet) + if group.ParameterSet != scheme.Name() { + continue } for _, test := range group.Tests { @@ -207,10 +207,7 @@ func testACVP(t *testing.T, sub string) { copy(rnd[:], test.Rnd) } - isk := sk.(interface { - UnsafeSignInternal(msg []byte, rnd [32]byte) []byte - }) - sig2 := isk.UnsafeSignInternal(test.Message, rnd) + sig2 := sk.(*PrivateKey).unsafeSignInternal(test.Message, rnd) if !bytes.Equal(sig2, result.Signature) { t.Fatalf("signature doesn't match: %x ≠ %x", @@ -232,9 +229,8 @@ func testACVP(t *testing.T, sub string) { t.Fatal(err) } - scheme := schemes.ByName(group.ParameterSet) - if scheme == nil { - t.Fatalf("No such scheme: %s", group.ParameterSet) + if group.ParameterSet != scheme.Name() { + continue } pk, err := scheme.UnmarshalBinaryPublicKey(group.Pk) diff --git a/sign/mldsa/mldsa44/dilithium.go b/sign/mldsa/mldsa44/dilithium.go index 497e2c769..257d824ee 100644 --- a/sign/mldsa/mldsa44/dilithium.go +++ b/sign/mldsa/mldsa44/dilithium.go @@ -83,7 +83,7 @@ func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error } // Do not use. Implements ML-DSA.Sign_internal used for compatibility tests. -func (sk *PrivateKey) UnsafeSignInternal(msg []byte, rnd [32]byte) []byte { +func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { var ret [SignatureSize]byte internal.SignTo( (*internal.PrivateKey)(sk), 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 index cbbfb0d09..e54459863 100644 --- a/sign/mldsa/mldsa65/dilithium.go +++ b/sign/mldsa/mldsa65/dilithium.go @@ -83,7 +83,7 @@ func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error } // Do not use. Implements ML-DSA.Sign_internal used for compatibility tests. -func (sk *PrivateKey) UnsafeSignInternal(msg []byte, rnd [32]byte) []byte { +func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { var ret [SignatureSize]byte internal.SignTo( (*internal.PrivateKey)(sk), 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 index 1f17dce37..69ab919d8 100644 --- a/sign/mldsa/mldsa87/dilithium.go +++ b/sign/mldsa/mldsa87/dilithium.go @@ -83,7 +83,7 @@ func SignTo(sk *PrivateKey, msg, ctx []byte, randomized bool, sig []byte) error } // Do not use. Implements ML-DSA.Sign_internal used for compatibility tests. -func (sk *PrivateKey) UnsafeSignInternal(msg []byte, rnd [32]byte) []byte { +func (sk *PrivateKey) unsafeSignInternal(msg []byte, rnd [32]byte) []byte { var ret [SignatureSize]byte internal.SignTo( (*internal.PrivateKey)(sk), From dcffd6604242ec2a984d5ef2ce1c50a461df2dea Mon Sep 17 00:00:00 2001 From: armfazh Date: Tue, 8 Oct 2024 18:13:23 -0700 Subject: [PATCH 11/11] Update command for golangci-lint. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 ./...