Definition Done (i:Z): int := Int.repr (digest_len*i).Definition OUTpred PrkCont InfoCont sh z r cont p: mpred:=
  data_at sh (tarray tuchar z) (sublist 0 z (map Vubyte (HKDF_expand PrkCont InfoCont cont))) p *
  memory_block sh r (offset_val z p).Definition PREVcont PRK INFO (i: Z): reptype (Tarray tuchar 32 noattr) :=
     if zeq i 0 then list_repeat 32 Vundef 
     else (map Vubyte (Ti (CONT PRK) (CONT INFO) (Z.to_nat i))).

(* Specifications: *)
Lemma PREV_len PRK INFO i: 0 <= i -> Zlength (PREVcont PRK INFO i) = 32.
Lemma PREV_listbyte PRK INFO i: 0 < i -> exists l, PREVcont PRK INFO i = map Vubyte l.
Lemma body_hkdf_expand: semax_body Hkdf_VarSpecs Hkdf_FunSpecs f_HKDF_expand HKDF_expand_spec.