feat: kijk de RFC 3161 nonce-echo na bij importeren (#563) #567

Merged
brenno merged 1 commit from feat/tijdstempel-nonce into main 2026-07-22 15:55:24 +00:00
Owner

Het verzoek droeg al een nonce en de TSA is verplicht hem terug te kaatsen — maar OciDeck bewaarde hem niet, dus bij het importeren viel er niets te vergelijken. Een ouder token voor dezelfde hash, opnieuw ingediend, was niet te onderscheiden van een vers token.

Het formaat

Eén additieve sleutel timestamp_nonce in .seal.json, bewust zonder versiebump. Een oudere build leest per sleutel en negeert hem; verhogen zou die build de hele sidecar laten weigeren, en dan raakt het zegel zoek om een veld dat hij niet nodig heeft. Er staat een test op die dat vastlegt (inclusief het lezen zoals een oudere build het zou doen).

De nonce wordt gewist zodra het token binnen is: hij hoort bij het vérzoek, dus daarna staat er niets meer uit.

De grens die blijft

Staat er geen verzoek uit — een tijdstempel die met een deck is meegekomen, of van vóór deze build — dan is er niets te vergelijken en blijft de imprint het enige oordeel. Streng doen op een nonce die nooit verstuurd is, zou een geldig token weigeren. Dat is een aparte testregel.

CMS- en ketenverificatie blijven ongebouwd, met dezelfde reden als altijd: X.509-padvalidatie tegen een meegeleverde ankerlijst die per definitie veroudert, in een app die geen netwerk op gaat.

Toetsbaar gemaakt

Het oordeel zat in een widget-methode en was daardoor alleen via de bestandskiezer bereikbaar. Het staat nu als judgeTimeStampImport in de dienst, met drie uitkomsten in plaats van een boolean — "dit is niet dit document" is iets anders dan "dit is een ouder antwoord", en de gebruiker krijgt ook twee verschillende meldingen. Vijf tests, en twee ervan zijn rood gezien tegen het oude gedrag.

Onderweg

Drie commentaarblokken zeiden dat dit níét gebeurde (kop van rfc3161_timestamp.dart, buildTimeStampRequest, timeStampEchoesNonce), plus SECURITY_DESIGN §9. Allemaal bijgewerkt — een comment dat het tegendeel beweert van de code is erger dan geen comment.

De klasseratchet viel om op DeckNotifier. Twee helpers die geen enkel veld van die klasse raken staan nu buiten de klasse; netto 1307 → 1305, vastgezet.

Eén nieuwe l10n-string, in alle 31 talen. make check groen.

Closes #563

Het verzoek droeg al een nonce en de TSA is verplicht hem terug te kaatsen — maar OciDeck bewaarde hem niet, dus bij het importeren viel er niets te vergelijken. Een ouder token voor dezelfde hash, opnieuw ingediend, was niet te onderscheiden van een vers token. ## Het formaat Eén additieve sleutel `timestamp_nonce` in `.seal.json`, **bewust zonder versiebump**. Een oudere build leest per sleutel en negeert hem; verhogen zou die build de hele sidecar laten weigeren, en dan raakt het zegel zoek om een veld dat hij niet nodig heeft. Er staat een test op die dat vastlegt (inclusief het lezen zoals een oudere build het zou doen). De nonce wordt gewist zodra het token binnen is: hij hoort bij het vérzoek, dus daarna staat er niets meer uit. ## De grens die blijft Staat er geen verzoek uit — een tijdstempel die met een deck is meegekomen, of van vóór deze build — dan is er niets te vergelijken en blijft de imprint het enige oordeel. Streng doen op een nonce die nooit verstuurd is, zou een geldig token weigeren. Dat is een aparte testregel. CMS- en ketenverificatie blijven ongebouwd, met dezelfde reden als altijd: X.509-padvalidatie tegen een meegeleverde ankerlijst die per definitie veroudert, in een app die geen netwerk op gaat. ## Toetsbaar gemaakt Het oordeel zat in een widget-methode en was daardoor alleen via de bestandskiezer bereikbaar. Het staat nu als `judgeTimeStampImport` in de dienst, met drie uitkomsten in plaats van een boolean — "dit is niet dit document" is iets anders dan "dit is een ouder antwoord", en de gebruiker krijgt ook twee verschillende meldingen. Vijf tests, en twee ervan zijn rood gezien tegen het oude gedrag. ## Onderweg Drie commentaarblokken zeiden dat dit níét gebeurde (kop van `rfc3161_timestamp.dart`, `buildTimeStampRequest`, `timeStampEchoesNonce`), plus SECURITY_DESIGN §9. Allemaal bijgewerkt — een comment dat het tegendeel beweert van de code is erger dan geen comment. De klasseratchet viel om op DeckNotifier. Twee helpers die geen enkel veld van die klasse raken staan nu buiten de klasse; netto 1307 → 1305, vastgezet. Eén nieuwe l10n-string, in alle 31 talen. `make check` groen. Closes #563
feat(zegel): kijk de nonce-echo na bij het importeren van een tijdstempel
Some checks failed
CI / Gate (Linux) · Format · Analyze · Coverage (push) Failing after 4s
CI / Web hardening (push) Failing after 4s
CI / Docs links (push) Failing after 4s
CI / Supply-chain (Trivy · advisory) (push) Failing after 5s
CI / Gate (Linux) · Format · Analyze · Coverage (pull_request) Failing after 4s
CI / Web hardening (pull_request) Failing after 4s
CI / Docs links (pull_request) Failing after 4s
CI / Supply-chain (Trivy · advisory) (pull_request) Failing after 5s
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Test (macos-latest) (pull_request) Has been cancelled
CI / Test (windows-latest) (pull_request) Has been cancelled
d050f50cf0
Het verzoek droeg al een nonce en RFC 3161 §2.4.2 verplicht de TSA hem terug te
kaatsen — maar OciDeck bewaarde hem niet, dus bij het importeren viel er niets
te vergelijken. Een ouder token voor dezelfde hash, opnieuw ingediend, was niet
te onderscheiden van een vers token. De imprint ziet dat verschil niet; dat is
precies waar een nonce voor bestaat.

De belemmering die daarvoor stond opgeschreven — een sleutel erbij zou botsen
met de verhuizing van het zegel naar een sidecar — was vervallen. Die verhuizing
is af, en `<naam>.seal.json` is de plek: ondoorzichtig, en over het document in
plaats van erin.

Additief toegevoegd, BEWUST zonder versiebump. Een oudere build leest per
sleutel en negeert deze; verhogen zou die build de hele sidecar laten weigeren,
en dan raakt het zegel zoek om een veld dat hij niet nodig heeft. Een test legt
dat vast.

Het oordeel staat als `judgeTimeStampImport` in de dienst en niet in de dialoog,
want daar was het alleen via de bestandskiezer bereikbaar. Twee faalvormen, twee
meldingen: "dit is niet dit document" is iets anders dan "dit is een ouder
antwoord". Staat er geen verzoek uit, dan blijft de imprint het enige oordeel —
streng doen op een nonce die nooit verstuurd is, zou een geldig token weigeren.

Drie commentaarblokken die zeiden dat dit níét gebeurde, plus SECURITY_DESIGN
§9, zijn bijgewerkt. Wat wél ongebouwd blijft — CMS en ketenverificatie — staat
er onveranderd, met dezelfde reden.

De klasseratchet viel onderweg om. Twee helpers die geen enkel veld van
DeckNotifier raken staan nu buiten de klasse; netto 1307 -> 1305.

Closes #563
brenno merged commit 4315737fc8 into main 2026-07-22 15:55:24 +00:00
Sign in to join this conversation.
No description provided.