···33let guard p err = if p then Ok () else Error err
4455let ( let* ) = Result.bind
66-77-open Sexplib0.Sexp_conv
88-let sexp_of_z z = sexp_of_string (Z.to_string z)
99-let z_of_sexp s = Z.of_string (string_of_sexp s)
-50
pk/dh.ml
···11open Mirage_crypto.Uncommon
22-open Sexplib0.Sexp_conv
3243open Common
54···1110 q : Z.t option ; (* `gg`'s order, maybe *)
1211}
13121414-let sexp_of_group g =
1515- Sexplib0.Sexp.List
1616- [
1717- sexp_of_pair sexp_of_string sexp_of_z ("p", g.p) ;
1818- sexp_of_pair sexp_of_string sexp_of_z ("gg", g.gg) ;
1919- sexp_of_pair sexp_of_string (sexp_of_option sexp_of_z) ("q", g.q)
2020- ]
2121-2222-let group_of_sexp = function
2323- | Sexplib0.Sexp.List [ p ; gg ; q ] as s ->
2424- let p_str, p = pair_of_sexp string_of_sexp z_of_sexp p in
2525- let gg_str, gg = pair_of_sexp string_of_sexp z_of_sexp gg in
2626- let q_str, q = pair_of_sexp string_of_sexp (option_of_sexp z_of_sexp) q in
2727- if p_str = "p" && gg_str = "gg" && q_str = "q" then
2828- { p ; gg ; q }
2929- else
3030- raise (Of_sexp_error (Failure "expected p, gg, and q", s))
3131- | s -> raise (Of_sexp_error (Failure "expected a list with 3 elements", s))
3232-3313let group ~p ~gg ?q () =
3414 let* () =
3515 guard (Z.(p > zero && is_odd p) && Z_extra.pseudoprime p)
···4020 in
4121 Ok { p ; gg ; q }
42224343-let group_of_sexp s =
4444- let g = group_of_sexp s in
4545- match group ~p:g.p ~gg:g.gg ?q:g.q () with
4646- | Error (`Msg m) -> invalid_arg "bad group: %s" m
4747- | Ok g -> g
4848-4923type secret = { group : group ; x : Z.t }
5050-5151-let sexp_of_secret s =
5252- Sexplib0.Sexp.List
5353- [
5454- sexp_of_pair sexp_of_string sexp_of_group ("group", s.group) ;
5555- sexp_of_pair sexp_of_string sexp_of_z ("x", s.x) ;
5656- ]
5757-5858-let secret_of_sexp = function
5959- | Sexplib0.Sexp.List [ group ; x ] as s ->
6060- let group_str, group = pair_of_sexp string_of_sexp group_of_sexp group in
6161- let x_str, x = pair_of_sexp string_of_sexp z_of_sexp x in
6262- if group_str = "group" && x_str = "x" then
6363- { group ; x }
6464- else
6565- raise (Of_sexp_error (Failure "expected group and x", s))
6666- | s -> raise (Of_sexp_error (Failure "expected a list with 2 elements", s))
6767-6868-let secret_of_sexp sexp =
6969- let s = secret_of_sexp sexp in
7070- if Z.(one < s.x && s.x < s.group.p) then
7171- s
7272- else
7373- invalid_arg "bad secret"
74247525(*
7626 * Estimates of equivalent-strength exponent sizes for the moduli sizes.
-31
pk/dsa.ml
···11open Mirage_crypto.Uncommon
22-open Sexplib0.Sexp_conv
3243open Common
5465type pub = { p : Z.t ; q : Z.t ; gg : Z.t ; y : Z.t }
7688-let sexp_of_pub { p ; q ; gg ; y } =
99- sexp_of_list (sexp_of_pair sexp_of_string sexp_of_z)
1010- [ "p", p; "q", q; "gg", gg; "y", y ]
1111-1212-let pub_of_sexp s =
1313- match list_of_sexp (pair_of_sexp string_of_sexp z_of_sexp) s with
1414- | [ "p", p; "q", q; "gg", gg; "y", y ] -> { p ; q ; gg ; y }
1515- | _ -> raise (Of_sexp_error (Failure "expected p, q, gg, and y'", s))
1616-177let pub ?(fips = false) ~p ~q ~gg ~y () =
188 let* () = guard Z.(one < gg && gg < p) (`Msg "bad generator") in
199 let* () = guard (Z_extra.pseudoprime q) (`Msg "q is not prime") in
···3020 Ok ()
3121 in
3222 Ok { p ; q ; gg ; y }
3333-3434-let pub_of_sexp s =
3535- let p = pub_of_sexp s in
3636- match pub ?fips:None ~p:p.p ~q:p.q ~gg:p.gg ~y:p.y () with
3737- | Ok p -> p
3838- | Error (`Msg m) -> invalid_arg "bad public %s" m
39234024type priv =
4125 { p : Z.t ; q : Z.t ; gg : Z.t ; x : Z.t ; y : Z.t }
42264343-let sexp_of_priv { p ; q ; gg ; x ; y } =
4444- sexp_of_list (sexp_of_pair sexp_of_string sexp_of_z)
4545- [ "p", p; "q", q; "gg", gg; "x", x; "y", y ]
4646-4747-let priv_of_sexp s =
4848- match list_of_sexp (pair_of_sexp string_of_sexp z_of_sexp) s with
4949- | [ "p", p; "q", q; "gg", gg; "x", x; "y", y ] -> { p ; q ; gg ; x ; y }
5050- | _ -> raise (Of_sexp_error (Failure "expected p, q, gg, x, and y'", s))
5151-5227let priv ?fips ~p ~q ~gg ~x ~y () =
5328 let* _ = pub ?fips ~p ~q ~gg ~y () in
5429 let* () = guard Z.(zero < x && x < q) (`Msg "x not in 1..q-1") in
5530 let* () = guard Z.(y = powm gg x p) (`Msg "y <> g ^ x mod p") in
5631 Ok { p ; q ; gg ; x ; y }
5757-5858-let priv_of_sexp s =
5959- let p = priv_of_sexp s in
6060- match priv ?fips:None ~p:p.p ~q:p.q ~gg:p.gg ~x:p.x ~y:p.y () with
6161- | Ok p -> p
6262- | Error (`Msg m) -> invalid_arg "bad private %s" m
63326433let pub_of_priv { p; q; gg; y; _ } = { p; q; gg; y }
6534
···3030 e : Z.t ; (** Public exponent *)
3131 n : Z.t ; (** Modulus *)
3232 }
3333- (** The public portion of the key.
3434-3535- {e [Sexplib] convertible}. *)
3333+ (** The public portion of the key. *)
36343735 val pub : e:Z.t -> n:Z.t -> (pub, [> `Msg of string ]) result
3836 (** [pub ~e ~n] validates the public key: [1 < e < n], [n > 0],
···5553 Some systems assume otherwise. When using keys produced by a system that
5654 computes [u = p^(-1) mod q], either exchange [p] with [q] and [dp] with
5755 [dq], or re-generate the full private key using
5858- {{!priv_of_primes}[priv_of_primes]}.
5959-6060- {e [Sexplib] convertible}. *)
5656+ {{!priv_of_primes}[priv_of_primes]}. *)
61576258 val priv : e:Z.t -> d:Z.t -> n:Z.t -> p:Z.t -> q:Z.t -> dp:Z.t -> dq:Z.t ->
6359 q':Z.t -> (priv, [> `Msg of string ]) result
···282278283279 @raise Invalid_argument if message is a [`Digest] of the wrong size. *)
284280 end
285285-286286- (**/**)
287287- val pub_of_sexp : Sexplib0.Sexp.t -> pub
288288- val sexp_of_pub : pub -> Sexplib0.Sexp.t
289289-290290- val priv_of_sexp : Sexplib0.Sexp.t -> priv
291291- val sexp_of_priv : priv -> Sexplib0.Sexp.t
292292- (**/**)
293293-294281end
295282296283···306293 x : Z.t ; (** Private key proper *)
307294 y : Z.t ; (** Public component *)
308295 }
309309- (** Private key. [p], [q] and [gg] comprise {i domain parameters}.
310310-311311- {e [Sexplib] convertible}. *)
296296+ (** Private key. [p], [q] and [gg] comprise {i domain parameters}. *)
312297313298 val priv : ?fips:bool -> p:Z.t -> q:Z.t -> gg:Z.t -> x:Z.t -> y:Z.t -> unit ->
314299 (priv, [> `Msg of string ]) result
···323308 gg : Z.t ;
324309 y : Z.t ;
325310 }
326326- (** Public key, a subset of {{!type-priv}private key}.
327327-328328- {e [Sexplib] convertible}. *)
311311+ (** Public key, a subset of {{!type-priv}private key}. *)
329312330313 val pub : ?fips:bool -> p:Z.t -> q:Z.t -> gg:Z.t -> y:Z.t -> unit ->
331314 (pub, [> `Msg of string ]) result
···396379 (** [generate key digest] deterministically takes the given private key and
397380 message digest to a [k] suitable for seeding the signing process. *)
398381 end
399399-400400- (**/**)
401401- val pub_of_sexp : Sexplib0.Sexp.t -> pub
402402- val sexp_of_pub : pub -> Sexplib0.Sexp.t
403403-404404- val priv_of_sexp : Sexplib0.Sexp.t -> priv
405405- val sexp_of_priv : priv -> Sexplib0.Sexp.t
406406- (**/**)
407407-408382end
409383410384···425399 gg : Z.t ; (** generator *)
426400 q : Z.t option ; (** subgroup order; potentially unknown *)
427401 }
428428- (** A DH group.
429429-430430- {e [Sexplib] convertible}. *)
402402+ (** A DH group. *)
431403432404 val group : p:Z.t -> gg:Z.t -> ?q:Z.t -> unit ->
433405 (group, [> `Msg of string ]) result
···435407 and greater than [zero]. [gg] must be in the range [1 < gg < p]. *)
436408437409 type secret = private { group : group ; x : Z.t }
438438- (** A private key.
439439-440440- {e [Sexplib] convertible.} *)
410410+ (** A private key. *)
441411442412 val modulus_size : group -> bits
443413 (** Bit size of the modulus. *)
···505475 val ffdhe8192 : group
506476507477 end
508508-509509- (**/**)
510510- val group_of_sexp : Sexplib0.Sexp.t -> group
511511- val sexp_of_group : group -> Sexplib0.Sexp.t
512512-513513- val secret_of_sexp : Sexplib0.Sexp.t -> secret
514514- val sexp_of_secret : secret -> Sexplib0.Sexp.t
515515- (**/**)
516516-517478end
518479519480(** {b Z} Convert Z to big endian Cstruct.t and generate random Z values. *)
-33
pk/rsa.ml
···11open Mirage_crypto.Uncommon
22-open Sexplib0.Sexp_conv
3243open Common
54···35343635type pub = { e : Z.t ; n : Z.t }
37363838-let sexp_of_pub { e ; n } =
3939- sexp_of_list (sexp_of_pair sexp_of_string sexp_of_z)
4040- [ "e", e ; "n" , n ]
4141-4242-let pub_of_sexp s =
4343- match list_of_sexp (pair_of_sexp string_of_sexp z_of_sexp) s with
4444- | [ "e", e ; "n", n ] -> { e ; n }
4545- | _ -> raise (Of_sexp_error (Failure "expected e and n", s))
4646-4737(* due to PKCS1 *)
4838let minimum_octets = 12
4939let minimum_bits = 8 * minimum_octets - 7
···6555 these are not requirements, neither for RSA nor for powm_sec *)
6656 Ok { e ; n }
67576868-let pub_of_sexp s =
6969- let p = pub_of_sexp s in
7070- match pub ~e:p.e ~n:p.n with
7171- | Ok p -> p
7272- | Error (`Msg m) -> failwith "bad public key: %s" m
7373-7458type priv = {
7559 e : Z.t ; d : Z.t ; n : Z.t ;
7660 p : Z.t ; q : Z.t ; dp : Z.t ; dq : Z.t ; q' : Z.t
7761}
78627979-let sexp_of_priv { e ; d ; n ; p ; q ; dp ; dq ; q' } =
8080- sexp_of_list (sexp_of_pair sexp_of_string sexp_of_z)
8181- [ "e", e; "d", d; "n", n; "p", p; "q", q; "dp", dp; "dq", dq; "q'", q' ]
8282-8383-let priv_of_sexp s =
8484- match list_of_sexp (pair_of_sexp string_of_sexp z_of_sexp) s with
8585- | [ "e", e; "d", d; "n", n; "p", p; "q", q; "dp", dp; "dq", dq; "q'", q' ] ->
8686- { e ; d ; n ; p ; q ; dp ; dq ; q' }
8787- | _ ->
8888- raise (Of_sexp_error (Failure "expected e, d, n, p, q, dp, dq, and q'", s))
8989-9063let valid_prime name p =
9164 guard Z.(p > zero && is_odd p && Z_extra.pseudoprime p)
9265 (`Msg ("invalid prime " ^ name))
···11992 (`Msg "1 <> d * e mod lcm (p - 1) (q - 1)")
12093 in
12194 Ok { e ; d ; n ; p ; q ; dp ; dq ; q' }
122122-123123-let priv_of_sexp s =
124124- let p = priv_of_sexp s in
125125- match priv ~e:p.e ~d:p.d ~n:p.n ~p:p.p ~q:p.q ~dp:p.dp ~dq:p.dq ~q':p.q' with
126126- | Error (`Msg m) -> failwith "invalid private key %s" m
127127- | Ok p -> p
1289512996let priv_of_primes ~e ~p ~q =
13097 let* () = valid_prime "p" p in
+19-20
tests/test_rsa.ml
···3737let gen_rsa ~bits =
3838 let e = Z.(if bits < 24 then ~$3 else ~$0x10001) in
3939 let key = Rsa.(generate ~e ~bits ()) in
4040- let key_s = Sexplib0.Sexp.to_string_hum Rsa.(sexp_of_priv key) in
4140 assert_equal
4242- ~msg:Printf.(sprintf "key size not %d bits:\n%s" bits key_s)
4141+ ~msg:Printf.(sprintf "key size not %d bits" bits)
4342 bits Rsa.(priv_bits key);
4444- (key, key_s)
4343+ key
45444645let rsa_priv_of_primes_regression _ =
4746 let e = Z.of_string "65537"
···8988 Cstruct.set_uint8 cs 0 0;
9089 Cstruct.(set_uint8 cs i (get_uint8 cs i lor 2));
9190 cs in
9292- let (key, key_s) = gen_rsa ~bits in
9191+ let key = gen_rsa ~bits in
9392 let enc = Rsa.(encrypt ~key:(pub_of_priv key) msg) in
9493 let dec = Rsa.(decrypt ~key enc) in
95949695 assert_cs_equal
9797- ~msg:Printf.(sprintf "failed decryption with:\n%s" key_s)
9696+ ~msg:Printf.(sprintf "failed decryption with")
9897 msg dec
999810099let show_key_size key =
···107106108107let rsa_pkcs1_encode_selftest ~bits n =
109108 "selftest" >:: times ~n @@ fun _ ->
110110- let (key, _) = gen_rsa ~bits
111111- and msg = pkcs_message_for_bits bits in
112112- let sgn = Rsa.PKCS1.sig_encode ~key msg in
109109+ let key = gen_rsa ~bits
110110+ and msg = pkcs_message_for_bits bits in
111111+ let sgn = Rsa.PKCS1.sig_encode ~key msg in
113112 match Rsa.(PKCS1.sig_decode ~key:(pub_of_priv key) sgn) with
114113 | None -> assert_failure ("unpad failure " ^ show_key_size key)
115114 | Some dec -> assert_cs_equal msg dec
···118117let rsa_pkcs1_sign_selftest n =
119118 let open Hash.SHA1 in
120119 "selftest" >:: times ~n @@ fun _ ->
121121- let (key, _) = gen_rsa ~bits:(Rsa.PKCS1.min_key `SHA1)
122122- and msg = Mirage_crypto_rng.generate 47 in
123123- let pkey = Rsa.pub_of_priv key in
120120+ let key = gen_rsa ~bits:(Rsa.PKCS1.min_key `SHA1)
121121+ and msg = Mirage_crypto_rng.generate 47 in
122122+ let pkey = Rsa.pub_of_priv key in
124123 assert_bool "invert 1" Rsa.PKCS1.(
125124 verify ~key:pkey ~hashp:any (`Message msg)
126125 ~signature:(sign ~hash:`SHA1 ~key (`Digest (digest msg))) );
···130129131130let rsa_pkcs1_encrypt_selftest ~bits n =
132131 "selftest" >:: times ~n @@ fun _ ->
133133- let (key, _) = gen_rsa ~bits
134134- and msg = pkcs_message_for_bits bits in
135135- let enc = Rsa.(PKCS1.encrypt ~key:(pub_of_priv key) msg) in
132132+ let key = gen_rsa ~bits
133133+ and msg = pkcs_message_for_bits bits in
134134+ let enc = Rsa.(PKCS1.encrypt ~key:(pub_of_priv key) msg) in
136135 match Rsa.PKCS1.decrypt ~key enc with
137136 | None -> assert_failure ("unpad failure " ^ show_key_size key)
138137 | Some dec -> assert_cs_equal msg dec
···143142 "selftest" >:: times ~n @@ fun _ ->
144143 let module H = (val (Hash.module_of (sample hashes))) in
145144 let module OAEP = Rsa.OAEP (H) in
146146- let (key, _) = gen_rsa ~bits
147147- and msg = Mirage_crypto_rng.generate (bits // 8 - 2 * H.digest_size - 2) in
148148- let enc = OAEP.encrypt ~key:(Rsa.pub_of_priv key) msg in
145145+ let key = gen_rsa ~bits
146146+ and msg = Mirage_crypto_rng.generate (bits // 8 - 2 * H.digest_size - 2) in
147147+ let enc = OAEP.encrypt ~key:(Rsa.pub_of_priv key) msg in
149148 match OAEP.decrypt ~key enc with
150149 | None -> assert_failure "unpad failure"
151150 | Some dec -> assert_cs_equal msg dec ~msg:"recovery failure"
···154153 let module Pss_sha1 = Rsa.PSS (Hash.SHA1) in
155154 let open Hash.SHA1 in
156155 "selftest" >:: times ~n @@ fun _ ->
157157- let (key, _) = gen_rsa ~bits
158158- and msg = Mirage_crypto_rng.generate 1024 in
159159- let pkey = Rsa.pub_of_priv key in
156156+ let key = gen_rsa ~bits
157157+ and msg = Mirage_crypto_rng.generate 1024 in
158158+ let pkey = Rsa.pub_of_priv key in
160159 Pss_sha1.(verify ~key:pkey (`Message msg)
161160 ~signature:(sign ~key (`Digest (digest msg))))
162161 |> assert_bool "invert 1" ;