use super::EventType;
use crate::{Guid, PhysicalAddress, Status, guid};
use bitflags::bitflags;
use core::ffi::c_void;
#[repr(C)]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd)]
pub struct Tcg2Version {
pub major: u8,
pub minor: u8,
}
bitflags! {
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
#[repr(transparent)]
pub struct Tcg2EventLogBitmap: u32 {
const TCG_1_2 = 0x0000_0001;
const TCG_2 = 0x0000_0002;
}
}
pub type Tcg2EventLogFormat = Tcg2EventLogBitmap;
bitflags! {
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
#[repr(transparent)]
pub struct Tcg2HashAlgorithmBitmap: u32 {
const SHA1 = 0x0000_0001;
const SHA256 = 0x0000_0002;
const SHA384 = 0x0000_0004;
const SHA512 = 0x0000_0008;
const SM3_256 = 0x0000_0010;
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd)]
pub struct Tcg2BootServiceCapability {
pub size: u8,
pub structure_version: Tcg2Version,
pub protocol_version: Tcg2Version,
pub hash_algorithm_bitmap: Tcg2HashAlgorithmBitmap,
pub supported_event_logs: Tcg2EventLogBitmap,
pub tpm_present_flag: u8,
pub max_command_size: u16,
pub max_response_size: u16,
pub manufacturer_id: u32,
pub number_of_pcr_banks: u32,
pub active_pcr_banks: Tcg2HashAlgorithmBitmap,
}
bitflags! {
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
#[repr(transparent)]
pub struct Tcg2HashLogExtendEventFlags: u64 {
const EFI_TCG2_EXTEND_ONLY = 0x0000_0000_0000_0001;
const PE_COFF_IMAGE = 0x0000_0000_0000_0010;
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(C, packed)]
pub struct Tcg2EventHeader {
pub header_size: u32,
pub header_version: u16,
pub pcr_index: u32,
pub event_type: EventType,
}
#[derive(Debug)]
#[repr(C)]
pub struct Tcg2Protocol {
pub get_capability: unsafe extern "efiapi" fn(
this: *mut Self,
protocol_capability: *mut Tcg2BootServiceCapability,
) -> Status,
pub get_event_log: unsafe extern "efiapi" fn(
this: *mut Self,
event_log_format: Tcg2EventLogFormat,
event_log_location: *mut PhysicalAddress,
event_log_last_entry: *mut PhysicalAddress,
event_log_truncated: *mut u8,
) -> Status,
pub hash_log_extend_event: unsafe extern "efiapi" fn(
this: *mut Self,
flags: Tcg2HashLogExtendEventFlags,
data_to_hash: PhysicalAddress,
data_to_hash_len: u64,
event: *const c_void,
) -> Status,
pub submit_command: unsafe extern "efiapi" fn(
this: *mut Self,
input_parameter_block_size: u32,
input_parameter_block: *const u8,
output_parameter_block_size: u32,
output_parameter_block: *mut u8,
) -> Status,
pub get_active_pcr_banks: unsafe extern "efiapi" fn(
this: *mut Self,
active_pcr_banks: *mut Tcg2HashAlgorithmBitmap,
) -> Status,
pub set_active_pcr_banks: unsafe extern "efiapi" fn(
this: *mut Self,
active_pcr_banks: Tcg2HashAlgorithmBitmap,
) -> Status,
pub get_result_of_set_active_pcr_banks: unsafe extern "efiapi" fn(
this: *mut Self,
operation_present: *mut u32,
response: *mut u32,
) -> Status,
}
impl Tcg2Protocol {
pub const GUID: Guid = guid!("607f766c-7455-42be-930b-e4d76db2720f");
}