diff options
Diffstat (limited to 'networking/ssl_client.c')
-rw-r--r-- | networking/ssl_client.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/networking/ssl_client.c b/networking/ssl_client.c new file mode 100644 index 000000000..cfeae1587 --- /dev/null +++ b/networking/ssl_client.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2017 Denys Vlasenko | ||
3 | * | ||
4 | * Licensed under GPLv2, see file LICENSE in this source tree. | ||
5 | */ | ||
6 | //config:config SSL_CLIENT | ||
7 | //config: bool "ssl_client" | ||
8 | //config: default y | ||
9 | //config: select TLS | ||
10 | //config: help | ||
11 | //config: This tool pipes data to/from a socket, TLS-encrypting it. | ||
12 | |||
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 | ||
18 | //usage: "-s FD [-r FD] [-n SNI]" | ||
19 | //usage:#define ssl_client_full_usage "" | ||
20 | |||
21 | #include "libbb.h" | ||
22 | |||
23 | int ssl_client_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||
24 | int 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(); | ||
33 | opt = getopt32(argv, "s:#r:#n:", &tls->ofd, &tls->ifd, &sni); | ||
34 | if (!(opt & 2)) { | ||
35 | /* -r N defaults to -s N */ | ||
36 | tls->ifd = tls->ofd; | ||
37 | } | ||
38 | |||
39 | if (!(opt & 3)) { | ||
40 | 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: | ||
45 | // printf "GET / HTTP/1.1\r\nHost: kernel.org\r\n\r\n" | ./busybox ssl_client kernel.org | ||
46 | 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); | ||
52 | tls_run_copy_loop(tls); | ||
53 | |||
54 | return EXIT_SUCCESS; | ||
55 | } | ||