...
1 package goldilocks_test
2
3 import (
4 "crypto/rand"
5 "encoding"
6 "testing"
7
8 "github.com/cloudflare/circl/ecc/goldilocks"
9 "github.com/cloudflare/circl/internal/test"
10 )
11
12 func randomPoint() *goldilocks.Point {
13 var k goldilocks.Scalar
14 _, _ = rand.Read(k[:])
15 return goldilocks.Curve{}.ScalarBaseMult(&k)
16 }
17
18 func TestPointAdd(t *testing.T) {
19 const testTimes = 1 << 10
20 var e goldilocks.Curve
21 for i := 0; i < testTimes; i++ {
22 P := randomPoint()
23
24 got := e.Double(e.Double(e.Double(e.Double(P))))
25
26 Q := e.Identity()
27 for j := 0; j < 16; j++ {
28 Q = e.Add(Q, P)
29 }
30 want := Q
31 if !e.IsOnCurve(got) || !e.IsOnCurve(want) || !got.IsEqual(want) {
32 test.ReportError(t, got, want, P)
33 }
34 }
35 }
36
37 func TestPointNeg(t *testing.T) {
38 const testTimes = 1 << 10
39 var e goldilocks.Curve
40 for i := 0; i < testTimes; i++ {
41 P := randomPoint()
42 Q := *P
43 Q.Neg()
44 R := e.Add(P, &Q)
45 got := R.IsIdentity()
46 want := true
47 if got != want {
48 test.ReportError(t, got, want, P)
49 }
50 }
51 }
52
53 func TestPointAffine(t *testing.T) {
54 const testTimes = 1 << 10
55 for i := 0; i < testTimes; i++ {
56 got := randomPoint()
57 x, y := got.ToAffine()
58 want, err := goldilocks.FromAffine(&x, &y)
59 if !got.IsEqual(want) || err != nil {
60 test.ReportError(t, got, want)
61 }
62 }
63 }
64
65 func TestPointMarshal(t *testing.T) {
66 const testTimes = 1 << 10
67 var want error
68 for i := 0; i < testTimes; i++ {
69 var P interface{} = randomPoint()
70 mar, _ := P.(encoding.BinaryMarshaler)
71 data, got := mar.MarshalBinary()
72 if got != want {
73 test.ReportError(t, got, want, P)
74 }
75 unmar, _ := P.(encoding.BinaryUnmarshaler)
76 got = unmar.UnmarshalBinary(data)
77 if got != want {
78 test.ReportError(t, got, want, P)
79 }
80 }
81 }
82
83 func BenchmarkPoint(b *testing.B) {
84 P := randomPoint()
85 Q := randomPoint()
86 b.Run("ToAffine", func(b *testing.B) {
87 for i := 0; i < b.N; i++ {
88 P.ToAffine()
89 }
90 })
91 b.Run("Add", func(b *testing.B) {
92 for i := 0; i < b.N; i++ {
93 P.Add(Q)
94 }
95 })
96 b.Run("Double", func(b *testing.B) {
97 for i := 0; i < b.N; i++ {
98 P.Double()
99 }
100 })
101 }
102
View as plain text