Claim #13 — Verification of rand_pcg::Lcg128CmDxsm64::new (with Aeneas be86ab0f1989d04944292b345b24c435be3ad10a)
Tool: Aeneas be86ab0f1989d04944292b345b24c435be3ad10a
Preconditions
All scalar state/stream inputs and all well-typed modeled states; default or serde feature configuration, x86_64.
Evidence
What is trusted
From the report
The Rust compiler, official Charon/Aeneas translation, official Aeneas scalar models and Lean kernel are trusted. No custom external models, source adaptations or local trusted helper contracts are used. All twenty-one API theorem dependency audits permit only propext, Classical.choice and Quot.sound. Wrapping arithmetic, shifts, casts and rotations use official standard-library models, rather than proofs of Rust std implementation bodies. The original Result::map body is extracted and proved through its actual closure calls, rather than supplied by a custom model. This serde supplement trusts Kani0.68/CBMC and its August Rust compiler with exact rand_core0.10.0/serde1.0.228. Its concrete sequence backend, invalid_length handler and successful serializer define the observed protocol; they do not stand for arbitrary backends. The Lcg128Xsl64 supplement uses the same exact Kani/Rust/core0.10.0/serde1.0.228 trust boundary and concrete sequence/serializer protocol. Its successful run used unwind40 with unwinding assertions enabled. These supplemental checks trust pinned Kani/CBMC/Z3, Rust nightly2026-08-21 and exact rand_core0.10.0; MCG serde additionally pins serde1.0.228. External calls execute the actual conditional rand_core blanket implementations specialized to these concrete generator types, not a model of arbitrary blanket behavior.
Technical limitations
From the report
Coverage is the twenty-five named bodies on x86_64 under default or serde. Internal word states include zero/even values that usual seed constructors may not produce, but all are valid Rust scalar data; no seed-reachability claim is made. Stream getter behavior for arbitrary increments is proved, but no save/restore identity is claimed for an arbitrary even increment. Aeneas byte-seed/from_seed/seed_from_u64 contracts, Lcg64Xsh32::try_next_u64, buffer filling, RNG callbacks/forking, manual Debug, serde and inherited/external blanket APIs remain outside these Aeneas claims. No period, jump-back interpretation for wrapped negative strides, statistical quality or cryptographic security is established. Other targets and dependency feature combinations were not checked. The Debug supplement is limited to the listed constructor-input families, default formatting and the fixed writer behavior; it does not establish arbitrary internal-state provenance, other Formatter flags, partial-prefix failures, arbitrary writers or all constructor histories. It adds no Aeneas API claim. The Lcg64Xsh32 serde check covers only the fixed sequence protocol, lengths0..2, five Deserialize error stages and successful six-stage serialization. Serialize error stages and arbitrary backend/map/format implementations remain unproved; other PCG serde behavior is covered only by the additional concrete protocols explicitly described here. Arbitrary wire increments are accepted by this check; odd increment or generator invariants are not established. This Kani supplement adds no Aeneas machine claims. The Lcg128Xsl64 result is limited to that32-byte sequence protocol and successful six-callback serialization. Serialize errors, arbitrary backends/map formats, odd increment and nonzero invariants are not established. An earlier unwind20 run failed its unwinding assertion; it is retained as an insufficient-bound attempt, not a successful proof or a crate behavior counterexample. Only the unwind bound changed for the successful run. MCG serde is limited to the fixed sequence protocol, length0..1, three Deserialize callback error stages and successful four-callback serialization; Serialize errors and arbitrary backends/map/formats remain unproved. No odd/nonzero/period invariant follows for its arbitrary wire states. The default-only composition and eight external Rng relations cover constructor-image states, excluding even-increment serde states, zero MCG and all arbitrary private-state histories. They establish relational equivalence to actual TryRng behavior, not independent numeric output, distribution, security or general blanket correctness. A separate seed relation attempt failed in CBMC SMT SSA conversion with map::at before a property verdict; it remains unverified and is not a counterexample. All new evidence is supplemental; the machine count stays25.
Tool limitations
Lean backend only, requiring cargo-proofs 0.4.0 or later. The version identifies the official Aeneas Git revision pinned in lake-manifest.json (backends/lean); this revision uses Lean 4.35.0. The recorder checks committed Lean theorem declarations and permits only propext, Classical.choice, and Quot.sound as transitive axioms. It rejects sorryAx and custom axioms, including axiomatized external models. Charon/Aeneas extraction is not rerun. The author must review that the committed functional model matches the recorded Rust source, that the named theorem corresponds to the public API, and that the reported precondition matches the theorem. A checked theorem alone does not establish those links or the adequacy of the specification. The current adapter records the default Cargo configuration, with ordinary Lean module paths and a pinned official Git dependency. Other backends, custom Lake source directories, and local-path Aeneas dependencies are unsupported. See https://proofs.rs/book/aeneas.html and https://github.com/AeneasVerif/aeneas/tree/be86ab0f1989d04944292b345b24c435be3ad10a.
Aeneas be86ab0f1989d04944292b345b24c435be3ad10a — version details