ryke

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


Keywords
crypto, ikev2, ipsec, networking, vpn
License
MIT

Documentation

ryke

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

ryke = Rust + 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 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

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

License

MIT — see LICENSE.md. © Vladimir Chebotarev