@@ -9,6 +9,7 @@ package math
99import (
1010 "encoding/json"
1111 "fmt"
12+ "io"
1213 "math"
1314 "math/rand"
1415 "testing"
@@ -19,6 +20,88 @@ import (
1920
2021var seed = time .Now ().Unix ()
2122
23+ func TestImmutability (t * testing.T ) {
24+ for _ , curve := range Curves {
25+ rng , err := curve .Rand ()
26+ assert .NoError (t , err )
27+
28+ testImmutabilityZr (t , curve , rng )
29+ testImmutabilityG1 (t , curve , rng )
30+ testImmutabilityG2 (t , curve , rng )
31+ testImmutabilityGt (t , curve , rng )
32+ }
33+ }
34+
35+ var r * Zr
36+ var g1 * G1
37+ var g2 * G2
38+ var gt * Gt
39+
40+ func testImmutabilityGt (t * testing.T , c * Curve , rng io.Reader ) {
41+ g := c .GenGt .Exp (c .NewRandomZr (rng ))
42+ orig , err := c .NewGtFromBytes (g .Bytes ())
43+ assert .NoError (t , err )
44+
45+ // Exp(Zr) Gt
46+ gt = g .Exp (c .NewRandomZr (rng ))
47+ assert .True (t , g .Equals (orig ))
48+ }
49+
50+ func testImmutabilityG2 (t * testing.T , c * Curve , rng io.Reader ) {
51+ g := c .GenG2 .Mul (c .NewRandomZr (rng ))
52+ orig := g .Copy ()
53+
54+ // Mul(Zr) G2
55+ g2 = g .Mul (c .NewRandomZr (rng ))
56+ assert .True (t , g .Equals (orig ))
57+
58+ // Copy() G2
59+ g2 = g .Copy ()
60+ assert .True (t , g .Equals (orig ))
61+ }
62+
63+ func testImmutabilityG1 (t * testing.T , c * Curve , rng io.Reader ) {
64+ g := c .GenG1 .Mul (c .NewRandomZr (rng ))
65+ orig := g .Copy ()
66+
67+ // Mul(Zr) G1
68+ g1 = g .Mul (c .NewRandomZr (rng ))
69+ assert .True (t , g .Equals (orig ))
70+
71+ // Mul2(e Zr, Q G1, f Zr) G1
72+ g1 = g .Mul2 (c .NewRandomZr (rng ), c .GenG1 , c .NewRandomZr (rng ))
73+ assert .True (t , g .Equals (orig ))
74+
75+ // Copy() G1
76+ g1 = g .Copy ()
77+ assert .True (t , g .Equals (orig ))
78+ }
79+
80+ func testImmutabilityZr (t * testing.T , c * Curve , rng io.Reader ) {
81+ _r := c .NewRandomZr (rng )
82+ orig := _r .Copy ()
83+
84+ // Plus(Zr) Zr
85+ r = _r .Plus (c .NewRandomZr (rng ))
86+ assert .True (t , _r .Equals (orig ))
87+
88+ // Minus(Zr) Zr
89+ r = _r .Minus (c .NewRandomZr (rng ))
90+ assert .True (t , _r .Equals (orig ))
91+
92+ // Mul(Zr) Zr
93+ r = _r .Mul (c .NewRandomZr (rng ))
94+ assert .True (t , _r .Equals (orig ))
95+
96+ // PowMod(Zr) Zr
97+ r = _r .PowMod (c .NewRandomZr (rng ))
98+ assert .True (t , _r .Equals (orig ))
99+
100+ // Copy() Zr
101+ r = _r .Copy ()
102+ assert .True (t , _r .Equals (orig ))
103+ }
104+
22105func runZrTest (t * testing.T , c * Curve ) {
23106 rng , err := c .Rand ()
24107 assert .NoError (t , err )
0 commit comments