Skip to content

Commit

Permalink
unpacker: add broadcom SAO image support
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewjlamarche committed Oct 24, 2024
1 parent 21fb851 commit 03ce96f
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 0 deletions.
Empty file.
Empty file.
47 changes: 47 additions & 0 deletions fact_extractor/plugins/unpacking/broadcom/code/broadcom-sao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
'''
This plugin unpacks Broadcom SAO images.
'''

import os
from pathlib import Path
from common_helper_files import write_binary_to_file

NAME = "Broadcom SAO"
MIME_PATTERNS = ['firmware/broadcom-sao']
VERSION = '0.1'

def unpack_function(file_path, tmp_dir):
'''
file_path specifies the input file.
tmp_dir must be used to store the extracted files.
Optional: Return a dict with meta information
'''

FILE_SIZE = os.stat(file_path).st_size

try:
with open(file_path, 'rb') as f:
while (f.tell() < FILE_SIZE):
f.read(8) # skip 8 bytes to part name offset
name = f.read(4).decode('utf-8')
f.read(4) # skip 4 more bytes to size offset
size = int.from_bytes(f.read(4), 'big')
f.read(44) # skip rest of header
data = f.read(size)
outfile = Path(tmp_dir) / name
write_binary_to_file(data, outfile)

except IOError as io_error:
return {'output': 'failed to read file: {}'.format(str(io_error))}

except struct.error as struct_error:
return {'output': 'failed to recognized firmware container: {}'.format(str(struct_error))}

return {
'output': 'successfully unpacked Broadcom SAO image'
}

# ----> Do not edit below this line <----
def setup(unpack_tool):
for item in MIME_PATTERNS:
unpack_tool.register_plugin(item, (unpack_function, NAME, VERSION))
Empty file.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import os

from test.unit.unpacker.test_unpacker import TestUnpackerBase

TEST_DATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data')

class TestBroadcomSAOUnpacker(TestUnpackerBase):

def test_unpacker_selection_generic(self):
self.check_unpacker_selection('firmware/broadcom-sao', 'Broadcom SAO')

def test_extraction(self):
test_file_path = os.path.join(TEST_DATA_DIR, 'broadcom-sao.bin')
extracted_files, meta_data = self.unpacker.extract_files_from_file(test_file_path, self.tmp_dir.name)

assert meta_data['plugin_used'] == 'Broadcom SAO', 'wrong plugin applied'

assert len(extracted_files) == 4, 'not all files extracted'
assert all(element in ['META', 'DTBB', 'KRNL', 'RTFS'] for element in extracted_files), 'not all files extracted'

0 comments on commit 03ce96f

Please sign in to comment.