Skip to content

docs(specs): define the attestation format and handle normalization - #12

Closed
xgreenx wants to merge 1 commit into
docs/ceremony-round3from
docs/ceremony-attestation-format
Closed

xgreenx wants to merge 1 commit into
docs/ceremony-round3from
docs/ceremony-attestation-format

Conversation

@xgreenx

@xgreenx xgreenx commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Stacked on #11. Review that one first — this diff shows only what it adds on top.

Two places in the suite named a thing without saying what it is. This gives each a concrete definition an implementer can build from. It changes no decision already made; #11 carries the corrections.

Common §9.1 — attestation format

The attested data becomes a byte concatenation, and the signature is over it. The split that makes the field list load-bearing: the Notary Service signs off chain, where it holds the transcript, and verifies on chain, where it holds none. So verification derives the key from the attested-data-and-signature pair alone and answers whether that key is currently trusted. A caller-supplied digest, preimage hash, or verification key is refused — a caller-computed digest authenticates whatever the caller hashed, not the bytes the Platform Verifier goes on to read.

The layout carries formatTag, platformId, operationTag, authorityId, createdAt, the two transcript lengths REQ-COMMON-36 requires, and per direction a list of revealed ranges with their offsets and a list of range commitments with theirs.

What it deliberately does not carry:

  • No Chain ID, no verifier identity. The attested data describes a session, not a destination. The Authorization Digest already commits the chain and is bound to the token attestation through the revealed code_verifier, so replaying on another chain takes a preimage. Binding to a verifier identity would be worse than redundant: a newly registered Platform Verifier version could not check attestations made before it existed.
  • No handle, account identifier, client identifier, or chain address. Each is already derivable from the revealed ranges, a second signed representation can disagree with the bytes it was taken from, and producing one would make the notary decide something profile-specific.

Platform §2.1a — handle normalization

The criteria prose becomes the algorithm: five per-platform parameters, six ordered steps, four rejection kinds. The published vector table becomes a cross-check on an implementation of that algorithm rather than its source — so a disagreement between a vector and the algorithm is a defect in the vector table.

Notes

@xgreenx
xgreenx force-pushed the docs/ceremony-attestation-format branch 2 times, most recently from e0d58d5 to 2844b68 Compare August 20, 2026 01:27
Two places in the suite named a thing without saying what it is. This gives
each a concrete definition an implementer can build from, and changes no
decision already made.

Common §9.1 fixes the attested data as a byte concatenation and the
signature over it. The Notary Service signs off chain, where it holds the
transcript, and verifies on chain, where it holds none: it derives the
verification key from the attested-data-and-signature pair alone and decides
whether that key is one it trusts. A caller-supplied digest, preimage hash,
or verification key is refused, because a caller-computed digest
authenticates whatever the caller hashed.

The layout carries formatTag, platformId, operationTag, authorityId,
createdAt, the two transcript lengths REQ-COMMON-36 requires, and per
direction a list of revealed ranges with their offsets and a list of range
commitments with theirs. It carries no Chain ID and no verifier identity:
the attested data describes a session, not a destination, and binding it to
one verifier would keep a newly registered version from checking
attestations made before it existed. It carries no handle, account
identifier, client identifier, or chain address either — each is already in
the revealed ranges, and a second signed copy can disagree with the bytes it
came from.

Platform §2.1a replaces the criteria prose with the algorithm: five
per-platform parameters, six ordered steps, and four rejection kinds. The
published vector table becomes a cross-check on an implementation of that
algorithm rather than its source, so a disagreement between the two is a
defect in the table.

REQ-COMMON-47..61, REQ-PLAT-61..74 and TEST-COMMON-24..26 are new here.

Signed-off-by: xgreenx <xgreenx9999@gmail.com>
@xgreenx
xgreenx force-pushed the docs/ceremony-attestation-format branch from 2844b68 to 8220a5b Compare August 20, 2026 01:43
@xgreenx xgreenx closed this Aug 20, 2026
@Wondertan
Wondertan deleted the docs/ceremony-attestation-format branch October 2, 2026 19:55
SupremaLex added a commit that referenced this pull request Oct 5, 2026
- drivePopup succeeds only once the popup requests Bridge's OAuth callback
  (local.ts BRIDGE + /auth/callback), seen as a navigation request so an
  immediate redirect onward still counts. Leaving the platform for another
  page keeps it waiting until its budget names the page; a Chrome error
  page or a popup closed before the return fails at once.
- Waits inside a driver go through `pause`, which rejects with the
  driver's own reason when the wait would pass the 180 s budget, so
  GitHub's rate-limit and error-page backoffs report themselves instead
  of a generic timeout. The budget and the page's 8-minute outcome wait
  fit the 12-minute test timeout.
- The page text reaches every driver lowercased with typographic
  apostrophes as plain ones; Google's own copy of that goes.
- GitHub's authorize click has a 5 s timeout, ignores a failed click as
  X and Google do, and is not repeated within 5 s; the two-factor goto
  and the rate-limit reload ignore their errors, as github.rs does.
- Session renewal hints say where libid-server-rs' `ceremony` lives:
  branch feat/live-ceremony-tests, libid-server-rs PR #12. stealth.js
  names presentAsPerson, which installs it.

Assisted-by: Claude Opus 5.5
Signed-off-by: SupremaLex <georglutsenko@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant