UNPKG

otplib

Version:

TypeScript-first library for TOTP and HOTP with multi-runtime and plugin support

2 lines 4.02 kB
import{generateSecret as V,ConfigurationError as b}from"@otplib/core";import{generate as R,generateSync as x,verify as v,verifySync as H}from"@otplib/hotp";import{generate as G,generateSync as C,verify as w,verifySync as B}from"@otplib/totp";import{generateTOTP as D}from"@otplib/uri";import{ScureBase32Plugin as d}from"@otplib/plugin-base32-scure";import{NobleCryptoPlugin as S}from"@otplib/plugin-crypto-noble";var y=Object.freeze(new S),c=Object.freeze(new d);function g(t){return{secret:t.secret,strategy:t.strategy??"totp",crypto:t.crypto??y,base32:t.base32??c,algorithm:t.algorithm??"sha1",digits:t.digits??6,period:t.period??30,epoch:t.epoch??Math.floor(Date.now()/1e3),t0:t.t0??0,counter:t.counter}}function f(t){return{...g(t),token:t.token,epochTolerance:t.epochTolerance??0,counterTolerance:t.counterTolerance??0}}function u(t,e,r){if(t==="totp")return r.totp();if(t==="hotp"){if(e===void 0)throw new b("Counter is required for HOTP strategy. Example: { strategy: 'hotp', counter: 0 }");return r.hotp(e)}throw new b(`Unknown OTP strategy: ${t}. Valid strategies are 'totp' or 'hotp'.`)}function U(t){let{crypto:e=y,base32:r=c,length:o=20}=t||{};return V({crypto:e,base32:r,length:o})}function A(t){let{issuer:e,label:r,secret:o,algorithm:n="sha1",digits:i=6,period:s=30}=t;return D({issuer:e,label:r,secret:o,algorithm:n,digits:i,period:s})}async function O(t){let e=g(t),{secret:r,crypto:o,base32:n,algorithm:i,digits:s}=e,a={secret:r,crypto:o,base32:n,algorithm:i,digits:s};return u(e.strategy,e.counter,{totp:()=>G({...a,period:e.period,epoch:e.epoch,t0:e.t0}),hotp:p=>R({...a,counter:p})})}function m(t){let e=g(t),{secret:r,crypto:o,base32:n,algorithm:i,digits:s}=e,a={secret:r,crypto:o,base32:n,algorithm:i,digits:s};return u(e.strategy,e.counter,{totp:()=>C({...a,period:e.period,epoch:e.epoch,t0:e.t0}),hotp:p=>x({...a,counter:p})})}async function T(t){let e=f(t),{secret:r,token:o,crypto:n,base32:i,algorithm:s,digits:a}=e,p={secret:r,token:o,crypto:n,base32:i,algorithm:s,digits:a};return u(e.strategy,e.counter,{totp:()=>w({...p,period:e.period,epoch:e.epoch,t0:e.t0,epochTolerance:e.epochTolerance}),hotp:l=>v({...p,counter:l,counterTolerance:e.counterTolerance})})}function h(t){let e=f(t),{secret:r,token:o,crypto:n,base32:i,algorithm:s,digits:a}=e,p={secret:r,token:o,crypto:n,base32:i,algorithm:s,digits:a};return u(e.strategy,e.counter,{totp:()=>B({...p,period:e.period,epoch:e.epoch,t0:e.t0,epochTolerance:e.epochTolerance}),hotp:l=>H({...p,counter:l,counterTolerance:e.counterTolerance})})}import{generateSecret as I}from"@otplib/core";import{generateTOTP as k}from"@otplib/uri";var P=class{strategy;crypto;base32;constructor(e={}){let{strategy:r="totp",crypto:o=y,base32:n=c}=e;this.strategy=r,this.crypto=o,this.base32=n}getStrategy(){return this.strategy}generateSecret(e=20){return I({crypto:this.crypto,base32:this.base32,length:e})}async generate(e){return O({...e,strategy:this.strategy,crypto:this.crypto,base32:this.base32})}generateSync(e){return m({...e,strategy:this.strategy,crypto:this.crypto,base32:this.base32})}async verify(e){return T({...e,strategy:this.strategy,crypto:this.crypto,base32:this.base32})}verifySync(e){return h({...e,strategy:this.strategy,crypto:this.crypto,base32:this.base32})}generateURI(e){if(this.strategy==="hotp")throw new Error("generateURI is not available for HOTP strategy");let{issuer:r,label:o,secret:n,algorithm:i="sha1",digits:s=6,period:a=30}=e;return k({issuer:r,label:o,secret:n,algorithm:i,digits:s,period:a})}};import{HOTP as te}from"@otplib/hotp";import{TOTP as oe}from"@otplib/totp";import{wrapResult as ie,wrapResultAsync as se}from"@otplib/core";import{NobleCryptoPlugin as pe}from"@otplib/plugin-crypto-noble";import{ScureBase32Plugin as ce}from"@otplib/plugin-base32-scure";export{te as HOTP,pe as NobleCryptoPlugin,P as OTP,ce as ScureBase32Plugin,oe as TOTP,O as generate,U as generateSecret,m as generateSync,A as generateURI,T as verify,h as verifySync,ie as wrapResult,se as wrapResultAsync}; //# sourceMappingURL=index.js.map