# Deterministic SBOM Canonicalization (RFC 8785 JCS) ## Module Attestor ## Status VERIFIED ## Description Deterministic SBOM canonicalization using full RFC 8785 JSON Canonicalization Scheme with decimal point handling, number serialization, string normalization, and reproducible transforms between SPDX and CycloneDX. Verified by property-based determinism tests. ## Implementation Details - **SBOM Canonicalizer**: `src/Attestor/__Libraries/StellaOps.Attestor.StandardPredicates/Canonicalization/SbomCanonicalizer.cs` (with `.Elements` partial) -- implements `ISbomCanonicalizer`. Orders SBOM elements deterministically for stable hashing. - **RFC 8785 Canonicalizer**: `src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Json/Rfc8785JsonCanonicalizer.cs` -- implements `IJsonCanonicalizer` with partials: - `.DecimalPoint` -- handles decimal point normalization - `.NumberSerialization` -- IEEE 754 number serialization per RFC 8785 - `.StringNormalization` -- Unicode and string escape normalization - `.WriteMethods` -- low-level write methods - **JSON Canonicalizer (StandardPredicates)**: `__Libraries/StellaOps.Attestor.StandardPredicates/JsonCanonicalizer.cs` -- additional canonicalizer for standard predicates. - **JSON Canonicalizer (TrustVerdict)**: `__Libraries/StellaOps.Attestor.TrustVerdict/JsonCanonicalizer.cs` -- canonicalizer for trust verdict payloads. - **CycloneDX Determinism Tests**: `__Tests/StellaOps.Attestor.StandardPredicates.Tests/CycloneDxDeterminismTests.cs` - **SPDX Determinism Tests**: `SpdxDeterminismTests.cs` - **JSON Canonicalizer Tests**: `JsonCanonicalizerTests.cs` (in both ProofChain and StandardPredicates test projects) ## E2E Test Plan - [ ] Canonicalize a CycloneDX SBOM via `SbomCanonicalizer`, hash the output, canonicalize again, and verify identical hashes - [ ] Canonicalize an SPDX SBOM, hash, re-canonicalize, and verify identical hashes - [ ] Apply `Rfc8785JsonCanonicalizer` to JSON with unordered keys and verify key order matches RFC 8785 (lexicographic) - [ ] Canonicalize JSON with floating-point edge cases (e.g., 1.0, -0.0, 1e10) and verify IEEE 754 normalization - [ ] Canonicalize JSON with Unicode escapes and verify normalization to shortest UTF-8 representation - [ ] Create two SBOMs with identical content but different component ordering, canonicalize both, and verify identical output - [ ] Verify CycloneDX and SPDX round-trip: parse -> write -> canonicalize produces stable output ## Verification | Check | Result | |-------|--------| | Tier 0 - Source Verification | PASS | | Tier 1 - Build + Code Review | PASS | | Tier 2 - Behavioral Verification | PASS | | Verified Date | 2026-02-13 | | Run ID | run-001 |