The Secure Agent Delegation Protocol (SADP): End-to-End Encrypted Task Capsules for AI Agent Systems
draft-atakora-sadp-protocol-00
This document is an Internet-Draft (I-D).
Anyone may submit an I-D to the IETF.
This I-D is not endorsed by the IETF and has no formal standing in the
IETF standards process.
The information below is for an old version of the document.
| Document | Type |
This is an older version of an Internet-Draft whose latest revision state is "Active".
|
|
|---|---|---|---|
| Author | Hamdy Atakora | ||
| Last updated | 2026-09-21 | ||
| RFC stream | (None) | ||
| Formats | |||
| Stream | Stream state | (No stream defined) | |
| Consensus boilerplate | Unknown | ||
| RFC Editor Note | (None) | ||
| IESG | IESG state | I-D Exists | |
| Telechat date | (None) | ||
| Responsible AD | (None) | ||
| Send notices to | (None) |
draft-atakora-sadp-protocol-00
Individual Submission H. Atakora
Internet-Draft Imara Labs
Intended status: Experimental 20 September 2026
Expires: 24 March 2027
The Secure Agent Delegation Protocol (SADP): End-to-End Encrypted Task
Capsules for AI Agent Systems
draft-atakora-sadp-protocol-00
Abstract
This document specifies the Secure Agent Delegation Protocol (SADP),
an experimental end-to-end encrypted communication layer for user-to-
agent and agent-to-agent workflows. SADP defines task capsules:
signed, encrypted, individually routable protocol objects that carry
agent tasks, tool invocations, and results across untrusted brokers,
queues, and orchestration infrastructure. SADP provides asynchronous
session establishment using signed prekey bundles, per-message
forward secrecy and post-compromise recovery through a Double-
Ratchet-style message ratchet, an optional hybrid post-quantum key-
agreement profile based on ML-KEM-768, and an authenticated opaque-
broker profile with replay protection. SADP is transport agnostic
and is designed to be carried over HTTP, message queues, and existing
agent protocols such as A2A and MCP without requiring those systems
to be trusted with plaintext task content. Capability-based
delegation semantics and scoped context disclosure are specified in a
companion document.
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on 24 March 2027.
Atakora Expires 24 March 2027 [Page 1]
Internet-Draft SADP September 2026
Copyright Notice
Copyright (c) 2026 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components
extracted from this document must include Revised BSD License text as
described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Revised BSD License.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. Problem Statement . . . . . . . . . . . . . . . . . . . . 3
1.2. Protocol Maturity and Naming . . . . . . . . . . . . . . 4
1.3. Design Goals . . . . . . . . . . . . . . . . . . . . . . 4
1.4. Relationship to A2A, MCP, and Agent Transports . . . . . 5
1.5. Relationship to Prior Work . . . . . . . . . . . . . . . 6
1.6. Document Organization . . . . . . . . . . . . . . . . . . 7
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 7
3. Protocol Overview . . . . . . . . . . . . . . . . . . . . . . 8
4. Principal Identifiers . . . . . . . . . . . . . . . . . . . . 9
5. Data Encoding . . . . . . . . . . . . . . . . . . . . . . . . 9
5.1. Canonical JSON . . . . . . . . . . . . . . . . . . . . . 10
5.2. Binary Values and Timestamps . . . . . . . . . . . . . . 10
5.3. Hashing . . . . . . . . . . . . . . . . . . . . . . . . . 10
5.4. Unknown Fields and Criticality . . . . . . . . . . . . . 10
6. Task Capsules . . . . . . . . . . . . . . . . . . . . . . . . 10
6.1. Capsule Header . . . . . . . . . . . . . . . . . . . . . 11
6.2. Message Types . . . . . . . . . . . . . . . . . . . . . . 11
6.3. Capsule Body . . . . . . . . . . . . . . . . . . . . . . 11
6.4. Capsule Validation Order . . . . . . . . . . . . . . . . 12
7. Session Establishment . . . . . . . . . . . . . . . . . . . . 13
7.1. Prekey Bundles . . . . . . . . . . . . . . . . . . . . . 13
7.2. One-Time Prekeys . . . . . . . . . . . . . . . . . . . . 13
7.3. Session Initiation . . . . . . . . . . . . . . . . . . . 14
7.4. Session Transcript . . . . . . . . . . . . . . . . . . . 15
7.5. Initiator Authentication . . . . . . . . . . . . . . . . 16
7.6. Hybrid Post-Quantum Profile . . . . . . . . . . . . . . . 16
7.7. Profile Negotiation and Downgrade Rules . . . . . . . . . 17
7.8. Session Repair . . . . . . . . . . . . . . . . . . . . . 17
8. Message Ratchet . . . . . . . . . . . . . . . . . . . . . . . 17
8.1. Session State . . . . . . . . . . . . . . . . . . . . . . 17
8.2. Key Derivation . . . . . . . . . . . . . . . . . . . . . 18
Atakora Expires 24 March 2027 [Page 2]
Internet-Draft SADP September 2026
8.3. Message Format . . . . . . . . . . . . . . . . . . . . . 18
8.4. Associated Data Binding . . . . . . . . . . . . . . . . . 18
8.5. Receiver Processing: Verify Before Commit . . . . . . . . 19
8.6. DH Ratchet Steps and Skipped Keys . . . . . . . . . . . . 19
9. Single-Capsule Payload Profiles . . . . . . . . . . . . . . . 19
10. Opaque Broker Profile . . . . . . . . . . . . . . . . . . . . 20
10.1. Broker Role . . . . . . . . . . . . . . . . . . . . . . 20
10.2. Request Authentication . . . . . . . . . . . . . . . . . 20
10.3. Replay Protection . . . . . . . . . . . . . . . . . . . 21
10.4. Registration and Proof of Possession . . . . . . . . . . 21
10.5. Authorization Matrix . . . . . . . . . . . . . . . . . . 22
10.6. Send Policy . . . . . . . . . . . . . . . . . . . . . . 22
10.7. Receipts, Events, and Compaction . . . . . . . . . . . . 22
11. Metadata Privacy Considerations . . . . . . . . . . . . . . . 23
12. Transport Adapters . . . . . . . . . . . . . . . . . . . . . 23
13. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 24
14. Security Considerations . . . . . . . . . . . . . . . . . . . 24
14.1. What SADP Protects . . . . . . . . . . . . . . . . . . . 24
14.2. What SADP Does Not Protect . . . . . . . . . . . . . . . 24
14.3. Initiator and Responder Authentication . . . . . . . . . 25
14.4. Cryptographic Profile Status . . . . . . . . . . . . . . 25
14.5. Denial of Service . . . . . . . . . . . . . . . . . . . 25
14.6. Key Compromise . . . . . . . . . . . . . . . . . . . . . 26
15. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 26
16. References . . . . . . . . . . . . . . . . . . . . . . . . . 26
16.1. Normative References . . . . . . . . . . . . . . . . . . 26
16.2. Informative References . . . . . . . . . . . . . . . . . 27
Appendix A. Example Exchange . . . . . . . . . . . . . . . . . . 31
Appendix B. Cryptographic Profile Summary . . . . . . . . . . . 32
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 33
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 33
1. Introduction
1.1. Problem Statement
Agentic AI systems increasingly move sensitive data and authority
through long chains of intermediaries: a user's device talks to a
personal agent, which delegates to specialist agents, which invoke
tools, all mediated by orchestration servers, brokers, queues, model
gateways, and logging layers. In deployed systems today, each of
those intermediaries typically sees task plaintext. Transport
security protects individual hops, but the orchestration layer itself
operates on cleartext prompts, documents, tool arguments, and
results. That layer includes the broker that stores and forwards
messages, the gateway that logs requests, and the framework that
schedules agents.
Atakora Expires 24 March 2027 [Page 3]
Internet-Draft SADP September 2026
That default is a poor fit for legal, medical, financial, government,
and enterprise workflows, and it is an increasingly poor fit for
personal assistants that hold long-lived user memory. The current
generation of agent interoperability protocols reflects this gap: the
A2A protocol [A2A] secures hops with TLS and delegates authorization
to server-side policy, and the Model Context Protocol [MCP] adopts an
OAuth 2.1 resource-server model for tool access. Neither provides
end-to-end confidentiality of task content across an untrusted
intermediary, and neither binds a task's authorization to the
encrypted object that carries it.
SADP addresses the confidentiality half of this problem. It defines
an encrypted, signed, individually routable protocol object, the task
capsule, together with the session, ratchet, and broker machinery
needed to deliver capsules asynchronously between principals that may
be offline, may run on multiple runtimes, and may never share a
direct network path. The authorization half consists of capability
grants, attenuated delegation chains, and cryptographically scoped
context disclosure. It is specified in the companion document
[I-D.atakora-wimse-sadp-delegation].
1.2. Protocol Maturity and Naming
This revision is intended for experimentation and review. Neither
this specification nor its reference implementation has received
independent external cryptographic review, and the wire format is
expected to change as interoperability tests and formal analysis
identify necessary repairs. Deployments MUST treat the v0.2 profiles
as experimental.
The acronym SADP has appeared previously in IETF work for the
unrelated Scoped Address Discovery Protocol [I-D.ietf-mboned-sadp].
This document uses SADP for the Secure Agent Delegation Protocol; the
two protocols are unrelated. A future publication path may choose a
less ambiguous short name if that avoids confusion in IETF registries
or discussion.
1.3. Design Goals
SADP is designed to provide:
* Confidentiality of task payloads, tool arguments, context, and
results from brokers, queues, gateways, logs, and unrelated
runtimes.
* Integrity and authenticity of capsule headers, payloads, and
registry material.
Atakora Expires 24 March 2027 [Page 4]
Internet-Draft SADP September 2026
* Asynchronous, offline-capable session establishment using signed
prekey bundles, following the design pioneered by X3DH [X3DH].
* Per-message forward secrecy and post-compromise recovery through a
message ratchet derived from the Double Ratchet algorithm
[DOUBLERATCHET].
* An optional hybrid post-quantum key-agreement profile combining
X25519 [RFC7748] with ML-KEM-768 [FIPS203], following the hybrid
approach of PQXDH [PQXDH].
* Multi-runtime agent identity, treating each runtime of an agent
like a device in multi-device secure messaging [SESAME].
* An authenticated broker profile in which the broker routes and
stores opaque capsule bytes, authenticates requests by digital
signature, and enforces mailbox ownership without access to
plaintext.
* Transport agnosticism: SADP objects are self-contained and can be
carried over HTTP, WebSocket, message queues, or as opaque
payloads inside A2A messages and MCP tool calls.
SADP explicitly does not attempt to provide anonymous or metadata-
resistant routing, protection against a compromised endpoint after
decryption, model-behavior safety, or a global identity governance
framework. Section 14 discusses these boundaries.
1.4. Relationship to A2A, MCP, and Agent Transports
SADP is a layer, not a replacement. A2A [A2A] defines agent
discovery, agent cards, and task exchange between agent servers; MCP
[MCP] defines tool and resource access for model applications. Both
can carry SADP capsules as opaque payloads. When they do, the A2A
server or MCP host retains its routing and lifecycle role but loses
visibility into task content; only the intended recipient principal
can decrypt. Similarly, an ordinary message queue or mailbox service
can act as an SADP broker with no knowledge of the protocol beyond
byte storage, and a conforming SADP broker (Section 10) adds
authenticated mailboxes, registry services, and receipts.
Atakora Expires 24 March 2027 [Page 5]
Internet-Draft SADP September 2026
1.5. Relationship to Prior Work
SADP deliberately composes established cryptographic constructions
rather than inventing new ones, and this document credits those
constructions at the point of use. The asynchronous prekey handshake
derives from X3DH [X3DH]; the message ratchet derives from the Double
Ratchet [DOUBLERATCHET]; the hybrid post-quantum profile follows
PQXDH [PQXDH] and the subsequent post-quantum ratchet work [SPQR];
the multi-runtime model follows Sesame [SESAME]. The capability
lineage in the companion document builds on Macaroons [MACAROONS],
Biscuit [BISCUIT], and UCAN [UCAN], and its on-behalf-of semantics
relate to OAuth 2.0 Token Exchange [RFC8693] and GNAP [RFC9635].
Adjacent protocol work exists and predates this document.
[I-D.chapman-a2a-mls] applies MLS [RFC9420] to A2A messages with
purpose binding; the AGNTCY SLIM project [SLIM] provides an MLS-based
encrypted session layer as an agent transport;
[I-D.asor-wimse-agent-delegation-chain] defines verifiable attenuated
delegation tokens for agent chains without an encryption layer;
[I-D.hamr-oauth-agent-delegation] defines an HTTP header profile for
attenuated cross-domain agent delegation;
[I-D.liu-oauth-chain-delegation] defines OAuth-based chained
delegation tokens for agent identities;
[I-D.li-oauth-delegated-authorization] defines constrained client-
issued delegated authorization tokens;
[I-D.singla-agent-identity-protocol] defines decentralized identity
and capability delegation for agents; [I-D.vandoulas-aidp] defines a
control-plane model for intent, authority, execution, and
observation; [I-D.nelson-agent-delegation-receipts] defines user-
signed, log-anchored delegation receipts; [I-D.sharif-attp] specifies
an agent trust transport framework for trust scoring and action-limit
enforcement; and [I-D.sharif-agent-transport-protocol] specifies an
asynchronous store-and-forward agent transport. Academic proposals
address authenticated delegation [SOUTH2025] and multi-agent
governance [SAGA2025].
What SADP contributes relative to that work is object-level rather
than channel-level end-to-end encryption. The unit of protection is
an individually signed, individually routable task capsule that
survives store-and-forward delivery through arbitrary intermediaries,
composed with capability-bound authorization and payload-blind audit
commitments in one protocol. In the v0.2 profile, task and context
payloads are encrypted end-to-end, while capability grants and audit
records are authenticated outer capsule fields that may reveal
delegation metadata to brokers that store the full capsule. A future
private-delegation-evidence profile is expected to move grants and
detailed audit records inside an encrypted inner body while leaving
only public commitments in the outer capsule. Group-channel
Atakora Expires 24 March 2027 [Page 6]
Internet-Draft SADP September 2026
approaches such as MLS excel when a stable group of participants
shares a conversation; SADP targets the delegation topology, where
each hop is a distinct pairwise relationship with distinct authority,
and where a task object must remain verifiable and confidential as it
is queued, retried, and re-routed.
1.6. Document Organization
This document specifies the SADP data model (Section 5, Section 6),
session establishment (Section 7), the message ratchet (Section 8),
single-capsule payload profiles (Section 9), the opaque broker
profile (Section 10), metadata privacy (Section 11), and transport
carriage (Section 12). Capability grants, delegation chains,
caveats, scoped context disclosure, and the audit hash chain are
specified in [I-D.atakora-wimse-sadp-delegation]; this document
defines only the capsule fields that carry them.
2. Terminology
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.
Principal: An entity that participates in SADP with a stable
identifier and cryptographic key material. Principals include
users, agents, runtimes, tools, workspaces, and brokers.
Runtime: An executing instance of an agent or tool, analogous to a
device in multi-device secure messaging [SESAME]. An agent
identity is stable across its runtimes; each runtime has its own
key material and registration.
Task Capsule (or Capsule): The SADP protocol object: a JSON document
with a cleartext routing header, protocol metadata, authenticated
capability grants and audit records, and an encrypted task or
context payload. In the v0.2 profile, capability and audit fields
are outer authenticated fields rather than encrypted inner fields.
Broker: An untrusted store-and-forward service that accepts, stores,
and delivers opaque capsule bytes to recipient mailboxes and hosts
the runtime registry. A broker is trusted for availability, never
for confidentiality.
Mailbox: The per-principal delivery queue a broker maintains.
Session: The shared cryptographic state between two principals on
Atakora Expires 24 March 2027 [Page 7]
Internet-Draft SADP September 2026
one communication edge, established as described in Section 7 and
advanced by the message ratchet.
Prekey Bundle: Signed public key material a runtime publishes to the
registry so that senders can establish sessions while the runtime
is offline, following the design of [X3DH].
One-Time Prekey: A prekey published for single use and consumed at
selection time.
Edge: An ordered (local principal, remote principal, thread) tuple
over which one session is maintained.
Registry: The broker-hosted directory of runtime records, signing
keys, encryption keys, and prekey bundles.
Scheme Identifier: A versioned ASCII string naming a cryptographic
profile, for example "sadp-session-init-x25519-hkdf-sha256-v0.2".
Every signed or encrypted SADP structure names its scheme
explicitly.
3. Protocol Overview
SADP layers as follows:
+--------------------------------------------------------------+
| Application layer: agent tasks, tool calls, results, memory |
+--------------------------------------------------------------+
| Delegation layer: capabilities, delegation chains, audit |
| (specified in the companion document) |
+--------------------------------------------------------------+
| Capsule layer: signed, encrypted task capsules (this doc) |
+--------------------------------------------------------------+
| Session layer: prekey handshake, ratchet, AEAD (this doc) |
+--------------------------------------------------------------+
| Broker/transport: opaque mailboxes over HTTP, A2A, MCP, |
| queues (this doc, sections 10 and 12) |
+--------------------------------------------------------------+
A typical exchange proceeds as follows:
1. Each runtime generates an Ed25519 [RFC8032] signing keypair, an
X25519 [RFC7748] encryption keypair, optionally an ML-KEM-768
[FIPS203] keypair, and registers with a broker, proving
possession of its signing key (Section 10.4).
Atakora Expires 24 March 2027 [Page 8]
Internet-Draft SADP September 2026
2. A sender fetches the recipient's prekey bundle from the registry,
verifies its signature and expiry, and derives a session root key
using the signed session-initiation handshake (Section 7.3).
3. The sender builds a task capsule: cleartext routing header,
authenticated capability grants and audit commitments as needed,
and a task or context payload encrypted under the session's
message ratchet (Section 8).
4. The broker authenticates the sender's request by signature
(Section 10.2), performs mailbox-level authorization, stores the
opaque capsule, and emits delivery events.
5. The recipient fetches the capsule, performs the validation
sequence of Section 6.4, verifies capabilities and audit linkage
per [I-D.atakora-wimse-sadp-delegation], decrypts the encrypted
payload, and only then releases plaintext to the application.
6. Replies and delegated subtasks flow the same way on their own
edges, advancing or establishing sessions as needed.
4. Principal Identifiers
A principal identifier is a sequence of one or more segments
separated by "/" (U+002F). Each segment has the form kind:name,
where kind is one of:
user | device | agent | runtime | tool | workspace |
broker | memory | context
and name is a nonempty token of ASCII letters, digits, "-", "_", and
".". Examples:
user:alice/device:phone
agent:contract-reviewer/runtime:prod-a
tool:pdf-parser/runtime:prod-b
workspace:acme
The identifier without its trailing runtime:* or device:* segment is
the principal's "subject" and groups the runtimes or devices of a
single actor. Implementations MUST reject identifiers with unknown
segment kinds, empty segments, or characters outside the token
alphabet.
5. Data Encoding
Atakora Expires 24 March 2027 [Page 9]
Internet-Draft SADP September 2026
5.1. Canonical JSON
SADP structures are JSON [RFC8259] documents. Wherever this document
requires canonical bytes, such as signing inputs and hash inputs, the
canonical form is defined as:
* UTF-8 encoding;
* object member names sorted lexicographically by Unicode code point
at every nesting level;
* no duplicate member names (parsers MUST reject duplicates);
* no insignificant whitespace;
* array order preserved;
* numbers restricted to integers within the IEEE-754 exact range.
This canonical form is a deliberately restricted profile compatible
with the JSON Canonicalization Scheme [RFC8785]; implementations MAY
use an RFC 8785 canonicalizer, provided the restrictions above are
enforced on input.
5.2. Binary Values and Timestamps
Binary values are encoded as base64url without padding. Timestamps
in human-facing document fields use RFC 3339 [RFC3339]; timestamps
inside signing inputs and validation APIs use integer seconds since
the Unix epoch, to keep canonical bytes unambiguous.
5.3. Hashing
All hashes in this document are SHA-256 [RFC6234] and are encoded as
base64url without padding unless stated otherwise.
5.4. Unknown Fields and Criticality
Capsule headers carry a critical array naming top-level fields whose
semantics a receiver must understand. A receiver MUST reject a
capsule that lists a critical field the receiver does not implement,
and MUST ignore unknown fields that are not listed as critical. This
provides forward compatibility without silent security downgrade.
6. Task Capsules
Atakora Expires 24 March 2027 [Page 10]
Internet-Draft SADP September 2026
6.1. Capsule Header
Every capsule carries the following cleartext header fields:
{
"version": "sadp/0.1",
"type": "task_create",
"capsule_id": "cap_01J00000000000000000000000",
"task_id": "task_01J00000000000000000000000",
"thread_id": "thread_01J00000000000000000000000",
"turn_id": "turn_01J00000000000000000000000",
"from": "user:alice/device:phone",
"to": "agent:contract-reviewer/runtime:prod-a",
"created_at": "2026-09-19T12:00:00Z",
"expires_at": "2026-09-19T13:00:00Z",
"critical": ["policy", "capabilities", "audit"]
}
version identifies the capsule envelope format. The envelope version
is deliberately decoupled from cryptographic profile versions: the
security profiles defined in this document carry "-v0.2" scheme
identifiers inside an envelope whose format is unchanged from
"sadp/0.1". capsule_id MUST be unique per sender; receivers and
brokers use it for replay rejection and idempotency. expires_at is
mandatory; receivers MUST reject expired capsules.
6.2. Message Types
The initial message-type registry (Section 15) contains:
session_init, session_repair, runtime_added, runtime_removed,
task_create, task_update, task_cancel, task_result,
delegate_create, delegate_result, tool_call, tool_result,
memory_read_request, memory_read_result,
memory_write_request, memory_write_result,
receipt, policy_violation
6.3. Capsule Body
Beyond the header, a capsule MAY carry:
policy: Cleartext delegation policy hints (allowed delegatees,
allowed and forbidden tools, retention). Policy fields are
advisory routing metadata; enforcement derives from capability
grants ([I-D.atakora-wimse-sadp-delegation]).
capabilities: An array of signed capability grants, possibly
Atakora Expires 24 March 2027 [Page 11]
Internet-Draft SADP September 2026
chained. In v0.2 this field is an outer authenticated capsule
field and may be visible to brokers that store the full capsule.
Format and verification rules are specified in
[I-D.atakora-wimse-sadp-delegation].
context_refs: References to encrypted context blobs, carrying a
resource identifier, content type, and an encrypted key reference;
the key material is released only against valid capabilities.
audit (and, for delegation, parent_audit): Hash-chain audit records
binding the capsule to its delegation lineage. In v0.2 these
records are outer authenticated capsule fields and may reveal
lineage shape to brokers. They are specified in
[I-D.atakora-wimse-sadp-delegation].
session_init: A session-initiation envelope (Section 7.3), present
on the first capsule of an edge.
encrypted_payload: The encrypted task content: a ratchet message
(Section 8) or a single-capsule AEAD payload (Section 9).
key_agreement: Present with the pre-ratchet payload profile only
(Section 9).
6.4. Capsule Validation Order
Receivers MUST validate in the following order, and MUST NOT release
encrypted payload plaintext to application code before all applicable
steps pass:
1. Parse with duplicate-key rejection.
2. Reject unsupported envelope versions.
3. Reject malformed principal identifiers.
4. Reject unknown critical fields.
5. Reject expired capsules.
6. Reject replayed capsule identifiers and, for ratchet messages,
replayed message counters.
7. Verify signatures and authentication tags.
8. Verify capability chains: holder, resource, action, task
binding, expiry, delegation depth, and caveats
([I-D.atakora-wimse-sadp-delegation]).
Atakora Expires 24 March 2027 [Page 12]
Internet-Draft SADP September 2026
9. Verify audit parent linkage
([I-D.atakora-wimse-sadp-delegation]).
10. Decrypt the encrypted payload.
11. Release plaintext to the application.
Debug or inspection modes that bypass any step MUST be impossible to
confuse with production validation (for example, distinct function
names and distinct result types).
7. Session Establishment
7.1. Prekey Bundles
Each registered runtime publishes a signed prekey bundle to the
registry:
{
"principal": "agent:contract-reviewer/runtime:prod-a",
"subject": "agent:contract-reviewer",
"runtime_id": "prod-a",
"signing_public_key": "<base64url Ed25519>",
"encryption_public_key": "<base64url X25519>",
"ml_kem768_encapsulation_key": "<base64url ML-KEM-768 ek>",
"prekey_id": "prekey_agent_a_1",
"prekey_kind": "runtime_static",
"scheme": "sadp-prekey-ed25519-v0.1",
"created_at_epoch_seconds": 1789819200,
"expires_at_epoch_seconds": 1789905600,
"signature": "<base64url Ed25519>"
}
The signature is computed with the runtime's Ed25519 signing key over
a domain-separated canonical encoding that binds every field above
except signature. Registries MUST verify prekey signatures and
expiry at publication and at lookup, and MUST reject tampered or
expired bundles. The ml_kem768_encapsulation_key field is OPTIONAL
and enables the hybrid profile of Section 7.6.
7.2. One-Time Prekeys
Runtimes SHOULD publish batches of signed one-time prekeys. Prekey
selection prefers an unconsumed one-time prekey and falls back to the
runtime-static prekey; a one-time prekey is consumed atomically at
selection. Because consumption is a state change that an attacker
could abuse to exhaust the supply, prekey lookup requires an
authenticated request from a registered principal (Section 10.2).
Atakora Expires 24 March 2027 [Page 13]
Internet-Draft SADP September 2026
Runtimes can monitor inventory through the registry's inventory
interface and MUST tolerate static-prekey fallback, as in [X3DH].
7.3. Session Initiation
The v0.2 session-initiation profile is identified by:
sadp-session-init-x25519-hkdf-sha256-v0.2
The initiator:
1. Fetches and verifies the responder's prekey bundle.
2. Generates a fresh ephemeral X25519 keypair.
3. Computes the Diffie-Hellman shared secret between its ephemeral
private key and the responder's prekey.
4. If the bundle carries an ML-KEM-768 encapsulation key and local
policy selects the hybrid suite, encapsulates to it
(Section 7.6).
5. Builds the session transcript (Section 7.4).
6. Signs the transcript with its Ed25519 identity signing key.
7. Derives the session root key: HKDF-SHA256 [RFC5869] with the
transcript as salt, the key-agreement output as input keying
material, and the fixed info string "SADP session root v0.1".
(Derivation labels are versioned independently of scheme
identifiers and are unchanged from the prior profile revision.)
The session-initiation envelope is:
Atakora Expires 24 March 2027 [Page 14]
Internet-Draft SADP September 2026
{
"scheme": "sadp-session-init-x25519-hkdf-sha256-v0.2",
"session_id": "<base64url SHA-256 of root key>",
"initiator": "user:alice/device:phone",
"responder": "agent:contract-reviewer/runtime:prod-a",
"selected_prekey_id": "prekey_agent_a_1",
"selected_prekey_kind": "runtime_static",
"initiator_ephemeral_public_key": "<base64url X25519>",
"responder_identity_public_key": "<base64url X25519>",
"initiator_signing_public_key": "<base64url Ed25519>",
"initiator_signature": "<base64url Ed25519>",
"transcript_hash": "<base64url SHA-256>",
"algorithm_suite": "x25519-hkdf-sha256+ml-kem-768",
"pq_hybrid_scheme": "sadp-ml-kem-768-v0.1",
"pq_kem_ciphertext": "<base64url ML-KEM-768 ct>",
"repair_for_session_id": "<base64url prior session id>",
"repair_epoch": 1
}
initiator_signing_public_key and initiator_signature are REQUIRED.
The PQ fields and repair fields are OPTIONAL.
7.4. Session Transcript
The transcript is a text string: the line SADP session transcript
v0.2, followed by one name:value line per field, in exactly this
order:
scheme, initiator, responder, selected_prekey_id,
selected_prekey_kind, initiator_ephemeral_public_key,
responder_identity_public_key, initiator_signing_public_key,
algorithm_suite, pq_hybrid_scheme, pq_kem_ciphertext,
repair_for_session_id, repair_epoch
Absent optional fields contribute the literal value null.
transcript_hash is the SHA-256 of the transcript string.
Because the algorithm suite and the ML-KEM ciphertext are inside the
transcript, and the transcript is signed, an attacker who strips or
alters the post-quantum component, substitutes a prekey, or replaces
the ephemeral key invalidates the signature. This is the downgrade
binding: no shared-secret material ever appears on the wire, and no
commitment to shared-secret bytes is published. (An earlier profile
revision published a hash commitment to the PQ shared secret; it has
been removed because it added no binding beyond the signed ciphertext
and turned ML-KEM implicit rejection into an observable decapsulation
oracle.)
Atakora Expires 24 March 2027 [Page 15]
Internet-Draft SADP September 2026
7.5. Initiator Authentication
initiator_signature is an Ed25519 signature over the byte string:
"SADP session init signature v0.2\n" || transcript
A responder MUST, before deriving any key material:
1. Recompute the transcript from the envelope fields and verify
transcript_hash.
2. Verify initiator_signature against initiator_signing_public_key.
3. Bind the key to the claimed identity: a responder using a
registry MUST resolve the registered signing key for the
initiator principal and reject the envelope if it differs from
initiator_signing_public_key. Deployments without a registry
MUST surface the observed key to the application for explicit
trust establishment; silent trust-on-first-use is NOT permitted
as a library default.
The responder authenticates implicitly: only the holder of the
private key matching the selected prekey (and, in the hybrid suite,
the ML-KEM decapsulation key) can derive the root key and therefore
read or produce ratchet traffic. This asymmetric design, with
signature-based explicit authentication of the initiator and key-
possession-based implicit authentication of the responder, parallels
the deniability tradeoff discussion in [X3DH]; SADP chooses explicit
initiator authentication because agent workflows require attributable
task submission, and deniability is a non-goal.
7.6. Hybrid Post-Quantum Profile
The hybrid suite x25519-hkdf-sha256+ml-kem-768 follows the
construction pattern of PQXDH [PQXDH]: the initiator encapsulates to
the responder's ML-KEM-768 [FIPS203] encapsulation key, carries the
ciphertext in pq_kem_ciphertext, and the root-key input keying
material becomes the labeled concatenation:
"x25519:" || DH_shared_secret || ";pq:" || ML-KEM_shared_secret
Both components are fixed length, so the labeled concatenation is
injective. The security goal is that an adversary must break both
X25519 and ML-KEM-768 to recover the session root ("harvest-now-
decrypt-later" resistance for recorded traffic). Post-quantum
protection of the ratchet itself (as in [SPQR]) is out of scope for
this revision and identified as future work.
Atakora Expires 24 March 2027 [Page 16]
Internet-Draft SADP September 2026
7.7. Profile Negotiation and Downgrade Rules
Three session-start profiles exist: x25519 (no PQ fields) and
x25519+ml-kem-768, plus a test-only profile that injects an external
PQ secret on both sides for interoperability harnesses and MUST NOT
be enabled in production. Rules:
* A sender MUST prefer the hybrid suite when the selected prekey
bundle carries an ML-KEM encapsulation key, and MUST NOT silently
downgrade; downgrade requires explicit local policy.
* The chosen algorithm_suite is bound in the signed transcript;
responders MUST reject a suite inconsistent with the envelope's
fields.
* Brokers are not negotiators: they store and serve prekey-bundle
fields opaquely after signature validation.
7.8. Session Repair
When a runtime rotates keys or loses state, the initiator starts a
replacement session whose envelope carries repair_for_session_id and
repair_epoch, binding the replacement to the prior session inside the
signed transcript. Responders SHOULD treat repair envelopes for
unknown prior sessions as fresh sessions and MUST NOT allow a repair
to resurrect a revoked runtime.
8. Message Ratchet
The v0.2 message ratchet profile is identified by:
sadp-ratchet-hkdf-chacha20poly1305-v0.2
It is a Double-Ratchet-style construction [DOUBLERATCHET] with per-
direction symmetric chains and X25519 DH ratchet steps.
8.1. Session State
Session state is local-only and MUST NOT be transmitted through a
broker. It comprises the role (initiator or responder), send and
receive chain keys, per-direction chain anchors (the chain key at
counter zero of the current DH epoch), send and receive counters, DH
epoch counters for both directions, the local DH keypair, the last
observed remote DH public key, and a bounded skipped-message-key
cache.
Atakora Expires 24 March 2027 [Page 17]
Internet-Draft SADP September 2026
8.2. Key Derivation
All derivations are HKDF-SHA256 [RFC5869], written below as
HKDF(salt, IKM, info). BE64(x) is the 64-bit big-endian encoding of
x. For a chain key CK, message counter n, and DH epoch e:
message_key(n) = HKDF(CK, BE64(n),
"SADP ratchet message key v0.1" || BE64(n))
next_chain_key = HKDF(CK, "next", "SADP ratchet next chain v0.1")
nonce(n) = HKDF(message_key(n), BE64(n),
"SADP ratchet nonce v0.2") (12 bytes)
A DH ratchet step at epoch e derives the new chain key from the
current epoch's chain anchor CA (not the position-dependent current
chain key, so both peers derive the same value regardless of how many
messages each has processed) and the fresh X25519 shared secret ss:
chain_key(e) = HKDF("SADP DH ratchet step",
CA || ss || BE64(e),
"SADP DH ratchet chain v0.1")
The new chain key also becomes the new epoch's chain anchor. The
AEAD is ChaCha20-Poly1305 [RFC8439]; because each message key is used
for exactly one encryption, nonce uniqueness per key is structural.
Implementations MUST use HKDF and HMAC from audited library
implementations rather than reimplementations, and MUST zeroize chain
keys, chain anchors, message keys, and DH private keys when they are
discarded.
8.3. Message Format
{
"scheme": "sadp-ratchet-hkdf-chacha20poly1305-v0.2",
"session_id": "<base64url>",
"dh_epoch": 1,
"dh_public_key": "<base64url X25519>",
"counter": 0,
"nonce": "<base64url 12 bytes>",
"ciphertext": "<base64url ciphertext || tag>"
}
8.4. Associated Data Binding
The AEAD associated data is:
caller_aad || "\n" ||
"sadp-ratchet-header-v0.2:" || session_id || ":" ||
dh_epoch || ":" || dh_public_key || ":" || counter
Atakora Expires 24 March 2027 [Page 18]
Internet-Draft SADP September 2026
where caller_aad binds capsule metadata (at minimum thread, turn,
from, and to), and an absent dh_public_key contributes the literal
string null. Binding the ratchet header into the AAD makes header
tampering detectable at AEAD verification rather than producing
undefined state transitions.
8.5. Receiver Processing: Verify Before Commit
A receiver MUST process an incoming ratchet message against a working
copy of session state and commit that state only after the AEAD opens
successfully. A message that fails authentication MUST leave session
state exactly as it was, including DH-epoch state and counters. This
rule exists because an earlier revision applied the DH ratchet step
before verification, allowing a single forged header to permanently
desynchronize a session through an unauthenticated denial of service.
Receivers MUST reject replayed (dh_epoch, counter) pairs.
8.6. DH Ratchet Steps and Skipped Keys
Responders perform a send-side DH ratchet on their first reply. When
a receiver observes a new remote dh_public_key, it first derives and
caches message keys for the remaining expected counters of the
current receive chain, so that legitimately delayed messages from the
prior epoch remain decryptable, and then advances the receive chain
to the new epoch. Skipped keys are cached keyed by (dh_epoch,
counter), with a global bound of 64 entries; on overflow the oldest
epoch is evicted first. Cached skipped keys MUST be zeroized on use
or eviction.
9. Single-Capsule Payload Profiles
Two payload profiles exist for capsules outside a ratcheted session;
both are intended for development, fixtures, and first-contact
messages, and ratcheted sessions SHOULD be used for all multi-message
exchanges.
sadp-aead-chacha20poly1305-v0.1: Direct AEAD with a caller-
provisioned 32-byte key, 12-byte nonce, and associated data
binding "sadp-capsule-v0.1:" || capsule_id || ":" || from ||
":" || to.
sadp-pre-ratchet-x25519-hkdf-sha256-v0.1: A fresh sender-ephemeral
Atakora Expires 24 March 2027 [Page 19]
Internet-Draft SADP September 2026
X25519 key against the recipient's static encryption key; the AEAD
key is HKDF-SHA256 over the shared secret with the capsule-
metadata associated data as salt. This profile provides
confidentiality from the broker but neither sender authentication
at the cryptographic layer nor post-compromise recovery, and MUST
NOT be used where those properties are required.
10. Opaque Broker Profile
10.1. Broker Role
A conforming broker MAY route capsule bytes by recipient mailbox,
store them durably, return them in insertion order, delete by capsule
identifier, and inspect the minimal envelope metadata needed for
mailbox behavior. A broker MUST NOT decrypt payloads, mutate capsule
bytes, log payload bytes, or require access to payload keys. The
mailbox interface is:
POST /mailboxes/{recipient}/capsules
GET /mailboxes/{recipient}/capsules
DELETE /mailboxes/{recipient}/capsules/{capsule_id}
GET /mailboxes/{recipient}/receipts
GET /mailboxes/{recipient}/events
POST /mailboxes/{recipient}/policy/send
GET /mailboxes/{recipient}/policy/send
POST /mailboxes/{recipient}/compact
together with registry endpoints for runtime registration, prekey
lookup, one-time prekey publication and inventory, issuer-key lookup,
and revocation.
10.2. Request Authentication
Authenticated broker requests carry:
X-SADP-Principal: agent:contract-reviewer/runtime:prod-a
X-SADP-Request-Id: req_<base64url of 16 random bytes>
X-SADP-Timestamp: <integer epoch seconds>
X-SADP-Audience: <audience the client signed>
X-SADP-Signature: <base64url Ed25519>
The signature scheme is sadp-request-ed25519-v0.2. The signing input
is:
Atakora Expires 24 March 2027 [Page 20]
Internet-Draft SADP September 2026
"SADP broker request v0.2\n" || canonical_json({
"scheme": "sadp-request-ed25519-v0.2",
"principal": principal,
"method": method,
"path": path,
"request_id": request_id,
"body_sha256": SHA-256(body),
"timestamp_epoch_seconds": timestamp,
"audience": audience
})
audience is the broker identifier as the client targets it: the
lowercased scheme, host, and port of the request URL with no trailing
slash. The client declares the audience it signed in the X-SADP-
Audience field; a verifier MAY instead derive candidate audience
values from the request URL it received. The broker verifies the
signature against the registered signing key of the claimed principal
and MUST reject requests whose audience does not match its own
identity (configured explicitly or derived from the request URL).
Binding the audience prevents a signed request captured at one broker
from being replayed at another.
This design is deliberately similar in spirit to HTTP message
signatures [RFC9421]; SADP uses its own canonical-JSON signing input
so that identical logic can run over non-HTTP carriage (Section 12).
10.3. Replay Protection
Brokers MUST reject a request whose timestamp is more than 300
seconds from server time in either direction, and MUST reject a
request whose request_id has been seen from the same principal within
the retention window. The replay cache MUST retain identifiers for
at least twice the timestamp window. request_id MUST be generated
from at least 16 bytes of cryptographically secure randomness;
derivation from request content is forbidden, because deterministic
identifiers turn the replay cache into a false-negative generator for
legitimately repeated operations and a false-positive oracle
otherwise.
10.4. Registration and Proof of Possession
Runtime registration MUST prove possession of the submitted signing
key: the registration record carries a prekey bundle whose signature
is verified against the submitted signing key. A broker MUST apply
the following state rules:
Atakora Expires 24 March 2027 [Page 21]
Internet-Draft SADP September 2026
* Creating a new principal record requires proof of possession, and,
where deployed, transport-level identity: with mutual TLS, the
verified client-certificate leaf MUST carry a URI SAN of the form
sadp-principal:<runtime-principal> matching the submitted
principal.
* Updating an existing record, including publishing new prekeys or
rotating keys, requires an authenticated request under the
currently registered signing key, mutual-TLS identity, or an
administrator signature. Unauthenticated re-registration of an
existing principal MUST be rejected; a registry upsert that
replaces a principal's keys is an account takeover.
* A revoked runtime MUST NOT be re-registerable except by an
administrator.
* Anonymous registration modes are development conveniences and MUST
be explicit opt-in configuration, never a default.
10.5. Authorization Matrix
A broker MUST enforce, per authenticated principal: only the mailbox
principal may read, delete, or compact its mailbox and read its
receipts, events, and send policy; only a runtime may publish its own
prekeys or read its inventory; any active registered principal may
send to an active recipient subject to the recipient's send policy; a
runtime may revoke itself; administrators (a distinct signing key)
may revoke any runtime. A capsule identifier reused with different
bytes MUST be rejected; an exact byte-identical resend MUST be
idempotent.
10.6. Send Policy
Recipients own an allow/deny policy over senders, optionally scoped
by message type, thread, delegated-resource prefix, delegation
status, and fanout count. The v0.2 default remains allow for
compatibility; deployments handling sensitive workloads SHOULD
configure default deny.
10.7. Receipts, Events, and Compaction
Brokers persist delivery receipts and emit mailbox events as an event
stream with durable cursors, supporting both snapshot reads and live
streaming. Replay-cache compaction is available to the mailbox owner
but MUST enforce a minimum retained-identifier floor; a compaction
request below the floor is rejected, because trimming the replay
cache below recent traffic re-opens replay.
Atakora Expires 24 March 2027 [Page 22]
Internet-Draft SADP September 2026
11. Metadata Privacy Considerations
SADP v0.2 is an opaque-payload routing profile, not an anonymity
system. A broker observes sender and recipient principals, capsule
identifiers, capability grant metadata, audit records, sizes, timing,
and registration metadata. It does not observe encrypted task
payload or context plaintext. Deployments for which relationship,
grant, resource-name, or timing metadata is sensitive should apply
the staged hardening profiles, which are informative here:
* M1 (minimization): random opaque capsule identifiers, padded
payload buckets, redacted structured logs, retention limits.
* M2 (sealed batch routing): recipient hints moved out of URL paths,
batched multi-recipient delivery, timing jitter, queue-depth
hiding.
* M3 (pairwise routing identifiers): opaque per-edge mailbox
identifiers replacing stable principal names on routing
operations.
* M4 (sender-hidden delivery): token-based delivery in which the
sender's stable identity appears only inside the encrypted
capsule.
* M5 (traffic-analysis resistance): cover traffic, fixed-size
frames, batched delivery windows, and mix-style relays.
Future wire revisions reserve fields for opaque routing identifiers,
routing epochs, padding policy identifiers, and delivery-token
commitments, authenticated as associated data so endpoints can detect
broker substitution.
12. Transport Adapters
SADP objects are self-contained JSON documents; carriage requires
only that bytes arrive intact.
HTTP: The broker profile of Section 10 is itself an HTTP [RFC9110]
API and is the reference transport.
A2A: An SADP capsule is carried as an opaque payload part inside an
A2A message or task [A2A]. The A2A server routes and manages task
lifecycle without payload visibility. Agent cards MAY advertise
SADP support and registry location.
MCP: An encrypted tool invocation is carried as an SADP tool_call
Atakora Expires 24 March 2027 [Page 23]
Internet-Draft SADP September 2026
capsule inside an MCP [MCP] tool call. The tool runtime, as a
distinct SADP principal, decrypts arguments and encrypts results;
the MCP host sees only capsule bytes. This requires the tool
runtime, not the host, to hold the recipient keys.
Queues and IPC: Any at-least-once byte transport can carry capsules;
receiver-side replay rejection (Section 6.4) makes redelivery
safe.
13. Error Handling
Protocol errors are surfaced as typed conditions, and implementations
MUST distinguish at minimum: validation failures (malformed, expired,
replayed, unknown-critical), authentication failures (signature,
transcript, AEAD), authorization failures (mailbox ownership, send
policy, capability), and availability failures (rate limit, storage).
Brokers MUST NOT reflect payload bytes in error responses. Receivers
MUST treat all AEAD failures identically and without detailed reason
codes on the wire, to avoid oracle behavior.
14. Security Considerations
14.1. What SADP Protects
Against a passive or active broker, queue, gateway, or logging layer,
SADP provides: task and context payload confidentiality (only
intended recipients hold message keys); integrity and authenticity of
capsule payloads and authenticated metadata (signatures, audit
commitments, and AEAD); replay rejection (capsule identifiers,
ratchet counters, request nonces); expiry enforcement; forward
secrecy per message and post-compromise recovery across DH ratchet
steps ([DOUBLERATCHET]); downgrade resistance for the negotiated
suite (signed transcript, Section 7.4); and mailbox-level
authorization with replay-protected request authentication
(Section 10.2).
14.2. What SADP Does Not Protect
SADP does not protect against: a compromised recipient after
decryption; malicious model behavior over legitimately received
plaintext; prompt injection contained in legitimately decrypted
content; collusion among intended recipients; traffic analysis and
relationship, capability, audit, and resource-name metadata in the
v0.2 outer capsule fields (see Section 11); or revocation of data
already disclosed. Deployments MUST NOT represent SADP as an
anonymity system.
Atakora Expires 24 March 2027 [Page 24]
Internet-Draft SADP September 2026
14.3. Initiator and Responder Authentication
The v0.2 handshake authenticates the initiator explicitly by
signature and the responder implicitly by key possession
(Section 7.3). The binding between a signing key and a principal
name is only as strong as the registry's registration proofing
(Section 10.4); deployments that accept anonymous registration have
no principal authentication at all, which is why anonymous modes are
confined to explicit development configuration. Cross-registry
identity, attestation of runtimes, and richer identity proofing are
out of scope and are natural integration points for workload-identity
systems such as SPIFFE [SPIFFE] and the WIMSE architecture work.
14.4. Cryptographic Profile Status
The v0.2 profiles use conservative, widely deployed primitives:
X25519 [RFC7748], Ed25519 [RFC8032], ChaCha20-Poly1305 [RFC8439],
HKDF-SHA256 [RFC5869], SHA-256 [RFC6234], and ML-KEM-768 [FIPS203].
Two cautions are in order. First, the reference implementation's ML-
KEM dependency tracks a library that predates final FIPS 203 test-
vector alignment in some releases; deployments MUST pin a library
version with FIPS 203 final vectors. Second, neither this
specification nor its reference implementation has yet received
independent external cryptographic review; until such review
completes, deployments should treat the protocol as experimental.
The construction deliberately reuses the analyzed shapes of X3DH and
the Double Ratchet to maximize the applicability of existing
analysis, but reuse of shape is not a substitute for review of this
composition.
14.5. Denial of Service
Signed requests with timestamps and nonces bound to a broker audience
limit replay-based abuse; authenticated prekey fetch prevents
anonymous one-time-prekey exhaustion; idempotent capsule posting
bounds duplicate-delivery amplification; and the verify-before-commit
rule (Section 8) prevents forged headers from desynchronizing
sessions. Brokers remain subject to ordinary volumetric denial of
service and SHOULD deploy standard rate limiting per authenticated
principal.
Atakora Expires 24 March 2027 [Page 25]
Internet-Draft SADP September 2026
14.6. Key Compromise
Compromise of a runtime's signing key allows impersonation of that
runtime for new sessions and broker requests until revocation
propagates; it does not retroactively decrypt recorded traffic
(message confidentiality rests on the DH/KEM secrets and ratchet
chains, not the signing key). Compromise of session state exposes
current chain keys; the DH ratchet restores confidentiality after the
next uncompromised ratchet step. Implementations MUST zeroize
retired key material and SHOULD encrypt session stores at rest.
15. IANA Considerations
This document, if published, would request:
* Registration of the media type application/sadp+json for SADP
capsules.
* Creation of an "SADP Scheme Identifiers" registry (Specification
Required) with initial entries for the scheme identifiers defined
in this document and in [I-D.atakora-wimse-sadp-delegation].
* Creation of an "SADP Message Types" registry (Specification
Required) with the initial entries listed in Section 6.
* Registration of the X-SADP-Principal, X-SADP-Request-Id, X-SADP-
Timestamp, X-SADP-Audience, and X-SADP-Signature HTTP field names.
This document makes no request of IANA at Internet-Draft stage.
16. References
16.1. Normative References
[FIPS203] National Institute of Standards and Technology, "Module-
Lattice-Based Key-Encapsulation Mechanism Standard",
NIST FIPS 203, August 2024,
<https://doi.org/10.6028/NIST.FIPS.203>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/rfc/rfc2119>.
[RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet:
Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002,
<https://www.rfc-editor.org/rfc/rfc3339>.
Atakora Expires 24 March 2027 [Page 26]
Internet-Draft SADP September 2026
[RFC5869] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand
Key Derivation Function (HKDF)", RFC 5869,
DOI 10.17487/RFC5869, May 2010,
<https://www.rfc-editor.org/rfc/rfc5869>.
[RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms
(SHA and SHA-based HMAC and HKDF)", RFC 6234,
DOI 10.17487/RFC6234, May 2011,
<https://www.rfc-editor.org/rfc/rfc6234>.
[RFC7748] Langley, A., Hamburg, M., and S. Turner, "Elliptic Curves
for Security", RFC 7748, DOI 10.17487/RFC7748, January
2016, <https://www.rfc-editor.org/rfc/rfc7748>.
[RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital
Signature Algorithm (EdDSA)", RFC 8032,
DOI 10.17487/RFC8032, January 2017,
<https://www.rfc-editor.org/rfc/rfc8032>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/rfc/rfc8174>.
[RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
Interchange Format", STD 90, RFC 8259,
DOI 10.17487/RFC8259, December 2017,
<https://www.rfc-editor.org/rfc/rfc8259>.
[RFC8439] Nir, Y. and A. Langley, "ChaCha20 and Poly1305 for IETF
Protocols", RFC 8439, DOI 10.17487/RFC8439, June 2018,
<https://www.rfc-editor.org/rfc/rfc8439>.
[RFC9110] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
Ed., "HTTP Semantics", STD 97, RFC 9110,
DOI 10.17487/RFC9110, June 2022,
<https://www.rfc-editor.org/rfc/rfc9110>.
16.2. Informative References
[A2A] Agentic AI Foundation / Linux Foundation, "Agent2Agent
(A2A) Protocol Specification", n.d.,
<https://a2a-protocol.org/latest/specification/>.
[BISCUIT] Biscuit project, "Biscuit: Authorization Tokens with
Offline Attenuation", n.d., <https://www.biscuitsec.org/>.
Atakora Expires 24 March 2027 [Page 27]
Internet-Draft SADP September 2026
[DOUBLERATCHET]
Perrin, T. and M. Marlinspike, "The Double Ratchet
Algorithm", November 2016,
<https://signal.org/docs/specifications/doubleratchet/>.
[I-D.asor-wimse-agent-delegation-chain]
"Verifiable Attenuated Delegation for AI Agent Chains",
Work in Progress, Internet-Draft, draft-asor-wimse-agent-
delegation-chain-01, September 2026,
<https://datatracker.ietf.org/doc/draft-asor-wimse-agent-
delegation-chain/>.
[I-D.atakora-wimse-sadp-delegation]
Atakora, H., "SADP Capability Delegation Chains and Scoped
Context Disclosure", Work in Progress, Internet-Draft,
draft-atakora-wimse-sadp-delegation-00, September 2026,
<https://datatracker.ietf.org/doc/html/draft-atakora-
wimse-sadp-delegation-00>.
[I-D.chapman-a2a-mls]
Chapman, C., "End-to-End Encryption and Purpose-Bound
Governance for Agent-to-Agent Messaging", Work in
Progress, Internet-Draft, draft-chapman-a2a-mls, n.d.,
<https://datatracker.ietf.org/doc/draft-chapman-a2a-mls/>.
[I-D.hamr-oauth-agent-delegation]
"An Attenuated Delegation Profile for Automated Agents",
Work in Progress, Internet-Draft, draft-hamr-oauth-agent-
delegation, n.d., <https://datatracker.ietf.org/doc/draft-
hamr-oauth-agent-delegation/>.
[I-D.ietf-mboned-sadp]
"Scoped Address Discovery Protocol", Work in Progress,
Internet-Draft, draft-ietf-mboned-sadp, n.d.,
<https://datatracker.ietf.org/doc/draft-ietf-mboned-
sadp/>.
[I-D.li-oauth-delegated-authorization]
"OAuth 2.0 Delegated Authorization", Work in Progress,
Internet-Draft, draft-li-oauth-delegated-authorization,
n.d., <https://datatracker.ietf.org/doc/draft-li-oauth-
delegated-authorization/>.
[I-D.liu-oauth-chain-delegation]
"OAuth Chain Delegation for AI Agents", Work in Progress,
Internet-Draft, draft-liu-oauth-chain-delegation, n.d.,
<https://datatracker.ietf.org/doc/draft-liu-oauth-chain-
delegation/>.
Atakora Expires 24 March 2027 [Page 28]
Internet-Draft SADP September 2026
[I-D.nelson-agent-delegation-receipts]
"Delegation Receipt Protocol for AI Agent Authorization",
Work in Progress, Internet-Draft, draft-nelson-agent-
delegation-receipts, n.d.,
<https://datatracker.ietf.org/doc/draft-nelson-agent-
delegation-receipts/>.
[I-D.sharif-agent-transport-protocol]
"Agent Transport Protocol: Asynchronous Store-and-Forward
Messaging for Autonomous AI Agents", Work in Progress,
Internet-Draft, draft-sharif-agent-transport-protocol,
n.d., <https://datatracker.ietf.org/doc/draft-sharif-
agent-transport-protocol/>.
[I-D.sharif-attp]
"ATTP: Agent Trust Transport Protocol", Work in Progress,
Internet-Draft, draft-sharif-attp, n.d.,
<https://datatracker.ietf.org/doc/draft-sharif-attp/>.
[I-D.singla-agent-identity-protocol]
"Agent Identity Protocol (AIP): Decentralized Identity and
Delegation for AI Agents", Work in Progress, Internet-
Draft, draft-singla-agent-identity-protocol, n.d.,
<https://datatracker.ietf.org/doc/draft-singla-agent-
identity-protocol/>.
[I-D.vandoulas-aidp]
"Agent Interaction and Delegation Protocol (AIDP)", Work
in Progress, Internet-Draft, draft-vandoulas-aidp, n.d.,
<https://datatracker.ietf.org/doc/draft-vandoulas-aidp/>.
[MACAROONS]
Birgisson, A., Politz, J. G., Erlingsson, U., Taly, A.,
Vrable, M., and M. Lentczner, "Macaroons: Cookies with
Contextual Caveats for Decentralized Authorization in the
Cloud", NDSS 2014, 2014,
<https://research.google/pubs/pub41892/>.
[MCP] Model Context Protocol project, "Model Context Protocol
Specification", June 2025,
<https://modelcontextprotocol.io/
specification/2025-06-18>.
[PQXDH] Kret, E. and R. Schmidt, "The PQXDH Key Agreement
Protocol", September 2023,
<https://signal.org/docs/specifications/pqxdh/>.
Atakora Expires 24 March 2027 [Page 29]
Internet-Draft SADP September 2026
[RFC8693] Jones, M., Nadalin, A., Campbell, B., Ed., Bradley, J.,
and C. Mortimore, "OAuth 2.0 Token Exchange", RFC 8693,
DOI 10.17487/RFC8693, January 2020,
<https://www.rfc-editor.org/rfc/rfc8693>.
[RFC8785] Rundgren, A., Jordan, B., and S. Erdtman, "JSON
Canonicalization Scheme (JCS)", RFC 8785,
DOI 10.17487/RFC8785, June 2020,
<https://www.rfc-editor.org/rfc/rfc8785>.
[RFC9420] Barnes, R., Beurdouche, B., Robert, R., Millican, J.,
Omara, E., and K. Cohn-Gordon, "The Messaging Layer
Security (MLS) Protocol", RFC 9420, DOI 10.17487/RFC9420,
July 2023, <https://www.rfc-editor.org/rfc/rfc9420>.
[RFC9421] Backman, A., Ed., Richer, J., Ed., and M. Sporny, "HTTP
Message Signatures", RFC 9421, DOI 10.17487/RFC9421,
February 2024, <https://www.rfc-editor.org/rfc/rfc9421>.
[RFC9635] Richer, J., Ed. and F. Imbault, "Grant Negotiation and
Authorization Protocol (GNAP)", RFC 9635,
DOI 10.17487/RFC9635, October 2024,
<https://www.rfc-editor.org/rfc/rfc9635>.
[SAGA2025] Syros, G., Suri, A., Nita-Rotaru, C., and A. Oprea, "SAGA:
A Security Architecture for Governing AI Agentic Systems",
April 2025, <https://arxiv.org/abs/2504.21034>.
[SESAME] Marlinspike, M. and T. Perrin, "The Sesame Algorithm:
Session Management for Asynchronous Message Encryption",
April 2017,
<https://signal.org/docs/specifications/sesame/>.
[SLIM] AGNTCY Project, Linux Foundation, "SLIM: Secure Low-
Latency Interactive Messaging for Agents", n.d.,
<https://slim.agntcy.org/>.
[SOUTH2025]
South, T., Marro, S., Hardjono, T., Mahari, R., and A.
Pentland, "Authenticated Delegation and Authorized AI
Agents", January 2025, <https://arxiv.org/abs/2501.09674>.
[SPIFFE] SPIFFE Project, Cloud Native Computing Foundation, "Secure
Production Identity Framework for Everyone (SPIFFE)",
n.d., <https://spiffe.io/>.
[SPQR] Signal Messenger, "Signal Protocol and Post-Quantum
Ratchets", October 2025, <https://signal.org/blog/spqr/>.
Atakora Expires 24 March 2027 [Page 30]
Internet-Draft SADP September 2026
[UCAN] UCAN Working Group, "User Controlled Authorization
Networks (UCAN) Specification", n.d.,
<https://github.com/ucan-wg/spec>.
[X3DH] Marlinspike, M. and T. Perrin, "The X3DH Key Agreement
Protocol", November 2016,
<https://signal.org/docs/specifications/x3dh/>.
Appendix A. Example Exchange
The following abbreviated flow shows a user tasking an agent through
an untrusted broker. Keys and ciphertexts are truncated.
Runtime registration (authenticated; proof of possession via the
signed prekey bundle):
POST /registry/runtimes
X-SADP-Principal: agent:contract-reviewer/runtime:prod-a
X-SADP-Request-Id: req_kf93hHW0aQx7Zp2Lw1VtBg
X-SADP-Timestamp: 1789819200
X-SADP-Audience: https://broker.example.com:443
X-SADP-Signature: rV8kQx3Tn...
{ "principal": "agent:contract-reviewer/runtime:prod-a",
"signing_public_key": "hzT4...",
"encryption_public_key": "9aK2...",
"ml_kem768_encapsulation_key": "pQ77...",
"prekey_id": "prekey_agent_a_1", ... , "signature": "yGd1..." }
Sender fetches a prekey bundle (authenticated), initiates a session,
and posts the first capsule:
Atakora Expires 24 March 2027 [Page 31]
Internet-Draft SADP September 2026
POST /mailboxes/agent:contract-reviewer%2Fruntime:prod-a/capsules
X-SADP-Principal: user:alice/device:phone
...
{ "version": "sadp/0.1",
"type": "task_create",
"capsule_id": "cap_01J...",
"task_id": "task_01J...",
"thread_id": "thread_01J...",
"from": "user:alice/device:phone",
"to": "agent:contract-reviewer/runtime:prod-a",
"created_at": "2026-09-19T12:00:00Z",
"expires_at": "2026-09-19T13:00:00Z",
"critical": ["capabilities", "audit"],
"capabilities": [ { ...signed grant, see companion document... } ],
"audit": { ...hash-chain record, see companion document... },
"session_init": {
"scheme": "sadp-session-init-x25519-hkdf-sha256-v0.2",
"initiator": "user:alice/device:phone",
"responder": "agent:contract-reviewer/runtime:prod-a",
"initiator_ephemeral_public_key": "b7Qe...",
"initiator_signing_public_key": "Nc2w...",
"initiator_signature": "8fWq...",
"algorithm_suite": "x25519-hkdf-sha256+ml-kem-768",
"pq_kem_ciphertext": "R2m8...", ... },
"encrypted_payload": {
"scheme": "sadp-ratchet-hkdf-chacha20poly1305-v0.2",
"session_id": "tPq1...", "dh_epoch": 0,
"dh_public_key": "aW3k...", "counter": 0,
"nonce": "kQ9v...", "ciphertext": "..." } }
The recipient authenticates its mailbox read, validates per
Section 6.4 (including capability-chain and audit checks from the
companion document), verifies the signed session init, derives the
root key, decrypts, executes or delegates the task, and replies with
a task_result capsule on the same thread, advancing the ratchet.
Appendix B. Cryptographic Profile Summary
+============+=========================+===========================+
| Purpose | Scheme identifier | Primitives |
+============+=========================+===========================+
| Session | sadp-session-init- | X25519, HKDF-SHA256, |
| init | x25519-hkdf-sha256-v0.2 | Ed25519, SHA-256 |
+------------+-------------------------+---------------------------+
| PQ hybrid | sadp-ml-kem-768-v0.1 | ML-KEM-768 |
+------------+-------------------------+---------------------------+
| Ratchet | sadp-ratchet-hkdf- | HKDF-SHA256, |
Atakora Expires 24 March 2027 [Page 32]
Internet-Draft SADP September 2026
| | chacha20poly1305-v0.2 | ChaCha20-Poly1305, X25519 |
+------------+-------------------------+---------------------------+
| Single- | sadp-aead- | ChaCha20-Poly1305 |
| capsule | chacha20poly1305-v0.1 | |
| AEAD | | |
+------------+-------------------------+---------------------------+
| Pre- | sadp-pre-ratchet- | X25519, HKDF-SHA256, |
| ratchet | x25519-hkdf-sha256-v0.1 | ChaCha20-Poly1305 |
| payload | | |
+------------+-------------------------+---------------------------+
| Capability | sadp-cap-ed25519-v0.2 | Ed25519, SHA-256 |
| grants | | (companion document) |
+------------+-------------------------+---------------------------+
| Prekey | sadp-prekey- | Ed25519 |
| bundles | ed25519-v0.1 | |
+------------+-------------------------+---------------------------+
| Broker | sadp-request- | Ed25519, SHA-256 |
| requests | ed25519-v0.2 | |
+------------+-------------------------+---------------------------+
Table 1
Acknowledgments
The session and ratchet design follows the public Signal protocol
specifications [X3DH] [DOUBLERATCHET] [SESAME] [PQXDH], and this
document's threat framing benefited from prior work on encrypted
agent messaging [I-D.chapman-a2a-mls] [SLIM] and agent delegation
[I-D.asor-wimse-agent-delegation-chain] [SOUTH2025] [SAGA2025].
Author's Address
Hamdy Atakora
Imara Labs
United States
Email: hatakora@imaralabs.dev
Atakora Expires 24 March 2027 [Page 33]