blob: 397aad297d5d7676585b7f91f817dd8c1dd780f1 [file] [log] [blame]
Denys Vlasenko9a647c32017-01-23 01:08:16 +01001/*
2 * Copyright (C) 2017 Denys Vlasenko
3 *
4 * Licensed under GPLv2, see file LICENSE in this source tree.
5 */
6//config:config SSL_CLIENT
Denys Vlasenkob097a842018-12-28 03:20:17 +01007//config: bool "ssl_client (25 kb)"
Denys Vlasenko9a647c32017-01-23 01:08:16 +01008//config: default y
9//config: select TLS
10//config: help
Denys Vlasenko72089cf2017-07-21 09:50:55 +020011//config: This tool pipes data to/from a socket, TLS-encrypting it.
Denys Vlasenko9a647c32017-01-23 01:08:16 +010012
13//applet:IF_SSL_CLIENT(APPLET(ssl_client, BB_DIR_USR_BIN, BB_SUID_DROP))
14
15//kbuild:lib-$(CONFIG_SSL_CLIENT) += ssl_client.o
16
17//usage:#define ssl_client_trivial_usage
Denys Vlasenko403f2992018-02-06 15:15:08 +010018//usage: "[-e] -s FD [-r FD] [-n SNI]"
Denys Vlasenko9a647c32017-01-23 01:08:16 +010019//usage:#define ssl_client_full_usage ""
20
21#include "libbb.h"
22
23int ssl_client_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
24int ssl_client_main(int argc UNUSED_PARAM, char **argv)
25{
26 tls_state_t *tls;
27 const char *sni = NULL;
28 int opt;
29
30 // INIT_G();
31
32 tls = new_tls_state();
Ron Yorstonb5820d92018-03-20 11:41:28 +010033 opt = getopt32(argv, "es:+r:+n:", &tls->ofd, &tls->ifd, &sni);
Denys Vlasenko403f2992018-02-06 15:15:08 +010034 if (!(opt & (1<<2))) {
Denys Vlasenko9a647c32017-01-23 01:08:16 +010035 /* -r N defaults to -s N */
36 tls->ifd = tls->ofd;
37 }
38
Denys Vlasenko403f2992018-02-06 15:15:08 +010039 if (!(opt & (3<<1))) {
Denys Vlasenko9a647c32017-01-23 01:08:16 +010040 if (!argv[1])
41 bb_show_usage();
42 /* Undocumented debug feature: without -s and -r, takes HOST arg and connects to it */
43 //
44 // Talk to kernel.org:
Denys Vlasenko403f2992018-02-06 15:15:08 +010045 // printf "GET / HTTP/1.1\r\nHost: kernel.org\r\n\r\n" | busybox ssl_client kernel.org
Denys Vlasenko9a647c32017-01-23 01:08:16 +010046 if (!sni)
47 sni = argv[1];
48 tls->ifd = tls->ofd = create_and_connect_stream_or_die(argv[1], 443);
49 }
50
51 tls_handshake(tls, sni);
Denys Vlasenko403f2992018-02-06 15:15:08 +010052
53 BUILD_BUG_ON(TLSLOOP_EXIT_ON_LOCAL_EOF != 1);
54 tls_run_copy_loop(tls, /*flags*/ opt & 1);
Denys Vlasenko9a647c32017-01-23 01:08:16 +010055
56 return EXIT_SUCCESS;
57}