(*Module HMAC_Pad.Declare Module HF:HP.HASH_FUNCTION.*)
Module HM:= HP.HMAC_FUN HF.

Theorem HMAC_pad_concrete' splitandpad c p (B: (0< b c p)%nat) (BS: (HF.BlockSize * 8)%nat =b c p) (DB32: (I.d*32 =b c p)%nat) ir (*ie initial_regs*) gap (*ie generate_and_pad*) (GAP: forall bits, NPeano.Nat.divide I.d (length (gap (bitsToBytes bits)))) (sap_gap: splitandpad = fun bits => bytesToBits (intlist_to_bytelist (gap (bitsToBytes bits)))) (HSH: forall (m:list byte), HF.Hash m = intlist_to_bytelist (I.hashblocks ir (gap m))) (K : list byte) (M : list byte) (OP IP : byte) (k m : Blist) (op ip : Blist): length K = HF.BlockSize -> bytes_bits_lists k K -> bytes_bits_lists m M -> bytes_bits_lists op (HM.sixtyfour OP) -> bytes_bits_lists ip (HM.sixtyfour IP) -> bytes_bits_lists (HMAC c p B I.shah (convert ir) splitandpad op ip k m) (HM.HmacCore IP OP M K).