15a2323b3c0a49e7dd9f86f3747ebdcf12e74447eb1e100aab456f512ff885ad6f8cf32d30e1a1e8c4aec3050afae73611996f74d78d9427c51dbf6910e7e8 86 KB

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