sig
  type t
  val t_of_sexp : Sexplib.Sexp.t -> X509.t
  val sexp_of_t : X509.t -> Sexplib.Sexp.t
  type key_type = [ `EC of Asn.oid | `RSA ]
  val supports_keytype : X509.t -> X509.key_type -> bool
  type public_key = [ `EC_pub of Asn.oid | `RSA of Nocrypto.Rsa.pub ]
  val key_id : X509.public_key -> Cstruct.t
  val key_fingerprint :
    ?hash:Nocrypto.Hash.hash -> X509.public_key -> Cstruct.t
  type private_key = [ `RSA of Nocrypto.Rsa.priv ]
  val public_key : X509.t -> X509.public_key
  val hostnames : X509.t -> string list
  type host = [ `Strict of string | `Wildcard of string ]
  val supports_hostname : X509.t -> X509.host -> bool
  val common_name_to_string : X509.t -> string
  type component =
      [ `C of string
      | `CN of string
      | `DC of string
      | `DNQ of string
      | `Generation of string
      | `Given_name of string
      | `Initials of string
      | `L of string
      | `Mail of string
      | `O of string
      | `OU of string
      | `Other of Asn.oid * string
      | `Pseudonym of string
      | `SP of string
      | `Serialnumber of string
      | `Surname of string
      | `T of string ]
  type distinguished_name = X509.component list
  val distinguished_name_of_sexp : Sexplib.Sexp.t -> X509.distinguished_name
  val sexp_of_distinguished_name : X509.distinguished_name -> Sexplib.Sexp.t
  val distinguished_name_to_string : X509.distinguished_name -> string
  val fingerprint : Nocrypto.Hash.hash -> X509.t -> Cstruct.t
  val subject : X509.t -> X509.distinguished_name
  val issuer : X509.t -> X509.distinguished_name
  val serial : X509.t -> Z.t
  val validity : X509.t -> Ptime.t * Ptime.t
  module Extension :
    sig
      type key_usage =
          [ `CRL_sign
          | `Content_commitment
          | `Data_encipherment
          | `Decipher_only
          | `Digital_signature
          | `Encipher_only
          | `Key_agreement
          | `Key_cert_sign
          | `Key_encipherment ]
      val supports_usage :
        ?not_present:bool -> X509.t -> X509.Extension.key_usage -> bool
      type extended_key_usage =
          [ `Any
          | `Client_auth
          | `Code_signing
          | `Email_protection
          | `Ipsec_end
          | `Ipsec_tunnel
          | `Ipsec_user
          | `Ocsp_signing
          | `Other of Asn.oid
          | `Server_auth
          | `Time_stamping ]
      val supports_extended_usage :
        ?not_present:bool ->
        X509.t -> X509.Extension.extended_key_usage -> bool
      val basic_constraints : X509.t -> (bool * int option) option
      type general_name =
          [ `DNS of string
          | `Directory of X509.distinguished_name
          | `EDI_party of string option * string
          | `IP of Cstruct.t
          | `Other of Asn.oid * string
          | `Registered_id of Asn.oid
          | `Rfc_822 of string
          | `URI of string
          | `X400_address of unit ]
      type authority_key_id =
          Cstruct.t option * X509.Extension.general_name list * Z.t option
      type priv_key_usage_period =
          [ `Interval of Ptime.t * Ptime.t
          | `Not_after of Ptime.t
          | `Not_before of Ptime.t ]
      type name_constraint =
          (X509.Extension.general_name * int * int option) list
      type policy = [ `Any | `Something of Asn.oid ]
      val unsupported : X509.t -> Asn.OID.t -> (bool * Cstruct.t) option
      val subject_alt_names : X509.t -> X509.Extension.general_name list
      type reason =
          [ `AA_compromise
          | `Affiliation_changed
          | `CA_compromise
          | `Certificate_hold
          | `Cessation_of_operation
          | `Key_compromise
          | `Privilege_withdrawn
          | `Superseded
          | `Unused ]
      type distribution_point_name =
          [ `Full of X509.Extension.general_name list
          | `Relative of X509.distinguished_name ]
      type distribution_point =
          X509.Extension.distribution_point_name option *
          X509.Extension.reason list option * X509.distinguished_name option
      val crl_distribution_points :
        X509.t -> X509.Extension.distribution_point list
      type reason_code =
          [ `AA_compromise
          | `Affiliation_changed
          | `CA_compromise
          | `Certificate_hold
          | `Cessation_of_operation
          | `Key_compromise
          | `Privilege_withdrawn
          | `Remove_from_CRL
          | `Superseded
          | `Unspecified ]
      type t =
          [ `Authority_key_id of X509.Extension.authority_key_id
          | `Basic_constraints of bool * int option
          | `CRL_distribution_points of
              X509.Extension.distribution_point list
          | `CRL_number of int
          | `Certificate_issuer of X509.Extension.general_name list
          | `Delta_CRL_indicator of int
          | `Ext_key_usage of X509.Extension.extended_key_usage list
          | `Freshest_CRL of X509.Extension.distribution_point list
          | `Invalidity_date of Ptime.t
          | `Issuer_alt_name of X509.Extension.general_name list
          | `Issuing_distribution_point of
              X509.Extension.distribution_point_name option * bool * 
              bool * X509.Extension.reason list option * bool * bool
          | `Key_usage of X509.Extension.key_usage list
          | `Name_constraints of
              X509.Extension.name_constraint * X509.Extension.name_constraint
          | `Policies of X509.Extension.policy list
          | `Priv_key_period of X509.Extension.priv_key_usage_period
          | `Reason of X509.Extension.reason_code
          | `Subject_alt_name of X509.Extension.general_name list
          | `Subject_key_id of Cstruct.t
          | `Unsupported of Asn.oid * Cstruct.t ]
    end
  module CA :
    sig
      type signing_request
      type request_extensions =
          [ `Extensions of (bool * X509.Extension.t) list
          | `Name of string
          | `Password of string ]
      type request_info = {
        subject : X509.distinguished_name;
        public_key : X509.public_key;
        extensions : X509.CA.request_extensions list;
      }
      val info : X509.CA.signing_request -> X509.CA.request_info
      val request :
        X509.distinguished_name ->
        ?digest:Nocrypto.Hash.hash ->
        ?extensions:X509.CA.request_extensions list ->
        X509.private_key -> X509.CA.signing_request
      val sign :
        X509.CA.signing_request ->
        valid_from:Ptime.t ->
        valid_until:Ptime.t ->
        ?digest:Nocrypto.Hash.hash ->
        ?serial:Z.t ->
        ?extensions:(bool * X509.Extension.t) list ->
        X509.private_key -> X509.distinguished_name -> X509.t
    end
  module CRL :
    sig
      type c
      val issuer : X509.CRL.c -> X509.distinguished_name
      val this_update : X509.CRL.c -> Ptime.t
      val next_update : X509.CRL.c -> Ptime.t option
      type revoked_cert = {
        serial : Z.t;
        date : Ptime.t;
        extensions : (bool * X509.Extension.t) list;
      }
      val reason : X509.CRL.revoked_cert -> X509.Extension.reason_code option
      val revoked_certificates : X509.CRL.c -> X509.CRL.revoked_cert list
      val extensions : X509.CRL.c -> (bool * X509.Extension.t) list
      val crl_number : X509.CRL.c -> int option
      val validate : X509.CRL.c -> X509.public_key -> bool
      val verify : X509.CRL.c -> ?time:Ptime.t -> X509.t -> bool
      val is_revoked :
        X509.CRL.c list -> issuer:X509.t -> cert:X509.t -> bool
      val revoke :
        ?digest:Nocrypto.Hash.hash ->
        issuer:X509.distinguished_name ->
        this_update:Ptime.t ->
        ?next_update:Ptime.t ->
        ?extensions:(bool * X509.Extension.t) list ->
        X509.CRL.revoked_cert list -> X509.private_key -> X509.CRL.c
      val revoke_certificate :
        X509.CRL.revoked_cert ->
        this_update:Ptime.t ->
        ?next_update:Ptime.t -> X509.CRL.c -> X509.private_key -> X509.CRL.c
      val revoke_certificates :
        X509.CRL.revoked_cert list ->
        this_update:Ptime.t ->
        ?next_update:Ptime.t -> X509.CRL.c -> X509.private_key -> X509.CRL.c
    end
  module Validation :
    sig
      type ca_error =
          [ `CACertificateExpired of X509.t * Ptime.t option
          | `CAInvalidExtensions of X509.t
          | `CAInvalidSelfSignature of X509.t
          | `CAInvalidVersion of X509.t
          | `CAIssuerSubjectMismatch of X509.t ]
      val ca_error_of_sexp : Sexplib.Sexp.t -> X509.Validation.ca_error
      val sexp_of_ca_error : X509.Validation.ca_error -> Sexplib.Sexp.t
      val ca_error_to_string : X509.Validation.ca_error -> string
      val valid_ca :
        ?time:Ptime.t ->
        X509.t -> [ `Error of X509.Validation.ca_error | `Ok ]
      val valid_cas : ?time:Ptime.t -> X509.t list -> X509.t list
      type leaf_validation_error =
          [ `LeafCertificateExpired of X509.t * Ptime.t option
          | `LeafInvalidExtensions of X509.t
          | `LeafInvalidName of X509.t * X509.host option
          | `LeafInvalidVersion of X509.t ]
      type chain_validation_error =
          [ `ChainAuthorityKeyIdSubjectKeyIdMismatch of X509.t * X509.t
          | `ChainInvalidPathlen of X509.t * int
          | `ChainInvalidSignature of X509.t * X509.t
          | `ChainIssuerSubjectMismatch of X509.t * X509.t
          | `EmptyCertificateChain
          | `IntermediateCertificateExpired of X509.t * Ptime.t option
          | `IntermediateInvalidExtensions of X509.t
          | `IntermediateInvalidVersion of X509.t
          | `NoTrustAnchor of X509.t
          | `Revoked of X509.t ]
      val build_paths : X509.t -> X509.t list -> X509.t list list
      type chain_error =
          [ `Chain of X509.Validation.chain_validation_error
          | `Leaf of X509.Validation.leaf_validation_error ]
      val chain_error_of_sexp : Sexplib.Sexp.t -> X509.Validation.chain_error
      val sexp_of_chain_error : X509.Validation.chain_error -> Sexplib.Sexp.t
      val chain_error_to_string : X509.Validation.chain_error -> string
      val verify_chain :
        ?host:X509.host ->
        ?time:Ptime.t ->
        ?revoked:(issuer:X509.t -> cert:X509.t -> bool) ->
        anchors:X509.t list ->
        X509.t list ->
        [ `Fail of X509.Validation.chain_error | `Ok of X509.t ]
      type fingerprint_validation_error =
          [ `InvalidFingerprint of X509.t * Cstruct.t * Cstruct.t
          | `NameNotInList of X509.t
          | `ServerNameNotPresent of X509.t * string ]
      type validation_error =
          [ `EmptyCertificateChain
          | `Fingerprint of X509.Validation.fingerprint_validation_error
          | `InvalidChain
          | `Leaf of X509.Validation.leaf_validation_error ]
      val validation_error_of_sexp :
        Sexplib.Sexp.t -> X509.Validation.validation_error
      val sexp_of_validation_error :
        X509.Validation.validation_error -> Sexplib.Sexp.t
      val validation_error_to_string :
        X509.Validation.validation_error -> string
      type result =
          [ `Fail of X509.Validation.validation_error
          | `Ok of (X509.t list * X509.t) option ]
      val verify_chain_of_trust :
        ?host:X509.host ->
        ?time:Ptime.t ->
        ?revoked:(issuer:X509.t -> cert:X509.t -> bool) ->
        anchors:X509.t list -> X509.t list -> X509.Validation.result
      val trust_key_fingerprint :
        ?host:X509.host ->
        ?time:Ptime.t ->
        hash:Nocrypto.Hash.hash ->
        fingerprints:(string * Cstruct.t) list ->
        X509.t list -> X509.Validation.result
      val trust_cert_fingerprint :
        ?host:X509.host ->
        ?time:Ptime.t ->
        hash:Nocrypto.Hash.hash ->
        fingerprints:(string * Cstruct.t) list ->
        X509.t list -> X509.Validation.result
    end
  module Authenticator :
    sig
      type a = ?host:X509.host -> X509.t list -> X509.Validation.result
      val chain_of_trust :
        ?time:Ptime.t ->
        ?crls:X509.CRL.c list -> X509.t list -> X509.Authenticator.a
      val server_key_fingerprint :
        ?time:Ptime.t ->
        hash:Nocrypto.Hash.hash ->
        fingerprints:(string * Cstruct.t) list -> X509.Authenticator.a
      val server_cert_fingerprint :
        ?time:Ptime.t ->
        hash:Nocrypto.Hash.hash ->
        fingerprints:(string * Cstruct.t) list -> X509.Authenticator.a
      val null : X509.Authenticator.a
      val a_of_sexp : Sexplib.Sexp.t -> X509.Authenticator.a
      val sexp_of_a : X509.Authenticator.a -> Sexplib.Sexp.t
    end
  module Encoding :
    sig
      val parse : Cstruct.t -> X509.t option
      val cs_of_cert : X509.t -> Cstruct.t
      val cs_of_distinguished_name : X509.distinguished_name -> Cstruct.t
      val parse_signing_request : Cstruct.t -> X509.CA.signing_request option
      val cs_of_signing_request : X509.CA.signing_request -> Cstruct.t
      val pkcs1_digest_info_of_cstruct :
        Cstruct.t -> (Nocrypto.Hash.hash * Cstruct.t) option
      val pkcs1_digest_info_to_cstruct :
        Nocrypto.Hash.hash * Cstruct.t -> Cstruct.t
      val rsa_public_to_cstruct : Nocrypto.Rsa.pub -> Cstruct.t
      val rsa_public_of_cstruct : Cstruct.t -> Nocrypto.Rsa.pub option
      val crl_to_cstruct : X509.CRL.c -> Cstruct.t
      val crl_of_cstruct : Cstruct.t -> X509.CRL.c option
      module Pem :
        sig
          val parse : Cstruct.t -> (string * Cstruct.t) list
          module Certificate :
            sig
              val of_pem_cstruct : Cstruct.t -> X509.t list
              val of_pem_cstruct1 : Cstruct.t -> X509.t
              val to_pem_cstruct : X509.t list -> Cstruct.t
              val to_pem_cstruct1 : X509.t -> Cstruct.t
            end
          module Certificate_signing_request :
            sig
              type t = X509.CA.signing_request
              val of_pem_cstruct :
                Cstruct.t ->
                X509.Encoding.Pem.Certificate_signing_request.t list
              val of_pem_cstruct1 :
                Cstruct.t -> X509.Encoding.Pem.Certificate_signing_request.t
              val to_pem_cstruct :
                X509.Encoding.Pem.Certificate_signing_request.t list ->
                Cstruct.t
              val to_pem_cstruct1 :
                X509.Encoding.Pem.Certificate_signing_request.t -> Cstruct.t
            end
          module Public_key :
            sig
              val of_pem_cstruct : Cstruct.t -> X509.public_key list
              val of_pem_cstruct1 : Cstruct.t -> X509.public_key
              val to_pem_cstruct : X509.public_key list -> Cstruct.t
              val to_pem_cstruct1 : X509.public_key -> Cstruct.t
            end
          module Private_key :
            sig
              val of_pem_cstruct : Cstruct.t -> X509.private_key list
              val of_pem_cstruct1 : Cstruct.t -> X509.private_key
              val to_pem_cstruct : X509.private_key list -> Cstruct.t
              val to_pem_cstruct1 : X509.private_key -> Cstruct.t
            end
        end
    end
end