52 lines
1.8 KiB
Python
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)
|