xref: /optee_os/scripts/print_tee_hash.py (revision a77df8024bc49b6374cadc25a8f226e4ff429af2)
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