Files
UniXNU/scripts/test-corecrypto14-post.py
T
rpone 02f8cdd377 fix(scripts): use mach.development.bcm2837.unstripped (no .noctf suffix)
The kernel object produced by the ipados27 build tree is
mach.development.bcm2837.unstripped; the .noctf variant is not emitted.
Fix the reference in build-sheng-source-drivers.py and all other scripts
that contained the wrong suffix.

Also update submodule pointers for Adreno740 (preemption A1) and
AdrenoMetal (priority forwarding + pass reporter), and regenerate
turnip-gmem-mutable-swap.patch to include the NativeAdrenoAbiPriority
method-17 call in tu_knl_darwin.cc.
2026-11-01 00:20:19 +08:00

54 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
"""Require real crypto registration and refusal of a corrupted POST HMAC."""
import argparse
import hashlib
import json
from pathlib import Path
import subprocess
import sys
ROOT = Path(__file__).resolve().parents[1]
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--check-existing', action='store_true', help='Validate captured runs without repeating QEMU')
parser.add_argument('--kernel', type=Path, default=ROOT / 'build/xnu/ios-obj/DEVELOPMENT_ARM64_BCM2837/mach.development.bcm2837.unstripped')
args = parser.parse_args()
kernel = args.kernel.resolve()
original = kernel.read_bytes()
metadata = json.loads(kernel.with_suffix(kernel.suffix + '.crypto-hmac.json').read_text())
if hashlib.sha256(original).hexdigest() != metadata['kernel_sha256']:
raise SystemExit('The source kernel no longer matches its integrity-build record')
positive = ROOT / 'build/darwinboot-crypto14'
negative = ROOT / 'build/darwinboot-bad-hmac'
bad_path = ROOT / 'build/corecrypto-2023/negative-hmac/kernel.macho'
if not args.check_existing:
subprocess.run([sys.executable, ROOT / 'scripts/probe-darwinboot-xnu.py', '--kernel', kernel,
'--output', positive, '--break-symbol', '_kmem_crypto_init', '--require-crypto14'], check=True)
bad = bytearray(original)
bad[int(metadata['hmac_file_offset'], 16)] ^= 1
bad_path.parent.mkdir(parents=True, exist_ok=True)
bad_path.write_bytes(bad)
subprocess.run([sys.executable, ROOT / 'scripts/probe-darwinboot-xnu.py', '--kernel', bad_path,
'--output', negative], check=True)
good = json.loads((positive / 'gdb-stop.json').read_text())
bad = json.loads((negative / 'gdb-stop.json').read_text())
corrupted = bad_path.read_bytes()
if len(original) != len(corrupted):
raise SystemExit('Corruption fixture changed the kernel length')
differences = [index for index, (left, right) in enumerate(zip(original, corrupted)) if left != right]
if differences != [int(metadata['hmac_file_offset'], 16)]:
raise SystemExit('Negative fixture must change exactly one POST HMAC byte')
if good['kernel_sha256'] != metadata['kernel_sha256'] or not good['crypto14_initialization_observed']:
raise SystemExit('No matching positive provider initialization was observed')
if good['stop_symbol'] != '_kmem_crypto_init' or not good['native_4k_mmu_observed']:
raise SystemExit('Positive observation did not reach the expected native 4K stage')
reason = bad['argument_memory'].get('x0', '')
if (bad['kernel_sha256'] != hashlib.sha256(corrupted).hexdigest() or 'FIPS Kernel POST Failed' not in reason
or bad['crypto14_initialization_observed'] or bad['crypto14_globals']['_g_crypto_funcs']
or bad['crypto14_globals']['_prng_ready']):
raise SystemExit('Corrupt HMAC was not refused by the real provider before registration')
report = {'kernel_sha256': metadata['kernel_sha256'], 'native_4k_observed': True,
'default_provider_post_and_registration_passed': True, 'corrupted_hmac_refused': True,
'vendor_certification_claimed': False, 'ipados_userspace_boot_demonstrated': False}
(ROOT / 'build/corecrypto-2023/post-test.json').write_text(json.dumps(report, indent=2) + '\n')
print('PASS: real provider/PRNG initialization and deliberate HMAC corruption refusal, native 4K retained')