sig
  type ret =
      [ `Established_encrypted_session of string
      | `Received of string
      | `Received_encrypted of string
      | `Received_error of string
      | `SMP_awaiting_secret
      | `SMP_failure
      | `SMP_received_question of string
      | `SMP_success
      | `Warning of string ]
  type policy =
      [ `ERROR_START_AKE
      | `REQUIRE_ENCRYPTION
      | `REVEAL_MACS
      | `SEND_WHITESPACE_TAG
      | `WHITESPACE_START_AKE ]
  val sexp_of_policy : Otr.State.policy -> Sexplib.Sexp.t
  val policy_of_sexp : Sexplib.Sexp.t -> Otr.State.policy
  val policy_to_string : Otr.State.policy -> string
  val string_to_policy : string -> Otr.State.policy option
  val all_policies : Otr.State.policy list
  type version = [ `V2 | `V3 ]
  val sexp_of_version : Otr.State.version -> Sexplib.Sexp.t
  val version_of_sexp : Sexplib.Sexp.t -> Otr.State.version
  val version_to_string : Otr.State.version -> string
  val string_to_version : string -> Otr.State.version option
  val all_versions : Otr.State.version list
  type config = {
    policies : Otr.State.policy list;
    versions : Otr.State.version list;
  }
  val sexp_of_config : Otr.State.config -> Sexplib.Sexp.t
  val config_of_sexp : Sexplib.Sexp.t -> Otr.State.config
  val config :
    Otr.State.version list -> Otr.State.policy list -> Otr.State.config
  type session
  val session_to_string : Otr.State.session -> string
  val version : Otr.State.session -> Otr.State.version
  val is_encrypted : Otr.State.session -> bool
  val their_dsa : Otr.State.session -> Nocrypto.Dsa.pub option
  val new_session :
    Otr.State.config -> Nocrypto.Dsa.priv -> unit -> Otr.State.session
  val update_config :
    Otr.State.config -> Otr.State.session -> Otr.State.session
end