Module HMAC_SHA256 := HP.HMAC_FUN SHA256.
Definition Ipad := Byte.repr 54. (*0x36*)
Definition Opad := Byte.repr 92. (*0x5c*)
Definition HMAC256 := HMAC_SHA256.HMAC Ipad Opad.
Definition HMACString (txt passwd:string): list byte :=
HMAC256 (str_to_bytes txt) (str_to_bytes passwd).
Definition HMACHex (text password:string): list byte :=
HMAC256 (hexstring_to_bytelist text) (hexstring_to_bytelist password).
Definition check password text digest :=
bytelist_eq (HMACString text password) (hexstring_to_bytelist digest) = true.
(*a random example, solution obtained via http://www.freeformatter.com/hmac-generator.html#ad-output*)
Goal check "bb" "aa"
"c1201d3dccfb84c069771d07b3eda4dc26e5b34a4d8634b2bba84fb54d11e265".
vm_compute. reflexivity. Qed.
vm_compute. reflexivity. Qed.
Definition checkHex password text digest :=
bytelist_eq (HMACHex text password) (hexstring_to_bytelist digest) = true.
vm_compute. reflexivity. Qed.
vm_compute. reflexivity. Qed.
vm_compute. reflexivity. Qed.
vm_compute. reflexivity. Qed.
(*Test with a truncation of output to 128 bits, ie the first 16 bytes*)
Definition checkHexTrunc password text digest :=
bytelist_eq (firstn 16 (HMACHex text password)) (hexstring_to_bytelist digest) = true.
vm_compute. reflexivity. Qed.
vm_compute. reflexivity. Qed.

Lemma RFC4231_Section4_8_hex: (*called PRF-6 in RFC4868*)
checkHex "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"5468697320697320612074657374207573696e672061206c6172676572207468616e20626c6f636b2d73697a65206b657920616e642061206c6172676572207468616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565647320746f20626520686173686564206265666f7265206265696e6720757365642062792074686520484d414320616c676f726974686d2e"
"9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2".