CHANGELOG (4578B)
1 # Changelog 2 3 - 0.2.0 (2026-10-31) 4 * Data-independent-timing contracts: `record --contract arm-dit` 5 or `intel-doitm`, with `--object` and `--objdump`, has the plugin 6 fingerprint the operands of every instruction outside the ISA's 7 contract in the objects named, as it does a division's. The 8 tables are transcribed from the vendors' statements: Arm's A64 9 ISA XML (2022-12), every encoding with its source registers, and 10 Intel's list 768547 (2026-02-23). 11 * `diff` reports such an instruction on other operands under 12 `outside`, apart from the origins, with its text, and how many 13 ran (vestigia/diff-v4, which also names the ISA and contract, and 14 gives an operand origin its text where the watch list named it). 15 Runs recorded under other contracts are refused. 16 * `vestigia watch` writes the watch list once, for `record --watch` 17 to read in every run of one program; `diffOf` does so. 18 * `record` appends the guest's ISA to its dump. 19 * `diffOf` takes a `contract`; the command finds LLVM's 20 `llvm-objdump` through `$VESTIGIA_OBJDUMP`. 21 * `read` resolves the objects a harness reports to the files they 22 name, as memcheck names a frame's object, so a library reached by 23 its soname's link has its sites placed by offset. 24 * `record --cpu MODEL` has QEMU emulate MODEL (its -cpu), which the 25 dump records (a `P` line); `diff` refuses runs recorded on other 26 models and names the model in its report; `diffOf` takes `cpu`. 27 * QEMU's AArch64 models take `crypto=off`, removing the 28 cryptographic extension as a CPU without it reports 29 (qemu-crypto.patch). 30 31 - 0.1.0 (2026-10-22) 32 * Initial version, with two instruments over a harness that marks 33 its secret (`vestigia.h`, defined by `vestigia.c`, which serves 34 a foreign function interface too and records where the loader 35 put each object). A taint run that marked no secret is refused. 36 * `vestigia run`: the harness under memcheck with the secret's 37 bytes undefined, reporting each branch, address, and integer 38 division operand computed from them (the last through a memcheck 39 patch, `nix/memcheck-operand.patch`), each at its own 40 instruction. `--dir` keeps a run, and `vestigia read` reports on 41 several kept runs, or memcheck XML made elsewhere, as one 42 (vestigia/trace-v2: each run with its command, exit, and 43 objects; each site with the runs that reached it). 44 * `vestigia record` and `vestigia diff`: the harness under QEMU 45 with vestigia's plugin, its leakage trace summarised per 46 instruction, and where runs differing only in the secret diverge 47 (vestigia/diff-v3): 48 * each run with how it was made, its arguments and exit status; 49 * the origins: a branch taking its outcomes in another proportion 50 or order, an instruction touching other addresses, and an 51 integer division on other operands, a return never one; each 52 with the runs alike there, the runs that never reached it, and 53 the calls that reached it; 54 * what ran downstream, and what every run executed, per object; 55 * controls repeating a secret, what differs in them set apart as 56 unsteady, and runs designed to reach particular paths, compared 57 for control and coverage alone (`--designed`). 58 * `record` runs an x86_64 or aarch64 harness on either host, with 59 randomisation off (or not at all), the guest's entropy, its 60 getrandom included, seeded, and QEMU's own allocations kept off 61 the guest's mappings, which under load can otherwise take the 62 room of a guest library or heap. The plugin names each 63 instruction by its address in its object, and stops a guest that 64 starts a second thread. 65 * `diff` refuses runs that loaded an object at different 66 addresses; runs of another program, or with arguments or an 67 environment of another size, than the first run's; a control 68 that does not repeat the first run's arguments; and a stopped 69 guest's dump. It names sources with LLVM's addr2line. 70 * `traceOf` and `diffOf` run either as a derivation, over a list of 71 runs; `nix/lib.nix` holds them for any package set, with the 72 version the command reports. 73 * `--object` keeps a taint run's sites (`run`, `read`, and 74 `traceOf`'s `objects`) to objects whose path contains the given 75 text, as it keeps a differential run's origins. 76 * The flake's probe check (`checks.<system>.probe`, on Linux) holds 77 both instruments' reports on a known harness to what it does, and 78 on an x86_64 host the differential one on the same harness built 79 for aarch64.