Section HMAC.
Variable c:nat.
Variable p:nat.
Definition b := (c+p)%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 : list (Blist)) :=
fold_left h m k.
(* The composition of the keyed hash function with the IV. *)
Definition hash_words := h_star iv.
Variable splitAndPad : Blist -> list (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) :: nil).
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 fpad_list_concat_eq :
HMAC_List.app_fpad = HMAC_Concat.app_fpad.