1 package bls12381
2
3 import "github.com/cloudflare/circl/ecc/bls12381/ff"
4
5 func doubleAndLine(P *G2, l *line) {
6
7
8
9
10
11 var R G2
12 X, Y, Z := &P.x, &P.y, &P.z
13 X3, Y3, Z3 := &R.x, &R.y, &R.z
14 isDoubLine := l != nil
15 _3B := &g2Params._3b
16 var A, B, C, D, E, F, G, T ff.Fp2
17 B.Sqr(Y)
18 C.Sqr(Z)
19 D.Mul(_3B, &C)
20 F.Add(Y, Z)
21 F.Sqr(&F)
22 F.Sub(&F, &B)
23 F.Sub(&F, &C)
24 if isDoubLine {
25 A.Sqr(X)
26 E.Add(X, Y)
27 E.Sqr(&E)
28 E.Sub(&E, &A)
29 E.Sub(&E, &B)
30 l[0].Add(&A, &A)
31 l[0].Add(&l[0], &A)
32 l[1] = F
33 l[1].Neg()
34 l[2].Sub(&D, &B)
35 } else {
36 E.Mul(X, Y)
37 E.Add(&E, &E)
38 }
39 T.Add(&D, &D)
40 G.Add(&T, &D)
41 X3.Sub(&B, &G)
42 X3.Mul(X3, &E)
43 T.Sqr(&T)
44 Y3.Add(&B, &G)
45 Y3.Sqr(Y3)
46 Y3.Sub(Y3, &T)
47 Y3.Sub(Y3, &T)
48 Y3.Sub(Y3, &T)
49 Z3.Mul(&B, &F)
50 Z3.Add(Z3, Z3)
51 Z3.Add(Z3, Z3)
52 *P = R
53 }
54
55 func addAndLine(PQ, P, Q *G2, l *line) {
56
57
58
59
60
61 var R G2
62 X1, Y1, Z1 := &P.x, &P.y, &P.z
63 X2, Y2, Z2 := &Q.x, &Q.y, &Q.z
64 X3, Y3, Z3 := &R.x, &R.y, &R.z
65 _3B := &g2Params._3b
66 isAddLine := l != nil
67 var X1X2, Y1Y2, Z1Z2, _3bZ1Z2 ff.Fp2
68 var A, B, C, D, E, F, G ff.Fp2
69 t0, t1 := &ff.Fp2{}, &ff.Fp2{}
70
71 X1X2.Mul(X1, X2)
72 Y1Y2.Mul(Y1, Y2)
73 Z1Z2.Mul(Z1, Z2)
74 _3bZ1Z2.Mul(&Z1Z2, _3B)
75
76 A.Add(&X1X2, &X1X2)
77 A.Add(&A, &X1X2)
78 B.Add(&Y1Y2, &_3bZ1Z2)
79 C.Sub(&Y1Y2, &_3bZ1Z2)
80
81 t0.Add(X1, Y1)
82 D.Add(X2, Y2)
83 D.Mul(&D, t0)
84 D.Sub(&D, &X1X2)
85 D.Sub(&D, &Y1Y2)
86
87 if isAddLine {
88 var EE, FF ff.Fp2
89 t0.Mul(Y1, Z2)
90 t1.Mul(Y2, Z1)
91 E.Add(t0, t1)
92 EE.Sub(t0, t1)
93
94 t0.Mul(X1, Z2)
95 t1.Mul(X2, Z1)
96 F.Add(t0, t1)
97 FF.Sub(t0, t1)
98
99 l[0].Mul(&EE, Z2)
100 l[0].Neg()
101 l[1].Mul(&FF, Z2)
102 t0.Mul(&FF, Y2)
103 l[2].Mul(&EE, X2)
104 l[2].Sub(&l[2], t0)
105 } else {
106 t0.Add(Y1, Z1)
107 t1.Add(Y2, Z2)
108 E.Mul(t0, t1)
109 E.Sub(&E, &Y1Y2)
110 E.Sub(&E, &Z1Z2)
111
112 t0.Add(X1, Z1)
113 t1.Add(X2, Z2)
114 F.Mul(t0, t1)
115 F.Sub(&F, &X1X2)
116 F.Sub(&F, &Z1Z2)
117 }
118 G.Mul(&F, _3B)
119
120 t0.Mul(&E, &G)
121 X3.Mul(&D, &C)
122 X3.Sub(X3, t0)
123
124 t0.Mul(&A, &G)
125 Y3.Mul(&B, &C)
126 Y3.Add(Y3, t0)
127
128 t0.Mul(&A, &D)
129 Z3.Mul(&E, &B)
130 Z3.Add(Z3, t0)
131
132 *PQ = R
133 }
134
View as plain text