Format
OSDF is a layered format. A minimal package is just a safe, self-describing container; each additional layer adds a stronger, independently verifiable guarantee. Implementations declare which profile they target.
Design goals
- Passive by default - opening a document never executes document-supplied code.
- Self-describing - every object is declared in a manifest with a digest.
- Deterministic - canonicalization makes verification reproducible byte-for-byte.
- Offline-capable - embedded evidence allows verification without a live service.
- Crypto-agile - every algorithm is identified explicitly and versioned.
Layers
| Layer | Adds | Guarantee |
|---|---|---|
| L1 Container | Constrained ZIP + object table | Safe to parse |
| L2 Manifest | Per-object SHA-256 digests | Integrity |
| L3 Signatures | Ed25519 over canonical payload | Authenticity |
| L4 Revisions | Hash-linked revision chain | Lineage |
| L5 Transparency | Signed Merkle log + proofs | Non-repudiation |
| X1/X2 Access | Envelope encryption + policy | Confidentiality |
Canonicalization
Signatures and digests are computed over a canonical byte representation. JSON objects use JCS (RFC 8785); binary objects are hashed with domain separation:
text
object_digest = SHA-256(domain_tag || object_type || canonical_bytes)Domain tags prevent a hash computed for one purpose from being reused for another.
Versioning
The package header carries a format version and a profile identifier. A conforming viewer that encounters an unknown mandatory extension must fail closed rather than render partial content.
Continue to the Schema.