upstream: https://github.com/mirage/mirage-crypto
1(** Extra Z arithmetic utilities for big-endian octet conversion and random
2 generation. *)
3
4val bit_bound : Z.t -> int
5(** [bit_bound z] is the number of bytes needed to represent [z]. *)
6
7val of_octets_be : ?bits:int -> string -> Z.t
8(** [of_octets_be ~bits s] decodes a big-endian unsigned integer from [s]. *)
9
10val into_octets_be : Z.t -> bytes -> unit
11(** [into_octets_be z buf] writes [z] as big-endian octets into [buf]. *)
12
13val to_octets_be : ?size:int -> Z.t -> string
14(** [to_octets_be ~size z] encodes [z] as a big-endian string of [size] bytes.
15*)
16
17val pseudoprime : Z.t -> bool
18(** [pseudoprime z] is [true] if [z] is a probable prime (Miller-Rabin). *)
19
20val strip_factor : f:Z.t -> Z.t -> (int * Z.t, [> `Msg of string ]) result
21(** [strip_factor ~f n] removes all factors of [f] from [n]. Returns [(k, m)]
22 where [n = f^k * m]. *)
23
24val gen : ?g:Crypto_rng.g -> Z.t -> Z.t
25(** [gen ~g bound] generates a random integer in [\[0, bound)]. *)
26
27val gen_r : ?g:Crypto_rng.g -> Z.t -> Z.t -> Z.t
28(** [gen_r ~g lo hi] generates a random integer in [\[lo, hi)]. *)
29
30val gen_bits : ?g:Crypto_rng.g -> ?msb:int -> int -> Z.t
31(** [gen_bits ~g ~msb bits] generates a random [bits]-bit integer with the top
32 [msb] bits set. *)
33
34val prime : ?g:Crypto_rng.g -> ?msb:int -> int -> Z.t
35(** [prime ~g ~msb bits] generates a random [bits]-bit prime. *)
36
37val safe_prime : ?g:Crypto_rng.g -> int -> Z.t * Z.t
38(** [safe_prime ~g bits] generates a safe prime [p] of [bits] bits and returns
39 [(p, q)] where [p = 2q + 1]. *)