sig
  module State :
    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
  module Engine :
    sig
      val start_otr : Otr.State.session -> Otr.State.session * string
      val send_otr :
        Otr.State.session ->
        string ->
        Otr.State.session * string option *
        [ `Sent of string | `Sent_encrypted of string | `Warning of string ]
      val end_otr : Otr.State.session -> Otr.State.session * string option
      val handle :
        Otr.State.session ->
        string -> Otr.State.session * string option * Otr.State.ret list
      val start_smp :
        Otr.State.session ->
        ?question:string ->
        string -> Otr.State.session * string option * Otr.State.ret list
      val abort_smp :
        Otr.State.session ->
        Otr.State.session * string option * Otr.State.ret list
      val answer_smp :
        Otr.State.session ->
        string -> Otr.State.session * string option * Otr.State.ret list
    end
  module Utils :
    sig
      val their_fingerprint : Otr.State.session -> string option
      val own_fingerprint : Nocrypto.Dsa.priv -> string
    end
end