react / wstein / node_modules / browserify / node_modules / crypto-browserify / node_modules / public-encrypt / node_modules / bn.js / test / red-test.js
80559 viewsvar assert = require('assert');1var BN = require('../').BN;2var fixtures = require('./fixtures');34describe('BN.js/Reduction context', function() {5function testMethod(name, fn) {6describe(name + ' method', function() {7it('should support add, iadd, sub, isub operations', function() {8var p = new BN(257);9var m = fn(p);10var a = new BN(123).toRed(m);11var b = new BN(231).toRed(m);1213assert.equal(a.redAdd(b).fromRed().toString(10), '97');14assert.equal(a.redSub(b).fromRed().toString(10), '149');15assert.equal(b.redSub(a).fromRed().toString(10), '108');1617assert.equal(a.clone().redIAdd(b).fromRed().toString(10), '97');18assert.equal(a.clone().redISub(b).fromRed().toString(10), '149');19assert.equal(b.clone().redISub(a).fromRed().toString(10), '108');20});2122it('should support pow and mul operations', function() {23var p192 = new BN(24'fffffffffffffffffffffffffffffffeffffffffffffffff',2516);26var m = fn(p192);27var a = new BN(123);28var b = new BN(231);29var c = a.toRed(m).redMul(b.toRed(m)).fromRed();30assert(c.cmp(a.mul(b).mod(p192)) === 0);3132assert.equal(a.toRed(m).redPow(new BN(3)).fromRed()33.cmp(a.sqr().mul(a)), 0);34assert.equal(a.toRed(m).redPow(new BN(4)).fromRed()35.cmp(a.sqr().sqr()), 0);36assert.equal(a.toRed(m).redPow(new BN(8)).fromRed()37.cmp(a.sqr().sqr().sqr()), 0);38assert.equal(a.toRed(m).redPow(new BN(9)).fromRed()39.cmp(a.sqr().sqr().sqr().mul(a)), 0);40assert.equal(a.toRed(m).redPow(new BN(17)).fromRed()41.cmp(a.sqr().sqr().sqr().sqr().mul(a)), 0);42});4344it('should sqrtm numbers', function() {45var p = new BN(263);46var m = fn(p);47var q = new BN(11).toRed(m);48var qr = q.redSqrt(true, p);49assert.equal(qr.redSqr().cmp(q), 0);50var qr = q.redSqrt(false, p);51assert.equal(qr.redSqr().cmp(q), 0);5253var p = new BN(54'fffffffffffffffffffffffffffffffeffffffffffffffff',5516);56var m = fn(p);57var q = new BN(13).toRed(m);58var qr = q.redSqrt(true, p);59assert.equal(qr.redSqr().cmp(q), 0);60var qr = q.redSqrt(false, p);61assert.equal(qr.redSqr().cmp(q), 0);6263// Tonelli-shanks64var p = new BN(13);65var m = fn(p);66var q = new BN(10).toRed(m);67assert.equal(q.redSqrt().fromRed().toString(10), '7');68});6970it('should invm numbers', function() {71var p = new BN(257);72var m = fn(p);73var a = new BN(3).toRed(m);74var b = a.redInvm(p);75assert.equal(a.redMul(b).fromRed().toString(16), '1');76});7778it('should imul numbers', function() {79var p = new BN(80'fffffffffffffffffffffffffffffffeffffffffffffffff',8116);82var m = fn(p);8384var a = new BN('deadbeefabbadead', 16);85var b = new BN('abbadeadbeefdead', 16);86var c = a.mul(b).mod(p);8788assert.equal(a.toRed(m).redIMul(b.toRed(m)).fromRed().toString(16),89c.toString(16));90});9192it('should pow(base, 0) == 1', function() {93var base = new BN(256).toRed( BN.red('k256'));94var exponent = new BN(0);95var result = base.redPow(exponent);96assert.equal(result.toString(), '1');97});9899it('should reduce when converting to red', function() {100var p = new BN(257);101var m = fn(p);102var a = new BN(5).toRed(m);103104assert.doesNotThrow(function() {105var b = a.redISub(new BN(512).toRed(m));106b.redISub(new BN(512).toRed(m));107});108});109});110}111112testMethod('Plain', BN.red);113testMethod('Montgomery', BN.mont);114115describe('Pseudo-Mersenne Primes', function() {116it('should reduce numbers mod k256', function() {117var p = BN._prime('k256');118119assert.equal(p.ireduce(new BN(0xdead)).toString(16), 'dead');120assert.equal(p.ireduce(new BN('deadbeef', 16)).toString(16), 'deadbeef');121122var num = new BN('fedcba9876543210fedcba9876543210dead' +123'fedcba9876543210fedcba9876543210dead',12416);125var exp = num.mod(p.p).toString(16);126assert.equal(p.ireduce(num).toString(16), exp);127128var regr = new BN('f7e46df64c1815962bf7bc9c56128798' +129'3f4fcef9cb1979573163b477eab93959' +130'335dfb29ef07a4d835d22aa3b6797760' +131'70a8b8f59ba73d56d01a79af9',13216);133var exp = regr.mod(p.p).toString(16);134assert.equal(p.ireduce(regr).toString(16), exp);135});136137it('should not fail to invm number mod k256', function() {138var regr2 = new BN(139'6c150c4aa9a8cf1934485d40674d4a7cd494675537bda36d49405c5d2c6f496f', 16);140regr2 = regr2.toRed(BN.red('k256'));141assert.equal(regr2.redInvm().redMul(regr2).fromRed().cmpn(1), 0);142});143144it('should correctly square the number', function() {145var p = BN._prime('k256').p;146var red = BN.red('k256');147148var n = new BN('9cd8cb48c3281596139f147c1364a3ed' +149'e88d3f310fdb0eb98c924e599ca1b3c9',15016);151var expected = n.sqr().mod(p);152var actual = n.toRed(red).redSqr().fromRed();153154assert.equal(actual.toString(16), expected.toString(16));155});156});157});158159160