Skip to content

FLT-151 build report

Root cause

RepoRegistryReader verified HMACs by deserializing and reserializing repos through the API's newer RepoInventoryEntry contract. That contract added jiraProjects and components; missing properties became empty lists and were emitted during reserialization. Fleet-dispatch signed its older compact JSON without those properties, so the canonical bytes differed and valid inventory files failed closed. File enumeration already aggregated all inventory JSON files, and GET /api/repos does not require a target parameter.

The fix verifies pc|generatedAt|<exact raw repos JSON> from the scanner file. This byte-matches the signer while continuing to cover every byte and every present repo field with HMAC-SHA256. Missing/bad keys, timing-safe comparison, whole-file rejection, and filename/PC spoof rejection remain intact.

Gates

An intermediate post-review test run failed 1 of 550 because its new formatting-tamper fixture changed whitespace outside the signed repos value. The fixture was corrected to mutate whitespace inside the signed array; the final gate results follow.

dotnet build -warnaserror

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:03.15

dotnet test --no-build

Passed!  - Failed:     0, Passed:   551, Skipped:     0, Total:   551, Duration: 3 s - FleetMissionControl.Api.Tests.dll (net10.0)

Manual fixed-build verification (isolated port 5181 because the existing service owns 5170):

GET http://127.0.0.1:5181/api/repos
RepoOptions: 38
PcRows: 85
RegistryPopulated: true