Skip to content

Commit 8352549

Browse files
Merge pull request #1136 from 00xc/attest/zeroizing
kernel: zeroize more secrets
2 parents 0e6eada + 6bd7075 commit 8352549

8 files changed

Lines changed: 119 additions & 45 deletions

File tree

.cargo/config.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
rustflags = [
55
"-C", "force-frame-pointers",
66
"--cfg", "aes_force_soft",
7+
"--cfg", 'aes_backend="soft"',
78
"--cfg", "polyval_force_soft",
89
]
910

Cargo.lock

Lines changed: 91 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ release = { path = "release" }
6868

6969
# crates.io
7070
aes-gcm = { version = "0.10.3", default-features = false }
71-
aes-kw = { version = "0.2.1", default-features = false }
71+
aes-kw = { version = "0.3.1", default-features = false }
7272
arbitrary = "1.3.0"
7373
base64 = { version = "0.22.1", default-features = false }
7474
bindgen = {version = "0.71.0", default-features = false }

kernel/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ libaproxy = { workspace = true, optional = true }
2020
elf.workspace = true
2121
syscall.workspace = true
2222

23-
aes-gcm = { workspace = true, features = ["aes", "alloc"] }
24-
aes-kw = { workspace = true, optional = true }
23+
aes-gcm = { workspace = true, features = ["aes", "alloc", "zeroize"] }
24+
aes-kw = { workspace = true, features = ["zeroize"], optional = true }
2525
bitfield-struct.workspace = true
2626
bitflags.workspace = true
2727
cocoon-tpm-crypto = { workspace = true, features = [

kernel/src/attest.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::{
1818
#[cfg(feature = "vsock")]
1919
use crate::{vsock::VMADDR_CID_HOST, vsock::stream::VsockStream};
2020
use aes_gcm::{AeadInPlace, Aes256Gcm, KeyInit, Nonce, aead::generic_array::GenericArray};
21-
use aes_kw::{Kek, KekAes256};
21+
use aes_kw::{KeyInit as _, KwAes256};
2222
use alloc::{string::ToString, vec::Vec};
2323
use cocoon_tpm_crypto::{
2424
CryptoError, EmptyCryptoIoSlices,
@@ -215,24 +215,20 @@ impl AttestationDriver<'_> {
215215
kdm.extend_from_slice(&(0_u32).to_be_bytes());
216216
kdm.extend_from_slice(&(256_u32).to_be_bytes());
217217

218-
let wrapping_key: KekAes256 = {
219-
let mut buf: Vec<u8> = vec_sized(32).or(Err(AttestationError::VecAlloc))?;
218+
let wrapping_key: KwAes256 = {
219+
let mut buf = SecretSlice::new_sized(32).or(Err(AttestationError::VecAlloc))?;
220220

221221
concat_kdf::derive_key_into::<sha2::Sha256>(&z, &kdm, &mut buf)
222222
.map_err(AttestationError::KeyDerivation)?;
223223

224-
let sized: [u8; 32] = buf
225-
.try_into()
226-
.or(Err(AttestationError::WrapKeyArrayConvert))?;
224+
KwAes256::new_from_slice(&buf).or(Err(AttestationError::WrapKeyArrayConvert))
225+
}?;
227226

228-
Kek::new(&GenericArray::from(sized))
229-
};
230-
231-
let mut cek =
232-
vec_sized(&decryption.wrapped_cek.len() - 8).or(Err(AttestationError::VecAlloc))?;
227+
let mut cek = SecretSlice::new_sized(&decryption.wrapped_cek.len() - 8)
228+
.or(Err(AttestationError::VecAlloc))?;
233229

234230
wrapping_key
235-
.unwrap(&decryption.wrapped_cek, &mut cek)
231+
.unwrap_key(&decryption.wrapped_cek, &mut cek)
236232
.or(Err(AttestationError::CekUnwrap))?;
237233

238234
let cipher = Aes256Gcm::new(GenericArray::from_slice(&cek));

kernel/src/crypto/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,25 @@
99
extern crate alloc;
1010

1111
use alloc::boxed::Box;
12+
use alloc::collections::TryReserveError;
1213
use zeroize::{Zeroize, ZeroizeOnDrop};
1314

15+
use crate::utils::vec::vec_sized;
16+
1417
/// Container for sensitive byte data.
1518
///
1619
/// The owned buffer is zeroed when the `SecretSlice` is dropped or explicitly
1720
/// [`zeroize`](Zeroize::zeroize)d.
1821
#[derive(Zeroize, ZeroizeOnDrop)]
1922
pub struct SecretSlice(Box<[u8]>);
2023

24+
impl SecretSlice {
25+
pub fn new_sized(size: usize) -> Result<Self, TryReserveError> {
26+
let v = vec_sized(size)?;
27+
Ok(Self(v.into_boxed_slice()))
28+
}
29+
}
30+
2131
impl From<Box<[u8]>> for SecretSlice {
2232
fn from(data: Box<[u8]>) -> Self {
2333
Self(data)

0 commit comments

Comments
 (0)