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)
> > + }
> > +}
next prev parent 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