...
1 package ff
2
3
4 type Cyclo6 Fp12
5
6 func (z Cyclo6) String() string { return (Fp12)(z).String() }
7 func (z Cyclo6) IsEqual(x *Cyclo6) int { return (Fp12)(z).IsEqual((*Fp12)(x)) }
8 func (z Cyclo6) IsIdentity() int { i := &Fp12{}; i.SetOne(); return z.IsEqual((*Cyclo6)(i)) }
9 func (z *Cyclo6) Frob(x *Cyclo6) { (*Fp12)(z).Frob((*Fp12)(x)) }
10 func (z *Cyclo6) Mul(x, y *Cyclo6) { (*Fp12)(z).Mul((*Fp12)(x), (*Fp12)(y)) }
11 func (z *Cyclo6) Sqr(x *Cyclo6) { (*Fp12)(z).Sqr((*Fp12)(x)) }
12 func (z *Cyclo6) Inv(x *Cyclo6) { *z = *x; z[1].Neg() }
13 func (z *Cyclo6) exp(x *Cyclo6, n []byte) { (*Fp12)(z).Exp((*Fp12)(x), n) }
14
15
16 func (z *Cyclo6) PowToX(x *Cyclo6) {
17 t := new(Cyclo6)
18 *t = *x
19 const lenX = 64
20 for i := lenX - 2; i >= 0; i-- {
21 t.Sqr(t)
22
23 if (i == 62) || (i == 60) || (i == 57) || (i == 48) || (i == 16) {
24 t.Mul(t, x)
25 }
26 }
27 z.Inv(t)
28 }
29
30
31
32 func EasyExponentiation(g *Cyclo6, f *Fp12) {
33 var t0, t1, p Fp12
34 p.Frob(f)
35 p.Frob(&p)
36 t0.Mul(&p, f)
37 t1.Frob(&t0)
38 t1.Frob(&t1)
39 t1.Frob(&t1)
40 t1.Frob(&t1)
41 t1.Frob(&t1)
42 t1.Frob(&t1)
43 t0.Inv(&t0)
44 t0.Mul(&t0, &t1)
45
46 *g = (Cyclo6)(t0)
47 }
48
49
50 func HardExponentiation(u *URoot, g *Cyclo6) {
51 var t0, t1, _g, g3 Cyclo6
52 var c, a0, a1, a2, a3 Cyclo6
53 _g.Inv(g)
54 g3.Sqr(g)
55 g3.Mul(&g3, g)
56 t0.PowToX(g)
57 t0.Mul(&t0, &_g)
58 t1.PowToX(&t0)
59 t0.Inv(&t0)
60 a3.Mul(&t1, &t0)
61 a2.Frob(&a3)
62 a1.Frob(&a2)
63 t0.Inv(&a3)
64 a1.Mul(&a1, &t0)
65 a0.Frob(&a1)
66 a0.Mul(&a0, &g3)
67
68 c.PowToX(&a3)
69 c.Mul(&c, &a2)
70 c.PowToX(&c)
71 c.Mul(&c, &a1)
72 c.PowToX(&c)
73 c.Mul(&c, &a0)
74
75 *u = (URoot)(c)
76 }
77
View as plain text