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)
> + }
> +}
next prev parent reply other threads:[~2026-09-09 0:18 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 [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-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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox