74 lines
2.1 KiB
OCaml
74 lines
2.1 KiB
OCaml
|
|
|
||
|
|
open Ex_common
|
||
|
|
open Lwt
|
||
|
|
|
||
|
|
let cached_session : Tls.Core.epoch_data =
|
||
|
|
let hex = Ohex.decode in
|
||
|
|
{
|
||
|
|
Tls.Core.side = `Client ;
|
||
|
|
protocol_version = `TLS_1_3 ;
|
||
|
|
ciphersuite = `DHE_RSA_WITH_AES_128_GCM_SHA256 ;
|
||
|
|
peer_random = hex "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" ;
|
||
|
|
peer_certificate = None ;
|
||
|
|
peer_certificate_chain = [] ;
|
||
|
|
peer_name = None ;
|
||
|
|
trust_anchor = None ;
|
||
|
|
received_certificates = [] ;
|
||
|
|
own_random = hex "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" ;
|
||
|
|
own_certificate = [] ;
|
||
|
|
own_private_key = None ;
|
||
|
|
own_name = None ;
|
||
|
|
master_secret = hex "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" ;
|
||
|
|
exporter_master_secret = "" ;
|
||
|
|
session_id = "" ;
|
||
|
|
extended_ms = true ;
|
||
|
|
alpn_protocol = None ;
|
||
|
|
state = `Established ;
|
||
|
|
tls_unique = None ;
|
||
|
|
}
|
||
|
|
|
||
|
|
let echo_client ?ca hostname port =
|
||
|
|
let open Lwt_io in
|
||
|
|
auth ?ca () >>= fun authenticator ->
|
||
|
|
X509_lwt.private_of_pems
|
||
|
|
~cert:server_cert
|
||
|
|
~priv_key:server_key >>= fun certificate ->
|
||
|
|
Tls_lwt.connect_ext
|
||
|
|
(get_ok Tls.Config.(client ~authenticator ~cached_session ~certificates:(`Single certificate) ~ciphers:Ciphers.supported ()))
|
||
|
|
(hostname, port) >>= fun (ic, oc) ->
|
||
|
|
Lwt.join [
|
||
|
|
lines ic |> Lwt_stream.iter_s (printf "+ %s\n%!") ;
|
||
|
|
lines stdin |> Lwt_stream.iter_s (write_line oc)
|
||
|
|
]
|
||
|
|
|
||
|
|
let jump _ port host ca =
|
||
|
|
try
|
||
|
|
Lwt_main.run (echo_client ?ca host port)
|
||
|
|
with
|
||
|
|
| Tls_lwt.Tls_alert alert as exn ->
|
||
|
|
print_alert "remote end" alert ; raise exn
|
||
|
|
| Tls_lwt.Tls_failure alert as exn ->
|
||
|
|
print_fail "our end" alert ; raise exn
|
||
|
|
|
||
|
|
open Cmdliner
|
||
|
|
|
||
|
|
let port =
|
||
|
|
let doc = "Port to connect to" in
|
||
|
|
Arg.(value & opt int 443 & info [ "port" ] ~doc)
|
||
|
|
|
||
|
|
let host =
|
||
|
|
let doc = "Host to connect to" in
|
||
|
|
Arg.(value & opt string "" & info [ "host" ] ~doc)
|
||
|
|
|
||
|
|
let trust =
|
||
|
|
let doc = "Trust anchor" in
|
||
|
|
Arg.(value & opt (some string) None & info [ "trust" ] ~doc)
|
||
|
|
|
||
|
|
let cmd =
|
||
|
|
let term = Term.(const jump $ setup_log $ port $ host $ trust)
|
||
|
|
and info = Cmd.info "echo_client" ~version:"2.0.3"
|
||
|
|
in
|
||
|
|
Cmd.v info term
|
||
|
|
|
||
|
|
let () = exit (Cmd.eval cmd)
|