@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
3 lines (2 loc) • 7.18 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=e=>typeof btoa<"u"?btoa(e):Buffer.from(e,"utf-8").toString("base64"),d=e=>typeof atob<"u"?atob(e):Buffer.from(e,"base64").toString("utf-8"),f=e=>l(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),g=e=>{let t=e;for(;t.length%4;)t+="=";return d(t.replace(/-/g,"+").replace(/_/g,"/"))},y=e=>{if(typeof crypto<"u"&&crypto.getRandomValues)return crypto.getRandomValues(new Uint8Array(e));const t=new Uint8Array(e);for(let r=0;r<e;r++)t[r]=Math.floor(Math.random()*256);return t},s=(e,t)=>{const n=t||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",a=y(e);let o="";for(let c=0;c<e;c++)o+=n[a[c]%n.length];return o},b=()=>{const e=Date.now().toString(36),t=s(8);return`${e}${t}`},S=()=>s(32),w=()=>s(32),C=()=>s(128,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"),m=async e=>{if(typeof crypto<"u"&&crypto.subtle){const r=new TextEncoder().encode(e),n=await crypto.subtle.digest("SHA-256",r),a=new Uint8Array(n);return f(String.fromCharCode(...a))}return console.warn("WebCrypto API not available, using plain code verifier"),e},T=async()=>{const e=C();if(typeof crypto<"u"&&crypto.subtle){const t=await m(e);return{codeVerifier:e,codeChallenge:t,codeChallengeMethod:"S256"}}return{codeVerifier:e,codeChallenge:e,codeChallengeMethod:"plain"}},p=async e=>{if(typeof crypto<"u"&&crypto.subtle){const n=new TextEncoder().encode(e),a=await crypto.subtle.digest("SHA-256",n),o=new Uint8Array(a);return Array.from(o).map(c=>c.toString(16).padStart(2,"0")).join("")}let t=0;for(let r=0;r<e.length;r++){const n=e.charCodeAt(r);t=(t<<5)-t+n,t=t&t}return Math.abs(t).toString(16)},v=e=>{let t=0;for(let r=0;r<e.length;r++){const n=e.charCodeAt(r);t=(t<<5)-t+n,t=t&t}return Math.abs(t).toString(16)},B=(e,t)=>{let r="";for(let n=0;n<e.length;n++){const a=e.charCodeAt(n),o=t.charCodeAt(n%t.length);r+=String.fromCharCode(a^o)}return l(r)},D=(e,t)=>{try{const r=d(e);let n="";for(let a=0;a<r.length;a++){const o=r.charCodeAt(a),c=t.charCodeAt(a%t.length);n+=String.fromCharCode(o^c)}return n}catch{return""}},h=e=>{try{const t=e.split(".");if(t.length!==3)return null;const r=JSON.parse(g(t[0])),n=JSON.parse(g(t[1])),a=t[2];return{header:r,payload:n,signature:a}}catch{return null}},x=e=>{const t=h(e);if(!t||!t.payload.exp)return!0;const r=Math.floor(Date.now()/1e3);return t.payload.exp<r},E=e=>{const t=h(e);return!t||!t.payload.exp?null:new Date(t.payload.exp*1e3)},i=e=>{const t=new Uint8Array(e);let r="";for(let n=0;n<t.byteLength;n++)r+=String.fromCharCode(t[n]);return l(r)},u=e=>{const t=d(e),r=new ArrayBuffer(t.length),n=new Uint8Array(r);for(let a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return r},U=e=>i(e.buffer),O=e=>new Uint8Array(u(e)),P=e=>({id:e.id,rawId:i(e.rawId),type:e.type,response:{clientDataJSON:i(e.response.clientDataJSON),attestationObject:e.response instanceof AuthenticatorAttestationResponse?i(e.response.attestationObject):void 0,authenticatorData:e.response instanceof AuthenticatorAssertionResponse?i(e.response.authenticatorData):void 0,signature:e.response instanceof AuthenticatorAssertionResponse?i(e.response.signature):void 0,userHandle:e.response instanceof AuthenticatorAssertionResponse&&e.response.userHandle?i(e.response.userHandle):void 0}}),J=e=>({...e,challenge:u(e.challenge),user:{...e.user,id:u(e.user.id)},excludeCredentials:e.excludeCredentials?.map(t=>({...t,id:u(t.id)}))}),R=e=>({...e,challenge:u(e.challenge),allowCredentials:e.allowCredentials?.map(t=>({...t,id:u(t.id)}))}),z=async(e,t)=>{const r=e+t;return await p(r)},_=()=>s(16),$=async()=>{const e=[navigator.userAgent,navigator.language,screen.width+"x"+screen.height,screen.colorDepth,new Date().getTimezoneOffset(),navigator.hardwareConcurrency||0,navigator.deviceMemory||0,navigator.cookieEnabled];try{const r=document.createElement("canvas"),n=r.getContext("2d");n&&(n.textBaseline="top",n.font="14px Arial",n.fillText("Frank Auth fingerprint",2,2),e.push(r.toDataURL()))}catch{}const t=e.join("|");return await p(t)},k=()=>{const e=document.createElement("canvas");e.getContext("2d")?.fillText("fingerprint",0,0);const r=[navigator.userAgent,navigator.language,screen.width+"x"+screen.height,new Date().getTimezoneOffset(),e.toDataURL(),navigator.hardwareConcurrency,navigator.deviceMemory].join("|");let n=0;for(let a=0;a<r.length;a++){const o=r.charCodeAt(a);n=(n<<5)-n+o,n=n&n}return Math.abs(n).toString(36)},M=(e=32)=>s(e,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"),G=()=>{const e="pk_",t="test_",r=s(32);return`${e}${t}${r}`},j=e=>{try{return l(d(e))===e}catch{return!1}},K=e=>h(e)!==null,V=()=>s(32,"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),W=(e=10)=>{const t=[];for(let r=0;r<e;r++)t.push(s(8,"0123456789ABCDEF"));return t},F=e=>f(e),N=e=>g(e),A=e=>{let t=0;for(let r=0;r<e.length;r++)t+=e.charCodeAt(r);return t.toString(16)},H=(e,t)=>A(e)===t,I=async(e,t,r=1e3)=>{if(typeof crypto<"u"&&crypto.subtle){const a=new TextEncoder,o=await crypto.subtle.importKey("raw",a.encode(e),{name:"PBKDF2"},!1,["deriveBits"]),c=await crypto.subtle.deriveBits({name:"PBKDF2",salt:a.encode(t),iterations:r,hash:"SHA-256"},o,256),L=new Uint8Array(c);return Array.from(L).map(q=>q.toString(16).padStart(2,"0")).join("")}let n=e+t;for(let a=0;a<r;a++)n=await p(n);return n},Q={base64Encode:l,base64Decode:d,base64UrlEncode:f,base64UrlDecode:g,urlSafeEncode:F,urlSafeDecode:N,generateRandomBytes:y,generateRandomString:s,generateSecureId:b,generateNonce:S,generateState:w,generateSecureToken:M,sha256:p,md5:v,calculateChecksum:A,verifyChecksum:H,parseJWT:h,isJWTExpired:x,getJWTExpiration:E,isValidJWT:K,arrayBufferToBase64:i,base64ToArrayBuffer:u,uint8ArrayToBase64:U,base64ToUint8Array:O,credentialToJSON:P,jsonToCredentialCreationOptions:J,jsonToCredentialRequestOptions:R,generateCodeVerifier:C,generateCodeChallenge:m,generatePKCEPair:T,generateDeviceFingerprint:k,generateTOTPSecret:V,generateBackupCodes:W,deriveKey:I,simpleEncrypt:B,simpleDecrypt:D,isValidBase64:j};exports.CryptoUtils=Q;exports.arrayBufferToBase64=i;exports.base64Decode=d;exports.base64Encode=l;exports.base64ToArrayBuffer=u;exports.base64ToUint8Array=O;exports.base64UrlDecode=g;exports.base64UrlEncode=f;exports.calculateChecksum=A;exports.credentialToJSON=P;exports.deriveKey=I;exports.generateApiKey=G;exports.generateBackupCodes=W;exports.generateCodeChallenge=m;exports.generateCodeVerifier=C;exports.generateDeviceFingerprint=k;exports.generateDeviceFingerprintPromise=$;exports.generateNonce=S;exports.generatePKCEPair=T;exports.generateRandomBytes=y;exports.generateRandomString=s;exports.generateSalt=_;exports.generateSecureId=b;exports.generateSecureToken=M;exports.generateState=w;exports.generateTOTPSecret=V;exports.getJWTExpiration=E;exports.hashPassword=z;exports.isJWTExpired=x;exports.isValidBase64=j;exports.isValidJWT=K;exports.jsonToCredentialCreationOptions=J;exports.jsonToCredentialRequestOptions=R;exports.md5=v;exports.parseJWT=h;exports.sha256=p;exports.simpleDecrypt=D;exports.simpleEncrypt=B;exports.uint8ArrayToBase64=U;exports.urlSafeDecode=N;exports.urlSafeEncode=F;exports.verifyChecksum=H;
//# sourceMappingURL=crypto.cjs.map