From: Jiri Pirko <jiri@resnulli.us>
To: linux-coco@lists.linux.dev
Cc: linux-kernel@vger.kernel.org, linux-api@vger.kernel.org,
x86@kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org,
jgg@ziepe.ca, david.quigley@intel.com, lukas@wunner.de,
ksinyuk@kernel.org, rodrigo.vivi@intel.com,
cedric.xing@intel.com, sameo@meta.com, drdeeglaze@gmail.com,
James.Bottomley@HansenPartnership.com, aik@amd.com,
jpiotrowski@nvidia.com, qinkun@google.com, pgonda@google.com,
jic23@kernel.org, alistair.francis@wdc.com, ankita@nvidia.com,
suzuki.poulose@arm.com, kas@kernel.org,
rick.p.edgecombe@intel.com, elena.reshetova@intel.com,
dave.hansen@linux.intel.com,
sathyanarayanan.kuppuswamy@linux.intel.com, peter.fang@intel.com,
jarkko@kernel.org, zohar@linux.ibm.com, yeoreum.yun@arm.com,
aneesh.kumar@kernel.org, dave.jiang@intel.com,
nik.borisov@suse.com, sergii.dmytruk@3mdeb.com
Subject: [PATCH RFC v2 1/9] attestation: Add the base family specification and generated files
Date: Fri, 13 Nov 2026 17:08:30 +0100 [thread overview]
Message-ID: <20261113160838.2512652-2-jiri@resnulli.us> (raw)
In-Reply-To: <20261113160838.2512652-1-jiri@resnulli.us>
From: Jiri Pirko <jiri@nvidia.com>
Define the base attestation family. Reserve its family ID and add the
ABI snapshot, registry entry and generated kernel and UAPI files.
The ABI is intentionally specification-first. The generated descriptor
is linked after the provider and operation handlers arrive.
Assisted-by: Cursor: GPT-5.6 Sol
Assisted-by: Cursor: Claude Opus 5.5
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
RFC->RFCv2:
- dropped the MR log ops and the sets, groups and attrs only they use
- dropped the family's priv lifecycle hooks
- made the hash algorithm attrs an enum of <linux/hash_info.h>
- replaced the blob class and representation with an evidence class,
signed or event-log
- dropped max-total-output-length
- renamed stubs to extension points
- commented the values, operations and fields
- wrote the spec as op trees and records
- reported each signed object's challenge lengths, in bytes, as a list
of up to 8 lengths and ranges
- let evidence-get omit the challenge
- took output blobs of any length
- merged mr-dump into mr-get, a query whose id is an optional filter
- listed an MR's banks in the provider's order, each once
- let mr-extend extend some of an MR's banks
- dropped the MR read caps, as every MR can be read
- numbered every enum member and flag bit
- moved the generated UAPI headers to include/uapi/ctlv/
- documented every item of the spec
- put each field's doc above its generated helpers
- said that every evidence-get produces new evidence
- replaced the format strings with the evidence-format enum and the
evidence-vendor-format enum extension point
- named an evidence-get object by its ID
- said message instead of wire
- bounded an MR's banks by hash-algo, not a number
---
Documentation/ctlv/abi/ctlv-attestation.yaml | 147 +++++++++++
Documentation/ctlv/abi/families.registry.yaml | 1 +
Documentation/ctlv/families.yaml | 1 +
Documentation/ctlv/generated-files.yaml | 7 +
.../ctlv/specs/ctlv-attestation.yaml | 181 ++++++++++++++
MAINTAINERS | 9 +
.../generated/ctlv_attestation_gen.c | 179 ++++++++++++++
.../generated/ctlv_attestation_gen.h | 204 +++++++++++++++
include/uapi/ctlv/ctlv_attestation_gen.h | 234 ++++++++++++++++++
include/uapi/ctlv/ctlv_families_gen.h | 1 +
10 files changed, 964 insertions(+)
create mode 100644 Documentation/ctlv/abi/ctlv-attestation.yaml
create mode 100644 Documentation/ctlv/specs/ctlv-attestation.yaml
create mode 100644 drivers/attestation/generated/ctlv_attestation_gen.c
create mode 100644 drivers/attestation/generated/ctlv_attestation_gen.h
create mode 100644 include/uapi/ctlv/ctlv_attestation_gen.h
diff --git a/Documentation/ctlv/abi/ctlv-attestation.yaml b/Documentation/ctlv/abi/ctlv-attestation.yaml
new file mode 100644
index 000000000000..16b7be1fbc70
--- /dev/null
+++ b/Documentation/ctlv/abi/ctlv-attestation.yaml
@@ -0,0 +1,147 @@
+# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+%YAML 1.2
+---
+# Checked-in ABI snapshot of the ctlv-attestation family, from
+# Documentation/ctlv/specs/ctlv-attestation.yaml, written by
+# "make -C tools/ctlv regen".
+#
+# Updating the file is how a UAPI change gets reviewed; an update that
+# removes or renumbers anything, narrows a bound, or makes a member required
+# is an ABI break, whatever the file says afterwards.
+family: {name: ctlv-attestation, id: 1, inherits: ctlv}
+enums:
+ evidence-class: {signed: 1, event-log: 2}
+ evidence-format: {ccel: 1}
+ hash-algo: {$header: linux/hash_info.h, $enum: hash_algo,
+ $end: HASH_ALGO__LAST}
+flags:
+ mr-device-caps: {extend: 0}
+ mr-caps: {extend: 0}
+records:
+ mr-desc:
+ id: 0x00010000
+ fields:
+ name: {number: 1, type: string, min-length: 1, max-length: 128}
+ supported-hash-algorithms: {number: 2, enum: hash-algo,
+ max-occurrences: hash-algo}
+ caps: {number: 3, flags: mr-caps}
+ register-index: {number: 4, type: uint, max: u32-max, optional: true}
+ mr-value:
+ id: 0x00020000
+ fields:
+ hash-algo: {number: 1, enum: hash-algo}
+ data: {number: 2, type: binary, min-length: 16, max-length: 64}
+ mr-generation:
+ id: 0x00030000
+ fields:
+ mr-generation: {number: 1, type: uint, max: u32-max}
+ mr-values:
+ id: 0x00040000
+ fields:
+ mr-values: {number: 1, record: mr-value, max-occurrences: hash-algo}
+ device-get request:
+ id: 0x80010000
+ device-get reply:
+ id: 0xc0010000
+ fields:
+ caps: {number: 1, record: device-get caps}
+ info: {number: 2, extension: device-info}
+ device-get caps:
+ id: 0xc0011000
+ fields:
+ evidence: {number: 1, record: device-get caps.evidence, optional: true}
+ mr: {number: 2, record: device-get caps.mr, optional: true}
+ device-get caps.evidence:
+ id: 0xc0011100
+ fields:
+ objects: {number: 1, record: device-get caps.evidence.objects,
+ max-occurrences: 16}
+ device-get caps.evidence.objects:
+ id: 0xc0011110
+ fields:
+ id: {number: 1, type: uint, max: 15}
+ class: {number: 2, enum: evidence-class}
+ formats: {number: 3, enum: evidence-format, max-occurrences: 4,
+ optional: true}
+ vendor-formats: {number: 4, enum: evidence-vendor-format,
+ max-occurrences: 4, optional: true}
+ max-length: {number: 5, type: uint}
+ challenge-lengths:
+ {number: 6, record: device-get caps.evidence.objects.challenge-lengths,
+ max-occurrences: 8, optional: true}
+ device-get caps.evidence.objects.challenge-lengths:
+ id: 0xc0011111
+ fields:
+ length: {number: 1, type: uint, min: 1, max: 4K, unit: bytes,
+ optional: true}
+ min-length: {number: 2, type: uint, min: 1, max: 4K, unit: bytes,
+ optional: true}
+ max-length: {number: 3, type: uint, min: 1, max: 4K, unit: bytes,
+ optional: true}
+ device-get caps.mr:
+ id: 0xc0011200
+ fields:
+ flags: {number: 1, flags: mr-device-caps}
+ evidence-get request:
+ id: 0x80020000
+ fields:
+ challenge: {number: 1, type: binary, min-length: 1, max-length: 4K,
+ optional: true}
+ objects: {number: 2, record: evidence-get objects, max-occurrences: 16}
+ evidence-get objects:
+ id: 0x80021000
+ fields:
+ id: {number: 1, type: uint, max: 15}
+ data: {number: 2, blob: output, backings: [va], max-length: u32-max}
+ evidence-get reply:
+ id: 0xc0020000
+ fields:
+ results: {number: 1, record: evidence-get results, max-occurrences: 16}
+ members: ['record mr-generation?']
+ evidence-get results:
+ id: 0xc0021000
+ fields:
+ format: {number: 1, enum: evidence-format, optional: true}
+ vendor-format: {number: 2, enum: evidence-vendor-format, optional: true}
+ length: {number: 3, type: uint}
+ mr-get request:
+ id: 0x80030000
+ fields:
+ id: {number: 1, type: uint, max: u32-max, optional: true}
+ mr-get reply:
+ id: 0xc0030000
+ fields:
+ items: {number: 1, record: mr-get items, max-occurrences: unlimited}
+ mr-get items:
+ id: 0xc0031000
+ fields:
+ id: {number: 1, type: uint, max: u32-max}
+ members: [$include mr-desc]
+ mr-read request:
+ id: 0x80040000
+ fields:
+ id: {number: 1, type: uint, max: u32-max}
+ mr-read reply:
+ id: 0xc0040000
+ members: [record mr-generation, record mr-values]
+ mr-extend request:
+ id: 0x80050000
+ fields:
+ id: {number: 1, type: uint, max: u32-max}
+ members: [record mr-values]
+ mr-extend reply:
+ id: 0xc0050000
+ members: [record mr-generation]
+extensions: {device-info: 1}
+enum-extensions: {evidence-vendor-format: 1}
+ops:
+ device-get: {id: 1, type: action, fd-access: read,
+ request: device-get request, reply: device-get reply}
+ evidence-get: {id: 2, type: action, availability: dynamic, optional: true,
+ request: evidence-get request, reply: evidence-get reply}
+ mr-get: {id: 3, type: query, fd-access: read, optional: true,
+ request: mr-get request, reply: mr-get reply}
+ mr-read: {id: 4, type: query, fd-access: read, optional: true,
+ request: mr-read request, reply: mr-read reply}
+ mr-extend: {id: 5, type: action, optional: true, request: mr-extend request,
+ reply: mr-extend reply}
diff --git a/Documentation/ctlv/abi/families.registry.yaml b/Documentation/ctlv/abi/families.registry.yaml
index 5845e7457771..7a5c6af29565 100644
--- a/Documentation/ctlv/abi/families.registry.yaml
+++ b/Documentation/ctlv/abi/families.registry.yaml
@@ -5,3 +5,4 @@
# Written by "make -C tools/ctlv regen".
families:
- ctlv
+ - ctlv-attestation
diff --git a/Documentation/ctlv/families.yaml b/Documentation/ctlv/families.yaml
index 4d219d7af74a..dbb0243b873d 100644
--- a/Documentation/ctlv/families.yaml
+++ b/Documentation/ctlv/families.yaml
@@ -15,3 +15,4 @@
families:
- ctlv
+ - ctlv-attestation
diff --git a/Documentation/ctlv/generated-files.yaml b/Documentation/ctlv/generated-files.yaml
index d4766b176ceb..00a56634805d 100644
--- a/Documentation/ctlv/generated-files.yaml
+++ b/Documentation/ctlv/generated-files.yaml
@@ -16,3 +16,10 @@ families:
kernel-header: include/linux/ctlv_gen.h
kernel-source: lib/ctlv/ctlv_gen.c
user-source: tools/ctlv/libctlv/ctlv_user_gen.c
+
+ - name: ctlv-attestation
+ source: Documentation/ctlv/specs/ctlv-attestation.yaml
+ outputs:
+ uapi-header: include/uapi/ctlv/ctlv_attestation_gen.h
+ kernel-header: drivers/attestation/generated/ctlv_attestation_gen.h
+ kernel-source: drivers/attestation/generated/ctlv_attestation_gen.c
diff --git a/Documentation/ctlv/specs/ctlv-attestation.yaml b/Documentation/ctlv/specs/ctlv-attestation.yaml
new file mode 100644
index 000000000000..78b2dad6318a
--- /dev/null
+++ b/Documentation/ctlv/specs/ctlv-attestation.yaml
@@ -0,0 +1,181 @@
+# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+%YAML 1.2
+---
+# Attestation devices: evidence and measurement registers (MRs). The device's
+# family inherits this one, fills device-info and gives evidence-vendor-format
+# the formats its vendor defines.
+family: ctlv-attestation
+inherits: ctlv
+
+enums:
+ # What an evidence object is.
+ evidence-class:
+ # Made by evidence-get over its challenge, and signed by the root of
+ # trust.
+ - signed
+ # The platform's log of what firmware and the boot chain measured into
+ # the MRs. Later extends, through mr-extend or otherwise, are not in it.
+ - event-log
+ # A layout of an evidence object that a standard defines.
+ evidence-format:
+ # The log area of an ACPI CCEL table, a TCG crypto-agile event log.
+ - ccel
+ # A layout of an evidence object that one vendor defines, given by the
+ # device's family.
+ evidence-vendor-format: extension
+ # The kernel's hash algorithms.
+ hash-algo:
+ $header: linux/hash_info.h
+ $enum: hash_algo
+ $end: HASH_ALGO__LAST
+
+flags:
+ # What a device offers for its MRs.
+ mr-device-caps:
+ # mr-extend is provided.
+ - extend
+ # What one MR allows.
+ mr-caps:
+ # The MR may be extended.
+ - extend
+
+records:
+ # One MR, as mr-get describes it.
+ mr-desc:
+ # The platform's name for the MR, such as rtmr0.
+ name: string(1..128)
+ # Its banks, each once, in the provider's order.
+ supported-hash-algorithms[hash-algo]: hash-algo
+ # What it allows.
+ caps: mr-caps
+ # The hardware's number for the MR, where it has one: 0 for rtmr0.
+ register-index?: uint(..u32-max)
+
+ # One bank of an MR.
+ mr-value:
+ # The bank's algorithm.
+ hash-algo: hash-algo
+ # The digest, as long as hash-algo's.
+ data: binary(16..64)
+
+ # The device's MR generation, which each extend bumps.
+ mr-generation: uint(..u32-max)
+
+ # Values for banks of the MR, each bank once.
+ mr-values[hash-algo]: record mr-value
+
+ops:
+ # What the device can do, and its family's fields.
+ device-get:
+ type: action
+ fd-access: read
+ reply:
+ # What the device supports, fixed for its life.
+ caps:
+ # Present when the device produces evidence.
+ evidence?:
+ # One per object evidence-get can produce.
+ objects[16]:
+ # The device's handle for the object in requests.
+ id: uint(..15)
+ # What the object is.
+ class: evidence-class
+ # The layouts a standard defines that the object may have. At
+ # least one of formats and vendor-formats is present.
+ formats[4]?: evidence-format
+ # The layouts its vendor defines that the object may have.
+ vendor-formats[4]?: evidence-vendor-format
+ # The longest the object gets; a blob this long always holds it.
+ max-length: uint
+ # A signed object's challenge lengths: each entry is one length,
+ # or a range from min-length to max-length.
+ challenge-lengths[8]?:
+ # A single length.
+ length?: uint(1..4K, bytes)
+ # The shortest of a range.
+ min-length?: uint(1..4K, bytes)
+ # The longest of a range.
+ max-length?: uint(1..4K, bytes)
+ # Present when the device has MRs.
+ mr?:
+ # The MR operations the device provides.
+ flags: mr-device-caps
+ # The device's family's fields.
+ info: extension device-info
+
+ # Evidence objects, written into the caller's blobs. A signed object is made
+ # by the call, over the challenge, and never reused; the others are read as
+ # they stand at the call.
+ evidence-get:
+ type: action
+ fd-access: read-write
+ availability: dynamic
+ optional: true
+ request:
+ # Bound into each signed object named: pass a verifier's nonce, or a hash
+ # binding one to your context, never data a peer chose. Present exactly
+ # when a signed object is named, and of a length each of them takes.
+ challenge?: binary(1..4K)
+ # The objects to produce, each named once.
+ objects[16]:
+ # The object, by the ID device-get lists.
+ id: uint(..15)
+ # Where the object is written. One too short for it fails the op with
+ # EMSGSIZE, and error-info's required-length says how long it has to
+ # be.
+ data: blob(out, va)
+ reply:
+ # One per object, in request order.
+ results[16]:
+ # The layout it came in, where a standard defines it. Exactly one of
+ # format and vendor-format is present.
+ format?: evidence-format
+ # The layout it came in, where its vendor defines it.
+ vendor-format?: evidence-vendor-format
+ # The bytes written to its blob.
+ length: uint
+ # Present when the evidence depends on the MRs.
+ mr-generation?: record
+
+ # The MRs' IDs and descriptions, which do not change; mr-read returns
+ # values, which change with every extension and are read from the hardware.
+ mr-get:
+ type: query
+ fd-access: read
+ optional: true
+ suggested-reply-length: 4K
+ request:
+ # Only this MR; every MR without it.
+ id?: uint(..u32-max)
+ reply:
+ # One per MR, ordered by ID.
+ items[]:
+ # The device's handle for the MR in requests.
+ id: uint(..u32-max)
+ $include: mr-desc
+
+ # One MR's values, and the MR generation they belong to.
+ mr-read:
+ type: query
+ fd-access: read
+ optional: true
+ suggested-reply-length: 4K
+ request:
+ # The MR to read, by the ID mr-get lists.
+ id: uint(..u32-max)
+ reply:
+ mr-generation: record
+ mr-values: record
+
+ # Extends banks of the MR by digests, as TPM2_PCR_Extend.
+ mr-extend:
+ type: action
+ fd-access: read-write
+ optional: true
+ request:
+ # The MR to extend, by the ID mr-get lists.
+ id: uint(..u32-max)
+ # For the banks to extend, each once, in any order.
+ mr-values: record
+ reply:
+ mr-generation: record
diff --git a/MAINTAINERS b/MAINTAINERS
index b16bedbbe0b6..fa450924b921 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4433,6 +4433,15 @@ F: rust/kernel/sync/atomic.rs
F: rust/kernel/sync/atomic/
F: rust/kernel/sync/refcount.rs
+ATTESTATION SUBSYSTEM
+M: Jiri Pirko <jiri@nvidia.com>
+L: linux-security-module@vger.kernel.org
+S: Supported
+F: Documentation/ctlv/abi/ctlv-attestation*
+F: Documentation/ctlv/specs/ctlv-attestation*
+F: drivers/attestation/
+F: include/uapi/ctlv/ctlv_attestation*
+
ATTO EXPRESSSAS SAS/SATA RAID SCSI DRIVER
M: Bradley Grove <linuxdrivers@attotech.com>
L: linux-scsi@vger.kernel.org
diff --git a/drivers/attestation/generated/ctlv_attestation_gen.c b/drivers/attestation/generated/ctlv_attestation_gen.c
new file mode 100644
index 000000000000..e1c759d6fd8a
--- /dev/null
+++ b/drivers/attestation/generated/ctlv_attestation_gen.c
@@ -0,0 +1,179 @@
+// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+/*
+ * Generated from Documentation/ctlv/specs/ctlv-attestation.yaml by
+ * tools/ctlv/ctlv-regen.sh. Do not edit.
+ */
+/* CTLV-GEN kernel source */
+
+#define _CTLV_GENERATED_METADATA_ONLY
+#include <linux/array_size.h>
+#include <linux/bits.h>
+#include <linux/build_bug.h>
+#include <linux/ctlv_family.h>
+#include <linux/export.h>
+#include <linux/limits.h>
+#include <linux/sizes.h>
+
+#include <uapi/ctlv/ctlv_gen.h>
+#include <uapi/ctlv/ctlv_attestation_gen.h>
+
+#include "ctlv_attestation_gen.h"
+
+static const struct ctlv_node_schema device_get_request_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(0, 0, 0),
+};
+
+static const struct ctlv_node_schema device_get_reply_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 2, 2),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_DEVICE_GET_CAPS, 1, 3, 2, 0),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_DEVICE_GET_INFO, 1, 0, 0, 0),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_DEVICE_GET_CAPS_EVIDENCE, 1, 5, 1, 1),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_DEVICE_GET_CAPS_MR, 1, 6, 1, 1),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_DEVICE_GET_EVIDENCE_OBJECTS, 16, 7, 6, 3),
+ CTLV_NODE_SCHEMA_FLAGS(CTLV_ATTESTATION_T_DEVICE_GET_MR_FLAGS, 1,
+ CTLV_ATTESTATION_MR_DEVICE_CAPS_MASK),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_ID, 1, 0, 15),
+ CTLV_NODE_SCHEMA_ENUM(CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_CLASS, 1, 2),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_MAX_LENGTH, 1, 0, U64_MAX),
+ CTLV_NODE_SCHEMA_ENUM(CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_FORMATS, 4, 1),
+ CTLV_NODE_SCHEMA_ENUM_EXT(CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_VENDOR_FORMATS, 4,
+ CTLV_FAMILY_ATTESTATION,
+ CTLV_ATTESTATION_ENUM_EXT_EVIDENCE_VENDOR_FORMAT),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_CHALLENGE_LENGTHS, 8, 13, 3,
+ 0),
+ CTLV_NODE_SCHEMA_UINT_UNIT(CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_LENGTH, 1, 1,
+ 4096, CTLV_UNIT_BYTES, 0),
+ CTLV_NODE_SCHEMA_UINT_UNIT(CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MIN_LENGTH, 1, 1,
+ 4096, CTLV_UNIT_BYTES, 0),
+ CTLV_NODE_SCHEMA_UINT_UNIT(CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MAX_LENGTH, 1, 1,
+ 4096, CTLV_UNIT_BYTES, 0),
+};
+
+/* Extension points selected by this tree. */
+static const struct ctlv_ext_schema device_get_reply_ext_schemas[] = {
+ CTLV_EXT_SCHEMA(CTLV_FAMILY_ATTESTATION, CTLV_ATTESTATION_EXT_DEVICE_INFO, 2),
+};
+
+static const struct ctlv_node_schema evidence_get_request_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 2, 1),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS, 16, 3, 2, 2),
+ CTLV_NODE_SCHEMA_BINARY(CTLV_ATTESTATION_T_EVIDENCE_GET_CHALLENGE, 1, 1, SZ_4K),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS_ID, 1, 0, 15),
+ CTLV_NODE_SCHEMA_BLOB(CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS_DATA, 1, U32_MAX, 1,
+ BIT(CTLV_BLOB_TYPE_VA),
+ CTLV_BLOB_DIRECTION_OUTPUT),
+};
+
+static const struct ctlv_node_schema evidence_get_reply_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 2, 1),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS, 16, 3, 3, 1),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_MR_GENERATION, 1, 0, U32_MAX),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_LENGTH, 1, 0, U64_MAX),
+ CTLV_NODE_SCHEMA_ENUM(CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_FORMAT, 1, 1),
+ CTLV_NODE_SCHEMA_ENUM_EXT(CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_VENDOR_FORMAT, 1,
+ CTLV_FAMILY_ATTESTATION,
+ CTLV_ATTESTATION_ENUM_EXT_EVIDENCE_VENDOR_FORMAT),
+};
+
+static const struct ctlv_node_schema mr_get_request_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 1, 0),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_MR_GET_ID, 1, 0, U32_MAX),
+};
+
+static const struct ctlv_node_schema mr_get_reply_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 1, 1),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_MR_GET_ITEMS, CTLV_NODE_SCHEMA_UNLIMITED, 2, 5,
+ 4),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_MR_GET_ITEMS_ID, 1, 0, U32_MAX),
+ CTLV_NODE_SCHEMA_STRING(CTLV_ATTESTATION_T_MR_DESC_NAME, 1, 1, 128),
+ CTLV_NODE_SCHEMA_ENUM_RANGE(CTLV_ATTESTATION_T_MR_DESC_SUPPORTED_HASH_ALGORITHMS, 23,
+ HASH_ALGO_MD4, HASH_ALGO__LAST - 1),
+ CTLV_NODE_SCHEMA_FLAGS(CTLV_ATTESTATION_T_MR_DESC_CAPS, 1, CTLV_ATTESTATION_MR_CAPS_MASK),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_MR_DESC_REGISTER_INDEX, 1, 0, U32_MAX),
+};
+
+static const struct ctlv_node_schema mr_read_request_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 1, 1),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_MR_READ_ID, 1, 0, U32_MAX),
+};
+
+static const struct ctlv_node_schema mr_read_reply_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 2, 2),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_MR_GENERATION, 1, 0, U32_MAX),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_MR_VALUES, 23, 3, 2, 2),
+ CTLV_NODE_SCHEMA_ENUM_RANGE(CTLV_ATTESTATION_T_MR_VALUE_HASH_ALGO, 1, HASH_ALGO_MD4,
+ HASH_ALGO__LAST - 1),
+ CTLV_NODE_SCHEMA_BINARY(CTLV_ATTESTATION_T_MR_VALUE_DATA, 1, 16, 64),
+};
+
+static const struct ctlv_node_schema mr_extend_request_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 2, 2),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_MR_EXTEND_ID, 1, 0, U32_MAX),
+ CTLV_NODE_SCHEMA_RECORD(CTLV_ATTESTATION_T_MR_VALUES, 23, 3, 2, 2),
+ CTLV_NODE_SCHEMA_ENUM_RANGE(CTLV_ATTESTATION_T_MR_VALUE_HASH_ALGO, 1, HASH_ALGO_MD4,
+ HASH_ALGO__LAST - 1),
+ CTLV_NODE_SCHEMA_BINARY(CTLV_ATTESTATION_T_MR_VALUE_DATA, 1, 16, 64),
+};
+
+static const struct ctlv_node_schema mr_extend_reply_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 1, 1),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_T_MR_GENERATION, 1, 0, U32_MAX),
+};
+
+/* The ops this family declares, in declaration order. */
+const struct ctlv_op_schema ctlv_attestation_op_schemas[] = {
+ CTLV_OP_SCHEMA_ACTION(CTLV_ATTESTATION_OP_DEVICE_GET, CTLV_OP_FD_ACCESS_READ,
+ CTLV_OP_AVAILABILITY_FIXED, 16, 15848,
+ CTLV_SCHEMA_TREE(device_get_request),
+ CTLV_SCHEMA_TREE_EXTS(device_get_reply)),
+ CTLV_OP_SCHEMA_ACTION(CTLV_ATTESTATION_OP_EVIDENCE_GET, CTLV_OP_FD_ACCESS_READ_WRITE,
+ CTLV_OP_AVAILABILITY_DYNAMIC, 6176, 1448,
+ CTLV_SCHEMA_TREE(evidence_get_request),
+ CTLV_SCHEMA_TREE(evidence_get_reply), .optional = true),
+ CTLV_OP_SCHEMA_QUERY(CTLV_ATTESTATION_OP_MR_GET, CTLV_OP_FD_ACCESS_READ,
+ CTLV_OP_AVAILABILITY_FIXED, 40, 184, 4096,
+ CTLV_SCHEMA_TREE(mr_get_request), CTLV_SCHEMA_TREE(mr_get_reply),
+ .optional = true),
+ CTLV_OP_SCHEMA_QUERY(CTLV_ATTESTATION_OP_MR_READ, CTLV_OP_FD_ACCESS_READ,
+ CTLV_OP_AVAILABILITY_FIXED, 40, 112, 4096,
+ CTLV_SCHEMA_TREE(mr_read_request), CTLV_SCHEMA_TREE(mr_read_reply),
+ .optional = true),
+ CTLV_OP_SCHEMA_ACTION(CTLV_ATTESTATION_OP_MR_EXTEND, CTLV_OP_FD_ACCESS_READ_WRITE,
+ CTLV_OP_AVAILABILITY_FIXED, 2800, 40,
+ CTLV_SCHEMA_TREE(mr_extend_request),
+ CTLV_SCHEMA_TREE(mr_extend_reply), .optional = true),
+};
+
+/* The family ID is its position in the central registry. */
+const struct ctlv_family_schema ctlv_attestation_schema = {
+ .name = "ctlv-attestation",
+ .family_id = 1,
+ .ops = ctlv_attestation_op_schemas,
+ .ops_count = ARRAY_SIZE(ctlv_attestation_op_schemas),
+};
+
+/* Maximum uevent cost for this family chain. */
+static_assert(107 <= CTLV_UEVENT_MAX_LEN);
+static_assert(4 <= CTLV_UEVENT_MAX_VARS);
+
+/* Guards for generated maxima. */
+static_assert(15848 <= CTLV_MAX_INLINE_MESSAGE_LEN);
+static_assert(4 <= CTLV_MAX_DECLARED_RECORD_DEPTH);
+
+/* Local action and query bindings in declaration order. */
+static const struct ctlv_op ctlv_attestation_ops[] = {
+ CTLV_OP_ACTION(ctlv_attestation_device_get),
+ CTLV_OP_ACTION(ctlv_attestation_evidence_get),
+ CTLV_OP_QUERY(ctlv_attestation_mr_get),
+ CTLV_OP_QUERY(ctlv_attestation_mr_read),
+ CTLV_OP_ACTION(ctlv_attestation_mr_extend),
+};
+
+/* Family descriptor used by ctlv_init(). */
+const struct ctlv_family ctlv_attestation_family = {
+ .schema = &ctlv_attestation_schema,
+ .parent = &ctlv_family,
+ .ops = ctlv_attestation_ops,
+ .ops_count = ARRAY_SIZE(ctlv_attestation_ops),
+};
+EXPORT_SYMBOL_NS_GPL(ctlv_attestation_family, "CTLV");
diff --git a/drivers/attestation/generated/ctlv_attestation_gen.h b/drivers/attestation/generated/ctlv_attestation_gen.h
new file mode 100644
index 000000000000..5ff54385b42e
--- /dev/null
+++ b/drivers/attestation/generated/ctlv_attestation_gen.h
@@ -0,0 +1,204 @@
+/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+/*
+ * Generated from Documentation/ctlv/specs/ctlv-attestation.yaml by
+ * tools/ctlv/ctlv-regen.sh. Do not edit.
+ */
+/* CTLV-GEN kernel header */
+
+/* Kernel metadata and family API of the ctlv-attestation CTLV family. */
+
+#ifndef _LINUX_CTLV_ATTESTATION_GEN_H
+#define _LINUX_CTLV_ATTESTATION_GEN_H
+
+#include <linux/ctlv_family.h>
+#include <linux/err.h>
+#include <linux/errno.h>
+
+#include <uapi/ctlv/ctlv_attestation_gen.h>
+
+/* Extension points, as a descendant's fill names one. */
+#define CTLV_ATTESTATION_EXT_DEVICE_INFO 1
+
+/* Enum extension points, numbered apart from the others. */
+#define CTLV_ATTESTATION_ENUM_EXT_EVIDENCE_VENDOR_FORMAT 1
+
+/* Ops this family declares, in declaration order. */
+extern const struct ctlv_op_schema ctlv_attestation_op_schemas[];
+
+extern const struct ctlv_family_schema ctlv_attestation_schema;
+
+/* Implemented by this family, one per action and query it declares. */
+int ctlv_attestation_device_get_action(struct ctlv *ctlv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *request,
+ struct ctlv_cursor *reply);
+int ctlv_attestation_evidence_get_action(struct ctlv *ctlv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *request,
+ struct ctlv_cursor *reply);
+int ctlv_attestation_mr_get_query(struct ctlv *ctlv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *request, struct ctlv_cursor *reply);
+int ctlv_attestation_mr_read_query(struct ctlv *ctlv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *request, struct ctlv_cursor *reply);
+int ctlv_attestation_mr_extend_action(struct ctlv *ctlv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *request, struct ctlv_cursor *reply);
+
+extern const struct ctlv_family ctlv_attestation_family;
+
+#ifndef _CTLV_GENERATED_METADATA_ONLY
+
+/* Optional publication and dynamic availability helpers. */
+CTLV_OP_PROVIDE(ctlv_attestation_evidence_get, CTLV_ATTESTATION_OP_EVIDENCE_GET)
+CTLV_OP_ENABLE(ctlv_attestation_evidence_get, CTLV_ATTESTATION_OP_EVIDENCE_GET)
+CTLV_OP_DISABLE(ctlv_attestation_evidence_get, CTLV_ATTESTATION_OP_EVIDENCE_GET)
+CTLV_OP_PROVIDE(ctlv_attestation_mr_get, CTLV_ATTESTATION_OP_MR_GET)
+CTLV_OP_PROVIDE(ctlv_attestation_mr_read, CTLV_ATTESTATION_OP_MR_READ)
+CTLV_OP_PROVIDE(ctlv_attestation_mr_extend, CTLV_ATTESTATION_OP_MR_EXTEND)
+
+/* Reading a validated message. A blob has a resolver instead of a getter. */
+/* The objects to produce, each named once. */
+CTLV_IN_REF(ctlv_attestation_evidence_get_objects, CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS,
+ CTLV_SCHEMA_RECORD)
+#define ctlv_attestation_evidence_get_objects_for_each(_cursor, _record) \
+ CTLV_IN_FOR_EACH(ctlv_attestation_evidence_get_objects, _cursor, _record)
+/* The object, by the ID device-get lists. */
+CTLV_IN_REF(ctlv_attestation_evidence_get_objects_id, CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS_ID,
+ CTLV_SCHEMA_UINT)
+CTLV_IN_HAS(ctlv_attestation_evidence_get_objects_id)
+CTLV_IN_U64(ctlv_attestation_evidence_get_objects_id)
+/*
+ * Where the object is written. One too short for it fails the op with EMSGSIZE, and error-info's
+ * required-length says how long it has to be.
+ */
+CTLV_IN_REF(ctlv_attestation_evidence_get_objects_data,
+ CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS_DATA, CTLV_SCHEMA_BLOB)
+CTLV_IN_HAS(ctlv_attestation_evidence_get_objects_data)
+CTLV_IN_BLOB(ctlv_attestation_evidence_get_objects_data)
+/*
+ * Bound into each signed object named: pass a verifier's nonce, or a hash binding one to your
+ * context, never data a peer chose. Present exactly when a signed object is named, and of a length
+ * each of them takes.
+ */
+CTLV_IN_REF(ctlv_attestation_evidence_get_challenge, CTLV_ATTESTATION_T_EVIDENCE_GET_CHALLENGE,
+ CTLV_SCHEMA_BINARY)
+CTLV_IN_HAS(ctlv_attestation_evidence_get_challenge)
+CTLV_IN_BINARY(ctlv_attestation_evidence_get_challenge)
+/* Only this MR; every MR without it. */
+CTLV_IN_REF(ctlv_attestation_mr_get_id, CTLV_ATTESTATION_T_MR_GET_ID, CTLV_SCHEMA_UINT)
+CTLV_IN_HAS(ctlv_attestation_mr_get_id)
+CTLV_IN_U64(ctlv_attestation_mr_get_id)
+/* The MR to read, by the ID mr-get lists. */
+CTLV_IN_REF(ctlv_attestation_mr_read_id, CTLV_ATTESTATION_T_MR_READ_ID, CTLV_SCHEMA_UINT)
+CTLV_IN_HAS(ctlv_attestation_mr_read_id)
+CTLV_IN_U64(ctlv_attestation_mr_read_id)
+/* The MR to extend, by the ID mr-get lists. */
+CTLV_IN_REF(ctlv_attestation_mr_extend_id, CTLV_ATTESTATION_T_MR_EXTEND_ID, CTLV_SCHEMA_UINT)
+CTLV_IN_HAS(ctlv_attestation_mr_extend_id)
+CTLV_IN_U64(ctlv_attestation_mr_extend_id)
+/* Values for banks of the MR, each bank once. */
+CTLV_IN_REF(ctlv_attestation_mr_values, CTLV_ATTESTATION_T_MR_VALUES, CTLV_SCHEMA_RECORD)
+#define ctlv_attestation_mr_values_for_each(_cursor, _record) \
+ CTLV_IN_FOR_EACH(ctlv_attestation_mr_values, _cursor, _record)
+/* The bank's algorithm. */
+CTLV_IN_REF(ctlv_attestation_mr_value_hash_algo, CTLV_ATTESTATION_T_MR_VALUE_HASH_ALGO,
+ CTLV_SCHEMA_ENUM)
+CTLV_IN_HAS(ctlv_attestation_mr_value_hash_algo)
+CTLV_IN_U64(ctlv_attestation_mr_value_hash_algo)
+/* The digest, as long as hash-algo's. */
+CTLV_IN_REF(ctlv_attestation_mr_value_data, CTLV_ATTESTATION_T_MR_VALUE_DATA, CTLV_SCHEMA_BINARY)
+CTLV_IN_HAS(ctlv_attestation_mr_value_data)
+CTLV_IN_BINARY(ctlv_attestation_mr_value_data)
+
+/* Writing a reply. An append is atomic; a record ends with ctlv_record_end(). */
+/* What the device supports, fixed for its life. */
+CTLV_RECORD_START(ctlv_attestation_device_get_caps, CTLV_ATTESTATION_T_DEVICE_GET_CAPS,
+ CTLV_SCHEMA_RECORD)
+/* Present when the device produces evidence. */
+CTLV_RECORD_START(ctlv_attestation_device_get_caps_evidence,
+ CTLV_ATTESTATION_T_DEVICE_GET_CAPS_EVIDENCE, CTLV_SCHEMA_RECORD)
+/* One per object evidence-get can produce. */
+CTLV_RECORD_START(ctlv_attestation_device_get_evidence_objects,
+ CTLV_ATTESTATION_T_DEVICE_GET_EVIDENCE_OBJECTS, CTLV_SCHEMA_RECORD)
+/* The device's handle for the object in requests. */
+CTLV_PUT_U64(ctlv_attestation_device_get_objects_id, CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_ID,
+ CTLV_SCHEMA_UINT)
+/* What the object is. */
+CTLV_PUT_U64(ctlv_attestation_device_get_objects_class, CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_CLASS,
+ CTLV_SCHEMA_ENUM)
+/* The longest the object gets; a blob this long always holds it. */
+CTLV_PUT_U64(ctlv_attestation_device_get_objects_max_length,
+ CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_MAX_LENGTH, CTLV_SCHEMA_UINT)
+/*
+ * The layouts a standard defines that the object may have. At least one of formats and
+ * vendor-formats is present.
+ */
+CTLV_PUT_U64(ctlv_attestation_device_get_objects_formats,
+ CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_FORMATS, CTLV_SCHEMA_ENUM)
+/* The layouts its vendor defines that the object may have. */
+CTLV_PUT_U64(ctlv_attestation_device_get_objects_vendor_formats,
+ CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_VENDOR_FORMATS, CTLV_SCHEMA_ENUM)
+/*
+ * A signed object's challenge lengths: each entry is one length, or a range from min-length to
+ * max-length.
+ */
+CTLV_RECORD_START(ctlv_attestation_device_get_objects_challenge_lengths,
+ CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_CHALLENGE_LENGTHS, CTLV_SCHEMA_RECORD)
+/* A single length. */
+CTLV_PUT_U64(ctlv_attestation_device_get_challenge_lengths_length,
+ CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_LENGTH, CTLV_SCHEMA_UINT)
+/* The shortest of a range. */
+CTLV_PUT_U64(ctlv_attestation_device_get_challenge_lengths_min_length,
+ CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MIN_LENGTH, CTLV_SCHEMA_UINT)
+/* The longest of a range. */
+CTLV_PUT_U64(ctlv_attestation_device_get_challenge_lengths_max_length,
+ CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MAX_LENGTH, CTLV_SCHEMA_UINT)
+/* Present when the device has MRs. */
+CTLV_RECORD_START(ctlv_attestation_device_get_caps_mr, CTLV_ATTESTATION_T_DEVICE_GET_CAPS_MR,
+ CTLV_SCHEMA_RECORD)
+/* The MR operations the device provides. */
+CTLV_PUT_U64(ctlv_attestation_device_get_mr_flags, CTLV_ATTESTATION_T_DEVICE_GET_MR_FLAGS,
+ CTLV_SCHEMA_FLAGS)
+/* The device's family's fields. */
+CTLV_RECORD_START(ctlv_attestation_device_get_info, CTLV_ATTESTATION_T_DEVICE_GET_INFO,
+ CTLV_SCHEMA_RECORD)
+/* One per object, in request order. */
+CTLV_RECORD_START(ctlv_attestation_evidence_get_results, CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS,
+ CTLV_SCHEMA_RECORD)
+/* The bytes written to its blob. */
+CTLV_PUT_U64(ctlv_attestation_evidence_get_results_length,
+ CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_LENGTH, CTLV_SCHEMA_UINT)
+/*
+ * The layout it came in, where a standard defines it. Exactly one of format and vendor-format is
+ * present.
+ */
+CTLV_PUT_U64(ctlv_attestation_evidence_get_results_format,
+ CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_FORMAT, CTLV_SCHEMA_ENUM)
+/* The layout it came in, where its vendor defines it. */
+CTLV_PUT_U64(ctlv_attestation_evidence_get_results_vendor_format,
+ CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_VENDOR_FORMAT, CTLV_SCHEMA_ENUM)
+/* The device's MR generation, which each extend bumps. */
+CTLV_PUT_U64(ctlv_attestation_mr_generation, CTLV_ATTESTATION_T_MR_GENERATION, CTLV_SCHEMA_UINT)
+/* One per MR, ordered by ID. */
+CTLV_RECORD_START(ctlv_attestation_mr_get_items, CTLV_ATTESTATION_T_MR_GET_ITEMS,
+ CTLV_SCHEMA_RECORD)
+/* The device's handle for the MR in requests. */
+CTLV_PUT_U64(ctlv_attestation_mr_get_items_id, CTLV_ATTESTATION_T_MR_GET_ITEMS_ID, CTLV_SCHEMA_UINT)
+/* The platform's name for the MR, such as rtmr0. */
+CTLV_PUT_STRING(ctlv_attestation_mr_desc_name, CTLV_ATTESTATION_T_MR_DESC_NAME, CTLV_SCHEMA_STRING)
+/* Its banks, each once, in the provider's order. */
+CTLV_PUT_U64(ctlv_attestation_mr_desc_supported_hash_algorithms,
+ CTLV_ATTESTATION_T_MR_DESC_SUPPORTED_HASH_ALGORITHMS, CTLV_SCHEMA_ENUM)
+/* What it allows. */
+CTLV_PUT_U64(ctlv_attestation_mr_desc_caps, CTLV_ATTESTATION_T_MR_DESC_CAPS, CTLV_SCHEMA_FLAGS)
+/* The hardware's number for the MR, where it has one: 0 for rtmr0. */
+CTLV_PUT_U64(ctlv_attestation_mr_desc_register_index, CTLV_ATTESTATION_T_MR_DESC_REGISTER_INDEX,
+ CTLV_SCHEMA_UINT)
+/* Values for banks of the MR, each bank once. */
+CTLV_RECORD_START(ctlv_attestation_mr_values, CTLV_ATTESTATION_T_MR_VALUES, CTLV_SCHEMA_RECORD)
+/* The bank's algorithm. */
+CTLV_PUT_U64(ctlv_attestation_mr_value_hash_algo, CTLV_ATTESTATION_T_MR_VALUE_HASH_ALGO,
+ CTLV_SCHEMA_ENUM)
+/* The digest, as long as hash-algo's. */
+CTLV_PUT_BINARY(ctlv_attestation_mr_value_data, CTLV_ATTESTATION_T_MR_VALUE_DATA,
+ CTLV_SCHEMA_BINARY)
+#endif /* _CTLV_GENERATED_METADATA_ONLY */
+
+#endif /* _LINUX_CTLV_ATTESTATION_GEN_H */
diff --git a/include/uapi/ctlv/ctlv_attestation_gen.h b/include/uapi/ctlv/ctlv_attestation_gen.h
new file mode 100644
index 000000000000..f4a1cfe02bb2
--- /dev/null
+++ b/include/uapi/ctlv/ctlv_attestation_gen.h
@@ -0,0 +1,234 @@
+/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+/*
+ * Generated from Documentation/ctlv/specs/ctlv-attestation.yaml by
+ * tools/ctlv/ctlv-regen.sh. Do not edit.
+ */
+/* CTLV-GEN uapi header */
+
+/*
+ * Constants of the ctlv-attestation CTLV family. Types and op IDs are complete; the message format
+ * carrying them is in <ctlv/ctlv.h>.
+ *
+ * The inherited ctlv header is included here, so one include covers the whole effective schema.
+ */
+
+#ifndef _UAPI_CTLV_CTLV_ATTESTATION_GEN_H
+#define _UAPI_CTLV_CTLV_ATTESTATION_GEN_H
+
+#include <ctlv/ctlv.h>
+#include <ctlv/ctlv_families_gen.h>
+#include <ctlv/ctlv_gen.h>
+#include <linux/const.h>
+#include <linux/hash_info.h>
+
+/* enum evidence-class */
+enum _ctlv_attestation_evidence_class {
+ /* Made by evidence-get over its challenge, and signed by the root of trust. */
+ CTLV_ATTESTATION_EVIDENCE_CLASS_SIGNED = 1,
+ /*
+ * The platform's log of what firmware and the boot chain measured into the MRs. Later
+ * extends, through mr-extend or otherwise, are not in it.
+ */
+ CTLV_ATTESTATION_EVIDENCE_CLASS_EVENT_LOG = 2,
+};
+
+/* enum evidence-format */
+enum _ctlv_attestation_evidence_format {
+ /* The log area of an ACPI CCEL table, a TCG crypto-agile event log. */
+ CTLV_ATTESTATION_EVIDENCE_FORMAT_CCEL = 1,
+};
+
+/* flags mr-device-caps */
+enum _ctlv_attestation_mr_device_caps_bit {
+ CTLV_ATTESTATION_MR_DEVICE_CAPS_EXTEND_BIT = 0,
+};
+
+/* mr-extend is provided. */
+#define CTLV_ATTESTATION_MR_DEVICE_CAPS_EXTEND _BITULL(CTLV_ATTESTATION_MR_DEVICE_CAPS_EXTEND_BIT)
+#define CTLV_ATTESTATION_MR_DEVICE_CAPS_MASK CTLV_ATTESTATION_MR_DEVICE_CAPS_EXTEND
+
+/* flags mr-caps */
+enum _ctlv_attestation_mr_caps_bit {
+ CTLV_ATTESTATION_MR_CAPS_EXTEND_BIT = 0,
+};
+
+/* The MR may be extended. */
+#define CTLV_ATTESTATION_MR_CAPS_EXTEND _BITULL(CTLV_ATTESTATION_MR_CAPS_EXTEND_BIT)
+#define CTLV_ATTESTATION_MR_CAPS_MASK CTLV_ATTESTATION_MR_CAPS_EXTEND
+
+/* mr-desc */
+/* The platform's name for the MR, such as rtmr0. */
+#define CTLV_ATTESTATION_T_MR_DESC_NAME \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x00010000, 1)
+/* Its banks, each once, in the provider's order. */
+#define CTLV_ATTESTATION_T_MR_DESC_SUPPORTED_HASH_ALGORITHMS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x00010000, 2)
+/* What it allows. */
+#define CTLV_ATTESTATION_T_MR_DESC_CAPS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x00010000, 3)
+/* The hardware's number for the MR, where it has one: 0 for rtmr0. */
+#define CTLV_ATTESTATION_T_MR_DESC_REGISTER_INDEX \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x00010000, 4)
+
+/* mr-value */
+/* The bank's algorithm. */
+#define CTLV_ATTESTATION_T_MR_VALUE_HASH_ALGO \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x00020000, 1)
+/* The digest, as long as hash-algo's. */
+#define CTLV_ATTESTATION_T_MR_VALUE_DATA \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x00020000, 2)
+
+/* mr-generation */
+/* The device's MR generation, which each extend bumps. */
+#define CTLV_ATTESTATION_T_MR_GENERATION \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x00030000, 1)
+
+/* mr-values */
+/* Values for banks of the MR, each bank once. */
+#define CTLV_ATTESTATION_T_MR_VALUES \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x00040000, 1)
+
+/* device-get reply */
+/* What the device supports, fixed for its life. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_CAPS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0010000, 1)
+/* The device's family's fields. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_INFO \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0010000, 2)
+
+/* device-get caps */
+/* Present when the device produces evidence. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_CAPS_EVIDENCE \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011000, 1)
+/* Present when the device has MRs. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_CAPS_MR \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011000, 2)
+
+/* device-get caps.evidence */
+/* One per object evidence-get can produce. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_EVIDENCE_OBJECTS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011100, 1)
+
+/* device-get caps.evidence.objects */
+/* The device's handle for the object in requests. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_ID \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011110, 1)
+/* What the object is. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_CLASS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011110, 2)
+/*
+ * The layouts a standard defines that the object may have. At least one of formats and
+ * vendor-formats is present.
+ */
+#define CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_FORMATS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011110, 3)
+/* The layouts its vendor defines that the object may have. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_VENDOR_FORMATS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011110, 4)
+/* The longest the object gets; a blob this long always holds it. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_MAX_LENGTH \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011110, 5)
+/*
+ * A signed object's challenge lengths: each entry is one length, or a range from min-length to
+ * max-length.
+ */
+#define CTLV_ATTESTATION_T_DEVICE_GET_OBJECTS_CHALLENGE_LENGTHS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011110, 6)
+
+/* device-get caps.evidence.objects.challenge-lengths */
+/* A single length. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_LENGTH \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011111, 1)
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_LENGTH_UNIT CTLV_UNIT_BYTES
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_LENGTH_SCALE 0
+/* The shortest of a range. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MIN_LENGTH \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011111, 2)
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MIN_LENGTH_UNIT CTLV_UNIT_BYTES
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MIN_LENGTH_SCALE 0
+/* The longest of a range. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MAX_LENGTH \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011111, 3)
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MAX_LENGTH_UNIT CTLV_UNIT_BYTES
+#define CTLV_ATTESTATION_T_DEVICE_GET_CHALLENGE_LENGTHS_MAX_LENGTH_SCALE 0
+
+/* device-get caps.mr */
+/* The MR operations the device provides. */
+#define CTLV_ATTESTATION_T_DEVICE_GET_MR_FLAGS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0011200, 1)
+
+/* evidence-get request */
+/*
+ * Bound into each signed object named: pass a verifier's nonce, or a hash binding one to your
+ * context, never data a peer chose. Present exactly when a signed object is named, and of a length
+ * each of them takes.
+ */
+#define CTLV_ATTESTATION_T_EVIDENCE_GET_CHALLENGE \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x80020000, 1)
+/* The objects to produce, each named once. */
+#define CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x80020000, 2)
+
+/* evidence-get objects */
+/* The object, by the ID device-get lists. */
+#define CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS_ID \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x80021000, 1)
+/*
+ * Where the object is written. One too short for it fails the op with EMSGSIZE, and error-info's
+ * required-length says how long it has to be.
+ */
+#define CTLV_ATTESTATION_T_EVIDENCE_GET_OBJECTS_DATA \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x80021000, 2)
+
+/* evidence-get reply */
+/* One per object, in request order. */
+#define CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0020000, 1)
+
+/* evidence-get results */
+/*
+ * The layout it came in, where a standard defines it. Exactly one of format and vendor-format is
+ * present.
+ */
+#define CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_FORMAT \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0021000, 1)
+/* The layout it came in, where its vendor defines it. */
+#define CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_VENDOR_FORMAT \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0021000, 2)
+/* The bytes written to its blob. */
+#define CTLV_ATTESTATION_T_EVIDENCE_GET_RESULTS_LENGTH \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0021000, 3)
+
+/* mr-get request */
+/* Only this MR; every MR without it. */
+#define CTLV_ATTESTATION_T_MR_GET_ID \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x80030000, 1)
+
+/* mr-get reply */
+/* One per MR, ordered by ID. */
+#define CTLV_ATTESTATION_T_MR_GET_ITEMS \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0030000, 1)
+
+/* mr-get items */
+/* The device's handle for the MR in requests. */
+#define CTLV_ATTESTATION_T_MR_GET_ITEMS_ID \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0xc0031000, 1)
+
+/* mr-read request */
+/* The MR to read, by the ID mr-get lists. */
+#define CTLV_ATTESTATION_T_MR_READ_ID \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x80040000, 1)
+
+/* mr-extend request */
+/* The MR to extend, by the ID mr-get lists. */
+#define CTLV_ATTESTATION_T_MR_EXTEND_ID \
+ CTLV_TYPE(CTLV_FAMILY_ATTESTATION, 0x80050000, 1)
+
+/* ops */
+#define CTLV_ATTESTATION_OP_DEVICE_GET CTLV_OP(CTLV_FAMILY_ATTESTATION, 1)
+#define CTLV_ATTESTATION_OP_EVIDENCE_GET CTLV_OP(CTLV_FAMILY_ATTESTATION, 2)
+#define CTLV_ATTESTATION_OP_MR_GET CTLV_OP(CTLV_FAMILY_ATTESTATION, 3)
+#define CTLV_ATTESTATION_OP_MR_READ CTLV_OP(CTLV_FAMILY_ATTESTATION, 4)
+#define CTLV_ATTESTATION_OP_MR_EXTEND CTLV_OP(CTLV_FAMILY_ATTESTATION, 5)
+
+#endif /* _UAPI_CTLV_CTLV_ATTESTATION_GEN_H */
diff --git a/include/uapi/ctlv/ctlv_families_gen.h b/include/uapi/ctlv/ctlv_families_gen.h
index 83f1719c89aa..83f6a257ddf2 100644
--- a/include/uapi/ctlv/ctlv_families_gen.h
+++ b/include/uapi/ctlv/ctlv_families_gen.h
@@ -12,6 +12,7 @@
enum _ctlv_family {
CTLV_FAMILY_ROOT = 0,
+ CTLV_FAMILY_ATTESTATION = 1,
};
#endif /* _UAPI_CTLV_CTLV_FAMILIES_GEN_H */
--
2.56.0
next prev parent reply other threads:[~2026-11-13 16:08 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-13 16:08 [PATCH RFC v2 0/9] attestation: Add a common subsystem and TDX support Jiri Pirko
2026-11-13 16:08 ` Jiri Pirko [this message]
2026-11-13 16:08 ` [PATCH RFC v2 2/9] Documentation: attestation: Add userspace ABI Jiri Pirko
2026-11-13 16:08 ` [PATCH RFC v2 3/9] attestation: Prepare provider and instance core Jiri Pirko
2026-11-13 16:08 ` [PATCH RFC v2 4/9] attestation: Prepare measurement registers Jiri Pirko
2026-11-13 16:08 ` [PATCH RFC v2 5/9] attestation: Add CTLV operation handling Jiri Pirko
2026-11-13 16:08 ` [PATCH RFC v2 6/9] Documentation: attestation: Describe how to write a provider Jiri Pirko
2026-11-13 16:08 ` [PATCH RFC v2 7/9] tdx-guest: Expose the native attestation service API Jiri Pirko
2026-11-13 16:08 ` [PATCH RFC v2 8/9] attestation: Add the TDX family specification and generated files Jiri Pirko
2026-11-13 16:08 ` [PATCH RFC v2 9/9] attestation: Add the TDX family implementation Jiri Pirko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261113160838.2512652-2-jiri@resnulli.us \
--to=jiri@resnulli.us \
--cc=James.Bottomley@HansenPartnership.com \
--cc=aik@amd.com \
--cc=alistair.francis@wdc.com \
--cc=aneesh.kumar@kernel.org \
--cc=ankita@nvidia.com \
--cc=cedric.xing@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=dave.jiang@intel.com \
--cc=david.quigley@intel.com \
--cc=drdeeglaze@gmail.com \
--cc=elena.reshetova@intel.com \
--cc=jarkko@kernel.org \
--cc=jgg@ziepe.ca \
--cc=jic23@kernel.org \
--cc=jpiotrowski@nvidia.com \
--cc=kas@kernel.org \
--cc=ksinyuk@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=nik.borisov@suse.com \
--cc=peter.fang@intel.com \
--cc=pgonda@google.com \
--cc=qinkun@google.com \
--cc=rick.p.edgecombe@intel.com \
--cc=rodrigo.vivi@intel.com \
--cc=sameo@meta.com \
--cc=sathyanarayanan.kuppuswamy@linux.intel.com \
--cc=sergii.dmytruk@3mdeb.com \
--cc=suzuki.poulose@arm.com \
--cc=x86@kernel.org \
--cc=yeoreum.yun@arm.com \
--cc=zohar@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®