transparency: an external encoding, and a witness for the receipt chain #89
1 changed files with 111 additions and 0 deletions
111
wai/extensions/transparency.md
Normal file
111
wai/extensions/transparency.md
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
# WAI Extension: Transparency Emission
|
||||||
|
|
||||||
|
> Status: Draft. Adds an **external encoding** for WAI receipts so a party with
|
||||||
|
> no WAI tooling can check them, and a registration profile so a receipt's
|
||||||
|
> existence is independently witnessed. Strictly **additive**: the JWP receipt
|
||||||
|
> chain is unchanged, and nothing here replaces it.
|
||||||
|
> Keywords **MUST**, **MUST NOT**, **SHOULD**, **MAY** are RFC 2119/8174.
|
||||||
|
|
||||||
|
## 1. What is actually missing
|
||||||
|
|
||||||
|
Not verifiability. An Ed25519 signature over a group Merkle root is checkable by
|
||||||
|
anyone holding the publisher key, and [`jwp-receipts`](jwp-receipts.md) §3
|
||||||
|
specifies exactly how. Three properties are missing, and none of them is a
|
||||||
|
signature property:
|
||||||
|
|
||||||
|
- **Non-equivocation.** Nothing prevents a publisher showing one receipt chain to
|
||||||
|
one party and a different chain to another. Both verify.
|
||||||
|
- **Independent timestamping.** A receipt says when the publisher says it was
|
||||||
|
made.
|
||||||
|
- **Detectability of suppression.** A receipt that was never shown to anyone
|
||||||
|
leaves no trace of its absence.
|
||||||
|
|
||||||
|
These are log properties, not envelope properties, and they are why this
|
||||||
|
extension exists.
|
||||||
|
|
||||||
|
## 2. The move, and its shape
|
||||||
|
|
||||||
|
The family already owns both halves: a transparency log with consistency proofs
|
||||||
|
exists, and JCR-1 (deterministic CBOR + COSE_Sign1, RFC 9052) is already the
|
||||||
|
canonical receipt envelope across sibling standards. What nothing in the family
|
||||||
|
has is a **standardised external encoding** that an outside auditor's
|
||||||
|
off-the-shelf tooling can verify with no bespoke verifier.
|
||||||
|
|
||||||
|
So the sequence is: bring WAI's receipts onto JCR-1 as its siblings already are,
|
||||||
|
then emit in the standardised encodings on top.
|
||||||
|
|
||||||
|
- A WAI receipt **SHOULD** be expressible as a JCR-1 envelope. This is alignment
|
||||||
|
with the family, not a new format.
|
||||||
|
- An implementation **MAY** additionally emit an RFC 9942 (COSE Receipts)
|
||||||
|
encoding of a group receipt, and **MAY** use the RFC 9995 COSE Hash Envelope
|
||||||
|
form where the payload is carried by hash rather than by value.
|
||||||
|
- These emissions are **additional encodings of the same facts**. An implementation
|
||||||
|
**MUST NOT** let the JWP chain and an emitted encoding disagree, and where they
|
||||||
|
do, the JWP chain is authoritative and the emission is in error.
|
||||||
|
|
||||||
|
## 3. What is registered, and what is not
|
||||||
|
|
||||||
|
SCITT registers per-artifact Signed Statements over an HTTP API. WAI emits
|
||||||
|
per-object receipts at media-group cadence. These cadences do not match, and
|
||||||
|
forcing them together would put a registration round-trip in the per-object path.
|
||||||
|
|
||||||
|
- An implementation **MUST NOT** register per-object receipts individually.
|
||||||
|
- An implementation **SHOULD** register the **group** receipt, or periodic
|
||||||
|
checkpoints over the receipt chain, leaving the per-object receipt exactly
|
||||||
|
where it is.
|
||||||
|
- Registration **MUST NOT** be a precondition for a receipt being valid. An
|
||||||
|
unregistered receipt is a receipt whose existence is unwitnessed, not a receipt
|
||||||
|
that is wrong.
|
||||||
|
|
||||||
|
The checking party is the **Relying Party** in the terminology of the SCITT
|
||||||
|
architecture; this extension uses that term rather than coining another.
|
||||||
|
|
||||||
|
## 4. The hash-algorithm constraint
|
||||||
|
|
||||||
|
RFC 9995's `payload_hash_alg` takes an identifier from the COSE Algorithms
|
||||||
|
registry. **BLAKE3 — which `jwp-receipts` §2.1 uses throughout — does not appear
|
||||||
|
in that registry.**
|
||||||
|
|
||||||
|
This is a real constraint, not a detail to be waved through:
|
||||||
|
|
||||||
|
- An implementation **MUST NOT** emit a COSE Hash Envelope naming BLAKE3 by an
|
||||||
|
unregistered or invented identifier. An identifier a Relying Party cannot
|
||||||
|
resolve defeats the entire purpose of emitting in a standard encoding.
|
||||||
|
- Until a registration exists, an implementation **MUST** either omit the hash
|
||||||
|
envelope form, or carry a **second digest** under a registered algorithm
|
||||||
|
alongside the BLAKE3 commitment, stating plainly that the two cover the same
|
||||||
|
bytes.
|
||||||
|
- A dual-hash carry **MUST NOT** be presented as evidence that BLAKE3 is
|
||||||
|
registered.
|
||||||
|
|
||||||
|
Registering BLAKE3 in the COSE Algorithms registry is a separate action with its
|
||||||
|
own process, and this extension does not assume its outcome.
|
||||||
|
|
||||||
|
## 5. Stage discipline
|
||||||
|
|
||||||
|
The referenced work is at mixed maturity, and an implementation **MUST NOT**
|
||||||
|
present any of it as more settled than it is:
|
||||||
|
|
||||||
|
| document | status |
|
||||||
|
|---|---|
|
||||||
|
| SCITT architecture (RFC 9943) | Standards Track, published |
|
||||||
|
| COSE Receipts (RFC 9942) | Standards Track, published |
|
||||||
|
| COSE Hash Envelope (RFC 9995) | published |
|
||||||
|
| SCRAPI (registration/resolution API) | approved, in the RFC Editor queue |
|
||||||
|
| a concrete log profile | Working Group Last Call — **not ratified** |
|
||||||
|
|
||||||
|
An implementation **MUST NOT** describe the log profile as ratified, and
|
||||||
|
**SHOULD** state which profile it registered against, since a Relying Party
|
||||||
|
cannot check a proof without knowing the log's rules.
|
||||||
|
|
||||||
|
## 6. What this does not do
|
||||||
|
|
||||||
|
- It does **not** replace the JWP receipt chain, and it does **not** move the
|
||||||
|
per-object commitment anywhere.
|
||||||
|
- It does **not** make registration a trust anchor. A Transparency Service
|
||||||
|
witnesses that a receipt existed at a time; it does not attest that the receipt
|
||||||
|
is true, and an implementation **MUST NOT** report registration as
|
||||||
|
verification.
|
||||||
|
- It does **not** solve key discovery. That is [`jwp-receipts`](jwp-receipts.md)
|
||||||
|
§7, and a log entry naming a key the Relying Party cannot resolve is still
|
||||||
|
unresolvable.
|
||||||
Loading…
Reference in a new issue