import { test } from "node:test"; import assert from "node:assert/strict"; import { cifrar, descifrar, huella } from "./crypto.ts"; const CLAVE = Buffer.alloc(32, 7).toString("base64"); test("cifrar/descifrar: ida y vuelta devuelve el original", () => { process.env.CRM_MASTER_KEY = CLAVE; const token = "pit-abc123def456"; assert.equal(descifrar(cifrar(token)), token); }); test("cifrar: dos cifrados del mismo texto son distintos (nonce aleatorio)", () => { process.env.CRM_MASTER_KEY = CLAVE; const a = cifrar("mismo-token"); const b = cifrar("mismo-token"); assert.notEqual(a.cipher.toString("hex"), b.cipher.toString("hex")); assert.equal(descifrar(a), descifrar(b)); }); test("descifrar: un cipher manipulado lanza, no devuelve basura", () => { process.env.CRM_MASTER_KEY = CLAVE; const c = cifrar("token-real"); c.cipher[0] ^= 0xff; assert.throws(() => descifrar(c), /no se pudo descifrar/i); }); test("descifrar: con otra clave maestra lanza, no devuelve basura", () => { process.env.CRM_MASTER_KEY = CLAVE; const c = cifrar("token-real"); process.env.CRM_MASTER_KEY = Buffer.alloc(32, 9).toString("base64"); assert.throws(() => descifrar(c), /no se pudo descifrar/i); process.env.CRM_MASTER_KEY = CLAVE; }); test("huella: son los 6 últimos caracteres, para distinguir tokens sin exponerlos", () => { assert.equal(huella("pit-abcdef123456"), "123456"); assert.equal(huella("corto"), "corto"); }); test("una clave que no mide 32 bytes se rechaza con un mensaje que lo dice", () => { process.env.CRM_MASTER_KEY = Buffer.alloc(16, 1).toString("base64"); assert.throws(() => cifrar("x"), /32 bytes/); process.env.CRM_MASTER_KEY = CLAVE; }); test("sin CRM_MASTER_KEY se lanza un error que dice qué falta y dónde ponerlo", () => { delete process.env.CRM_MASTER_KEY; assert.throws(() => cifrar("x"), /CRM_MASTER_KEY/); process.env.CRM_MASTER_KEY = CLAVE; });