Skip to content

Address non-security review follow-ups - #113

Merged
germ-mark merged 1 commit into
mainfrom
llm/review-hardening
Sep 24, 2026
Merged

germ-mark merged 1 commit into
mainfrom
llm/review-hardening

Conversation

@germ-mark

Copy link
Copy Markdown
Contributor

Batches the non-security follow-ups from a review of the v0.1.6 changes:

  • CombinerGroup.establish rejects a classical GroupContext extension list that repeats a type. RFC 9420 §13.4: "Any field containing a list of extensions MUST NOT have more than one extension of any given type." Types are compared by raw value, so a hand-built .unknown can't slip past a .known of the same code point.
  • verifyFullCommitAttestation / verifyFullCommit decode a .customProposal-wrapped attestation under the Codepoints' own wire width. Before this, a caller verifying outside its .uint32 scope rejected every wrapped attestation.
  • Group.exportSecret throws exportLengthOutOfRange for a length outside 1...255·Nh (RFC 5869 §2.3), instead of trapping in HKDF.
  • establish / join forget the folded apq_psk, so a returned CombinerGroup's PSK store is empty.
  • ProposalStore.insert no longer silently overwrites an entry written by the migration SPI. A matching verified proposal leaves it in place (keeping its leaf secret); a mismatched one throws migratedUpdateRefAlreadyStored.
  • Smaller fixes: two stale docs (the swift-secret-bytes pin comment, HalfCreation's randomness claim), and a zeroizing first stage in the §8.5 exporter.

Deferred:

  • Enforcing RFC 9420 §13.4's GroupContext-extension support rules (members' capabilities must cover every GroupContext extension) is a larger interop change.
  • The duplicate-type rule is also not yet enforced on the profile's own extension lists (Group.create, GroupContextExtensions proposals, KeyPackage / LeafNode / GroupInfo). This PR only closes the combiner's caller-supplied path.

Testing: full swift test plus the strict lint. Each new test was mutation-checked, i.e. it fails when its mechanism is removed.

🤖 Generated with Claude Code

establish rejects duplicate classical extension types and forgets the
folded apq_psk; attestation verification decodes at the codepoints' wire
width; exportSecret throws on out-of-range lengths; ProposalStore.insert
no longer overwrites a migrated entry. Also fixes two stale docs and
zeroizes the exporter's first-stage secret.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Sep 23, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 4acf84c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@germ-network/swift-mls Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@germ-mark
germ-mark merged commit a74d8c4 into main Sep 24, 2026
4 checks passed
@github-actions github-actions Bot mentioned this pull request Sep 24, 2026
@germ-mark
germ-mark deleted the llm/review-hardening branch September 24, 2026 01:55
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