96 lines
3.9 KiB
OCaml
96 lines
3.9 KiB
OCaml
(** Effectful operations using Miou for pure TLS.
|
|
|
|
The pure TLS is state and buffer in, state and buffer out. This module uses
|
|
Miou (and its Unix layer) for communication over the network. *)
|
|
|
|
exception Tls_alert of Tls.Packet.alert_type
|
|
exception Tls_failure of Tls.Engine.failure
|
|
exception Closed_by_peer
|
|
|
|
type t
|
|
(** Abstract type of a session. *)
|
|
|
|
val file_descr : t -> Miou_unix.file_descr
|
|
(** [file_descr] returns the underlying file-descriptor used by the given
|
|
TLS {i socket}. *)
|
|
|
|
val read : t -> ?off:int -> ?len:int -> bytes -> int
|
|
(** [read fd buf ~off ~len] reads up to [len] bytes (defaults to
|
|
[Bytes.length buf - off] from the given TLS {i socket} [fd], storing them in
|
|
byte sequence [buf], starting at position [off] in [buf] (defaults to [0]).
|
|
It returns the actual number of characters read, between 0 and [len]
|
|
(inclusive).
|
|
|
|
@raise Unix_error raised by the system call {!val:Unix.read}. The function
|
|
handles {!val:Unix.EINTR}, {!val:Unix.EAGAIN} and {!val:Unix.EWOULDBLOCK}
|
|
exceptions and redo the system call.
|
|
|
|
@raise Invalid_argument if [off] and [len] do not designate a valid range of
|
|
[buf]. *)
|
|
|
|
val really_read : t -> ?off:int -> ?len:int -> bytes -> unit
|
|
(** [really_read fd buf ~off ~len] reads [len] bytes (defaults to
|
|
[Bytes.length buf - off]) from the given TLS {i socket} [fd], storing them
|
|
in byte sequence [buf], starting at position [off] in [buf] (defaults to
|
|
[0]). If [len = 0], [really_read] does nothing.
|
|
|
|
@raise Unix_error raised by the system call {!val:Unix.read}. The function
|
|
handles {!val:Unix.EINTR}, {!val:Unix.EAGAIN} and {!val:Unix.EWOULDBLOCK}
|
|
exceptions and redo the system call.
|
|
|
|
@raise End_of_file if {!val:Unix.read} returns [0] before [len] characters
|
|
have been read.
|
|
|
|
@raise Invalid_argument if [off] and [len] do not designate a valid range of
|
|
[buf]. *)
|
|
|
|
val write : t -> ?off:int -> ?len:int -> string -> unit
|
|
(** [write t str ~off ~len] writes [len] bytes (defaults to
|
|
[String.length str - off]) from byte sequence [str], starting at offset
|
|
[off] (defaults to [0]), to the given TLS {i socket} [fd].
|
|
|
|
@raise Unix_error raised by the syscall call {!val:Unix.write}. The function
|
|
handles {!val:Unix.EINTR}, {!val:Unix.EAGAIN} and {!val:Unix.EWOULDBLOCK}
|
|
exceptions and redo the system call.
|
|
|
|
@raise Closed_by_peer if [t] is connected to a peer whose reading end is
|
|
closed. Similar to the {!val:EPIPE} error for pipe/socket connected.
|
|
|
|
@raise Invalid_argument if [off] and [len] do not designate a valid range of
|
|
[buf]. *)
|
|
|
|
val close : t -> unit
|
|
(** [close flow] closes the TLS session and the underlying file-descriptor. *)
|
|
|
|
val shutdown : t -> [ `read | `write | `read_write ] -> unit
|
|
(** [shutdown t direction] closes the direction of the TLS session [t]. If
|
|
[`read_write] or [`write] is closed, a TLS close-notify is sent to the other
|
|
endpoint. If this results in a fully-closed session (or an errorneous
|
|
session), the underlying file descriptor is closed. *)
|
|
|
|
val client_of_fd :
|
|
Tls.Config.client ->
|
|
?read_buffer_size:int ->
|
|
?host:[ `host ] Domain_name.t ->
|
|
Miou_unix.file_descr ->
|
|
t
|
|
(** [client_of_flow client ~host fd] is [t], after client-side TLS handshake of
|
|
[fd] using [client] configuration and [host].
|
|
|
|
@raise End_of_file if we are not able to complete the handshake. *)
|
|
|
|
val server_of_fd :
|
|
Tls.Config.server -> ?read_buffer_size:int -> Miou_unix.file_descr -> t
|
|
(** [server_of_fd server fd] is [t], after server-side TLS handshake of [fd]
|
|
using [server] configuration.
|
|
|
|
@raise End_of_file if we are not able to complete the handshake. *)
|
|
|
|
val connect : X509.Authenticator.t -> string * int -> t
|
|
(** [connect authenticator (host, port)] is [t], a connected TLS connection
|
|
to [host] on [port] using the default configuration and the
|
|
[authenticator]. *)
|
|
|
|
val epoch : t -> Tls.Core.epoch_data option
|
|
(** [epoch t] returns [epoch], which contains information of the active
|
|
session. *)
|