UNPKG

@alessiofrittoli/crypto-encoder

Version:
2 lines (1 loc) 1.73 kB
import{binaryToString as l,coerceToUint8Array as A}from"@alessiofrittoli/crypto-buffer";var t=class t{static encode(e,r,a){a||(a={});let i=t.getEncodeVariantAlphabetAndPadding(r),d=a.padding??i.padding,s=A(e),n=0,c=0,o="";for(let p=0;p<s.byteLength;p++)for(c=c<<8|s[p],n+=8;n>=5;)o+=i.alphabet[c>>>n-5&31],n-=5;if(n>0&&(o+=i.alphabet[c<<5-n&31]),d)for(;o.length%8!==0;)o+="=";return o}static decode(e,r){let a=0,i=0,d=0,s=t.getDecodeVariantAlphabetAndInput(e,r),{length:n}=s.input,c=new Uint8Array(n*5/8|0);for(let o=0;o<n;o++)i=i<<5|t.readChar(s.alphabet,s.input[o]),a+=5,a>=8&&(c[d++]=i>>>a-8&255,a-=8);return c}static readChar(e,r){let a=e.indexOf(r);if(a===-1)throw new Error(`Invalid character found: "${r}"`);return a}static getEncodeVariantAlphabetAndPadding(e){switch(e){case"RFC3548":case"RFC4648":return{alphabet:t.ALPHABET.RFC4648,padding:!0};case"RFC4648-HEX":return{alphabet:t.ALPHABET.RFC4648_HEX,padding:!0};case"Crockford":return{alphabet:t.ALPHABET.CROCKFORD,padding:!1};default:throw new Error(`Unknown base32 variant: ${e}`)}}static getDecodeVariantAlphabetAndInput(e,r){switch(e=t.toString(e).replace(/=+$/,"").toUpperCase(),r){case"RFC3548":case"RFC4648":return{alphabet:t.ALPHABET.RFC4648,input:e};case"RFC4648-HEX":return{alphabet:t.ALPHABET.RFC4648_HEX,input:e};case"Crockford":return{alphabet:t.ALPHABET.CROCKFORD,input:e.replace(/O/g,"0").replace(/[IL]/g,"1")};default:throw new Error(`Unknown base32 variant: ${r}`)}}};t.VARIANT={RFC3548:"RFC3548",RFC4648:"RFC4648",RFC4648_HEX:"RFC4648-HEX",Crockford:"Crockford"},t.ALPHABET={RFC4648:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",RFC4648_HEX:"0123456789ABCDEFGHIJKLMNOPQRSTUV",CROCKFORD:"0123456789ABCDEFGHJKMNPQRSTVWXYZ"},t.toString=l;var C=t;export{C as a};