#![allow(non_snake_case)]
use crate::{
LOG_DBG,
tlcl::{tpm_exchange, unmarshal::unmarshal_response_code},
};
#[rustfmt::skip]
const NV_DEFINESPACE_TEMPLATE: [u8; 101] = [
0x00, 0xc1,
0x00, 0x00, 0x00, 0x65,
0x00, 0x00, 0x00, 0xcc,
0x00, 0x18,
0x00, 0x00, 0x00, 0x00,
0x00, 0x03,
0x00, 0x00, 0x00,
0x1f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03,
0x00, 0x00, 0x00,
0x1f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x17,
0x00, 0x00, 0x00, 0x00,
0x00,
0x00,
0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
];
const OFFSET_INDEX: usize = 12; const OFFSET_PERM: usize = 70; const OFFSET_SIZE: usize = 77;
fn patch_u32(buf: &mut [u8], offset: usize, val: u32) {
buf[offset] = (val >> 24) as u8;
buf[offset + 1] = (val >> 16) as u8;
buf[offset + 2] = (val >> 8) as u8;
buf[offset + 3] = (val & 0xFF) as u8;
}
fn define_space_ex(index: u32, perm: u32, size: u32) -> u32 {
let mut cmd_buf: [u8; 512] = [0; 512];
let mut resp_buf: [u8; 4096] = [0; 4096];
cmd_buf[..101].copy_from_slice(&NV_DEFINESPACE_TEMPLATE);
patch_u32(&mut cmd_buf, OFFSET_INDEX, index);
patch_u32(&mut cmd_buf, OFFSET_PERM, perm);
patch_u32(&mut cmd_buf, OFFSET_SIZE, size);
LOG_DBG!("index=0x{:x}, perm=0x{:x}, size={}", index, perm, size);
match tpm_exchange(&mut cmd_buf, &mut resp_buf) {
Ok(_) => {
let rc = unmarshal_response_code(&resp_buf);
LOG_DBG!("rc=0x{:x}", rc);
rc
}
Err(e) => {
LOG_DBG!("tpm_exchange failed: {}", e);
0xFFFFFFFF
}
}
}
pub fn TlclDefineSpace(index: u32, perm: u32, size: u32) -> u32 {
define_space_ex(index, perm, size)
}
pub fn TlclDefineSpaceEx(
_owner_auth: Option<&[u8]>,
index: u32,
perm: u32,
size: u32,
) -> u32 {
define_space_ex(index, perm, size)
}
pub fn TlclUndefineSpace(index: u32) -> u32 {
define_space_ex(index, 0, 0)
}
pub fn TlclUndefineSpaceEx(_owner_auth: Option<&[u8]>, index: u32) -> u32 {
define_space_ex(index, 0, 0)
}