From: "Aneesh Kumar K.V (Arm)" <aneesh.kumar@kernel.org>
To: linux-coco@lists.linux.dev
Cc: "Aneesh Kumar K.V (Arm)" <aneesh.kumar@kernel.org>,
Jiri Pirko <jiri@resnulli.us>, Kevin Tian <kevin.tian@intel.com>,
Alexey Kardashevskiy <aik@amd.com>,
Xu Yilun <yilun.xu@linux.intel.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Steven Price <steven.price@arm.com>,
Kiryl Shutsemau <kas@kernel.org>,
Rick Edgecombe <rick.p.edgecombe@intel.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
Jonathan Cameron <jic23@kernel.org>,
Jason Gunthorpe <jgg@nvidia.com>,
Bjorn Helgaas <bhelgaas@google.com>,
Ashish Kalra <ashish.kalra@amd.com>,
Tom Lendacky <thomas.lendacky@amd.com>,
John Allen <john.allen@amd.com>, Will Deacon <will@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
patches@lists.linux.dev, Dan Williams <djbw@kernel.org>
Subject: [RFC PATCH v1 06/11] PCI/TSM: Describe the PCI attestation control family
Date: Wed, 28 Oct 2026 20:56:13 +0530 [thread overview]
Message-ID: <20261028152618.1356860-7-aneesh.kumar@kernel.org> (raw)
In-Reply-To: <20261028152618.1356860-1-aneesh.kumar@kernel.org>
Register ctlv-attestation-pci as a child of the common attestation
family. Add PCI state reporting and an object-selecting evidence refresh
operation with an optional challenge. Keep connect, disconnect, lock and
unlock in sysfs; IDE setup and TDISP run transition is driven by
evidence acceptance.
Cc: Jiri Pirko <jiri@resnulli.us>
Cc: Dan Williams <djbw@kernel.org>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Jonathan Cameron <jic23@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Aneesh Kumar K.V (Arm) <aneesh.kumar@kernel.org>
---
.../ctlv/abi/ctlv-attestation-pci.yaml | 43 +
Documentation/ctlv/abi/families.registry.yaml | 1 +
Documentation/ctlv/families.yaml | 1 +
Documentation/ctlv/generated-files.yaml | 11 +
.../ctlv/specs/ctlv-attestation-pci.yaml | 79 +
drivers/pci/tsm/ctlv_attestation_pci_gen.c | 111 ++
drivers/pci/tsm/ctlv_attestation_pci_gen.h | 100 +
include/uapi/linux/ctlv_attestation_pci_gen.h | 74 +
include/uapi/linux/ctlv_families_gen.h | 1 +
tools/ctlv/tests/support.py | 3 +-
tools/ctlv/tests/test_outputs.py | 6 +-
tools/ctlv/tests/test_semantics.py | 38 +
tools/ctlv/tests/test_spec.py | 1 +
.../ctlv_attestation_pci_user_gen.c | 1697 +++++++++++++++++
.../ctlv_attestation_pci_user_gen.h | 230 +++
15 files changed, 2392 insertions(+), 4 deletions(-)
create mode 100644 Documentation/ctlv/abi/ctlv-attestation-pci.yaml
create mode 100644 Documentation/ctlv/specs/ctlv-attestation-pci.yaml
create mode 100644 drivers/pci/tsm/ctlv_attestation_pci_gen.c
create mode 100644 drivers/pci/tsm/ctlv_attestation_pci_gen.h
create mode 100644 include/uapi/linux/ctlv_attestation_pci_gen.h
create mode 100644 tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.c
create mode 100644 tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.h
diff --git a/Documentation/ctlv/abi/ctlv-attestation-pci.yaml b/Documentation/ctlv/abi/ctlv-attestation-pci.yaml
new file mode 100644
index 000000000000..04fe5c0ab8fa
--- /dev/null
+++ b/Documentation/ctlv/abi/ctlv-attestation-pci.yaml
@@ -0,0 +1,43 @@
+# 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-pci family, written by
+# "make -C tools/ctlv abi-update".
+#
+# The checker compares this family's declarations and inherited stub fills
+# against this file. Updating it is how a UAPI change gets reviewed; an update
+# that removes or renumbers anything, narrows a bound, or makes a placement
+# required is an ABI break, whatever this file says afterwards.
+family: {name: ctlv-attestation-pci, id: 6, inherits: ctlv-attestation,
+ pre-init: true}
+attr-groups:
+ pci:
+ id: 1
+ attrs:
+ name: {id: 1, type: string, min-length: 1, max-length: 31}
+ generation: {id: 2, type: uint, max: 4294967295}
+ tsm-id: {id: 3, type: uint, max: 2147483647}
+ connected: {id: 4, type: uint, max: 1}
+ locked: {id: 5, type: uint, max: 1}
+ accepted: {id: 6, type: uint, max: 1}
+ dsm: {id: 7, type: string, min-length: 1, max-length: 31}
+ object: {id: 8, enum: evidence-blob-class}
+ challenge: {id: 9, type: binary, length: 32}
+attr-sets:
+ change-reply: {id: 1}
+ state-reply: {id: 2}
+ refresh-request: {id: 3}
+fills:
+ device-info: {attrs: [pci.name]}
+ops:
+ state-get:
+ abi: {id: 1, type: action, fd-access: read}
+ reply:
+ attrs: [pci.generation, pci.connected, pci.locked, pci.accepted]
+ optional-attrs: [pci.tsm-id, pci.dsm]
+ evidence-refresh:
+ abi: {id: 2, type: action, availability: dynamic, optional: true}
+ request:
+ attrs: [pci.generation, pci.object]
+ optional-attrs: [pci.challenge]
+ reply: {attrs: [pci.generation]}
diff --git a/Documentation/ctlv/abi/families.registry.yaml b/Documentation/ctlv/abi/families.registry.yaml
index 7cdae176f5b4..a1a0836cef7e 100644
--- a/Documentation/ctlv/abi/families.registry.yaml
+++ b/Documentation/ctlv/abi/families.registry.yaml
@@ -10,3 +10,4 @@ families:
- ctlv-test
- ctlv-test-child
- ctlv-attestation-sim
+ - ctlv-attestation-pci
diff --git a/Documentation/ctlv/families.yaml b/Documentation/ctlv/families.yaml
index db8b5185af11..8c1efa5e66bb 100644
--- a/Documentation/ctlv/families.yaml
+++ b/Documentation/ctlv/families.yaml
@@ -16,3 +16,4 @@ families:
- ctlv-test
- ctlv-test-child
- ctlv-attestation-sim
+ - ctlv-attestation-pci
diff --git a/Documentation/ctlv/generated-files.yaml b/Documentation/ctlv/generated-files.yaml
index 3e6cda5fd91f..505e1db064e1 100644
--- a/Documentation/ctlv/generated-files.yaml
+++ b/Documentation/ctlv/generated-files.yaml
@@ -67,3 +67,14 @@ families:
tools/testing/selftests/attestation/ctlv_attestation_sim_user_gen.h
user-source: >-
tools/testing/selftests/attestation/ctlv_attestation_sim_user_gen.c
+
+ - name: ctlv-attestation-pci
+ source: Documentation/ctlv/specs/ctlv-attestation-pci.yaml
+ outputs:
+ uapi-header: include/uapi/linux/ctlv_attestation_pci_gen.h
+ kernel-header: drivers/pci/tsm/ctlv_attestation_pci_gen.h
+ kernel-source: drivers/pci/tsm/ctlv_attestation_pci_gen.c
+ user-header: >-
+ tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.h
+ user-source: >-
+ tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.c
diff --git a/Documentation/ctlv/specs/ctlv-attestation-pci.yaml b/Documentation/ctlv/specs/ctlv-attestation-pci.yaml
new file mode 100644
index 000000000000..edb35cede0c2
--- /dev/null
+++ b/Documentation/ctlv/specs/ctlv-attestation-pci.yaml
@@ -0,0 +1,79 @@
+# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+%YAML 1.2
+---
+family:
+ name: ctlv-attestation-pci
+ inherits: ctlv-attestation
+ pre-init: true
+
+attr-groups:
+ - name: pci
+ attrs:
+ - name: name
+ type: string
+ min-length: 1
+ max-length: 31
+ - name: generation
+ type: uint
+ max: 4294967295
+ - name: tsm-id
+ type: uint
+ max: 2147483647
+ - name: connected
+ type: uint
+ max: 1
+ - name: locked
+ type: uint
+ max: 1
+ - name: accepted
+ type: uint
+ max: 1
+ - name: dsm
+ type: string
+ min-length: 1
+ max-length: 31
+
+ - name: object
+ enum: evidence-blob-class
+ - name: challenge
+ type: binary
+ min-length: 32
+ max-length: 32
+
+attr-sets:
+ - name: device-info
+ attrs: pci.name
+ - name: change-reply
+ attrs: pci.generation
+ - name: state-reply
+ attrs:
+ - pci.generation
+ - pci.connected
+ - pci.locked
+ - pci.accepted
+ optional-attrs:
+ - pci.tsm-id
+ - pci.dsm
+
+ - name: refresh-request
+ attrs:
+ - pci.generation
+ - pci.object
+ optional-attrs:
+ - pci.challenge
+
+ops:
+ - name: state-get
+ type: action
+ fd-access: read
+ reply:
+ attrs: state-reply
+ - name: evidence-refresh
+ type: action
+ fd-access: read-write
+ availability: dynamic
+ optional: true
+ request:
+ attrs: refresh-request
+ reply:
+ attrs: change-reply
diff --git a/drivers/pci/tsm/ctlv_attestation_pci_gen.c b/drivers/pci/tsm/ctlv_attestation_pci_gen.c
new file mode 100644
index 000000000000..a857fe158dc8
--- /dev/null
+++ b/drivers/pci/tsm/ctlv_attestation_pci_gen.c
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+/* Do not edit, regenerate with tools/ctlv/ctlv-regen.sh, from: */
+/* Documentation/ctlv/specs/ctlv-attestation-pci.yaml */
+/* CTLV-GEN kernel source */
+
+#define _CTLV_GENERATED_METADATA_ONLY
+#include <linux/array_size.h>
+#include <linux/build_bug.h>
+#include <linux/ctlv_family.h>
+#include <linux/export.h>
+#include <linux/limits.h>
+
+#include <uapi/linux/ctlv_gen.h>
+#include <uapi/linux/ctlv_attestation_pci_gen.h>
+
+#include "ctlv_attestation_pci_gen.h"
+
+static const struct ctlv_node_schema state_get_request_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(0, 0, 0),
+};
+
+static const struct ctlv_node_schema state_get_reply_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 6, 4),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION, 1, 0, U32_MAX),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_PCI_ATTR_PCI_CONNECTED, 1, 0, 1),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_PCI_ATTR_PCI_LOCKED, 1, 0, 1),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_PCI_ATTR_PCI_ACCEPTED, 1, 0, 1),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_PCI_ATTR_PCI_TSM_ID, 1, 0, 2147483647),
+ CTLV_NODE_SCHEMA_STRING(CTLV_ATTESTATION_PCI_ATTR_PCI_DSM, 1, 1, 31),
+};
+
+static const struct ctlv_node_schema evidence_refresh_request_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 3, 2),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION, 1, 0, U32_MAX),
+ CTLV_NODE_SCHEMA_ENUM(CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT, 1, 9),
+ CTLV_NODE_SCHEMA_BINARY(CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE, 1, 32, 32),
+};
+
+static const struct ctlv_node_schema evidence_refresh_reply_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 1, 1),
+ CTLV_NODE_SCHEMA_UINT(CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION, 1, 0, U32_MAX),
+};
+
+static const struct ctlv_node_schema device_info_fill_node_schemas[] = {
+ CTLV_NODE_SCHEMA_ROOT(1, 1, 1),
+ CTLV_NODE_SCHEMA_STRING(CTLV_ATTESTATION_PCI_ATTR_PCI_NAME, 1, 1, 31),
+};
+
+/* The extension points this family fills. */
+static const struct ctlv_stub_fill_schema ctlv_attestation_pci_stub_fill_schemas[] = {
+ CTLV_STUB_FILL_SCHEMA(CTLV_FAMILY_ATTESTATION, CTLV_ATTESTATION_SET_DEVICE_INFO,
+ device_info),
+};
+
+/* The ops this family declares, in declaration order. */
+const struct ctlv_op_schema ctlv_attestation_pci_op_schemas[] = {
+ CTLV_OP_SCHEMA_ACTION(CTLV_ATTESTATION_PCI_OP_STATE_GET, CTLV_OP_FD_ACCESS_READ,
+ CTLV_OP_AVAILABILITY_FIXED, 16, 184,
+ CTLV_SCHEMA_TREE(state_get_request),
+ CTLV_SCHEMA_TREE(state_get_reply)),
+ CTLV_OP_SCHEMA_ACTION(CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH,
+ CTLV_OP_FD_ACCESS_READ_WRITE, CTLV_OP_AVAILABILITY_DYNAMIC, 112, 40,
+ CTLV_SCHEMA_TREE(evidence_refresh_request),
+ CTLV_SCHEMA_TREE(evidence_refresh_reply), .optional = true),
+};
+
+/* The family ID is its position in the central registry. */
+const struct ctlv_family_schema ctlv_attestation_pci_schema = {
+ .name = "ctlv-attestation-pci",
+ .family_id = 6,
+ .ops = ctlv_attestation_pci_op_schemas,
+ .ops_count = ARRAY_SIZE(ctlv_attestation_pci_op_schemas),
+ .stub_fill_schemas = ctlv_attestation_pci_stub_fill_schemas,
+ .stub_fill_schemas_count = ARRAY_SIZE(ctlv_attestation_pci_stub_fill_schemas),
+};
+
+/* Maximum uevent cost for this family chain. */
+static_assert(150 <= CTLV_UEVENT_MAX_LEN);
+static_assert(5 <= CTLV_UEVENT_MAX_VARS);
+
+/* Guards for generated maxima. */
+static_assert(184 <= CTLV_MAX_INLINE_MESSAGE_LEN);
+
+/* Local action and query bindings in declaration order. */
+static const struct ctlv_op ctlv_attestation_pci_ops[] = {
+ CTLV_OP_ACTION(ctlv_attestation_pci_state_get),
+ CTLV_OP_ACTION(ctlv_attestation_pci_evidence_refresh),
+};
+
+/* Extension-point callbacks. */
+static const struct ctlv_stub_ops ctlv_attestation_pci_stub_ops[] = {
+ CTLV_STUB_OPS(CTLV_FAMILY_ATTESTATION, CTLV_ATTESTATION_SET_DEVICE_INFO,
+ ctlv_attestation_pci_device_info),
+};
+
+/* Family descriptor used by ctlv_create(). */
+const struct ctlv_family ctlv_attestation_pci_family = {
+ .schema = &ctlv_attestation_pci_schema,
+ .parent = &ctlv_attestation_family,
+ .ops = ctlv_attestation_pci_ops,
+ .ops_count = ARRAY_SIZE(ctlv_attestation_pci_ops),
+ .pre = ctlv_attestation_pci_op_pre,
+ .post = ctlv_attestation_pci_op_post,
+ .priv_size = ctlv_attestation_pci_priv_size,
+ .pre_init = ctlv_attestation_pci_pre_init,
+ .init = ctlv_attestation_pci_init,
+ .fini = ctlv_attestation_pci_fini,
+ .stub_ops = ctlv_attestation_pci_stub_ops,
+ .stub_ops_count = ARRAY_SIZE(ctlv_attestation_pci_stub_ops),
+};
+EXPORT_SYMBOL_NS_GPL(ctlv_attestation_pci_family, "CTLV");
diff --git a/drivers/pci/tsm/ctlv_attestation_pci_gen.h b/drivers/pci/tsm/ctlv_attestation_pci_gen.h
new file mode 100644
index 000000000000..95cad4e7b0bf
--- /dev/null
+++ b/drivers/pci/tsm/ctlv_attestation_pci_gen.h
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+/* Do not edit, regenerate with tools/ctlv/ctlv-regen.sh, from: */
+/* Documentation/ctlv/specs/ctlv-attestation-pci.yaml */
+/* CTLV-GEN kernel header */
+
+/* Kernel metadata and family API of the ctlv-attestation-pci CTLV family. */
+
+#ifndef _LINUX_CTLV_ATTESTATION_PCI_GEN_H
+#define _LINUX_CTLV_ATTESTATION_PCI_GEN_H
+
+#include <linux/ctlv_family.h>
+#include <linux/err.h>
+#include <linux/errno.h>
+
+#include <uapi/linux/ctlv_attestation_pci_gen.h>
+
+#include "ctlv_attestation_gen.h"
+
+/* Ops this family declares, in declaration order. */
+extern const struct ctlv_op_schema ctlv_attestation_pci_op_schemas[];
+
+extern const struct ctlv_family_schema ctlv_attestation_pci_schema;
+
+/* Implemented by this family, one per action and query it declares. */
+int ctlv_attestation_pci_state_get_action(void *priv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *request,
+ struct ctlv_cursor *reply);
+int ctlv_attestation_pci_evidence_refresh_action(void *priv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *request,
+ struct ctlv_cursor *reply);
+
+/* Family-wide hooks around every effective non-core op. */
+int ctlv_attestation_pci_op_pre(void *priv, struct ctlv_op_ctx *ctx);
+void ctlv_attestation_pci_op_post(void *priv, struct ctlv_op_ctx *ctx);
+
+/* Core-allocated family priv lifecycle. */
+size_t ctlv_attestation_pci_priv_size(void);
+const void *ctlv_attestation_pci_pre_init(const void *init_info);
+int ctlv_attestation_pci_init(struct ctlv_device *ctlvdev, const void *init_info, void *priv);
+void ctlv_attestation_pci_fini(struct ctlv_device *ctlvdev, void *priv);
+
+/* device-info of ctlv-attestation: fill and read callbacks. */
+int ctlv_attestation_pci_device_info_fill(void *priv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *request,
+ struct ctlv_cursor *nest);
+void ctlv_attestation_pci_device_info_read(void *priv, struct ctlv_op_ctx *ctx,
+ const struct ctlv_cursor *nest);
+
+extern const struct ctlv_family ctlv_attestation_pci_family;
+
+#ifndef _CTLV_GENERATED_METADATA_ONLY
+
+/* Optional publication and dynamic availability helpers. */
+CTLV_OP_PROVIDE(ctlv_attestation_pci_evidence_refresh, CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH)
+CTLV_OP_ENABLE(ctlv_attestation_pci_evidence_refresh, CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH)
+CTLV_OP_DISABLE(ctlv_attestation_pci_evidence_refresh, CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH)
+
+/* Reading a validated message. A blob has a resolver instead of a getter. */
+CTLV_IN_REF(ctlv_attestation_pci_evidence_refresh_generation,
+ &ctlv_attestation_pci_op_schemas[1].request, CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION,
+ 0, 0, CTLV_SCHEMA_UINT)
+CTLV_IN_HAS(ctlv_attestation_pci_evidence_refresh_generation)
+CTLV_IN_U64(ctlv_attestation_pci_evidence_refresh_generation)
+CTLV_IN_REF(ctlv_attestation_pci_evidence_refresh_object,
+ &ctlv_attestation_pci_op_schemas[1].request, CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT, 0, 1,
+ CTLV_SCHEMA_ENUM)
+CTLV_IN_HAS(ctlv_attestation_pci_evidence_refresh_object)
+CTLV_IN_U64(ctlv_attestation_pci_evidence_refresh_object)
+CTLV_IN_REF(ctlv_attestation_pci_evidence_refresh_challenge,
+ &ctlv_attestation_pci_op_schemas[1].request, CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE, 0,
+ 2, CTLV_SCHEMA_BINARY)
+CTLV_IN_HAS(ctlv_attestation_pci_evidence_refresh_challenge)
+CTLV_IN_BINARY(ctlv_attestation_pci_evidence_refresh_challenge)
+CTLV_IN_REF(ctlv_attestation_pci_device_info_name,
+ &ctlv_attestation_pci_schema.stub_fill_schemas[0].members,
+ CTLV_ATTESTATION_PCI_ATTR_PCI_NAME, 0, 0, CTLV_SCHEMA_STRING)
+CTLV_IN_HAS(ctlv_attestation_pci_device_info_name)
+CTLV_IN_STRING(ctlv_attestation_pci_device_info_name)
+
+/* Writing a reply. An append is atomic; a nest ends with ctlv_nest_end(). */
+CTLV_PUT_STRING(ctlv_attestation_pci_pci_name, CTLV_ATTESTATION_PCI_ATTR_PCI_NAME,
+ CTLV_SCHEMA_STRING)
+CTLV_PUT_U64(ctlv_attestation_pci_pci_generation, CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION,
+ CTLV_SCHEMA_UINT)
+CTLV_PUT_U64(ctlv_attestation_pci_pci_tsm_id, CTLV_ATTESTATION_PCI_ATTR_PCI_TSM_ID,
+ CTLV_SCHEMA_UINT)
+CTLV_PUT_U64(ctlv_attestation_pci_pci_connected, CTLV_ATTESTATION_PCI_ATTR_PCI_CONNECTED,
+ CTLV_SCHEMA_UINT)
+CTLV_PUT_U64(ctlv_attestation_pci_pci_locked, CTLV_ATTESTATION_PCI_ATTR_PCI_LOCKED,
+ CTLV_SCHEMA_UINT)
+CTLV_PUT_U64(ctlv_attestation_pci_pci_accepted, CTLV_ATTESTATION_PCI_ATTR_PCI_ACCEPTED,
+ CTLV_SCHEMA_UINT)
+CTLV_PUT_STRING(ctlv_attestation_pci_pci_dsm, CTLV_ATTESTATION_PCI_ATTR_PCI_DSM, CTLV_SCHEMA_STRING)
+CTLV_PUT_U64(ctlv_attestation_pci_pci_object, CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT,
+ CTLV_SCHEMA_ENUM)
+CTLV_PUT_BINARY(ctlv_attestation_pci_pci_challenge, CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE,
+ CTLV_SCHEMA_BINARY)
+#endif /* _CTLV_GENERATED_METADATA_ONLY */
+
+#endif /* _LINUX_CTLV_ATTESTATION_PCI_GEN_H */
diff --git a/include/uapi/linux/ctlv_attestation_pci_gen.h b/include/uapi/linux/ctlv_attestation_pci_gen.h
new file mode 100644
index 000000000000..160385bc2c2d
--- /dev/null
+++ b/include/uapi/linux/ctlv_attestation_pci_gen.h
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+/* Do not edit, regenerate with tools/ctlv/ctlv-regen.sh, from: */
+/* Documentation/ctlv/specs/ctlv-attestation-pci.yaml */
+/* CTLV-GEN uapi header */
+
+/*
+ * Constants of the ctlv-attestation-pci CTLV family. Attr and op IDs are complete; the wire format
+ * carrying them is in <linux/ctlv.h>.
+ *
+ * The inherited ctlv-attestation header is included here, so one include covers the whole effective
+ * schema.
+ */
+
+#ifndef _UAPI_LINUX_CTLV_ATTESTATION_PCI_GEN_H
+#define _UAPI_LINUX_CTLV_ATTESTATION_PCI_GEN_H
+
+#include <linux/ctlv.h>
+#include <linux/ctlv_attestation_gen.h>
+#include <linux/ctlv_families_gen.h>
+
+/* attr groups */
+enum _ctlv_attestation_pci_group {
+ CTLV_ATTESTATION_PCI_GROUP_PCI = 1,
+};
+
+#define _CTLV_ATTESTATION_PCI_ATTR(_group, _attr) \
+ CTLV_ATTR(CTLV_FAMILY_ATTESTATION_PCI, (_group), (_attr))
+
+/* attrs of group pci */
+#define _CTLV_ATTESTATION_PCI_ATTR_PCI(_attr) \
+ _CTLV_ATTESTATION_PCI_ATTR(CTLV_ATTESTATION_PCI_GROUP_PCI, \
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_##_attr)
+
+enum _ctlv_attestation_pci_attr_pci {
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_NAME = 1,
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION,
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_TSM_ID,
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_CONNECTED,
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_LOCKED,
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_ACCEPTED,
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_DSM,
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT,
+ _CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE,
+};
+
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_NAME _CTLV_ATTESTATION_PCI_ATTR_PCI(NAME)
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION _CTLV_ATTESTATION_PCI_ATTR_PCI(GENERATION)
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_TSM_ID _CTLV_ATTESTATION_PCI_ATTR_PCI(TSM_ID)
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_CONNECTED _CTLV_ATTESTATION_PCI_ATTR_PCI(CONNECTED)
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_LOCKED _CTLV_ATTESTATION_PCI_ATTR_PCI(LOCKED)
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_ACCEPTED _CTLV_ATTESTATION_PCI_ATTR_PCI(ACCEPTED)
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_DSM _CTLV_ATTESTATION_PCI_ATTR_PCI(DSM)
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT _CTLV_ATTESTATION_PCI_ATTR_PCI(OBJECT)
+#define CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE _CTLV_ATTESTATION_PCI_ATTR_PCI(CHALLENGE)
+
+/* attr sets */
+enum _ctlv_attestation_pci_set {
+ CTLV_ATTESTATION_PCI_SET_CHANGE_REPLY = 1,
+ CTLV_ATTESTATION_PCI_SET_STATE_REPLY,
+ CTLV_ATTESTATION_PCI_SET_REFRESH_REQUEST,
+};
+
+/* ops */
+enum _ctlv_attestation_pci_op {
+ _CTLV_ATTESTATION_PCI_OP_STATE_GET = 1,
+ _CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH,
+};
+
+#define _CTLV_ATTESTATION_PCI_OP(_op) \
+ CTLV_OP(CTLV_FAMILY_ATTESTATION_PCI, _CTLV_ATTESTATION_PCI_OP_##_op)
+#define CTLV_ATTESTATION_PCI_OP_STATE_GET _CTLV_ATTESTATION_PCI_OP(STATE_GET)
+#define CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH _CTLV_ATTESTATION_PCI_OP(EVIDENCE_REFRESH)
+
+#endif /* _UAPI_LINUX_CTLV_ATTESTATION_PCI_GEN_H */
diff --git a/include/uapi/linux/ctlv_families_gen.h b/include/uapi/linux/ctlv_families_gen.h
index 19c478660429..bad143ec85fd 100644
--- a/include/uapi/linux/ctlv_families_gen.h
+++ b/include/uapi/linux/ctlv_families_gen.h
@@ -15,6 +15,7 @@ enum _ctlv_family {
CTLV_FAMILY_TEST,
CTLV_FAMILY_TEST_CHILD,
CTLV_FAMILY_ATTESTATION_SIM,
+ CTLV_FAMILY_ATTESTATION_PCI,
};
#endif /* _UAPI_LINUX_CTLV_FAMILIES_GEN_H */
diff --git a/tools/ctlv/tests/support.py b/tools/ctlv/tests/support.py
index c50bb6b5b831..ddddefe48d4c 100644
--- a/tools/ctlv/tests/support.py
+++ b/tools/ctlv/tests/support.py
@@ -31,7 +31,8 @@ FIXTURE_REGISTRY = TESTS_DIR / 'families.yaml'
# Every registered family, in registry order.
FAMILIES = ('ctlv', 'ctlv-attestation', 'ctlv-attestation-tdx',
- 'ctlv-test', 'ctlv-test-child', 'ctlv-attestation-sim')
+ 'ctlv-test', 'ctlv-test-child', 'ctlv-attestation-sim',
+ 'ctlv-attestation-pci')
# The fixture families, in fixture registry order: a parent holding one of
# every shape the language allows, and a child that inherits it.
diff --git a/tools/ctlv/tests/test_outputs.py b/tools/ctlv/tests/test_outputs.py
index 5be773189ae1..c2443b2963db 100644
--- a/tools/ctlv/tests/test_outputs.py
+++ b/tools/ctlv/tests/test_outputs.py
@@ -67,9 +67,9 @@ class TestGeneratedOutputs(unittest.TestCase):
def test_manifest_is_complete_and_unique(self):
plan = outputs.load(self.paths)
- self.assertEqual(37, len(plan))
- self.assertEqual(37, len({item.path for item in plan}))
- self.assertEqual(37, len({(item.source, item.flavour)
+ self.assertEqual(42, len(plan))
+ self.assertEqual(42, len({item.path for item in plan}))
+ self.assertEqual(42, len({(item.source, item.flavour)
for item in plan}))
registry_outputs = [item for item in plan if item.family is None]
self.assertEqual(
diff --git a/tools/ctlv/tests/test_semantics.py b/tools/ctlv/tests/test_semantics.py
index 70f0a99f44f6..c0fb0b336db7 100644
--- a/tools/ctlv/tests/test_semantics.py
+++ b/tools/ctlv/tests/test_semantics.py
@@ -576,6 +576,44 @@ class TestRecursion(unittest.TestCase):
'the same members, node for node')
+class TestPciAttestationPolicy(unittest.TestCase):
+ def test_connection_controls_are_not_in_ctlv(self):
+ family = support.load('ctlv-attestation-pci')
+ names = {op.name for op in family.ops}
+ self.assertNotIn('connect', names)
+ self.assertNotIn('disconnect', names)
+ self.assertNotIn('lock', names)
+ self.assertNotIn('unlock', names)
+ self.assertNotIn('devsec-run', names)
+
+ def test_backend_dependent_operations_are_dynamic(self):
+ family = support.load('ctlv-attestation-pci')
+ for name in ('evidence-refresh', 'evidence-get', 'evidence-accept',
+ 'evidence-accept-clear', 'devsec-state-get'):
+ with self.subTest(op=name):
+ op = support.op(family, name)
+ self.assertEqual('dynamic', op.availability)
+ self.assertTrue(op.optional)
+
+ def test_refresh_selects_an_object_with_an_optional_challenge(self):
+ family = support.load('ctlv-attestation-pci')
+ request = support.op(family, 'evidence-refresh').request
+ target = support.placement(request, 'pci.object')
+ challenge = support.placement(request, 'pci.challenge')
+ self.assertTrue(target.required)
+ self.assertFalse(challenge.required)
+ self.assertEqual(family.attrs['evidence.blob-class'].decl.ref,
+ target.attr.decl.ref)
+
+ def test_state_operations_are_fixed(self):
+ family = support.load('ctlv-attestation-pci')
+ for name in ('state-get', 'device-get'):
+ with self.subTest(op=name):
+ op = support.op(family, name)
+ self.assertEqual('fixed', op.availability)
+ self.assertFalse(op.optional)
+
+
class TestDump(unittest.TestCase):
def test_repeated_renders_are_identical(self):
for name in support.ALL_FAMILIES:
diff --git a/tools/ctlv/tests/test_spec.py b/tools/ctlv/tests/test_spec.py
index d80b16673675..248db73b044d 100644
--- a/tools/ctlv/tests/test_spec.py
+++ b/tools/ctlv/tests/test_spec.py
@@ -347,6 +347,7 @@ class TestRegistry(unittest.TestCase):
self.assertEqual(3, registry.family_id('ctlv-test'))
self.assertEqual(4, registry.family_id('ctlv-test-child'))
self.assertEqual(5, registry.family_id('ctlv-attestation-sim'))
+ self.assertEqual(6, registry.family_id('ctlv-attestation-pci'))
def test_the_fixture_registry_numbers_the_fixture_families(self):
registry = spec.load_registry(
diff --git a/tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.c b/tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.c
new file mode 100644
index 000000000000..dcf1477f3941
--- /dev/null
+++ b/tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.c
@@ -0,0 +1,1697 @@
+// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+/* Do not edit, regenerate with tools/ctlv/ctlv-regen.sh, from: */
+/* Documentation/ctlv/specs/ctlv-attestation-pci.yaml */
+/* CTLV-GEN user source */
+
+#include <stdint.h>
+
+#include <ctlv.h>
+
+#include "ctlv_attestation_pci_user_gen.h"
+
+/* Effective request and reply schemas. */
+
+static const struct ctlv_node_schema device_get_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+};
+
+/* cap.object, attrs */
+static const struct ctlv_node_schema device_get_reply_caps_evidence_object_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_BLOB_CLASS,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 9,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_FORMAT,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_REPRESENTATION,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 2,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 2,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_MAX_LENGTH,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = UINT64_MAX,
+ },
+};
+
+/* cap.object, optional attrs */
+static const struct ctlv_node_schema
+ device_get_reply_caps_evidence_object_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_BLOB_INSTANCE,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 21,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+};
+
+/* cap.evidence, attrs */
+static const struct ctlv_node_schema device_get_reply_caps_evidence_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_MIN_CHALLENGE_LENGTH,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = UINT64_MAX,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_MAX_CHALLENGE_LENGTH,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = UINT64_MAX,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_MAX_TOTAL_OUTPUT_LENGTH,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = UINT64_MAX,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_OBJECT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 16,
+ .attrs = device_get_reply_caps_evidence_object_attr_node_schemas,
+ .attrs_count = 4,
+ .optional_attrs = device_get_reply_caps_evidence_object_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+ },
+};
+
+/* cap.evidence, optional attrs */
+static const struct ctlv_node_schema device_get_reply_caps_evidence_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_EVIDENCE_FLAGS,
+ .kind = CTLV_SCHEMA_FLAGS,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_FLAGS_MASK,
+ .flags_mask = 15,
+ },
+};
+
+/* cap.mr, attrs */
+static const struct ctlv_node_schema device_get_reply_caps_mr_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_MR_FLAGS,
+ .kind = CTLV_SCHEMA_FLAGS,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_FLAGS_MASK,
+ .flags_mask = 7,
+ },
+};
+
+/* device.caps, optional attrs */
+static const struct ctlv_node_schema device_get_reply_caps_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_EVIDENCE,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = device_get_reply_caps_evidence_attr_node_schemas,
+ .attrs_count = 4,
+ .optional_attrs = device_get_reply_caps_evidence_optional_attr_node_schemas,
+ .optional_attrs_count = 1,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_CAP_MR,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = device_get_reply_caps_mr_attr_node_schemas,
+ .attrs_count = 1,
+ },
+};
+
+/* device.info, attrs */
+static const struct ctlv_node_schema device_get_reply_info_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_NAME,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 31,
+ },
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema device_get_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_CAPS,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .optional_attrs = device_get_reply_caps_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_INFO,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = device_get_reply_info_attr_node_schemas,
+ .attrs_count = 1,
+ },
+};
+
+static const struct ctlv_node_schema device_get_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = device_get_reply_attr_node_schemas,
+ .attrs_count = 3,
+};
+
+/* evidence.object, attrs */
+static const struct ctlv_node_schema evidence_get_request_object_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_BLOB_CLASS,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 9,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_FORMAT,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_REPRESENTATION,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 2,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_DATA,
+ .kind = CTLV_SCHEMA_BLOB,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_BLOB,
+ .blob_direction = CTLV_BLOB_DIRECTION_OUTPUT,
+ .blob_backings = 14,
+ .blob_max_length = 0xffffffffULL,
+ .blob_alignment = 1,
+ },
+};
+
+/* evidence.object, optional attrs */
+static const struct ctlv_node_schema evidence_get_request_object_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_BLOB_INSTANCE,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+};
+
+/* evidence.selection, attrs */
+static const struct ctlv_node_schema evidence_get_request_selection_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema evidence_get_request_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_OBJECT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 16,
+ .attrs = evidence_get_request_object_attr_node_schemas,
+ .attrs_count = 4,
+ .optional_attrs = evidence_get_request_object_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema evidence_get_request_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_CHALLENGE,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 0,
+ .max_length = 4096,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_SELECTION,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 256,
+ .attrs = evidence_get_request_selection_attr_node_schemas,
+ .attrs_count = 2,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_PRIVLEVEL,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_SERVICE_PROVIDER,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_SERVICE_GUID,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 16,
+ .max_length = 16,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_SERVICE_MANIFEST_VERSION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_OPTIONS,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ },
+};
+
+static const struct ctlv_node_schema evidence_get_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = evidence_get_request_attr_node_schemas,
+ .attrs_count = 1,
+ .optional_attrs = evidence_get_request_optional_attr_node_schemas,
+ .optional_attrs_count = 8,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema evidence_get_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_OBJECT_LENGTH,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 16,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = UINT64_MAX,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema evidence_get_reply_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+static const struct ctlv_node_schema evidence_get_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = evidence_get_reply_attr_node_schemas,
+ .attrs_count = 2,
+ .optional_attrs = evidence_get_reply_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema mr_get_request_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+static const struct ctlv_node_schema mr_get_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_get_request_attr_node_schemas,
+ .attrs_count = 1,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema mr_get_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_NAME,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_SUPPORTED_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 21,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_CAPS,
+ .kind = CTLV_SCHEMA_FLAGS,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_FLAGS_MASK,
+ .flags_mask = 7,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema mr_get_reply_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_REGISTER_INDEX,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_STATE_FLAGS,
+ .kind = CTLV_SCHEMA_FLAGS,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_FLAGS_MASK,
+ .flags_mask = 1,
+ },
+};
+
+static const struct ctlv_node_schema mr_get_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_get_reply_attr_node_schemas,
+ .attrs_count = 3,
+ .optional_attrs = mr_get_reply_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+};
+
+static const struct ctlv_node_schema mr_dump_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+};
+
+/* mr.item, attrs */
+static const struct ctlv_node_schema mr_dump_reply_item_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_NAME,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_SUPPORTED_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 21,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_CAPS,
+ .kind = CTLV_SCHEMA_FLAGS,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_FLAGS_MASK,
+ .flags_mask = 7,
+ },
+};
+
+/* mr.item, optional attrs */
+static const struct ctlv_node_schema mr_dump_reply_item_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_REGISTER_INDEX,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_STATE_FLAGS,
+ .kind = CTLV_SCHEMA_FLAGS,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_FLAGS_MASK,
+ .flags_mask = 1,
+ },
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema mr_dump_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ITEM,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 0, /* unlimited */
+ .attrs = mr_dump_reply_item_attr_node_schemas,
+ .attrs_count = 4,
+ .optional_attrs = mr_dump_reply_item_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+ },
+};
+
+static const struct ctlv_node_schema mr_dump_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_dump_reply_attr_node_schemas,
+ .attrs_count = 1,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema mr_read_request_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema mr_read_request_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_OPTIONS,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ },
+};
+
+static const struct ctlv_node_schema mr_read_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_read_request_attr_node_schemas,
+ .attrs_count = 1,
+ .optional_attrs = mr_read_request_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+};
+
+/* mr.value, attrs */
+static const struct ctlv_node_schema mr_read_reply_value_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 16,
+ .max_length = 64,
+ },
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema mr_read_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_VALUE,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 21,
+ .attrs = mr_read_reply_value_attr_node_schemas,
+ .attrs_count = 2,
+ },
+};
+
+static const struct ctlv_node_schema mr_read_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_read_reply_attr_node_schemas,
+ .attrs_count = 3,
+};
+
+/* mr.value, attrs */
+static const struct ctlv_node_schema mr_extend_request_value_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 16,
+ .max_length = 64,
+ },
+};
+
+/* record.item, attrs */
+static const struct ctlv_node_schema mr_extend_request_item_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_FORMAT,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 0,
+ .max_length = 4096,
+ },
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema mr_extend_request_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_VALUE,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 21,
+ .attrs = mr_extend_request_value_attr_node_schemas,
+ .attrs_count = 2,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema mr_extend_request_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_OPTIONS,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_ITEM,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_extend_request_item_attr_node_schemas,
+ .attrs_count = 2,
+ },
+};
+
+static const struct ctlv_node_schema mr_extend_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_extend_request_attr_node_schemas,
+ .attrs_count = 2,
+ .optional_attrs = mr_extend_request_optional_attr_node_schemas,
+ .optional_attrs_count = 3,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema mr_extend_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+static const struct ctlv_node_schema mr_extend_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_extend_reply_attr_node_schemas,
+ .attrs_count = 2,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema device_state_changed_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+static const struct ctlv_node_schema device_state_changed_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = device_state_changed_reply_attr_node_schemas,
+ .attrs_count = 1,
+};
+
+/* mr.value, attrs */
+static const struct ctlv_node_schema mr_log_entry_appended_reply_entry_value_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 16,
+ .max_length = 64,
+ },
+};
+
+/* log.mr, attrs */
+static const struct ctlv_node_schema mr_log_entry_appended_reply_entry_mr_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_NAME,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_SUPPORTED_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 21,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_CAPS,
+ .kind = CTLV_SCHEMA_FLAGS,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_FLAGS_MASK,
+ .flags_mask = 7,
+ },
+};
+
+/* log.mr, optional attrs */
+static const struct ctlv_node_schema
+ mr_log_entry_appended_reply_entry_mr_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_REGISTER_INDEX,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+/* log.ima, attrs */
+static const struct ctlv_node_schema mr_log_entry_appended_reply_entry_ima_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_TEMPLATE_NAME,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_TEMPLATE_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 0,
+ .max_length = 0x10000ULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_VIOLATION,
+ .kind = CTLV_SCHEMA_BOOL,
+ .max_occurrences = 1,
+ },
+};
+
+/* record.item, attrs */
+static const struct ctlv_node_schema mr_log_entry_appended_reply_entry_item_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_FORMAT,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 0,
+ .max_length = 4096,
+ },
+};
+
+/* notification.entry, attrs */
+static const struct ctlv_node_schema mr_log_entry_appended_reply_entry_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_EVENT,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 2,
+ },
+};
+
+/* notification.entry, optional attrs */
+static const struct ctlv_node_schema
+ mr_log_entry_appended_reply_entry_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_VALUE,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 21,
+ .attrs = mr_log_entry_appended_reply_entry_value_attr_node_schemas,
+ .attrs_count = 2,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_MR,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_log_entry_appended_reply_entry_mr_attr_node_schemas,
+ .attrs_count = 3,
+ .optional_attrs = mr_log_entry_appended_reply_entry_mr_optional_attr_node_schemas,
+ .optional_attrs_count = 1,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_IMA,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_log_entry_appended_reply_entry_ima_attr_node_schemas,
+ .attrs_count = 3,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_ITEM,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_log_entry_appended_reply_entry_item_attr_node_schemas,
+ .attrs_count = 2,
+ },
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema mr_log_entry_appended_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_NOTIFICATION_ENTRY,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_log_entry_appended_reply_entry_attr_node_schemas,
+ .attrs_count = 4,
+ .optional_attrs = mr_log_entry_appended_reply_entry_optional_attr_node_schemas,
+ .optional_attrs_count = 4,
+ },
+};
+
+static const struct ctlv_node_schema mr_log_entry_appended_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_log_entry_appended_reply_attr_node_schemas,
+ .attrs_count = 1,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema evidence_accept_request_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+static const struct ctlv_node_schema evidence_accept_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = evidence_accept_request_attr_node_schemas,
+ .attrs_count = 2,
+};
+
+static const struct ctlv_node_schema evidence_accept_clear_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+};
+
+static const struct ctlv_node_schema devsec_state_get_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema devsec_state_get_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema devsec_state_get_reply_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_ACCEPTED_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVSEC_TDISP_STATE,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 4,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVSEC_DEVICE_TRUST,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 5,
+ },
+};
+
+static const struct ctlv_node_schema devsec_state_get_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = devsec_state_get_reply_attr_node_schemas,
+ .attrs_count = 1,
+ .optional_attrs = devsec_state_get_reply_optional_attr_node_schemas,
+ .optional_attrs_count = 4,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema evidence_state_changed_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema evidence_state_changed_reply_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_EVIDENCE_ACCEPTED_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+static const struct ctlv_node_schema evidence_state_changed_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = evidence_state_changed_reply_attr_node_schemas,
+ .attrs_count = 1,
+ .optional_attrs = evidence_state_changed_reply_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+};
+
+/* mr.selection, attrs */
+static const struct ctlv_node_schema mr_log_get_request_selection_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema mr_log_get_request_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_SELECTION,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 256,
+ .attrs = mr_log_get_request_selection_attr_node_schemas,
+ .attrs_count = 1,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_START_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_END_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+static const struct ctlv_node_schema mr_log_get_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .optional_attrs = mr_log_get_request_optional_attr_node_schemas,
+ .optional_attrs_count = 3,
+};
+
+/* mr.value, attrs */
+static const struct ctlv_node_schema mr_log_get_reply_entry_value_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 16,
+ .max_length = 64,
+ },
+};
+
+/* log.mr, attrs */
+static const struct ctlv_node_schema mr_log_get_reply_entry_mr_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_NAME,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_SUPPORTED_HASH_ALGO,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 21,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 20,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_CAPS,
+ .kind = CTLV_SCHEMA_FLAGS,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_FLAGS_MASK,
+ .flags_mask = 7,
+ },
+};
+
+/* log.mr, optional attrs */
+static const struct ctlv_node_schema mr_log_get_reply_entry_mr_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_REGISTER_INDEX,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+/* log.ima, attrs */
+static const struct ctlv_node_schema mr_log_get_reply_entry_ima_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_TEMPLATE_NAME,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_TEMPLATE_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 0,
+ .max_length = 0x10000ULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_VIOLATION,
+ .kind = CTLV_SCHEMA_BOOL,
+ .max_occurrences = 1,
+ },
+};
+
+/* record.item, attrs */
+static const struct ctlv_node_schema mr_log_get_reply_entry_item_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_FORMAT,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 128,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_DATA,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 0,
+ .max_length = 4096,
+ },
+};
+
+/* log.entry, attrs */
+static const struct ctlv_node_schema mr_log_get_reply_entry_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_DEVICE_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_EVENT,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 2,
+ },
+};
+
+/* log.entry, optional attrs */
+static const struct ctlv_node_schema mr_log_get_reply_entry_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_VALUE,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 21,
+ .attrs = mr_log_get_reply_entry_value_attr_node_schemas,
+ .attrs_count = 2,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_MR,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_log_get_reply_entry_mr_attr_node_schemas,
+ .attrs_count = 3,
+ .optional_attrs = mr_log_get_reply_entry_mr_optional_attr_node_schemas,
+ .optional_attrs_count = 1,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_IMA,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_log_get_reply_entry_ima_attr_node_schemas,
+ .attrs_count = 3,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_RECORD_ITEM,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = mr_log_get_reply_entry_item_attr_node_schemas,
+ .attrs_count = 2,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema mr_log_get_reply_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_START_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_MR_END_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_ATTR_LOG_ENTRY,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 0, /* unlimited */
+ .attrs = mr_log_get_reply_entry_attr_node_schemas,
+ .attrs_count = 4,
+ .optional_attrs = mr_log_get_reply_entry_optional_attr_node_schemas,
+ .optional_attrs_count = 4,
+ },
+};
+
+static const struct ctlv_node_schema mr_log_get_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .optional_attrs = mr_log_get_reply_optional_attr_node_schemas,
+ .optional_attrs_count = 3,
+};
+
+static const struct ctlv_node_schema state_get_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema state_get_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_CONNECTED,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 1,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_LOCKED,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 1,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_ACCEPTED,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 1,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema state_get_reply_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_TSM_ID,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0x7fffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_DSM,
+ .kind = CTLV_SCHEMA_STRING,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 1,
+ .max_length = 31,
+ },
+};
+
+static const struct ctlv_node_schema state_get_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = state_get_reply_attr_node_schemas,
+ .attrs_count = 4,
+ .optional_attrs = state_get_reply_optional_attr_node_schemas,
+ .optional_attrs_count = 2,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema evidence_refresh_request_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT,
+ .kind = CTLV_SCHEMA_ENUM,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 1,
+ .max = 9,
+ },
+};
+
+/* root, optional attrs */
+static const struct ctlv_node_schema evidence_refresh_request_optional_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE,
+ .kind = CTLV_SCHEMA_BINARY,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN_LENGTH | CTLV_NODE_SCHEMA_HAS_MAX_LENGTH,
+ .min_length = 32,
+ .max_length = 32,
+ },
+};
+
+static const struct ctlv_node_schema evidence_refresh_request_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = evidence_refresh_request_attr_node_schemas,
+ .attrs_count = 2,
+ .optional_attrs = evidence_refresh_request_optional_attr_node_schemas,
+ .optional_attrs_count = 1,
+};
+
+/* root, attrs */
+static const struct ctlv_node_schema evidence_refresh_reply_attr_node_schemas[] = {
+ {
+ .attr_id = CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION,
+ .kind = CTLV_SCHEMA_UINT,
+ .max_occurrences = 1,
+ .present = CTLV_NODE_SCHEMA_HAS_MIN | CTLV_NODE_SCHEMA_HAS_MAX,
+ .min = 0,
+ .max = 0xffffffffULL,
+ },
+};
+
+static const struct ctlv_node_schema evidence_refresh_reply_node_schema = {
+ .attr_id = CTLV_ATTR_ROOT,
+ .kind = CTLV_SCHEMA_NEST,
+ .max_occurrences = 1,
+ .attrs = evidence_refresh_reply_attr_node_schemas,
+ .attrs_count = 1,
+};
+
+/* Effective ops in declaration order. */
+static const struct ctlv_op_spec ctlv_attestation_pci_op_specs[] = {
+ {
+ .op_id = CTLV_ATTESTATION_OP_DEVICE_GET,
+ .type = CTLV_OP_TYPE_ACTION,
+ .fd_access = CTLV_OP_FD_ACCESS_READ,
+ .availability = CTLV_OP_AVAILABILITY_FIXED,
+ .request_max_len = 16,
+ .action_reply_max_len = 12944,
+ .request = &device_get_request_node_schema,
+ .reply = &device_get_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_EVIDENCE_GET,
+ .type = CTLV_OP_TYPE_ACTION,
+ .fd_access = CTLV_OP_FD_ACCESS_READ_WRITE,
+ .availability = CTLV_OP_AVAILABILITY_DYNAMIC,
+ .optional = true,
+ .request_max_len = 26800,
+ .action_reply_max_len = 472,
+ .request = &evidence_get_request_node_schema,
+ .reply = &evidence_get_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_MR_GET,
+ .type = CTLV_OP_TYPE_ACTION,
+ .fd_access = CTLV_OP_FD_ACCESS_READ,
+ .availability = CTLV_OP_AVAILABILITY_FIXED,
+ .optional = true,
+ .request_max_len = 40,
+ .action_reply_max_len = 744,
+ .request = &mr_get_request_node_schema,
+ .reply = &mr_get_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_MR_DUMP,
+ .type = CTLV_OP_TYPE_QUERY,
+ .fd_access = CTLV_OP_FD_ACCESS_READ,
+ .availability = CTLV_OP_AVAILABILITY_FIXED,
+ .optional = true,
+ .request_max_len = 16,
+ .query_reply_min_len = 184,
+ .query_reply_suggested_len = 4096,
+ .request = &mr_dump_request_node_schema,
+ .reply = &mr_dump_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_MR_READ,
+ .type = CTLV_OP_TYPE_QUERY,
+ .fd_access = CTLV_OP_FD_ACCESS_READ,
+ .availability = CTLV_OP_AVAILABILITY_FIXED,
+ .optional = true,
+ .request_max_len = 80,
+ .query_reply_min_len = 112,
+ .query_reply_suggested_len = 4096,
+ .request = &mr_read_request_node_schema,
+ .reply = &mr_read_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_MR_EXTEND,
+ .type = CTLV_OP_TYPE_ACTION,
+ .fd_access = CTLV_OP_FD_ACCESS_READ_WRITE,
+ .availability = CTLV_OP_AVAILABILITY_FIXED,
+ .optional = true,
+ .request_max_len = 6880,
+ .action_reply_max_len = 64,
+ .request = &mr_extend_request_node_schema,
+ .reply = &mr_extend_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_DEVICE_STATE_CHANGED,
+ .type = CTLV_OP_TYPE_EVENT,
+ .event_record_max_len = 64,
+ .reply = &device_state_changed_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_MR_LOG_ENTRY_APPENDED,
+ .type = CTLV_OP_TYPE_EVENT,
+ .event_record_max_len = 73416,
+ .reply = &mr_log_entry_appended_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_EVIDENCE_ACCEPT,
+ .type = CTLV_OP_TYPE_ACTION,
+ .fd_access = CTLV_OP_FD_ACCESS_READ_WRITE,
+ .availability = CTLV_OP_AVAILABILITY_DYNAMIC,
+ .optional = true,
+ .request_max_len = 64,
+ .request = &evidence_accept_request_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_EVIDENCE_ACCEPT_CLEAR,
+ .type = CTLV_OP_TYPE_ACTION,
+ .fd_access = CTLV_OP_FD_ACCESS_READ_WRITE,
+ .availability = CTLV_OP_AVAILABILITY_DYNAMIC,
+ .optional = true,
+ .request_max_len = 16,
+ .request = &evidence_accept_clear_request_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_DEVSEC_STATE_GET,
+ .type = CTLV_OP_TYPE_QUERY,
+ .fd_access = CTLV_OP_FD_ACCESS_READ,
+ .availability = CTLV_OP_AVAILABILITY_DYNAMIC,
+ .optional = true,
+ .request_max_len = 16,
+ .query_reply_min_len = 40,
+ .query_reply_suggested_len = 1024,
+ .request = &devsec_state_get_request_node_schema,
+ .reply = &devsec_state_get_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_EVIDENCE_STATE_CHANGED,
+ .type = CTLV_OP_TYPE_EVENT,
+ .event_record_max_len = 112,
+ .reply = &evidence_state_changed_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_OP_MR_LOG_GET,
+ .type = CTLV_OP_TYPE_QUERY,
+ .fd_access = CTLV_OP_FD_ACCESS_READ,
+ .availability = CTLV_OP_AVAILABILITY_FIXED,
+ .optional = true,
+ .request_max_len = 10304,
+ .query_reply_min_len = 65600,
+ .query_reply_suggested_len = 131072,
+ .request = &mr_log_get_request_node_schema,
+ .reply = &mr_log_get_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_PCI_OP_STATE_GET,
+ .type = CTLV_OP_TYPE_ACTION,
+ .fd_access = CTLV_OP_FD_ACCESS_READ,
+ .availability = CTLV_OP_AVAILABILITY_FIXED,
+ .request_max_len = 16,
+ .action_reply_max_len = 184,
+ .request = &state_get_request_node_schema,
+ .reply = &state_get_reply_node_schema,
+ },
+ {
+ .op_id = CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH,
+ .type = CTLV_OP_TYPE_ACTION,
+ .fd_access = CTLV_OP_FD_ACCESS_READ_WRITE,
+ .availability = CTLV_OP_AVAILABILITY_DYNAMIC,
+ .optional = true,
+ .request_max_len = 112,
+ .action_reply_max_len = 40,
+ .request = &evidence_refresh_request_node_schema,
+ .reply = &evidence_refresh_reply_node_schema,
+ },
+};
+
+/* Family specification descriptor. */
+const struct ctlv_family_spec ctlv_attestation_pci_spec = {
+ .name = "ctlv-attestation-pci",
+ .family_id = 6,
+ .parent = &ctlv_attestation_spec,
+ .ops = ctlv_attestation_pci_op_specs,
+ .ops_count = 15,
+};
diff --git a/tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.h b/tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.h
new file mode 100644
index 000000000000..468546732a43
--- /dev/null
+++ b/tools/testing/selftests/attestation/ctlv_attestation_pci_user_gen.h
@@ -0,0 +1,230 @@
+/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
+/* Do not edit, regenerate with tools/ctlv/ctlv-regen.sh, from: */
+/* Documentation/ctlv/specs/ctlv-attestation-pci.yaml */
+/* CTLV-GEN user header */
+
+/* Userspace binding of the ctlv-attestation-pci CTLV family. */
+
+#ifndef _CTLV_CTLV_ATTESTATION_PCI_USER_GEN_H
+#define _CTLV_CTLV_ATTESTATION_PCI_USER_GEN_H
+
+#include <ctlv.h>
+
+#include <linux/ctlv_attestation_pci_gen.h>
+
+#include "ctlv_attestation_user_gen.h"
+
+/* What this family's specification says, for holding a device against it. */
+extern const struct ctlv_family_spec ctlv_attestation_pci_spec;
+
+/* Executing an op. A query is reassembled into the one reply it fills. */
+
+#define CTLV_ATTESTATION_PCI_OP_STATE_GET_REQUEST_MAX_LEN 16
+#define CTLV_ATTESTATION_PCI_OP_STATE_GET_ACTION_REPLY_MAX_LEN 184
+
+static inline int ctlv_attestation_pci_state_get_request_new(struct ctlv_msg **request)
+{
+ const __u32 len = CTLV_ATTESTATION_PCI_OP_STATE_GET_REQUEST_MAX_LEN;
+
+ return ctlv_msg_new(len, request);
+}
+
+static inline int ctlv_attestation_pci_state_get(struct ctlv_dev *dev, struct ctlv_msg *request,
+ struct ctlv_reply **reply,
+ struct ctlv_error *error)
+{
+ return ctlv_action(dev, CTLV_ATTESTATION_PCI_OP_STATE_GET, request, reply, error);
+}
+
+#define CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH_REQUEST_MAX_LEN 112
+#define CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH_ACTION_REPLY_MAX_LEN 40
+
+static inline int ctlv_attestation_pci_evidence_refresh_request_new(struct ctlv_msg **request)
+{
+ const __u32 len = CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH_REQUEST_MAX_LEN;
+
+ return ctlv_msg_new(len, request);
+}
+
+static inline int ctlv_attestation_pci_evidence_refresh(struct ctlv_dev *dev,
+ struct ctlv_msg *request,
+ struct ctlv_reply **reply,
+ struct ctlv_error *error)
+{
+ return ctlv_action(dev, CTLV_ATTESTATION_PCI_OP_EVIDENCE_REFRESH, request, reply, error);
+}
+
+/* Building a request. ctlv_msg_err() reports the first failure. */
+
+static inline int ctlv_attestation_pci_pci_name_put(struct ctlv_msg *msg, const char *value)
+{
+ return ctlv_put_str(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_NAME, value);
+}
+
+static inline int ctlv_attestation_pci_pci_generation_put(struct ctlv_msg *msg, __u64 value)
+{
+ return ctlv_put_u64(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION, value);
+}
+
+static inline int ctlv_attestation_pci_pci_tsm_id_put(struct ctlv_msg *msg, __u64 value)
+{
+ return ctlv_put_u64(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_TSM_ID, value);
+}
+
+static inline int ctlv_attestation_pci_pci_connected_put(struct ctlv_msg *msg, __u64 value)
+{
+ return ctlv_put_u64(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_CONNECTED, value);
+}
+
+static inline int ctlv_attestation_pci_pci_locked_put(struct ctlv_msg *msg, __u64 value)
+{
+ return ctlv_put_u64(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_LOCKED, value);
+}
+
+static inline int ctlv_attestation_pci_pci_accepted_put(struct ctlv_msg *msg, __u64 value)
+{
+ return ctlv_put_u64(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_ACCEPTED, value);
+}
+
+static inline int ctlv_attestation_pci_pci_dsm_put(struct ctlv_msg *msg, const char *value)
+{
+ return ctlv_put_str(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_DSM, value);
+}
+
+static inline int ctlv_attestation_pci_pci_object_put(struct ctlv_msg *msg, __u64 value)
+{
+ return ctlv_put_u64(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT, value);
+}
+
+static inline int ctlv_attestation_pci_pci_challenge_put(struct ctlv_msg *msg, const void *value,
+ __u32 len)
+{
+ return ctlv_put_bin(msg, CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE, value, len);
+}
+
+/* Reading a reply or a record. A getter answers whether it could read. */
+
+static inline bool ctlv_attestation_pci_pci_name_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_NAME);
+}
+
+static inline bool ctlv_attestation_pci_pci_name_get(const struct ctlv_attr *nest,
+ const char **value)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_NAME);
+ return attr && !ctlv_get_str(attr, value);
+}
+
+static inline bool ctlv_attestation_pci_pci_generation_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION);
+}
+
+static inline bool ctlv_attestation_pci_pci_generation_get(const struct ctlv_attr *nest,
+ __u64 *value)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_GENERATION);
+ return attr && !ctlv_get_u64(attr, value);
+}
+
+static inline bool ctlv_attestation_pci_pci_tsm_id_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_TSM_ID);
+}
+
+static inline bool ctlv_attestation_pci_pci_tsm_id_get(const struct ctlv_attr *nest, __u64 *value)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_TSM_ID);
+ return attr && !ctlv_get_u64(attr, value);
+}
+
+static inline bool ctlv_attestation_pci_pci_connected_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_CONNECTED);
+}
+
+static inline bool ctlv_attestation_pci_pci_connected_get(const struct ctlv_attr *nest,
+ __u64 *value)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_CONNECTED);
+ return attr && !ctlv_get_u64(attr, value);
+}
+
+static inline bool ctlv_attestation_pci_pci_locked_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_LOCKED);
+}
+
+static inline bool ctlv_attestation_pci_pci_locked_get(const struct ctlv_attr *nest, __u64 *value)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_LOCKED);
+ return attr && !ctlv_get_u64(attr, value);
+}
+
+static inline bool ctlv_attestation_pci_pci_accepted_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_ACCEPTED);
+}
+
+static inline bool ctlv_attestation_pci_pci_accepted_get(const struct ctlv_attr *nest, __u64 *value)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_ACCEPTED);
+ return attr && !ctlv_get_u64(attr, value);
+}
+
+static inline bool ctlv_attestation_pci_pci_dsm_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_DSM);
+}
+
+static inline bool ctlv_attestation_pci_pci_dsm_get(const struct ctlv_attr *nest,
+ const char **value)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_DSM);
+ return attr && !ctlv_get_str(attr, value);
+}
+
+static inline bool ctlv_attestation_pci_pci_object_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT);
+}
+
+static inline bool ctlv_attestation_pci_pci_object_get(const struct ctlv_attr *nest, __u64 *value,
+ bool *known)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_OBJECT);
+ return attr && !ctlv_get_enum(attr, 9, value, known);
+}
+
+static inline bool ctlv_attestation_pci_pci_challenge_present(const struct ctlv_attr *nest)
+{
+ return ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE);
+}
+
+static inline bool ctlv_attestation_pci_pci_challenge_get(const struct ctlv_attr *nest,
+ const void **value, __u32 *len)
+{
+ const struct ctlv_attr *attr;
+
+ attr = ctlv_attr_find(nest, CTLV_ATTESTATION_PCI_ATTR_PCI_CHALLENGE);
+ return attr && !ctlv_get_bin(attr, value, len);
+}
+
+#endif /* _CTLV_CTLV_ATTESTATION_PCI_USER_GEN_H */
--
2.43.0
next prev parent reply other threads:[~2026-10-28 15:27 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 15:26 [RFC PATCH v1 00/11] PCI/TSM: Add CTLV attestation Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` [RFC PATCH v1 01/11] attestation: Restrict inherited operations per instance Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` [RFC PATCH v1 02/11] attestation: Filter evidence objects " Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` [RFC PATCH v1 03/11] attestation: Enter secure operation when evidence is accepted Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` [RFC PATCH v1 04/11] attestation: Bind object selection to accepted evidence snapshots Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` [RFC PATCH v1 05/11] attestation: Make the evidence-get challenge attribute optional Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` Aneesh Kumar K.V (Arm) [this message]
2026-10-28 15:26 ` [RFC PATCH v1 07/11] attestation: Add attestation helpers for PCI/TSM integration Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` [RFC PATCH v1 08/11] PCI/TSM: Bind CTLV attestation to connected and locked contexts Aneesh Kumar K.V (Arm)
2026-10-28 22:56 ` Dave Jiang
2026-10-29 5:30 ` Aneesh Kumar K.V
2026-10-29 12:41 ` Jason Gunthorpe
2026-10-28 15:26 ` [RFC PATCH v1 09/11] crypto/ccp: Defer SEV-TIO link setup until evidence acceptance Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` [RFC PATCH v1 10/11] virt: coco: arm-cca-host: Publish slot zero and establish streams after acceptance Aneesh Kumar K.V (Arm)
2026-10-28 15:26 ` [RFC PATCH v1 11/11] virt: coco: arm-cca-guest: Refresh selected evidence against trusted digests Aneesh Kumar K.V (Arm)
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=20261028152618.1356860-7-aneesh.kumar@kernel.org \
--to=aneesh.kumar@kernel.org \
--cc=aik@amd.com \
--cc=ashish.kalra@amd.com \
--cc=bhelgaas@google.com \
--cc=catalin.marinas@arm.com \
--cc=dave.hansen@linux.intel.com \
--cc=djbw@kernel.org \
--cc=jgg@nvidia.com \
--cc=jic23@kernel.org \
--cc=jiri@resnulli.us \
--cc=john.allen@amd.com \
--cc=kas@kernel.org \
--cc=kevin.tian@intel.com \
--cc=linux-coco@lists.linux.dev \
--cc=mark.rutland@arm.com \
--cc=patches@lists.linux.dev \
--cc=rick.p.edgecombe@intel.com \
--cc=steven.price@arm.com \
--cc=suzuki.poulose@arm.com \
--cc=thomas.lendacky@amd.com \
--cc=will@kernel.org \
--cc=yilun.xu@linux.intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.