···1+(** Diffie-Hellman key exchange over multiplicative groups of integers mod p. *)
2+3+exception Invalid_key
4+5+type group = private { p : Z.t; gg : Z.t; q : Z.t option }
6+7+val group :
8+ p:Z.t -> gg:Z.t -> ?q:Z.t -> unit -> (group, [> `Msg of string ]) result
9+10+type secret = private { group : group; x : Z.t }
11+12+val modulus_size : group -> int
13+val key_of_secret : group -> s:string -> secret * string
14+val gen_key : ?g:Crypto_rng.g -> ?bits:int -> group -> secret * string
15+val shared : secret -> string -> string option
16+val gen_group : ?g:Crypto_rng.g -> bits:int -> unit -> group
17+18+module Group : sig
19+ val oakley_1 : group
20+ val oakley_2 : group
21+ val oakley_5 : group
22+ val oakley_14 : group
23+ val oakley_15 : group
24+ val oakley_16 : group
25+ val oakley_17 : group
26+ val oakley_18 : group
27+ val rfc_5114_1 : group
28+ val rfc_5114_2 : group
29+ val rfc_5114_3 : group
30+ val ffdhe2048 : group
31+ val ffdhe3072 : group
32+ val ffdhe4096 : group
33+ val ffdhe6144 : group
34+ val ffdhe8192 : group
35+end