feat(ceremony)!: github reveals its token request whole - #44
Open
SupremaLex wants to merge 1 commit into
Open
SupremaLex wants to merge 1 commit into
SupremaLex wants to merge 1 commit into
Conversation
GitHub's exchange hid `client_secret` behind a range commitment and revealed the body up to it. It now reveals the request whole, the shape X already had: one revealed run from offset zero to the signed length, no commitment in that direction, every field a verifier reads in the open. `secretField: null` in profiles.json is the whole change; the generator takes GITHUB_TOKEN_SENT_COMMITMENTS to 0, `secret_field` to None and `secretField` to null from that one value. No verifier logic moves. An attestation of the exchange therefore publishes the application credential, to the notary that observed the session and to every reader of the chain. That is a property of the layout, and GitHub documents a public client as one that ships its secret. The fixtures are regenerated rather than edited: the deterministic record from libid-rs `ceremony_fixtures`, and a real MPC-TLS session captured against github.com. The X records are byte-identical, which is what says the change reaches only this profile. This changes what a `github/v1` verifier accepts: a record carrying the old committed suffix no longer verifies, and one carrying the new layout did not verify before. It is an edit to v1 rather than a new ceremony version on this evidence: chain-configurations registers no ceremony Platform Verifier on any network, so no github/v1 record has been accepted anywhere for the change to invalidate. Assisted-by: Claude Opus 5 Assisted-by: Claude Fable 5.1 Signed-off-by: SupremaLex <georglutsenko@gmail.com>
This was referenced Sep 17, 2026
Draft
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
GitHub's token request is revealed whole, the shape X already has: one revealed run from offset zero to the signed length, no commitment in that direction, every field a verifier reads in the open. The
github/v1exchange used to commitclient_secretas a suffix and reveal the body up to it.The change is one value —
secretField: nullinprofiles.json.regen-ceremony-profiles.pytakesGITHUB_TOKEN_SENT_COMMITMENTSto0,secret_fieldtoNoneandsecretFieldtonullfrom it. No verifier logic moves; the Solidity diff outside the generated file and the tests is comment-only (checked by diffing with comment lines excluded).Specified by libid-org/libID#35 (
docs/github-public-client, on #31). Deliberately not in this PR: #35's REQ-PLAT-61 five-field canonical form validation. On today'smainASM-PROV-07 covers both platforms and TEST-PLAT-19 probes both endpoints, so GitHub keeps the same decoded-form assumption X uses. That is the scope the CTO set: reveal the range, nothing more.What it publishes
An attestation of this exchange carries the application credential in plaintext — to the notary that observed the session and to every reader of the chain that verifies it. GitHub documents a public client as one that "will have to ship the client secret in the application's code". The real fixture below therefore contains a working
client_secretfor AppIv23lioEM9NAR9vO8CmT; it was registered for fixtures and its secret is rotated before this branch is pushed, so the published bytes are dead on arrival.Fixtures — regenerated, not edited
github-ceremony-session.json: from libid-rsceremony_fixturesagainst this branch'srust/profilescrate (a local path dependency; the crates.io0.10still carries the old layout). It decodes to one revealed range[0..383)and zero sent commitments.github-ceremony-real.json: a real MPC-TLS session captured 2026-09-17 withcapture_ceremony, consenting astestyakly(id293919812). Token direction:[0..406)revealed, zero commitments.main's, which is what says the change reaches only this profile.Version
This changes what a
github/v1verifier accepts:_tokenBodydemands the profile's exact commitment count, so a record carrying the old committed suffix no longer verifies and one carrying the new layout did not verify before.profiles.jsonand REQ-COMMON-01B both say that is a newceremonyVersion. It is an edit to v1 on this evidence: chain-configurations registers no ceremony Platform Verifier on any network, so nogithub/v1record has been accepted anywhere for the change to invalidate. If one is registered before this lands, this decision has to be revisited.Tests
GitHubPlatformVerifier.t.sol: the hand-built exchange reveals the request whole via_exchangeBody/_wholeSent; the three bespoke exchange-head tests follow; the two fixture tests read the regenerated records.test_rejectsAnExchangeThatCommitsABodySuffix— the layout asserted against the verifier rather than against the generated constant, so it fails if the value ever flips back.test_rejectsAnExchangeWhoseRequestLineIsHiddenis unchanged in substance: coverage and the origin rule are checked before the commitment count, which its comment now says.Verification
forge test483/483;forge fmt --check,forge lint -D notes,regen-ceremony-profiles.py --check;rust/: 37 tests,fmt --check,clippy -D warnings;ts/: build, 24 tests, lint, fmt — all clean.forge coverage --ir-minimumon the GitHub suite: the touched verifier files at 94–98% lines.Order across the repos
libid-rstakeslibid-profilesfrom crates.io, and that crate is generated here and published only by a GitHub Release, whosepublish-cratesjob needsforge testgreen. So the fixture in this PR was generated from this branch'srust/profilesas a local path dependency, and the sequence is forced:_tokenSentCommitmentsand thesecretFieldprofile field removed, the count a fixed rule; no acceptance change. Merges after this PR and before the release, so the crate ships both.release/v0.13.0— its own PR fromscripts/bump-version.sh, thengh release create v0.13.0, which publisheslibid-profiles 0.13.0.chore/github-whole-range-fixtures(draft until step 3 lands): already carries the capture tool's generic redirect URI; then takes the0.13pin together with the layout tests that assert the new shape, and re-runsceremony_fixturesagainst the published crate to diff against the record carried here — they must be identical.Follows
tests/ceremony/github.rsoverridessecret_field: Nonelocally; it becomes a no-op and can go.