Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
633964e
docs(specs): reconcile browser validation ownership
Wondertan Sep 12, 2026
c65bcae
docs(specs): extract CCDP and ceremony service contracts
Wondertan Sep 12, 2026
1122e44
docs(ccdp): separate denial from local cancellation
Wondertan Sep 13, 2026
42424bc
docs(ccdp): group event instrumentation fields
Wondertan Sep 13, 2026
5d885a5
docs(ccdp): clarify denial and failure message names
Wondertan Sep 13, 2026
0b5e9cf
docs(ccdp): allow notary inputs across platform profiles
Wondertan Sep 13, 2026
cc84229
docs(specs): reconcile CCDP with existing contracts
Wondertan Sep 13, 2026
0d163cc
docs(specs): sync updated framing requirements from #31
Wondertan Sep 14, 2026
3f4abd4
docs(specs): permit inert directory slash redirects
Wondertan Sep 14, 2026
6867c10
docs(ccdp): remove bridge-owned GitHub token exchange
Wondertan Sep 14, 2026
3d44ab5
docs(ccdp): scope bridge exchange requirements to platform profiles
Wondertan Sep 14, 2026
ac072b4
docs(ccdp): rename token exchange credential to clientCredential
Wondertan Sep 15, 2026
6ec9b91
docs(bridge): remove the server public-origin requirement
Wondertan Sep 15, 2026
0fcbc59
docs(bridge): allowedAppOrigins admits origin patterns (#48)
xgreenx Sep 23, 2026
7b91fbe
docs(specs): platform ceremony versions come from the Distribution (#52)
xgreenx Sep 29, 2026
2ea9767
docs(site): add required titles to protocol specs
Wondertan Sep 29, 2026
c1916ea
docs(specs): reconcile browser result consistency checks
Wondertan Sep 29, 2026
9566fa6
docs(specs): serve each CCDP version's latest compatible release only
Wondertan Sep 30, 2026
5caaaf3
docs(specs): reconcile CCDP review and cache lifecycle
Wondertan Oct 1, 2026
311a456
docs(specs): clarify optional config preflight handling
Wondertan Oct 1, 2026
d4f6b69
docs(specs): remove stale callback input policy wording
Wondertan Oct 1, 2026
a9507f7
docs(specs): pin content-addressed CCDP workers
Wondertan Oct 1, 2026
2ae7573
docs(specs): drop stale nested Worker registrations
Wondertan Oct 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
583 changes: 583 additions & 0 deletions specs/ccdp-distribution.md

Large diffs are not rendered by default.

1,007 changes: 1,007 additions & 0 deletions specs/ccdp.md

Large diffs are not rendered by default.

90 changes: 61 additions & 29 deletions specs/ceremony-common.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,9 @@ Proving Circuit: The zero-knowledge circuit whose proof a Platform Verifier
checks. It proves only what cannot be read from authenticated evidence.

Redirect Runtime: The immutable browser component served at a registered
redirect URI, which receives an authorization response and delivers it
across the application's live ceremony channel.
redirect URI, which receives an authorization response, authenticates the
Application, and privately carries that response to Prover as defined by
CCDP. It does not deliver the raw response to the Application.

Verifier Governance Process: The authority over the verification path: the
Proof Verifier's Supported Version Set and the Verifier Version each entry
Expand Down Expand Up @@ -239,6 +240,17 @@ identity-platform signing root, notary key, Platform Verifier, verifier governan
browser supply chain, or Consumer Chain invalidates the properties that depend
on it.

Browser result acceptance is not ledger verification. Prover performs canonical
parsing and local request/commitment consistency checks; Application validates
the delivered result under the selected profile. Google's browser checks compare
public inputs with the delivered fields and Application's retained digest
without passing that expected digest to Prover; the
[platform profile](platform-ceremonies.md#32-browser-token-validation) owns those
checks. Neither endpoint verifies generated proofs or notary signatures
cryptographically. Well-formed forgeries can survive browser consistency checks
but still fail the applicable downstream proof, digest-binding, trusted signing-key, or
notary-signature check before an authoritative effect.

- SP-BIND-01:
Evidence produced by a ceremony discharges only for the Authorized
Transaction Data committed in its Authorization Digest. Depends on
Expand All @@ -248,16 +260,22 @@ on it.
conformance tests (supporting, not proving) plus the collision resistance of
SHA-256 and keccak256.
- SP-CLIENT-01:
The Canonical Runtime rejects evidence issued to an OAuth client other than
the one fixed by its immutable ceremony profile. Depends on ASM-PROV-05,
The browser Prover rejects a parsed OAuth client identifier differing from

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Low: the client source is stale. SP-CLIENT-01 says "fixed by its immutable ceremony profile", and so does REQ-COMMON-17 (:848-851, outside the diff), but a Platform Profile carries no client. REQ-PLAT-47 and REQ-PLAT-62 use the client frozen by the Application. Say "the client frozen for the ceremony" in both.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated SP-CLIENT-01 and REQ-COMMON-17 to use the client frozen for the ceremony. Platform profiles continue to own protocol constants, not deployment-specific OAuth client IDs.

the one selected and frozen by the Application for the ceremony. This checks
local consistency, not the authenticity of an attestation's claimed identifier; ledger
verification authenticates that identifier independently. Depends on ASM-PROV-05,
ASM-PROV-07 for a profile that cites it, ASM-NOTARY-01, ASM-PROOF-01, and
ASM-BROWSER-01.
Evidence: checked invariant in the Canonical Runtime, plus conformance tests
(supporting).
- SP-DELIVERY-01:
An authorization response for one OAuth client reaches only an origin
registered to that client, so a site borrowing another deployment's client
cannot receive its evidence. Depends on ASM-PROV-01, ASM-BROWSER-01.
The Identity Platform delivers an OAuth client's initial authorization
response only to that client's registered redirect origin. Subsequent browser

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium: a borrowed client can receive the response under *. This still says borrowing another deployment's client "does not authorize receipt", and §Security (:1508-1510 and :1515-1518, outside the diff) says each Application deployment owns its own client. Bridges now admit patterns and * (oauth-bridge.md:58, ccdp.md:699-703), and a * Bridge releases IdentityProof to any origin. Qualify both by "Application origins the serving Bridge's allowlist admits", and replace the per-deployment-client sentence with Bridge-owned clients.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed both the property and security prose in bbc336a. Receipt depends on the serving Bridge's allowlist; * deliberately admits any Application origin. OAuth registrations belong to the Bridge, not necessarily to each Application deployment.

release follows REQ-COMMON-30: an Application outside that deployment's
allowlist cannot use a borrowed client to obtain its response through CCDP.
A shared or wildcard-admitting deployment deliberately permits other
Applications; this property does not establish client ownership or user
intent. Depends on ASM-PROV-01, ASM-BROWSER-01.
Evidence: external audit of the registered redirect URI list, plus
conformance tests (supporting).
- SP-EXCHANGE-01:
Expand Down Expand Up @@ -706,9 +724,12 @@ attestation to verify carries no value at all.
The Deployment MUST register with each Identity Platform only redirect URIs
whose origins it controls.
- REQ-COMMON-30 (upholds SP-DELIVERY-01):
The Canonical Runtime MUST forward an authorization response only over a live
browser channel authenticated to an exact origin in the deployment-configured
allowed application-origin set. The set MAY contain more than one origin.
The Canonical Runtime MUST release an authorization response beyond Callback
only after authenticating the exact Application origin against the deployment
allowlist. The Canonical Runtime MUST carry the response only to the configured
Prover, preserving that authenticated origin restriction as defined by CCDP
(REQ-CCDP-03, REQ-CCDP-04). The deployment allowlist follows the member and
admission rules of popup transport REQ-POPUP-ALLOW-01 and REQ-POPUP-ALLOW-02.
- REQ-COMMON-31 (upholds SP-DELIVERY-01):
The Canonical Runtime MUST ignore a forwarding target supplied in the
redirect request.
Expand Down Expand Up @@ -832,9 +853,10 @@ An Consumer that wants a fixed-size key derives one itself, as the keccak256 of
the returned bytes. Deriving is cheap and lossless; returning only a digest is
not, because the readable value cannot be recovered from it.
- REQ-COMMON-17 (upholds SP-CLIENT-01):
The Canonical Runtime MUST reject a Submission whose authenticated
client identifier differs byte for byte from the client fixed by the
selected immutable ceremony profile.
The Prover MUST reject locally parsed evidence whose client identifier
differs byte for byte from the client selected and frozen by the Application
for the ceremony. This browser comparison does not authenticate that evidence;
ledger verification remains authoritative.
- REQ-COMMON-17C (upholds SP-CLIENT-01):
The Proof Verifier and the Platform Verifier MUST NOT require the exposed
client identifier to belong to a registered set. The Consumer
Expand Down Expand Up @@ -1150,8 +1172,9 @@ constant.
method and path revealed in the request, byte for byte with the profile
constants it pins.
- REQ-COMMON-21B (upholds SP-EXCHANGE-01):
The Implementation MUST construct every notarized request with the media type
and `redirect_uri` from its immutable deployment profile. Neither value is a
The Implementation MUST construct every notarized request with the media type fixed
by the selected Platform Profile and, where used, the `redirect_uri` frozen
by the Application for the ceremony. Neither value is a
Consumer input. Necessity: media type selects the platform's request parser,
while redirect URI is application delivery configuration rather than
Consumer Chain identity authority.
Expand Down Expand Up @@ -1323,8 +1346,8 @@ the constructions that role implements.
completes contains the raw `authorizationNonce` of a PKCE profile.
Verification: inspection of the emitted artifacts.
- TEST-COMMON-09 (exercises REQ-COMMON-16, REQ-COMMON-16A, REQ-COMMON-16B, REQ-COMMON-17, REQ-COMMON-17C, REQ-COMMON-22A):
The Canonical Runtime rejects a Submission carrying a client identifier
other than its immutable profile's client, while a proof carrying a client
The Prover rejects locally parsed evidence carrying a client identifier
other than the Application's frozen client, while a proof carrying a client
identifier registered nowhere remains acceptable to the Platform Verifier.
Every platform returns the identifier as exact bytes, never a digest, and a
Submission whose supplied bytes its evidence does not authenticate is
Expand Down Expand Up @@ -1367,7 +1390,8 @@ the constructions that role implements.
- TEST-COMMON-11 (exercises REQ-COMMON-21, REQ-COMMON-21A, REQ-COMMON-21B, REQ-COMMON-21C):
The Platform Verifier rejects an authenticated foreign authority, method,
or path. The request constructor refuses a media type or `redirect_uri`
differing from its immutable deployment profile. One verifying key serves
differing from the selected profile's media type or the Application's frozen
redirect URI, respectively. One verifying key serves
two deployments configured with different clients and redirect URIs.
- TEST-COMMON-12 (exercises REQ-COMMON-23, REQ-COMMON-24, REQ-COMMON-25):
A fractional, negative, overflowing, or textual timestamp is rejected, and
Expand All @@ -1380,9 +1404,13 @@ the constructions that role implements.
operation with a further authoritative effect succeeds, and a Consumer whose
only effect is the metadata write rejects the Submission.
- TEST-COMMON-14 (exercises REQ-COMMON-30, REQ-COMMON-31):
Each of two configured application origins can complete its own authenticated
live channel; an unlisted origin is rejected, and a redirect request carrying
a forwarding target cannot change either result.
Each of two explicitly admitted application origins can complete its own
authenticated live channel; an unadmitted origin is rejected. A pattern or
`*` admits the origins specified by the popup transport rules without granting
client ownership. A redirect request carrying
a forwarding target cannot change either result. Callback privately carries
the return only to the configured Prover; that Prover authenticates the same
Application origin before credential use.
- TEST-COMMON-15 (exercises REQ-COMMON-29):
Every redirect URI registered against each production client resolves to an
origin the deployment controls. Verification: audit of the platform client
Expand All @@ -1408,7 +1436,8 @@ the constructions that role implements.
moves no value; and a call whose native value differs from the quoted value
is rejected at every hop.
- TEST-COMMON-17 (exercises REQ-COMMON-33, REQ-COMMON-34B, REQ-COMMON-33A, REQ-COMMON-34, REQ-COMMON-34A, REQ-COMMON-34C, REQ-COMMON-34D, REQ-COMMON-34E):
An attestation carrying a foreign notary signature is rejected; a
At ledger verification, the trusted Notary Service rejects an attestation
carrying a foreign notary signature; a
verification whose fee was not delivered is rejected; the charged fee is
identical across differing attested content, authors, payers, and
submitters; the current fee is readable before the Submission is submitted; and a
Expand Down Expand Up @@ -1489,17 +1518,20 @@ Transaction Author and the proof-bound Authorized Transaction Data. A copied
proof creates no authority for a submitter that cannot satisfy that predicate.

Client binding rejects evidence issued to a client other than the one whose
ceremony the Canonical Runtime opened. The check is local because independent
Application deployments own different OAuth clients. The Consumer
ceremony the Canonical Runtime opened. The check is local: the Application
freezes its selected Bridge's client configuration, which may be shared with
other admitted Applications. The Consumer
authenticates the proof-bound transaction and Transaction Author instead; it
does not maintain an OAuth-client allowlist or admit applications on the
Consumer Chain.

Consent-screen phishing remains outside protocol enforcement. A hostile site
borrowing an honest deployment's OAuth client does not receive its response,
because the Identity Platform delivers it only to that client's registered
redirect URI (ASM-PROV-01). A hostile site using its own client and redirect can
receive evidence from a ceremony the user approves; the proof-bound operation,
Consent-screen phishing remains outside protocol enforcement. The Identity
Platform delivers a borrowed client's response only to that client's registered
redirect URI (ASM-PROV-01); Callback then applies the deployment's allowlist.
An unadmitted Application cannot receive the response through that flow, but
a shared deployment or `*` may deliberately admit an unrelated Application.
Such an Application, or one using its own client and redirect, can obtain
evidence from a ceremony the user approves; the proof-bound operation,
Transaction Author authentication, and any composition-owned transaction authorization
contain that case. The ceremony layer defines no extra confirmation page. The
registered redirect URI list and the origins on it are therefore trust-bearing
Expand Down
38 changes: 30 additions & 8 deletions specs/libid.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,19 @@ specifications.
protocols cite it instead of restating opener, isolation, and continuity
mechanics.

## Browser ceremony and services

- [Ceremony Cross-Document Protocol](ccdp.md) defines its documents, routes,
private navigation inputs, messages, events, and phases over popup transport.
- [OAuth Bridge](oauth-bridge.md) defines public platform configuration and
callback ingress.
- [CCDP Distribution](ccdp-distribution.md) defines static resource responses,
Callback configuration insertion, isolation policies, and compatible publication.

These chapters are normative browser/service boundaries. TypeScript APIs, build
tooling, UI projections, dependency pins, and qualification evidence belong to
the implementation documentation, not this specification.

## System model and specification ownership

libID turns an identity-platform authorization into a proof that a Consumer
Expand All @@ -53,7 +66,8 @@ User -> Identity Platform -> Canonical Runtime -> Proving Circuit -> Consumer

The Consumer never verifies evidence itself. It calls the Proof Verifier,
which selects the Platform Verifier registered for the named identity platform
and Platform Ceremony Version, which in turn obtains
and ledger-local Verifier Version. Several Verifier Versions may implement the
same Platform Ceremony Version. The selected Platform Verifier obtains
attestation authenticity from the Notary Service once for each attestation
that profile carries. Google carries none, so its path reaches no Notary
Service and pays no fee; X and GitHub carry two each. The result travels
Expand All @@ -62,11 +76,14 @@ Authorized Transaction Data, and client identifier, and the Consumer decides
what that transaction means. [Common §5.1](ceremony-common.md#51-verification-path)
owns this path.

The application operator controls its frontend, redirect deployment, OAuth
registrations and public application credentials, but is not trusted to choose
identity fields, change the proof-bound operation, or widen proof validity.
GitHub token exchange and identity notarization run in the browser; there is
no confidential exchange service. The identity platform
The Application, OAuth Bridge, and CCDP Distribution may have different operators.
The Application controls its frontend and selects its ceremony configuration;
the Bridge owns OAuth registrations, public client configuration, and callback
ingress; the Distribution supplies CCDP browser code and proving assets. Those deployments are
trusted for the local browser ceremony, but not to choose authoritative identity fields,
change the proof-bound operation, or widen proof validity. GitHub token exchange
and identity notarization run in the browser; there is no confidential exchange
service. The identity platform
controls the authenticated account response. The notary authenticates X/GitHub
transcripts and their creation times. Verifier governance selects the
Supported Version Set, accepted verifier artifacts, and trust roots. Each
Expand All @@ -76,7 +93,9 @@ authenticates the Transaction Author and supplies its Chain ID and Block Time.
| Principal | Knows and can | Trusted for | Not trusted for |
|---|---|---|---|
| User | chooses an account and authorizes an operation | human intent | parsing or cryptographic verification |
| Application operator | configures clients and deployment assets; starts or withholds work | deployment availability and declared configuration | identity fields, proof target, or proof validity |
| Application operator | selects a Bridge and operation; starts or withholds work | frontend availability and declared ceremony inputs | identity fields, proof target, or proof validity |
| OAuth Bridge operator | holds OAuth registrations and public application credentials; configures and serves Callback | correct public configuration, Callback delivery, and availability | ledger identity, digest, notary-key, or validity decisions |
| CCDP Distribution publisher | supplies browser code, proving assets, and response policies to multiple Bridges | correct code and asset supply under ASM-CCDP-01 | authority to change ledger verification rules |
| Identity-platform operator | authenticates accounts and issues signed or TLS-authenticated responses | the `ASM-PROV-*` behavior the selected profile cites | the proof-bound transaction or Transaction Author |
| Notary operator | operates the X/GitHub attestation key and observes sessions | `ASM-NOTARY-01` | user intent or transaction authorization |
| Verifier governance administrator | activates verifier artifacts, trust roots, and the Supported Version Set | correct authority lifecycle | user consent |
Expand Down Expand Up @@ -104,7 +123,10 @@ root and verifier.
| Chain ID, Transaction Author, Block Time, and transaction-data encoding | [Chain profiles](chain-profiles.md), with the Consumer's protocol fixing each transaction kind's arguments |
| Platform endpoints, fields, trust roots, and proof projections | [Identity-platform ceremonies](platform-ceremonies.md) |
| Popup origin allowlists, message model, delivery, navigation, closure, and continuity guarantees | [Popup transport](popup-transport.md) |
| Redirect transport, interruption behavior, and UI control flow | browser architecture |
| Ceremony documents, routes, private fragments, messages, events, and phase transitions | [CCDP](ccdp.md) |
| Public ceremony configuration and callback ingress | [OAuth Bridge](oauth-bridge.md) |
| Static response policies, aggregate Callback artifact, immutable asset publication | [CCDP Distribution](ccdp-distribution.md) |
| Package APIs, UI projections, build tooling, and qualification evidence | implementation documentation (non-normative) |
| Transaction dispatch and author authentication | Consumer protocol |
| Verification dispatch, replay recording, trust roots, and version governance | [Common ceremony rules](ceremony-common.md) |

Expand Down
Loading
Loading