···11-# mirage-crypto - Cryptographic primitives for MirageOS
11+# crypto - Cryptographic primitives for OCaml
2233-%%VERSION%%
33+> **Warning**: This is an experimental fork of [mirage-crypto](https://github.com/mirage/mirage-crypto).
44+> Do not use in production. Use [mirage-crypto](https://github.com/mirage/mirage-crypto) instead.
55+66+This fork renames the packages and removes Lwt/Miou dependencies, keeping only
77+Eio-compatible code. It is intended for experimentation only.
88+99+## Original mirage-crypto
410511mirage-crypto is a small cryptographic library that puts emphasis on the
612applicative style and ease of use. It includes basic ciphers (AES, 3DES, RC4,
···13191420Mirage-crypto is a fork of the
1521[ocaml-nocrypto](https://github.com/mirleft/ocaml-nocrypto) written by David
1616-Kaloper. It was forked with the permission of the original author in order to
2222+Kaloper. It was forked with the permission of the original author in order to
1723facilitate changes (e.g. build system) required by Mirage that the upstream
1824didn't have time to keep up with.
1919-2020-Mirage-crypto-rng embeds the former mirage-entropy opam package, which
2121-implements various entropy sources:
2222-- non-deterministic execution time (used at initial seeding, see the [whirlwind RNG paper](https://www.ieee-security.org/TC/SP2014/papers/Not-So-RandomNumbersinVirtualizedLinuxandtheWhirlwindRNG.pdf))
2323-- a hook into the Lwt event loop that collects a timestamp of each event
2424-- rdseed and rdrand (x86/x86-64 only)
2525-2626-[API documentation online](https://mirage.github.io/mirage-crypto/doc)
27252826## Build
2927···4038seed it.
41394240```OCaml
4343-let () = Mirage_crypto_rng_unix.use_default ()
4141+let () = Crypto_rng_unix.use_default ()
4442```
+1-9
bench/dune
···11(executables
22 (names speed)
33 (modules speed)
44- (libraries mirage-crypto mirage-crypto-rng mirage-crypto-rng.unix
55- mirage-crypto-pk mirage-crypto-ec))
66-77-; marking as "(optional)" leads to OCaml-CI failures
88-; marking with "(package mirage-crypto-rng-miou-unix)" only has an effect with a "public_name"
99-;(executables
1010-; (names miou)
1111-; (modules miou)
1212-; (libraries mirage-crypto-rng-miou-unix))
44+ (libraries crypto crypto-rng crypto-rng.unix crypto-pk crypto-ec))
-91
bench/miou.ml
···11-open Mirage_crypto
22-33-module Time = struct
44-55- let time ~n f a =
66- let t1 = Sys.time () in
77- for _ = 1 to n do ignore (f a) done ;
88- let t2 = Sys.time () in
99- (t2 -. t1)
1010-1111- let warmup () =
1212- let x = ref 0 in
1313- let rec go start =
1414- if Sys.time () -. start < 1. then begin
1515- for i = 0 to 10000 do x := !x + i done ;
1616- go start
1717- end in
1818- go (Sys.time ())
1919-2020-end
2121-2222-let burn_period = 2.0
2323-2424-let sizes = [16; 64; 256; 1024; 8192]
2525-(* let sizes = [16] *)
2626-2727-let burn f n =
2828- let buf = Mirage_crypto_rng.generate n in
2929- let (t1, i1) =
3030- let rec loop it =
3131- let t = Time.time ~n:it f buf in
3232- if t > 0.2 then (t, it) else loop (it * 10) in
3333- loop 10 in
3434- let iters = int_of_float (float i1 *. burn_period /. t1) in
3535- let time = Time.time ~n:iters f buf in
3636- (iters, time, float (n * iters) /. time)
3737-3838-let mb = 1024. *. 1024.
3939-4040-let throughput title f =
4141- Printf.printf "\n* [%s]\n%!" title ;
4242- sizes |> List.iter @@ fun size ->
4343- Gc.full_major () ;
4444- let (iters, time, bw) = burn f size in
4545- Printf.printf " % 5d: %04f MB/s (%d iters in %.03f s)\n%!"
4646- size (bw /. mb) iters time
4747-4848-let bm name f = (name, fun () -> f name)
4949-5050-let benchmarks = [
5151- bm "pfortuna" (fun name ->
5252- let open Mirage_crypto_rng_miou_unix.Pfortuna in
5353- Miou_unix.run ~domains:2 @@ fun () ->
5454- let rng = Mirage_crypto_rng_miou_unix.(initialize (module Pfortuna)) in
5555- let g = create () in
5656- reseed ~g "abcd" ;
5757- throughput name (fun buf ->
5858- let buf = Bytes.unsafe_of_string buf in
5959- generate_into ~g buf ~off:0 (Bytes.length buf));
6060- Mirage_crypto_rng_miou_unix.kill rng) ;
6161-]
6262-6363-let help () =
6464- Printf.printf "available benchmarks:\n ";
6565- List.iter (fun (n, _) -> Printf.printf "%s " n) benchmarks ;
6666- Printf.printf "\n%!"
6767-6868-let runv fs =
6969- Format.printf "accel: %a\n%!"
7070- (fun ppf -> List.iter @@ fun x ->
7171- Format.fprintf ppf "%s " @@
7272- match x with `XOR -> "XOR" | `AES -> "AES" | `GHASH -> "GHASH")
7373- accelerated;
7474- Time.warmup () ;
7575- List.iter (fun f -> f ()) fs
7676-7777-7878-let () =
7979- let seed = "abcd" in
8080- let g = Mirage_crypto_rng.(create ~seed (module Fortuna)) in
8181- Mirage_crypto_rng.set_default_generator g;
8282- match Array.to_list Sys.argv with
8383- | _::(_::_ as args) -> begin
8484- try
8585- let fs =
8686- args |> List.map @@ fun n ->
8787- snd (benchmarks |> List.find @@ fun (n1, _) -> n = n1) in
8888- runv fs
8989- with Not_found -> help ()
9090- end
9191- | _ -> help ()
+113-113
bench/speed.ml
···11-open Mirage_crypto
11+open Crypto
2233module Time = struct
44···2525(* let sizes = [16] *)
26262727let burn f n =
2828- let buf = Mirage_crypto_rng.generate n in
2828+ let buf = Crypto_rng.generate n in
2929 let (t1, i1) =
3030 let rec loop it =
3131 let t = Time.time ~n:it f buf in
···7878let msg_str_48 = String.sub msg_str 0 48
7979let msg_str_65 = String.sub msg_str 0 65
80808181-module PSS = Mirage_crypto_pk.Rsa.PSS(Digestif.SHA256)
8181+module PSS = Crypto_pk.Rsa.PSS(Digestif.SHA256)
82828383let rsa_1024 =
8484 let p = Z.of_string "10798561676627454710140432432014696449593673631094049392368450463276546091610832740190717321579865870896133380991892468262437092547408603618427685009427773"
8585 and q = Z.of_string "10400664760062606994038747844895625872750212488858602663971334563613232045185857177383833781411830934303117994128623611996670112272953487791473086751129863"
8686 and e = Z.of_string "65537"
8787 in
8888- match Mirage_crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false
8888+ match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false
89899090-let enc_1024 = Mirage_crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_1024) msg_str)
9090+let enc_1024 = Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_1024) msg_str)
91919292let pkcs1_sig_1024 () =
9393- Mirage_crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key:rsa_1024 (`Message msg_str)
9393+ Crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key:rsa_1024 (`Message msg_str)
94949595let pkcs1_enc_1024 () =
9696- Mirage_crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv rsa_1024) msg_str)
9696+ Crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv rsa_1024) msg_str)
97979898let pss_sig_1024 () = PSS.sign ~key:rsa_1024 (`Message msg_str)
9999···102102 and q = Z.of_string "146461957885839900502732892013745315236120923895767594427579857452138451155393985820080680192640369593315439290134409437965406213465262989382655388410330601076036910359057156988645246773259111682038096388585157599977808854893528900530706460128823381760931962351810679571404043148961709991714582814015259432029"
103103 and e = Z.of_string "65537"
104104 in
105105- match Mirage_crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false
105105+ match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false
106106107107-let enc_2048 = Mirage_crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_2048) msg_str)
107107+let enc_2048 = Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_2048) msg_str)
108108109109let pkcs1_sig_2048 () =
110110- Mirage_crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key:rsa_2048 (`Message msg_str)
110110+ Crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key:rsa_2048 (`Message msg_str)
111111112112let pkcs1_enc_2048 () =
113113- Mirage_crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv rsa_2048) msg_str)
113113+ Crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv rsa_2048) msg_str)
114114115115let pss_sig_2048 () = PSS.sign ~key:rsa_2048 (`Message msg_str)
116116···119119 and q = Z.of_string "25905916162566396401205858643227945415345838368190515936191926936462899261314859092468495558719305083654714669527919862817831941531613073577910643681172802147392797914485263753968375221243705167910636382434485717071007054833155618588980128488599406663210791261135710551020276087851551652652612955553056226986980360600996201307035494196112173475664509878923172924086102889718336621725968169373963280305056864698229857913526607314633711315503607289470716733189135747457446349029256257187264165837635026903463931381823712962360342258652047970731347111703873301687821992467888598546386551115261010493902143134851640738743"
120120 and e = Z.of_string "65537"
121121 in
122122- match Mirage_crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false
122122+ match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false
123123124124-let enc_4096 = Mirage_crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_4096) msg_str)
124124+let enc_4096 = Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_4096) msg_str)
125125126126let pkcs1_sig_4096 () =
127127- Mirage_crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key:rsa_4096 (`Message msg_str)
127127+ Crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key:rsa_4096 (`Message msg_str)
128128129129let pkcs1_enc_4096 () =
130130- Mirage_crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv rsa_4096) msg_str)
130130+ Crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv rsa_4096) msg_str)
131131132132let pss_sig_4096 () = PSS.sign ~key:rsa_4096 (`Message msg_str)
133133···138138 and x = Z.of_string "33269272469299670210735451373406214067383586377"
139139 and y = Z.of_string "43917635707590891841908570055721669604556135044554274942460553515946670787931699807386932177837523342760860376770220825997328312057886461226985675983491441562087492365801663397409369541614646669226917344513472367438132106373179011858311945451923744651780314133078253880297369792145807736223662521868826642853"
140140 in
141141- match Mirage_crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false
141141+ match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false
142142143143-let dsa_sig_1024 () = Mirage_crypto_pk.Dsa.sign ~key:dsa_1024 msg_str
143143+let dsa_sig_1024 () = Crypto_pk.Dsa.sign ~key:dsa_1024 msg_str
144144145145let dsa_2048 =
146146 let p = Z.of_string "27787495469795504213817302334103600594688179071059183073859876165757248559489321478170600304273914000462158587756787453177210321379060448141559798652196363556897576291878245650614903612762833777567911000834171168229784178643222849655095281437320492725855855778320111645629834980350492228611813830302209080760811887894272862901026864911346096471199762409562102789142939773632891860019140618313962854554152891445175391927591825205548689170996430765723064763763481336517107917261869303217480777161449935319930795628114622197586510378927239068257979584784079128534248603619156372913573809491691986354447396965646770535701"
···149149 and x = Z.of_string "52860861934156228997899838985740859941028688506510055821449681896336427977580"
150150 and y = Z.of_string "16697822339875604612001674517725789858937385326266245308648897963274039128000291572870559603618903431422492771498840266582664620626826186158140214481920146230768719356298465470274085841064126012204317638870338958089054809559680905413861272320951150917299685355736888023985398767858005440235842845908452598291689850063919053521400020402671375982259094019780813889586357332424647365679629398571364161673401249910198031061651183589601097975488702613291524957230624044246866866974886847601585171352897595544769649242723658395277456627024303041369757410970512818793143517329469213213147704583953410882515213978051041273924"
151151 in
152152- match Mirage_crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false
152152+ match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false
153153154154-let dsa_sig_2048 () = Mirage_crypto_pk.Dsa.sign ~key:dsa_2048 msg_str
154154+let dsa_sig_2048 () = Crypto_pk.Dsa.sign ~key:dsa_2048 msg_str
155155156156let dsa_3072 =
157157 let p = Z.of_string "4944862491052787177238323499959371418651354629231656321315236369672827559263545931134286049323485061071828187289578269594065783019111035804017538871324004047710342711620233110167493989997579634523303899794913823240058891327833786211541568251787338957336540247816021098378292806006955851897646808403078979142749428669072523191276645021175423303816467433407072660616741824124536840773744646488191896772232795413707995397140064396495425700133866462410490239713815308709711960470201906326732033816522202617817869465691798938486540955726912350768931476362143768721380759395525951947017232778140349423557015356082357043807910825817719748257213281893007933859227824276579765323175836008193865064772817200047353825332039369252224256435661514851653526942065285711420907389170574343434449883875510985495078384130667046036846831401643151166834922210257258578675547742596423035828159461629721005113634334227074529533688136165903014911127"
···160160 and x = Z.of_string "57079433780483458942713357293831115449694380253611914431677328021806898761674"
161161 and y = Z.of_string "2872172233173100601346399502391482510148300641600207189246652621232656647081281141886455256814187251102030580186748870087277263359506423691023579912476503628426574690699263443704236625550832436226673947182294798279064154375422081421444400893924415563728656687773617245084962617886701420982288621397340217078717788290878177343138178149109067141997920049624616209300715994802074480057682676445987819355778630849636079364539062466859717465892222793824712941403252645431023939220711618233660062829520555618350855085688062241702521140104357981881833598269736147371800258828202964600523335598361833482597511071900975835195171061421945579132277176597724513608746614358311884564512362186106480065540201711903122228315570389409204443391052987813355120223856839756971514334338065850104261467285471383663470187296456006848469765768400814476981451863643010333596484259098557995874127140419649424228480234701334240448168704764430867915060"
162162 in
163163- match Mirage_crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false
163163+ match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false
164164165165-let dsa_sig_3072 () = Mirage_crypto_pk.Dsa.sign ~key:dsa_3072 msg_str
165165+let dsa_sig_3072 () = Crypto_pk.Dsa.sign ~key:dsa_3072 msg_str
166166167167let dh_groups =
168168- ["oakley5 (1536)",Mirage_crypto_pk.Dh.Group.oakley_5;
169169- "oakley14 (2048)",Mirage_crypto_pk.Dh.Group.oakley_14;
170170- "ffdhe2048",Mirage_crypto_pk.Dh.Group.ffdhe2048;
171171- "ffdhe3072",Mirage_crypto_pk.Dh.Group.ffdhe3072;
172172- "ffdhe4096",Mirage_crypto_pk.Dh.Group.ffdhe4096;
173173- "ffdhe6144",Mirage_crypto_pk.Dh.Group.ffdhe6144]
168168+ ["oakley5 (1536)",Crypto_pk.Dh.Group.oakley_5;
169169+ "oakley14 (2048)",Crypto_pk.Dh.Group.oakley_14;
170170+ "ffdhe2048",Crypto_pk.Dh.Group.ffdhe2048;
171171+ "ffdhe3072",Crypto_pk.Dh.Group.ffdhe3072;
172172+ "ffdhe4096",Crypto_pk.Dh.Group.ffdhe4096;
173173+ "ffdhe6144",Crypto_pk.Dh.Group.ffdhe6144]
174174175175let dh_secrets =
176176 List.map2 (fun (n, group) s ->
177177- (n, group), Mirage_crypto_pk.Dh.key_of_secret group ~s)
177177+ (n, group), Crypto_pk.Dh.key_of_secret group ~s)
178178 dh_groups
179179- (List.map (fun s -> Z.of_string s |> Mirage_crypto_pk.Z_extra.to_octets_be)
179179+ (List.map (fun s -> Z.of_string s |> Crypto_pk.Z_extra.to_octets_be)
180180 [
181181 "31271182055444024732867835946284871743952969208281694762833912267184" ;
182182 "27594341083884344999714422172371027333192426063917478556668524561591" ;
···188188189189let ecdsa_p256 =
190190 Result.get_ok
191191- (Mirage_crypto_ec.P256.Dsa.priv_of_octets
191191+ (Crypto_ec.P256.Dsa.priv_of_octets
192192 "\x08\x9f\x4f\xfc\xcc\xf9\xba\x13\xfe\xdd\x09\x42\xef\x08\xcf\x2d\x90\x9f\x32\xe2\x93\x4a\xb5\xc9\x3b\x6c\x99\xbe\x5a\x9f\xf5\x27")
193193194194-let ecdsa_p256_sig () = Mirage_crypto_ec.P256.Dsa.sign ~key:ecdsa_p256 msg_str_32
194194+let ecdsa_p256_sig () = Crypto_ec.P256.Dsa.sign ~key:ecdsa_p256 msg_str_32
195195196196let ecdsa_p384 =
197197 Result.get_ok
198198- (Mirage_crypto_ec.P384.Dsa.priv_of_octets
198198+ (Crypto_ec.P384.Dsa.priv_of_octets
199199 "\xf5\xc0\xc9\xfb\x95\x17\x86\x41\xaf\x76\xf3\x83\x1f\x41\xe2\xd3\x7c\xfa\xaf\xff\xc7\xe6\x01\x72\xcf\xb0\x89\xfe\x60\x4b\x56\xa6\x1c\x7c\x31\xa6\x90\x4b\x3b\x5d\x08\x20\x7a\x4b\x81\xe2\x5e\xa5")
200200201201-let ecdsa_p384_sig () = Mirage_crypto_ec.P384.Dsa.sign ~key:ecdsa_p384 msg_str_48
201201+let ecdsa_p384_sig () = Crypto_ec.P384.Dsa.sign ~key:ecdsa_p384 msg_str_48
202202203203let ecdsa_p521 =
204204 Result.get_ok
205205- (Mirage_crypto_ec.P521.Dsa.priv_of_octets
205205+ (Crypto_ec.P521.Dsa.priv_of_octets
206206 "\x00\xb1\x8f\x60\xc0\x35\x2a\xd8\xe3\xef\x98\x2f\x1d\xdf\xcf\x6e\xec\x7f\xa6\xca\xf0\xe6\xf3\x68\x35\x4a\x8b\x02\xb2\xd8\xac\x1e\x05\x9e\x30\x98\x91\xe2\xbf\xa8\x57\x91\xa5\xe7\x1b\x40\xbd\xec\xbf\x90\x2b\xf2\x43\xdc\x3b\x00\x80\x49\x5c\xf4\xd9\x1c\x78\x72\x8b\xd5")
207207208208-let ecdsa_p521_sig () = Mirage_crypto_ec.P521.Dsa.sign ~key:ecdsa_p521 msg_str_65
208208+let ecdsa_p521_sig () = Crypto_ec.P521.Dsa.sign ~key:ecdsa_p521 msg_str_65
209209210210let ed25519 =
211211- Result.get_ok (Mirage_crypto_ec.Ed25519.priv_of_octets
211211+ Result.get_ok (Crypto_ec.Ed25519.priv_of_octets
212212 "\x3e\x0a\xb6\x82\x17\x12\x75\xc5\x69\xfc\xe9\xca\x8b\xcc\xd2\xd2\x77\x14\x54\xa2\x30\x0c\x35\x29\xf7\xa4\xd8\x0b\x84\x38\x83\xbc")
213213214214-let ed25519_sig () = Mirage_crypto_ec.Ed25519.sign ~key:ed25519 msg_str
214214+let ed25519_sig () = Crypto_ec.Ed25519.sign ~key:ed25519 msg_str
215215216216let ecdsas = [
217217 ("P256", `P256 (ecdsa_p256, ecdsa_p256_sig ()));
···222222223223let ecdh_shares =
224224 [
225225- ("P256", `P256 (Mirage_crypto_ec.P256.Dh.secret_of_octets "\x47\x0d\x57\x70\x6c\x77\x06\xb6\x8a\x3f\x42\x3a\xea\xf4\xff\x7f\xdd\x02\x49\x4a\x10\xd3\xe3\x81\xc3\xc1\x1f\x72\x76\x80\x2c\xdc" |> Result.get_ok |> fst,
225225+ ("P256", `P256 (Crypto_ec.P256.Dh.secret_of_octets "\x47\x0d\x57\x70\x6c\x77\x06\xb6\x8a\x3f\x42\x3a\xea\xf4\xff\x7f\xdd\x02\x49\x4a\x10\xd3\xe3\x81\xc3\xc1\x1f\x72\x76\x80\x2c\xdc" |> Result.get_ok |> fst,
226226 "\x04\x11\xb3\xfc\x82\x72\x1c\x26\x9a\x19\x90\x9a\x3b\x2f\xc2\x6d\x98\x95\x82\x6d\x0c\xfc\xbc\x1f\x76\x26\xe4\x88\xf0\x1f\x4c\xa6\xb5\xc5\xed\x76\xad\xee\x7a\xf8\x1b\xb2\x0b\x17\xcf\x23\x1c\xbf\x0c\x67\xdb\x02\x95\xd6\x8d\x1d\x92\xc2\xd2\xa5\xa8\x06\x38\xd7\x8d"));
227227- ("P384", `P384 (Mirage_crypto_ec.P384.Dh.secret_of_octets "\xee\x55\xe2\x9b\x61\x75\x2d\x5a\x3e\x52\x56\x56\xdb\x8b\xd8\xfe\x6f\x94\xfa\xb8\xaa\xcc\x9e\x92\xac\xff\x4c\x48\x12\xbf\x7a\x61\x87\xab\xa4\x6c\xc6\x0a\xb8\xf0\x8e\xfc\xf2\xd5\x74\x58\x4b\x74" |> Result.get_ok |> fst,
227227+ ("P384", `P384 (Crypto_ec.P384.Dh.secret_of_octets "\xee\x55\xe2\x9b\x61\x75\x2d\x5a\x3e\x52\x56\x56\xdb\x8b\xd8\xfe\x6f\x94\xfa\xb8\xaa\xcc\x9e\x92\xac\xff\x4c\x48\x12\xbf\x7a\x61\x87\xab\xa4\x6c\xc6\x0a\xb8\xf0\x8e\xfc\xf2\xd5\x74\x58\x4b\x74" |> Result.get_ok |> fst,
228228 "\x04\x04\x89\xcf\x24\xbc\x80\xbf\x89\xfd\xfe\x9c\x05\xec\xc3\x9f\x69\x16\xad\x45\x09\xd9\x39\x85\x97\x95\x0d\x3d\x24\xe8\x28\xf6\xbf\x56\xba\x4a\xd6\xd2\x1e\xd7\x86\x3b\xed\x68\xe4\x13\x36\x4b\xd4\xc7\xb1\xe9\x04\x7d\x36\x12\x4c\x69\x53\xbe\x7c\x61\x20\x9c\xb3\xfc\x56\x45\x2f\x73\x05\x29\x37\x83\xc7\xc0\xed\x92\x9d\x6c\x98\xc7\xbc\x97\xf6\x0a\x72\xed\x22\x69\xa8\xeb\x19\xbb\x7e\xe1\x31"));
229229- ("P521", `P521 (Mirage_crypto_ec.P521.Dh.secret_of_octets "\x00\xaa\x47\x0b\xa1\xcc\x84\x3b\xa3\x14\x82\x1e\x72\xde\x4c\xd2\x99\xae\xc1\xf2\x6e\x9d\x64\xa0\xd8\x7d\xb1\x8a\x3d\xa9\xf6\x5c\x45\xec\xfc\xc5\x61\x7f\xf0\xd7\x3b\x2e\x0e\x1c\xdf\xf8\x04\x8e\x01\xbe\x5e\x20\x14\x94\x12\xe7\xdb\xfa\xb7\xfe\xae\x24\x9b\x1b\xfa\x4d" |> Result.get_ok |> fst,
229229+ ("P521", `P521 (Crypto_ec.P521.Dh.secret_of_octets "\x00\xaa\x47\x0b\xa1\xcc\x84\x3b\xa3\x14\x82\x1e\x72\xde\x4c\xd2\x99\xae\xc1\xf2\x6e\x9d\x64\xa0\xd8\x7d\xb1\x8a\x3d\xa9\xf6\x5c\x45\xec\xfc\xc5\x61\x7f\xf0\xd7\x3b\x2e\x0e\x1c\xdf\xf8\x04\x8e\x01\xbe\x5e\x20\x14\x94\x12\xe7\xdb\xfa\xb7\xfe\xae\x24\x9b\x1b\xfa\x4d" |> Result.get_ok |> fst,
230230 "\x04\x00\x1d\x16\x29\xee\xb1\xc4\x25\xf9\x04\xd7\x55\x33\x00\x79\xd1\x3c\x77\xda\x92\x1e\x01\xcf\x50\xd7\x17\xe0\xd6\x85\x0a\x81\xa3\x90\x2b\xb9\x2a\x03\xfa\xea\xcb\xd6\x28\x9c\x15\x90\x68\x5a\x60\x44\xb5\xe9\x4d\xcf\xc4\x1d\xeb\x6a\x88\xdb\x62\xa8\x91\xb0\xb8\x93\xbb\x00\xe4\x2a\x66\xb2\xf0\x13\xbd\xd0\xd2\x7d\x8e\x07\xcb\x35\xfc\x3e\x2c\x2b\x22\xf9\x3e\xcf\xd5\xea\xb7\x88\x61\x97\xca\x07\x3c\x2c\x5e\x68\x31\xd6\x5e\x2d\x0b\x8a\xa4\x08\x43\x8e\x49\x54\x2f\x05\xf4\x1c\x57\x6d\xf7\x0e\x3c\xaf\x5b\xb8\x22\x7d\x48\x30\x94\xae\x58"));
231231- ("X25519", `X25519 (Mirage_crypto_ec.X25519.secret_of_octets "\x4c\x6d\xb7\xcf\x93\x5b\xcf\x84\x02\x61\x78\xd4\x0c\x95\x6a\xf0\x9d\x8e\x36\x32\x03\x49\x0d\x2c\x41\x62\x5a\xcb\x68\xb9\x31\xa4" |> Result.get_ok |> fst,
231231+ ("X25519", `X25519 (Crypto_ec.X25519.secret_of_octets "\x4c\x6d\xb7\xcf\x93\x5b\xcf\x84\x02\x61\x78\xd4\x0c\x95\x6a\xf0\x9d\x8e\x36\x32\x03\x49\x0d\x2c\x41\x62\x5a\xcb\x68\xb9\x31\xa4" |> Result.get_ok |> fst,
232232 "\xca\x19\x19\x3c\xf5\xc0\xb3\x8c\x61\xaa\x01\xc1\x72\xb2\xe9\x3d\x16\xf7\x50\xd0\x84\x62\x77\xad\x32\x2d\xe5\xe4\xfb\x33\x24\x29"));
233233 ]
234234···237237let benchmarks = [
238238239239 bm "rsa-generate" (fun name ->
240240- count name (fun bits -> Mirage_crypto_pk.Rsa.generate ~bits ())
240240+ count name (fun bits -> Crypto_pk.Rsa.generate ~bits ())
241241 string_of_int [1024;2048;4096]) ;
242242243243 bm "rsa-encrypt" (fun name ->
244244- count name (fun key -> Mirage_crypto_pk.Rsa.(encrypt ~key:(pub_of_priv key) msg_str))
245245- (fun k -> string_of_int (Mirage_crypto_pk.Rsa.priv_bits k))
244244+ count name (fun key -> Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv key) msg_str))
245245+ (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k))
246246 [rsa_1024;rsa_2048;rsa_4096]) ;
247247248248 bm "rsa-decrypt" (fun name ->
249249- count name (fun (key, msg) -> Mirage_crypto_pk.Rsa.(decrypt ~key msg))
250250- (fun (k, _) -> string_of_int (Mirage_crypto_pk.Rsa.priv_bits k))
249249+ count name (fun (key, msg) -> Crypto_pk.Rsa.(decrypt ~key msg))
250250+ (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k))
251251 [rsa_1024,enc_1024 ; rsa_2048,enc_2048 ; rsa_4096,enc_4096]) ;
252252253253 bm "rsa-pkcs1-encrypt" (fun name ->
254254- count name (fun key -> Mirage_crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv key) msg_str))
255255- (fun k -> string_of_int (Mirage_crypto_pk.Rsa.priv_bits k))
254254+ count name (fun key -> Crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv key) msg_str))
255255+ (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k))
256256 [rsa_1024;rsa_2048;rsa_4096]) ;
257257258258 bm "rsa-pkcs1-decrypt" (fun name ->
259259- count name (fun (key, msg) -> Mirage_crypto_pk.Rsa.(PKCS1.decrypt ~key msg))
260260- (fun (k, _) -> string_of_int (Mirage_crypto_pk.Rsa.priv_bits k))
259259+ count name (fun (key, msg) -> Crypto_pk.Rsa.(PKCS1.decrypt ~key msg))
260260+ (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k))
261261 [rsa_1024,pkcs1_enc_1024 () ; rsa_2048,pkcs1_enc_2048 () ; rsa_4096,pkcs1_enc_4096 ()]) ;
262262263263 bm "rsa-pkcs1-sign" (fun name ->
264264- count name (fun key -> Mirage_crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key (`Message msg_str))
265265- (fun k -> string_of_int (Mirage_crypto_pk.Rsa.priv_bits k))
264264+ count name (fun key -> Crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key (`Message msg_str))
265265+ (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k))
266266 [rsa_1024;rsa_2048;rsa_4096]) ;
267267268268 bm "rsa-pkcs1-verify" (fun name ->
269269 count name (fun (key, signature) ->
270270- Mirage_crypto_pk.Rsa.(PKCS1.verify ~hashp:(fun _ -> true) ~key:(pub_of_priv key) ~signature (`Message msg_str)))
271271- (fun (k, _) -> string_of_int (Mirage_crypto_pk.Rsa.priv_bits k))
270270+ Crypto_pk.Rsa.(PKCS1.verify ~hashp:(fun _ -> true) ~key:(pub_of_priv key) ~signature (`Message msg_str)))
271271+ (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k))
272272 [rsa_1024,pkcs1_sig_1024 () ; rsa_2048,pkcs1_sig_2048 () ; rsa_4096,pkcs1_sig_4096 ()]) ;
273273274274 bm "rsa-pss-sign" (fun name ->
275275 count name (fun key -> PSS.sign ~key (`Message msg_str))
276276- (fun k -> string_of_int (Mirage_crypto_pk.Rsa.priv_bits k))
276276+ (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k))
277277 [rsa_1024;rsa_2048;rsa_4096]) ;
278278279279 bm "rsa-pss-verify" (fun name ->
280280 count name (fun (key, signature) ->
281281- PSS.verify ~key:(Mirage_crypto_pk.Rsa.pub_of_priv key) ~signature (`Message msg_str))
282282- (fun (k, _) -> string_of_int (Mirage_crypto_pk.Rsa.priv_bits k))
281281+ PSS.verify ~key:(Crypto_pk.Rsa.pub_of_priv key) ~signature (`Message msg_str))
282282+ (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k))
283283 [rsa_1024,pss_sig_1024 () ; rsa_2048,pss_sig_2048 () ; rsa_4096,pss_sig_4096 ()]) ;
284284285285 bm "dsa-generate" (fun name ->
286286- count name (fun ks -> Mirage_crypto_pk.Dsa.generate ks)
286286+ count name (fun ks -> Crypto_pk.Dsa.generate ks)
287287 (function `Fips1024 -> "1024" | `Fips2048 -> "2048" | `Fips3072 -> "3072" | `Exactly (l, _) -> string_of_int l)
288288 [`Fips1024;`Fips2048;`Fips3072]);
289289290290 bm "dsa-sign" (fun name ->
291291- count name (fun key -> Mirage_crypto_pk.Dsa.sign ~key msg_str)
291291+ count name (fun key -> Crypto_pk.Dsa.sign ~key msg_str)
292292 (fun k -> string_of_int (Z.numbits k.p))
293293 [dsa_1024;dsa_2048;dsa_3072]);
294294295295 bm "dsa-verify" (fun name ->
296296 count name (fun (key, signature) ->
297297- Mirage_crypto_pk.Dsa.(verify ~key:(pub_of_priv key) signature msg_str))
297297+ Crypto_pk.Dsa.(verify ~key:(pub_of_priv key) signature msg_str))
298298 (fun (k, _) -> string_of_int (Z.numbits k.p))
299299 [dsa_1024,dsa_sig_1024 () ; dsa_2048,dsa_sig_2048 () ; dsa_3072,dsa_sig_3072 ()]);
300300301301 bm "ecdsa-generate" (fun name ->
302302- let open Mirage_crypto_ec in
302302+ let open Crypto_ec in
303303 count name
304304 (fun (_, x) -> match x with
305305 | `P256 _ -> P256.Dsa.generate () |> ignore
···310310 fst ecdsas);
311311312312 bm "ecdsa-sign" (fun name ->
313313- let open Mirage_crypto_ec in
313313+ let open Crypto_ec in
314314 count name (fun (_, x) -> match x with
315315 | `P256 (key, _) -> P256.Dsa.sign ~key msg_str_32
316316 | `P384 (key, _) -> P384.Dsa.sign ~key msg_str_48
···320320 fst ecdsas);
321321322322 bm "ecdsa-verify" (fun name ->
323323- let open Mirage_crypto_ec in
323323+ let open Crypto_ec in
324324 count name (fun (_, x) -> match x with
325325 | `P256 (key, signature) -> P256.Dsa.(verify ~key:(pub_of_priv key) signature msg_str_32)
326326 | `P384 (key, signature) -> P384.Dsa.(verify ~key:(pub_of_priv key) signature msg_str_48)
···329329 ) fst ecdsas);
330330331331 bm "dh-secret" (fun name ->
332332- count name (fun (_, group) -> Mirage_crypto_pk.Dh.gen_key group)
332332+ count name (fun (_, group) -> Crypto_pk.Dh.gen_key group)
333333 fst dh_groups);
334334335335 bm "dh-share" (fun name ->
336336 count name (fun (_, (sec, share)) ->
337337- Mirage_crypto_pk.Dh.shared sec share)
337337+ Crypto_pk.Dh.shared sec share)
338338 (fun ((g, _), _) -> g) dh_secrets);
339339340340 bm "ecdh-secret" (fun name ->
341341- let open Mirage_crypto_ec in
341341+ let open Crypto_ec in
342342 count name (fun (_, x) -> match x with
343343 | `P256 _ -> P256.Dh.gen_key () |> ignore
344344 | `P384 _ -> P384.Dh.gen_key () |> ignore
···347347 fst ecdh_shares);
348348349349 bm "ecdh-share" (fun name ->
350350- let open Mirage_crypto_ec in
350350+ let open Crypto_ec in
351351 count name (fun (_, x) -> match x with
352352 | `P256 (sec, share) -> P256.Dh.key_exchange sec share |> Result.get_ok |> ignore
353353 | `P384 (sec, share) -> P384.Dh.key_exchange sec share |> Result.get_ok |> ignore
···356356 fst ecdh_shares);
357357358358 bm "chacha20-poly1305" (fun name ->
359359- let key = Chacha20.of_secret (Mirage_crypto_rng.generate 32)
360360- and nonce = Mirage_crypto_rng.generate 8 in
359359+ let key = Chacha20.of_secret (Crypto_rng.generate 32)
360360+ and nonce = Crypto_rng.generate 8 in
361361 throughput_into ~add:Chacha20.tag_size name
362362 (fun dst cs -> Chacha20.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))) ;
363363364364 bm "chacha20-poly1305-unsafe" (fun name ->
365365- let key = Chacha20.of_secret (Mirage_crypto_rng.generate 32)
366366- and nonce = Mirage_crypto_rng.generate 8 in
365365+ let key = Chacha20.of_secret (Crypto_rng.generate 32)
366366+ and nonce = Crypto_rng.generate 8 in
367367 throughput_into ~add:Chacha20.tag_size name
368368 (fun dst cs -> Chacha20.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))) ;
369369370370 bm "aes-128-ecb" (fun name ->
371371- let key = AES.ECB.of_secret (Mirage_crypto_rng.generate 16) in
371371+ let key = AES.ECB.of_secret (Crypto_rng.generate 16) in
372372 throughput_into name
373373 (fun dst cs -> AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
374374375375 bm "aes-192-ecb" (fun name ->
376376- let key = AES.ECB.of_secret (Mirage_crypto_rng.generate 24) in
376376+ let key = AES.ECB.of_secret (Crypto_rng.generate 24) in
377377 throughput_into name (fun dst cs -> AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
378378379379 bm "aes-192-ecb-unsafe" (fun name ->
380380- let key = AES.ECB.of_secret (Mirage_crypto_rng.generate 24) in
380380+ let key = AES.ECB.of_secret (Crypto_rng.generate 24) in
381381 throughput_into name (fun dst cs -> AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
382382383383 bm "aes-256-ecb" (fun name ->
384384- let key = AES.ECB.of_secret (Mirage_crypto_rng.generate 32) in
384384+ let key = AES.ECB.of_secret (Crypto_rng.generate 32) in
385385 throughput_into name (fun dst cs -> AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
386386387387 bm "aes-256-ecb-unsafe" (fun name ->
388388- let key = AES.ECB.of_secret (Mirage_crypto_rng.generate 32) in
388388+ let key = AES.ECB.of_secret (Crypto_rng.generate 32) in
389389 throughput_into name (fun dst cs -> AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
390390391391 bm "aes-128-ecb-unsafe" (fun name ->
392392- let key = AES.ECB.of_secret (Mirage_crypto_rng.generate 16) in
392392+ let key = AES.ECB.of_secret (Crypto_rng.generate 16) in
393393 throughput_into name
394394 (fun dst cs -> AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
395395396396 bm "aes-128-cbc-e" (fun name ->
397397- let key = AES.CBC.of_secret (Mirage_crypto_rng.generate 16)
398398- and iv = Mirage_crypto_rng.generate 16 in
397397+ let key = AES.CBC.of_secret (Crypto_rng.generate 16)
398398+ and iv = Crypto_rng.generate 16 in
399399 throughput_into name
400400 (fun dst cs -> AES.CBC.encrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
401401402402 bm "aes-128-cbc-e-unsafe" (fun name ->
403403- let key = AES.CBC.of_secret (Mirage_crypto_rng.generate 16)
404404- and iv = Mirage_crypto_rng.generate 16 in
403403+ let key = AES.CBC.of_secret (Crypto_rng.generate 16)
404404+ and iv = Crypto_rng.generate 16 in
405405 throughput_into name
406406 (fun dst cs -> AES.CBC.unsafe_encrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
407407408408 bm "aes-128-cbc-e-unsafe-inplace" (fun name ->
409409- let key = AES.CBC.of_secret (Mirage_crypto_rng.generate 16)
410410- and iv = Mirage_crypto_rng.generate 16 in
409409+ let key = AES.CBC.of_secret (Crypto_rng.generate 16)
410410+ and iv = Crypto_rng.generate 16 in
411411 throughput name
412412 (fun cs ->
413413 let b = Bytes.unsafe_of_string cs in
414414 AES.CBC.unsafe_encrypt_into_inplace ~key ~iv b ~dst_off:0 (String.length cs))) ;
415415416416 bm "aes-128-cbc-d" (fun name ->
417417- let key = AES.CBC.of_secret (Mirage_crypto_rng.generate 16)
418418- and iv = Mirage_crypto_rng.generate 16 in
417417+ let key = AES.CBC.of_secret (Crypto_rng.generate 16)
418418+ and iv = Crypto_rng.generate 16 in
419419 throughput_into name
420420 (fun dst cs -> AES.CBC.decrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
421421422422 bm "aes-128-cbc-d-unsafe" (fun name ->
423423- let key = AES.CBC.of_secret (Mirage_crypto_rng.generate 16)
424424- and iv = Mirage_crypto_rng.generate 16 in
423423+ let key = AES.CBC.of_secret (Crypto_rng.generate 16)
424424+ and iv = Crypto_rng.generate 16 in
425425 throughput_into name
426426 (fun dst cs -> AES.CBC.unsafe_decrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
427427428428 bm "aes-128-ctr" (fun name ->
429429- let key = Mirage_crypto_rng.generate 16 |> AES.CTR.of_secret
430430- and ctr = Mirage_crypto_rng.generate 16 |> AES.CTR.ctr_of_octets in
429429+ let key = Crypto_rng.generate 16 |> AES.CTR.of_secret
430430+ and ctr = Crypto_rng.generate 16 |> AES.CTR.ctr_of_octets in
431431 throughput_into name (fun dst cs -> AES.CTR.encrypt_into ~key ~ctr cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
432432433433 bm "aes-128-ctr-unsafe" (fun name ->
434434- let key = Mirage_crypto_rng.generate 16 |> AES.CTR.of_secret
435435- and ctr = Mirage_crypto_rng.generate 16 |> AES.CTR.ctr_of_octets in
434434+ let key = Crypto_rng.generate 16 |> AES.CTR.of_secret
435435+ and ctr = Crypto_rng.generate 16 |> AES.CTR.ctr_of_octets in
436436 throughput_into name (fun dst cs -> AES.CTR.unsafe_encrypt_into ~key ~ctr cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
437437438438 bm "aes-128-gcm" (fun name ->
439439- let key = AES.GCM.of_secret (Mirage_crypto_rng.generate 16)
440440- and nonce = Mirage_crypto_rng.generate 12 in
439439+ let key = AES.GCM.of_secret (Crypto_rng.generate 16)
440440+ and nonce = Crypto_rng.generate 12 in
441441 throughput_into ~add:AES.GCM.tag_size name
442442 (fun dst cs -> AES.GCM.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs)));
443443444444 bm "aes-128-gcm-unsafe" (fun name ->
445445- let key = AES.GCM.of_secret (Mirage_crypto_rng.generate 16)
446446- and nonce = Mirage_crypto_rng.generate 12 in
445445+ let key = AES.GCM.of_secret (Crypto_rng.generate 16)
446446+ and nonce = Crypto_rng.generate 12 in
447447 throughput_into ~add:AES.GCM.tag_size name
448448 (fun dst cs -> AES.GCM.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs)));
449449450450 bm "aes-128-ghash" (fun name ->
451451- let key = AES.GCM.of_secret (Mirage_crypto_rng.generate 16)
452452- and nonce = Mirage_crypto_rng.generate 12 in
451451+ let key = AES.GCM.of_secret (Crypto_rng.generate 16)
452452+ and nonce = Crypto_rng.generate 12 in
453453 throughput_into ~add:AES.GCM.tag_size name
454454 (fun dst cs -> AES.GCM.authenticate_encrypt_into ~key ~nonce ~adata:cs "" ~src_off:0 dst ~dst_off:0 ~tag_off:0 0));
455455456456 bm "aes-128-ghash-unsafe" (fun name ->
457457- let key = AES.GCM.of_secret (Mirage_crypto_rng.generate 16)
458458- and nonce = Mirage_crypto_rng.generate 12 in
457457+ let key = AES.GCM.of_secret (Crypto_rng.generate 16)
458458+ and nonce = Crypto_rng.generate 12 in
459459 throughput_into ~add:AES.GCM.tag_size name
460460 (fun dst cs -> AES.GCM.unsafe_authenticate_encrypt_into ~key ~nonce ~adata:cs "" ~src_off:0 dst ~dst_off:0 ~tag_off:0 0));
461461462462 bm "aes-128-ccm" (fun name ->
463463- let key = AES.CCM16.of_secret (Mirage_crypto_rng.generate 16)
464464- and nonce = Mirage_crypto_rng.generate 10 in
463463+ let key = AES.CCM16.of_secret (Crypto_rng.generate 16)
464464+ and nonce = Crypto_rng.generate 10 in
465465 throughput_into ~add:AES.CCM16.tag_size name
466466 (fun dst cs -> AES.CCM16.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs)));
467467468468 bm "aes-128-ccm-unsafe" (fun name ->
469469- let key = AES.CCM16.of_secret (Mirage_crypto_rng.generate 16)
470470- and nonce = Mirage_crypto_rng.generate 10 in
469469+ let key = AES.CCM16.of_secret (Crypto_rng.generate 16)
470470+ and nonce = Crypto_rng.generate 10 in
471471 throughput_into ~add:AES.CCM16.tag_size name
472472 (fun dst cs -> AES.CCM16.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs)));
473473474474 bm "d3des-ecb" (fun name ->
475475- let key = DES.ECB.of_secret (Mirage_crypto_rng.generate 24) in
475475+ let key = DES.ECB.of_secret (Crypto_rng.generate 24) in
476476 throughput_into name (fun dst cs -> DES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
477477478478 bm "d3des-ecb-unsafe" (fun name ->
479479- let key = DES.ECB.of_secret (Mirage_crypto_rng.generate 24) in
479479+ let key = DES.ECB.of_secret (Crypto_rng.generate 24) in
480480 throughput_into name (fun dst cs -> DES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ;
481481482482 bm "fortuna" (fun name ->
483483 begin[@alert "-deprecated"]
484484- Mirage_crypto_rng_unix.initialize (module Mirage_crypto_rng.Fortuna);
484484+ Crypto_rng_unix.initialize (module Crypto_rng.Fortuna);
485485 throughput name (fun buf ->
486486 let buf = Bytes.unsafe_of_string buf in
487487- Mirage_crypto_rng.generate_into buf ~off:0 (Bytes.length buf))
487487+ Crypto_rng.generate_into buf ~off:0 (Bytes.length buf))
488488 end);
489489490490 bm "getentropy" (fun name ->
491491- Mirage_crypto_rng_unix.use_getentropy ();
491491+ Crypto_rng_unix.use_getentropy ();
492492 throughput name (fun buf ->
493493 let buf = Bytes.unsafe_of_string buf in
494494- Mirage_crypto_rng.generate_into buf ~off:0 (Bytes.length buf))) ;
494494+ Crypto_rng.generate_into buf ~off:0 (Bytes.length buf))) ;
495495496496 bm "urandom" (fun name ->
497497- Mirage_crypto_rng_unix.use_dev_urandom ();
497497+ Crypto_rng_unix.use_dev_urandom ();
498498 throughput name (fun buf ->
499499 let buf = Bytes.unsafe_of_string buf in
500500- Mirage_crypto_rng.generate_into buf ~off:0 (Bytes.length buf))) ;
500500+ Crypto_rng.generate_into buf ~off:0 (Bytes.length buf))) ;
501501]
502502503503let help () =
···517517518518let () =
519519 let seed = "abcd" in
520520- let g = Mirage_crypto_rng.(create ~seed (module Fortuna)) in
521521- Mirage_crypto_rng.set_default_generator g;
520520+ let g = Crypto_rng.(create ~seed (module Fortuna)) in
521521+ Crypto_rng.set_default_generator g;
522522 match Array.to_list Sys.argv with
523523 | _::(_::_ as args) -> begin
524524 try
···3939 val secret_of_octets : ?compress:bool -> string ->
4040 (secret * string, error) result
4141 val secret_to_octets : secret -> string
4242- val gen_key : ?compress:bool -> ?g:Mirage_crypto_rng.g -> unit ->
4242+ val gen_key : ?compress:bool -> ?g:Crypto_rng.g -> unit ->
4343 secret * string
4444 val key_exchange : secret -> string -> (string, error) result
4545end
···5454 val pub_of_octets : string -> (pub, error) result
5555 val pub_to_octets : ?compress:bool -> pub -> string
5656 val pub_of_priv : priv -> pub
5757- val generate : ?g:Mirage_crypto_rng.g -> unit -> priv * pub
5757+ val generate : ?g:Crypto_rng.g -> unit -> priv * pub
5858 val sign : key:priv -> ?k:string -> string -> string * string
5959 val verify : key:pub -> string * string -> string -> bool
6060 module K_gen (H : Digestif.S) : sig
···523523 S.to_octets s
524524525525 let rec generate_private_key ?g () =
526526- let candidate = Mirage_crypto_rng.generate ?g Param.byte_length in
526526+ let candidate = Crypto_rng.generate ?g Param.byte_length in
527527 match S.of_octets candidate with
528528 | Ok secret -> secret
529529 | Error _ -> generate_private_key ?g ()
···640640641641 (* RFC 6979: compute a deterministic k *)
642642 module K_gen (H : Digestif.S) = struct
643643- let drbg : 'a Mirage_crypto_rng.generator =
644644- let module M = Mirage_crypto_rng.Hmac_drbg (H) in (module M)
643643+ let drbg : 'a Crypto_rng.generator =
644644+ let module M = Crypto_rng.Hmac_drbg (H) in (module M)
645645646646 let g ~key msg =
647647- let g = Mirage_crypto_rng.create ~strict:true drbg in
648648- Mirage_crypto_rng.reseed ~g (S.to_octets key ^ msg);
647647+ let g = Crypto_rng.create ~strict:true drbg in
648648+ Crypto_rng.reseed ~g (S.to_octets key ^ msg);
649649 g
650650651651 (* Defined in RFC 6979 sec 2.3.2 with
···672672 let gen g =
673673 let rec go () =
674674 let b = Bytes.create Param.byte_length in
675675- Mirage_crypto_rng.generate_into ~g b Param.byte_length;
675675+ Crypto_rng.generate_into ~g b Param.byte_length;
676676 (* truncate to the desired number of bits *)
677677 let r = bits2int b in
678678 if S.is_in_range r then r else go ()
···694694 (* FIPS 186-4 B 4.2 *)
695695 let d =
696696 let rec one () =
697697- match S.of_octets (Mirage_crypto_rng.generate ?g Param.byte_length) with
697697+ match S.of_octets (Crypto_rng.generate ?g Param.byte_length) with
698698 | Ok x -> x
699699 | Error _ -> one ()
700700 in
···978978 let public priv = scalar_mult priv basepoint
979979980980 let gen_key ?compress:_ ?g () =
981981- let secret = Mirage_crypto_rng.generate ?g key_len in
981981+ let secret = Crypto_rng.generate ?g key_len in
982982 secret, public secret
983983984984 let secret_of_octets ?compress:_ s =
···10721072 let pub_to_octets pub = pub
1073107310741074 let generate ?g () =
10751075- let secret = Mirage_crypto_rng.generate ?g key_len in
10751075+ let secret = Crypto_rng.generate ?g key_len in
10761076 secret, pub_of_priv secret
1077107710781078 let sign ~key msg =
+3-3
ec/mirage_crypto_ec.mli
ec/crypto_ec.mli
···4242 (** [secret_to_octets secret] encodes the provided secret into a freshly
4343 allocated buffer. *)
44444545- val gen_key : ?compress:bool -> ?g:Mirage_crypto_rng.g -> unit ->
4545+ val gen_key : ?compress:bool -> ?g:Crypto_rng.g -> unit ->
4646 secret * string
4747 (** [gen_key ~compress ~g ()] generates a private and a public key for
4848 Ephemeral Diffie-Hellman. If [compress] is provided and [true] (defaults
···107107108108 (** {2 Key generation} *)
109109110110- val generate : ?g:Mirage_crypto_rng.g -> unit -> priv * pub
110110+ val generate : ?g:Crypto_rng.g -> unit -> priv * pub
111111 (** [generate ~g ()] generates a key pair. *)
112112113113 (** {2 Cryptographic operations} *)
···245245246246 (** {2 Key generation} *)
247247248248- val generate : ?g:Mirage_crypto_rng.g -> unit -> priv * pub
248248+ val generate : ?g:Crypto_rng.g -> unit -> priv * pub
249249 (** [generate ~g ()] generates a key pair. *)
250250251251 (** {2 Cryptographic operations} *)
+1-1
ec/native/curve25519_stubs.c
···11-#include "mirage_crypto.h"
11+#include "crypto.h"
2233/* Microsoft compiler does not support 128-bit integers. Drop down to
44 * 32-bit for MSVC.
+1-1
ec/native/np256_stubs.c
···11-#include "mirage_crypto.h"
11+#include "crypto.h"
2233/* Microsoft compiler does not support 128-bit integers. Drop down to
44 * 32-bit for MSVC.
+1-1
ec/native/np384_stubs.c
···11-#include "mirage_crypto.h"
11+#include "crypto.h"
2233/* Microsoft compiler does not support 128-bit integers. Drop down to
44 * 32-bit for MSVC.
+1-1
ec/native/np521_stubs.c
···11-#include "mirage_crypto.h"
11+#include "crypto.h"
2233/* Microsoft compiler does not support 128-bit integers. Drop down to
44 * 32-bit for MSVC.
+1-1
ec/native/p256_stubs.c
···11-#include "mirage_crypto.h"
11+#include "crypto.h"
2233/* Microsoft compiler does not support 128-bit integers. Drop down to
44 * 32-bit for MSVC.
+1-1
ec/native/p384_stubs.c
···11-#include "mirage_crypto.h"
11+#include "crypto.h"
2233/* Microsoft compiler does not support 128-bit integers. Drop down to
44 * 32-bit for MSVC.
+1-1
ec/native/p521_stubs.c
···11-#include "mirage_crypto.h"
11+#include "crypto.h"
2233/* Microsoft compiler does not support 128-bit integers. Drop down to
44 * 32-bit for MSVC.
+9-7
mirage-crypto-ec.opam
crypto-ec.opam
···11opam-version: "2.0"
22-synopsis: "Elliptic Curve Cryptography with primitives taken from Fiat"
22+synopsis: "Elliptic Curve Cryptography (fork of mirage-crypto-ec)"
33description: """
44+WARNING: This is an experimental fork of mirage-crypto-ec. Do not use in production.
55+Use mirage-crypto-ec instead: https://github.com/mirage/mirage-crypto
66+47An implementation of key exchange (ECDH) and digital signature (ECDSA/EdDSA)
58algorithms using code from Fiat (<https://github.com/mit-plv/fiat-crypto>).
69710The curves P256 (SECP256R1), P384 (SECP384R1),
811P521 (SECP521R1), and 25519 (X25519, Ed25519) are implemented by this package.
912"""
1010-maintainer: "Hannes Mehnert <hannes@mehnert.org>"
1313+maintainer: "Thomas Gazagnaire <thomas@gazagnaire.org>"
1114authors: [
1215 "Hannes Mehnert <hannes@mehnert.org>"
1316 "Nathan Rebours <nathan.p.rebours@gmail.com>"
···2225 "Zoe Paraskevopoulou <zoe.paraskevopoulou@gmail.com>"
2326]
2427license: "MIT"
2525-homepage: "https://github.com/mirage/mirage-crypto"
2626-doc: "https://mirage.github.io/mirage-crypto/doc"
2727-bug-reports: "https://github.com/mirage/mirage-crypto/issues"
2828+homepage: "https://git.recoil.org/gazagnaire.org/ocaml-crypto"
2929+bug-reports: "https://git.recoil.org/gazagnaire.org/ocaml-crypto/issues"
2830depends: [
2931 "dune" {>= "2.7"}
3032 "ocaml" {>= "4.13.0"}
3133 "dune-configurator"
3234 "eqaf" {>= "0.7"}
3333- "mirage-crypto-rng" {=version}
3535+ "crypto-rng" {=version}
3436 "digestif" {>= "1.2.0"}
3537 "alcotest" {with-test & >= "0.8.1"}
3638 "ppx_deriving_yojson" {with-test}
···4850 ["dune" "build" "-p" name "-j" jobs]
4951 ["dune" "runtest" "-p" name "-j" jobs] {with-test}
5052]
5151-dev-repo: "git+https://github.com/mirage/mirage-crypto.git"
5353+dev-repo: "git+ssh://git@git.recoil.org/gazagnaire.org/ocaml-crypto.git"
5254tags: ["org:mirage"]
5355x-maintenance-intent: [ "(latest)" ]
···11-let start () =
22- Logs.info (fun m -> m "using Fortuna, entropy sources: %a"
33- Fmt.(list ~sep:(any ", ") Mirage_crypto_rng.Entropy.pp_source)
44- (Mirage_crypto_rng.Entropy.sources ())) ;
55- Logs.info (fun m -> m "64 byte random:@ %a" (Ohex.pp_hexdump ())
66- (Mirage_crypto_rng.generate 64)) ;
77- let n = Bytes.(unsafe_to_string (create 32)) in
88- let key = Mirage_crypto.Chacha20.of_secret n
99- and nonce = Bytes.(unsafe_to_string (create 12))
1010- in
1111- Logs.info (fun m -> m "Chacha20/Poly1305 of 32*0, key 32*0, nonce 12*0: %a"
1212- (Ohex.pp_hexdump ())
1313- (Mirage_crypto.Chacha20.authenticate_encrypt ~key ~nonce n));
1414- let key = Mirage_crypto_pk.Rsa.generate ~bits:4096 () in
1515- let signature =
1616- Mirage_crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key (`Message n)
1717- in
1818- let verified =
1919- let key = Mirage_crypto_pk.Rsa.pub_of_priv key in
2020- let hashp = function `SHA256 -> true | _ -> false in
2121- Mirage_crypto_pk.Rsa.PKCS1.verify ~hashp ~key ~signature (`Message n)
2222- in
2323- Logs.info (fun m -> m "Generated a RSA key of %d bits (sign + verify %B)"
2424- (Mirage_crypto_pk.Rsa.priv_bits key) verified);
2525- Lwt.return_unit
+1-1
pk/dh.ml
···11-open Mirage_crypto.Uncommon
11+open Crypto.Uncommon
2233open Common
44
+6-6
pk/dsa.ml
···11-open Mirage_crypto.Uncommon
11+open Crypto.Uncommon
2233open Common
44···4242 if 3 <= l && 2 <= n then (l, n) else
4343 invalid_arg "Dsa.generate: bits: `Exactly (%d, %d)" l n
44444545-type mask = [ `No | `Yes | `Yes_with of Mirage_crypto_rng.g ]
4545+type mask = [ `No | `Yes | `Yes_with of Crypto_rng.g ]
46464747let expand_mask = function
4848 | `No -> `No
···84848585module K_gen (H : Digestif.S) = struct
86868787- let drbg : 'a Mirage_crypto_rng.generator =
8888- let module M = Mirage_crypto_rng.Hmac_drbg (H) in (module M)
8787+ let drbg : 'a Crypto_rng.generator =
8888+ let module M = Crypto_rng.Hmac_drbg (H) in (module M)
89899090 let z_gen ~key:{ q; x; _ } z =
9191 let repr = Z_extra.to_octets_be ~size:(Z.numbits q // 8) in
9292- let g = Mirage_crypto_rng.create ~strict:true drbg in
9393- Mirage_crypto_rng.reseed ~g (repr x ^ repr Z.(z mod q));
9292+ let g = Crypto_rng.create ~strict:true drbg in
9393+ Crypto_rng.reseed ~g (repr x ^ repr Z.(z mod q));
9494 Z_extra.gen_r ~g Z.one q
95959696 let generate ~key buf =
···7373 (** [priv_of_primes ~e ~p ~q] is the {{!type-priv}private key} derived from the
7474 minimal description [(e, p, q)]. *)
75757676- val priv_of_exp : ?g:Mirage_crypto_rng.g -> ?attempts:int -> e:Z.t -> d:Z.t ->
7676+ val priv_of_exp : ?g:Crypto_rng.g -> ?attempts:int -> e:Z.t -> d:Z.t ->
7777 n:Z.t -> unit -> (priv, [> `Msg of string ]) result
7878 (** [priv_of_exp ?g ?attempts ~e ~d n] is the unique {{!type-priv}private key}
7979 characterized by the public ([e]) and private ([d]) exponents, and modulus
···9595 type 'a or_digest = [ `Message of 'a | `Digest of string ]
9696 (** Either an ['a] or its digest, according to some hash algorithm. *)
97979898- type mask = [ `No | `Yes | `Yes_with of Mirage_crypto_rng.g ]
9898+ type mask = [ `No | `Yes | `Yes_with of Crypto_rng.g ]
9999 (** Masking (cryptographic blinding) mode for the RSA transform with the
100100 private key. Masking does not change the result, but it does change the
101101 timing profile of the operation.
···132132133133 (** {1 Key generation} *)
134134135135- val generate : ?g:Mirage_crypto_rng.g -> ?e:Z.t -> bits:int -> unit -> priv
135135+ val generate : ?g:Crypto_rng.g -> ?e:Z.t -> bits:int -> unit -> priv
136136 (** [generate ~g ~e ~bits ()] is a new {{!type-priv}private key}. The new key is
137137 guaranteed to be well formed, see {!val-priv}.
138138···155155 key size is [priv_bits key / 8], rounded up. *)
156156 module PKCS1 : sig
157157158158- val encrypt : ?g:Mirage_crypto_rng.g -> key:pub -> string -> string
158158+ val encrypt : ?g:Crypto_rng.g -> key:pub -> string -> string
159159 (** [encrypt g key message] is a PKCS1-padded (type 2) and encrypted
160160 [message].
161161···227227 [hlen] is the hash length. *)
228228 module OAEP (H : Digestif.S) : sig
229229230230- val encrypt : ?g:Mirage_crypto_rng.g -> ?label:string -> key:pub ->
230230+ val encrypt : ?g:Crypto_rng.g -> ?label:string -> key:pub ->
231231 string -> string
232232 (** [encrypt ~g ~label ~key message] is {b OAEP}-padded and encrypted
233233 [message], using the optional [label].
···253253 hash length and [slen] is the seed length. *)
254254 module PSS (H: Digestif.S) : sig
255255256256- val sign : ?g:Mirage_crypto_rng.g -> ?crt_hardening:bool ->
256256+ val sign : ?g:Crypto_rng.g -> ?crt_hardening:bool ->
257257 ?mask:mask -> ?slen:int -> key:priv -> string or_digest -> string
258258 (** [sign ~g ~crt_hardening ~mask ~slen ~key message] the [PSS]-padded
259259 digest of [message], signed with the [key]. [crt_hardening] defaults
···322322 L-values ([p] size) and imply the corresponding N ([q] size); The last
323323 variants specifies L and N directly. *)
324324325325- type mask = [ `No | `Yes | `Yes_with of Mirage_crypto_rng.g ]
325325+ type mask = [ `No | `Yes | `Yes_with of Crypto_rng.g ]
326326 (** Masking (cryptographic blinding) option. *)
327327328328 val pub_of_priv : priv -> pub
329329 (** Extract the public component from a private key. *)
330330331331- val generate : ?g:Mirage_crypto_rng.g -> keysize -> priv
331331+ val generate : ?g:Crypto_rng.g -> keysize -> priv
332332 (** [generate g size] is a fresh {{!type-priv}private} key. The domain parameters
333333 are derived using a modified FIPS.186-4 probabilistic process, but the
334334 derivation can not be validated. Note that no time masking is done for the
···416416417417 @raise Invalid_key if [s] is degenerate. *)
418418419419- val gen_key : ?g:Mirage_crypto_rng.g -> ?bits:int -> group -> secret * string
419419+ val gen_key : ?g:Crypto_rng.g -> ?bits:int -> group -> secret * string
420420 (** Generate a random {!secret} and the corresponding public key.
421421 [bits] is the exact bit-size of {!secret} and defaults to a value
422422 dependent on the {!type-group}'s [p].
···431431 It is [None] if these invariants do not hold for [public]:
432432 [1 < public < p-1] && [public <> gg]. *)
433433434434- val gen_group : ?g:Mirage_crypto_rng.g -> bits:int -> unit -> group
434434+ val gen_group : ?g:Crypto_rng.g -> bits:int -> unit -> group
435435 (** [gen_group ~g ~bits ()] generates a random {!type-group} with modulus size
436436 [bits]. Uses a safe prime [p = 2q + 1] (with [q] prime) for the modulus
437437 and [2] for the generator, such that [2^q = 1 mod p].
···511511512512 (** {1 Random generation} *)
513513514514- val gen : ?g:Mirage_crypto_rng.g -> Z.t -> Z.t
514514+ val gen : ?g:Crypto_rng.g -> Z.t -> Z.t
515515 (** [gen ~g n] picks a value in the interval [\[0, n - 1\]] uniformly at random. *)
516516517517- val gen_r : ?g:Mirage_crypto_rng.g -> Z.t -> Z.t -> Z.t
517517+ val gen_r : ?g:Crypto_rng.g -> Z.t -> Z.t -> Z.t
518518 (** [gen_r ~g low high] picks a value from the interval [\[low, high - 1\]]
519519 uniformly at random. *)
520520end
+7-7
pk/rsa.ml
···11-open Mirage_crypto.Uncommon
11+open Crypto.Uncommon
2233open Common
44···150150let pub_bits ({ n; _ } : pub) = Z.numbits n
151151and priv_bits ({ n; _ } : priv) = Z.numbits n
152152153153-type mask = [ `No | `Yes | `Yes_with of Mirage_crypto_rng.g ]
153153+type mask = [ `No | `Yes | `Yes_with of Crypto_rng.g ]
154154155155let encrypt_unsafe ~key: ({ e; n } : pub) msg = Z.(powm msg e n)
156156···206206 (* XXX Generalize this into `Rng.samplev` or something. *)
207207 let generate_with ?g ~f n =
208208 let buf = Bytes.create n
209209- and k = let b = Mirage_crypto_rng.block g in (n // b * b) in
209209+ and k = let b = Crypto_rng.block g in (n // b * b) in
210210 let rec go nonce i j =
211211 if i = n then Bytes.unsafe_to_string buf else
212212- if j = k then go Mirage_crypto_rng.(generate ?g k) i 0 else
212212+ if j = k then go Crypto_rng.(generate ?g k) i 0 else
213213 match String.get_uint8 nonce j with
214214 | b when f b -> Bytes.set_uint8 buf i b ; go nonce (succ i) (succ j)
215215 | _ -> go nonce i (succ j) in
216216- go Mirage_crypto_rng.(generate ?g k) 0 0
216216+ go Crypto_rng.(generate ?g k) 0 0
217217218218 let pad ~mark ~padding k msg =
219219 let pad = padding (k - String.length msg - 3 |> imax min_pad) in
···329329 let max_msg_bytes k = k - 2 * hlen - 2
330330331331 let eme_oaep_encode ?g ?(label = "") k msg =
332332- let seed = Mirage_crypto_rng.generate ?g hlen
332332+ let seed = Crypto_rng.generate ?g hlen
333333 and pad = String.make (max_msg_bytes k - String.length msg) '\x00' in
334334 let db = String.concat "" [ H.(digest_string label |> to_raw_string) ; pad ; bx01 ; msg ] in
335335 let mdb = Bytes.unsafe_to_string (MGF.mask ~seed db) in
···383383384384 let emsa_pss_encode ?g slen emlen msg =
385385 let n = emlen // 8
386386- and salt = Mirage_crypto_rng.generate ?g slen in
386386+ and salt = Crypto_rng.generate ?g slen in
387387 let h = digest ~salt msg in
388388 let db = String.concat "" [ String.make (n - slen - hlen - 2) '\x00' ; bx01 ; salt ] in
389389 let mdb = MGF.mask ~seed:h db in
+7-7
pk/z_extra.ml
···11-open Mirage_crypto.Uncommon
11+open Crypto.Uncommon
2233let bit_bound z = Z.size z * 64
44···80808181let gen ?g n =
8282 if n < Z.one then invalid_arg "Rng.gen: non-positive: %a" Z.pp_print n;
8383- let bs = Mirage_crypto_rng.block g in
8383+ let bs = Crypto_rng.block g in
8484 let bits = Z.(numbits (pred n)) in
8585 let octets = bits // 8 in
8686 let batch =
8787- if Mirage_crypto_rng.strict g then octets else 2 * octets // bs * bs
8787+ if Crypto_rng.strict g then octets else 2 * octets // bs * bs
8888 in
8989 let rec attempt buf =
9090 if String.length buf >= octets then
9191 let x = of_octets_be ~bits buf in
9292 if x < n then x else attempt (String.sub buf octets (String.length buf - octets))
9393- else attempt (Mirage_crypto_rng.generate ?g batch) in
9494- attempt (Mirage_crypto_rng.generate ?g batch)
9393+ else attempt (Crypto_rng.generate ?g batch) in
9494+ attempt (Crypto_rng.generate ?g batch)
95959696let rec gen_r ?g a b =
9797- if Mirage_crypto_rng.strict g then
9797+ if Crypto_rng.strict g then
9898 let x = gen ?g b in if x < a then gen_r ?g a b else x
9999 else Z.(a + gen ?g (b - a))
100100···115115let gen_bits ?g ?(msb = 0) bits =
116116 let bytelen = bits // 8 in
117117 let buf = Bytes.create bytelen in
118118- Mirage_crypto_rng.generate_into ?g buf ~off:0 bytelen;
118118+ Crypto_rng.generate_into ?g buf ~off:0 bytelen;
119119 set_msb msb buf ;
120120 of_octets_be ~bits (Bytes.unsafe_to_string buf)
121121
···11(* NOTE: when modifying this file, please also check whether
22 rng/miou/pfortuna.ml needs to be updated. *)
3344-open Mirage_crypto
55-open Mirage_crypto.Uncommon
44+open Crypto
55+open Crypto.Uncommon
6677module SHAd256 = struct
88 open Digestif
+1-1
rng/hmac_drbg.ml
···4141 Bytes.unsafe_blit_string v 0 buf off H.digest_size;
4242 go (off + H.digest_size) k v (pred i)
4343 in
4444- let v = go off g.k g.v Mirage_crypto.Uncommon.(len // H.digest_size) in
4444+ let v = go off g.k g.v Crypto.Uncommon.(len // H.digest_size) in
4545 g.k <- H.hmac_string ~key:g.k (v ^ bx00) |> H.to_raw_string;
4646 g.v <- H.hmac_string ~key:g.k v |> H.to_raw_string
4747
···11-open Mirage_crypto_rng
22-33-module Pfortuna = Pfortuna
44-55-type _ Effect.t += Spawn : (unit -> unit) -> unit Effect.t
66-external reraise : exn -> 'a = "%reraise"
77-88-let periodic fn delta =
99- let rec one () =
1010- fn ();
1111- Miou_unix.sleep (Duration.to_f delta);
1212- one () in
1313- Effect.perform (Spawn one)
1414-1515-let getrandom delta source =
1616- let fn () =
1717- let per_pool = 8 in
1818- let size = per_pool * pools None in
1919- let random = Mirage_crypto_rng_unix.getrandom size in
2020- let idx = ref 0 in
2121- let fn () =
2222- incr idx;
2323- Ok (String.sub random (per_pool * (pred !idx)) per_pool)
2424- in
2525- Entropy.feed_pools None source fn in
2626- periodic fn delta
2727-2828-let getrandom_init i =
2929- let data = Mirage_crypto_rng_unix.getrandom 128 in
3030- Entropy.header i data
3131-3232-let rdrand delta =
3333- match Entropy.cpu_rng with
3434- | Error `Not_supported -> ()
3535- | Ok cpu_rng -> periodic (cpu_rng None) delta
3636-3737-let running = Atomic.make false
3838-3939-let switch fn =
4040- let orphans = Miou.orphans () in
4141- let open Effect.Deep in
4242- let retc = Fun.id in
4343- let exnc = reraise in
4444- let effc : type c. c Effect.t -> ((c, 'r) continuation -> 'r) option
4545- = function
4646- | Spawn fn ->
4747- ignore (Miou.async ~orphans fn);
4848- Some (fun k -> continue k ())
4949- | _ -> None in
5050- match_with fn orphans { retc; exnc; effc }
5151-5252-let default_generator_already_set =
5353- "Mirage_crypto_rng.default_generator has already \
5454- been set (but not via Mirage_crypto_rng_miou). Please check \
5555- that this is intentional"
5656-5757-let miou_generator_already_launched =
5858- "Mirage_crypto_rng_miou.initialize has already been launched \
5959- and a task is already seeding the RNG."
6060-6161-type rng = unit Miou.t
6262-6363-let rec compare_and_set ?(backoff= Miou_backoff.default) t a b =
6464- if Atomic.compare_and_set t a b = false
6565- then compare_and_set ~backoff:(Miou_backoff.once backoff) t a b
6666-6767-let rec clean_up sleep orphans = match Miou.care orphans with
6868- | Some None | None -> Miou_unix.sleep (Duration.to_f sleep); clean_up sleep orphans
6969- | Some (Some prm) -> Miou.await_exn prm; clean_up sleep orphans
7070-7171-let call_if_domain_available fn =
7272- let available = Miou.Domain.available () in
7373- let current = (Stdlib.Domain.self () :> int) in
7474- if current = 0 && available > 0
7575- || current <> 0 && available > 1
7676- then Miou.call fn
7777- else Miou.async fn
7878-7979-let initialize (type a) ?g ?(sleep= Duration.of_sec 1) (rng : a generator) =
8080- if Atomic.compare_and_set running false true
8181- then begin
8282- let seed =
8383- let init = Entropy.[ bootstrap; whirlwind_bootstrap; bootstrap; getrandom_init ] in
8484- List.mapi (fun i fn -> fn i) init |> String.concat "" in
8585- let () =
8686- try let _ = default_generator () in
8787- Logs.warn (fun m -> m "%s" default_generator_already_set)
8888- with No_default_generator -> () in
8989- let rng = create ?g ~seed ~time:Mtime_clock.elapsed_ns rng in
9090- set_default_generator rng;
9191- call_if_domain_available @@ fun () -> switch @@ fun orphans ->
9292- rdrand sleep;
9393- let source = Entropy.register_source "getrandom" in
9494- getrandom (Int64.mul sleep 10L) source;
9595- clean_up sleep orphans
9696- end else invalid_arg miou_generator_already_launched
9797-9898-let kill prm =
9999- Miou.cancel prm;
100100- compare_and_set running true false;
101101- unset_default_generator ()
-47
rng/miou/mirage_crypto_rng_miou_unix.mli
···11-(** {b RNG} seeding on {b Miou_unix}.
22-33- This module initializes a RNG with [getrandom()], and CPU RNG. On BSD system
44- (FreeBSD, OpenBSD, MacOS) [getentropy()] is used instead of [getrandom()].
55- On Windows 10 or higher, [BCryptGenRandom()] is used with the default RNG.
66- Windows 8 or lower are not supported by this library.
77-*)
88-99-module Pfortuna : Mirage_crypto_rng.Generator
1010-(** {b Pfortuna}, a {b domain-safe} CSPRNG
1111- {{: https://www.schneier.com/fortuna.html} proposed} by Schneier. *)
1212-1313-type rng
1414-(** Type of tasks seeding the RNG. *)
1515-1616-val initialize : ?g:'a -> ?sleep:int64 -> 'a Mirage_crypto_rng.generator -> rng
1717-(** [initialize ?g ?sleep (module Generator)] will allow the RNG to operate in a
1818- returned task. This task periodically launches sub-tasks that seed the
1919- engine (using [getrandom()], [getentropy()] or [BCryptGenRandom()] depending
2020- on the system). These sub-tasks must be cleaned periodically (in seconds)
2121- according to the [sleep] parameter given (defaults to 1 second).
2222-2323- The user must then {!val:kill} the returned task at the end of the program
2424- to be sure to clean everything. Otherwise, Miou will complain with the
2525- exception [Still_has_children].
2626-2727- We strongly recommend using {!module:Pfortuna} as an RNG engine rather than
2828- {!module:Mirage_crypto_rng.Fortuna}. The engine is launched in parallel with
2929- the other tasks if at least one domain is available. To ensure that there is
3030- no compromise in the values generated by a {i data-race}, [Pfortuna] is an
3131- {b domain-safe} implementation of Fortuna.
3232-3333- The user cannot make any subsequent calls to [initialize]. In other words,
3434- you can only initialise a single {!type:rng} task. You must {!val:kill} the
3535- returned {!type:rng} if you want to re-initialise the RNG.
3636-3737- A basic usage of [mirage-crypto-rng-miou-unix] is:
3838- {[
3939- let () = Miou_unix.run @@ fun () ->
4040- let rng = Mirage_crypto_rng_miou_unix.(initialize (module Pfortuna)) in
4141- let str = Mirage_crypto_rng.generate 16 in
4242- Format.printf "random: %S\n%!" str;
4343- Mirage_crypto_rng_miou_unix.kill rng
4444- ]} *)
4545-4646-val kill : rng -> unit
4747-(** [kill rng] terminates the {i background} task which seeds the RNG. *)
-137
rng/miou/pfortuna.ml
···11-(* Pfortuna is a re-implementation of Fortuna with a mutex. The goal of this
22- module is to provide a global and domain-safe RNG. The implementation use
33- [Miou.Mutex] instead of [Mutex] - [Pfortuna] is only available as part of
44- the [mirage-crypto-rng-miou-unix] package. Thus, in the context of Miou,
55- [Pfortuna] can be used and recommended in place of [Fortuna], so that the
66- user can generate random numbers in parallel in several domains.
77-88- {[
99- let () = Miou_unix.run @@ fun () ->
1010- let rng = Mirage_crypto_rng_miou_unix.(initialize (module Pfortuna)) in
1111- ...
1212- Mirage_crypto_rng_miou_unix.kill rng
1313- ]}
1414-1515- NOTE: when modifying this file, please also check whether rng/fortuna.ml
1616- needs to be updated. *)
1717-1818-open Mirage_crypto
1919-open Mirage_crypto.Uncommon
2020-2121-module SHAd256 = struct
2222- open Digestif
2323- type ctx = SHA256.ctx
2424- let empty = SHA256.empty
2525- let get t = SHA256.(get t |> to_raw_string |> digest_string |> to_raw_string)
2626- let digesti i = SHA256.(digesti_string i |> to_raw_string |> digest_string |> to_raw_string)
2727- let feedi = SHA256.feedi_string
2828-end
2929-3030-let block = 16
3131-3232-(* the minimal amount of bytes in a pool to trigger a reseed *)
3333-let min_pool_size = 64
3434-(* the minimal duration between two reseeds *)
3535-let min_time_duration = 1_000_000_000L
3636-(* number of pools *)
3737-let pools = 32
3838-3939-type t =
4040- { ctr : AES.CTR.ctr
4141- ; secret : string
4242- ; key : AES.CTR.key
4343- ; pools : SHAd256.ctx array
4444- ; pool0_size : int
4545- ; reseed_count : int
4646- ; last_reseed : int64
4747- ; time : (unit -> int64) option
4848- }
4949-5050-type g = Miou.Mutex.t * t ref
5151-5252-let update (m, g) fn = Miou.Mutex.protect m @@ fun () -> g := fn !g
5353-let get (m, g) fn = Miou.Mutex.protect m @@ fun () -> fn !g
5454-5555-let create ?time () =
5656- let secret = String.make 32 '\000' in
5757- let m = Miou.Mutex.create () in
5858- let t =
5959- { ctr= (0L, 0L); secret; key= AES.CTR.of_secret secret
6060- ; pools= Array.make pools SHAd256.empty
6161- ; pool0_size= 0
6262- ; reseed_count= 0
6363- ; last_reseed= 0L
6464- ; time } in
6565- (m, { contents= t })
6666-6767-let seeded ~t =
6868- let lo, hi = t.ctr in
6969- not (Int64.equal lo 0L && Int64.equal hi 0L)
7070-7171-let set_key ~t secret =
7272- { t with secret; key= AES.CTR.of_secret secret }
7373-7474-let reseedi ~t iter =
7575- let t = set_key ~t (SHAd256.digesti (fun fn -> fn t.secret; iter fn)) in
7676- { t with ctr= AES.CTR.add_ctr t.ctr 1L }
7777-7878-let iter1 a f = f a
7979-let reseed ~t cs = reseedi ~t (iter1 cs)
8080-8181-let generate_rekey ~t buf ~off len =
8282- let b = len // block* 2 in
8383- let n = b * block in
8484- let r = AES.CTR.stream ~key:t.key ~ctr:t.ctr n in
8585- Bytes.unsafe_blit_string r 0 buf off len;
8686- let r2 = String.sub r (n - 32) 32 in
8787- let t = set_key ~t r2 in
8888- { t with ctr= AES.CTR.add_ctr t.ctr (Int64.of_int b) }
8989-9090-let add_pool_entropy t =
9191- if t.pool0_size > min_pool_size then
9292- let should_reseed, now = match t.time with
9393- | None -> true, 0L
9494- | Some fn ->
9595- let now = fn () in
9696- Int64.(sub now t.last_reseed > min_time_duration), now in
9797- if should_reseed then begin
9898- let t = { t with reseed_count= t.reseed_count + 1
9999- ; last_reseed= now
100100- ; pool0_size= 0 } in
101101- reseedi ~t @@ fun add ->
102102- for i = 0 to pools - 1 do
103103- if t.reseed_count land ((1 lsl i) - 1) = 0
104104- then (SHAd256.get t.pools.(i) |> add; t.pools.(i) <- SHAd256.empty)
105105- done
106106- end else t else t
107107-108108-let generate_into ~t buf ~off len =
109109- let t = add_pool_entropy t in
110110- if not (seeded ~t) then raise Mirage_crypto_rng.Unseeded_generator;
111111- let rec chunk t off = function
112112- | i when i <= 0 -> t
113113- | n ->
114114- let n' = imin n 0x10000 in
115115- let t = generate_rekey ~t buf ~off n' in
116116- chunk t (off + n') (n - n') in
117117- chunk t off len
118118-119119-let add ~t source ~pool data =
120120- let buf = Bytes.create 2
121121- and pool = pool land (pools - 1)
122122- and source = Mirage_crypto_rng.Entropy.id source land 0xff in
123123- Bytes.set_uint8 buf 0 source;
124124- Bytes.set_uint8 buf 1 (String.length data);
125125- t.pools.(pool) <- SHAd256.feedi t.pools.(pool) (iter2 (Bytes.unsafe_to_string buf) data);
126126- if pool = 0 then { t with pool0_size= t.pool0_size + String.length data } else t
127127-128128-let accumulate ~g source =
129129- let pool = ref 0 in
130130- `Acc (fun buf ->
131131- update g @@ fun t ->
132132- let t = add ~t source ~pool:!pool buf in
133133- incr pool; t)
134134-135135-let reseed ~g cs = update g @@ fun t -> reseed ~t cs
136136-let generate_into ~g buf ~off len = update g @@ fun t -> generate_into ~t buf ~off len
137137-let seeded ~g = get g @@ fun t -> seeded ~t
···11-(*
22- * Copyright (c) 2014 Hannes Mehnert
33- * Copyright (c) 2014 Anil Madhavapeddy <anil@recoil.org>
44- * Copyright (c) 2014-2016 David Kaloper Meršinjak
55- * Copyright (c) 2015 Citrix Systems Inc
66- * All rights reserved.
77- *
88- * Redistribution and use in source and binary forms, with or without
99- * modification, are permitted provided that the following conditions are met:
1010- *
1111- * * Redistributions of source code must retain the above copyright notice, this
1212- * list of conditions and the following disclaimer.
1313- *
1414- * * Redistributions in binary form must reproduce the above copyright notice,
1515- * this list of conditions and the following disclaimer in the documentation
1616- * and/or other materials provided with the distribution.
1717- *
1818- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1919- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2020- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2121- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
2222- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2323- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2424- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
2525- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2626- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2727- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828- *)
2929-3030-let src = Logs.Src.create "mirage-crypto-rng-mirage" ~doc:"Mirage crypto RNG mirage"
3131-module Log = (val Logs.src_log src : Logs.LOG)
3232-3333-open Mirage_crypto_rng
3434-3535-let rdrand_task delta =
3636- match Entropy.cpu_rng with
3737- | Error `Not_supported -> ()
3838- | Ok cpu_rng ->
3939- let open Lwt.Infix in
4040- let rdrand = cpu_rng None in
4141- Lwt.async (fun () ->
4242- let rec one () =
4343- rdrand ();
4444- Mirage_sleep.ns delta >>=
4545- one
4646- in
4747- one ())
4848-4949-let bootstrap_functions () =
5050- Entropy.[ bootstrap ; bootstrap ; whirlwind_bootstrap ; bootstrap ]
5151-5252-let running = ref false
5353-5454-let initialize (type a) ?g ?(sleep = Duration.of_sec 1) (rng : a generator) =
5555- if !running then
5656- Lwt.fail_with "entropy collection already running"
5757- else begin
5858- (try
5959- let _ = default_generator () in
6060- Log.warn (fun m -> m "Mirage_crypto_rng.default_generator has already \
6161- been set, check that this call is intentional");
6262- with
6363- No_default_generator -> ());
6464- running := true;
6565- let seed =
6666- List.mapi (fun i f -> f i) (bootstrap_functions ()) |> String.concat ""
6767- in
6868- let rng = create ?g ~seed ~time:Mirage_mtime.elapsed_ns rng in
6969- set_default_generator rng;
7070- rdrand_task sleep;
7171- Mirage_runtime.at_enter_iter (Entropy.timer_accumulator None);
7272- Lwt.return_unit
7373- end
-35
rng/mirage/mirage_crypto_rng_mirage.mli
···11-(*
22- * Copyright (c) 2014 Hannes Mehnert
33- * Copyright (c) 2014 Anil Madhavapeddy <anil@recoil.org>
44- * Copyright (c) 2014-2016 David Kaloper Meršinjak
55- * All rights reserved.
66- *
77- * Redistribution and use in source and binary forms, with or without
88- * modification, are permitted provided that the following conditions are met:
99- *
1010- * * Redistributions of source code must retain the above copyright notice, this
1111- * list of conditions and the following disclaimer.
1212- *
1313- * * Redistributions in binary form must reproduce the above copyright notice,
1414- * this list of conditions and the following disclaimer in the documentation
1515- * and/or other materials provided with the distribution.
1616- *
1717- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1818- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1919- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2020- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
2121- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2222- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2323- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
2424- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2525- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2626- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2727- *)
2828-2929-val initialize :
3030- ?g:'a -> ?sleep:int64 -> 'a Mirage_crypto_rng.generator -> unit Lwt.t
3131-(** [initialize ~g ~sleep generator] sets the default generator to the
3232- [generator] and sets up periodic entropy feeding for that rng. This
3333- function fails ([Lwt.fail]) if it is called a second time. The argument
3434- [~sleep] is measured in ns, and used as sleep between cpu assisted random
3535- number collection. It defaults to one second. *)
rng/mirage_crypto_rng.ml
rng/crypto_rng.ml
+8-8
rng/mirage_crypto_rng.mli
rng/crypto_rng.mli
···2020 library, you can use /dev/urandom or getentropy(3) (actually getrandom(3) on
2121 Linux, getentropy() on macOS and BSD systems, BCryptGenRandom on Windows).
22222323- Please ensure to call [Mirage_crypto_rng_unix.use_default], or
2424- [Mirage_crypto_rng_unix.use_dev_urandom] (if you only want to use
2525- /dev/urandom), or [Mirage_crypto_rng_unix.use_getentropy] (if you only want
2323+ Please ensure to call [Crypto_rng_unix.use_default], or
2424+ [Crypto_rng_unix.use_dev_urandom] (if you only want to use
2525+ /dev/urandom), or [Crypto_rng_unix.use_getentropy] (if you only want
2626 to use getrandom/getentropy/BCryptGenRandom).
27272828 For fine-grained control (doing entropy harvesting, etc.), please continue
···3131 via Pfortuna).
32323333 Suitable entropy feeding of generators are provided by other libraries
3434- {{!Mirage_crypto_rng_mirage}mirage-crypto-rng-mirage} (for MirageOS),
3535- and {{!Mirage_crypto_rng_miou_unix}mirage-crypto-miou-unix} (for Miou_unix).
3434+ {{!Crypto_rng_mirage}mirage-crypto-rng-mirage} (for MirageOS),
3535+ and {{!Crypto_rng_miou_unix}mirage-crypto-miou-unix} (for Miou_unix).
36363737 The intention is that "initialize" in the respective sub-library is called
3838 once, which sets the default generator and registers entropy
···176176 (** Create a new, unseeded {{!g}g}. *)
177177178178 val generate_into : g:g -> bytes -> off:int -> int -> unit
179179- [@@alert unsafe "Does not do bounds checks. Use Mirage_crypto_rng.generate_into instead."]
179179+ [@@alert unsafe "Does not do bounds checks. Use Crypto_rng.generate_into instead."]
180180 (** [generate_into ~g buf ~off n] produces [n] uniformly distributed random
181181 bytes into [buf] at offset [off], updating the state of [g].
182182183183 Assumes that [buf] is at least [off + n] bytes long. Also assumes that
184184 [off] and [n] are positive integers. Caution: do not use in your
185185- application, use [Mirage_crypto_rng.generate_into] instead.
185185+ application, use [Crypto_rng.generate_into] instead.
186186 *)
187187188188 val reseed : g:g -> string -> unit
···294294 if i < 1 then [] else Rng.generate ?g n :: f1 ?g ~n (i - 1)]}
295295296296 Generating a [Z.t] smaller than [10]:
297297-{[let f2 ?g () = Mirage_crypto_pk.Z_extra.gen ?g Z.(~$10)]}
297297+{[let f2 ?g () = Crypto_pk.Z_extra.gen ?g Z.(~$10)]}
298298299299 Creating a local Fortuna instance and using it as a key-derivation function:
300300{[let f3 secret =
+3-3
rng/rng.ml
···6677let setup_rng =
88 "\nPlease setup your default random number generator. On Unix, the best \
99- path is to call [Mirage_crypto_rng_unix.use_default ()].\
99+ path is to call [Crypto_rng_unix.use_default ()].\
1010 \nBut you can use Fortuna (or any other RNG) and setup the seeding \
1111 (done by default in MirageOS): \
1212 \n\
···1717 `let main = Mirage.main \"Unikernel.Main\" (random @-> job)`, \
1818 and `let () = register \"my_unikernel\" [main $ default_random]`. \
1919 \n If you are using miou, execute \
2020- `Mirage_crypto_rng_miou_unix.initialize (module Mirage_crypto_rng.Fortuna)` \
2020+ `Crypto_rng_miou_unix.initialize (module Crypto_rng.Fortuna)` \
2121 at startup."
22222323let () = Printexc.register_printer (function
···3232 val block : int
3333 val create : ?time:(unit -> int64) -> unit -> g
3434 val generate_into : g:g -> bytes -> off:int -> int -> unit
3535- [@@alert unsafe "Does not do bounds checks. Use Mirage_crypto_rng.generate_into instead."]
3535+ [@@alert unsafe "Does not do bounds checks. Use Crypto_rng.generate_into instead."]
3636 val reseed : g:g -> string -> unit
3737 val accumulate : g:g -> source -> [`Acc of string -> unit]
3838 val seeded : g:g -> bool
···11-open Mirage_crypto_rng
11+open Crypto_rng
2233module Urandom = Urandom
44···14141515let use_default () = use_getentropy ()
16161717-let src = Logs.Src.create "mirage-crypto-rng.unix" ~doc:"Mirage crypto RNG Unix"
1717+let src = Logs.Src.create "crypto-rng.unix" ~doc:"Mirage crypto RNG Unix"
1818module Log = (val Logs.src_log src : Logs.LOG)
19192020external getrandom_buf : bytes -> int -> int -> unit = "mc_getrandom" [@@noalloc]
···3636let initialize (type a) ?g (rng : a generator) =
3737 if Atomic.get running then
3838 Log.debug
3939- (fun m -> m "Mirage_crypto_rng_unix.initialize has already been called, \
3939+ (fun m -> m "Crypto_rng_unix.initialize has already been called, \
4040 ignoring this call.")
4141 else begin
4242 (try
4343 let _ = default_generator () in
4444- Log.warn (fun m -> m "Mirage_crypto_rng.default_generator has already \
4444+ Log.warn (fun m -> m "Crypto_rng.default_generator has already \
4545 been set, check that this call is intentional");
4646 with
4747 No_default_generator -> ());
···77*)
8899(** [initialize ~g rng] will bring the RNG into a working state. *)
1010-val initialize : ?g:'a -> 'a Mirage_crypto_rng.generator -> unit
1111-[@@deprecated "Use 'Mirage_crypto_rng_unix.use_default ()' instead."]
1010+val initialize : ?g:'a -> 'a Crypto_rng.generator -> unit
1111+[@@deprecated "Use 'Crypto_rng_unix.use_default ()' instead."]
12121313(** [getrandom size] returns a buffer of [size] filled with random bytes. *)
1414val getrandom : int -> string
···1616(** A generator that opens /dev/urandom and reads from that file descriptor
1717 data whenever random data is needed. The file descriptor is closed in
1818 [at_exit]. *)
1919-module Urandom : Mirage_crypto_rng.Generator
1919+module Urandom : Crypto_rng.Generator
20202121(** A generator using [getrandom(3)] on Linux, [getentropy(3)] on BSD and macOS,
2222 and [BCryptGenRandom()] on Windows. *)
2323-module Getentropy : Mirage_crypto_rng.Generator
2323+module Getentropy : Crypto_rng.Generator
24242525-(** [use_default ()] initializes the RNG [Mirage_crypto_rng.default_generator]
2525+(** [use_default ()] initializes the RNG [Crypto_rng.default_generator]
2626 with a sensible default, at the moment using [Getentropy]. *)
2727val use_default : unit -> unit
28282929(** [use_dev_random ()] initializes the RNG
3030- [Mirage_crypto_rng.default_generator] with the [Urandom] generator. This
3030+ [Crypto_rng.default_generator] with the [Urandom] generator. This
3131 raises an exception if "/dev/urandom" cannot be opened. *)
3232val use_dev_urandom : unit -> unit
33333434-(** [use_getentropy ()] initializes the RNG [Mirage_crypto_rng.default_generator]
3434+(** [use_getentropy ()] initializes the RNG [Crypto_rng.default_generator]
3535 with the [Getentropy] generator. *)
3636val use_getentropy : unit -> unit
···11/* Based on https://github.com/abeaumont/ocaml-chacha.git */
2233-#include "mirage_crypto.h"
33+#include "crypto.h"
4455extern void mc_chacha_core_generic(int count, const uint32_t *src, uint32_t *dst);
66
+1-1
src/native/chacha_generic.c
···11/* Based on https://github.com/abeaumont/ocaml-chacha.git */
2233-#include "mirage_crypto.h"
33+#include "crypto.h"
4455static inline void mc_chacha_quarterround(uint32_t *x, int a, int b, int c, int d) {
66 x[a] += x[b]; x[d] = rol32(x[d] ^ x[a], 16);
···6677#include <caml/mlvalues.h>
8899-#include "mirage_crypto.h"
99+#include "crypto.h"
10101111#if defined (__i386__) || defined (__x86_64__)
1212#include <x86intrin.h>
+1-1
src/native/ghash_ctmul.c
···3636 * worth the effort.
3737 */
38383939-#include "mirage_crypto.h"
3939+#include "crypto.h"
4040#include <string.h>
41414242/* Microsoft compiler does not support 128-bit integers. Drop down to
+1-1
src/native/ghash_generic.c
···11/* Copyright (c) 2017 David Kaloper Meršinjak. All rights reserved.
22 See LICENSE.md. */
3344-#include "mirage_crypto.h"
44+#include "crypto.h"
55#include <string.h>
6677/* Generic table-driven GHASH.
···22let data = ref ""
3344let cpu_bootstrap_check () =
55- match Mirage_crypto_rng.Entropy.cpu_rng_bootstrap with
55+ match Crypto_rng.Entropy.cpu_rng_bootstrap with
66 | Error `Not_supported -> print_endline "no CPU RNG available"
77 | Ok cpu_rng_bootstrap ->
88 match cpu_rng_bootstrap 1 with
···22222323let whirlwind_bootstrap_check () =
2424 for i = 0 to 10 do
2525- let data' = Mirage_crypto_rng.Entropy.whirlwind_bootstrap 1 in
2525+ let data' = Crypto_rng.Entropy.whirlwind_bootstrap 1 in
2626 if String.equal !data data' then begin
2727 Ohex.pp Format.std_formatter data';
2828 failwith ("same data from whirlwind bootstrap at " ^ string_of_int i);
···32323333let timer_check () =
3434 for i = 0 to 10 do
3535- let data' = Mirage_crypto_rng.Entropy.interrupt_hook () in
3535+ let data' = Crypto_rng.Entropy.interrupt_hook () in
3636 if String.equal !data data' then begin
3737 Ohex.pp Format.std_formatter data';
3838 failwith ("same data from timer at " ^ string_of_int i);
-36
tests/test_entropy_collection.ml
···11-open Lwt.Infix
22-33-module Printing_rng = struct
44- type g = unit
55-66- let block = 16
77-88- let create ?time:_ () = ()
99-1010- let generate_into ~g:_ _buf ~off:_ _len = assert false
1111-1212- let reseed ~g:_ data =
1313- Format.printf "reseeding:@.%a@.%!" (Ohex.pp_hexdump ()) data
1414-1515- let accumulate ~g:_ source =
1616- let print data =
1717- Format.printf "accumulate: (src: %a) %a@.%!"
1818- Mirage_crypto_rng.Entropy.pp_source source Ohex.pp data
1919- in
2020- `Acc print
2121-2222- let seeded ~g:_ = true
2323- let pools = 1
2424-end
2525-2626-let with_entropy act =
2727- Mirage_crypto_rng_mirage.initialize (module Printing_rng) >>= fun () ->
2828- Format.printf "entropy sources: %a@,%!"
2929- (fun ppf -> List.iter (fun x ->
3030- Mirage_crypto_rng.Entropy.pp_source ppf x;
3131- Format.pp_print_space ppf ()))
3232- (Mirage_crypto_rng.Entropy.sources ());
3333- act ()
3434-3535-let () =
3636- Unix_os.(Main.run (with_entropy (fun () -> Time.sleep_ns (Duration.of_sec 3))))
-31
tests/test_miou_entropy_collection.ml
···11-module Printing_rng = struct
22- type g = unit
33-44- let block = 16
55- let create ?time:_ () = ()
66- let generate_into ~g:_ _buf ~off:_ _len = assert false
77- let seeded ~g:_ = true
88- let pools = 1
99-1010- let reseed ~g:_ data =
1111- Format.printf "reseeding:@.%a@.%!" (Ohex.pp_hexdump ()) data
1212-1313- let accumulate ~g:_ source =
1414- let print data =
1515- Format.printf "accumulate: (src: %a) %a@.%!"
1616- Mirage_crypto_rng.Entropy.pp_source source Ohex.pp data
1717- in
1818- `Acc print
1919-end
2020-2121-let () =
2222- Miou_unix.run @@ fun () ->
2323- let rng = Mirage_crypto_rng_miou_unix.initialize (module Printing_rng) in
2424- Format.printf "entropy sources: %a@,%!"
2525- (fun ppf -> List.iter (fun x ->
2626- Mirage_crypto_rng.Entropy.pp_source ppf x;
2727- Format.pp_print_space ppf ()))
2828- (Mirage_crypto_rng.Entropy.sources ());
2929- let sleep = Duration.(of_sec 2 |> to_f) in
3030- Miou_unix.sleep sleep;
3131- Mirage_crypto_rng_miou_unix.kill rng
-16
tests/test_miou_rng.ml
···11-let () = Miou_unix.run @@ fun () ->
22- let rng = Mirage_crypto_rng_miou_unix.(initialize (module Pfortuna)) in
33- let random_num = Mirage_crypto_rng.generate 32 in
44- assert (String.length random_num = 32);
55- Printf.printf "32 bit random number: %s\n%!" (Ohex.encode random_num);
66- let random_num = Mirage_crypto_rng.generate 16 in
77- assert (String.length random_num = 16);
88- Printf.printf "16 bit random number: %s\n%!" (Ohex.encode random_num);
99- (* NOTE(dinosaure): the test below shows that [Pfortuna] is domain-safe when
1010- run with TSan. If we use the Fortuna engine, TSan will report invalid
1111- accesses between the domain that seeds the RNG and [dom0]. *)
1212- for _ = 0 to 4 do
1313- let _ = Mirage_crypto_rng.generate 16 in
1414- Miou_unix.sleep 0.5;
1515- done;
1616- Mirage_crypto_rng_miou_unix.kill rng
+3-3
tests/test_numeric.ml
···11open OUnit2
2233-open Mirage_crypto.Uncommon
44-open Mirage_crypto_pk
33+open Crypto.Uncommon
44+open Crypto_pk
5566open Test_common
77···15151616let n_decode_reencode_selftest ~typ ~bytes n =
1717 typ ^ " selftest" >:: times ~n @@ fun _ ->
1818- let cs = Mirage_crypto_rng.generate bytes in
1818+ let cs = Crypto_rng.generate bytes in
1919 let cs' = Z_extra.(to_octets_be ~size:bytes @@ of_octets_be cs) in
2020 assert_oct_equal cs cs'
2121
···11open OUnit2
2233-open Mirage_crypto
33+open Crypto
4455open Test_common
6677let sample arr =
88 let ix =
99- Randomconv.int ~bound:(Array.length arr) Mirage_crypto_rng.generate
99+ Randomconv.int ~bound:(Array.length arr) Crypto_rng.generate
1010 in
1111 arr.(ix)
1212···1515let ecb_selftest (m : (module Block.ECB)) n =
1616 let module C = ( val m ) in
1717 "selftest" >:: times ~n @@ fun _ ->
1818- let data = Mirage_crypto_rng.generate (C.block_size * 8)
1919- and key = C.of_secret @@ Mirage_crypto_rng.generate (sample C.key_sizes) in
1818+ let data = Crypto_rng.generate (C.block_size * 8)
1919+ and key = C.of_secret @@ Crypto_rng.generate (sample C.key_sizes) in
2020 let data' =
2121 C.( data |> encrypt ~key |> encrypt ~key
2222 |> decrypt ~key |> decrypt ~key ) in
···2525let cbc_selftest (m : (module Block.CBC)) n =
2626 let module C = ( val m ) in
2727 "selftest" >:: times ~n @@ fun _ ->
2828- let data = Mirage_crypto_rng.generate (C.block_size * 8)
2929- and iv = Mirage_crypto_rng.generate C.block_size
3030- and key = C.of_secret @@ Mirage_crypto_rng.generate (sample C.key_sizes) in
2828+ let data = Crypto_rng.generate (C.block_size * 8)
2929+ and iv = Crypto_rng.generate C.block_size
3030+ and key = C.of_secret @@ Crypto_rng.generate (sample C.key_sizes) in
3131 assert_oct_equal ~msg:"CBC e->e->d->d" data
3232 C.( data |> encrypt ~key ~iv |> encrypt ~key ~iv
3333 |> decrypt ~key ~iv |> decrypt ~key ~iv );
···4444 let module M = (val m) in
4545 let bs = M.block_size in
4646 "selftest" >:: times ~n @@ fun _ ->
4747- let key = M.of_secret @@ Mirage_crypto_rng.generate (sample M.key_sizes)
4848- and ctr = Mirage_crypto_rng.generate bs |> M.ctr_of_octets
4949- and data = Mirage_crypto_rng.(generate @@ bs + Randomconv.int ~bound:(20 * bs) Mirage_crypto_rng.generate) in
4747+ let key = M.of_secret @@ Crypto_rng.generate (sample M.key_sizes)
4848+ and ctr = Crypto_rng.generate bs |> M.ctr_of_octets
4949+ and data = Crypto_rng.(generate @@ bs + Randomconv.int ~bound:(20 * bs) Crypto_rng.generate) in
5050 let enc = M.encrypt ~key ~ctr data in
5151 let dec = M.decrypt ~key ~ctr enc in
5252 assert_oct_equal ~msg:"CTR e->d" data dec;
5353 let (d1, d2) =
5454- let s = bs * Randomconv.int ~bound:(String.length data / bs) Mirage_crypto_rng.generate in
5454+ let s = bs * Randomconv.int ~bound:(String.length data / bs) Crypto_rng.generate in
5555 String.sub data 0 s, String.sub data s (String.length data - s)
5656 in
5757 assert_oct_equal ~msg:"CTR chain" enc @@
···6060let ctr_offsets (type c) ~zero (m : (module Block.CTR with type ctr = c)) n =
6161 let module M = (val m) in
6262 "offsets" >:: fun _ ->
6363- let key = M.of_secret @@ Mirage_crypto_rng.generate M.key_sizes.(0) in
6363+ let key = M.of_secret @@ Crypto_rng.generate M.key_sizes.(0) in
6464 for i = 0 to n - 1 do
6565 let ctr = match i with
6666 | 0 -> M.add_ctr zero (-1L)
6767- | _ -> Mirage_crypto_rng.generate M.block_size |> M.ctr_of_octets
6868- and gap = Randomconv.int ~bound:64 Mirage_crypto_rng.generate in
6767+ | _ -> Crypto_rng.generate M.block_size |> M.ctr_of_octets
6868+ and gap = Randomconv.int ~bound:64 Crypto_rng.generate in
6969 let s1 = M.stream ~key ~ctr ((gap + 1) * M.block_size)
7070 and s2 = M.stream ~key ~ctr:(M.add_ctr ctr (Int64.of_int gap)) M.block_size in
7171 assert_oct_equal ~msg:"shifted stream"
···7575let xor_selftest n =
7676 "selftest" >:: times ~n @@ fun _ ->
77777878- let n = Randomconv.int ~bound:30 Mirage_crypto_rng.generate in
7979- let (x, y, z) = Mirage_crypto_rng.(generate n, generate n, generate n) in
7878+ let n = Randomconv.int ~bound:30 Crypto_rng.generate in
7979+ let (x, y, z) = Crypto_rng.(generate n, generate n, generate n) in
80808181 let xyz = Uncommon.(xor (xor x y) z)
8282 and xyz' = Uncommon.(xor x (xor y z)) in
···105105 ]
106106107107let () =
108108- Mirage_crypto_rng_unix.use_default ();
108108+ Crypto_rng_unix.use_default ();
109109 run_test_tt_main suite
+14-14
tests/test_rsa.ml
···11open OUnit2
2233-open Mirage_crypto.Uncommon
44-open Mirage_crypto_pk
33+open Crypto.Uncommon
44+open Crypto_pk
5566open Test_common
77···1919 try
2020 Bytes.blit_string !g 0 buf off n;
2121 g := String.sub !g n (String.length !g - n)
2222- with Invalid_argument _ -> raise Mirage_crypto_rng.Unseeded_generator
2222+ with Invalid_argument _ -> raise Crypto_rng.Unseeded_generator
23232424 let reseed ~g buf = g := !g ^ buf
2525···3131end
32323333let random_is seed =
3434- Mirage_crypto_rng.create ~seed:seed (module Null)
3434+ Crypto_rng.create ~seed:seed (module Null)
35353636let gen_rsa ~bits =
3737 let e = Z.(if bits < 24 then ~$3 else ~$0x10001) in
···8383 let msg =
8484 let size = bits // 8 in
8585 let buf = Bytes.create size in
8686- Mirage_crypto_rng.generate_into buf ~off:0 size;
8787- let i = 1 + Randomconv.int ~bound:(pred size) Mirage_crypto_rng.generate in
8686+ Crypto_rng.generate_into buf ~off:0 size;
8787+ let i = 1 + Randomconv.int ~bound:(pred size) Crypto_rng.generate in
8888 Bytes.set_uint8 buf 0 0;
8989 Bytes.(set_uint8 buf i (get_uint8 buf i lor 2));
9090 Bytes.unsafe_to_string buf
···103103let pkcs_message_for_bits bits =
104104 let padding = 12 in
105105 let size = bits // 8 - padding in
106106- assert (size >= 0) ; Mirage_crypto_rng.generate size
106106+ assert (size >= 0) ; Crypto_rng.generate size
107107108108let rsa_pkcs1_encode_selftest ~bits n =
109109 "selftest" >:: times ~n @@ fun _ ->
···119119 let open Digestif.SHA1 in
120120 "selftest" >:: times ~n @@ fun _ ->
121121 let key = gen_rsa ~bits:(Rsa.PKCS1.min_key `SHA1)
122122- and msg = Mirage_crypto_rng.generate 47 in
122122+ and msg = Crypto_rng.generate 47 in
123123 let pkey = Rsa.pub_of_priv key in
124124 assert_bool "invert 1" Rsa.PKCS1.(
125125 verify ~key:pkey ~hashp:any (`Message msg)
···146146 let module OAEP_SHA384 = Rsa.OAEP (Digestif.SHA384) in
147147 "selftest" >:: times ~n @@ fun _ ->
148148 let key = gen_rsa ~bits in
149149- let msg = Mirage_crypto_rng.generate (bits // 8 - 2 * Digestif.MD5.digest_size - 2) in
149149+ let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.MD5.digest_size - 2) in
150150 let enc = OAEP_MD5.encrypt ~key:(Rsa.pub_of_priv key) msg in
151151 (match OAEP_MD5.decrypt ~key enc with
152152 | None -> assert_failure "unpad failure"
153153 | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure");
154154- let msg = Mirage_crypto_rng.generate (bits // 8 - 2 * Digestif.SHA1.digest_size - 2) in
154154+ let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.SHA1.digest_size - 2) in
155155 let enc = OAEP_SHA1.encrypt ~key:(Rsa.pub_of_priv key) msg in
156156 (match OAEP_SHA1.decrypt ~key enc with
157157 | None -> assert_failure "unpad failure"
158158 | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure");
159159- let msg = Mirage_crypto_rng.generate (bits // 8 - 2 * Digestif.SHA224.digest_size - 2) in
159159+ let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.SHA224.digest_size - 2) in
160160 let enc = OAEP_SHA224.encrypt ~key:(Rsa.pub_of_priv key) msg in
161161 (match OAEP_SHA224.decrypt ~key enc with
162162 | None -> assert_failure "unpad failure"
163163 | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure");
164164- let msg = Mirage_crypto_rng.generate (bits // 8 - 2 * Digestif.SHA256.digest_size - 2) in
164164+ let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.SHA256.digest_size - 2) in
165165 let enc = OAEP_SHA256.encrypt ~key:(Rsa.pub_of_priv key) msg in
166166 (match OAEP_SHA256.decrypt ~key enc with
167167 | None -> assert_failure "unpad failure"
168168 | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure");
169169- let msg = Mirage_crypto_rng.generate (bits // 8 - 2 * Digestif.SHA384.digest_size - 2) in
169169+ let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.SHA384.digest_size - 2) in
170170 let enc = OAEP_SHA384.encrypt ~key:(Rsa.pub_of_priv key) msg in
171171 (match OAEP_SHA384.decrypt ~key enc with
172172 | None -> assert_failure "unpad failure"
···176176 let module Pss_sha1 = Rsa.PSS (Digestif.SHA1) in
177177 "selftest" >:: times ~n @@ fun _ ->
178178 let key = gen_rsa ~bits
179179- and msg = Mirage_crypto_rng.generate 1024 in
179179+ and msg = Crypto_rng.generate 1024 in
180180 let pkey = Rsa.pub_of_priv key in
181181 let dgst = Digestif.SHA1.(digest_string msg |> to_raw_string) in
182182 let signature = Pss_sha1.sign ~key (`Digest dgst) in
+1-1
tests/test_symmetric_runner.ml
···55 (fun ppf -> List.iter @@ fun x ->
66 Format.fprintf ppf "%s " @@
77 match x with `XOR -> "XOR" | `AES -> "AES" | `GHASH -> "GHASH")
88- Mirage_crypto.accelerated
88+ Crypto.accelerated
991010let suite =
1111 "All" >::: [