(*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.

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.