3.4 KiB
Capability Spec Delta: slsa (restore-crypto-keychain-packer)
Package: @suaveplan/slsa
Status: PROPOSED
Every requirement below carries a
**Verified by:**line at authoring time.
MODIFIED Requirements
Requirement: Builder identity is constructed via Authority, not raw secret keys
The package SHALL construct a SLSA builder identity as a ServerIdentity (from @suaveplan/crypto) issued under a SLSA-builder root. Provenance signing SHALL go through Authority.sign(DOMAIN_SLSA_BUILDER_V1, "sign", payload); raw ed25519.sign(secretKey, …) calls and direct imports of cryptographic signing primitives from @suaveplan/crypto-core are removed.
The DSSE envelope wire format is unchanged — only the construction path changes. Existing provenance verifiers (Rekor, third-party SLSA tooling) MUST still accept envelopes produced by the new path; this is asserted by a round-trip test against the previous fixture.
The @suaveplan/crypto-hash and @suaveplan/crypto-utils imports are retained — pure hashing (sha256) and encoding helpers (toHex, toBase64) are not gated by the import allowlist.
Scenario: provenance signing goes through Authority
- WHEN
generateProvenance(buildMetadata, builderAuthority)is called - THEN the resulting DSSE envelope's signature is byte-equal to one produced by the previous direct
ed25519.signpath against the same inputs (asserted via fixedClockand seededRngin the test)
Scenario: no direct primitive signing imports remain
- WHEN the import-allowlist conformance gate runs against
@suaveplan/slsa - THEN the package passes —
@suaveplan/crypto-coreis not imported for signing operations;@suaveplan/crypto-hashand@suaveplan/crypto-utilsare imported only for hashing and encoding, which are explicitly open
Scenario: builder identity can be revoked
- WHEN the SLSA builder's
ServerIdentityis revoked viarevokeServerand a verifier checks a provenance envelope signed by that builder against the active CRL - THEN the verification fails with
CryptoErrorcodeAUTHORITY.REVOKEDand the SLSA package surfaces this as a structured provenance-verification failure with the prior builder identity referenced
Verified by: src/builder/builder-identity.test.ts::"provenance signing goes through Authority" AND src/builder/builder-identity.test.ts::"DSSE output is byte-equal to legacy direct-sign path" AND tests/no-direct-crypto-core.test.ts::"slsa does not import crypto-core for signing" AND src/verification/verify.test.ts::"revoked builder identity fails verification"
Requirement: SLSA-builder trust anchor
The package SHALL document the SLSA-builder root's distribution path. v1 ships the public sign key as a compiled-in pinned constant at src/trust-anchors/slsa-builder.ts, loaded via @suaveplan/crypto's loadTrustAnchor("slsa-builder"). The fixture is committed at test-fixtures/trust-anchors/slsa-builder.pub and is reviewed in PR.
Network-fetched anchors are out of scope per the cross-cutting TRUST_ANCHOR requirement in specs/crypto/spec.md.
Scenario: pinned anchor loads and verifies
- WHEN
loadTrustAnchor("slsa-builder")is called - THEN the call returns a verified public bundle whose sign-slot key matches the committed fixture
Verified by: src/trust-anchors/slsa-builder.test.ts::"pinned slsa-builder anchor loads and verifies"