Repository navigation
feat(net)!: carry publisher epochs on routes #4942
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
0be5c6c
3edf582
2c83d0c
d6e0edf
d8eb996
590e4b5
b584e30
c088687
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -132,21 +132,21 @@ Each instance of a broadcast MUST mint an epoch that no other instance under the | |
| Two instances MUST NOT share an epoch: they would derive the same keys and collide on nonces. | ||
| Its leading 48-bit timestamp makes epochs sort by creation time and its random bits make collisions negligible. | ||
|
|
||
| A protected broadcast is published at `<opaque>/@<epoch>`, where `<opaque>` is the 22-character base64url segment derived from the credential and the application's semantic broadcast name according to {{derive}}, and `<epoch>` is the UUID text. | ||
| The `@` marker is part of the path segment only; the HKDF `bytes(epoch)` input remains the UUID text without `@`. | ||
| The opaque derivation does not include the epoch, so every instance of the same semantic broadcast shares a discovery prefix. | ||
| A protected broadcast is published at `<opaque>`, the 22-character base64url segment derived from the credential and the application's semantic broadcast name according to {{derive}}. | ||
| Each instance announces its epoch as the route's moq-lite Epoch; the HKDF `bytes(epoch)` input is the UUID text. | ||
| The opaque derivation does not include the epoch, so every instance of the same semantic broadcast shares one path. | ||
| The path carries no format or protection marker; for example, the semantic name `meeting.hang` appears only as an input to the opaque derivation. | ||
| A plaintext consumer that opens the protected broadcast fails because it cannot find the plaintext catalog it expects, not because of a path naming rule. | ||
| Subscribers discover instances by the `<opaque>/` prefix and select the greatest epoch, where greatest is newest. | ||
| A subscriber that already knows the full path parses the epoch from its last segment after removing `@`. | ||
| Subscribers resolve `<opaque>` and take the epoch from its route, where relays rank the newest first. | ||
| On a wire that cannot carry the route's epoch, the application supplies it over its own authenticated channel. | ||
|
|
||
|
Comment on lines
+135
to
142
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win 🔎 Supported by static analysis🏁 Script executed: sed -n '27,43p;64,77p;132,153p' drafts/draft-lcurley-moq-e2ee.md
git diff d90f447738b2c4dd07480b1dc4dd28b23a450084 c088687642f0d5621f43134ceab29fa86cdbcabf -- drafts/draft-lcurley-moq-e2ee.md | head -110Repository: moq-dev/moq Length of output: 8316 Update the abstract and relationship text to match route-carried epochs. The main section now states that the epoch is carried by the route, but the abstract and Relationship to Other Formats still state that the epoch is part of the broadcast path. Readers can therefore apply the obsolete path-based model when they use those summaries. Suggested fix-Each publisher instance mints an epoch and publishes under an opaque broadcast path ending in it.
+Each publisher instance mints an epoch and publishes under an opaque broadcast path with the epoch carried by the route.
...
-- The salt is not derived from the key. The publisher instance's epoch is an input to every derivation and the last segment of the broadcast path ({{epoch}}), so a restarted publisher derives new keys instead of needing a new Key ID.
+- The salt is not derived from the key. The publisher instance's epoch is an input to every derivation and is carried by the route, so a restarted publisher derives new keys instead of needing a new Key ID.🧰 Tools🪛 LanguageTool[style] ~139-~139: Consider using “who” when you are referring to a person instead of an object. (THAT_WHO) 🤖 Prompt for AI Agents |
||
| The epoch and the path are not secret and are not authenticated. | ||
| A relay that presents a wrong epoch causes authentication failure; a relay that withholds a newer instance denies service. | ||
| Neither can cause a nonce to repeat, because only the publisher instance chooses the epoch it encrypts under. | ||
|
|
||
| A restart or replacement of a publisher is a new instance and mints a new epoch. | ||
| Transport sequence numbers therefore restart freely without any coordination between instances. | ||
| Ended instances remain readable at their own path for as long as relays or archives retain them. | ||
| An ended instance stays readable only for as long as relays or archives retain it under its epoch; once a newer epoch wins the shared path, subscribers resolve the newer one. | ||
|
|
||
|
|
||
| # Canonical Encoding {#encoding} | ||
|
|
@@ -364,8 +364,8 @@ This document requests no registrations. | |
| ## draft-lcurley-moq-e2ee-00 | ||
| {:numbered="false"} | ||
|
|
||
| - Require canonical UUIDv7 epochs and carry them in `@<epoch>` path segments, leaving HKDF UUID inputs unchanged. | ||
| - Initial `moq-e2ee-00` profile: out-of-band credential, opaque broadcast path with a publisher-minted epoch as its last segment, HKDF physical names and keys, AES-128-GCM payloads, identity bounds, typed failures, and shared primitive vectors. | ||
| - Require canonical UUIDv7 epochs, carried on the route rather than in the path, leaving HKDF UUID inputs unchanged. | ||
| - Initial `moq-e2ee-00` profile: out-of-band credential, opaque broadcast path with a publisher-minted epoch on its route, HKDF physical names and keys, AES-128-GCM payloads, identity bounds, typed failures, and shared primitive vectors. | ||
|
|
||
|
|
||
| # Acknowledgments | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
Repository: moq-dev/moq
Length of output: 4385
Limit Epoch precedence to the selected longest-prefix tier.
The resolver selects the longest covering prefix before it compares Epoch and cost. Qualify the two concept-document statements so they do not imply that an Epoch-bearing route supersedes a more-specific route without one. The Rust wording already limits the comparison to routes “at the same path.”
Suggested documentation fix
🤖 Prompt for AI Agents