Files
brain/tools/receipt-key-config.mjs
T

38 lines
1.8 KiB
JavaScript

#!/usr/bin/env node
/**
* receipt-key-config — резолв HMAC-ключа подписи расписок роутер-наставника.
* Пакет 4.1 (Δ4): ТОЛЬКО keychain (service router-mentor-receipts). env-fallback УБРАН —
* ROUTER_MENTOR_RECEIPT_KEY больше не читается (анти-казуальная утечка ключа через env/логи;
* шов под HSM). Ключ провижинит владелец. Без ключа — null → подпись невозможна
* → неподписанная расписка невалидна (fail-closed на стороне verifyReceipt).
*/
import { readKeychainSync } from './keychain-read.mjs';
const KEY_ENV = 'ROUTER_MENTOR_RECEIPT_KEY';
const KEYCHAIN_SERVICE = 'router-mentor-receipts';
const KEYCHAIN_ACCOUNT = 'default';
/**
* Резолв ключа: ТОЛЬКО keychain (env-fallback убран, Пакет 4.1 Δ4). `env` в args
* больше не используется (extra-проп в вызовах/тестах молча игнорируется);
* KEY_ENV сохранён в _internals как имя теперь-игнорируемой переменной.
* @param {object} [args]
* @param {Function} [args.keychainGet] - () => string|null (инъекция для тестов)
* @returns {string|null}
*/
export function resolveReceiptKey({ keychainGet = defaultKeychainGet } = {}) {
try {
const v = keychainGet();
return v ? String(v) : null;
} catch {
return null;
}
}
/** keytar async-only (синхронного чтения нет) → читаем обёрткой readKeychainSync через subprocess. */
export function defaultKeychainGet() {
return readKeychainSync(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
}
export const _internals = { KEY_ENV, KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT };