SparsePostQuantumRatchet/proofs/fstar/models/Libcrux_ml_kem.Hash_functions.fsti
2025-05-01 10:28:23 -07:00

72 lines
3.5 KiB
Text

module Libcrux_ml_kem.Hash_functions
#set-options "--fuel 0 --ifuel 1 --z3rlimit 80"
open Core
open FStar.Mul
/// The SHA3 block size.
let v_BLOCK_SIZE: usize = mk_usize 168
/// The size of 3 SHA3 blocks.
let v_THREE_BLOCKS: usize = v_BLOCK_SIZE *! mk_usize 3
/// Abstraction for the hashing, to pick the fastest version depending on the
/// platform features available.
/// There are 3 instantiations of this trait right now, using the libcrux-sha3 crate.
/// - AVX2
/// - NEON
/// - Portable
class t_Hash (v_Self: Type0) (v_K: usize) = {
f_G_pre:input: t_Slice u8 -> pred: Type0{true ==> pred};
f_G_post:input: t_Slice u8 -> result: t_Array u8 (mk_usize 64)
-> pred: Type0{pred ==> result == Spec.Utils.v_G input};
f_G:x0: t_Slice u8
-> Prims.Pure (t_Array u8 (mk_usize 64)) (f_G_pre x0) (fun result -> f_G_post x0 result);
f_H_pre:input: t_Slice u8 -> pred: Type0{true ==> pred};
f_H_post:input: t_Slice u8 -> result: t_Array u8 (mk_usize 32)
-> pred: Type0{pred ==> result == Spec.Utils.v_H input};
f_H:x0: t_Slice u8
-> Prims.Pure (t_Array u8 (mk_usize 32)) (f_H_pre x0) (fun result -> f_H_post x0 result);
f_PRF_pre:v_LEN: usize -> input: t_Slice u8 -> pred: Type0{v v_LEN < pow2 32 ==> pred};
f_PRF_post:v_LEN: usize -> input: t_Slice u8 -> result: t_Array u8 v_LEN
-> pred: Type0{pred ==> v v_LEN < pow2 32 ==> result == Spec.Utils.v_PRF v_LEN input};
f_PRF:v_LEN: usize -> x0: t_Slice u8
-> Prims.Pure (t_Array u8 v_LEN) (f_PRF_pre v_LEN x0) (fun result -> f_PRF_post v_LEN x0 result);
f_PRFxN_pre:v_LEN: usize -> input: t_Array (t_Array u8 (mk_usize 33)) v_K
-> pred: Type0{v v_LEN < pow2 32 /\ (v v_K == 2 \/ v v_K == 3 \/ v v_K == 4) ==> pred};
f_PRFxN_post:
v_LEN: usize ->
input: t_Array (t_Array u8 (mk_usize 33)) v_K ->
result: t_Array (t_Array u8 v_LEN) v_K
-> pred:
Type0
{ pred ==>
(v v_LEN < pow2 32 /\ (v v_K == 2 \/ v v_K == 3 \/ v v_K == 4)) ==>
result == Spec.Utils.v_PRFxN v_K v_LEN input };
f_PRFxN:v_LEN: usize -> x0: t_Array (t_Array u8 (mk_usize 33)) v_K
-> Prims.Pure (t_Array (t_Array u8 v_LEN) v_K)
(f_PRFxN_pre v_LEN x0)
(fun result -> f_PRFxN_post v_LEN x0 result);
f_shake128_init_absorb_final_pre:input: t_Array (t_Array u8 (mk_usize 34)) v_K
-> pred: Type0{true ==> pred};
f_shake128_init_absorb_final_post:t_Array (t_Array u8 (mk_usize 34)) v_K -> v_Self -> Type0;
f_shake128_init_absorb_final:x0: t_Array (t_Array u8 (mk_usize 34)) v_K
-> Prims.Pure v_Self
(f_shake128_init_absorb_final_pre x0)
(fun result -> f_shake128_init_absorb_final_post x0 result);
f_shake128_squeeze_first_three_blocks_pre:self_: v_Self -> pred: Type0{true ==> pred};
f_shake128_squeeze_first_three_blocks_post:
v_Self ->
(v_Self & t_Array (t_Array u8 (mk_usize 504)) v_K)
-> Type0;
f_shake128_squeeze_first_three_blocks:x0: v_Self
-> Prims.Pure (v_Self & t_Array (t_Array u8 (mk_usize 504)) v_K)
(f_shake128_squeeze_first_three_blocks_pre x0)
(fun result -> f_shake128_squeeze_first_three_blocks_post x0 result);
f_shake128_squeeze_next_block_pre:self_: v_Self -> pred: Type0{true ==> pred};
f_shake128_squeeze_next_block_post:v_Self -> (v_Self & t_Array (t_Array u8 (mk_usize 168)) v_K)
-> Type0;
f_shake128_squeeze_next_block:x0: v_Self
-> Prims.Pure (v_Self & t_Array (t_Array u8 (mk_usize 168)) v_K)
(f_shake128_squeeze_next_block_pre x0)
(fun result -> f_shake128_squeeze_next_block_post x0 result)
}