hugbot
Version:
Chatbot maker for HuggingFace Inference API and other AI API providers and backends.
114 lines • 4.37 kB
JavaScript
;
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