# Protocol Stack

quicproquo layers three protocol stages to move a plaintext message from
sender to recipient with end-to-end encryption, typed RPC framing, and
authenticated transport. This page describes each layer and provides a
comparison table.

---

## Transport: QUIC + TLS 1.3

The transport layer is QUIC over UDP with TLS 1.3 negotiated by `quinn` and
`rustls`. Cap'n Proto RPC rides on a bidirectional QUIC stream.

```text
┌─────────────────────────────────────────────┐
│   Application / MLS ciphertext              │  <- group key ratchet (RFC 9420)
├─────────────────────────────────────────────┤
│   Cap'n Proto RPC                           │  <- typed, schema-versioned framing
├─────────────────────────────────────────────┤
│   QUIC + TLS 1.3  (quinn / rustls)          │  <- mutual auth + transport secrecy
└─────────────────────────────────────────────┘
```

### What each layer provides

**QUIC + TLS 1.3** (`quinn`, `rustls`)

- Encrypted, authenticated transport with 0-RTT connection establishment
  (where resumed).
- TLS 1.3 provides perfect forward secrecy per connection via ephemeral ECDHE.
- The server presents a self-signed certificate by default; the client pins
  the server certificate via `--ca-cert`.
- ALPN protocol identifier: `capnp`.
- Multiplexed streams over a single UDP socket -- one bidirectional stream
  per RPC session.

**Cap'n Proto RPC** (`capnp`, `capnp-rpc`)

- Zero-copy, schema-versioned serialisation.
- Asynchronous RPC with promise pipelining (multiple in-flight calls).
- The `NodeService` interface (defined in `schemas/node.capnp`) multiplexes
  Authentication and Delivery operations on a single connection.
- The two-party VatNetwork runs over `tokio::io::compat` adapters wrapping
  QUIC send/recv streams.

**MLS (RFC 9420)** (`openmls`, `openmls_rust_crypto`)

- Group key agreement with ratchet-tree-based key schedule.
- Forward secrecy: past messages remain confidential if a member's key is
  compromised.
- Post-compromise security (PCS): the group heals after a compromise once an
  honest update occurs.
- Identity binding: each member's Ed25519 public key is embedded in the MLS
  `BasicCredential`.
- Ciphersuite: `MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519`.


---

## Comparison Table

| Layer       | Provides                                                         | Crate(s)                                |
|-------------|------------------------------------------------------------------|-----------------------------------------|
| **Transport: QUIC + TLS 1.3** | Confidentiality, server authentication, forward secrecy, multiplexed streams, congestion control | `quinn`, `rustls`        |
| **Framing: Cap'n Proto**      | Zero-copy typed serialisation, schema versioning, async RPC with promise pipelining | `capnp`, `capnp-rpc`    |
| **Encryption: MLS**           | Group key agreement, forward secrecy, post-compromise security, identity binding | `openmls`, `openmls_rust_crypto` |
| **Encryption: Hybrid KEM** (optional) | Post-quantum confidentiality for individual payloads (X25519 + ML-KEM-768) | `ml-kem`, `x25519-dalek`, `chacha20poly1305`, `hkdf` |

---

## Data Path Summary

A plaintext message traverses the stack as follows:

```text
Sender                                                            Recipient
──────                                                            ─────────

plaintext bytes
    │
    ▼
MLS create_message()
    │  ── encrypts with group AEAD key (AES-128-GCM) ──
    ▼
TLS-encoded MlsMessageOut (opaque ciphertext blob)
    │
    ▼
Cap'n Proto: enqueue(recipientKey, payload)
    │  ── serialised into NodeService RPC call ──
    ▼
QUIC stream (TLS 1.3 encrypted)
    │
    ▼
    ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ network ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
    │
    ▼
Server: NodeService.enqueue() stores payload in FIFO queue
    │
    ▼
Cap'n Proto: fetch() / fetchWait() returns payload
    │
    ▼
MLS process_message()
    │  ── decrypts with group AEAD key ──
    ▼
plaintext bytes
```

The server **never** holds the MLS group key. It sees only the encrypted
`MlsMessageOut` blob.

---

## Further Reading

- [Architecture Overview](overview.md) -- high-level system diagram and identity key model
- [QUIC + TLS 1.3](../protocol-layers/quic-tls.md) -- QUIC configuration, ALPN, and certificate handling
- [Cap'n Proto Serialisation and RPC](../protocol-layers/capn-proto.md) -- schema design and VatNetwork wiring
- [MLS (RFC 9420)](../protocol-layers/mls.md) -- ciphersuite selection, key schedule, and ratchet tree
- [Hybrid KEM: X25519 + ML-KEM-768](../protocol-layers/hybrid-kem.md) -- post-quantum envelope encryption
