···11+(** Diffie-Hellman key exchange over multiplicative groups of integers mod p. *)
22+33+exception Invalid_key
44+55+type group = private { p : Z.t; gg : Z.t; q : Z.t option }
66+77+val group :
88+ p:Z.t -> gg:Z.t -> ?q:Z.t -> unit -> (group, [> `Msg of string ]) result
99+1010+type secret = private { group : group; x : Z.t }
1111+1212+val modulus_size : group -> int
1313+val key_of_secret : group -> s:string -> secret * string
1414+val gen_key : ?g:Crypto_rng.g -> ?bits:int -> group -> secret * string
1515+val shared : secret -> string -> string option
1616+val gen_group : ?g:Crypto_rng.g -> bits:int -> unit -> group
1717+1818+module Group : sig
1919+ val oakley_1 : group
2020+ val oakley_2 : group
2121+ val oakley_5 : group
2222+ val oakley_14 : group
2323+ val oakley_15 : group
2424+ val oakley_16 : group
2525+ val oakley_17 : group
2626+ val oakley_18 : group
2727+ val rfc_5114_1 : group
2828+ val rfc_5114_2 : group
2929+ val rfc_5114_3 : group
3030+ val ffdhe2048 : group
3131+ val ffdhe3072 : group
3232+ val ffdhe4096 : group
3333+ val ffdhe6144 : group
3434+ val ffdhe8192 : group
3535+end