bn.js 85 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434
  1. (function (module, exports) {
  2. 'use strict';
  3. // Utils
  4. function assert (val, msg) {
  5. if (!val) throw new Error(msg || 'Assertion failed');
  6. }
  7. // Could use `inherits` module, but don't want to move from single file
  8. // architecture yet.
  9. function inherits (ctor, superCtor) {
  10. ctor.super_ = superCtor;
  11. var TempCtor = function () {};
  12. TempCtor.prototype = superCtor.prototype;
  13. ctor.prototype = new TempCtor();
  14. ctor.prototype.constructor = ctor;
  15. }
  16. // BN
  17. function BN (number, base, endian) {
  18. if (BN.isBN(number)) {
  19. return number;
  20. }
  21. this.negative = 0;
  22. this.words = null;
  23. this.length = 0;
  24. // Reduction context
  25. this.red = null;
  26. if (number !== null) {
  27. if (base === 'le' || base === 'be') {
  28. endian = base;
  29. base = 10;
  30. }
  31. this._init(number || 0, base || 10, endian || 'be');
  32. }
  33. }
  34. if (typeof module === 'object') {
  35. module.exports = BN;
  36. } else {
  37. exports.BN = BN;
  38. }
  39. BN.BN = BN;
  40. BN.wordSize = 26;
  41. var Buffer;
  42. try {
  43. Buffer = require('buffer').Buffer;
  44. } catch (e) {
  45. }
  46. BN.isBN = function isBN (num) {
  47. if (num instanceof BN) {
  48. return true;
  49. }
  50. return num !== null && typeof num === 'object' &&
  51. num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
  52. };
  53. BN.max = function max (left, right) {
  54. if (left.cmp(right) > 0) return left;
  55. return right;
  56. };
  57. BN.min = function min (left, right) {
  58. if (left.cmp(right) < 0) return left;
  59. return right;
  60. };
  61. BN.prototype._init = function init (number, base, endian) {
  62. if (typeof number === 'number') {
  63. return this._initNumber(number, base, endian);
  64. }
  65. if (typeof number === 'object') {
  66. return this._initArray(number, base, endian);
  67. }
  68. if (base === 'hex') {
  69. base = 16;
  70. }
  71. assert(base === (base | 0) && base >= 2 && base <= 36);
  72. number = number.toString().replace(/\s+/g, '');
  73. var start = 0;
  74. if (number[0] === '-') {
  75. start++;
  76. }
  77. if (base === 16) {
  78. this._parseHex(number, start);
  79. } else {
  80. this._parseBase(number, base, start);
  81. }
  82. if (number[0] === '-') {
  83. this.negative = 1;
  84. }
  85. this.strip();
  86. if (endian !== 'le') return;
  87. this._initArray(this.toArray(), base, endian);
  88. };
  89. BN.prototype._initNumber = function _initNumber (number, base, endian) {
  90. if (number < 0) {
  91. this.negative = 1;
  92. number = -number;
  93. }
  94. if (number < 0x4000000) {
  95. this.words = [ number & 0x3ffffff ];
  96. this.length = 1;
  97. } else if (number < 0x10000000000000) {
  98. this.words = [
  99. number & 0x3ffffff,
  100. (number / 0x4000000) & 0x3ffffff
  101. ];
  102. this.length = 2;
  103. } else {
  104. assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
  105. this.words = [
  106. number & 0x3ffffff,
  107. (number / 0x4000000) & 0x3ffffff,
  108. 1
  109. ];
  110. this.length = 3;
  111. }
  112. if (endian !== 'le') return;
  113. // Reverse the bytes
  114. this._initArray(this.toArray(), base, endian);
  115. };
  116. BN.prototype._initArray = function _initArray (number, base, endian) {
  117. // Perhaps a Uint8Array
  118. assert(typeof number.length === 'number');
  119. if (number.length <= 0) {
  120. this.words = [ 0 ];
  121. this.length = 1;
  122. return this;
  123. }
  124. this.length = Math.ceil(number.length / 3);
  125. this.words = new Array(this.length);
  126. for (var i = 0; i < this.length; i++) {
  127. this.words[i] = 0;
  128. }
  129. var j, w;
  130. var off = 0;
  131. if (endian === 'be') {
  132. for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
  133. w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
  134. this.words[j] |= (w << off) & 0x3ffffff;
  135. this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
  136. off += 24;
  137. if (off >= 26) {
  138. off -= 26;
  139. j++;
  140. }
  141. }
  142. } else if (endian === 'le') {
  143. for (i = 0, j = 0; i < number.length; i += 3) {
  144. w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
  145. this.words[j] |= (w << off) & 0x3ffffff;
  146. this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
  147. off += 24;
  148. if (off >= 26) {
  149. off -= 26;
  150. j++;
  151. }
  152. }
  153. }
  154. return this.strip();
  155. };
  156. function parseHex (str, start, end) {
  157. var r = 0;
  158. var len = Math.min(str.length, end);
  159. for (var i = start; i < len; i++) {
  160. var c = str.charCodeAt(i) - 48;
  161. r <<= 4;
  162. // 'a' - 'f'
  163. if (c >= 49 && c <= 54) {
  164. r |= c - 49 + 0xa;
  165. // 'A' - 'F'
  166. } else if (c >= 17 && c <= 22) {
  167. r |= c - 17 + 0xa;
  168. // '0' - '9'
  169. } else {
  170. r |= c & 0xf;
  171. }
  172. }
  173. return r;
  174. }
  175. BN.prototype._parseHex = function _parseHex (number, start) {
  176. // Create possibly bigger array to ensure that it fits the number
  177. this.length = Math.ceil((number.length - start) / 6);
  178. this.words = new Array(this.length);
  179. for (var i = 0; i < this.length; i++) {
  180. this.words[i] = 0;
  181. }
  182. var j, w;
  183. // Scan 24-bit chunks and add them to the number
  184. var off = 0;
  185. for (i = number.length - 6, j = 0; i >= start; i -= 6) {
  186. w = parseHex(number, i, i + 6);
  187. this.words[j] |= (w << off) & 0x3ffffff;
  188. // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb
  189. this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
  190. off += 24;
  191. if (off >= 26) {
  192. off -= 26;
  193. j++;
  194. }
  195. }
  196. if (i + 6 !== start) {
  197. w = parseHex(number, start, i + 6);
  198. this.words[j] |= (w << off) & 0x3ffffff;
  199. this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
  200. }
  201. this.strip();
  202. };
  203. function parseBase (str, start, end, mul) {
  204. var r = 0;
  205. var len = Math.min(str.length, end);
  206. for (var i = start; i < len; i++) {
  207. var c = str.charCodeAt(i) - 48;
  208. r *= mul;
  209. // 'a'
  210. if (c >= 49) {
  211. r += c - 49 + 0xa;
  212. // 'A'
  213. } else if (c >= 17) {
  214. r += c - 17 + 0xa;
  215. // '0' - '9'
  216. } else {
  217. r += c;
  218. }
  219. }
  220. return r;
  221. }
  222. BN.prototype._parseBase = function _parseBase (number, base, start) {
  223. // Initialize as zero
  224. this.words = [ 0 ];
  225. this.length = 1;
  226. // Find length of limb in base
  227. for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
  228. limbLen++;
  229. }
  230. limbLen--;
  231. limbPow = (limbPow / base) | 0;
  232. var total = number.length - start;
  233. var mod = total % limbLen;
  234. var end = Math.min(total, total - mod) + start;
  235. var word = 0;
  236. for (var i = start; i < end; i += limbLen) {
  237. word = parseBase(number, i, i + limbLen, base);
  238. this.imuln(limbPow);
  239. if (this.words[0] + word < 0x4000000) {
  240. this.words[0] += word;
  241. } else {
  242. this._iaddn(word);
  243. }
  244. }
  245. if (mod !== 0) {
  246. var pow = 1;
  247. word = parseBase(number, i, number.length, base);
  248. for (i = 0; i < mod; i++) {
  249. pow *= base;
  250. }
  251. this.imuln(pow);
  252. if (this.words[0] + word < 0x4000000) {
  253. this.words[0] += word;
  254. } else {
  255. this._iaddn(word);
  256. }
  257. }
  258. };
  259. BN.prototype.copy = function copy (dest) {
  260. dest.words = new Array(this.length);
  261. for (var i = 0; i < this.length; i++) {
  262. dest.words[i] = this.words[i];
  263. }
  264. dest.length = this.length;
  265. dest.negative = this.negative;
  266. dest.red = this.red;
  267. };
  268. BN.prototype.clone = function clone () {
  269. var r = new BN(null);
  270. this.copy(r);
  271. return r;
  272. };
  273. BN.prototype._expand = function _expand (size) {
  274. while (this.length < size) {
  275. this.words[this.length++] = 0;
  276. }
  277. return this;
  278. };
  279. // Remove leading `0` from `this`
  280. BN.prototype.strip = function strip () {
  281. while (this.length > 1 && this.words[this.length - 1] === 0) {
  282. this.length--;
  283. }
  284. return this._normSign();
  285. };
  286. BN.prototype._normSign = function _normSign () {
  287. // -0 = 0
  288. if (this.length === 1 && this.words[0] === 0) {
  289. this.negative = 0;
  290. }
  291. return this;
  292. };
  293. BN.prototype.inspect = function inspect () {
  294. return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';
  295. };
  296. /*
  297. var zeros = [];
  298. var groupSizes = [];
  299. var groupBases = [];
  300. var s = '';
  301. var i = -1;
  302. while (++i < BN.wordSize) {
  303. zeros[i] = s;
  304. s += '0';
  305. }
  306. groupSizes[0] = 0;
  307. groupSizes[1] = 0;
  308. groupBases[0] = 0;
  309. groupBases[1] = 0;
  310. var base = 2 - 1;
  311. while (++base < 36 + 1) {
  312. var groupSize = 0;
  313. var groupBase = 1;
  314. while (groupBase < (1 << BN.wordSize) / base) {
  315. groupBase *= base;
  316. groupSize += 1;
  317. }
  318. groupSizes[base] = groupSize;
  319. groupBases[base] = groupBase;
  320. }
  321. */
  322. var zeros = [
  323. '',
  324. '0',
  325. '00',
  326. '000',
  327. '0000',
  328. '00000',
  329. '000000',
  330. '0000000',
  331. '00000000',
  332. '000000000',
  333. '0000000000',
  334. '00000000000',
  335. '000000000000',
  336. '0000000000000',
  337. '00000000000000',
  338. '000000000000000',
  339. '0000000000000000',
  340. '00000000000000000',
  341. '000000000000000000',
  342. '0000000000000000000',
  343. '00000000000000000000',
  344. '000000000000000000000',
  345. '0000000000000000000000',
  346. '00000000000000000000000',
  347. '000000000000000000000000',
  348. '0000000000000000000000000'
  349. ];
  350. var groupSizes = [
  351. 0, 0,
  352. 25, 16, 12, 11, 10, 9, 8,
  353. 8, 7, 7, 7, 7, 6, 6,
  354. 6, 6, 6, 6, 6, 5, 5,
  355. 5, 5, 5, 5, 5, 5, 5,
  356. 5, 5, 5, 5, 5, 5, 5
  357. ];
  358. var groupBases = [
  359. 0, 0,
  360. 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
  361. 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
  362. 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
  363. 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
  364. 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
  365. ];
  366. BN.prototype.toString = function toString (base, padding) {
  367. base = base || 10;
  368. padding = padding | 0 || 1;
  369. var out;
  370. if (base === 16 || base === 'hex') {
  371. out = '';
  372. var off = 0;
  373. var carry = 0;
  374. for (var i = 0; i < this.length; i++) {
  375. var w = this.words[i];
  376. var word = (((w << off) | carry) & 0xffffff).toString(16);
  377. carry = (w >>> (24 - off)) & 0xffffff;
  378. if (carry !== 0 || i !== this.length - 1) {
  379. out = zeros[6 - word.length] + word + out;
  380. } else {
  381. out = word + out;
  382. }
  383. off += 2;
  384. if (off >= 26) {
  385. off -= 26;
  386. i--;
  387. }
  388. }
  389. if (carry !== 0) {
  390. out = carry.toString(16) + out;
  391. }
  392. while (out.length % padding !== 0) {
  393. out = '0' + out;
  394. }
  395. if (this.negative !== 0) {
  396. out = '-' + out;
  397. }
  398. return out;
  399. }
  400. if (base === (base | 0) && base >= 2 && base <= 36) {
  401. // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
  402. var groupSize = groupSizes[base];
  403. // var groupBase = Math.pow(base, groupSize);
  404. var groupBase = groupBases[base];
  405. out = '';
  406. var c = this.clone();
  407. c.negative = 0;
  408. while (!c.isZero()) {
  409. var r = c.modn(groupBase).toString(base);
  410. c = c.idivn(groupBase);
  411. if (!c.isZero()) {
  412. out = zeros[groupSize - r.length] + r + out;
  413. } else {
  414. out = r + out;
  415. }
  416. }
  417. if (this.isZero()) {
  418. out = '0' + out;
  419. }
  420. while (out.length % padding !== 0) {
  421. out = '0' + out;
  422. }
  423. if (this.negative !== 0) {
  424. out = '-' + out;
  425. }
  426. return out;
  427. }
  428. assert(false, 'Base should be between 2 and 36');
  429. };
  430. BN.prototype.toNumber = function toNumber () {
  431. var ret = this.words[0];
  432. if (this.length === 2) {
  433. ret += this.words[1] * 0x4000000;
  434. } else if (this.length === 3 && this.words[2] === 0x01) {
  435. // NOTE: at this stage it is known that the top bit is set
  436. ret += 0x10000000000000 + (this.words[1] * 0x4000000);
  437. } else if (this.length > 2) {
  438. assert(false, 'Number can only safely store up to 53 bits');
  439. }
  440. return (this.negative !== 0) ? -ret : ret;
  441. };
  442. BN.prototype.toJSON = function toJSON () {
  443. return this.toString(16);
  444. };
  445. BN.prototype.toBuffer = function toBuffer (endian, length) {
  446. assert(typeof Buffer !== 'undefined');
  447. return this.toArrayLike(Buffer, endian, length);
  448. };
  449. BN.prototype.toArray = function toArray (endian, length) {
  450. return this.toArrayLike(Array, endian, length);
  451. };
  452. BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
  453. var byteLength = this.byteLength();
  454. var reqLength = length || Math.max(1, byteLength);
  455. assert(byteLength <= reqLength, 'byte array longer than desired length');
  456. assert(reqLength > 0, 'Requested array length <= 0');
  457. this.strip();
  458. var littleEndian = endian === 'le';
  459. var res = new ArrayType(reqLength);
  460. var b, i;
  461. var q = this.clone();
  462. if (!littleEndian) {
  463. // Assume big-endian
  464. for (i = 0; i < reqLength - byteLength; i++) {
  465. res[i] = 0;
  466. }
  467. for (i = 0; !q.isZero(); i++) {
  468. b = q.andln(0xff);
  469. q.iushrn(8);
  470. res[reqLength - i - 1] = b;
  471. }
  472. } else {
  473. for (i = 0; !q.isZero(); i++) {
  474. b = q.andln(0xff);
  475. q.iushrn(8);
  476. res[i] = b;
  477. }
  478. for (; i < reqLength; i++) {
  479. res[i] = 0;
  480. }
  481. }
  482. return res;
  483. };
  484. if (Math.clz32) {
  485. BN.prototype._countBits = function _countBits (w) {
  486. return 32 - Math.clz32(w);
  487. };
  488. } else {
  489. BN.prototype._countBits = function _countBits (w) {
  490. var t = w;
  491. var r = 0;
  492. if (t >= 0x1000) {
  493. r += 13;
  494. t >>>= 13;
  495. }
  496. if (t >= 0x40) {
  497. r += 7;
  498. t >>>= 7;
  499. }
  500. if (t >= 0x8) {
  501. r += 4;
  502. t >>>= 4;
  503. }
  504. if (t >= 0x02) {
  505. r += 2;
  506. t >>>= 2;
  507. }
  508. return r + t;
  509. };
  510. }
  511. BN.prototype._zeroBits = function _zeroBits (w) {
  512. // Short-cut
  513. if (w === 0) return 26;
  514. var t = w;
  515. var r = 0;
  516. if ((t & 0x1fff) === 0) {
  517. r += 13;
  518. t >>>= 13;
  519. }
  520. if ((t & 0x7f) === 0) {
  521. r += 7;
  522. t >>>= 7;
  523. }
  524. if ((t & 0xf) === 0) {
  525. r += 4;
  526. t >>>= 4;
  527. }
  528. if ((t & 0x3) === 0) {
  529. r += 2;
  530. t >>>= 2;
  531. }
  532. if ((t & 0x1) === 0) {
  533. r++;
  534. }
  535. return r;
  536. };
  537. // Return number of used bits in a BN
  538. BN.prototype.bitLength = function bitLength () {
  539. var w = this.words[this.length - 1];
  540. var hi = this._countBits(w);
  541. return (this.length - 1) * 26 + hi;
  542. };
  543. function toBitArray (num) {
  544. var w = new Array(num.bitLength());
  545. for (var bit = 0; bit < w.length; bit++) {
  546. var off = (bit / 26) | 0;
  547. var wbit = bit % 26;
  548. w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;
  549. }
  550. return w;
  551. }
  552. // Number of trailing zero bits
  553. BN.prototype.zeroBits = function zeroBits () {
  554. if (this.isZero()) return 0;
  555. var r = 0;
  556. for (var i = 0; i < this.length; i++) {
  557. var b = this._zeroBits(this.words[i]);
  558. r += b;
  559. if (b !== 26) break;
  560. }
  561. return r;
  562. };
  563. BN.prototype.byteLength = function byteLength () {
  564. return Math.ceil(this.bitLength() / 8);
  565. };
  566. BN.prototype.toTwos = function toTwos (width) {
  567. if (this.negative !== 0) {
  568. return this.abs().inotn(width).iaddn(1);
  569. }
  570. return this.clone();
  571. };
  572. BN.prototype.fromTwos = function fromTwos (width) {
  573. if (this.testn(width - 1)) {
  574. return this.notn(width).iaddn(1).ineg();
  575. }
  576. return this.clone();
  577. };
  578. BN.prototype.isNeg = function isNeg () {
  579. return this.negative !== 0;
  580. };
  581. // Return negative clone of `this`
  582. BN.prototype.neg = function neg () {
  583. return this.clone().ineg();
  584. };
  585. BN.prototype.ineg = function ineg () {
  586. if (!this.isZero()) {
  587. this.negative ^= 1;
  588. }
  589. return this;
  590. };
  591. // Or `num` with `this` in-place
  592. BN.prototype.iuor = function iuor (num) {
  593. while (this.length < num.length) {
  594. this.words[this.length++] = 0;
  595. }
  596. for (var i = 0; i < num.length; i++) {
  597. this.words[i] = this.words[i] | num.words[i];
  598. }
  599. return this.strip();
  600. };
  601. BN.prototype.ior = function ior (num) {
  602. assert((this.negative | num.negative) === 0);
  603. return this.iuor(num);
  604. };
  605. // Or `num` with `this`
  606. BN.prototype.or = function or (num) {
  607. if (this.length > num.length) return this.clone().ior(num);
  608. return num.clone().ior(this);
  609. };
  610. BN.prototype.uor = function uor (num) {
  611. if (this.length > num.length) return this.clone().iuor(num);
  612. return num.clone().iuor(this);
  613. };
  614. // And `num` with `this` in-place
  615. BN.prototype.iuand = function iuand (num) {
  616. // b = min-length(num, this)
  617. var b;
  618. if (this.length > num.length) {
  619. b = num;
  620. } else {
  621. b = this;
  622. }
  623. for (var i = 0; i < b.length; i++) {
  624. this.words[i] = this.words[i] & num.words[i];
  625. }
  626. this.length = b.length;
  627. return this.strip();
  628. };
  629. BN.prototype.iand = function iand (num) {
  630. assert((this.negative | num.negative) === 0);
  631. return this.iuand(num);
  632. };
  633. // And `num` with `this`
  634. BN.prototype.and = function and (num) {
  635. if (this.length > num.length) return this.clone().iand(num);
  636. return num.clone().iand(this);
  637. };
  638. BN.prototype.uand = function uand (num) {
  639. if (this.length > num.length) return this.clone().iuand(num);
  640. return num.clone().iuand(this);
  641. };
  642. // Xor `num` with `this` in-place
  643. BN.prototype.iuxor = function iuxor (num) {
  644. // a.length > b.length
  645. var a;
  646. var b;
  647. if (this.length > num.length) {
  648. a = this;
  649. b = num;
  650. } else {
  651. a = num;
  652. b = this;
  653. }
  654. for (var i = 0; i < b.length; i++) {
  655. this.words[i] = a.words[i] ^ b.words[i];
  656. }
  657. if (this !== a) {
  658. for (; i < a.length; i++) {
  659. this.words[i] = a.words[i];
  660. }
  661. }
  662. this.length = a.length;
  663. return this.strip();
  664. };
  665. BN.prototype.ixor = function ixor (num) {
  666. assert((this.negative | num.negative) === 0);
  667. return this.iuxor(num);
  668. };
  669. // Xor `num` with `this`
  670. BN.prototype.xor = function xor (num) {
  671. if (this.length > num.length) return this.clone().ixor(num);
  672. return num.clone().ixor(this);
  673. };
  674. BN.prototype.uxor = function uxor (num) {
  675. if (this.length > num.length) return this.clone().iuxor(num);
  676. return num.clone().iuxor(this);
  677. };
  678. // Not ``this`` with ``width`` bitwidth
  679. BN.prototype.inotn = function inotn (width) {
  680. assert(typeof width === 'number' && width >= 0);
  681. var bytesNeeded = Math.ceil(width / 26) | 0;
  682. var bitsLeft = width % 26;
  683. // Extend the buffer with leading zeroes
  684. this._expand(bytesNeeded);
  685. if (bitsLeft > 0) {
  686. bytesNeeded--;
  687. }
  688. // Handle complete words
  689. for (var i = 0; i < bytesNeeded; i++) {
  690. this.words[i] = ~this.words[i] & 0x3ffffff;
  691. }
  692. // Handle the residue
  693. if (bitsLeft > 0) {
  694. this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
  695. }
  696. // And remove leading zeroes
  697. return this.strip();
  698. };
  699. BN.prototype.notn = function notn (width) {
  700. return this.clone().inotn(width);
  701. };
  702. // Set `bit` of `this`
  703. BN.prototype.setn = function setn (bit, val) {
  704. assert(typeof bit === 'number' && bit >= 0);
  705. var off = (bit / 26) | 0;
  706. var wbit = bit % 26;
  707. this._expand(off + 1);
  708. if (val) {
  709. this.words[off] = this.words[off] | (1 << wbit);
  710. } else {
  711. this.words[off] = this.words[off] & ~(1 << wbit);
  712. }
  713. return this.strip();
  714. };
  715. // Add `num` to `this` in-place
  716. BN.prototype.iadd = function iadd (num) {
  717. var r;
  718. // negative + positive
  719. if (this.negative !== 0 && num.negative === 0) {
  720. this.negative = 0;
  721. r = this.isub(num);
  722. this.negative ^= 1;
  723. return this._normSign();
  724. // positive + negative
  725. } else if (this.negative === 0 && num.negative !== 0) {
  726. num.negative = 0;
  727. r = this.isub(num);
  728. num.negative = 1;
  729. return r._normSign();
  730. }
  731. // a.length > b.length
  732. var a, b;
  733. if (this.length > num.length) {
  734. a = this;
  735. b = num;
  736. } else {
  737. a = num;
  738. b = this;
  739. }
  740. var carry = 0;
  741. for (var i = 0; i < b.length; i++) {
  742. r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
  743. this.words[i] = r & 0x3ffffff;
  744. carry = r >>> 26;
  745. }
  746. for (; carry !== 0 && i < a.length; i++) {
  747. r = (a.words[i] | 0) + carry;
  748. this.words[i] = r & 0x3ffffff;
  749. carry = r >>> 26;
  750. }
  751. this.length = a.length;
  752. if (carry !== 0) {
  753. this.words[this.length] = carry;
  754. this.length++;
  755. // Copy the rest of the words
  756. } else if (a !== this) {
  757. for (; i < a.length; i++) {
  758. this.words[i] = a.words[i];
  759. }
  760. }
  761. return this;
  762. };
  763. // Add `num` to `this`
  764. BN.prototype.add = function add (num) {
  765. var res;
  766. if (num.negative !== 0 && this.negative === 0) {
  767. num.negative = 0;
  768. res = this.sub(num);
  769. num.negative ^= 1;
  770. return res;
  771. } else if (num.negative === 0 && this.negative !== 0) {
  772. this.negative = 0;
  773. res = num.sub(this);
  774. this.negative = 1;
  775. return res;
  776. }
  777. if (this.length > num.length) return this.clone().iadd(num);
  778. return num.clone().iadd(this);
  779. };
  780. // Subtract `num` from `this` in-place
  781. BN.prototype.isub = function isub (num) {
  782. // this - (-num) = this + num
  783. if (num.negative !== 0) {
  784. num.negative = 0;
  785. var r = this.iadd(num);
  786. num.negative = 1;
  787. return r._normSign();
  788. // -this - num = -(this + num)
  789. } else if (this.negative !== 0) {
  790. this.negative = 0;
  791. this.iadd(num);
  792. this.negative = 1;
  793. return this._normSign();
  794. }
  795. // At this point both numbers are positive
  796. var cmp = this.cmp(num);
  797. // Optimization - zeroify
  798. if (cmp === 0) {
  799. this.negative = 0;
  800. this.length = 1;
  801. this.words[0] = 0;
  802. return this;
  803. }
  804. // a > b
  805. var a, b;
  806. if (cmp > 0) {
  807. a = this;
  808. b = num;
  809. } else {
  810. a = num;
  811. b = this;
  812. }
  813. var carry = 0;
  814. for (var i = 0; i < b.length; i++) {
  815. r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
  816. carry = r >> 26;
  817. this.words[i] = r & 0x3ffffff;
  818. }
  819. for (; carry !== 0 && i < a.length; i++) {
  820. r = (a.words[i] | 0) + carry;
  821. carry = r >> 26;
  822. this.words[i] = r & 0x3ffffff;
  823. }
  824. // Copy rest of the words
  825. if (carry === 0 && i < a.length && a !== this) {
  826. for (; i < a.length; i++) {
  827. this.words[i] = a.words[i];
  828. }
  829. }
  830. this.length = Math.max(this.length, i);
  831. if (a !== this) {
  832. this.negative = 1;
  833. }
  834. return this.strip();
  835. };
  836. // Subtract `num` from `this`
  837. BN.prototype.sub = function sub (num) {
  838. return this.clone().isub(num);
  839. };
  840. function smallMulTo (self, num, out) {
  841. out.negative = num.negative ^ self.negative;
  842. var len = (self.length + num.length) | 0;
  843. out.length = len;
  844. len = (len - 1) | 0;
  845. // Peel one iteration (compiler can't do it, because of code complexity)
  846. var a = self.words[0] | 0;
  847. var b = num.words[0] | 0;
  848. var r = a * b;
  849. var lo = r & 0x3ffffff;
  850. var carry = (r / 0x4000000) | 0;
  851. out.words[0] = lo;
  852. for (var k = 1; k < len; k++) {
  853. // Sum all words with the same `i + j = k` and accumulate `ncarry`,
  854. // note that ncarry could be >= 0x3ffffff
  855. var ncarry = carry >>> 26;
  856. var rword = carry & 0x3ffffff;
  857. var maxJ = Math.min(k, num.length - 1);
  858. for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
  859. var i = (k - j) | 0;
  860. a = self.words[i] | 0;
  861. b = num.words[j] | 0;
  862. r = a * b + rword;
  863. ncarry += (r / 0x4000000) | 0;
  864. rword = r & 0x3ffffff;
  865. }
  866. out.words[k] = rword | 0;
  867. carry = ncarry | 0;
  868. }
  869. if (carry !== 0) {
  870. out.words[k] = carry | 0;
  871. } else {
  872. out.length--;
  873. }
  874. return out.strip();
  875. }
  876. // TODO(indutny): it may be reasonable to omit it for users who don't need
  877. // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
  878. // multiplication (like elliptic secp256k1).
  879. var comb10MulTo = function comb10MulTo (self, num, out) {
  880. var a = self.words;
  881. var b = num.words;
  882. var o = out.words;
  883. var c = 0;
  884. var lo;
  885. var mid;
  886. var hi;
  887. var a0 = a[0] | 0;
  888. var al0 = a0 & 0x1fff;
  889. var ah0 = a0 >>> 13;
  890. var a1 = a[1] | 0;
  891. var al1 = a1 & 0x1fff;
  892. var ah1 = a1 >>> 13;
  893. var a2 = a[2] | 0;
  894. var al2 = a2 & 0x1fff;
  895. var ah2 = a2 >>> 13;
  896. var a3 = a[3] | 0;
  897. var al3 = a3 & 0x1fff;
  898. var ah3 = a3 >>> 13;
  899. var a4 = a[4] | 0;
  900. var al4 = a4 & 0x1fff;
  901. var ah4 = a4 >>> 13;
  902. var a5 = a[5] | 0;
  903. var al5 = a5 & 0x1fff;
  904. var ah5 = a5 >>> 13;
  905. var a6 = a[6] | 0;
  906. var al6 = a6 & 0x1fff;
  907. var ah6 = a6 >>> 13;
  908. var a7 = a[7] | 0;
  909. var al7 = a7 & 0x1fff;
  910. var ah7 = a7 >>> 13;
  911. var a8 = a[8] | 0;
  912. var al8 = a8 & 0x1fff;
  913. var ah8 = a8 >>> 13;
  914. var a9 = a[9] | 0;
  915. var al9 = a9 & 0x1fff;
  916. var ah9 = a9 >>> 13;
  917. var b0 = b[0] | 0;
  918. var bl0 = b0 & 0x1fff;
  919. var bh0 = b0 >>> 13;
  920. var b1 = b[1] | 0;
  921. var bl1 = b1 & 0x1fff;
  922. var bh1 = b1 >>> 13;
  923. var b2 = b[2] | 0;
  924. var bl2 = b2 & 0x1fff;
  925. var bh2 = b2 >>> 13;
  926. var b3 = b[3] | 0;
  927. var bl3 = b3 & 0x1fff;
  928. var bh3 = b3 >>> 13;
  929. var b4 = b[4] | 0;
  930. var bl4 = b4 & 0x1fff;
  931. var bh4 = b4 >>> 13;
  932. var b5 = b[5] | 0;
  933. var bl5 = b5 & 0x1fff;
  934. var bh5 = b5 >>> 13;
  935. var b6 = b[6] | 0;
  936. var bl6 = b6 & 0x1fff;
  937. var bh6 = b6 >>> 13;
  938. var b7 = b[7] | 0;
  939. var bl7 = b7 & 0x1fff;
  940. var bh7 = b7 >>> 13;
  941. var b8 = b[8] | 0;
  942. var bl8 = b8 & 0x1fff;
  943. var bh8 = b8 >>> 13;
  944. var b9 = b[9] | 0;
  945. var bl9 = b9 & 0x1fff;
  946. var bh9 = b9 >>> 13;
  947. out.negative = self.negative ^ num.negative;
  948. out.length = 19;
  949. /* k = 0 */
  950. lo = Math.imul(al0, bl0);
  951. mid = Math.imul(al0, bh0);
  952. mid = (mid + Math.imul(ah0, bl0)) | 0;
  953. hi = Math.imul(ah0, bh0);
  954. var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  955. c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
  956. w0 &= 0x3ffffff;
  957. /* k = 1 */
  958. lo = Math.imul(al1, bl0);
  959. mid = Math.imul(al1, bh0);
  960. mid = (mid + Math.imul(ah1, bl0)) | 0;
  961. hi = Math.imul(ah1, bh0);
  962. lo = (lo + Math.imul(al0, bl1)) | 0;
  963. mid = (mid + Math.imul(al0, bh1)) | 0;
  964. mid = (mid + Math.imul(ah0, bl1)) | 0;
  965. hi = (hi + Math.imul(ah0, bh1)) | 0;
  966. var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  967. c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
  968. w1 &= 0x3ffffff;
  969. /* k = 2 */
  970. lo = Math.imul(al2, bl0);
  971. mid = Math.imul(al2, bh0);
  972. mid = (mid + Math.imul(ah2, bl0)) | 0;
  973. hi = Math.imul(ah2, bh0);
  974. lo = (lo + Math.imul(al1, bl1)) | 0;
  975. mid = (mid + Math.imul(al1, bh1)) | 0;
  976. mid = (mid + Math.imul(ah1, bl1)) | 0;
  977. hi = (hi + Math.imul(ah1, bh1)) | 0;
  978. lo = (lo + Math.imul(al0, bl2)) | 0;
  979. mid = (mid + Math.imul(al0, bh2)) | 0;
  980. mid = (mid + Math.imul(ah0, bl2)) | 0;
  981. hi = (hi + Math.imul(ah0, bh2)) | 0;
  982. var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  983. c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
  984. w2 &= 0x3ffffff;
  985. /* k = 3 */
  986. lo = Math.imul(al3, bl0);
  987. mid = Math.imul(al3, bh0);
  988. mid = (mid + Math.imul(ah3, bl0)) | 0;
  989. hi = Math.imul(ah3, bh0);
  990. lo = (lo + Math.imul(al2, bl1)) | 0;
  991. mid = (mid + Math.imul(al2, bh1)) | 0;
  992. mid = (mid + Math.imul(ah2, bl1)) | 0;
  993. hi = (hi + Math.imul(ah2, bh1)) | 0;
  994. lo = (lo + Math.imul(al1, bl2)) | 0;
  995. mid = (mid + Math.imul(al1, bh2)) | 0;
  996. mid = (mid + Math.imul(ah1, bl2)) | 0;
  997. hi = (hi + Math.imul(ah1, bh2)) | 0;
  998. lo = (lo + Math.imul(al0, bl3)) | 0;
  999. mid = (mid + Math.imul(al0, bh3)) | 0;
  1000. mid = (mid + Math.imul(ah0, bl3)) | 0;
  1001. hi = (hi + Math.imul(ah0, bh3)) | 0;
  1002. var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1003. c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
  1004. w3 &= 0x3ffffff;
  1005. /* k = 4 */
  1006. lo = Math.imul(al4, bl0);
  1007. mid = Math.imul(al4, bh0);
  1008. mid = (mid + Math.imul(ah4, bl0)) | 0;
  1009. hi = Math.imul(ah4, bh0);
  1010. lo = (lo + Math.imul(al3, bl1)) | 0;
  1011. mid = (mid + Math.imul(al3, bh1)) | 0;
  1012. mid = (mid + Math.imul(ah3, bl1)) | 0;
  1013. hi = (hi + Math.imul(ah3, bh1)) | 0;
  1014. lo = (lo + Math.imul(al2, bl2)) | 0;
  1015. mid = (mid + Math.imul(al2, bh2)) | 0;
  1016. mid = (mid + Math.imul(ah2, bl2)) | 0;
  1017. hi = (hi + Math.imul(ah2, bh2)) | 0;
  1018. lo = (lo + Math.imul(al1, bl3)) | 0;
  1019. mid = (mid + Math.imul(al1, bh3)) | 0;
  1020. mid = (mid + Math.imul(ah1, bl3)) | 0;
  1021. hi = (hi + Math.imul(ah1, bh3)) | 0;
  1022. lo = (lo + Math.imul(al0, bl4)) | 0;
  1023. mid = (mid + Math.imul(al0, bh4)) | 0;
  1024. mid = (mid + Math.imul(ah0, bl4)) | 0;
  1025. hi = (hi + Math.imul(ah0, bh4)) | 0;
  1026. var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1027. c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
  1028. w4 &= 0x3ffffff;
  1029. /* k = 5 */
  1030. lo = Math.imul(al5, bl0);
  1031. mid = Math.imul(al5, bh0);
  1032. mid = (mid + Math.imul(ah5, bl0)) | 0;
  1033. hi = Math.imul(ah5, bh0);
  1034. lo = (lo + Math.imul(al4, bl1)) | 0;
  1035. mid = (mid + Math.imul(al4, bh1)) | 0;
  1036. mid = (mid + Math.imul(ah4, bl1)) | 0;
  1037. hi = (hi + Math.imul(ah4, bh1)) | 0;
  1038. lo = (lo + Math.imul(al3, bl2)) | 0;
  1039. mid = (mid + Math.imul(al3, bh2)) | 0;
  1040. mid = (mid + Math.imul(ah3, bl2)) | 0;
  1041. hi = (hi + Math.imul(ah3, bh2)) | 0;
  1042. lo = (lo + Math.imul(al2, bl3)) | 0;
  1043. mid = (mid + Math.imul(al2, bh3)) | 0;
  1044. mid = (mid + Math.imul(ah2, bl3)) | 0;
  1045. hi = (hi + Math.imul(ah2, bh3)) | 0;
  1046. lo = (lo + Math.imul(al1, bl4)) | 0;
  1047. mid = (mid + Math.imul(al1, bh4)) | 0;
  1048. mid = (mid + Math.imul(ah1, bl4)) | 0;
  1049. hi = (hi + Math.imul(ah1, bh4)) | 0;
  1050. lo = (lo + Math.imul(al0, bl5)) | 0;
  1051. mid = (mid + Math.imul(al0, bh5)) | 0;
  1052. mid = (mid + Math.imul(ah0, bl5)) | 0;
  1053. hi = (hi + Math.imul(ah0, bh5)) | 0;
  1054. var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1055. c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
  1056. w5 &= 0x3ffffff;
  1057. /* k = 6 */
  1058. lo = Math.imul(al6, bl0);
  1059. mid = Math.imul(al6, bh0);
  1060. mid = (mid + Math.imul(ah6, bl0)) | 0;
  1061. hi = Math.imul(ah6, bh0);
  1062. lo = (lo + Math.imul(al5, bl1)) | 0;
  1063. mid = (mid + Math.imul(al5, bh1)) | 0;
  1064. mid = (mid + Math.imul(ah5, bl1)) | 0;
  1065. hi = (hi + Math.imul(ah5, bh1)) | 0;
  1066. lo = (lo + Math.imul(al4, bl2)) | 0;
  1067. mid = (mid + Math.imul(al4, bh2)) | 0;
  1068. mid = (mid + Math.imul(ah4, bl2)) | 0;
  1069. hi = (hi + Math.imul(ah4, bh2)) | 0;
  1070. lo = (lo + Math.imul(al3, bl3)) | 0;
  1071. mid = (mid + Math.imul(al3, bh3)) | 0;
  1072. mid = (mid + Math.imul(ah3, bl3)) | 0;
  1073. hi = (hi + Math.imul(ah3, bh3)) | 0;
  1074. lo = (lo + Math.imul(al2, bl4)) | 0;
  1075. mid = (mid + Math.imul(al2, bh4)) | 0;
  1076. mid = (mid + Math.imul(ah2, bl4)) | 0;
  1077. hi = (hi + Math.imul(ah2, bh4)) | 0;
  1078. lo = (lo + Math.imul(al1, bl5)) | 0;
  1079. mid = (mid + Math.imul(al1, bh5)) | 0;
  1080. mid = (mid + Math.imul(ah1, bl5)) | 0;
  1081. hi = (hi + Math.imul(ah1, bh5)) | 0;
  1082. lo = (lo + Math.imul(al0, bl6)) | 0;
  1083. mid = (mid + Math.imul(al0, bh6)) | 0;
  1084. mid = (mid + Math.imul(ah0, bl6)) | 0;
  1085. hi = (hi + Math.imul(ah0, bh6)) | 0;
  1086. var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1087. c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
  1088. w6 &= 0x3ffffff;
  1089. /* k = 7 */
  1090. lo = Math.imul(al7, bl0);
  1091. mid = Math.imul(al7, bh0);
  1092. mid = (mid + Math.imul(ah7, bl0)) | 0;
  1093. hi = Math.imul(ah7, bh0);
  1094. lo = (lo + Math.imul(al6, bl1)) | 0;
  1095. mid = (mid + Math.imul(al6, bh1)) | 0;
  1096. mid = (mid + Math.imul(ah6, bl1)) | 0;
  1097. hi = (hi + Math.imul(ah6, bh1)) | 0;
  1098. lo = (lo + Math.imul(al5, bl2)) | 0;
  1099. mid = (mid + Math.imul(al5, bh2)) | 0;
  1100. mid = (mid + Math.imul(ah5, bl2)) | 0;
  1101. hi = (hi + Math.imul(ah5, bh2)) | 0;
  1102. lo = (lo + Math.imul(al4, bl3)) | 0;
  1103. mid = (mid + Math.imul(al4, bh3)) | 0;
  1104. mid = (mid + Math.imul(ah4, bl3)) | 0;
  1105. hi = (hi + Math.imul(ah4, bh3)) | 0;
  1106. lo = (lo + Math.imul(al3, bl4)) | 0;
  1107. mid = (mid + Math.imul(al3, bh4)) | 0;
  1108. mid = (mid + Math.imul(ah3, bl4)) | 0;
  1109. hi = (hi + Math.imul(ah3, bh4)) | 0;
  1110. lo = (lo + Math.imul(al2, bl5)) | 0;
  1111. mid = (mid + Math.imul(al2, bh5)) | 0;
  1112. mid = (mid + Math.imul(ah2, bl5)) | 0;
  1113. hi = (hi + Math.imul(ah2, bh5)) | 0;
  1114. lo = (lo + Math.imul(al1, bl6)) | 0;
  1115. mid = (mid + Math.imul(al1, bh6)) | 0;
  1116. mid = (mid + Math.imul(ah1, bl6)) | 0;
  1117. hi = (hi + Math.imul(ah1, bh6)) | 0;
  1118. lo = (lo + Math.imul(al0, bl7)) | 0;
  1119. mid = (mid + Math.imul(al0, bh7)) | 0;
  1120. mid = (mid + Math.imul(ah0, bl7)) | 0;
  1121. hi = (hi + Math.imul(ah0, bh7)) | 0;
  1122. var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1123. c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
  1124. w7 &= 0x3ffffff;
  1125. /* k = 8 */
  1126. lo = Math.imul(al8, bl0);
  1127. mid = Math.imul(al8, bh0);
  1128. mid = (mid + Math.imul(ah8, bl0)) | 0;
  1129. hi = Math.imul(ah8, bh0);
  1130. lo = (lo + Math.imul(al7, bl1)) | 0;
  1131. mid = (mid + Math.imul(al7, bh1)) | 0;
  1132. mid = (mid + Math.imul(ah7, bl1)) | 0;
  1133. hi = (hi + Math.imul(ah7, bh1)) | 0;
  1134. lo = (lo + Math.imul(al6, bl2)) | 0;
  1135. mid = (mid + Math.imul(al6, bh2)) | 0;
  1136. mid = (mid + Math.imul(ah6, bl2)) | 0;
  1137. hi = (hi + Math.imul(ah6, bh2)) | 0;
  1138. lo = (lo + Math.imul(al5, bl3)) | 0;
  1139. mid = (mid + Math.imul(al5, bh3)) | 0;
  1140. mid = (mid + Math.imul(ah5, bl3)) | 0;
  1141. hi = (hi + Math.imul(ah5, bh3)) | 0;
  1142. lo = (lo + Math.imul(al4, bl4)) | 0;
  1143. mid = (mid + Math.imul(al4, bh4)) | 0;
  1144. mid = (mid + Math.imul(ah4, bl4)) | 0;
  1145. hi = (hi + Math.imul(ah4, bh4)) | 0;
  1146. lo = (lo + Math.imul(al3, bl5)) | 0;
  1147. mid = (mid + Math.imul(al3, bh5)) | 0;
  1148. mid = (mid + Math.imul(ah3, bl5)) | 0;
  1149. hi = (hi + Math.imul(ah3, bh5)) | 0;
  1150. lo = (lo + Math.imul(al2, bl6)) | 0;
  1151. mid = (mid + Math.imul(al2, bh6)) | 0;
  1152. mid = (mid + Math.imul(ah2, bl6)) | 0;
  1153. hi = (hi + Math.imul(ah2, bh6)) | 0;
  1154. lo = (lo + Math.imul(al1, bl7)) | 0;
  1155. mid = (mid + Math.imul(al1, bh7)) | 0;
  1156. mid = (mid + Math.imul(ah1, bl7)) | 0;
  1157. hi = (hi + Math.imul(ah1, bh7)) | 0;
  1158. lo = (lo + Math.imul(al0, bl8)) | 0;
  1159. mid = (mid + Math.imul(al0, bh8)) | 0;
  1160. mid = (mid + Math.imul(ah0, bl8)) | 0;
  1161. hi = (hi + Math.imul(ah0, bh8)) | 0;
  1162. var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1163. c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
  1164. w8 &= 0x3ffffff;
  1165. /* k = 9 */
  1166. lo = Math.imul(al9, bl0);
  1167. mid = Math.imul(al9, bh0);
  1168. mid = (mid + Math.imul(ah9, bl0)) | 0;
  1169. hi = Math.imul(ah9, bh0);
  1170. lo = (lo + Math.imul(al8, bl1)) | 0;
  1171. mid = (mid + Math.imul(al8, bh1)) | 0;
  1172. mid = (mid + Math.imul(ah8, bl1)) | 0;
  1173. hi = (hi + Math.imul(ah8, bh1)) | 0;
  1174. lo = (lo + Math.imul(al7, bl2)) | 0;
  1175. mid = (mid + Math.imul(al7, bh2)) | 0;
  1176. mid = (mid + Math.imul(ah7, bl2)) | 0;
  1177. hi = (hi + Math.imul(ah7, bh2)) | 0;
  1178. lo = (lo + Math.imul(al6, bl3)) | 0;
  1179. mid = (mid + Math.imul(al6, bh3)) | 0;
  1180. mid = (mid + Math.imul(ah6, bl3)) | 0;
  1181. hi = (hi + Math.imul(ah6, bh3)) | 0;
  1182. lo = (lo + Math.imul(al5, bl4)) | 0;
  1183. mid = (mid + Math.imul(al5, bh4)) | 0;
  1184. mid = (mid + Math.imul(ah5, bl4)) | 0;
  1185. hi = (hi + Math.imul(ah5, bh4)) | 0;
  1186. lo = (lo + Math.imul(al4, bl5)) | 0;
  1187. mid = (mid + Math.imul(al4, bh5)) | 0;
  1188. mid = (mid + Math.imul(ah4, bl5)) | 0;
  1189. hi = (hi + Math.imul(ah4, bh5)) | 0;
  1190. lo = (lo + Math.imul(al3, bl6)) | 0;
  1191. mid = (mid + Math.imul(al3, bh6)) | 0;
  1192. mid = (mid + Math.imul(ah3, bl6)) | 0;
  1193. hi = (hi + Math.imul(ah3, bh6)) | 0;
  1194. lo = (lo + Math.imul(al2, bl7)) | 0;
  1195. mid = (mid + Math.imul(al2, bh7)) | 0;
  1196. mid = (mid + Math.imul(ah2, bl7)) | 0;
  1197. hi = (hi + Math.imul(ah2, bh7)) | 0;
  1198. lo = (lo + Math.imul(al1, bl8)) | 0;
  1199. mid = (mid + Math.imul(al1, bh8)) | 0;
  1200. mid = (mid + Math.imul(ah1, bl8)) | 0;
  1201. hi = (hi + Math.imul(ah1, bh8)) | 0;
  1202. lo = (lo + Math.imul(al0, bl9)) | 0;
  1203. mid = (mid + Math.imul(al0, bh9)) | 0;
  1204. mid = (mid + Math.imul(ah0, bl9)) | 0;
  1205. hi = (hi + Math.imul(ah0, bh9)) | 0;
  1206. var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1207. c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
  1208. w9 &= 0x3ffffff;
  1209. /* k = 10 */
  1210. lo = Math.imul(al9, bl1);
  1211. mid = Math.imul(al9, bh1);
  1212. mid = (mid + Math.imul(ah9, bl1)) | 0;
  1213. hi = Math.imul(ah9, bh1);
  1214. lo = (lo + Math.imul(al8, bl2)) | 0;
  1215. mid = (mid + Math.imul(al8, bh2)) | 0;
  1216. mid = (mid + Math.imul(ah8, bl2)) | 0;
  1217. hi = (hi + Math.imul(ah8, bh2)) | 0;
  1218. lo = (lo + Math.imul(al7, bl3)) | 0;
  1219. mid = (mid + Math.imul(al7, bh3)) | 0;
  1220. mid = (mid + Math.imul(ah7, bl3)) | 0;
  1221. hi = (hi + Math.imul(ah7, bh3)) | 0;
  1222. lo = (lo + Math.imul(al6, bl4)) | 0;
  1223. mid = (mid + Math.imul(al6, bh4)) | 0;
  1224. mid = (mid + Math.imul(ah6, bl4)) | 0;
  1225. hi = (hi + Math.imul(ah6, bh4)) | 0;
  1226. lo = (lo + Math.imul(al5, bl5)) | 0;
  1227. mid = (mid + Math.imul(al5, bh5)) | 0;
  1228. mid = (mid + Math.imul(ah5, bl5)) | 0;
  1229. hi = (hi + Math.imul(ah5, bh5)) | 0;
  1230. lo = (lo + Math.imul(al4, bl6)) | 0;
  1231. mid = (mid + Math.imul(al4, bh6)) | 0;
  1232. mid = (mid + Math.imul(ah4, bl6)) | 0;
  1233. hi = (hi + Math.imul(ah4, bh6)) | 0;
  1234. lo = (lo + Math.imul(al3, bl7)) | 0;
  1235. mid = (mid + Math.imul(al3, bh7)) | 0;
  1236. mid = (mid + Math.imul(ah3, bl7)) | 0;
  1237. hi = (hi + Math.imul(ah3, bh7)) | 0;
  1238. lo = (lo + Math.imul(al2, bl8)) | 0;
  1239. mid = (mid + Math.imul(al2, bh8)) | 0;
  1240. mid = (mid + Math.imul(ah2, bl8)) | 0;
  1241. hi = (hi + Math.imul(ah2, bh8)) | 0;
  1242. lo = (lo + Math.imul(al1, bl9)) | 0;
  1243. mid = (mid + Math.imul(al1, bh9)) | 0;
  1244. mid = (mid + Math.imul(ah1, bl9)) | 0;
  1245. hi = (hi + Math.imul(ah1, bh9)) | 0;
  1246. var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1247. c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
  1248. w10 &= 0x3ffffff;
  1249. /* k = 11 */
  1250. lo = Math.imul(al9, bl2);
  1251. mid = Math.imul(al9, bh2);
  1252. mid = (mid + Math.imul(ah9, bl2)) | 0;
  1253. hi = Math.imul(ah9, bh2);
  1254. lo = (lo + Math.imul(al8, bl3)) | 0;
  1255. mid = (mid + Math.imul(al8, bh3)) | 0;
  1256. mid = (mid + Math.imul(ah8, bl3)) | 0;
  1257. hi = (hi + Math.imul(ah8, bh3)) | 0;
  1258. lo = (lo + Math.imul(al7, bl4)) | 0;
  1259. mid = (mid + Math.imul(al7, bh4)) | 0;
  1260. mid = (mid + Math.imul(ah7, bl4)) | 0;
  1261. hi = (hi + Math.imul(ah7, bh4)) | 0;
  1262. lo = (lo + Math.imul(al6, bl5)) | 0;
  1263. mid = (mid + Math.imul(al6, bh5)) | 0;
  1264. mid = (mid + Math.imul(ah6, bl5)) | 0;
  1265. hi = (hi + Math.imul(ah6, bh5)) | 0;
  1266. lo = (lo + Math.imul(al5, bl6)) | 0;
  1267. mid = (mid + Math.imul(al5, bh6)) | 0;
  1268. mid = (mid + Math.imul(ah5, bl6)) | 0;
  1269. hi = (hi + Math.imul(ah5, bh6)) | 0;
  1270. lo = (lo + Math.imul(al4, bl7)) | 0;
  1271. mid = (mid + Math.imul(al4, bh7)) | 0;
  1272. mid = (mid + Math.imul(ah4, bl7)) | 0;
  1273. hi = (hi + Math.imul(ah4, bh7)) | 0;
  1274. lo = (lo + Math.imul(al3, bl8)) | 0;
  1275. mid = (mid + Math.imul(al3, bh8)) | 0;
  1276. mid = (mid + Math.imul(ah3, bl8)) | 0;
  1277. hi = (hi + Math.imul(ah3, bh8)) | 0;
  1278. lo = (lo + Math.imul(al2, bl9)) | 0;
  1279. mid = (mid + Math.imul(al2, bh9)) | 0;
  1280. mid = (mid + Math.imul(ah2, bl9)) | 0;
  1281. hi = (hi + Math.imul(ah2, bh9)) | 0;
  1282. var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1283. c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
  1284. w11 &= 0x3ffffff;
  1285. /* k = 12 */
  1286. lo = Math.imul(al9, bl3);
  1287. mid = Math.imul(al9, bh3);
  1288. mid = (mid + Math.imul(ah9, bl3)) | 0;
  1289. hi = Math.imul(ah9, bh3);
  1290. lo = (lo + Math.imul(al8, bl4)) | 0;
  1291. mid = (mid + Math.imul(al8, bh4)) | 0;
  1292. mid = (mid + Math.imul(ah8, bl4)) | 0;
  1293. hi = (hi + Math.imul(ah8, bh4)) | 0;
  1294. lo = (lo + Math.imul(al7, bl5)) | 0;
  1295. mid = (mid + Math.imul(al7, bh5)) | 0;
  1296. mid = (mid + Math.imul(ah7, bl5)) | 0;
  1297. hi = (hi + Math.imul(ah7, bh5)) | 0;
  1298. lo = (lo + Math.imul(al6, bl6)) | 0;
  1299. mid = (mid + Math.imul(al6, bh6)) | 0;
  1300. mid = (mid + Math.imul(ah6, bl6)) | 0;
  1301. hi = (hi + Math.imul(ah6, bh6)) | 0;
  1302. lo = (lo + Math.imul(al5, bl7)) | 0;
  1303. mid = (mid + Math.imul(al5, bh7)) | 0;
  1304. mid = (mid + Math.imul(ah5, bl7)) | 0;
  1305. hi = (hi + Math.imul(ah5, bh7)) | 0;
  1306. lo = (lo + Math.imul(al4, bl8)) | 0;
  1307. mid = (mid + Math.imul(al4, bh8)) | 0;
  1308. mid = (mid + Math.imul(ah4, bl8)) | 0;
  1309. hi = (hi + Math.imul(ah4, bh8)) | 0;
  1310. lo = (lo + Math.imul(al3, bl9)) | 0;
  1311. mid = (mid + Math.imul(al3, bh9)) | 0;
  1312. mid = (mid + Math.imul(ah3, bl9)) | 0;
  1313. hi = (hi + Math.imul(ah3, bh9)) | 0;
  1314. var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1315. c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
  1316. w12 &= 0x3ffffff;
  1317. /* k = 13 */
  1318. lo = Math.imul(al9, bl4);
  1319. mid = Math.imul(al9, bh4);
  1320. mid = (mid + Math.imul(ah9, bl4)) | 0;
  1321. hi = Math.imul(ah9, bh4);
  1322. lo = (lo + Math.imul(al8, bl5)) | 0;
  1323. mid = (mid + Math.imul(al8, bh5)) | 0;
  1324. mid = (mid + Math.imul(ah8, bl5)) | 0;
  1325. hi = (hi + Math.imul(ah8, bh5)) | 0;
  1326. lo = (lo + Math.imul(al7, bl6)) | 0;
  1327. mid = (mid + Math.imul(al7, bh6)) | 0;
  1328. mid = (mid + Math.imul(ah7, bl6)) | 0;
  1329. hi = (hi + Math.imul(ah7, bh6)) | 0;
  1330. lo = (lo + Math.imul(al6, bl7)) | 0;
  1331. mid = (mid + Math.imul(al6, bh7)) | 0;
  1332. mid = (mid + Math.imul(ah6, bl7)) | 0;
  1333. hi = (hi + Math.imul(ah6, bh7)) | 0;
  1334. lo = (lo + Math.imul(al5, bl8)) | 0;
  1335. mid = (mid + Math.imul(al5, bh8)) | 0;
  1336. mid = (mid + Math.imul(ah5, bl8)) | 0;
  1337. hi = (hi + Math.imul(ah5, bh8)) | 0;
  1338. lo = (lo + Math.imul(al4, bl9)) | 0;
  1339. mid = (mid + Math.imul(al4, bh9)) | 0;
  1340. mid = (mid + Math.imul(ah4, bl9)) | 0;
  1341. hi = (hi + Math.imul(ah4, bh9)) | 0;
  1342. var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1343. c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
  1344. w13 &= 0x3ffffff;
  1345. /* k = 14 */
  1346. lo = Math.imul(al9, bl5);
  1347. mid = Math.imul(al9, bh5);
  1348. mid = (mid + Math.imul(ah9, bl5)) | 0;
  1349. hi = Math.imul(ah9, bh5);
  1350. lo = (lo + Math.imul(al8, bl6)) | 0;
  1351. mid = (mid + Math.imul(al8, bh6)) | 0;
  1352. mid = (mid + Math.imul(ah8, bl6)) | 0;
  1353. hi = (hi + Math.imul(ah8, bh6)) | 0;
  1354. lo = (lo + Math.imul(al7, bl7)) | 0;
  1355. mid = (mid + Math.imul(al7, bh7)) | 0;
  1356. mid = (mid + Math.imul(ah7, bl7)) | 0;
  1357. hi = (hi + Math.imul(ah7, bh7)) | 0;
  1358. lo = (lo + Math.imul(al6, bl8)) | 0;
  1359. mid = (mid + Math.imul(al6, bh8)) | 0;
  1360. mid = (mid + Math.imul(ah6, bl8)) | 0;
  1361. hi = (hi + Math.imul(ah6, bh8)) | 0;
  1362. lo = (lo + Math.imul(al5, bl9)) | 0;
  1363. mid = (mid + Math.imul(al5, bh9)) | 0;
  1364. mid = (mid + Math.imul(ah5, bl9)) | 0;
  1365. hi = (hi + Math.imul(ah5, bh9)) | 0;
  1366. var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1367. c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
  1368. w14 &= 0x3ffffff;
  1369. /* k = 15 */
  1370. lo = Math.imul(al9, bl6);
  1371. mid = Math.imul(al9, bh6);
  1372. mid = (mid + Math.imul(ah9, bl6)) | 0;
  1373. hi = Math.imul(ah9, bh6);
  1374. lo = (lo + Math.imul(al8, bl7)) | 0;
  1375. mid = (mid + Math.imul(al8, bh7)) | 0;
  1376. mid = (mid + Math.imul(ah8, bl7)) | 0;
  1377. hi = (hi + Math.imul(ah8, bh7)) | 0;
  1378. lo = (lo + Math.imul(al7, bl8)) | 0;
  1379. mid = (mid + Math.imul(al7, bh8)) | 0;
  1380. mid = (mid + Math.imul(ah7, bl8)) | 0;
  1381. hi = (hi + Math.imul(ah7, bh8)) | 0;
  1382. lo = (lo + Math.imul(al6, bl9)) | 0;
  1383. mid = (mid + Math.imul(al6, bh9)) | 0;
  1384. mid = (mid + Math.imul(ah6, bl9)) | 0;
  1385. hi = (hi + Math.imul(ah6, bh9)) | 0;
  1386. var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1387. c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
  1388. w15 &= 0x3ffffff;
  1389. /* k = 16 */
  1390. lo = Math.imul(al9, bl7);
  1391. mid = Math.imul(al9, bh7);
  1392. mid = (mid + Math.imul(ah9, bl7)) | 0;
  1393. hi = Math.imul(ah9, bh7);
  1394. lo = (lo + Math.imul(al8, bl8)) | 0;
  1395. mid = (mid + Math.imul(al8, bh8)) | 0;
  1396. mid = (mid + Math.imul(ah8, bl8)) | 0;
  1397. hi = (hi + Math.imul(ah8, bh8)) | 0;
  1398. lo = (lo + Math.imul(al7, bl9)) | 0;
  1399. mid = (mid + Math.imul(al7, bh9)) | 0;
  1400. mid = (mid + Math.imul(ah7, bl9)) | 0;
  1401. hi = (hi + Math.imul(ah7, bh9)) | 0;
  1402. var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1403. c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
  1404. w16 &= 0x3ffffff;
  1405. /* k = 17 */
  1406. lo = Math.imul(al9, bl8);
  1407. mid = Math.imul(al9, bh8);
  1408. mid = (mid + Math.imul(ah9, bl8)) | 0;
  1409. hi = Math.imul(ah9, bh8);
  1410. lo = (lo + Math.imul(al8, bl9)) | 0;
  1411. mid = (mid + Math.imul(al8, bh9)) | 0;
  1412. mid = (mid + Math.imul(ah8, bl9)) | 0;
  1413. hi = (hi + Math.imul(ah8, bh9)) | 0;
  1414. var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1415. c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
  1416. w17 &= 0x3ffffff;
  1417. /* k = 18 */
  1418. lo = Math.imul(al9, bl9);
  1419. mid = Math.imul(al9, bh9);
  1420. mid = (mid + Math.imul(ah9, bl9)) | 0;
  1421. hi = Math.imul(ah9, bh9);
  1422. var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
  1423. c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
  1424. w18 &= 0x3ffffff;
  1425. o[0] = w0;
  1426. o[1] = w1;
  1427. o[2] = w2;
  1428. o[3] = w3;
  1429. o[4] = w4;
  1430. o[5] = w5;
  1431. o[6] = w6;
  1432. o[7] = w7;
  1433. o[8] = w8;
  1434. o[9] = w9;
  1435. o[10] = w10;
  1436. o[11] = w11;
  1437. o[12] = w12;
  1438. o[13] = w13;
  1439. o[14] = w14;
  1440. o[15] = w15;
  1441. o[16] = w16;
  1442. o[17] = w17;
  1443. o[18] = w18;
  1444. if (c !== 0) {
  1445. o[19] = c;
  1446. out.length++;
  1447. }
  1448. return out;
  1449. };
  1450. // Polyfill comb
  1451. if (!Math.imul) {
  1452. comb10MulTo = smallMulTo;
  1453. }
  1454. function bigMulTo (self, num, out) {
  1455. out.negative = num.negative ^ self.negative;
  1456. out.length = self.length + num.length;
  1457. var carry = 0;
  1458. var hncarry = 0;
  1459. for (var k = 0; k < out.length - 1; k++) {
  1460. // Sum all words with the same `i + j = k` and accumulate `ncarry`,
  1461. // note that ncarry could be >= 0x3ffffff
  1462. var ncarry = hncarry;
  1463. hncarry = 0;
  1464. var rword = carry & 0x3ffffff;
  1465. var maxJ = Math.min(k, num.length - 1);
  1466. for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
  1467. var i = k - j;
  1468. var a = self.words[i] | 0;
  1469. var b = num.words[j] | 0;
  1470. var r = a * b;
  1471. var lo = r & 0x3ffffff;
  1472. ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
  1473. lo = (lo + rword) | 0;
  1474. rword = lo & 0x3ffffff;
  1475. ncarry = (ncarry + (lo >>> 26)) | 0;
  1476. hncarry += ncarry >>> 26;
  1477. ncarry &= 0x3ffffff;
  1478. }
  1479. out.words[k] = rword;
  1480. carry = ncarry;
  1481. ncarry = hncarry;
  1482. }
  1483. if (carry !== 0) {
  1484. out.words[k] = carry;
  1485. } else {
  1486. out.length--;
  1487. }
  1488. return out.strip();
  1489. }
  1490. function jumboMulTo (self, num, out) {
  1491. var fftm = new FFTM();
  1492. return fftm.mulp(self, num, out);
  1493. }
  1494. BN.prototype.mulTo = function mulTo (num, out) {
  1495. var res;
  1496. var len = this.length + num.length;
  1497. if (this.length === 10 && num.length === 10) {
  1498. res = comb10MulTo(this, num, out);
  1499. } else if (len < 63) {
  1500. res = smallMulTo(this, num, out);
  1501. } else if (len < 1024) {
  1502. res = bigMulTo(this, num, out);
  1503. } else {
  1504. res = jumboMulTo(this, num, out);
  1505. }
  1506. return res;
  1507. };
  1508. // Cooley-Tukey algorithm for FFT
  1509. // slightly revisited to rely on looping instead of recursion
  1510. function FFTM (x, y) {
  1511. this.x = x;
  1512. this.y = y;
  1513. }
  1514. FFTM.prototype.makeRBT = function makeRBT (N) {
  1515. var t = new Array(N);
  1516. var l = BN.prototype._countBits(N) - 1;
  1517. for (var i = 0; i < N; i++) {
  1518. t[i] = this.revBin(i, l, N);
  1519. }
  1520. return t;
  1521. };
  1522. // Returns binary-reversed representation of `x`
  1523. FFTM.prototype.revBin = function revBin (x, l, N) {
  1524. if (x === 0 || x === N - 1) return x;
  1525. var rb = 0;
  1526. for (var i = 0; i < l; i++) {
  1527. rb |= (x & 1) << (l - i - 1);
  1528. x >>= 1;
  1529. }
  1530. return rb;
  1531. };
  1532. // Performs "tweedling" phase, therefore 'emulating'
  1533. // behaviour of the recursive algorithm
  1534. FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
  1535. for (var i = 0; i < N; i++) {
  1536. rtws[i] = rws[rbt[i]];
  1537. itws[i] = iws[rbt[i]];
  1538. }
  1539. };
  1540. FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
  1541. this.permute(rbt, rws, iws, rtws, itws, N);
  1542. for (var s = 1; s < N; s <<= 1) {
  1543. var l = s << 1;
  1544. var rtwdf = Math.cos(2 * Math.PI / l);
  1545. var itwdf = Math.sin(2 * Math.PI / l);
  1546. for (var p = 0; p < N; p += l) {
  1547. var rtwdf_ = rtwdf;
  1548. var itwdf_ = itwdf;
  1549. for (var j = 0; j < s; j++) {
  1550. var re = rtws[p + j];
  1551. var ie = itws[p + j];
  1552. var ro = rtws[p + j + s];
  1553. var io = itws[p + j + s];
  1554. var rx = rtwdf_ * ro - itwdf_ * io;
  1555. io = rtwdf_ * io + itwdf_ * ro;
  1556. ro = rx;
  1557. rtws[p + j] = re + ro;
  1558. itws[p + j] = ie + io;
  1559. rtws[p + j + s] = re - ro;
  1560. itws[p + j + s] = ie - io;
  1561. /* jshint maxdepth : false */
  1562. if (j !== l) {
  1563. rx = rtwdf * rtwdf_ - itwdf * itwdf_;
  1564. itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
  1565. rtwdf_ = rx;
  1566. }
  1567. }
  1568. }
  1569. }
  1570. };
  1571. FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
  1572. var N = Math.max(m, n) | 1;
  1573. var odd = N & 1;
  1574. var i = 0;
  1575. for (N = N / 2 | 0; N; N = N >>> 1) {
  1576. i++;
  1577. }
  1578. return 1 << i + 1 + odd;
  1579. };
  1580. FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
  1581. if (N <= 1) return;
  1582. for (var i = 0; i < N / 2; i++) {
  1583. var t = rws[i];
  1584. rws[i] = rws[N - i - 1];
  1585. rws[N - i - 1] = t;
  1586. t = iws[i];
  1587. iws[i] = -iws[N - i - 1];
  1588. iws[N - i - 1] = -t;
  1589. }
  1590. };
  1591. FFTM.prototype.normalize13b = function normalize13b (ws, N) {
  1592. var carry = 0;
  1593. for (var i = 0; i < N / 2; i++) {
  1594. var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
  1595. Math.round(ws[2 * i] / N) +
  1596. carry;
  1597. ws[i] = w & 0x3ffffff;
  1598. if (w < 0x4000000) {
  1599. carry = 0;
  1600. } else {
  1601. carry = w / 0x4000000 | 0;
  1602. }
  1603. }
  1604. return ws;
  1605. };
  1606. FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
  1607. var carry = 0;
  1608. for (var i = 0; i < len; i++) {
  1609. carry = carry + (ws[i] | 0);
  1610. rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
  1611. rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
  1612. }
  1613. // Pad with zeroes
  1614. for (i = 2 * len; i < N; ++i) {
  1615. rws[i] = 0;
  1616. }
  1617. assert(carry === 0);
  1618. assert((carry & ~0x1fff) === 0);
  1619. };
  1620. FFTM.prototype.stub = function stub (N) {
  1621. var ph = new Array(N);
  1622. for (var i = 0; i < N; i++) {
  1623. ph[i] = 0;
  1624. }
  1625. return ph;
  1626. };
  1627. FFTM.prototype.mulp = function mulp (x, y, out) {
  1628. var N = 2 * this.guessLen13b(x.length, y.length);
  1629. var rbt = this.makeRBT(N);
  1630. var _ = this.stub(N);
  1631. var rws = new Array(N);
  1632. var rwst = new Array(N);
  1633. var iwst = new Array(N);
  1634. var nrws = new Array(N);
  1635. var nrwst = new Array(N);
  1636. var niwst = new Array(N);
  1637. var rmws = out.words;
  1638. rmws.length = N;
  1639. this.convert13b(x.words, x.length, rws, N);
  1640. this.convert13b(y.words, y.length, nrws, N);
  1641. this.transform(rws, _, rwst, iwst, N, rbt);
  1642. this.transform(nrws, _, nrwst, niwst, N, rbt);
  1643. for (var i = 0; i < N; i++) {
  1644. var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
  1645. iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
  1646. rwst[i] = rx;
  1647. }
  1648. this.conjugate(rwst, iwst, N);
  1649. this.transform(rwst, iwst, rmws, _, N, rbt);
  1650. this.conjugate(rmws, _, N);
  1651. this.normalize13b(rmws, N);
  1652. out.negative = x.negative ^ y.negative;
  1653. out.length = x.length + y.length;
  1654. return out.strip();
  1655. };
  1656. // Multiply `this` by `num`
  1657. BN.prototype.mul = function mul (num) {
  1658. var out = new BN(null);
  1659. out.words = new Array(this.length + num.length);
  1660. return this.mulTo(num, out);
  1661. };
  1662. // Multiply employing FFT
  1663. BN.prototype.mulf = function mulf (num) {
  1664. var out = new BN(null);
  1665. out.words = new Array(this.length + num.length);
  1666. return jumboMulTo(this, num, out);
  1667. };
  1668. // In-place Multiplication
  1669. BN.prototype.imul = function imul (num) {
  1670. return this.clone().mulTo(num, this);
  1671. };
  1672. BN.prototype.imuln = function imuln (num) {
  1673. assert(typeof num === 'number');
  1674. assert(num < 0x4000000);
  1675. // Carry
  1676. var carry = 0;
  1677. for (var i = 0; i < this.length; i++) {
  1678. var w = (this.words[i] | 0) * num;
  1679. var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
  1680. carry >>= 26;
  1681. carry += (w / 0x4000000) | 0;
  1682. // NOTE: lo is 27bit maximum
  1683. carry += lo >>> 26;
  1684. this.words[i] = lo & 0x3ffffff;
  1685. }
  1686. if (carry !== 0) {
  1687. this.words[i] = carry;
  1688. this.length++;
  1689. }
  1690. return this;
  1691. };
  1692. BN.prototype.muln = function muln (num) {
  1693. return this.clone().imuln(num);
  1694. };
  1695. // `this` * `this`
  1696. BN.prototype.sqr = function sqr () {
  1697. return this.mul(this);
  1698. };
  1699. // `this` * `this` in-place
  1700. BN.prototype.isqr = function isqr () {
  1701. return this.imul(this.clone());
  1702. };
  1703. // Math.pow(`this`, `num`)
  1704. BN.prototype.pow = function pow (num) {
  1705. var w = toBitArray(num);
  1706. if (w.length === 0) return new BN(1);
  1707. // Skip leading zeroes
  1708. var res = this;
  1709. for (var i = 0; i < w.length; i++, res = res.sqr()) {
  1710. if (w[i] !== 0) break;
  1711. }
  1712. if (++i < w.length) {
  1713. for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
  1714. if (w[i] === 0) continue;
  1715. res = res.mul(q);
  1716. }
  1717. }
  1718. return res;
  1719. };
  1720. // Shift-left in-place
  1721. BN.prototype.iushln = function iushln (bits) {
  1722. assert(typeof bits === 'number' && bits >= 0);
  1723. var r = bits % 26;
  1724. var s = (bits - r) / 26;
  1725. var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
  1726. var i;
  1727. if (r !== 0) {
  1728. var carry = 0;
  1729. for (i = 0; i < this.length; i++) {
  1730. var newCarry = this.words[i] & carryMask;
  1731. var c = ((this.words[i] | 0) - newCarry) << r;
  1732. this.words[i] = c | carry;
  1733. carry = newCarry >>> (26 - r);
  1734. }
  1735. if (carry) {
  1736. this.words[i] = carry;
  1737. this.length++;
  1738. }
  1739. }
  1740. if (s !== 0) {
  1741. for (i = this.length - 1; i >= 0; i--) {
  1742. this.words[i + s] = this.words[i];
  1743. }
  1744. for (i = 0; i < s; i++) {
  1745. this.words[i] = 0;
  1746. }
  1747. this.length += s;
  1748. }
  1749. return this.strip();
  1750. };
  1751. BN.prototype.ishln = function ishln (bits) {
  1752. // TODO(indutny): implement me
  1753. assert(this.negative === 0);
  1754. return this.iushln(bits);
  1755. };
  1756. // Shift-right in-place
  1757. // NOTE: `hint` is a lowest bit before trailing zeroes
  1758. // NOTE: if `extended` is present - it will be filled with destroyed bits
  1759. BN.prototype.iushrn = function iushrn (bits, hint, extended) {
  1760. assert(typeof bits === 'number' && bits >= 0);
  1761. var h;
  1762. if (hint) {
  1763. h = (hint - (hint % 26)) / 26;
  1764. } else {
  1765. h = 0;
  1766. }
  1767. var r = bits % 26;
  1768. var s = Math.min((bits - r) / 26, this.length);
  1769. var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
  1770. var maskedWords = extended;
  1771. h -= s;
  1772. h = Math.max(0, h);
  1773. // Extended mode, copy masked part
  1774. if (maskedWords) {
  1775. for (var i = 0; i < s; i++) {
  1776. maskedWords.words[i] = this.words[i];
  1777. }
  1778. maskedWords.length = s;
  1779. }
  1780. if (s === 0) {
  1781. // No-op, we should not move anything at all
  1782. } else if (this.length > s) {
  1783. this.length -= s;
  1784. for (i = 0; i < this.length; i++) {
  1785. this.words[i] = this.words[i + s];
  1786. }
  1787. } else {
  1788. this.words[0] = 0;
  1789. this.length = 1;
  1790. }
  1791. var carry = 0;
  1792. for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
  1793. var word = this.words[i] | 0;
  1794. this.words[i] = (carry << (26 - r)) | (word >>> r);
  1795. carry = word & mask;
  1796. }
  1797. // Push carried bits as a mask
  1798. if (maskedWords && carry !== 0) {
  1799. maskedWords.words[maskedWords.length++] = carry;
  1800. }
  1801. if (this.length === 0) {
  1802. this.words[0] = 0;
  1803. this.length = 1;
  1804. }
  1805. return this.strip();
  1806. };
  1807. BN.prototype.ishrn = function ishrn (bits, hint, extended) {
  1808. // TODO(indutny): implement me
  1809. assert(this.negative === 0);
  1810. return this.iushrn(bits, hint, extended);
  1811. };
  1812. // Shift-left
  1813. BN.prototype.shln = function shln (bits) {
  1814. return this.clone().ishln(bits);
  1815. };
  1816. BN.prototype.ushln = function ushln (bits) {
  1817. return this.clone().iushln(bits);
  1818. };
  1819. // Shift-right
  1820. BN.prototype.shrn = function shrn (bits) {
  1821. return this.clone().ishrn(bits);
  1822. };
  1823. BN.prototype.ushrn = function ushrn (bits) {
  1824. return this.clone().iushrn(bits);
  1825. };
  1826. // Test if n bit is set
  1827. BN.prototype.testn = function testn (bit) {
  1828. assert(typeof bit === 'number' && bit >= 0);
  1829. var r = bit % 26;
  1830. var s = (bit - r) / 26;
  1831. var q = 1 << r;
  1832. // Fast case: bit is much higher than all existing words
  1833. if (this.length <= s) return false;
  1834. // Check bit and return
  1835. var w = this.words[s];
  1836. return !!(w & q);
  1837. };
  1838. // Return only lowers bits of number (in-place)
  1839. BN.prototype.imaskn = function imaskn (bits) {
  1840. assert(typeof bits === 'number' && bits >= 0);
  1841. var r = bits % 26;
  1842. var s = (bits - r) / 26;
  1843. assert(this.negative === 0, 'imaskn works only with positive numbers');
  1844. if (this.length <= s) {
  1845. return this;
  1846. }
  1847. if (r !== 0) {
  1848. s++;
  1849. }
  1850. this.length = Math.min(s, this.length);
  1851. if (r !== 0) {
  1852. var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
  1853. this.words[this.length - 1] &= mask;
  1854. }
  1855. return this.strip();
  1856. };
  1857. // Return only lowers bits of number
  1858. BN.prototype.maskn = function maskn (bits) {
  1859. return this.clone().imaskn(bits);
  1860. };
  1861. // Add plain number `num` to `this`
  1862. BN.prototype.iaddn = function iaddn (num) {
  1863. assert(typeof num === 'number');
  1864. assert(num < 0x4000000);
  1865. if (num < 0) return this.isubn(-num);
  1866. // Possible sign change
  1867. if (this.negative !== 0) {
  1868. if (this.length === 1 && (this.words[0] | 0) < num) {
  1869. this.words[0] = num - (this.words[0] | 0);
  1870. this.negative = 0;
  1871. return this;
  1872. }
  1873. this.negative = 0;
  1874. this.isubn(num);
  1875. this.negative = 1;
  1876. return this;
  1877. }
  1878. // Add without checks
  1879. return this._iaddn(num);
  1880. };
  1881. BN.prototype._iaddn = function _iaddn (num) {
  1882. this.words[0] += num;
  1883. // Carry
  1884. for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
  1885. this.words[i] -= 0x4000000;
  1886. if (i === this.length - 1) {
  1887. this.words[i + 1] = 1;
  1888. } else {
  1889. this.words[i + 1]++;
  1890. }
  1891. }
  1892. this.length = Math.max(this.length, i + 1);
  1893. return this;
  1894. };
  1895. // Subtract plain number `num` from `this`
  1896. BN.prototype.isubn = function isubn (num) {
  1897. assert(typeof num === 'number');
  1898. assert(num < 0x4000000);
  1899. if (num < 0) return this.iaddn(-num);
  1900. if (this.negative !== 0) {
  1901. this.negative = 0;
  1902. this.iaddn(num);
  1903. this.negative = 1;
  1904. return this;
  1905. }
  1906. this.words[0] -= num;
  1907. if (this.length === 1 && this.words[0] < 0) {
  1908. this.words[0] = -this.words[0];
  1909. this.negative = 1;
  1910. } else {
  1911. // Carry
  1912. for (var i = 0; i < this.length && this.words[i] < 0; i++) {
  1913. this.words[i] += 0x4000000;
  1914. this.words[i + 1] -= 1;
  1915. }
  1916. }
  1917. return this.strip();
  1918. };
  1919. BN.prototype.addn = function addn (num) {
  1920. return this.clone().iaddn(num);
  1921. };
  1922. BN.prototype.subn = function subn (num) {
  1923. return this.clone().isubn(num);
  1924. };
  1925. BN.prototype.iabs = function iabs () {
  1926. this.negative = 0;
  1927. return this;
  1928. };
  1929. BN.prototype.abs = function abs () {
  1930. return this.clone().iabs();
  1931. };
  1932. BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
  1933. var len = num.length + shift;
  1934. var i;
  1935. this._expand(len);
  1936. var w;
  1937. var carry = 0;
  1938. for (i = 0; i < num.length; i++) {
  1939. w = (this.words[i + shift] | 0) + carry;
  1940. var right = (num.words[i] | 0) * mul;
  1941. w -= right & 0x3ffffff;
  1942. carry = (w >> 26) - ((right / 0x4000000) | 0);
  1943. this.words[i + shift] = w & 0x3ffffff;
  1944. }
  1945. for (; i < this.length - shift; i++) {
  1946. w = (this.words[i + shift] | 0) + carry;
  1947. carry = w >> 26;
  1948. this.words[i + shift] = w & 0x3ffffff;
  1949. }
  1950. if (carry === 0) return this.strip();
  1951. // Subtraction overflow
  1952. assert(carry === -1);
  1953. carry = 0;
  1954. for (i = 0; i < this.length; i++) {
  1955. w = -(this.words[i] | 0) + carry;
  1956. carry = w >> 26;
  1957. this.words[i] = w & 0x3ffffff;
  1958. }
  1959. this.negative = 1;
  1960. return this.strip();
  1961. };
  1962. BN.prototype._wordDiv = function _wordDiv (num, mode) {
  1963. var shift = this.length - num.length;
  1964. var a = this.clone();
  1965. var b = num;
  1966. // Normalize
  1967. var bhi = b.words[b.length - 1] | 0;
  1968. var bhiBits = this._countBits(bhi);
  1969. shift = 26 - bhiBits;
  1970. if (shift !== 0) {
  1971. b = b.ushln(shift);
  1972. a.iushln(shift);
  1973. bhi = b.words[b.length - 1] | 0;
  1974. }
  1975. // Initialize quotient
  1976. var m = a.length - b.length;
  1977. var q;
  1978. if (mode !== 'mod') {
  1979. q = new BN(null);
  1980. q.length = m + 1;
  1981. q.words = new Array(q.length);
  1982. for (var i = 0; i < q.length; i++) {
  1983. q.words[i] = 0;
  1984. }
  1985. }
  1986. var diff = a.clone()._ishlnsubmul(b, 1, m);
  1987. if (diff.negative === 0) {
  1988. a = diff;
  1989. if (q) {
  1990. q.words[m] = 1;
  1991. }
  1992. }
  1993. for (var j = m - 1; j >= 0; j--) {
  1994. var qj = (a.words[b.length + j] | 0) * 0x4000000 +
  1995. (a.words[b.length + j - 1] | 0);
  1996. // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
  1997. // (0x7ffffff)
  1998. qj = Math.min((qj / bhi) | 0, 0x3ffffff);
  1999. a._ishlnsubmul(b, qj, j);
  2000. while (a.negative !== 0) {
  2001. qj--;
  2002. a.negative = 0;
  2003. a._ishlnsubmul(b, 1, j);
  2004. if (!a.isZero()) {
  2005. a.negative ^= 1;
  2006. }
  2007. }
  2008. if (q) {
  2009. q.words[j] = qj;
  2010. }
  2011. }
  2012. if (q) {
  2013. q.strip();
  2014. }
  2015. a.strip();
  2016. // Denormalize
  2017. if (mode !== 'div' && shift !== 0) {
  2018. a.iushrn(shift);
  2019. }
  2020. return {
  2021. div: q || null,
  2022. mod: a
  2023. };
  2024. };
  2025. // NOTE: 1) `mode` can be set to `mod` to request mod only,
  2026. // to `div` to request div only, or be absent to
  2027. // request both div & mod
  2028. // 2) `positive` is true if unsigned mod is requested
  2029. BN.prototype.divmod = function divmod (num, mode, positive) {
  2030. assert(!num.isZero());
  2031. if (this.isZero()) {
  2032. return {
  2033. div: new BN(0),
  2034. mod: new BN(0)
  2035. };
  2036. }
  2037. var div, mod, res;
  2038. if (this.negative !== 0 && num.negative === 0) {
  2039. res = this.neg().divmod(num, mode);
  2040. if (mode !== 'mod') {
  2041. div = res.div.neg();
  2042. }
  2043. if (mode !== 'div') {
  2044. mod = res.mod.neg();
  2045. if (positive && mod.negative !== 0) {
  2046. mod.iadd(num);
  2047. }
  2048. }
  2049. return {
  2050. div: div,
  2051. mod: mod
  2052. };
  2053. }
  2054. if (this.negative === 0 && num.negative !== 0) {
  2055. res = this.divmod(num.neg(), mode);
  2056. if (mode !== 'mod') {
  2057. div = res.div.neg();
  2058. }
  2059. return {
  2060. div: div,
  2061. mod: res.mod
  2062. };
  2063. }
  2064. if ((this.negative & num.negative) !== 0) {
  2065. res = this.neg().divmod(num.neg(), mode);
  2066. if (mode !== 'div') {
  2067. mod = res.mod.neg();
  2068. if (positive && mod.negative !== 0) {
  2069. mod.isub(num);
  2070. }
  2071. }
  2072. return {
  2073. div: res.div,
  2074. mod: mod
  2075. };
  2076. }
  2077. // Both numbers are positive at this point
  2078. // Strip both numbers to approximate shift value
  2079. if (num.length > this.length || this.cmp(num) < 0) {
  2080. return {
  2081. div: new BN(0),
  2082. mod: this
  2083. };
  2084. }
  2085. // Very short reduction
  2086. if (num.length === 1) {
  2087. if (mode === 'div') {
  2088. return {
  2089. div: this.divn(num.words[0]),
  2090. mod: null
  2091. };
  2092. }
  2093. if (mode === 'mod') {
  2094. return {
  2095. div: null,
  2096. mod: new BN(this.modn(num.words[0]))
  2097. };
  2098. }
  2099. return {
  2100. div: this.divn(num.words[0]),
  2101. mod: new BN(this.modn(num.words[0]))
  2102. };
  2103. }
  2104. return this._wordDiv(num, mode);
  2105. };
  2106. // Find `this` / `num`
  2107. BN.prototype.div = function div (num) {
  2108. return this.divmod(num, 'div', false).div;
  2109. };
  2110. // Find `this` % `num`
  2111. BN.prototype.mod = function mod (num) {
  2112. return this.divmod(num, 'mod', false).mod;
  2113. };
  2114. BN.prototype.umod = function umod (num) {
  2115. return this.divmod(num, 'mod', true).mod;
  2116. };
  2117. // Find Round(`this` / `num`)
  2118. BN.prototype.divRound = function divRound (num) {
  2119. var dm = this.divmod(num);
  2120. // Fast case - exact division
  2121. if (dm.mod.isZero()) return dm.div;
  2122. var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
  2123. var half = num.ushrn(1);
  2124. var r2 = num.andln(1);
  2125. var cmp = mod.cmp(half);
  2126. // Round down
  2127. if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;
  2128. // Round up
  2129. return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
  2130. };
  2131. BN.prototype.modn = function modn (num) {
  2132. assert(num <= 0x3ffffff);
  2133. var p = (1 << 26) % num;
  2134. var acc = 0;
  2135. for (var i = this.length - 1; i >= 0; i--) {
  2136. acc = (p * acc + (this.words[i] | 0)) % num;
  2137. }
  2138. return acc;
  2139. };
  2140. // In-place division by number
  2141. BN.prototype.idivn = function idivn (num) {
  2142. assert(num <= 0x3ffffff);
  2143. var carry = 0;
  2144. for (var i = this.length - 1; i >= 0; i--) {
  2145. var w = (this.words[i] | 0) + carry * 0x4000000;
  2146. this.words[i] = (w / num) | 0;
  2147. carry = w % num;
  2148. }
  2149. return this.strip();
  2150. };
  2151. BN.prototype.divn = function divn (num) {
  2152. return this.clone().idivn(num);
  2153. };
  2154. BN.prototype.egcd = function egcd (p) {
  2155. assert(p.negative === 0);
  2156. assert(!p.isZero());
  2157. var x = this;
  2158. var y = p.clone();
  2159. if (x.negative !== 0) {
  2160. x = x.umod(p);
  2161. } else {
  2162. x = x.clone();
  2163. }
  2164. // A * x + B * y = x
  2165. var A = new BN(1);
  2166. var B = new BN(0);
  2167. // C * x + D * y = y
  2168. var C = new BN(0);
  2169. var D = new BN(1);
  2170. var g = 0;
  2171. while (x.isEven() && y.isEven()) {
  2172. x.iushrn(1);
  2173. y.iushrn(1);
  2174. ++g;
  2175. }
  2176. var yp = y.clone();
  2177. var xp = x.clone();
  2178. while (!x.isZero()) {
  2179. for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
  2180. if (i > 0) {
  2181. x.iushrn(i);
  2182. while (i-- > 0) {
  2183. if (A.isOdd() || B.isOdd()) {
  2184. A.iadd(yp);
  2185. B.isub(xp);
  2186. }
  2187. A.iushrn(1);
  2188. B.iushrn(1);
  2189. }
  2190. }
  2191. for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
  2192. if (j > 0) {
  2193. y.iushrn(j);
  2194. while (j-- > 0) {
  2195. if (C.isOdd() || D.isOdd()) {
  2196. C.iadd(yp);
  2197. D.isub(xp);
  2198. }
  2199. C.iushrn(1);
  2200. D.iushrn(1);
  2201. }
  2202. }
  2203. if (x.cmp(y) >= 0) {
  2204. x.isub(y);
  2205. A.isub(C);
  2206. B.isub(D);
  2207. } else {
  2208. y.isub(x);
  2209. C.isub(A);
  2210. D.isub(B);
  2211. }
  2212. }
  2213. return {
  2214. a: C,
  2215. b: D,
  2216. gcd: y.iushln(g)
  2217. };
  2218. };
  2219. // This is reduced incarnation of the binary EEA
  2220. // above, designated to invert members of the
  2221. // _prime_ fields F(p) at a maximal speed
  2222. BN.prototype._invmp = function _invmp (p) {
  2223. assert(p.negative === 0);
  2224. assert(!p.isZero());
  2225. var a = this;
  2226. var b = p.clone();
  2227. if (a.negative !== 0) {
  2228. a = a.umod(p);
  2229. } else {
  2230. a = a.clone();
  2231. }
  2232. var x1 = new BN(1);
  2233. var x2 = new BN(0);
  2234. var delta = b.clone();
  2235. while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
  2236. for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
  2237. if (i > 0) {
  2238. a.iushrn(i);
  2239. while (i-- > 0) {
  2240. if (x1.isOdd()) {
  2241. x1.iadd(delta);
  2242. }
  2243. x1.iushrn(1);
  2244. }
  2245. }
  2246. for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
  2247. if (j > 0) {
  2248. b.iushrn(j);
  2249. while (j-- > 0) {
  2250. if (x2.isOdd()) {
  2251. x2.iadd(delta);
  2252. }
  2253. x2.iushrn(1);
  2254. }
  2255. }
  2256. if (a.cmp(b) >= 0) {
  2257. a.isub(b);
  2258. x1.isub(x2);
  2259. } else {
  2260. b.isub(a);
  2261. x2.isub(x1);
  2262. }
  2263. }
  2264. var res;
  2265. if (a.cmpn(1) === 0) {
  2266. res = x1;
  2267. } else {
  2268. res = x2;
  2269. }
  2270. if (res.cmpn(0) < 0) {
  2271. res.iadd(p);
  2272. }
  2273. return res;
  2274. };
  2275. BN.prototype.gcd = function gcd (num) {
  2276. if (this.isZero()) return num.abs();
  2277. if (num.isZero()) return this.abs();
  2278. var a = this.clone();
  2279. var b = num.clone();
  2280. a.negative = 0;
  2281. b.negative = 0;
  2282. // Remove common factor of two
  2283. for (var shift = 0; a.isEven() && b.isEven(); shift++) {
  2284. a.iushrn(1);
  2285. b.iushrn(1);
  2286. }
  2287. do {
  2288. while (a.isEven()) {
  2289. a.iushrn(1);
  2290. }
  2291. while (b.isEven()) {
  2292. b.iushrn(1);
  2293. }
  2294. var r = a.cmp(b);
  2295. if (r < 0) {
  2296. // Swap `a` and `b` to make `a` always bigger than `b`
  2297. var t = a;
  2298. a = b;
  2299. b = t;
  2300. } else if (r === 0 || b.cmpn(1) === 0) {
  2301. break;
  2302. }
  2303. a.isub(b);
  2304. } while (true);
  2305. return b.iushln(shift);
  2306. };
  2307. // Invert number in the field F(num)
  2308. BN.prototype.invm = function invm (num) {
  2309. return this.egcd(num).a.umod(num);
  2310. };
  2311. BN.prototype.isEven = function isEven () {
  2312. return (this.words[0] & 1) === 0;
  2313. };
  2314. BN.prototype.isOdd = function isOdd () {
  2315. return (this.words[0] & 1) === 1;
  2316. };
  2317. // And first word and num
  2318. BN.prototype.andln = function andln (num) {
  2319. return this.words[0] & num;
  2320. };
  2321. // Increment at the bit position in-line
  2322. BN.prototype.bincn = function bincn (bit) {
  2323. assert(typeof bit === 'number');
  2324. var r = bit % 26;
  2325. var s = (bit - r) / 26;
  2326. var q = 1 << r;
  2327. // Fast case: bit is much higher than all existing words
  2328. if (this.length <= s) {
  2329. this._expand(s + 1);
  2330. this.words[s] |= q;
  2331. return this;
  2332. }
  2333. // Add bit and propagate, if needed
  2334. var carry = q;
  2335. for (var i = s; carry !== 0 && i < this.length; i++) {
  2336. var w = this.words[i] | 0;
  2337. w += carry;
  2338. carry = w >>> 26;
  2339. w &= 0x3ffffff;
  2340. this.words[i] = w;
  2341. }
  2342. if (carry !== 0) {
  2343. this.words[i] = carry;
  2344. this.length++;
  2345. }
  2346. return this;
  2347. };
  2348. BN.prototype.isZero = function isZero () {
  2349. return this.length === 1 && this.words[0] === 0;
  2350. };
  2351. BN.prototype.cmpn = function cmpn (num) {
  2352. var negative = num < 0;
  2353. if (this.negative !== 0 && !negative) return -1;
  2354. if (this.negative === 0 && negative) return 1;
  2355. this.strip();
  2356. var res;
  2357. if (this.length > 1) {
  2358. res = 1;
  2359. } else {
  2360. if (negative) {
  2361. num = -num;
  2362. }
  2363. assert(num <= 0x3ffffff, 'Number is too big');
  2364. var w = this.words[0] | 0;
  2365. res = w === num ? 0 : w < num ? -1 : 1;
  2366. }
  2367. if (this.negative !== 0) return -res | 0;
  2368. return res;
  2369. };
  2370. // Compare two numbers and return:
  2371. // 1 - if `this` > `num`
  2372. // 0 - if `this` == `num`
  2373. // -1 - if `this` < `num`
  2374. BN.prototype.cmp = function cmp (num) {
  2375. if (this.negative !== 0 && num.negative === 0) return -1;
  2376. if (this.negative === 0 && num.negative !== 0) return 1;
  2377. var res = this.ucmp(num);
  2378. if (this.negative !== 0) return -res | 0;
  2379. return res;
  2380. };
  2381. // Unsigned comparison
  2382. BN.prototype.ucmp = function ucmp (num) {
  2383. // At this point both numbers have the same sign
  2384. if (this.length > num.length) return 1;
  2385. if (this.length < num.length) return -1;
  2386. var res = 0;
  2387. for (var i = this.length - 1; i >= 0; i--) {
  2388. var a = this.words[i] | 0;
  2389. var b = num.words[i] | 0;
  2390. if (a === b) continue;
  2391. if (a < b) {
  2392. res = -1;
  2393. } else if (a > b) {
  2394. res = 1;
  2395. }
  2396. break;
  2397. }
  2398. return res;
  2399. };
  2400. BN.prototype.gtn = function gtn (num) {
  2401. return this.cmpn(num) === 1;
  2402. };
  2403. BN.prototype.gt = function gt (num) {
  2404. return this.cmp(num) === 1;
  2405. };
  2406. BN.prototype.gten = function gten (num) {
  2407. return this.cmpn(num) >= 0;
  2408. };
  2409. BN.prototype.gte = function gte (num) {
  2410. return this.cmp(num) >= 0;
  2411. };
  2412. BN.prototype.ltn = function ltn (num) {
  2413. return this.cmpn(num) === -1;
  2414. };
  2415. BN.prototype.lt = function lt (num) {
  2416. return this.cmp(num) === -1;
  2417. };
  2418. BN.prototype.lten = function lten (num) {
  2419. return this.cmpn(num) <= 0;
  2420. };
  2421. BN.prototype.lte = function lte (num) {
  2422. return this.cmp(num) <= 0;
  2423. };
  2424. BN.prototype.eqn = function eqn (num) {
  2425. return this.cmpn(num) === 0;
  2426. };
  2427. BN.prototype.eq = function eq (num) {
  2428. return this.cmp(num) === 0;
  2429. };
  2430. //
  2431. // A reduce context, could be using montgomery or something better, depending
  2432. // on the `m` itself.
  2433. //
  2434. BN.red = function red (num) {
  2435. return new Red(num);
  2436. };
  2437. BN.prototype.toRed = function toRed (ctx) {
  2438. assert(!this.red, 'Already a number in reduction context');
  2439. assert(this.negative === 0, 'red works only with positives');
  2440. return ctx.convertTo(this)._forceRed(ctx);
  2441. };
  2442. BN.prototype.fromRed = function fromRed () {
  2443. assert(this.red, 'fromRed works only with numbers in reduction context');
  2444. return this.red.convertFrom(this);
  2445. };
  2446. BN.prototype._forceRed = function _forceRed (ctx) {
  2447. this.red = ctx;
  2448. return this;
  2449. };
  2450. BN.prototype.forceRed = function forceRed (ctx) {
  2451. assert(!this.red, 'Already a number in reduction context');
  2452. return this._forceRed(ctx);
  2453. };
  2454. BN.prototype.redAdd = function redAdd (num) {
  2455. assert(this.red, 'redAdd works only with red numbers');
  2456. return this.red.add(this, num);
  2457. };
  2458. BN.prototype.redIAdd = function redIAdd (num) {
  2459. assert(this.red, 'redIAdd works only with red numbers');
  2460. return this.red.iadd(this, num);
  2461. };
  2462. BN.prototype.redSub = function redSub (num) {
  2463. assert(this.red, 'redSub works only with red numbers');
  2464. return this.red.sub(this, num);
  2465. };
  2466. BN.prototype.redISub = function redISub (num) {
  2467. assert(this.red, 'redISub works only with red numbers');
  2468. return this.red.isub(this, num);
  2469. };
  2470. BN.prototype.redShl = function redShl (num) {
  2471. assert(this.red, 'redShl works only with red numbers');
  2472. return this.red.shl(this, num);
  2473. };
  2474. BN.prototype.redMul = function redMul (num) {
  2475. assert(this.red, 'redMul works only with red numbers');
  2476. this.red._verify2(this, num);
  2477. return this.red.mul(this, num);
  2478. };
  2479. BN.prototype.redIMul = function redIMul (num) {
  2480. assert(this.red, 'redMul works only with red numbers');
  2481. this.red._verify2(this, num);
  2482. return this.red.imul(this, num);
  2483. };
  2484. BN.prototype.redSqr = function redSqr () {
  2485. assert(this.red, 'redSqr works only with red numbers');
  2486. this.red._verify1(this);
  2487. return this.red.sqr(this);
  2488. };
  2489. BN.prototype.redISqr = function redISqr () {
  2490. assert(this.red, 'redISqr works only with red numbers');
  2491. this.red._verify1(this);
  2492. return this.red.isqr(this);
  2493. };
  2494. // Square root over p
  2495. BN.prototype.redSqrt = function redSqrt () {
  2496. assert(this.red, 'redSqrt works only with red numbers');
  2497. this.red._verify1(this);
  2498. return this.red.sqrt(this);
  2499. };
  2500. BN.prototype.redInvm = function redInvm () {
  2501. assert(this.red, 'redInvm works only with red numbers');
  2502. this.red._verify1(this);
  2503. return this.red.invm(this);
  2504. };
  2505. // Return negative clone of `this` % `red modulo`
  2506. BN.prototype.redNeg = function redNeg () {
  2507. assert(this.red, 'redNeg works only with red numbers');
  2508. this.red._verify1(this);
  2509. return this.red.neg(this);
  2510. };
  2511. BN.prototype.redPow = function redPow (num) {
  2512. assert(this.red && !num.red, 'redPow(normalNum)');
  2513. this.red._verify1(this);
  2514. return this.red.pow(this, num);
  2515. };
  2516. // Prime numbers with efficient reduction
  2517. var primes = {
  2518. k256: null,
  2519. p224: null,
  2520. p192: null,
  2521. p25519: null
  2522. };
  2523. // Pseudo-Mersenne prime
  2524. function MPrime (name, p) {
  2525. // P = 2 ^ N - K
  2526. this.name = name;
  2527. this.p = new BN(p, 16);
  2528. this.n = this.p.bitLength();
  2529. this.k = new BN(1).iushln(this.n).isub(this.p);
  2530. this.tmp = this._tmp();
  2531. }
  2532. MPrime.prototype._tmp = function _tmp () {
  2533. var tmp = new BN(null);
  2534. tmp.words = new Array(Math.ceil(this.n / 13));
  2535. return tmp;
  2536. };
  2537. MPrime.prototype.ireduce = function ireduce (num) {
  2538. // Assumes that `num` is less than `P^2`
  2539. // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
  2540. var r = num;
  2541. var rlen;
  2542. do {
  2543. this.split(r, this.tmp);
  2544. r = this.imulK(r);
  2545. r = r.iadd(this.tmp);
  2546. rlen = r.bitLength();
  2547. } while (rlen > this.n);
  2548. var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
  2549. if (cmp === 0) {
  2550. r.words[0] = 0;
  2551. r.length = 1;
  2552. } else if (cmp > 0) {
  2553. r.isub(this.p);
  2554. } else {
  2555. if (r.strip !== undefined) {
  2556. // r is BN v4 instance
  2557. r.strip();
  2558. } else {
  2559. // r is BN v5 instance
  2560. r._strip();
  2561. }
  2562. }
  2563. return r;
  2564. };
  2565. MPrime.prototype.split = function split (input, out) {
  2566. input.iushrn(this.n, 0, out);
  2567. };
  2568. MPrime.prototype.imulK = function imulK (num) {
  2569. return num.imul(this.k);
  2570. };
  2571. function K256 () {
  2572. MPrime.call(
  2573. this,
  2574. 'k256',
  2575. 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
  2576. }
  2577. inherits(K256, MPrime);
  2578. K256.prototype.split = function split (input, output) {
  2579. // 256 = 9 * 26 + 22
  2580. var mask = 0x3fffff;
  2581. var outLen = Math.min(input.length, 9);
  2582. for (var i = 0; i < outLen; i++) {
  2583. output.words[i] = input.words[i];
  2584. }
  2585. output.length = outLen;
  2586. if (input.length <= 9) {
  2587. input.words[0] = 0;
  2588. input.length = 1;
  2589. return;
  2590. }
  2591. // Shift by 9 limbs
  2592. var prev = input.words[9];
  2593. output.words[output.length++] = prev & mask;
  2594. for (i = 10; i < input.length; i++) {
  2595. var next = input.words[i] | 0;
  2596. input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
  2597. prev = next;
  2598. }
  2599. prev >>>= 22;
  2600. input.words[i - 10] = prev;
  2601. if (prev === 0 && input.length > 10) {
  2602. input.length -= 10;
  2603. } else {
  2604. input.length -= 9;
  2605. }
  2606. };
  2607. K256.prototype.imulK = function imulK (num) {
  2608. // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
  2609. num.words[num.length] = 0;
  2610. num.words[num.length + 1] = 0;
  2611. num.length += 2;
  2612. // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
  2613. var lo = 0;
  2614. for (var i = 0; i < num.length; i++) {
  2615. var w = num.words[i] | 0;
  2616. lo += w * 0x3d1;
  2617. num.words[i] = lo & 0x3ffffff;
  2618. lo = w * 0x40 + ((lo / 0x4000000) | 0);
  2619. }
  2620. // Fast length reduction
  2621. if (num.words[num.length - 1] === 0) {
  2622. num.length--;
  2623. if (num.words[num.length - 1] === 0) {
  2624. num.length--;
  2625. }
  2626. }
  2627. return num;
  2628. };
  2629. function P224 () {
  2630. MPrime.call(
  2631. this,
  2632. 'p224',
  2633. 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
  2634. }
  2635. inherits(P224, MPrime);
  2636. function P192 () {
  2637. MPrime.call(
  2638. this,
  2639. 'p192',
  2640. 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
  2641. }
  2642. inherits(P192, MPrime);
  2643. function P25519 () {
  2644. // 2 ^ 255 - 19
  2645. MPrime.call(
  2646. this,
  2647. '25519',
  2648. '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
  2649. }
  2650. inherits(P25519, MPrime);
  2651. P25519.prototype.imulK = function imulK (num) {
  2652. // K = 0x13
  2653. var carry = 0;
  2654. for (var i = 0; i < num.length; i++) {
  2655. var hi = (num.words[i] | 0) * 0x13 + carry;
  2656. var lo = hi & 0x3ffffff;
  2657. hi >>>= 26;
  2658. num.words[i] = lo;
  2659. carry = hi;
  2660. }
  2661. if (carry !== 0) {
  2662. num.words[num.length++] = carry;
  2663. }
  2664. return num;
  2665. };
  2666. // Exported mostly for testing purposes, use plain name instead
  2667. BN._prime = function prime (name) {
  2668. // Cached version of prime
  2669. if (primes[name]) return primes[name];
  2670. var prime;
  2671. if (name === 'k256') {
  2672. prime = new K256();
  2673. } else if (name === 'p224') {
  2674. prime = new P224();
  2675. } else if (name === 'p192') {
  2676. prime = new P192();
  2677. } else if (name === 'p25519') {
  2678. prime = new P25519();
  2679. } else {
  2680. throw new Error('Unknown prime ' + name);
  2681. }
  2682. primes[name] = prime;
  2683. return prime;
  2684. };
  2685. //
  2686. // Base reduction engine
  2687. //
  2688. function Red (m) {
  2689. if (typeof m === 'string') {
  2690. var prime = BN._prime(m);
  2691. this.m = prime.p;
  2692. this.prime = prime;
  2693. } else {
  2694. assert(m.gtn(1), 'modulus must be greater than 1');
  2695. this.m = m;
  2696. this.prime = null;
  2697. }
  2698. }
  2699. Red.prototype._verify1 = function _verify1 (a) {
  2700. assert(a.negative === 0, 'red works only with positives');
  2701. assert(a.red, 'red works only with red numbers');
  2702. };
  2703. Red.prototype._verify2 = function _verify2 (a, b) {
  2704. assert((a.negative | b.negative) === 0, 'red works only with positives');
  2705. assert(a.red && a.red === b.red,
  2706. 'red works only with red numbers');
  2707. };
  2708. Red.prototype.imod = function imod (a) {
  2709. if (this.prime) return this.prime.ireduce(a)._forceRed(this);
  2710. return a.umod(this.m)._forceRed(this);
  2711. };
  2712. Red.prototype.neg = function neg (a) {
  2713. if (a.isZero()) {
  2714. return a.clone();
  2715. }
  2716. return this.m.sub(a)._forceRed(this);
  2717. };
  2718. Red.prototype.add = function add (a, b) {
  2719. this._verify2(a, b);
  2720. var res = a.add(b);
  2721. if (res.cmp(this.m) >= 0) {
  2722. res.isub(this.m);
  2723. }
  2724. return res._forceRed(this);
  2725. };
  2726. Red.prototype.iadd = function iadd (a, b) {
  2727. this._verify2(a, b);
  2728. var res = a.iadd(b);
  2729. if (res.cmp(this.m) >= 0) {
  2730. res.isub(this.m);
  2731. }
  2732. return res;
  2733. };
  2734. Red.prototype.sub = function sub (a, b) {
  2735. this._verify2(a, b);
  2736. var res = a.sub(b);
  2737. if (res.cmpn(0) < 0) {
  2738. res.iadd(this.m);
  2739. }
  2740. return res._forceRed(this);
  2741. };
  2742. Red.prototype.isub = function isub (a, b) {
  2743. this._verify2(a, b);
  2744. var res = a.isub(b);
  2745. if (res.cmpn(0) < 0) {
  2746. res.iadd(this.m);
  2747. }
  2748. return res;
  2749. };
  2750. Red.prototype.shl = function shl (a, num) {
  2751. this._verify1(a);
  2752. return this.imod(a.ushln(num));
  2753. };
  2754. Red.prototype.imul = function imul (a, b) {
  2755. this._verify2(a, b);
  2756. return this.imod(a.imul(b));
  2757. };
  2758. Red.prototype.mul = function mul (a, b) {
  2759. this._verify2(a, b);
  2760. return this.imod(a.mul(b));
  2761. };
  2762. Red.prototype.isqr = function isqr (a) {
  2763. return this.imul(a, a.clone());
  2764. };
  2765. Red.prototype.sqr = function sqr (a) {
  2766. return this.mul(a, a);
  2767. };
  2768. Red.prototype.sqrt = function sqrt (a) {
  2769. if (a.isZero()) return a.clone();
  2770. var mod3 = this.m.andln(3);
  2771. assert(mod3 % 2 === 1);
  2772. // Fast case
  2773. if (mod3 === 3) {
  2774. var pow = this.m.add(new BN(1)).iushrn(2);
  2775. return this.pow(a, pow);
  2776. }
  2777. // Tonelli-Shanks algorithm (Totally unoptimized and slow)
  2778. //
  2779. // Find Q and S, that Q * 2 ^ S = (P - 1)
  2780. var q = this.m.subn(1);
  2781. var s = 0;
  2782. while (!q.isZero() && q.andln(1) === 0) {
  2783. s++;
  2784. q.iushrn(1);
  2785. }
  2786. assert(!q.isZero());
  2787. var one = new BN(1).toRed(this);
  2788. var nOne = one.redNeg();
  2789. // Find quadratic non-residue
  2790. // NOTE: Max is such because of generalized Riemann hypothesis.
  2791. var lpow = this.m.subn(1).iushrn(1);
  2792. var z = this.m.bitLength();
  2793. z = new BN(2 * z * z).toRed(this);
  2794. while (this.pow(z, lpow).cmp(nOne) !== 0) {
  2795. z.redIAdd(nOne);
  2796. }
  2797. var c = this.pow(z, q);
  2798. var r = this.pow(a, q.addn(1).iushrn(1));
  2799. var t = this.pow(a, q);
  2800. var m = s;
  2801. while (t.cmp(one) !== 0) {
  2802. var tmp = t;
  2803. for (var i = 0; tmp.cmp(one) !== 0; i++) {
  2804. tmp = tmp.redSqr();
  2805. }
  2806. assert(i < m);
  2807. var b = this.pow(c, new BN(1).iushln(m - i - 1));
  2808. r = r.redMul(b);
  2809. c = b.redSqr();
  2810. t = t.redMul(c);
  2811. m = i;
  2812. }
  2813. return r;
  2814. };
  2815. Red.prototype.invm = function invm (a) {
  2816. var inv = a._invmp(this.m);
  2817. if (inv.negative !== 0) {
  2818. inv.negative = 0;
  2819. return this.imod(inv).redNeg();
  2820. } else {
  2821. return this.imod(inv);
  2822. }
  2823. };
  2824. Red.prototype.pow = function pow (a, num) {
  2825. if (num.isZero()) return new BN(1).toRed(this);
  2826. if (num.cmpn(1) === 0) return a.clone();
  2827. var windowSize = 4;
  2828. var wnd = new Array(1 << windowSize);
  2829. wnd[0] = new BN(1).toRed(this);
  2830. wnd[1] = a;
  2831. for (var i = 2; i < wnd.length; i++) {
  2832. wnd[i] = this.mul(wnd[i - 1], a);
  2833. }
  2834. var res = wnd[0];
  2835. var current = 0;
  2836. var currentLen = 0;
  2837. var start = num.bitLength() % 26;
  2838. if (start === 0) {
  2839. start = 26;
  2840. }
  2841. for (i = num.length - 1; i >= 0; i--) {
  2842. var word = num.words[i];
  2843. for (var j = start - 1; j >= 0; j--) {
  2844. var bit = (word >> j) & 1;
  2845. if (res !== wnd[0]) {
  2846. res = this.sqr(res);
  2847. }
  2848. if (bit === 0 && current === 0) {
  2849. currentLen = 0;
  2850. continue;
  2851. }
  2852. current <<= 1;
  2853. current |= bit;
  2854. currentLen++;
  2855. if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
  2856. res = this.mul(res, wnd[current]);
  2857. currentLen = 0;
  2858. current = 0;
  2859. }
  2860. start = 26;
  2861. }
  2862. return res;
  2863. };
  2864. Red.prototype.convertTo = function convertTo (num) {
  2865. var r = num.umod(this.m);
  2866. return r === num ? r.clone() : r;
  2867. };
  2868. Red.prototype.convertFrom = function convertFrom (num) {
  2869. var res = num.clone();
  2870. res.red = null;
  2871. return res;
  2872. };
  2873. //
  2874. // Montgomery method engine
  2875. //
  2876. BN.mont = function mont (num) {
  2877. return new Mont(num);
  2878. };
  2879. function Mont (m) {
  2880. Red.call(this, m);
  2881. this.shift = this.m.bitLength();
  2882. if (this.shift % 26 !== 0) {
  2883. this.shift += 26 - (this.shift % 26);
  2884. }
  2885. this.r = new BN(1).iushln(this.shift);
  2886. this.r2 = this.imod(this.r.sqr());
  2887. this.rinv = this.r._invmp(this.m);
  2888. this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
  2889. this.minv = this.minv.umod(this.r);
  2890. this.minv = this.r.sub(this.minv);
  2891. }
  2892. inherits(Mont, Red);
  2893. Mont.prototype.convertTo = function convertTo (num) {
  2894. return this.imod(num.ushln(this.shift));
  2895. };
  2896. Mont.prototype.convertFrom = function convertFrom (num) {
  2897. var r = this.imod(num.mul(this.rinv));
  2898. r.red = null;
  2899. return r;
  2900. };
  2901. Mont.prototype.imul = function imul (a, b) {
  2902. if (a.isZero() || b.isZero()) {
  2903. a.words[0] = 0;
  2904. a.length = 1;
  2905. return a;
  2906. }
  2907. var t = a.imul(b);
  2908. var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
  2909. var u = t.isub(c).iushrn(this.shift);
  2910. var res = u;
  2911. if (u.cmp(this.m) >= 0) {
  2912. res = u.isub(this.m);
  2913. } else if (u.cmpn(0) < 0) {
  2914. res = u.iadd(this.m);
  2915. }
  2916. return res._forceRed(this);
  2917. };
  2918. Mont.prototype.mul = function mul (a, b) {
  2919. if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
  2920. var t = a.mul(b);
  2921. var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
  2922. var u = t.isub(c).iushrn(this.shift);
  2923. var res = u;
  2924. if (u.cmp(this.m) >= 0) {
  2925. res = u.isub(this.m);
  2926. } else if (u.cmpn(0) < 0) {
  2927. res = u.iadd(this.m);
  2928. }
  2929. return res._forceRed(this);
  2930. };
  2931. Mont.prototype.invm = function invm (a) {
  2932. // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
  2933. var res = this.imod(a._invmp(this.m).mul(this.r2));
  2934. return res._forceRed(this);
  2935. };
  2936. })(typeof module === 'undefined' || module, this);