sig
  type oid
  module OID :
    sig
      type t = Asn.oid
      val equal : Asn.OID.t -> Asn.OID.t -> bool
      val compare : Asn.OID.t -> Asn.OID.t -> int
      val hash : Asn.OID.t -> int
      val seeded_hash : int -> Asn.OID.t -> int
      val base : int -> int -> Asn.OID.t
      val ( <| ) : Asn.OID.t -> int -> Asn.OID.t
      val ( <|| ) : Asn.OID.t -> int list -> Asn.OID.t
      val to_nodes : Asn.OID.t -> int * int * int list
      val of_nodes : int -> int -> int list -> Asn.OID.t option
      val pp : Format.formatter -> Asn.OID.t -> unit
      val of_string : string -> Asn.OID.t option
    end
  type 'a t
  module S :
    sig
      type nonrec 'a t = 'Asn.t
      val fix : ('Asn.S.t -> 'Asn.S.t) -> 'Asn.S.t
      val map :
        ?random:(unit -> 'b) ->
        ('-> 'b) -> ('-> 'a) -> 'Asn.S.t -> 'Asn.S.t
      type cls = [ `Application | `Private | `Universal ]
      val implicit : ?cls:Asn.S.cls -> int -> 'Asn.S.t -> 'Asn.S.t
      val explicit : ?cls:Asn.S.cls -> int -> 'Asn.S.t -> 'Asn.S.t
      type 'a element
      val required : ?label:string -> 'Asn.S.t -> 'Asn.S.element
      val optional : ?label:string -> 'Asn.S.t -> 'a option Asn.S.element
      type 'a sequence
      val single : 'Asn.S.element -> 'Asn.S.sequence
      val ( @ ) :
        'Asn.S.element -> 'Asn.S.sequence -> ('a * 'b) Asn.S.sequence
      val ( -@ ) :
        'Asn.S.element -> 'Asn.S.element -> ('a * 'b) Asn.S.sequence
      val sequence : 'Asn.S.sequence -> 'Asn.S.t
      val sequence_of : 'Asn.S.t -> 'a list Asn.S.t
      val sequence2 :
        'Asn.S.element -> 'Asn.S.element -> ('a * 'b) Asn.S.t
      val sequence3 :
        'Asn.S.element ->
        'Asn.S.element -> 'Asn.S.element -> ('a * 'b * 'c) Asn.S.t
      val sequence4 :
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element -> 'Asn.S.element -> ('a * 'b * 'c * 'd) Asn.S.t
      val sequence5 :
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element -> ('a * 'b * 'c * 'd * 'e) Asn.S.t
      val sequence6 :
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element -> ('a * 'b * 'c * 'd * 'e * 'f) Asn.S.t
      val set : 'Asn.S.sequence -> 'Asn.S.t
      val set_of : 'Asn.S.t -> 'a list Asn.S.t
      val set2 : 'Asn.S.element -> 'Asn.S.element -> ('a * 'b) Asn.S.t
      val set3 :
        'Asn.S.element ->
        'Asn.S.element -> 'Asn.S.element -> ('a * 'b * 'c) Asn.S.t
      val set4 :
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element -> 'Asn.S.element -> ('a * 'b * 'c * 'd) Asn.S.t
      val set5 :
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element -> ('a * 'b * 'c * 'd * 'e) Asn.S.t
      val set6 :
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element ->
        'Asn.S.element -> ('a * 'b * 'c * 'd * 'e * 'f) Asn.S.t
      val choice2 :
        'Asn.S.t -> 'Asn.S.t -> [ `C1 of '| `C2 of 'b ] Asn.S.t
      val choice3 :
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t -> [ `C1 of '| `C2 of '| `C3 of 'c ] Asn.S.t
      val choice4 :
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        [ `C1 of '| `C2 of '| `C3 of '| `C4 of 'd ] Asn.S.t
      val choice5 :
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        [ `C1 of '| `C2 of '| `C3 of '| `C4 of '| `C5 of 'e ] Asn.S.t
      val choice6 :
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        'Asn.S.t ->
        [ `C1 of 'a
        | `C2 of 'b
        | `C3 of 'c
        | `C4 of 'd
        | `C5 of 'e
        | `C6 of 'f ] Asn.S.t
      val bool : bool Asn.S.t
      val integer : Z.t Asn.S.t
      val bit_string : bool array Asn.S.t
      val bit_string_cs : Cstruct.t Asn.S.t
      val octet_string : Cstruct.t Asn.S.t
      val null : unit Asn.S.t
      val oid : Asn.oid Asn.S.t
      val enumerated : (int -> 'a) -> ('-> int) -> 'Asn.S.t
      val generalized_time : Ptime.t Asn.S.t
      val utc_time : Ptime.t Asn.S.t
      val utf8_string : string Asn.S.t
      val numeric_string : string Asn.S.t
      val printable_string : string Asn.S.t
      val teletex_string : string Asn.S.t
      val videotex_string : string Asn.S.t
      val ia5_string : string Asn.S.t
      val graphic_string : string Asn.S.t
      val visible_string : string Asn.S.t
      val general_string : string Asn.S.t
      val universal_string : string Asn.S.t
      val bmp_string : string Asn.S.t
      val int : int Asn.S.t
      val bit_string_flags : (int * 'a) list -> 'a list Asn.S.t
      val error : [ `Parse of string ] -> 'a
      val parse_error :
        ('a, Format.formatter, unit, 'b) Pervasives.format4 -> 'a
    end
  type encoding
  val ber : Asn.encoding
  val der : Asn.encoding
  type 'a codec
  exception Ambiguous_syntax
  val codec : Asn.encoding -> 'Asn.t -> 'Asn.codec
  val encode : 'Asn.codec -> '-> Cstruct.t
  val encode_into : 'Asn.codec -> '-> int * (Cstruct.t -> unit)
  type error = [ `Parse of string ]
  val pp_error : Format.formatter -> Asn.error -> unit
  val decode :
    'Asn.codec -> Cstruct.t -> ('a * Cstruct.t, Asn.error) Result.result
  val random : 'Asn.t -> 'a
end