Definition b := (c+p)%nat.(* 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.Definition hash_words_padded : Blist -> Blist :=
    hash_words ∘ splitAndPad.Definition app_fpad (x : Blist) : Blist :=
    x ++ fpad.Definition h_star_pad k x :=
    app_fpad (h_star k x).(* The "two-key" version of GHMAC and HMAC. *)
  (* Concatenate (K xor opad) and (K xor ipad) *)
  Definition GHMAC_2K (k : Blist) m :=
    let (k_Out, k_In) := splitList b k in (* concat earlier, then split *)
      let h_in := (hash_words_padded (k_In ++ m)) in
        hash_words_padded (k_Out ++ h_in).Definition HMAC_2K (k : Blist) (m : Blist) :=
    (* GHMAC_2K k (splitAndPad m). *)
    GHMAC_2K k m.Definition HMAC (k : Blist) :=
    HMAC_2K (BLxor k opad ++ BLxor k ipad).Definition convert (l : list int) : list bool :=
  bytesToBits (intlist_to_bytelist l).

(* Specifications: *)
Lemma front_equiv b d (DB32: (d*32)%nat = b): forall (back : Blist) (BACK : list int) (front : Blist) (FRONT : list int), (length front)%nat = b -> (length FRONT)%nat = d -> front ++ back = convert (FRONT ++ BACK) -> front = convert FRONT.
Lemma back_equiv b d (DB32: (d*32)%nat = b): forall (back : Blist) (BACK : list int) (front : Blist) (FRONT : list int), (length front)%nat = b -> (length FRONT)%nat = d -> front ++ back = convert (FRONT ++ BACK) -> back = convert BACK.