38 lines
1.9 KiB
JavaScript
38 lines
1.9 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* judge-key-config — резолв HMAC-ключа СУДЬИ (отдельный домен от расписок R-31).
|
|
* Пакет 4.1 (Δ4): ТОЛЬКО keychain (service router-mentor-judge). env-fallback УБРАН —
|
|
* ROUTER_MENTOR_JUDGE_KEY больше не читается (анти-казуальная утечка через env/логи; шов под HSM).
|
|
* Ключ провижинит владелец. Без ключа — null → подпись под-прогонов невозможна
|
|
* → дисциплина #1 fail-closed (вердикт без валидного под-прогона не принимается).
|
|
*/
|
|
import { readKeychainSync } from './keychain-read.mjs';
|
|
|
|
const KEY_ENV = 'ROUTER_MENTOR_JUDGE_KEY';
|
|
const KEYCHAIN_SERVICE = 'router-mentor-judge';
|
|
const KEYCHAIN_ACCOUNT = 'default';
|
|
|
|
/**
|
|
* Резолв ключа судьи: ТОЛЬКО keychain (env-fallback убран, Пакет 4.1 Δ4). `env` в args
|
|
* больше не используется (extra-проп молча игнорируется); KEY_ENV сохранён в _internals
|
|
* как имя теперь-игнорируемой переменной (domain-тест R-31 на него опирается).
|
|
* @param {object} [args]
|
|
* @param {Function} [args.keychainGet] - () => string|null (инъекция для тестов)
|
|
* @returns {string|null}
|
|
*/
|
|
export function resolveJudgeKey({ 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 };
|