diff --git a/banani-browser.js b/banani-browser.js index 832117b..b359c35 100644 --- a/banani-browser.js +++ b/banani-browser.js @@ -1,6 +1,7 @@ -(()=>{var lr=Object.create;var Le=Object.defineProperty;var yr=Object.getOwnPropertyDescriptor;var Er=Object.getOwnPropertyNames;var wr=Object.getPrototypeOf,Br=Object.prototype.hasOwnProperty;var c=(e,n)=>Le(e,"name",{value:n,configurable:!0}),nn=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var M=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),Me=(e,n)=>{for(var t in n)Le(e,t,{get:n[t],enumerable:!0})},xr=(e,n,t,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let g of Er(n))!Br.call(e,g)&&g!==t&&Le(e,g,{get:()=>n[g],enumerable:!(i=yr(n,g))||i.enumerable});return e};var rn=(e,n,t)=>(t=e!=null?lr(wr(e)):{},xr(n||!e||!e.__esModule?Le(t,"default",{value:e,enumerable:!0}):t,e));var yt=M((Ui,on)=>{on.exports=An;var Ve=class extends Error{static{c(this,"AssertionError")}};Ve.prototype.name="AssertionError";function An(e,n){if(!e){var t=new Ve(n);throw Error.captureStackTrace&&Error.captureStackTrace(t,An),t}}c(An,"assert")});var cn=M((vi,an)=>{function In(e){return e.length}c(In,"byteLength");function Qr(e){let n=e.byteLength,t="";for(let i=0;i{var ce="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Z=new Uint8Array(256);for(let e=0;e1&&e.charCodeAt(n-1)===61&&n--,n*3>>>2}c(gn,"byteLength");function br(e){let n=e.byteLength,t="";for(let i=0;i>2]+ce[(e[i]&3)<<4|e[i+1]>>4]+ce[(e[i+1]&15)<<2|e[i+2]>>6]+ce[e[i+2]&63];return n%3===2?t=t.substring(0,t.length-1)+"=":n%3===1&&(t=t.substring(0,t.length-2)+"=="),t}c(br,"toString");function _r(e,n,t=0,i=gn(n)){let g=Math.min(i,e.byteLength-t);for(let f=0,y=0;y>4,e[y++]=(x&15)<<4|b>>2,e[y++]=(b&3)<<6|_&63}return g}c(_r,"write");sn.exports={byteLength:gn,toString:br,write:_r}});var ln=M((ki,un)=>{function Cn(e){return e.length>>>1}c(Cn,"byteLength");function pr(e){let n=e.byteLength;e=new DataView(e.buffer,e.byteOffset,n);let t="",i=0;for(let g=n-n%4;i=48&&e<=57)return e-48;if(e>=65&&e<=70)return e-65+10;if(e>=97&&e<=102)return e-97+10}c(fn,"hexValue")});var En=M((Ri,yn)=>{function Et(e){let n=0;for(let t=0,i=e.length;t=55296&&g<=56319&&t+1=56320&&f<=57343){n+=4,t++;continue}}g<=127?n+=1:g<=2047?n+=2:n+=3}return n}c(Et,"byteLength");var wt;if(typeof TextDecoder<"u"){let e=new TextDecoder;wt=c(function(t){return e.decode(t)},"toString")}else wt=c(function(n){let t=n.byteLength,i="",g=0;for(;g0){let x=0;for(;x>b,b-=6;b>=0;)n[w++]=128|x>>b&63,b-=6;y+=x>=65536?2:1}return f},"write");yn.exports={byteLength:Et,toString:wt,write:Bt}});var xn=M((Li,Bn)=>{function wn(e){return e.length*2}c(wn,"byteLength");function Dr(e){let n=e.byteLength,t="";for(let i=0;i>8,b=w%256;e[t+y*2]=b,e[t+y*2+1]=x}return g}c(Ur,"write");Bn.exports={byteLength:wn,toString:Dr,write:Ur}});var pn=M((Qt,_n)=>{var mr=cn(),vr=hn(),Fr=ln(),Pr=En(),Kr=xn(),Ge=new Uint8Array(Uint16Array.of(255).buffer)[0]===255;function xe(e){switch(e){case"ascii":return mr;case"base64":return vr;case"hex":return Fr;case"utf8":case"utf-8":case void 0:return Pr;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Kr;default:throw new Error(`Unknown encoding: ${e}`)}}c(xe,"codecFor");function Qn(e){return e instanceof Uint8Array}c(Qn,"isBuffer");function kr(e){try{return xe(e),!0}catch{return!1}}c(kr,"isEncoding");function Yr(e,n,t){let i=new Uint8Array(e);return n!==void 0&&Qt.fill(i,n,0,i.byteLength,t),i}c(Yr,"alloc");function Rr(e){return new Uint8Array(e)}c(Rr,"allocUnsafe");function Hr(e){return new Uint8Array(e)}c(Hr,"allocUnsafeSlow");function Lr(e,n){return xe(n).byteLength(e)}c(Lr,"byteLength");function Mr(e,n){if(e===n)return 0;let t=Math.min(e.byteLength,n.byteLength);e=new DataView(e.buffer,e.byteOffset,e.byteLength),n=new DataView(n.buffer,n.byteOffset,n.byteLength);let i=0;for(let g=t-t%4;if)return 1}return e.byteLength>n.byteLength?1:e.byteLengthg+f.byteLength,0));let t=new Uint8Array(n),i=0;for(let g of e){if(i+g.byteLength>t.byteLength){let f=g.subarray(0,t.byteLength-i);return t.set(f,i),t}t.set(g,i),i+=g.byteLength}return t}c(Vr,"concat");function Gr(e,n,t=0,i=0,g=e.byteLength){if(g>0&&g=e.byteLength)throw new RangeError("sourceStart is out of range");if(g<0)throw new RangeError("sourceEnd is out of range");t>=n.byteLength&&(t=n.byteLength),g>e.byteLength&&(g=e.byteLength),n.byteLength-t=e.byteLength){if(g)return-1;t=e.byteLength-1}else if(t<0)if(g)t=0;else return-1;if(typeof n=="string")n=xt(n,i);else if(typeof n=="number")return n=n&255,g?e.indexOf(n,t):e.lastIndexOf(n,t);if(n.byteLength===0)return-1;if(g){let f=-1;for(let y=t;ye.byteLength&&(t=e.byteLength-n.byteLength);for(let f=t;f>=0;f--){let y=!0;for(let w=0;w=g||i<=t?"":(t<0&&(t=0),i>g&&(i=g),(t!==0||i{var si=c((e,n)=>c(function(){return n||(0,e[Object.keys(e)[0]])((n={exports:{}}).exports,n),n.exports},"__require"),"__commonJS"),hi=(()=>{for(var e=new Uint8Array(128),n=0;n<64;n++)e[n<26?n+65:n<52?n+71:n<62?n-4:n*4-205]=n;return t=>{for(var i=t.length,g=new Uint8Array((i-(t[i-1]=="=")-(t[i-2]=="="))*3/4|0),f=0,y=0;f>4,g[y++]=x<<4|b>>2,g[y++]=b<<6|_}return g}})(),fi=si({"wasm-binary:./blake2b.wat"(e,n){n.exports=hi("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")}}),Ci=fi(),ui=WebAssembly.compile(Ci);Sn.exports=async e=>(await WebAssembly.instantiate(await ui,e)).exports});var Yn=M((Ji,G)=>{var K=yt(),li=pn(),J=null,Un=typeof WebAssembly<"u"&&Dn()().then(e=>{J=e}),O=64,Ne=[];G.exports=v;var mn=G.exports.BYTES_MIN=16,vn=G.exports.BYTES_MAX=64,Ti=G.exports.BYTES=32,Fn=G.exports.KEYBYTES_MIN=16,Pn=G.exports.KEYBYTES_MAX=64,Oi=G.exports.KEYBYTES=32,Kn=G.exports.SALTBYTES=16,kn=G.exports.PERSONALBYTES=16;function v(e,n,t,i,g){if(!(this instanceof v))return new v(e,n,t,i,g);if(!J)throw new Error("WASM not loaded. Wait for Blake2b.ready(cb)");e||(e=32),g!==!0&&(K(e>=mn,"digestLength must be at least "+mn+", was given "+e),K(e<=vn,"digestLength must be at most "+vn+", was given "+e),n!=null&&(K(n instanceof Uint8Array,"key must be Uint8Array or Buffer"),K(n.length>=Fn,"key must be at least "+Fn+", was given "+n.length),K(n.length<=Pn,"key must be at least "+Pn+", was given "+n.length)),t!=null&&(K(t instanceof Uint8Array,"salt must be Uint8Array or Buffer"),K(t.length===Kn,"salt must be exactly "+Kn+", was given "+t.length)),i!=null&&(K(i instanceof Uint8Array,"personal must be Uint8Array or Buffer"),K(i.length===kn,"personal must be exactly "+kn+", was given "+i.length))),Ne.length||(Ne.push(O),O+=216),this.digestLength=e,this.finalized=!1,this.pointer=Ne.pop(),this._memory=new Uint8Array(J.memory.buffer),this._memory.fill(0,0,64),this._memory[0]=this.digestLength,this._memory[1]=n?n.length:0,this._memory[2]=1,this._memory[3]=1,t&&this._memory.set(t,32),i&&this._memory.set(i,48),this.pointer+216>this._memory.length&&this._realloc(this.pointer+216),J.blake2b_init(this.pointer,this.digestLength),n&&(this.update(n),this._memory.fill(0,O,O+n.length),this._memory[this.pointer+200]=128)}c(v,"Blake2b");v.prototype._realloc=function(e){J.memory.grow(Math.max(0,Math.ceil(Math.abs(e-this._memory.length)/65536))),this._memory=new Uint8Array(J.memory.buffer)};v.prototype.update=function(e){return K(this.finalized===!1,"Hash instance finalized"),K(e instanceof Uint8Array,"input must be Uint8Array or Buffer"),O+e.length>this._memory.length&&this._realloc(O+e.length),this._memory.set(e,O),J.blake2b_update(this.pointer,O,O+e.length),this};v.prototype.digest=function(e){if(K(this.finalized===!1,"Hash instance finalized"),this.finalized=!0,Ne.push(this.pointer),J.blake2b_final(this.pointer),!e||e==="binary")return this._memory.slice(this.pointer+128,this.pointer+128+this.digestLength);if(typeof e=="string")return li.toString(this._memory,e,this.pointer+128,this.pointer+128+this.digestLength);K(e instanceof Uint8Array&&e.length>=this.digestLength,"input must be Uint8Array or Buffer");for(var n=0;ne(),e):e(new Error("WebAssembly not supported"))};v.prototype.ready=v.ready;v.prototype.getPartialHash=function(){return this._memory.slice(this.pointer,this.pointer+216)};v.prototype.setPartialHash=function(e){this._memory.set(e,this.pointer)};function yi(){}c(yi,"noop")});var dt=M((Wi,F)=>{var Y=yt(),de=Yn();function Te(e,n,t){var i=e[n]+e[t],g=e[n+1]+e[t+1];i>=4294967296&&g++,e[n]=i,e[n+1]=g}c(Te,"ADD64AA");function Rn(e,n,t,i){var g=e[n]+t;t<0&&(g+=4294967296);var f=e[n+1]+i;g>=4294967296&&f++,e[n]=g,e[n+1]=f}c(Rn,"ADD64AC");function Tn(e,n){return e[n]^e[n+1]<<8^e[n+2]<<16^e[n+3]<<24}c(Tn,"B2B_GET32");function q(e,n,t,i,g,f){var y=Qe[g],w=Qe[g+1],x=Qe[f],b=Qe[f+1];Te(B,e,n),Rn(B,e,y,w);var _=B[i]^B[e],S=B[i+1]^B[e+1];B[i]=S,B[i+1]=_,Te(B,t,i),_=B[n]^B[t],S=B[n+1]^B[t+1],B[n]=_>>>24^S<<8,B[n+1]=S>>>24^_<<8,Te(B,e,n),Rn(B,e,x,b),_=B[i]^B[e],S=B[i+1]^B[e+1],B[i]=_>>>16^S<<16,B[i+1]=S>>>16^_<<16,Te(B,t,i),_=B[n]^B[t],S=B[n+1]^B[t+1],B[n]=S>>>31^_<<1,B[n+1]=_>>>31^S<<1}c(q,"B2B_G");var On=new Uint32Array([4089235720,1779033703,2227873595,3144134277,4271175723,1013904242,1595750129,2773480762,2917565137,1359893119,725511199,2600822924,4215389547,528734635,327033209,1541459225]),Ei=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3,11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4,7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8,9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13,2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9,12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11,13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10,6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5,10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3],U=new Uint8Array(Ei.map(function(e){return e*2})),B=new Uint32Array(32),Qe=new Uint32Array(32);function Jn(e,n){var t=0;for(t=0;t<16;t++)B[t]=e.h[t],B[t+16]=On[t];for(B[24]=B[24]^e.t,B[25]=B[25]^e.t/4294967296,n&&(B[28]=~B[28],B[29]=~B[29]),t=0;t<32;t++)Qe[t]=Tn(e.b,4*t);for(t=0;t<12;t++)q(0,8,16,24,U[t*16+0],U[t*16+1]),q(2,10,18,26,U[t*16+2],U[t*16+3]),q(4,12,20,28,U[t*16+4],U[t*16+5]),q(6,14,22,30,U[t*16+6],U[t*16+7]),q(0,10,20,30,U[t*16+8],U[t*16+9]),q(2,12,22,24,U[t*16+10],U[t*16+11]),q(4,14,16,26,U[t*16+12],U[t*16+13]),q(6,8,18,28,U[t*16+14],U[t*16+15]);for(t=0;t<16;t++)e.h[t]=e.h[t]^B[t]^B[t+16]}c(Jn,"blake2bCompress");var W=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);function ge(e,n,t,i){W.fill(0),this.b=new Uint8Array(128),this.h=new Uint32Array(16),this.t=0,this.c=0,this.outlen=e,W[0]=e,n&&(W[1]=n.length),W[2]=1,W[3]=1,t&&W.set(t,32),i&&W.set(i,48);for(var g=0;g<16;g++)this.h[g]=On[g]^Tn(W,g*4);n&&(jn(this,n),this.c=128)}c(ge,"Blake2b");ge.prototype.update=function(e){return Y(e instanceof Uint8Array,"input must be Uint8Array or Buffer"),jn(this,e),this};ge.prototype.digest=function(e){var n=!e||e==="binary"||e==="hex"?new Uint8Array(this.outlen):e;return Y(n instanceof Uint8Array,'out must be "binary", "hex", Uint8Array, or Buffer'),Y(n.length>=this.outlen,"out must have at least outlen bytes of space"),wi(this,n),e==="hex"?Bi(n):n};ge.prototype.final=ge.prototype.digest;ge.ready=function(e){de.ready(function(){e()})};function jn(e,n){for(var t=0;t>2]>>8*(t&3);return n}c(wi,"blake2bFinal");function Bi(e){for(var n="",t=0;t=Hn,"outlen must be at least "+Hn+", was given "+n),Y(n<=Ln,"outlen must be at most "+Ln+", was given "+n),t!=null&&(Y(t instanceof Uint8Array,"key must be Uint8Array or Buffer"),Y(t.length>=Mn,"key must be at least "+Mn+", was given "+t.length),Y(t.length<=Vn,"key must be at most "+Vn+", was given "+t.length)),i!=null&&(Y(i instanceof Uint8Array,"salt must be Uint8Array or Buffer"),Y(i.length===Gn,"salt must be exactly "+Gn+", was given "+i.length)),g!=null&&(Y(g instanceof Uint8Array,"personal must be Uint8Array or Buffer"),Y(g.length===Nn,"personal must be exactly "+Nn+", was given "+g.length))),new Qi(n,t,i,g)},"createHash");F.exports.ready=function(e){de.ready(function(){e()})};F.exports.WASM_SUPPORTED=de.SUPPORTED;F.exports.WASM_LOADED=!1;var Hn=F.exports.BYTES_MIN=16,Ln=F.exports.BYTES_MAX=64,Xi=F.exports.BYTES=32,Mn=F.exports.KEYBYTES_MIN=16,Vn=F.exports.KEYBYTES_MAX=64,qi=F.exports.KEYBYTES=32,Gn=F.exports.SALTBYTES=16,Nn=F.exports.PERSONALBYTES=16;de.ready(function(e){e||(F.exports.WASM_LOADED=!0,F.exports=de)})});var Xn=M((Zi,Oe)=>{(function(e){"use strict";let n=dt();var t=c(function(r,o){this.hi=r|0,this.lo=o|0},"u64"),i=c(function(r){var o,A=new Float64Array(16);if(r)for(o=0;o>>32-o}c(X,"L32");function re(r,o){var A=r[o+3]&255;return A=A<<8|r[o+2]&255,A=A<<8|r[o+1]&255,A<<8|r[o+0]&255}c(re,"ld32");function Kt(r,o){var A=r[o]<<24|r[o+1]<<16|r[o+2]<<8|r[o+3],I=r[o+4]<<24|r[o+5]<<16|r[o+6]<<8|r[o+7];return new t(A,I)}c(Kt,"dl64");function ze(r,o,A){var I;for(I=0;I<4;I++)r[o+I]=A&255,A>>>=8}c(ze,"st32");function kt(r,o,A){r[o]=A.hi>>24&255,r[o+1]=A.hi>>16&255,r[o+2]=A.hi>>8&255,r[o+3]=A.hi&255,r[o+4]=A.lo>>24&255,r[o+5]=A.lo>>16&255,r[o+6]=A.lo>>8&255,r[o+7]=A.lo&255}c(kt,"ts64");function Ze(r,o,A,I,a){var s,u=0;for(s=0;s>>8)-1}c(Ze,"vn");function Yt(r,o,A,I){return Ze(r,o,A,I,16)}c(Yt,"crypto_verify_16");function $e(r,o,A,I){return Ze(r,o,A,I,32)}c($e,"crypto_verify_32");function Rt(r,o,A,I,a){var s=new Uint32Array(16),u=new Uint32Array(16),l=new Uint32Array(16),h=new Uint32Array(4),C,E,d;for(C=0;C<4;C++)u[5*C]=re(I,4*C),u[1+C]=re(A,4*C),u[6+C]=re(o,4*C),u[11+C]=re(A,16+4*C);for(C=0;C<16;C++)l[C]=u[C];for(C=0;C<20;C++){for(E=0;E<4;E++){for(d=0;d<4;d++)h[d]=u[(5*E+4*d)%16];for(h[1]^=X(h[0]+h[3]|0,7),h[2]^=X(h[1]+h[0]|0,9),h[3]^=X(h[2]+h[1]|0,13),h[0]^=X(h[3]+h[2]|0,18),d=0;d<4;d++)s[4*E+(E+d)%4]=h[d]}for(d=0;d<16;d++)u[d]=s[d]}if(a){for(C=0;C<16;C++)u[C]=u[C]+l[C]|0;for(C=0;C<4;C++)u[5*C]=u[5*C]-re(I,4*C)|0,u[6+C]=u[6+C]-re(o,4*C)|0;for(C=0;C<4;C++)ze(r,4*C,u[5*C]),ze(r,16+4*C,u[6+C])}else for(C=0;C<16;C++)ze(r,4*C,u[C]+l[C]|0)}c(Rt,"core");function Ht(r,o,A,I){return Rt(r,o,A,I,!1),0}c(Ht,"crypto_core_salsa20");function Ue(r,o,A,I){return Rt(r,o,A,I,!0),0}c(Ue,"crypto_core_hsalsa20");var he=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]);function et(r,o,A,I,a,s,u){var l=new Uint8Array(16),h=new Uint8Array(64),C,E;if(!a)return 0;for(E=0;E<16;E++)l[E]=0;for(E=0;E<8;E++)l[E]=s[E];for(;a>=64;){for(Ht(h,l,u,he),E=0;E<64;E++)r[o+E]=(A?A[I+E]:0)^h[E];for(C=1,E=8;E<16;E++)C=C+(l[E]&255)|0,l[E]=C&255,C>>>=8;a-=64,o+=64,A&&(I+=64)}if(a>0)for(Ht(h,l,u,he),E=0;E>>=8}c(nt,"add1305");var er=new Uint32Array([5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252]);function rt(r,o,A,I,a,s){var u,l,h,C,E=new Uint32Array(17),d=new Uint32Array(17),p=new Uint32Array(17),L=new Uint32Array(17),ae=new Uint32Array(17);for(h=0;h<17;h++)d[h]=p[h]=0;for(h=0;h<16;h++)d[h]=s[h];for(d[3]&=15,d[4]&=252,d[7]&=15,d[8]&=252,d[11]&=15,d[12]&=252,d[15]&=15;a>0;){for(h=0;h<17;h++)L[h]=0;for(h=0;h<16&&h>>=8;for(C=C+p[16]|0,p[16]=C&3,C=5*(C>>>2)|0,h=0;h<16;h++)C=C+p[h]|0,p[h]=C&255,C>>>=8;C=C+p[16]|0,p[16]=C}for(h=0;h<17;h++)ae[h]=p[h];for(nt(p,er),u=-(p[16]>>>7)|0,h=0;h<17;h++)p[h]^=u&(ae[h]^p[h]);for(h=0;h<16;h++)L[h]=s[h+16];for(L[16]=0,nt(p,L),h=0;h<16;h++)r[o+h]=p[h];return 0}c(rt,"crypto_onetimeauth");function Vt(r,o,A,I,a,s){var u=new Uint8Array(16);return rt(u,0,A,I,a,s),Yt(r,o,u,0)}c(Vt,"crypto_onetimeauth_verify");function it(r,o,A,I,a){var s;if(A<32)return-1;for(tt(r,0,o,0,A,I,a),rt(r,16,r,32,A-32,r),s=0;s<16;s++)r[s]=0;return 0}c(it,"crypto_secretbox");function At(r,o,A,I,a){var s,u=new Uint8Array(32);if(A<32||(Mt(u,0,32,I,a),Vt(o,16,o,32,A-32,u)!==0))return-1;for(tt(r,0,o,0,A,I,a),s=0;s<32;s++)r[s]=0;return 0}c(At,"crypto_secretbox_open");function N(r,o){var A;for(A=0;A<16;A++)r[A]=o[A]|0}c(N,"set25519");function fe(r){var o,A;for(A=0;A<16;A++)r[A]+=65536,o=Math.floor(r[A]/65536),r[(A+1)*(A<15?1:0)]+=o-1+37*(o-1)*(A===15?1:0),r[A]-=o*65536}c(fe,"car25519");function ie(r,o,A){for(var I,a=~(A-1),s=0;s<16;s++)I=a&(r[s]^o[s]),r[s]^=I,o[s]^=I}c(ie,"sel25519");function Ae(r,o){var A,I,a,s=i(),u=i();for(A=0;A<16;A++)u[A]=o[A];for(fe(u),fe(u),fe(u),I=0;I<2;I++){for(s[0]=u[0]-65517,A=1;A<15;A++)s[A]=u[A]-65535-(s[A-1]>>16&1),s[A-1]&=65535;s[15]=u[15]-32767-(s[14]>>16&1),a=s[15]>>16&1,s[14]&=65535,ie(u,s,1-a)}for(A=0;A<16;A++)r[2*A]=u[A]&255,r[2*A+1]=u[A]>>8}c(Ae,"pack25519");function Gt(r,o){var A=new Uint8Array(32),I=new Uint8Array(32);return Ae(A,r),Ae(I,o),$e(A,0,I,0)}c(Gt,"neq25519");function Nt(r){var o=new Uint8Array(32);return Ae(o,r),o[0]&1}c(Nt,"par25519");function ot(r,o){var A;for(A=0;A<16;A++)r[A]=o[2*A]+(o[2*A+1]<<8);r[15]&=32767}c(ot,"unpack25519");function R(r,o,A){var I;for(I=0;I<16;I++)r[I]=o[I]+A[I]|0}c(R,"A");function H(r,o,A){var I;for(I=0;I<16;I++)r[I]=o[I]-A[I]|0}c(H,"Z");function Q(r,o,A){var I,a,s=new Float64Array(31);for(I=0;I<31;I++)s[I]=0;for(I=0;I<16;I++)for(a=0;a<16;a++)s[I+a]+=o[I]*A[a];for(I=0;I<15;I++)s[I]+=38*s[I+16];for(I=0;I<16;I++)r[I]=s[I];fe(r),fe(r)}c(Q,"M");function k(r,o){Q(r,o,o)}c(k,"S");function Tt(r,o){var A=i(),I;for(I=0;I<16;I++)A[I]=o[I];for(I=253;I>=0;I--)k(A,A),I!==2&&I!==4&&Q(A,A,o);for(I=0;I<16;I++)r[I]=A[I]}c(Tt,"inv25519");function Ot(r,o){var A=i(),I;for(I=0;I<16;I++)A[I]=o[I];for(I=250;I>=0;I--)k(A,A),I!==1&&Q(A,A,o);for(I=0;I<16;I++)r[I]=A[I]}c(Ot,"pow2523");function me(r,o,A){var I=new Uint8Array(32),a=new Float64Array(80),s,u,l=i(),h=i(),C=i(),E=i(),d=i(),p=i();for(u=0;u<31;u++)I[u]=o[u];for(I[31]=o[31]&127|64,I[0]&=248,ot(a,A),u=0;u<16;u++)h[u]=a[u],E[u]=l[u]=C[u]=0;for(l[0]=E[0]=1,u=254;u>=0;--u)s=I[u>>>3]>>>(u&7)&1,ie(l,h,s),ie(C,E,s),R(d,l,C),H(l,l,C),R(C,h,E),H(h,h,E),k(E,d),k(p,l),Q(l,C,l),Q(C,h,d),R(d,l,C),H(l,l,C),k(h,l),H(C,E,p),Q(l,C,b),R(l,l,E),Q(C,C,l),Q(l,E,p),Q(E,h,a),k(h,d),ie(l,h,s),ie(C,E,s);for(u=0;u<16;u++)a[u+16]=l[u],a[u+32]=C[u],a[u+48]=h[u],a[u+64]=E[u];var L=a.subarray(32),ae=a.subarray(16);return Tt(L,L),Q(ae,ae,L),Ae(r,ae),0}c(me,"crypto_scalarmult");function ve(r,o){return me(r,o,y)}c(ve,"crypto_scalarmult_base");function Jt(r,o){return g(o,32),ve(r,o)}c(Jt,"crypto_box_keypair");function Fe(r,o,A){var I=new Uint8Array(32);return me(I,A,o),Ue(r,f,I,he)}c(Fe,"crypto_box_beforenm");var jt=it,tr=At;function nr(r,o,A,I,a,s){var u=new Uint8Array(32);return Fe(u,a,s),jt(r,o,A,I,u)}c(nr,"crypto_box");function rr(r,o,A,I,a,s){var u=new Uint8Array(32);return Fe(u,a,s),tr(r,o,A,I,u)}c(rr,"crypto_box_open");function Ce(){var r=0,o=0,A=0,I=0,a=65535,s,u,l;for(l=0;l>>16,A+=u&a,I+=u>>>16;return o+=r>>>16,A+=o>>>16,I+=A>>>16,new t(A&a|I<<16,r&a|o<<16)}c(Ce,"add64");function Xt(r,o){return new t(r.hi>>>o,r.lo>>>o|r.hi<<32-o)}c(Xt,"shr64");function Pe(){var r=0,o=0,A;for(A=0;A>>o|r.lo<>>o|r.hi<>>o|r.hi<>>o|r.lo<=128;){for(h=0;h<16;h++)u[h]=Kt(o,8*h+E);for(h=0;h<80;h++){for(C=0;C<8;C++)a[C]=s[C];for(l=Ce(s[7],Ir(s[4]),ir(s[4],s[5],s[6]),gr[h],u[h%16]),a[7]=Ce(l,or(s[0]),Ar(s[0],s[1],s[2])),a[3]=Ce(a[3],l),C=0;C<8;C++)s[(C+1)%8]=a[C];if(h%16===15)for(C=0;C<16;C++)u[C]=Ce(u[C],u[(C+9)%16],ar(u[(C+1)%16]),cr(u[(C+14)%16]))}for(h=0;h<8;h++)s[h]=Ce(s[h],I[h]),I[h]=s[h];E+=128,A-=128}for(h=0;h<8;h++)kt(r,8*h,I[h]);return A}c(qt,"crypto_hashblocks");let ue=c((r,o)=>n(o).update(r).digest(),"crypto_hash_blake2b");var sr=new Uint8Array([106,9,230,103,243,188,201,8,187,103,174,133,132,202,167,59,60,110,243,114,254,148,248,43,165,79,245,58,95,29,54,241,81,14,82,127,173,230,130,209,155,5,104,140,43,62,108,31,31,131,217,171,251,65,189,107,91,224,205,25,19,126,33,121]);function It(r,o,A){var I=new Uint8Array(64),a=new Uint8Array(256),s,u=A;for(s=0;s<64;s++)I[s]=sr[s];for(qt(I,o,A),A%=128,s=0;s<256;s++)a[s]=0;for(s=0;s=0;--a)I=A[a/8|0]>>(a&7)&1,Wt(r,o,I),Ke(o,r),Ke(r,r),Wt(r,o,I)}c(at,"scalarmult");function le(r,o){var A=[i(),i(),i(),i()];N(A[0],m),N(A[1],j),N(A[2],x),Q(A[3],m,j),at(r,A,o)}c(le,"scalarbase");function ct(r,o,A){var I=new Uint8Array(64),a=[i(),i(),i(),i()],s;A||g(o,32);I=ue(o,64),I[0]&=248,I[31]&=127,I[31]|=64,le(a,I),ke(r,a);return 0}c(ct,"crypto_sign_keypair");var Ye=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]);function gt(r,o){var A,I,a,s;for(I=63;I>=32;--I){for(A=0,a=I-32,s=I-12;a>4)*Ye[a],A=o[a]>>8,o[a]&=255;for(a=0;a<32;a++)o[a]-=A*Ye[a];for(I=0;I<32;I++)o[I+1]+=o[I]>>8,r[I]=o[I]&255}c(gt,"modL");function st(r){var o=new Float64Array(64),A;for(A=0;A<64;A++)o[A]=r[A];for(A=0;A<64;A++)r[A]=0;gt(r,o)}c(st,"reduce");function zt(r,o,A,I){var a=new Uint8Array(64),s=new Uint8Array(64),u=new Uint8Array(64),l,h,C=new Float64Array(64),E=[i(),i(),i(),i()];let d=tn(I);a=ue(I,64),a[0]&=248,a[31]&=127,a[31]|=64;var p=A+64;for(l=0;l>7&&H(r[0],w,r[0]),Q(r[3],r[0],r[1]),0)}c(hr,"unpackneg");function ht(r,o,A,I){var a,s=new Uint8Array(32),u=new Uint8Array(64),l=[i(),i(),i(),i()],h=[i(),i(),i(),i()];if(A<64||hr(h,I))return-1;for(a=0;a=0};function tn(r){let o=new Uint8Array(64),A=[i(),i(),i(),i()],I,a=new Uint8Array(32);return o=ue(r,64),o[0]&=248,o[31]&=127,o[31]|=64,le(A,o),ke(a,A),a}c(tn,"derivePublicFromSecret"),e.sign.keyPair=function(){var r=new Uint8Array(z),o=new Uint8Array(Ie);return ct(r,o),{publicKey:r,secretKey:o}},e.sign.keyPair.fromSecretKey=function(r){if(P(r),r.length!==Ie)throw new Error("bad secret key size");var o=new Uint8Array(z);return o=tn(r),{publicKey:o,secretKey:new Uint8Array(r)}},e.sign.keyPair.fromSeed=function(r){if(P(r),r.length!==ut)throw new Error("bad seed size");for(var o=new Uint8Array(z),A=new Uint8Array(Ie),I=0;I<32;I++)A[I]=r[I];return ct(o,A,!0),{publicKey:o,secretKey:A}},e.sign.publicKeyLength=z,e.sign.secretKeyLength=Ie,e.sign.seedLength=ut,e.sign.signatureLength=T,e.hash=function(r){P(r);var o=new Uint8Array(lt);return It(o,r,r.length),o},e.hash.hashLength=lt,e.verify=function(r,o){return P(r,o),r.length===0||o.length===0||r.length!==o.length?!1:Ze(r,0,o,0,r.length)===0},e.setPRNG=function(r){g=r},function(){var r=typeof self<"u"?self.crypto||self.msCrypto:null;if(r&&r.getRandomValues){var o=65536;e.setPRNG(function(A,I){var a,s=new Uint8Array(I);for(a=0;azn,get_address_from_public_key:()=>_e,get_private_key_from_seed:()=>pt,get_public_key_from_address:()=>pe,get_public_key_from_private_key:()=>je,hash_block:()=>te,hex_to_uint8array:()=>D,int_to_uint8array:()=>qn,raw_to_whole:()=>_t,sign_block_hash:()=>ne,sign_message:()=>St,uint8array_to_base32:()=>bt,uint8array_to_hex:()=>ee,utf8_to_uint8array:()=>Zn,verify_block_hash:()=>Si,whole_to_raw:()=>De});var Je=rn(Xn()),Se=rn(dt());var di="0000000000000000000000000000000000000000000000000000000000000006",bi="62616E616E6F6D73672D",be=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];function ee(e){let n="";for(let t=0;t0;f--)g-=t[n-f]*16**(2*(f-1));t[n-i]=Math.floor(g/16**(2*(i-1)))}return t}c(qn,"int_to_uint8array");var Wn=["1","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","m","n","o","p","q","r","s","t","u","w","x","y","z"];function bt(e){let n="";for(let t=0;t=5)y=e[g]>>w-5&31;else{let x=5-w;y=(e[g]<>8-x&2**(8-x)-1)}n+=Wn[y]}return n}c(bt,"uint8array_to_base32");function _i(e,n){let t="",i=e;for(let g=0;g=2**(n-1-g)?(t+="1",i-=2**(n-1-g)):t+="0";return t}c(_i,"int_to_binary");function pi(e){let n=0;for(let t=0;t_i(Wn.indexOf(i),5)).join(""),t=new Uint8Array(Math.ceil(e.length*5/8));for(let i=0;in-i[1].length)throw Error(`Too many decimals, cannot exceed ${n}`);t=BigInt(i[0])*BigInt(10)**BigInt(n)+BigInt(i[1])*BigInt(10)**BigInt(n-i[1].length)}else t=BigInt(e)*BigInt(10)**BigInt(n);return t}c(De,"whole_to_raw");function _t(e,n=$n){let t=e.toString(),i;if(t.length>n)i=t.slice(0,-n)+"."+t.slice(-n);else{let f=n-t.length;i="0."+"0".repeat(f>0?f:0)+t}let g=i.length;for(let f=0;fqe,RPCWithBackup:()=>Dt});var qe=class{constructor(n,t=!1){this.DECIMALS=void 0;this.debug=!1;this.rpc_url=n,this.use_pending=t}static{c(this,"RPC")}async call(n){this.debug&&console.log(JSON.stringify(n));let t=await fetch(this.rpc_url,{method:"POST",headers:this.headers??{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!t.ok&&this.debug&&console.log(await t.text()),!t.ok)throw Error(`Request to RPC node failed with status code ${t.status}`);let i=await t.json();if(i.error)throw Error(`RPC node response: ${i.error}`);return i}async get_block_count(){return await this.call({action:"block_count"})}async get_block_info(n){return await this.call({action:"block_info",hash:n,json_block:!0})}async get_blocks(n){return await this.call({action:"blocks",hashes:n,json_block:!0})}async get_blocks_info(n){return await this.call({action:"blocks_info",hashes:n,json_block:!0})}async get_representatives(){return await this.call({action:"representatives"})}async get_representatives_online(n){return await this.call({action:"representatives_online",weight:n?"true":void 0})}async get_account_history(n,t,i,g,f,y,w){return await this.call({action:"account_history",account:n,count:`${t}`,raw:i?"true":void 0,head:g,offset:f?`${f}`:void 0,reverse:y?"true":void 0,account_filter:w})}async get_account_info(n,t,i,g,f){return await this.call({action:"account_info",account:n,representative:i?"true":void 0,weight:g?"true":void 0,pending:f?"true":void 0})}async get_account_balance(n){return await this.call({action:"account_balance",account:n})}async get_accounts_balances(n){return await this.call({action:"accounts_balances",accounts:n})}async get_account_representative(n){return await this.call({action:"account_representative",account:n})}async get_accounts_representatives(n){return await this.call({action:"accounts_representatives",account:n})}async get_account_weight(n){return await this.call({action:"account_weight",account:n})}async get_account_receivable(n,t,i,g){return await this.call({action:this.use_pending?"pending":"receivable",account:n,count:t?`${t}`:void 0,threshold:i?De(i,this.DECIMALS).toString():void 0,source:g?"true":void 0})}async get_delegators(n,t,i,g){return await this.call({action:"delegators",account:n,threshold:t?`${t}`:void 0,count:i?`${i}`:void 0,start:g})}async get_delegators_count(n){return await this.call({action:"account_weight",account:n})}},Dt=class extends qe{static{c(this,"RPCWithBackup")}constructor(n,t,i=!1){if(n.length<2)throw Error("Must provide at least two RPC URLs");super(n[0],i),this.rpc_urls=n,this.timeout=t}async call(n){let t=0;for(;;)try{let i=await fetch(this.rpc_urls[t],{method:"POST",headers:this.headers??{"Content-Type":"application/json"},body:JSON.stringify(n),signal:AbortSignal.timeout(this.timeout)});if(!i.ok)throw Error(`Request to RPC node failed with status code ${i.status}`);let g=await i.json();if(g.error)throw Error(`RPC node response: ${g.error}`);return g}catch(i){if(!this.rpc_urls[++t])throw Error(i)}}};var vt={};Me(vt,{PrivateKeyAccount:()=>mt,Wallet:()=>We});var We=class e{constructor(n,t,i=0,g){this.add_do_work=!0;if(this.rpc=n,typeof t!="string"||t?.length!==64)throw Error("Seed needs to be 64 character (hex) string");this.seed=t,this.index=i,this.work_function=g}static{c(this,"Wallet")}static gen_random_wallet(n){let t=new Uint8Array(32);crypto.getRandomValues(t);let i=ee(t);return new e(n,i)}get private_key(){return pt(this.seed,this.index)}get public_key(){return je(this.private_key)}get address(){return _e(this.public_key)}async send_process(n,t){return(await this.rpc.call({action:"process",json_block:"true",subtype:t,block:n,do_work:!n.work&&this.add_do_work?!0:void 0})).hash}async send(n,t,i,g,f){let y=De(t,this.rpc.DECIMALS),w=f??await this.get_account_info(void 0,!0),x=pe(n);g||(g=w.representative);let b=BigInt(w.balance),_=b-y;if(_<0n)throw Error(`Insufficient funds to send. Cannot send more than balance; ie, Before balance (raw: ${b}) less than send amount (raw: ${y})`);let S={type:"state",account:this.address,previous:w.frontier,representative:g,balance:_.toString(),link:x,link_as_account:n},m=te(S),j;i&&(j=await this.work_function(m));let se=ne(this.private_key,m),X={...S,signature:se,work:j};return await this.send_process(X,"send")}async send_all(n,t,i){let g=await this.get_account_info(void 0,!0);return await this.send(n,_t(BigInt(g.balance),this.rpc.DECIMALS),t,i,g)}async receive(n,t,i){let g=await this.rpc.get_block_info(n),f=0n;i||(i=this.address);let y;try{let m=await this.get_account_info(void 0,!0);y=m.frontier,i=m.representative,f=BigInt(m.balance)}catch{y="0".repeat(64)}let w={type:"state",account:this.address,previous:y,representative:i,balance:(f+BigInt(g.amount)).toString(),link:n},x=te(w),b;t&&(b=await this.work_function(x));let _=ne(this.private_key,x),S={...w,signature:_,work:b};return await this.send_process(S,"receive")}async receive_all(n=20,t,i){let g=(await this.get_account_receivable(n,t,!0)).blocks,f,y,w;try{let b=await this.get_account_info(void 0,!0);f=b.frontier,y=b.representative,w=BigInt(b.balance)}catch{f="0".repeat(64),y=this.address,w=BigInt(0)}let x=[];for(let b of Object.keys(g)){let _=(w+BigInt(g[b].amount)).toString(),S={type:"state",account:this.address,previous:f,representative:y,balance:_,link:b},m=te(S),j;i&&(j=await this.work_function(m));let se=ne(this.private_key,m),X={...S,signature:se,work:j};await this.send_process(X,"receive"),x.push(m),f=m,w=BigInt(_)}return x}async change_representative(n,t){let i=await this.get_account_info(),g={type:"state",account:this.address,previous:i.frontier,representative:n,balance:i.balance,link:"0".repeat(64)},f=te(g),y;t&&(y=await this.work_function(f));let w=ne(this.private_key,f),x={...g,signature:w,work:y};return await this.send_process(x,"change")}async change_rep(n,t){return await this.change_representative(n,t)}async get_account_info(n,t,i,g){return await this.rpc.get_account_info(this.address,n,t,i,g)}async get_account_receivable(n,t,i){return await this.rpc.get_account_receivable(this.address,n,t,i)}sign_message(n){return St(this.private_key,n)}},mt=class extends We{static{c(this,"PrivateKeyAccount")}constructor(n,t,i){if(typeof t!="string"||t?.length!==64)throw Error("Priv key needs to be 64 character (hex) string");super(n,t,0,i),this._private_key=t}get private_key(){return this._private_key}};var Pt={};Me(Pt,{RPCWorkProvider:()=>Ft});var Ft=class{constructor(n){this.extra_payload={};this.rpc=n}static{c(this,"RPCWorkProvider")}async request_work(n){return(await this.rpc.call({action:"work_generate",hash:n,...this.extra_payload})).work}};window.banani={...Xe,...Ut,...vt,...Pt};})(); +(()=>{var wr=Object.create;var Le=Object.defineProperty;var Br=Object.getOwnPropertyDescriptor;var xr=Object.getOwnPropertyNames;var Qr=Object.getPrototypeOf,dr=Object.prototype.hasOwnProperty;var s=(e,n)=>Le(e,"name",{value:n,configurable:!0}),An=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var M=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),Me=(e,n)=>{for(var t in n)Le(e,t,{get:n[t],enumerable:!0})},br=(e,n,t,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let g of xr(n))!dr.call(e,g)&&g!==t&&Le(e,g,{get:()=>n[g],enumerable:!(i=Br(n,g))||i.enumerable});return e};var on=(e,n,t)=>(t=e!=null?wr(Qr(e)):{},br(n||!e||!e.__esModule?Le(t,"default",{value:e,enumerable:!0}):t,e));var lt=M((vi,an)=>{an.exports=In;var Ve=class extends Error{static{s(this,"AssertionError")}};Ve.prototype.name="AssertionError";function In(e,n){if(!e){var t=new Ve(n);throw Error.captureStackTrace&&Error.captureStackTrace(t,In),t}}s(In,"assert")});var cn=M((Pi,gn)=>{function sn(e){return e.length}s(sn,"byteLength");function _r(e){let n=e.byteLength,t="";for(let i=0;i{var ge="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Z=new Uint8Array(256);for(let e=0;e1&&e.charCodeAt(n-1)===61&&n--,n*3>>>2}s(hn,"byteLength");function Sr(e){let n=e.byteLength,t="";for(let i=0;i>2]+ge[(e[i]&3)<<4|e[i+1]>>4]+ge[(e[i+1]&15)<<2|e[i+2]>>6]+ge[e[i+2]&63];return n%3===2?t=t.substring(0,t.length-1)+"=":n%3===1&&(t=t.substring(0,t.length-2)+"=="),t}s(Sr,"toString");function Dr(e,n,t=0,i=hn(n)){let g=Math.min(i,e.byteLength-t);for(let f=0,y=0;y>4,e[y++]=(x&15)<<4|b>>2,e[y++]=(b&3)<<6|_&63}return g}s(Dr,"write");fn.exports={byteLength:hn,toString:Sr,write:Dr}});var En=M((Ri,yn)=>{function ln(e){return e.length>>>1}s(ln,"byteLength");function Ur(e){let n=e.byteLength;e=new DataView(e.buffer,e.byteOffset,n);let t="",i=0;for(let g=n-n%4;i=48&&e<=57)return e-48;if(e>=65&&e<=70)return e-65+10;if(e>=97&&e<=102)return e-97+10}s(un,"hexValue")});var Bn=M((Li,wn)=>{function yt(e){let n=0;for(let t=0,i=e.length;t=55296&&g<=56319&&t+1=56320&&f<=57343){n+=4,t++;continue}}g<=127?n+=1:g<=2047?n+=2:n+=3}return n}s(yt,"byteLength");var Et;if(typeof TextDecoder<"u"){let e=new TextDecoder;Et=s(function(t){return e.decode(t)},"toString")}else Et=s(function(n){let t=n.byteLength,i="",g=0;for(;g0){let x=0;for(;x>b,b-=6;b>=0;)n[w++]=128|x>>b&63,b-=6;y+=x>=65536?2:1}return f},"write");wn.exports={byteLength:yt,toString:Et,write:wt}});var dn=M((Vi,Qn)=>{function xn(e){return e.length*2}s(xn,"byteLength");function vr(e){let n=e.byteLength,t="";for(let i=0;i>8,b=w%256;e[t+y*2]=b,e[t+y*2+1]=x}return g}s(Fr,"write");Qn.exports={byteLength:xn,toString:vr,write:Fr}});var Dn=M((xt,Sn)=>{var Pr=cn(),Kr=Cn(),kr=En(),Yr=Bn(),Rr=dn(),Ge=new Uint8Array(Uint16Array.of(255).buffer)[0]===255;function Qe(e){switch(e){case"ascii":return Pr;case"base64":return Kr;case"hex":return kr;case"utf8":case"utf-8":case void 0:return Yr;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Rr;default:throw new Error(`Unknown encoding: ${e}`)}}s(Qe,"codecFor");function bn(e){return e instanceof Uint8Array}s(bn,"isBuffer");function Hr(e){try{return Qe(e),!0}catch{return!1}}s(Hr,"isEncoding");function Lr(e,n,t){let i=new Uint8Array(e);return n!==void 0&&xt.fill(i,n,0,i.byteLength,t),i}s(Lr,"alloc");function Mr(e){return new Uint8Array(e)}s(Mr,"allocUnsafe");function Vr(e){return new Uint8Array(e)}s(Vr,"allocUnsafeSlow");function Gr(e,n){return Qe(n).byteLength(e)}s(Gr,"byteLength");function Nr(e,n){if(e===n)return 0;let t=Math.min(e.byteLength,n.byteLength);e=new DataView(e.buffer,e.byteOffset,e.byteLength),n=new DataView(n.buffer,n.byteOffset,n.byteLength);let i=0;for(let g=t-t%4;if)return 1}return e.byteLength>n.byteLength?1:e.byteLengthg+f.byteLength,0));let t=new Uint8Array(n),i=0;for(let g of e){if(i+g.byteLength>t.byteLength){let f=g.subarray(0,t.byteLength-i);return t.set(f,i),t}t.set(g,i),i+=g.byteLength}return t}s(Tr,"concat");function Or(e,n,t=0,i=0,g=e.byteLength){if(g>0&&g=e.byteLength)throw new RangeError("sourceStart is out of range");if(g<0)throw new RangeError("sourceEnd is out of range");t>=n.byteLength&&(t=n.byteLength),g>e.byteLength&&(g=e.byteLength),n.byteLength-t=e.byteLength){if(g)return-1;t=e.byteLength-1}else if(t<0)if(g)t=0;else return-1;if(typeof n=="string")n=Bt(n,i);else if(typeof n=="number")return n=n&255,g?e.indexOf(n,t):e.lastIndexOf(n,t);if(n.byteLength===0)return-1;if(g){let f=-1;for(let y=t;ye.byteLength&&(t=e.byteLength-n.byteLength);for(let f=t;f>=0;f--){let y=!0;for(let w=0;w=g||i<=t?"":(t<0&&(t=0),i>g&&(i=g),(t!==0||i{var Ci=s((e,n)=>s(function(){return n||(0,e[Object.keys(e)[0]])((n={exports:{}}).exports,n),n.exports},"__require"),"__commonJS"),ui=(()=>{for(var e=new Uint8Array(128),n=0;n<64;n++)e[n<26?n+65:n<52?n+71:n<62?n-4:n*4-205]=n;return t=>{for(var i=t.length,g=new Uint8Array((i-(t[i-1]=="=")-(t[i-2]=="="))*3/4|0),f=0,y=0;f>4,g[y++]=x<<4|b>>2,g[y++]=b<<6|_}return g}})(),li=Ci({"wasm-binary:./blake2b.wat"(e,n){n.exports=ui("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")}}),yi=li(),Ei=WebAssembly.compile(yi);Un.exports=async e=>(await WebAssembly.instantiate(await Ei,e)).exports});var Hn=M((Xi,G)=>{var K=lt(),wi=Dn(),J=null,vn=typeof WebAssembly<"u"&&mn()().then(e=>{J=e}),O=64,Ne=[];G.exports=v;var Fn=G.exports.BYTES_MIN=16,Pn=G.exports.BYTES_MAX=64,Ji=G.exports.BYTES=32,Kn=G.exports.KEYBYTES_MIN=16,kn=G.exports.KEYBYTES_MAX=64,ji=G.exports.KEYBYTES=32,Yn=G.exports.SALTBYTES=16,Rn=G.exports.PERSONALBYTES=16;function v(e,n,t,i,g){if(!(this instanceof v))return new v(e,n,t,i,g);if(!J)throw new Error("WASM not loaded. Wait for Blake2b.ready(cb)");e||(e=32),g!==!0&&(K(e>=Fn,"digestLength must be at least "+Fn+", was given "+e),K(e<=Pn,"digestLength must be at most "+Pn+", was given "+e),n!=null&&(K(n instanceof Uint8Array,"key must be Uint8Array or Buffer"),K(n.length>=Kn,"key must be at least "+Kn+", was given "+n.length),K(n.length<=kn,"key must be at least "+kn+", was given "+n.length)),t!=null&&(K(t instanceof Uint8Array,"salt must be Uint8Array or Buffer"),K(t.length===Yn,"salt must be exactly "+Yn+", was given "+t.length)),i!=null&&(K(i instanceof Uint8Array,"personal must be Uint8Array or Buffer"),K(i.length===Rn,"personal must be exactly "+Rn+", was given "+i.length))),Ne.length||(Ne.push(O),O+=216),this.digestLength=e,this.finalized=!1,this.pointer=Ne.pop(),this._memory=new Uint8Array(J.memory.buffer),this._memory.fill(0,0,64),this._memory[0]=this.digestLength,this._memory[1]=n?n.length:0,this._memory[2]=1,this._memory[3]=1,t&&this._memory.set(t,32),i&&this._memory.set(i,48),this.pointer+216>this._memory.length&&this._realloc(this.pointer+216),J.blake2b_init(this.pointer,this.digestLength),n&&(this.update(n),this._memory.fill(0,O,O+n.length),this._memory[this.pointer+200]=128)}s(v,"Blake2b");v.prototype._realloc=function(e){J.memory.grow(Math.max(0,Math.ceil(Math.abs(e-this._memory.length)/65536))),this._memory=new Uint8Array(J.memory.buffer)};v.prototype.update=function(e){return K(this.finalized===!1,"Hash instance finalized"),K(e instanceof Uint8Array,"input must be Uint8Array or Buffer"),O+e.length>this._memory.length&&this._realloc(O+e.length),this._memory.set(e,O),J.blake2b_update(this.pointer,O,O+e.length),this};v.prototype.digest=function(e){if(K(this.finalized===!1,"Hash instance finalized"),this.finalized=!0,Ne.push(this.pointer),J.blake2b_final(this.pointer),!e||e==="binary")return this._memory.slice(this.pointer+128,this.pointer+128+this.digestLength);if(typeof e=="string")return wi.toString(this._memory,e,this.pointer+128,this.pointer+128+this.digestLength);K(e instanceof Uint8Array&&e.length>=this.digestLength,"input must be Uint8Array or Buffer");for(var n=0;ne(),e):e(new Error("WebAssembly not supported"))};v.prototype.ready=v.ready;v.prototype.getPartialHash=function(){return this._memory.slice(this.pointer,this.pointer+216)};v.prototype.setPartialHash=function(e){this._memory.set(e,this.pointer)};function Bi(){}s(Bi,"noop")});var Qt=M((Zi,F)=>{var Y=lt(),be=Hn();function Te(e,n,t){var i=e[n]+e[t],g=e[n+1]+e[t+1];i>=4294967296&&g++,e[n]=i,e[n+1]=g}s(Te,"ADD64AA");function Ln(e,n,t,i){var g=e[n]+t;t<0&&(g+=4294967296);var f=e[n+1]+i;g>=4294967296&&f++,e[n]=g,e[n+1]=f}s(Ln,"ADD64AC");function Jn(e,n){return e[n]^e[n+1]<<8^e[n+2]<<16^e[n+3]<<24}s(Jn,"B2B_GET32");function q(e,n,t,i,g,f){var y=de[g],w=de[g+1],x=de[f],b=de[f+1];Te(B,e,n),Ln(B,e,y,w);var _=B[i]^B[e],S=B[i+1]^B[e+1];B[i]=S,B[i+1]=_,Te(B,t,i),_=B[n]^B[t],S=B[n+1]^B[t+1],B[n]=_>>>24^S<<8,B[n+1]=S>>>24^_<<8,Te(B,e,n),Ln(B,e,x,b),_=B[i]^B[e],S=B[i+1]^B[e+1],B[i]=_>>>16^S<<16,B[i+1]=S>>>16^_<<16,Te(B,t,i),_=B[n]^B[t],S=B[n+1]^B[t+1],B[n]=S>>>31^_<<1,B[n+1]=_>>>31^S<<1}s(q,"B2B_G");var jn=new Uint32Array([4089235720,1779033703,2227873595,3144134277,4271175723,1013904242,1595750129,2773480762,2917565137,1359893119,725511199,2600822924,4215389547,528734635,327033209,1541459225]),xi=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3,11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4,7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8,9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13,2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9,12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11,13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10,6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5,10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3],U=new Uint8Array(xi.map(function(e){return e*2})),B=new Uint32Array(32),de=new Uint32Array(32);function Xn(e,n){var t=0;for(t=0;t<16;t++)B[t]=e.h[t],B[t+16]=jn[t];for(B[24]=B[24]^e.t,B[25]=B[25]^e.t/4294967296,n&&(B[28]=~B[28],B[29]=~B[29]),t=0;t<32;t++)de[t]=Jn(e.b,4*t);for(t=0;t<12;t++)q(0,8,16,24,U[t*16+0],U[t*16+1]),q(2,10,18,26,U[t*16+2],U[t*16+3]),q(4,12,20,28,U[t*16+4],U[t*16+5]),q(6,14,22,30,U[t*16+6],U[t*16+7]),q(0,10,20,30,U[t*16+8],U[t*16+9]),q(2,12,22,24,U[t*16+10],U[t*16+11]),q(4,14,16,26,U[t*16+12],U[t*16+13]),q(6,8,18,28,U[t*16+14],U[t*16+15]);for(t=0;t<16;t++)e.h[t]=e.h[t]^B[t]^B[t+16]}s(Xn,"blake2bCompress");var W=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);function ce(e,n,t,i){W.fill(0),this.b=new Uint8Array(128),this.h=new Uint32Array(16),this.t=0,this.c=0,this.outlen=e,W[0]=e,n&&(W[1]=n.length),W[2]=1,W[3]=1,t&&W.set(t,32),i&&W.set(i,48);for(var g=0;g<16;g++)this.h[g]=jn[g]^Jn(W,g*4);n&&(qn(this,n),this.c=128)}s(ce,"Blake2b");ce.prototype.update=function(e){return Y(e instanceof Uint8Array,"input must be Uint8Array or Buffer"),qn(this,e),this};ce.prototype.digest=function(e){var n=!e||e==="binary"||e==="hex"?new Uint8Array(this.outlen):e;return Y(n instanceof Uint8Array,'out must be "binary", "hex", Uint8Array, or Buffer'),Y(n.length>=this.outlen,"out must have at least outlen bytes of space"),Qi(this,n),e==="hex"?di(n):n};ce.prototype.final=ce.prototype.digest;ce.ready=function(e){be.ready(function(){e()})};function qn(e,n){for(var t=0;t>2]>>8*(t&3);return n}s(Qi,"blake2bFinal");function di(e){for(var n="",t=0;t=Mn,"outlen must be at least "+Mn+", was given "+n),Y(n<=Vn,"outlen must be at most "+Vn+", was given "+n),t!=null&&(Y(t instanceof Uint8Array,"key must be Uint8Array or Buffer"),Y(t.length>=Gn,"key must be at least "+Gn+", was given "+t.length),Y(t.length<=Nn,"key must be at most "+Nn+", was given "+t.length)),i!=null&&(Y(i instanceof Uint8Array,"salt must be Uint8Array or Buffer"),Y(i.length===Tn,"salt must be exactly "+Tn+", was given "+i.length)),g!=null&&(Y(g instanceof Uint8Array,"personal must be Uint8Array or Buffer"),Y(g.length===On,"personal must be exactly "+On+", was given "+g.length))),new _i(n,t,i,g)},"createHash");F.exports.ready=function(e){be.ready(function(){e()})};F.exports.WASM_SUPPORTED=be.SUPPORTED;F.exports.WASM_LOADED=!1;var Mn=F.exports.BYTES_MIN=16,Vn=F.exports.BYTES_MAX=64,Wi=F.exports.BYTES=32,Gn=F.exports.KEYBYTES_MIN=16,Nn=F.exports.KEYBYTES_MAX=64,zi=F.exports.KEYBYTES=32,Tn=F.exports.SALTBYTES=16,On=F.exports.PERSONALBYTES=16;be.ready(function(e){e||(F.exports.WASM_LOADED=!0,F.exports=be)})});var Wn=M((eA,Oe)=>{(function(e){"use strict";let n=Qt();var t=s(function(r,o){this.hi=r|0,this.lo=o|0},"u64"),i=s(function(r){var o,A=new Float64Array(16);if(r)for(o=0;o>>32-o}s(X,"L32");function re(r,o){var A=r[o+3]&255;return A=A<<8|r[o+2]&255,A=A<<8|r[o+1]&255,A<<8|r[o+0]&255}s(re,"ld32");function kt(r,o){var A=r[o]<<24|r[o+1]<<16|r[o+2]<<8|r[o+3],I=r[o+4]<<24|r[o+5]<<16|r[o+6]<<8|r[o+7];return new t(A,I)}s(kt,"dl64");function ze(r,o,A){var I;for(I=0;I<4;I++)r[o+I]=A&255,A>>>=8}s(ze,"st32");function Yt(r,o,A){r[o]=A.hi>>24&255,r[o+1]=A.hi>>16&255,r[o+2]=A.hi>>8&255,r[o+3]=A.hi&255,r[o+4]=A.lo>>24&255,r[o+5]=A.lo>>16&255,r[o+6]=A.lo>>8&255,r[o+7]=A.lo&255}s(Yt,"ts64");function Ze(r,o,A,I,a){var c,u=0;for(c=0;c>>8)-1}s(Ze,"vn");function Rt(r,o,A,I){return Ze(r,o,A,I,16)}s(Rt,"crypto_verify_16");function $e(r,o,A,I){return Ze(r,o,A,I,32)}s($e,"crypto_verify_32");function Ht(r,o,A,I,a){var c=new Uint32Array(16),u=new Uint32Array(16),l=new Uint32Array(16),h=new Uint32Array(4),C,E,d;for(C=0;C<4;C++)u[5*C]=re(I,4*C),u[1+C]=re(A,4*C),u[6+C]=re(o,4*C),u[11+C]=re(A,16+4*C);for(C=0;C<16;C++)l[C]=u[C];for(C=0;C<20;C++){for(E=0;E<4;E++){for(d=0;d<4;d++)h[d]=u[(5*E+4*d)%16];for(h[1]^=X(h[0]+h[3]|0,7),h[2]^=X(h[1]+h[0]|0,9),h[3]^=X(h[2]+h[1]|0,13),h[0]^=X(h[3]+h[2]|0,18),d=0;d<4;d++)c[4*E+(E+d)%4]=h[d]}for(d=0;d<16;d++)u[d]=c[d]}if(a){for(C=0;C<16;C++)u[C]=u[C]+l[C]|0;for(C=0;C<4;C++)u[5*C]=u[5*C]-re(I,4*C)|0,u[6+C]=u[6+C]-re(o,4*C)|0;for(C=0;C<4;C++)ze(r,4*C,u[5*C]),ze(r,16+4*C,u[6+C])}else for(C=0;C<16;C++)ze(r,4*C,u[C]+l[C]|0)}s(Ht,"core");function Lt(r,o,A,I){return Ht(r,o,A,I,!1),0}s(Lt,"crypto_core_salsa20");function Ue(r,o,A,I){return Ht(r,o,A,I,!0),0}s(Ue,"crypto_core_hsalsa20");var Ce=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]);function et(r,o,A,I,a,c,u){var l=new Uint8Array(16),h=new Uint8Array(64),C,E;if(!a)return 0;for(E=0;E<16;E++)l[E]=0;for(E=0;E<8;E++)l[E]=c[E];for(;a>=64;){for(Lt(h,l,u,Ce),E=0;E<64;E++)r[o+E]=(A?A[I+E]:0)^h[E];for(C=1,E=8;E<16;E++)C=C+(l[E]&255)|0,l[E]=C&255,C>>>=8;a-=64,o+=64,A&&(I+=64)}if(a>0)for(Lt(h,l,u,Ce),E=0;E>>=8}s(nt,"add1305");var rr=new Uint32Array([5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252]);function rt(r,o,A,I,a,c){var u,l,h,C,E=new Uint32Array(17),d=new Uint32Array(17),p=new Uint32Array(17),L=new Uint32Array(17),se=new Uint32Array(17);for(h=0;h<17;h++)d[h]=p[h]=0;for(h=0;h<16;h++)d[h]=c[h];for(d[3]&=15,d[4]&=252,d[7]&=15,d[8]&=252,d[11]&=15,d[12]&=252,d[15]&=15;a>0;){for(h=0;h<17;h++)L[h]=0;for(h=0;h<16&&h>>=8;for(C=C+p[16]|0,p[16]=C&3,C=5*(C>>>2)|0,h=0;h<16;h++)C=C+p[h]|0,p[h]=C&255,C>>>=8;C=C+p[16]|0,p[16]=C}for(h=0;h<17;h++)se[h]=p[h];for(nt(p,rr),u=-(p[16]>>>7)|0,h=0;h<17;h++)p[h]^=u&(se[h]^p[h]);for(h=0;h<16;h++)L[h]=c[h+16];for(L[16]=0,nt(p,L),h=0;h<16;h++)r[o+h]=p[h];return 0}s(rt,"crypto_onetimeauth");function Gt(r,o,A,I,a,c){var u=new Uint8Array(16);return rt(u,0,A,I,a,c),Rt(r,o,u,0)}s(Gt,"crypto_onetimeauth_verify");function it(r,o,A,I,a){var c;if(A<32)return-1;for(tt(r,0,o,0,A,I,a),rt(r,16,r,32,A-32,r),c=0;c<16;c++)r[c]=0;return 0}s(it,"crypto_secretbox");function At(r,o,A,I,a){var c,u=new Uint8Array(32);if(A<32||(Vt(u,0,32,I,a),Gt(o,16,o,32,A-32,u)!==0))return-1;for(tt(r,0,o,0,A,I,a),c=0;c<32;c++)r[c]=0;return 0}s(At,"crypto_secretbox_open");function N(r,o){var A;for(A=0;A<16;A++)r[A]=o[A]|0}s(N,"set25519");function ue(r){var o,A;for(A=0;A<16;A++)r[A]+=65536,o=Math.floor(r[A]/65536),r[(A+1)*(A<15?1:0)]+=o-1+37*(o-1)*(A===15?1:0),r[A]-=o*65536}s(ue,"car25519");function ie(r,o,A){for(var I,a=~(A-1),c=0;c<16;c++)I=a&(r[c]^o[c]),r[c]^=I,o[c]^=I}s(ie,"sel25519");function Ae(r,o){var A,I,a,c=i(),u=i();for(A=0;A<16;A++)u[A]=o[A];for(ue(u),ue(u),ue(u),I=0;I<2;I++){for(c[0]=u[0]-65517,A=1;A<15;A++)c[A]=u[A]-65535-(c[A-1]>>16&1),c[A-1]&=65535;c[15]=u[15]-32767-(c[14]>>16&1),a=c[15]>>16&1,c[14]&=65535,ie(u,c,1-a)}for(A=0;A<16;A++)r[2*A]=u[A]&255,r[2*A+1]=u[A]>>8}s(Ae,"pack25519");function Nt(r,o){var A=new Uint8Array(32),I=new Uint8Array(32);return Ae(A,r),Ae(I,o),$e(A,0,I,0)}s(Nt,"neq25519");function Tt(r){var o=new Uint8Array(32);return Ae(o,r),o[0]&1}s(Tt,"par25519");function ot(r,o){var A;for(A=0;A<16;A++)r[A]=o[2*A]+(o[2*A+1]<<8);r[15]&=32767}s(ot,"unpack25519");function R(r,o,A){var I;for(I=0;I<16;I++)r[I]=o[I]+A[I]|0}s(R,"A");function H(r,o,A){var I;for(I=0;I<16;I++)r[I]=o[I]-A[I]|0}s(H,"Z");function Q(r,o,A){var I,a,c=new Float64Array(31);for(I=0;I<31;I++)c[I]=0;for(I=0;I<16;I++)for(a=0;a<16;a++)c[I+a]+=o[I]*A[a];for(I=0;I<15;I++)c[I]+=38*c[I+16];for(I=0;I<16;I++)r[I]=c[I];ue(r),ue(r)}s(Q,"M");function k(r,o){Q(r,o,o)}s(k,"S");function Ot(r,o){var A=i(),I;for(I=0;I<16;I++)A[I]=o[I];for(I=253;I>=0;I--)k(A,A),I!==2&&I!==4&&Q(A,A,o);for(I=0;I<16;I++)r[I]=A[I]}s(Ot,"inv25519");function Jt(r,o){var A=i(),I;for(I=0;I<16;I++)A[I]=o[I];for(I=250;I>=0;I--)k(A,A),I!==1&&Q(A,A,o);for(I=0;I<16;I++)r[I]=A[I]}s(Jt,"pow2523");function me(r,o,A){var I=new Uint8Array(32),a=new Float64Array(80),c,u,l=i(),h=i(),C=i(),E=i(),d=i(),p=i();for(u=0;u<31;u++)I[u]=o[u];for(I[31]=o[31]&127|64,I[0]&=248,ot(a,A),u=0;u<16;u++)h[u]=a[u],E[u]=l[u]=C[u]=0;for(l[0]=E[0]=1,u=254;u>=0;--u)c=I[u>>>3]>>>(u&7)&1,ie(l,h,c),ie(C,E,c),R(d,l,C),H(l,l,C),R(C,h,E),H(h,h,E),k(E,d),k(p,l),Q(l,C,l),Q(C,h,d),R(d,l,C),H(l,l,C),k(h,l),H(C,E,p),Q(l,C,b),R(l,l,E),Q(C,C,l),Q(l,E,p),Q(E,h,a),k(h,d),ie(l,h,c),ie(C,E,c);for(u=0;u<16;u++)a[u+16]=l[u],a[u+32]=C[u],a[u+48]=h[u],a[u+64]=E[u];var L=a.subarray(32),se=a.subarray(16);return Ot(L,L),Q(se,se,L),Ae(r,se),0}s(me,"crypto_scalarmult");function ve(r,o){return me(r,o,y)}s(ve,"crypto_scalarmult_base");function jt(r,o){return g(o,32),ve(r,o)}s(jt,"crypto_box_keypair");function Fe(r,o,A){var I=new Uint8Array(32);return me(I,A,o),Ue(r,f,I,Ce)}s(Fe,"crypto_box_beforenm");var Xt=it,ir=At;function Ar(r,o,A,I,a,c){var u=new Uint8Array(32);return Fe(u,a,c),Xt(r,o,A,I,u)}s(Ar,"crypto_box");function or(r,o,A,I,a,c){var u=new Uint8Array(32);return Fe(u,a,c),ir(r,o,A,I,u)}s(or,"crypto_box_open");function le(){var r=0,o=0,A=0,I=0,a=65535,c,u,l;for(l=0;l>>16,A+=u&a,I+=u>>>16;return o+=r>>>16,A+=o>>>16,I+=A>>>16,new t(A&a|I<<16,r&a|o<<16)}s(le,"add64");function qt(r,o){return new t(r.hi>>>o,r.lo>>>o|r.hi<<32-o)}s(qt,"shr64");function Pe(){var r=0,o=0,A;for(A=0;A>>o|r.lo<>>o|r.hi<>>o|r.hi<>>o|r.lo<=128;){for(h=0;h<16;h++)u[h]=kt(o,8*h+E);for(h=0;h<80;h++){for(C=0;C<8;C++)a[C]=c[C];for(l=le(c[7],gr(c[4]),Ir(c[4],c[5],c[6]),fr[h],u[h%16]),a[7]=le(l,sr(c[0]),ar(c[0],c[1],c[2])),a[3]=le(a[3],l),C=0;C<8;C++)c[(C+1)%8]=a[C];if(h%16===15)for(C=0;C<16;C++)u[C]=le(u[C],u[(C+9)%16],cr(u[(C+1)%16]),hr(u[(C+14)%16]))}for(h=0;h<8;h++)c[h]=le(c[h],I[h]),I[h]=c[h];E+=128,A-=128}for(h=0;h<8;h++)Yt(r,8*h,I[h]);return A}s(Wt,"crypto_hashblocks");let oe=s((r,o)=>n(o).update(r).digest(),"crypto_hash_blake2b");var Cr=new Uint8Array([106,9,230,103,243,188,201,8,187,103,174,133,132,202,167,59,60,110,243,114,254,148,248,43,165,79,245,58,95,29,54,241,81,14,82,127,173,230,130,209,155,5,104,140,43,62,108,31,31,131,217,171,251,65,189,107,91,224,205,25,19,126,33,121]);function zt(r,o,A){var I=new Uint8Array(64),a=new Uint8Array(256),c,u=A;for(c=0;c<64;c++)I[c]=Cr[c];for(Wt(I,o,A),A%=128,c=0;c<256;c++)a[c]=0;for(c=0;c=0;--a)I=A[a/8|0]>>(a&7)&1,Zt(r,o,I),Ke(o,r),Ke(r,r),Zt(r,o,I)}s(It,"scalarmult");function ye(r,o){var A=[i(),i(),i(),i()];N(A[0],m),N(A[1],j),N(A[2],x),Q(A[3],m,j),It(r,A,o)}s(ye,"scalarbase");function at(r,o,A){var I=new Uint8Array(64),a=[i(),i(),i(),i()],c;A||g(o,32);I=oe(o,64),I[0]&=248,I[31]&=127,I[31]|=64,ye(a,I),ke(r,a);return 0}s(at,"crypto_sign_keypair");var Ye=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]);function st(r,o){var A,I,a,c;for(I=63;I>=32;--I){for(A=0,a=I-32,c=I-12;a>4)*Ye[a],A=o[a]>>8,o[a]&=255;for(a=0;a<32;a++)o[a]-=A*Ye[a];for(I=0;I<32;I++)o[I+1]+=o[I]>>8,r[I]=o[I]&255}s(st,"modL");function gt(r){var o=new Float64Array(64),A;for(A=0;A<64;A++)o[A]=r[A];for(A=0;A<64;A++)r[A]=0;st(r,o)}s(gt,"reduce");function $t(r,o,A,I){var a=new Uint8Array(64),c=new Uint8Array(64),u=new Uint8Array(64),l,h,C=new Float64Array(64),E=[i(),i(),i(),i()];let d=rn(I);a=oe(I,64),a[0]&=248,a[31]&=127,a[31]|=64;var p=A+64;for(l=0;l>7&&H(r[0],w,r[0]),Q(r[3],r[0],r[1]),0)}s(ur,"unpackneg");function ct(r,o,A,I){var a,c=new Uint8Array(32),u=new Uint8Array(64),l=[i(),i(),i(),i()],h=[i(),i(),i(),i()];if(A<64||ur(h,I))return-1;for(a=0;a=0};function rn(r){let o=new Uint8Array(64),A=[i(),i(),i(),i()],I,a=new Uint8Array(32);return o=oe(r,64),o[0]&=248,o[31]&=127,o[31]|=64,ye(A,o),ke(a,A),a}s(rn,"derivePublicFromSecret"),e.sign.keyPair=function(){var r=new Uint8Array(z),o=new Uint8Array(ae);return at(r,o),{publicKey:r,secretKey:o}},e.sign.keyPair.fromSecretKey=function(r){if(P(r),r.length!==ae)throw new Error("bad secret key size");var o=new Uint8Array(z);return o=rn(r),{publicKey:o,secretKey:new Uint8Array(r)}},e.sign.keyPair.fromSeed=function(r){if(P(r),r.length!==Ct)throw new Error("bad seed size");for(var o=new Uint8Array(z),A=new Uint8Array(ae),I=0;I<32;I++)A[I]=r[I];return at(o,A,!0),{publicKey:o,secretKey:A}},e.sign.publicKeyLength=z,e.sign.secretKeyLength=ae,e.sign.seedLength=Ct,e.sign.signatureLength=T,e.hash=function(r){P(r);var o=new Uint8Array(ut);return zt(o,r,r.length),o},e.hash.hashLength=ut,e.verify=function(r,o){return P(r,o),r.length===0||o.length===0||r.length!==o.length?!1:Ze(r,0,o,0,r.length)===0},e.setPRNG=function(r){g=r},function(){var r=typeof self<"u"?self.crypto||self.msCrypto:null;if(r&&r.getRandomValues){var o=65536;e.setPRNG(function(A,I){var a,c=new Uint8Array(I);for(a=0;a$n,construct_message_block_and_hash:()=>St,get_address_from_public_key:()=>De,get_private_key_from_seed:()=>pt,get_public_key_from_address:()=>he,get_public_key_from_private_key:()=>je,hash_block:()=>te,hex_to_uint8array:()=>D,int_to_uint8array:()=>zn,raw_to_whole:()=>_t,sign_block_hash:()=>ne,sign_message:()=>Dt,uint8array_to_base32:()=>dt,uint8array_to_hex:()=>ee,utf8_to_uint8array:()=>er,verify_block_hash:()=>nr,verify_signed_message:()=>Ui,whole_to_raw:()=>Se});var Je=on(Wn()),pe=on(Qt());var pi="0000000000000000000000000000000000000000000000000000000000000006",bt="62616E616E6F6D73672D",_e=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];function ee(e){let n="";for(let t=0;t0;f--)g-=t[n-f]*16**(2*(f-1));t[n-i]=Math.floor(g/16**(2*(i-1)))}return t}s(zn,"int_to_uint8array");var Zn=["1","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","m","n","o","p","q","r","s","t","u","w","x","y","z"];function dt(e){let n="";for(let t=0;t=5)y=e[g]>>w-5&31;else{let x=5-w;y=(e[g]<>8-x&2**(8-x)-1)}n+=Zn[y]}return n}s(dt,"uint8array_to_base32");function Si(e,n){let t="",i=e;for(let g=0;g=2**(n-1-g)?(t+="1",i-=2**(n-1-g)):t+="0";return t}s(Si,"int_to_binary");function Di(e){let n=0;for(let t=0;tSi(Zn.indexOf(i),5)).join(""),t=new Uint8Array(Math.ceil(e.length*5/8));for(let i=0;in-i[1].length)throw Error(`Too many decimals, cannot exceed ${n}`);t=BigInt(i[0])*BigInt(10)**BigInt(n)+BigInt(i[1])*BigInt(10)**BigInt(n-i[1].length)}else t=BigInt(e)*BigInt(10)**BigInt(n);return t}s(Se,"whole_to_raw");function _t(e,n=tr){let t=e.toString(),i;if(t.length>n)i=t.slice(0,-n)+"."+t.slice(-n);else{let f=n-t.length;i="0."+"0".repeat(f>0?f:0)+t}let g=i.length;for(let f=0;fqe,RPCWithBackup:()=>Ut});var qe=class{constructor(n,t=!1){this.DECIMALS=void 0;this.debug=!1;this.rpc_url=n,this.use_pending=t}static{s(this,"RPC")}async call(n){this.debug&&console.log(JSON.stringify(n));let t=await fetch(this.rpc_url,{method:"POST",headers:this.headers??{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!t.ok&&this.debug&&console.log(await t.text()),!t.ok)throw Error(`Request to RPC node failed with status code ${t.status}`);let i=await t.json();if(i.error)throw Error(`RPC node response: ${i.error}`);return i}async get_block_count(){return await this.call({action:"block_count"})}async get_block_info(n){return await this.call({action:"block_info",hash:n,json_block:!0})}async get_blocks(n){return await this.call({action:"blocks",hashes:n,json_block:!0})}async get_blocks_info(n){return await this.call({action:"blocks_info",hashes:n,json_block:!0})}async get_representatives(){return await this.call({action:"representatives"})}async get_representatives_online(n){return await this.call({action:"representatives_online",weight:n?"true":void 0})}async get_account_history(n,t,i,g,f,y,w){return await this.call({action:"account_history",account:n,count:`${t}`,raw:i?"true":void 0,head:g,offset:f?`${f}`:void 0,reverse:y?"true":void 0,account_filter:w})}async get_account_info(n,t,i,g,f){return await this.call({action:"account_info",account:n,representative:i?"true":void 0,weight:g?"true":void 0,pending:f?"true":void 0})}async get_account_balance(n){return await this.call({action:"account_balance",account:n})}async get_accounts_balances(n){return await this.call({action:"accounts_balances",accounts:n})}async get_account_representative(n){return await this.call({action:"account_representative",account:n})}async get_accounts_representatives(n){return await this.call({action:"accounts_representatives",account:n})}async get_account_weight(n){return await this.call({action:"account_weight",account:n})}async get_account_receivable(n,t,i,g){return await this.call({action:this.use_pending?"pending":"receivable",account:n,count:t?`${t}`:void 0,threshold:i?Se(i,this.DECIMALS).toString():void 0,source:g?"true":void 0})}async get_delegators(n,t,i,g){return await this.call({action:"delegators",account:n,threshold:t?`${t}`:void 0,count:i?`${i}`:void 0,start:g})}async get_delegators_count(n){return await this.call({action:"account_weight",account:n})}},Ut=class extends qe{static{s(this,"RPCWithBackup")}constructor(n,t,i=!1){if(n.length<2)throw Error("Must provide at least two RPC URLs");super(n[0],i),this.rpc_urls=n,this.timeout=t}async call(n){let t=0;for(;;)try{let i=await fetch(this.rpc_urls[t],{method:"POST",headers:this.headers??{"Content-Type":"application/json"},body:JSON.stringify(n),signal:AbortSignal.timeout(this.timeout)});if(!i.ok)throw Error(`Request to RPC node failed with status code ${i.status}`);let g=await i.json();if(g.error)throw Error(`RPC node response: ${g.error}`);return g}catch(i){if(!this.rpc_urls[++t])throw Error(i)}}};var Ft={};Me(Ft,{PrivateKeyAccount:()=>vt,Wallet:()=>We});var We=class e{constructor(n,t,i=0,g){this.add_do_work=!0;if(this.rpc=n,typeof t!="string"||t?.length!==64)throw Error("Seed needs to be 64 character (hex) string");this.seed=t,this.index=i,this.work_function=g}static{s(this,"Wallet")}static gen_random_wallet(n){let t=new Uint8Array(32);crypto.getRandomValues(t);let i=ee(t);return new e(n,i)}get private_key(){return pt(this.seed,this.index)}get public_key(){return je(this.private_key)}get address(){return De(this.public_key)}async send_process(n,t){return(await this.rpc.call({action:"process",json_block:"true",subtype:t,block:n,do_work:!n.work&&this.add_do_work?!0:void 0})).hash}async send(n,t,i,g,f){let y=Se(t,this.rpc.DECIMALS),w=f??await this.get_account_info(void 0,!0),x=he(n);g||(g=w.representative);let b=BigInt(w.balance),_=b-y;if(_<0n)throw Error(`Insufficient funds to send. Cannot send more than balance; ie, Before balance (raw: ${b}) less than send amount (raw: ${y})`);let S={type:"state",account:this.address,previous:w.frontier,representative:g,balance:_.toString(),link:x,link_as_account:n},m=te(S),j;i&&(j=await this.work_function(m));let fe=ne(this.private_key,m),X={...S,signature:fe,work:j};return await this.send_process(X,"send")}async send_all(n,t,i){let g=await this.get_account_info(void 0,!0);return await this.send(n,_t(BigInt(g.balance),this.rpc.DECIMALS),t,i,g)}async receive(n,t,i){let g=await this.rpc.get_block_info(n),f=0n;i||(i=this.address);let y;try{let m=await this.get_account_info(void 0,!0);y=m.frontier,i=m.representative,f=BigInt(m.balance)}catch{y="0".repeat(64)}let w={type:"state",account:this.address,previous:y,representative:i,balance:(f+BigInt(g.amount)).toString(),link:n},x=te(w),b;t&&(b=await this.work_function(x));let _=ne(this.private_key,x),S={...w,signature:_,work:b};return await this.send_process(S,"receive")}async receive_all(n=20,t,i){let g=(await this.get_account_receivable(n,t,!0)).blocks,f,y,w;try{let b=await this.get_account_info(void 0,!0);f=b.frontier,y=b.representative,w=BigInt(b.balance)}catch{f="0".repeat(64),y=this.address,w=BigInt(0)}let x=[];for(let b of Object.keys(g)){let _=(w+BigInt(g[b].amount)).toString(),S={type:"state",account:this.address,previous:f,representative:y,balance:_,link:b},m=te(S),j;i&&(j=await this.work_function(m));let fe=ne(this.private_key,m),X={...S,signature:fe,work:j};await this.send_process(X,"receive"),x.push(m),f=m,w=BigInt(_)}return x}async change_representative(n,t){let i=await this.get_account_info(),g={type:"state",account:this.address,previous:i.frontier,representative:n,balance:i.balance,link:"0".repeat(64)},f=te(g),y;t&&(y=await this.work_function(f));let w=ne(this.private_key,f),x={...g,signature:w,work:y};return await this.send_process(x,"change")}async change_rep(n,t){return await this.change_representative(n,t)}async get_account_info(n,t,i,g){return await this.rpc.get_account_info(this.address,n,t,i,g)}async get_account_receivable(n,t,i){return await this.rpc.get_account_receivable(this.address,n,t,i)}sign_message(n){return Dt(this.private_key,n)}},vt=class extends We{static{s(this,"PrivateKeyAccount")}constructor(n,t,i){if(typeof t!="string"||t?.length!==64)throw Error("Priv key needs to be 64 character (hex) string");super(n,t,0,i),this._private_key=t}get private_key(){return this._private_key}};var Kt={};Me(Kt,{RPCWorkProvider:()=>Pt});var Pt=class{constructor(n){this.extra_payload={};this.rpc=n}static{s(this,"RPCWorkProvider")}async request_work(n){return(await this.rpc.call({action:"work_generate",hash:n,...this.extra_payload})).work}};window.banani={...Xe,...mt,...Ft,...Kt};})(); //!!! BANANO CHANGE: we are replacing the below line with blake2b //!!! BANANO CHANGE: below line commented out //!!! BANANO CHANGE: Changed hashing to blake2b, and the derive pk thing +//!!! BANANO CHANGE //!!! BANANO CHANGE: New function. I don't know what's going on, just looking at what bananojs changed //!!! BANANO CHANGE: we are replacing the below line with other... math stuff. Again, I don't know what's going on, just looking at what bananojs changed diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 1a9956c..9fd7ed2 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA5WX32+bMBCA/xeeq3XN1i7rW5NparVpi9pKeagm5MABVhxAtskPTfvfZyANBhufeeW+++6wfQ55+xtIOMrgPlhxuicSfsDpIYqKKpfBVVASmalQxIgQIK4N5EMmd0xxW5rHwf3NbP7v6uJ7Xi1Ng3qI5KypzBYk2lalNbsLY56Cb1e82NMYuN2kAS7XmjAGlsVon7syz4u0IIzkEfTWg+YSeEIi5TGovnJ2e2cqH6mQBT8tWBFtXVKd89cinXbUBCU5+Db7jk6Se7bcgB7ipzwpEOUZ8ZA9QwRqbjYMOwI9cJL4pag4esIs+KQirxkHkRUs9q6jZ3iVKhUPuSSS7vG3GcAeBdZA00wi4gvkIRTnqRWIU+d8tP2XQ+0m7ioyPojo3DXAsln+kZZ6BKpyzZkOoKJfxQtNcyIrDuMyDUKFAm1N+PY2un2XqEvxDRikRN1ewrnuJuYnxX2ISoWf3tOsJh1wivqH+HfOaD56CYzBkwu4rwR3yoRingUQqf2bRtONf9MM7pk4VmVF55Cnsr5P2seDzI9fv9zczszsFYeEHkccbRAzNRPwwNhrnTo09YJepgURNBp3dWEv2yMRmdVTB7wMP9UIRafxhrS4l+9FHRNYZiRPYVw6hPzM1aZW2IVtDPOs1Q+9IWgeopnq1H6v8kjSIjcEWgzzbIiAT7NQFmGlZmJOOCenzpecLeLaxvXdd581bQoyJO2pDhNe7MKy2jAahVuw2h04UqRs/17VZJspAOKxElYYK3DppE0hw2tgUMKOTyyiNepbSEtxFMvUGIab/sdM5+2iLgUc8eNiQA6hYnChATmEnBxq9tAfrs6lxx0aoT582tUIs9611pkGCCbbqZNAUmtPetyh6d6/foN2KG06G+etVZuHOxXkEspkjm+qSTmUe+A0OSEbYkAOYbP/dXl1HmwuPW5o/vwHNT4giAUSAAA=" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA5WXbU/bMBCA/0s/ozG6wdi+UaYJtGmrAKkfpilynUtj1TiV7RSqaf99ThMaJ34552vuuef8cmfK778zDa969mW2lGxPNHyHww2lVS307Gy2I7o0IcqJUqDOHeRdqZ+54bZM5LMvF/Prf2cn38Py1jWYj0jOiulyQei23nmz+zDmqeR2Kas9y0H6TRYQc60I5+A5jPZ7LLM7pAXhRFAYnAcTGmRBqPE41FA5v7xylXdM6UoeFryi25jU5tK1yEp7aoKSvKQu9g2dJE9c8hFMEN+LokKUHZIgewAKZm7WHGuBAThJ/FjVEu0wDz6pyFMpQZUVz5Pr2BlJpXaGB6GJZnt8NyM4ocAK2KbUiPgEJQhVN7UKcdpcina4OdTu4rEi4UFE5+4I3B6PP7CkAYGqYnNmA6joZ/XINoLoWkJYZkGoUKFLU6lrC17fKRpTfAUOG2JeLxU9dxdLk+I+RGXC929pXpMNREXDJv4lOBPBRyAETy4QfxLiKROKJRZApP7fNJYu/Jtm9M7kuSmreoc+7Jr3pP08ynz/+dPF5dzNXkoo2GvA0QYx03ECbjh/alLHpkEwybQgitGwqw8n2e6IKr2eJpBk+GFGiB7CC7LiSb5H0yZwWxKxgbB0DKWZ63Wj8AvbGOZZmT/0juD4Ec00XfutFlSzSjgCK4Z51kTBh3mmq6w2M3FNpCSH3ld0FnXu44buq4+WlpocLWuqs2fT2GQD2bo5loyIPCsHPdKXwHIi5TagM9IOUVbI6jnb1WvOaLYF72YiOFJk1/4315BtpgLIQyW8MFbgtJI2hYxfnVEJPz6xiLXQ1EJWSqRYc23tLfq8fTSmgFe8Ox0oIjQMLnSgiFCSl4Z9Gc5y77LjEY0yv7O6jg9NyAjBZN0YBU1dPKLp99/soH0DfDofl6w1l4c7DRQT6uIav1SXiij3IFlxQC7EgXBhc/KQx+7GC0bEx8Zq9mUazeez447mz3/hgMFozRIAAA==" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index ef34241..8715f22 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/PrivateKeyAccount.html b/docs/classes/PrivateKeyAccount.html index 368d168..ac1275d 100644 --- a/docs/classes/PrivateKeyAccount.html +++ b/docs/classes/PrivateKeyAccount.html @@ -1,5 +1,5 @@ PrivateKeyAccount | banani

Class PrivateKeyAccount

Does everything a Wallet can do, except a private key is put in instead of a seed, and so limited to one address. Means changing .index will not do anything obviously.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

Constructors

Properties

_private_key: string
add_do_work: boolean = true
index: number

Seed index. Seeds can have multiple private keys and addresses

-
seed: string
work_function?: WorkFunction

Accessors

  • get address(): `ban_${string}` | `nano_${string}`
  • Returns `ban_${string}` | `nano_${string}`

  • get private_key(): string
  • Returns string

  • get public_key(): string
  • Returns string

Methods

  • Parameters

    • new_representative: `ban_${string}` | `nano_${string}`
    • Optional work: boolean

    Returns Promise<string>

  • Parameters

    • Optional new_representative: `ban_${string}` | `nano_${string}`

      banano address to change representative to

      +
    • Optional work_function: WorkFunction

    Returns PrivateKeyAccount

Properties

_private_key: string
add_do_work: boolean = true
index: number

Seed index. Seeds can have multiple private keys and addresses

+
seed: string
work_function?: WorkFunction

Accessors

  • get address(): `ban_${string}` | `nano_${string}`
  • Returns `ban_${string}` | `nano_${string}`

  • get private_key(): string
  • Returns string

  • get public_key(): string
  • Returns string

Methods

  • Parameters

    • new_representative: `ban_${string}` | `nano_${string}`
    • Optional work: boolean

    Returns Promise<string>

  • Parameters

    • Optional new_representative: `ban_${string}` | `nano_${string}`

      banano address to change representative to

    • Optional gen_work: boolean

      whether or not to call work function to generate work

      -

    Returns Promise<string>

  • Parameters

    • Optional include_confirmed: boolean
    • Optional representative: boolean
    • Optional weight: boolean
    • Optional pending: boolean

    Returns Promise<AccountInfoRPC>

  • Parameters

    • Optional block_hash: string

      send block to receive

      +

    Returns Promise<string>

  • Parameters

    • Optional include_confirmed: boolean
    • Optional representative: boolean
    • Optional weight: boolean
    • Optional pending: boolean

    Returns Promise<AccountInfoRPC>

  • Parameters

    • Optional block_hash: string

      send block to receive

    • Optional gen_work: boolean

      whether or not to call work function to generate work

    • Optional representative: `ban_${string}` | `nano_${string}`

      optionally provide a representative if you do not want to use the current representative receive bananos from a specific send block

      -

    Returns Promise<string>

  • Parameters

    • Optional count: number = 20

      Max amount of blocks to receive +

    Returns Promise<string>

  • Parameters

    • Optional count: number = 20

      Max amount of blocks to receive receive all (up to count and exceeding threshold if applicable) receivable blocks

    • Optional threshold: `${number}`

      Min amount of Banano to receive in whole

    • Optional gen_work: boolean

      whether or not to call work function to generate work Receive all receivable transactions (up to count, and over threshold

      -

    Returns Promise<string[]>

  • Parameters

    • Optional to: `ban_${string}` | `nano_${string}`

      address to send to

      +

    Returns Promise<string[]>

  • Parameters

    • Optional to: `ban_${string}` | `nano_${string}`

      address to send to

    • Optional amount: `${number}`

      amount in whole bananos to send

    • Optional gen_work: boolean

      whether or not to call work function to generate work

    • Optional representative: `ban_${string}` | `nano_${string}`

      optionally provide a representative if you do not want to use the current representative

    • Optional cached_account_info: AccountInfoRPC

      can save one rpc call in some cases. Mostly for internal use. Make sure that in the RPC call, "representative" is "true" Send Bananos

      -

    Returns Promise<string>

  • Parameters

    • to: `ban_${string}` | `nano_${string}`
    • Optional work: boolean
    • Optional representative: `ban_${string}` | `nano_${string}`

    Returns Promise<string>

\ No newline at end of file +

Returns Promise<string>

  • Parameters

    • to: `ban_${string}` | `nano_${string}`
    • Optional work: boolean
    • Optional representative: `ban_${string}` | `nano_${string}`

    Returns Promise<string>

\ No newline at end of file diff --git a/docs/classes/RPC.html b/docs/classes/RPC.html index c7ba10b..862c588 100644 --- a/docs/classes/RPC.html +++ b/docs/classes/RPC.html @@ -1,5 +1,5 @@ RPC | banani

Class RPC

Sends RPC requests to the RPC node, also has wrappers for actions that only read the network (write actions are handled by the Wallet class)

-

Hierarchy (view full)

Implements

Constructors

Hierarchy (view full)

Implements

Constructors

  • Parameters

    • rpc_url: string
    • Optional use_pending: boolean = false

      If true, uses "pending" instead of "receivable" in RPC action names, for compatibility with older versions of the node

      -

    Returns RPC

Properties

DECIMALS: any = undefined
debug: boolean = false
headers: Record<string, string>

HTTP headers to send with any RPC requests, defaults to { "Content-Type": "application/json" }

-
rpc_url: string
use_pending: boolean

Methods

  • The function that sends the RPC POST request

    -

    Parameters

    • payload: Record<string, any>

    Returns Promise<Record<string, any>>

\ No newline at end of file +

Returns RPC

Properties

DECIMALS: any = undefined
debug: boolean = false
headers: Record<string, string>

HTTP headers to send with any RPC requests, defaults to { "Content-Type": "application/json" }

+
rpc_url: string
use_pending: boolean

Methods

  • The function that sends the RPC POST request

    +

    Parameters

    • payload: Record<string, any>

    Returns Promise<Record<string, any>>

\ No newline at end of file diff --git a/docs/classes/RPCWithBackup.html b/docs/classes/RPCWithBackup.html index c7a91e9..bb84ad4 100644 --- a/docs/classes/RPCWithBackup.html +++ b/docs/classes/RPCWithBackup.html @@ -1,5 +1,5 @@ RPCWithBackup | banani

Class RPCWithBackup

Sends RPC requests to the RPC node, also has wrappers for actions that only read the network (write actions are handled by the Wallet class)

-

Hierarchy (view full)

  • RPC
    • RPCWithBackup

Constructors

Hierarchy (view full)

  • RPC
    • RPCWithBackup

Constructors

  • Parameters

    • rpc_urls: string[]
    • Optional timeout: number

      Request to RPC timeout, in milliseconds. If RPC request fails or timeouts, tries the next RPC

      -
    • use_pending: boolean = false

    Returns RPCWithBackup

Properties

DECIMALS: any = undefined
debug: boolean = false
headers: Record<string, string>

HTTP headers to send with any RPC requests, defaults to { "Content-Type": "application/json" }

-
rpc_url: string
rpc_urls: string[]
timeout: number
use_pending: boolean

Methods

  • The function that sends the RPC POST request

    -

    Parameters

    • payload: Record<string, any>

    Returns Promise<Record<string, any>>

\ No newline at end of file +
  • use_pending: boolean = false
  • Returns RPCWithBackup

    Properties

    DECIMALS: any = undefined
    debug: boolean = false
    headers: Record<string, string>

    HTTP headers to send with any RPC requests, defaults to { "Content-Type": "application/json" }

    +
    rpc_url: string
    rpc_urls: string[]
    timeout: number
    use_pending: boolean

    Methods

    • The function that sends the RPC POST request

      +

      Parameters

      • payload: Record<string, any>

      Returns Promise<Record<string, any>>

    \ No newline at end of file diff --git a/docs/classes/RPCWorkProvider.html b/docs/classes/RPCWorkProvider.html index 56ae31f..1e7156b 100644 --- a/docs/classes/RPCWorkProvider.html +++ b/docs/classes/RPCWorkProvider.html @@ -1,6 +1,6 @@ -RPCWorkProvider | banani

    Class RPCWorkProvider

    Constructors

    constructor +RPCWorkProvider | banani

    Class RPCWorkProvider

    Constructors

    Properties

    Methods

    Constructors

    Properties

    extra_payload: Record<string, any> = {}

    Extra json to send with the rpc payload. Needed for rpc.nano.to's work_generate, unfortunately

    -
    rpc: RPC

    Methods

    • Parameters

      • block_hash: string

      Returns Promise<string>

    \ No newline at end of file +

    Constructors

    Properties

    extra_payload: Record<string, any> = {}

    Extra json to send with the rpc payload. Needed for rpc.nano.to's work_generate, unfortunately

    +
    rpc: RPC

    Methods

    • Parameters

      • block_hash: string

      Returns Promise<string>

    \ No newline at end of file diff --git a/docs/classes/Wallet.html b/docs/classes/Wallet.html index ac774f8..608a725 100644 --- a/docs/classes/Wallet.html +++ b/docs/classes/Wallet.html @@ -1,5 +1,5 @@ Wallet | banani

    Class Wallet

    wallets are created from seeds, so they can have multiple addresses by changing the index. use wallets to "write" (send, receive, change rep) to the network

    -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    Constructors

    • Parameters

      • rpc: RPCInterface
      • Optional seed: string

        Seed for the wallet from which private keys are derived. 64 character hex string (32 bytes)

        -
      • index: number = 0
      • Optional work_function: WorkFunction

      Returns Wallet

    Properties

    add_do_work: boolean = true
    index: number

    Seed index. Seeds can have multiple private keys and addresses

    -
    seed: string
    work_function?: WorkFunction

    Accessors

    • get address(): `ban_${string}` | `nano_${string}`
    • Returns `ban_${string}` | `nano_${string}`

    • get private_key(): string
    • Returns string

    • get public_key(): string
    • Returns string

    Methods

    • Parameters

      • new_representative: `ban_${string}` | `nano_${string}`
      • Optional work: boolean

      Returns Promise<string>

    • Parameters

      • Optional new_representative: `ban_${string}` | `nano_${string}`

        banano address to change representative to

        +
      • index: number = 0
      • Optional work_function: WorkFunction

      Returns Wallet

    Properties

    add_do_work: boolean = true
    index: number

    Seed index. Seeds can have multiple private keys and addresses

    +
    seed: string
    work_function?: WorkFunction

    Accessors

    • get address(): `ban_${string}` | `nano_${string}`
    • Returns `ban_${string}` | `nano_${string}`

    • get private_key(): string
    • Returns string

    • get public_key(): string
    • Returns string

    Methods

    • Parameters

      • new_representative: `ban_${string}` | `nano_${string}`
      • Optional work: boolean

      Returns Promise<string>

    • Parameters

      • Optional new_representative: `ban_${string}` | `nano_${string}`

        banano address to change representative to

      • Optional gen_work: boolean

        whether or not to call work function to generate work

        -

      Returns Promise<string>

    • Parameters

      • Optional include_confirmed: boolean
      • Optional representative: boolean
      • Optional weight: boolean
      • Optional pending: boolean

      Returns Promise<AccountInfoRPC>

    • Parameters

      • Optional block_hash: string

        send block to receive

        +

      Returns Promise<string>

    • Parameters

      • Optional include_confirmed: boolean
      • Optional representative: boolean
      • Optional weight: boolean
      • Optional pending: boolean

      Returns Promise<AccountInfoRPC>

    • Parameters

      • Optional block_hash: string

        send block to receive

      • Optional gen_work: boolean

        whether or not to call work function to generate work

      • Optional representative: `ban_${string}` | `nano_${string}`

        optionally provide a representative if you do not want to use the current representative receive bananos from a specific send block

        -

      Returns Promise<string>

    • Parameters

      • Optional count: number = 20

        Max amount of blocks to receive +

      Returns Promise<string>

    • Parameters

      • Optional count: number = 20

        Max amount of blocks to receive receive all (up to count and exceeding threshold if applicable) receivable blocks

      • Optional threshold: `${number}`

        Min amount of Banano to receive in whole

      • Optional gen_work: boolean

        whether or not to call work function to generate work Receive all receivable transactions (up to count, and over threshold

        -

      Returns Promise<string[]>

    • Parameters

      • Optional to: `ban_${string}` | `nano_${string}`

        address to send to

        +

      Returns Promise<string[]>

    • Parameters

      • Optional to: `ban_${string}` | `nano_${string}`

        address to send to

      • Optional amount: `${number}`

        amount in whole bananos to send

      • Optional gen_work: boolean

        whether or not to call work function to generate work

      • Optional representative: `ban_${string}` | `nano_${string}`

        optionally provide a representative if you do not want to use the current representative

      • Optional cached_account_info: AccountInfoRPC

        can save one rpc call in some cases. Mostly for internal use. Make sure that in the RPC call, "representative" is "true" Send Bananos

        -

      Returns Promise<string>

    • Parameters

      • to: `ban_${string}` | `nano_${string}`
      • Optional work: boolean
      • Optional representative: `ban_${string}` | `nano_${string}`

      Returns Promise<string>

    • Parameters

      • message: string

      Returns string

    \ No newline at end of file +

    Returns Promise<string>

    • Parameters

      • to: `ban_${string}` | `nano_${string}`
      • Optional work: boolean
      • Optional representative: `ban_${string}` | `nano_${string}`

      Returns Promise<string>

    • Parameters

      • message: string

      Returns string

    \ No newline at end of file diff --git a/docs/functions/base32_to_uint8array.html b/docs/functions/base32_to_uint8array.html index 9771e67..056718f 100644 --- a/docs/functions/base32_to_uint8array.html +++ b/docs/functions/base32_to_uint8array.html @@ -1 +1 @@ -base32_to_uint8array | banani

    Function base32_to_uint8array

    • Parameters

      • base32: string

      Returns Uint8Array

    \ No newline at end of file +base32_to_uint8array | banani

    Function base32_to_uint8array

    • Parameters

      • base32: string

      Returns Uint8Array

    \ No newline at end of file diff --git a/docs/functions/construct_message_block_and_hash.html b/docs/functions/construct_message_block_and_hash.html new file mode 100644 index 0000000..e846d94 --- /dev/null +++ b/docs/functions/construct_message_block_and_hash.html @@ -0,0 +1,2 @@ +construct_message_block_and_hash | banani

    Function construct_message_block_and_hash

    • For use in sign_message and verify_signed_message

      +

      Parameters

      • address: `ban_${string}` | `nano_${string}`
      • message: string
      • preamble: string = MESSAGE_PREAMBLE

      Returns string

    \ No newline at end of file diff --git a/docs/functions/get_address_from_public_key.html b/docs/functions/get_address_from_public_key.html index 4399618..8bc8bcf 100644 --- a/docs/functions/get_address_from_public_key.html +++ b/docs/functions/get_address_from_public_key.html @@ -1 +1 @@ -get_address_from_public_key | banani

    Function get_address_from_public_key

    \ No newline at end of file +get_address_from_public_key | banani

    Function get_address_from_public_key

    \ No newline at end of file diff --git a/docs/functions/get_private_key_from_seed.html b/docs/functions/get_private_key_from_seed.html index 9182ae9..1607e08 100644 --- a/docs/functions/get_private_key_from_seed.html +++ b/docs/functions/get_private_key_from_seed.html @@ -1 +1 @@ -get_private_key_from_seed | banani

    Function get_private_key_from_seed

    • Parameters

      • seed: string
      • index: number

      Returns string

    \ No newline at end of file +get_private_key_from_seed | banani

    Function get_private_key_from_seed

    • Parameters

      • seed: string
      • index: number

      Returns string

    \ No newline at end of file diff --git a/docs/functions/get_public_key_from_address.html b/docs/functions/get_public_key_from_address.html index 6ddc116..4ee2bcd 100644 --- a/docs/functions/get_public_key_from_address.html +++ b/docs/functions/get_public_key_from_address.html @@ -1 +1 @@ -get_public_key_from_address | banani

    Function get_public_key_from_address

    • Parameters

      • address: `ban_${string}` | `nano_${string}`

      Returns string

    \ No newline at end of file +get_public_key_from_address | banani

    Function get_public_key_from_address

    • Parameters

      • address: `ban_${string}` | `nano_${string}`

      Returns string

    \ No newline at end of file diff --git a/docs/functions/get_public_key_from_private_key.html b/docs/functions/get_public_key_from_private_key.html index 8227aec..5c074bf 100644 --- a/docs/functions/get_public_key_from_private_key.html +++ b/docs/functions/get_public_key_from_private_key.html @@ -1 +1 @@ -get_public_key_from_private_key | banani

    Function get_public_key_from_private_key

    • Parameters

      • private_key: string

      Returns string

    \ No newline at end of file +get_public_key_from_private_key | banani

    Function get_public_key_from_private_key

    • Parameters

      • private_key: string

      Returns string

    \ No newline at end of file diff --git a/docs/functions/hash_block.html b/docs/functions/hash_block.html index 6f38600..eb3f958 100644 --- a/docs/functions/hash_block.html +++ b/docs/functions/hash_block.html @@ -1 +1 @@ -hash_block | banani

    Function hash_block

    \ No newline at end of file +hash_block | banani

    Function hash_block

    \ No newline at end of file diff --git a/docs/functions/hex_to_uint8array.html b/docs/functions/hex_to_uint8array.html index c98345e..7f7d186 100644 --- a/docs/functions/hex_to_uint8array.html +++ b/docs/functions/hex_to_uint8array.html @@ -1 +1 @@ -hex_to_uint8array | banani

    Function hex_to_uint8array

    • Parameters

      • hex: string

      Returns Uint8Array

    \ No newline at end of file +hex_to_uint8array | banani

    Function hex_to_uint8array

    • Parameters

      • hex: string

      Returns Uint8Array

    \ No newline at end of file diff --git a/docs/functions/int_to_uint8array.html b/docs/functions/int_to_uint8array.html index 0ecd974..931de6c 100644 --- a/docs/functions/int_to_uint8array.html +++ b/docs/functions/int_to_uint8array.html @@ -1 +1 @@ -int_to_uint8array | banani

    Function int_to_uint8array

    • Parameters

      • int: number
      • len: number

      Returns Uint8Array

    \ No newline at end of file +int_to_uint8array | banani

    Function int_to_uint8array

    • Parameters

      • int: number
      • len: number

      Returns Uint8Array

    \ No newline at end of file diff --git a/docs/functions/raw_to_whole.html b/docs/functions/raw_to_whole.html index 7d1b523..6bf75eb 100644 --- a/docs/functions/raw_to_whole.html +++ b/docs/functions/raw_to_whole.html @@ -1,2 +1,2 @@ raw_to_whole | banani

    Function raw_to_whole

    • Turn raw Bananos (bigint) into whole Bananos (string)

      -

      Parameters

      • raw: bigint
      • decimals: number = BANANO_DECIMALS

      Returns Whole

    \ No newline at end of file +

    Parameters

    • raw: bigint
    • decimals: number = BANANO_DECIMALS

    Returns Whole

    \ No newline at end of file diff --git a/docs/functions/sign_block_hash.html b/docs/functions/sign_block_hash.html index d653efd..4247c65 100644 --- a/docs/functions/sign_block_hash.html +++ b/docs/functions/sign_block_hash.html @@ -1 +1 @@ -sign_block_hash | banani

    Function sign_block_hash

    • Parameters

      • private_key: string
      • block_hash: string

      Returns string

    \ No newline at end of file +sign_block_hash | banani

    Function sign_block_hash

    • Parameters

      • private_key: string
      • block_hash: string

      Returns string

    \ No newline at end of file diff --git a/docs/functions/sign_message.html b/docs/functions/sign_message.html index f3304cf..1c32dd9 100644 --- a/docs/functions/sign_message.html +++ b/docs/functions/sign_message.html @@ -1,3 +1,3 @@ -sign_message | banani

    Function sign_message

    • sign message by constructing a dummy block with the message (why not just sign the message itself instead of putting it in a dummy block? ledger support). This is already the standard across Banano services and wallets which support signing so please don't invent your own scheme

      +sign_message | banani

      Function sign_message

      • Sign message by constructing a dummy block with the message (why not just sign the message itself instead of putting it in a dummy block? ledger support). This is already the standard across Banano services and wallets which support signing so please don't invent your own scheme

        Parameters

        • private_key: string
        • message: string
        • preamble: string = MESSAGE_PREAMBLE

        Returns string

        The signature in hex

        -
      \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/functions/uint8array_to_base32.html b/docs/functions/uint8array_to_base32.html index 20703a6..9bed12f 100644 --- a/docs/functions/uint8array_to_base32.html +++ b/docs/functions/uint8array_to_base32.html @@ -1 +1 @@ -uint8array_to_base32 | banani

    Function uint8array_to_base32

    • Parameters

      • uint8array: Uint8Array

      Returns string

    \ No newline at end of file +uint8array_to_base32 | banani

    Function uint8array_to_base32

    • Parameters

      • uint8array: Uint8Array

      Returns string

    \ No newline at end of file diff --git a/docs/functions/uint8array_to_hex.html b/docs/functions/uint8array_to_hex.html index baea269..87c6d47 100644 --- a/docs/functions/uint8array_to_hex.html +++ b/docs/functions/uint8array_to_hex.html @@ -1 +1 @@ -uint8array_to_hex | banani

    Function uint8array_to_hex

    • Parameters

      • uint8array: Uint8Array

      Returns string

    \ No newline at end of file +uint8array_to_hex | banani

    Function uint8array_to_hex

    • Parameters

      • uint8array: Uint8Array

      Returns string

    \ No newline at end of file diff --git a/docs/functions/utf8_to_uint8array.html b/docs/functions/utf8_to_uint8array.html index b3607fa..fcf0517 100644 --- a/docs/functions/utf8_to_uint8array.html +++ b/docs/functions/utf8_to_uint8array.html @@ -1 +1 @@ -utf8_to_uint8array | banani

    Function utf8_to_uint8array

    • Parameters

      • utf8: string

      Returns Uint8Array

    \ No newline at end of file +utf8_to_uint8array | banani

    Function utf8_to_uint8array

    • Parameters

      • utf8: string

      Returns Uint8Array

    \ No newline at end of file diff --git a/docs/functions/verify_block_hash.html b/docs/functions/verify_block_hash.html index 996feb5..9ddb684 100644 --- a/docs/functions/verify_block_hash.html +++ b/docs/functions/verify_block_hash.html @@ -1,2 +1,2 @@ verify_block_hash | banani

    Function verify_block_hash

    • Make sure the alleged signature for a block hash is valid

      -

      Parameters

      • public_key: string
      • signature: string
      • block_hash: string

      Returns boolean

    \ No newline at end of file +

    Parameters

    • public_key: string
    • signature: string
    • block_hash: string

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/verify_signed_message.html b/docs/functions/verify_signed_message.html new file mode 100644 index 0000000..f19cd83 --- /dev/null +++ b/docs/functions/verify_signed_message.html @@ -0,0 +1,3 @@ +verify_signed_message | banani

    Function verify_signed_message

    • Use to verify message signatures. A wrapper for verify_block_hash

      +

      Parameters

      • address: `ban_${string}` | `nano_${string}`
      • message: string
      • signature: string
      • preamble: string = MESSAGE_PREAMBLE

      Returns boolean

      Whether the message signature was actually signed by that address

      +
    \ No newline at end of file diff --git a/docs/functions/whole_to_raw.html b/docs/functions/whole_to_raw.html index 79e2f05..bcf8648 100644 --- a/docs/functions/whole_to_raw.html +++ b/docs/functions/whole_to_raw.html @@ -1,2 +1,2 @@ whole_to_raw | banani

    Function whole_to_raw

    • Turn whole Bananos (string) into raw Bananos (bigint)

      -

      Parameters

      • whole: `${number}`
      • decimals: number = BANANO_DECIMALS

      Returns bigint

    \ No newline at end of file +

    Parameters

    • whole: `${number}`
    • decimals: number = BANANO_DECIMALS

    Returns bigint

    \ No newline at end of file diff --git a/docs/interfaces/AccountBalanceRPC.html b/docs/interfaces/AccountBalanceRPC.html index 26a3100..c61d2ca 100644 --- a/docs/interfaces/AccountBalanceRPC.html +++ b/docs/interfaces/AccountBalanceRPC.html @@ -1,4 +1,4 @@ -AccountBalanceRPC | banani

    Interface AccountBalanceRPC

    interface AccountBalanceRPC {
        balance: `${number}`;
        pending: `${number}`;
        receivable?: `${number}`;
    }

    Properties

    balance +AccountBalanceRPC | banani

    Interface AccountBalanceRPC

    interface AccountBalanceRPC {
        balance: `${number}`;
        pending: `${number}`;
        receivable?: `${number}`;
    }

    Properties

    balance: `${number}`
    pending: `${number}`
    receivable?: `${number}`
    \ No newline at end of file +

    Properties

    balance: `${number}`
    pending: `${number}`
    receivable?: `${number}`
    \ No newline at end of file diff --git a/docs/interfaces/AccountHistoryBlock.html b/docs/interfaces/AccountHistoryBlock.html index dee71a3..5ab5996 100644 --- a/docs/interfaces/AccountHistoryBlock.html +++ b/docs/interfaces/AccountHistoryBlock.html @@ -1,8 +1,8 @@ -AccountHistoryBlock | banani

    Interface AccountHistoryBlock

    interface AccountHistoryBlock {
        account: `ban_${string}` | `nano_${string}`;
        amount: `${number}`;
        confirmed: boolean;
        hash: string;
        height: `${number}`;
        local_timestamp: `${number}`;
        type: BlockStateChangeTypes;
    }

    Properties

    account +AccountHistoryBlock | banani

    Interface AccountHistoryBlock

    interface AccountHistoryBlock {
        account: `ban_${string}` | `nano_${string}`;
        amount: `${number}`;
        confirmed: boolean;
        hash: string;
        height: `${number}`;
        local_timestamp: `${number}`;
        type: BlockStateChangeTypes;
    }

    Properties

    account: `ban_${string}` | `nano_${string}`
    amount: `${number}`
    confirmed: boolean
    hash: string
    height: `${number}`
    local_timestamp: `${number}`
    \ No newline at end of file +

    Properties

    account: `ban_${string}` | `nano_${string}`
    amount: `${number}`
    confirmed: boolean
    hash: string
    height: `${number}`
    local_timestamp: `${number}`
    \ No newline at end of file diff --git a/docs/interfaces/AccountHistoryRPC.html b/docs/interfaces/AccountHistoryRPC.html index 88cb548..0347d68 100644 --- a/docs/interfaces/AccountHistoryRPC.html +++ b/docs/interfaces/AccountHistoryRPC.html @@ -1,4 +1,4 @@ -AccountHistoryRPC | banani

    Interface AccountHistoryRPC

    interface AccountHistoryRPC {
        account: `ban_${string}` | `nano_${string}`;
        history: AccountHistoryBlock[];
        previous?: string;
    }

    Properties

    account +AccountHistoryRPC | banani

    Interface AccountHistoryRPC

    interface AccountHistoryRPC {
        account: `ban_${string}` | `nano_${string}`;
        history: AccountHistoryBlock[];
        previous?: string;
    }

    Properties

    account: `ban_${string}` | `nano_${string}`
    previous?: string
    \ No newline at end of file +

    Properties

    account: `ban_${string}` | `nano_${string}`
    previous?: string
    \ No newline at end of file diff --git a/docs/interfaces/AccountHistoryRawBlock.html b/docs/interfaces/AccountHistoryRawBlock.html index 73b56f3..bddf4b4 100644 --- a/docs/interfaces/AccountHistoryRawBlock.html +++ b/docs/interfaces/AccountHistoryRawBlock.html @@ -1,4 +1,4 @@ -AccountHistoryRawBlock | banani

    Interface AccountHistoryRawBlock

    interface AccountHistoryRawBlock {
        account: `ban_${string}` | `nano_${string}`;
        amount: `${number}`;
        amount_decimal: `${number}`;
        balance: `${number}`;
        balance_decimal: `${number}`;
        confirmed: "false" | "true";
        hash: string;
        height: `${number}`;
        link: string;
        local_timestamp: `${number}`;
        previous: string;
        representative: `ban_${string}` | `nano_${string}`;
        signature: string;
        subtype: BlockSubtype;
        type: BlockAllTypes;
        work: string;
    }

    Properties

    account +AccountHistoryRawBlock | banani

    Interface AccountHistoryRawBlock

    interface AccountHistoryRawBlock {
        account: `ban_${string}` | `nano_${string}`;
        amount: `${number}`;
        amount_decimal: `${number}`;
        balance: `${number}`;
        balance_decimal: `${number}`;
        confirmed: "false" | "true";
        hash: string;
        height: `${number}`;
        link: string;
        local_timestamp: `${number}`;
        previous: string;
        representative: `ban_${string}` | `nano_${string}`;
        signature: string;
        subtype: BlockSubtype;
        type: BlockAllTypes;
        work: string;
    }

    Properties

    Properties

    account: `ban_${string}` | `nano_${string}`
    amount: `${number}`
    amount_decimal: `${number}`
    balance: `${number}`
    balance_decimal: `${number}`
    confirmed: "false" | "true"
    hash: string
    height: `${number}`
    link: string
    local_timestamp: `${number}`
    previous: string
    representative: `ban_${string}` | `nano_${string}`
    signature: string
    subtype: BlockSubtype
    work: string
    \ No newline at end of file +

    Properties

    account: `ban_${string}` | `nano_${string}`
    amount: `${number}`
    amount_decimal: `${number}`
    balance: `${number}`
    balance_decimal: `${number}`
    confirmed: "false" | "true"
    hash: string
    height: `${number}`
    link: string
    local_timestamp: `${number}`
    previous: string
    representative: `ban_${string}` | `nano_${string}`
    signature: string
    subtype: BlockSubtype
    work: string
    \ No newline at end of file diff --git a/docs/interfaces/AccountHistoryRawRPC.html b/docs/interfaces/AccountHistoryRawRPC.html index 4eb68f2..101060c 100644 --- a/docs/interfaces/AccountHistoryRawRPC.html +++ b/docs/interfaces/AccountHistoryRawRPC.html @@ -1,4 +1,4 @@ -AccountHistoryRawRPC | banani

    Interface AccountHistoryRawRPC

    interface AccountHistoryRawRPC {
        account: `ban_${string}` | `nano_${string}`;
        history: AccountHistoryRawBlock[];
        previous?: string;
    }

    Properties

    account +AccountHistoryRawRPC | banani

    Interface AccountHistoryRawRPC

    interface AccountHistoryRawRPC {
        account: `ban_${string}` | `nano_${string}`;
        history: AccountHistoryRawBlock[];
        previous?: string;
    }

    Properties

    account: `ban_${string}` | `nano_${string}`
    previous?: string
    \ No newline at end of file +

    Properties

    account: `ban_${string}` | `nano_${string}`
    previous?: string
    \ No newline at end of file diff --git a/docs/interfaces/AccountInfoRPC.html b/docs/interfaces/AccountInfoRPC.html index 6c993e3..dddc7b4 100644 --- a/docs/interfaces/AccountInfoRPC.html +++ b/docs/interfaces/AccountInfoRPC.html @@ -1,4 +1,4 @@ -AccountInfoRPC | banani

    Interface AccountInfoRPC

    interface AccountInfoRPC {
        account_version: `${number}`;
        balance: `${number}`;
        block_count: `${number}`;
        confirmation_height?: `${number}`;
        confirmation_height_frontier?: string;
        confirmed_balance?: `${number}`;
        confirmed_frontier?: string;
        confirmed_height?: `${number}`;
        confirmed_pending?: `${number}`;
        confirmed_receivable?: `${number}`;
        confirmed_representative?: `ban_${string}` | `nano_${string}`;
        frontier: string;
        modified_timestamp: `${number}`;
        open_block: string;
        pending?: `${number}`;
        receivable?: `${number}`;
        representative?: `ban_${string}` | `nano_${string}`;
        representative_block: string;
        weight?: `${number}`;
    }

    Properties

    account_version +AccountInfoRPC | banani

    Interface AccountInfoRPC

    interface AccountInfoRPC {
        account_version: `${number}`;
        balance: `${number}`;
        block_count: `${number}`;
        confirmation_height?: `${number}`;
        confirmation_height_frontier?: string;
        confirmed_balance?: `${number}`;
        confirmed_frontier?: string;
        confirmed_height?: `${number}`;
        confirmed_pending?: `${number}`;
        confirmed_receivable?: `${number}`;
        confirmed_representative?: `ban_${string}` | `nano_${string}`;
        frontier: string;
        modified_timestamp: `${number}`;
        open_block: string;
        pending?: `${number}`;
        receivable?: `${number}`;
        representative?: `ban_${string}` | `nano_${string}`;
        representative_block: string;
        weight?: `${number}`;
    }

    Properties

    account_version: `${number}`
    balance: `${number}`
    block_count: `${number}`
    confirmation_height?: `${number}`
    confirmation_height_frontier?: string
    confirmed_balance?: `${number}`
    confirmed_frontier?: string
    confirmed_height?: `${number}`
    confirmed_pending?: `${number}`
    confirmed_receivable?: `${number}`
    confirmed_representative?: `ban_${string}` | `nano_${string}`
    frontier: string
    modified_timestamp: `${number}`
    open_block: string
    pending?: `${number}`
    receivable?: `${number}`
    representative?: `ban_${string}` | `nano_${string}`
    representative_block: string
    weight?: `${number}`
    \ No newline at end of file +

    Properties

    account_version: `${number}`
    balance: `${number}`
    block_count: `${number}`
    confirmation_height?: `${number}`
    confirmation_height_frontier?: string
    confirmed_balance?: `${number}`
    confirmed_frontier?: string
    confirmed_height?: `${number}`
    confirmed_pending?: `${number}`
    confirmed_receivable?: `${number}`
    confirmed_representative?: `ban_${string}` | `nano_${string}`
    frontier: string
    modified_timestamp: `${number}`
    open_block: string
    pending?: `${number}`
    receivable?: `${number}`
    representative?: `ban_${string}` | `nano_${string}`
    representative_block: string
    weight?: `${number}`
    \ No newline at end of file diff --git a/docs/interfaces/AccountReceivableRPC.html b/docs/interfaces/AccountReceivableRPC.html index 25f463a..3ba37bd 100644 --- a/docs/interfaces/AccountReceivableRPC.html +++ b/docs/interfaces/AccountReceivableRPC.html @@ -1,2 +1,2 @@ -AccountReceivableRPC | banani

    Interface AccountReceivableRPC

    interface AccountReceivableRPC {
        blocks: string[];
    }

    Properties

    Properties

    blocks: string[]
    \ No newline at end of file +AccountReceivableRPC | banani

    Interface AccountReceivableRPC

    interface AccountReceivableRPC {
        blocks: string[];
    }

    Properties

    Properties

    blocks: string[]
    \ No newline at end of file diff --git a/docs/interfaces/AccountReceivableSourceRPC.html b/docs/interfaces/AccountReceivableSourceRPC.html index 4f89c23..87bea86 100644 --- a/docs/interfaces/AccountReceivableSourceRPC.html +++ b/docs/interfaces/AccountReceivableSourceRPC.html @@ -1,2 +1,2 @@ -AccountReceivableSourceRPC | banani

    Interface AccountReceivableSourceRPC

    interface AccountReceivableSourceRPC {
        blocks: Record<string, {
            amount: `${number}`;
            source: `ban_${string}` | `nano_${string}`;
        }>;
    }

    Properties

    Properties

    blocks: Record<string, {
        amount: `${number}`;
        source: `ban_${string}` | `nano_${string}`;
    }>

    Type declaration

    • amount: `${number}`
    • source: `ban_${string}` | `nano_${string}`
    \ No newline at end of file +AccountReceivableSourceRPC | banani

    Interface AccountReceivableSourceRPC

    interface AccountReceivableSourceRPC {
        blocks: Record<string, {
            amount: `${number}`;
            source: `ban_${string}` | `nano_${string}`;
        }>;
    }

    Properties

    Properties

    blocks: Record<string, {
        amount: `${number}`;
        source: `ban_${string}` | `nano_${string}`;
    }>

    Type declaration

    • amount: `${number}`
    • source: `ban_${string}` | `nano_${string}`
    \ No newline at end of file diff --git a/docs/interfaces/AccountReceivableThresholdRPC.html b/docs/interfaces/AccountReceivableThresholdRPC.html index 16c104e..86cba16 100644 --- a/docs/interfaces/AccountReceivableThresholdRPC.html +++ b/docs/interfaces/AccountReceivableThresholdRPC.html @@ -1,2 +1,2 @@ -AccountReceivableThresholdRPC | banani

    Interface AccountReceivableThresholdRPC

    interface AccountReceivableThresholdRPC {
        blocks: Record<string, `${number}`>;
    }

    Properties

    Properties

    blocks: Record<string, `${number}`>
    \ No newline at end of file +AccountReceivableThresholdRPC | banani

    Interface AccountReceivableThresholdRPC

    interface AccountReceivableThresholdRPC {
        blocks: Record<string, `${number}`>;
    }

    Properties

    Properties

    blocks: Record<string, `${number}`>
    \ No newline at end of file diff --git a/docs/interfaces/AccountRepresentativeRPC.html b/docs/interfaces/AccountRepresentativeRPC.html index bfaac5b..19a9da6 100644 --- a/docs/interfaces/AccountRepresentativeRPC.html +++ b/docs/interfaces/AccountRepresentativeRPC.html @@ -1,2 +1,2 @@ -AccountRepresentativeRPC | banani

    Interface AccountRepresentativeRPC

    interface AccountRepresentativeRPC {
        representative: `ban_${string}` | `nano_${string}`;
    }

    Properties

    Properties

    representative: `ban_${string}` | `nano_${string}`
    \ No newline at end of file +AccountRepresentativeRPC | banani

    Interface AccountRepresentativeRPC

    interface AccountRepresentativeRPC {
        representative: `ban_${string}` | `nano_${string}`;
    }

    Properties

    Properties

    representative: `ban_${string}` | `nano_${string}`
    \ No newline at end of file diff --git a/docs/interfaces/AccountWeightRPC.html b/docs/interfaces/AccountWeightRPC.html index c8dd005..daf1d42 100644 --- a/docs/interfaces/AccountWeightRPC.html +++ b/docs/interfaces/AccountWeightRPC.html @@ -1,2 +1,2 @@ -AccountWeightRPC | banani

    Interface AccountWeightRPC

    interface AccountWeightRPC {
        weight: `${number}`;
    }

    Properties

    Properties

    weight: `${number}`
    \ No newline at end of file +AccountWeightRPC | banani

    Interface AccountWeightRPC

    interface AccountWeightRPC {
        weight: `${number}`;
    }

    Properties

    Properties

    weight: `${number}`
    \ No newline at end of file diff --git a/docs/interfaces/AccountsBalancesRPC.html b/docs/interfaces/AccountsBalancesRPC.html index 83d6592..c30dcb2 100644 --- a/docs/interfaces/AccountsBalancesRPC.html +++ b/docs/interfaces/AccountsBalancesRPC.html @@ -1,2 +1,2 @@ -AccountsBalancesRPC | banani

    Interface AccountsBalancesRPC

    interface AccountsBalancesRPC {
        balances: Record<`ban_${string}` | `nano_${string}`, AccountBalanceRPC>;
    }

    Properties

    Properties

    balances: Record<`ban_${string}` | `nano_${string}`, AccountBalanceRPC>
    \ No newline at end of file +AccountsBalancesRPC | banani

    Interface AccountsBalancesRPC

    interface AccountsBalancesRPC {
        balances: Record<`ban_${string}` | `nano_${string}`, AccountBalanceRPC>;
    }

    Properties

    Properties

    balances: Record<`ban_${string}` | `nano_${string}`, AccountBalanceRPC>
    \ No newline at end of file diff --git a/docs/interfaces/AccountsRepresentativesRPC.html b/docs/interfaces/AccountsRepresentativesRPC.html index 3d4fa03..60538d9 100644 --- a/docs/interfaces/AccountsRepresentativesRPC.html +++ b/docs/interfaces/AccountsRepresentativesRPC.html @@ -1,2 +1,2 @@ -AccountsRepresentativesRPC | banani

    Interface AccountsRepresentativesRPC

    interface AccountsRepresentativesRPC {
        representatives: Record<`ban_${string}` | `nano_${string}`, `ban_${string}` | `nano_${string}`>;
    }

    Properties

    Properties

    representatives: Record<`ban_${string}` | `nano_${string}`, `ban_${string}` | `nano_${string}`>
    \ No newline at end of file +AccountsRepresentativesRPC | banani

    Interface AccountsRepresentativesRPC

    interface AccountsRepresentativesRPC {
        representatives: Record<`ban_${string}` | `nano_${string}`, `ban_${string}` | `nano_${string}`>;
    }

    Properties

    Properties

    representatives: Record<`ban_${string}` | `nano_${string}`, `ban_${string}` | `nano_${string}`>
    \ No newline at end of file diff --git a/docs/interfaces/Block.html b/docs/interfaces/Block.html index 25a1e6d..1b01fc4 100644 --- a/docs/interfaces/Block.html +++ b/docs/interfaces/Block.html @@ -1,4 +1,4 @@ -Block | banani

    Interface Block

    interface Block {
        account: `ban_${string}` | `nano_${string}`;
        balance: `${number}`;
        link: string;
        link_as_account?: `ban_${string}` | `nano_${string}`;
        previous: string;
        representative: `ban_${string}` | `nano_${string}`;
        signature: string;
        type: BlockAllTypes;
        work?: string;
    }

    Hierarchy (view full)

    Properties

    account +Block | banani

    Interface Block

    interface Block {
        account: `ban_${string}` | `nano_${string}`;
        balance: `${number}`;
        link: string;
        link_as_account?: `ban_${string}` | `nano_${string}`;
        previous: string;
        representative: `ban_${string}` | `nano_${string}`;
        signature: string;
        type: BlockAllTypes;
        work?: string;
    }

    Hierarchy (view full)

    Properties

    account: `ban_${string}` | `nano_${string}`
    balance: `${number}`
    link: string
    link_as_account?: `ban_${string}` | `nano_${string}`
    previous: string
    representative: `ban_${string}` | `nano_${string}`
    signature: string
    work?: string
    \ No newline at end of file +

    Properties

    account: `ban_${string}` | `nano_${string}`
    balance: `${number}`
    link: string
    link_as_account?: `ban_${string}` | `nano_${string}`
    previous: string
    representative: `ban_${string}` | `nano_${string}`
    signature: string
    work?: string
    \ No newline at end of file diff --git a/docs/interfaces/BlockCountRPC.html b/docs/interfaces/BlockCountRPC.html index 546b79f..fac13eb 100644 --- a/docs/interfaces/BlockCountRPC.html +++ b/docs/interfaces/BlockCountRPC.html @@ -1,4 +1,4 @@ -BlockCountRPC | banani

    Interface BlockCountRPC

    interface BlockCountRPC {
        cemented?: `${number}`;
        count: `${number}`;
        unchecked: `${number}`;
    }

    Properties

    cemented? +BlockCountRPC | banani

    Interface BlockCountRPC

    interface BlockCountRPC {
        cemented?: `${number}`;
        count: `${number}`;
        unchecked: `${number}`;
    }

    Properties

    cemented?: `${number}`
    count: `${number}`
    unchecked: `${number}`
    \ No newline at end of file +

    Properties

    cemented?: `${number}`
    count: `${number}`
    unchecked: `${number}`
    \ No newline at end of file diff --git a/docs/interfaces/BlockInfoRPC.html b/docs/interfaces/BlockInfoRPC.html index 7f3f9ed..7ca8832 100644 --- a/docs/interfaces/BlockInfoRPC.html +++ b/docs/interfaces/BlockInfoRPC.html @@ -1,4 +1,4 @@ -BlockInfoRPC | banani

    Interface BlockInfoRPC

    interface BlockInfoRPC {
        amount: `${number}`;
        balance: `${number}`;
        block_account: `ban_${string}` | `nano_${string}`;
        confirmed?: "false" | "true";
        contents: Block;
        height: `${number}`;
        subtype?: BlockSubtype;
        successor?: string;
        timestamp: `${number}`;
    }

    Properties

    amount +BlockInfoRPC | banani

    Interface BlockInfoRPC

    interface BlockInfoRPC {
        amount: `${number}`;
        balance: `${number}`;
        block_account: `ban_${string}` | `nano_${string}`;
        confirmed?: "false" | "true";
        contents: Block;
        height: `${number}`;
        subtype?: BlockSubtype;
        successor?: string;
        timestamp: `${number}`;
    }

    Properties

    amount: `${number}`
    balance: `${number}`
    block_account: `ban_${string}` | `nano_${string}`
    confirmed?: "false" | "true"
    contents: Block
    height: `${number}`
    subtype?: BlockSubtype
    successor?: string
    timestamp: `${number}`
    \ No newline at end of file +

    Properties

    amount: `${number}`
    balance: `${number}`
    block_account: `ban_${string}` | `nano_${string}`
    confirmed?: "false" | "true"
    contents: Block
    height: `${number}`
    subtype?: BlockSubtype
    successor?: string
    timestamp: `${number}`
    \ No newline at end of file diff --git a/docs/interfaces/BlockNoSignature.html b/docs/interfaces/BlockNoSignature.html index f4f1f20..7688785 100644 --- a/docs/interfaces/BlockNoSignature.html +++ b/docs/interfaces/BlockNoSignature.html @@ -1,8 +1,8 @@ -BlockNoSignature | banani

    Interface BlockNoSignature

    interface BlockNoSignature {
        account: `ban_${string}` | `nano_${string}`;
        balance: `${number}`;
        link: string;
        link_as_account?: `ban_${string}` | `nano_${string}`;
        previous: string;
        representative: `ban_${string}` | `nano_${string}`;
        type: BlockAllTypes;
    }

    Hierarchy (view full)

    Properties

    account +BlockNoSignature | banani

    Interface BlockNoSignature

    interface BlockNoSignature {
        account: `ban_${string}` | `nano_${string}`;
        balance: `${number}`;
        link: string;
        link_as_account?: `ban_${string}` | `nano_${string}`;
        previous: string;
        representative: `ban_${string}` | `nano_${string}`;
        type: BlockAllTypes;
    }

    Hierarchy (view full)

    Properties

    account: `ban_${string}` | `nano_${string}`
    balance: `${number}`
    link: string
    link_as_account?: `ban_${string}` | `nano_${string}`
    previous: string
    representative: `ban_${string}` | `nano_${string}`
    \ No newline at end of file +

    Properties

    account: `ban_${string}` | `nano_${string}`
    balance: `${number}`
    link: string
    link_as_account?: `ban_${string}` | `nano_${string}`
    previous: string
    representative: `ban_${string}` | `nano_${string}`
    \ No newline at end of file diff --git a/docs/interfaces/BlocksInfoRPC.html b/docs/interfaces/BlocksInfoRPC.html index 12da5ae..90fed03 100644 --- a/docs/interfaces/BlocksInfoRPC.html +++ b/docs/interfaces/BlocksInfoRPC.html @@ -1,2 +1,2 @@ -BlocksInfoRPC | banani

    Interface BlocksInfoRPC

    interface BlocksInfoRPC {
        blocks: Record<string, BlockInfoRPC>;
    }

    Properties

    Properties

    blocks: Record<string, BlockInfoRPC>
    \ No newline at end of file +BlocksInfoRPC | banani

    Interface BlocksInfoRPC

    interface BlocksInfoRPC {
        blocks: Record<string, BlockInfoRPC>;
    }

    Properties

    Properties

    blocks: Record<string, BlockInfoRPC>
    \ No newline at end of file diff --git a/docs/interfaces/BlocksRPC.html b/docs/interfaces/BlocksRPC.html index 0d88bb7..caaa940 100644 --- a/docs/interfaces/BlocksRPC.html +++ b/docs/interfaces/BlocksRPC.html @@ -1,2 +1,2 @@ -BlocksRPC | banani

    Interface BlocksRPC

    interface BlocksRPC {
        blocks: Record<string, Block>;
    }

    Properties

    Properties

    blocks: Record<string, Block>
    \ No newline at end of file +BlocksRPC | banani

    Interface BlocksRPC

    interface BlocksRPC {
        blocks: Record<string, Block>;
    }

    Properties

    Properties

    blocks: Record<string, Block>
    \ No newline at end of file diff --git a/docs/interfaces/DelegatorsCountRPC.html b/docs/interfaces/DelegatorsCountRPC.html index 6424650..7465535 100644 --- a/docs/interfaces/DelegatorsCountRPC.html +++ b/docs/interfaces/DelegatorsCountRPC.html @@ -1,2 +1,2 @@ -DelegatorsCountRPC | banani

    Interface DelegatorsCountRPC

    interface DelegatorsCountRPC {
        count: `${number}`;
    }

    Properties

    Properties

    count: `${number}`
    \ No newline at end of file +DelegatorsCountRPC | banani

    Interface DelegatorsCountRPC

    interface DelegatorsCountRPC {
        count: `${number}`;
    }

    Properties

    Properties

    count: `${number}`
    \ No newline at end of file diff --git a/docs/interfaces/DelegatorsRPC.html b/docs/interfaces/DelegatorsRPC.html index 54bf3b1..61d1cbe 100644 --- a/docs/interfaces/DelegatorsRPC.html +++ b/docs/interfaces/DelegatorsRPC.html @@ -1,2 +1,2 @@ -DelegatorsRPC | banani

    Interface DelegatorsRPC

    interface DelegatorsRPC {
        delegators: Record<`ban_${string}` | `nano_${string}`, `${number}`>;
    }

    Properties

    Properties

    delegators: Record<`ban_${string}` | `nano_${string}`, `${number}`>
    \ No newline at end of file +DelegatorsRPC | banani

    Interface DelegatorsRPC

    interface DelegatorsRPC {
        delegators: Record<`ban_${string}` | `nano_${string}`, `${number}`>;
    }

    Properties

    Properties

    delegators: Record<`ban_${string}` | `nano_${string}`, `${number}`>
    \ No newline at end of file diff --git a/docs/interfaces/RPCInterface.html b/docs/interfaces/RPCInterface.html index 8d19e0c..6e5ed5f 100644 --- a/docs/interfaces/RPCInterface.html +++ b/docs/interfaces/RPCInterface.html @@ -1,9 +1,9 @@ RPCInterface | banani

    Interface RPCInterface

    Implement this interface if the built-in RPC class does not fit your needs. The easiest way to do this is by just extending the built-in RPC class

    -
    interface RPCInterface {
        DECIMALS?: number;
        rpc_url: string;
        use_pending: boolean;
        call(payload): Promise<Record<string, string>>;
        get_account_info(account, include_confirmed?, representative?, weight?, pending?): Promise<AccountInfoRPC>;
        get_account_receivable(account, count?, threshold?, source?): Promise<AccountReceivableRPC | AccountReceivableThresholdRPC | AccountReceivableSourceRPC>;
        get_block_info(block_hash): Promise<BlockInfoRPC>;
    }

    Implemented by

    Properties

    interface RPCInterface {
        DECIMALS?: number;
        rpc_url: string;
        use_pending: boolean;
        call(payload): Promise<Record<string, string>>;
        get_account_info(account, include_confirmed?, representative?, weight?, pending?): Promise<AccountInfoRPC>;
        get_account_receivable(account, count?, threshold?, source?): Promise<AccountReceivableRPC | AccountReceivableThresholdRPC | AccountReceivableSourceRPC>;
        get_block_info(block_hash): Promise<BlockInfoRPC>;
    }

    Implemented by

    Properties

    DECIMALS?: number
    rpc_url: string
    use_pending: boolean

    Methods

    • Parameters

      • payload: Record<string, any>

      Returns Promise<Record<string, string>>

    • Parameters

      • account: `ban_${string}` | `nano_${string}`
      • Optional include_confirmed: boolean
      • Optional representative: boolean
      • Optional weight: boolean
      • Optional pending: boolean

      Returns Promise<AccountInfoRPC>

    \ No newline at end of file +

    Properties

    DECIMALS?: number
    rpc_url: string
    use_pending: boolean

    Methods

    • Parameters

      • payload: Record<string, any>

      Returns Promise<Record<string, string>>

    • Parameters

      • account: `ban_${string}` | `nano_${string}`
      • Optional include_confirmed: boolean
      • Optional representative: boolean
      • Optional weight: boolean
      • Optional pending: boolean

      Returns Promise<AccountInfoRPC>

    \ No newline at end of file diff --git a/docs/interfaces/RepresentativesOnlineRPC.html b/docs/interfaces/RepresentativesOnlineRPC.html index 1a7aa20..8118bf2 100644 --- a/docs/interfaces/RepresentativesOnlineRPC.html +++ b/docs/interfaces/RepresentativesOnlineRPC.html @@ -1,2 +1,2 @@ -RepresentativesOnlineRPC | banani

    Interface RepresentativesOnlineRPC

    interface RepresentativesOnlineRPC {
        representatives: (`ban_${string}` | `nano_${string}`)[];
    }

    Properties

    Properties

    representatives: (`ban_${string}` | `nano_${string}`)[]
    \ No newline at end of file +RepresentativesOnlineRPC | banani

    Interface RepresentativesOnlineRPC

    interface RepresentativesOnlineRPC {
        representatives: (`ban_${string}` | `nano_${string}`)[];
    }

    Properties

    Properties

    representatives: (`ban_${string}` | `nano_${string}`)[]
    \ No newline at end of file diff --git a/docs/interfaces/RepresentativesOnlineWeightRPC.html b/docs/interfaces/RepresentativesOnlineWeightRPC.html index d6f6773..f21eb58 100644 --- a/docs/interfaces/RepresentativesOnlineWeightRPC.html +++ b/docs/interfaces/RepresentativesOnlineWeightRPC.html @@ -1,2 +1,2 @@ -RepresentativesOnlineWeightRPC | banani

    Interface RepresentativesOnlineWeightRPC

    interface RepresentativesOnlineWeightRPC {
        representatives: Record<`ban_${string}` | `nano_${string}`, {
            weight: `${number}`;
        }>;
    }

    Properties

    Properties

    representatives: Record<`ban_${string}` | `nano_${string}`, {
        weight: `${number}`;
    }>

    Type declaration

    • weight: `${number}`
    \ No newline at end of file +RepresentativesOnlineWeightRPC | banani

    Interface RepresentativesOnlineWeightRPC

    interface RepresentativesOnlineWeightRPC {
        representatives: Record<`ban_${string}` | `nano_${string}`, {
            weight: `${number}`;
        }>;
    }

    Properties

    Properties

    representatives: Record<`ban_${string}` | `nano_${string}`, {
        weight: `${number}`;
    }>

    Type declaration

    • weight: `${number}`
    \ No newline at end of file diff --git a/docs/interfaces/RepresentativesRPC.html b/docs/interfaces/RepresentativesRPC.html index 74e77e1..231bbd1 100644 --- a/docs/interfaces/RepresentativesRPC.html +++ b/docs/interfaces/RepresentativesRPC.html @@ -1,2 +1,2 @@ -RepresentativesRPC | banani

    Interface RepresentativesRPC

    interface RepresentativesRPC {
        representatives: Record<`ban_${string}` | `nano_${string}`, `${number}`>;
    }

    Properties

    Properties

    representatives: Record<`ban_${string}` | `nano_${string}`, `${number}`>
    \ No newline at end of file +RepresentativesRPC | banani

    Interface RepresentativesRPC

    interface RepresentativesRPC {
        representatives: Record<`ban_${string}` | `nano_${string}`, `${number}`>;
    }

    Properties

    Properties

    representatives: Record<`ban_${string}` | `nano_${string}`, `${number}`>
    \ No newline at end of file diff --git a/docs/interfaces/WorkProvider.html b/docs/interfaces/WorkProvider.html index 2034946..a7bfcb4 100644 --- a/docs/interfaces/WorkProvider.html +++ b/docs/interfaces/WorkProvider.html @@ -1,2 +1,2 @@ -WorkProvider | banani

    Interface WorkProvider

    interface WorkProvider {
        request_work(block_hash): Promise<string>;
    }

    Methods

    Methods

    • Parameters

      • block_hash: string

      Returns Promise<string>

    \ No newline at end of file +WorkProvider | banani

    Interface WorkProvider

    interface WorkProvider {
        request_work(block_hash): Promise<string>;
    }

    Methods

    Methods

    • Parameters

      • block_hash: string

      Returns Promise<string>

    \ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index 47afff1..f05e0e5 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -40,6 +40,7 @@ Whole WorkFunction

    Functions

    \ No newline at end of file diff --git a/docs/types/Address.html b/docs/types/Address.html index 593085c..d063441 100644 --- a/docs/types/Address.html +++ b/docs/types/Address.html @@ -1 +1 @@ -Address | banani

    Type alias Address

    Address: `${AddressPrefix}${string}`
    \ No newline at end of file +Address | banani

    Type alias Address

    Address: `${AddressPrefix}${string}`
    \ No newline at end of file diff --git a/docs/types/AddressPrefix.html b/docs/types/AddressPrefix.html index d715c92..9ef651e 100644 --- a/docs/types/AddressPrefix.html +++ b/docs/types/AddressPrefix.html @@ -1 +1 @@ -AddressPrefix | banani

    Type alias AddressPrefix

    AddressPrefix: "ban_" | "nano_"
    \ No newline at end of file +AddressPrefix | banani

    Type alias AddressPrefix

    AddressPrefix: "ban_" | "nano_"
    \ No newline at end of file diff --git a/docs/types/BlockAllTypes.html b/docs/types/BlockAllTypes.html index ca72952..7208eda 100644 --- a/docs/types/BlockAllTypes.html +++ b/docs/types/BlockAllTypes.html @@ -1 +1 @@ -BlockAllTypes | banani

    Type alias BlockAllTypes

    BlockAllTypes: BlockLegacyTypes | "state"
    \ No newline at end of file +BlockAllTypes | banani

    Type alias BlockAllTypes

    BlockAllTypes: BlockLegacyTypes | "state"
    \ No newline at end of file diff --git a/docs/types/BlockBasicTypes.html b/docs/types/BlockBasicTypes.html index 57dda66..e42e8f5 100644 --- a/docs/types/BlockBasicTypes.html +++ b/docs/types/BlockBasicTypes.html @@ -1 +1 @@ -BlockBasicTypes | banani

    Type alias BlockBasicTypes

    BlockBasicTypes: BlockStateChangeTypes | "change"
    \ No newline at end of file +BlockBasicTypes | banani

    Type alias BlockBasicTypes

    BlockBasicTypes: BlockStateChangeTypes | "change"
    \ No newline at end of file diff --git a/docs/types/BlockHash.html b/docs/types/BlockHash.html index 13df45a..d81f476 100644 --- a/docs/types/BlockHash.html +++ b/docs/types/BlockHash.html @@ -1,2 +1,2 @@ BlockHash | banani

    Type alias BlockHash

    BlockHash: string

    32 byte block hash represented as 64 char hexadecimal

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/BlockLegacyTypes.html b/docs/types/BlockLegacyTypes.html index 2f2b5fe..22daf47 100644 --- a/docs/types/BlockLegacyTypes.html +++ b/docs/types/BlockLegacyTypes.html @@ -1 +1 @@ -BlockLegacyTypes | banani

    Type alias BlockLegacyTypes

    BlockLegacyTypes: BlockBasicTypes | "open"
    \ No newline at end of file +BlockLegacyTypes | banani

    Type alias BlockLegacyTypes

    BlockLegacyTypes: BlockBasicTypes | "open"
    \ No newline at end of file diff --git a/docs/types/BlockStateChangeTypes.html b/docs/types/BlockStateChangeTypes.html index d2cfaed..5d72f6f 100644 --- a/docs/types/BlockStateChangeTypes.html +++ b/docs/types/BlockStateChangeTypes.html @@ -1 +1 @@ -BlockStateChangeTypes | banani

    Type alias BlockStateChangeTypes

    BlockStateChangeTypes: "send" | "receive"
    \ No newline at end of file +BlockStateChangeTypes | banani

    Type alias BlockStateChangeTypes

    BlockStateChangeTypes: "send" | "receive"
    \ No newline at end of file diff --git a/docs/types/BlockSubtype.html b/docs/types/BlockSubtype.html index 145a20f..e40c7a6 100644 --- a/docs/types/BlockSubtype.html +++ b/docs/types/BlockSubtype.html @@ -1 +1 @@ -BlockSubtype | banani

    Type alias BlockSubtype

    BlockSubtype: BlockBasicTypes | "epoch"
    \ No newline at end of file +BlockSubtype | banani

    Type alias BlockSubtype

    BlockSubtype: BlockBasicTypes | "epoch"
    \ No newline at end of file diff --git a/docs/types/Whole.html b/docs/types/Whole.html index 0a766b7..4c8221e 100644 --- a/docs/types/Whole.html +++ b/docs/types/Whole.html @@ -1,2 +1,2 @@ Whole | banani

    Type alias Whole

    Whole: `${number}`

    Does NOT mean whole number, can be decimal like "4.2001". Use instead of regular number since those lose precision when decimal

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/types/WorkFunction.html b/docs/types/WorkFunction.html index 5b58ed1..7445ac3 100644 --- a/docs/types/WorkFunction.html +++ b/docs/types/WorkFunction.html @@ -1 +1 @@ -WorkFunction | banani

    Type alias WorkFunction

    WorkFunction: ((block_hash) => Promise<string>)

    Type declaration

      • (block_hash): Promise<string>
      • Parameters

        Returns Promise<string>

    \ No newline at end of file +WorkFunction | banani

    Type alias WorkFunction

    WorkFunction: ((block_hash) => Promise<string>)

    Type declaration

      • (block_hash): Promise<string>
      • Parameters

        Returns Promise<string>

    \ No newline at end of file diff --git a/node_test/index.js b/node_test/index.js index bfa2366..676f1d9 100644 --- a/node_test/index.js +++ b/node_test/index.js @@ -1,5 +1,5 @@ -//import * as banani from "../main.js"; -import * as banani from "banani"; +import * as banani from "../main.js"; +//import * as banani from "banani"; import * as fs from "fs"; let rpc_backup = new banani.RPCWithBackup(["https://doesnotexist239932093293854758.com", "https://kaliumapi.appditto.com/api"], 3000); @@ -16,22 +16,32 @@ let random_wallet = banani.Wallet.gen_random_wallet(rpc); let private_key_account = new banani.PrivateKeyAccount(rpc, random_wallet.private_key); console.log("random", random_wallet.address, random_wallet.address === private_key_account.address); -console.log("sig", random_wallet.sign_message("test message\ntest test")); -let test_seed = fs.readFileSync("./.secret", "utf-8").trim(); +const TEST_MESSAGE = "test message\ntest test"; + +const sig = random_wallet.sign_message(TEST_MESSAGE); +console.log("sig", sig); +console.log("sig verify 1", banani.verify_signed_message(random_wallet.address, TEST_MESSAGE, sig)); +console.log("sig verify 2 (should be false)", banani.verify_signed_message(banani.Wallet.gen_random_wallet(rpc).address, TEST_MESSAGE, sig)); + +console.log("verify block hash test", banani.verify_block_hash(banani.get_public_key_from_address("ban_1d59mzcc7yyuixyzc7femupc76yjsuoko79mm7y8td461opcpgiphjxjcje7"), "F5F4EBEC4DA188FD1C8F3848D5D7140E135D8DE79C4523148E70A737730740D370D67A9570DF91E6AC946D0DE81830F3144FE4192528A0D5A7283EF06B316505", "26722EF85256481A358A538D6D0EDA1B8B8F337AD4F9CB58C41BBC44949FDA21")); + +const test_seed = fs.readFileSync("./.secret", "utf-8").trim(); let wallet = new banani.Wallet(rpc, test_seed); -let z_address = wallet.address; //0 index +const z_address = wallet.address; //0 index console.log("hist len", (await rpc.get_account_history(z_address, -1)).history.length); +console.log("sig 2", wallet.sign_message(TEST_MESSAGE)); + wallet.index = 2; //3rd account -let t_address = wallet.address; +const t_address = wallet.address; console.log(wallet.address); //console.log(await wallet.receive("03EEE28C2CB5CA0552BF31A60A797929920FDE044B5E021B8CEC16F57278F79A")); console.log("send 1"); -let send_hash = await wallet.send(z_address, "1.001"); +const send_hash = await wallet.send(z_address, "1.001"); wallet.index = 0; console.log("receive 1"); diff --git a/package.json b/package.json index 249a4c1..10cd499 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "banani", - "version": "1.0.1", + "version": "1.0.2", "description": "JS/TS library for the Banano cryptocurrency in the style of bananopie", "main": "main.js", "scripts": { diff --git a/tweetnacl_mod.js b/tweetnacl_mod.js index 448758b..d5e2f89 100644 --- a/tweetnacl_mod.js +++ b/tweetnacl_mod.js @@ -1,30 +1,37 @@ -(function(nacl) { -'use strict'; +(function (nacl) { + "use strict"; -//changes (hash function to blake2b) based on what coranos did in bananojs + //changes (hash function to blake2b) based on what coranos did in bananojs -const blake2b = require("blake2b"); + const blake2b = require("blake2b"); -// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. -// Public domain. -// -// Implementation derived from TweetNaCl version 20140427. -// See for details: http://tweetnacl.cr.yp.to/ + // Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. + // Public domain. + // + // Implementation derived from TweetNaCl version 20140427. + // See for details: http://tweetnacl.cr.yp.to/ -var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; }; -var gf = function(init) { - var i, r = new Float64Array(16); - if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; - return r; -}; + var u64 = function (h, l) { + this.hi = h | (0 >>> 0); + this.lo = l | (0 >>> 0); + }; + var gf = function (init) { + var i, + r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; + }; -// Pluggable, initialized in high-level API below. -var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; + // Pluggable, initialized in high-level API below. + var randombytes = function (/* x, n */) { + throw new Error("no PRNG"); + }; -var _0 = new Uint8Array(16); -var _9 = new Uint8Array(32); _9[0] = 9; + var _0 = new Uint8Array(16); + var _9 = new Uint8Array(32); + _9[0] = 9; -var gf0 = gf(), + var gf0 = gf(), gf1 = gf([1]), _121665 = gf([0xdb41, 1]), D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), @@ -33,845 +40,948 @@ var gf0 = gf(), Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); -function L32(x, c) { return (x << c) | (x >>> (32 - c)); } - -function ld32(x, i) { - var u = x[i+3] & 0xff; - u = (u<<8)|(x[i+2] & 0xff); - u = (u<<8)|(x[i+1] & 0xff); - return (u<<8)|(x[i+0] & 0xff); -} - -function dl64(x, i) { - var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3]; - var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7]; - return new u64(h, l); -} - -function st32(x, j, u) { - var i; - for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; } -} - -function ts64(x, i, u) { - x[i] = (u.hi >> 24) & 0xff; - x[i+1] = (u.hi >> 16) & 0xff; - x[i+2] = (u.hi >> 8) & 0xff; - x[i+3] = u.hi & 0xff; - x[i+4] = (u.lo >> 24) & 0xff; - x[i+5] = (u.lo >> 16) & 0xff; - x[i+6] = (u.lo >> 8) & 0xff; - x[i+7] = u.lo & 0xff; -} - -function vn(x, xi, y, yi, n) { - var i,d = 0; - for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; - return (1 & ((d - 1) >>> 8)) - 1; -} - -function crypto_verify_16(x, xi, y, yi) { - return vn(x,xi,y,yi,16); -} - -function crypto_verify_32(x, xi, y, yi) { - return vn(x,xi,y,yi,32); -} - -function core(out,inp,k,c,h) { - var w = new Uint32Array(16), x = new Uint32Array(16), - y = new Uint32Array(16), t = new Uint32Array(4); - var i, j, m; - - for (i = 0; i < 4; i++) { - x[5*i] = ld32(c, 4*i); - x[1+i] = ld32(k, 4*i); - x[6+i] = ld32(inp, 4*i); - x[11+i] = ld32(k, 16+4*i); + function L32(x, c) { + return (x << c) | (x >>> (32 - c)); } - for (i = 0; i < 16; i++) y[i] = x[i]; - - for (i = 0; i < 20; i++) { - for (j = 0; j < 4; j++) { - for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16]; - t[1] ^= L32((t[0]+t[3])|0, 7); - t[2] ^= L32((t[1]+t[0])|0, 9); - t[3] ^= L32((t[2]+t[1])|0,13); - t[0] ^= L32((t[3]+t[2])|0,18); - for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m]; - } - for (m = 0; m < 16; m++) x[m] = w[m]; + function ld32(x, i) { + var u = x[i + 3] & 0xff; + u = (u << 8) | (x[i + 2] & 0xff); + u = (u << 8) | (x[i + 1] & 0xff); + return (u << 8) | (x[i + 0] & 0xff); } - if (h) { - for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; + function dl64(x, i) { + var h = (x[i] << 24) | (x[i + 1] << 16) | (x[i + 2] << 8) | x[i + 3]; + var l = (x[i + 4] << 24) | (x[i + 5] << 16) | (x[i + 6] << 8) | x[i + 7]; + return new u64(h, l); + } + + function st32(x, j, u) { + var i; for (i = 0; i < 4; i++) { - x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0; - x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0; - } - for (i = 0; i < 4; i++) { - st32(out,4*i,x[5*i]); - st32(out,16+4*i,x[6+i]); - } - } else { - for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); - } -} - -function crypto_core_salsa20(out,inp,k,c) { - core(out,inp,k,c,false); - return 0; -} - -function crypto_core_hsalsa20(out,inp,k,c) { - core(out,inp,k,c,true); - return 0; -} - -var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); - // "expand 32-byte k" - -function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { - var z = new Uint8Array(16), x = new Uint8Array(64); - var u, i; - if (!b) return 0; - for (i = 0; i < 16; i++) z[i] = 0; - for (i = 0; i < 8; i++) z[i] = n[i]; - while (b >= 64) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; - u = 1; - for (i = 8; i < 16; i++) { - u = u + (z[i] & 0xff) | 0; - z[i] = u & 0xff; + x[j + i] = u & 255; u >>>= 8; } - b -= 64; - cpos += 64; - if (m) mpos += 64; } - if (b > 0) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; + + function ts64(x, i, u) { + x[i] = (u.hi >> 24) & 0xff; + x[i + 1] = (u.hi >> 16) & 0xff; + x[i + 2] = (u.hi >> 8) & 0xff; + x[i + 3] = u.hi & 0xff; + x[i + 4] = (u.lo >> 24) & 0xff; + x[i + 5] = (u.lo >> 16) & 0xff; + x[i + 6] = (u.lo >> 8) & 0xff; + x[i + 7] = u.lo & 0xff; } - return 0; -} -function crypto_stream_salsa20(c,cpos,d,n,k) { - return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k); -} - -function crypto_stream(c,cpos,d,n,k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s,n,k,sigma); - return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s); -} - -function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s,n,k,sigma); - return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s); -} - -function add1305(h, c) { - var j, u = 0; - for (j = 0; j < 17; j++) { - u = (u + ((h[j] + c[j]) | 0)) | 0; - h[j] = u & 255; - u >>>= 8; + function vn(x, xi, y, yi, n) { + var i, + d = 0; + for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]; + return (1 & ((d - 1) >>> 8)) - 1; } -} -var minusp = new Uint32Array([ - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 -]); + function crypto_verify_16(x, xi, y, yi) { + return vn(x, xi, y, yi, 16); + } -function crypto_onetimeauth(out, outpos, m, mpos, n, k) { - var s, i, j, u; - var x = new Uint32Array(17), r = new Uint32Array(17), - h = new Uint32Array(17), c = new Uint32Array(17), + function crypto_verify_32(x, xi, y, yi) { + return vn(x, xi, y, yi, 32); + } + + function core(out, inp, k, c, h) { + var w = new Uint32Array(16), + x = new Uint32Array(16), + y = new Uint32Array(16), + t = new Uint32Array(4); + var i, j, m; + + for (i = 0; i < 4; i++) { + x[5 * i] = ld32(c, 4 * i); + x[1 + i] = ld32(k, 4 * i); + x[6 + i] = ld32(inp, 4 * i); + x[11 + i] = ld32(k, 16 + 4 * i); + } + + for (i = 0; i < 16; i++) y[i] = x[i]; + + for (i = 0; i < 20; i++) { + for (j = 0; j < 4; j++) { + for (m = 0; m < 4; m++) t[m] = x[(5 * j + 4 * m) % 16]; + t[1] ^= L32((t[0] + t[3]) | 0, 7); + t[2] ^= L32((t[1] + t[0]) | 0, 9); + t[3] ^= L32((t[2] + t[1]) | 0, 13); + t[0] ^= L32((t[3] + t[2]) | 0, 18); + for (m = 0; m < 4; m++) w[4 * j + ((j + m) % 4)] = t[m]; + } + for (m = 0; m < 16; m++) x[m] = w[m]; + } + + if (h) { + for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; + for (i = 0; i < 4; i++) { + x[5 * i] = (x[5 * i] - ld32(c, 4 * i)) | 0; + x[6 + i] = (x[6 + i] - ld32(inp, 4 * i)) | 0; + } + for (i = 0; i < 4; i++) { + st32(out, 4 * i, x[5 * i]); + st32(out, 16 + 4 * i, x[6 + i]); + } + } else { + for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); + } + } + + function crypto_core_salsa20(out, inp, k, c) { + core(out, inp, k, c, false); + return 0; + } + + function crypto_core_hsalsa20(out, inp, k, c) { + core(out, inp, k, c, true); + return 0; + } + + var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); + // "expand 32-byte k" + + function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) { + var z = new Uint8Array(16), + x = new Uint8Array(64); + var u, i; + if (!b) return 0; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < 64; i++) c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = (u + (z[i] & 0xff)) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + if (m) mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < b; i++) c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i]; + } + return 0; + } + + function crypto_stream_salsa20(c, cpos, d, n, k) { + return crypto_stream_salsa20_xor(c, cpos, null, 0, d, n, k); + } + + function crypto_stream(c, cpos, d, n, k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s, n, k, sigma); + return crypto_stream_salsa20(c, cpos, d, n.subarray(16), s); + } + + function crypto_stream_xor(c, cpos, m, mpos, d, n, k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s, n, k, sigma); + return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, n.subarray(16), s); + } + + function add1305(h, c) { + var j, + u = 0; + for (j = 0; j < 17; j++) { + u = (u + ((h[j] + c[j]) | 0)) | 0; + h[j] = u & 255; + u >>>= 8; + } + } + + var minusp = new Uint32Array([5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252]); + + function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s, i, j, u; + var x = new Uint32Array(17), + r = new Uint32Array(17), + h = new Uint32Array(17), + c = new Uint32Array(17), g = new Uint32Array(17); - for (j = 0; j < 17; j++) r[j]=h[j]=0; - for (j = 0; j < 16; j++) r[j]=k[j]; - r[3]&=15; - r[4]&=252; - r[7]&=15; - r[8]&=252; - r[11]&=15; - r[12]&=252; - r[15]&=15; + for (j = 0; j < 17; j++) r[j] = h[j] = 0; + for (j = 0; j < 16; j++) r[j] = k[j]; + r[3] &= 15; + r[4] &= 252; + r[7] &= 15; + r[8] &= 252; + r[11] &= 15; + r[12] &= 252; + r[15] &= 15; - while (n > 0) { - for (j = 0; j < 17; j++) c[j] = 0; - for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j]; - c[j] = 1; - mpos += j; n -= j; - add1305(h,c); - for (i = 0; i < 17; i++) { - x[i] = 0; - for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0; + while (n > 0) { + for (j = 0; j < 17; j++) c[j] = 0; + for (j = 0; j < 16 && j < n; ++j) c[j] = m[mpos + j]; + c[j] = 1; + mpos += j; + n -= j; + add1305(h, c); + for (i = 0; i < 17; i++) { + x[i] = 0; + for (j = 0; j < 17; j++) x[i] = (x[i] + h[j] * (j <= i ? r[i - j] : (320 * r[i + 17 - j]) | 0)) | 0 | 0; + } + for (i = 0; i < 17; i++) h[i] = x[i]; + u = 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; + h[16] = u & 3; + u = (5 * (u >>> 2)) | 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; + h[16] = u; } - for (i = 0; i < 17; i++) h[i] = x[i]; - u = 0; - for (j = 0; j < 16; j++) { - u = (u + h[j]) | 0; - h[j] = u & 255; - u >>>= 8; - } - u = (u + h[16]) | 0; h[16] = u & 3; - u = (5 * (u >>> 2)) | 0; - for (j = 0; j < 16; j++) { - u = (u + h[j]) | 0; - h[j] = u & 255; - u >>>= 8; - } - u = (u + h[16]) | 0; h[16] = u; + + for (j = 0; j < 17; j++) g[j] = h[j]; + add1305(h, minusp); + s = -(h[16] >>> 7) | 0; + for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); + + for (j = 0; j < 16; j++) c[j] = k[j + 16]; + c[16] = 0; + add1305(h, c); + for (j = 0; j < 16; j++) out[outpos + j] = h[j]; + return 0; } - for (j = 0; j < 17; j++) g[j] = h[j]; - add1305(h,minusp); - s = (-(h[16] >>> 7) | 0); - for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); + function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { + var x = new Uint8Array(16); + crypto_onetimeauth(x, 0, m, mpos, n, k); + return crypto_verify_16(h, hpos, x, 0); + } - for (j = 0; j < 16; j++) c[j] = k[j + 16]; - c[16] = 0; - add1305(h,c); - for (j = 0; j < 16; j++) out[outpos+j] = h[j]; - return 0; -} + function crypto_secretbox(c, m, d, n, k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c, 0, m, 0, d, n, k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; + } -function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { - var x = new Uint8Array(16); - crypto_onetimeauth(x,0,m,mpos,n,k); - return crypto_verify_16(h,hpos,x,0); -} + function crypto_secretbox_open(m, c, d, n, k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x, 0, 32, n, k); + if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1; + crypto_stream_xor(m, 0, c, 0, d, n, k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; + } -function crypto_secretbox(c,m,d,n,k) { - var i; - if (d < 32) return -1; - crypto_stream_xor(c,0,m,0,d,n,k); - crypto_onetimeauth(c, 16, c, 32, d - 32, c); - for (i = 0; i < 16; i++) c[i] = 0; - return 0; -} + function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i] | 0; + } -function crypto_secretbox_open(m,c,d,n,k) { - var i; - var x = new Uint8Array(32); - if (d < 32) return -1; - crypto_stream(x,0,32,n,k); - if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; - crypto_stream_xor(m,0,c,0,d,n,k); - for (i = 0; i < 32; i++) m[i] = 0; - return 0; -} - -function set25519(r, a) { - var i; - for (i = 0; i < 16; i++) r[i] = a[i]|0; -} - -function car25519(o) { - var c; - var i; - for (i = 0; i < 16; i++) { + function car25519(o) { + var c; + var i; + for (i = 0; i < 16; i++) { o[i] += 65536; c = Math.floor(o[i] / 65536); - o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0); - o[i] -= (c * 65536); - } -} - -function sel25519(p, q, b) { - var t, c = ~(b-1); - for (var i = 0; i < 16; i++) { - t = c & (p[i] ^ q[i]); - p[i] ^= t; - q[i] ^= t; - } -} - -function pack25519(o, n) { - var i, j, b; - var m = gf(), t = gf(); - for (i = 0; i < 16; i++) t[i] = n[i]; - car25519(t); - car25519(t); - car25519(t); - for (j = 0; j < 2; j++) { - m[0] = t[0] - 0xffed; - for (i = 1; i < 15; i++) { - m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); - m[i-1] &= 0xffff; - } - m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); - b = (m[15]>>16) & 1; - m[14] &= 0xffff; - sel25519(t, m, 1-b); - } - for (i = 0; i < 16; i++) { - o[2*i] = t[i] & 0xff; - o[2*i+1] = t[i]>>8; - } -} - -function neq25519(a, b) { - var c = new Uint8Array(32), d = new Uint8Array(32); - pack25519(c, a); - pack25519(d, b); - return crypto_verify_32(c, 0, d, 0); -} - -function par25519(a) { - var d = new Uint8Array(32); - pack25519(d, a); - return d[0] & 1; -} - -function unpack25519(o, n) { - var i; - for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); - o[15] &= 0x7fff; -} - -function A(o, a, b) { - var i; - for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0; -} - -function Z(o, a, b) { - var i; - for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0; -} - -function M(o, a, b) { - var i, j, t = new Float64Array(31); - for (i = 0; i < 31; i++) t[i] = 0; - for (i = 0; i < 16; i++) { - for (j = 0; j < 16; j++) { - t[i+j] += a[i] * b[j]; + o[(i + 1) * (i < 15 ? 1 : 0)] += c - 1 + 37 * (c - 1) * (i === 15 ? 1 : 0); + o[i] -= c * 65536; } } - for (i = 0; i < 15; i++) { - t[i] += 38 * t[i+16]; + + function sel25519(p, q, b) { + var t, + c = ~(b - 1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } } - for (i = 0; i < 16; i++) o[i] = t[i]; - car25519(o); - car25519(o); -} -function S(o, a) { - M(o, a, a); -} - -function inv25519(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 253; a >= 0; a--) { - S(c, c); - if(a !== 2 && a !== 4) M(c, c, i); + function pack25519(o, n) { + var i, j, b; + var m = gf(), + t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1); + m[i - 1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1); + b = (m[15] >> 16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1 - b); + } + for (i = 0; i < 16; i++) { + o[2 * i] = t[i] & 0xff; + o[2 * i + 1] = t[i] >> 8; + } } - for (a = 0; a < 16; a++) o[a] = c[a]; -} -function pow2523(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 250; a >= 0; a--) { + function neq25519(a, b) { + var c = new Uint8Array(32), + d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); + } + + function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; + } + + function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8); + o[15] &= 0x7fff; + } + + function A(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] + b[i]) | 0; + } + + function Z(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] - b[i]) | 0; + } + + function M(o, a, b) { + var i, + j, + t = new Float64Array(31); + for (i = 0; i < 31; i++) t[i] = 0; + for (i = 0; i < 16; i++) { + for (j = 0; j < 16; j++) { + t[i + j] += a[i] * b[j]; + } + } + for (i = 0; i < 15; i++) { + t[i] += 38 * t[i + 16]; + } + for (i = 0; i < 16; i++) o[i] = t[i]; + car25519(o); + car25519(o); + } + + function S(o, a) { + M(o, a, a); + } + + function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { S(c, c); - if(a !== 1) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; -} - -function crypto_scalarmult(q, n, p) { - var z = new Uint8Array(32); - var x = new Float64Array(80), r, i; - var a = gf(), b = gf(), c = gf(), - d = gf(), e = gf(), f = gf(); - for (i = 0; i < 31; i++) z[i] = n[i]; - z[31]=(n[31]&127)|64; - z[0]&=248; - unpack25519(x,p); - for (i = 0; i < 16; i++) { - b[i]=x[i]; - d[i]=a[i]=c[i]=0; - } - a[0]=d[0]=1; - for (i=254; i>=0; --i) { - r=(z[i>>>3]>>>(i&7))&1; - sel25519(a,b,r); - sel25519(c,d,r); - A(e,a,c); - Z(a,a,c); - A(c,b,d); - Z(b,b,d); - S(d,e); - S(f,a); - M(a,c,a); - M(c,b,e); - A(e,a,c); - Z(a,a,c); - S(b,a); - Z(c,d,f); - M(a,c,_121665); - A(a,a,d); - M(c,c,a); - M(a,d,f); - M(d,b,x); - S(b,e); - sel25519(a,b,r); - sel25519(c,d,r); - } - for (i = 0; i < 16; i++) { - x[i+16]=a[i]; - x[i+32]=c[i]; - x[i+48]=b[i]; - x[i+64]=d[i]; - } - var x32 = x.subarray(32); - var x16 = x.subarray(16); - inv25519(x32,x32); - M(x16,x16,x32); - pack25519(q,x16); - return 0; -} - -function crypto_scalarmult_base(q, n) { - return crypto_scalarmult(q, n, _9); -} - -function crypto_box_keypair(y, x) { - randombytes(x, 32); - return crypto_scalarmult_base(y, x); -} - -function crypto_box_beforenm(k, y, x) { - var s = new Uint8Array(32); - crypto_scalarmult(s, x, y); - return crypto_core_hsalsa20(k, _0, s, sigma); -} - -var crypto_box_afternm = crypto_secretbox; -var crypto_box_open_afternm = crypto_secretbox_open; - -function crypto_box(c, m, d, n, y, x) { - var k = new Uint8Array(32); - crypto_box_beforenm(k, y, x); - return crypto_box_afternm(c, m, d, n, k); -} - -function crypto_box_open(m, c, d, n, y, x) { - var k = new Uint8Array(32); - crypto_box_beforenm(k, y, x); - return crypto_box_open_afternm(m, c, d, n, k); -} - -function add64() { - var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i; - for (i = 0; i < arguments.length; i++) { - l = arguments[i].lo; - h = arguments[i].hi; - a += (l & m16); b += (l >>> 16); - c += (h & m16); d += (h >>> 16); + if (a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; } - b += (a >>> 16); - c += (b >>> 16); - d += (c >>> 16); - - return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); -} - -function shr64(x, c) { - return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c))); -} - -function xor64() { - var l = 0, h = 0, i; - for (i = 0; i < arguments.length; i++) { - l ^= arguments[i].lo; - h ^= arguments[i].hi; + function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if (a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; } - return new u64(h, l); -} -function R(x, c) { - var h, l, c1 = 32 - c; - if (c < 32) { - h = (x.hi >>> c) | (x.lo << c1); - l = (x.lo >>> c) | (x.hi << c1); - } else if (c < 64) { - h = (x.lo >>> c) | (x.hi << c1); - l = (x.hi >>> c) | (x.lo << c1); + function crypto_scalarmult(q, n, p) { + var z = new Uint8Array(32); + var x = new Float64Array(80), + r, + i; + var a = gf(), + b = gf(), + c = gf(), + d = gf(), + e = gf(), + f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31] = (n[31] & 127) | 64; + z[0] &= 248; + unpack25519(x, p); + for (i = 0; i < 16; i++) { + b[i] = x[i]; + d[i] = a[i] = c[i] = 0; + } + a[0] = d[0] = 1; + for (i = 254; i >= 0; --i) { + r = (z[i >>> 3] >>> (i & 7)) & 1; + sel25519(a, b, r); + sel25519(c, d, r); + A(e, a, c); + Z(a, a, c); + A(c, b, d); + Z(b, b, d); + S(d, e); + S(f, a); + M(a, c, a); + M(c, b, e); + A(e, a, c); + Z(a, a, c); + S(b, a); + Z(c, d, f); + M(a, c, _121665); + A(a, a, d); + M(c, c, a); + M(a, d, f); + M(d, b, x); + S(b, e); + sel25519(a, b, r); + sel25519(c, d, r); + } + for (i = 0; i < 16; i++) { + x[i + 16] = a[i]; + x[i + 32] = c[i]; + x[i + 48] = b[i]; + x[i + 64] = d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32, x32); + M(x16, x16, x32); + pack25519(q, x16); + return 0; } - return new u64(h, l); -} -function Ch(x, y, z) { - var h = (x.hi & y.hi) ^ (~x.hi & z.hi), + function crypto_scalarmult_base(q, n) { + return crypto_scalarmult(q, n, _9); + } + + function crypto_box_keypair(y, x) { + randombytes(x, 32); + return crypto_scalarmult_base(y, x); + } + + function crypto_box_beforenm(k, y, x) { + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); + } + + var crypto_box_afternm = crypto_secretbox; + var crypto_box_open_afternm = crypto_secretbox_open; + + function crypto_box(c, m, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); + } + + function crypto_box_open(m, c, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); + } + + function add64() { + var a = 0, + b = 0, + c = 0, + d = 0, + m16 = 65535, + l, + h, + i; + for (i = 0; i < arguments.length; i++) { + l = arguments[i].lo; + h = arguments[i].hi; + a += l & m16; + b += l >>> 16; + c += h & m16; + d += h >>> 16; + } + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); + } + + function shr64(x, c) { + return new u64(x.hi >>> c, (x.lo >>> c) | (x.hi << (32 - c))); + } + + function xor64() { + var l = 0, + h = 0, + i; + for (i = 0; i < arguments.length; i++) { + l ^= arguments[i].lo; + h ^= arguments[i].hi; + } + return new u64(h, l); + } + + function R(x, c) { + var h, + l, + c1 = 32 - c; + if (c < 32) { + h = (x.hi >>> c) | (x.lo << c1); + l = (x.lo >>> c) | (x.hi << c1); + } else if (c < 64) { + h = (x.lo >>> c) | (x.hi << c1); + l = (x.hi >>> c) | (x.lo << c1); + } + return new u64(h, l); + } + + function Ch(x, y, z) { + var h = (x.hi & y.hi) ^ (~x.hi & z.hi), l = (x.lo & y.lo) ^ (~x.lo & z.lo); - return new u64(h, l); -} + return new u64(h, l); + } -function Maj(x, y, z) { - var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), + function Maj(x, y, z) { + var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo); - return new u64(h, l); -} + return new u64(h, l); + } -function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); } -function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); } -function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); } -function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); } + function Sigma0(x) { + return xor64(R(x, 28), R(x, 34), R(x, 39)); + } + function Sigma1(x) { + return xor64(R(x, 14), R(x, 18), R(x, 41)); + } + function sigma0(x) { + return xor64(R(x, 1), R(x, 8), shr64(x, 7)); + } + function sigma1(x) { + return xor64(R(x, 19), R(x, 61), shr64(x, 6)); + } -var K = [ - new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd), - new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc), - new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019), - new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118), - new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe), - new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2), - new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1), - new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694), - new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3), - new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65), - new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483), - new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5), - new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210), - new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4), - new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725), - new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70), - new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926), - new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df), - new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8), - new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b), - new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001), - new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30), - new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910), - new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8), - new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53), - new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8), - new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb), - new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3), - new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60), - new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec), - new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9), - new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b), - new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207), - new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178), - new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6), - new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b), - new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493), - new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c), - new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a), - new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817) -]; + var K = [ + new u64(0x428a2f98, 0xd728ae22), + new u64(0x71374491, 0x23ef65cd), + new u64(0xb5c0fbcf, 0xec4d3b2f), + new u64(0xe9b5dba5, 0x8189dbbc), + new u64(0x3956c25b, 0xf348b538), + new u64(0x59f111f1, 0xb605d019), + new u64(0x923f82a4, 0xaf194f9b), + new u64(0xab1c5ed5, 0xda6d8118), + new u64(0xd807aa98, 0xa3030242), + new u64(0x12835b01, 0x45706fbe), + new u64(0x243185be, 0x4ee4b28c), + new u64(0x550c7dc3, 0xd5ffb4e2), + new u64(0x72be5d74, 0xf27b896f), + new u64(0x80deb1fe, 0x3b1696b1), + new u64(0x9bdc06a7, 0x25c71235), + new u64(0xc19bf174, 0xcf692694), + new u64(0xe49b69c1, 0x9ef14ad2), + new u64(0xefbe4786, 0x384f25e3), + new u64(0x0fc19dc6, 0x8b8cd5b5), + new u64(0x240ca1cc, 0x77ac9c65), + new u64(0x2de92c6f, 0x592b0275), + new u64(0x4a7484aa, 0x6ea6e483), + new u64(0x5cb0a9dc, 0xbd41fbd4), + new u64(0x76f988da, 0x831153b5), + new u64(0x983e5152, 0xee66dfab), + new u64(0xa831c66d, 0x2db43210), + new u64(0xb00327c8, 0x98fb213f), + new u64(0xbf597fc7, 0xbeef0ee4), + new u64(0xc6e00bf3, 0x3da88fc2), + new u64(0xd5a79147, 0x930aa725), + new u64(0x06ca6351, 0xe003826f), + new u64(0x14292967, 0x0a0e6e70), + new u64(0x27b70a85, 0x46d22ffc), + new u64(0x2e1b2138, 0x5c26c926), + new u64(0x4d2c6dfc, 0x5ac42aed), + new u64(0x53380d13, 0x9d95b3df), + new u64(0x650a7354, 0x8baf63de), + new u64(0x766a0abb, 0x3c77b2a8), + new u64(0x81c2c92e, 0x47edaee6), + new u64(0x92722c85, 0x1482353b), + new u64(0xa2bfe8a1, 0x4cf10364), + new u64(0xa81a664b, 0xbc423001), + new u64(0xc24b8b70, 0xd0f89791), + new u64(0xc76c51a3, 0x0654be30), + new u64(0xd192e819, 0xd6ef5218), + new u64(0xd6990624, 0x5565a910), + new u64(0xf40e3585, 0x5771202a), + new u64(0x106aa070, 0x32bbd1b8), + new u64(0x19a4c116, 0xb8d2d0c8), + new u64(0x1e376c08, 0x5141ab53), + new u64(0x2748774c, 0xdf8eeb99), + new u64(0x34b0bcb5, 0xe19b48a8), + new u64(0x391c0cb3, 0xc5c95a63), + new u64(0x4ed8aa4a, 0xe3418acb), + new u64(0x5b9cca4f, 0x7763e373), + new u64(0x682e6ff3, 0xd6b2b8a3), + new u64(0x748f82ee, 0x5defb2fc), + new u64(0x78a5636f, 0x43172f60), + new u64(0x84c87814, 0xa1f0ab72), + new u64(0x8cc70208, 0x1a6439ec), + new u64(0x90befffa, 0x23631e28), + new u64(0xa4506ceb, 0xde82bde9), + new u64(0xbef9a3f7, 0xb2c67915), + new u64(0xc67178f2, 0xe372532b), + new u64(0xca273ece, 0xea26619c), + new u64(0xd186b8c7, 0x21c0c207), + new u64(0xeada7dd6, 0xcde0eb1e), + new u64(0xf57d4f7f, 0xee6ed178), + new u64(0x06f067aa, 0x72176fba), + new u64(0x0a637dc5, 0xa2c898a6), + new u64(0x113f9804, 0xbef90dae), + new u64(0x1b710b35, 0x131c471b), + new u64(0x28db77f5, 0x23047d84), + new u64(0x32caab7b, 0x40c72493), + new u64(0x3c9ebe0a, 0x15c9bebc), + new u64(0x431d67c4, 0x9c100d4c), + new u64(0x4cc5d4be, 0xcb3e42b6), + new u64(0x597f299c, 0xfc657e2a), + new u64(0x5fcb6fab, 0x3ad6faec), + new u64(0x6c44198c, 0x4a475817), + ]; -function crypto_hashblocks(x, m, n) { - var z = [], b = [], a = [], w = [], t, i, j; + function crypto_hashblocks(x, m, n) { + var z = [], + b = [], + a = [], + w = [], + t, + i, + j; - for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i); + for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8 * i); - var pos = 0; - while (n >= 128) { - for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos); - for (i = 0; i < 80; i++) { - for (j = 0; j < 8; j++) b[j] = a[j]; - t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]); - b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); - b[3] = add64(b[3], t); - for (j = 0; j < 8; j++) a[(j+1)%8] = b[j]; - if (i%16 === 15) { - for (j = 0; j < 16; j++) { - w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16])); + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) w[i] = dl64(m, 8 * i + pos); + for (i = 0; i < 80; i++) { + for (j = 0; j < 8; j++) b[j] = a[j]; + t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i % 16]); + b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); + b[3] = add64(b[3], t); + for (j = 0; j < 8; j++) a[(j + 1) % 8] = b[j]; + if (i % 16 === 15) { + for (j = 0; j < 16; j++) { + w[j] = add64(w[j], w[(j + 9) % 16], sigma0(w[(j + 1) % 16]), sigma1(w[(j + 14) % 16])); + } } } + + for (i = 0; i < 8; i++) { + a[i] = add64(a[i], z[i]); + z[i] = a[i]; + } + + pos += 128; + n -= 128; + } + + for (i = 0; i < 8; i++) ts64(x, 8 * i, z[i]); + return n; + } + + const crypto_hash_blake2b = (input, size) => blake2b(size).update(input).digest(); + + var iv = new Uint8Array([0x6a, 0x09, 0xe6, 0x67, 0xf3, 0xbc, 0xc9, 0x08, 0xbb, 0x67, 0xae, 0x85, 0x84, 0xca, 0xa7, 0x3b, 0x3c, 0x6e, 0xf3, 0x72, 0xfe, 0x94, 0xf8, 0x2b, 0xa5, 0x4f, 0xf5, 0x3a, 0x5f, 0x1d, 0x36, 0xf1, 0x51, 0x0e, 0x52, 0x7f, 0xad, 0xe6, 0x82, 0xd1, 0x9b, 0x05, 0x68, 0x8c, 0x2b, 0x3e, 0x6c, 0x1f, 0x1f, 0x83, 0xd9, 0xab, 0xfb, 0x41, 0xbd, 0x6b, 0x5b, 0xe0, 0xcd, 0x19, 0x13, 0x7e, 0x21, 0x79]); + + function crypto_hash(out, m, n) { + var h = new Uint8Array(64), + x = new Uint8Array(256); + var i, + b = n; + + for (i = 0; i < 64; i++) h[i] = iv[i]; + + crypto_hashblocks(h, m, n); + n %= 128; + + for (i = 0; i < 256; i++) x[i] = 0; + for (i = 0; i < n; i++) x[i] = m[b - n + i]; + x[n] = 128; + + n = 256 - 128 * (n < 112 ? 1 : 0); + x[n - 9] = 0; + ts64(x, n - 8, new u64((b / 0x20000000) | 0, b << 3)); + crypto_hashblocks(h, x, n); + + for (i = 0; i < 64; i++) out[i] = h[i]; + + return 0; + } + + function add(p, q) { + var a = gf(), + b = gf(), + c = gf(), + d = gf(), + e = gf(), + f = gf(), + g = gf(), + h = gf(), + t = gf(); + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); + } + + function cswap(p, q, b) { + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } + } + + function pack(r, p) { + var tx = gf(), + ty = gf(), + zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; + } + + function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i / 8) | 0] >> (i & 7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } + } + + function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); + } + + function crypto_sign_keypair(pk, sk, seeded) { + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; + + if (!seeded) randombytes(sk, 32); + + //!!! BANANO CHANGE: we are replacing the below line with blake2b + //crypto_hash(d, sk, 32); + d = crypto_hash_blake2b(sk, 64); + + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p, d); + pack(pk, p); + + //!!! BANANO CHANGE: below line commented out + //for (i = 0; i < 32; i++) sk[i+32] = pk[i]; + return 0; + } + + var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); + + function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = Math.floor((x[j] + 128) / 256); + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i + 1] += x[i] >> 8; + r[i] = x[i] & 255; + } + } + + function reduce(r) { + var x = new Float64Array(64), + i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); + } + + //!!! BANANO CHANGE: Changed hashing to blake2b, and the derive pk thing + // Note: difference from C - smlen returned, not passed as argument. + function crypto_sign(sm, m, n, sk) { + var d = new Uint8Array(64), + h = new Uint8Array(64), + r = new Uint8Array(64); + var i, + j, + x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + + const pk = derivePublicFromSecret(sk); + + d = crypto_hash_blake2b(sk, 64); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + + r = crypto_hash_blake2b(sm.subarray(32), 64); + reduce(r); + scalarbase(p, r); + pack(sm, p); + + for (i = 32; i < 64; i++) sm[i] = pk[i - 32]; //sk[i] to pk[i - 32] + h = crypto_hash_blake2b(sm, 64); + reduce(h); + + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i + j] += h[i] * d[j]; + } } - for (i = 0; i < 8; i++) { - a[i] = add64(a[i], z[i]); - z[i] = a[i]; - } - - pos += 128; - n -= 128; + modL(sm.subarray(32), x); + return smlen; } - for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]); - return n; -} - -const crypto_hash_blake2b = (input, size) => blake2b(size).update(input).digest(); - -var iv = new Uint8Array([ - 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, - 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, - 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, - 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, - 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, - 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, - 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, - 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 -]); - -function crypto_hash(out, m, n) { - var h = new Uint8Array(64), x = new Uint8Array(256); - var i, b = n; - - for (i = 0; i < 64; i++) h[i] = iv[i]; - - crypto_hashblocks(h, m, n); - n %= 128; - - for (i = 0; i < 256; i++) x[i] = 0; - for (i = 0; i < n; i++) x[i] = m[b-n+i]; - x[n] = 128; - - n = 256-128*(n<112?1:0); - x[n-9] = 0; - ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3)); - crypto_hashblocks(h, x, n); - - for (i = 0; i < 64; i++) out[i] = h[i]; - - return 0; -} - -function add(p, q) { - var a = gf(), b = gf(), c = gf(), - d = gf(), e = gf(), f = gf(), - g = gf(), h = gf(), t = gf(); - - Z(a, p[1], p[0]); - Z(t, q[1], q[0]); - M(a, a, t); - A(b, p[0], p[1]); - A(t, q[0], q[1]); - M(b, b, t); - M(c, p[3], q[3]); - M(c, c, D2); - M(d, p[2], q[2]); - A(d, d, d); - Z(e, b, a); - Z(f, d, c); - A(g, d, c); - A(h, b, a); - - M(p[0], e, f); - M(p[1], h, g); - M(p[2], g, f); - M(p[3], e, h); -} - -function cswap(p, q, b) { - var i; - for (i = 0; i < 4; i++) { - sel25519(p[i], q[i], b); - } -} - -function pack(r, p) { - var tx = gf(), ty = gf(), zi = gf(); - inv25519(zi, p[2]); - M(tx, p[0], zi); - M(ty, p[1], zi); - pack25519(r, ty); - r[31] ^= par25519(tx) << 7; -} - -function scalarmult(p, q, s) { - var b, i; - set25519(p[0], gf0); - set25519(p[1], gf1); - set25519(p[2], gf1); - set25519(p[3], gf0); - for (i = 255; i >= 0; --i) { - b = (s[(i/8)|0] >> (i&7)) & 1; - cswap(p, q, b); - add(q, p); - add(p, p); - cswap(p, q, b); - } -} - -function scalarbase(p, s) { - var q = [gf(), gf(), gf(), gf()]; - set25519(q[0], X); - set25519(q[1], Y); - set25519(q[2], gf1); - M(q[3], X, Y); - scalarmult(p, q, s); -} - -function crypto_sign_keypair(pk, sk, seeded) { - var d = new Uint8Array(64); - var p = [gf(), gf(), gf(), gf()]; - var i; - - if (!seeded) randombytes(sk, 32); - - //!!! BANANO CHANGE: we are replacing the below line with blake2b - //crypto_hash(d, sk, 32); - d = crypto_hash_blake2b(sk, 64); - - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; - - scalarbase(p, d); - pack(pk, p); - - //!!! BANANO CHANGE: below line commented out - //for (i = 0; i < 32; i++) sk[i+32] = pk[i]; - return 0; -} - -var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); - -function modL(r, x) { - var carry, i, j, k; - for (i = 63; i >= 32; --i) { - carry = 0; - for (j = i - 32, k = i - 12; j < k; ++j) { - x[j] += carry - 16 * x[i] * L[j - (i - 32)]; - carry = Math.floor((x[j] + 128) / 256); - x[j] -= carry * 256; - } - x[j] += carry; - x[i] = 0; - } - carry = 0; - for (j = 0; j < 32; j++) { - x[j] += carry - (x[31] >> 4) * L[j]; - carry = x[j] >> 8; - x[j] &= 255; - } - for (j = 0; j < 32; j++) x[j] -= carry * L[j]; - for (i = 0; i < 32; i++) { - x[i+1] += x[i] >> 8; - r[i] = x[i] & 255; - } -} - -function reduce(r) { - var x = new Float64Array(64), i; - for (i = 0; i < 64; i++) x[i] = r[i]; - for (i = 0; i < 64; i++) r[i] = 0; - modL(r, x); -} - -//!!! BANANO CHANGE: Changed hashing to blake2b, and the derive pk thing -// Note: difference from C - smlen returned, not passed as argument. -function crypto_sign(sm, m, n, sk) { - var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); - var i, j, x = new Float64Array(64); - var p = [gf(), gf(), gf(), gf()]; - - const pk = derivePublicFromSecret(sk); - - d = crypto_hash_blake2b(sk, 64); - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; - - var smlen = n + 64; - for (i = 0; i < n; i++) sm[64 + i] = m[i]; - for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; - - r = crypto_hash_blake2b(sm.subarray(32), 64); - reduce(r); - scalarbase(p, r); - pack(sm, p); - - for (i = 32; i < 64; i++) sm[i] = pk[i - 32]; //sk[i] to pk[i - 32] - h = crypto_hash_blake2b(sm, 64); - reduce(h); - - for (i = 0; i < 64; i++) x[i] = 0; - for (i = 0; i < 32; i++) x[i] = r[i]; - for (i = 0; i < 32; i++) { - for (j = 0; j < 32; j++) { - x[i+j] += h[i] * d[j]; - } - } - - modL(sm.subarray(32), x); - return smlen; -} - -function unpackneg(r, p) { - var t = gf(), chk = gf(), num = gf(), - den = gf(), den2 = gf(), den4 = gf(), + function unpackneg(r, p) { + var t = gf(), + chk = gf(), + num = gf(), + den = gf(), + den2 = gf(), + den4 = gf(), den6 = gf(); - set25519(r[2], gf1); - unpack25519(r[1], p); - S(num, r[1]); - M(den, num, D); - Z(num, num, r[2]); - A(den, r[2], den); + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); - S(den2, den); - S(den4, den2); - M(den6, den4, den2); - M(t, den6, num); - M(t, t, den); + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); - pow2523(t, t); - M(t, t, num); - M(t, t, den); - M(t, t, den); - M(r[0], t, den); + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) M(r[0], r[0], I); + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) return -1; + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; - if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + if (par25519(r[0]) === p[31] >> 7) Z(r[0], gf0, r[0]); - M(r[3], r[0], r[1]); - return 0; -} - -function crypto_sign_open(m, sm, n, pk) { - var i; - var t = new Uint8Array(32), h = new Uint8Array(64); - var p = [gf(), gf(), gf(), gf()], - q = [gf(), gf(), gf(), gf()]; - - if (n < 64) return -1; - - if (unpackneg(q, pk)) return -1; - - for (i = 0; i < n; i++) m[i] = sm[i]; - for (i = 0; i < 32; i++) m[i+32] = pk[i]; - crypto_hash(h, m, n); - reduce(h); - scalarmult(p, q, h); - - scalarbase(q, sm.subarray(32)); - add(p, q); - pack(t, p); - - n -= 64; - if (crypto_verify_32(sm, 0, t, 0)) { - for (i = 0; i < n; i++) m[i] = 0; - return -1; + M(r[3], r[0], r[1]); + return 0; } - for (i = 0; i < n; i++) m[i] = sm[i + 64]; - return n; -} + function crypto_sign_open(m, sm, n, pk) { + var i; + var t = new Uint8Array(32), + h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; -var crypto_secretbox_KEYBYTES = 32, + if (n < 64) return -1; + + if (unpackneg(q, pk)) return -1; + + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i + 32] = pk[i]; + //!!! BANANO CHANGE + h = crypto_hash_blake2b(m, 64); //n); + reduce(h); + scalarmult(p, q, h); + + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } + + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + return n; + } + + var crypto_secretbox_KEYBYTES = 32, crypto_secretbox_NONCEBYTES = 24, crypto_secretbox_ZEROBYTES = 32, crypto_secretbox_BOXZEROBYTES = 16, @@ -891,326 +1001,319 @@ var crypto_secretbox_KEYBYTES = 32, crypto_sign_SEEDBYTES = 32, crypto_hash_BYTES = 64; -nacl.lowlevel = { - crypto_core_hsalsa20: crypto_core_hsalsa20, - crypto_stream_xor: crypto_stream_xor, - crypto_stream: crypto_stream, - crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, - crypto_stream_salsa20: crypto_stream_salsa20, - crypto_onetimeauth: crypto_onetimeauth, - crypto_onetimeauth_verify: crypto_onetimeauth_verify, - crypto_verify_16: crypto_verify_16, - crypto_verify_32: crypto_verify_32, - crypto_secretbox: crypto_secretbox, - crypto_secretbox_open: crypto_secretbox_open, - crypto_scalarmult: crypto_scalarmult, - crypto_scalarmult_base: crypto_scalarmult_base, - crypto_box_beforenm: crypto_box_beforenm, - crypto_box_afternm: crypto_box_afternm, - crypto_box: crypto_box, - crypto_box_open: crypto_box_open, - crypto_box_keypair: crypto_box_keypair, - crypto_hash: crypto_hash, - crypto_sign: crypto_sign, - crypto_sign_keypair: crypto_sign_keypair, - crypto_sign_open: crypto_sign_open, + nacl.lowlevel = { + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, - crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, - crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, - crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, - crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, - crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, - crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, - crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, - crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, - crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, - crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, - crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, - crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, - crypto_sign_BYTES: crypto_sign_BYTES, - crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, - crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, - crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, - crypto_hash_BYTES: crypto_hash_BYTES, + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES, - gf: gf, - D: D, - L: L, - pack25519: pack25519, - unpack25519: unpack25519, - M: M, - A: A, - S: S, - Z: Z, - pow2523: pow2523, - add: add, - set25519: set25519, - modL: modL, - scalarmult: scalarmult, - scalarbase: scalarbase, -}; + gf: gf, + D: D, + L: L, + pack25519: pack25519, + unpack25519: unpack25519, + M: M, + A: A, + S: S, + Z: Z, + pow2523: pow2523, + add: add, + set25519: set25519, + modL: modL, + scalarmult: scalarmult, + scalarbase: scalarbase, + }; -/* High-level API */ + /* High-level API */ -function checkLengths(k, n) { - if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); - if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); -} - -function checkBoxLengths(pk, sk) { - if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); - if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); -} - -function checkArrayTypes() { - for (var i = 0; i < arguments.length; i++) { - if (!(arguments[i] instanceof Uint8Array)) - throw new TypeError('unexpected type, use Uint8Array'); + function checkLengths(k, n) { + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error("bad key size"); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error("bad nonce size"); } -} -function cleanup(arr) { - for (var i = 0; i < arr.length; i++) arr[i] = 0; -} + function checkBoxLengths(pk, sk) { + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error("bad public key size"); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error("bad secret key size"); + } -nacl.randomBytes = function(n) { - var b = new Uint8Array(n); - randombytes(b, n); - return b; -}; + function checkArrayTypes() { + for (var i = 0; i < arguments.length; i++) { + if (!(arguments[i] instanceof Uint8Array)) throw new TypeError("unexpected type, use Uint8Array"); + } + } -nacl.secretbox = function(msg, nonce, key) { - checkArrayTypes(msg, nonce, key); - checkLengths(key, nonce); - var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); - var c = new Uint8Array(m.length); - for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; - crypto_secretbox(c, m, m.length, nonce, key); - return c.subarray(crypto_secretbox_BOXZEROBYTES); -}; + function cleanup(arr) { + for (var i = 0; i < arr.length; i++) arr[i] = 0; + } -nacl.secretbox.open = function(box, nonce, key) { - checkArrayTypes(box, nonce, key); - checkLengths(key, nonce); - var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); - var m = new Uint8Array(c.length); - for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; - if (c.length < 32) return null; - if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null; - return m.subarray(crypto_secretbox_ZEROBYTES); -}; + nacl.randomBytes = function (n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; + }; -nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; -nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; -nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; + nacl.secretbox = function (msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i + crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); + }; -nacl.scalarMult = function(n, p) { - checkArrayTypes(n, p); - if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); - if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); - var q = new Uint8Array(crypto_scalarmult_BYTES); - crypto_scalarmult(q, n, p); - return q; -}; + nacl.secretbox.open = function (box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i + crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return null; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null; + return m.subarray(crypto_secretbox_ZEROBYTES); + }; -nacl.scalarMult.base = function(n) { - checkArrayTypes(n); - if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); - var q = new Uint8Array(crypto_scalarmult_BYTES); - crypto_scalarmult_base(q, n); - return q; -}; + nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; + nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; + nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; -nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; -nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; + nacl.scalarMult = function (n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n size"); + if (p.length !== crypto_scalarmult_BYTES) throw new Error("bad p size"); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; + }; -nacl.box = function(msg, nonce, publicKey, secretKey) { - var k = nacl.box.before(publicKey, secretKey); - return nacl.secretbox(msg, nonce, k); -}; + nacl.scalarMult.base = function (n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n size"); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; + }; -nacl.box.before = function(publicKey, secretKey) { - checkArrayTypes(publicKey, secretKey); - checkBoxLengths(publicKey, secretKey); - var k = new Uint8Array(crypto_box_BEFORENMBYTES); - crypto_box_beforenm(k, publicKey, secretKey); - return k; -}; + nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; + nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; -nacl.box.after = nacl.secretbox; + nacl.box = function (msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); + }; -nacl.box.open = function(msg, nonce, publicKey, secretKey) { - var k = nacl.box.before(publicKey, secretKey); - return nacl.secretbox.open(msg, nonce, k); -}; + nacl.box.before = function (publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; + }; -nacl.box.open.after = nacl.secretbox.open; + nacl.box.after = nacl.secretbox; -nacl.box.keyPair = function() { - var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); - crypto_box_keypair(pk, sk); - return {publicKey: pk, secretKey: sk}; -}; + nacl.box.open = function (msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); + }; -nacl.box.keyPair.fromSecretKey = function(secretKey) { - checkArrayTypes(secretKey); - if (secretKey.length !== crypto_box_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); - crypto_scalarmult_base(pk, secretKey); - return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; -}; + nacl.box.open.after = nacl.secretbox.open; -nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; -nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; -nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; -nacl.box.nonceLength = crypto_box_NONCEBYTES; -nacl.box.overheadLength = nacl.secretbox.overheadLength; + nacl.box.keyPair = function () { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return { publicKey: pk, secretKey: sk }; + }; -nacl.sign = function(msg, secretKey) { - checkArrayTypes(msg, secretKey); - if (secretKey.length !== crypto_sign_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); - crypto_sign(signedMsg, msg, msg.length, secretKey); - return signedMsg; -}; + nacl.box.keyPair.fromSecretKey = function (secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) throw new Error("bad secret key size"); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; + }; -nacl.sign.open = function(signedMsg, publicKey) { - checkArrayTypes(signedMsg, publicKey); - if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) - throw new Error('bad public key size'); - var tmp = new Uint8Array(signedMsg.length); - var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); - if (mlen < 0) return null; - var m = new Uint8Array(mlen); - for (var i = 0; i < m.length; i++) m[i] = tmp[i]; - return m; -}; + nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; + nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; + nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; + nacl.box.nonceLength = crypto_box_NONCEBYTES; + nacl.box.overheadLength = nacl.secretbox.overheadLength; -nacl.sign.detached = function(msg, secretKey) { - var signedMsg = nacl.sign(msg, secretKey); - var sig = new Uint8Array(crypto_sign_BYTES); - for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; - return sig; -}; + nacl.sign = function (msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error("bad secret key size"); + var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; + }; -nacl.sign.detached.verify = function(msg, sig, publicKey) { - checkArrayTypes(msg, sig, publicKey); - if (sig.length !== crypto_sign_BYTES) - throw new Error('bad signature size'); - if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) - throw new Error('bad public key size'); - var sm = new Uint8Array(crypto_sign_BYTES + msg.length); - var m = new Uint8Array(crypto_sign_BYTES + msg.length); - var i; - for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; - for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; - return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); -}; + nacl.sign.open = function (signedMsg, publicKey) { + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error("bad public key size"); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; + }; -//!!! BANANO CHANGE: New function. I don't know what's going on, just looking at what bananojs changed -function derivePublicFromSecret(sk) { - let d = new Uint8Array(64); - const p = [gf(), gf(), gf(), gf()]; - let i; - const pk = new Uint8Array(32); + nacl.sign.detached = function (msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; + }; - d = crypto_hash_blake2b(sk, 64); + nacl.sign.detached.verify = function (msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) throw new Error("bad signature size"); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error("bad public key size"); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i]; + return crypto_sign_open(m, sm, sm.length, publicKey) >= 0; + }; - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; + //!!! BANANO CHANGE: New function. I don't know what's going on, just looking at what bananojs changed + function derivePublicFromSecret(sk) { + let d = new Uint8Array(64); + const p = [gf(), gf(), gf(), gf()]; + let i; + const pk = new Uint8Array(32); - scalarbase(p, d); - pack(pk, p); - return pk; -} + d = crypto_hash_blake2b(sk, 64); -nacl.sign.keyPair = function() { - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); - crypto_sign_keypair(pk, sk); - return {publicKey: pk, secretKey: sk}; -}; + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; -nacl.sign.keyPair.fromSecretKey = function(secretKey) { - checkArrayTypes(secretKey); - if (secretKey.length !== crypto_sign_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + scalarbase(p, d); + pack(pk, p); + return pk; + } - //!!! BANANO CHANGE: we are replacing the below line with other... math stuff. Again, I don't know what's going on, just looking at what bananojs changed - //for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; - pk = derivePublicFromSecret(secretKey); + nacl.sign.keyPair = function () { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return { publicKey: pk, secretKey: sk }; + }; - return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; -}; + nacl.sign.keyPair.fromSecretKey = function (secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error("bad secret key size"); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); -nacl.sign.keyPair.fromSeed = function(seed) { - checkArrayTypes(seed); - if (seed.length !== crypto_sign_SEEDBYTES) - throw new Error('bad seed size'); - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); - for (var i = 0; i < 32; i++) sk[i] = seed[i]; - crypto_sign_keypair(pk, sk, true); - return {publicKey: pk, secretKey: sk}; -}; + //!!! BANANO CHANGE: we are replacing the below line with other... math stuff. Again, I don't know what's going on, just looking at what bananojs changed + //for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; + pk = derivePublicFromSecret(secretKey); -nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; -nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; -nacl.sign.seedLength = crypto_sign_SEEDBYTES; -nacl.sign.signatureLength = crypto_sign_BYTES; + return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; + }; -nacl.hash = function(msg) { - checkArrayTypes(msg); - var h = new Uint8Array(crypto_hash_BYTES); - crypto_hash(h, msg, msg.length); - return h; -}; + nacl.sign.keyPair.fromSeed = function (seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) throw new Error("bad seed size"); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return { publicKey: pk, secretKey: sk }; + }; -nacl.hash.hashLength = crypto_hash_BYTES; + nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; + nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; + nacl.sign.seedLength = crypto_sign_SEEDBYTES; + nacl.sign.signatureLength = crypto_sign_BYTES; -nacl.verify = function(x, y) { - checkArrayTypes(x, y); - // Zero length arguments are considered not equal. - if (x.length === 0 || y.length === 0) return false; - if (x.length !== y.length) return false; - return (vn(x, 0, y, 0, x.length) === 0) ? true : false; -}; + nacl.hash = function (msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; + }; -nacl.setPRNG = function(fn) { - randombytes = fn; -}; + nacl.hash.hashLength = crypto_hash_BYTES; -(function() { - // Initialize PRNG if environment provides CSPRNG. - // If not, methods calling randombytes will throw. - var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; - if (crypto && crypto.getRandomValues) { - // Browsers. - var QUOTA = 65536; - nacl.setPRNG(function(x, n) { - var i, v = new Uint8Array(n); - for (i = 0; i < n; i += QUOTA) { - crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); - } - for (i = 0; i < n; i++) x[i] = v[i]; - cleanup(v); - }); - } else if (typeof require !== 'undefined') { - // Node.js. - NODE: crypto = require('crypto'); - if (crypto && crypto.randomBytes) { - nacl.setPRNG(function(x, n) { - var i, v = crypto.randomBytes(n); + nacl.verify = function (x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return vn(x, 0, y, 0, x.length) === 0 ? true : false; + }; + + nacl.setPRNG = function (fn) { + randombytes = fn; + }; + + (function () { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto = typeof self !== "undefined" ? self.crypto || self.msCrypto : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function (x, n) { + var i, + v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } for (i = 0; i < n; i++) x[i] = v[i]; cleanup(v); }); + } else if (typeof require !== "undefined") { + // Node.js. + NODE: crypto = require("crypto"); + if (crypto && crypto.randomBytes) { + nacl.setPRNG(function (x, n) { + var i, + v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } } - } -})(); - -})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); + })(); +})(typeof module !== "undefined" && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/tweetnacl_og.js b/tweetnacl_og.js index fd8e678..d124070 100644 --- a/tweetnacl_og.js +++ b/tweetnacl_og.js @@ -1,26 +1,33 @@ -(function(nacl) { -'use strict'; +(function (nacl) { + "use strict"; -// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. -// Public domain. -// -// Implementation derived from TweetNaCl version 20140427. -// See for details: http://tweetnacl.cr.yp.to/ + // Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. + // Public domain. + // + // Implementation derived from TweetNaCl version 20140427. + // See for details: http://tweetnacl.cr.yp.to/ -var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; }; -var gf = function(init) { - var i, r = new Float64Array(16); - if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; - return r; -}; + var u64 = function (h, l) { + this.hi = h | (0 >>> 0); + this.lo = l | (0 >>> 0); + }; + var gf = function (init) { + var i, + r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; + }; -// Pluggable, initialized in high-level API below. -var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; + // Pluggable, initialized in high-level API below. + var randombytes = function (/* x, n */) { + throw new Error("no PRNG"); + }; -var _0 = new Uint8Array(16); -var _9 = new Uint8Array(32); _9[0] = 9; + var _0 = new Uint8Array(16); + var _9 = new Uint8Array(32); + _9[0] = 9; -var gf0 = gf(), + var gf0 = gf(), gf1 = gf([1]), _121665 = gf([0xdb41, 1]), D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), @@ -29,835 +36,937 @@ var gf0 = gf(), Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); -function L32(x, c) { return (x << c) | (x >>> (32 - c)); } - -function ld32(x, i) { - var u = x[i+3] & 0xff; - u = (u<<8)|(x[i+2] & 0xff); - u = (u<<8)|(x[i+1] & 0xff); - return (u<<8)|(x[i+0] & 0xff); -} - -function dl64(x, i) { - var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3]; - var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7]; - return new u64(h, l); -} - -function st32(x, j, u) { - var i; - for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; } -} - -function ts64(x, i, u) { - x[i] = (u.hi >> 24) & 0xff; - x[i+1] = (u.hi >> 16) & 0xff; - x[i+2] = (u.hi >> 8) & 0xff; - x[i+3] = u.hi & 0xff; - x[i+4] = (u.lo >> 24) & 0xff; - x[i+5] = (u.lo >> 16) & 0xff; - x[i+6] = (u.lo >> 8) & 0xff; - x[i+7] = u.lo & 0xff; -} - -function vn(x, xi, y, yi, n) { - var i,d = 0; - for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; - return (1 & ((d - 1) >>> 8)) - 1; -} - -function crypto_verify_16(x, xi, y, yi) { - return vn(x,xi,y,yi,16); -} - -function crypto_verify_32(x, xi, y, yi) { - return vn(x,xi,y,yi,32); -} - -function core(out,inp,k,c,h) { - var w = new Uint32Array(16), x = new Uint32Array(16), - y = new Uint32Array(16), t = new Uint32Array(4); - var i, j, m; - - for (i = 0; i < 4; i++) { - x[5*i] = ld32(c, 4*i); - x[1+i] = ld32(k, 4*i); - x[6+i] = ld32(inp, 4*i); - x[11+i] = ld32(k, 16+4*i); + function L32(x, c) { + return (x << c) | (x >>> (32 - c)); } - for (i = 0; i < 16; i++) y[i] = x[i]; - - for (i = 0; i < 20; i++) { - for (j = 0; j < 4; j++) { - for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16]; - t[1] ^= L32((t[0]+t[3])|0, 7); - t[2] ^= L32((t[1]+t[0])|0, 9); - t[3] ^= L32((t[2]+t[1])|0,13); - t[0] ^= L32((t[3]+t[2])|0,18); - for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m]; - } - for (m = 0; m < 16; m++) x[m] = w[m]; + function ld32(x, i) { + var u = x[i + 3] & 0xff; + u = (u << 8) | (x[i + 2] & 0xff); + u = (u << 8) | (x[i + 1] & 0xff); + return (u << 8) | (x[i + 0] & 0xff); } - if (h) { - for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; + function dl64(x, i) { + var h = (x[i] << 24) | (x[i + 1] << 16) | (x[i + 2] << 8) | x[i + 3]; + var l = (x[i + 4] << 24) | (x[i + 5] << 16) | (x[i + 6] << 8) | x[i + 7]; + return new u64(h, l); + } + + function st32(x, j, u) { + var i; for (i = 0; i < 4; i++) { - x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0; - x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0; - } - for (i = 0; i < 4; i++) { - st32(out,4*i,x[5*i]); - st32(out,16+4*i,x[6+i]); - } - } else { - for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); - } -} - -function crypto_core_salsa20(out,inp,k,c) { - core(out,inp,k,c,false); - return 0; -} - -function crypto_core_hsalsa20(out,inp,k,c) { - core(out,inp,k,c,true); - return 0; -} - -var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); - // "expand 32-byte k" - -function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { - var z = new Uint8Array(16), x = new Uint8Array(64); - var u, i; - if (!b) return 0; - for (i = 0; i < 16; i++) z[i] = 0; - for (i = 0; i < 8; i++) z[i] = n[i]; - while (b >= 64) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; - u = 1; - for (i = 8; i < 16; i++) { - u = u + (z[i] & 0xff) | 0; - z[i] = u & 0xff; + x[j + i] = u & 255; u >>>= 8; } - b -= 64; - cpos += 64; - if (m) mpos += 64; } - if (b > 0) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; + + function ts64(x, i, u) { + x[i] = (u.hi >> 24) & 0xff; + x[i + 1] = (u.hi >> 16) & 0xff; + x[i + 2] = (u.hi >> 8) & 0xff; + x[i + 3] = u.hi & 0xff; + x[i + 4] = (u.lo >> 24) & 0xff; + x[i + 5] = (u.lo >> 16) & 0xff; + x[i + 6] = (u.lo >> 8) & 0xff; + x[i + 7] = u.lo & 0xff; } - return 0; -} -function crypto_stream_salsa20(c,cpos,d,n,k) { - return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k); -} - -function crypto_stream(c,cpos,d,n,k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s,n,k,sigma); - return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s); -} - -function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s,n,k,sigma); - return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s); -} - -function add1305(h, c) { - var j, u = 0; - for (j = 0; j < 17; j++) { - u = (u + ((h[j] + c[j]) | 0)) | 0; - h[j] = u & 255; - u >>>= 8; + function vn(x, xi, y, yi, n) { + var i, + d = 0; + for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]; + return (1 & ((d - 1) >>> 8)) - 1; } -} -var minusp = new Uint32Array([ - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 -]); + function crypto_verify_16(x, xi, y, yi) { + return vn(x, xi, y, yi, 16); + } -function crypto_onetimeauth(out, outpos, m, mpos, n, k) { - var s, i, j, u; - var x = new Uint32Array(17), r = new Uint32Array(17), - h = new Uint32Array(17), c = new Uint32Array(17), + function crypto_verify_32(x, xi, y, yi) { + return vn(x, xi, y, yi, 32); + } + + function core(out, inp, k, c, h) { + var w = new Uint32Array(16), + x = new Uint32Array(16), + y = new Uint32Array(16), + t = new Uint32Array(4); + var i, j, m; + + for (i = 0; i < 4; i++) { + x[5 * i] = ld32(c, 4 * i); + x[1 + i] = ld32(k, 4 * i); + x[6 + i] = ld32(inp, 4 * i); + x[11 + i] = ld32(k, 16 + 4 * i); + } + + for (i = 0; i < 16; i++) y[i] = x[i]; + + for (i = 0; i < 20; i++) { + for (j = 0; j < 4; j++) { + for (m = 0; m < 4; m++) t[m] = x[(5 * j + 4 * m) % 16]; + t[1] ^= L32((t[0] + t[3]) | 0, 7); + t[2] ^= L32((t[1] + t[0]) | 0, 9); + t[3] ^= L32((t[2] + t[1]) | 0, 13); + t[0] ^= L32((t[3] + t[2]) | 0, 18); + for (m = 0; m < 4; m++) w[4 * j + ((j + m) % 4)] = t[m]; + } + for (m = 0; m < 16; m++) x[m] = w[m]; + } + + if (h) { + for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; + for (i = 0; i < 4; i++) { + x[5 * i] = (x[5 * i] - ld32(c, 4 * i)) | 0; + x[6 + i] = (x[6 + i] - ld32(inp, 4 * i)) | 0; + } + for (i = 0; i < 4; i++) { + st32(out, 4 * i, x[5 * i]); + st32(out, 16 + 4 * i, x[6 + i]); + } + } else { + for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); + } + } + + function crypto_core_salsa20(out, inp, k, c) { + core(out, inp, k, c, false); + return 0; + } + + function crypto_core_hsalsa20(out, inp, k, c) { + core(out, inp, k, c, true); + return 0; + } + + var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); + // "expand 32-byte k" + + function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) { + var z = new Uint8Array(16), + x = new Uint8Array(64); + var u, i; + if (!b) return 0; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < 64; i++) c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = (u + (z[i] & 0xff)) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + if (m) mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x, z, k, sigma); + for (i = 0; i < b; i++) c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i]; + } + return 0; + } + + function crypto_stream_salsa20(c, cpos, d, n, k) { + return crypto_stream_salsa20_xor(c, cpos, null, 0, d, n, k); + } + + function crypto_stream(c, cpos, d, n, k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s, n, k, sigma); + return crypto_stream_salsa20(c, cpos, d, n.subarray(16), s); + } + + function crypto_stream_xor(c, cpos, m, mpos, d, n, k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s, n, k, sigma); + return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, n.subarray(16), s); + } + + function add1305(h, c) { + var j, + u = 0; + for (j = 0; j < 17; j++) { + u = (u + ((h[j] + c[j]) | 0)) | 0; + h[j] = u & 255; + u >>>= 8; + } + } + + var minusp = new Uint32Array([5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252]); + + function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s, i, j, u; + var x = new Uint32Array(17), + r = new Uint32Array(17), + h = new Uint32Array(17), + c = new Uint32Array(17), g = new Uint32Array(17); - for (j = 0; j < 17; j++) r[j]=h[j]=0; - for (j = 0; j < 16; j++) r[j]=k[j]; - r[3]&=15; - r[4]&=252; - r[7]&=15; - r[8]&=252; - r[11]&=15; - r[12]&=252; - r[15]&=15; + for (j = 0; j < 17; j++) r[j] = h[j] = 0; + for (j = 0; j < 16; j++) r[j] = k[j]; + r[3] &= 15; + r[4] &= 252; + r[7] &= 15; + r[8] &= 252; + r[11] &= 15; + r[12] &= 252; + r[15] &= 15; - while (n > 0) { - for (j = 0; j < 17; j++) c[j] = 0; - for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j]; - c[j] = 1; - mpos += j; n -= j; - add1305(h,c); - for (i = 0; i < 17; i++) { - x[i] = 0; - for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0; + while (n > 0) { + for (j = 0; j < 17; j++) c[j] = 0; + for (j = 0; j < 16 && j < n; ++j) c[j] = m[mpos + j]; + c[j] = 1; + mpos += j; + n -= j; + add1305(h, c); + for (i = 0; i < 17; i++) { + x[i] = 0; + for (j = 0; j < 17; j++) x[i] = (x[i] + h[j] * (j <= i ? r[i - j] : (320 * r[i + 17 - j]) | 0)) | 0 | 0; + } + for (i = 0; i < 17; i++) h[i] = x[i]; + u = 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; + h[16] = u & 3; + u = (5 * (u >>> 2)) | 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; + h[16] = u; } - for (i = 0; i < 17; i++) h[i] = x[i]; - u = 0; - for (j = 0; j < 16; j++) { - u = (u + h[j]) | 0; - h[j] = u & 255; - u >>>= 8; - } - u = (u + h[16]) | 0; h[16] = u & 3; - u = (5 * (u >>> 2)) | 0; - for (j = 0; j < 16; j++) { - u = (u + h[j]) | 0; - h[j] = u & 255; - u >>>= 8; - } - u = (u + h[16]) | 0; h[16] = u; + + for (j = 0; j < 17; j++) g[j] = h[j]; + add1305(h, minusp); + s = -(h[16] >>> 7) | 0; + for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); + + for (j = 0; j < 16; j++) c[j] = k[j + 16]; + c[16] = 0; + add1305(h, c); + for (j = 0; j < 16; j++) out[outpos + j] = h[j]; + return 0; } - for (j = 0; j < 17; j++) g[j] = h[j]; - add1305(h,minusp); - s = (-(h[16] >>> 7) | 0); - for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); + function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { + var x = new Uint8Array(16); + crypto_onetimeauth(x, 0, m, mpos, n, k); + return crypto_verify_16(h, hpos, x, 0); + } - for (j = 0; j < 16; j++) c[j] = k[j + 16]; - c[16] = 0; - add1305(h,c); - for (j = 0; j < 16; j++) out[outpos+j] = h[j]; - return 0; -} + function crypto_secretbox(c, m, d, n, k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c, 0, m, 0, d, n, k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; + } -function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { - var x = new Uint8Array(16); - crypto_onetimeauth(x,0,m,mpos,n,k); - return crypto_verify_16(h,hpos,x,0); -} + function crypto_secretbox_open(m, c, d, n, k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x, 0, 32, n, k); + if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1; + crypto_stream_xor(m, 0, c, 0, d, n, k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; + } -function crypto_secretbox(c,m,d,n,k) { - var i; - if (d < 32) return -1; - crypto_stream_xor(c,0,m,0,d,n,k); - crypto_onetimeauth(c, 16, c, 32, d - 32, c); - for (i = 0; i < 16; i++) c[i] = 0; - return 0; -} + function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i] | 0; + } -function crypto_secretbox_open(m,c,d,n,k) { - var i; - var x = new Uint8Array(32); - if (d < 32) return -1; - crypto_stream(x,0,32,n,k); - if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; - crypto_stream_xor(m,0,c,0,d,n,k); - for (i = 0; i < 32; i++) m[i] = 0; - return 0; -} - -function set25519(r, a) { - var i; - for (i = 0; i < 16; i++) r[i] = a[i]|0; -} - -function car25519(o) { - var c; - var i; - for (i = 0; i < 16; i++) { + function car25519(o) { + var c; + var i; + for (i = 0; i < 16; i++) { o[i] += 65536; c = Math.floor(o[i] / 65536); - o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0); - o[i] -= (c * 65536); - } -} - -function sel25519(p, q, b) { - var t, c = ~(b-1); - for (var i = 0; i < 16; i++) { - t = c & (p[i] ^ q[i]); - p[i] ^= t; - q[i] ^= t; - } -} - -function pack25519(o, n) { - var i, j, b; - var m = gf(), t = gf(); - for (i = 0; i < 16; i++) t[i] = n[i]; - car25519(t); - car25519(t); - car25519(t); - for (j = 0; j < 2; j++) { - m[0] = t[0] - 0xffed; - for (i = 1; i < 15; i++) { - m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); - m[i-1] &= 0xffff; - } - m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); - b = (m[15]>>16) & 1; - m[14] &= 0xffff; - sel25519(t, m, 1-b); - } - for (i = 0; i < 16; i++) { - o[2*i] = t[i] & 0xff; - o[2*i+1] = t[i]>>8; - } -} - -function neq25519(a, b) { - var c = new Uint8Array(32), d = new Uint8Array(32); - pack25519(c, a); - pack25519(d, b); - return crypto_verify_32(c, 0, d, 0); -} - -function par25519(a) { - var d = new Uint8Array(32); - pack25519(d, a); - return d[0] & 1; -} - -function unpack25519(o, n) { - var i; - for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); - o[15] &= 0x7fff; -} - -function A(o, a, b) { - var i; - for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0; -} - -function Z(o, a, b) { - var i; - for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0; -} - -function M(o, a, b) { - var i, j, t = new Float64Array(31); - for (i = 0; i < 31; i++) t[i] = 0; - for (i = 0; i < 16; i++) { - for (j = 0; j < 16; j++) { - t[i+j] += a[i] * b[j]; + o[(i + 1) * (i < 15 ? 1 : 0)] += c - 1 + 37 * (c - 1) * (i === 15 ? 1 : 0); + o[i] -= c * 65536; } } - for (i = 0; i < 15; i++) { - t[i] += 38 * t[i+16]; + + function sel25519(p, q, b) { + var t, + c = ~(b - 1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } } - for (i = 0; i < 16; i++) o[i] = t[i]; - car25519(o); - car25519(o); -} -function S(o, a) { - M(o, a, a); -} - -function inv25519(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 253; a >= 0; a--) { - S(c, c); - if(a !== 2 && a !== 4) M(c, c, i); + function pack25519(o, n) { + var i, j, b; + var m = gf(), + t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1); + m[i - 1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1); + b = (m[15] >> 16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1 - b); + } + for (i = 0; i < 16; i++) { + o[2 * i] = t[i] & 0xff; + o[2 * i + 1] = t[i] >> 8; + } } - for (a = 0; a < 16; a++) o[a] = c[a]; -} -function pow2523(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 250; a >= 0; a--) { + function neq25519(a, b) { + var c = new Uint8Array(32), + d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); + } + + function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; + } + + function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8); + o[15] &= 0x7fff; + } + + function A(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] + b[i]) | 0; + } + + function Z(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] - b[i]) | 0; + } + + function M(o, a, b) { + var i, + j, + t = new Float64Array(31); + for (i = 0; i < 31; i++) t[i] = 0; + for (i = 0; i < 16; i++) { + for (j = 0; j < 16; j++) { + t[i + j] += a[i] * b[j]; + } + } + for (i = 0; i < 15; i++) { + t[i] += 38 * t[i + 16]; + } + for (i = 0; i < 16; i++) o[i] = t[i]; + car25519(o); + car25519(o); + } + + function S(o, a) { + M(o, a, a); + } + + function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { S(c, c); - if(a !== 1) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; -} - -function crypto_scalarmult(q, n, p) { - var z = new Uint8Array(32); - var x = new Float64Array(80), r, i; - var a = gf(), b = gf(), c = gf(), - d = gf(), e = gf(), f = gf(); - for (i = 0; i < 31; i++) z[i] = n[i]; - z[31]=(n[31]&127)|64; - z[0]&=248; - unpack25519(x,p); - for (i = 0; i < 16; i++) { - b[i]=x[i]; - d[i]=a[i]=c[i]=0; - } - a[0]=d[0]=1; - for (i=254; i>=0; --i) { - r=(z[i>>>3]>>>(i&7))&1; - sel25519(a,b,r); - sel25519(c,d,r); - A(e,a,c); - Z(a,a,c); - A(c,b,d); - Z(b,b,d); - S(d,e); - S(f,a); - M(a,c,a); - M(c,b,e); - A(e,a,c); - Z(a,a,c); - S(b,a); - Z(c,d,f); - M(a,c,_121665); - A(a,a,d); - M(c,c,a); - M(a,d,f); - M(d,b,x); - S(b,e); - sel25519(a,b,r); - sel25519(c,d,r); - } - for (i = 0; i < 16; i++) { - x[i+16]=a[i]; - x[i+32]=c[i]; - x[i+48]=b[i]; - x[i+64]=d[i]; - } - var x32 = x.subarray(32); - var x16 = x.subarray(16); - inv25519(x32,x32); - M(x16,x16,x32); - pack25519(q,x16); - return 0; -} - -function crypto_scalarmult_base(q, n) { - return crypto_scalarmult(q, n, _9); -} - -function crypto_box_keypair(y, x) { - randombytes(x, 32); - return crypto_scalarmult_base(y, x); -} - -function crypto_box_beforenm(k, y, x) { - var s = new Uint8Array(32); - crypto_scalarmult(s, x, y); - return crypto_core_hsalsa20(k, _0, s, sigma); -} - -var crypto_box_afternm = crypto_secretbox; -var crypto_box_open_afternm = crypto_secretbox_open; - -function crypto_box(c, m, d, n, y, x) { - var k = new Uint8Array(32); - crypto_box_beforenm(k, y, x); - return crypto_box_afternm(c, m, d, n, k); -} - -function crypto_box_open(m, c, d, n, y, x) { - var k = new Uint8Array(32); - crypto_box_beforenm(k, y, x); - return crypto_box_open_afternm(m, c, d, n, k); -} - -function add64() { - var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i; - for (i = 0; i < arguments.length; i++) { - l = arguments[i].lo; - h = arguments[i].hi; - a += (l & m16); b += (l >>> 16); - c += (h & m16); d += (h >>> 16); + if (a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; } - b += (a >>> 16); - c += (b >>> 16); - d += (c >>> 16); - - return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); -} - -function shr64(x, c) { - return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c))); -} - -function xor64() { - var l = 0, h = 0, i; - for (i = 0; i < arguments.length; i++) { - l ^= arguments[i].lo; - h ^= arguments[i].hi; + function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if (a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; } - return new u64(h, l); -} -function R(x, c) { - var h, l, c1 = 32 - c; - if (c < 32) { - h = (x.hi >>> c) | (x.lo << c1); - l = (x.lo >>> c) | (x.hi << c1); - } else if (c < 64) { - h = (x.lo >>> c) | (x.hi << c1); - l = (x.hi >>> c) | (x.lo << c1); + function crypto_scalarmult(q, n, p) { + var z = new Uint8Array(32); + var x = new Float64Array(80), + r, + i; + var a = gf(), + b = gf(), + c = gf(), + d = gf(), + e = gf(), + f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31] = (n[31] & 127) | 64; + z[0] &= 248; + unpack25519(x, p); + for (i = 0; i < 16; i++) { + b[i] = x[i]; + d[i] = a[i] = c[i] = 0; + } + a[0] = d[0] = 1; + for (i = 254; i >= 0; --i) { + r = (z[i >>> 3] >>> (i & 7)) & 1; + sel25519(a, b, r); + sel25519(c, d, r); + A(e, a, c); + Z(a, a, c); + A(c, b, d); + Z(b, b, d); + S(d, e); + S(f, a); + M(a, c, a); + M(c, b, e); + A(e, a, c); + Z(a, a, c); + S(b, a); + Z(c, d, f); + M(a, c, _121665); + A(a, a, d); + M(c, c, a); + M(a, d, f); + M(d, b, x); + S(b, e); + sel25519(a, b, r); + sel25519(c, d, r); + } + for (i = 0; i < 16; i++) { + x[i + 16] = a[i]; + x[i + 32] = c[i]; + x[i + 48] = b[i]; + x[i + 64] = d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32, x32); + M(x16, x16, x32); + pack25519(q, x16); + return 0; } - return new u64(h, l); -} -function Ch(x, y, z) { - var h = (x.hi & y.hi) ^ (~x.hi & z.hi), + function crypto_scalarmult_base(q, n) { + return crypto_scalarmult(q, n, _9); + } + + function crypto_box_keypair(y, x) { + randombytes(x, 32); + return crypto_scalarmult_base(y, x); + } + + function crypto_box_beforenm(k, y, x) { + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); + } + + var crypto_box_afternm = crypto_secretbox; + var crypto_box_open_afternm = crypto_secretbox_open; + + function crypto_box(c, m, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); + } + + function crypto_box_open(m, c, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); + } + + function add64() { + var a = 0, + b = 0, + c = 0, + d = 0, + m16 = 65535, + l, + h, + i; + for (i = 0; i < arguments.length; i++) { + l = arguments[i].lo; + h = arguments[i].hi; + a += l & m16; + b += l >>> 16; + c += h & m16; + d += h >>> 16; + } + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); + } + + function shr64(x, c) { + return new u64(x.hi >>> c, (x.lo >>> c) | (x.hi << (32 - c))); + } + + function xor64() { + var l = 0, + h = 0, + i; + for (i = 0; i < arguments.length; i++) { + l ^= arguments[i].lo; + h ^= arguments[i].hi; + } + return new u64(h, l); + } + + function R(x, c) { + var h, + l, + c1 = 32 - c; + if (c < 32) { + h = (x.hi >>> c) | (x.lo << c1); + l = (x.lo >>> c) | (x.hi << c1); + } else if (c < 64) { + h = (x.lo >>> c) | (x.hi << c1); + l = (x.hi >>> c) | (x.lo << c1); + } + return new u64(h, l); + } + + function Ch(x, y, z) { + var h = (x.hi & y.hi) ^ (~x.hi & z.hi), l = (x.lo & y.lo) ^ (~x.lo & z.lo); - return new u64(h, l); -} + return new u64(h, l); + } -function Maj(x, y, z) { - var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), + function Maj(x, y, z) { + var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo); - return new u64(h, l); -} + return new u64(h, l); + } -function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); } -function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); } -function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); } -function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); } + function Sigma0(x) { + return xor64(R(x, 28), R(x, 34), R(x, 39)); + } + function Sigma1(x) { + return xor64(R(x, 14), R(x, 18), R(x, 41)); + } + function sigma0(x) { + return xor64(R(x, 1), R(x, 8), shr64(x, 7)); + } + function sigma1(x) { + return xor64(R(x, 19), R(x, 61), shr64(x, 6)); + } -var K = [ - new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd), - new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc), - new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019), - new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118), - new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe), - new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2), - new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1), - new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694), - new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3), - new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65), - new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483), - new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5), - new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210), - new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4), - new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725), - new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70), - new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926), - new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df), - new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8), - new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b), - new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001), - new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30), - new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910), - new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8), - new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53), - new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8), - new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb), - new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3), - new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60), - new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec), - new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9), - new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b), - new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207), - new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178), - new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6), - new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b), - new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493), - new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c), - new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a), - new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817) -]; + var K = [ + new u64(0x428a2f98, 0xd728ae22), + new u64(0x71374491, 0x23ef65cd), + new u64(0xb5c0fbcf, 0xec4d3b2f), + new u64(0xe9b5dba5, 0x8189dbbc), + new u64(0x3956c25b, 0xf348b538), + new u64(0x59f111f1, 0xb605d019), + new u64(0x923f82a4, 0xaf194f9b), + new u64(0xab1c5ed5, 0xda6d8118), + new u64(0xd807aa98, 0xa3030242), + new u64(0x12835b01, 0x45706fbe), + new u64(0x243185be, 0x4ee4b28c), + new u64(0x550c7dc3, 0xd5ffb4e2), + new u64(0x72be5d74, 0xf27b896f), + new u64(0x80deb1fe, 0x3b1696b1), + new u64(0x9bdc06a7, 0x25c71235), + new u64(0xc19bf174, 0xcf692694), + new u64(0xe49b69c1, 0x9ef14ad2), + new u64(0xefbe4786, 0x384f25e3), + new u64(0x0fc19dc6, 0x8b8cd5b5), + new u64(0x240ca1cc, 0x77ac9c65), + new u64(0x2de92c6f, 0x592b0275), + new u64(0x4a7484aa, 0x6ea6e483), + new u64(0x5cb0a9dc, 0xbd41fbd4), + new u64(0x76f988da, 0x831153b5), + new u64(0x983e5152, 0xee66dfab), + new u64(0xa831c66d, 0x2db43210), + new u64(0xb00327c8, 0x98fb213f), + new u64(0xbf597fc7, 0xbeef0ee4), + new u64(0xc6e00bf3, 0x3da88fc2), + new u64(0xd5a79147, 0x930aa725), + new u64(0x06ca6351, 0xe003826f), + new u64(0x14292967, 0x0a0e6e70), + new u64(0x27b70a85, 0x46d22ffc), + new u64(0x2e1b2138, 0x5c26c926), + new u64(0x4d2c6dfc, 0x5ac42aed), + new u64(0x53380d13, 0x9d95b3df), + new u64(0x650a7354, 0x8baf63de), + new u64(0x766a0abb, 0x3c77b2a8), + new u64(0x81c2c92e, 0x47edaee6), + new u64(0x92722c85, 0x1482353b), + new u64(0xa2bfe8a1, 0x4cf10364), + new u64(0xa81a664b, 0xbc423001), + new u64(0xc24b8b70, 0xd0f89791), + new u64(0xc76c51a3, 0x0654be30), + new u64(0xd192e819, 0xd6ef5218), + new u64(0xd6990624, 0x5565a910), + new u64(0xf40e3585, 0x5771202a), + new u64(0x106aa070, 0x32bbd1b8), + new u64(0x19a4c116, 0xb8d2d0c8), + new u64(0x1e376c08, 0x5141ab53), + new u64(0x2748774c, 0xdf8eeb99), + new u64(0x34b0bcb5, 0xe19b48a8), + new u64(0x391c0cb3, 0xc5c95a63), + new u64(0x4ed8aa4a, 0xe3418acb), + new u64(0x5b9cca4f, 0x7763e373), + new u64(0x682e6ff3, 0xd6b2b8a3), + new u64(0x748f82ee, 0x5defb2fc), + new u64(0x78a5636f, 0x43172f60), + new u64(0x84c87814, 0xa1f0ab72), + new u64(0x8cc70208, 0x1a6439ec), + new u64(0x90befffa, 0x23631e28), + new u64(0xa4506ceb, 0xde82bde9), + new u64(0xbef9a3f7, 0xb2c67915), + new u64(0xc67178f2, 0xe372532b), + new u64(0xca273ece, 0xea26619c), + new u64(0xd186b8c7, 0x21c0c207), + new u64(0xeada7dd6, 0xcde0eb1e), + new u64(0xf57d4f7f, 0xee6ed178), + new u64(0x06f067aa, 0x72176fba), + new u64(0x0a637dc5, 0xa2c898a6), + new u64(0x113f9804, 0xbef90dae), + new u64(0x1b710b35, 0x131c471b), + new u64(0x28db77f5, 0x23047d84), + new u64(0x32caab7b, 0x40c72493), + new u64(0x3c9ebe0a, 0x15c9bebc), + new u64(0x431d67c4, 0x9c100d4c), + new u64(0x4cc5d4be, 0xcb3e42b6), + new u64(0x597f299c, 0xfc657e2a), + new u64(0x5fcb6fab, 0x3ad6faec), + new u64(0x6c44198c, 0x4a475817), + ]; -function crypto_hashblocks(x, m, n) { - var z = [], b = [], a = [], w = [], t, i, j; + function crypto_hashblocks(x, m, n) { + var z = [], + b = [], + a = [], + w = [], + t, + i, + j; - for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i); + for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8 * i); - var pos = 0; - while (n >= 128) { - for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos); - for (i = 0; i < 80; i++) { - for (j = 0; j < 8; j++) b[j] = a[j]; - t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]); - b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); - b[3] = add64(b[3], t); - for (j = 0; j < 8; j++) a[(j+1)%8] = b[j]; - if (i%16 === 15) { - for (j = 0; j < 16; j++) { - w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16])); + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) w[i] = dl64(m, 8 * i + pos); + for (i = 0; i < 80; i++) { + for (j = 0; j < 8; j++) b[j] = a[j]; + t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i % 16]); + b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); + b[3] = add64(b[3], t); + for (j = 0; j < 8; j++) a[(j + 1) % 8] = b[j]; + if (i % 16 === 15) { + for (j = 0; j < 16; j++) { + w[j] = add64(w[j], w[(j + 9) % 16], sigma0(w[(j + 1) % 16]), sigma1(w[(j + 14) % 16])); + } } } + + for (i = 0; i < 8; i++) { + a[i] = add64(a[i], z[i]); + z[i] = a[i]; + } + + pos += 128; + n -= 128; + } + + for (i = 0; i < 8; i++) ts64(x, 8 * i, z[i]); + return n; + } + + var iv = new Uint8Array([0x6a, 0x09, 0xe6, 0x67, 0xf3, 0xbc, 0xc9, 0x08, 0xbb, 0x67, 0xae, 0x85, 0x84, 0xca, 0xa7, 0x3b, 0x3c, 0x6e, 0xf3, 0x72, 0xfe, 0x94, 0xf8, 0x2b, 0xa5, 0x4f, 0xf5, 0x3a, 0x5f, 0x1d, 0x36, 0xf1, 0x51, 0x0e, 0x52, 0x7f, 0xad, 0xe6, 0x82, 0xd1, 0x9b, 0x05, 0x68, 0x8c, 0x2b, 0x3e, 0x6c, 0x1f, 0x1f, 0x83, 0xd9, 0xab, 0xfb, 0x41, 0xbd, 0x6b, 0x5b, 0xe0, 0xcd, 0x19, 0x13, 0x7e, 0x21, 0x79]); + + function crypto_hash(out, m, n) { + var h = new Uint8Array(64), + x = new Uint8Array(256); + var i, + b = n; + + for (i = 0; i < 64; i++) h[i] = iv[i]; + + crypto_hashblocks(h, m, n); + n %= 128; + + for (i = 0; i < 256; i++) x[i] = 0; + for (i = 0; i < n; i++) x[i] = m[b - n + i]; + x[n] = 128; + + n = 256 - 128 * (n < 112 ? 1 : 0); + x[n - 9] = 0; + ts64(x, n - 8, new u64((b / 0x20000000) | 0, b << 3)); + crypto_hashblocks(h, x, n); + + for (i = 0; i < 64; i++) out[i] = h[i]; + + return 0; + } + + function add(p, q) { + var a = gf(), + b = gf(), + c = gf(), + d = gf(), + e = gf(), + f = gf(), + g = gf(), + h = gf(), + t = gf(); + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); + } + + function cswap(p, q, b) { + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } + } + + function pack(r, p) { + var tx = gf(), + ty = gf(), + zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; + } + + function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i / 8) | 0] >> (i & 7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } + } + + function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); + } + + function crypto_sign_keypair(pk, sk, seeded) { + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; + + if (!seeded) randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p, d); + pack(pk, p); + + for (i = 0; i < 32; i++) sk[i + 32] = pk[i]; + return 0; + } + + var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); + + function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = Math.floor((x[j] + 128) / 256); + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i + 1] += x[i] >> 8; + r[i] = x[i] & 255; + } + } + + function reduce(r) { + var x = new Float64Array(64), + i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); + } + + // Note: difference from C - smlen returned, not passed as argument. + function crypto_sign(sm, m, n, sk) { + var d = new Uint8Array(64), + h = new Uint8Array(64), + r = new Uint8Array(64); + var i, + j, + x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm.subarray(32), n + 32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + + for (i = 32; i < 64; i++) sm[i] = sk[i]; + crypto_hash(h, sm, n + 64); + reduce(h); + + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i + j] += h[i] * d[j]; + } } - for (i = 0; i < 8; i++) { - a[i] = add64(a[i], z[i]); - z[i] = a[i]; - } - - pos += 128; - n -= 128; + modL(sm.subarray(32), x); + return smlen; } - for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]); - return n; -} - -var iv = new Uint8Array([ - 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, - 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, - 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, - 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, - 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, - 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, - 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, - 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 -]); - -function crypto_hash(out, m, n) { - var h = new Uint8Array(64), x = new Uint8Array(256); - var i, b = n; - - for (i = 0; i < 64; i++) h[i] = iv[i]; - - crypto_hashblocks(h, m, n); - n %= 128; - - for (i = 0; i < 256; i++) x[i] = 0; - for (i = 0; i < n; i++) x[i] = m[b-n+i]; - x[n] = 128; - - n = 256-128*(n<112?1:0); - x[n-9] = 0; - ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3)); - crypto_hashblocks(h, x, n); - - for (i = 0; i < 64; i++) out[i] = h[i]; - - return 0; -} - -function add(p, q) { - var a = gf(), b = gf(), c = gf(), - d = gf(), e = gf(), f = gf(), - g = gf(), h = gf(), t = gf(); - - Z(a, p[1], p[0]); - Z(t, q[1], q[0]); - M(a, a, t); - A(b, p[0], p[1]); - A(t, q[0], q[1]); - M(b, b, t); - M(c, p[3], q[3]); - M(c, c, D2); - M(d, p[2], q[2]); - A(d, d, d); - Z(e, b, a); - Z(f, d, c); - A(g, d, c); - A(h, b, a); - - M(p[0], e, f); - M(p[1], h, g); - M(p[2], g, f); - M(p[3], e, h); -} - -function cswap(p, q, b) { - var i; - for (i = 0; i < 4; i++) { - sel25519(p[i], q[i], b); - } -} - -function pack(r, p) { - var tx = gf(), ty = gf(), zi = gf(); - inv25519(zi, p[2]); - M(tx, p[0], zi); - M(ty, p[1], zi); - pack25519(r, ty); - r[31] ^= par25519(tx) << 7; -} - -function scalarmult(p, q, s) { - var b, i; - set25519(p[0], gf0); - set25519(p[1], gf1); - set25519(p[2], gf1); - set25519(p[3], gf0); - for (i = 255; i >= 0; --i) { - b = (s[(i/8)|0] >> (i&7)) & 1; - cswap(p, q, b); - add(q, p); - add(p, p); - cswap(p, q, b); - } -} - -function scalarbase(p, s) { - var q = [gf(), gf(), gf(), gf()]; - set25519(q[0], X); - set25519(q[1], Y); - set25519(q[2], gf1); - M(q[3], X, Y); - scalarmult(p, q, s); -} - -function crypto_sign_keypair(pk, sk, seeded) { - var d = new Uint8Array(64); - var p = [gf(), gf(), gf(), gf()]; - var i; - - if (!seeded) randombytes(sk, 32); - crypto_hash(d, sk, 32); - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; - - scalarbase(p, d); - pack(pk, p); - - for (i = 0; i < 32; i++) sk[i+32] = pk[i]; - return 0; -} - -var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); - -function modL(r, x) { - var carry, i, j, k; - for (i = 63; i >= 32; --i) { - carry = 0; - for (j = i - 32, k = i - 12; j < k; ++j) { - x[j] += carry - 16 * x[i] * L[j - (i - 32)]; - carry = Math.floor((x[j] + 128) / 256); - x[j] -= carry * 256; - } - x[j] += carry; - x[i] = 0; - } - carry = 0; - for (j = 0; j < 32; j++) { - x[j] += carry - (x[31] >> 4) * L[j]; - carry = x[j] >> 8; - x[j] &= 255; - } - for (j = 0; j < 32; j++) x[j] -= carry * L[j]; - for (i = 0; i < 32; i++) { - x[i+1] += x[i] >> 8; - r[i] = x[i] & 255; - } -} - -function reduce(r) { - var x = new Float64Array(64), i; - for (i = 0; i < 64; i++) x[i] = r[i]; - for (i = 0; i < 64; i++) r[i] = 0; - modL(r, x); -} - -// Note: difference from C - smlen returned, not passed as argument. -function crypto_sign(sm, m, n, sk) { - var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); - var i, j, x = new Float64Array(64); - var p = [gf(), gf(), gf(), gf()]; - - crypto_hash(d, sk, 32); - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; - - var smlen = n + 64; - for (i = 0; i < n; i++) sm[64 + i] = m[i]; - for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; - - crypto_hash(r, sm.subarray(32), n+32); - reduce(r); - scalarbase(p, r); - pack(sm, p); - - for (i = 32; i < 64; i++) sm[i] = sk[i]; - crypto_hash(h, sm, n + 64); - reduce(h); - - for (i = 0; i < 64; i++) x[i] = 0; - for (i = 0; i < 32; i++) x[i] = r[i]; - for (i = 0; i < 32; i++) { - for (j = 0; j < 32; j++) { - x[i+j] += h[i] * d[j]; - } - } - - modL(sm.subarray(32), x); - return smlen; -} - -function unpackneg(r, p) { - var t = gf(), chk = gf(), num = gf(), - den = gf(), den2 = gf(), den4 = gf(), + function unpackneg(r, p) { + var t = gf(), + chk = gf(), + num = gf(), + den = gf(), + den2 = gf(), + den4 = gf(), den6 = gf(); - set25519(r[2], gf1); - unpack25519(r[1], p); - S(num, r[1]); - M(den, num, D); - Z(num, num, r[2]); - A(den, r[2], den); + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); - S(den2, den); - S(den4, den2); - M(den6, den4, den2); - M(t, den6, num); - M(t, t, den); + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); - pow2523(t, t); - M(t, t, num); - M(t, t, den); - M(t, t, den); - M(r[0], t, den); + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) M(r[0], r[0], I); + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) return -1; + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; - if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + if (par25519(r[0]) === p[31] >> 7) Z(r[0], gf0, r[0]); - M(r[3], r[0], r[1]); - return 0; -} - -function crypto_sign_open(m, sm, n, pk) { - var i; - var t = new Uint8Array(32), h = new Uint8Array(64); - var p = [gf(), gf(), gf(), gf()], - q = [gf(), gf(), gf(), gf()]; - - if (n < 64) return -1; - - if (unpackneg(q, pk)) return -1; - - for (i = 0; i < n; i++) m[i] = sm[i]; - for (i = 0; i < 32; i++) m[i+32] = pk[i]; - crypto_hash(h, m, n); - reduce(h); - scalarmult(p, q, h); - - scalarbase(q, sm.subarray(32)); - add(p, q); - pack(t, p); - - n -= 64; - if (crypto_verify_32(sm, 0, t, 0)) { - for (i = 0; i < n; i++) m[i] = 0; - return -1; + M(r[3], r[0], r[1]); + return 0; } - for (i = 0; i < n; i++) m[i] = sm[i + 64]; - return n; -} + function crypto_sign_open(m, sm, n, pk) { + var i; + var t = new Uint8Array(32), + h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; -var crypto_secretbox_KEYBYTES = 32, + if (n < 64) return -1; + + if (unpackneg(q, pk)) return -1; + + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i + 32] = pk[i]; + crypto_hash(h, m, n); + reduce(h); + scalarmult(p, q, h); + + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } + + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + return n; + } + + var crypto_secretbox_KEYBYTES = 32, crypto_secretbox_NONCEBYTES = 24, crypto_secretbox_ZEROBYTES = 32, crypto_secretbox_BOXZEROBYTES = 16, @@ -875,304 +984,297 @@ var crypto_secretbox_KEYBYTES = 32, crypto_sign_SEEDBYTES = 32, crypto_hash_BYTES = 64; -nacl.lowlevel = { - crypto_core_hsalsa20: crypto_core_hsalsa20, - crypto_stream_xor: crypto_stream_xor, - crypto_stream: crypto_stream, - crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, - crypto_stream_salsa20: crypto_stream_salsa20, - crypto_onetimeauth: crypto_onetimeauth, - crypto_onetimeauth_verify: crypto_onetimeauth_verify, - crypto_verify_16: crypto_verify_16, - crypto_verify_32: crypto_verify_32, - crypto_secretbox: crypto_secretbox, - crypto_secretbox_open: crypto_secretbox_open, - crypto_scalarmult: crypto_scalarmult, - crypto_scalarmult_base: crypto_scalarmult_base, - crypto_box_beforenm: crypto_box_beforenm, - crypto_box_afternm: crypto_box_afternm, - crypto_box: crypto_box, - crypto_box_open: crypto_box_open, - crypto_box_keypair: crypto_box_keypair, - crypto_hash: crypto_hash, - crypto_sign: crypto_sign, - crypto_sign_keypair: crypto_sign_keypair, - crypto_sign_open: crypto_sign_open, + nacl.lowlevel = { + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, - crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, - crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, - crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, - crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, - crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, - crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, - crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, - crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, - crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, - crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, - crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, - crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, - crypto_sign_BYTES: crypto_sign_BYTES, - crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, - crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, - crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, - crypto_hash_BYTES: crypto_hash_BYTES, + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES, - gf: gf, - D: D, - L: L, - pack25519: pack25519, - unpack25519: unpack25519, - M: M, - A: A, - S: S, - Z: Z, - pow2523: pow2523, - add: add, - set25519: set25519, - modL: modL, - scalarmult: scalarmult, - scalarbase: scalarbase, -}; + gf: gf, + D: D, + L: L, + pack25519: pack25519, + unpack25519: unpack25519, + M: M, + A: A, + S: S, + Z: Z, + pow2523: pow2523, + add: add, + set25519: set25519, + modL: modL, + scalarmult: scalarmult, + scalarbase: scalarbase, + }; -/* High-level API */ + /* High-level API */ -function checkLengths(k, n) { - if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); - if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); -} - -function checkBoxLengths(pk, sk) { - if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); - if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); -} - -function checkArrayTypes() { - for (var i = 0; i < arguments.length; i++) { - if (!(arguments[i] instanceof Uint8Array)) - throw new TypeError('unexpected type, use Uint8Array'); + function checkLengths(k, n) { + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error("bad key size"); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error("bad nonce size"); } -} -function cleanup(arr) { - for (var i = 0; i < arr.length; i++) arr[i] = 0; -} + function checkBoxLengths(pk, sk) { + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error("bad public key size"); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error("bad secret key size"); + } -nacl.randomBytes = function(n) { - var b = new Uint8Array(n); - randombytes(b, n); - return b; -}; + function checkArrayTypes() { + for (var i = 0; i < arguments.length; i++) { + if (!(arguments[i] instanceof Uint8Array)) throw new TypeError("unexpected type, use Uint8Array"); + } + } -nacl.secretbox = function(msg, nonce, key) { - checkArrayTypes(msg, nonce, key); - checkLengths(key, nonce); - var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); - var c = new Uint8Array(m.length); - for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; - crypto_secretbox(c, m, m.length, nonce, key); - return c.subarray(crypto_secretbox_BOXZEROBYTES); -}; + function cleanup(arr) { + for (var i = 0; i < arr.length; i++) arr[i] = 0; + } -nacl.secretbox.open = function(box, nonce, key) { - checkArrayTypes(box, nonce, key); - checkLengths(key, nonce); - var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); - var m = new Uint8Array(c.length); - for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; - if (c.length < 32) return null; - if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null; - return m.subarray(crypto_secretbox_ZEROBYTES); -}; + nacl.randomBytes = function (n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; + }; -nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; -nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; -nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; + nacl.secretbox = function (msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i + crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); + }; -nacl.scalarMult = function(n, p) { - checkArrayTypes(n, p); - if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); - if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); - var q = new Uint8Array(crypto_scalarmult_BYTES); - crypto_scalarmult(q, n, p); - return q; -}; + nacl.secretbox.open = function (box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i + crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return null; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null; + return m.subarray(crypto_secretbox_ZEROBYTES); + }; -nacl.scalarMult.base = function(n) { - checkArrayTypes(n); - if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); - var q = new Uint8Array(crypto_scalarmult_BYTES); - crypto_scalarmult_base(q, n); - return q; -}; + nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; + nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; + nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; -nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; -nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; + nacl.scalarMult = function (n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n size"); + if (p.length !== crypto_scalarmult_BYTES) throw new Error("bad p size"); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; + }; -nacl.box = function(msg, nonce, publicKey, secretKey) { - var k = nacl.box.before(publicKey, secretKey); - return nacl.secretbox(msg, nonce, k); -}; + nacl.scalarMult.base = function (n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n size"); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; + }; -nacl.box.before = function(publicKey, secretKey) { - checkArrayTypes(publicKey, secretKey); - checkBoxLengths(publicKey, secretKey); - var k = new Uint8Array(crypto_box_BEFORENMBYTES); - crypto_box_beforenm(k, publicKey, secretKey); - return k; -}; + nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; + nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; -nacl.box.after = nacl.secretbox; + nacl.box = function (msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); + }; -nacl.box.open = function(msg, nonce, publicKey, secretKey) { - var k = nacl.box.before(publicKey, secretKey); - return nacl.secretbox.open(msg, nonce, k); -}; + nacl.box.before = function (publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; + }; -nacl.box.open.after = nacl.secretbox.open; + nacl.box.after = nacl.secretbox; -nacl.box.keyPair = function() { - var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); - crypto_box_keypair(pk, sk); - return {publicKey: pk, secretKey: sk}; -}; + nacl.box.open = function (msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); + }; -nacl.box.keyPair.fromSecretKey = function(secretKey) { - checkArrayTypes(secretKey); - if (secretKey.length !== crypto_box_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); - crypto_scalarmult_base(pk, secretKey); - return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; -}; + nacl.box.open.after = nacl.secretbox.open; -nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; -nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; -nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; -nacl.box.nonceLength = crypto_box_NONCEBYTES; -nacl.box.overheadLength = nacl.secretbox.overheadLength; + nacl.box.keyPair = function () { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return { publicKey: pk, secretKey: sk }; + }; -nacl.sign = function(msg, secretKey) { - checkArrayTypes(msg, secretKey); - if (secretKey.length !== crypto_sign_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); - crypto_sign(signedMsg, msg, msg.length, secretKey); - return signedMsg; -}; + nacl.box.keyPair.fromSecretKey = function (secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) throw new Error("bad secret key size"); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; + }; -nacl.sign.open = function(signedMsg, publicKey) { - checkArrayTypes(signedMsg, publicKey); - if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) - throw new Error('bad public key size'); - var tmp = new Uint8Array(signedMsg.length); - var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); - if (mlen < 0) return null; - var m = new Uint8Array(mlen); - for (var i = 0; i < m.length; i++) m[i] = tmp[i]; - return m; -}; + nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; + nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; + nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; + nacl.box.nonceLength = crypto_box_NONCEBYTES; + nacl.box.overheadLength = nacl.secretbox.overheadLength; -nacl.sign.detached = function(msg, secretKey) { - var signedMsg = nacl.sign(msg, secretKey); - var sig = new Uint8Array(crypto_sign_BYTES); - for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; - return sig; -}; + nacl.sign = function (msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error("bad secret key size"); + var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; + }; -nacl.sign.detached.verify = function(msg, sig, publicKey) { - checkArrayTypes(msg, sig, publicKey); - if (sig.length !== crypto_sign_BYTES) - throw new Error('bad signature size'); - if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) - throw new Error('bad public key size'); - var sm = new Uint8Array(crypto_sign_BYTES + msg.length); - var m = new Uint8Array(crypto_sign_BYTES + msg.length); - var i; - for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; - for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; - return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); -}; + nacl.sign.open = function (signedMsg, publicKey) { + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error("bad public key size"); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; + }; -nacl.sign.keyPair = function() { - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); - crypto_sign_keypair(pk, sk); - return {publicKey: pk, secretKey: sk}; -}; + nacl.sign.detached = function (msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; + }; -nacl.sign.keyPair.fromSecretKey = function(secretKey) { - checkArrayTypes(secretKey); - if (secretKey.length !== crypto_sign_SECRETKEYBYTES) - throw new Error('bad secret key size'); - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; - return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; -}; + nacl.sign.detached.verify = function (msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) throw new Error("bad signature size"); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error("bad public key size"); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i]; + return crypto_sign_open(m, sm, sm.length, publicKey) >= 0; + }; -nacl.sign.keyPair.fromSeed = function(seed) { - checkArrayTypes(seed); - if (seed.length !== crypto_sign_SEEDBYTES) - throw new Error('bad seed size'); - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); - for (var i = 0; i < 32; i++) sk[i] = seed[i]; - crypto_sign_keypair(pk, sk, true); - return {publicKey: pk, secretKey: sk}; -}; + nacl.sign.keyPair = function () { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return { publicKey: pk, secretKey: sk }; + }; -nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; -nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; -nacl.sign.seedLength = crypto_sign_SEEDBYTES; -nacl.sign.signatureLength = crypto_sign_BYTES; + nacl.sign.keyPair.fromSecretKey = function (secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error("bad secret key size"); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32 + i]; + return { publicKey: pk, secretKey: new Uint8Array(secretKey) }; + }; -nacl.hash = function(msg) { - checkArrayTypes(msg); - var h = new Uint8Array(crypto_hash_BYTES); - crypto_hash(h, msg, msg.length); - return h; -}; + nacl.sign.keyPair.fromSeed = function (seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) throw new Error("bad seed size"); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return { publicKey: pk, secretKey: sk }; + }; -nacl.hash.hashLength = crypto_hash_BYTES; + nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; + nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; + nacl.sign.seedLength = crypto_sign_SEEDBYTES; + nacl.sign.signatureLength = crypto_sign_BYTES; -nacl.verify = function(x, y) { - checkArrayTypes(x, y); - // Zero length arguments are considered not equal. - if (x.length === 0 || y.length === 0) return false; - if (x.length !== y.length) return false; - return (vn(x, 0, y, 0, x.length) === 0) ? true : false; -}; + nacl.hash = function (msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; + }; -nacl.setPRNG = function(fn) { - randombytes = fn; -}; + nacl.hash.hashLength = crypto_hash_BYTES; -(function() { - // Initialize PRNG if environment provides CSPRNG. - // If not, methods calling randombytes will throw. - var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; - if (crypto && crypto.getRandomValues) { - // Browsers. - var QUOTA = 65536; - nacl.setPRNG(function(x, n) { - var i, v = new Uint8Array(n); - for (i = 0; i < n; i += QUOTA) { - crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); - } - for (i = 0; i < n; i++) x[i] = v[i]; - cleanup(v); - }); - } else if (typeof require !== 'undefined') { - // Node.js. - crypto = require('crypto'); - if (crypto && crypto.randomBytes) { - nacl.setPRNG(function(x, n) { - var i, v = crypto.randomBytes(n); + nacl.verify = function (x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return vn(x, 0, y, 0, x.length) === 0 ? true : false; + }; + + nacl.setPRNG = function (fn) { + randombytes = fn; + }; + + (function () { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto = typeof self !== "undefined" ? self.crypto || self.msCrypto : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function (x, n) { + var i, + v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } for (i = 0; i < n; i++) x[i] = v[i]; cleanup(v); }); + } else if (typeof require !== "undefined") { + // Node.js. + crypto = require("crypto"); + if (crypto && crypto.randomBytes) { + nacl.setPRNG(function (x, n) { + var i, + v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } } - } -})(); - -})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); + })(); +})(typeof module !== "undefined" && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/util.ts b/util.ts index 025926f..478351c 100644 --- a/util.ts +++ b/util.ts @@ -5,6 +5,8 @@ import type { AddressPrefix, Address, BlockNoSignature, BlockHash } from "./rpc_ const PREAMBLE = "0000000000000000000000000000000000000000000000000000000000000006"; const MESSAGE_PREAMBLE = "62616E616E6F6D73672D"; //bananomsg- +//random fun fact! signatures do not need to be deterministic, they can have a bit of random in them. learned this from flutter_nano_ffi + // byte related const HEX_CHARS = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]; @@ -211,22 +213,33 @@ export function verify_block_hash(public_key: string, signature: string, block_h return nacl.sign.detached.verify(hex_to_uint8array(block_hash), hex_to_uint8array(signature), hex_to_uint8array(public_key)); } -/** sign message by constructing a dummy block with the message (why not just sign the message itself instead of putting it in a dummy block? ledger support). This is already the standard across Banano services and wallets which support signing so please don't invent your own scheme - * @return {string} The signature in hex - */ -export function sign_message(private_key: string, message: string, preamble = MESSAGE_PREAMBLE): string { +/** For use in `sign_message` and `verify_signed_message` */ +export function construct_message_block_and_hash(address: Address, message: string, preamble = MESSAGE_PREAMBLE): string { //construct the dummy block const dummy32 = "0".repeat(64); const dummy_block: BlockNoSignature = { type: "state", - account: get_address_from_public_key(get_public_key_from_private_key(private_key)), + account: address, previous: dummy32, //utf8_to_uint8array not implemented representative: get_address_from_public_key(uint8array_to_hex(blake2b(32).update(hex_to_uint8array(preamble)).update(utf8_to_uint8array(message)).digest())), balance: "0", link: dummy32, }; - return sign_block_hash(private_key, hash_block(dummy_block)); + //return the hash + return hash_block(dummy_block); } -// +/** Sign message by constructing a dummy block with the message (why not just sign the message itself instead of putting it in a dummy block? ledger support). This is already the standard across Banano services and wallets which support signing so please don't invent your own scheme + * @return {string} The signature in hex + */ +export function sign_message(private_key: string, message: string, preamble = MESSAGE_PREAMBLE): string { + return sign_block_hash(private_key, construct_message_block_and_hash(get_address_from_public_key(get_public_key_from_private_key(private_key)), message, preamble)); +} + +/** Use to verify message signatures. A wrapper for `verify_block_hash` + * @return {boolean} Whether the message signature was actually signed by that address + */ +export function verify_signed_message(address: Address, message: string, signature: string, preamble = MESSAGE_PREAMBLE): boolean { + return verify_block_hash(get_public_key_from_address(address), signature, construct_message_block_and_hash(address, message, preamble)); +}