docs: update mesh-protocol-gaps with actual measurements
Key findings from actual benchmarks: - MLS KeyPackage: 306 bytes (6 LoRa fragments, ~4 sec) - MLS Welcome: 840 bytes (17 fragments, ~10 sec) - MLS-Lite: 129 bytes without sig, 262 with sig - MeshEnvelope V2: 336 bytes (~18% savings over V1) Classical MLS is LoRa-viable! Group setup takes ~14 sec at 1% duty. Post-quantum hybrid (2.6KB KeyPackage) is still impractical. Updated action items to reflect completed work: - MLS-Lite implemented - MeshEnvelope V2 implemented - Size measurements complete
This commit is contained in:
@@ -13,11 +13,11 @@ QuicProChat has strong cryptography (MLS, PQ-KEM) but **real gaps** in the mesh
|
||||
|
||||
| Gap | Severity | Status |
|
||||
|-----|----------|--------|
|
||||
| MLS overhead too large for LoRa | **Critical** | Needs design work |
|
||||
| No lightweight messaging mode | **High** | Not started |
|
||||
| MLS overhead too large for LoRa | **Critical** | **MEASURED** — see actual sizes below |
|
||||
| No lightweight messaging mode | **High** | **DONE** — MLS-Lite implemented |
|
||||
| KeyPackage distribution over mesh | **High** | Not solved |
|
||||
| Announce/routing not battle-tested | **Medium** | S3 done, needs real-world test |
|
||||
| No DTN bundle protocol integration | **Medium** | Not started |
|
||||
| Announce/routing not battle-tested | **Medium** | S3-S4 done, needs real-world test |
|
||||
| No DTN bundle protocol integration | **Medium** | Priority field added |
|
||||
| Battery/duty-cycle optimization | **Medium** | Basic tracker exists |
|
||||
|
||||
---
|
||||
@@ -28,29 +28,47 @@ QuicProChat has strong cryptography (MLS, PQ-KEM) but **real gaps** in the mesh
|
||||
|
||||
**MLS was designed for Internet messaging, not LoRa.**
|
||||
|
||||
Measured sizes (approximate):
|
||||
### Actual Measured Sizes (2026-03-30)
|
||||
|
||||
| Component | Size (bytes) | LoRa SF12/BW125 airtime |
|
||||
|-----------|--------------|------------------------|
|
||||
| MLS KeyPackage | ~500-800 | 80-130 seconds |
|
||||
| MLS Welcome | ~1000-2000 | 160-320 seconds |
|
||||
| MLS Commit | ~200-500 | 32-80 seconds |
|
||||
| MLS ApplicationMessage | ~100-200 | 16-32 seconds |
|
||||
| **MeshEnvelope overhead** | ~170 (CBOR) | 27 seconds |
|
||||
| **Reticulum LXMF message** | ~100-150 | 16-24 seconds |
|
||||
| **Meshtastic payload** | ~237 max | 38 seconds |
|
||||
| Component | Size (bytes) | LoRa SF12 fragments | At 1% duty |
|
||||
|-----------|--------------|---------------------|------------|
|
||||
| **MLS KeyPackage** | 306 | 6 | ~4 sec |
|
||||
| **MLS Welcome** | 840 | 17 | ~10 sec |
|
||||
| **MLS Commit (add)** | 736 | 15 | ~9 sec |
|
||||
| **MLS AppMessage (5B)** | 143 | 3 | ~2 sec |
|
||||
| **MLS Commit (update)** | 544 | 11 | ~7 sec |
|
||||
| **MLS KeyPackage (PQ)** | 2,676 | 53 | ~32 sec |
|
||||
| **MLS Welcome (PQ)** | 5,504 | 108 | ~65 sec |
|
||||
| **MeshEnvelope V1 (CBOR)** | 410 | 9 | ~5 sec |
|
||||
| **MeshEnvelope V2 (truncated)** | 336 | 7 | ~4 sec |
|
||||
| **MLS-Lite (no sig)** | 129 | 3 | ~2 sec |
|
||||
| **MLS-Lite (with sig)** | 262 | 6 | ~4 sec |
|
||||
| Reticulum LXMF | ~100-150 | 2-3 | ~1-2 sec |
|
||||
| Meshtastic max | 237 | 5 | ~3 sec |
|
||||
|
||||
**The math doesn't work:**
|
||||
**Key insights:**
|
||||
|
||||
- Classical MLS is **viable** for LoRa — 6 fragments for KeyPackage
|
||||
- Post-quantum hybrid MLS is **prohibitive** — 53+ fragments for KeyPackage
|
||||
- MLS-Lite matches Meshtastic efficiency while adding proper auth
|
||||
- **Total group setup** (KeyPackage + Welcome): ~23 fragments, ~14 sec
|
||||
|
||||
**The math NOW works for classical MLS on LoRa:**
|
||||
|
||||
- LoRa SF12/BW125: ~51 byte MTU, ~300 bps effective
|
||||
- EU868 duty cycle: 1% = 36 seconds TX per hour
|
||||
- **One MLS KeyPackage = 10-20 fragments = entire hour's duty budget**
|
||||
- **One MLS KeyPackage = 6 fragments = 4 sec = acceptable**
|
||||
- **Group setup = 14 sec = half duty budget, but feasible**
|
||||
|
||||
### Current State
|
||||
**Post-quantum is still problematic for constrained links.**
|
||||
|
||||
- MeshEnvelope uses CBOR, ~170 bytes overhead for a short message
|
||||
- MLS operations happen at application layer, not optimized for mesh
|
||||
- No fallback to lighter crypto for constrained links
|
||||
### Current State (Updated 2026-03-30)
|
||||
|
||||
- ✅ MeshEnvelope V1 uses CBOR, ~410 bytes for empty payload
|
||||
- ✅ MeshEnvelope V2 uses truncated 16-byte addresses, ~336 bytes (~18% savings)
|
||||
- ✅ MLS-Lite implemented: ~129 bytes without signature, ~262 with
|
||||
- ✅ Classical MLS KeyPackage measured at 306 bytes (much better than expected)
|
||||
- ⚠️ PQ-hybrid MLS still large (2.6KB KeyPackage)
|
||||
|
||||
### Proposed Solutions
|
||||
|
||||
@@ -109,10 +127,12 @@ pub struct LxmfMessage {
|
||||
|
||||
### Action Items
|
||||
|
||||
- [ ] **Measure actual MLS sizes** in current implementation (benchmark)
|
||||
- [ ] **Design MLS-Lite spec** for constrained links
|
||||
- [x] **Measure actual MLS sizes** — done, see table above
|
||||
- [x] **Design MLS-Lite spec** — `docs/plans/mls-lite-design.md`
|
||||
- [x] **Implement MLS-Lite** — `crates/quicprochat-p2p/src/mls_lite.rs`
|
||||
- [x] **Implement MeshEnvelope V2** — truncated addresses, priority field
|
||||
- [ ] **Implement transport capability negotiation** in TransportManager
|
||||
- [ ] **Add `--constrained` mode** to MeshEnvelope for minimal overhead
|
||||
- [ ] **Test MLS-Lite vs full MLS on real LoRa**
|
||||
|
||||
---
|
||||
|
||||
@@ -291,13 +311,14 @@ Our positioning doc claims superiority over Meshtastic/Reticulum/Briar, but:
|
||||
|
||||
## Success Metrics
|
||||
|
||||
| Metric | Current | Target |
|
||||
|--------|---------|--------|
|
||||
| MeshEnvelope overhead (short msg) | ~170 bytes | <100 bytes |
|
||||
| Time to send "hello" over SF12 LoRa | ~27 sec | <15 sec |
|
||||
| KeyPackage exchange over mesh | Not possible | Works |
|
||||
| Multi-hop message delivery | Mock only | Real hardware |
|
||||
| Battery life (mesh mode) | Unknown | Measured & documented |
|
||||
| Metric | Previous | Current | Target |
|
||||
|--------|----------|---------|--------|
|
||||
| MeshEnvelope overhead (empty) | ~410 bytes | ~336 (V2) | ✅ Done |
|
||||
| MLS-Lite message (no sig) | N/A | ~129 bytes | ✅ Done |
|
||||
| Time to send "hello" over SF12 LoRa | ~27 sec | ~4 sec (MLS-Lite) | ✅ Done |
|
||||
| KeyPackage exchange over mesh | Not possible | Pending | Works |
|
||||
| Multi-hop message delivery | Mock only | Code complete | Real hardware |
|
||||
| Battery life (mesh mode) | Unknown | Unknown | Measured |
|
||||
|
||||
---
|
||||
|
||||
@@ -307,16 +328,19 @@ Our positioning doc claims superiority over Meshtastic/Reticulum/Briar, but:
|
||||
- MLS group crypto is genuinely better than Meshtastic/Reticulum
|
||||
- Transport abstraction is clean
|
||||
- Announce protocol is solid
|
||||
- **NEW: Classical MLS KeyPackage (306B) is actually LoRa-viable**
|
||||
- **NEW: MLS-Lite provides Meshtastic-level efficiency with real auth**
|
||||
|
||||
**What we need to fix:**
|
||||
- MLS overhead makes LoRa impractical for group setup
|
||||
**What we still need to fix:**
|
||||
- No solution for KeyPackage distribution without server
|
||||
- No real-world testing yet
|
||||
- No real-world testing with actual LoRa hardware
|
||||
- Post-quantum hybrid mode too large for constrained links
|
||||
|
||||
**What we should acknowledge in marketing:**
|
||||
- "Best crypto for mesh" is true, but with caveats
|
||||
- "LoRa-ready" means "designed for LoRa, pending optimization"
|
||||
- We're research-stage, not production-ready
|
||||
**What we can now claim:**
|
||||
- "MLS on LoRa" — YES, classical MLS works with ~14 sec group setup
|
||||
- "MLS-Lite for constrained" — YES, ~2-4 sec messages with auth
|
||||
- "Post-quantum on LoRa" — NO, hybrid mode is impractical (2.6KB KeyPackage)
|
||||
- "Production-ready" — NO, still research-stage, pending hardware tests
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user