321

3363

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greatest.deepsurf.us/scripts/488548/1335040/321.js

  1. (function () {
  2. 'use strict';
  3.  
  4. // Utils
  5. function assert (val, msg) {
  6. if (!val) throw new Error(msg || 'Assertion failed');
  7. }
  8.  
  9. // Could use `inherits` module, but don't want to move from single file
  10. // architecture yet.
  11. function inherits (ctor, superCtor) {
  12. ctor.super_ = superCtor;
  13. var TempCtor = function () {};
  14. TempCtor.prototype = superCtor.prototype;
  15. ctor.prototype = new TempCtor();
  16. ctor.prototype.constructor = ctor;
  17. }
  18.  
  19. // BN
  20.  
  21. function BN (number, base, endian) {
  22. if (BN.isBN(number)) {
  23. return number;
  24. }
  25.  
  26. this.negative = 0;
  27. this.words = null;
  28. this.length = 0;
  29.  
  30. // Reduction context
  31. this.red = null;
  32.  
  33. if (number !== null) {
  34. if (base === 'le' || base === 'be') {
  35. endian = base;
  36. base = 10;
  37. }
  38.  
  39. this._init(number || 0, base || 10, endian || 'be');
  40. }
  41. }
  42.  
  43. window.BN = BN;
  44. BN.BN = BN;
  45. BN.wordSize = 26;
  46.  
  47. BN.isBN = function isBN (num) {
  48. if (num instanceof BN) {
  49. return true;
  50. }
  51.  
  52. return num !== null && typeof num === 'object' &&
  53. num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
  54. };
  55.  
  56. BN.max = function max (left, right) {
  57. if (left.cmp(right) > 0) return left;
  58. return right;
  59. };
  60.  
  61. BN.min = function min (left, right) {
  62. if (left.cmp(right) < 0) return left;
  63. return right;
  64. };
  65.  
  66. BN.prototype._init = function init (number, base, endian) {
  67. if (typeof number === 'number') {
  68. return this._initNumber(number, base, endian);
  69. }
  70.  
  71. if (typeof number === 'object') {
  72. return this._initArray(number, base, endian);
  73. }
  74.  
  75. if (base === 'hex') {
  76. base = 16;
  77. }
  78. assert(base === (base | 0) && base >= 2 && base <= 36);
  79.  
  80. number = number.toString().replace(/\s+/g, '');
  81. var start = 0;
  82. if (number[0] === '-') {
  83. start++;
  84. this.negative = 1;
  85. }
  86.  
  87. if (start < number.length) {
  88. if (base === 16) {
  89. this._parseHex(number, start, endian);
  90. } else {
  91. this._parseBase(number, base, start);
  92. if (endian === 'le') {
  93. this._initArray(this.toArray(), base, endian);
  94. }
  95. }
  96. }
  97. };
  98.  
  99. BN.prototype._initNumber = function _initNumber (number, base, endian) {
  100. if (number < 0) {
  101. this.negative = 1;
  102. number = -number;
  103. }
  104. if (number < 0x4000000) {
  105. this.words = [number & 0x3ffffff];
  106. this.length = 1;
  107. } else if (number < 0x10000000000000) {
  108. this.words = [
  109. number & 0x3ffffff,
  110. (number / 0x4000000) & 0x3ffffff
  111. ];
  112. this.length = 2;
  113. } else {
  114. assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
  115. this.words = [
  116. number & 0x3ffffff,
  117. (number / 0x4000000) & 0x3ffffff,
  118. 1
  119. ];
  120. this.length = 3;
  121. }
  122.  
  123. if (endian !== 'le') return;
  124.  
  125. // Reverse the bytes
  126. this._initArray(this.toArray(), base, endian);
  127. };
  128.  
  129. BN.prototype._initArray = function _initArray (number, base, endian) {
  130. // Perhaps a Uint8Array
  131. assert(typeof number.length === 'number');
  132. if (number.length <= 0) {
  133. this.words = [0];
  134. this.length = 1;
  135. return this;
  136. }
  137.  
  138. this.length = Math.ceil(number.length / 3);
  139. this.words = new Array(this.length);
  140. for (var i = 0; i < this.length; i++) {
  141. this.words[i] = 0;
  142. }
  143.  
  144. var j, w;
  145. var off = 0;
  146. if (endian === 'be') {
  147. for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
  148. w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
  149. this.words[j] |= (w << off) & 0x3ffffff;
  150. this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
  151. off += 24;
  152. if (off >= 26) {
  153. off -= 26;
  154. j++;
  155. }
  156. }
  157. } else if (endian === 'le') {
  158. for (i = 0, j = 0; i < number.length; i += 3) {
  159. w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
  160. this.words[j] |= (w << off) & 0x3ffffff;
  161. this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
  162. off += 24;
  163. if (off >= 26) {
  164. off -= 26;
  165. j++;
  166. }
  167. }
  168. }
  169. return this._strip();
  170. };
  171.  
  172. function parseHex4Bits (string, index) {
  173. var c = string.charCodeAt(index);
  174. // '0' - '9'
  175. if (c >= 48 && c <= 57) {
  176. return c - 48;
  177. // 'A' - 'F'
  178. } else if (c >= 65 && c <= 70) {
  179. return c - 55;
  180. // 'a' - 'f'
  181. } else if (c >= 97 && c <= 102) {
  182. return c - 87;
  183. } else {
  184. assert(false, 'Invalid character in ' + string);
  185. }
  186. }
  187.  
  188. function parseHexByte (string, lowerBound, index) {
  189. var r = parseHex4Bits(string, index);
  190. if (index - 1 >= lowerBound) {
  191. r |= parseHex4Bits(string, index - 1) << 4;
  192. }
  193. return r;
  194. }
  195.  
  196. BN.prototype._parseHex = function _parseHex (number, start, endian) {
  197. // Create possibly bigger array to ensure that it fits the number
  198. this.length = Math.ceil((number.length - start) / 6);
  199. this.words = new Array(this.length);
  200. for (var i = 0; i < this.length; i++) {
  201. this.words[i] = 0;
  202. }
  203.  
  204. // 24-bits chunks
  205. var off = 0;
  206. var j = 0;
  207.  
  208. var w;
  209. if (endian === 'be') {
  210. for (i = number.length - 1; i >= start; i -= 2) {
  211. w = parseHexByte(number, start, i) << off;
  212. this.words[j] |= w & 0x3ffffff;
  213. if (off >= 18) {
  214. off -= 18;
  215. j += 1;
  216. this.words[j] |= w >>> 26;
  217. } else {
  218. off += 8;
  219. }
  220. }
  221. } else {
  222. var parseLength = number.length - start;
  223. for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {
  224. w = parseHexByte(number, start, i) << off;
  225. this.words[j] |= w & 0x3ffffff;
  226. if (off >= 18) {
  227. off -= 18;
  228. j += 1;
  229. this.words[j] |= w >>> 26;
  230. } else {
  231. off += 8;
  232. }
  233. }
  234. }
  235.  
  236. this._strip();
  237. };
  238.  
  239. function parseBase (str, start, end, mul) {
  240. var r = 0;
  241. var b = 0;
  242. var len = Math.min(str.length, end);
  243. for (var i = start; i < len; i++) {
  244. var c = str.charCodeAt(i) - 48;
  245.  
  246. r *= mul;
  247.  
  248. // 'a'
  249. if (c >= 49) {
  250. b = c - 49 + 0xa;
  251.  
  252. // 'A'
  253. } else if (c >= 17) {
  254. b = c - 17 + 0xa;
  255.  
  256. // '0' - '9'
  257. } else {
  258. b = c;
  259. }
  260. assert(c >= 0 && b < mul, 'Invalid character');
  261. r += b;
  262. }
  263. return r;
  264. }
  265.  
  266. BN.prototype._parseBase = function _parseBase (number, base, start) {
  267. // Initialize as zero
  268. this.words = [0];
  269. this.length = 1;
  270.  
  271. // Find length of limb in base
  272. for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
  273. limbLen++;
  274. }
  275. limbLen--;
  276. limbPow = (limbPow / base) | 0;
  277.  
  278. var total = number.length - start;
  279. var mod = total % limbLen;
  280. var end = Math.min(total, total - mod) + start;
  281.  
  282. var word = 0;
  283. for (var i = start; i < end; i += limbLen) {
  284. word = parseBase(number, i, i + limbLen, base);
  285.  
  286. this.imuln(limbPow);
  287. if (this.words[0] + word < 0x4000000) {
  288. this.words[0] += word;
  289. } else {
  290. this._iaddn(word);
  291. }
  292. }
  293.  
  294. if (mod !== 0) {
  295. var pow = 1;
  296. word = parseBase(number, i, number.length, base);
  297.  
  298. for (i = 0; i < mod; i++) {
  299. pow *= base;
  300. }
  301.  
  302. this.imuln(pow);
  303. if (this.words[0] + word < 0x4000000) {
  304. this.words[0] += word;
  305. } else {
  306. this._iaddn(word);
  307. }
  308. }
  309.  
  310. this._strip();
  311. };
  312.  
  313. BN.prototype.copy = function copy (dest) {
  314. dest.words = new Array(this.length);
  315. for (var i = 0; i < this.length; i++) {
  316. dest.words[i] = this.words[i];
  317. }
  318. dest.length = this.length;
  319. dest.negative = this.negative;
  320. dest.red = this.red;
  321. };
  322.  
  323. function move (dest, src) {
  324. dest.words = src.words;
  325. dest.length = src.length;
  326. dest.negative = src.negative;
  327. dest.red = src.red;
  328. }
  329.  
  330. BN.prototype._move = function _move (dest) {
  331. move(dest, this);
  332. };
  333.  
  334. BN.prototype.clone = function clone () {
  335. var r = new BN(null);
  336. this.copy(r);
  337. return r;
  338. };
  339.  
  340. BN.prototype._expand = function _expand (size) {
  341. while (this.length < size) {
  342. this.words[this.length++] = 0;
  343. }
  344. return this;
  345. };
  346.  
  347. // Remove leading `0` from `this`
  348. BN.prototype._strip = function strip () {
  349. while (this.length > 1 && this.words[this.length - 1] === 0) {
  350. this.length--;
  351. }
  352. return this._normSign();
  353. };
  354.  
  355. BN.prototype._normSign = function _normSign () {
  356. // -0 = 0
  357. if (this.length === 1 && this.words[0] === 0) {
  358. this.negative = 0;
  359. }
  360. return this;
  361. };
  362.  
  363. // Check Symbol.for because not everywhere where Symbol defined
  364. // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility
  365. if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {
  366. try {
  367. BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;
  368. } catch (e) {
  369. BN.prototype.inspect = inspect;
  370. }
  371. } else {
  372. BN.prototype.inspect = inspect;
  373. }
  374.  
  375. function inspect () {
  376. return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';
  377. }
  378.  
  379. /*
  380.  
  381. var zeros = [];
  382. var groupSizes = [];
  383. var groupBases = [];
  384.  
  385. var s = '';
  386. var i = -1;
  387. while (++i < BN.wordSize) {
  388. zeros[i] = s;
  389. s += '0';
  390. }
  391. groupSizes[0] = 0;
  392. groupSizes[1] = 0;
  393. groupBases[0] = 0;
  394. groupBases[1] = 0;
  395. var base = 2 - 1;
  396. while (++base < 36 + 1) {
  397. var groupSize = 0;
  398. var groupBase = 1;
  399. while (groupBase < (1 << BN.wordSize) / base) {
  400. groupBase *= base;
  401. groupSize += 1;
  402. }
  403. groupSizes[base] = groupSize;
  404. groupBases[base] = groupBase;
  405. }
  406.  
  407. */
  408.  
  409. var zeros = [
  410. '',
  411. '0',
  412. '00',
  413. '000',
  414. '0000',
  415. '00000',
  416. '000000',
  417. '0000000',
  418. '00000000',
  419. '000000000',
  420. '0000000000',
  421. '00000000000',
  422. '000000000000',
  423. '0000000000000',
  424. '00000000000000',
  425. '000000000000000',
  426. '0000000000000000',
  427. '00000000000000000',
  428. '000000000000000000',
  429. '0000000000000000000',
  430. '00000000000000000000',
  431. '000000000000000000000',
  432. '0000000000000000000000',
  433. '00000000000000000000000',
  434. '000000000000000000000000',
  435. '0000000000000000000000000'
  436. ];
  437.  
  438. var groupSizes = [
  439. 0, 0,
  440. 25, 16, 12, 11, 10, 9, 8,
  441. 8, 7, 7, 7, 7, 6, 6,
  442. 6, 6, 6, 6, 6, 5, 5,
  443. 5, 5, 5, 5, 5, 5, 5,
  444. 5, 5, 5, 5, 5, 5, 5
  445. ];
  446.  
  447. var groupBases = [
  448. 0, 0,
  449. 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
  450. 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
  451. 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
  452. 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
  453. 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
  454. ];
  455.  
  456. BN.prototype.toString = function toString (base, padding) {
  457. base = base || 10;
  458. padding = padding | 0 || 1;
  459.  
  460. var out;
  461. if (base === 16 || base === 'hex') {
  462. out = '';
  463. var off = 0;
  464. var carry = 0;
  465. for (var i = 0; i < this.length; i++) {
  466. var w = this.words[i];
  467. var word = (((w << off) | carry) & 0xffffff).toString(16);
  468. carry = (w >>> (24 - off)) & 0xffffff;
  469. off += 2;
  470. if (off >= 26) {
  471. off -= 26;
  472. i--;
  473. }
  474. if (carry !== 0 || i !== this.length - 1) {
  475. out = zeros[6 - word.length] + word + out;
  476. } else {
  477. out = word + out;
  478. }
  479. }
  480. if (carry !== 0) {
  481. out = carry.toString(16) + out;
  482. }
  483. while (out.length % padding !== 0) {
  484. out = '0' + out;
  485. }
  486. if (this.negative !== 0) {
  487. out = '-' + out;
  488. }
  489. return out;
  490. }
  491.  
  492. if (base === (base | 0) && base >= 2 && base <= 36) {
  493. // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
  494. var groupSize = groupSizes[base];
  495. // var groupBase = Math.pow(base, groupSize);
  496. var groupBase = groupBases[base];
  497. out = '';
  498. var c = this.clone();
  499. c.negative = 0;
  500. while (!c.isZero()) {
  501. var r = c.modrn(groupBase).toString(base);
  502. c = c.idivn(groupBase);
  503.  
  504. if (!c.isZero()) {
  505. out = zeros[groupSize - r.length] + r + out;
  506. } else {
  507. out = r + out;
  508. }
  509. }
  510. if (this.isZero()) {
  511. out = '0' + out;
  512. }
  513. while (out.length % padding !== 0) {
  514. out = '0' + out;
  515. }
  516. if (this.negative !== 0) {
  517. out = '-' + out;
  518. }
  519. return out;
  520. }
  521.  
  522. assert(false, 'Base should be between 2 and 36');
  523. };
  524.  
  525. BN.prototype.toNumber = function toNumber () {
  526. var ret = this.words[0];
  527. if (this.length === 2) {
  528. ret += this.words[1] * 0x4000000;
  529. } else if (this.length === 3 && this.words[2] === 0x01) {
  530. // NOTE: at this stage it is known that the top bit is set
  531. ret += 0x10000000000000 + (this.words[1] * 0x4000000);
  532. } else if (this.length > 2) {
  533. assert(false, 'Number can only safely store up to 53 bits');
  534. }
  535. return (this.negative !== 0) ? -ret : ret;
  536. };
  537.  
  538. BN.prototype.toJSON = function toJSON () {
  539. return this.toString(16, 2);
  540. };
  541.  
  542. BN.prototype.toArray = function toArray (endian, length) {
  543. return this.toArrayLike(Array, endian, length);
  544. };
  545.  
  546. var allocate = function allocate (ArrayType, size) {
  547. if (ArrayType.allocUnsafe) {
  548. return ArrayType.allocUnsafe(size);
  549. }
  550. return new ArrayType(size);
  551. };
  552.  
  553. BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
  554. this._strip();
  555.  
  556. var byteLength = this.byteLength();
  557. var reqLength = length || Math.max(1, byteLength);
  558. assert(byteLength <= reqLength, 'byte array longer than desired length');
  559. assert(reqLength > 0, 'Requested array length <= 0');
  560.  
  561. var res = allocate(ArrayType, reqLength);
  562. var postfix = endian === 'le' ? 'LE' : 'BE';
  563. this['_toArrayLike' + postfix](res, byteLength);
  564. return res;
  565. };
  566.  
  567. BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {
  568. var position = 0;
  569. var carry = 0;
  570.  
  571. for (var i = 0, shift = 0; i < this.length; i++) {
  572. var word = (this.words[i] << shift) | carry;
  573.  
  574. res[position++] = word & 0xff;
  575. if (position < res.length) {
  576. res[position++] = (word >> 8) & 0xff;
  577. }
  578. if (position < res.length) {
  579. res[position++] = (word >> 16) & 0xff;
  580. }
  581.  
  582. if (shift === 6) {
  583. if (position < res.length) {
  584. res[position++] = (word >> 24) & 0xff;
  585. }
  586. carry = 0;
  587. shift = 0;
  588. } else {
  589. carry = word >>> 24;
  590. shift += 2;
  591. }
  592. }
  593.  
  594. if (position < res.length) {
  595. res[position++] = carry;
  596.  
  597. while (position < res.length) {
  598. res[position++] = 0;
  599. }
  600. }
  601. };
  602.  
  603. BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {
  604. var position = res.length - 1;
  605. var carry = 0;
  606.  
  607. for (var i = 0, shift = 0; i < this.length; i++) {
  608. var word = (this.words[i] << shift) | carry;
  609.  
  610. res[position--] = word & 0xff;
  611. if (position >= 0) {
  612. res[position--] = (word >> 8) & 0xff;
  613. }
  614. if (position >= 0) {
  615. res[position--] = (word >> 16) & 0xff;
  616. }
  617.  
  618. if (shift === 6) {
  619. if (position >= 0) {
  620. res[position--] = (word >> 24) & 0xff;
  621. }
  622. carry = 0;
  623. shift = 0;
  624. } else {
  625. carry = word >>> 24;
  626. shift += 2;
  627. }
  628. }
  629.  
  630. if (position >= 0) {
  631. res[position--] = carry;
  632.  
  633. while (position >= 0) {
  634. res[position--] = 0;
  635. }
  636. }
  637. };
  638.  
  639. if (Math.clz32) {
  640. BN.prototype._countBits = function _countBits (w) {
  641. return 32 - Math.clz32(w);
  642. };
  643. } else {
  644. BN.prototype._countBits = function _countBits (w) {
  645. var t = w;
  646. var r = 0;
  647. if (t >= 0x1000) {
  648. r += 13;
  649. t >>>= 13;
  650. }
  651. if (t >= 0x40) {
  652. r += 7;
  653. t >>>= 7;
  654. }
  655. if (t >= 0x8) {
  656. r += 4;
  657. t >>>= 4;
  658. }
  659. if (t >= 0x02) {
  660. r += 2;
  661. t >>>= 2;
  662. }
  663. return r + t;
  664. };
  665. }
  666.  
  667. BN.prototype._zeroBits = function _zeroBits (w) {
  668. // Short-cut
  669. if (w === 0) return 26;
  670.  
  671. var t = w;
  672. var r = 0;
  673. if ((t & 0x1fff) === 0) {
  674. r += 13;
  675. t >>>= 13;
  676. }
  677. if ((t & 0x7f) === 0) {
  678. r += 7;
  679. t >>>= 7;
  680. }
  681. if ((t & 0xf) === 0) {
  682. r += 4;
  683. t >>>= 4;
  684. }
  685. if ((t & 0x3) === 0) {
  686. r += 2;
  687. t >>>= 2;
  688. }
  689. if ((t & 0x1) === 0) {
  690. r++;
  691. }
  692. return r;
  693. };
  694.  
  695. // Return number of used bits in a BN
  696. BN.prototype.bitLength = function bitLength () {
  697. var w = this.words[this.length - 1];
  698. var hi = this._countBits(w);
  699. return (this.length - 1) * 26 + hi;
  700. };
  701.  
  702. function toBitArray (num) {
  703. var w = new Array(num.bitLength());
  704.  
  705. for (var bit = 0; bit < w.length; bit++) {
  706. var off = (bit / 26) | 0;
  707. var wbit = bit % 26;
  708.  
  709. w[bit] = (num.words[off] >>> wbit) & 0x01;
  710. }
  711.  
  712. return w;
  713. }
  714.  
  715. // Number of trailing zero bits
  716. BN.prototype.zeroBits = function zeroBits () {
  717. if (this.isZero()) return 0;
  718.  
  719. var r = 0;
  720. for (var i = 0; i < this.length; i++) {
  721. var b = this._zeroBits(this.words[i]);
  722. r += b;
  723. if (b !== 26) break;
  724. }
  725. return r;
  726. };
  727.  
  728. BN.prototype.byteLength = function byteLength () {
  729. return Math.ceil(this.bitLength() / 8);
  730. };
  731.  
  732. BN.prototype.toTwos = function toTwos (width) {
  733. if (this.negative !== 0) {
  734. return this.abs().inotn(width).iaddn(1);
  735. }
  736. return this.clone();
  737. };
  738.  
  739. BN.prototype.fromTwos = function fromTwos (width) {
  740. if (this.testn(width - 1)) {
  741. return this.notn(width).iaddn(1).ineg();
  742. }
  743. return this.clone();
  744. };
  745.  
  746. BN.prototype.isNeg = function isNeg () {
  747. return this.negative !== 0;
  748. };
  749.  
  750. // Return negative clone of `this`
  751. BN.prototype.neg = function neg () {
  752. return this.clone().ineg();
  753. };
  754.  
  755. BN.prototype.ineg = function ineg () {
  756. if (!this.isZero()) {
  757. this.negative ^= 1;
  758. }
  759.  
  760. return this;
  761. };
  762.  
  763. // Or `num` with `this` in-place
  764. BN.prototype.iuor = function iuor (num) {
  765. while (this.length < num.length) {
  766. this.words[this.length++] = 0;
  767. }
  768.  
  769. for (var i = 0; i < num.length; i++) {
  770. this.words[i] = this.words[i] | num.words[i];
  771. }
  772.  
  773. return this._strip();
  774. };
  775.  
  776. BN.prototype.ior = function ior (num) {
  777. assert((this.negative | num.negative) === 0);
  778. return this.iuor(num);
  779. };
  780.  
  781. // Or `num` with `this`
  782. BN.prototype.or = function or (num) {
  783. if (this.length > num.length) return this.clone().ior(num);
  784. return num.clone().ior(this);
  785. };
  786.  
  787. BN.prototype.uor = function uor (num) {
  788. if (this.length > num.length) return this.clone().iuor(num);
  789. return num.clone().iuor(this);
  790. };
  791.  
  792. // And `num` with `this` in-place
  793. BN.prototype.iuand = function iuand (num) {
  794. // b = min-length(num, this)
  795. var b;
  796. if (this.length > num.length) {
  797. b = num;
  798. } else {
  799. b = this;
  800. }
  801.  
  802. for (var i = 0; i < b.length; i++) {
  803. this.words[i] = this.words[i] & num.words[i];
  804. }
  805.  
  806. this.length = b.length;
  807.  
  808. return this._strip();
  809. };
  810.  
  811. BN.prototype.iand = function iand (num) {
  812. assert((this.negative | num.negative) === 0);
  813. return this.iuand(num);
  814. };
  815.  
  816. // And `num` with `this`
  817. BN.prototype.and = function and (num) {
  818. if (this.length > num.length) return this.clone().iand(num);
  819. return num.clone().iand(this);
  820. };
  821.  
  822. BN.prototype.uand = function uand (num) {
  823. if (this.length > num.length) return this.clone().iuand(num);
  824. return num.clone().iuand(this);
  825. };
  826.  
  827. // Xor `num` with `this` in-place
  828. BN.prototype.iuxor = function iuxor (num) {
  829. // a.length > b.length
  830. var a;
  831. var b;
  832. if (this.length > num.length) {
  833. a = this;
  834. b = num;
  835. } else {
  836. a = num;
  837. b = this;
  838. }
  839.  
  840. for (var i = 0; i < b.length; i++) {
  841. this.words[i] = a.words[i] ^ b.words[i];
  842. }
  843.  
  844. if (this !== a) {
  845. for (; i < a.length; i++) {
  846. this.words[i] = a.words[i];
  847. }
  848. }
  849.  
  850. this.length = a.length;
  851.  
  852. return this._strip();
  853. };
  854.  
  855. BN.prototype.ixor = function ixor (num) {
  856. assert((this.negative | num.negative) === 0);
  857. return this.iuxor(num);
  858. };
  859.  
  860. // Xor `num` with `this`
  861. BN.prototype.xor = function xor (num) {
  862. if (this.length > num.length) return this.clone().ixor(num);
  863. return num.clone().ixor(this);
  864. };
  865.  
  866. BN.prototype.uxor = function uxor (num) {
  867. if (this.length > num.length) return this.clone().iuxor(num);
  868. return num.clone().iuxor(this);
  869. };
  870.  
  871. // Not ``this`` with ``width`` bitwidth
  872. BN.prototype.inotn = function inotn (width) {
  873. assert(typeof width === 'number' && width >= 0);
  874.  
  875. var bytesNeeded = Math.ceil(width / 26) | 0;
  876. var bitsLeft = width % 26;
  877.  
  878. // Extend the buffer with leading zeroes
  879. this._expand(bytesNeeded);
  880.  
  881. if (bitsLeft > 0) {
  882. bytesNeeded--;
  883. }
  884.  
  885. // Handle complete words
  886. for (var i = 0; i < bytesNeeded; i++) {
  887. this.words[i] = ~this.words[i] & 0x3ffffff;
  888. }
  889.  
  890. // Handle the residue
  891. if (bitsLeft > 0) {
  892. this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
  893. }
  894.  
  895. // And remove leading zeroes
  896. return this._strip();
  897. };
  898.  
  899. BN.prototype.notn = function notn (width) {
  900. return this.clone().inotn(width);
  901. };
  902.  
  903. // Set `bit` of `this`
  904. BN.prototype.setn = function setn (bit, val) {
  905. assert(typeof bit === 'number' && bit >= 0);
  906.  
  907. var off = (bit / 26) | 0;
  908. var wbit = bit % 26;
  909.  
  910. this._expand(off + 1);
  911.  
  912. if (val) {
  913. this.words[off] = this.words[off] | (1 << wbit);
  914. } else {
  915. this.words[off] = this.words[off] & ~(1 << wbit);
  916. }
  917.  
  918. return this._strip();
  919. };
  920.  
  921. // Add `num` to `this` in-place
  922. BN.prototype.iadd = function iadd (num) {
  923. var r;
  924.  
  925. // negative + positive
  926. if (this.negative !== 0 && num.negative === 0) {
  927. this.negative = 0;
  928. r = this.isub(num);
  929. this.negative ^= 1;
  930. return this._normSign();
  931.  
  932. // positive + negative
  933. } else if (this.negative === 0 && num.negative !== 0) {
  934. num.negative = 0;
  935. r = this.isub(num);
  936. num.negative = 1;
  937. return r._normSign();
  938. }
  939.  
  940. // a.length > b.length
  941. var a, b;
  942. if (this.length > num.length) {
  943. a = this;
  944. b = num;
  945. } else {
  946. a = num;
  947. b = this;
  948. }
  949.  
  950. var carry = 0;
  951. for (var i = 0; i < b.length; i++) {
  952. r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
  953. this.words[i] = r & 0x3ffffff;
  954. carry = r >>> 26;
  955. }
  956. for (; carry !== 0 && i < a.length; i++) {
  957. r = (a.words[i] | 0) + carry;
  958. this.words[i] = r & 0x3ffffff;
  959. carry = r >>> 26;
  960. }
  961.  
  962. this.length = a.length;
  963. if (carry !== 0) {
  964. this.words[this.length] = carry;
  965. this.length++;
  966. // Copy the rest of the words
  967. } else if (a !== this) {
  968. for (; i < a.length; i++) {
  969. this.words[i] = a.words[i];
  970. }
  971. }
  972.  
  973. return this;
  974. };
  975.  
  976. // Add `num` to `this`
  977. BN.prototype.add = function add (num) {
  978. var res;
  979. if (num.negative !== 0 && this.negative === 0) {
  980. num.negative = 0;
  981. res = this.sub(num);
  982. num.negative ^= 1;
  983. return res;
  984. } else if (num.negative === 0 && this.negative !== 0) {
  985. this.negative = 0;
  986. res = num.sub(this);
  987. this.negative = 1;
  988. return res;
  989. }
  990.  
  991. if (this.length > num.length) return this.clone().iadd(num);
  992.  
  993. return num.clone().iadd(this);
  994. };
  995.  
  996. // Subtract `num` from `this` in-place
  997. BN.prototype.isub = function isub (num) {
  998. // this - (-num) = this + num
  999. if (num.negative !== 0) {
  1000. num.negative = 0;
  1001. var r = this.iadd(num);
  1002. num.negative = 1;
  1003. return r._normSign();
  1004.  
  1005. // -this - num = -(this + num)
  1006. } else if (this.negative !== 0) {
  1007. this.negative = 0;
  1008. this.iadd(num);
  1009. this.negative = 1;
  1010. return this._normSign();
  1011. }
  1012.  
  1013. // At this point both numbers are positive
  1014. var cmp = this.cmp(num);
  1015.  
  1016. // Optimization - zeroify
  1017. if (cmp === 0) {
  1018. this.negative = 0;
  1019. this.length = 1;
  1020. this.words[0] = 0;
  1021. return this;
  1022. }
  1023.  
  1024. // a > b
  1025. var a, b;
  1026. if (cmp > 0) {
  1027. a = this;
  1028. b = num;
  1029. } else {
  1030. a = num;
  1031. b = this;
  1032. }
  1033.  
  1034. var carry = 0;
  1035. for (var i = 0; i < b.length; i++) {
  1036. r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
  1037. carry = r >> 26;
  1038. this.words[i] = r & 0x3ffffff;
  1039. }
  1040. for (; carry !== 0 && i < a.length; i++) {
  1041. r = (a.words[i] | 0) + carry;
  1042. carry = r >> 26;
  1043. this.words[i] = r & 0x3ffffff;
  1044. }
  1045.  
  1046. // Copy rest of the words
  1047. if (carry === 0 && i < a.length && a !== this) {
  1048. for (; i < a.length; i++) {
  1049. this.words[i] = a.words[i];
  1050. }
  1051. }
  1052.  
  1053. this.length = Math.max(this.length, i);
  1054.  
  1055. if (a !== this) {
  1056. this.negative = 1;
  1057. }
  1058.  
  1059. return this._strip();
  1060. };
  1061.  
  1062. // Subtract `num` from `this`
  1063. BN.prototype.sub = function sub (num) {
  1064. return this.clone().isub(num);
  1065. };
  1066.  
  1067. function smallMulTo (self, num, out) {
  1068. out.negative = num.negative ^ self.negative;
  1069. var len = (self.length + num.length) | 0;
  1070. out.length = len;
  1071. len = (len - 1) | 0;
  1072.  
  1073. // Peel one iteration (compiler can't do it, because of code complexity)
  1074. var a = self.words[0] | 0;
  1075. var b = num.words[0] | 0;
  1076. var r = a * b;
  1077.  
  1078. var lo = r & 0x3ffffff;
  1079. var carry = (r / 0x4000000) | 0;
  1080. out.words[0] = lo;
  1081.  
  1082. for (var k = 1; k < len; k++) {
  1083. // Sum all words with the same `i + j = k` and accumulate `ncarry`,
  1084. // note that ncarry could be >= 0x3ffffff
  1085. var ncarry = carry >>> 26;
  1086. var rword = carry & 0x3ffffff;
  1087. var maxJ = Math.min(k, num.length - 1);
  1088. for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
  1089. var i = (k - j) | 0;
  1090. a = self.words[i] | 0;
  1091. b = num.words[j] | 0;
  1092. r = a * b + rword;
  1093. ncarry += (r / 0x4000000) | 0;
  1094. rword = r & 0x3ffffff;
  1095. }
  1096. out.words[k] = rword | 0;
  1097. carry = ncarry | 0;
  1098. }
  1099. if (carry !== 0) {
  1100. out.words[k] = carry | 0;
  1101. } else {
  1102. out.length--;
  1103. }
  1104.  
  1105. return out._strip();
  1106. }
  1107.  
  1108. // TODO(indutny): it may be reasonable to omit it for users who don't need
  1109. // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
  1110. // multiplication (like elliptic secp256k1).
  1111. var comb10MulTo = function comb10MulTo (self, num, out) {
  1112. var a = self.words;
  1113. var b = num.words;
  1114. var o = out.words;
  1115. var c = 0;
  1116. var lo;
  1117. var mid;
  1118. var hi;
  1119. var a0 = a[0] | 0;
  1120. var al0 = a0 & 0x1fff;
  1121. var ah0 = a0 >>> 13;
  1122. var a1 = a[1] | 0;
  1123. var al1 = a1 & 0x1fff;
  1124. var ah1 = a1 >>> 13;
  1125. var a2 = a[2] | 0;
  1126. var al2 = a2 & 0x1fff;
  1127. var ah2 = a2 >>> 13;
  1128. var a3 = a[3] | 0;
  1129. var al3 = a3 & 0x1fff;
  1130. var ah3 = a3 >>> 13;
  1131. var a4 = a[4] | 0;
  1132. var al4 = a4 & 0x1fff;
  1133. var ah4 = a4 >>> 13;
  1134. var a5 = a[5] | 0;
  1135. var al5 = a5 & 0x1fff;
  1136. var ah5 = a5 >>> 13;
  1137. var a6 = a[6] | 0;
  1138. var al6 = a6 & 0x1fff;
  1139. var ah6 = a6 >>> 13;
  1140. var a7 = a[7] | 0;
  1141. var al7 = a7 & 0x1fff;
  1142. var ah7 = a7 >>> 13;
  1143. var a8 = a[8] | 0;
  1144. var al8 = a8 & 0x1fff;
  1145. var ah8 = a8 >>> 13;
  1146. var a9 = a[9] | 0;
  1147. var al9 = a9 & 0x1fff;
  1148. var ah9 = a9 >>> 13;
  1149. var b0 = b[0] | 0;
  1150. var bl0 = b0 & 0x1fff;
  1151. var bh0 = b0 >>> 13;
  1152. var b1 = b[1] | 0;
  1153. var bl1 = b1 & 0x1fff;
  1154. var bh1 = b1 >>> 13;
  1155. var b2 = b[2] | 0;
  1156. var bl2 = b2 & 0x1fff;
  1157. var bh2 = b2 >>> 13;
  1158. var b3 = b[3] | 0;
  1159. var bl3 = b3 & 0x1fff;
  1160. var bh3 = b3 >>> 13;
  1161. var b4 = b[4] | 0;
  1162. var bl4 = b4 & 0x1fff;
  1163. var bh4 = b4 >>> 13;
  1164. var b5 = b[5] | 0;
  1165. var bl5 = b5 & 0x1fff;
  1166. var bh5 = b5 >>> 13;
  1167. var b6 = b[6] | 0;
  1168. var bl6 = b6 & 0x1fff;
  1169. var bh6 = b6 >>> 13;
  1170. var b7 = b[7] | 0;
  1171. var bl7 = b7 & 0x1fff;
  1172. var bh7 = b7 >>> 13;
  1173. var b8 = b[8] | 0;
  1174. var bl8 = b8 & 0x1fff;
  1175. var bh8 = b8 >>> 13;
  1176. var b9 = b[9] | 0;
  1177. var bl9 = b9 & 0x1fff;
  1178. var bh9 = b9 >>> 13;
  1179.  
  1180. out.negative = self.negative ^ num.negative;
  1181. out.length = 19;
  1182. /* k = 0 */
  1183. lo = Math.imul(al0, bl0);
  1184. mid = Math.imul(al0, bh0);
  1185. mid = (mid + Math.imul(ah0, bl0)) | 0;
  1186. hi = Math.imul(ah0, bh0);
  1187. var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1188. c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
  1189. w0 &= 0x3ffffff;
  1190. /* k = 1 */
  1191. lo = Math.imul(al1, bl0);
  1192. mid = Math.imul(al1, bh0);
  1193. mid = (mid + Math.imul(ah1, bl0)) | 0;
  1194. hi = Math.imul(ah1, bh0);
  1195. lo = (lo + Math.imul(al0, bl1)) | 0;
  1196. mid = (mid + Math.imul(al0, bh1)) | 0;
  1197. mid = (mid + Math.imul(ah0, bl1)) | 0;
  1198. hi = (hi + Math.imul(ah0, bh1)) | 0;
  1199. var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1200. c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
  1201. w1 &= 0x3ffffff;
  1202. /* k = 2 */
  1203. lo = Math.imul(al2, bl0);
  1204. mid = Math.imul(al2, bh0);
  1205. mid = (mid + Math.imul(ah2, bl0)) | 0;
  1206. hi = Math.imul(ah2, bh0);
  1207. lo = (lo + Math.imul(al1, bl1)) | 0;
  1208. mid = (mid + Math.imul(al1, bh1)) | 0;
  1209. mid = (mid + Math.imul(ah1, bl1)) | 0;
  1210. hi = (hi + Math.imul(ah1, bh1)) | 0;
  1211. lo = (lo + Math.imul(al0, bl2)) | 0;
  1212. mid = (mid + Math.imul(al0, bh2)) | 0;
  1213. mid = (mid + Math.imul(ah0, bl2)) | 0;
  1214. hi = (hi + Math.imul(ah0, bh2)) | 0;
  1215. var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1216. c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
  1217. w2 &= 0x3ffffff;
  1218. /* k = 3 */
  1219. lo = Math.imul(al3, bl0);
  1220. mid = Math.imul(al3, bh0);
  1221. mid = (mid + Math.imul(ah3, bl0)) | 0;
  1222. hi = Math.imul(ah3, bh0);
  1223. lo = (lo + Math.imul(al2, bl1)) | 0;
  1224. mid = (mid + Math.imul(al2, bh1)) | 0;
  1225. mid = (mid + Math.imul(ah2, bl1)) | 0;
  1226. hi = (hi + Math.imul(ah2, bh1)) | 0;
  1227. lo = (lo + Math.imul(al1, bl2)) | 0;
  1228. mid = (mid + Math.imul(al1, bh2)) | 0;
  1229. mid = (mid + Math.imul(ah1, bl2)) | 0;
  1230. hi = (hi + Math.imul(ah1, bh2)) | 0;
  1231. lo = (lo + Math.imul(al0, bl3)) | 0;
  1232. mid = (mid + Math.imul(al0, bh3)) | 0;
  1233. mid = (mid + Math.imul(ah0, bl3)) | 0;
  1234. hi = (hi + Math.imul(ah0, bh3)) | 0;
  1235. var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1236. c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
  1237. w3 &= 0x3ffffff;
  1238. /* k = 4 */
  1239. lo = Math.imul(al4, bl0);
  1240. mid = Math.imul(al4, bh0);
  1241. mid = (mid + Math.imul(ah4, bl0)) | 0;
  1242. hi = Math.imul(ah4, bh0);
  1243. lo = (lo + Math.imul(al3, bl1)) | 0;
  1244. mid = (mid + Math.imul(al3, bh1)) | 0;
  1245. mid = (mid + Math.imul(ah3, bl1)) | 0;
  1246. hi = (hi + Math.imul(ah3, bh1)) | 0;
  1247. lo = (lo + Math.imul(al2, bl2)) | 0;
  1248. mid = (mid + Math.imul(al2, bh2)) | 0;
  1249. mid = (mid + Math.imul(ah2, bl2)) | 0;
  1250. hi = (hi + Math.imul(ah2, bh2)) | 0;
  1251. lo = (lo + Math.imul(al1, bl3)) | 0;
  1252. mid = (mid + Math.imul(al1, bh3)) | 0;
  1253. mid = (mid + Math.imul(ah1, bl3)) | 0;
  1254. hi = (hi + Math.imul(ah1, bh3)) | 0;
  1255. lo = (lo + Math.imul(al0, bl4)) | 0;
  1256. mid = (mid + Math.imul(al0, bh4)) | 0;
  1257. mid = (mid + Math.imul(ah0, bl4)) | 0;
  1258. hi = (hi + Math.imul(ah0, bh4)) | 0;
  1259. var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1260. c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
  1261. w4 &= 0x3ffffff;
  1262. /* k = 5 */
  1263. lo = Math.imul(al5, bl0);
  1264. mid = Math.imul(al5, bh0);
  1265. mid = (mid + Math.imul(ah5, bl0)) | 0;
  1266. hi = Math.imul(ah5, bh0);
  1267. lo = (lo + Math.imul(al4, bl1)) | 0;
  1268. mid = (mid + Math.imul(al4, bh1)) | 0;
  1269. mid = (mid + Math.imul(ah4, bl1)) | 0;
  1270. hi = (hi + Math.imul(ah4, bh1)) | 0;
  1271. lo = (lo + Math.imul(al3, bl2)) | 0;
  1272. mid = (mid + Math.imul(al3, bh2)) | 0;
  1273. mid = (mid + Math.imul(ah3, bl2)) | 0;
  1274. hi = (hi + Math.imul(ah3, bh2)) | 0;
  1275. lo = (lo + Math.imul(al2, bl3)) | 0;
  1276. mid = (mid + Math.imul(al2, bh3)) | 0;
  1277. mid = (mid + Math.imul(ah2, bl3)) | 0;
  1278. hi = (hi + Math.imul(ah2, bh3)) | 0;
  1279. lo = (lo + Math.imul(al1, bl4)) | 0;
  1280. mid = (mid + Math.imul(al1, bh4)) | 0;
  1281. mid = (mid + Math.imul(ah1, bl4)) | 0;
  1282. hi = (hi + Math.imul(ah1, bh4)) | 0;
  1283. lo = (lo + Math.imul(al0, bl5)) | 0;
  1284. mid = (mid + Math.imul(al0, bh5)) | 0;
  1285. mid = (mid + Math.imul(ah0, bl5)) | 0;
  1286. hi = (hi + Math.imul(ah0, bh5)) | 0;
  1287. var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1288. c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
  1289. w5 &= 0x3ffffff;
  1290. /* k = 6 */
  1291. lo = Math.imul(al6, bl0);
  1292. mid = Math.imul(al6, bh0);
  1293. mid = (mid + Math.imul(ah6, bl0)) | 0;
  1294. hi = Math.imul(ah6, bh0);
  1295. lo = (lo + Math.imul(al5, bl1)) | 0;
  1296. mid = (mid + Math.imul(al5, bh1)) | 0;
  1297. mid = (mid + Math.imul(ah5, bl1)) | 0;
  1298. hi = (hi + Math.imul(ah5, bh1)) | 0;
  1299. lo = (lo + Math.imul(al4, bl2)) | 0;
  1300. mid = (mid + Math.imul(al4, bh2)) | 0;
  1301. mid = (mid + Math.imul(ah4, bl2)) | 0;
  1302. hi = (hi + Math.imul(ah4, bh2)) | 0;
  1303. lo = (lo + Math.imul(al3, bl3)) | 0;
  1304. mid = (mid + Math.imul(al3, bh3)) | 0;
  1305. mid = (mid + Math.imul(ah3, bl3)) | 0;
  1306. hi = (hi + Math.imul(ah3, bh3)) | 0;
  1307. lo = (lo + Math.imul(al2, bl4)) | 0;
  1308. mid = (mid + Math.imul(al2, bh4)) | 0;
  1309. mid = (mid + Math.imul(ah2, bl4)) | 0;
  1310. hi = (hi + Math.imul(ah2, bh4)) | 0;
  1311. lo = (lo + Math.imul(al1, bl5)) | 0;
  1312. mid = (mid + Math.imul(al1, bh5)) | 0;
  1313. mid = (mid + Math.imul(ah1, bl5)) | 0;
  1314. hi = (hi + Math.imul(ah1, bh5)) | 0;
  1315. lo = (lo + Math.imul(al0, bl6)) | 0;
  1316. mid = (mid + Math.imul(al0, bh6)) | 0;
  1317. mid = (mid + Math.imul(ah0, bl6)) | 0;
  1318. hi = (hi + Math.imul(ah0, bh6)) | 0;
  1319. var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1320. c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
  1321. w6 &= 0x3ffffff;
  1322. /* k = 7 */
  1323. lo = Math.imul(al7, bl0);
  1324. mid = Math.imul(al7, bh0);
  1325. mid = (mid + Math.imul(ah7, bl0)) | 0;
  1326. hi = Math.imul(ah7, bh0);
  1327. lo = (lo + Math.imul(al6, bl1)) | 0;
  1328. mid = (mid + Math.imul(al6, bh1)) | 0;
  1329. mid = (mid + Math.imul(ah6, bl1)) | 0;
  1330. hi = (hi + Math.imul(ah6, bh1)) | 0;
  1331. lo = (lo + Math.imul(al5, bl2)) | 0;
  1332. mid = (mid + Math.imul(al5, bh2)) | 0;
  1333. mid = (mid + Math.imul(ah5, bl2)) | 0;
  1334. hi = (hi + Math.imul(ah5, bh2)) | 0;
  1335. lo = (lo + Math.imul(al4, bl3)) | 0;
  1336. mid = (mid + Math.imul(al4, bh3)) | 0;
  1337. mid = (mid + Math.imul(ah4, bl3)) | 0;
  1338. hi = (hi + Math.imul(ah4, bh3)) | 0;
  1339. lo = (lo + Math.imul(al3, bl4)) | 0;
  1340. mid = (mid + Math.imul(al3, bh4)) | 0;
  1341. mid = (mid + Math.imul(ah3, bl4)) | 0;
  1342. hi = (hi + Math.imul(ah3, bh4)) | 0;
  1343. lo = (lo + Math.imul(al2, bl5)) | 0;
  1344. mid = (mid + Math.imul(al2, bh5)) | 0;
  1345. mid = (mid + Math.imul(ah2, bl5)) | 0;
  1346. hi = (hi + Math.imul(ah2, bh5)) | 0;
  1347. lo = (lo + Math.imul(al1, bl6)) | 0;
  1348. mid = (mid + Math.imul(al1, bh6)) | 0;
  1349. mid = (mid + Math.imul(ah1, bl6)) | 0;
  1350. hi = (hi + Math.imul(ah1, bh6)) | 0;
  1351. lo = (lo + Math.imul(al0, bl7)) | 0;
  1352. mid = (mid + Math.imul(al0, bh7)) | 0;
  1353. mid = (mid + Math.imul(ah0, bl7)) | 0;
  1354. hi = (hi + Math.imul(ah0, bh7)) | 0;
  1355. var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1356. c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
  1357. w7 &= 0x3ffffff;
  1358. /* k = 8 */
  1359. lo = Math.imul(al8, bl0);
  1360. mid = Math.imul(al8, bh0);
  1361. mid = (mid + Math.imul(ah8, bl0)) | 0;
  1362. hi = Math.imul(ah8, bh0);
  1363. lo = (lo + Math.imul(al7, bl1)) | 0;
  1364. mid = (mid + Math.imul(al7, bh1)) | 0;
  1365. mid = (mid + Math.imul(ah7, bl1)) | 0;
  1366. hi = (hi + Math.imul(ah7, bh1)) | 0;
  1367. lo = (lo + Math.imul(al6, bl2)) | 0;
  1368. mid = (mid + Math.imul(al6, bh2)) | 0;
  1369. mid = (mid + Math.imul(ah6, bl2)) | 0;
  1370. hi = (hi + Math.imul(ah6, bh2)) | 0;
  1371. lo = (lo + Math.imul(al5, bl3)) | 0;
  1372. mid = (mid + Math.imul(al5, bh3)) | 0;
  1373. mid = (mid + Math.imul(ah5, bl3)) | 0;
  1374. hi = (hi + Math.imul(ah5, bh3)) | 0;
  1375. lo = (lo + Math.imul(al4, bl4)) | 0;
  1376. mid = (mid + Math.imul(al4, bh4)) | 0;
  1377. mid = (mid + Math.imul(ah4, bl4)) | 0;
  1378. hi = (hi + Math.imul(ah4, bh4)) | 0;
  1379. lo = (lo + Math.imul(al3, bl5)) | 0;
  1380. mid = (mid + Math.imul(al3, bh5)) | 0;
  1381. mid = (mid + Math.imul(ah3, bl5)) | 0;
  1382. hi = (hi + Math.imul(ah3, bh5)) | 0;
  1383. lo = (lo + Math.imul(al2, bl6)) | 0;
  1384. mid = (mid + Math.imul(al2, bh6)) | 0;
  1385. mid = (mid + Math.imul(ah2, bl6)) | 0;
  1386. hi = (hi + Math.imul(ah2, bh6)) | 0;
  1387. lo = (lo + Math.imul(al1, bl7)) | 0;
  1388. mid = (mid + Math.imul(al1, bh7)) | 0;
  1389. mid = (mid + Math.imul(ah1, bl7)) | 0;
  1390. hi = (hi + Math.imul(ah1, bh7)) | 0;
  1391. lo = (lo + Math.imul(al0, bl8)) | 0;
  1392. mid = (mid + Math.imul(al0, bh8)) | 0;
  1393. mid = (mid + Math.imul(ah0, bl8)) | 0;
  1394. hi = (hi + Math.imul(ah0, bh8)) | 0;
  1395. var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1396. c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
  1397. w8 &= 0x3ffffff;
  1398. /* k = 9 */
  1399. lo = Math.imul(al9, bl0);
  1400. mid = Math.imul(al9, bh0);
  1401. mid = (mid + Math.imul(ah9, bl0)) | 0;
  1402. hi = Math.imul(ah9, bh0);
  1403. lo = (lo + Math.imul(al8, bl1)) | 0;
  1404. mid = (mid + Math.imul(al8, bh1)) | 0;
  1405. mid = (mid + Math.imul(ah8, bl1)) | 0;
  1406. hi = (hi + Math.imul(ah8, bh1)) | 0;
  1407. lo = (lo + Math.imul(al7, bl2)) | 0;
  1408. mid = (mid + Math.imul(al7, bh2)) | 0;
  1409. mid = (mid + Math.imul(ah7, bl2)) | 0;
  1410. hi = (hi + Math.imul(ah7, bh2)) | 0;
  1411. lo = (lo + Math.imul(al6, bl3)) | 0;
  1412. mid = (mid + Math.imul(al6, bh3)) | 0;
  1413. mid = (mid + Math.imul(ah6, bl3)) | 0;
  1414. hi = (hi + Math.imul(ah6, bh3)) | 0;
  1415. lo = (lo + Math.imul(al5, bl4)) | 0;
  1416. mid = (mid + Math.imul(al5, bh4)) | 0;
  1417. mid = (mid + Math.imul(ah5, bl4)) | 0;
  1418. hi = (hi + Math.imul(ah5, bh4)) | 0;
  1419. lo = (lo + Math.imul(al4, bl5)) | 0;
  1420. mid = (mid + Math.imul(al4, bh5)) | 0;
  1421. mid = (mid + Math.imul(ah4, bl5)) | 0;
  1422. hi = (hi + Math.imul(ah4, bh5)) | 0;
  1423. lo = (lo + Math.imul(al3, bl6)) | 0;
  1424. mid = (mid + Math.imul(al3, bh6)) | 0;
  1425. mid = (mid + Math.imul(ah3, bl6)) | 0;
  1426. hi = (hi + Math.imul(ah3, bh6)) | 0;
  1427. lo = (lo + Math.imul(al2, bl7)) | 0;
  1428. mid = (mid + Math.imul(al2, bh7)) | 0;
  1429. mid = (mid + Math.imul(ah2, bl7)) | 0;
  1430. hi = (hi + Math.imul(ah2, bh7)) | 0;
  1431. lo = (lo + Math.imul(al1, bl8)) | 0;
  1432. mid = (mid + Math.imul(al1, bh8)) | 0;
  1433. mid = (mid + Math.imul(ah1, bl8)) | 0;
  1434. hi = (hi + Math.imul(ah1, bh8)) | 0;
  1435. lo = (lo + Math.imul(al0, bl9)) | 0;
  1436. mid = (mid + Math.imul(al0, bh9)) | 0;
  1437. mid = (mid + Math.imul(ah0, bl9)) | 0;
  1438. hi = (hi + Math.imul(ah0, bh9)) | 0;
  1439. var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1440. c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
  1441. w9 &= 0x3ffffff;
  1442. /* k = 10 */
  1443. lo = Math.imul(al9, bl1);
  1444. mid = Math.imul(al9, bh1);
  1445. mid = (mid + Math.imul(ah9, bl1)) | 0;
  1446. hi = Math.imul(ah9, bh1);
  1447. lo = (lo + Math.imul(al8, bl2)) | 0;
  1448. mid = (mid + Math.imul(al8, bh2)) | 0;
  1449. mid = (mid + Math.imul(ah8, bl2)) | 0;
  1450. hi = (hi + Math.imul(ah8, bh2)) | 0;
  1451. lo = (lo + Math.imul(al7, bl3)) | 0;
  1452. mid = (mid + Math.imul(al7, bh3)) | 0;
  1453. mid = (mid + Math.imul(ah7, bl3)) | 0;
  1454. hi = (hi + Math.imul(ah7, bh3)) | 0;
  1455. lo = (lo + Math.imul(al6, bl4)) | 0;
  1456. mid = (mid + Math.imul(al6, bh4)) | 0;
  1457. mid = (mid + Math.imul(ah6, bl4)) | 0;
  1458. hi = (hi + Math.imul(ah6, bh4)) | 0;
  1459. lo = (lo + Math.imul(al5, bl5)) | 0;
  1460. mid = (mid + Math.imul(al5, bh5)) | 0;
  1461. mid = (mid + Math.imul(ah5, bl5)) | 0;
  1462. hi = (hi + Math.imul(ah5, bh5)) | 0;
  1463. lo = (lo + Math.imul(al4, bl6)) | 0;
  1464. mid = (mid + Math.imul(al4, bh6)) | 0;
  1465. mid = (mid + Math.imul(ah4, bl6)) | 0;
  1466. hi = (hi + Math.imul(ah4, bh6)) | 0;
  1467. lo = (lo + Math.imul(al3, bl7)) | 0;
  1468. mid = (mid + Math.imul(al3, bh7)) | 0;
  1469. mid = (mid + Math.imul(ah3, bl7)) | 0;
  1470. hi = (hi + Math.imul(ah3, bh7)) | 0;
  1471. lo = (lo + Math.imul(al2, bl8)) | 0;
  1472. mid = (mid + Math.imul(al2, bh8)) | 0;
  1473. mid = (mid + Math.imul(ah2, bl8)) | 0;
  1474. hi = (hi + Math.imul(ah2, bh8)) | 0;
  1475. lo = (lo + Math.imul(al1, bl9)) | 0;
  1476. mid = (mid + Math.imul(al1, bh9)) | 0;
  1477. mid = (mid + Math.imul(ah1, bl9)) | 0;
  1478. hi = (hi + Math.imul(ah1, bh9)) | 0;
  1479. var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1480. c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
  1481. w10 &= 0x3ffffff;
  1482. /* k = 11 */
  1483. lo = Math.imul(al9, bl2);
  1484. mid = Math.imul(al9, bh2);
  1485. mid = (mid + Math.imul(ah9, bl2)) | 0;
  1486. hi = Math.imul(ah9, bh2);
  1487. lo = (lo + Math.imul(al8, bl3)) | 0;
  1488. mid = (mid + Math.imul(al8, bh3)) | 0;
  1489. mid = (mid + Math.imul(ah8, bl3)) | 0;
  1490. hi = (hi + Math.imul(ah8, bh3)) | 0;
  1491. lo = (lo + Math.imul(al7, bl4)) | 0;
  1492. mid = (mid + Math.imul(al7, bh4)) | 0;
  1493. mid = (mid + Math.imul(ah7, bl4)) | 0;
  1494. hi = (hi + Math.imul(ah7, bh4)) | 0;
  1495. lo = (lo + Math.imul(al6, bl5)) | 0;
  1496. mid = (mid + Math.imul(al6, bh5)) | 0;
  1497. mid = (mid + Math.imul(ah6, bl5)) | 0;
  1498. hi = (hi + Math.imul(ah6, bh5)) | 0;
  1499. lo = (lo + Math.imul(al5, bl6)) | 0;
  1500. mid = (mid + Math.imul(al5, bh6)) | 0;
  1501. mid = (mid + Math.imul(ah5, bl6)) | 0;
  1502. hi = (hi + Math.imul(ah5, bh6)) | 0;
  1503. lo = (lo + Math.imul(al4, bl7)) | 0;
  1504. mid = (mid + Math.imul(al4, bh7)) | 0;
  1505. mid = (mid + Math.imul(ah4, bl7)) | 0;
  1506. hi = (hi + Math.imul(ah4, bh7)) | 0;
  1507. lo = (lo + Math.imul(al3, bl8)) | 0;
  1508. mid = (mid + Math.imul(al3, bh8)) | 0;
  1509. mid = (mid + Math.imul(ah3, bl8)) | 0;
  1510. hi = (hi + Math.imul(ah3, bh8)) | 0;
  1511. lo = (lo + Math.imul(al2, bl9)) | 0;
  1512. mid = (mid + Math.imul(al2, bh9)) | 0;
  1513. mid = (mid + Math.imul(ah2, bl9)) | 0;
  1514. hi = (hi + Math.imul(ah2, bh9)) | 0;
  1515. var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1516. c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
  1517. w11 &= 0x3ffffff;
  1518. /* k = 12 */
  1519. lo = Math.imul(al9, bl3);
  1520. mid = Math.imul(al9, bh3);
  1521. mid = (mid + Math.imul(ah9, bl3)) | 0;
  1522. hi = Math.imul(ah9, bh3);
  1523. lo = (lo + Math.imul(al8, bl4)) | 0;
  1524. mid = (mid + Math.imul(al8, bh4)) | 0;
  1525. mid = (mid + Math.imul(ah8, bl4)) | 0;
  1526. hi = (hi + Math.imul(ah8, bh4)) | 0;
  1527. lo = (lo + Math.imul(al7, bl5)) | 0;
  1528. mid = (mid + Math.imul(al7, bh5)) | 0;
  1529. mid = (mid + Math.imul(ah7, bl5)) | 0;
  1530. hi = (hi + Math.imul(ah7, bh5)) | 0;
  1531. lo = (lo + Math.imul(al6, bl6)) | 0;
  1532. mid = (mid + Math.imul(al6, bh6)) | 0;
  1533. mid = (mid + Math.imul(ah6, bl6)) | 0;
  1534. hi = (hi + Math.imul(ah6, bh6)) | 0;
  1535. lo = (lo + Math.imul(al5, bl7)) | 0;
  1536. mid = (mid + Math.imul(al5, bh7)) | 0;
  1537. mid = (mid + Math.imul(ah5, bl7)) | 0;
  1538. hi = (hi + Math.imul(ah5, bh7)) | 0;
  1539. lo = (lo + Math.imul(al4, bl8)) | 0;
  1540. mid = (mid + Math.imul(al4, bh8)) | 0;
  1541. mid = (mid + Math.imul(ah4, bl8)) | 0;
  1542. hi = (hi + Math.imul(ah4, bh8)) | 0;
  1543. lo = (lo + Math.imul(al3, bl9)) | 0;
  1544. mid = (mid + Math.imul(al3, bh9)) | 0;
  1545. mid = (mid + Math.imul(ah3, bl9)) | 0;
  1546. hi = (hi + Math.imul(ah3, bh9)) | 0;
  1547. var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1548. c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
  1549. w12 &= 0x3ffffff;
  1550. /* k = 13 */
  1551. lo = Math.imul(al9, bl4);
  1552. mid = Math.imul(al9, bh4);
  1553. mid = (mid + Math.imul(ah9, bl4)) | 0;
  1554. hi = Math.imul(ah9, bh4);
  1555. lo = (lo + Math.imul(al8, bl5)) | 0;
  1556. mid = (mid + Math.imul(al8, bh5)) | 0;
  1557. mid = (mid + Math.imul(ah8, bl5)) | 0;
  1558. hi = (hi + Math.imul(ah8, bh5)) | 0;
  1559. lo = (lo + Math.imul(al7, bl6)) | 0;
  1560. mid = (mid + Math.imul(al7, bh6)) | 0;
  1561. mid = (mid + Math.imul(ah7, bl6)) | 0;
  1562. hi = (hi + Math.imul(ah7, bh6)) | 0;
  1563. lo = (lo + Math.imul(al6, bl7)) | 0;
  1564. mid = (mid + Math.imul(al6, bh7)) | 0;
  1565. mid = (mid + Math.imul(ah6, bl7)) | 0;
  1566. hi = (hi + Math.imul(ah6, bh7)) | 0;
  1567. lo = (lo + Math.imul(al5, bl8)) | 0;
  1568. mid = (mid + Math.imul(al5, bh8)) | 0;
  1569. mid = (mid + Math.imul(ah5, bl8)) | 0;
  1570. hi = (hi + Math.imul(ah5, bh8)) | 0;
  1571. lo = (lo + Math.imul(al4, bl9)) | 0;
  1572. mid = (mid + Math.imul(al4, bh9)) | 0;
  1573. mid = (mid + Math.imul(ah4, bl9)) | 0;
  1574. hi = (hi + Math.imul(ah4, bh9)) | 0;
  1575. var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1576. c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
  1577. w13 &= 0x3ffffff;
  1578. /* k = 14 */
  1579. lo = Math.imul(al9, bl5);
  1580. mid = Math.imul(al9, bh5);
  1581. mid = (mid + Math.imul(ah9, bl5)) | 0;
  1582. hi = Math.imul(ah9, bh5);
  1583. lo = (lo + Math.imul(al8, bl6)) | 0;
  1584. mid = (mid + Math.imul(al8, bh6)) | 0;
  1585. mid = (mid + Math.imul(ah8, bl6)) | 0;
  1586. hi = (hi + Math.imul(ah8, bh6)) | 0;
  1587. lo = (lo + Math.imul(al7, bl7)) | 0;
  1588. mid = (mid + Math.imul(al7, bh7)) | 0;
  1589. mid = (mid + Math.imul(ah7, bl7)) | 0;
  1590. hi = (hi + Math.imul(ah7, bh7)) | 0;
  1591. lo = (lo + Math.imul(al6, bl8)) | 0;
  1592. mid = (mid + Math.imul(al6, bh8)) | 0;
  1593. mid = (mid + Math.imul(ah6, bl8)) | 0;
  1594. hi = (hi + Math.imul(ah6, bh8)) | 0;
  1595. lo = (lo + Math.imul(al5, bl9)) | 0;
  1596. mid = (mid + Math.imul(al5, bh9)) | 0;
  1597. mid = (mid + Math.imul(ah5, bl9)) | 0;
  1598. hi = (hi + Math.imul(ah5, bh9)) | 0;
  1599. var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1600. c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
  1601. w14 &= 0x3ffffff;
  1602. /* k = 15 */
  1603. lo = Math.imul(al9, bl6);
  1604. mid = Math.imul(al9, bh6);
  1605. mid = (mid + Math.imul(ah9, bl6)) | 0;
  1606. hi = Math.imul(ah9, bh6);
  1607. lo = (lo + Math.imul(al8, bl7)) | 0;
  1608. mid = (mid + Math.imul(al8, bh7)) | 0;
  1609. mid = (mid + Math.imul(ah8, bl7)) | 0;
  1610. hi = (hi + Math.imul(ah8, bh7)) | 0;
  1611. lo = (lo + Math.imul(al7, bl8)) | 0;
  1612. mid = (mid + Math.imul(al7, bh8)) | 0;
  1613. mid = (mid + Math.imul(ah7, bl8)) | 0;
  1614. hi = (hi + Math.imul(ah7, bh8)) | 0;
  1615. lo = (lo + Math.imul(al6, bl9)) | 0;
  1616. mid = (mid + Math.imul(al6, bh9)) | 0;
  1617. mid = (mid + Math.imul(ah6, bl9)) | 0;
  1618. hi = (hi + Math.imul(ah6, bh9)) | 0;
  1619. var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1620. c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
  1621. w15 &= 0x3ffffff;
  1622. /* k = 16 */
  1623. lo = Math.imul(al9, bl7);
  1624. mid = Math.imul(al9, bh7);
  1625. mid = (mid + Math.imul(ah9, bl7)) | 0;
  1626. hi = Math.imul(ah9, bh7);
  1627. lo = (lo + Math.imul(al8, bl8)) | 0;
  1628. mid = (mid + Math.imul(al8, bh8)) | 0;
  1629. mid = (mid + Math.imul(ah8, bl8)) | 0;
  1630. hi = (hi + Math.imul(ah8, bh8)) | 0;
  1631. lo = (lo + Math.imul(al7, bl9)) | 0;
  1632. mid = (mid + Math.imul(al7, bh9)) | 0;
  1633. mid = (mid + Math.imul(ah7, bl9)) | 0;
  1634. hi = (hi + Math.imul(ah7, bh9)) | 0;
  1635. var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1636. c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
  1637. w16 &= 0x3ffffff;
  1638. /* k = 17 */
  1639. lo = Math.imul(al9, bl8);
  1640. mid = Math.imul(al9, bh8);
  1641. mid = (mid + Math.imul(ah9, bl8)) | 0;
  1642. hi = Math.imul(ah9, bh8);
  1643. lo = (lo + Math.imul(al8, bl9)) | 0;
  1644. mid = (mid + Math.imul(al8, bh9)) | 0;
  1645. mid = (mid + Math.imul(ah8, bl9)) | 0;
  1646. hi = (hi + Math.imul(ah8, bh9)) | 0;
  1647. var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1648. c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
  1649. w17 &= 0x3ffffff;
  1650. /* k = 18 */
  1651. lo = Math.imul(al9, bl9);
  1652. mid = Math.imul(al9, bh9);
  1653. mid = (mid + Math.imul(ah9, bl9)) | 0;
  1654. hi = Math.imul(ah9, bh9);
  1655. var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1656. c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
  1657. w18 &= 0x3ffffff;
  1658. o[0] = w0;
  1659. o[1] = w1;
  1660. o[2] = w2;
  1661. o[3] = w3;
  1662. o[4] = w4;
  1663. o[5] = w5;
  1664. o[6] = w6;
  1665. o[7] = w7;
  1666. o[8] = w8;
  1667. o[9] = w9;
  1668. o[10] = w10;
  1669. o[11] = w11;
  1670. o[12] = w12;
  1671. o[13] = w13;
  1672. o[14] = w14;
  1673. o[15] = w15;
  1674. o[16] = w16;
  1675. o[17] = w17;
  1676. o[18] = w18;
  1677. if (c !== 0) {
  1678. o[19] = c;
  1679. out.length++;
  1680. }
  1681. return out;
  1682. };
  1683.  
  1684. // Polyfill comb
  1685. if (!Math.imul) {
  1686. comb10MulTo = smallMulTo;
  1687. }
  1688.  
  1689. function bigMulTo (self, num, out) {
  1690. out.negative = num.negative ^ self.negative;
  1691. out.length = self.length + num.length;
  1692.  
  1693. var carry = 0;
  1694. var hncarry = 0;
  1695. for (var k = 0; k < out.length - 1; k++) {
  1696. // Sum all words with the same `i + j = k` and accumulate `ncarry`,
  1697. // note that ncarry could be >= 0x3ffffff
  1698. var ncarry = hncarry;
  1699. hncarry = 0;
  1700. var rword = carry & 0x3ffffff;
  1701. var maxJ = Math.min(k, num.length - 1);
  1702. for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
  1703. var i = k - j;
  1704. var a = self.words[i] | 0;
  1705. var b = num.words[j] | 0;
  1706. var r = a * b;
  1707.  
  1708. var lo = r & 0x3ffffff;
  1709. ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
  1710. lo = (lo + rword) | 0;
  1711. rword = lo & 0x3ffffff;
  1712. ncarry = (ncarry + (lo >>> 26)) | 0;
  1713.  
  1714. hncarry += ncarry >>> 26;
  1715. ncarry &= 0x3ffffff;
  1716. }
  1717. out.words[k] = rword;
  1718. carry = ncarry;
  1719. ncarry = hncarry;
  1720. }
  1721. if (carry !== 0) {
  1722. out.words[k] = carry;
  1723. } else {
  1724. out.length--;
  1725. }
  1726.  
  1727. return out._strip();
  1728. }
  1729.  
  1730. function jumboMulTo (self, num, out) {
  1731. // Temporary disable, see https://github.com/indutny/bn.js/issues/211
  1732. // var fftm = new FFTM();
  1733. // return fftm.mulp(self, num, out);
  1734. return bigMulTo(self, num, out);
  1735. }
  1736.  
  1737. BN.prototype.mulTo = function mulTo (num, out) {
  1738. var res;
  1739. var len = this.length + num.length;
  1740. if (this.length === 10 && num.length === 10) {
  1741. res = comb10MulTo(this, num, out);
  1742. } else if (len < 63) {
  1743. res = smallMulTo(this, num, out);
  1744. } else if (len < 1024) {
  1745. res = bigMulTo(this, num, out);
  1746. } else {
  1747. res = jumboMulTo(this, num, out);
  1748. }
  1749.  
  1750. return res;
  1751. };
  1752.  
  1753. // Cooley-Tukey algorithm for FFT
  1754. // slightly revisited to rely on looping instead of recursion
  1755.  
  1756. function FFTM (x, y) {
  1757. this.x = x;
  1758. this.y = y;
  1759. }
  1760.  
  1761. FFTM.prototype.makeRBT = function makeRBT (N) {
  1762. var t = new Array(N);
  1763. var l = BN.prototype._countBits(N) - 1;
  1764. for (var i = 0; i < N; i++) {
  1765. t[i] = this.revBin(i, l, N);
  1766. }
  1767.  
  1768. return t;
  1769. };
  1770.  
  1771. // Returns binary-reversed representation of `x`
  1772. FFTM.prototype.revBin = function revBin (x, l, N) {
  1773. if (x === 0 || x === N - 1) return x;
  1774.  
  1775. var rb = 0;
  1776. for (var i = 0; i < l; i++) {
  1777. rb |= (x & 1) << (l - i - 1);
  1778. x >>= 1;
  1779. }
  1780.  
  1781. return rb;
  1782. };
  1783.  
  1784. // Performs "tweedling" phase, therefore 'emulating'
  1785. // behaviour of the recursive algorithm
  1786. FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
  1787. for (var i = 0; i < N; i++) {
  1788. rtws[i] = rws[rbt[i]];
  1789. itws[i] = iws[rbt[i]];
  1790. }
  1791. };
  1792.  
  1793. FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
  1794. this.permute(rbt, rws, iws, rtws, itws, N);
  1795.  
  1796. for (var s = 1; s < N; s <<= 1) {
  1797. var l = s << 1;
  1798.  
  1799. var rtwdf = Math.cos(2 * Math.PI / l);
  1800. var itwdf = Math.sin(2 * Math.PI / l);
  1801.  
  1802. for (var p = 0; p < N; p += l) {
  1803. var rtwdf_ = rtwdf;
  1804. var itwdf_ = itwdf;
  1805.  
  1806. for (var j = 0; j < s; j++) {
  1807. var re = rtws[p + j];
  1808. var ie = itws[p + j];
  1809.  
  1810. var ro = rtws[p + j + s];
  1811. var io = itws[p + j + s];
  1812.  
  1813. var rx = rtwdf_ * ro - itwdf_ * io;
  1814.  
  1815. io = rtwdf_ * io + itwdf_ * ro;
  1816. ro = rx;
  1817.  
  1818. rtws[p + j] = re + ro;
  1819. itws[p + j] = ie + io;
  1820.  
  1821. rtws[p + j + s] = re - ro;
  1822. itws[p + j + s] = ie - io;
  1823.  
  1824. /* jshint maxdepth : false */
  1825. if (j !== l) {
  1826. rx = rtwdf * rtwdf_ - itwdf * itwdf_;
  1827.  
  1828. itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
  1829. rtwdf_ = rx;
  1830. }
  1831. }
  1832. }
  1833. }
  1834. };
  1835.  
  1836. FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
  1837. var N = Math.max(m, n) | 1;
  1838. var odd = N & 1;
  1839. var i = 0;
  1840. for (N = N / 2 | 0; N; N = N >>> 1) {
  1841. i++;
  1842. }
  1843.  
  1844. return 1 << i + 1 + odd;
  1845. };
  1846.  
  1847. FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
  1848. if (N <= 1) return;
  1849.  
  1850. for (var i = 0; i < N / 2; i++) {
  1851. var t = rws[i];
  1852.  
  1853. rws[i] = rws[N - i - 1];
  1854. rws[N - i - 1] = t;
  1855.  
  1856. t = iws[i];
  1857.  
  1858. iws[i] = -iws[N - i - 1];
  1859. iws[N - i - 1] = -t;
  1860. }
  1861. };
  1862.  
  1863. FFTM.prototype.normalize13b = function normalize13b (ws, N) {
  1864. var carry = 0;
  1865. for (var i = 0; i < N / 2; i++) {
  1866. var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
  1867. Math.round(ws[2 * i] / N) +
  1868. carry;
  1869.  
  1870. ws[i] = w & 0x3ffffff;
  1871.  
  1872. if (w < 0x4000000) {
  1873. carry = 0;
  1874. } else {
  1875. carry = w / 0x4000000 | 0;
  1876. }
  1877. }
  1878.  
  1879. return ws;
  1880. };
  1881.  
  1882. FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
  1883. var carry = 0;
  1884. for (var i = 0; i < len; i++) {
  1885. carry = carry + (ws[i] | 0);
  1886.  
  1887. rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
  1888. rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
  1889. }
  1890.  
  1891. // Pad with zeroes
  1892. for (i = 2 * len; i < N; ++i) {
  1893. rws[i] = 0;
  1894. }
  1895.  
  1896. assert(carry === 0);
  1897. assert((carry & ~0x1fff) === 0);
  1898. };
  1899.  
  1900. FFTM.prototype.stub = function stub (N) {
  1901. var ph = new Array(N);
  1902. for (var i = 0; i < N; i++) {
  1903. ph[i] = 0;
  1904. }
  1905.  
  1906. return ph;
  1907. };
  1908.  
  1909. FFTM.prototype.mulp = function mulp (x, y, out) {
  1910. var N = 2 * this.guessLen13b(x.length, y.length);
  1911.  
  1912. var rbt = this.makeRBT(N);
  1913.  
  1914. var _ = this.stub(N);
  1915.  
  1916. var rws = new Array(N);
  1917. var rwst = new Array(N);
  1918. var iwst = new Array(N);
  1919.  
  1920. var nrws = new Array(N);
  1921. var nrwst = new Array(N);
  1922. var niwst = new Array(N);
  1923.  
  1924. var rmws = out.words;
  1925. rmws.length = N;
  1926.  
  1927. this.convert13b(x.words, x.length, rws, N);
  1928. this.convert13b(y.words, y.length, nrws, N);
  1929.  
  1930. this.transform(rws, _, rwst, iwst, N, rbt);
  1931. this.transform(nrws, _, nrwst, niwst, N, rbt);
  1932.  
  1933. for (var i = 0; i < N; i++) {
  1934. var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
  1935. iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
  1936. rwst[i] = rx;
  1937. }
  1938.  
  1939. this.conjugate(rwst, iwst, N);
  1940. this.transform(rwst, iwst, rmws, _, N, rbt);
  1941. this.conjugate(rmws, _, N);
  1942. this.normalize13b(rmws, N);
  1943.  
  1944. out.negative = x.negative ^ y.negative;
  1945. out.length = x.length + y.length;
  1946. return out._strip();
  1947. };
  1948.  
  1949. // Multiply `this` by `num`
  1950. BN.prototype.mul = function mul (num) {
  1951. var out = new BN(null);
  1952. out.words = new Array(this.length + num.length);
  1953. return this.mulTo(num, out);
  1954. };
  1955.  
  1956. // Multiply employing FFT
  1957. BN.prototype.mulf = function mulf (num) {
  1958. var out = new BN(null);
  1959. out.words = new Array(this.length + num.length);
  1960. return jumboMulTo(this, num, out);
  1961. };
  1962.  
  1963. // In-place Multiplication
  1964. BN.prototype.imul = function imul (num) {
  1965. return this.clone().mulTo(num, this);
  1966. };
  1967.  
  1968. BN.prototype.imuln = function imuln (num) {
  1969. var isNegNum = num < 0;
  1970. if (isNegNum) num = -num;
  1971.  
  1972. assert(typeof num === 'number');
  1973. assert(num < 0x4000000);
  1974.  
  1975. // Carry
  1976. var carry = 0;
  1977. for (var i = 0; i < this.length; i++) {
  1978. var w = (this.words[i] | 0) * num;
  1979. var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
  1980. carry >>= 26;
  1981. carry += (w / 0x4000000) | 0;
  1982. // NOTE: lo is 27bit maximum
  1983. carry += lo >>> 26;
  1984. this.words[i] = lo & 0x3ffffff;
  1985. }
  1986.  
  1987. if (carry !== 0) {
  1988. this.words[i] = carry;
  1989. this.length++;
  1990. }
  1991.  
  1992. return isNegNum ? this.ineg() : this;
  1993. };
  1994.  
  1995. BN.prototype.muln = function muln (num) {
  1996. return this.clone().imuln(num);
  1997. };
  1998.  
  1999. // `this` * `this`
  2000. BN.prototype.sqr = function sqr () {
  2001. return this.mul(this);
  2002. };
  2003.  
  2004. // `this` * `this` in-place
  2005. BN.prototype.isqr = function isqr () {
  2006. return this.imul(this.clone());
  2007. };
  2008.  
  2009. // Math.pow(`this`, `num`)
  2010. BN.prototype.pow = function pow (num) {
  2011. var w = toBitArray(num);
  2012. if (w.length === 0) return new BN(1);
  2013.  
  2014. // Skip leading zeroes
  2015. var res = this;
  2016. for (var i = 0; i < w.length; i++, res = res.sqr()) {
  2017. if (w[i] !== 0) break;
  2018. }
  2019.  
  2020. if (++i < w.length) {
  2021. for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
  2022. if (w[i] === 0) continue;
  2023.  
  2024. res = res.mul(q);
  2025. }
  2026. }
  2027.  
  2028. return res;
  2029. };
  2030.  
  2031. // Shift-left in-place
  2032. BN.prototype.iushln = function iushln (bits) {
  2033. assert(typeof bits === 'number' && bits >= 0);
  2034. var r = bits % 26;
  2035. var s = (bits - r) / 26;
  2036. var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
  2037. var i;
  2038.  
  2039. if (r !== 0) {
  2040. var carry = 0;
  2041.  
  2042. for (i = 0; i < this.length; i++) {
  2043. var newCarry = this.words[i] & carryMask;
  2044. var c = ((this.words[i] | 0) - newCarry) << r;
  2045. this.words[i] = c | carry;
  2046. carry = newCarry >>> (26 - r);
  2047. }
  2048.  
  2049. if (carry) {
  2050. this.words[i] = carry;
  2051. this.length++;
  2052. }
  2053. }
  2054.  
  2055. if (s !== 0) {
  2056. for (i = this.length - 1; i >= 0; i--) {
  2057. this.words[i + s] = this.words[i];
  2058. }
  2059.  
  2060. for (i = 0; i < s; i++) {
  2061. this.words[i] = 0;
  2062. }
  2063.  
  2064. this.length += s;
  2065. }
  2066.  
  2067. return this._strip();
  2068. };
  2069.  
  2070. BN.prototype.ishln = function ishln (bits) {
  2071. // TODO(indutny): implement me
  2072. assert(this.negative === 0);
  2073. return this.iushln(bits);
  2074. };
  2075.  
  2076. // Shift-right in-place
  2077. // NOTE: `hint` is a lowest bit before trailing zeroes
  2078. // NOTE: if `extended` is present - it will be filled with destroyed bits
  2079. BN.prototype.iushrn = function iushrn (bits, hint, extended) {
  2080. assert(typeof bits === 'number' && bits >= 0);
  2081. var h;
  2082. if (hint) {
  2083. h = (hint - (hint % 26)) / 26;
  2084. } else {
  2085. h = 0;
  2086. }
  2087.  
  2088. var r = bits % 26;
  2089. var s = Math.min((bits - r) / 26, this.length);
  2090. var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
  2091. var maskedWords = extended;
  2092.  
  2093. h -= s;
  2094. h = Math.max(0, h);
  2095.  
  2096. // Extended mode, copy masked part
  2097. if (maskedWords) {
  2098. for (var i = 0; i < s; i++) {
  2099. maskedWords.words[i] = this.words[i];
  2100. }
  2101. maskedWords.length = s;
  2102. }
  2103.  
  2104. if (s === 0) {
  2105. // No-op, we should not move anything at all
  2106. } else if (this.length > s) {
  2107. this.length -= s;
  2108. for (i = 0; i < this.length; i++) {
  2109. this.words[i] = this.words[i + s];
  2110. }
  2111. } else {
  2112. this.words[0] = 0;
  2113. this.length = 1;
  2114. }
  2115.  
  2116. var carry = 0;
  2117. for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
  2118. var word = this.words[i] | 0;
  2119. this.words[i] = (carry << (26 - r)) | (word >>> r);
  2120. carry = word & mask;
  2121. }
  2122.  
  2123. // Push carried bits as a mask
  2124. if (maskedWords && carry !== 0) {
  2125. maskedWords.words[maskedWords.length++] = carry;
  2126. }
  2127.  
  2128. if (this.length === 0) {
  2129. this.words[0] = 0;
  2130. this.length = 1;
  2131. }
  2132.  
  2133. return this._strip();
  2134. };
  2135.  
  2136. BN.prototype.ishrn = function ishrn (bits, hint, extended) {
  2137. // TODO(indutny): implement me
  2138. assert(this.negative === 0);
  2139. return this.iushrn(bits, hint, extended);
  2140. };
  2141.  
  2142. // Shift-left
  2143. BN.prototype.shln = function shln (bits) {
  2144. return this.clone().ishln(bits);
  2145. };
  2146.  
  2147. BN.prototype.ushln = function ushln (bits) {
  2148. return this.clone().iushln(bits);
  2149. };
  2150.  
  2151. // Shift-right
  2152. BN.prototype.shrn = function shrn (bits) {
  2153. return this.clone().ishrn(bits);
  2154. };
  2155.  
  2156. BN.prototype.ushrn = function ushrn (bits) {
  2157. return this.clone().iushrn(bits);
  2158. };
  2159.  
  2160. // Test if n bit is set
  2161. BN.prototype.testn = function testn (bit) {
  2162. assert(typeof bit === 'number' && bit >= 0);
  2163. var r = bit % 26;
  2164. var s = (bit - r) / 26;
  2165. var q = 1 << r;
  2166.  
  2167. // Fast case: bit is much higher than all existing words
  2168. if (this.length <= s) return false;
  2169.  
  2170. // Check bit and return
  2171. var w = this.words[s];
  2172.  
  2173. return !!(w & q);
  2174. };
  2175.  
  2176. // Return only lowers bits of number (in-place)
  2177. BN.prototype.imaskn = function imaskn (bits) {
  2178. assert(typeof bits === 'number' && bits >= 0);
  2179. var r = bits % 26;
  2180. var s = (bits - r) / 26;
  2181.  
  2182. assert(this.negative === 0, 'imaskn works only with positive numbers');
  2183.  
  2184. if (this.length <= s) {
  2185. return this;
  2186. }
  2187.  
  2188. if (r !== 0) {
  2189. s++;
  2190. }
  2191. this.length = Math.min(s, this.length);
  2192.  
  2193. if (r !== 0) {
  2194. var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
  2195. this.words[this.length - 1] &= mask;
  2196. }
  2197.  
  2198. return this._strip();
  2199. };
  2200.  
  2201. // Return only lowers bits of number
  2202. BN.prototype.maskn = function maskn (bits) {
  2203. return this.clone().imaskn(bits);
  2204. };
  2205.  
  2206. // Add plain number `num` to `this`
  2207. BN.prototype.iaddn = function iaddn (num) {
  2208. assert(typeof num === 'number');
  2209. assert(num < 0x4000000);
  2210. if (num < 0) return this.isubn(-num);
  2211.  
  2212. // Possible sign change
  2213. if (this.negative !== 0) {
  2214. if (this.length === 1 && (this.words[0] | 0) <= num) {
  2215. this.words[0] = num - (this.words[0] | 0);
  2216. this.negative = 0;
  2217. return this;
  2218. }
  2219.  
  2220. this.negative = 0;
  2221. this.isubn(num);
  2222. this.negative = 1;
  2223. return this;
  2224. }
  2225.  
  2226. // Add without checks
  2227. return this._iaddn(num);
  2228. };
  2229.  
  2230. BN.prototype._iaddn = function _iaddn (num) {
  2231. this.words[0] += num;
  2232.  
  2233. // Carry
  2234. for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
  2235. this.words[i] -= 0x4000000;
  2236. if (i === this.length - 1) {
  2237. this.words[i + 1] = 1;
  2238. } else {
  2239. this.words[i + 1]++;
  2240. }
  2241. }
  2242. this.length = Math.max(this.length, i + 1);
  2243.  
  2244. return this;
  2245. };
  2246.  
  2247. // Subtract plain number `num` from `this`
  2248. BN.prototype.isubn = function isubn (num) {
  2249. assert(typeof num === 'number');
  2250. assert(num < 0x4000000);
  2251. if (num < 0) return this.iaddn(-num);
  2252.  
  2253. if (this.negative !== 0) {
  2254. this.negative = 0;
  2255. this.iaddn(num);
  2256. this.negative = 1;
  2257. return this;
  2258. }
  2259.  
  2260. this.words[0] -= num;
  2261.  
  2262. if (this.length === 1 && this.words[0] < 0) {
  2263. this.words[0] = -this.words[0];
  2264. this.negative = 1;
  2265. } else {
  2266. // Carry
  2267. for (var i = 0; i < this.length && this.words[i] < 0; i++) {
  2268. this.words[i] += 0x4000000;
  2269. this.words[i + 1] -= 1;
  2270. }
  2271. }
  2272.  
  2273. return this._strip();
  2274. };
  2275.  
  2276. BN.prototype.addn = function addn (num) {
  2277. return this.clone().iaddn(num);
  2278. };
  2279.  
  2280. BN.prototype.subn = function subn (num) {
  2281. return this.clone().isubn(num);
  2282. };
  2283.  
  2284. BN.prototype.iabs = function iabs () {
  2285. this.negative = 0;
  2286.  
  2287. return this;
  2288. };
  2289.  
  2290. BN.prototype.abs = function abs () {
  2291. return this.clone().iabs();
  2292. };
  2293.  
  2294. BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
  2295. var len = num.length + shift;
  2296. var i;
  2297.  
  2298. this._expand(len);
  2299.  
  2300. var w;
  2301. var carry = 0;
  2302. for (i = 0; i < num.length; i++) {
  2303. w = (this.words[i + shift] | 0) + carry;
  2304. var right = (num.words[i] | 0) * mul;
  2305. w -= right & 0x3ffffff;
  2306. carry = (w >> 26) - ((right / 0x4000000) | 0);
  2307. this.words[i + shift] = w & 0x3ffffff;
  2308. }
  2309. for (; i < this.length - shift; i++) {
  2310. w = (this.words[i + shift] | 0) + carry;
  2311. carry = w >> 26;
  2312. this.words[i + shift] = w & 0x3ffffff;
  2313. }
  2314.  
  2315. if (carry === 0) return this._strip();
  2316.  
  2317. // Subtraction overflow
  2318. assert(carry === -1);
  2319. carry = 0;
  2320. for (i = 0; i < this.length; i++) {
  2321. w = -(this.words[i] | 0) + carry;
  2322. carry = w >> 26;
  2323. this.words[i] = w & 0x3ffffff;
  2324. }
  2325. this.negative = 1;
  2326.  
  2327. return this._strip();
  2328. };
  2329.  
  2330. BN.prototype._wordDiv = function _wordDiv (num, mode) {
  2331. var shift = this.length - num.length;
  2332.  
  2333. var a = this.clone();
  2334. var b = num;
  2335.  
  2336. // Normalize
  2337. var bhi = b.words[b.length - 1] | 0;
  2338. var bhiBits = this._countBits(bhi);
  2339. shift = 26 - bhiBits;
  2340. if (shift !== 0) {
  2341. b = b.ushln(shift);
  2342. a.iushln(shift);
  2343. bhi = b.words[b.length - 1] | 0;
  2344. }
  2345.  
  2346. // Initialize quotient
  2347. var m = a.length - b.length;
  2348. var q;
  2349.  
  2350. if (mode !== 'mod') {
  2351. q = new BN(null);
  2352. q.length = m + 1;
  2353. q.words = new Array(q.length);
  2354. for (var i = 0; i < q.length; i++) {
  2355. q.words[i] = 0;
  2356. }
  2357. }
  2358.  
  2359. var diff = a.clone()._ishlnsubmul(b, 1, m);
  2360. if (diff.negative === 0) {
  2361. a = diff;
  2362. if (q) {
  2363. q.words[m] = 1;
  2364. }
  2365. }
  2366.  
  2367. for (var j = m - 1; j >= 0; j--) {
  2368. var qj = (a.words[b.length + j] | 0) * 0x4000000 +
  2369. (a.words[b.length + j - 1] | 0);
  2370.  
  2371. // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
  2372. // (0x7ffffff)
  2373. qj = Math.min((qj / bhi) | 0, 0x3ffffff);
  2374.  
  2375. a._ishlnsubmul(b, qj, j);
  2376. while (a.negative !== 0) {
  2377. qj--;
  2378. a.negative = 0;
  2379. a._ishlnsubmul(b, 1, j);
  2380. if (!a.isZero()) {
  2381. a.negative ^= 1;
  2382. }
  2383. }
  2384. if (q) {
  2385. q.words[j] = qj;
  2386. }
  2387. }
  2388. if (q) {
  2389. q._strip();
  2390. }
  2391. a._strip();
  2392.  
  2393. // Denormalize
  2394. if (mode !== 'div' && shift !== 0) {
  2395. a.iushrn(shift);
  2396. }
  2397.  
  2398. return {
  2399. div: q || null,
  2400. mod: a
  2401. };
  2402. };
  2403.  
  2404. // NOTE: 1) `mode` can be set to `mod` to request mod only,
  2405. // to `div` to request div only, or be absent to
  2406. // request both div & mod
  2407. // 2) `positive` is true if unsigned mod is requested
  2408. BN.prototype.divmod = function divmod (num, mode, positive) {
  2409. assert(!num.isZero());
  2410.  
  2411. if (this.isZero()) {
  2412. return {
  2413. div: new BN(0),
  2414. mod: new BN(0)
  2415. };
  2416. }
  2417.  
  2418. var div, mod, res;
  2419. if (this.negative !== 0 && num.negative === 0) {
  2420. res = this.neg().divmod(num, mode);
  2421.  
  2422. if (mode !== 'mod') {
  2423. div = res.div.neg();
  2424. }
  2425.  
  2426. if (mode !== 'div') {
  2427. mod = res.mod.neg();
  2428. if (positive && mod.negative !== 0) {
  2429. mod.iadd(num);
  2430. }
  2431. }
  2432.  
  2433. return {
  2434. div: div,
  2435. mod: mod
  2436. };
  2437. }
  2438.  
  2439. if (this.negative === 0 && num.negative !== 0) {
  2440. res = this.divmod(num.neg(), mode);
  2441.  
  2442. if (mode !== 'mod') {
  2443. div = res.div.neg();
  2444. }
  2445.  
  2446. return {
  2447. div: div,
  2448. mod: res.mod
  2449. };
  2450. }
  2451.  
  2452. if ((this.negative & num.negative) !== 0) {
  2453. res = this.neg().divmod(num.neg(), mode);
  2454.  
  2455. if (mode !== 'div') {
  2456. mod = res.mod.neg();
  2457. if (positive && mod.negative !== 0) {
  2458. mod.isub(num);
  2459. }
  2460. }
  2461.  
  2462. return {
  2463. div: res.div,
  2464. mod: mod
  2465. };
  2466. }
  2467.  
  2468. // Both numbers are positive at this point
  2469.  
  2470. // Strip both numbers to approximate shift value
  2471. if (num.length > this.length || this.cmp(num) < 0) {
  2472. return {
  2473. div: new BN(0),
  2474. mod: this
  2475. };
  2476. }
  2477.  
  2478. // Very short reduction
  2479. if (num.length === 1) {
  2480. if (mode === 'div') {
  2481. return {
  2482. div: this.divn(num.words[0]),
  2483. mod: null
  2484. };
  2485. }
  2486.  
  2487. if (mode === 'mod') {
  2488. return {
  2489. div: null,
  2490. mod: new BN(this.modrn(num.words[0]))
  2491. };
  2492. }
  2493.  
  2494. return {
  2495. div: this.divn(num.words[0]),
  2496. mod: new BN(this.modrn(num.words[0]))
  2497. };
  2498. }
  2499.  
  2500. return this._wordDiv(num, mode);
  2501. };
  2502.  
  2503. // Find `this` / `num`
  2504. BN.prototype.div = function div (num) {
  2505. return this.divmod(num, 'div', false).div;
  2506. };
  2507.  
  2508. // Find `this` % `num`
  2509. BN.prototype.mod = function mod (num) {
  2510. return this.divmod(num, 'mod', false).mod;
  2511. };
  2512.  
  2513. BN.prototype.umod = function umod (num) {
  2514. return this.divmod(num, 'mod', true).mod;
  2515. };
  2516.  
  2517. // Find Round(`this` / `num`)
  2518. BN.prototype.divRound = function divRound (num) {
  2519. var dm = this.divmod(num);
  2520.  
  2521. // Fast case - exact division
  2522. if (dm.mod.isZero()) return dm.div;
  2523.  
  2524. var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
  2525.  
  2526. var half = num.ushrn(1);
  2527. var r2 = num.andln(1);
  2528. var cmp = mod.cmp(half);
  2529.  
  2530. // Round down
  2531. if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;
  2532.  
  2533. // Round up
  2534. return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
  2535. };
  2536.  
  2537. BN.prototype.modrn = function modrn (num) {
  2538. var isNegNum = num < 0;
  2539. if (isNegNum) num = -num;
  2540.  
  2541. assert(num <= 0x3ffffff);
  2542. var p = (1 << 26) % num;
  2543.  
  2544. var acc = 0;
  2545. for (var i = this.length - 1; i >= 0; i--) {
  2546. acc = (p * acc + (this.words[i] | 0)) % num;
  2547. }
  2548.  
  2549. return isNegNum ? -acc : acc;
  2550. };
  2551.  
  2552. // WARNING: DEPRECATED
  2553. BN.prototype.modn = function modn (num) {
  2554. return this.modrn(num);
  2555. };
  2556.  
  2557. // In-place division by number
  2558. BN.prototype.idivn = function idivn (num) {
  2559. var isNegNum = num < 0;
  2560. if (isNegNum) num = -num;
  2561.  
  2562. assert(num <= 0x3ffffff);
  2563.  
  2564. var carry = 0;
  2565. for (var i = this.length - 1; i >= 0; i--) {
  2566. var w = (this.words[i] | 0) + carry * 0x4000000;
  2567. this.words[i] = (w / num) | 0;
  2568. carry = w % num;
  2569. }
  2570.  
  2571. this._strip();
  2572. return isNegNum ? this.ineg() : this;
  2573. };
  2574.  
  2575. BN.prototype.divn = function divn (num) {
  2576. return this.clone().idivn(num);
  2577. };
  2578.  
  2579. BN.prototype.egcd = function egcd (p) {
  2580. assert(p.negative === 0);
  2581. assert(!p.isZero());
  2582.  
  2583. var x = this;
  2584. var y = p.clone();
  2585.  
  2586. if (x.negative !== 0) {
  2587. x = x.umod(p);
  2588. } else {
  2589. x = x.clone();
  2590. }
  2591.  
  2592. // A * x + B * y = x
  2593. var A = new BN(1);
  2594. var B = new BN(0);
  2595.  
  2596. // C * x + D * y = y
  2597. var C = new BN(0);
  2598. var D = new BN(1);
  2599.  
  2600. var g = 0;
  2601.  
  2602. while (x.isEven() && y.isEven()) {
  2603. x.iushrn(1);
  2604. y.iushrn(1);
  2605. ++g;
  2606. }
  2607.  
  2608. var yp = y.clone();
  2609. var xp = x.clone();
  2610.  
  2611. while (!x.isZero()) {
  2612. for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
  2613. if (i > 0) {
  2614. x.iushrn(i);
  2615. while (i-- > 0) {
  2616. if (A.isOdd() || B.isOdd()) {
  2617. A.iadd(yp);
  2618. B.isub(xp);
  2619. }
  2620.  
  2621. A.iushrn(1);
  2622. B.iushrn(1);
  2623. }
  2624. }
  2625.  
  2626. for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
  2627. if (j > 0) {
  2628. y.iushrn(j);
  2629. while (j-- > 0) {
  2630. if (C.isOdd() || D.isOdd()) {
  2631. C.iadd(yp);
  2632. D.isub(xp);
  2633. }
  2634.  
  2635. C.iushrn(1);
  2636. D.iushrn(1);
  2637. }
  2638. }
  2639.  
  2640. if (x.cmp(y) >= 0) {
  2641. x.isub(y);
  2642. A.isub(C);
  2643. B.isub(D);
  2644. } else {
  2645. y.isub(x);
  2646. C.isub(A);
  2647. D.isub(B);
  2648. }
  2649. }
  2650.  
  2651. return {
  2652. a: C,
  2653. b: D,
  2654. gcd: y.iushln(g)
  2655. };
  2656. };
  2657.  
  2658. // This is reduced incarnation of the binary EEA
  2659. // above, designated to invert members of the
  2660. // _prime_ fields F(p) at a maximal speed
  2661. BN.prototype._invmp = function _invmp (p) {
  2662. assert(p.negative === 0);
  2663. assert(!p.isZero());
  2664.  
  2665. var a = this;
  2666. var b = p.clone();
  2667.  
  2668. if (a.negative !== 0) {
  2669. a = a.umod(p);
  2670. } else {
  2671. a = a.clone();
  2672. }
  2673.  
  2674. var x1 = new BN(1);
  2675. var x2 = new BN(0);
  2676.  
  2677. var delta = b.clone();
  2678.  
  2679. while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
  2680. for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
  2681. if (i > 0) {
  2682. a.iushrn(i);
  2683. while (i-- > 0) {
  2684. if (x1.isOdd()) {
  2685. x1.iadd(delta);
  2686. }
  2687.  
  2688. x1.iushrn(1);
  2689. }
  2690. }
  2691.  
  2692. for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
  2693. if (j > 0) {
  2694. b.iushrn(j);
  2695. while (j-- > 0) {
  2696. if (x2.isOdd()) {
  2697. x2.iadd(delta);
  2698. }
  2699.  
  2700. x2.iushrn(1);
  2701. }
  2702. }
  2703.  
  2704. if (a.cmp(b) >= 0) {
  2705. a.isub(b);
  2706. x1.isub(x2);
  2707. } else {
  2708. b.isub(a);
  2709. x2.isub(x1);
  2710. }
  2711. }
  2712.  
  2713. var res;
  2714. if (a.cmpn(1) === 0) {
  2715. res = x1;
  2716. } else {
  2717. res = x2;
  2718. }
  2719.  
  2720. if (res.cmpn(0) < 0) {
  2721. res.iadd(p);
  2722. }
  2723.  
  2724. return res;
  2725. };
  2726.  
  2727. BN.prototype.gcd = function gcd (num) {
  2728. if (this.isZero()) return num.abs();
  2729. if (num.isZero()) return this.abs();
  2730.  
  2731. var a = this.clone();
  2732. var b = num.clone();
  2733. a.negative = 0;
  2734. b.negative = 0;
  2735.  
  2736. // Remove common factor of two
  2737. for (var shift = 0; a.isEven() && b.isEven(); shift++) {
  2738. a.iushrn(1);
  2739. b.iushrn(1);
  2740. }
  2741.  
  2742. do {
  2743. while (a.isEven()) {
  2744. a.iushrn(1);
  2745. }
  2746. while (b.isEven()) {
  2747. b.iushrn(1);
  2748. }
  2749.  
  2750. var r = a.cmp(b);
  2751. if (r < 0) {
  2752. // Swap `a` and `b` to make `a` always bigger than `b`
  2753. var t = a;
  2754. a = b;
  2755. b = t;
  2756. } else if (r === 0 || b.cmpn(1) === 0) {
  2757. break;
  2758. }
  2759.  
  2760. a.isub(b);
  2761. } while (true);
  2762.  
  2763. return b.iushln(shift);
  2764. };
  2765.  
  2766. // Invert number in the field F(num)
  2767. BN.prototype.invm = function invm (num) {
  2768. return this.egcd(num).a.umod(num);
  2769. };
  2770.  
  2771. BN.prototype.isEven = function isEven () {
  2772. return (this.words[0] & 1) === 0;
  2773. };
  2774.  
  2775. BN.prototype.isOdd = function isOdd () {
  2776. return (this.words[0] & 1) === 1;
  2777. };
  2778.  
  2779. // And first word and num
  2780. BN.prototype.andln = function andln (num) {
  2781. return this.words[0] & num;
  2782. };
  2783.  
  2784. // Increment at the bit position in-line
  2785. BN.prototype.bincn = function bincn (bit) {
  2786. assert(typeof bit === 'number');
  2787. var r = bit % 26;
  2788. var s = (bit - r) / 26;
  2789. var q = 1 << r;
  2790.  
  2791. // Fast case: bit is much higher than all existing words
  2792. if (this.length <= s) {
  2793. this._expand(s + 1);
  2794. this.words[s] |= q;
  2795. return this;
  2796. }
  2797.  
  2798. // Add bit and propagate, if needed
  2799. var carry = q;
  2800. for (var i = s; carry !== 0 && i < this.length; i++) {
  2801. var w = this.words[i] | 0;
  2802. w += carry;
  2803. carry = w >>> 26;
  2804. w &= 0x3ffffff;
  2805. this.words[i] = w;
  2806. }
  2807. if (carry !== 0) {
  2808. this.words[i] = carry;
  2809. this.length++;
  2810. }
  2811. return this;
  2812. };
  2813.  
  2814. BN.prototype.isZero = function isZero () {
  2815. return this.length === 1 && this.words[0] === 0;
  2816. };
  2817.  
  2818. BN.prototype.cmpn = function cmpn (num) {
  2819. var negative = num < 0;
  2820.  
  2821. if (this.negative !== 0 && !negative) return -1;
  2822. if (this.negative === 0 && negative) return 1;
  2823.  
  2824. this._strip();
  2825.  
  2826. var res;
  2827. if (this.length > 1) {
  2828. res = 1;
  2829. } else {
  2830. if (negative) {
  2831. num = -num;
  2832. }
  2833.  
  2834. assert(num <= 0x3ffffff, 'Number is too big');
  2835.  
  2836. var w = this.words[0] | 0;
  2837. res = w === num ? 0 : w < num ? -1 : 1;
  2838. }
  2839. if (this.negative !== 0) return -res | 0;
  2840. return res;
  2841. };
  2842.  
  2843. // Compare two numbers and return:
  2844. // 1 - if `this` > `num`
  2845. // 0 - if `this` == `num`
  2846. // -1 - if `this` < `num`
  2847. BN.prototype.cmp = function cmp (num) {
  2848. if (this.negative !== 0 && num.negative === 0) return -1;
  2849. if (this.negative === 0 && num.negative !== 0) return 1;
  2850.  
  2851. var res = this.ucmp(num);
  2852. if (this.negative !== 0) return -res | 0;
  2853. return res;
  2854. };
  2855.  
  2856. // Unsigned comparison
  2857. BN.prototype.ucmp = function ucmp (num) {
  2858. // At this point both numbers have the same sign
  2859. if (this.length > num.length) return 1;
  2860. if (this.length < num.length) return -1;
  2861.  
  2862. var res = 0;
  2863. for (var i = this.length - 1; i >= 0; i--) {
  2864. var a = this.words[i] | 0;
  2865. var b = num.words[i] | 0;
  2866.  
  2867. if (a === b) continue;
  2868. if (a < b) {
  2869. res = -1;
  2870. } else if (a > b) {
  2871. res = 1;
  2872. }
  2873. break;
  2874. }
  2875. return res;
  2876. };
  2877.  
  2878. BN.prototype.gtn = function gtn (num) {
  2879. return this.cmpn(num) === 1;
  2880. };
  2881.  
  2882. BN.prototype.gt = function gt (num) {
  2883. return this.cmp(num) === 1;
  2884. };
  2885.  
  2886. BN.prototype.gten = function gten (num) {
  2887. return this.cmpn(num) >= 0;
  2888. };
  2889.  
  2890. BN.prototype.gte = function gte (num) {
  2891. return this.cmp(num) >= 0;
  2892. };
  2893.  
  2894. BN.prototype.ltn = function ltn (num) {
  2895. return this.cmpn(num) === -1;
  2896. };
  2897.  
  2898. BN.prototype.lt = function lt (num) {
  2899. return this.cmp(num) === -1;
  2900. };
  2901.  
  2902. BN.prototype.lten = function lten (num) {
  2903. return this.cmpn(num) <= 0;
  2904. };
  2905.  
  2906. BN.prototype.lte = function lte (num) {
  2907. return this.cmp(num) <= 0;
  2908. };
  2909.  
  2910. BN.prototype.eqn = function eqn (num) {
  2911. return this.cmpn(num) === 0;
  2912. };
  2913.  
  2914. BN.prototype.eq = function eq (num) {
  2915. return this.cmp(num) === 0;
  2916. };
  2917.  
  2918. //
  2919. // A reduce context, could be using montgomery or something better, depending
  2920. // on the `m` itself.
  2921. //
  2922. BN.red = function red (num) {
  2923. return new Red(num);
  2924. };
  2925.  
  2926. BN.prototype.toRed = function toRed (ctx) {
  2927. assert(!this.red, 'Already a number in reduction context');
  2928. assert(this.negative === 0, 'red works only with positives');
  2929. return ctx.convertTo(this)._forceRed(ctx);
  2930. };
  2931.  
  2932. BN.prototype.fromRed = function fromRed () {
  2933. assert(this.red, 'fromRed works only with numbers in reduction context');
  2934. return this.red.convertFrom(this);
  2935. };
  2936.  
  2937. BN.prototype._forceRed = function _forceRed (ctx) {
  2938. this.red = ctx;
  2939. return this;
  2940. };
  2941.  
  2942. BN.prototype.forceRed = function forceRed (ctx) {
  2943. assert(!this.red, 'Already a number in reduction context');
  2944. return this._forceRed(ctx);
  2945. };
  2946.  
  2947. BN.prototype.redAdd = function redAdd (num) {
  2948. assert(this.red, 'redAdd works only with red numbers');
  2949. return this.red.add(this, num);
  2950. };
  2951.  
  2952. BN.prototype.redIAdd = function redIAdd (num) {
  2953. assert(this.red, 'redIAdd works only with red numbers');
  2954. return this.red.iadd(this, num);
  2955. };
  2956.  
  2957. BN.prototype.redSub = function redSub (num) {
  2958. assert(this.red, 'redSub works only with red numbers');
  2959. return this.red.sub(this, num);
  2960. };
  2961.  
  2962. BN.prototype.redISub = function redISub (num) {
  2963. assert(this.red, 'redISub works only with red numbers');
  2964. return this.red.isub(this, num);
  2965. };
  2966.  
  2967. BN.prototype.redShl = function redShl (num) {
  2968. assert(this.red, 'redShl works only with red numbers');
  2969. return this.red.shl(this, num);
  2970. };
  2971.  
  2972. BN.prototype.redMul = function redMul (num) {
  2973. assert(this.red, 'redMul works only with red numbers');
  2974. this.red._verify2(this, num);
  2975. return this.red.mul(this, num);
  2976. };
  2977.  
  2978. BN.prototype.redIMul = function redIMul (num) {
  2979. assert(this.red, 'redMul works only with red numbers');
  2980. this.red._verify2(this, num);
  2981. return this.red.imul(this, num);
  2982. };
  2983.  
  2984. BN.prototype.redSqr = function redSqr () {
  2985. assert(this.red, 'redSqr works only with red numbers');
  2986. this.red._verify1(this);
  2987. return this.red.sqr(this);
  2988. };
  2989.  
  2990. BN.prototype.redISqr = function redISqr () {
  2991. assert(this.red, 'redISqr works only with red numbers');
  2992. this.red._verify1(this);
  2993. return this.red.isqr(this);
  2994. };
  2995.  
  2996. // Square root over p
  2997. BN.prototype.redSqrt = function redSqrt () {
  2998. assert(this.red, 'redSqrt works only with red numbers');
  2999. this.red._verify1(this);
  3000. return this.red.sqrt(this);
  3001. };
  3002.  
  3003. BN.prototype.redInvm = function redInvm () {
  3004. assert(this.red, 'redInvm works only with red numbers');
  3005. this.red._verify1(this);
  3006. return this.red.invm(this);
  3007. };
  3008.  
  3009. // Return negative clone of `this` % `red modulo`
  3010. BN.prototype.redNeg = function redNeg () {
  3011. assert(this.red, 'redNeg works only with red numbers');
  3012. this.red._verify1(this);
  3013. return this.red.neg(this);
  3014. };
  3015.  
  3016. BN.prototype.redPow = function redPow (num) {
  3017. assert(this.red && !num.red, 'redPow(normalNum)');
  3018. this.red._verify1(this);
  3019. return this.red.pow(this, num);
  3020. };
  3021.  
  3022. // Prime numbers with efficient reduction
  3023. var primes = {
  3024. k256: null,
  3025. p224: null,
  3026. p192: null,
  3027. p25519: null
  3028. };
  3029.  
  3030. // Pseudo-Mersenne prime
  3031. function MPrime (name, p) {
  3032. // P = 2 ^ N - K
  3033. this.name = name;
  3034. this.p = new BN(p, 16);
  3035. this.n = this.p.bitLength();
  3036. this.k = new BN(1).iushln(this.n).isub(this.p);
  3037.  
  3038. this.tmp = this._tmp();
  3039. }
  3040.  
  3041. MPrime.prototype._tmp = function _tmp () {
  3042. var tmp = new BN(null);
  3043. tmp.words = new Array(Math.ceil(this.n / 13));
  3044. return tmp;
  3045. };
  3046.  
  3047. MPrime.prototype.ireduce = function ireduce (num) {
  3048. // Assumes that `num` is less than `P^2`
  3049. // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
  3050. var r = num;
  3051. var rlen;
  3052.  
  3053. do {
  3054. this.split(r, this.tmp);
  3055. r = this.imulK(r);
  3056. r = r.iadd(this.tmp);
  3057. rlen = r.bitLength();
  3058. } while (rlen > this.n);
  3059.  
  3060. var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
  3061. if (cmp === 0) {
  3062. r.words[0] = 0;
  3063. r.length = 1;
  3064. } else if (cmp > 0) {
  3065. r.isub(this.p);
  3066. } else {
  3067. if (r.strip !== undefined) {
  3068. // r is a BN v4 instance
  3069. r.strip();
  3070. } else {
  3071. // r is a BN v5 instance
  3072. r._strip();
  3073. }
  3074. }
  3075.  
  3076. return r;
  3077. };
  3078.  
  3079. MPrime.prototype.split = function split (input, out) {
  3080. input.iushrn(this.n, 0, out);
  3081. };
  3082.  
  3083. MPrime.prototype.imulK = function imulK (num) {
  3084. return num.imul(this.k);
  3085. };
  3086.  
  3087. function K256 () {
  3088. MPrime.call(
  3089. this,
  3090. 'k256',
  3091. 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
  3092. }
  3093. inherits(K256, MPrime);
  3094.  
  3095. K256.prototype.split = function split (input, output) {
  3096. // 256 = 9 * 26 + 22
  3097. var mask = 0x3fffff;
  3098.  
  3099. var outLen = Math.min(input.length, 9);
  3100. for (var i = 0; i < outLen; i++) {
  3101. output.words[i] = input.words[i];
  3102. }
  3103. output.length = outLen;
  3104.  
  3105. if (input.length <= 9) {
  3106. input.words[0] = 0;
  3107. input.length = 1;
  3108. return;
  3109. }
  3110.  
  3111. // Shift by 9 limbs
  3112. var prev = input.words[9];
  3113. output.words[output.length++] = prev & mask;
  3114.  
  3115. for (i = 10; i < input.length; i++) {
  3116. var next = input.words[i] | 0;
  3117. input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
  3118. prev = next;
  3119. }
  3120. prev >>>= 22;
  3121. input.words[i - 10] = prev;
  3122. if (prev === 0 && input.length > 10) {
  3123. input.length -= 10;
  3124. } else {
  3125. input.length -= 9;
  3126. }
  3127. };
  3128.  
  3129. K256.prototype.imulK = function imulK (num) {
  3130. // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
  3131. num.words[num.length] = 0;
  3132. num.words[num.length + 1] = 0;
  3133. num.length += 2;
  3134.  
  3135. // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
  3136. var lo = 0;
  3137. for (var i = 0; i < num.length; i++) {
  3138. var w = num.words[i] | 0;
  3139. lo += w * 0x3d1;
  3140. num.words[i] = lo & 0x3ffffff;
  3141. lo = w * 0x40 + ((lo / 0x4000000) | 0);
  3142. }
  3143.  
  3144. // Fast length reduction
  3145. if (num.words[num.length - 1] === 0) {
  3146. num.length--;
  3147. if (num.words[num.length - 1] === 0) {
  3148. num.length--;
  3149. }
  3150. }
  3151. return num;
  3152. };
  3153.  
  3154. function P224 () {
  3155. MPrime.call(
  3156. this,
  3157. 'p224',
  3158. 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
  3159. }
  3160. inherits(P224, MPrime);
  3161.  
  3162. function P192 () {
  3163. MPrime.call(
  3164. this,
  3165. 'p192',
  3166. 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
  3167. }
  3168. inherits(P192, MPrime);
  3169.  
  3170. function P25519 () {
  3171. // 2 ^ 255 - 19
  3172. MPrime.call(
  3173. this,
  3174. '25519',
  3175. '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
  3176. }
  3177. inherits(P25519, MPrime);
  3178.  
  3179. P25519.prototype.imulK = function imulK (num) {
  3180. // K = 0x13
  3181. var carry = 0;
  3182. for (var i = 0; i < num.length; i++) {
  3183. var hi = (num.words[i] | 0) * 0x13 + carry;
  3184. var lo = hi & 0x3ffffff;
  3185. hi >>>= 26;
  3186.  
  3187. num.words[i] = lo;
  3188. carry = hi;
  3189. }
  3190. if (carry !== 0) {
  3191. num.words[num.length++] = carry;
  3192. }
  3193. return num;
  3194. };
  3195.  
  3196. // Exported mostly for testing purposes, use plain name instead
  3197. BN._prime = function prime (name) {
  3198. // Cached version of prime
  3199. if (primes[name]) return primes[name];
  3200.  
  3201. var prime;
  3202. if (name === 'k256') {
  3203. prime = new K256();
  3204. } else if (name === 'p224') {
  3205. prime = new P224();
  3206. } else if (name === 'p192') {
  3207. prime = new P192();
  3208. } else if (name === 'p25519') {
  3209. prime = new P25519();
  3210. } else {
  3211. throw new Error('Unknown prime ' + name);
  3212. }
  3213. primes[name] = prime;
  3214.  
  3215. return prime;
  3216. };
  3217.  
  3218. //
  3219. // Base reduction engine
  3220. //
  3221. function Red (m) {
  3222. if (typeof m === 'string') {
  3223. var prime = BN._prime(m);
  3224. this.m = prime.p;
  3225. this.prime = prime;
  3226. } else {
  3227. assert(m.gtn(1), 'modulus must be greater than 1');
  3228. this.m = m;
  3229. this.prime = null;
  3230. }
  3231. }
  3232.  
  3233. Red.prototype._verify1 = function _verify1 (a) {
  3234. assert(a.negative === 0, 'red works only with positives');
  3235. assert(a.red, 'red works only with red numbers');
  3236. };
  3237.  
  3238. Red.prototype._verify2 = function _verify2 (a, b) {
  3239. assert((a.negative | b.negative) === 0, 'red works only with positives');
  3240. assert(a.red && a.red === b.red,
  3241. 'red works only with red numbers');
  3242. };
  3243.  
  3244. Red.prototype.imod = function imod (a) {
  3245. if (this.prime) return this.prime.ireduce(a)._forceRed(this);
  3246.  
  3247. move(a, a.umod(this.m)._forceRed(this));
  3248. return a;
  3249. };
  3250.  
  3251. Red.prototype.neg = function neg (a) {
  3252. if (a.isZero()) {
  3253. return a.clone();
  3254. }
  3255.  
  3256. return this.m.sub(a)._forceRed(this);
  3257. };
  3258.  
  3259. Red.prototype.add = function add (a, b) {
  3260. this._verify2(a, b);
  3261.  
  3262. var res = a.add(b);
  3263. if (res.cmp(this.m) >= 0) {
  3264. res.isub(this.m);
  3265. }
  3266. return res._forceRed(this);
  3267. };
  3268.  
  3269. Red.prototype.iadd = function iadd (a, b) {
  3270. this._verify2(a, b);
  3271.  
  3272. var res = a.iadd(b);
  3273. if (res.cmp(this.m) >= 0) {
  3274. res.isub(this.m);
  3275. }
  3276. return res;
  3277. };
  3278.  
  3279. Red.prototype.sub = function sub (a, b) {
  3280. this._verify2(a, b);
  3281.  
  3282. var res = a.sub(b);
  3283. if (res.cmpn(0) < 0) {
  3284. res.iadd(this.m);
  3285. }
  3286. return res._forceRed(this);
  3287. };
  3288.  
  3289. Red.prototype.isub = function isub (a, b) {
  3290. this._verify2(a, b);
  3291.  
  3292. var res = a.isub(b);
  3293. if (res.cmpn(0) < 0) {
  3294. res.iadd(this.m);
  3295. }
  3296. return res;
  3297. };
  3298.  
  3299. Red.prototype.shl = function shl (a, num) {
  3300. this._verify1(a);
  3301. return this.imod(a.ushln(num));
  3302. };
  3303.  
  3304. Red.prototype.imul = function imul (a, b) {
  3305. this._verify2(a, b);
  3306. return this.imod(a.imul(b));
  3307. };
  3308.  
  3309. Red.prototype.mul = function mul (a, b) {
  3310. this._verify2(a, b);
  3311. return this.imod(a.mul(b));
  3312. };
  3313.  
  3314. Red.prototype.isqr = function isqr (a) {
  3315. return this.imul(a, a.clone());
  3316. };
  3317.  
  3318. Red.prototype.sqr = function sqr (a) {
  3319. return this.mul(a, a);
  3320. };
  3321.  
  3322. Red.prototype.sqrt = function sqrt (a) {
  3323. if (a.isZero()) return a.clone();
  3324.  
  3325. var mod3 = this.m.andln(3);
  3326. assert(mod3 % 2 === 1);
  3327.  
  3328. // Fast case
  3329. if (mod3 === 3) {
  3330. var pow = this.m.add(new BN(1)).iushrn(2);
  3331. return this.pow(a, pow);
  3332. }
  3333.  
  3334. // Tonelli-Shanks algorithm (Totally unoptimized and slow)
  3335. //
  3336. // Find Q and S, that Q * 2 ^ S = (P - 1)
  3337. var q = this.m.subn(1);
  3338. var s = 0;
  3339. while (!q.isZero() && q.andln(1) === 0) {
  3340. s++;
  3341. q.iushrn(1);
  3342. }
  3343. assert(!q.isZero());
  3344.  
  3345. var one = new BN(1).toRed(this);
  3346. var nOne = one.redNeg();
  3347.  
  3348. // Find quadratic non-residue
  3349. // NOTE: Max is such because of generalized Riemann hypothesis.
  3350. var lpow = this.m.subn(1).iushrn(1);
  3351. var z = this.m.bitLength();
  3352. z = new BN(2 * z * z).toRed(this);
  3353.  
  3354. while (this.pow(z, lpow).cmp(nOne) !== 0) {
  3355. z.redIAdd(nOne);
  3356. }
  3357.  
  3358. var c = this.pow(z, q);
  3359. var r = this.pow(a, q.addn(1).iushrn(1));
  3360. var t = this.pow(a, q);
  3361. var m = s;
  3362. while (t.cmp(one) !== 0) {
  3363. var tmp = t;
  3364. for (var i = 0; tmp.cmp(one) !== 0; i++) {
  3365. tmp = tmp.redSqr();
  3366. }
  3367. assert(i < m);
  3368. var b = this.pow(c, new BN(1).iushln(m - i - 1));
  3369.  
  3370. r = r.redMul(b);
  3371. c = b.redSqr();
  3372. t = t.redMul(c);
  3373. m = i;
  3374. }
  3375.  
  3376. return r;
  3377. };
  3378.  
  3379. Red.prototype.invm = function invm (a) {
  3380. var inv = a._invmp(this.m);
  3381. if (inv.negative !== 0) {
  3382. inv.negative = 0;
  3383. return this.imod(inv).redNeg();
  3384. } else {
  3385. return this.imod(inv);
  3386. }
  3387. };
  3388.  
  3389. Red.prototype.pow = function pow (a, num) {
  3390. if (num.isZero()) return new BN(1).toRed(this);
  3391. if (num.cmpn(1) === 0) return a.clone();
  3392.  
  3393. var windowSize = 4;
  3394. var wnd = new Array(1 << windowSize);
  3395. wnd[0] = new BN(1).toRed(this);
  3396. wnd[1] = a;
  3397. for (var i = 2; i < wnd.length; i++) {
  3398. wnd[i] = this.mul(wnd[i - 1], a);
  3399. }
  3400.  
  3401. var res = wnd[0];
  3402. var current = 0;
  3403. var currentLen = 0;
  3404. var start = num.bitLength() % 26;
  3405. if (start === 0) {
  3406. start = 26;
  3407. }
  3408.  
  3409. for (i = num.length - 1; i >= 0; i--) {
  3410. var word = num.words[i];
  3411. for (var j = start - 1; j >= 0; j--) {
  3412. var bit = (word >> j) & 1;
  3413. if (res !== wnd[0]) {
  3414. res = this.sqr(res);
  3415. }
  3416.  
  3417. if (bit === 0 && current === 0) {
  3418. currentLen = 0;
  3419. continue;
  3420. }
  3421.  
  3422. current <<= 1;
  3423. current |= bit;
  3424. currentLen++;
  3425. if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
  3426.  
  3427. res = this.mul(res, wnd[current]);
  3428. currentLen = 0;
  3429. current = 0;
  3430. }
  3431. start = 26;
  3432. }
  3433.  
  3434. return res;
  3435. };
  3436.  
  3437. Red.prototype.convertTo = function convertTo (num) {
  3438. var r = num.umod(this.m);
  3439.  
  3440. return r === num ? r.clone() : r;
  3441. };
  3442.  
  3443. Red.prototype.convertFrom = function convertFrom (num) {
  3444. var res = num.clone();
  3445. res.red = null;
  3446. return res;
  3447. };
  3448.  
  3449. //
  3450. // Montgomery method engine
  3451. //
  3452.  
  3453. BN.mont = function mont (num) {
  3454. return new Mont(num);
  3455. };
  3456.  
  3457. function Mont (m) {
  3458. Red.call(this, m);
  3459.  
  3460. this.shift = this.m.bitLength();
  3461. if (this.shift % 26 !== 0) {
  3462. this.shift += 26 - (this.shift % 26);
  3463. }
  3464.  
  3465. this.r = new BN(1).iushln(this.shift);
  3466. this.r2 = this.imod(this.r.sqr());
  3467. this.rinv = this.r._invmp(this.m);
  3468.  
  3469. this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
  3470. this.minv = this.minv.umod(this.r);
  3471. this.minv = this.r.sub(this.minv);
  3472. }
  3473. inherits(Mont, Red);
  3474.  
  3475. Mont.prototype.convertTo = function convertTo (num) {
  3476. return this.imod(num.ushln(this.shift));
  3477. };
  3478.  
  3479. Mont.prototype.convertFrom = function convertFrom (num) {
  3480. var r = this.imod(num.mul(this.rinv));
  3481. r.red = null;
  3482. return r;
  3483. };
  3484.  
  3485. Mont.prototype.imul = function imul (a, b) {
  3486. if (a.isZero() || b.isZero()) {
  3487. a.words[0] = 0;
  3488. a.length = 1;
  3489. return a;
  3490. }
  3491.  
  3492. var t = a.imul(b);
  3493. var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
  3494. var u = t.isub(c).iushrn(this.shift);
  3495. var res = u;
  3496.  
  3497. if (u.cmp(this.m) >= 0) {
  3498. res = u.isub(this.m);
  3499. } else if (u.cmpn(0) < 0) {
  3500. res = u.iadd(this.m);
  3501. }
  3502.  
  3503. return res._forceRed(this);
  3504. };
  3505.  
  3506. Mont.prototype.mul = function mul (a, b) {
  3507. if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
  3508.  
  3509. var t = a.mul(b);
  3510. var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
  3511. var u = t.isub(c).iushrn(this.shift);
  3512. var res = u;
  3513. if (u.cmp(this.m) >= 0) {
  3514. res = u.isub(this.m);
  3515. } else if (u.cmpn(0) < 0) {
  3516. res = u.iadd(this.m);
  3517. }
  3518.  
  3519. return res._forceRed(this);
  3520. };
  3521.  
  3522. Mont.prototype.invm = function invm (a) {
  3523. // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
  3524. var res = this.imod(a._invmp(this.m).mul(this.r2));
  3525. return res._forceRed(this);
  3526. };
  3527. })();
  3528. (function () {
  3529. var randomBytes = length => window.crypto.getRandomValues(new Uint8Array(length))
  3530. var exports = window.Secp256k1 = {}
  3531.  
  3532. function uint256(x, base) {
  3533. return new BN(x, base)
  3534. }
  3535.  
  3536. function rnd(P) {
  3537. return uint256(randomBytes(32)).umod(P)//TODO red
  3538. }
  3539.  
  3540. const A = uint256(0)
  3541. const B = uint256(7)
  3542. const GX = uint256("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16)
  3543. const GY = uint256("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16)
  3544. const P = uint256("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16)
  3545. const N = uint256("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16)
  3546. //const RED = BN.red(P)
  3547. const _0 = uint256(0)
  3548. const _1 = uint256(1)
  3549.  
  3550. // function for elliptic curve multiplication in jacobian coordinates using Double-and-add method
  3551. function ecmul(_p, _d) {
  3552. let R = [_0,_0,_0]
  3553.  
  3554. //return (0,0) if d=0 or (x1,y1)=(0,0)
  3555. if (_d == 0 || ((_p[0] == 0) && (_p[1] == 0)) ) {
  3556. return R
  3557. }
  3558. let T = [
  3559. _p[0], //x-coordinate temp
  3560. _p[1], //y-coordinate temp
  3561. _p[2], //z-coordinate temp
  3562. ]
  3563.  
  3564. const d = _d.clone()
  3565. while (d != 0) {
  3566. if (d.testn(0)) { //if last bit is 1 add T to result
  3567. R = ecadd(T,R)
  3568. }
  3569. T = ecdouble(T); //double temporary coordinates
  3570. d.iushrn(1); //"cut off" last bit
  3571. }
  3572.  
  3573. return R
  3574. }
  3575.  
  3576. function mulmod(a, b, P) {
  3577. return a.mul(b).umod(P)//TODO red
  3578. }
  3579.  
  3580. function addmod(a, b, P) {
  3581. return a.add(b).umod(P)//TODO red
  3582. }
  3583.  
  3584. function invmod(a, P) {
  3585. return a.invm(P)//TODO redq
  3586. }
  3587.  
  3588. function mulG(k) {
  3589. const GinJ = AtoJ(GX, GY)
  3590. const PUBinJ = ecmul(GinJ, k)
  3591. return JtoA(PUBinJ)
  3592. }
  3593.  
  3594. function assert(cond, msg) {
  3595. if (!cond) {
  3596. throw Error("assertion failed: " + msg)
  3597. }
  3598. }
  3599.  
  3600. function ecsign(d, z) {
  3601. assert(d != 0, "d must not be 0")
  3602. assert(z != 0, "z must not be 0")
  3603. while (true) {
  3604. const k = rnd(P)
  3605. const R = mulG(k)
  3606. if (R[0] == 0) continue
  3607. const s = mulmod(invmod(k, N), addmod(z, mulmod(R[0], d, N), N), N)
  3608. if (s == 0) continue
  3609. //FIXME: why do I need this
  3610. if (s.testn(255)) continue
  3611. return {r: toHex(R[0]), s: toHex(s), v: R[1].testn(0) ? 1 : 0}
  3612. }
  3613. }
  3614.  
  3615. function JtoA(p) {
  3616. const zInv = invmod(p[2], P)
  3617. const zInv2 = mulmod(zInv, zInv, P)
  3618. return [mulmod(p[0], zInv2, P), mulmod(p[1], mulmod(zInv, zInv2, P), P)]
  3619. }
  3620.  
  3621. //point doubling for elliptic curve in jacobian coordinates
  3622. //formula from https://en.wikibooks.org/wiki/Cryptography/Prime_Curve/Jacobian_Coordinates
  3623. function ecdouble(_p) {
  3624. if (_p[1] == 0) {
  3625. //return point at infinity
  3626. return [_1, _1, _0]
  3627. }
  3628.  
  3629. const z2 = mulmod(_p[2], _p[2], P)
  3630. const m = addmod(mulmod(A, mulmod(z2, z2, P), P), mulmod(uint256(3), mulmod(_p[0], _p[0], P), P), P)
  3631. const y2 = mulmod(_p[1], _p[1], P)
  3632. const s = mulmod(uint256(4), mulmod(_p[0], y2, P), P)
  3633.  
  3634. const x = addmod(mulmod(m, m, P), negmod(mulmod(s, uint256(2), P), P), P)
  3635. return [
  3636. x,
  3637. addmod(mulmod(m, addmod(s, negmod(x, P), P), P), negmod(mulmod(uint256(8), mulmod(y2, y2, P), P), P), P),
  3638. mulmod(uint256(2), mulmod(_p[1], _p[2], P), P)
  3639. ]
  3640. }
  3641.  
  3642. function negmod(a, P) {
  3643. return P.sub(a)
  3644. }
  3645.  
  3646. // point addition for elliptic curve in jacobian coordinates
  3647. // formula from https://en.wikibooks.org/wiki/Cryptography/Prime_Curve/Jacobian_Coordinates
  3648. function ecadd(_p, _q) {
  3649. if (_q[0] == 0 && _q[1] == 0 && _q[2] == 0) {
  3650. return _p
  3651. }
  3652.  
  3653. let z2 = mulmod(_q[2], _q[2], P)
  3654. const u1 = mulmod(_p[0], z2, P)
  3655. const s1 = mulmod(_p[1], mulmod(z2, _q[2], P), P)
  3656. z2 = mulmod(_p[2], _p[2], P)
  3657. let u2 = mulmod(_q[0], z2, P)
  3658. let s2 = mulmod(_q[1], mulmod(z2, _p[2], P), P)
  3659.  
  3660. if (u1.eq(u2)) {
  3661. if (!s1.eq(s2)) {
  3662. //return point at infinity
  3663. return [_1, _1, _0]
  3664. }
  3665. else {
  3666. return ecdouble(_p)
  3667. }
  3668. }
  3669.  
  3670. u2 = addmod(u2, negmod(u1, P), P)
  3671. z2 = mulmod(u2, u2, P)
  3672. const t2 = mulmod(u1, z2, P)
  3673. z2 = mulmod(u2, z2, P)
  3674. s2 = addmod(s2, negmod(s1, P), P)
  3675. const x = addmod(addmod(mulmod(s2, s2, P), negmod(z2, P), P), negmod(mulmod(uint256(2), t2, P), P), P)
  3676. return [
  3677. x,
  3678. addmod(mulmod(s2, addmod(t2, negmod(x, P), P), P), negmod(mulmod(s1, z2, P), P), P),
  3679. mulmod(u2, mulmod(_p[2], _q[2], P), P)
  3680. ]
  3681. }
  3682.  
  3683. function AtoJ(x, y) {
  3684. return [
  3685. uint256(x),
  3686. uint256(y),
  3687. _1
  3688. ]
  3689. }
  3690.  
  3691. function isValidPoint(x, y) {
  3692. const yy = addmod(mulmod(mulmod(x, x, P), x, P), B, P)
  3693. return yy.eq(mulmod(y, y, P))
  3694. }
  3695.  
  3696. function toHex(bn) {
  3697. return ('00000000000000000000000000000000000000000000000000000000000000000000000000000000' + bn.toString(16)).slice(-64)
  3698. }
  3699.  
  3700. function decompressKey(x, yBit) {
  3701. let redP = BN.red('k256');
  3702. x = x.toRed(redP)
  3703. const y = x.redMul(x).redMul(x).redAdd(B.toRed(redP)).redSqrt()
  3704. const sign = y.testn(0)
  3705. return (sign != yBit ? y.redNeg() : y).fromRed()
  3706. }
  3707.  
  3708. function generatePublicKeyFromPrivateKeyData(pk) {
  3709. const p = mulG(pk)
  3710. return {x: toHex(p[0]), y: toHex(p[1])}
  3711. }
  3712.  
  3713. function ecrecover(recId, sigr, sigs, message) {
  3714. assert(recId >= 0 && recId <= 3, "recId must be 0..3")
  3715. assert(sigr != 0, "sigr must not be 0")
  3716. assert(sigs != 0, "sigs must not be 0")
  3717. // 1.0 For j from 0 to h (h == recId here and the loop is outside this function)
  3718. // 1.1 Let x = r + jn
  3719. const x = addmod(uint256(sigr), P.muln(recId >> 1), P)
  3720. // 1.2. Convert the integer x to an octet string X of length mlen using the conversion routine
  3721. // specified in Section 2.3.7, where mlen = ⌈(log2 p)/8⌉ or mlen = ⌈m/8⌉.
  3722. // 1.3. Convert the octet string (16 set binary digits)||X to an elliptic curve point R using the
  3723. // conversion routine specified in Section 2.3.4. If this conversion routine outputs “invalid”, then
  3724. // do another iteration of Step 1.
  3725. //
  3726. // More concisely, what these points mean is to use X as a compressed public key.
  3727. if (x.gte(P)) {
  3728. // Cannot have point co-ordinates larger than this as everything takes place modulo Q.
  3729. return null
  3730. }
  3731. // Compressed keys require you to know an extra bit of data about the y-coord as there are two possibilities.
  3732. // So it's encoded in the recId.
  3733. const y = decompressKey(x, (recId & 1) == 1)
  3734. // 1.4. If nR != point at infinity, then do another iteration of Step 1 (callers responsibility).
  3735. // if (!R.mul(N).isInfinity())
  3736. // return null
  3737. // 1.5. Compute e from M using Steps 2 and 3 of ECDSA signature verification.
  3738. const e = uint256(message)
  3739. // 1.6. For k from 1 to 2 do the following. (loop is outside this function via iterating recId)
  3740. // 1.6.1. Compute a candidate public key as:
  3741. // Q = mi(r) * (sR - eG)
  3742. //
  3743. // Where mi(x) is the modular multiplicative inverse. We transform this into the following:
  3744. // Q = (mi(r) * s ** R) + (mi(r) * -e ** G)
  3745. // Where -e is the modular additive inverse of e, that is z such that z + e = 0 (mod n). In the above equation
  3746. // ** is point multiplication and + is point addition (the EC group operator).
  3747. //
  3748. // We can find the additive inverse by subtracting e from zero then taking the mod. For example the additive
  3749. // inverse of 3 modulo 11 is 8 because 3 + 8 mod 11 = 0, and -3 mod 11 = 8.
  3750. const eNeg = negmod(e, N)
  3751. const rInv = invmod(sigr, N)
  3752. const srInv = mulmod(rInv, sigs, N)
  3753. const eNegrInv = mulmod(rInv, eNeg, N)
  3754. const R = AtoJ(x, y)
  3755. const G = AtoJ(GX, GY)
  3756. const qinJ = ecadd(ecmul(G, eNegrInv), ecmul(R, srInv))
  3757. const p = JtoA(qinJ)
  3758. return {x: toHex(p[0]), y: toHex(p[1])}
  3759. }
  3760.  
  3761. function ecverify (Qx, Qy, sigr, sigs, z) {
  3762. if (sigs == 0 || sigr == 0) {
  3763. return false
  3764. }
  3765. const w = invmod(sigs, N)
  3766. const u1 = mulmod(z, w, N)
  3767. const u2 = mulmod(sigr, w, N)
  3768. const Q = AtoJ(Qx, Qy)
  3769. const G = AtoJ(GX, GY)
  3770. const RinJ = ecadd(ecmul(G, u1), ecmul(Q, u2))
  3771. const r = JtoA(RinJ)
  3772. return sigr.eq(r[0])
  3773. }
  3774.  
  3775. exports.uint256 = uint256
  3776. exports.ecsign = ecsign
  3777. exports.ecrecover = ecrecover
  3778. exports.generatePublicKeyFromPrivateKeyData = generatePublicKeyFromPrivateKeyData
  3779. exports.decompressKey = decompressKey
  3780. exports.isValidPoint = isValidPoint
  3781. exports.ecverify = ecverify
  3782. })()