@foxt/js-srp
Version:
js-srp modified to add support for the SRP implementation used by Apple's iCloud.com
2 lines (1 loc) • 12.3 kB
JavaScript
var _=Object.defineProperty;var I=(c,e)=>{for(var f in e)_(c,f,{get:e[f],enumerable:!0})};var y=self.crypto;var R={};I(R,{Hash:()=>P,bigintFromBytes:()=>w,bitLength:()=>N,byteLength:()=>M,bytesFromBigint:()=>n,concatBytes:()=>i,constantTimeCompare:()=>S,fromHex:()=>U,hash:()=>t,hashInterleave:()=>v,modPow:()=>u,randomBytes:()=>l,toHex:()=>h,xorBytes:()=>x});function N(c){return c.toString(2).length}function M(c){return(N(c)+7)/8|0}function w(c){let e=0n;for(let f of c.values())e=(e<<8n)+BigInt(f);return e}function n(c){let e=new Uint8Array(M(c));for(let f=e.length-1;c>0;f--,c>>=8n)e[f]=Number(c&0xffn);return e}function l(c){if(c<1)throw new RangeError("numBytes must be >= 1");let e=new Uint8Array(c);return y.getRandomValues(e),e}function m(c,e){if(e<1n)throw new RangeError("n must be > 0");let f=c%e;return f<0n?f+e:f}function k(c,e){if(c<1n||e<1n)throw new RangeError("a and b must be > 0");let f=0n,b=1n,a=1n,d=0n;for(;c!==0n;){let s=e/c,o=e%c,g=f-a*s,A=b-d*s;e=c,c=o,f=a,b=d,a=g,d=A}return{g:e,x:f,y:b}}function E(c,e){let f=k(m(c,e),e);if(f.g!==1n)throw new RangeError;return m(f.x,e)}function u(c,e,f){if(f<1n)throw new RangeError("n must be > 0");if(f===1n)return 0n;if(c=m(c,f),e<0n)return E(u(c,e>=0?e:-e,f),f);let b=1n;for(;e>0;)e%2n===1n&&(b=b*c%f),e=e/2n,c=c**2n%f;return b}function i(...c){let e=0;for(let a of c)e+=a.byteLength;let f=new Uint8Array(e),b=0;for(let a of c)f.set(a,b),b+=a.byteLength;return f}function x(c,e){if(c.length!==e.length)throw new Error("xorBytes: buffers must be same length");let f=c.length,b=new Uint8Array(f);for(let a=0;a<f;a++)b[a]=c[a]^e[a];return b}function h(c){return[...c].map(e=>e.toString(16).padStart(2,"0")).join("")}function U(c){return Uint8Array.from(c.match(/.{2}/g)?.map(e=>parseInt(e,16))??[])}function S(c,e){if(c.length!==e.length)return!1;let f=c.length,b=0;for(let a=0;a<f;a++)b|=c[a]^e[a];return b===0}var P=(a=>(a[a.SHA1=3]="SHA1",a[a.SHA256=5]="SHA256",a[a.SHA384=6]="SHA384",a[a.SHA512=7]="SHA512",a))(P||{});function t(c,e){switch(c){case 3:return y.subtle.digest("SHA-1",e);case 5:return y.subtle.digest("SHA-256",e);case 6:return y.subtle.digest("SHA-384",e);case 7:return y.subtle.digest("SHA-512",e)}}async function v(c,e){let f=new Uint8Array(e,0,e.byteLength);for(var b=0;b<f.length;b++)if(f[b]!==0){(e.byteLength-b)%2===1&&b++,f=new Uint8Array(e,b,e.byteLength-b);break}let a=f.length/2,d=new Uint8Array(a),s=new Uint8Array(a);for(let r=0;r<f.length;r++)d[r]=f[r*2],s[r]=f[r*2+1];let o=new Uint8Array(await t(c,d)),g=new Uint8Array(await t(c,s)),A=new Uint8Array(o.byteLength*2);for(let r=0;r<o.byteLength;r++)A[r*2]=o[r],A[r*2+1]=g[r];return A}var G=(a=>(a[a.RFC2945=0]="RFC2945",a[a.SRPTools=1]="SRPTools",a[a.GoSRP=2]="GoSRP",a[a.GSA=3]="GSA",a))(G||{}),K=new Map([[1024,{g:2n,N:0xeeaf0ab9adb38dd69c33f80afa8fc5e86072618775ff3c0b9ea2314c9c256576d674df7496ea81d3383b4813d692c6e0e0d5d8e250b98be48e495c1d6089dad15dc7d7b46154d6b6ce8ef4ad69b15d4982559b297bcf1885c529f566660e57ec68edbc3c05726cc02fd4cbf4976eaa9afd5138fe8376435b9fc61d2fc0eb06e3n,n:128}],[1536,{g:2n,N:0x9def3cafb939277ab1f12a8617a47bbbdba51df499ac4c80beeea9614b19cc4d5f4f5f556e27cbde51c6a94be4607a291558903ba0d0f84380b655bb9a22e8dcdf028a7cec67f0d08134b1c8b97989149b609e0be3bab63d47548381dbc5b1fc764e3f4b53dd9da1158bfd3e2b9c8cf56edf019539349627db2fd53d24b7c48665772e437d6c7f8ce442734af7ccb7ae837c264ae3a9beb87f8a2fe9b8b5292e5a021fff5e91479e8ce7a28c2442c6f315180f93499a234dcf76e3fed135f9bbn,n:192}],[2048,{g:2n,N:0xac6bdb41324a9a9bf166de5e1389582faf72b6651987ee07fc3192943db56050a37329cbb4a099ed8193e0757767a13dd52312ab4b03310dcd7f48a9da04fd50e8083969edb767b0cf6095179a163ab3661a05fbd5faaae82918a9962f0b93b855f97993ec975eeaa80d740adbf4ff747359d041d5c33ea71d281e446b14773bca97b43a23fb801676bd207a436c6481f1d2b9078717461a5b9d32e688f87748544523b524b0d57d5ea77a2775d2ecfa032cfbdbf52fb3786160279004e57ae6af874e7303ce53299ccc041c7bc308d82a5698f3a8d0c38271ae35f8e9dbfbb694b5c803d89f7ae435de236d525f54759b65e372fcd68ef20fa7111f9e4aff73n,n:256}],[3072,{g:5n,N:0xffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffffn,n:384}],[4096,{g:5n,N:0xffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffffn,n:512}],[6144,{g:5n,N:0xffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffffn,n:768}],[8192,{g:19n,N:0xffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffffn,n:1024}]]);function L(c=0){c===0&&(c=2048);let e=K.get(c);if(!e)throw new Error(`Invalid prime field size ${c}`);return e}function p(c,e){let f=n(c);if(f.length>=e)return f;let b=e-f.length,a=new Uint8Array(e);for(let d=0;d<b;d++)a[d]=0;return a.set(f,b),a}var F=class{constructor(e,f,b=0){this.m=e;this.h=f;this.pf=L(b)}pf;async hashInt(e){return w(new Uint8Array(await t(this.h,e)))}async verifier(e,f,b){let a=this.m===2?new Uint8Array(await t(this.h,e)):e,d=this.m===2?new Uint8Array(await t(this.h,f)):f,s=this.pf;b||(b=l(s.n));let o=this.m===2?await this.hashInt(i(a,d,b)):await this.hashInt(i(b,new Uint8Array(await t(this.h,i(a,new Uint8Array([58]),d))))),g=u(s.g,o,s.N);return new B({i:a,s:b,v:n(g),h:this.h,pf:s})}async newClient(e,f,b){let a=this.pf;return b||(b=w(l(a.n))),new H({s:this,i:this.m===2?new Uint8Array(await t(this.h,e)):e,p:this.m===2?new Uint8Array(await t(this.h,f)):f,a:b,A:u(a.g,b,a.N),k:await this.hashInt(i(n(a.N),p(a.g,Number(a.n))))})}},B=class{i;s;v;h;pf;constructor(e){this.i=e.i,this.s=e.s,this.v=e.v,this.h=e.h,this.pf=e.pf}encode(){let e=h(this.i),f=[this.pf.n.toString(10),this.pf.N.toString(16),this.pf.g.toString(16),this.h.toString(10),e,h(this.s),h(this.v)].join(":");return[e,f]}},H=class{s;i;p;a;A;k;_K;_M;get K(){return this._K}get M(){return this._M}constructor(e){this.s=e.s,this.i=e.i,this.p=e.p,this.a=e.a,this.A=e.A,this.k=e.k,this._K=new Uint8Array,this._M=new Uint8Array}credentials(){return[h(this.i),h(n(this.A))].join(":")}parseServerCredentials(e){let f=e.split(":");if(!f[0]||!f[1])throw new Error("Invalid server public key");let b=U(f[0]),a=U(f[1]);return[b,a]}async generate(e,f){let b=w(f),a=this.s.pf;if(b%a.N===0n)throw new Error("Invalid server public key");let d=await this.s.hashInt(i(p(this.A,a.n),p(b,a.n)));if(d===0n)throw new Error("Invalid server public key");let s=this.s.m===2?await this.s.hashInt(i(this.i,this.p,e)):await this.s.hashInt(i(e,new Uint8Array(await t(this.s.h,i(this.s.m==3?new Uint8Array([]):this.i,new Uint8Array([58]),this.p))))),o=u(a.g,s,a.N)*this.k,g=b-o,A=this.a+d*s,r=u(g,A,a.N);return this._K=this.s.m===0?new Uint8Array(await v(this.s.h,n(r))):new Uint8Array(await t(this.s.h,n(r))),this.s.m===2?this._M=new Uint8Array(await t(this.s.h,i(this._K,n(this.A),n(b),this.i,e,n(a.N),n(a.g)))):this._M=new Uint8Array(await t(this.s.h,i(x(new Uint8Array(await t(this.s.h,n(a.N))),new Uint8Array(await t(this.s.h,this.s.m==3?p(a.g,a.n):n(a.g)))),new Uint8Array(await t(this.s.h,this.i)),e,n(this.A),n(b),this._K))),h(this._M)}async generateM2(){if(!this.M)throw new Error("M not generated");return new Uint8Array(await t(this.s.h,i(n(this.A),this._M,this._K)))}async serverOk(e){let f=new TextEncoder,b=f.encode(h(new Uint8Array(await t(this.s.h,i(this._K,this.M))))),a=f.encode(e);return S(b,a)}};export{H as Client,P as Hash,G as Mode,F as Srp,B as Verifier,R as util};