1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let generate_state () =
let open Cryptokit in
let rng = Random.device_rng "/dev/urandom" in
transform_string (Hexa.encode ()) (Random.string rng 32)
let generate_code_verifier () =
let open Cryptokit in
let rng = Random.device_rng "/dev/urandom" in
transform_string (Hexa.encode ()) (Random.string rng 128)
let generate_code_challenge verifier =
let hasher = Cryptokit.Hash.sha256 () in
hasher#add_string verifier;
let base64_string = Base64.encode_string ~pad:false hasher#result in
String.map (function '+' -> '-' | '/' -> '_' | c -> c) base64_string
let form_encode p =
p |> List.map (fun (k,v) -> Printf.sprintf "%s=%s" k v)
|> String.concat "&"
|> Cohttp_lwt.Body.of_string