1*a77df802SJerome Forissier#!/usr/bin/env python3 2*a77df802SJerome Forissier# SPDX-License-Identifier: BSD-2-Clause 3*a77df802SJerome Forissier# 4*a77df802SJerome Forissier# Copyright (c) 2021, Huawei Technologies Co., Ltd 5*a77df802SJerome Forissier# 6*a77df802SJerome Forissier 7*a77df802SJerome Forissierfrom cryptography.hazmat.backends import default_backend 8*a77df802SJerome Forissierfrom cryptography.hazmat.primitives import hashes 9*a77df802SJerome Forissierfrom elftools.elf.elffile import ELFFile 10*a77df802SJerome Forissierfrom elftools.elf.sections import SymbolTableSection 11*a77df802SJerome Forissierimport codecs 12*a77df802SJerome Forissierimport sys 13*a77df802SJerome Forissier 14*a77df802SJerome Forissierverbose = False 15*a77df802SJerome Forissier 16*a77df802SJerome Forissier 17*a77df802SJerome Forissierdef dump(buf): 18*a77df802SJerome Forissier print(codecs.encode(buf, 'hex').decode('utf-8')) 19*a77df802SJerome Forissier 20*a77df802SJerome Forissier 21*a77df802SJerome Forissierdef resolve_symbol(elf, name): 22*a77df802SJerome Forissier for section in elf.iter_sections(): 23*a77df802SJerome Forissier if isinstance(section, SymbolTableSection): 24*a77df802SJerome Forissier for symbol in section.iter_symbols(): 25*a77df802SJerome Forissier if symbol.name == name: 26*a77df802SJerome Forissier return symbol.entry['st_value'] 27*a77df802SJerome Forissier raise RuntimeError(f'Symbol {name} not found') 28*a77df802SJerome Forissier 29*a77df802SJerome Forissier 30*a77df802SJerome Forissierdef hash_range(h, elf, start, end): 31*a77df802SJerome Forissier global verbose 32*a77df802SJerome Forissier start_addr = resolve_symbol(elf, start) 33*a77df802SJerome Forissier end_addr = resolve_symbol(elf, end) 34*a77df802SJerome Forissier size = end_addr - start_addr 35*a77df802SJerome Forissier if verbose: 36*a77df802SJerome Forissier print(f'[{start}(0x{start_addr:x}), {end}(0x{end_addr:x})]: ' 37*a77df802SJerome Forissier f'{size} bytes') 38*a77df802SJerome Forissier for segment in elf.iter_segments(): 39*a77df802SJerome Forissier if (segment['p_type'] == 'PT_LOAD' and 40*a77df802SJerome Forissier segment['p_vaddr'] <= start_addr and 41*a77df802SJerome Forissier end_addr <= segment['p_vaddr'] + segment['p_filesz']): 42*a77df802SJerome Forissier begin_offs = start_addr - segment['p_vaddr'] 43*a77df802SJerome Forissier h.update(segment.data()[begin_offs:begin_offs + size]) 44*a77df802SJerome Forissier 45*a77df802SJerome Forissier 46*a77df802SJerome Forissierdef hash_section(h, elf, name): 47*a77df802SJerome Forissier global verbose 48*a77df802SJerome Forissier s = elf.get_section_by_name(name) 49*a77df802SJerome Forissier if s is None: 50*a77df802SJerome Forissier return 51*a77df802SJerome Forissier d = s.data() 52*a77df802SJerome Forissier if verbose: 53*a77df802SJerome Forissier print(f'{name}: {len(d)} bytes') 54*a77df802SJerome Forissier h.update(d) 55*a77df802SJerome Forissier 56*a77df802SJerome Forissier 57*a77df802SJerome Forissierdef main(): 58*a77df802SJerome Forissier global verbose 59*a77df802SJerome Forissier argc = len(sys.argv) 60*a77df802SJerome Forissier if argc != 2 and argc != 3: 61*a77df802SJerome Forissier print('Usage:', sys.argv[0], '<tee.elf>') 62*a77df802SJerome Forissier return 1 63*a77df802SJerome Forissier 64*a77df802SJerome Forissier if argc == 3 and sys.argv[1] == '-v': 65*a77df802SJerome Forissier verbose = True 66*a77df802SJerome Forissier 67*a77df802SJerome Forissier with open(sys.argv[argc - 1], 'rb') as f: 68*a77df802SJerome Forissier elf = ELFFile(f) 69*a77df802SJerome Forissier h = hashes.Hash(hashes.SHA256(), default_backend()) 70*a77df802SJerome Forissier hash_range(h, elf, '__text_start', '__text_data_start') 71*a77df802SJerome Forissier hash_range(h, elf, '__text_data_end', '__text_end') 72*a77df802SJerome Forissier hash_section(h, elf, '.text_init') 73*a77df802SJerome Forissier hash_section(h, elf, '.text_pageable') 74*a77df802SJerome Forissier hash_section(h, elf, '.rodata') 75*a77df802SJerome Forissier hash_section(h, elf, '.rodata_init') 76*a77df802SJerome Forissier hash_section(h, elf, '.rodata_pageable') 77*a77df802SJerome Forissier dump(h.finalize()) 78*a77df802SJerome Forissier 79*a77df802SJerome Forissier 80*a77df802SJerome Forissierif __name__ == "__main__": 81*a77df802SJerome Forissier main() 82