Fixup merge

Signed-off-by: brentholtsclaw <brent.holtsclaw@intel.com>
This commit is contained in:
brentholtsclaw
2022-09-07 11:43:22 -07:00
committed by Nathaniel Mitchell
parent e4b1ecaf86
commit af2d2c0402
2 changed files with 45 additions and 38 deletions
+17 -12
View File
@@ -70,17 +70,19 @@ type2ext = {EFI_SECTION_PE32: 'pe32', EFI_SECTION_TE: 'te', EFI_SECTION_PIC: 'pi
WRITE_ALL_HASHES = False
def decompress_section_data( section_dir_path, sec_fs_name, compressed_data, compression_type):
def decompress_section_data(section_dir_path, sec_fs_name, compressed_data, compression_type):
uefi_uc = UEFICompression()
uncompressed_name = os.path.join(section_dir_path, sec_fs_name)
if logger().HAL: logger().log("[uefi] decompressing EFI binary (type = 0x{:X})\n {} ->\n".format(compression_type, uncompressed_name))
if logger().HAL:
logger().log("[uefi] decompressing EFI binary (type = 0x{:X})\n {} ->\n".format(compression_type, uncompressed_name))
uncompressed_image = uefi_uc.decompress_EFI_binary(compressed_data, compression_type)
return uncompressed_image
def compress_image(image, compression_type):
uefi_uc = UEFICompression()
if logger().HAL: logger().log("[uefi] compressing EFI binary (type = 0x{:X})\n".format(compression_type))
if logger().HAL:
logger().log("[uefi] compressing EFI binary (type = 0x{:X})\n".format(compression_type))
compressed_image = uefi_uc.compress_EFI_binary(image, compression_type)
return compressed_image
@@ -219,7 +221,7 @@ def build_efi_modules_tree(fwtype, data, Size, offset, polarity):
sec.children = build_efi_model(data, fwtype)
sections.append(sec)
sec = NextFwFileSection( data, Size, sec.Size + sec.Offset, polarity)
sec = NextFwFileSection(data, Size, sec.Size + sec.Offset, polarity)
secn += 1
return sections
@@ -230,7 +232,8 @@ def build_efi_modules_tree(fwtype, data, Size, offset, polarity):
# fwtype - platform specific firmware type used to detect NVRAM format (VSS, EVSA, NVAR...)
def build_efi_file_tree (fv_img, fwtype):
def build_efi_file_tree(fv_img, fwtype):
fv_size, HeaderSize, Attributes = GetFvHeader(fv_img)
polarity = Attributes & EFI_FVB2_ERASE_POLARITY
fwbin = NextFwFile(fv_img, fv_size, HeaderSize, polarity)
@@ -267,7 +270,7 @@ def build_efi_tree(data, fwtype):
# Detect File System firmware volumes
if fv.Guid in EFI_PLATFORM_FS_GUIDS or fv.Guid in EFI_FS_GUIDS:
fwbin = build_efi_file_tree (fv.Image, fwtype)
fwbin = build_efi_file_tree(fv.Image, fwtype)
for i in fwbin:
fv.children.append(i)
@@ -432,8 +435,9 @@ def save_efi_tree(modules, parent=None, save_modules=True, path=None, save_log=T
# getNVstore_xxx functions expect FV than a FW file within FV
# so for EFI_FILE type of module using parent's Image as NVRAM
nvram = parent.Image if (type(m) == EFI_FILE and type(parent) == EFI_FV) else m.Image
parse_EFI_variables( os.path.join(mod_dir_path, 'NVRAM'), nvram, False, m.NVRAMType)
else: raise Exception("NVRAM type cannot be None")
parse_EFI_variables(os.path.join(mod_dir_path, 'NVRAM'), nvram, False, m.NVRAMType)
else:
raise Exception("NVRAM type cannot be None")
except Exception:
logger().log_warning("couldn't extract NVRAM in {{{}}} using type '{}'".format(m.Guid, m.NVRAMType))
@@ -474,7 +478,7 @@ def parse_uefi_region_from_file(filename, fwtype, outpath=None, filetype=[]):
tree_json = save_efi_tree_filetype(tree, path=outpath, filetype=filetype)
else:
tree_json = save_efi_tree(tree, path=outpath)
write_file( "{}.UEFI.json".format(filename), json.dumps(tree_json, indent=2, separators=(',', ': '), cls=UUIDEncoder) )
write_file("{}.UEFI.json".format(filename), json.dumps(tree_json, indent=2, separators=(',', ': '), cls=UUIDEncoder))
def decode_uefi_region(pth, fname, fwtype, filetype=[]):
@@ -487,7 +491,8 @@ def decode_uefi_region(pth, fname, fwtype, filetype=[]):
os.makedirs(fv_pth)
# Decoding UEFI Firmware Volumes
if logger().HAL: logger().log( "[spi_uefi] decoding UEFI firmware volumes..." )
if logger().HAL:
logger().log("[spi_uefi] decoding UEFI firmware volumes...")
parse_uefi_region_from_file(fname, fwtype, fv_pth, filetype)
# If a specific filetype is wanted, there is no need to check for EFI Variables
if filetype:
@@ -505,8 +510,8 @@ def decode_uefi_region(pth, fname, fwtype, filetype=[]):
if logger().HAL:
logger().log_error("unrecognized NVRAM type {}".format(fwtype))
return
nvram_fname = os.path.join( bios_pth, ('nvram_{}'.format(fwtype)) )
logger().set_log_file( (nvram_fname + '.nvram.lst') )
nvram_fname = os.path.join(bios_pth, ('nvram_{}'.format(fwtype)))
logger().set_log_file((nvram_fname + '.nvram.lst'))
parse_EFI_variables(nvram_fname, region_data, False, fwtype)
+28 -26
View File
@@ -216,9 +216,10 @@ def print_sorted_EFI_variables(variables):
for name in sorted_names:
for rec in variables[name]:
# off, buf, hdr, data, guid, attrs
print_efi_variable( rec[0], rec[1], rec[2], name, rec[3], rec[4], rec[5] )
print_efi_variable(rec[0], rec[1], rec[2], name, rec[3], rec[4], rec[5])
def decode_EFI_variables( efi_vars, nvram_pth ):
def decode_EFI_variables(efi_vars, nvram_pth):
# print decoded and sorted EFI variables into a log file
print_sorted_EFI_variables(efi_vars)
# write each EFI variable into its own binary file
@@ -246,13 +247,11 @@ def identify_EFI_NVRAM(buffer):
if offset != -1: return fw_type
return None
def parse_EFI_variables(self, fname, rom, authvars, _fw_type=None):
if _fw_type in uefi_platform.fw_types:
logger().log("[uefi] Using FW type (NVRAM format): {}".format(_fw_type))
#self.set_FWType(_fw_type)
else:
logger().error("Unrecognized FW type (NVRAM format) '{}'..".format(_fw_type))
logger().log_error("Unrecognized FW type (NVRAM format) '{}'..".format(_fw_type))
return False
logger().log("[uefi] Searching for NVRAM in the binary..")
@@ -267,42 +266,43 @@ def parse_EFI_variables(self, fname, rom, authvars, _fw_type=None):
efi_vars = uefi_platform.EFI_VAR_DICT[_fw_type]['func_getefivariables'](efi_vars_store)
decode_EFI_variables(efi_vars, nvram_pth)
else:
logger().error("Did not find NVRAM")
logger().log_error("Did not find NVRAM")
return False
return True
return True
def find_EFI_variable_store(rom_buffer, _FWType):
if rom_buffer is None:
logger().error('rom_buffer is None')
logger().log_error('rom_buffer is None')
return None
rom = rom_buffer
offset = 0
size = len(rom_buffer)
offset = 0
size = len(rom_buffer)
nvram_header = None
if uefi_platform.EFI_VAR_DICT[_FWType]['func_getnvstore']:
(offset, size, nvram_header) = uefi_platform.EFI_VAR_DICT[_FWType]['func_getnvstore'](rom)
if (-1 == offset):
logger().error("'func_getnvstore' is defined but could not find EFI NVRAM. Exiting..")
logger().log_error("'func_getnvstore' is defined but could not find EFI NVRAM. Exiting..")
return None
else:
logger().log("[uefi] 'func_getnvstore' is not defined in EFI_VAR_DICT. Assuming start offset 0..")
if -1 == size: size = len(rom_buffer)
if -1 == size:
size = len(rom_buffer)
nvram_buf = rom[offset: offset + size]
if logger().UTIL_TRACE:
logger().log('[uefi] Found EFI NVRAM at offset 0x{:08X}'.format(offset))
logger().log( """
logger().log("""
==================================================================
NVRAM: EFI Variable Store
==================================================================""")
if nvram_header: logger().log(nvram_header)
if nvram_header:
logger().log(nvram_header)
return nvram_buf
########################################################################################################
#
# UEFI HAL Component
@@ -340,29 +340,31 @@ class UEFI(hal_base.HALBase):
def dump_EFI_variables_from_SPI(self):
return self.read_EFI_variables_from_SPI(0, 0x800000)
def read_EFI_variables_from_SPI( self, BIOS_region_base, BIOS_region_size ):
rom = self.cs.spi.read_spi( BIOS_region_base, BIOS_region_size )
efi_var_store = self.find_EFI_variable_store( rom, self._FWType )
def read_EFI_variables_from_SPI(self, BIOS_region_base, BIOS_region_size):
rom = self.cs.spi.read_spi(BIOS_region_base, BIOS_region_size)
efi_var_store = self.find_EFI_variable_store(rom, self._FWType)
if efi_var_store:
efi_vars = uefi_platform.EFI_VAR_DICT[self._FWType]['func_getefivariables']
return efi_vars
return efi_var_store
def read_EFI_variables_from_file( self, filename ):
rom = read_file( filename )
efi_var_store = self.find_EFI_variable_store( rom, self._FWType )
def read_EFI_variables_from_file(self, filename):
rom = read_file(filename)
efi_var_store = self.find_EFI_variable_store(rom, self._FWType)
if efi_var_store:
efi_vars = uefi_platform.EFI_VAR_DICT[self._FWType]['func_getefivariables']
return efi_vars
return efi_var_store
# @TODO: Do not use, will be removed
def read_EFI_variables( self, efi_var_store, authvars ):
if ( efi_var_store is None ):
logger().error( 'efi_var_store is None' )
def read_EFI_variables(self, efi_var_store, authvars):
if (efi_var_store is None):
logger().log_error('efi_var_store is None')
return None
variables = uefi_platform.EFI_VAR_DICT[ self._FWType ]['func_getefivariables']( efi_var_store )
if logger().UTIL_TRACE: print_sorted_EFI_variables( variables )
variables = uefi_platform.EFI_VAR_DICT[self._FWType]['func_getefivariables'](efi_var_store)
if logger().UTIL_TRACE:
print_sorted_EFI_variables(variables)
return variables
######################################################################