1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465(**
* Copyright 2022 Ulrik Strid. All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the LICENSE file.
*)(* https://www.rfc-editor.org/rfc/rfc3986#section-2.3 can also contain "." and
"~" but we already have 64 characters
*)letalphabet=Base64.make_alphabet"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"letoctets=96(* 4 * (96/3) = 128 *)letbase64_encodes=Base64.encode_string~alphabet~pad:falsesmoduleVerifier=structtypet=string(* https://www.rfc-editor.org/rfc/rfc7636#section-4.1 *)letmake()=Mirage_crypto_rng.generateoctets|>base64_encodeletof_strings=sendmoduleChallenge=struct(* https://www.rfc-editor.org/rfc/rfc7636#section-4.2 *)typet=|Plainofstring|S256ofstringtypetransformation=[`S256|`Plain](* We MUST create sha256 since we can
https://www.rfc-editor.org/rfc/rfc7636#section-4.2 *)letmakeverifier=lets256_challenge_string=Digestif.SHA256.digest_stringverifier|>Digestif.SHA256.to_raw_string|>base64_encodeinS256s256_challenge_stringletof_string~transformationchallenge=matchtransformationwith|`S256->S256challenge|`Plain->Plainchallenge(* https://www.rfc-editor.org/rfc/rfc7636#section-4.3 *)letto_code_challenge_and_methodchallenge=matchchallengewith|Plainchallenge->challenge,"plain"|S256challenge->challenge,"S256"end(* https://www.rfc-editor.org/rfc/rfc7636#section-4.6 *)letverify(verifier:Verifier.t)(challenge:Challenge.t)=matchchallengewith|S256c->let[@warning"-8"](Challenge.S256v)=Challenge.makeverifierinEqaf.equalvc|Plainc->Eqaf.equalverifierc