diff --git a/TRUSTED-BASE.md b/TRUSTED-BASE.md index 2f51edd..56c0294 100644 --- a/TRUSTED-BASE.md +++ b/TRUSTED-BASE.md @@ -69,7 +69,19 @@ proceeds and is part of every claim. (`PROVENANCE.json → harness_integrity_sha256`); it is kept rather than removed because it is the memory cap and machine-wide lock that protect the build machine (a Lean elaboration once reached 12.2 GB and took the host - down). Still trusted, and NOT bound by anything the button can check: + down). + **`verification/Proofs/Audit.lean` is pinned the same way, and for a sharper + reason** (round-6 NEW-7): the digest it emits binds the audit's *data* — the + policy constants, the statements, the specification bodies — but nothing can + make a program hash the correctness of its own logic. Flipping this file's + two fail-closed guards to `unless true` disabled every in-Lean check while + the digest stayed BYTE-IDENTICAL, and a repository proving `False` passed + ALL GREEN. The byte pin converts that from a silent green into a build + failure; a legitimate change to the audit is now a reviewable pin rotation. + Note the residue honestly: an author who edits the logic *and* rotates its + pin in the same commit is not stopped by anything mechanical — that case is + caught only by reading the diff at the pin. + Still trusted, and NOT bound by anything the button can check: `check.sh` itself, `~/aeneas-toolchain/env.sh`, the `$AENEAS_HOME` tree (i.e. *which* Aeneas/Lean library the proofs are checked against), `python3`, and the Lean toolchain. An audit executed by a harness cannot defend against diff --git a/verification/AUDIT-MANIFEST.txt b/verification/AUDIT-MANIFEST.txt new file mode 100644 index 0000000..69c613f --- /dev/null +++ b/verification/AUDIT-MANIFEST.txt @@ -0,0 +1,53 @@ +policy|allowedBoundary=Classical.choice,Quot.sound,propext,verify_mono.oracle.f,verify_mono.oracle.h,verify_mono.oracle.h_msg,verify_mono.oracle.t_l,verify_mono.oracle.t_len|certModules=Proofs.ApexSpec,Proofs.ChainSpec,Proofs.ForsInnerSpec,Proofs.ForsOuterSpec,Proofs.HtSpec,Proofs.InputPrepSpec,Proofs.WotsSpec,Proofs.XmssSpec +cert|fips205.chain_free_loop_eq|cone=Classical.choice,Quot.sound,propext,verify_mono.oracle.f|type=∀ {N : Aeneas.Std.Usize} (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (s : Nat) (start : Aeneas.Std.U32) (adrs : fips205.types.Adrs) (tmp : Aeneas.Std.Array.{0} Aeneas.Std.U8 N), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32)))) → ∀ (stop : Aeneas.Std.U32), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) → @Eq.{1} (Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@fips205.verify_mono.chain_free_loop N (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.U32 start stop) pk_seed adrs tmp) (@fips205.chainFoldN N pk_seed adrs tmp start s) +cert|fips205.wots_loop1_eq|cone=Classical.choice,Quot.sound,propext,verify_mono.oracle.f|type=∀ {LEN N : Aeneas.Std.Usize} (sig : fips205.types.WotsSig LEN N) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (msg : Aeneas.Std.Array.{0} Aeneas.Std.U32 LEN) (s : Nat) (start : Aeneas.Std.Usize) (adrs : fips205.types.Adrs) (tmp : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) System.Platform.numBits) → ∀ (stop : Aeneas.Std.Usize), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize start) s) → @Eq.{1} (Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN))) (@fips205.verify_mono.wots_pk_from_sig_free_loop1 LEN N (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.Usize start stop) sig pk_seed adrs tmp msg) (@fips205.wotsChainFold LEN N sig pk_seed msg adrs tmp start s) +cert|fips205.xmss_loop_eq|cone=Classical.choice,Quot.sound,propext,verify_mono.oracle.h|type=∀ {HP N : Aeneas.Std.Usize} (idx : Aeneas.Std.U32) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (auth : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) HP) (s : Nat) (start : Aeneas.Std.U32) (adrs : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32)))) → ∀ (stop : Aeneas.Std.U32), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) → @Eq.{1} (Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@fips205.verify_mono.xmss_pk_from_sig_free_loop HP N (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.U32 start stop) idx pk_seed adrs auth node) (@fips205.xmssFoldN HP N idx pk_seed auth adrs node start s) +cert|fips205.ht_loop_eq|cone=Classical.choice,Quot.sound,propext,verify_mono.oracle.f,verify_mono.oracle.h,verify_mono.oracle.t_l|type=∀ {D HP LEN N : Aeneas.Std.Usize} (a : Aeneas.Std.Array.{0} (fips205.types.XmssSig HP LEN N) D) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (hp32 : Aeneas.Std.U32) (s : Nat) (start : Aeneas.Std.U32) (idx_tree : Aeneas.Std.U64) (adrs : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32)))) → ∀ (stop : Aeneas.Std.U32), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) → @Eq.{1} (Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@fips205.verify_mono.ht_verify_free_loop D HP LEN N (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.U32 start stop) a pk_seed idx_tree hp32 adrs node) (@fips205.htFoldN D HP LEN N a pk_seed hp32 idx_tree adrs node start s) +cert|fips205.fors_inner_loop_eq|cone=Classical.choice,Quot.sound,propext,verify_mono.oracle.h|type=∀ {A K N : Aeneas.Std.Usize} (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (indices : Aeneas.Std.Array.{0} Aeneas.Std.U32 K) (i : Aeneas.Std.U32) (auth : fips205.types.Auth A N) (s : Nat) (start : Aeneas.Std.U32) (adrs : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32)))) → ∀ (stop : Aeneas.Std.U32), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) → @Eq.{1} (Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) (@fips205.verify_mono.fors_pk_from_sig_free_loop0_loop0 A K N (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.U32 start stop) pk_seed adrs indices i node auth) (@fips205.forsInnerFold A K N pk_seed indices i auth adrs node start s) +cert|fips205.fors_outer_loop_eq|cone=Classical.choice,Quot.sound,propext,verify_mono.oracle.f,verify_mono.oracle.h|type=∀ {A K N : Aeneas.Std.Usize} (sig_fors : fips205.types.ForsSig A K N) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (a32 : Aeneas.Std.U32) (indices : Aeneas.Std.Array.{0} Aeneas.Std.U32 K) (s : Nat) (start : Aeneas.Std.U32) (adrs : fips205.types.Adrs) (root : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32)))) → ∀ (stop : Aeneas.Std.U32), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) s) → @Eq.{1} (Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K))) (@fips205.verify_mono.fors_pk_from_sig_free_loop0 A K N (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.U32 start stop) sig_fors pk_seed a32 adrs indices root) (@fips205.forsOuterFold A K N sig_fors pk_seed a32 indices adrs root start s) +cert|fips205.to_int_loop_eq|cone=Classical.choice,Quot.sound,propext|type=∀ (x : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (s : Nat) (start : Aeneas.Std.Usize) (total : Aeneas.Std.U64), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) System.Platform.numBits) → ∀ (stop : Aeneas.Std.Usize), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize start) s) → @Eq.{1} (Aeneas.Std.Result.{0} Aeneas.Std.U64) (fips205.helpers.to_int_loop (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.Usize start stop) x total) (fips205.toIntFold x total start s) +cert|fips205.to_byte_loop_eq|cone=Classical.choice,Quot.sound,propext|type=∀ (n : Aeneas.Std.U32) (k : Nat) (start : Aeneas.Std.U32) (s : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (total : Aeneas.Std.U32), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) k) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32)))) → ∀ (stop : Aeneas.Std.U32), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.U32 start) k) → @Eq.{1} (Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) (fips205.helpers.to_byte_loop (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.U32 start stop) n s total) (fips205.toByteFold n s total start k) +cert|fips205.wots_csum_loop_eq|cone=Classical.choice,Quot.sound,propext|type=∀ {LEN : Aeneas.Std.Usize} (msg : Aeneas.Std.Array.{0} Aeneas.Std.U32 LEN) (s : Nat) (start : Aeneas.Std.Usize) (csum : Aeneas.Std.U32), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) System.Platform.numBits) → ∀ (stop : Aeneas.Std.Usize), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize start) s) → @Eq.{1} (Aeneas.Std.Result.{0} Aeneas.Std.U32) (@fips205.verify_mono.wots_pk_from_sig_free_loop0 LEN (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.Usize start stop) csum msg) (@fips205.wotsCsumFold LEN msg csum start s) +cert|fips205.base2b_outer_loop_eq|cone=Classical.choice,Quot.sound,propext|type=∀ (x : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (b : Aeneas.Std.U32) (s : Nat) (start : Aeneas.Std.Usize) (baseb : Aeneas.Std.Slice.{0} Aeneas.Std.U32) (inn : Aeneas.Std.Usize) (bits total : Aeneas.Std.U32), @LT.lt.{0} Nat instLTNat (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize start) s) (@HPow.hPow.{0, 0, 0} Nat Nat Nat (@instHPow.{0, 0} Nat Nat (@Monoid.toPow.{0} Nat Nat.instMonoid)) (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) System.Platform.numBits) → ∀ (stop : Aeneas.Std.Usize), @Eq.{1} Nat (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize stop) (@HAdd.hAdd.{0, 0, 0} Nat Nat Nat (@instHAdd.{0} Nat instAddNat) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize start) s) → @Eq.{1} (Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) (fips205.helpers.base_2b_loop0 (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.Usize start stop) x b baseb inn bits total) (fips205.base2bOuterFold x b baseb inn bits total start s) +cert|fips205.slh_verify_128s_accepts_iff|cone=Classical.choice,Quot.sound,propext,verify_mono.oracle.f,verify_mono.oracle.h,verify_mono.oracle.h_msg,verify_mono.oracle.t_l,verify_mono.oracle.t_len|type=∀ (mprime : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (sig : fips205.types.SlhDsaSig (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (pk : fips205.types.SlhPublicKey (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))), @Eq.{1} (Aeneas.Std.Result.{0} Bool) (fips205.verify_mono.slh_verify_128s mprime sig pk) (@Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) Bool (@fips205.slhVerifyRoot (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 12) (instOfNatNat (nat_lit 12))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 9) (instOfNatNat (nat_lit 9))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 14) (instOfNatNat (nat_lit 14))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 35) (instOfNatNat (nat_lit 35))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 63) (instOfNatNat (nat_lit 63))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 63) (instOfNatNat (nat_lit 63))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 63) (instOfNatNat (nat_lit 63))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 63) (instOfNatNat (nat_lit 63))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 63) (instOfNatNat (nat_lit 63))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 30) (instOfNatNat (nat_lit 30))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 30) (instOfNatNat (nat_lit 30))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 30) (instOfNatNat (nat_lit 30))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 30) (instOfNatNat (nat_lit 30))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 30) (instOfNatNat (nat_lit 30))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) mprime sig pk) fun (root : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) => @Aeneas.Std.Result.ok.{0} Bool (@Decidable.decide (@Eq.{1} (List.{0} Aeneas.Std.U8) (@Subtype.val.{1} (List.{0} Aeneas.Std.U8) (fun (l : List.{0} Aeneas.Std.U8) => @Eq.{1} Nat (@List.length.{0} Aeneas.Std.U8 l) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) root) (@Subtype.val.{1} (List.{0} Aeneas.Std.U8) (fun (l : List.{0} Aeneas.Std.U8) => @Eq.{1} Nat (@List.length.{0} Aeneas.Std.U8 l) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) (@fips205.types.SlhPublicKey.pk_root (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) pk))) (@instDecidableEqList.{0} Aeneas.Std.U8 (Aeneas.Std.instDecidableEqUScalar_1 Aeneas.Std.UScalarTy.U8) (@Subtype.val.{1} (List.{0} Aeneas.Std.U8) (fun (l : List.{0} Aeneas.Std.U8) => @Eq.{1} Nat (@List.length.{0} Aeneas.Std.U8 l) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) root) (@Subtype.val.{1} (List.{0} Aeneas.Std.U8) (fun (l : List.{0} Aeneas.Std.U8) => @Eq.{1} Nat (@List.length.{0} Aeneas.Std.U8 l) (@Aeneas.Std.UScalar.val Aeneas.Std.UScalarTy.Usize (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) (@fips205.types.SlhPublicKey.pk_root (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 16) (instOfNatNat (nat_lit 16))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) pk))))) +spec|fips205.base2bOuterFold|def|value=fun (x : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (b : Aeneas.Std.U32) (x_1 : Aeneas.Std.Slice.{0} Aeneas.Std.U32) (x_2 : Aeneas.Std.Usize) (x_3 x_4 : Aeneas.Std.U32) (x_5 : Aeneas.Std.Usize) (x_6 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => Aeneas.Std.Slice.{0} Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) x_6 (fips205.base2bOuterFold._f x b) x_1 x_2 x_3 x_4 x_5 +spec|fips205.base2bOuterFold._f|def|value=fun (x : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (b : Aeneas.Std.U32) (x_1 : Nat) (f : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.Slice.{0} Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) x_1) (x_2 : Aeneas.Std.Slice.{0} Aeneas.Std.U32) (x_3 : Aeneas.Std.Usize) (x_4 x_5 : Aeneas.Std.U32) (x_6 : Aeneas.Std.Usize) => fips205.base2bOuterFold.match_1.{1} (fun (x : Aeneas.Std.Slice.{0} Aeneas.Std.U32) (x_7 : Aeneas.Std.Usize) (x_8 x_9 : Aeneas.Std.U32) (x_10 : Aeneas.Std.Usize) (x_11 : Nat) => @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.Slice.{0} Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) x_11 → Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) x_2 x_3 x_4 x_5 x_6 x_1 (fun (baseb : Aeneas.Std.Slice.{0} Aeneas.Std.U32) (x : Aeneas.Std.Usize) (x_7 x_8 : Aeneas.Std.U32) (x_9 : Aeneas.Std.Usize) (x_10 : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.Slice.{0} Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32) baseb) (fun (baseb : Aeneas.Std.Slice.{0} Aeneas.Std.U32) (inn : Aeneas.Std.Usize) (bits total : Aeneas.Std.U32) (out : Aeneas.Std.Usize) (k : Nat) (x_7 : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.Slice.{0} Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) (Nat.succ k)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Prod.{0, 0} Aeneas.Std.Usize (Prod.{0, 0} Aeneas.Std.U32 Aeneas.Std.U32)) (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (fips205.helpers.base_2b_loop0_loop0 x b inn bits total) (@Aeneas.Std.uncurry.{0, 0, 1} Aeneas.Std.Usize (Prod.{0, 0} Aeneas.Std.U32 Aeneas.Std.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) fun (inn1 : Aeneas.Std.Usize) => @Aeneas.Std.uncurry.{0, 0, 1} Aeneas.Std.U32 Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32)) fun (bits1 total1 : Aeneas.Std.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (@HSub.hSub.{0, 0, 0} Aeneas.Std.U32 Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) bits1 b) fun (bits2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (@HShiftRight.hShiftRight.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHShiftRightUScalarResult Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.U32) total1 bits2) fun (i : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 32) (instOfNatNat (nat_lit 32))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) b) fun (i1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (@HShiftRight.hShiftRight.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHShiftRightUScalarResult Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.U32) Aeneas.Std.core.num.U32.MAX i1) fun (i2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@HAnd.hAnd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.instHAndUScalar Aeneas.Std.UScalarTy.U32) i i2)) fun (i3 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (@Aeneas.Std.Slice.update.{0} Aeneas.Std.U32 baseb out i3) fun (bb1 : Aeneas.Std.Slice.{0} Aeneas.Std.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Slice.{0} Aeneas.Std.U32) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.Usize (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) out (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (out' : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => x_7.1 bb1 inn1 bits2 total1 out')) f +spec|fips205.base2bOuterFold.match_1|def|value=fun (motive : Aeneas.Std.Slice.{0} Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Usize → Nat → Sort u_1) (x : Aeneas.Std.Slice.{0} Aeneas.Std.U32) (x_1 : Aeneas.Std.Usize) (x_2 x_3 : Aeneas.Std.U32) (x_4 : Aeneas.Std.Usize) (x_5 : Nat) (h_1 : (baseb : Aeneas.Std.Slice.{0} Aeneas.Std.U32) → (x : Aeneas.Std.Usize) → (x_6 x_7 : Aeneas.Std.U32) → (x_8 : Aeneas.Std.Usize) → motive baseb x x_6 x_7 x_8 (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (baseb : Aeneas.Std.Slice.{0} Aeneas.Std.U32) → (inn : Aeneas.Std.Usize) → (bits total : Aeneas.Std.U32) → (out : Aeneas.Std.Usize) → (k : Nat) → motive baseb inn bits total out (Nat.succ k)) => @Nat.casesOn.{u_1} (fun (x_6 : Nat) => motive x x_1 x_2 x_3 x_4 x_6) x_5 (h_1 x x_1 x_2 x_3 x_4) fun (n : Nat) => h_2 x x_1 x_2 x_3 x_4 n +spec|fips205.chainFoldN|def|value=fun {N : Aeneas.Std.Usize} (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_2 : Aeneas.Std.U32) (x_3 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_3 (@fips205.chainFoldN._f N pk_seed) x x_1 x_2 +spec|fips205.chainFoldN._f|def|value=fun {N : Aeneas.Std.Usize} (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (x : Nat) (f : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x) (x_1 : fips205.types.Adrs) (x_2 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_3 : Aeneas.Std.U32) => @fips205.chainFoldN.match_1.{1} N (fun (x : fips205.types.Adrs) (x_4 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_5 : Aeneas.Std.U32) (x_6 : Nat) => @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_6 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_1 x_2 x_3 x (fun (x : fips205.types.Adrs) (tmp : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_4 : Aeneas.Std.U32) (x_5 : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) tmp) (fun (adrs : fips205.types.Adrs) (tmp : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (start : Aeneas.Std.U32) (k : Nat) (x : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (Nat.succ k)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_hash_address adrs start) fun (adrs1 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N tmp)) fun (s : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (verify_mono.oracle.f N pk_seed adrs1 s) fun (tmp1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) start (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (start1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => x.1 adrs1 tmp1 start1) f +spec|fips205.chainFoldN.match_1|def|value=fun {N : Aeneas.Std.Usize} (motive : fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Nat → Sort u_1) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_2 : Aeneas.Std.U32) (x_3 : Nat) (h_1 : (x : fips205.types.Adrs) → (tmp : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) → (x_4 : Aeneas.Std.U32) → motive x tmp x_4 (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (adrs : fips205.types.Adrs) → (tmp : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) → (start : Aeneas.Std.U32) → (k : Nat) → motive adrs tmp start (Nat.succ k)) => @Nat.casesOn.{u_1} (fun (x_4 : Nat) => motive x x_1 x_2 x_4) x_3 (h_1 x x_1 x_2) fun (n : Nat) => h_2 x x_1 x_2 n +spec|fips205.forsInnerFold|def|value=fun {A K N : Aeneas.Std.Usize} (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (indices : Aeneas.Std.Array.{0} Aeneas.Std.U32 K) (i : Aeneas.Std.U32) (auth : fips205.types.Auth A N) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_2 : Aeneas.Std.U32) (x_3 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) x_3 (@fips205.forsInnerFold._f A K N pk_seed indices i auth) x x_1 x_2 +spec|fips205.forsInnerFold._f|def|value=fun {A K N : Aeneas.Std.Usize} (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (indices : Aeneas.Std.Array.{0} Aeneas.Std.U32 K) (i : Aeneas.Std.U32) (auth : fips205.types.Auth A N) (x : Nat) (f : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) x) (x_1 : fips205.types.Adrs) (x_2 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_3 : Aeneas.Std.U32) => @fips205.forsInnerFold.match_1.{1} N (fun (x : fips205.types.Adrs) (x_4 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_5 : Aeneas.Std.U32) (x_6 : Nat) => @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) x_6 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) x_1 x_2 x_3 x (fun (adrs : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x : Aeneas.Std.U32) (x_4 : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Prod.mk.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) adrs node)) (fun (adrs : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (lvl : Aeneas.Std.U32) (s : Nat) (x : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) (Nat.succ s)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) lvl (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (w : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (fips205.helpers.Adrs.set_tree_height adrs w) fun (adrs1 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize i)) fun (i2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U32 (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.Array.index_usize.{0} Aeneas.Std.U32 K indices i2) fun (i3 : Aeneas.Std.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@HShiftRight.hShiftRight.{0, 0, 0} Aeneas.Std.U32 Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHShiftRightUScalarResult Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.U32) i3 lvl) fun (i4 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@HAnd.hAnd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.instHAndUScalar Aeneas.Std.UScalarTy.U32) i4 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) fun (i5 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @ite.{1} (Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) (@Eq.{1} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) i5 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (Aeneas.Std.instDecidableEqUScalar_1 Aeneas.Std.UScalarTy.U32 i5 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Prod.{0, 0} Aeneas.Std.U32 fips205.types.Adrs) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (fips205.helpers.Adrs.get_tree_index adrs1) (@Aeneas.Std.uncurry.{0, 0, 1} Aeneas.Std.U32 fips205.types.Adrs (Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) fun (i6 : Aeneas.Std.U32) (adrs2 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@HDiv.hDiv.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.U32) i6 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (tmp : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (fips205.helpers.Adrs.set_tree_index adrs2 tmp) fun (adrs3 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N node)) fun (s0 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize lvl)) fun (i7 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.Array.index_usize.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) A (@fips205.types.Auth.tree A N auth) i7) fun (a : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N a)) fun (s1 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (verify_mono.oracle.h N pk_seed adrs3 s0 s1) fun (node1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => x.1 adrs3 node1 w)) (@Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Prod.{0, 0} Aeneas.Std.U32 fips205.types.Adrs) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (fips205.helpers.Adrs.get_tree_index adrs1) (@Aeneas.Std.uncurry.{0, 0, 1} Aeneas.Std.U32 fips205.types.Adrs (Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N))) fun (i6 : Aeneas.Std.U32) (adrs2 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@HSub.hSub.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) i6 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i7 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@HDiv.hDiv.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.U32) i7 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (tmp : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (fips205.helpers.Adrs.set_tree_index adrs2 tmp) fun (adrs3 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize lvl)) fun (i8 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.Array.index_usize.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) A (@fips205.types.Auth.tree A N auth) i8) fun (a : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N a)) fun (s0 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N node)) fun (s1 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (verify_mono.oracle.h N pk_seed adrs3 s0 s1) fun (node1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => x.1 adrs3 node1 w))) f +spec|fips205.forsInnerFold.match_1|def|value=fun {N : Aeneas.Std.Usize} (motive : fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Nat → Sort u_1) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_2 : Aeneas.Std.U32) (x_3 : Nat) (h_1 : (adrs : fips205.types.Adrs) → (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) → (x : Aeneas.Std.U32) → motive adrs node x (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (adrs : fips205.types.Adrs) → (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) → (lvl : Aeneas.Std.U32) → (s : Nat) → motive adrs node lvl (Nat.succ s)) => @Nat.casesOn.{u_1} (fun (x_4 : Nat) => motive x x_1 x_2 x_4) x_3 (h_1 x x_1 x_2) fun (n : Nat) => h_2 x x_1 x_2 n +spec|fips205.forsOuterFold|def|value=fun {A K N : Aeneas.Std.Usize} (sig_fors : fips205.types.ForsSig A K N) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (a32 : Aeneas.Std.U32) (indices : Aeneas.Std.Array.{0} Aeneas.Std.U32 K) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) (x_2 : Aeneas.Std.U32) (x_3 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K))) x_3 (@fips205.forsOuterFold._f A K N sig_fors pk_seed a32 indices) x x_1 x_2 +spec|fips205.forsOuterFold._f|def|value=fun {A K N : Aeneas.Std.Usize} (sig_fors : fips205.types.ForsSig A K N) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (a32 : Aeneas.Std.U32) (indices : Aeneas.Std.Array.{0} Aeneas.Std.U32 K) (x : Nat) (f : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K))) x) (x_1 : fips205.types.Adrs) (x_2 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) (x_3 : Aeneas.Std.U32) => @fips205.forsOuterFold.match_1.{1} K N (fun (x : fips205.types.Adrs) (x_4 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) (x_5 : Aeneas.Std.U32) (x_6 : Nat) => @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K))) x_6 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K))) x_1 x_2 x_3 x (fun (adrs : fips205.types.Adrs) (root : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) (x : Aeneas.Std.U32) (x_4 : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K))) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Prod.mk.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) adrs root)) (fun (adrs : fips205.types.Adrs) (root : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) (i : Aeneas.Std.U32) (s : Nat) (x : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K))) (Nat.succ s)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize i)) fun (i1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.Array.index_usize.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K (@fips205.types.ForsSig.private_key_value A K N sig_fors) i1) fun (sk : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (fips205.helpers.Adrs.set_tree_height adrs (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (adrs1 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@HShiftLeft.hShiftLeft.{0, 0, 0} Aeneas.Std.U32 Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHShiftLeftUScalarResult Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.U32) i a32) fun (i2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize i)) fun (i3 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U32 (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.Array.index_usize.{0} Aeneas.Std.U32 K indices i3) fun (i4 : Aeneas.Std.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@HAdd.hAdd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) i2 i4) fun (i5 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (fips205.helpers.Adrs.set_tree_index adrs1 i5) fun (adrs2 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N sk)) fun (s0 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (verify_mono.oracle.f N pk_seed adrs2 s0) fun (node_0 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize i)) fun (i6 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (fips205.types.Auth A N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.Array.index_usize.{0} (fips205.types.Auth A N) K (@fips205.types.ForsSig.auth A K N sig_fors) i6) fun (a : fips205.types.Auth A N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (fips205.types.Auth A N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@fips205.types.Auth.Insts.CoreCloneClone.clone A N a) fun (auth : fips205.types.Auth A N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@fips205.verify_mono.fors_pk_from_sig_free_loop0_loop0 A K N (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.U32 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) a32) pk_seed adrs2 indices i node_0 auth) (@Aeneas.Std.uncurry.{0, 0, 1} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K))) fun (adrs3 : fips205.types.Adrs) (node_01 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize i)) fun (i7 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@Aeneas.Std.Array.update.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K root i7 node_01) fun (a1 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K)) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) i (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (w : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => x.1 adrs3 a1 w)) f +spec|fips205.forsOuterFold.match_1|def|value=fun {K N : Aeneas.Std.Usize} (motive : fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K → Aeneas.Std.U32 → Nat → Sort u_1) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) (x_2 : Aeneas.Std.U32) (x_3 : Nat) (h_1 : (adrs : fips205.types.Adrs) → (root : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) → (x : Aeneas.Std.U32) → motive adrs root x (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (adrs : fips205.types.Adrs) → (root : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) K) → (i : Aeneas.Std.U32) → (s : Nat) → motive adrs root i (Nat.succ s)) => @Nat.casesOn.{u_1} (fun (x_4 : Nat) => motive x x_1 x_2 x_4) x_3 (h_1 x x_1 x_2) fun (n : Nat) => h_2 x x_1 x_2 n +spec|fips205.htFoldN|def|value=fun {D HP LEN N : Aeneas.Std.Usize} (a : Aeneas.Std.Array.{0} (fips205.types.XmssSig HP LEN N) D) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (hp32 : Aeneas.Std.U32) (x : Aeneas.Std.U64) (x_1 : fips205.types.Adrs) (x_2 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_3 : Aeneas.Std.U32) (x_4 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => Aeneas.Std.U64 → fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_4 (@fips205.htFoldN._f D HP LEN N a pk_seed hp32) x x_1 x_2 x_3 +spec|fips205.htFoldN._f|def|value=fun {D HP LEN N : Aeneas.Std.Usize} (a : Aeneas.Std.Array.{0} (fips205.types.XmssSig HP LEN N) D) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (hp32 : Aeneas.Std.U32) (x : Nat) (f : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U64 → fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x) (x_1 : Aeneas.Std.U64) (x_2 : fips205.types.Adrs) (x_3 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_4 : Aeneas.Std.U32) => @fips205.htFoldN.match_1.{1} N (fun (x : Aeneas.Std.U64) (x_5 : fips205.types.Adrs) (x_6 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_7 : Aeneas.Std.U32) (x_8 : Nat) => @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U64 → fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_8 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_1 x_2 x_3 x_4 x (fun (x : Aeneas.Std.U64) (x_5 : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_6 : Aeneas.Std.U32) (x_7 : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U64 → fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) node) (fun (idx_tree : Aeneas.Std.U64) (adrs : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (j : Aeneas.Std.U32) (s : Nat) (x : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U64 → fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (Nat.succ s)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HShiftLeft.hShiftLeft.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64)) (@Aeneas.Std.instHShiftLeftUScalarResult Aeneas.Std.UScalarTy.U64 Aeneas.Std.UScalarTy.U32) (Aeneas.Std.U64.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U64)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U64)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U64)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U64))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) hp32) fun (i : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U64) i (Aeneas.Std.U64.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U64)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U64)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U64)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U64))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (@HAnd.hAnd.{0, 0, 0} Aeneas.Std.U64 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (@Aeneas.Std.instHAndUScalar Aeneas.Std.UScalarTy.U64) idx_tree i1)) fun (i2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U64 Aeneas.Std.UScalarTy.U32 i2)) fun (idx_leaf : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HShiftRight.hShiftRight.{0, 0, 0} Aeneas.Std.U64 Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64)) (@Aeneas.Std.instHShiftRightUScalarResult Aeneas.Std.UScalarTy.U64 Aeneas.Std.UScalarTy.U32) idx_tree hp32) fun (idx_tree1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_layer_address adrs j) fun (adrs1 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_tree_address adrs1 idx_tree1) fun (adrs2 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize j)) fun (i3 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (fips205.types.XmssSig HP LEN N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.Array.index_usize.{0} (fips205.types.XmssSig HP LEN N) D a i3) fun (xs : fips205.types.XmssSig HP LEN N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (fips205.types.XmssSig HP LEN N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@fips205.types.XmssSig.Insts.CoreCloneClone.clone HP LEN N xs) fun (sig_tmp : fips205.types.XmssSig HP LEN N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N node)) fun (s0 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@fips205.verify_mono.xmss_pk_from_sig_free HP LEN N idx_leaf sig_tmp s0 pk_seed adrs2) fun (node1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) j (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (w : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => x.1 idx_tree1 adrs2 node1 w) f +spec|fips205.htFoldN.match_1|def|value=fun {N : Aeneas.Std.Usize} (motive : Aeneas.Std.U64 → fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Nat → Sort u_1) (x : Aeneas.Std.U64) (x_1 : fips205.types.Adrs) (x_2 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_3 : Aeneas.Std.U32) (x_4 : Nat) (h_1 : (x : Aeneas.Std.U64) → (x_5 : fips205.types.Adrs) → (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) → (x_6 : Aeneas.Std.U32) → motive x x_5 node x_6 (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (idx_tree : Aeneas.Std.U64) → (adrs : fips205.types.Adrs) → (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) → (j : Aeneas.Std.U32) → (s : Nat) → motive idx_tree adrs node j (Nat.succ s)) => @Nat.casesOn.{u_1} (fun (x_5 : Nat) => motive x x_1 x_2 x_3 x_5) x_4 (h_1 x x_1 x_2 x_3) fun (n : Nat) => h_2 x x_1 x_2 x_3 n +spec|fips205.htVerifyRoot|def|value=fun {D HP LEN N : Aeneas.Std.Usize} (m : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (sig_ht : fips205.types.HtSig D HP LEN N) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (idx_tree : Aeneas.Std.U64) (idx_leaf : Aeneas.Std.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.Usize Aeneas.Std.UScalarTy.U32 D)) fun (d32 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.Usize Aeneas.Std.UScalarTy.U32 HP)) fun (hp32 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) fips205.types.Adrs.Insts.CoreDefaultDefault.default fun (adrs : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_tree_address adrs idx_tree) fun (adrs1 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (fips205.types.XmssSig HP LEN N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.Array.index_usize.{0} (fips205.types.XmssSig HP LEN N) D (@fips205.types.HtSig.xmss_sigs D HP LEN N sig_ht) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) fips205.htVerifyRoot._proof_1)) fun (xs : fips205.types.XmssSig HP LEN N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (fips205.types.XmssSig HP LEN N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@fips205.types.XmssSig.Insts.CoreCloneClone.clone HP LEN N xs) fun (sig_tmp : fips205.types.XmssSig HP LEN N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@fips205.verify_mono.xmss_pk_from_sig_free HP LEN N idx_leaf sig_tmp m pk_seed adrs1) fun (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @fips205.verify_mono.ht_verify_free_loop D HP LEN N (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.U32 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) fips205.htVerifyRoot._proof_2) d32) (@fips205.types.HtSig.xmss_sigs D HP LEN N sig_ht) pk_seed idx_tree hp32 adrs1 node +spec|fips205.htVerifyRoot._proof_1|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize) +spec|fips205.htVerifyRoot._proof_2|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32) +spec|fips205.slhVerifyRoot|def|value=fun {A D HP K LEN N : Aeneas.Std.Usize} (H M : Aeneas.Std.Usize) (mprime : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (sig : fips205.types.SlhDsaSig A D HP K LEN N) (pk : fips205.types.SlhPublicKey N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.Usize Aeneas.Std.UScalarTy.U32 D)) fun (d32 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.Usize Aeneas.Std.UScalarTy.U32 H)) fun (h32 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) fips205.types.Adrs.Insts.CoreDefaultDefault.default fun (adrs : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N (@fips205.types.SlhDsaSig.randomness A D HP K LEN N sig))) fun (s : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N (@fips205.types.SlhPublicKey.pk_seed N pk))) fun (s1 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N (@fips205.types.SlhPublicKey.pk_root N pk))) fun (s2 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 M) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (verify_mono.oracle.h_msg M s s1 s2 mprime) fun (digest : Aeneas.Std.Array.{0} Aeneas.Std.U8 M) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HMul.hMul.{0, 0, 0} Aeneas.Std.Usize Aeneas.Std.Usize (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHMulUScalarResult Aeneas.Std.UScalarTy.Usize) K A) fun (i : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) i (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) fips205.slhVerifyRoot._proof_1)) fun (i1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.Usize) i1 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 8) (instOfNatNat (nat_lit 8))) fips205.slhVerifyRoot._proof_2)) fun (index1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.core.array.Array.index Aeneas.Std.U8 (Aeneas.Std.core.ops.range.Range.{0} Aeneas.Std.Usize) (Aeneas.Std.Slice.{0} Aeneas.Std.U8) M (@Aeneas.Std.core.ops.index.IndexSlice Aeneas.Std.U8 (Aeneas.Std.core.ops.range.Range.{0} Aeneas.Std.Usize) (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.core.slice.index.SliceIndexRangeUsizeSlice Aeneas.Std.U8)) digest (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.Usize (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) fips205.htVerifyRoot._proof_1) index1)) fun (md : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} Aeneas.Std.Usize Aeneas.Std.Usize (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.Usize) H D) fun (i2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} Aeneas.Std.Usize (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.Usize) H i2) fun (i3 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) i3 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) fips205.slhVerifyRoot._proof_1)) fun (i4 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.Usize) i4 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 8) (instOfNatNat (nat_lit 8))) fips205.slhVerifyRoot._proof_2)) fun (i5 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) index1 i5) fun (index2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.core.array.Array.index Aeneas.Std.U8 (Aeneas.Std.core.ops.range.Range.{0} Aeneas.Std.Usize) (Aeneas.Std.Slice.{0} Aeneas.Std.U8) M (@Aeneas.Std.core.ops.index.IndexSlice Aeneas.Std.U8 (Aeneas.Std.core.ops.range.Range.{0} Aeneas.Std.Usize) (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.core.slice.index.SliceIndexRangeUsizeSlice Aeneas.Std.U8)) digest (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.Usize index1 index2)) fun (tmp_idx_tree : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HMul.hMul.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) Aeneas.Std.Usize (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHMulUScalarResult Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 8) (instOfNatNat (nat_lit 8))) fips205.slhVerifyRoot._proof_2) D) fun (i6 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.Usize (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) H i6) fun (i7 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.Usize) i7 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) fips205.slhVerifyRoot._proof_3)) fun (i8 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.Usize) i8 i6) fun (i9 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) index2 i9) fun (index3 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.core.array.Array.index Aeneas.Std.U8 (Aeneas.Std.core.ops.range.Range.{0} Aeneas.Std.Usize) (Aeneas.Std.Slice.{0} Aeneas.Std.U8) M (@Aeneas.Std.core.ops.index.IndexSlice Aeneas.Std.U8 (Aeneas.Std.core.ops.range.Range.{0} Aeneas.Std.Usize) (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.core.slice.index.SliceIndexRangeUsizeSlice Aeneas.Std.U8)) digest (@Aeneas.Std.core.ops.range.Range.mk.{0} Aeneas.Std.Usize index2 index3)) fun (tmp_idx_leaf : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.U32) h32 d32) fun (i10 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) h32 i10) fun (i11 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) i11 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) fips205.slhVerifyRoot._proof_4)) fun (i12 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.U32) i12 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 8) (instOfNatNat (nat_lit 8))) fips205.slhVerifyRoot._proof_5)) fun (i13 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U64 (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.to_int tmp_idx_tree i13) fun (i14 : Aeneas.Std.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) h32 i10) fun (i15 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 64) (instOfNatNat (nat_lit 64))) fips205.slhVerifyRoot._proof_6) i15) fun (i16 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HShiftRight.hShiftRight.{0, 0, 0} Aeneas.Std.U64 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64)) (@Aeneas.Std.instHShiftRightUScalarResult Aeneas.Std.UScalarTy.U64 Aeneas.Std.UScalarTy.U32) Aeneas.Std.core.num.U64.MAX i16) fun (i17 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (@HAnd.hAnd.{0, 0, 0} Aeneas.Std.U64 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (@Aeneas.Std.instHAndUScalar Aeneas.Std.UScalarTy.U64) i14 i17)) fun (idx_tree : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HMul.hMul.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHMulUScalarResult Aeneas.Std.UScalarTy.U32) (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 8) (instOfNatNat (nat_lit 8))) fips205.slhVerifyRoot._proof_5) d32) fun (i18 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) h32 i18) fun (i19 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) i19 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) fips205.htVerifyRoot._proof_2)) fun (i20 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.U32) i20 i18) fun (i21 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U64 (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.to_int tmp_idx_leaf i21) fun (i22 : Aeneas.Std.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 64) (instOfNatNat (nat_lit 64))) fips205.slhVerifyRoot._proof_6) i10) fun (i23 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HShiftRight.hShiftRight.{0, 0, 0} Aeneas.Std.U64 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64)) (@Aeneas.Std.instHShiftRightUScalarResult Aeneas.Std.UScalarTy.U64 Aeneas.Std.UScalarTy.U32) Aeneas.Std.core.num.U64.MAX i23) fun (i24 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (@HAnd.hAnd.{0, 0, 0} Aeneas.Std.U64 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) (@Aeneas.Std.instHAndUScalar Aeneas.Std.UScalarTy.U64) i22 i24)) fun (idx_leaf : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_tree_address adrs idx_tree) fun (adrs1 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_type_and_clear adrs1 fips205.types.FORS_TREE) fun (adrs2 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U64 Aeneas.Std.UScalarTy.U32 idx_leaf)) fun (idx_leaf_u32 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_key_pair_address adrs2 idx_leaf_u32) fun (adrs3 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N (@fips205.types.SlhPublicKey.pk_seed N pk))) fun (s3 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (fips205.types.ForsPk N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@fips205.verify_mono.fors_pk_from_sig_free A K N (@fips205.types.SlhDsaSig.fors_sig A D HP K LEN N sig) md s3 adrs3) fun (pk_fors : fips205.types.ForsPk N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N (@fips205.types.ForsPk.key N pk_fors))) fun (s4 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N (@fips205.types.SlhPublicKey.pk_seed N pk))) fun (s5 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @fips205.htVerifyRoot D HP LEN N s4 (@fips205.types.SlhDsaSig.ht_sig A D HP K LEN N sig) s5 idx_tree idx_leaf_u32 +spec|fips205.slhVerifyRoot._proof_1|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize) +spec|fips205.slhVerifyRoot._proof_2|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 8) (instOfNatNat (nat_lit 8))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize) +spec|fips205.slhVerifyRoot._proof_3|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize) +spec|fips205.slhVerifyRoot._proof_4|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 7) (instOfNatNat (nat_lit 7))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32) +spec|fips205.slhVerifyRoot._proof_5|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 8) (instOfNatNat (nat_lit 8))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32) +spec|fips205.slhVerifyRoot._proof_6|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 64) (instOfNatNat (nat_lit 64))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32) +spec|fips205.toByteFold|def|value=fun (n : Aeneas.Std.U32) (x : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) fips205.toByteFold._proof_1)) (x_1 x_2 : Aeneas.Std.U32) (x_3 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) fips205.toByteFold._proof_1) → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) fips205.toByteFold._proof_1))) x_3 (fips205.toByteFold._f n) x x_1 x_2 +spec|fips205.toByteFold._f|def|value=fun (n : Aeneas.Std.U32) (x : Nat) (f : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) x) (x_1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (x_2 x_3 : Aeneas.Std.U32) => fips205.toByteFold.match_1.{1} (fun (x : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (x_4 x_5 : Aeneas.Std.U32) (x_6 : Nat) => @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) x_6 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) x_1 x_2 x_3 x (fun (s : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (x x_4 : Aeneas.Std.U32) (x_5 : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) s) (fun (s : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (total i : Aeneas.Std.U32) (k : Nat) (x : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) → Aeneas.Std.U32 → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) (Nat.succ k)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@Aeneas.Std.lift.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (Aeneas.Std.core.num.U32.to_le_bytes total)) fun (a : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U8 (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@Aeneas.Std.Array.index_usize.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 4) (instOfNatNat (nat_lit 4))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) a (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i1 : Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@HSub.hSub.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) n (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) i2 i) fun (i3 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize i3)) fun (i4 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@Aeneas.Std.Array.update.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) s i4 i1) fun (a1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@HShiftRight.hShiftRight.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.IScalar Aeneas.Std.IScalarTy.I32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHShiftRightUScalarIScalarResult Aeneas.Std.UScalarTy.U32 Aeneas.Std.IScalarTy.I32) total (Aeneas.Std.I32.ofInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (@of_decide_eq_true (And (@LE.le.{0} Int Int.instLEInt (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (@LE.le.{0} Int Int.instLEInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32))) (@instDecidableAnd (@LE.le.{0} Int Int.instLEInt (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (@LE.le.{0} Int Int.instLEInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32)) (Int.decLe (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (Int.decLe (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32))) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (And (@LE.le.{0} Int Int.instLEInt (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (@LE.le.{0} Int Int.instLEInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32))) (@instDecidableAnd (@LE.le.{0} Int Int.instLEInt (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (@LE.le.{0} Int Int.instLEInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32)) (Int.decLe (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (Int.decLe (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32)))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (total1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) i (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i' : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => x.1 a1 total1 i') f +spec|fips205.toByteFold._proof_1|prop|type=@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize) +spec|fips205.toByteFold.match_1|def|value=fun (motive : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))) → Aeneas.Std.U32 → Aeneas.Std.U32 → Nat → Sort u_1) (x : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (x_1 x_2 : Aeneas.Std.U32) (x_3 : Nat) (h_1 : (s : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) → (x x_4 : Aeneas.Std.U32) → motive s x x_4 (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (s : Aeneas.Std.Array.{0} Aeneas.Std.U8 (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) → (total i : Aeneas.Std.U32) → (k : Nat) → motive s total i (Nat.succ k)) => @Nat.casesOn.{u_1} (fun (x_4 : Nat) => motive x x_1 x_2 x_4) x_3 (h_1 x x_1 x_2) fun (n : Nat) => h_2 x x_1 x_2 n +spec|fips205.toIntFold|def|value=fun (x : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (x_1 : Aeneas.Std.U64) (x_2 : Aeneas.Std.Usize) (x_3 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => Aeneas.Std.U64 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U64) x_3 (fips205.toIntFold._f x) x_1 x_2 +spec|fips205.toIntFold._f|def|value=fun (x : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (x_1 : Nat) (f : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U64 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U64) x_1) (x_2 : Aeneas.Std.U64) (x_3 : Aeneas.Std.Usize) => fips205.toIntFold.match_1.{1} (fun (x : Aeneas.Std.U64) (x_4 : Aeneas.Std.Usize) (x_5 : Nat) => @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U64 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U64) x_5 → Aeneas.Std.Result.{0} Aeneas.Std.U64) x_2 x_3 x_1 (fun (total : Aeneas.Std.U64) (x : Aeneas.Std.Usize) (x_4 : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U64 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U64) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} Aeneas.Std.U64 total) (fun (total : Aeneas.Std.U64) (i : Aeneas.Std.Usize) (s : Nat) (x_4 : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U64 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U64) (Nat.succ s)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) Aeneas.Std.U64 (@HShiftLeft.hShiftLeft.{0, 0, 0} Aeneas.Std.U64 (Aeneas.Std.IScalar Aeneas.Std.IScalarTy.I32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64)) (@Aeneas.Std.instHShiftLeftUScalarIScalarResult Aeneas.Std.UScalarTy.U64 Aeneas.Std.IScalarTy.I32) total (Aeneas.Std.I32.ofInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (@of_decide_eq_true (And (@LE.le.{0} Int Int.instLEInt (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (@LE.le.{0} Int Int.instLEInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32))) (@instDecidableAnd (@LE.le.{0} Int Int.instLEInt (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (@LE.le.{0} Int Int.instLEInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32)) (Int.decLe (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (Int.decLe (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32))) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (And (@LE.le.{0} Int Int.instLEInt (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (@LE.le.{0} Int Int.instLEInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32))) (@instDecidableAnd (@LE.le.{0} Int Int.instLEInt (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (@LE.le.{0} Int Int.instLEInt (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32)) (Int.decLe (Aeneas.Std.IScalar.cMin Aeneas.Std.IScalarTy.I32) (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8)))) (Int.decLe (@OfNat.ofNat.{0} Int (nat_lit 8) (@instOfNat (nat_lit 8))) (Aeneas.Std.IScalar.cMax Aeneas.Std.IScalarTy.I32)))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U8 Aeneas.Std.U64 (@Aeneas.Std.Slice.index_usize.{0} Aeneas.Std.U8 x i) fun (i2 : Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U64 Aeneas.Std.U64 (@Aeneas.Std.lift.{0} Aeneas.Std.U64 (Aeneas.Std.core.convert.num.FromU64U8.from i2)) fun (i3 : Aeneas.Std.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) Aeneas.Std.U64 (@HAdd.hAdd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) Aeneas.Std.U64 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U64) i1 i3) fun (total1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U64) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) Aeneas.Std.U64 (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.Usize (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) i (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i' : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => x_4.1 total1 i') f +spec|fips205.toIntFold.match_1|def|value=fun (motive : Aeneas.Std.U64 → Aeneas.Std.Usize → Nat → Sort u_1) (x : Aeneas.Std.U64) (x_1 : Aeneas.Std.Usize) (x_2 : Nat) (h_1 : (total : Aeneas.Std.U64) → (x : Aeneas.Std.Usize) → motive total x (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (total : Aeneas.Std.U64) → (i : Aeneas.Std.Usize) → (s : Nat) → motive total i (Nat.succ s)) => @Nat.casesOn.{u_1} (fun (x_3 : Nat) => motive x x_1 x_3) x_2 (h_1 x x_1) fun (n : Nat) => h_2 x x_1 n +spec|fips205.wotsChainFold|def|value=fun {LEN N : Aeneas.Std.Usize} (sig : fips205.types.WotsSig LEN N) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (msg : Aeneas.Std.Array.{0} Aeneas.Std.U32 LEN) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) (x_2 : Aeneas.Std.Usize) (x_3 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN))) x_3 (@fips205.wotsChainFold._f LEN N sig pk_seed msg) x x_1 x_2 +spec|fips205.wotsChainFold._f|def|value=fun {LEN N : Aeneas.Std.Usize} (sig : fips205.types.WotsSig LEN N) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (msg : Aeneas.Std.Array.{0} Aeneas.Std.U32 LEN) (x : Nat) (f : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN))) x) (x_1 : fips205.types.Adrs) (x_2 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) (x_3 : Aeneas.Std.Usize) => @fips205.wotsChainFold.match_1.{1} LEN N (fun (x : fips205.types.Adrs) (x_4 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) (x_5 : Aeneas.Std.Usize) (x_6 : Nat) => @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN))) x_6 → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN))) x_1 x_2 x_3 x (fun (adrs : fips205.types.Adrs) (tmp : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) (x : Aeneas.Std.Usize) (x_4 : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN))) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@Prod.mk.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) adrs tmp)) (fun (adrs : fips205.types.Adrs) (tmp : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) (i : Aeneas.Std.Usize) (k : Nat) (x : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN → Aeneas.Std.Usize → Aeneas.Std.Result.{0} (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN))) (Nat.succ k)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.Usize Aeneas.Std.UScalarTy.U32 i)) fun (i1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (fips205.helpers.Adrs.set_chain_address adrs i1) fun (adrs1 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@Aeneas.Std.Array.index_usize.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN (@fips205.types.WotsSig.data LEN N sig) i) fun (a : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U32 (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@Aeneas.Std.Array.index_usize.{0} Aeneas.Std.U32 LEN msg i) fun (i2 : Aeneas.Std.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@HSub.hSub.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) fips205.W (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i3 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) i3 i2) fun (i4 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@fips205.verify_mono.chain_free N a i2 i4 pk_seed adrs1) fun (a1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@Aeneas.Std.Array.update.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN tmp i a1) fun (a2 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Prod.{0, 0} fips205.types.Adrs (Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN)) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.Usize (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) i (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i' : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => x.1 adrs1 a2 i') f +spec|fips205.wotsChainFold.match_1|def|value=fun {LEN N : Aeneas.Std.Usize} (motive : fips205.types.Adrs → Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN → Aeneas.Std.Usize → Nat → Sort u_1) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) (x_2 : Aeneas.Std.Usize) (x_3 : Nat) (h_1 : (adrs : fips205.types.Adrs) → (tmp : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) → (x : Aeneas.Std.Usize) → motive adrs tmp x (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (adrs : fips205.types.Adrs) → (tmp : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) LEN) → (i : Aeneas.Std.Usize) → (k : Nat) → motive adrs tmp i (Nat.succ k)) => @Nat.casesOn.{u_1} (fun (x_4 : Nat) => motive x x_1 x_2 x_4) x_3 (h_1 x x_1 x_2) fun (n : Nat) => h_2 x x_1 x_2 n +spec|fips205.wotsCsumFold|def|value=fun {LEN : Aeneas.Std.Usize} (msg : Aeneas.Std.Array.{0} Aeneas.Std.U32 LEN) (x : Aeneas.Std.U32) (x_1 : Aeneas.Std.Usize) (x_2 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U32) x_2 (@fips205.wotsCsumFold._f LEN msg) x x_1 +spec|fips205.wotsCsumFold._f|def|value=fun {LEN : Aeneas.Std.Usize} (msg : Aeneas.Std.Array.{0} Aeneas.Std.U32 LEN) (x : Nat) (f : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U32) x) (x_1 : Aeneas.Std.U32) (x_2 : Aeneas.Std.Usize) => fips205.wotsCsumFold.match_1.{1} (fun (x : Aeneas.Std.U32) (x_3 : Aeneas.Std.Usize) (x_4 : Nat) => @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U32) x_4 → Aeneas.Std.Result.{0} Aeneas.Std.U32) x_1 x_2 x (fun (csum : Aeneas.Std.U32) (x : Aeneas.Std.Usize) (x_3 : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U32) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} Aeneas.Std.U32 csum) (fun (csum : Aeneas.Std.U32) (i : Aeneas.Std.Usize) (s : Nat) (x : @Nat.below.{1} (fun (x : Nat) => Aeneas.Std.U32 → Aeneas.Std.Usize → Aeneas.Std.Result.{0} Aeneas.Std.U32) (Nat.succ s)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) Aeneas.Std.U32 (@HSub.hSub.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) fips205.W (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} Aeneas.Std.U32 Aeneas.Std.U32 (@Aeneas.Std.Array.index_usize.{0} Aeneas.Std.U32 LEN msg i) fun (i2 : Aeneas.Std.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) Aeneas.Std.U32 (@HSub.hSub.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) i1 i2) fun (i3 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) Aeneas.Std.U32 (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) csum i3) fun (csum1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) Aeneas.Std.U32 (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.Usize (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.Usize) i (Aeneas.Std.Usize.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.Usize))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i' : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => x.1 csum1 i') f +spec|fips205.wotsCsumFold.match_1|def|value=fun (motive : Aeneas.Std.U32 → Aeneas.Std.Usize → Nat → Sort u_1) (x : Aeneas.Std.U32) (x_1 : Aeneas.Std.Usize) (x_2 : Nat) (h_1 : (csum : Aeneas.Std.U32) → (x : Aeneas.Std.Usize) → motive csum x (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (csum : Aeneas.Std.U32) → (i : Aeneas.Std.Usize) → (s : Nat) → motive csum i (Nat.succ s)) => @Nat.casesOn.{u_1} (fun (x_3 : Nat) => motive x x_1 x_3) x_2 (h_1 x x_1) fun (n : Nat) => h_2 x x_1 n +spec|fips205.xmssFoldN|def|value=fun {HP N : Aeneas.Std.Usize} (idx : Aeneas.Std.U32) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (auth : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) HP) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_2 : Aeneas.Std.U32) (x_3 : Nat) => @Nat.brecOn.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_3 (@fips205.xmssFoldN._f HP N idx pk_seed auth) x x_1 x_2 +spec|fips205.xmssFoldN._f|def|value=fun {HP N : Aeneas.Std.Usize} (idx : Aeneas.Std.U32) (pk_seed : Aeneas.Std.Slice.{0} Aeneas.Std.U8) (auth : Aeneas.Std.Array.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) HP) (x : Nat) (f : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x) (x_1 : fips205.types.Adrs) (x_2 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_3 : Aeneas.Std.U32) => @fips205.xmssFoldN.match_1.{1} N (fun (x : fips205.types.Adrs) (x_4 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_5 : Aeneas.Std.U32) (x_6 : Nat) => @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_6 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) x_1 x_2 x_3 x (fun (x : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_4 : Aeneas.Std.U32) (x_5 : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) => @Aeneas.Std.Result.ok.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) node) (fun (adrs : fips205.types.Adrs) (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (k : Aeneas.Std.U32) (s : Nat) (x : @Nat.below.{1} (fun (x : Nat) => fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (Nat.succ s)) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HAdd.hAdd.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHAddUScalarResult Aeneas.Std.UScalarTy.U32) k (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (w : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_tree_height adrs w) fun (adrs1 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HShiftRight.hShiftRight.{0, 0, 0} Aeneas.Std.U32 Aeneas.Std.U32 (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHShiftRightUScalarResult Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.U32) idx k) fun (i1 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@HAnd.hAnd.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (@Aeneas.Std.instHAndUScalar Aeneas.Std.UScalarTy.U32) i1 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true)))))) fun (i2 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @ite.{1} (Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) (@Eq.{1} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) i2 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (Aeneas.Std.instDecidableEqUScalar_1 Aeneas.Std.UScalarTy.U32 i2 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) (@Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Prod.{0, 0} Aeneas.Std.U32 fips205.types.Adrs) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.get_tree_index adrs1) (@Aeneas.Std.uncurry.{0, 0, 1} Aeneas.Std.U32 fips205.types.Adrs (Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) fun (i3 : Aeneas.Std.U32) (adrs2 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.U32) i3 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (tmp : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_tree_index adrs2 tmp) fun (adrs3 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N node)) fun (s0 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize k)) fun (i4 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.Array.index_usize.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) HP auth i4) fun (a : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N a)) fun (s1 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (verify_mono.oracle.h N pk_seed adrs3 s0 s1) fun (node1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => x.1 adrs3 node1 w)) (@Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Prod.{0, 0} Aeneas.Std.U32 fips205.types.Adrs) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.get_tree_index adrs1) (@Aeneas.Std.uncurry.{0, 0, 1} Aeneas.Std.U32 fips205.types.Adrs (Aeneas.Std.Result.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N)) fun (i3 : Aeneas.Std.U32) (adrs2 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HSub.hSub.{0, 0, 0} Aeneas.Std.U32 (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHSubUScalarResult Aeneas.Std.UScalarTy.U32) i3 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 1) (instOfNatNat (nat_lit 1))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (i4 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@HDiv.hDiv.{0, 0, 0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) (Aeneas.Std.Result.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32)) (@Aeneas.Std.instHDivUScalarResult Aeneas.Std.UScalarTy.U32) i4 (Aeneas.Std.U32.ofNat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (@of_decide_eq_true (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (@id.{0} (@Eq.{1} Bool (@Decidable.decide (@LE.le.{0} Nat instLENat (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32)) (Nat.decLe (@OfNat.ofNat.{0} Nat (nat_lit 2) (instOfNatNat (nat_lit 2))) (Aeneas.Std.UScalar.cMax Aeneas.Std.UScalarTy.U32))) Bool.true) (@Eq.refl.{1} Bool Bool.true))))) fun (tmp : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.U32) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} fips205.types.Adrs (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (fips205.helpers.Adrs.set_tree_index adrs2 tmp) fun (adrs3 : fips205.types.Adrs) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) (@Aeneas.Std.UScalar.cast Aeneas.Std.UScalarTy.U32 Aeneas.Std.UScalarTy.Usize k)) fun (i5 : Aeneas.Std.UScalar Aeneas.Std.UScalarTy.Usize) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.Array.index_usize.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) HP auth i5) fun (a : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N a)) fun (s0 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (@Aeneas.Std.lift.{0} (Aeneas.Std.Slice.{0} Aeneas.Std.U8) (@Aeneas.Std.Array.to_slice.{0} Aeneas.Std.U8 N node)) fun (s1 : Aeneas.Std.Slice.{0} Aeneas.Std.U8) => @Bind.bind.{0, 0} Aeneas.Std.Result.{0} Aeneas.Std.instBindResult.{0} (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (verify_mono.oracle.h N pk_seed adrs3 s0 s1) fun (node1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) => x.1 adrs3 node1 w))) f +spec|fips205.xmssFoldN.match_1|def|value=fun {N : Aeneas.Std.Usize} (motive : fips205.types.Adrs → Aeneas.Std.Array.{0} Aeneas.Std.U8 N → Aeneas.Std.U32 → Nat → Sort u_1) (x : fips205.types.Adrs) (x_1 : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) (x_2 : Aeneas.Std.U32) (x_3 : Nat) (h_1 : (x : fips205.types.Adrs) → (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) → (x_4 : Aeneas.Std.U32) → motive x node x_4 (@OfNat.ofNat.{0} Nat (nat_lit 0) (instOfNatNat (nat_lit 0)))) (h_2 : (adrs : fips205.types.Adrs) → (node : Aeneas.Std.Array.{0} Aeneas.Std.U8 N) → (k : Aeneas.Std.U32) → (s : Nat) → motive adrs node k (Nat.succ s)) => @Nat.casesOn.{u_1} (fun (x_4 : Nat) => motive x x_1 x_2 x_4) x_3 (h_1 x x_1 x_2) fun (n : Nat) => h_2 x x_1 x_2 n diff --git a/verification/PROVENANCE.json b/verification/PROVENANCE.json index cab6eba..bad8ff9 100644 --- a/verification/PROVENANCE.json +++ b/verification/PROVENANCE.json @@ -1,5 +1,5 @@ { - "_comment": "Single machine-readable pin set to reproduce the extracted Lean model in gen/SlhVerify from source. External review rounds 2-5 (2026-07-24 .. 2026-07-27). Running verification/extract.sh against the pinned source tree with the pinned Charon/Aeneas toolchain reproduces the two aeneas-generated files byte-identically (generated_artifacts_sha256 below). The *External*.lean files are hand-maintained (not regenerated) and are NOT part of that reproducibility claim — but they ARE byte-pinned for integrity in model_integrity_sha256, since they carry the five oracle axioms and the discharged Step definitions. NOTE: SlhVerify.llbc is an intermediate artifact and is .gitignored, so its hash here can only be checked by a party who re-runs extract.sh.", + "_comment": "Single machine-readable pin set to reproduce the extracted Lean model in gen/SlhVerify from source. External review rounds 2-5 (2026-07-24 .. 2026-07-27). Running verification/extract.sh against the pinned source tree with the pinned Charon/Aeneas toolchain reproduces the two aeneas-generated files byte-identically (generated_artifacts_sha256 below). The *External*.lean files are hand-maintained (not regenerated) and are NOT part of that reproducibility claim \u2014 but they ARE byte-pinned for integrity in model_integrity_sha256, since they carry the five oracle axioms and the discharged Step definitions. NOTE: SlhVerify.llbc is an intermediate artifact and is .gitignored, so its hash here can only be checked by a party who re-runs extract.sh.", "parameter_set": "SLH-DSA-SHA2-128s", "source": { "repo": "github.com/saymrwulf/fips205-source", @@ -45,8 +45,9 @@ "gen/SlhVerify/Funs.lean": "7b7de55fd0206142f2678a079a6ed4462292356bc7de08ecd55cac0c76a1da9f" }, "harness_integrity_sha256": { - "_comment": "The compiler harness is part of the trusted computing base: check.sh shells out to lean-guard for every compile, and round-5 review demonstrated that stubbing it alone yields ALL GREEN in 3.6s over destroyed proofs. lean-guard is KEPT (it is the memory cap and machine-wide lock that protect this machine after the 12.2GB OOM incident) and sha256-pinned by Phase 0. NOT covered, and disclosed as trusted in TRUSTED-BASE.md item 11: check.sh itself, ~/aeneas-toolchain/env.sh, $AENEAS_HOME, python3, and the Lean toolchain.", - "lean-guard": "690d861cfd81b327604ffd5ef85599ee01b2bcd943907f5b71b8b6f99bad418f" + "_comment": "The harness is part of the trusted computing base. check.sh shells out to lean-guard for every compile (round-5 NEW-3: stubbing it alone yielded ALL GREEN in 3.6s over destroyed proofs), and Proofs/Audit.lean is the program that COMPUTES the digest it is judged by (round-6 NEW-7: flipping two fail-closed guards to `unless true` let a repo proving False pass with the digest BYTE-IDENTICAL \u2014 the digest binds the audit's DATA, never its LOGIC). Both are sha256-pinned by Phase 0, so tampering with either is a build failure rather than a silent green, and any legitimate change is a reviewable pin rotation. STILL trusted and unbound, disclosed in TRUSTED-BASE.md item 11: check.sh itself, ~/aeneas-toolchain/env.sh, $AENEAS_HOME, python3, and the Lean toolchain.", + "lean-guard": "690d861cfd81b327604ffd5ef85599ee01b2bcd943907f5b71b8b6f99bad418f", + "Proofs/Audit.lean": "6108b97d75a8a8e8e0b9bef642ba887ea1ae8b17ba5b7c11d66400bfd2847d9e" }, "audit_gate": "verification/Proofs/Audit.lean \u2014 in-Lean audit (round 5). Per certificate: exact cone equality (collectAxioms) + elaborated-statement check. Enumeration: EVERY declaration kind (def/theorem/opaque/axiom \u2014 round 4 matched theorems only, so a `def : False` passed) in the eight certificate modules AND in Audit.lean itself (the auditor is not exempt). Binding digest: check.sh binds to the SHA-256 of a canonical AUDIT-MANIFEST block covering the POLICY constants (allowedBoundary + certModules \u2014 round-5 NEW-1: widening allowedBoundary previously re-opened the False-proof with the fingerprint byte-identical), every certificate's fully-elaborated statement, and every reachable specification definition's fully-elaborated BODY (round-5 NEW-2: redefining a reference fold to *be* the extracted loop previously left cone and fingerprint intact while the certificate degenerated to `loop = loop`). The 32-bit Expr.hash is retained only as a per-certificate diagnostic, not as the binding. Fail-closed; adversarially exercised by check-selftest.sh. check.sh Phase 0 additionally purges stale .olean files, forbids stray .lean outside gen/ and Proofs/, and pins model + harness bytes." -} \ No newline at end of file +} diff --git a/verification/RECORDED-RUN.md b/verification/RECORDED-RUN.md index a156549..0c23705 100644 --- a/verification/RECORDED-RUN.md +++ b/verification/RECORDED-RUN.md @@ -277,3 +277,75 @@ a stubbed harness, and stray modules. Note: the `_f: command not found` line in the selftest transcript above is a cosmetic shell-quoting bug in the script's own success message (backticks inside a double-quoted echo), fixed in this same commit. It did not affect any gate. + +## Round-6 hardening — author-agent run, 20260728T072212Z, proof repo @ (this commit) + +Captured with `tee` from the real commands. Not independently executed. +PIN ROTATIONS IN THIS COMMIT (stated explicitly — round-6 NEW-11): + · harness_integrity_sha256 GAINS Proofs/Audit.lean (6108b97d…) — new pin, NEW-7. + · no model pin rotated; gen/ bytes unchanged. + +### check.sh +``` +fips205-slhdsa-verified — check +=============================== +=== Phase 0: build hygiene + model/harness integrity === + ✓ Proofs/Audit.lean + ✓ gen/SlhVerify/Funs.lean + ✓ gen/SlhVerify/FunsExternal.lean + ✓ gen/SlhVerify/Types.lean + ✓ gen/SlhVerify/TypesExternal.lean + ✓ lean-guard +=== Phase 1: compile the extracted model === + · gen/SlhVerify/TypesExternal + · gen/SlhVerify/Types + · gen/SlhVerify/FunsExternal + · gen/SlhVerify/Funs +=== Phase 2: compile the proofs === + · ChainSpec + · WotsSpec + · XmssSpec + · HtSpec + · ForsInnerSpec + · ForsOuterSpec + · InputPrepSpec + · ApexSpec +=== Phase 3: in-Lean audit (cones + statement fingerprints + enumeration) === + ✓ exact-cone audit PASSED + ✓ audit-manifest digest matches (sha256 d83e297a49094c97…) + +ALL GREEN — model compiles, proofs compile, and every certificate cone +equals EXACTLY the three kernel axioms plus its documented SHA-2 oracles. +Certificates proven: fips205.chain_free_loop_eq fips205.wots_loop1_eq fips205.xmss_loop_eq fips205.ht_loop_eq fips205.fors_inner_loop_eq fips205.fors_outer_loop_eq fips205.to_int_loop_eq fips205.to_byte_loop_eq fips205.wots_csum_loop_eq fips205.base2b_outer_loop_eq fips205.slh_verify_128s_accepts_iff +``` + +### check-selftest.sh (16 attacks + digest-coverage check) +``` +check-selftest: attacking the gates +==================================== +✓ attack 1 rejected (dead-file gate) +✓ attack 2 rejected (extra-axiom detection — evil_ax named) +✓ attack 3 rejected (missing-oracle detection — exact cone, not subset) +✓ attack 4 rejected (existence check — a vanished cert cannot pass as 0-axiom) +✓ attack 5 rejected (enumeration — an un-manifested False theorem cannot pass) +✓ attack 6 rejected (statement check — a gutted statement of the same cone cannot pass) +✓ attack 7 rejected (Phase 0 model-byte integrity) +✓ attack 8 rejected (audit-manifest digest — a silently-dropped cert cannot pass) +✓ attack 9 rejected (digest covers allowedBoundary — the policy cannot be widened silently) +✓ attack 10 rejected (a specification fold cannot be silently redefined to the loop) +✓ attack 11 rejected (enumeration covers every declaration kind, not just theorems) +✓ attack 12 rejected (the auditor audits itself — no exemption) +✓ attack 13 rejected (Phase 0 pins lean-guard — the harness is in the TCB and bound) +✓ attack 14 rejected (no .lean may sit outside gen/ and Proofs/) +✓ attack 16 rejected (Phase 0 purges every .olean under verification/, so an + orphan compiled module with no source cannot satisfy an import) +✓ attack 17 rejected (Phase 0 pins Audit.lean — its LOGIC cannot be silently switched off) +✓ check 15 passed (the hashed block carries all 12 reference-fold bodies, + including the recursive _f companions and their extracted-primitive calls) + +SELFTEST GREEN: 16 attacks rejected + digest-coverage check — dead files, extra axioms, dropped +oracles, vanished certs, un-manifested False theorems AND defs, gutted +statements, hand-edited models, dropped manifest rows, widened policy, +specification folds redefined to the loop, a False-proof in the auditor, +a stubbed harness, and stray modules. +``` diff --git a/verification/check-selftest.sh b/verification/check-selftest.sh index 6e8a47d..1989e26 100755 --- a/verification/check-selftest.sh +++ b/verification/check-selftest.sh @@ -20,6 +20,11 @@ # previously ALL GREEN in 3.6s over destroyed proofs) # 14 a stray .lean beside check.sh (round-5 NEW-4: # LEAN_PATH includes $PWD, so it can join the environment ungated) +# 16 an ORPHAN .olean whose source was deleted (round-6 NEW-8: +# fell between the purge and the stray check; ALL GREEN, digest identical) +# 17 the audit's fail-closed guards switched off (round-6 NEW-7: +# the digest binds the audit's DATA, never its LOGIC; two characters in +# Audit.lean defeated every gate with the digest BYTE-IDENTICAL) # # Self-cleaning: every mutated file is backed up and restored, and an EXIT trap # restores even on failure. Run from a clean tree. @@ -31,10 +36,25 @@ source ~/aeneas-toolchain/env.sh BAKS=() save() { cp -p "$1" "$1.sfbak"; BAKS+=("$1"); } restore() { for f in "${BAKS[@]:-}"; do [ -f "$f.sfbak" ] && mv -f "$f.sfbak" "$f"; done; BAKS=(); } +# Proofs/Audit.lean is sha256-pinned by Phase 0 since round 6 (NEW-7). An attack +# that mutates the audit's DATA must therefore ALSO rotate that pin, otherwise it +# is stopped by the byte pin and never reaches the mechanism it means to test — +# the "rejected for an unrelated reason" defect class. `repin_audit` simulates an +# author who edits and dutifully re-pins; the digest/enumeration must still bite. +# Attack 17 deliberately does NOT re-pin: it is the test of the pin itself. +repin_audit() { + python3 - <<'PY' +import json, hashlib +p = "PROVENANCE.json"; d = json.load(open(p)) +d["harness_integrity_sha256"]["Proofs/Audit.lean"] = hashlib.sha256( + open("Proofs/Audit.lean","rb").read()).hexdigest() +json.dump(d, open(p,"w"), indent=2); open(p,"a").write("\n") +PY +} cleanup() { restore - rm -f Proofs/Stray.lean Proofs/EvilSpec.lean Evil.lean \ - Proofs/*.olean gen/SlhVerify/*.olean .audit-manifest.observed 2>/dev/null + rm -f Proofs/Stray.lean Proofs/EvilSpec.lean Evil.lean Evil.olean \ + Proofs/*.olean gen/SlhVerify/*.olean *.olean .audit-manifest.observed 2>/dev/null return 0 } trap cleanup EXIT @@ -52,7 +72,7 @@ rm -f Proofs/Stray.lean echo "✓ attack 1 rejected (dead-file gate)" # ── 2: smuggled disallowed axiom in a real cone ───────────────────────────── -save check.sh; save Proofs/Audit.lean +save check.sh; save Proofs/Audit.lean; save PROVENANCE.json # NB: no imports — Phase 0 now purges every .olean, so a module injected at the # head of the build order cannot import one that has not been compiled yet. cat > Proofs/EvilSpec.lean <<'EOF' @@ -69,13 +89,14 @@ a = a.replace('import Proofs.ApexSpec', 'import Proofs.ApexSpec\nimport Proofs.E a = a.replace(' [ (`fips205.chain_free_loop_eq', ' [ (`evil_thm, kernel3, 0),\n (`fips205.chain_free_loop_eq', 1) open("Proofs/Audit.lean","w").write(a) PY +repin_audit ./check.sh > /tmp/sf2.out 2>&1 && fail "ATTACK 2 SUCCEEDED (smuggled axiom)" /tmp/sf2.out grep -q "evil_ax" /tmp/sf2.out || fail "ATTACK 2: rejected but evil_ax not named" /tmp/sf2.out restore; rm -f Proofs/EvilSpec.lean echo "✓ attack 2 rejected (extra-axiom detection — evil_ax named)" # ── 3: dropped oracle (a subset check would pass; exact must not) ──────────── -save Proofs/Audit.lean +save Proofs/Audit.lean; save PROVENANCE.json python3 - <<'PY' import re a = open("Proofs/Audit.lean").read() @@ -83,18 +104,20 @@ new, n = re.subn(r'(`fips205\.to_int_loop_eq,\s*)kernel3,', r'\1kernel3 ++ [orac assert n == 1, f"expected 1 to_int row, patched {n}" open("Proofs/Audit.lean","w").write(new) PY +repin_audit ./check.sh > /tmp/sf3.out 2>&1 && fail "ATTACK 3 SUCCEEDED (dropped oracle — subset hole)" /tmp/sf3.out grep -q "missing=\[verify_mono.oracle.f\]" /tmp/sf3.out || fail "ATTACK 3: rejected but missing oracle not named" /tmp/sf3.out restore echo "✓ attack 3 rejected (missing-oracle detection — exact cone, not subset)" # ── 4: vanished certificate ───────────────────────────────────────────────── -save Proofs/Audit.lean +save Proofs/Audit.lean; save PROVENANCE.json python3 - <<'PY' a = open("Proofs/Audit.lean").read() assert a.count('`fips205.chain_free_loop_eq,') >= 1 open("Proofs/Audit.lean","w").write(a.replace('`fips205.chain_free_loop_eq,', '`fips205.chain_free_loop_eq_VANISHED,', 1)) PY +repin_audit ./check.sh > /tmp/sf4.out 2>&1 && fail "ATTACK 4 SUCCEEDED (vanished cert)" /tmp/sf4.out grep -q "NOT FOUND" /tmp/sf4.out || fail "ATTACK 4: rejected but not via the existence check" /tmp/sf4.out restore @@ -131,7 +154,7 @@ restore echo "✓ attack 7 rejected (Phase 0 model-byte integrity)" # ── 8: deleted manifest row (round-4 F1, set half) ────────────────────────── -save Proofs/Audit.lean +save Proofs/Audit.lean; save PROVENANCE.json python3 - <<'PY' import re a = open("Proofs/Audit.lean").read() @@ -139,6 +162,7 @@ new, n = re.subn(r'\n\s*\(`fips205\.to_int_loop_eq,.*?\),', '', a) assert n == 1, f"expected 1 row, removed {n}" open("Proofs/Audit.lean","w").write(new) PY +repin_audit ./check.sh > /tmp/sf8.out 2>&1 && fail "ATTACK 8 SUCCEEDED (a dropped cert row passed)" /tmp/sf8.out grep -q "digest mismatch" /tmp/sf8.out || fail "ATTACK 8: rejected but not via the digest binding" /tmp/sf8.out restore @@ -152,13 +176,14 @@ echo "✓ attack 8 rejected (audit-manifest digest — a silently-dropped cert c # (which now also rejects a bare `axiom` in an audited module) cannot fire and # the DIGEST must be what bites. `sorryAx` is used as the smuggled name because # admitting it would silently legalise every `sorry` in the repository. -save Proofs/Audit.lean +save Proofs/Audit.lean; save PROVENANCE.json python3 - <<'PY' a = open("Proofs/Audit.lean").read() old = " kernel3 ++ [oracleF, oracleH, oracleTL, oracleTLen, oracleHMsg]\n" assert a.count(old) == 1, "allowedBoundary shape changed" open("Proofs/Audit.lean","w").write(a.replace(old, old.rstrip("\n") + " ++ [`sorryAx]\n", 1)) PY +repin_audit ./check.sh > /tmp/sf9.out 2>&1 && fail "ATTACK 9 SUCCEEDED: the axiom policy was widened and the button stayed GREEN!" /tmp/sf9.out grep -q "digest mismatch" /tmp/sf9.out || fail "ATTACK 9: rejected but not via the policy-covering digest" /tmp/sf9.out restore @@ -203,13 +228,14 @@ restore echo "✓ attack 11 rejected (enumeration covers every declaration kind, not just theorems)" # ── 12: a False-proof inside the AUDITOR itself (round-5 R1) ──────────────── -save Proofs/Audit.lean +save Proofs/Audit.lean; save PROVENANCE.json python3 - <<'PY' a = open("Proofs/Audit.lean").read() i = a.index("elab \"auditCones\"") open("Proofs/Audit.lean","w").write( a[:i] + "axiom cheat12 : ∀ (P : Prop), P\ntheorem audit_proves_false : False := cheat12 _\n\n" + a[i:]) PY +repin_audit ./check.sh > /tmp/sf12.out 2>&1 && fail "ATTACK 12 SUCCEEDED: the auditor itself proves False, still GREEN!" /tmp/sf12.out grep -qE "audit_proves_false|AXIOM DECLARED" /tmp/sf12.out || fail "ATTACK 12: rejected but not via self-enumeration" /tmp/sf12.out restore @@ -240,6 +266,58 @@ grep -q "BUILD HYGIENE FAILED" /tmp/sf14.out || fail "ATTACK 14: rejected but no rm -f Evil.lean echo "✓ attack 14 rejected (no .lean may sit outside gen/ and Proofs/)" +# ── 16: ORPHAN .olean WITH NO SOURCE (round-6 NEW-8) ─────────────────────── +# Previously ALL GREEN, digest byte-identical, repo proving False: the round-5 +# purge covered gen/ and Proofs/ while the stray check greped only *.lean, so a +# compiled module with its source DELETED fell between the two — and *.olean is +# .gitignored, so `git status` showed only the one-line import. +save Proofs/ChainSpec.lean +cat > Evil.lean <<'EOF' +axiom cheat16 : ∀ (P : Prop), P +theorem attack16_false : False := cheat16 _ +EOF +( cd "$AENEAS_HOME/backends/lean" && lake env bash -c \ + "cd '$HERE' && export LEAN_PATH=\"\$LEAN_PATH:\$PWD/gen:\$PWD\" && lean -o '$HERE/Evil.olean' '$HERE/Evil.lean'" ) >/dev/null 2>&1 +rm -f Evil.lean # the SOURCE is gone; only the .olean remains +printf '\nimport Evil\n' >> Proofs/ChainSpec.lean +if [ ! -f Evil.olean ]; then + echo " (note: could not build Evil.olean; attack 16 inconclusive)"; rm -f Evil.olean +else + ./check.sh > /tmp/sf16.out 2>&1 && fail "ATTACK 16 SUCCEEDED: an orphan .olean injected False and stayed GREEN!" /tmp/sf16.out + # The defense is Phase 0's purge, which now covers ALL of verification/ and so + # deletes the orphan BEFORE the stray check ever sees it; `import Evil` then has + # nothing to resolve and Phase 2 fails closed. Assert that chain precisely — + # the rejection must be the import failure AND the .olean must be gone. (An + # earlier revision asserted the hygiene message and failed while the gate was + # working correctly: the same wrong-diagnostic defect this suite exists to catch.) + grep -q "FAIL: Proofs/ChainSpec" /tmp/sf16.out \ + || fail "ATTACK 16: rejected, but not by the purge+import chain" /tmp/sf16.out + [ ! -f Evil.olean ] \ + || fail "ATTACK 16: check.sh failed but the orphan .olean survived Phase 0" /tmp/sf16.out + echo "✓ attack 16 rejected (Phase 0 purges every .olean under verification/, so an" + echo " orphan compiled module with no source cannot satisfy an import)" +fi +restore; rm -f Evil.olean Evil.lean + +# ── 17: TAMPER THE AUDIT'S LOGIC, NOT ITS DATA (round-6 NEW-7) ───────────── +# Switching the two fail-closed guards to `unless true` disables every in-Lean +# check while leaving the digest BYTE-IDENTICAL — the digest binds the audit's +# data, never the code that reads it. Note this attack does NOT re-pin +# Audit.lean: the sha256 pin is the only thing standing here, and that is +# exactly what is being tested. +save Proofs/Audit.lean; save Proofs/ChainSpec.lean +python3 - <<'PY' +a = open("Proofs/Audit.lean").read() +n = a.count(" unless errs.isEmpty do") +assert n >= 1, "Audit.lean fail-closed guard shape changed" +open("Proofs/Audit.lean","w").write(a.replace(" unless errs.isEmpty do", " unless true do")) +PY +printf '\n-- SELFTEST ATTACK 17\naxiom cheat17 : ∀ (P : Prop), P\ntheorem attack17_false : False := cheat17 _\n' >> Proofs/ChainSpec.lean +./check.sh > /tmp/sf17.out 2>&1 && fail "ATTACK 17 SUCCEEDED: the audit's guards were disabled and it stayed GREEN!" /tmp/sf17.out +grep -q "INTEGRITY FAILED" /tmp/sf17.out || fail "ATTACK 17: rejected but not via the Audit.lean harness pin" /tmp/sf17.out +restore +echo "✓ attack 17 rejected (Phase 0 pins Audit.lean — its LOGIC cannot be silently switched off)" + # ── 15: COVERAGE OF THE DIGEST INPUT (direct, not an attack) ─────────────── # Attack 9 proves the digest binding fires. This proves WHAT it covers: the # hashed block must literally contain each reference fold's definition BODY, so @@ -270,7 +348,7 @@ echo "✓ check 15 passed (the hashed block carries all 12 reference-fold bodies echo ' including the recursive _f companions and their extracted-primitive calls)' echo -echo "SELFTEST GREEN: 14 attacks rejected + digest-coverage check — dead files, extra axioms, dropped" +echo "SELFTEST GREEN: 16 attacks rejected + digest-coverage check — dead files, extra axioms, dropped" echo "oracles, vanished certs, un-manifested False theorems AND defs, gutted" echo "statements, hand-edited models, dropped manifest rows, widened policy," echo "specification folds redefined to the loop, a False-proof in the auditor," diff --git a/verification/check.sh b/verification/check.sh index b299296..75dafe4 100755 --- a/verification/check.sh +++ b/verification/check.sh @@ -50,17 +50,25 @@ echo "===============================" # ── Phase 0: build hygiene + model & harness integrity ─────────────────────── echo "=== Phase 0: build hygiene + model/harness integrity ===" -# (a) Purge every .olean first. Round-5 NEW-4: the button's verdict must depend -# on COMMITTED BYTES, never on untracked build state — a stale .olean from a -# module that no longer exists (and *.olean is .gitignored, so invisible to -# `git status`) could otherwise satisfy an import and go green. -find "$HERE/gen" "$HERE/Proofs" -name '*.olean' -delete 2>/dev/null || true -# (b) No Lean source may sit outside gen/ and Proofs/. LEAN_PATH includes $PWD, -# so a stray verification/*.lean can join the environment ungated (NEW-4). -STRAY=$(find "$HERE" -maxdepth 1 -name '*.lean' -printf '%f\n' 2>/dev/null || true) +# (a) Purge EVERY .olean under verification/ — round-6 NEW-8: the round-5 purge +# covered only gen/ and Proofs/ while the stray check greped only *.lean, so +# an ORPHAN `verification/Evil.olean` WITH NO SOURCE AT ALL fell between them, +# satisfied an `import Evil`, and went ALL GREEN with the digest untouched +# (*.olean is .gitignored, so `git status` showed only the import line). +# The verdict must depend on COMMITTED BYTES, never on untracked build state. +find "$HERE" -name '*.olean' -delete 2>/dev/null || true +# Aeneas also emits `*_Template.lean` scaffolding into gen/ on every +# extraction. Those files are UNTRACKED byproducts (a fresh clone has only +# the four pinned model files), nothing imports them, and they would +# otherwise sit on LEAN_PATH unpinned — the same untracked-state problem. +# Remove them here so the gen/ file-set assertion below can be exact. +find "$HERE/gen" -name '*_Template.lean' -delete 2>/dev/null || true +# (b) No Lean source OR compiled module may sit outside gen/ and Proofs/; +# LEAN_PATH includes $PWD, so either can join the environment ungated. +STRAY=$(find "$HERE" -maxdepth 1 \( -name '*.lean' -o -name '*.olean' \) -printf '%f\n' 2>/dev/null || true) if [ -n "$STRAY" ]; then - echo "$STRAY" | sed 's/^/ ✗ stray Lean source outside gen\/ and Proofs\/: /' - echo "BUILD HYGIENE FAILED (a .lean outside the audited directories can join LEAN_PATH)"; exit 1 + echo "$STRAY" | sed 's/^/ ✗ stray Lean file outside gen\/ and Proofs\/: /' + echo "BUILD HYGIENE FAILED (a .lean/.olean outside the audited directories can join LEAN_PATH)"; exit 1 fi # (c) sha256-pin the extracted model AND the compiler harness. lean-guard is # repo-tracked and is shelled out to for every compile, so it is part of the @@ -84,6 +92,20 @@ for rel, want in sorted(files.items()): print(f" ✗ {rel}: sha256 {got[:12]} ≠ pinned {want[:12]}"); bad = 1 else: print(f" ✓ {rel}") +# Round-6 NEW-9: pin gen/ as a SET, not as four names. A new file under gen/ was +# neither hashed nor forbidden, while LEAN_PATH contains $PWD/gen — so the +# closure's premise ("everything outside certModules is pinned or disclosed") +# was not enforced. Any .lean under gen/ must appear in the pin map. +pinned_gen = {k for k in files if k.startswith("gen/")} +actual_gen = set() +for root, _, names in os.walk(os.path.join(here, "gen")): + for n in names: + if n.endswith(".lean"): + actual_gen.add(os.path.relpath(os.path.join(root, n), here)) +for extra in sorted(actual_gen - pinned_gen): + print(f" ✗ UNPINNED model file under gen/: {extra}"); bad = 1 +for missing in sorted(pinned_gen - actual_gen): + print(f" ✗ pinned model file absent: {missing}"); bad = 1 sys.exit(1 if bad else 0) PY @@ -143,10 +165,19 @@ if [ "$GOT_SHA" != "$EXPECTED_AUDIT_SHA256" ]; then echo " expected: $EXPECTED_AUDIT_SHA256" echo " observed: $GOT_SHA" echo " A policy constant, a certificate statement, or a specification" - echo " definition changed without a reviewed rotation. The observed block was" - echo " written to verification/.audit-manifest.observed — diff it to see what." + echo " definition changed without a reviewed rotation." + echo " What moved (committed block vs observed):" + diff -u "$HERE/AUDIT-MANIFEST.txt" "$HERE/.audit-manifest.observed" 2>/dev/null \ + | head -40 | sed 's/^/ /' || echo " (AUDIT-MANIFEST.txt absent — cannot diff)" exit 1 fi +# The digest's INPUT is committed too (round-6: a mismatch previously wrote an +# observed block with nothing to diff it against). Guard against the committed +# copy drifting from what Lean actually emits. +if ! printf '%s\n' "$BLOCK" | cmp -s - "$HERE/AUDIT-MANIFEST.txt"; then + echo "AUDIT FAILED — the committed AUDIT-MANIFEST.txt does not match the emitted block" + echo " (digest matched, so this means the committed copy is stale — refresh it)"; exit 1 +fi echo " ✓ $(grep -oF 'exact-cone audit PASSED' <<<"$AUD_OUT" | head -1)" echo " ✓ audit-manifest digest matches (sha256 ${EXPECTED_AUDIT_SHA256:0:16}…)"