Skip to content

Commit fe62d43

Browse files
committed
secp256k1: Use simplified add and dbl formulas
1 parent 790cfd0 commit fe62d43

File tree

1 file changed

+45
-76
lines changed

1 file changed

+45
-76
lines changed

lib/evmone_precompiles/ecc.hpp

+45-76
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,7 @@ ProjPoint<IntT> add(const evmmax::ModArith<IntT>& s, const ProjPoint<IntT>& p,
6969
{
7070
static_assert(A == 0, "point addition procedure is simplified for a = 0");
7171

72-
if (p.is_inf())
73-
return q;
74-
if (q.is_inf())
75-
return p;
76-
77-
// https://eprint.iacr.org/2015/1060 algorithm 1.
78-
// Simplified with a == 0
72+
// https://eprint.iacr.org/2015/1060 algorithm 7.
7973

8074
const auto& x1 = p.x;
8175
const auto& y1 = p.y;
@@ -91,7 +85,6 @@ ProjPoint<IntT> add(const evmmax::ModArith<IntT>& s, const ProjPoint<IntT>& p,
9185
IntT t2;
9286
IntT t3;
9387
IntT t4;
94-
IntT t5;
9588

9689
t0 = s.mul(x1, x2); // 1
9790
t1 = s.mul(y1, y2); // 2
@@ -101,38 +94,31 @@ ProjPoint<IntT> add(const evmmax::ModArith<IntT>& s, const ProjPoint<IntT>& p,
10194
t3 = s.mul(t3, t4); // 6
10295
t4 = s.add(t0, t1); // 7
10396
t3 = s.sub(t3, t4); // 8
104-
t4 = s.add(x1, z1); // 9
105-
t5 = s.add(x2, z2); // 10
106-
t4 = s.mul(t4, t5); // 11
107-
t5 = s.add(t0, t2); // 12
108-
t4 = s.sub(t4, t5); // 13
109-
t5 = s.add(y1, z1); // 14
110-
x3 = s.add(y2, z2); // 15
111-
t5 = s.mul(t5, x3); // 16
112-
x3 = s.add(t1, t2); // 17
113-
t5 = s.sub(t5, x3); // 18
114-
// z3 = 0;//s.mul(a, t4); // 19
115-
x3 = s.mul(b3, t2); // 20
116-
// z3 = x3; //s.add(x3, z3); // 21
117-
z3 = s.add(t1, x3); // 23
118-
x3 = s.sub(t1, x3); // 22
119-
y3 = s.mul(x3, z3); // 24
120-
t1 = s.add(t0, t0); // 25
121-
t1 = s.add(t1, t0); // 26
122-
// t2 = 0; // s.mul(a, t2); // 27
123-
t4 = s.mul(b3, t4); // 28
124-
// t1 = s.add(t1, t2); // 29
125-
// t2 = t0; //s.sub(t0, t2); // 30
126-
// t2 = s.mul(a, t2); // 31
127-
// t4 = s.add(t4, t2); // 32
128-
t0 = s.mul(t1, t4); // 33
129-
y3 = s.add(y3, t0); // 34
130-
t0 = s.mul(t5, t4); // 35
131-
x3 = s.mul(t3, x3); // 36
132-
x3 = s.sub(x3, t0); // 37
133-
t0 = s.mul(t3, t1); // 38
134-
z3 = s.mul(t5, z3); // 39
135-
z3 = s.add(z3, t0); // 40
97+
t4 = s.add(y1, z1); // 9
98+
x3 = s.add(y2, z2); // 10
99+
t4 = s.mul(t4, x3); // 11
100+
x3 = s.add(t1, t2); // 12
101+
t4 = s.sub(t4, x3); // 13
102+
x3 = s.add(x1, z1); // 14
103+
y3 = s.add(x2, z2); // 15
104+
x3 = s.mul(x3, y3); // 16
105+
y3 = s.add(t0, t2); // 17
106+
y3 = s.sub(x3, y3); // 18
107+
x3 = s.add(t0, t0); // 19
108+
t0 = s.add(x3, t0); // 20
109+
t2 = s.mul(b3, t2); // 21
110+
z3 = s.add(t1, t2); // 22
111+
t1 = s.sub(t1, t2); // 23
112+
y3 = s.mul(b3, y3); // 24
113+
x3 = s.mul(t4, y3); // 25
114+
t2 = s.mul(t3, t1); // 26
115+
x3 = s.sub(t2, x3); // 27
116+
y3 = s.mul(y3, t0); // 28
117+
t1 = s.mul(t1, z3); // 29
118+
y3 = s.add(t1, y3); // 30
119+
t0 = s.mul(t0, t3); // 31
120+
z3 = s.mul(z3, t4); // 32
121+
z3 = s.add(z3, t0); // 33
136122

137123
return {x3, y3, z3};
138124
}
@@ -143,11 +129,8 @@ ProjPoint<IntT> dbl(
143129
const evmmax::ModArith<IntT>& s, const ProjPoint<IntT>& p, const IntT& b3) noexcept
144130
{
145131
static_assert(A == 0, "point doubling procedure is simplified for a = 0");
146-
if (p.is_inf())
147-
return p;
148132

149-
// https://eprint.iacr.org/2015/1060 algorithm 3.
150-
// Simplified with a == 0
133+
// https://eprint.iacr.org/2015/1060 algorithm 9.
151134

152135
const auto& x = p.x;
153136
const auto& y = p.y;
@@ -158,39 +141,25 @@ ProjPoint<IntT> dbl(
158141
IntT t0;
159142
IntT t1;
160143
IntT t2;
161-
IntT t3;
162144

163-
t0 = s.mul(x, x); // 1
164-
t1 = s.mul(y, y); // 2
165-
t2 = s.mul(z, z); // 3
166-
t3 = s.mul(x, y); // 4
167-
t3 = s.add(t3, t3); // 5
168-
z3 = s.mul(x, z); // 6
169-
z3 = s.add(z3, z3); // 7
170-
// x3 = s.mul(0, z3); // 8
171-
y3 = s.mul(b3, t2); // 9
172-
// y3 = s.add(x3, y3); // 10
173-
x3 = s.sub(t1, y3); // 11
174-
y3 = s.add(t1, y3); // 12
175-
y3 = s.mul(x3, y3); // 13
176-
x3 = s.mul(t3, x3); // 14
177-
z3 = s.mul(b3, z3); // 15
178-
// t2 = s.mul(0, t2); // 16
179-
// t3 = s.sub(t0, t2); // 17
180-
// t3 = s.mul(0, t3); // 18
181-
t3 = z3; // s.add(t3, z3); // 19
182-
z3 = s.add(t0, t0); // 20
183-
t0 = s.add(z3, t0); // 21
184-
// t0 = s.add(t0, t2); // 22
185-
t0 = s.mul(t0, t3); // 23
186-
y3 = s.add(y3, t0); // 24
187-
t2 = s.mul(y, z); // 25
188-
t2 = s.add(t2, t2); // 26
189-
t0 = s.mul(t2, t3); // 27
190-
x3 = s.sub(x3, t0); // 28
191-
z3 = s.mul(t2, t1); // 29
192-
z3 = s.add(z3, z3); // 30
193-
z3 = s.add(z3, z3); // 31
145+
t0 = s.mul(y, y); // 1
146+
z3 = s.add(t0, t0); // 2
147+
z3 = s.add(z3, z3); // 3
148+
z3 = s.add(z3, z3); // 4
149+
t1 = s.mul(y, z); // 5
150+
t2 = s.mul(z, z); // 6
151+
t2 = s.mul(b3, t2); // 7
152+
x3 = s.mul(t2, z3); // 8
153+
y3 = s.add(t0, t2); // 9
154+
z3 = s.mul(t1, z3); // 10
155+
t1 = s.add(t2, t2); // 11
156+
t2 = s.add(t1, t2); // 12
157+
t0 = s.sub(t0, t2); // 13
158+
y3 = s.mul(t0, y3); // 14
159+
y3 = s.add(x3, y3); // 15
160+
t1 = s.mul(x, y); // 16
161+
x3 = s.mul(t0, t1); // 17
162+
x3 = s.add(x3, x3); // 18
194163

195164
return {x3, y3, z3};
196165
}

0 commit comments

Comments
 (0)