val finish_aes_encrypt_le : alg:algorithm -> input_LE:quad32 -> key:(seq nat32)
  -> Lemma
  (requires (Vale.AES.AES_s.is_aes_key_LE alg key))
  (ensures (Vale.AES.AES_s.aes_encrypt_LE alg key input_LE == Vale.AES.AES_s.eval_cipher alg
    input_LE (Vale.AES.AES_s.key_to_round_keys_LE alg key)))
let finish_aes_encrypt_le alg input_LE key =
  Vale.AES.AES_s.aes_encrypt_LE_reveal ();
  Vale.AES.AES_s.eval_cipher_reveal ();
  ()
val finish_aes_encrypt_le : alg:algorithm -> input_LE:quad32 -> key:(seq nat32)
  -> Lemma
  (requires (Vale.AES.AES_s.is_aes_key_LE alg key))
  (ensures (Vale.AES.AES_s.aes_encrypt_LE alg key input_LE == Vale.AES.AES_s.eval_cipher alg
    input_LE (Vale.AES.AES_s.key_to_round_keys_LE alg key)))
let finish_aes_encrypt_le alg input_LE key =
Vale.AES.AES_s.aes_encrypt_LE_reveal ();
Vale.AES.AES_s.eval_cipher_reveal ();
()
Vale.AES.X64.AESGCM.fst.checked
Vale.X64.State.fsti.checked Vale.X64.QuickCodes.fsti.checked Vale.X64.QuickCode.fst.checked Vale.X64.Memory.fsti.checked Vale.X64.Machine_s.fst.checked Vale.X64.InsVector.fsti.checked Vale.X64.InsMem.fsti.checked Vale.X64.InsBasic.fsti.checked Vale.X64.InsAes.fsti.checked Vale.X64.Flags.fsti.checked Vale.X64.Decls.fsti.checked Vale.X64.CPU_Features_s.fst.checked Vale.Math.Poly2_s.fsti.checked Vale.Math.Poly2.Words.fsti.checked Vale.Math.Poly2.Lemmas.fsti.checked Vale.Math.Poly2.Bits_s.fsti.checked Vale.Math.Poly2.Bits.fsti.checked Vale.Math.Poly2.fsti.checked Vale.Def.Words_s.fsti.checked Vale.Def.Types_s.fst.checked Vale.Def.Prop_s.fst.checked Vale.Def.Opaque_s.fsti.checked Vale.Arch.TypesNative.fsti.checked Vale.Arch.Types.fsti.checked Vale.AES.X64.PolyOps.fsti.checked Vale.AES.X64.AESopt2.fsti.checked Vale.AES.X64.AESopt.fsti.checked Vale.AES.GHash.fsti.checked Vale.AES.GF128_s.fsti.checked Vale.AES.GF128.fsti.checked Vale.AES.GCTR_s.fst.checked Vale.AES.GCTR.fsti.checked Vale.AES.GCM_helpers.fsti.checked Vale.AES.AES_s.fst.checked Vale.AES.AES_helpers.fsti.checked Vale.AES.AES_common_s.fst.checked prims.fst.checked FStar.Seq.Base.fsti.checked FStar.Seq.fst.checked FStar.Pervasives.Native.fst.checked FStar.Pervasives.fsti.checked FStar.Mul.fst.checked
Vale.AES.X64.AESGCM.fst
Vale.AES.AES_common_s.algorithm Vale.X64.Decls.quad32 FStar.Seq.Base.seq Vale.X64.Memory.nat32 Prims.unit Vale.AES.AES_s.eval_cipher_reveal Vale.AES.AES_s.aes_encrypt_LE_reveal
module Vale.AES.X64.AESGCM
open FStar.Mul
open Vale.Def.Prop_s
open Vale.Def.Opaque_s
open Vale.Def.Words_s
open Vale.Def.Types_s
open FStar.Seq
open Vale.AES.AES_s
open Vale.X64.Machine_s
open Vale.X64.Memory
open Vale.X64.State
open Vale.X64.Decls
open Vale.X64.InsBasic
open Vale.X64.InsMem
open Vale.X64.InsVector
open Vale.X64.InsAes
open Vale.X64.QuickCode
open Vale.X64.QuickCodes
open Vale.Arch.Types
open Vale.AES.AES_helpers
//open Vale.Poly1305.Math    // For lemma_poly_bits64()
open Vale.AES.GCM_helpers
open Vale.AES.GCTR_s
open Vale.AES.GCTR
open Vale.Arch.TypesNative
open Vale.X64.CPU_Features_s
open Vale.AES.X64.PolyOps
open Vale.Math.Poly2_s
open Vale.Math.Poly2
open Vale.Math.Poly2.Bits_s
open Vale.Math.Poly2.Bits
open Vale.Math.Poly2.Lemmas
open Vale.AES.GF128_s
open Vale.AES.GF128
open Vale.AES.GHash
open Vale.AES.X64.AESopt
open Vale.AES.X64.AESopt2
unfold let lo(x:poly):poly = mask x 64
unfold let hi(x:poly):poly = shift x (-64)

//let scratch_reqs (scratch_b:buffer128) (count:nat) (heap3:vale_heap) (s:seq quad32) (z3:quad32) : prop0 =
//  count * 6 + 6 <= length s /\
//  (let data = slice s (count * 6) (count * 6 + 6) in
//   z3 == reverse_bytes_quad32 (index data 5) /\
//   buffer128_read scratch_b 3 heap3 == reverse_bytes_quad32 (index data 4) /\
//   buffer128_read scratch_b 4 heap3 == reverse_bytes_quad32 (index data 3) /\
//   buffer128_read scratch_b 5 heap3 == reverse_bytes_quad32 (index data 2) /\
//   buffer128_read scratch_b 6 heap3 == reverse_bytes_quad32 (index data 1) /\
//   buffer128_read scratch_b 7 heap3 == reverse_bytes_quad32 (index data 0))


let scratch_reqs_simple (scratch_b:buffer128) (heap3:vale_heap) (data:seq quad32) (z3:quad32) : prop0 =
   length data == 6 /\
   z3 == reverse_bytes_quad32 (index data 5) /\
   buffer128_read scratch_b 3 heap3 == reverse_bytes_quad32 (index data 4) /\
   buffer128_read scratch_b 4 heap3 == reverse_bytes_quad32 (index data 3) /\
   buffer128_read scratch_b 5 heap3 == reverse_bytes_quad32 (index data 2) /\
   buffer128_read scratch_b 6 heap3 == reverse_bytes_quad32 (index data 1) /\
   buffer128_read scratch_b 7 heap3 == reverse_bytes_quad32 (index data 0)
//-- finish_aes_encrypt_le


val finish_aes_encrypt_le : alg:algorithm -> input_LE:quad32 -> key:(seq nat32)
  -> Lemma
  (requires (Vale.AES.AES_s.is_aes_key_LE alg key))
  (ensures (Vale.AES.AES_s.aes_encrypt_LE alg key input_LE == Vale.AES.AES_s.eval_cipher alg
    input_LE (Vale.AES.AES_s.key_to_round_keys_LE alg key)))
val finish_aes_encrypt_le : alg:algorithm -> input_LE:quad32 -> key:(seq nat32)
  -> Lemma
  (requires (Vale.AES.AES_s.is_aes_key_LE alg key))
  (ensures (Vale.AES.AES_s.aes_encrypt_LE alg key input_LE == Vale.AES.AES_s.eval_cipher alg
    input_LE (Vale.AES.AES_s.key_to_round_keys_LE alg key)))

    alg: Vale.AES.AES_common_s.algorithm ->
    input_LE: Vale.X64.Decls.quad32 ->
    key: FStar.Seq.Base.seq Vale.X64.Memory.nat32
  -> FStar.Pervasives.Lemma (requires Vale.AES.AES_s.is_aes_key_LE alg key)
      (ensures
        Vale.AES.AES_s.aes_encrypt_LE alg key input_LE ==
        Vale.AES.AES_s.eval_cipher alg input_LE (Vale.AES.AES_s.key_to_round_keys_LE alg key))