Internet-Draft Remote Attestation Extensions for EST November 2026
Novak, et al. Expires 6 May 2027 [Page]
Workgroup:
Limited Additional Mechanisms for PKIX and SMIME
Internet-Draft:
draft-novak-lamps-tacra-est-01
Published:
Intended Status:
Informational
Expires:
Authors:
M. Novak
J.P. Morgan Chase & Co.
M. Richardson
Sandelman Software Works
H. Birkholz
Fraunhofer SIT
S. Nikolaichuk
The Capital Index LLC

Remote Attestation Extensions for EST

Abstract

This document specifies extensions to Enrollment over Secure Transport (EST) that realize the Trustworthy Acquisition of Credentials via Remote Attestation (TACRA) architecture. Remote Attestation Procedures (RATS) are used as an authorization input for workload credential provisioning.

Two modes are defined:

  1. Enrollment: the Attester submits a PKCS#10 CSR and Evidence. A Credential Authority, as RATS Relying Party, authorizes issuance from Attestation Results and binds the credential to the CSR key.

  2. Retrieval: the Attester submits Evidence that includes a Credential Encryption Key (CEK). A Secret Vault, as RATS Relying Party, releases an existing credential bundle with secrets encrypted to CEKpub.

These extensions add EST resources for a two-leg exchange: optional attest-initiate, followed by either attest-enroll or attest-retrieve.

This memo is informational and intended to support discussion and implementation experience. It is not a completed interoperability specification.

About This Document

This note is to be removed before publishing as an RFC.

The latest revision of this draft can be found at https://TheBankster.github.io/lamps-tacra-est/draft-novak-lamps-tacra-est.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-novak-lamps-tacra-est/.

Discussion of this document takes place on the Limited Additional Mechanisms for PKIX and SMIME Working Group mailing list (mailto:spasm@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/spasm/. Subscribe at https://www.ietf.org/mailman/listinfo/spasm/.

Source for this draft and an issue tracker can be found at https://github.com/TheBankster/lamps-tacra-est.

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 6 May 2027.

▲

Table of Contents

1. Introduction

EST ([RFC7030]) defines an HTTPS-based protocol for certificate enrollment and management, typically between an EST Client and an EST Server acting as an interface to a Credential Authority. In modern environments (e.g., cloud, containers, confidential computing), workloads often lack pre-provisioned credentials and require issuance based on runtime properties. Zero trust environments place additional restrictions limiting which parties have access to secrets and credentials. This means that EST Clients and Servers may not be trusted to handle such restricted information in plaintext.

RATS ([RFC9334]) defines an architecture and roles for Remote Attestation. This document extends EST to match the TACRA [TACRA] architecture: the Attester generates keys, Evidence, and CSRs; the EST Client and EST Server are conduits that carry them to a Verifier and a RATS Relying Party (RRP) ([INTERACTION-MODELS], Section 10 of [RFC9334], [ATTESTATION-FRESHNESS]). The RRP in this case is either a Secret Vault, where pre-provisioned credentials are stored, or a Credential Authority capable of creating new ones.

Two modes are defined:

  1. Enrollment: issuance of a fresh credential bound to a workload-generated Credential Signing Key (CSK)

  2. Retrieval: release of a shared credential bundle, with secrets encrypted to an attester-supplied Credential Encryption Key (CEK)

2. Conventions and Definitions

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.

2.1. RATS Entities

  • Attester: the workload instance producing Evidence

  • Verifier: the component that appraises Evidence and produces Attestation Results

  • RATS Relying Party (RRP): consumes Attestation Results to make an authorization decision; in the context of this document, the authorization decision pertains to issuing new or releasing existing credentials to the Attester

2.2. TACRA Entities

  • CAS: Credential Acquisition System

  • RATS-Unaware Relying Party (RUP): authenticates the Attester using credentials issued by or retrieved from the RRP

2.3. EST Entities

  • EST Client: TACRA CAS Client for EST. Renders Attester payloads as EST requests, and EST Server responses as payloads to the Attester.

  • EST Server: TACRA CAS Server for EST. Forwards Freshness Handles, Evidence, Attestation Results, CSRs, and encrypted material between the EST Client, the Verifier, and a RATS Relying Party (Credential Authority or Secret Vault).

2.4. Artifacts

  • Evidence: attestation evidence produced by the Attester

  • Attestation Results: RATS Verifier output

  • CSR: PKCS#10 certification request

  • PoP: proof-of-possession of the private key corresponding to the CSR public key

  • CEK: Credential Encryption Key; when used, CEKpub is carried in Evidence, the response is encrypted to CEKpub

  • Credential Bundle: the plaintext the Secret Vault seals (Section "Sealing the Released Credential" of [TACRA]): credential items with their attributes, and metadata

  • Container: the sealed object that carries a Credential Bundle to the Attester, the EncryptedCredentialBundle of that section, which this profile returns as the response of attest-retrieve (Section 9.2.4)

  • Credential Hint: optional, implementation-defined information supplied by the Attester about the credential it expects. The Credential Authority or Secret Vault MAY use the hint, ignore it, or reject the request. The hint does not authorize issuance or release.

  • Freshness Kind: the recency method, one of absent-timestamp, absent-none, absent-epoch, present-nonce or present-epoch ([TACRA])

  • Freshness Handle: the value attest-initiate returns for present-nonce and present-epoch ([TACRA], [INTERACTION-MODELS])

  • Freshness element: the octets the binding digest covers ([TACRA]): the Freshness Handle, the Attester's timestamp, a locally held epoch marker, or nothing for absent-none. On attest-enroll and attest-retrieve it is the handle member, when present

3. Architecture

The EST encoding is the same in the Passport model and in the Background Check model. The Attester does not talk to the Verifier and does not hold Attestation Results (Design Goal 8 of [TACRA]). This profile uses the names of [TACRA]:

In [RFC9334], the Passport model is where the Attester obtains the Attestation Results from the Verifier and sends them to the Relying Party. Under TACRA, the Attester always uses the Background Check model. The difference between the two models is whether the EST Server or the RATS Relying Party obtains the Attestation Results from the Verifier. Who originates a Freshness Handle, the Verifier or the RATS Relying Party, is independent of that split ([TACRA]). Only the Passport model is illustrated.

Both models use two EST legs: optional attest-initiate (Section 5.1), followed by either attest-enroll (Section 5.2) or attest-retrieve (Section 5.3). Note that attest-initiate is optional: in cases where the Attester can know with certainty which Freshness Kind to use (and that the Freshness Kind is not either present-nonce or present-epoch), whether to ask for new or existing credentials, as well as which ciphers the RRP expects, it can be omitted.

Neither EST Client nor EST Server has a RATS role. Both are subject to the following restrictions:

3.1. Attested Enrollment Mode

                                                       +----------+
                                                       | Verifier |
                                                       +----^-----+
+----------+ (1) +-------------+ (2) +------------+  (3,6)  |
| Attester +-----> EST Client  +-----> EST Server +---------+
+----------+ (4) +-------------+ (5) +------------+   (7)   |
                                                      +-----v------+
                                                      | Credential |
                                                      | Authority  |
                                                      +------------+
Figure 1: Attested Enrollment Mode (Passport)
  1. Attester initiates Remote Attestation

  2. EST Client forwards to EST Server (attest-initiate)

  3. If Freshness is required: EST Server obtains Freshness from the Verifier or RATS Relying Party and returns it via the EST Client

  4. Attester generates CSK, CSR, and Evidence bound to the CSR and Freshness

  5. EST Client POSTs CSR and Evidence (attest-enroll)

  6. EST Server forwards Evidence to the Verifier

  7. EST Server forwards CSR and Attestation Results to the Credential Authority, which verifies PoP and authorizes issuance; the credential is returned to the Attester via the EST Client

3.2. Attested Retrieval Mode

                                                       +----------+
                                                       | Verifier |
                                                       +----^-----+
+----------+ (1) +-------------+ (2) +------------+  (3,6)  |
| Attester +-----> EST Client  +-----> EST Server +---------+
+----------+ (4) +-------------+ (5) +------------+   (7)   |
                                                       +----v-----+
                                                       |  Secret  |
                                                       |  Vault   |
                                                       +----------+
Figure 2: Attested Retrieval Mode (Passport)
  1. Attester initiates Remote Attestation

  2. EST Client forwards to EST Server (attest-initiate)

  3. If Freshness is required: EST Server obtains Freshness from the Verifier or RATS Relying Party and returns it via the EST Client

  4. Attester generates CEK and Evidence including CEKpub, bound to Freshness

  5. EST Client POSTs Evidence (attest-retrieve)

  6. EST Server forwards Evidence to the Verifier

  7. EST Server forwards Attestation Results to the Secret Vault, which seals the matching Credential Bundle to CEKpub in a container. The EST Server, through the EST Client, returns that container to the Attester, which checks it and decrypts it with CEKpri.

4. Protocol Overview

Three new EST operations are added under the EST well-known prefix (Section 3.2.2 of [RFC7030]):

  1. /.well-known/est/attest-initiate

  2. /.well-known/est/attest-enroll

  3. /.well-known/est/attest-retrieve

They sit beside the operations of [RFC7030]. An EST Server that uses the optional path segment of Section 3.2.2 of [RFC7030], /.well-known/est/arbitraryLabel1/simpleenroll for instance, MUST offer the attest-* operations under that segment as well, /.well-known/est/arbitraryLabel1/attest-initiate and likewise for the other two. As that section requires, it serves them without the segment too. The label MUST NOT be attest-initiate, attest-enroll or attest-retrieve. The segment selects the Credential Authority or Secret Vault the EST Server uses, as it selects a CA in [RFC7030]. It is not the Target, which stays the target query parameter or member ([TACRA]). For attest-* the client uses the same segment it uses for simpleenroll at that issuer. Example exchanges are in Appendix A. They support TACRA Initiate-Credential-Acquisition, Enroll-Credential, and Retrieve-Credential [TACRA] commands, encoded with EST semantics.

All exchanges MUST use HTTPS as required by [RFC7030]. EST Server authentication via TLS is REQUIRED.

5. Resources and Methods

5.1. attest-initiate

The first leg of both modes is where the Attester initiates Remote Attestation by invoking the EST Client.

  • Method: GET

  • Request: no body; query parameters target (REQUIRED) and credential_type and credential_hint (OPTIONAL)

  • Success: 200 OK

  • Response: AttestationInitiationResponse (Section 8.1): Freshness kind, Credential Acquisition Mode (enroll or retrieve), acceptable ciphers

  • Error: 400 when target is absent or credential_type is not a token of Section 8.3, 404 when the EST Server does not serve that Target, 403 when the RATS Relying Party does not serve that Credential Type for it, 400 or 403 for a Credential Hint the policy does not know or denies (Section 10)

Query parameters:

  • target: the Target of Initiate-Credential-Acquisition (Section 5.1 of [TACRA]), an octet string. In this profile a configured name is UTF-8 in Normalization Form C ([RFC5198]), a URI for instance. The client percent-encodes that string in the query. The EST Server decodes it and compares the octets.

  • credential_type: the Credential Type the Attester plans to use with this Target (Section 8.3). If omitted, the EST Server returns the mode and algorithms its policy sets for the Target. The second leg then MAY omit credential_type or name the Credential Type those imply. When attest-initiate named one, the second leg of the same present-nonce exchange MUST name the same token (Section 9.1.4, Section 9.2.5).

  • credential_hint: the Credential Hint of Initiate-Credential-Acquisition (Section 5.1 of [TACRA]). The client percent-encodes the string in the query, as for target. If omitted, the second leg MAY omit credential_hint or name one. When attest-initiate named one, the second leg of the same present-nonce exchange MUST name the same string (Section 9.1.4, Section 9.2.5).

  • If the EST Client already knows all the information the Attester needs to proceed, i.e., it is already configured for an absent Freshness kind (absent-timestamp, absent-none, or absent-epoch), and it knows what Credential Acquisition Mode is expected, and which ciphers to use, it MAY complete attest-initiate locally and, in that case, MUST NOT contact the EST Server.

  • The EST Server, if contacted, obtains the Freshness Kind and Handle, if any, from the configured Verifier or RATS Relying Party and returns that result.

  • For present-nonce, that GET returns a single-use Handle its originator minted, and the EST Server records it for the correlation of Section 9.1.4 and Section 9.2.5, as the nonce resource of [ATTESTATION-FRESHNESS] associates its nonce with the next request (Section 6).

  • present-nonce and present-epoch MUST include a Freshness Handle from the party chosen by the EST Server. absent-* Freshness Kinds carry no Freshness Handle.

  • The EST Client forwards the response to the Attester.

  • The Attester produces Evidence as the Freshness Kind requires.

  • The EST Client then POSTs attest-enroll or attest-retrieve as the Attester indicates.

A Credential Authority or Secret Vault issues or releases credentials for a Target per its policy for that Target, since the Target only recognizes credentials from an issuer it already trusts. The Target itself takes no part in this profile: it is the RATS-unaware Relying Party of [TACRA], named in the request and in the binding. If the second leg fails because a present-epoch moved or a present-nonce is no longer valid, the Attester retries attest-initiate.

5.2. attest-enroll

  • Method: POST

  • Request: AttestedEnrollmentRequest (Section 9.1.1): CSR and Evidence

  • Success: 200 OK

  • Response: enrollment response as for simpleenroll (Section 4.2.3 of [RFC7030])

5.3. attest-retrieve

6. Relationship to Other LAMPS Work

Two LAMPS documents cover parts of the exchange defined here.

[ATTESTATION-FRESHNESS] defines a nonce request and response for certificate management protocols, including an EST resource at /.well-known/est/nonce (GET, or POST with application/est-attestation-freshness+json) whose response carries a nonce of 8 to 64 bytes and an OPTIONAL expiry in seconds (Section 5.1 of [ATTESTATION-FRESHNESS]). attest-initiate (Section 5.1) is the first leg that returns the Freshness Handle: such a nonce for present-nonce, the current epoch marker for present-epoch, and none for the absent-* kinds. It returns in addition the Freshness Kind itself, the Credential Acquisition Mode and the acceptable CSK or CEK algorithms (Section 8.1), none of which the nonce resource carries. A present-nonce Handle of this profile is a nonce as [TACRA] specifies: 16 to 64 octets, at least 128 bits of entropy, issued once and not reused. That range lies within the 8 to 64 octets of Section 5.1 of [ATTESTATION-FRESHNESS]. expires_in is that document's expiry. That section requires the server to associate the nonce with the subsequent request. This profile does so by correlating the Handle with the attest-initiate that returned it, in the server processing of both modes, and by the RATS Relying Party's recomputation of the digest that carries the Handle (Section 8.2). It does not use a TLS session or a cookie for that: either would bind the EST Client, the conduit, and not the Attester. A request of this profile takes no nonce length: the Handle reaches the Evidence through the digest, so no platform needs a Handle of a particular size. An EST Server MAY offer both resources. They are not interchangeable: a nonce returned by the nonce resource is not a Freshness Handle of this profile, and attest-enroll and attest-retrieve take a Handle from attest-initiate, or none for the absent-* kinds.

[CSR-ATTEST] conveys attestations inside the CSR, in its id-aa-attestation attribute. It makes the Certification Authority or Registration Authority that processes the CSR responsible for ensuring that the binding between those attestations and the CSR's public key has been validated (Section 6.1 of [CSR-ATTEST]). This profile conveys the Evidence that carries the binding of [TACRA] beside the CSR, in the AttestedEnrollmentRequest (Section 9.1.1). That Evidence is produced over the digest of Section 8.2, which includes the finished CSR, so it cannot travel inside it, and [CSR-ATTEST] does not replace it. Evidence beside the CSR is what this profile requires. Attestations in the CSR as well, per [CSR-ATTEST], are a second attestation, optional, about properties of the CSR key that this digest does not prove, under the rules of [TACRA] and of Section 6.1 of [CSR-ATTEST]. Whether a Credential Authority requires them is agreed out of band. This choice is specific to Enrollment; Retrieval has no CSR and binds Evidence to CEKpub (Section 9.2.2).

7. Media Types and Encodings

The messages of the attest-* resources are JSON ([RFC8259]), as defined in CDDL ([RFC8610]) in Section 7.1; implementations MUST support this encoding. A CBOR encoding, for EST over secure CoAP ([RFC9148]), is left for future work. Evidence is an opaque byte string.

As each EST message type has its own media type (Section 3.2.4 of [RFC7030]), so does each JSON message of the attest-* resources (Section 13):

Table 1: Media types of the attest-* messages
Resource Request Response
attest-initiate none: a GET, query string, no body application/est-attest-initiate+json
attest-enroll application/est-attest-enroll+json application/pkcs7-mime; smime-type=certs-only, as simpleenroll
attest-retrieve application/est-attest-retrieve+json application/est-attest-bundle+json

A client MUST send a POST of the resource's media type. An attest-initiate GET has no body; the client SHOULD set Accept to application/est-attest-initiate+json. An attest-initiate GET for present-nonce is not idempotent: each one returns a Handle its originator issued anew, as the nonce resource of [ATTESTATION-FRESHNESS] does. An EST Server responds to a request of another media type with 415 (Unsupported Media Type) and SHOULD name the resource's media type in an Accept header field (Section 15.5.16 of [RFC9110]).

7.1. Message Definitions

In the definitions below, a byte string is carried as a text string holding its unpadded base64url encoding (Section 5 of [RFC4648]), as the control operator .b64u defines it (Section 2.1 of [RFC9741]): only characters of the base64url alphabet, no padding, and the bits that encode no octet set to zero. The group choices tie each member to the Freshness Kinds and modes its description below names: in a response, handle and expires_in to present-nonce and present-epoch, max_age to absent-timestamp, acceptable_csk to enroll and acceptable_cek to retrieve; in a request, handle to every Freshness Kind but absent-none. The container of attest-retrieve is the encrypted-credential-bundle of [TACRA], with its plaintext, and is not repeated here.

; The JSON messages of the attest-* resources (RFC 8610; RFC 8259).
; A byte string is carried as a text string holding its unpadded
; base64url encoding (RFC 4648, Section 5), as the control .b64u of
; RFC 9741 defines.

attestation-initiation-response = {
  initiation-freshness,
  initiation-mode,
  ? acceptable_evidence: [+ text],
}

initiation-freshness = (
  freshness_kind: "present-nonce",
  handle: text .b64u (bytes .size (16..64)),
  ? expires_in: uint,
//
  freshness_kind: "present-epoch",
  handle: text .b64u (bytes .size (8..64)),
  ? expires_in: uint,
//
  freshness_kind: "absent-timestamp",
  ? max_age: uint,
//
  freshness_kind: "absent-epoch" / "absent-none",
)

initiation-mode = (
  mode: "enroll",
  acceptable_csk: [+ text],
//
  mode: "retrieve",
  acceptable_cek: [+ text],
)

attested-enrollment-request = {
  request-common,
  request-freshness,
  csr: text .b64u bytes,
}

attested-retrieval-request = {
  request-common,
  request-freshness,
  cek_pub: text .b64u bytes,
}

request-common = (
  target: text,
  ? credential_type: text,
  evidence: text .b64u bytes,
  ? profile: text,
  binding: binding,
  ? credential_hint: text,
)

request-freshness = (
  freshness_kind: "absent-none"
//
  freshness_kind: "absent-timestamp",
  handle: text .b64u (bytes .size 8),
//
  freshness_kind: "absent-epoch" / "present-epoch",
  handle: text .b64u (bytes .size (8..64)),
//
  freshness_kind: "present-nonce",
  handle: text .b64u (bytes .size (16..64)),
)

binding = {
  method: "binding-input",
  hash: "sha512",
}

8. Common Structures

8.1. AttestationInitiationResponse

Fields:

  • freshness_kind (string, REQUIRED): one of the Freshness Kinds of [TACRA]

    • absent-timestamp: stamp Evidence from a trusted clock

    • absent-none: no freshness claim

    • absent-epoch: embed an epoch marker already held locally

    • present-nonce: single-use Freshness Handle; embed it in Evidence

    • present-epoch: current epoch marker as Freshness Handle; embed it in Evidence; retry attest-initiate if the epoch moved

  • handle (bytes, 16 to 64 octets for present-nonce, 8 to 64 for present-epoch): Freshness Handle, REQUIRED for present-nonce and present-epoch, and MUST be absent otherwise (Section 5.1). A present-nonce Handle is a nonce as [TACRA] specifies: 16 to 64 octets, at least 128 bits of entropy, issued once and not reused.

  • expires_in (integer, OPTIONAL): seconds until a present-nonce or present-epoch Handle is no longer valid, the expiry of [ATTESTATION-FRESHNESS]. The Handle originator SHOULD NOT set it below 60 seconds ([TACRA]).

  • max_age (integer, OPTIONAL): for absent-timestamp, the maximum Evidence age in seconds acceptable to the Verifier or RATS Relying Party

  • mode (string, REQUIRED): enroll or retrieve

  • acceptable_cek (array, REQUIRED when mode is retrieve and absent otherwise): the CEK suites the Secret Vault accepts, tokens of Section 8.4, at least one

  • acceptable_csk (array, REQUIRED when mode is enroll and absent otherwise): the CSK algorithms the Credential Authority accepts, tokens of Section 8.4, at least one

  • acceptable_evidence (array, OPTIONAL): the Evidence formats the EST Server forwards, each named by its media type (Section 8.4). A request of the second leg MUST name the format of its Evidence in profile, one of them. When the list is absent, or attest-initiate was completed locally, the EST Client sends no profile

For present-nonce, the Freshness Handle originator MUST ensure uniqueness and MUST correlate the second-leg request with the Handle from this attest-initiate. For present-epoch, it checks that the Handle is still the current epoch marker ([TACRA]). The Verifier appraises whether Evidence is bound to a still-valid Freshness Handle.

8.2. The Binding in This Profile

This profile uses the digest of Section "Binding Credential Keys to Evidence" of [TACRA]. The Attester writes that digest into the freshness input of its Evidence, the Direct form of that section. The Verifier reports the value it read. The Credential Authority or the Secret Vault recomputes the digest from the request and refuses the request with 400 Bad Request unless the two are equal.

The three octet strings of that construction are, in this profile:

  • freshness: the freshness element of the request, the octets of handle. For present-nonce and present-epoch that is the Freshness Handle attest-initiate returned. For absent-epoch it is the epoch marker the Attester holds. For absent-timestamp it is the Attester's timestamp, 8 octets, as [TACRA] encodes it. For absent-none it is empty, and handle is absent.

  • target: the octets of the target member, the Target octet string of [TACRA], neither recoded nor normalized. The member carries the same string as the Target of the attest-initiate, on the wire or completed locally.

  • subject: for Enrollment, the DER encoding of the PKCS#10 CSR, the octets of csr. For Retrieval, CEKpub as the request carries it, the octets of cek_pub, in the encoding of its KEM in Section "Sealing the Released Credential" of [TACRA].

The digest is SHA-512, as [TACRA] sets for a freshness input of 64 octets, which REPORT_DATA of AMD SEV-SNP and REPORTDATA of Intel TDX are. A platform whose freshness input is not 64 octets is outside this document's mandatory method.

The binding object (Section 7.1) carries no octets of its own. It names the method and the hash:

  • method (string, REQUIRED): binding-input, the construction above and the only method this document defines.

  • hash (string, REQUIRED): sha512.

A Credential Authority or Secret Vault that does not recognize method refuses the request with 400 Bad Request.

8.3. Credential Type Tokens

credential_type, on attest-initiate and in both requests, takes one of the Credential Type tokens of [TACRA], which this profile uses as follows:

  • x509: an X.509 certificate ([RFC5280]). Enrollment mints one. Retrieval MAY return one that was issued before.

  • wic: a WIMSE Workload Identity Certificate (Section 6.1 of [WIMSE]), an X.509 certificate whose Workload Identifier is its one URI SubjectAltName. Enrollment mints one, and the Credential Authority sets the Workload Identifier under its policy, as it sets the subject names of any certificate it issues. Retrieval MAY return one that was issued before.

  • wit: a WIMSE Workload Identity Token ([WIMSE]). Retrieval only.

  • jwt: a JSON Web Token used as a bearer token ([RFC7519]). Retrieval only.

  • api-key: an API key. Retrieval only.

  • psk: a pre-shared symmetric key. Retrieval only.

  • private-key: a private key shared by the instances of a replicated service. Retrieval only, under the conditions of Section 11.

attest-enroll mints x509 or wic. A credential_type other than these on attest-enroll is a Credential Type the RATS Relying Party does not serve, and the EST Server refuses the request with 403 Forbidden (Section 10). When credential_type is absent, on attest-enroll and on attest-retrieve alike, the client takes what the RATS Relying Party issues or releases under its policy. A client that needs a Credential Type names it. attest-retrieve MAY carry any token above. The Secret Vault selects what it releases from the Attestation Results, its policy and the Credential Hint. Where the request names a credential_type, it releases that Credential Type or refuses the request. A Credential Type the RATS Relying Party does not serve is refused with 403 Forbidden, and the response names the Credential Types it serves for that target (Section 10). A credential_type that is not a token of this section is refused with 400 Bad Request.

8.4. Protocol Tokens

acceptable_csk, acceptable_cek and acceptable_evidence are arrays of ASCII tokens, and profile is one such token. This document defines them. Further tokens, for other CSK algorithms, digests and freshness inputs, are left for a later revision.

CSK algorithms, for Enrollment:

  • ecdsa-p256-sha256: ECDSA on P-256 with SHA-256, the signature of the CSR. Implementations MUST support it.

CEK suites, for Retrieval: the HPKE suites of the container of [TACRA], each named by its KEM, its KDF and its AEAD as the HPKE registries name them ([RFC9180]), joined with +:

  • DHKEM(P-256, HKDF-SHA256)+HKDF-SHA256+AES-256-GCM: the mandatory suite of [TACRA]. Implementations MUST support it.

  • MLKEM768-P256+HKDF-SHA256+AES-256-GCM: the suite with the hybrid KEM of [HPKE-PQ], which a Secret Vault MAY offer where a released secret must stay confidential against a later quantum computer.

A Credential Authority or Secret Vault names in acceptable_csk or acceptable_cek the tokens it accepts, and the Attester generates its key for one of them.

Evidence formats: the media type of the Evidence, in the format the Verifier recognizes, for example application/vnd.veraison.tsm-report+cbor.

A client MUST NOT use a token the attest-initiate response did not list. A client that completed attest-initiate locally uses the tokens its configuration names.

9. Attested Credential Acquisition Modes

9.1. Credential Enrollment Mode

9.1.1. Request: AttestedEnrollmentRequest

Fields:

  • target (string, REQUIRED): the Target of Enroll-Credential (Section 5.2 of [TACRA])

  • freshness_kind (string, REQUIRED): MUST match the preceding attest-initiate response, or the configuration under which the EST Client completed attest-initiate locally (Section 5.1)

  • handle (bytes): the freshness element (Section 8.2) - REQUIRED when freshness_kind is not absent-none and MUST be absent otherwise. For present-nonce and present-epoch it MUST equal the Freshness Handle returned by attest-initiate. For absent-timestamp it is the 8-octet timestamp and for absent-epoch the locally held epoch marker. Its size is 16 to 64 octets for present-nonce, 8 to 64 for present-epoch and absent-epoch, and 8 for absent-timestamp (Section 7.1).

  • csr (bytes, REQUIRED): DER-encoded PKCS#10 CSR

  • evidence (bytes, REQUIRED): MUST be bound to the Freshness returned by attest-initiate, if any

  • profile (string, OPTIONAL): the media type of evidence, one of the acceptable_evidence of the attest-initiate (Section 8.1). It MUST be absent when that response carried no acceptable_evidence or attest-initiate was completed locally, and MUST be one of the listed tokens otherwise. The EST Server refuses another value with 415 Unsupported Media Type, as a format it does not accept. If absent, the EST Server forwards the Evidence as it is, and the Verifier recognizes its format. A format the EST Server does not accept is refused with 415 Unsupported Media Type.

  • binding (object, REQUIRED): declares how the CSR key is bound to Evidence

  • credential_type (string, OPTIONAL): x509 or wic (Section 8.3). If absent, the client takes what the Credential Authority mints. When the attest-initiate of a present-nonce exchange named a credential_type, this member MUST carry the same token (Section 9.1.4).

  • credential_hint (string, OPTIONAL): Credential Hint supplied by the Attester; the Credential Authority MAY use it, ignore it, or reject the request. When the attest-initiate of a present-nonce exchange named a credential_hint, this member MUST carry the same string (Section 9.1.4).

9.1.2. Response (Success)

On success, the EST Server returns the enrollment response produced by the Credential Authority, as for simpleenroll in [RFC7030].

9.1.3. Key Binding and PoP Requirements

  1. PoP: The Credential Authority MUST verify possession of the CSR private key.

  2. Evidence-to-CSR, Evidence-to-Target and Evidence-to-Freshness: the Evidence MUST carry the digest of Section 8.2, the binding of Section "Binding Credential Keys to Evidence" of [TACRA], with the DER-encoded CSR as its subject. As that section requires, the Verifier reports the bound value in the Attestation Results, and the Credential Authority recomputes it from the request and refuses the request with 400 Bad Request on a mismatch. A substituted CSR, Target or freshness element fails that check.

The binding object (Section 7.1) is as Section 8.2 defines it.

9.1.4. Enrollment Server Processing

Upon receiving AttestedEnrollmentRequest, the EST Server MUST:

  1. Validate syntax, media type, and size limits.

  2. Check that a Credential Authority serves this target and credential_type, and that the mode the EST Server's configuration sets for them, which attest-initiate reports (Section 8.1), is enroll. Refuse the request with 400 Bad Request when a Secret Vault serves them.

  3. For present-nonce, correlate handle with the attest-initiate that returned it. Refuse the request with 400 Bad Request when no attest-initiate returned this Handle, when it has expired or was used before, or when its target or freshness_kind differ from the corresponding attest-initiate. Refuse it likewise when that attest-initiate named a credential_type and the request omits it or names another token, or named a credential_hint and the request omits it or names another string. A request MAY name a credential_type its attest-initiate omitted, the one the mode and the algorithms returned imply. A request MAY name a credential_hint its attest-initiate omitted. A present-nonce Handle is single-use. For present-epoch, handle is the epoch marker that every attest-initiate of the epoch returned for this target, and it serves all requests during that epoch. Refuse the request with 400 Bad Request when the marker has moved. For the absent-* Freshness Kinds no Handle was returned, and the RATS Relying Party checks the freshness element under the Freshness Kind its policy sets for the Target ([TACRA]). For present-epoch and the absent-* Freshness Kinds the EST Server does not correlate credential_type or credential_hint and forwards them to the RATS Relying Party, which decides under its policy (Section 8.3). This correlation keeps the two legs of one exchange together at the EST Server. It is not authorization: the Credential Authority takes the Freshness Kind from its policy for the Target, recomputes the digest and decides ([TACRA]).

  4. Passport: forward Evidence to the Verifier and obtain Attestation Results. Background Check: skip this step; the Credential Authority obtains Attestation Results itself.

  5. Forward the CSR and Attestation Results (Passport) or the CSR and Evidence (Background Check) to the Credential Authority, which verifies PoP and authorizes issuance.

  6. Return the Credential Authority's enrollment response.

The Credential Authority MUST NOT mint identities (e.g., DNS names) beyond policy for the attested identity context.

9.2. Credential Retrieval Mode

9.2.1. Request: AttestedRetrievalRequest

Fields:

  • target (string, REQUIRED): the Target of Retrieve-Credential (Section 5.3 of [TACRA])

  • freshness_kind (string, REQUIRED): MUST match the preceding attest-initiate response, or the configuration under which the EST Client completed attest-initiate locally (Section 5.1)

  • handle (bytes): the freshness element (Section 8.2) - REQUIRED when freshness_kind is not absent-none and MUST be absent otherwise. For present-nonce and present-epoch it MUST equal the Freshness Handle returned by attest-initiate. For absent-timestamp it is the 8-octet timestamp and for absent-epoch the locally held epoch marker. Its size is 16 to 64 octets for present-nonce, 8 to 64 for present-epoch and absent-epoch, and 8 for absent-timestamp (Section 7.1).

  • evidence (bytes, REQUIRED) -- MUST include CEKpub; MUST be bound to the Freshness returned by attest-initiate, if any

  • cek_pub (bytes, REQUIRED): CEKpub in the encoding of its KEM in Section "Sealing the Released Credential" of [TACRA], to which the Secret Vault seals the bundle

  • profile (string, OPTIONAL): the media type of evidence, one of the acceptable_evidence of the attest-initiate (Section 8.1). It MUST be absent when that response carried no acceptable_evidence or attest-initiate was completed locally, and MUST be one of the listed tokens otherwise. The EST Server refuses another value with 415 Unsupported Media Type, as a format it does not accept. If absent, the EST Server forwards the Evidence as it is, and the Verifier recognizes its format. A format the EST Server does not accept is refused with 415 Unsupported Media Type.

  • binding (object, REQUIRED): declares how CEKpub is bound to Evidence

  • credential_type (string, OPTIONAL): one of the tokens of Section 8.3. If absent, the client takes what the Secret Vault releases. When the attest-initiate of a present-nonce exchange named a credential_type, this member MUST carry the same token (Section 9.2.5).

  • credential_hint (string, OPTIONAL): Credential Hint supplied by the Attester; the RATS Relying Party (Secret Vault or Credential Authority) MAY use it, ignore it, or reject the request. When the attest-initiate of a present-nonce exchange named a credential_hint, this member MUST carry the same string (Section 9.2.5).

9.2.2. Evidence-to-CEK Binding

The Evidence MUST carry the digest of Section 8.2 with the octets of cek_pub as its subject. As Section "Binding Credential Keys to Evidence" of [TACRA] requires, the Verifier reports the bound value in the Attestation Results, and the Secret Vault recomputes it from the request and denies release with 400 Bad Request on a mismatch. The binding object is as Section 8.2 defines it.

9.2.3. Credential Group ID Determination

The Secret Vault maps Attestation Results to a credential group, as [TACRA] requires: stable for replica workloads, and distinct across security domains, tenants and the credentials it releases. The mapping is the Secret Vault's policy. This profile does not specify the construction of group_id, and different Secret Vaults need not compute the same value. credential_hint MAY select among the credentials the policy allows for the attested context and MUST NOT enlarge that set. A Credential Hint the policy does not know is ignored, or the request is refused with 400 Bad Request. The group_id the container carries (Section 9.2.4) is the one the Secret Vault chose, an opaque string to everyone else.

9.2.4. Response: EncryptedCredentialBundle

The EST Server returns the container the Secret Vault produced, the encrypted-credential-bundle of Section "Sealing the Released Credential" of [TACRA], as the body of media type application/est-attest-bundle+json. The EST Client and the EST Server MUST treat it as opaque. That section specifies the container: its members, its suites, the info and the associated data of its HPKE sealing, and its plaintext, the Credential Bundle. In its aad, target is the base64url of the Target octets of the request, the octets of the target member of Section 5.3. This profile adds nothing to it. The Secret Vault names in acceptable_cek the suites it accepts (Section 8.4), the mandatory suite of [TACRA] among them, and the Attester generates its CEK for one of them.

The Attester proceeds as [TACRA] requires: it checks that aad names its Target, its freshness element and its Credential Hint, checks the suite, and only then opens the ciphertext. It MUST refuse the container otherwise. Who sealed the container, the Attester cannot tell: anyone who saw CEKpub can seal to it. This profile accepts that, and Section 11 states the consequence.

9.2.5. Retrieval Server Processing

Upon receiving AttestedRetrievalRequest, the EST Server MUST:

  1. Validate syntax, media type, and size limits.

  2. Check that a Secret Vault serves this target and credential_type, and that the mode the EST Server's configuration sets for them, which attest-initiate reports (Section 8.1), is retrieve. Refuse the request with 400 Bad Request when a Credential Authority serves them.

  3. For present-nonce, correlate handle with the attest-initiate that returned it, as in Enrollment. Refuse the request with 400 Bad Request when no attest-initiate returned this Handle, when it has expired or was used before, or when its target or freshness_kind differ from the corresponding attest-initiate. Refuse it likewise when that attest-initiate named a credential_type and the request omits it or names another token, or named a credential_hint and the request omits it or names another string. A request MAY name a credential_type its attest-initiate omitted, the one the mode and the algorithms returned imply. A request MAY name a credential_hint its attest-initiate omitted. A present-nonce Handle is single-use. For present-epoch, handle is the epoch marker that every attest-initiate of the epoch returned for this target, and it serves all requests during that epoch. Refuse the request with 400 Bad Request when the marker has moved. For the absent-* Freshness Kinds no Handle was returned, and the RATS Relying Party checks the freshness element under the Freshness Kind its policy sets for the Target ([TACRA]). For present-epoch and the absent-* Freshness Kinds the EST Server does not correlate credential_type or credential_hint and forwards them to the RATS Relying Party, which decides under its policy (Section 8.3). This correlation keeps the two legs of one exchange together at the EST Server. It is not authorization: the Secret Vault takes the Freshness Kind from its policy for the Target, recomputes the digest and decides ([TACRA]).

  4. Passport: forward Evidence to the Verifier and obtain Attestation Results. Background Check: skip this step; the Secret Vault obtains Attestation Results itself.

  5. Forward Attestation Results (Passport) or Evidence (Background Check) to the Secret Vault, which computes group_id, authorizes, fetches the bundle and seals it to CEKpub (Section 9.2.4).

  6. Return the EncryptedCredentialBundle produced by the Secret Vault.

A variant in which the EST Server receives a plaintext secret from the Secret Vault and seals it to CEKpub itself is not permitted: it would expose the secret to the EST Server ([TACRA]).

10. Error Handling

An error response carries one of the status codes below, and a human-readable body of media type text/plain, as a simpleenroll error does (Section 4.2.3 of [RFC7030], updated by Section 5.1 of [RFC8951]):

A client acts on the status code. A machine-readable body ([RFC9457]) is left for a revision in which a client needs the reason.

Error bodies MUST NOT leak sensitive attestation details. Servers MAY provide a correlation identifier for debugging.

11. Security Considerations

11.1. Specific to Attested Enrollment Mode

  • Key Substitution: attestation success is not sufficient without Evidence-to-CSR binding and PoP

  • Identity Over-Issuance: Credential Authority policy must constrain subject/SAN to the attested identity context

11.2. Specific to Attested Retrieval Mode

  • Shared Signing Key distribution: If the credential bundle includes a private signing key shared across replicas, compromise of one replica compromises the group. This mode SHOULD be restricted to environments where unwrap and key use are strongly protected.

  • Non-Exportability Requirements: Deployments that transport a signing key SHOULD require Evidence to attest that CEKpri is non-exportable and that decryption/unwrapping occurs only within an approved protected environment (e.g., TEE/TPM-sealed key usage).

  • Origin of the container: the EST Client and the EST Server saw CEKpub and can return a container of their own, sealed to it. The Secret Vault's secret stays confidential: a container the Secret Vault sealed can only be unsealed with CEKpri, and one created by the EST Client or the EST Server will not authenticate the Attester to the Target. This profile accepts that risk, and the Trust Model of [TACRA] states what follows by Credential Type.

  • Attribution: Shared keys eliminate per-instance attribution. If accountability is required, consider per-instance keys with identical identity claims, or a centralized signing service.

11.3. Common to Both Modes

  • Freshness: the Freshness Kinds and the freshness element are those of [TACRA], built on the recency methods of Section 10 of [RFC9334]. A present-* Handle comes from the Verifier or the RATS Relying Party, a timestamp from the Attester's clock, and an epoch marker from a local hold or a returned Handle. Evidence MUST carry the freshness element in the binding (Section 8.2). The originator of a Handle MUST reject present-nonce reuse and a stale present-epoch.

  • Evidence and Attestation Results: the EST Client and the EST Server see Evidence and, in the Passport model, Attestation Results in plaintext (Section 12.2 of [RFC9334], the Trust Model of [TACRA]). A retrieved secret stays inside the EncryptedCredentialBundle (Section 9.2.4), an enrolled certificate is public, and CSKpri and CEKpri never leave the Attester.

  • Channel binding: the digest of Section 8.2 binds no TLS session and no Credential Authority or Secret Vault. It binds the Target name, so an EST Server can relay the exchange to another RATS Relying Party that serves the same Target, and that party recomputes the same digest. What it obtains, and that Evidence can reach any RATS Relying Party, is in the Trust Model of [TACRA]. A TLS channel binding would have to reach the Attester from the EST Client, which this architecture does not assume (Design Goal 8 of [TACRA]), so this profile puts none in the Evidence.

  • Client authentication: [TACRA] leaves the authentication of the EST Client to the EST Server to profiles. This profile requires none for the attest-* resources: Remote Attestation authenticates the Attester, and the EST Client holds no credential of its own. A deployment MAY require TLS client authentication on them, as on simpleenroll (Section 3.3 of [RFC7030]). An EST Server that returns present-nonce Handles on an unauthenticated attest-initiate SHOULD rate-limit those requests and cap the Handles outstanding per client.

  • The channels from the EST Server to the Verifier and to the Credential Authority or Secret Vault MUST provide integrity, authenticity, and replay protection.

  • The EST Server SHOULD enforce size and rate limits on Evidence.

  • The Credential Type and the Credential Hint are not in the binding. The RATS Relying Party decides by its policy what it issues or releases for them. The EST Server's correlation of a present-nonce Handle with its attest-initiate only checks that the second leg does not change a credential_type or credential_hint the attest-initiate named, and authorizes nothing ([TACRA]).

  • If classic EST and attested resources both exist, the RATS Relying Party MUST be able to require attestation. The EST Server MUST NOT substitute a classic EST operation for an attested request.

12. Privacy Considerations

Evidence can identify the device, its firmware level and the launched software (Section 11 of [RFC9334]). The EST Client, the EST Server, the Verifier and the RATS Relying Party see it. The Trust Model of [TACRA] states what the EST Client and the EST Server read, and a deployment that operates them accepts that exposure. Error bodies MUST NOT echo Evidence or Attestation Results.

13. IANA Considerations

The attest-* resources are additional services of an EST server (Section 3.2.2 of [RFC7030]), under the well-known URI suffix "est" that [RFC7030] registered. No registry of EST operation paths exists, so none is requested.

IANA is requested to register the media types of Section 7 in the "Media Types" registry ([RFC6838]).

The operation names this document adds are attest-initiate, attest-enroll and attest-retrieve.

13.1. application/est-attest-initiate+json

Type name:

application

Subtype name:

est-attest-initiate+json

Required parameters:

N/A

Optional parameters:

N/A

Encoding considerations:

binary

Security considerations:

See Section 11 of this document.

Interoperability considerations:

The response of attest-initiate.

Published specification:

This document.

Applications that use this media type:

EST implementations of the attest-* resources of this document.

Fragment identifier considerations:

The syntax and semantics of fragment identifiers are as specified for "application/json". At publication of this specification, no fragment identification syntax is defined for "application/json".

Additional information:

Deprecated alias names for this type: N/A; Magic number(s): N/A; File extension(s): N/A; Macintosh file type code(s): N/A

Person & email address to contact for further information:

Mark F. Novak mark.f.novak@jpmchase.com

Intended usage:

COMMON

Restrictions on usage:

N/A

Author:

See the Authors' Addresses section of this document.

Change controller:

IESG

13.2. application/est-attest-enroll+json

Type name:

application

Subtype name:

est-attest-enroll+json

Required parameters:

N/A

Optional parameters:

N/A

Encoding considerations:

binary

Security considerations:

See Section 11 of this document.

Interoperability considerations:

The request of attest-enroll; its response is that of simpleenroll.

Published specification:

This document.

Applications that use this media type:

EST implementations of the attest-* resources of this document.

Fragment identifier considerations:

The syntax and semantics of fragment identifiers are as specified for "application/json". At publication of this specification, no fragment identification syntax is defined for "application/json".

Additional information:

Deprecated alias names for this type: N/A; Magic number(s): N/A; File extension(s): N/A; Macintosh file type code(s): N/A

Person & email address to contact for further information:

Mark F. Novak mark.f.novak@jpmchase.com

Intended usage:

COMMON

Restrictions on usage:

N/A

Author:

See the Authors' Addresses section of this document.

Change controller:

IESG

13.3. application/est-attest-retrieve+json

Type name:

application

Subtype name:

est-attest-retrieve+json

Required parameters:

N/A

Optional parameters:

N/A

Encoding considerations:

binary

Security considerations:

See Section 11 of this document.

Interoperability considerations:

The request of attest-retrieve; its response is application/est-attest-bundle+json.

Published specification:

This document.

Applications that use this media type:

EST implementations of the attest-* resources of this document.

Fragment identifier considerations:

The syntax and semantics of fragment identifiers are as specified for "application/json". At publication of this specification, no fragment identification syntax is defined for "application/json".

Additional information:

Deprecated alias names for this type: N/A; Magic number(s): N/A; File extension(s): N/A; Macintosh file type code(s): N/A

Person & email address to contact for further information:

Mark F. Novak mark.f.novak@jpmchase.com

Intended usage:

COMMON

Restrictions on usage:

N/A

Author:

See the Authors' Addresses section of this document.

Change controller:

IESG

13.4. application/est-attest-bundle+json

Type name:

application

Subtype name:

est-attest-bundle+json

Required parameters:

N/A

Optional parameters:

N/A

Encoding considerations:

binary

Security considerations:

See Section 11 of this document.

Interoperability considerations:

The response of attest-retrieve, the EncryptedCredentialBundle (Section 9.2.4). The JSON object is the encrypted-credential-bundle that [TACRA] specifies.

Published specification:

This document.

Applications that use this media type:

EST implementations of the attest-* resources of this document.

Fragment identifier considerations:

The syntax and semantics of fragment identifiers are as specified for "application/json". At publication of this specification, no fragment identification syntax is defined for "application/json".

Additional information:

Deprecated alias names for this type: N/A; Magic number(s): N/A; File extension(s): N/A; Macintosh file type code(s): N/A

Person & email address to contact for further information:

Mark F. Novak mark.f.novak@jpmchase.com

Intended usage:

COMMON

Restrictions on usage:

N/A

Author:

See the Authors' Addresses section of this document.

Change controller:

IESG

14. References

14.1. Normative References

[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC4648]
Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", RFC 4648, DOI 10.17487/RFC4648, , <https://www.rfc-editor.org/rfc/rfc4648>.
[RFC5198]
Klensin, J. and M. Padlipsky, "Unicode Format for Network Interchange", RFC 5198, DOI 10.17487/RFC5198, , <https://www.rfc-editor.org/rfc/rfc5198>.
[RFC6838]
Freed, N., Klensin, J., and T. Hansen, "Media Type Specifications and Registration Procedures", BCP 13, RFC 6838, DOI 10.17487/RFC6838, , <https://www.rfc-editor.org/rfc/rfc6838>.
[RFC7030]
Pritikin, M., Ed., Yee, P., Ed., and D. Harkins, Ed., "Enrollment over Secure Transport", RFC 7030, DOI 10.17487/RFC7030, , <https://www.rfc-editor.org/rfc/rfc7030>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <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, , <https://www.rfc-editor.org/rfc/rfc8259>.
[RFC8610]
Birkholz, H., Vigano, C., and C. Bormann, "Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610, , <https://www.rfc-editor.org/rfc/rfc8610>.
[RFC8951]
Richardson, M., Werner, T., and W. Pan, "Clarification of Enrollment over Secure Transport (EST): Transfer Encodings and ASN.1", RFC 8951, DOI 10.17487/RFC8951, , <https://www.rfc-editor.org/rfc/rfc8951>.
[RFC9110]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., "HTTP Semantics", STD 97, RFC 9110, DOI 10.17487/RFC9110, , <https://www.rfc-editor.org/rfc/rfc9110>.
[RFC9180]
Barnes, R., Bhargavan, K., Lipp, B., and C. Wood, "Hybrid Public Key Encryption", RFC 9180, DOI 10.17487/RFC9180, , <https://www.rfc-editor.org/rfc/rfc9180>.
[RFC9334]
Birkholz, H., Thaler, D., Richardson, M., Smith, N., and W. Pan, "Remote ATtestation procedureS (RATS) Architecture", RFC 9334, DOI 10.17487/RFC9334, , <https://www.rfc-editor.org/rfc/rfc9334>.
[RFC9741]
Bormann, C., "Concise Data Definition Language (CDDL): Additional Control Operators for the Conversion and Processing of Text", RFC 9741, DOI 10.17487/RFC9741, , <https://www.rfc-editor.org/rfc/rfc9741>.

14.2. Informative References

[ATTESTATION-FRESHNESS]
Tschofenig, H., Brockhaus, H., Mandel, J., and S. Turner, "Requesting a Freshness Nonce for Attestation Evidence in Certificate Signing Requests", Work in Progress, Internet-Draft, draft-ietf-lamps-attestation-freshness-09, , <https://datatracker.ietf.org/doc/html/draft-ietf-lamps-attestation-freshness-09>.
[CSR-ATTEST]
Ounsworth, M., Tschofenig, H., Birkholz, H., Wiseman, M., and N. Smith, "Use of Remote Attestation with Certification Signing Requests", Work in Progress, Internet-Draft, draft-ietf-lamps-csr-attestation-32, , <https://datatracker.ietf.org/doc/html/draft-ietf-lamps-csr-attestation-32>.
[HPKE-PQ]
Barnes, R. and D. Connolly, "Post-Quantum and Post-Quantum/Traditional Hybrid Algorithms for HPKE", Work in Progress, Internet-Draft, draft-ietf-hpke-pq-05, , <https://datatracker.ietf.org/doc/html/draft-ietf-hpke-pq-05>.
[INTERACTION-MODELS]
Birkholz, H., Eckel, M., Pan, W., and E. Voit, "Reference Interaction Models for Remote Attestation Procedures", Work in Progress, Internet-Draft, draft-ietf-rats-reference-interaction-models-20, , <https://datatracker.ietf.org/doc/html/draft-ietf-rats-reference-interaction-models-20>.
[RFC5280]
Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, "Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, , <https://www.rfc-editor.org/rfc/rfc5280>.
[RFC6585]
Nottingham, M. and R. Fielding, "Additional HTTP Status Codes", RFC 6585, DOI 10.17487/RFC6585, , <https://www.rfc-editor.org/rfc/rfc6585>.
[RFC7519]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, , <https://www.rfc-editor.org/rfc/rfc7519>.
[RFC8792]
Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, "Handling Long Lines in Content of Internet-Drafts and RFCs", RFC 8792, DOI 10.17487/RFC8792, , <https://www.rfc-editor.org/rfc/rfc8792>.
[RFC9148]
van der Stok, P., Kampanakis, P., Richardson, M., and S. Raza, "EST-coaps: Enrollment over Secure Transport with the Secure Constrained Application Protocol", RFC 9148, DOI 10.17487/RFC9148, , <https://www.rfc-editor.org/rfc/rfc9148>.
[RFC9457]
Nottingham, M., Wilde, E., and S. Dalal, "Problem Details for HTTP APIs", RFC 9457, DOI 10.17487/RFC9457, , <https://www.rfc-editor.org/rfc/rfc9457>.
[TACRA]
Novak, M., Richardson, M., Birkholz, H., and S. Nikolaichuk, "Trustworthy Acquisition of Credentials via Remote Attestation", Work in Progress, Internet-Draft, draft-novak-rats-tacra-03, , <https://datatracker.ietf.org/doc/html/draft-novak-rats-tacra-03>.
[TWISIGDef]
Confidential Computing Consortium Trustworthy Workload Identity SIG, "Trustworthy Workload Identity (TWI) Special Interest Group - Definitions", n.d., <https://github.com/confidential-computing/twi/blob/main/TWI_Definitions.md>.
[TWISIGReq]
Confidential Computing Consortium Trustworthy Workload Identity SIG, "Trustworthy Workload Identity (TWI) Special Interest Group - Requirements", n.d., <https://github.com/confidential-computing/twi/blob/main/TWI_Requirements.md>.
[WIMSE]
Campbell, B., Salowey, J. A., Schwenkschuster, A., Sheffer, Y., and Y. Rosomakho, "WIMSE Workload Credentials", Work in Progress, Internet-Draft, draft-ietf-wimse-workload-creds-03, , <https://datatracker.ietf.org/doc/html/draft-ietf-wimse-workload-creds-03>.

Appendix A. Example Messages

These examples are informative. They are exchanges recorded on 29 October 2026 between an EST Client and an EST Server that implement this profile, on an AMD SEV-SNP guest, with the mandatory CEK suite. The Targets, the Handles and the structures are as they crossed the wire, with long base64url values shortened to their first 24 characters and marked .... An EST Server that uses a path segment of Section 3.2.2 of [RFC7030] serves the same resources under it, /.well-known/est/arbitraryLabel1/attest-initiate for instance. The Host header names the EST Server as this document's examples do. Lines longer than 69 characters are folded as [RFC8792] describes.

A.1. attest-initiate for Enrollment

NOTE: '\' line wrapping per RFC 8792

GET /.well-known/est/attest-initiate?credential_type=x509&\
    credential_hint=payments.workload.tacra.example&target=https%3A%\
    2F%2Fdb-nonce.tacra.example HTTP/1.1
Host: est.tacra.example
Accept: application/est-attest-initiate+json

HTTP/1.1 200 OK
Content-Type: application/est-attest-initiate+json

{
  "freshness_kind": "present-nonce",
  "handle": "JguWe4G_4VRGo0tZY4URL8xT...",
  "expires_in": 300,
  "acceptable_evidence": [
    "application/vnd.veraison.tsm-report+cbor"
  ],
  "acceptable_csk": [
    "ecdsa-p256-sha256"
  ],
  "mode": "enroll"
}

A.2. attest-enroll

POST /.well-known/est/attest-enroll HTTP/1.1
Host: est.tacra.example
Content-Type: application/est-attest-enroll+json

{
  "target": "https://db-nonce.tacra.example",
  "credential_type": "x509",
  "freshness_kind": "present-nonce",
  "handle": "JguWe4G_4VRGo0tZY4URL8xT...",
  "csr": "MIHkMIGMAgEAMCoxKDAmBgNV...",
  "evidence": "o2dhdXhibG9iWRKbY9p1jeZk...",
  "binding": {
    "method": "binding-input",
    "hash": "sha512"
  },
  "profile": "application/vnd.veraison.tsm-report+cbor",
  "credential_hint": "payments.workload.tacra.example"
}

HTTP/1.1 200 OK
Content-Type: application/pkcs7-mime; smime-type=certs-only

MIICswYJKoZIhvcNAQcCoIICpDCCAqACAQExADAL...

A.3. attest-initiate for Retrieval

NOTE: '\' line wrapping per RFC 8792

GET /.well-known/est/attest-initiate?credential_type=api-key&\
    credential_hint=payments.workload.tacra.example&target=https%3A%\
    2F%2Fledger-nonce.tacra.example HTTP/1.1
Host: est.tacra.example
Accept: application/est-attest-initiate+json

HTTP/1.1 200 OK
Content-Type: application/est-attest-initiate+json

{
  "freshness_kind": "present-nonce",
  "handle": "JRAAJxYwTJ-tsqU1Kqk_PQpA...",
  "expires_in": 300,
  "acceptable_evidence": [
    "application/vnd.veraison.tsm-report+cbor"
  ],
  "acceptable_cek": [
    "DHKEM(P-256, HKDF-SHA256)+HKDF-SHA256+AES-256-GCM"
  ],
  "mode": "retrieve"
}

A.4. attest-retrieve

NOTE: '\' line wrapping per RFC 8792

POST /.well-known/est/attest-retrieve HTTP/1.1
Host: est.tacra.example
Content-Type: application/est-attest-retrieve+json

{
  "target": "https://ledger-nonce.tacra.example",
  "credential_type": "api-key",
  "freshness_kind": "present-nonce",
  "handle": "JRAAJxYwTJ-tsqU1Kqk_PQpA...",
  "cek_pub": "MFkwEwYHKoZIzj0CAQYIKoZI...",
  "evidence": "o2dhdXhibG9iWRKbY9p1jeZk...",
  "binding": {
    "method": "binding-input",
    "hash": "sha512"
  },
  "profile": "application/vnd.veraison.tsm-report+cbor",
  "credential_hint": "payments.workload.tacra.example"
}

HTTP/1.1 200 OK
Content-Type: application/est-attest-bundle+json

{
  "container": "hpke-base",
  "suite": {
    "kem": "DHKEM(P-256, HKDF-SHA256)",
    "kdf": "HKDF-SHA256",
    "aead": "AES-256-GCM"
  },
  "enc": "BFR-7sH5nfSJ7HuGs5K0dydE...",
  "ciphertext": "FrhDDRwvpBSZgk-1tjX-IBHR...",
  "aad": {
    "group_id": "0156b1ec5fc72a6ccc6c04b33e23cb114c9e19979cd3fe68bdd\
    7e9495544a46c",
    "target": "aHR0cHM6Ly9sZWRnZXItbm9uY2UudGFjcmEuZXhhbXBsZQ",
    "handle": "JRAAJxYwTJ-tsqU1Kqk_PQpA...",
    "credential_hint": "payments.workload.tacra.example"
  }
}

Acknowledgments

The authors thank the Confidential Computing Consortium's Trustworthy Workload Identity (TWI) Special Interest Group ([TWISIGDef], [TWISIGReq]) for creating the TACRA architecture.

Authors' Addresses

Mark F. Novak
J.P. Morgan Chase & Co.
Michael Richardson
Sandelman Software Works
Henk Birkholz
Fraunhofer SIT
Serhii Nikolaichuk
The Capital Index LLC