Set Implicit Arguments.
(*Parameter c:nat. Parameter p:nat. Parameter b:nat.*)
Module HMAC_Concat.
Section HMAC.
Variable c:nat.
Variable p:nat.
Definition b := (c+p)%nat.
Variable B: (0<b)%nat.
(* The compression function *)
Variable h : Blist -> Blist -> Blist.
(* The initialization vector is part of the spec of the hash function. *)
Variable iv : Blist.
(* The iteration of the compression function gives a keyed hash function on lists of words. *)
Definition h_star k (m : Blist) :=
hash_blocks_bits b B h k m.
(* The composition of the keyed hash function with the IV.*)
Definition hash_words := h_star iv.
(* splitAndPad concat'ed, normal fold replaced by firstn/splitn manual fold *)
Variable splitAndPad : Blist -> Blist.
(* fpad can be a constant *)
Variable fpad : Blist -> Blist.
Definition app_fpad (x : Blist) : Blist :=
x ++ fpad x.
Definition h_star_pad k x :=
app_fpad (h_star k x).
(* The "two-key" version of GHMAC and HMAC. *)
Definition GHMAC_2K (k : Blist) m :=
let (k_Out, k_In) := splitList b k in
let h_in := (hash_words (k_In ++ m)) in
hash_words (k_Out ++ app_fpad h_in).
Definition HMAC_2K (k : Blist) (m : Blist) :=
GHMAC_2K k (splitAndPad m).
(* opad and ipad are constants defined in the HMAC spec. *)
Variable opad ipad : Blist.
Definition HMAC (k : Blist) :=
HMAC_2K (BLxor k opad ++ BLxor k ipad).
(*The following hypotheses and constructions from the abstract spec do not need to be enforced/repeated here  Hypothesis splitAndPad_1_1 : forall b1 b2, splitAndPad b1 = splitAndPad b2 -> b1 = b2.  Definition GNMAC k m := let (k_Out, k_In) := splitList c k in h k_Out (app_fpad (h_star k_In m)).  Hypothesis opad_ne_ipad : opad <> ipad.  Definition GHMAC (k : Blist) := GHMAC_2K (BLxor k opad ++ BLxor k ipad). *)
End HMAC.

Lemma h_star_eq :
sha.HMAC_spec_pad.h_star = h_star.