# Signed SBOM Archive Specification Version: 1.0.0 Status: Draft Last Updated: 2026-01-15 ## Overview This specification defines a self-contained, cryptographically signed SBOM archive format that bundles: - The SBOM document (SPDX or CycloneDX) - DSSE signature envelope - Verification materials (certificates, transparency proofs) - Metadata (tool versions, timestamps) - Offline verification resources ## Archive Structure ``` signed-sbom-{digest_short}-{timestamp}.tar.gz | +-- sbom.spdx.json # OR sbom.cdx.json (CycloneDX) +-- sbom.dsse.json # DSSE envelope containing signature +-- manifest.json # Archive inventory with hashes +-- metadata.json # Generation metadata +-- certs/ | +-- signing-cert.pem # Signing certificate | +-- signing-chain.pem # Full certificate chain | +-- fulcio-root.pem # Fulcio root CA (for keyless) +-- rekor-proof/ # Optional: transparency log proof | +-- inclusion-proof.json | +-- checkpoint.sig | +-- rekor-public.pem +-- schemas/ # Bundled validation schemas | +-- spdx-2.3.schema.json | +-- spdx-3.0.1.schema.json | +-- cyclonedx-1.7.schema.json | +-- dsse.schema.json +-- VERIFY.md # Human-readable verification guide ``` ## File Specifications ### sbom.spdx.json / sbom.cdx.json The primary SBOM document in either: - **SPDX**: Versions 2.3 or 3.0.1 (JSON format) - **CycloneDX**: Versions 1.4, 1.5, 1.6, or 1.7 (JSON format) Requirements: - UTF-8 encoding without BOM - Canonical JSON formatting (RFC 8785 compliant) - No trailing whitespace or newlines ### sbom.dsse.json DSSE envelope containing the SBOM signature: ```json { "payloadType": "application/vnd.stellaops.sbom+json", "payload": "", "signatures": [ { "keyid": "SHA256:abc123...", "sig": "" } ] } ``` ### manifest.json Archive inventory with integrity hashes: ```json { "schemaVersion": "1.0.0", "archiveId": "signed-sbom-abc123-20260115T123456Z", "generatedAt": "2026-01-15T12:34:56Z", "files": [ { "path": "sbom.spdx.json", "sha256": "abc123...", "size": 45678, "mediaType": "application/spdx+json" }, { "path": "sbom.dsse.json", "sha256": "def456...", "size": 1234, "mediaType": "application/vnd.dsse+json" } ], "merkleRoot": "sha256:789abc...", "totalFiles": 12, "totalSize": 98765 } ``` ### metadata.json Generation and tool metadata: ```json { "schemaVersion": "1.0.0", "stellaOps": { "suiteVersion": "2027.Q1", "scannerVersion": "1.2.3", "scannerDigest": "sha256:scanner-image-digest", "signerVersion": "1.0.0", "sbomServiceVersion": "1.1.0" }, "generation": { "timestamp": "2026-01-15T12:34:56Z", "hlcTimestamp": "1737000000000000000", "operator": "build@company.com" }, "input": { "imageRef": "registry.company.com/app:v1.0.0", "imageDigest": "sha256:image-digest-here", "platform": "linux/amd64" }, "sbom": { "format": "spdx-2.3", "componentCount": 142, "packageCount": 89, "fileCount": 1247 }, "signature": { "type": "keyless", "issuer": "https://accounts.google.com", "subject": "build@company.com", "signedAt": "2026-01-15T12:34:57Z" }, "reproducibility": { "deterministic": true, "expectedDigest": "sha256:expected-sbom-digest" } } ``` ### VERIFY.md Human-readable verification instructions: ```markdown # SBOM Archive Verification ## Quick Verification ```bash # Verify archive integrity sha256sum -c <