面向智能体系统的协议级密钥使用。
arXiv:2604.24920 的参考实现——参见引用本文。
sudp 允许一个自主的 Requester(R)提出一项由密钥支持的操作,由 Authorizer(A)精确授权该操作,并由 Custodian(T)执行该操作。委托的单位是一次使用,而非密钥本身。
┌─────────────────────────┐
│ Authorizer A │
│ (passkey on a device) │
└────────────┬────────────┘
│ signs β over (DS ‖ r ‖ H(o))
▼
┌──────────────┐ ┌───────────────┐ ┌──────────────┐
│ Requester R │ ─o─▶ │ Custodian T │ ─s─▶ │ Environment │
│ (agent) │ │ │ │ E │
│ │◀ρ────│ holds sealed Σ│ │ │
└──────────────┘ └───────────────┘ └──────────────┘
R 永远看不到 s,也无法获得对它的任何可复用权限——即使 R 被完全攻陷(提示注入、运行时 shim 等)也是如此。
@misc{yu2026sudp,
title = {SUDP: Secret-Use Delegation Protocol for Agentic Systems},
author = {Xiaohang Yu and Hejia Geng and Xinmeng Zeng and William Knottenbelt},
year = {2026},
eprint = {2604.24920},
archivePrefix = {arXiv},
primaryClass = {cs.CR},
url = {https://arxiv.org/abs/2604.24920}
}
Xiaohang Yu、Hejia Geng、Xinmeng Zeng 和 William Knottenbelt。 "SUDP: Secret-Use Delegation Protocol for Agentic Systems." arXiv preprint arXiv:2604.24920 (2026)。
| 角色 | 源码 | 发布为 |
|---|---|---|
| 托管方 (T) | custodian/rust | crates.io 上的 sudp |
| 授权方 (A) | authorizer/ts | npm 上的 @sudp-protocol/authorizer |
| 请求方 (R) | requester/ts | npm 上的 @sudp-protocol/requester |
前置条件:Rust 1.85+(通过 rustup 安装)和 Node.js 20+。
git clone https://github.com/xhyumiracle/sudp
cd sudp/examples/protocol-demo
./run.sh
构建全部三个包,启动 Custodian,在 Node 脚本中运行 R + A,按角色以颜色区分打印每一次线路交互,最后以对抗性检查收尾(R 在 A 签名后篡改 o → T 拒绝)。
API 级用法:custodian/rust ·
authorizer/ts · requester/ts。
Agent 作者通常只需要
@sudp-protocol/requester —— 类型化的 Operation 构建器
和形状校验器,无需传输层,无需框架适配器。Requester
是最可替换的一层;每个 agent 框架都接入自己的胶水代码。
一致性向量在字节层面将 Authorizer 的字节与 Custodian 锁定 —— 复合形状在构造上保持对齐。
| 接口面 | Rust 锚点 | TS 锚点 |
|---|---|---|
canonical(o) | Operation::canonical_bytes 单元测试 | conformance.test.ts: canonical: nested ordering |
β + DS_BIND | beta_matches_ts_authorizer_conformance_vector | conformance.test.ts: β: matches Rust... |
批量 β (H(canonical(ops))) | batch_beta_matches_ts_authorizer_conformance_vector | conformance.test.ts: batch β: matches Rust... |
derive_wrapping_key | derive_wrapping_key_matches_ts_authorizer_conformance_vector | conformance.test.ts: deriveWrappingKey: matches Rust... |
| AEAD 加密(固定 nonce) | aead_matches_ts_authorizer_conformance_vector | conformance.test.ts: aeadEncrypt: matches Rust... |
wrap_ad 布局 | WrapBinding::to_canonical_ad 测试 | conformance.test.ts: wrap_ad: DS_WRAP ‖ cid ‖ ver_be |
seal_ad 布局 | phases::setup::seal_ad(setup 测试) | conformance.test.ts: seal_ad: DS_SEAL ‖ ver_be |
逐记录密封(record_aad / K_aead / 密封帧) | state::record::tests::conformance_* | conformance.test.ts: per-record conformance vectors |
WRAP_VERSION ↔ CURRENT_VERSION | state::CURRENT_VERSION = 1 | conformance.test.ts: WRAP_VERSION matches Rust... |
CI 在每次推送时运行两半:
cd custodian/rust && cargo test
cd authorizer/ts && npm test
cd requester/ts && npm test
在 1.0 之前,wire format 和 trait 形态仍可能发生变化。在生产环境中请固定次要版本:
# Cargo.toml
sudp = "~0.1"
// package.json
"@sudp-protocol/authorizer": "~0.1.0",
"@sudp-protocol/requester": "~0.1.0"
参见 SECURITY.md。
Apache-2.0。参见 LICENSE。