github.com/cloudflare/circl@v1.5.0/ecc/bls12381/ff/fp12_test.go (about) 1 package ff 2 3 import ( 4 "testing" 5 6 "github.com/cloudflare/circl/internal/test" 7 ) 8 9 func randomFp12(t testing.TB) *Fp12 { return &Fp12{*randomFp6(t), *randomFp6(t)} } 10 11 func TestFp12(t *testing.T) { 12 const testTimes = 1 << 8 13 t.Run("no_alias", func(t *testing.T) { 14 var want, got Fp12 15 x := randomFp12(t) 16 got = *x 17 got.Sqr(&got) 18 want = *x 19 want.Mul(&want, &want) 20 if got.IsEqual(&want) == 0 { 21 test.ReportError(t, got, want, x) 22 } 23 }) 24 t.Run("mul_inv", func(t *testing.T) { 25 var z Fp12 26 for i := 0; i < testTimes; i++ { 27 x := randomFp12(t) 28 y := randomFp12(t) 29 30 // x*y*x^1 - y = 0 31 z.Inv(x) 32 z.Mul(&z, y) 33 z.Mul(&z, x) 34 z.Sub(&z, y) 35 got := z.IsZero() 36 want := 1 37 if got != want { 38 test.ReportError(t, got, want, x, y) 39 } 40 } 41 }) 42 t.Run("mul_sqr", func(t *testing.T) { 43 var l0, l1, r0, r1 Fp12 44 for i := 0; i < testTimes; i++ { 45 x := randomFp12(t) 46 y := randomFp12(t) 47 48 // (x+y)(x-y) = (x^2-y^2) 49 l0.Add(x, y) 50 l1.Sub(x, y) 51 l0.Mul(&l0, &l1) 52 r0.Sqr(x) 53 r1.Sqr(y) 54 r0.Sub(&r0, &r1) 55 got := &l0 56 want := &r0 57 if got.IsEqual(want) == 0 { 58 test.ReportError(t, got, want, x, y) 59 } 60 } 61 }) 62 t.Run("marshal", func(t *testing.T) { 63 var b Fp12 64 for i := 0; i < testTimes; i++ { 65 a := randomFp12(t) 66 s, err := a.MarshalBinary() 67 test.CheckNoErr(t, err, "MarshalBinary failed") 68 err = b.UnmarshalBinary(s) 69 test.CheckNoErr(t, err, "UnmarshalBinary failed") 70 if b.IsEqual(a) == 0 { 71 test.ReportError(t, a, b) 72 } 73 } 74 }) 75 t.Run("frobenius", func(t *testing.T) { 76 var got, want Fp12 77 p := FpOrder() 78 for i := 0; i < testTimes; i++ { 79 x := randomFp12(t) 80 81 // Frob(x) == x^p 82 got.Frob(x) 83 want.Exp(x, p) 84 85 if got.IsEqual(&want) == 0 { 86 test.ReportError(t, got, want, x) 87 } 88 } 89 }) 90 } 91 92 func BenchmarkFp12(b *testing.B) { 93 x := randomFp12(b) 94 y := randomFp12(b) 95 z := randomFp12(b) 96 97 b.Run("Add", func(b *testing.B) { 98 for i := 0; i < b.N; i++ { 99 z.Add(x, y) 100 } 101 }) 102 b.Run("Mul", func(b *testing.B) { 103 for i := 0; i < b.N; i++ { 104 z.Mul(x, y) 105 } 106 }) 107 b.Run("Sqr", func(b *testing.B) { 108 for i := 0; i < b.N; i++ { 109 z.Sqr(x) 110 } 111 }) 112 b.Run("Inv", func(b *testing.B) { 113 for i := 0; i < b.N; i++ { 114 z.Inv(x) 115 } 116 }) 117 }