Skip to content

Commit 273747c

Browse files
committed
optimized 2.1kk
1 parent 6545fa8 commit 273747c

File tree

2 files changed

+197
-222
lines changed

2 files changed

+197
-222
lines changed

contracts/certificate/signers/CECDSASHA2Signer.sol

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ contract CECDSASHA2Signer is ICertificateSigner, Initializable {
4545
(inputs.r, inputs.s) = U384.init2(icaoMemberSignature_);
4646
(inputs.x, inputs.y) = U384.init2(icaoMemberKey_);
4747

48+
uint256 p = hex"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF"
49+
.init();
4850
// secp384r1 parameters
4951
Parameters memory params = Parameters({
5052
a: hex"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC"
@@ -55,13 +57,12 @@ contract CECDSASHA2Signer is ICertificateSigner, Initializable {
5557
.init(),
5658
gy: hex"3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f"
5759
.init(),
58-
p: hex"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF"
59-
.init(),
60+
p: p,
6061
n: hex"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973"
6162
.init(),
6263
lowSmax: hex"7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9"
6364
.init(),
64-
call: U384.initCall(),
65+
call: U384.initCall(p),
6566
three: U384.init(3)
6667
});
6768

@@ -127,15 +128,15 @@ contract CECDSASHA2Signer is ICertificateSigner, Initializable {
127128
return false;
128129
}
129130

130-
uint256 LHS = U384.modexp(call, y, 2, p);
131-
uint256 RHS = U384.modexp(call, x, 3, p);
131+
uint256 LHS = U384.modexp(call, y, 2);
132+
uint256 RHS = U384.modexp(call, x, 3);
132133

133134
if (!U384.eqInteger(a, 0)) {
134-
RHS = U384.modadd(call, RHS, U384.modmul(call, x, a, p), p); // x^3 + a*x
135+
RHS = U384.modadd(call, RHS, U384.modmul(call, x, a)); // x^3 + a*x
135136
}
136137

137138
if (!U384.eqInteger(b, 0)) {
138-
RHS = U384.modadd(call, RHS, b, p); // x^3 + a*x + b
139+
RHS = U384.modadd(call, RHS, b); // x^3 + a*x + b
139140
}
140141

141142
return U384.eq(LHS, RHS);
@@ -259,42 +260,42 @@ contract CECDSASHA2Signer is ICertificateSigner, Initializable {
259260
return (U384.init(0), U384.init(1), U384.init(0)); // zero proj
260261
}
261262

262-
uint256 u = U384.modmul(call, y0, z0, p);
263-
U384.modshl1Assign(call, u, p);
263+
uint256 u = U384.modmul(call, y0, z0);
264+
U384.modshl1Assign(call, u);
264265

265-
x1 = U384.modmul(call, u, x0, p);
266-
U384.modmulAssign(call, x1, y0, p);
267-
U384.modshl1Assign(call, x1, p);
266+
x1 = U384.modmul(call, u, x0);
267+
U384.modmulAssign(call, x1, y0);
268+
U384.modshl1Assign(call, x1);
268269

269-
x0 = U384.modexp(call, x0, 2, p);
270+
x0 = U384.modexp(call, x0, 2);
270271

271-
y1 = U384.modmul(call, x0, three, p);
272+
y1 = U384.modmul(call, x0, three);
272273

273-
z0 = U384.modexp(call, z0, 2, p);
274-
U384.modmulAssign(call, z0, a, p);
275-
U384.modaddAssign(call, y1, z0, p);
274+
z0 = U384.modexp(call, z0, 2);
275+
U384.modmulAssign(call, z0, a);
276+
U384.modaddAssign(call, y1, z0);
276277

277-
z1 = U384.modexp(call, y1, 2, p);
278-
U384.modshl1AssignTo(call, x0, x1, p);
278+
z1 = U384.modexp(call, y1, 2);
279+
U384.modshl1AssignTo(call, x0, x1);
279280

280281
uint256 diff = U384.sub(p, x0);
281-
U384.modaddAssign(call, z1, diff, p);
282+
U384.modaddAssign(call, z1, diff);
282283

283284
U384.subAssignTo(diff, p, z1);
284-
U384.modaddAssignTo(call, x0, x1, diff, p);
285-
U384.modmulAssign(call, x0, y1, p);
285+
U384.modaddAssignTo(call, x0, x1, diff);
286+
U384.modmulAssign(call, x0, y1);
286287

287-
y0 = U384.modmul(call, y0, u, p);
288-
U384.modexpAssign(call, y0, 2, p);
289-
U384.modshl1Assign(call, y0, p);
288+
y0 = U384.modmul(call, y0, u);
289+
U384.modexpAssign(call, y0, 2);
290+
U384.modshl1Assign(call, y0);
290291

291292
U384.subAssignTo(diff, p, y0);
292-
U384.modaddAssignTo(call, y1, x0, diff, p);
293+
U384.modaddAssignTo(call, y1, x0, diff);
293294

294-
U384.modmulAssignTo(call, x1, u, z1, p);
295+
U384.modmulAssignTo(call, x1, u, z1);
295296

296-
U384.modexpAssignTo(call, z1, u, 2, p);
297-
U384.modmulAssign(call, z1, u, p);
297+
U384.modexpAssignTo(call, z1, u, 2);
298+
U384.modmulAssign(call, z1, u);
298299
}
299300
}
300301

@@ -321,10 +322,10 @@ contract CECDSASHA2Signer is ICertificateSigner, Initializable {
321322
return (x0, y0, z0);
322323
}
323324

324-
x2 = U384.modmul(call, y0, z1, p);
325-
y2 = U384.modmul(call, y1, z0, p);
326-
z2 = U384.modmul(call, x0, z1, p);
327-
y1 = U384.modmul(call, x1, z0, p);
325+
x2 = U384.modmul(call, y0, z1);
326+
y2 = U384.modmul(call, y1, z0);
327+
z2 = U384.modmul(call, x0, z1);
328+
y1 = U384.modmul(call, x1, z0);
328329

329330
if (U384.eq(z2, y1)) {
330331
if (U384.eq(x2, y2)) {
@@ -334,7 +335,7 @@ contract CECDSASHA2Signer is ICertificateSigner, Initializable {
334335
}
335336
}
336337

337-
a = U384.modmul(call, z0, z1, p);
338+
a = U384.modmul(call, z0, z1);
338339

339340
return _addProj2(call, a, z2, p, y1, y2, x2);
340341
}
@@ -354,35 +355,35 @@ contract CECDSASHA2Signer is ICertificateSigner, Initializable {
354355
) internal view returns (uint256 x2, uint256 y2, uint256 z2) {
355356
unchecked {
356357
uint256 diff = U384.sub(p, t1);
357-
y2 = U384.modadd(call, t0, diff, p);
358+
y2 = U384.modadd(call, t0, diff);
358359

359360
U384.subAssignTo(diff, p, u1);
360-
x2 = U384.modadd(call, u0, diff, p);
361-
uint256 u2 = U384.modexp(call, x2, 2, p);
361+
x2 = U384.modadd(call, u0, diff);
362+
uint256 u2 = U384.modexp(call, x2, 2);
362363

363-
z2 = U384.modexp(call, y2, 2, p);
364+
z2 = U384.modexp(call, y2, 2);
364365

365-
U384.modmulAssign(call, z2, v, p);
366-
u1 = U384.modadd(call, u1, u0, p);
367-
U384.modmulAssign(call, u1, u2, p);
366+
U384.modmulAssign(call, z2, v);
367+
u1 = U384.modadd(call, u1, u0);
368+
U384.modmulAssign(call, u1, u2);
368369
U384.subAssignTo(diff, p, u1);
369-
U384.modaddAssign(call, z2, diff, p);
370+
U384.modaddAssign(call, z2, diff);
370371

371-
uint256 u3 = U384.modmul(call, u2, x2, p);
372+
uint256 u3 = U384.modmul(call, u2, x2);
372373

373-
U384.modmulAssign(call, x2, z2, p);
374+
U384.modmulAssign(call, x2, z2);
374375

375-
u0 = U384.modmul(call, u0, u2, p);
376+
u0 = U384.modmul(call, u0, u2);
376377

377378
U384.subAssignTo(diff, p, z2);
378-
U384.modaddAssign(call, u0, diff, p);
379-
U384.modmulAssign(call, y2, u0, p);
380-
t0 = U384.modmul(call, t0, u3, p);
379+
U384.modaddAssign(call, u0, diff);
380+
U384.modmulAssign(call, y2, u0);
381+
t0 = U384.modmul(call, t0, u3);
381382

382383
U384.subAssignTo(diff, p, t0);
383-
U384.modaddAssign(call, y2, diff, p);
384+
U384.modaddAssign(call, y2, diff);
384385

385-
U384.modmulAssignTo(call, z2, u3, v, p);
386+
U384.modmulAssignTo(call, z2, u3, v);
386387
}
387388
}
388389
}

0 commit comments

Comments
 (0)