UNPKG

hugbot

Version:

Chatbot maker for HuggingFace Inference API and other AI API providers and backends.

114 lines 4.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SecretsHider = void 0; var Res; (function (Res) { Res["Success"] = "Success"; Res["Failure"] = "Failure"; })(Res || (Res = {})); /** * Used to encrypt and obfuscate provided api token in memory during runtime. */ const SecretsHider = () => { const Store = (secret, key) => { const store = ((secret, key) => { const rnd = (min, max) => Math.floor(Math.random() * (max - min) + min); const r = rnd(0, secret.length); const secretWithKey = [...secret.slice(0, r), key, ...secret.slice(r)].join(""); const store = Array(rnd(2000, 3000)).fill(null) .map(_ => secretWithKey.split("") .map(_ => secretWithKey.charAt(rnd(1, secretWithKey.length))).join("")); const rIdx = rnd(0, store.length); return store.fill(secretWithKey, rIdx, rIdx + 1); })(secret, key); const retrieve = (key) => { var _a; return (_a = store.find(x => x.includes(key))) === null || _a === void 0 ? void 0 : _a.replace(key, ""); }; Object.freeze(Object.seal((store))); return Object.freeze(Object.seal({ retrieve })); }; const rndKey = (secret) => { const rnd = (min, max) => Math.floor(Math.random() * (max - min) + min); return Array(rnd(6, secret.length - 1)).fill(null) .map(_ => secret.charAt(rnd(1, secret.length))).join(""); }; let KEY = null; let IV = null; let STORE = null; let STORE_KEY = null; const set = async (secret) => { try { const generatedKey = await generateKey(); const encryptedSecret = await encrypt(secret, generatedKey); const packedSecret = pack(encryptedSecret.cipher); KEY = generatedKey; IV = encryptedSecret.iv; STORE_KEY = rndKey(packedSecret); STORE = Store(packedSecret, STORE_KEY); return Res.Success; } catch (err) { destroy(); console.error(err); return Res.Failure; } }; const get = async () => { try { if (STORE && STORE_KEY && KEY && IV) { const secret = STORE.retrieve(STORE_KEY); const unpackedSecret = unpack(secret); const decryptedSecret = await decrypt(unpackedSecret, KEY, IV); destroy(); await set(decryptedSecret); return decryptedSecret; } else { destroy(); return null; } } catch (err) { console.log(err); destroy(); return Res.Failure; } }; const destroy = () => { KEY = null; IV = null; STORE_KEY = null; STORE = null; }; const encrypt = async (data, key) => { const encoded = encode(data); const iv = generateIV(); const cipher = await crypto.subtle .encrypt({ name: "AES-GCM", iv: iv, }, key, encoded); return { cipher, iv, }; }; const decrypt = async (cipher, key, IV) => { const encoded = await crypto.subtle .decrypt({ name: "AES-GCM", iv: IV, }, key, cipher); return decode(encoded); }; const generateKey = async () => crypto.subtle .generateKey({ name: "AES-GCM", length: 256, }, true, ["encrypt", "decrypt"]); const generateIV = () => { const rnd = (min, max) => Math.floor(Math.random() * ((max + 1) - min) + min); return crypto.getRandomValues(new Uint8Array((rnd(12, 16)))); }; const encode = (data) => new TextEncoder().encode(data); const decode = (byteStream) => new TextDecoder().decode(byteStream); const pack = (buffer) => btoa(String.fromCharCode(...new Uint8Array(buffer))); const unpack = (packed) => { const string = atob(packed); const buffer = new ArrayBuffer(string.length); const bufferView = new Uint8Array(buffer); for (let i = 0; i < string.length; i++) { bufferView[i] = string.charCodeAt(i); } return buffer; }; return Object.freeze(Object.seal({ set, get, destroy })); }; exports.SecretsHider = SecretsHider; //# sourceMappingURL=SecretsHider.js.map