From 8fadcd9fe5636395f6ca6afef733fe25baf4efed Mon Sep 17 00:00:00 2001 From: Steffen Eiden Date: Mon, 23 Jun 2025 11:34:06 +0200 Subject: [PATCH] pvsecret: Fix some edge cases for plaintext keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix two edge cases for generating and interpreting plaintext secrets: 1. The maximum payload size was two bytes to long. The space for the length header was forgotten to take into account. 2. One of the checks for if the plaintext secret has a size was too strict. Fixes: fd024387d710 ("rust/pv: Retrievable secrets support") Reviewed-by: Jan Höppner Signed-off-by: Steffen Eiden --- rust/pv/src/uvsecret/guest_secret.rs | 2 +- rust/pv/src/uvsecret/retr_secret.rs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rust/pv/src/uvsecret/guest_secret.rs b/rust/pv/src/uvsecret/guest_secret.rs index 52244d6a..c9ee9ae4 100644 --- a/rust/pv/src/uvsecret/guest_secret.rs +++ b/rust/pv/src/uvsecret/guest_secret.rs @@ -239,7 +239,7 @@ fn extend_to_multiple(mut key: Vec, multiple: usize) -> Confidential /// ``` fn plaintext(inp: Confidential>) -> Result { let key_len = inp.value().len(); - if key_len > RetrieveCmd::MAX_SIZE { + if key_len > MAX_SIZE_PLAIN_PAYLOAD { return Err(Error::RetrInvKey { what: "key size", value: key_len.to_string(), diff --git a/rust/pv/src/uvsecret/retr_secret.rs b/rust/pv/src/uvsecret/retr_secret.rs index ec07be79..84c467be 100644 --- a/rust/pv/src/uvsecret/retr_secret.rs +++ b/rust/pv/src/uvsecret/retr_secret.rs @@ -2,7 +2,7 @@ // // Copyright IBM Corp. 2024 -use crate::{pem::Pem, uvsecret::guest_secret::MAX_SIZE_PLAIN_PAYLOAD, Result}; +use crate::{crypto::SymKeyType, pem::Pem, uvsecret::guest_secret::MAX_SIZE_PLAIN_PAYLOAD, Result}; use log::warn; use pv_core::{ @@ -81,10 +81,11 @@ impl From for RetrievedSecret { // Test if the plain text secret has a size: // 1. len <= 8190 - // 2. first two bytes are max 15 less than buffer-size+2 + // 2. first two bytes are max 15 less than buffer-size+2 i.e. smaller than the + // block length // 3. bytes after len + 2 are zero match len <= MAX_SIZE_PLAIN_PAYLOAD - && key.value().len() - (len + 2) < 15 + && key.value().len() - (len + 2) < SymKeyType::AES_256_GCM_BLOCK_LEN && key.value()[len + 2..].iter().all(|c| *c == 0) { false => Self::Plaintext(key),