github.com/cloudflare/circl@v1.5.0/sign/internal/dilithium/field_test.go (about) 1 package dilithium 2 3 import ( 4 "crypto/rand" 5 "encoding/binary" 6 "math" 7 "testing" 8 ) 9 10 func randSliceUint32(length uint) []uint32 { return randSliceUint32WithMax(length, math.MaxUint32) } 11 12 func randSliceUint32WithMax(length uint, max uint32) []uint32 { 13 bytes := make([]uint8, 4*length) 14 if n, err := rand.Read(bytes); err != nil { 15 panic(err) 16 } else if n < len(bytes) { 17 panic("short read from RNG") 18 } 19 x := make([]uint32, length) 20 for i := range x { 21 x[i] = binary.LittleEndian.Uint32(bytes[4*i:]) % max 22 } 23 return x 24 } 25 26 func TestModQ(t *testing.T) { 27 const testTimes = 1000 28 r := randSliceUint32(testTimes) 29 for i := 0; i < testTimes; i++ { 30 x := r[i] 31 y := modQ(x) 32 if y > Q { 33 t.Fatalf("modQ(%d) > Q", x) 34 } 35 if y != x%Q { 36 t.Fatalf("modQ(%d) != %d (mod Q)", x, x) 37 } 38 } 39 } 40 41 func TestReduceLe2Q(t *testing.T) { 42 const testTimes = 1000 43 r := randSliceUint32(testTimes) 44 for i := 0; i < testTimes; i++ { 45 x := r[i] 46 y := ReduceLe2Q(x) 47 if y > 2*Q { 48 t.Fatalf("reduce_le2q(%d) > 2Q", x) 49 } 50 if y%Q != x%Q { 51 t.Fatalf("reduce_le2q(%d) != %d (mod Q)", x, x) 52 } 53 } 54 } 55 56 func TestPower2Round(t *testing.T) { 57 for a := uint32(0); a < Q; a++ { 58 a0PlusQ, a1 := power2round(a) 59 a0 := int32(a0PlusQ) - int32(Q) 60 if int32(a) != a0+int32((1<<D)*a1) { 61 t.Fatalf("power2round(%v) doesn't recombine", a) 62 } 63 if (-(1 << (D - 1)) >= a0) || (a0 > 1<<(D-1)) { 64 t.Fatalf("power2round(%v): a0 out of bounds", a) 65 } 66 if a1 > (1 << (QBits - D)) { 67 t.Fatalf("power2round(%v): a1 out of bounds", a) 68 } 69 } 70 }