397777089e
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.9 KiB
JavaScript
36 lines
1.9 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* verify-receipt (G1, Level A) — чистое ядро подписанной verify-расписки (домен VERIFY_PASS).
|
||
* Зеркало floor-signer.mjs. Подлинность — подпись подписанта; свежесть — совпадение
|
||
* code_fingerprint с ТЕКУЩИМ staged-diff (считает consumer/producer, инъекция currentFingerprint).
|
||
* occurrence — структурный positive-int (анти-двойной-зачёт = Level B). Δ4: ключ не защищён от
|
||
* мотивированного контроллера (см. план G1 §Forge); подпись даёт out-of-env + шов под HSM.
|
||
*/
|
||
import { signPayload, verifyReceipt, RECEIPT_DOMAINS } from './receipt-sign.mjs';
|
||
|
||
export function signVerifyReceipt({ code_fingerprint, occurrence }, key) {
|
||
if (!key) return null;
|
||
const body = { code_fingerprint, occurrence };
|
||
const sig = signPayload(body, key, RECEIPT_DOMAINS.VERIFY_PASS);
|
||
if (!sig) return null;
|
||
return { ...body, sig };
|
||
}
|
||
|
||
export function verifyReceiptSig(record, key) {
|
||
return verifyReceipt(record, key, RECEIPT_DOMAINS.VERIFY_PASS);
|
||
}
|
||
|
||
/**
|
||
* Принять расписку: подпись валидна И occurrence — целое >0 И (если задан currentFingerprint)
|
||
* code_fingerprint совпадает с ним. Любое нарушение → {accepted:false, reason}.
|
||
*/
|
||
export function acceptVerifyReceipt(record, key, { currentFingerprint = null } = {}) {
|
||
if (!verifyReceiptSig(record, key)) return { accepted: false, reason: 'bad-signature' };
|
||
const occ = record.occurrence;
|
||
if (!Number.isInteger(occ) || occ <= 0) return { accepted: false, reason: 'bad-occurrence' };
|
||
if (currentFingerprint !== null && record.code_fingerprint !== currentFingerprint) {
|
||
return { accepted: false, reason: 'stale-fingerprint' };
|
||
}
|
||
return { accepted: true, reason: 'ok' };
|
||
}
|