acrn-hypervisor/misc/config_tools/board_inspector/acpiparser/tpm2.py

52 lines
1.8 KiB
Python

# Copyright (C) 2021 Intel Corporation.
#
# SPDX-License-Identifier: BSD-3-Clause
#
import ctypes
import logging
import inspectorlib.cdata as cdata
from acpiparser._utils import TableHeader
def tpm2_optional_data(data_len):
start_method_data_len = 0
has_log_area = False
if data_len <= 12:
start_method_data_len = data_len
elif data_len == 24:
start_method_data_len = 12
has_log_area = True
else:
start_method_data_len = 12
logging.debug(f"TPM2 data length: {data_len + 52} is greater than 64 bytes but less than 76 bytes.")
logging.debug(f"The TPM2 data is still processed but the 65 to {data_len + 52} bytes are discard.")
return start_method_data_len, has_log_area
def tpm2_factory(start_method_data_len, has_log_area):
class TPM2(cdata.Struct):
_pack_ = 1
_fields_ = [
('header', TableHeader),
('platform_class', ctypes.c_uint16),
('reserved', ctypes.c_uint16),
('address_of_control_area', ctypes.c_uint64),
('start_method', ctypes.c_uint32),
('start_method_specific_parameters', ctypes.c_ubyte * start_method_data_len),
] + ([
('log_area_minimum_length', ctypes.c_uint32),
('log_area_start_address', ctypes.c_uint64),
] if has_log_area else [])
return TPM2
def TPM2(val):
"""Create class based on decode of a TPM2 table from filename."""
if isinstance(val, str):
base_length = 52
data = open(val, mode='rb').read()
start_method_data_len, has_log_area = tpm2_optional_data(len(data) - base_length)
return tpm2_factory(start_method_data_len, has_log_area).from_buffer_copy(data)
elif isinstance(val, bytearray):
return tpm2_factory(12, True).from_buffer(val) if len(val) > 64 else tpm2_factory(12, False).from_buffer(val)