structured-ltv
Format-neutral long-term validation facts for AdES signatures, with explicit
memory and work accounting. The crate supports no_std + alloc and performs no
implicit I/O.
EN 319 102-1 defines path validation at a time, revocation material bound to
path members, timestamp generation intervals and archive coverage of validation
material once for every AdES format. This crate implements those facts over
the structured-pkix and structured-cms processors. A format layer
(structured-xades today) states only where material and timestamps were
written; no XML or PDF type crosses this boundary, and no fact is a trust
verdict.
Source identity
source::Source is implemented by a document owner over its own stable node
identities: XML elements, CMS attributes or PDF objects. source::Query is one
current operation over an expected snapshot of that source; source::Scope
implements it for any Source, and a format's own access guard can implement
it so that its checks and these share one admission path. A generation change
is a processing failure, never a malformed-property finding. Every check runs
under the query that performs it; retained facts are never prepaid work.
Facts
timestampretains a completed CMS token check asVerified, with the original token, signature, property andPurpose(content, signature, validation data or archive). It derives complete generation intervals from the authority's stated accuracy, associates a signature timestamp with the signer's checked path (signature_time) and holds the complete token obligations of one scope (TimestampRequirements,TimestampPaths).pkiruns the common PKIX path processor for actor paths, binds CRL and OCSP results to actual path members, closes the validation-authority graph and derives the complete participant census (participants) from the format's receipts:SignerReceipt,CounterReceiptsandCredentialReceipts. Later facts require those very receipts, not equal identities.materialindexes every incorporated certificate, CRL and OCSP value with the format's placement of each occurrence, attributes artifact uses to actors, reports incorporation, and checks each archive input'sCoverageagainst its checked token.baselinejoins a format's stage reports throughBasicStage,X509Material,CredentialMaterialandArchiveCensus:timestamped,long_term,archive_materialandarchives. The format layer keeps its own level assessment.
Reports keep detailed negative findings. Material presence does not establish usable revocation status, historical trust, timestamp chronology or algorithm longevity. Source, generation, resource and callback failures remain processing errors, separate from missing or mismatching evidence.
Implementing a format
A format layer implements Source (or Query over its access guard) and the
receipt traits on its own checked results, builds TimestampRequirements from
every original timestamp in source order, failed and unsupported ones included,
and builds a material::Index and one Coverage per archive input.
These receipts carry the format's issuer type, and constructing one takes a
value of it. A format defines that type with a private field, so its callers
cannot relabel checked timestamp evidence, associate it with another signer or
supply a fabricated census, index or coverage. The participant census is derived
by pki::participants, which takes the issuer value too, so it comes only from
the format's own signer, counter and credential receipts. Receipts of different
issuers do not combine. The
integration test tests/cms_source.rs drives the participant census and
archive coverage over CMS SignerInfo attributes identified by ordinal.
Cryptographic test adapters are development-only oracles, not qualified production providers.