...
1 package internal
2
3 import (
4 "flag"
5 "testing"
6
7 "github.com/cloudflare/circl/sign/dilithium/internal/common"
8 )
9
10 var runVeryLongTest = flag.Bool("very-long", false, "runs very long tests")
11
12 func TestDecompose(t *testing.T) {
13 for a := uint32(0); a < common.Q; a++ {
14 a0PlusQ, a1 := decompose(a)
15 a0 := int32(a0PlusQ) - int32(common.Q)
16 recombined := a0 + int32(Alpha*a1)
17 if a1 == 0 && recombined < 0 {
18 recombined += common.Q
19 if -(Alpha/2) > a0 || a0 >= 0 {
20 t.Fatalf("decompose(%v): a0 out of bounds", a)
21 }
22 } else {
23 if (-(Alpha / 2) >= a0) || (a0 > Alpha/2) {
24 t.Fatalf("decompose(%v): a0 out of bounds", a)
25 }
26 }
27 if int32(a) != recombined {
28 t.Fatalf("decompose(%v) doesn't recombine %v %v", a, a0, a1)
29 }
30 }
31 }
32
33 func TestMakeHint(t *testing.T) {
34 if !*runVeryLongTest {
35 t.SkipNow()
36 }
37 for w := uint32(0); w < common.Q; w++ {
38 w0, w1 := decompose(w)
39 for fn := uint32(0); fn <= Gamma2; fn++ {
40 fsign := false
41 for {
42 var f uint32
43 if fsign {
44 if fn == 0 {
45 break
46 }
47 f = common.Q - fn
48 } else {
49 f = fn
50 }
51
52 hint := makeHint(common.ReduceLe2Q(w0+common.Q-f), w1)
53 w1p := useHint(common.ReduceLe2Q(w+common.Q-f), hint)
54 if w1p != w1 {
55 t.Fatal()
56 }
57
58 if fsign {
59 break
60 }
61 fsign = true
62 }
63 }
64 }
65 }
66
67 func BenchmarkDecompose(b *testing.B) {
68 var p, p0, p1 common.Poly
69 for i := 0; i < b.N; i++ {
70 PolyDecompose(&p, &p0, &p1)
71 }
72 }
73
74 func BenchmarkMakeHint(b *testing.B) {
75 var p, p0, p1 common.Poly
76 for i := 0; i < b.N; i++ {
77 PolyMakeHint(&p, &p0, &p1)
78 }
79 }
80
View as plain text