bn.js 85 KB

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