Rust for Linux List
 help / color / mirror / Atom feed
From: Alistair <alistair@alistair23.me>
To: Jonathan Cameron <jic23@kernel.org>, 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,
	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: Fri, 11 Sep 2026 14:53:08 +1000	[thread overview]
Message-ID: <51d42f40bb8debc0bc4f46909ecf14a79abe5a5a.camel@alistair23.me> (raw)
In-Reply-To: <20260909011754.2ced4320@jic23-huawei>

On Wed, 2026-09-09 at 01:17 +0100, Jonathan Cameron wrote:
> 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.

It's not that easy, even with an underscore Rust complains about it
being unused


error[E0392]: lifetime parameter `'_a` is never used
  --> lib/rspdm/state.rs:46:29
   |
46 | pub(crate) struct SpdmState<'_a> {
   |                             ^^^ unused lifetime parameter
   |
   = help: consider removing `'_a`, referring to it in a field, or
using a marker such as `PhantomData`

error: aborting due to 1 previous error

I could use `PhantomData` to hide the error, but that doesn't feel
great when it's just a temp for a few patches.

1:
https://doc.rust-lang.org/nightly/core/marker/struct.PhantomData.html

> 
> >      // 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?  

Just a bug, fixed!

Alistair

> 
> > +    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)
> > +    }
> > +}

  reply	other threads:[~2026-09-11  4:53 UTC|newest]

Thread overview: 35+ 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:03 ` [PATCH v3 02/21] rust: create basic untrusted data API alistair23
2026-09-01  1:03 ` [PATCH v3 03/21] rust: validate: add `Validate` trait alistair23
2026-09-01  1:03 ` [PATCH v3 04/21] X.509: Make certificate parser public alistair23
2026-09-01  1:03 ` [PATCH v3 05/21] X.509: Parse Subject Alternative Name in certificates alistair23
2026-09-01  1:03 ` [PATCH v3 06/21] X.509: Move certificate length retrieval into new helper alistair23
2026-09-01  1:03 ` [PATCH v3 07/21] rust: add bindings for hash.h alistair23
2026-09-01  1:03 ` [PATCH v3 08/21] rust: error: impl From<FromBytesWithNulError> for Kernel Error alistair23
2026-09-01  1:03 ` [PATCH v3 09/21] lib: rspdm: Initial commit of Rust SPDM alistair23
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-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:03 ` [PATCH v3 12/21] PCI/CMA: Add a PCI TSM CMA driver using SPDM alistair23
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:03 ` [PATCH v3 14/21] lib: rspdm: Support SPDM get_version alistair23
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-08 23:47   ` Jonathan Cameron
2026-09-01  1:03 ` [PATCH v3 16/21] lib: rspdm: Support SPDM negotiate_algorithms alistair23
2026-09-04  5:01   ` Aksh Garg
2026-09-09  0:17   ` Jonathan Cameron
2026-09-11  4:53     ` Alistair [this message]
2026-09-01  1:03 ` [PATCH v3 17/21] lib: rspdm: Support SPDM get_digests alistair23
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:03 ` [PATCH v3 19/21] lib: rspdm: Support SPDM certificate validation alistair23
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:03 ` [PATCH v3 21/21] lib: rspdm: Support SPDM challenge alistair23
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=51d42f40bb8debc0bc4f46909ecf14a79abe5a5a.camel@alistair23.me \
    --to=alistair@alistair23.me \
    --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=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=jic23@kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox