import crypto from "crypto"; import sql from "./sql.js"; import decryptService from "./decrypt.js"; function getDataKey(password: any) { if (!password) { return null; } try { const passwordDerivedKey = getPasswordDerivedKey(password); const encryptedDataKey = getOption("encryptedDataKey"); const decryptedDataKey = decryptService.decrypt(passwordDerivedKey, encryptedDataKey); return decryptedDataKey; } catch (e: any) { throw new Error(`Cannot read data key, the entered password might be wrong. The underlying error: '${e.message}', stack:\n${e.stack}`); } } function getPasswordDerivedKey(password: any) { const salt = getOption("passwordDerivedKeySalt"); return getScryptHash(password, salt); } function getScryptHash(password: any, salt: any) { const hashed = crypto.scryptSync(password, salt, 32, { N: 16384, r: 8, p: 1 }); return hashed; } function getOption(name: string) { return sql.getValue("SELECT value FROM options WHERE name = ?", [name]); } export default { getDataKey };