Skip to content

Commit 5ea1c32

Browse files
authored
Merge pull request #650 from Kr0emer/fix/bug-006-modpow-negative-exponent
fix(jsbn2): handle negative exponents in BigInteger.modPow
2 parents ee4b013 + ebf11a1 commit 5ea1c32

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

ext/jsbn2.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,9 @@ Barrett.prototype.sqrTo = barrettSqrTo;
411411

412412
// (public) this^e % m (HAC 14.85)
413413
function bnModPow(e,m) {
414+
if(e.signum() < 0) {
415+
return this.modInverse(m).modPow(e.negate(), m);
416+
}
414417
var i = e.bitLength(), k, r = nbv(1), z;
415418
if(i <= 0) return r;
416419
else if(i < 18) k = 1;
@@ -670,4 +673,3 @@ BigInteger.prototype.sqrt = function() {
670673
div = y;
671674
}
672675
}
673-

test/qunit-do-crypto.html

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,23 @@
465465
equal(result, true, "SHA1withRSA(x1234) sign/verify key2prv/key2pub");
466466
});
467467

468+
test("BigInteger.modPow handles negative exponent -1", function() {
469+
var a = new BigInteger("7", 10);
470+
var m = new BigInteger("19", 10);
471+
var got = a.modPow(new BigInteger("-1", 10), m);
472+
var expected = a.modInverse(m);
473+
equal(got.toString(10), expected.toString(10), "a^-1 mod m");
474+
});
475+
476+
test("BigInteger.modPow handles negative exponent -k", function() {
477+
var a = new BigInteger("3", 10);
478+
var m = new BigInteger("23", 10);
479+
var e = new BigInteger("-3", 10);
480+
var got = a.modPow(e, m);
481+
var expected = a.modInverse(m).modPow(e.negate(), m);
482+
equal(got.toString(10), expected.toString(10), "a^-k mod m");
483+
});
484+
468485
});
469486
-->
470487
</script>

0 commit comments

Comments
 (0)