# Проверка 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('