bn.js 88 KB

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