(* (c) 2017, 2018 Hannes Mehnert, all rights reserved *)
module Make (S : Tcpip.Stack.V4V6) : sig

  val retrieve_certificate :
    S.t -> ([`raw ] Domain_name.t * Dns.Dnskey.t) ->
    hostname:[ `host ] Domain_name.t ->
    ?additional_hostnames:[ `raw ] Domain_name.t list ->
    ?key_type:X509.Key_type.t -> ?key_data:string -> ?key_seed:string ->
    ?bits:int -> S.TCP.ipaddr -> int ->
    (X509.Certificate.t list * X509.Private_key.t, [ `Msg of string ]) result Lwt.t
  (** [retrieve_certificate stack dns_key ~hostname ~key_type ~key_data ~key_seed ~bits server_ip port]
      generates a private key (using [key_type], [key_data], [key_seed], and
      [bits]), a certificate signing request for the given [hostname] and
      [additional_hostnames], and sends [server_ip] an nsupdate (DNS-TSIG with
      [dns_key]) with the csr as TLSA record, awaiting for a matching
      certificate as TLSA record. Requires a service that interacts with let's
      encrypt to transform the CSR into a signed certificate. If something
      fails, an exception (via [Lwt.fail]) is raised. This is meant for
      unikernels that require a valid TLS certificate before they can start
      their service (i.e. most web servers, mail servers). *)
end
