Source file primitives.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
let pub_of_z ~e ~n = Mirage_crypto_pk.Rsa.pub ~e ~n
let pub_to_z (key : Mirage_crypto_pk.Rsa.pub) =
Mirage_crypto_pk.Rsa.(key.e, key.n)
let sign hash priv data =
let module H = (val (Digestif.module_of_hash' hash)) in
let data = H.to_raw_string (H.digest_string data) in
let ecdsa (r, s) = r ^ s in
match priv with
| `RSA key -> Mirage_crypto_pk.Rsa.PKCS1.sign ~key ~hash (`Digest data)
| `P256 key -> ecdsa (Mirage_crypto_ec.P256.Dsa.sign ~key data)
| `P384 key -> ecdsa (Mirage_crypto_ec.P384.Dsa.sign ~key data)
| `P521 key -> ecdsa (Mirage_crypto_ec.P521.Dsa.sign ~key data)
| _ -> assert false
let verify hash pub data signature =
let module H = (val (Digestif.module_of_hash' hash)) in
let data = H.to_raw_string (H.digest_string data) in
match pub with
| `RSA key ->
let hashp h = h = hash in
Mirage_crypto_pk.Rsa.PKCS1.verify ~hashp ~key ~signature (`Digest data)
| `P256 key when String.length signature = 64 ->
let s = String.sub signature 0 32, String.sub signature 32 32 in
Mirage_crypto_ec.P256.Dsa.verify ~key s data
| `P384 key when String.length signature = 96 ->
let s = String.sub signature 0 48, String.sub signature 48 48 in
Mirage_crypto_ec.P384.Dsa.verify ~key s data
| `P521 key when String.length signature = 132 ->
let s = String.sub signature 0 66, String.sub signature 66 66 in
Mirage_crypto_ec.P521.Dsa.verify ~key s data
| _ -> false
let sha256 x =
Digestif.SHA256.(to_raw_string (digest_string x))