ant-quic 0.13.1

QUIC transport protocol with advanced NAT traversal for P2P networks
Documentation

ant-quic

QUIC transport with NAT traversal for P2P networks. Every node is symmetric - can connect AND accept connections.

Documentation Crates.io License: MIT License: Apache 2.0

CI Status Build Status Security Audit

Key Features

  • 100% Post-Quantum Cryptography - ML-KEM-768 + ML-DSA-65 on every connection
  • Symmetric P2P Nodes - Every node is identical: connect, accept, coordinate
  • Automatic NAT Traversal - Per draft-seemann-quic-nat-traversal-02
  • External Address Discovery - Per draft-ietf-quic-address-discovery-00
  • Raw Public Key Identity - Ed25519 identity per RFC 7250
  • Zero Configuration Required - Sensible defaults, just create and connect

Quick Start

use ant_quic::{P2pEndpoint, P2pConfig};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Create a P2P endpoint - PQC is always on
    let config = P2pConfig::builder()
        .known_peer("peer.example.com:9000".parse()?)
        .build()?;

    let endpoint = P2pEndpoint::new(config).await?;
    println!("Peer ID: {:?}", endpoint.peer_id());

    // Connect to known peers for address discovery
    endpoint.connect_bootstrap().await?;

    // Your external address is now known
    if let Some(addr) = endpoint.external_address() {
        println!("External address: {}", addr);
    }

    Ok(())
}

Architecture

ant-quic uses a symmetric P2P model where every node has identical capabilities:

┌─────────────┐         ┌─────────────┐
│   Node A    │◄───────►│   Node B    │
│  (peer)     │   QUIC  │  (peer)     │
│             │   PQC   │             │
└─────────────┘         └─────────────┘
       │                       │
       │    OBSERVED_ADDRESS   │
       │◄──────────────────────┤
       │                       │
       ├──────────────────────►│
       │    ADD_ADDRESS        │
       └───────────────────────┘

No Roles - All Nodes Are Equal

In v0.13.0, we removed all role distinctions:

  • No EndpointRole::Client/Server/Bootstrap
  • No NatTraversalRole enum
  • Any peer can coordinate NAT traversal for other peers
  • Any peer can report your external address via OBSERVED_ADDRESS frames

The term "known_peers" replaces "bootstrap_nodes" - they're just addresses to connect to first. Any connected peer can help with address discovery.

Three-Layer Design

  1. Protocol Layer: QUIC + NAT traversal extension frames
  2. Integration APIs: P2pEndpoint, P2pConfig
  3. Applications: Binary, examples

Post-Quantum Cryptography (Always On)

Every connection uses post-quantum cryptography - there is no classical-only mode.

Algorithms

Algorithm Standard Purpose Security Level
ML-KEM-768 FIPS 203 Key Exchange NIST Level 3 (192-bit)
ML-DSA-65 FIPS 204 Digital Signatures NIST Level 3 (192-bit)

Configuration

PQC is always enabled. The PqcConfig only tunes performance parameters:

use ant_quic::crypto::pqc::PqcConfig;

let pqc = PqcConfig::builder()
    .ml_kem(true)               // Key exchange (required)
    .ml_dsa(true)               // Signatures (optional, default: true)
    .memory_pool_size(10)       // Memory pool for crypto ops
    .handshake_timeout_multiplier(2.0)  // PQC handshakes are larger
    .build()?;

Why 100% PQC?

  • Harvest Now, Decrypt Later - Protect against future quantum computers
  • NIST Standardized - ML-KEM and ML-DSA are FIPS 203/204 standards
  • No Configuration Errors - Can't accidentally use weak crypto
  • Future-Proof - All historical connections are quantum-resistant

See docs/guides/pqc-security.md for security analysis.

NAT Traversal

NAT traversal is built into the QUIC protocol via extension frames, not STUN/TURN.

How It Works

  1. Connect to any known peer
  2. Peer observes your external address from incoming packets
  3. Peer sends OBSERVED_ADDRESS frame back to you
  4. You learn your public address and can coordinate hole punching
  5. Direct P2P connection established through NAT

Extension Frames

Frame Type ID Purpose
ADD_ADDRESS 0x3d7e90 (IPv4), 0x3d7e91 (IPv6) Advertise candidate addresses
PUNCH_ME_NOW 0x3d7e92 (IPv4), 0x3d7e93 (IPv6) Coordinate hole punching timing
REMOVE_ADDRESS 0x3d7e94 Remove stale address
OBSERVED_ADDRESS 0x9f81a6 (IPv4), 0x9f81a7 (IPv6) Report external address to peer

Transport Parameters

Parameter ID Purpose
NAT Traversal Capability 0x3d7e9f0bca12fea6 Negotiates NAT traversal support
RFC-Compliant Frames 0x3d7e9f0bca12fea8 Enables RFC frame format
Address Discovery 0x9f81a176 Configures address observation

NAT Type Support

NAT Type Success Rate Notes
Full Cone >95% Direct connection
Restricted Cone 80-90% Coordinated punch
Port Restricted 70-85% Port-specific coordination
Symmetric 60-80% Prediction algorithms
CGNAT 50-70% Relay fallback may be needed

See docs/NAT_TRAVERSAL_GUIDE.md for detailed information.

Raw Public Key Identity

Each node has an Ed25519 identity key. The PeerId is derived from the public key:

// PeerId = SHA-256(SubjectPublicKeyInfo)
let (public_key, secret_key) = generate_ed25519_keypair();
let peer_id = derive_peer_id_from_public_key(&public_key);

This follows RFC 7250 for raw public keys in TLS/QUIC.

Trust Model

  • TOFU (Trust On First Use): First contact stores SPKI fingerprint
  • Rotation: New keys must be signed by old key (continuity)
  • Channel Binding: TLS exporter signed with ML-DSA/Ed25519
  • NAT/Path Changes: Token binding uses (PeerId || CID || nonce)

Installation

From Crates.io

cargo add ant-quic

Pre-built Binaries

Download from GitHub Releases:

  • Linux: ant-quic-linux-x86_64, ant-quic-linux-aarch64
  • Windows: ant-quic-windows-x86_64.exe
  • macOS: ant-quic-macos-x86_64, ant-quic-macos-aarch64

From Source

git clone https://github.com/dirvine/ant-quic
cd ant-quic
cargo build --release

Binary Usage

# Run as P2P node (connects and accepts)
ant-quic --listen 0.0.0.0:9000

# Connect to known peers for discovery
ant-quic --listen 0.0.0.0:9000 --known-peers peer1.example.com:9000,peer2.example.com:9000

# Show your external address (discovered via peers)
ant-quic --listen 0.0.0.0:9000 --known-peers 159.89.81.21:9000
# Output: External address: YOUR.PUBLIC.IP:PORT

# Run with monitoring dashboard
ant-quic --dashboard --listen 0.0.0.0:9000

# Interactive commands while running:
# /status - Show connections and discovered addresses
# /peers  - List connected peers
# /help   - Show all commands

API Reference

Primary Types

Type Purpose
P2pEndpoint Main entry point for P2P networking
P2pConfig Configuration builder
P2pEvent Events from the endpoint
PeerId 32-byte peer identifier
PqcConfig Post-quantum crypto tuning
NatConfig NAT traversal tuning

P2pEndpoint Methods

impl P2pEndpoint {
    // Creation
    async fn new(config: P2pConfig) -> Result<Self>;

    // Identity
    fn peer_id(&self) -> PeerId;
    fn local_addr(&self) -> Option<SocketAddr>;
    fn external_address(&self) -> Option<SocketAddr>;

    // Connections
    async fn connect_bootstrap(&self) -> Result<()>;
    async fn connect_to_peer(&self, peer: PeerId) -> Result<Connection>;
    fn connected_peers(&self) -> Vec<PeerId>;

    // Events
    fn subscribe(&self) -> broadcast::Receiver<P2pEvent>;

    // Statistics
    fn stats(&self) -> EndpointStats;
    fn nat_stats(&self) -> NatTraversalStatistics;
}

P2pConfig Builder

let config = P2pConfig::builder()
    .bind_addr("0.0.0.0:9000".parse()?)  // Local address
    .known_peer(addr1)                    // Add known peer
    .known_peers(vec![addr2, addr3])      // Add multiple
    .max_connections(100)                 // Connection limit
    .pqc(pqc_config)                      // PQC tuning
    .nat(nat_config)                      // NAT tuning
    .mtu(MtuConfig::pqc_optimized())      // MTU for PQC
    .build()?;

See docs/API_GUIDE.md for the complete API reference.

RFC Compliance

ant-quic implements these specifications:

Specification Status Notes
RFC 9000 Full QUIC Transport Protocol
RFC 9001 Full QUIC TLS
RFC 7250 Full Raw Public Keys
draft-seemann-quic-nat-traversal-02 Full NAT Traversal
draft-ietf-quic-address-discovery-00 Full Address Discovery
FIPS 203 Full ML-KEM
FIPS 204 Full ML-DSA

See docs/review.md for detailed RFC compliance analysis.

Performance

Connection Establishment

Metric Value
Handshake (PQC) ~50ms typical
Address Discovery <100ms
NAT Traversal 200-500ms
PQC Overhead ~8.7%

Data Transfer (localhost)

Metric Value
Send Throughput 267 Mbps
Protocol Efficiency 96.5%
Protocol Overhead 3.5%

Scalability

Connections Memory CPU
100 56 KB Minimal
1,000 547 KB Minimal
5,000 2.7 MB Linear

System Requirements

  • Rust: 1.85.0+ (Edition 2024)
  • OS: Linux 3.10+, Windows 10+, macOS 10.15+
  • Memory: 64MB minimum, 256MB recommended
  • Network: UDP traffic on chosen port

Documentation

Examples

# Simple chat application
cargo run --example simple_chat -- --listen 0.0.0.0:9000

# Chat with peer discovery
cargo run --example chat_demo -- --known-peers peer.example.com:9000

# Statistics dashboard
cargo run --example dashboard_demo

Testing

# Run all tests
cargo test

# Run with verbose output
cargo test -- --nocapture

# Specific test categories
cargo test nat_traversal
cargo test pqc
cargo test address_discovery

# Run benchmarks
cargo bench

Contributing

Contributions welcome! Please see CONTRIBUTING.md.

# Development setup
git clone https://github.com/dirvine/ant-quic
cd ant-quic
cargo fmt --all
cargo clippy --all-targets -- -D warnings
cargo test

License

Licensed under either of:

at your option.

Acknowledgments

Security

For security vulnerabilities, please email security@autonomi.com rather than filing a public issue.