All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Jiang <dave.jiang@intel.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: "Reshetova, Elena" <elena.reshetova@intel.com>,
	Xu Yilun <yilun.xu@linux.intel.com>,
	"Aneesh Kumar K.V" <aneesh.kumar@kernel.org>,
	"linux-coco@lists.linux.dev" <linux-coco@lists.linux.dev>,
	Jiri Pirko <jiri@resnulli.us>,
	"Tian, Kevin" <kevin.tian@intel.com>,
	Alexey Kardashevskiy <aik@amd.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>,
	"Edgecombe, Rick P" <rick.p.edgecombe@intel.com>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Jonathan Cameron <jic23@kernel.org>,
	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" <patches@lists.linux.dev>
Subject: Re: [RFC PATCH v1 10/11] virt: coco: arm-cca-host: Publish slot zero and establish streams after acceptance
Date: Fri, 6 Nov 2026 15:39:56 -0700	[thread overview]
Message-ID: <53bc57bf-1ee1-407a-b48b-bc6b2deee12a@intel.com> (raw)
In-Reply-To: <20261106193018.GK770409@nvidia.com>



On 11/6/26 12:30 PM, Jason Gunthorpe wrote:
> On Fri, Nov 06, 2026 at 08:53:39AM -0700, Dave Jiang wrote:
>>
>>
>> On 11/4/26 9:54 AM, Dave Jiang wrote:
>>>
>>>
>>> On 11/4/26 6:41 AM, Jason Gunthorpe wrote:
>>> <--snip-->
>>>
>>>> Is there a PDF for TDX's SPDM flow someplace? I will try to draft a
>>>> more complete document
>>>
>>> TDX connect architecture spec
>>> https://cdrdv2-public.intel.com/862706/Intel%20TDX%20Connect%20EAS%20354629%20004.pdf
>>> 2.7.5 Figure 2.6
>>>
>>> TDX connect TEE-IO device guide
>>> https://cdrdv2-public.intel.com/861654/whitepaper-tee-io-device-guide-v0-7-0.pdf
>>> Appendix B.1.1 Table B-1
>>
>> I generated a diagram that hopefully better reflects Option A with TDX better than the current public documentations:
>>
>> Option (a) on TDX, with the current TDX Connect ABI: slot 0 only, no TDX
>> change. Numbers in the left margin point to the notes below.
>>
>>   ---->   call                 <- - -   return
>>   <---->  SPDM request and response in clear text, relayed by the host
>>   <====>  the same, inside the SPDM session
> 
> It looks OK, thanks.
> 
> I have a few thoughts
> 
> 1) I would very much like it if the core SPDM code in the kernel
>    can snoop the DOE messages from the TSM. If we do this then the
>    kernel can directly capture the full transcript:
> 
>> (4)  |                    |                       | GET_VERSION            |
>>      |                    |                       |<---------------------->|
>>      |                    |                       | GET_CAPABILITIES       |
>>      |                    |                       |<---------------------->|
>>      |                    |                       | NEGOTIATE_ALGORITHMS   |
>>      |                    |                       |<---------------------->|
>>      |                    |                       | GET_CERTIFICATE slot 0 |
>>      |                    |                       |<---------------------->|
>> (5)  |                    |                       | KEY_EXCHANGE slot 0    |
> 
> With perfect consistency on all vendors.

I think that works for TDX. tdx-host already relays every DOE message for the TDX Module, so it can hand them to core SPDM code. Only part of the flow is clear text though. With the current module I see the VCA, GET_CERTIFICATE for slot 0, and KEY_EXCHANGE/KEY_EXCHANGE_RSP in the clear. There's no GET_DIGESTS. FINISH, GET_MEASUREMENTS, the reads of slots 1-7 and the TDISP messages are all inside the session, so the kernel can't decode them.

So the kernel would get the VCA, slot 0's chain and the KEY_EXCHANGE transcript from snooping, and still take MEASUREMENTS from the TDX Module's device info. Would that be ok with you?

> 
> Further, it will also be able to capture the GET_CERTIFICATE during
> the preamble so again we get greater consistency for everyone.

That's the chain the KEY_EXCHANGE signature covers.

I tried disturbing the session from the host with a test hack in tdx-host, right before KEY_EXCHANGE. A bare GET_VERSION makes the device reject KEY_EXCHANGE. Replaying the VCA with one field changed gets a KEY_EXCHANGE_RSP back, but the TDX module rejects it. So KEY_EXCHANGE does blow up when the host interferes, as you said in the other reply.

> 
> I'm very interested in this because it frees the uABI from any
> variation in choices the TSM may have made. I have the full perfect
> transcript in the kernel and I will ALWAYS present the same uABI to
> userspace regardless what the TSM offers.
> 
> Like a whole bunch of TSM FW API just to do this:
> 
>> === Step 4: query certificates, query final transcript items ===============
>>      |                    |                       |                        |
>>      | query certificates |                       |                        |
>>      |------------------->|                       |                        |
>>      |                    |                       |                        |
>>      | slot 0's chain     |                       |                        |
>>      |<- - - - - - - - - -|                       |                        |
>>      |                    |                       |                        |
>>      | query transcript   |                       |                        |
>>      |------------------->|                       |                        |
>>      |                    |                       |                        |
>> (6)  | device info        |                       |                        |
>>      |<- - - - - - - - - -|                       |                        |
>>      |                    |                       |                        |
> 
> Seems pointless to me, and could cause uABI variations I don't like.
> 
> What do you think? Am I off my rocker? At least AI says it looks OK
> (always optimistic!). Undoing the chunking is annoying.

Seems reasonable. Every TSM gets the same uAPI, and on TDX the host already has every message in hand so the driver side should be small. It also lets the kernel check the KEY_EXCHANGE_RSP signature itself instead of taking TSM's word for it.

> 
> This is close to what ARM did with CCA, it seems very smart, but they
> seem to have provided some help to the OS to locate the bytes in the
> messages, but I assume with some work (and we have Rust SPDM) Linux
> can decode them autonomously?

For the clear-text part yes. Rust SPDM already handles the VCA and CERTIFICATE messages. KEY_EXCHANGE and KEY_EXCHANGE_RSP can be added. Everything after that is encrypted.

> 
> This would really slim down the TSM drivers since core code would
> build up all the SPDM data and the drivers just need to do the
> communicate loop and little else.
> 
> 2) I do not like the idea to refetch certificates:
> 
>>      | nonce              |                       |                        |
>>      |------------------->|                       |                        |
>>      |                    |                       |                        |
>> (7)  |                    | TDH.SPDM.MNG(nonce)   |                        |
>>      |                    |---------------------->|                        |
>>      |                    |                       |                        |
>>      |                    |                       | GET_CERTIFICATE        |
>>      |                    |                       |<======================>|
>>      |                    |                       | GET_MEASUREMENTS       |
>>      |                    |                       |<======================>|
>>      |                    |                       |                        |
>>      |                    | new device info       |                        |
>>      |                    |<- - - - - - - - - - - |                        |
>>      |                    |                       |                        |
>>      | one-shot result    |                       |                        |
>>      |<- - - - - - - - - -|                       |                        |
> 
> That's just asking for trouble. Our general security statement is the
> kernel & TSM validates a signature over the certificates to verify
> their authenticity in the HW. Re-fetching defeats the whole point of
> this if the responder can supply something that differs from
> GET_DIGESTS. If it can't differ then it was a waste of time since we
> already have it.
> 
> Further it wrecks the point of the transcript and the 1.3 multikey
> signed GET_DIGESTS.
> 
> If you *really* want to do certificate refresh it has to be a
> dedicated operation, it has to be supported by the TSM, and it has to
> get back another SIGNED GET_DIGESTS. All that would ideally have to be
> dumped into the transcript again.
> 
> I feel it is alot of work and not valuable.

On TDX the re-read of the chains comes with the measurement refresh. The kernel doesn't ask for it separately. For option (A) I think the kernel can drop the re-read chains and pass up only the new MEASUREMENTS. It already has the copy KEY_EXCHANGE signed.

> 
> I generally feel a 2nd measurement is not a valuable activity in the
> first place. There is one meaningful security measurement. At boot,
> before DMA is allowed. It must be logged into a measurement register
> and then after you turn on DMA the device can replace every byte of
> software on the system. (hello ATS). Only the logged measurement can be
> relied on for security, any post-DMA measurement can be fradulent.
> 
> It is OK for auditing, but not for security, so why would you even
> look at the certificate chain for audit? For auditing you should check
> that the PUBKEY is stable.
> 
> I think any device that can loose its private key while an SPDM
> session is open (ie with live update or something) is fundamentally
> broken. If it wants to do this it has to break the SPDM.

On the host side, should we drop the fresh-nonce collection before ACCEPT then, or keep it as audit only? I'd rather not carry a uAPI for
it if nobody needs it. The guest's lock keeps its own fresh-nonce recollection, as you asked for earlier.

> 
> 3) Obviously TDX and everyone else will need a 1.3 multi-key upgrade
>    I think they all look the same. I would like us to settle on this
>    API here and then we can describe what a perfect TSM would look
>    like and people can go write their specs for it.
> 
>> Notes:
>> (1) Creates the attestation endpoint only; no TSM call.
>> (2) TDH.SPDM.CONNECT has no KEY_EXCHANGE slot input.
>>     CERTIFICATE_SLOT_MASK, the only slot field in SPDM_CONFIG_INFO_T, is
>>     the "Device certificate request slot mask" [ABI 3.3.2.2]: it picks
>>     which chains to read, not the slot. So userspace can't enumerate
>>     slots by repeating step 3.
> 
> Boo
> 
>> (3) TDH.SPDM.CREATE runs first. The kernel sets CERTIFICATE_SLOT_MASK to
>>     0x01, so the TSM reads only slot 0's chain. It could also read slots
>>     1-7 inside the session [GUIDE B.1.1, Table B-1], but no signature
>>     would cover them: KEY_EXCHANGE hashes only the chain of the slot it
>>     names [SPDM 10.18.1]. So (a) doesn't report them.
> 
> ? this is confusing. KEY_EXCHANGE slot=0 includes the hash of the
> certificate chain in slot 0. If the TSM doesn't even read that slot
> during the premable it is impossible to validate the KEY_EXCHANGE.
> 
> What prupose is there for this configurable "the kernel sets
> CERTIFICATE_SLOT_MASK to 0x01" ? If the kernel sets for slot 1 then
> KEY_EXCHANGE must fail?

No, it doesn't fail, and the note was confusing. The mask doesn't control slot selection. It only picks which of slots 1-7 the module
also returns. Slot 0's chain is always read and returned. The module reads it in the clear before KEY_EXCHANGE, even with bit 0 clear.
Slots 1-7 are read inside the session after KEY_EXCHANGE. Setting 0x01 just skips reading chains nothing signs.
> 
>> (4) The host relays each message over DOE [ABI 3.3.3, 4.2.20]. No
>>     GET_DIGESTS and no CHALLENGE [ARCH 2.7.5, Figure 2.6]. The guide's
>>     session setup example also reads slot 0's chain before KEY_EXCHANGE
>>     [GUIDE B.1.1, Table B-1].
> 
> Yes, you have to because it is necessary to do this:
> 
>> (5) The TSM verifies the KEY_EXCHANGE_RSP signature [SPDM para 630]. The
>>     host trusts that check, so it keeps no KEY_EXCHANGE messages.
> 
> Yes, but if we do #1 above I would keep it anyhow and optionally give
> it to the verifier. I agree it is fairly pointless, but it is really
> cheap to do if you have #1 and simply capturing the *entire* signed
> transcript is forward looking from an ABI design perspective.

Agreed. With snooping the kernel has them anyway. I'll change (5) to keep them and hand them to the verifier.

DJ

> 
> It might even be useful if we want to use
> GET_DIGEST/CHALLENGE/KEY_EXCHANGE as the sequence to support
> multi-slot.
> 
> If people start adding more messages in later spec revs it simply
> flows through with no ABI change as additional transcript meassages.
> 
>> (7) DEV_INFO_RECOLLECTION puts the caller's nonce in GET_MEASUREMENTS
>>     [ABI 3.3.2.3], and the TSM reads the chains again
>>     [GUIDE B.1.5, Table B-5]. The device signs the new measurement log,
>>     nonce included [SPDM 10.12.3]. That signature is what protects the
>>     new measurements. The verifier must check it with the leaf key of
>>     slot 0, the slot KEY_EXCHANGE used, and must find its nonce in the
>>     log to know the result is fresh. The kernel hands the result over
>>     once and doesn't store it.
> 
> Yes, but in 1.2 there is only one private key so the slot doesn't
> matter. There is no reason to re-read the chains. Kernel would throw
> that information away, it already has a signed copy that it got at the
> start.
> 
> Jason


  reply	other threads:[~2026-11-06 22:39 UTC|newest]

Thread overview: 73+ 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-30 13:29   ` Jiri Pirko
2026-10-28 15:26 ` [RFC PATCH v1 02/11] attestation: Filter evidence objects " Aneesh Kumar K.V (Arm)
2026-10-30 13:44   ` Jiri Pirko
2026-10-31  6:24     ` Aneesh Kumar K.V
2026-11-02 19:14       ` Jiri Pirko
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-30 13:51   ` Jiri Pirko
2026-10-30 15:36     ` Jason Gunthorpe
2026-10-31  4:09     ` Aneesh Kumar K.V
2026-11-02 11:28       ` Jiri Pirko
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 ` [RFC PATCH v1 06/11] PCI/TSM: Describe the PCI attestation control family Aneesh Kumar K.V (Arm)
2026-10-30 14:01   ` Jiri Pirko
2026-10-30 15:43     ` Jason Gunthorpe
2026-11-02 12:45       ` Jiri Pirko
2026-11-03 15:45         ` Jason Gunthorpe
2026-11-04  9:21           ` Jiri Pirko
2026-11-04 14:00             ` Jason Gunthorpe
2026-10-31  4:05     ` Aneesh Kumar K.V
2026-11-02 11:50       ` Jiri Pirko
2026-11-03 15:35       ` Jason Gunthorpe
2026-10-31  4:22     ` Aneesh Kumar K.V
2026-11-02 11:30       ` Jiri Pirko
2026-11-03 15:39       ` Jason Gunthorpe
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-30 14:04   ` Jiri Pirko
2026-10-30 14:08   ` Jiri Pirko
2026-10-30 15:39     ` Jason Gunthorpe
2026-11-02 12:11       ` Jiri Pirko
2026-11-03 15: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-11-06  7:47   ` Alexey Kardashevskiy
2026-11-06 13:14     ` Aneesh Kumar K.V
2026-11-06 14:21       ` Jason Gunthorpe
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-29 16:56   ` Dave Jiang
2026-10-29 17:10     ` Jason Gunthorpe
2026-10-30  9:58       ` Reshetova, Elena
2026-10-30 13:15         ` Jason Gunthorpe
2026-10-31  3:47           ` Aneesh Kumar K.V
2026-11-02 10:11             ` Reshetova, Elena
2026-11-02 17:26               ` Jason Gunthorpe
2026-11-03 12:01                 ` Reshetova, Elena
2026-11-03 15:16                   ` Jason Gunthorpe
2026-11-04  8:03                     ` Xu Yilun
2026-11-04  9:49                       ` Reshetova, Elena
2026-11-04 13:41                         ` Jason Gunthorpe
2026-11-04 16:54                           ` Dave Jiang
2026-11-06 15:53                             ` Dave Jiang
2026-11-06 19:30                               ` Jason Gunthorpe
2026-11-06 22:39                                 ` Dave Jiang [this message]
2026-11-08 18:33                                   ` Jason Gunthorpe
2026-11-04  9:03                     ` Reshetova, Elena
2026-11-04 13:48                       ` Jason Gunthorpe
2026-11-06  8:24                     ` Aneesh Kumar K.V
2026-11-06 12:49                       ` Reshetova, Elena
2026-11-06 15:53                         ` Aneesh Kumar K.V
2026-11-06 18:54                           ` Jason Gunthorpe
2026-11-03 16:31                 ` Aneesh Kumar K.V
2026-11-03 17:56                   ` Jason Gunthorpe
2026-11-02 10:05           ` Reshetova, Elena
2026-11-02 10:22           ` Reshetova, Elena
2026-11-02 17:37             ` Jason Gunthorpe
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)
2026-10-30 12:34 ` [RFC PATCH v1 00/11] PCI/TSM: Add CTLV attestation Xu Yilun
2026-10-30 15:32   ` Jason Gunthorpe

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=53bc57bf-1ee1-407a-b48b-bc6b2deee12a@intel.com \
    --to=dave.jiang@intel.com \
    --cc=aik@amd.com \
    --cc=aneesh.kumar@kernel.org \
    --cc=ashish.kalra@amd.com \
    --cc=bhelgaas@google.com \
    --cc=catalin.marinas@arm.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=elena.reshetova@intel.com \
    --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.