Skip to content

fix(requests): name a request's sender only when the Welcome proves it - #7

Merged
koabula merged 2 commits into
mainfrom
feat/request-sender-proof
Nov 12, 2026
Merged

koabula merged 2 commits into
mainfrom
feat/request-sender-proof

Conversation

@koabula

@koabula koabula commented Nov 12, 2026

Copy link
Copy Markdown
Owner

A message request showed its sender's name from the creator's self-asserted MLS credential before anything authenticated it.

A first-contact Welcome now carries the creator's root public key and the root key's binding of the device key (group-context extension 0xF0A3). inspect_welcome accepts a Welcome with a reply lane only if:

  • the user id is the fingerprint of the carried root key,
  • the binding verifies under it and names the credential's user and device,
  • the bound device key is the key that signed the Welcome.

Otherwise the Welcome gives no preview, and the request names no sender. The check is local: the receiver contacts no host. The accept-time bundle check is kept and now also requires the bundle's root key to equal the carried one.

First contacts now require the new capability:

  • A peer KeyPackage without it is refused with a clear error.
  • A device's own last-resort KeyPackage without it is rotated at the next maintenance.
  • One-time pool entries already on the host can't be deleted (there is no route for it); each one claimed for a first contact fails cleanly and is used up.

Draft, opened so CI runs: this was not built locally.

🤖 Generated with Claude Code

koala and others added 2 commits November 12, 2026 16:04
A first-contact Welcome now carries the creator's root public key and the
root key's binding of the device key (group context extension 0xF0A3).
inspect_welcome requires, for a Welcome with a reply lane, that the user id
is the fingerprint of that root key, that the binding verifies under it,
names the credential's user and device, and binds the key that signed the
Welcome. Otherwise the Welcome yields no preview, so the message request
names no sender. The accept-time bundle check also requires the bundle's
root key to equal the carried one.

First contacts now require the new capability. A peer KeyPackage without it
is refused with a clear error; a device's own last-resort KeyPackage
without it is rotated at the next maintenance.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@koabula
koabula marked this pull request as ready for review November 12, 2026 12:46
@koabula
koabula merged commit 48678f1 into main Nov 12, 2026
7 checks passed
@koabula
koabula deleted the feat/request-sender-proof branch November 12, 2026 13:02
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