From e70d0c0bb7e377718da9fae0ff879f86bcafc81d Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Tue, 5 Mar 2019 22:11:09 +0100 Subject: [PATCH] Use BN.red in modexp precompile Add checks for E == 0 and M == 1 Fix M == 1 check Check M lten 1 instead of eq --- lib/precompiled/05-modexp.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/precompiled/05-modexp.js b/lib/precompiled/05-modexp.js index f193c89510..60028bab71 100644 --- a/lib/precompiled/05-modexp.js +++ b/lib/precompiled/05-modexp.js @@ -56,14 +56,14 @@ function getAdjustedExponentLength (data) { return adjustedExpLen } -// Taken from https://stackoverflow.com/a/1503019 function expmod (B, E, M) { if (E.isZero()) return new BN(1).mod(M) - var BM = B.mod(M) - var R = expmod(BM, E.divn(2), M) - R = (R.mul(R)).mod(M) - if (E.mod(new BN(2)).isZero()) return R - return (R.mul(BM)).mod(M) + // Red asserts M > 1 + if (M.lten(1)) return new BN(0) + const red = BN.red(M) + const redB = B.toRed(red) + const res = redB.redPow(E) + return res.fromRed() } function getOOGResults (opts, results) {