All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: alistair23@gmail.com
Cc: linux-pci@vger.kernel.org, Jonathan.Cameron@huawei.com,
	djbw@kernel.org, rust-for-linux@vger.kernel.org, lukas@wunner.de,
	alistair@alistair23.me, linux-cxl@vger.kernel.org,
	bhelgaas@google.com, akpm@linux-foundation.org,
	linux-kernel@vger.kernel.org, gary@garyguo.net, ojeda@kernel.org,
	benno.lossin@proton.me, a.hindborg@kernel.org,
	wilfred.mallawa@wdc.com, tmgross@umich.edu, boqun.feng@gmail.com,
	bjorn3_gh@protonmail.com, alex.gaynor@gmail.com,
	aliceryhl@google.com
Subject: Re: [PATCH v3 16/21] lib: rspdm: Support SPDM negotiate_algorithms
Date: Wed, 9 Sep 2026 01:17:54 +0100	[thread overview]
Message-ID: <20260909011754.2ced4320@jic23-huawei> (raw)
In-Reply-To: <20260901010347.2614656-17-alistair.francis@wdc.com>

On Tue,  1 Sep 2026 11:03:42 +1000
alistair23@gmail.com wrote:

> From: Alistair Francis <alistair@alistair23.me>
> 
> Support the NEGOTIATE_ALGORITHMS SPDM command.
> 
> Signed-off-by: Alistair Francis <alistair@alistair23.me>
A question on types inline. Otherwise with the thing Aksh
called out this looks fine to me.

> diff --git a/lib/rspdm/lib.rs b/lib/rspdm/lib.rs
> index 76325babdff2..d418d15e4c70 100644
> --- a/lib/rspdm/lib.rs
> +++ b/lib/rspdm/lib.rs

> @@ -117,11 +121,12 @@ pub extern "C" fn spdm_destroy(state_ptr: *mut spdm_state) {
>      if state_ptr.is_null() {
>          return;
>      }
> +

Move that to the early commit.

>      // SAFETY: `state_ptr` was returned from `spdm_create()`, which leaked a
>      // `Pin<KBox<Mutex<SpdmState>>>` via `KBox::into_raw`.  The caller
>      // guarantees the state is no longer in use.  Reconstructing the pinned
>      // box and dropping it runs `Drop` for the `Mutex` and `SpdmState` and
>      // frees the allocation.
> -    let b = unsafe { KBox::from_raw(state_ptr as *mut Mutex<SpdmState>) };
> +    let b = unsafe { KBox::from_raw(state_ptr as *mut Mutex<SpdmState<'_>>) };
>      drop(unsafe { Pin::new_unchecked(b) });
>  }
> diff --git a/lib/rspdm/state.rs b/lib/rspdm/state.rs
> index 5ef14c8ed237..b78086c75370 100644
> --- a/lib/rspdm/state.rs
> +++ b/lib/rspdm/state.rs
...

>  
> @@ -373,4 +452,164 @@ pub(crate) fn get_capabilities(&mut self) -> Result<(), Error> {
>  
>          Ok(())
>      }
> +
> +    fn update_response_algs(&mut self) -> Result<(), Error> {
> +        match self.base_asym_alg {
> +            SPDM_ASYM_RSASSA_2048 => {
> +                self.sig_len = 256;
> +                self.base_asym_enc = CStr::from_bytes_with_nul(b"pkcs1\0")?;
> +            }
> +            SPDM_ASYM_RSASSA_3072 => {
> +                self.sig_len = 384;
> +                self.base_asym_enc = CStr::from_bytes_with_nul(b"pkcs1\0")?;
> +            }
> +            SPDM_ASYM_RSASSA_4096 => {
> +                self.sig_len = 512;
> +                self.base_asym_enc = CStr::from_bytes_with_nul(b"pkcs1\0")?;
> +            }
> +            SPDM_ASYM_ECDSA_ECC_NIST_P256 => {
> +                self.sig_len = 64;
> +                self.base_asym_enc = CStr::from_bytes_with_nul(b"p1363\0")?;
> +            }
> +            SPDM_ASYM_ECDSA_ECC_NIST_P384 => {
> +                self.sig_len = 96;
> +                self.base_asym_enc = CStr::from_bytes_with_nul(b"p1363\0")?;
> +            }
> +            SPDM_ASYM_ECDSA_ECC_NIST_P521 => {
> +                self.sig_len = 132;
> +                self.base_asym_enc = CStr::from_bytes_with_nul(b"p1363\0")?;
> +            }
> +            _ => {
> +                pr_err!("Unknown asym algorithm\n");
> +                return Err(EINVAL);
> +            }
> +        }
> +
> +        match self.base_hash_alg {
> +            SPDM_HASH_SHA_256 => {
> +                self.base_hash_alg_name = CStr::from_bytes_with_nul(b"sha256\0")?;
> +            }
> +            SPDM_HASH_SHA_384 => {
> +                self.base_hash_alg_name = CStr::from_bytes_with_nul(b"sha384\0")?;
> +            }
> +            SPDM_HASH_SHA_512 => {
> +                self.base_hash_alg_name = CStr::from_bytes_with_nul(b"sha512\0")?;
> +            }
> +            _ => {
> +                pr_err!("Unknown hash algorithm\n");
> +                return Err(EINVAL);
> +            }
> +        }
> +
> +        // This is freed in when `SpdmState` is dropped, but this call

freed when

> +        // can happen multiple times.
> +        if self.shash != core::ptr::null_mut() {
> +            if let Some(desc) = self.desc.take() {
> +                // SAFETY: `self.shash` is a valid handle
> +                let desc_len = core::mem::size_of::<bindings::shash_desc>()
> +                    + unsafe { bindings::crypto_shash_descsize(self.shash) } as usize;
> +
...

> diff --git a/lib/rspdm/validator.rs b/lib/rspdm/validator.rs
> index 42c0b28cdcaa..4f7a82d4b210 100644
> --- a/lib/rspdm/validator.rs
> +++ b/lib/rspdm/validator.rs
> @@ -9,7 +9,8 @@
>  
>  use crate::bindings::{
>      __IncompleteArrayField,
> -    __le16, //
> +    __le16,
> +    __le32, //
>  };

> +
> +#[repr(C, packed)]
> +pub(crate) struct NegotiateAlgsRsp {
> +    pub(crate) version: u8,
> +    pub(crate) code: u8,
> +    pub(crate) param1: u8,
> +    pub(crate) param2: u8,
> +
> +    pub(crate) length: u16,

Why do we treat this one as native endian but the ext_asym below
as explicitly little endian?  

> +    pub(crate) measurement_specification_sel: u8,
> +    pub(crate) other_params_sel: u8,
> +
> +    pub(crate) measurement_hash_algo: u32,
> +    pub(crate) base_asym_sel: u32,
> +    pub(crate) base_hash_sel: u32,
> +
> +    reserved1: [u8; 11],
> +
> +    pub(crate) mel_specification_sel: u8,
> +    pub(crate) ext_asym_sel_count: u8,
> +    pub(crate) ext_hash_sel_count: u8,
> +    reserved2: [u8; 2],
> +
> +    pub(crate) ext_asym: __IncompleteArrayField<__le32>,
> +    pub(crate) ext_hash: __IncompleteArrayField<__le32>,
> +    pub(crate) resp_alg_struct: __IncompleteArrayField<RegAlg>,
> +}
> +
> +impl<'a> Validate<Untrusted<&'a [u8]>> for &'a NegotiateAlgsRsp {
> +    type Err = Error;
> +
> +    fn validate(unvalidated: &[u8]) -> Result<Self, Self::Err> {
> +        if unvalidated.len() < mem::size_of::<NegotiateAlgsRsp>() {
> +            return Err(EINVAL);
> +        }
> +
> +        let ptr = unvalidated.as_ptr();
> +        // CAST: `NegotiateAlgsRsp` only contains integers and has `repr(C)`.
> +        let ptr = ptr.cast::<NegotiateAlgsRsp>();
> +        // SAFETY: `ptr` came from a reference and the cast above is valid.
> +        let rsp: &NegotiateAlgsRsp = unsafe { &*ptr };
> +
> +        Ok(rsp)
> +    }
> +}


  parent reply	other threads:[~2026-09-09  0:18 UTC|newest]

Thread overview: 57+ 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-08 22:57   ` Jonathan Cameron
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-08 23:01   ` Jonathan Cameron
2026-09-11  5:00     ` Alistair
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-08 23:21   ` Jonathan Cameron
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-08 23:40   ` Jonathan Cameron
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-08 23:47   ` Jonathan Cameron
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-09  0:17   ` Jonathan Cameron [this message]
2026-09-11  4:53     ` Alistair
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-09  0:36     ` Jonathan Cameron
2026-09-09  0:31   ` Jonathan Cameron
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
2026-09-09  0:46   ` Jonathan Cameron
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
2026-09-09  1:37   ` Jonathan Cameron
2026-09-11  3:46     ` Alistair

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=20260909011754.2ced4320@jic23-huawei \
    --to=jic23@kernel.org \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=a.hindborg@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=alistair23@gmail.com \
    --cc=alistair@alistair23.me \
    --cc=benno.lossin@proton.me \
    --cc=bhelgaas@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=djbw@kernel.org \
    --cc=gary@garyguo.net \
    --cc=linux-cxl@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=tmgross@umich.edu \
    --cc=wilfred.mallawa@wdc.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.