Skip to content

Commit ab95779

Browse files
committed
Tls: in Config.{client,server} avoid raising an exception
Instead, a result value is returned. Addresses mirleft#411
1 parent f89d107 commit ab95779

22 files changed

+256
-198
lines changed

async/examples/test_client.ml

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ open! Core
22
open! Async
33
open Deferred.Or_error.Let_syntax
44

5-
let config = Tls.Config.client ~authenticator:(fun ?ip:_ ~host:_ _ -> Ok None) ()
5+
let config = match Tls.Config.client ~authenticator:(fun ?ip:_ ~host:_ _ -> Ok None) () with
6+
| Ok cfg -> cfg
7+
| Error `Msg msg -> invalid_arg msg
68

79
let test_client () =
810
let host = "127.0.0.1" in

async/examples/test_server.ml

+9-6
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ let serve_tls ~low_level port handler =
1212
Tls_async.X509_async.Private_key.of_pem_file server_key |> Deferred.Or_error.ok_exn
1313
in
1414
let config =
15-
Tls.Config.(
16-
server
17-
~version:(`TLS_1_0, `TLS_1_2)
18-
~certificates:(`Single (certificate, priv_key))
19-
~ciphers:Ciphers.supported
20-
())
15+
match Tls.Config.(
16+
server
17+
~version:(`TLS_1_0, `TLS_1_2)
18+
~certificates:(`Single (certificate, priv_key))
19+
~ciphers:Ciphers.supported
20+
())
21+
with
22+
| Ok cfg -> cfg
23+
| Error `Msg msg -> invalid_arg msg
2124
in
2225
let where_to_listen = Tcp.Where_to_listen.of_port port in
2326
let on_handler_error = `Ignore in

bench/speed.ml

+10-3
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,18 @@ type state =
6262
; client_out : int
6363
; direction : [ `To_server | `To_client ] }
6464

65+
let get_ok = function
66+
| Ok cfg -> cfg
67+
| Error `Msg msg -> invalid_arg msg
68+
6569
let make ?groups ~cipher ~digest ~key version direction =
6670
let cert = cert ~digest ~key in
67-
let client_cfg = Tls.Config.client ?groups ~version:(version, version)
68-
~ciphers:[ cipher ] ~authenticator ()
69-
and server_cfg = Tls.Config.server ~certificates:(`Single ([ cert ], key)) () in
71+
let client_cfg =
72+
get_ok (Tls.Config.client ?groups ~version:(version, version)
73+
~ciphers:[ cipher ] ~authenticator ())
74+
and server_cfg =
75+
get_ok (Tls.Config.server ~certificates:(`Single ([ cert ], key)) ())
76+
in
7077
let client_state, client_out = Tls.Engine.client client_cfg
7178
and server_state = Tls.Engine.server server_cfg in
7279
{ flow= To_server (client_state, server_state, Some client_out)

lib/config.ml

+195-159
Large diffs are not rendered by default.

lib/config.mli

+4-6
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ type server
5656
(** {1 Constructors} *)
5757

5858
(** [client authenticator ?peer_name ?ciphers ?version ?hashes ?reneg ?certificates ?alpn_protocols] is
59-
[client] configuration with the given parameters.
60-
@raise Invalid_argument if the configuration is invalid *)
59+
[client] configuration with the given parameters. Returns an error if the configuration is invalid. *)
6160
val client :
6261
authenticator : X509.Authenticator.t ->
6362
?peer_name : [ `host ] Domain_name.t ->
@@ -72,11 +71,10 @@ val client :
7271
?alpn_protocols : string list ->
7372
?groups : group list ->
7473
?ip : Ipaddr.t ->
75-
unit -> client
74+
unit -> (client, [> `Msg of string ]) result
7675

7776
(** [server ?ciphers ?version ?hashes ?reneg ?certificates ?acceptable_cas ?authenticator ?alpn_protocols]
78-
is [server] configuration with the given parameters.
79-
@raise Invalid_argument if the configuration is invalid *)
77+
is [server] configuration with the given parameters. Returns an error if the configuration is invalid. *)
8078
val server :
8179
?ciphers : Ciphersuite.ciphersuite list ->
8280
?version : tls_version * tls_version ->
@@ -91,7 +89,7 @@ val server :
9189
?groups : group list ->
9290
?zero_rtt : int32 ->
9391
?ip : Ipaddr.t ->
94-
unit -> server
92+
unit -> (server, [> `Msg of string ]) result
9593

9694
(** [peer client name] is [client] with [name] as [peer_name] *)
9795
val peer : client -> [ `host ] Domain_name.t -> client

lwt/examples/dune

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
(executable
77
(name starttls_server)
88
(modules starttls_server)
9-
(libraries tls-lwt lwt.unix))
9+
(libraries tls-lwt lwt.unix ex_common))
1010

1111
(executable
1212
(name echo_server)

lwt/examples/echo_client.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ let echo_client ?ca hostname port =
3434
~cert:server_cert
3535
~priv_key:server_key >>= fun certificate ->
3636
Tls_lwt.connect_ext
37-
Tls.Config.(client ~authenticator ~cached_session ~certificates:(`Single certificate) ~ciphers:Ciphers.supported ())
37+
(get_ok Tls.Config.(client ~authenticator ~cached_session ~certificates:(`Single certificate) ~ciphers:Ciphers.supported ()))
3838
(hostname, port) >>= fun (ic, oc) ->
3939
Lwt.join [
4040
lines ic |> Lwt_stream.iter_s (printf "+ %s\n%!") ;

lwt/examples/echo_client_alpn.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ let echo_client host port =
77
let port = int_of_string port in
88
let authenticator = null_auth in
99
Tls_lwt.Unix.connect
10-
Tls.Config.(client ~authenticator ~alpn_protocols:["http/1.1"; "h2"] ())
10+
(get_ok Tls.Config.(client ~authenticator ~alpn_protocols:["http/1.1"; "h2"] ()))
1111
(host, port) >>= fun t ->
1212
match Tls_lwt.Unix.epoch t with
1313
| Error () -> printl "Error"

lwt/examples/echo_server.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ let serve_ssl port callback =
3737
yap ~tag ("-> start @ " ^ string_of_int port) >>= fun () ->
3838
let rec loop s =
3939
let authenticator = null_auth in
40-
let config = Tls.Config.server ~version:(`TLS_1_0, `TLS_1_3) ~ciphers:Tls.Config.Ciphers.supported ~reneg:true ~certificates:(`Single cert) ~authenticator () in
40+
let config = get_ok (Tls.Config.server ~version:(`TLS_1_0, `TLS_1_3) ~ciphers:Tls.Config.Ciphers.supported ~reneg:true ~certificates:(`Single cert) ~authenticator ()) in
4141
(Lwt.catch
4242
(fun () -> Tls_lwt.accept_ext config s >|= fun r -> `R r)
4343
(function

lwt/examples/echo_server_alpn.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ let serve_ssl alpn_protocols port callback =
4646
let ps = string_of_int port in
4747
yap ~tag ("-> start @ " ^ ps ^ " (use `openssl s_client -connect host:" ^ ps ^ " -alpn <proto>`), available protocols: " ^ String.concat "," alpn_protocols) >>= fun () ->
4848
let rec loop () =
49-
let config = Tls.Config.server ~certificates:(`Single certificate) ~alpn_protocols () in
49+
let config = get_ok (Tls.Config.server ~certificates:(`Single certificate) ~alpn_protocols ()) in
5050
server_s >>= fun s ->
5151
Tls_lwt.Unix.accept config s >>= fun (t, addr) ->
5252
yap ~tag "-> connect" >>= fun () ->

lwt/examples/echo_server_sni.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ let serve_ssl port callback =
3939
let ps = string_of_int port in
4040
yap ~tag ("-> start @ " ^ ps ^ " (use `openssl s_client -connect host:" ^ ps ^ " -servername foo` (or -servername bar))") >>= fun () ->
4141
let rec loop () =
42-
let config = Tls.Config.server ~certificates:(`Multiple [barcert ; foocert]) () in
42+
let config = get_ok (Tls.Config.server ~certificates:(`Multiple [barcert ; foocert]) ()) in
4343
server_s >>= fun s ->
4444
Tls_lwt.Unix.accept config s >>= fun (t, addr) ->
4545
yap ~tag "-> connect" >>= fun () ->

lwt/examples/ex_common.ml

+4
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,7 @@ let setup_log =
4949
Term.(const setup_log
5050
$ Fmt_cli.style_renderer ()
5151
$ Logs_cli.level ())
52+
53+
let get_ok = function
54+
| Ok cfg -> cfg
55+
| Error `Msg msg -> invalid_arg msg

lwt/examples/fuzz_server.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ let serve_ssl port callback =
5353

5454
yap ~tag ("-> start @ " ^ string_of_int port) >>= fun () ->
5555
let rec loop s =
56-
let config = Tls.Config.server ~ticket_cache ~reneg:true ~certificates:(`Single cert) ~version:(`TLS_1_2, `TLS_1_3) ~zero_rtt:32768l () in
56+
let config = get_ok (Tls.Config.server ~ticket_cache ~reneg:true ~certificates:(`Single cert) ~version:(`TLS_1_2, `TLS_1_3) ~zero_rtt:32768l ()) in
5757
(Lwt.catch
5858
(fun () -> Tls_lwt.Unix.accept config s >|= fun r -> `R r)
5959
(function

lwt/examples/http_client.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ let http_client ?ca ?fp hostname port =
66
let port = int_of_string port in
77
auth ?ca ?fp () >>= fun authenticator ->
88
Tls_lwt.connect_ext
9-
(Tls.Config.client ~authenticator ())
9+
(get_ok (Tls.Config.client ~authenticator ()))
1010
(hostname, port) >>= fun (ic, oc) ->
1111
let req = String.concat "\r\n" [
1212
"GET / HTTP/1.1" ; "Host: " ^ hostname ; "Connection: close" ; "" ; ""

lwt/examples/resume_client.ml

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ open Ex_common
55
let http_client ?ca ?fp hostname port =
66
let port = int_of_string port in
77
auth ?ca ?fp () >>= fun authenticator ->
8-
let config = Tls.Config.client ~authenticator () in
8+
let config = get_ok (Tls.Config.client ~authenticator ()) in
99
Tls_lwt.Unix.connect config (hostname, port) >>= fun t ->
1010
Tls_lwt.Unix.write t "foo\n" >>= fun () ->
1111
let cs = Bytes.create 4 in
@@ -16,7 +16,7 @@ let http_client ?ca ?fp hostname port =
1616
in
1717
Tls_lwt.Unix.close t >>= fun () ->
1818
Printf.printf "closed session\n" ;
19-
let config = Tls.Config.client ~authenticator ~cached_session () in
19+
let config = get_ok (Tls.Config.client ~authenticator ~cached_session ()) in
2020
Tls_lwt.connect_ext config (hostname, port) >>= fun (ic, oc) ->
2121
let req = String.concat "\r\n" [
2222
"GET / HTTP/1.1" ; "Host: " ^ hostname ; "Connection: close" ; "" ; ""

lwt/examples/resume_echo_server.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ let serve_ssl port callback =
8686
yap ~tag ("-> start @ " ^ string_of_int port) >>= fun () ->
8787
let rec loop s =
8888
let authenticator ?ip:_ ~host:_ _ = Ok None in
89-
let config = Tls.Config.server ~certificates:(`Single cert) ~ticket_cache ~authenticator () in
89+
let config = get_ok (Tls.Config.server ~certificates:(`Single cert) ~ticket_cache ~authenticator ()) in
9090
(Lwt.catch
9191
(fun () ->
9292
Lwt_unix.accept s >>= fun (s, addr) ->

lwt/examples/starttls_server.ml

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
open Lwt.Infix
2+
open Ex_common
23

34
let capability = "[CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN] server ready.\r\n"
45

@@ -56,7 +57,7 @@ let start_server () =
5657
Lwt_io.close oc >>= fun () ->
5758
cert () >>= fun cert ->
5859
Tls_lwt.Unix.server_of_fd
59-
(Tls.Config.server ~certificates:(`Single cert) ()) sock_cl >>= fun s ->
60+
(get_ok (Tls.Config.server ~certificates:(`Single cert) ())) sock_cl >>= fun s ->
6061
let ic,oc = Tls_lwt.of_t s in
6162
write oc ("* OK " ^ capability) >>= fun () ->
6263
wait_cmd sock_cl ic oc

lwt/examples/test_client.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ let test_client _ =
1818
let host = "127.0.0.1" in
1919
let authenticator = null_auth in
2020
Tls_lwt.Unix.connect
21-
Tls.Config.(client ~version:(`TLS_1_0, `TLS_1_3) (* ~certificates:(`Single cert) *) ?cached_ticket:!mypsk ~ticket_cache ~authenticator ~ciphers:Ciphers.supported ())
21+
(get_ok Tls.Config.(client ~version:(`TLS_1_0, `TLS_1_3) (* ~certificates:(`Single cert) *) ?cached_ticket:!mypsk ~ticket_cache ~authenticator ~ciphers:Ciphers.supported ()))
2222
(host, port) >>= fun t ->
2323
let (ic, oc) = Tls_lwt.of_t t in
2424
let req = String.concat "\r\n" [

lwt/examples/test_server.ml

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ let serve_ssl port callback =
1414
~priv_key:server_ec_key >>= fun ec_certificate ->
1515
let certificates = `Multiple [ certificate ; ec_certificate ] in
1616
let config =
17-
Tls.Config.(server ~version:(`TLS_1_0, `TLS_1_3) ~certificates ~ciphers:Ciphers.supported ()) in
17+
get_ok (Tls.Config.(server ~version:(`TLS_1_0, `TLS_1_3) ~certificates ~ciphers:Ciphers.supported ()))
18+
in
1819

1920
let server_s =
2021
let open Lwt_unix in

lwt/tls_lwt.ml

+7-5
Original file line numberDiff line numberDiff line change
@@ -301,13 +301,15 @@ let accept_ext conf fd =
301301
and connect_ext conf addr =
302302
Unix.connect conf addr >|= of_t
303303

304-
let accept certificate =
305-
let config = Tls.Config.server ~certificates:certificate () in
306-
accept_ext config
304+
let accept certificate fd =
305+
match Tls.Config.server ~certificates:certificate () with
306+
| Ok config -> accept_ext config fd >|= fun w -> Ok w
307+
| Error _ as e -> Lwt.return e
307308

308309
and connect authenticator addr =
309-
let config = Tls.Config.client ~authenticator () in
310-
connect_ext config addr
310+
match Tls.Config.client ~authenticator () with
311+
| Ok config -> connect_ext config addr >|= fun w -> Ok w
312+
| Error _ as e -> Lwt.return e
311313

312314
(* Boot the entropy loop at module init time. *)
313315
let () = Mirage_crypto_rng_lwt.initialize (module Mirage_crypto_rng.Fortuna)

lwt/tls_lwt.mli

+2-2
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ val accept_ext : Tls.Config.server -> Lwt_unix.file_descr ->
104104
output channel from the accepted connection on [fd], using the
105105
default configuration with the given [own_cert]. *)
106106
val accept : Tls.Config.own_cert -> Lwt_unix.file_descr ->
107-
((ic * oc) * Lwt_unix.sockaddr) Lwt.t
107+
((ic * oc) * Lwt_unix.sockaddr, [> `Msg of string]) result Lwt.t
108108

109109
(** [connect_ext client (host, port)] is [ic, oc], the input
110110
and output channel of a TLS connection to [host] on [port] using
@@ -114,7 +114,7 @@ val connect_ext : Tls.Config.client -> string * int -> (ic * oc) Lwt.t
114114
(** [connect authenticator (host, port)] is [ic, oc], the input
115115
and output channel of a TLS connection to [host] on [port] using the
116116
default configuration and the [authenticator]. *)
117-
val connect : X509.Authenticator.t -> string * int -> (ic * oc) Lwt.t
117+
val connect : X509.Authenticator.t -> string * int -> (ic * oc, [> `Msg of string ]) result Lwt.t
118118

119119
(** [of_t t] is [ic, oc], the input and output channel. [close]
120120
defaults to [!Unix.close]. *)

tests/feedback.ml

+6-2
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,19 @@ module Flow = struct
3333
tag descr (Tls.Engine.string_of_failure a)
3434
end
3535

36+
let get_ok = function
37+
| Ok cfg -> cfg
38+
| Error `Msg msg -> invalid_arg msg
39+
3640
let loop_chatter ~certificate ~loops ~size =
3741

3842
Printf.eprintf "Looping %d times, %d bytes.\n%!" loops size;
3943

4044
let message = Mirage_crypto_rng.generate size
41-
and server = Tls.(Engine.server (Config.server ~certificates:(`Single certificate) ()))
45+
and server = Tls.(Engine.server (get_ok (Config.server ~certificates:(`Single certificate) ())))
4246
and (client, init) =
4347
let authenticator ?ip:_ ~host:_ _ = Ok None in
44-
Tls.(Engine.client @@ Config.client ~authenticator ())
48+
Tls.(Engine.client @@ get_ok (Config.client ~authenticator ()))
4549
in
4650
Testlib.time @@ fun () ->
4751

0 commit comments

Comments
 (0)