Linux CXL
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: alistair23@gmail.com
Cc: linux-pci@vger.kernel.org, linux-cxl@vger.kernel.org, ojeda@kernel.org
Subject: Re: [PATCH v3 19/21] lib: rspdm: Support SPDM certificate validation
Date: Tue, 01 Sep 2026 01:22:09 +0000	[thread overview]
Message-ID: <20260901012209.CAF5C1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260901010347.2614656-20-alistair.francis@wdc.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The SPDM implementation incorrectly assumes all certificate slots share the same leaf key, violating the SPDM specification and restricting support for multi-slot responders.
--

commit b0152a815fb6a558a0d32bf4c0f287cb4d4ee1a3
Author: Alistair Francis <alistair@alistair23.me>

lib: rspdm: Support SPDM certificate validation

Support validating the SPDM certificate chain. This performs basic
sanity checks on the chain, ensures supported signatures are used,
checks against the blacklist, and stores the first leaf certificate.

> diff --git a/lib/rspdm/state.rs b/lib/rspdm/state.rs
> index 1e8a4402e6342..fc7df9dd7b973 100644
> --- a/lib/rspdm/state.rs
> +++ b/lib/rspdm/state.rs

[ ... ]

> @@ -846,4 +858,136 @@ pub(crate) fn get_certificate(&mut self, slot: u8) -> Result<(), Error> {

[ ... ]

> +        if let Some(prev) = prev_cert {
> +            if let Some(validate) = self.validate {
> +                // SAFETY: Call the `validate` function provided.
> +                let rc = unsafe { validate(self.dev, slot, prev) };
> +                if let Err(e) = to_result(rc) {
> +                    // SAFETY: `prev_cert` is the previously parsed
> +                    // certificate from a prior loop iteration.
> +                    unsafe { bindings::x509_free_certificate(prev) };
> +                    return Err(e);
> +                }
> +            }
> +
> +            // The leaf key is the same for all slots, so just store the first one.
> +            if self.leaf_key.is_none() {
> +                // SAFETY: `prev_cert` is the previously parsed
> +                // certificate from a prior loop iteration.
> +                self.leaf_key = unsafe { Some((*prev).pub_) };

[Severity: Medium]
Is it safe to assume all certificate slots share the same leaf key here?

According to the SPDM specification (DSP0274), devices are allowed up to 8
slots, and they can be provisioned with distinct certificate chains and
cryptographic keys (e.g., one RSA chain and one ECDSA chain).

When an SPDM responder with multiple provisioned slots connects, this logic
skips storing the leaf keys for all slots after the first one. If the responder
negotiates an algorithm that directs a challenge to a slot other than the
first one, won't authentication use the incorrect leaf key from the first slot
and cause signature verification to fail?

> +                // SAFETY: `prev_cert` is the previously parsed
> +                // certificate from a prior loop iteration. We are setting
> +                // the `pub` key to null so it isn't freed below
> +                unsafe { (*prev).pub_ = core::ptr::null_mut() };
> +            }
> +
> +            // SAFETY: `prev_cert` is the previously parsed
> +            // certificate from a prior loop iteration.
> +            unsafe { bindings::x509_free_certificate(prev) };
> +        }
> +
> +        Ok(())
> +    }
>  }

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260901010347.2614656-1-alistair.francis@wdc.com?part=19

  reply	other threads:[~2026-09-01  1:22 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-01  1:03 [PATCH v3 00/21] lib: Rust implementation of SPDM alistair23
2026-09-01  1:03 ` [PATCH v3 01/21] rust: transmute: add `cast_slice[_mut]` functions alistair23
2026-09-01  1:11   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 02/21] rust: create basic untrusted data API alistair23
2026-09-01  1:19   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 03/21] rust: validate: add `Validate` trait alistair23
2026-09-01  1:16   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 04/21] X.509: Make certificate parser public alistair23
2026-09-01  1:12   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 05/21] X.509: Parse Subject Alternative Name in certificates alistair23
2026-09-01  1:12   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 06/21] X.509: Move certificate length retrieval into new helper alistair23
2026-09-01  1:10   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 07/21] rust: add bindings for hash.h alistair23
2026-09-01  1:10   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 08/21] rust: error: impl From<FromBytesWithNulError> for Kernel Error alistair23
2026-09-01  1:10   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 09/21] lib: rspdm: Initial commit of Rust SPDM alistair23
2026-09-01  1:17   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 10/21] PCI/TSM: Rename pf0 to host alistair23
2026-09-01  1:16   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 11/21] PCI/TSM: Support connecting to PCIe CMA devices alistair23
2026-09-01  1:25   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 12/21] PCI/CMA: Add a PCI TSM CMA driver using SPDM alistair23
2026-09-01  1:20   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 13/21] PCI/CMA: Validate Subject Alternative Name in certificates alistair23
2026-09-01  1:15   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 14/21] lib: rspdm: Support SPDM get_version alistair23
2026-09-01  1:17   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 15/21] lib: rspdm: Support SPDM get_capabilities alistair23
2026-09-01  1:15   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 16/21] lib: rspdm: Support SPDM negotiate_algorithms alistair23
2026-09-01  1:30   ` sashiko-bot
2026-09-04  5:01   ` Aksh Garg
2026-09-01  1:03 ` [PATCH v3 17/21] lib: rspdm: Support SPDM get_digests alistair23
2026-09-01  1:20   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 18/21] lib: rspdm: Support SPDM get_certificate alistair23
2026-09-01  1:21   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 19/21] lib: rspdm: Support SPDM certificate validation alistair23
2026-09-01  1:22   ` sashiko-bot [this message]
2026-09-01  1:03 ` [PATCH v3 20/21] rust: allow extracting the buffer from a CString alistair23
2026-09-01  1:19   ` sashiko-bot
2026-09-01  1:03 ` [PATCH v3 21/21] lib: rspdm: Support SPDM challenge alistair23
2026-09-01  1:31   ` sashiko-bot

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=20260901012209.CAF5C1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=alistair23@gmail.com \
    --cc=linux-cxl@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=ojeda@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox