v1.80.0
[1.80.0] - 2026-09-02
Added
-
A revocation registry now records when it was observed, and a clean answer states how far into the past it reaches. Until this release
RevocationRegistry.status()returnedrevoked=Falsewith nothing attached, which reads as "this key is fine" when what the computation supports is "nothing in the entries I hold revoked it, as of whenever I obtained them".RevocationRegistrytakes an optionalas_of,status()takes the deployment'snowandmax_staleness_seconds, andRevocationStatuscarriesregistry_as_of,freshnessandestablishes_current.freshnessisfresh,staleorunknown.unknowncovers a registry with noas_of, a caller who stated no bound, and anas_oflater thannow. That last one is a clock disagreement, so the bound cannot be evaluated honestly and is not quietly treated as met.establishes_currentis true for exactly one combination, not revoked and fresh, and every other combination is a statement about the past.Staleness weakens the negative answer alone. A revocation the verifier can see binds however old the registry is, because a revocation fact does not expire. An implementation reasoning "the registry is stale, so we know nothing" would discard a revocation it is plainly holding, which is worse than the gap this closes.
The rule is
draft-sirkkavaara-vaara-receipt-08Section 10, posted to the datatracker the same day: offline verification is a computation over the parameters the consumer holds, revocation is a property of the present, and where a decision depends on revocation state the staleness a deployment accepts is an operational parameter that deployment must state. The shape is the one RPKI uses, where a router validates against a locally held cache whose refresh interval is a stated parameter rather than something the validation establishes. -
revocation_freshness_v0is the 49th vector suite. Seven cases, six of them negative, andestablishes_currentis true in exactly one row of its table.revoked_stalepins the asymmetry above and is the case most likely to regress.future_as_ofpins the clock-disagreement rule. The checker imports the standard library plusrfc8785, rebuilds both the revocation-in-time predicate and the freshness rule from the text rather than calling the implementation it grades, and is the form of local, third-party-runnable detection the European Commission's Article 50 transparency guidelines describe at paragraph 76.Compatibility is checkable rather than asserted.
as_ofserialises only when set, so a registry without one produces the bytes it produced before the field existed. Theundated_cleancase digests tosha256:a6a20076da005b27c9afc3a5d5b2457798c0ac817d1abc38b2fee4398ac3f133, byte-identical to thecleancase incross_stack_revocation_v0, so no previously issued digest moved. Callers passing neithernownormax_staleness_secondsget the previousrevokedanswer withfreshness="unknown"attached.