1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let hmac ~(hash : string -> string) ~(block : int) (key : string) (message : string) : string =
let key = if String.length key > block then hash key else key in
let key = key ^ String.make (block - String.length key) '\000' in
let xored c = String.map (fun k -> Char.chr (Char.code k lxor c)) key in
hash (xored 0x5c ^ hash (xored 0x36 ^ message))
let sha256 = hmac ~hash:Sha256.digest ~block:64
let sha384 = hmac ~hash:Sha512.digest384 ~block:128