snaart/phantom_protocol

GitHub: snaart/phantom_protocol

一个后量子安全传输 SDK,为应用提供经过身份验证的加密字节流管道,适用于构建 VPN、消息传递等安全网络产品的基础设施。

Stars: 1 | Forks: 0

# Phantom Protocol [![crates.io](https://img.shields.io/crates/v/phantom-protocol.svg)](https://crates.io/crates/phantom-protocol) [![docs.rs](https://img.shields.io/docsrs/phantom-protocol)](https://docs.rs/phantom-protocol) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/641706c6e8000144.svg)](https://github.com/snaart/phantom_protocol/actions/workflows/ci.yml) [![license](https://img.shields.io/crates/l/phantom-protocol.svg)](LICENSE) ![MSRV](https://img.shields.io/badge/MSRV-1.75-blue) Rust 中的后量子安全 L4/L6 通用传输框架。 Phantom Protocol 是一个 **SDK** —— 一个用于构建安全网络产品(VPN、消息传递等)的基础组件,而不是一个终端用户应用程序。它为应用程序提供了一个经过身份验证的、机密的、后量子安全的字节管道,将混合的经典加 PQ 握手(X25519 + ML-KEM-768 KEM,Ed25519 + ML-DSA-65 签名 —— FIPS 203 / FIPS 204,纯 Rust 实现)与传输层(TCP / WebSocket 会话和原生可靠 UDP 传输 (PhantomUDP))配对,此外还有 WASI / 嵌入式字节流成帧。通过 UniFFI 提供跨语言绑定(Python、Swift、Kotlin、C);原生 WASM 目标;用于 no_std 的裸机 `EmbeddedLeg`。(计划提供一种 DPI 模仿传输模式,但目前尚未构建。) ## 安装 已在 crates.io 上发布为 [`phantom-protocol`](https://crates.io/crates/phantom-protocol) (导入路径为 `phantom_protocol`): ``` [dependencies] phantom-protocol = "0.1" ``` 或者 `cargo add phantom-protocol`。API 文档:。 ## 核心亮点 - **混合后量子握手** —— X25519 + ML-KEM-768 KEM,Ed25519 + ML-DSA-65 签名。两部分都必须验证。纯 Rust RustCrypto 原语 —— 加密路径中没有 C 绑定,因此整个握手可以在原生、移动设备和 `wasm32` 上编译。(裸机 `thumbv7em` 将 `std` 限制为仅成帧传输 —— 参见[状态与限制](#status--limitations)。) - **0-RTT 恢复** —— AEAD 封装的早期数据(≤ 16 KiB)被折叠到单个 `ClientHello` 中,通过消耗 `SessionCache` 票据进行一次性防重放,并在票据未知/过期或 blob 无法打开时尽最大努力回退到 1-RTT 握手。 - **会话中重新加密 (rekey)** —— HKDF 棘轮,`REKEY` 标志 + 每个数据包的 `epoch`。 - **传输** —— `PhantomSession` 如今可通过 **TCP** 和 **WebSocket** 运行经过身份验证的会话(此外还有 WASI 和 Embedded 作为成帧链路)。原生可靠 UDP 传输 (**PhantomUDP**) 正在开发中,以增加多路径、拥塞控制和连接迁移,且无需额外的加密层(参见[状态与限制](#status--limitations))。先前实验性的 KCP / FakeTLS 链路以及未使用的 `TransportLeg` 多路径 trait 已被移除,等待该工作完成;FakeTLS 风格的 HTTP 流量模仿将作为一个专用模式重新引入。 - **多流** —— 严格优先级调度器,每个流的 `WINDOW_UPDATE` 流控制,受 BBRv2 启发的步调(启动 / 排空 / ProbeBW / ProbeRTT / FastRecovery)。 - **抗 DoS 握手** —— 无状态 HMAC-SHA-256 cookie(每小时轮换主密钥)+ 自适应 blake3 工作量证明(负载分级难度 0–16)。 - **每流防重放保护** —— RFC 4303 §3.4.3 滑动窗口位图,默认 1024 位,在 AEAD 验证 _之后_ 检查。 - **可观测性** —— OpenTelemetry 指标 + 跟踪(可选的 `telemetry-otel` 功能)。无锁热路径原子操作(≤ 2.5 ns / 次调用),OTLP/gRPC 推送到任何后端(Datadog、Honeycomb、Grafana Cloud、通过 OTel Collector 自托管)。`docs/observability/` 中提供了预构建的 Grafana 仪表板 + Prometheus 告警规则。 - **SLSA-3 构建出处** —— 每个发布工件上都有 OIDC 证明。 - **跨平台** —— 每个 CI 目标都是硬性关卡(Linux x4、macOS x2、iOS x2、Windows x2、wasm32-unknown-unknown、wasm32-wasip2、thumbv7em-none-eabihf);**没有 `allow_failure` 项**。 ## 快速开始 ### 构建 / 测试 / lint ``` cargo build --manifest-path core/Cargo.toml cargo test --manifest-path core/Cargo.toml --lib cargo clippy --manifest-path core/Cargo.toml --lib -- -D warnings cargo fmt --manifest-path core/Cargo.toml --check ``` Loopback 集成测试受 `#[ignore]` 控制: ``` cargo test --manifest-path core/Cargo.toml --test tcp_integration -- --ignored ``` 更多命令(基准测试、模糊测试、miri、跨目标、嵌入式)在 [CONTRIBUTING.md](CONTRIBUTING.md) 中。 ### 最小化客户端 / 服务端 必须固定服务端身份 —— `connect_with_transport` 需要一个 `HybridVerifyingKey`;没有跳过路径(安全不变量 1)。 ``` use phantom_protocol::api::{PhantomListener, PhantomSession, TcpSessionTransport}; use phantom_protocol::crypto::hybrid_sign::HybridVerifyingKey; use tokio::net::TcpStream; // ── Server ──────────────────────────────────────────────────────────────── let listener = PhantomListener::bind("127.0.0.1:0".to_string()).await?; let server_addr = listener.local_addr(); let pinned_key = listener.verifying_key_bytes(); // share out-of-band tokio::spawn(async move { let outcome = listener.accept().await?; let session = outcome.session(); let req = session.recv().await?; session.send(b"hello, post-quantum world".to_vec()).await?; Ok::<_, phantom_protocol::CoreError>(()) }); // ── Client (one-shot helper used by mobile / FFI consumers) ─────────────── let session = phantom_protocol::api::session::connect_pinned( "127.0.0.1".into(), 4242, pinned_key, ).await?; session.send(b"ping".to_vec()).await?; let reply = session.recv().await?; // ── Or, explicit transport (TCP / WebSocket today; WASI / Embedded framing) ─ let stream = TcpStream::connect(&server_addr).await?; let transport = TcpSessionTransport::new(stream); let key = HybridVerifyingKey::from_bytes(&pinned_key)?; let session = PhantomSession::connect_with_transport(&server_addr, transport, key); ``` 可运行的形式:[`core/examples/loopback_demo.rs`](core/examples/loopback_demo.rs)、 [`core/examples/embedded_demo.rs`](core/examples/embedded_demo.rs)、 [`core/examples/crypto_bench.rs`](core/examples/crypto_bench.rs)。 ## 密码学 | 角色 | 原语 | 标准 / 来源 | | --- | --- | --- | | KEM | X25519 + ML-KEM-768 | RFC 7748 + FIPS 203 (RustCrypto `ml-kem`) | | 签名 | Ed25519 + ML-DSA-65 | FIPS 186-5 + FIPS 204 (RustCrypto `ml-dsa`) | | AEAD(主要) | AES-256-GCM | `ring`,硬件加速 (AES-NI / ARMv8 PMULL) | | AEAD(备用) | ChaCha20-Poly1305 | RFC 8439,在没有 AES 内在函数 (intrinsics) 时自动选择 | | KDF | HKDF-SHA-256 | RFC 5869 | | Hash / MAC | SHA-256, HMAC-SHA-256, blake3 (keyed) | FIPS 180-4 / FIPS 198-1 + non-FIPS | 阶段 5.1 将 PQ 原语从绑定 C 的 `pqcrypto-*` crate 迁移到了 RustCrypto 的 FIPS-203 / FIPS-204 实现。该 crate 可以在没有 C 绑定的情况下在 `wasm32-unknown-unknown` 和 `thumbv7em-none-eabihf` 上编译。 ## 架构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ Public API (core/src/api/) │ │ PhantomSession · PhantomListener · TcpSessionTransport │ ├─────────────────────────────────────────────────────────────────┤ │ Transport (core/src/transport/) │ │ Handshake{Client,Server} · Session · scheduler · pacer · paths │ │ api/{tcp,udp}_transport · legs/{websocket, wasi, embedded} │ ├─────────────────────────────────────────────────────────────────┤ │ Crypto (core/src/crypto/) │ │ hybrid_kem · hybrid_sign · adaptive_crypto · kdf · pow · rng │ ├─────────────────────────────────────────────────────────────────┤ │ Security (core/src/security/) │ │ ReplayWindow · ReplayProtection │ ├─────────────────────────────────────────────────────────────────┤ │ Runtime (core/src/runtime/) │ │ TokioRuntime (native) · WasmRuntime · (EmbeddedRuntime TODO) │ └─────────────────────────────────────────────────────────────────┘ ``` 正式的架构规范是 [`docs/architecture/ARCHITECTURE.md`](docs/architecture/ARCHITECTURE.md); 统一的网络协议(包括 0-RTT)是 [`docs/protocol/PROTOCOL.md`](docs/protocol/PROTOCOL.md)。各子系统的 安全不变量记录在 [`docs/security/threat-model.md`](docs/security/threat-model.md) 中。 ## 传输特性 - **单一统一的网络协议。** 一个 `PacketHeader`(45 字节,带有固定的 `version` 字节 = `WIRE_VERSION`)封装在原始的 `PhantomPacket`(`header` + `payload` + TLV 预留空间 `extensions`)中 —— 没有 `VersionedPacket` 枚举,没有按会话进行的网络协议版本协商。`epoch`、`REKEY`、`PATH_VALIDATION`、`COALESCED`、`WINDOW_UPDATE` 标志都存在于同一个 header 中;接收路径直接反序列化 `PhantomPacket` 并丢弃任何 `header.version` 不一致的数据帧。握手消息是原始的 borsh 结构体(没有封装):一个 `ClientHello`(其中折叠了可选的 0-RTT `early_data` blob),一个 `ServerHello`,一个 `HelloRetryRequest`,一个以 `protocol_variant` 开头并带有签名的 `HandshakeTranscript`。固定的 `PROTOCOL_VERSION` / `WIRE_VERSION` 字节是防篡改校验锚点,也是未来刻意进行版本升级的钩子。 - **路径验证原语(内部)。** `PathRegistry` + 常数时间挑战/响应;路径 0 已预先验证,辅助路径的状态转换为 `Unvalidated → Validating → Validated`。这是未来连接迁移的基础构建块;它尚未接入实际的多路径数据平面。 ## 性能 在 **Apple M1 Pro (8P + 2E, 16 GiB), macOS 26.0, rustc 1.93.0,带 ARMv8 AES-PMULL 的 `ring`**(快照日期 2026-05-17,criterion `--quick`,默认 `target-cpu`)上的参考数据: | 路径 | 数值 | 备注 | | --- | --- | --- | | 混合 PQ 握手 (固定) | **1.06 ms** / ~945 conn/s/core | 完整的生产路径;在 8 个 P 核心上聚合约为 7,500 次/秒的冷握手 | | AEAD 加密, 64 KiB | **4.67 GiB/s/core** (13.1 µs) | 带有 header-AAD + 重放窗口的 `encrypt_packet` | | AEAD 解密, 16 KiB | **4.68 GiB/s/core** | 相同路径 | | 1 MiB 往返 | **391.5 µs** → **5.0 GiB/s** | 加密 + 解密 | | 裸 AES-256-GCM (`ring`) | 在 64 KiB 时 **5,514 MiB/s** | 裸加密,无成帧 | | ChaCha20-Poly1305 (软件) | 在 1 MiB 时 1,555 MiB/s | 在此部分上比 AES 慢约 3.5 倍 | | ClientHello 解析 + cookie + 声誉 | **4.60 µs** / ~217K/s/core | DoS 网关热路径 | | `kem_encapsulate` | 80.7 µs | 混合 X25519 + ML-KEM-768 | | `hybrid_sign` / `hybrid_verify` | 310.0 µs / 131.6 µs | Ed25519 + ML-DSA-65 | `RUSTFLAGS="-C target-cpu=native"` 通常会增加 +5–10%;通过 `cargo-pgo` 进行 PGO 在稳定的工作负载上还能增加 +5–10%。发布配置(`opt-level=3`、`lto="fat"`、`codegen-units=1`、`panic="abort"`)在工作空间根目录中设置。带有 AES-NI 的 Linux x86_64 也处于类似的水平。完整的方法论和生产环境调优(`bbr`、`fq`、`LimitNOFILE`、分配器交换、CPU 绑定)在 [`BENCHMARKS.md`](BENCHMARKS.md) 和 [`docs/operations/perf-tuning.md`](docs/operations/perf-tuning.md) 中。 ## 部署 ### `phantom-server`(参考二进制文件) 生产级嵌入器。自动加载或创建持久化的 `HybridSigningKey`,将 OTLP 遥测数据推送到 OTel Collector / SaaS 后端,通过 10s 排空处理 SIGTERM / SIGINT。 | 标志 | 环境变量 | 默认值 | | --- | --- | --- | | `--bind` | `PHANTOM_BIND` | `0.0.0.0:4242` | | `--otlp-endpoint` | `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4317` | | `--otel-service-name` | `OTEL_SERVICE_NAME` | `phantom-server` | | `--otel-trace-sample-ratio` | `OTEL_TRACES_SAMPLER_ARG` | `0.01` | | `--signing-key-file` | `PHANTOM_SIGNING_KEY_FILE` | `/etc/phantom-server/signing.key` (0600,自动创建) | | `--log-json` | `PHANTOM_LOG_JSON` | `false` | | `--log-filter` | `RUST_LOG` | `info,phantom_protocol=debug` | ``` cargo run --manifest-path server/Cargo.toml -- \ --bind 0.0.0.0:4242 \ --otlp-endpoint http://otel-collector:4317 ``` ### Docker / docker-compose 多阶段 `Dockerfile`(`rust:1-slim-bookworm` → `debian:bookworm-slim`),非 root 用户 `phantom` UID 65532,EXPOSE 4242 + 9090,签名密钥卷位于 `/etc/phantom-server`。`docker-compose.yml` 已准备好运行,带有命名卷和 TCP 健康检查。 ### Kubernetes / Helm 具有生产环境形态的 chart 位于 [`docs/operations/helm/phantom-protocol/`](docs/operations/helm/phantom-protocol/)。 `appVersion: 0.1.1`,`4242` 端口上的 ClusterIP 服务,3 个副本,`tcpSocket` 存活 / 就绪探针。原始清单和操作指南在 [`docs/operations/kubernetes.md`](docs/operations/kubernetes.md) 中。 ### systemd 强化单元文本位于 [`docs/operations/systemd.md`](docs/operations/systemd.md) (`NoNewPrivileges`、`ProtectSystem=strict`、`MemoryDenyWriteExecute`、 `SystemCallFilter`,30s `TimeoutStopSec`)以及使用 `SO_REUSEPORT` 的多实例模板。 ### 可观测性 通过 OTLP/gRPC 导出的 OpenTelemetry 指标 + 跟踪(阶段 8 —— 替换了阶段 4.5 中手工编写的 Prometheus 端点)。参考服务器推送到 `OTEL_EXPORTER_OTLP_ENDPOINT`;支持的后端包括 OTel Collector(→ Prometheus / Tempo / Loki)、Datadog、Honeycomb、Grafana Cloud、AWS CloudWatch —— 任何兼容 OTLP 的后端。预构建的 Grafana 仪表板位于 [`docs/observability/grafana/phantom-otel-dashboard.json`](docs/observability/grafana/phantom-otel-dashboard.json) ,Prometheus 告警规则位于 [`docs/observability/prometheus/alerts.yml`](docs/observability/prometheus/alerts.yml)。 端到端 docker-compose 演示位于 [`examples/observability-demo/`](examples/observability-demo/)。完整的设置指南在 [`docs/observability/otlp-setup.md`](docs/observability/otlp-setup.md) 中。 ### CLI `phantom-cli`(同级 crate,edition 2024): ``` cargo run --manifest-path cli/Cargo.toml -- keygen --out ./server.key cargo run --manifest-path cli/Cargo.toml -- pubkey --in ./server.key cargo run --manifest-path cli/Cargo.toml -- ping --host 127.0.0.1 --port 4242 \ --pinned-key-hex --msg hello cargo run --manifest-path cli/Cargo.toml -- version ``` ## 平台与语言绑定 ### 交叉编译矩阵 (`.github/workflows/cross.yml`) | 目标 | 状态 | | --- | --- | | `x86_64-unknown-linux-gnu` / `aarch64-unknown-linux-gnu` / `aarch64-unknown-linux-musl` | 硬性关卡 | | `x86_64-apple-darwin` / `aarch64-apple-darwin` | 硬性关卡 | | `aarch64-apple-ios` (设备) / `aarch64-apple-ios-sim` | 硬性关卡 | | `x86_64-pc-windows-msvc` / `aarch64-pc-windows-msvc` | 硬性关卡 | | `wasm32-unknown-unknown` | 硬性关卡 (阶段 3.3 / 3.5) | | `thumbv7em-none-eabihf` | 硬性关卡 (阶段 3.6;`--no-default-features --features embedded,no-std`) | | `wasm32-wasip2` | 硬性关卡 (编译 + 主机往返;WASI 仅限客户端成帧 —— 参见 [`docs/operations/wasi.md`](docs/operations/wasi.md)) | ### 语言绑定 (`tests/bindings/`) | 绑定 | 成熟度 | 备注 | | --- | --- | --- | | **Swift** | 生产形态 | 通过 UniFFI 0.29 自动生成;iOS XCFramework 配方在 [`docs/operations/mobile.md`](docs/operations/mobile.md) 中 | | **Kotlin** | 生产形态 | 自动生成;Android NDK + Gradle `jniLibs` 配方在 `mobile.md` 中 | | **Python** | UniFFI 接口自动生成 | 演示测试工具 `tests/run_test.py` 已过期,且引用了以前的 API | | **C** | 实验性 | **手工整理的**头文件 —— UniFFI 0.29 没有 C 生成器。涵盖了 `connect_pinned`,但未涵盖 `HybridSigningKey` 或 `PhantomConfig`。README 建议改用 Swift / Kotlin / Python | | **WASM (浏览器)** | 附带演示 | [`examples/wasm-demo/`](examples/wasm-demo/) 与 [`docs/operations/wasm.md`](docs/operations/wasm.md) 配对;使用 `WebSocketLeg` + `WasmRuntime` | 重新生成:`tests/bindings/{generate_swift,generate_kotlin,generate_c}.sh`。 ### 嵌入式(`embedded` 功能,默认关闭) 在裸机 `thumbv7em-none-eabihf` 上,Phantom Protocol **仅**提供成帧传输 —— `EmbeddedLeg` 及其长度前缀编解码器。PQ 握手、`PhantomSession`、加密原语和 `TokioRuntime` 是 `std` 受限的,因此在那里**不会**被构建;裸机嵌入器需要自带加密/握手驱动程序,并通过该链路运行它。PQ-on-bare-metal 已被排除在 1.0 范围之外(参见[状态与限制](#status--limitations))。 `EmbeddedLeg` 包装了任何 `embedded-io-async = 0.6` 字节流(UART、USB-CDC 等),带有 4 字节的大端序 (BE) 长度前缀成帧 —— 网络数据格式与 `TcpSessionTransport` 相同。纯 Rust,no_std + alloc,与目标架构无关(在主机 x86_64 上构建单元测试,_也_可以在裸机 `thumbv7em-none-eabihf` 上构建)。通过 `impl_embedded_session_transport!` 宏为每个 `(R, W)` 实现 `SessionTransport`。当 `getrandom` 不可用时,`RngProvider` trait 可用于注入硬件 RNG。[`core/examples/embedded_demo.rs`](core/examples/embedded_demo.rs) **在主机上** (std) 通过模拟字节流运行完整会话,演示了该链路 —— 而不是裸机握手。 ## 安全性 完整的威胁模型、缓解措施和披露策略位于 [`SECURITY.md`](SECURITY.md) 和 [`docs/security/threat-model.md`](docs/security/threat-model.md) 中。要点: - **强制固定服务端身份** —— `connect_with_transport` 需要一个 `HybridVerifyingKey`;没有跳过路径。 - **前向保密** —— 每次握手的临时混合 KEM + 基于 HKDF 的会话中期密钥更新(epoch 在 `u8::MAX` 处饱和,永不溢出)。 - **防重放拒绝发生在 AEAD 验证 _之后_** —— RFC 4303 §3.4.3 滑动窗口位图,按流划分。 - **抗降级** —— 固定的协议版本和 `protocol_variant` 都在握手记录中进行了签名;剥离了 `ENCRYPTED` 的握手后数据包将被丢弃。 - **0-RTT 防重放** —— `SessionCache::try_resume` 在首次查找时即消耗恢复票据;超大 / 过期 / AEAD 验证失败的早期数据会尽最大努力处理,绝不会对握手造成致命影响。 - **AEAD nonce 耗尽保护** —— 当达到 `AEAD_MAX_INVOCATIONS = 2^48` 时抛出 `CryptoError::NonceExhausted`。 - **在所有包含密钥的结构上使用 `ZeroizeOnDrop`**;在整个 crate 范围内 `#![deny(unsafe_code)]`,只有一个经过审计的可选启用项(用于 libc GSO / `recvmmsg` 的 `transport/udp_transport.rs`)。 - 取消安全审计:在所有 `tokio::select!` 站点未发现 bug。 - 6 个已记录的带有 `PANIC-SAFETY:` 不变量的生产 panic 站点 —— 参见 [`docs/security/panic-sites.md`](docs/security/panic-sites.md)。 ### FIPS 140-3 / 通用标准 —— 仅作为探索,未经验证 - **FIPS 140-3:** 密码学使用了多种 FIPS 批准的原语(ML-KEM-768、ML-DSA-65、Ed25519、SHA-256、HMAC/HKDF-SHA-256),可选的 `fips` Cargo 功能会将剩余的非批准原语替换为 `aws-lc-rs` 基质。这 *不是* 经过验证的加密模块(无 CMVP)。差距分析:[`docs/compliance/fips-readiness.md`](docs/compliance/fips-readiness.md); CAVP 风格的已知答案向量在 [`core/tests/cavp.rs`](core/tests/cavp.rs) 中。 - **通用标准:** 针对 NIAP PP-Module VPN Client 的内部 SFR 差距映射工作仅作为设计参考存在 ([`docs/compliance/cc-pp-mapping.md`](docs/compliance/cc-pp-mapping.md))。目前没有计划进行实验室评估。 ### 披露 私下报告,**不要**通过公开 issues。禁运 SLA 为 90 天;在 5 个工作日内确认,在 14 天内进行分类。联系方式在 [`SECURITY.md`](SECURITY.md) 中(那里的电子邮件是等待 crate 发布前的占位符)。 ### 供应链 `cargo deny`(宽松的许可证白名单,`yanked = "deny"`, `unknown-registry = "deny"`)和 `cargo audit` 在 CI 中运行。发布工件通过 `actions/attest-build-provenance@v2` 携带 **SLSA-3 OIDC 构建出处证明**。使用 `gh attestation verify --owner ` 或 `cosign verify-blob-attestation` 进行验证。 ## 状态与限制 - **1.0 之前版本 (`0.1.1`)。** 线上格式可能会在次要版本之间发生破坏性改变;SemVer 在 1.0 发布后适用。当前的线上协议是一个单一的固定版本 —— 以前的 V1/V2/V3 轴线在 1.0 之前被合并了(没有用户,没有协商,没有回退),因此没有跨版本迁移指南。 - **原生 UDP 传输 (PhantomUDP): 握手 + demux 工作;丢包恢复是悬而未决的部分。** `PhantomSession` 现在可以通过 TCP、WebSocket 以及原始 UDP(连接 ID demux、服务端接受、分片握手)运行经过身份验证的会话 —— 已在无损 loopback 上进行了端到端验证。**尚未**完成的是:UDP 数据平面的丢包恢复此前仅在可靠管道上运行过,尚未在真实的丢包环境中进行验证;确定性丢包/重排测试传输(验证它所需的工具)正在优先构建中。早期实验性的 KCP / FakeTLS 链路以及未使用的 `TransportLeg` 多路径 trait 已被移除(从未接入数据平面)。路线图:验证单路径 UDP 丢包恢复 → 无缝连接迁移(一次仅维持一个活跃路径,用于在没有重新握手的情况下进行 Wi-Fi↔蜂窝切换) → DPI 模仿传输模式。跨传输的带宽 *聚合* **并未**在计划中 —— 分析表明它会对这种工作负载产生倒退,并损害不可观测性。 - **移动连接迁移(Wi-Fi ↔ LTE)尚不支持。** 路径验证原语仅限内部使用;在网络发生变化时,请重新连接(通过 `connect_pinned_with_resumption` 使用 0-RTT 恢复以最小化成本)。 - **丢包恢复基于超时(无 SACK)且未在丢包环境中得到验证。** 代码包含 RFC-6298 RTO + 重传 + BBR 风格的拥塞窗口 + 会话中期密钥更新,但这套机制是为可靠的字节管道构建的,并且 **从未针对真实的丢包/重排进行过演练** —— 验证它(以及使之成为可能的丢包测试装备)是目前的优先事项。SACK / dup-ACK 快速重传 / PTO 是接下来的工作项,需要对数据包编号 / ACK 范围字段进行敏感的安全处理,即一次刻意的 `WIRE_VERSION` 提升。 - **负安全测试套件:** `core/tests/security_invariants.rs` 中有 33 个常驻测试,锁定了所有已记录的不变量。此外还有 proptest、fuzz、wire-vector、runtime-integration 和 CAVP 套件、282 个库单元测试,以及受 `#[ignore]` 限制的 loopback 集成套件(TCP、UDP、WASI)。0 个工作空间警告,0 个 clippy 警告。**注意:** 广泛的测试覆盖 *并不* 等同于经过验证的传输 —— 在面临真实的丢包时,这些测试都还没有针对数据平面进行演练(参见上面的丢包恢复项)。 - **计划阶段的功能覆盖面很广,但尚未达到生产就绪状态。** 握手/身份/可观测性/跨目标工作已基本就绪;数据平面(UDP 丢包恢复)是未完成、未经验证的部分,并且尚未进行外部安全审计或 CMVP/CC 验证。形式化验证(ProVerif / Tamarin)和外部审计已提上日程,但尚未完成。 - **`PhantomListener::bind()` 会每个进程生成一个新的签名密钥** —— 身份在重启后无法保留。固定稳定的生产部署必须使用 `bind_with_signing_key()` 并从磁盘加载密钥(`phantom-cli keygen` 会写入 0600 权限的种子文件)。 - **该库不包含 HTTP 服务器。** 该库暴露 OTel 指标;嵌入器配置导出器。`server/src/telemetry.rs` 是参考的 OTLP/gRPC 接线方式。 - **MSRV: Rust 1.75.** `cli/` 使用 edition 2024,可以在稳定版上构建,但不能在 1.75 限制上构建。 - **7 个 fuzz harness**,在 CI 中运行(`.github/workflows/fuzz.yml`:每个目标在每个 PR 运行 60 秒,每晚运行 600 秒)。模糊测试需要 nightly;只有 `fuzz_embedded_framing` 的主体也可以在稳定版上编译。 - **嵌入式在裸机上仅支持成帧。** `thumbv7em-none-eabihf` 构建(`--no-default-features --features embedded,no-std`)仅提供 `EmbeddedLeg` 及其长度前缀成帧;PQ 加密、握手和 `PhantomSession` 受 `std` 限制被排除在外。**PQ-on-bare-metal 不在 1.0 计划之内** —— RustCrypto 原语需要 `alloc` 以及嵌入器提供的熵/堆,而真正的裸机握手(no-std 加密、Embassy/RTIC 运行时、QEMU 托管的握手测试)是一个单独的子项目。裸机嵌入器通过该链路运行它们自己的加密。严格的 `thumbv7em` CI 关卡是 `cargo check --lib` —— 它证明成帧可以编译,但并不证明会话可以运行。 ## 文档 - **架构:** [`docs/architecture/ARCHITECTURE.md`](docs/architecture/ARCHITECTURE.md); 贡献者工作流在 [CONTRIBUTING.md](CONTRIBUTING.md) 中 - **线上协议:** [`docs/protocol/PROTOCOL.md`](docs/protocol/PROTOCOL.md) (单一统一协议,包括 0-RTT) - **安全性:** [`SECURITY.md`](SECURITY.md)、 [`docs/security/threat-model.md`](docs/security/threat-model.md)、 [`docs/security/incident-response.md`](docs/security/incident-response.md)、 [`docs/security/cancel-safety-audit.md`](docs/security/cancel-safety-audit.md)、 [`docs/security/panic-sites.md`](docs/security/panic-sites.md) - **合规性:** [`docs/compliance/`](docs/compliance/) — `fips-readiness.md`、`cc-pp-mapping.md`、`constant-time-audit.md`、 `rng-audit.md`、`key-management.md`、`self-tests.md`、 `fips-security-policy.md` - **运维:** [`docs/operations/`](docs/operations/) — `perf-tuning.md`、`deployment.md`、`docker.md`、`systemd.md`、 `kubernetes.md` (+ `helm/`)、`mobile.md`、`wasm.md`、`wasi.md` - **政策:** [`docs/policy/versioning.md`](docs/policy/versioning.md) - **性能:** [`BENCHMARKS.md`](BENCHMARKS.md) - **更新日志:** [`CHANGELOG.md`](CHANGELOG.md) ## 致谢 使用 Anthropic 的 **Claude Opus 4.6** 通过 [Claude Code](https://claude.com/claude-code) 提供的 AI 协助进行开发。所有架构决策、安全不变量、威胁模型以及 FIPS / CC 合规工件均由人类作者编写、审查、测试和维护。 ## 许可证 Apache License 2.0。参见 [`LICENSE`](LICENSE)。
标签:Rust, 内核驱动, 可视化界面, 后量子密码学, 用户代理, 网络传输, 网络协议, 网络流量审计, 跨平台SDK, 通知系统