ryke 0.3.0

A clean-room IKEv2 / IKE implementation in Rust — independent client (initiator) and server (responder).
Documentation
# ryke

A **clean-room IKEv2 / IKE implementation in Rust** — independent **client
(initiator)** and **server (responder)**.

`ryke` = **R**ust + **IKE**. Built from the RFCs; it does not wrap OpenSSL or any
existing IKE/IPsec daemon, and copies no third-party code.

## Status

Early and moving. The message framing and the `IKE_SA_INIT` cryptographic core
are in place and verified against published test vectors.

## What works today

- **Message framing** — IKE header + generic payload chain (RFC 7296 §3.1–3.2).
- **Payloads** — Security Association (proposals/transforms), Key Exchange, Nonce.
- **Crypto core** for `IKE_SA_INIT`:
  - X25519 Diffie-Hellman — verified against **RFC 7748**.
  - HMAC-SHA256 PRF — verified against **RFC 4231**.
  - `prf+` and the SKEYSEED / SK_* key schedule — RFC 7296 §2.13–2.14.

See [`docs/implementation-plan.md`](docs/implementation-plan.md) for the roadmap.

## Design

- **Control plane in Rust** (framing, exchanges, crypto, auth); the **ESP data
  plane is a userspace ESP implementation in Rust** (AES-GCM) — `ryke`
  encrypts/decrypts tunneled packets itself and uses **no external software**
  (not the OS kernel's IPsec stack, not any external VPN daemon). It moves packets you
  hand it (`Tunnel` / `EspSa` / `ChildSa`); capturing real OS traffic (a TUN
  device, a SOCKS proxy, …) is the consumer's job and out of scope.
- Both roles are first-class ([`Role::Initiator`] / [`Role::Responder`]). The
  server role targets native iOS/Android IKEv2 clients (no app on the phone).

## Build

```bash
cargo build
cargo test        # includes the RFC 7748 / RFC 4231 known-answer tests
```

## License

MIT — see [LICENSE.md](LICENSE.md). © Vladimir Chebotarev