← Files OpsTruthARCHIVED FILE
scripts/generate-contract-vectors.mjs
3.96 KB · Oct 2, 2026 · 00:31 UTC
import { createPrivateKey, createPublicKey } from "node:crypto";
import { readFile } from "node:fs/promises";
import { computeArtifactDigest, constraintsDigest, signProtocolArtifact, verifyHandoffChain, verifyProtocolArtifact } from "../src/protocol.js";
const root = new URL("..", import.meta.url);
function pem(label, der) {
const body = der.toString("base64").match(/.{1,64}/g).join("\n");
return `-----BEGIN ${label}-----\n${body}\n-----END ${label}-----`;
}
function deterministicEnv(fill) {
const seed = Buffer.alloc(32, fill);
const privateDer = Buffer.concat([Buffer.from("302e020100300506032b657004220420", "hex"), seed]);
const privateKey = createPrivateKey({ key: privateDer, format: "der", type: "pkcs8" });
const publicKey = createPublicKey(privateKey);
return {
OPSTRUTH_RECEIPT_PRIVATE_KEY_PKCS8: pem("PRIVATE KEY", privateDer),
OPSTRUTH_RECEIPT_PUBLIC_KEY_SPKI: pem("PUBLIC KEY", publicKey.export({ format: "der", type: "spki" })),
};
}
async function example(name) {
return JSON.parse(await readFile(new URL(`../contracts/examples/${name}.json`, import.meta.url), "utf8"));
}
async function vectors() {
const requestExample = await example("action-request");
const requestPayload = { ...requestExample };
delete requestPayload.digest;
const request = { ...requestPayload, digest: await computeArtifactDigest(requestPayload) };
const authorizationExample = await example("action-authorization");
const authorizationPayload = {
...authorizationExample,
requestDigest: request.digest,
constraintsDigest: await constraintsDigest(request.constraints),
};
delete authorizationPayload.digest;
delete authorizationPayload.proof;
const authorization = await signProtocolArtifact(authorizationPayload, deterministicEnv(0x11));
const receiptExample = await example("execution-receipt");
const receiptPayload = {
...receiptExample,
requestDigest: request.digest,
authorizationDigest: authorization.digest,
idempotencyKey: request.idempotencyKey,
consumedAuthorizationNonce: authorization.nonce,
};
delete receiptPayload.digest;
delete receiptPayload.proof;
const receipt = await signProtocolArtifact(receiptPayload, deterministicEnv(0x22));
const resultExample = await example("verification-result");
const resultPayload = {
...resultExample,
requestDigest: request.digest,
authorizationDigest: authorization.digest,
receiptDigest: receipt.digest,
};
delete resultPayload.digest;
delete resultPayload.proof;
const result = await signProtocolArtifact(resultPayload, deterministicEnv(0x33));
return {
schemaVersion: "1.0.0",
warning: "Public deterministic test vectors only. The fixed test keys carry no authority and must never be trusted in production.",
artifacts: { request, authorization, receipt, result },
};
}
const generated = await vectors();
if (process.argv.includes("--check")) {
const expected = JSON.parse(await readFile(new URL("../contracts/vectors/protocol-v1.json", import.meta.url), "utf8"));
if (JSON.stringify(expected) !== JSON.stringify(generated)) throw new Error("contract_vectors_drift");
const chain = await verifyHandoffChain(generated.artifacts, {
now: "2026-08-27T12:15:00Z",
trustedAuthorizerFingerprints: [generated.artifacts.authorization.proof.signerFingerprint],
trustedExecutorFingerprints: [generated.artifacts.receipt.proof.signerFingerprint],
});
if (!chain.valid) throw new Error(`contract_vector_chain_invalid:${chain.errors.join("|")}`);
const result = await verifyProtocolArtifact(generated.artifacts.result, { now: "2026-08-27T12:15:00Z", trustedSignerFingerprints: [generated.artifacts.result.proof.signerFingerprint] });
if (!result.digestValid || !result.signatureValid || !result.trusted) throw new Error(`verification_result_vector_invalid:${result.errors.join("|")}`);
console.log("cryptographic contract vectors passed: 4 artifacts, 3 independent signing identities");
} else {
console.log(JSON.stringify(generated, null, 2));
}
SHA-256: d545c0bcaab0b8458322b375fe8bb2758a6bed719fbdda0c1faf149a740c7aa7