Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
79 lines
7.0 KiB
Python
79 lines
7.0 KiB
Python
# Проверка firmware_identity на модели пк. Комментарии и исходный текст в UTF-8.
|
|
# Продолжает текущий вызов, список или выражение: """Independent test oracle: does this built SCI8 file contain its manifest identity?; порядок аргументов сохраняется.
|
|
"""Independent test oracle: does this built SCI8 file contain its manifest identity?
|
|
|
|
This is a build test, not a second production protocol codec. The 12-word vector
|
|
is deliberately constructed independently of the C implementation to detect a
|
|
stale compilation unit, incorrect byte order or a mismatched pre-build JSON.
|
|
Usage: python tests/firmware_identity/check_build.py path/to/firmware.bin
|
|
"""
|
|
# Импортирует необходимые имена: from datetime import datetime.
|
|
from datetime import datetime
|
|
# Подключает модуль hashlib для этой проверки или подготовки сборки.
|
|
import hashlib
|
|
# Подключает модуль json для этой проверки или подготовки сборки.
|
|
import json
|
|
# Импортирует необходимые имена: from pathlib import Path.
|
|
from pathlib import Path
|
|
# Подключает модуль struct для этой проверки или подготовки сборки.
|
|
import struct
|
|
# Подключает модуль sys для этой проверки или подготовки сборки.
|
|
import sys
|
|
|
|
# Задаёт image по выражению справа; значение используется последующими операциями.
|
|
image = Path(sys.argv[1])
|
|
# Читает исходный файл или образ для последующей проверки и разбора.
|
|
data = image.read_bytes()
|
|
# Читает исходный файл или образ для последующей проверки и разбора.
|
|
meta = json.loads(image.with_suffix(image.suffix + '.manifest.json').read_text(encoding="utf-8"))
|
|
# Проверяет обязательное условие hashlib.sha256(data).hexdigest() == meta['sha256'], 'Wrong file hash'; нарушение делает тест неуспешным.
|
|
assert hashlib.sha256(data).hexdigest() == meta['sha256'], 'Wrong file hash'
|
|
# Проверяет обязательное условие len(data) == meta['size_bytes'], 'Wrong image size'; нарушение делает тест неуспешным.
|
|
assert len(data) == meta['size_bytes'], 'Wrong image size'
|
|
# Задаёт stamp по выражению справа; значение используется последующими операциями.
|
|
stamp = datetime.fromisoformat(meta['built_at_utc'])
|
|
# Задаёт build_id по выражению справа; значение используется последующими операциями.
|
|
build_id = meta['build_id']
|
|
# Задаёт words по выражению справа; значение используется последующими операциями.
|
|
words = [1, *meta['version'], stamp.year, stamp.month * 256 + stamp.day,
|
|
# Продолжает текущий вызов, список или выражение: stamp.hour * 256 + stamp.minute, stamp.second]; порядок аргументов сохраняется.
|
|
stamp.hour * 256 + stamp.minute, stamp.second]
|
|
# Задаёт words + по выражению справа; значение используется последующими операциями.
|
|
words += [ord(build_id[i]) * 256 + ord(build_id[i+1]) for i in range(0, 8, 2)]
|
|
# Задаёт expected по выражению справа; значение используется последующими операциями.
|
|
expected = struct.pack('<12H', *words)
|
|
# Проверяет обязательное условие data[:2] == b'\xaa\x08', 'Not SCI8'; нарушение делает тест неуспешным.
|
|
assert data[:2] == b'\xaa\x08', 'Not SCI8'
|
|
# Задаёт offset по выражению справа; значение используется последующими операциями.
|
|
offset = 22
|
|
# Задаёт found по выражению справа; значение используется последующими операциями.
|
|
found = 0
|
|
# Повторяет блок при выполнении True.
|
|
while True:
|
|
# Задаёт count, по выражению справа; значение используется последующими операциями.
|
|
count, = struct.unpack_from('<H', data, offset)
|
|
# Задаёт offset + по выражению справа; значение используется последующими операциями.
|
|
offset += 2
|
|
# Проверяет условие if not count перед выполнением следующего блока.
|
|
if not count:
|
|
# Продолжает текущий вызов, список или выражение: break; порядок аргументов сохраняется.
|
|
break
|
|
# Задаёт offset + по выражению справа; значение используется последующими операциями.
|
|
offset += 4 # destination address, not part of the loaded section payload
|
|
# Задаёт end по выражению справа; значение используется последующими операциями.
|
|
end = offset + count * 2
|
|
# Проверяет обязательное условие end <= len(data), 'Truncated boot block'; нарушение делает тест неуспешным.
|
|
assert end <= len(data), 'Truncated boot block'
|
|
# Задаёт block по выражению справа; значение используется последующими операциями.
|
|
block = data[offset:end]
|
|
# Задаёт found + по выражению справа; значение используется последующими операциями.
|
|
found += sum(block[i:i+24] == expected for i in range(0, len(block)-23, 2))
|
|
# Задаёт offset по выражению справа; значение используется последующими операциями.
|
|
offset = end
|
|
# Проверяет обязательное условие offset == len(data), 'Trailing data'; нарушение делает тест неуспешным.
|
|
assert offset == len(data), 'Trailing data'
|
|
# Проверяет обязательное условие found == 1, f'Expected one embedded identity, found {found}'; нарушение делает тест неуспешным.
|
|
assert found == 1, f'Expected one embedded identity, found {found}'
|
|
# Продолжает текущий вызов, список или выражение: print(f'PASS: SCI8 contains manifest identity {meta["version"]}, {build_id}, {stamp.isoformat()}'); порядок аргументов сохраняется.
|
|
print(f'PASS: SCI8 contains manifest identity {meta["version"]}, {build_id}, {stamp.isoformat()}')
|