...
1 package ff
2
3 import (
4 "testing"
5
6 "github.com/cloudflare/circl/internal/test"
7 )
8
9 func randomURoot(t testing.TB) *URoot {
10 u := &URoot{}
11 HardExponentiation(u, randomCyclo6(t))
12 return u
13 }
14
15 func TestURoot(t *testing.T) {
16 const testTimes = 1 << 8
17 t.Run("no_alias", func(t *testing.T) {
18 var want, got URoot
19 x := randomURoot(t)
20 got = *x
21 got.Sqr(&got)
22 want = *x
23 want.Mul(&want, &want)
24 if got.IsEqual(&want) == 0 {
25 test.ReportError(t, got, want, x)
26 }
27 })
28 t.Run("order", func(t *testing.T) {
29 order := ScalarOrder()
30
31 var z URoot
32 for i := 0; i < 16; i++ {
33 x := randomURoot(t)
34 (*Cyclo6)(&z).exp((*Cyclo6)(x), order)
35
36
37 got := z.IsIdentity()
38 want := 1
39 if got != want {
40 test.ReportError(t, got, want, x, z)
41 }
42 }
43 })
44 t.Run("mul_inv", func(t *testing.T) {
45 var z URoot
46 for i := 0; i < testTimes; i++ {
47 x := randomURoot(t)
48 y := randomURoot(t)
49
50
51 z.Inv(x)
52 z.Mul(&z, y)
53 z.Mul(&z, x)
54 got := z
55 want := y
56 if got.IsEqual(want) == 0 {
57 test.ReportError(t, got, want, x, y)
58 }
59 }
60 })
61 t.Run("mul_sqr", func(t *testing.T) {
62 var want, got URoot
63 for i := 0; i < testTimes; i++ {
64 x := randomURoot(t)
65
66
67 got.Mul(x, x)
68 want.Sqr(x)
69 if got.IsEqual(&want) == 0 {
70 test.ReportError(t, got, want, x)
71 }
72 }
73 })
74 }
75
76 func BenchmarkURoot(b *testing.B) {
77 x := randomURoot(b)
78 y := randomURoot(b)
79 z := randomURoot(b)
80 b.Run("Mul", func(b *testing.B) {
81 for i := 0; i < b.N; i++ {
82 z.Mul(x, y)
83 }
84 })
85 b.Run("Sqr", func(b *testing.B) {
86 for i := 0; i < b.N; i++ {
87 z.Sqr(x)
88 }
89 })
90 b.Run("Inv", func(b *testing.B) {
91 for i := 0; i < b.N; i++ {
92 z.Inv(x)
93 }
94 })
95 }
96
View as plain text