/* RFC-0966: Unit tests for passport core logic — buildPassportPayload, signPassport, verifyPassport, computePassportHash, derivePublicKey. Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only. RFC-0966: initial passport unit tests. */ import { test, expect, describe, beforeEach, afterEach } from "vitest"; import { mkdtempSync, writeFileSync, mkdirSync, rmSync } from "node:fs"; import { join } from "node:path"; import { tmpdir } from "node:os"; import { buildPassportPayload, signPassport, verifyPassport, computePassportHash, derivePublicKey, type SitePassportV1, type SignedSitePassport, } from "./passport.ts"; import { generateKeyPair, toHex } from "@warpgogol/werkstatt-engine/signing"; import { writePassport, readPassport, resolvePassportPath } from "./registry-io.ts"; let tmpDir: string; let werkstattRoot: string; beforeEach(() => { tmpDir = mkdtempSync(join(tmpdir(), "passport-test-")); werkstattRoot = join(tmpDir, "werkstatt"); mkdirSync(werkstattRoot, { recursive: true }); }); afterEach(() => { rmSync(tmpDir, { recursive: true, force: true }); }); function setupSystem(systemId: string): string { const cacheDir = join(tmpDir, "systems-cache", systemId); mkdirSync(cacheDir, { recursive: true }); mkdirSync(join(cacheDir, "missions"), { recursive: true }); mkdirSync(join(cacheDir, "bordbuch"), { recursive: true }); writeFileSync( join(cacheDir, "system-config.yaml"), [ `schemaVersion: system-config/v1`, `id: ${systemId}`, `cosmicStar: Vega`, `mirrors:`, ` - path: ../systems-cache/${systemId}`, ` storageType: non-bare`, ` - path: ../systems-git/${systemId}.git`, ` storageType: bare`, `pinnedPlatform: 6.0.0`, `status: active`, `registeredAt: "2026-01-01T00:00:00Z"`, `notes: ""`, ``, ].join("\n"), ); writeFileSync( join(cacheDir, "system.pin.json"), JSON.stringify({ platform: { version: "6.0.0", platformSemanticHash: "sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", }, }), ); writeFileSync( join(cacheDir, ".env.example"), ["# Example env", "API_KEY=your-key-here", "DATABASE_URL=postgres://localhost/db", ""].join( "\n", ), ); return cacheDir; } describe("RFC-0966: passport core logic", () => { test("buildPassportPayload assembles correct payload from system files", async () => { const systemId = "test-site"; setupSystem(systemId); const keyPair = await generateKeyPair(); const publicKeyHex = toHex(keyPair.publicKey); const payload = await buildPassportPayload({ systemId, werkstattRoot: werkstattRoot, creatorIdentity: "human:operator", creatorPublicKey: publicKeyHex, }); expect(payload.schema).toBe("site-passport/v1"); expect(payload.systemId).toBe(systemId); expect(payload.creator.identity).toBe("human:operator"); expect(payload.creator.publicKey).toBe(publicKeyHex); expect(payload.platform.version).toBe("6.0.0"); expect(payload.provenance.bordbuchHead).toBeNull(); expect(payload.provenance.missionCounter).toBe(0); expect(payload.resources.secretNames).toEqual(["API_KEY", "DATABASE_URL"]); expect(payload.resources.customDomains).toEqual([]); expect(payload.resources.vectorizeIndexes).toEqual([]); expect(payload.resources.r2Prefixes).toEqual([]); expect(payload.mirrors).toHaveLength(2); expect(payload.mirrors[0].role).toBe("cache"); expect(payload.mirrors[1].role).toBe("bare"); }); test("signPassport produces deterministic hash and valid signature", async () => { const systemId = "test-sign"; setupSystem(systemId); const keyPair = await generateKeyPair(); const publicKeyHex = toHex(keyPair.publicKey); const payload = await buildPassportPayload({ systemId, werkstattRoot: werkstattRoot, creatorIdentity: "human:operator", creatorPublicKey: publicKeyHex, }); const { passportHash, signature } = await signPassport(payload, keyPair.privateKey); expect(passportHash).toMatch(/^sha256:[0-9a-f]{64}$/); expect(signature).toMatch(/^[0-9a-f]+$/); const { passportHash: hash2 } = await signPassport(payload, keyPair.privateKey); expect(hash2).toBe(passportHash); }); test("verifyPassport succeeds for valid signed passport", async () => { const systemId = "test-verify"; setupSystem(systemId); const keyPair = await generateKeyPair(); const publicKeyHex = toHex(keyPair.publicKey); const payload = await buildPassportPayload({ systemId, werkstattRoot: werkstattRoot, creatorIdentity: "human:operator", creatorPublicKey: publicKeyHex, }); const { passportHash, signature } = await signPassport(payload, keyPair.privateKey); const doc: SignedSitePassport = { payload, passportHash, signature }; const result = await verifyPassport(doc); expect(result.valid).toBe(true); expect(result.errors).toHaveLength(0); }); test("verifyPassport fails for tampered payload", async () => { const systemId = "test-tamper"; setupSystem(systemId); const keyPair = await generateKeyPair(); const publicKeyHex = toHex(keyPair.publicKey); const payload = await buildPassportPayload({ systemId, werkstattRoot: werkstattRoot, creatorIdentity: "human:operator", creatorPublicKey: publicKeyHex, }); const { passportHash, signature } = await signPassport(payload, keyPair.privateKey); const tamperedPayload: SitePassportV1 = { ...payload, creator: { ...payload.creator, identity: "human:attacker" }, }; const doc: SignedSitePassport = { payload: tamperedPayload, passportHash, signature }; const result = await verifyPassport(doc); expect(result.valid).toBe(false); expect(result.errors.length).toBeGreaterThan(0); }); test("verifyPassport fails for wrong signature key", async () => { const systemId = "test-wrong-key"; setupSystem(systemId); const keyPair1 = await generateKeyPair(); const keyPair2 = await generateKeyPair(); const publicKeyHex = toHex(keyPair1.publicKey); const payload = await buildPassportPayload({ systemId, werkstattRoot: werkstattRoot, creatorIdentity: "human:operator", creatorPublicKey: publicKeyHex, }); const { passportHash } = await signPassport(payload, keyPair1.privateKey); const { signature } = await signPassport(payload, keyPair2.privateKey); const doc: SignedSitePassport = { payload, passportHash, signature }; const result = await verifyPassport(doc); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.includes("signature"))).toBe(true); }); test("computePassportHash is deterministic", async () => { const systemId = "test-hash"; setupSystem(systemId); const keyPair = await generateKeyPair(); const publicKeyHex = toHex(keyPair.publicKey); const payload = await buildPassportPayload({ systemId, werkstattRoot: werkstattRoot, creatorIdentity: "human:operator", creatorPublicKey: publicKeyHex, }); const hash1 = computePassportHash(payload); const hash2 = computePassportHash(payload); expect(hash1).toBe(hash2); expect(hash1).toMatch(/^sha256:[0-9a-f]{64}$/); }); test("derivePublicKey matches getPublicKey", async () => { const keyPair = await generateKeyPair(); const derivedHex = await derivePublicKey(keyPair.privateKey); const expectedHex = toHex(keyPair.publicKey); expect(derivedHex).toBe(expectedHex); }); test("mirror locators with credentials are sanitized", async () => { const systemId = "test-sanitize"; const cacheDir = setupSystem(systemId); writeFileSync( join(cacheDir, "system-config.yaml"), [ `schemaVersion: system-config/v1`, `id: ${systemId}`, `cosmicStar: Vega`, `mirrors:`, ` - path: ../systems-cache/${systemId}`, ` storageType: non-bare`, ` - path: https://user:pass@git.example.com/repo.git`, ` storageType: bare`, `pinnedPlatform: 6.0.0`, `status: active`, `registeredAt: "2026-01-01T00:00:00Z"`, `notes: ""`, ``, ].join("\n"), ); const keyPair = await generateKeyPair(); const publicKeyHex = toHex(keyPair.publicKey); const payload = await buildPassportPayload({ systemId, werkstattRoot: werkstattRoot, creatorIdentity: "human:operator", creatorPublicKey: publicKeyHex, }); expect(payload.mirrors[1].locator).toBe("https://git.example.com/repo.git"); expect(payload.mirrors[1].locator).not.toContain("user:pass"); }); test("writePassport + readPassport round-trip", async () => { const systemId = "test-roundtrip"; setupSystem(systemId); const keyPair = await generateKeyPair(); const publicKeyHex = toHex(keyPair.publicKey); const payload = await buildPassportPayload({ systemId, werkstattRoot: werkstattRoot, creatorIdentity: "human:operator", creatorPublicKey: publicKeyHex, }); const { passportHash, signature } = await signPassport(payload, keyPair.privateKey); const doc: SignedSitePassport = { payload, passportHash, signature }; const writtenPath = await writePassport(werkstattRoot, systemId, doc); expect(writtenPath).toBe(resolvePassportPath(werkstattRoot, systemId)); const readDoc = await readPassport(werkstattRoot, systemId); expect(readDoc).not.toBeNull(); expect(readDoc!.passportHash).toBe(passportHash); expect(readDoc!.signature).toBe(signature); expect(readDoc!.payload.systemId).toBe(systemId); const verifyResult = await verifyPassport(readDoc!); expect(verifyResult.valid).toBe(true); }); test("readPassport returns null when passport.json does not exist", async () => { const systemId = "test-no-passport"; setupSystem(systemId); const result = await readPassport(werkstattRoot, systemId); expect(result).toBeNull(); }); });