(*The function occurring in the VST spec of mbedtls' random function ie no additional input*)
Definition mbedtls_generate s I n :=
match mbedtls_HMAC256_DRBG_generate_function s I n []
with ENTROPY.success (bytes, J) ss =>
match J with ((((VV, KK), RC), _), PR) =>
Some (bytes, ss, HMAC256DRBGabs KK VV RC (hmac256drbgabs_entropy_len I) PR
(hmac256drbgabs_reseed_interval I))
end
| _ => None
end.

(* Specifications: *)
Lemma Bridge' s I n bytes F ss (M: mbedtls_generate s I n = Some(bytes, ss, F)):
match I with HMAC256DRBGabs K V reseed_counter entropy_len prediction_resistance reseed_interval =>
reseed_counter <= reseed_interval -> prediction_resistance = false ->
match F with HMAC256DRBGabs KK VV rc _ _ _ =>
s=ss /\ rc=reseed_counter+1 /\
FunGenerate reseed_interval (V,K,reseed_counter) n = DRBG_functions.generate_algorithm_success bytes ((VV,KK), rc)
end end.
Lemma Bridge_ok' s I (n:nat) bytes F ss (M: mbedtls_generate s I (32 * Z.of_nat n) = Some(bytes, ss, F)) (N:(0 < n)%nat):
match I with HMAC256DRBGabs k v reseed_counter entropy_len prediction_resistance reseed_interval =>
reseed_counter <= reseed_interval -> prediction_resistance = false ->
forall (KL: Datatypes.length (bytesToBits k) = 256%nat) (VL:Datatypes.length (bytesToBits v) = 256%nat),
match F with HMAC256DRBGabs KK VV rc _ _ _ =>
s=ss /\ rc=reseed_counter+1 /\
match GenUpdate_original_core (Blist.of_list_length _ KL, Blist.of_list_length _ VL) n with (blocks, kv) =>
bitsToBytes (@Vector.to_list _ 256 (fst kv)) = KK /\
bitsToBytes (@Vector.to_list _ 256 (snd kv)) = VV /\
bytes = firstn (32 * n) (bitsToBytes (Fold.flatten (map (@Vector.to_list _ 256) blocks)))
end
end end.
Lemma GenUpdate_original_core_length: forall n state l m
(G: GenUpdate_original_core state n = (l,m)),
Datatypes.length l = n%nat.
Lemma fold_vector_length: forall l m,
fold_left
(fun (acc : nat) (a : Vector.t bool 256) =>
(acc + Datatypes.length (Vector.to_list a))%nat) l m =
(m + Datatypes.length l * 256)%nat.
Lemma mbedtls_generate_Bridge s I (n:nat) bytes F ss (M: mbedtls_generate s I (32 * Z.of_nat n) = Some(bytes, ss, F)) (N:(0 < n)%nat):
match I with HMAC256DRBGabs k v reseed_counter entropy_len prediction_resistance reseed_interval =>
reseed_counter <= reseed_interval -> prediction_resistance = false ->
forall (KL: Datatypes.length (bytesToBits k) = 256%nat) (VL:Datatypes.length (bytesToBits v) = 256%nat),
match F with HMAC256DRBGabs KK VV rc _ _ _ =>
s=ss /\ rc=reseed_counter+1 /\
match GenUpdate_original_core (Blist.of_list_length _ KL, Blist.of_list_length _ VL) n with (blocks, kv) =>
bitsToBytes (@Vector.to_list _ 256 (fst kv)) = KK /\
bitsToBytes (@Vector.to_list _ 256 (snd kv)) = VV /\
bytes = (bitsToBytes (Fold.flatten (map (@Vector.to_list _ 256) blocks)))
end
end end.