summaryrefslogtreecommitdiff
path: root/system/busybox/ssl_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'system/busybox/ssl_client.c')
-rw-r--r--system/busybox/ssl_client.c158
1 files changed, 0 insertions, 158 deletions
diff --git a/system/busybox/ssl_client.c b/system/busybox/ssl_client.c
deleted file mode 100644
index 8aa558e70..000000000
--- a/system/busybox/ssl_client.c
+++ /dev/null
@@ -1,158 +0,0 @@
-#include <err.h>
-#include <errno.h>
-#include <poll.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <tls.h>
-
-#define BUFSIZE 16384
-
-#define TLS_DEBUG 0
-
-#if TLS_DEBUG
-# define dbg(...) fprintf(stderr, __VA_ARGS__)
-#else
-# define dbg(...) ((void)0)
-#endif
-
-static void copy_from_stdin_to_tls(struct tls *ctx, int *fd)
-{
- static size_t buf[BUFSIZE];
- ssize_t n;
- int i = 0;
- dbg("DEBUG: data from STDIN\n");
- do {
- n = read(STDIN_FILENO, buf, sizeof(buf));
- dbg("read %zu\n", n);
- } while (n < 0 && errno == EINTR);
-
- if (n < 1) {
- *fd = -1;
- return;
- }
-
- while (n > 0) {
- ssize_t r = tls_write(ctx, &buf[i], n);
- if (r == TLS_WANT_POLLIN || r == TLS_WANT_POLLOUT)
- continue;
- if (r < 0)
- err(1, "tls_write: %s", tls_error(ctx));
- i += r;
- n -= r;
- }
-}
-
-static int copy_from_tls_to_stdout(struct tls *ctx)
-{
- static size_t buf[BUFSIZE];
- ssize_t n,r;
- int i = 0;
-
- dbg("DEBUG: data from TLS\n");
- do {
- n = tls_read(ctx, buf, sizeof(buf));
- } while (n == TLS_WANT_POLLIN || r == TLS_WANT_POLLOUT);
- if (n < 0)
- err(1, "tls read: %s", tls_error(ctx));
-
- if (n == 0)
- return 1;
-
- while (n) {
- r = write(STDOUT_FILENO, &buf[i], n);
- if (r < 0)
- err(1, "write");
- i += r;
- n -= r;
- }
- return 0;
-}
-
-int do_poll(struct pollfd *fds, int nfds)
-{
- int r;
- while ((r = poll(fds, nfds, -1)) < 0) {
- if (errno != EINTR && errno != ENOMEM)
- err(1, "poll");
- }
- return r;
-}
-
-static void copy_loop(struct tls *ctx, int sfd)
-{
- struct pollfd fds[2] = {
- { .fd = STDIN_FILENO, .events = POLLIN },
- { .fd = sfd, .events = POLLIN },
- };
-
- while (1) {
- int r = do_poll(fds, 2);
- if (fds[0].revents)
- copy_from_stdin_to_tls(ctx, &fds[0].fd);
-
- if (fds[1].revents && copy_from_tls_to_stdout(ctx))
- break;
- }
-}
-
-void usage(const char *prog, int ret) {
- printf("usage: %s [-s FD] [-I] -n SNI\n", prog);
- exit(ret);
-}
-
-int main(int argc, char *argv[])
-{
- int c, sfd = 1;;
- const char *sni = NULL;
- struct tls_config *tc;
- struct tls *ctx;
- int insecure = 0;
-
- while ((c = getopt(argc, argv, "hs:n:I")) != -1) {
- switch (c) {
- case 'h':
- usage(argv[0], 0);
- break;
- case 's':
- sfd = atoi(optarg);
- break;
- case 'n':
- sni = optarg;
- break;
- case 'I':
- insecure = 1;
- break;
- case '?':
- usage(argv[0], 1);
- }
- }
-
- if (tls_init() == -1)
- errx(1, "tls_init() failed");
-
- if ((ctx = tls_client()) == NULL)
- errx(1, "tls_client() failed");
-
- if (insecure) {
- if ((tc = tls_config_new()) == NULL)
- errx(1, "tls_config_new() failed");
- tls_config_insecure_noverifycert(tc);
- tls_config_insecure_noverifyname(tc);
- tls_config_insecure_noverifytime(tc);
- if (tls_configure(ctx, tc) == -1)
- err(1, "tls_configure: %s", tls_error(ctx));
- tls_config_free(tc);
- }
-
- if (tls_connect_fds(ctx, sfd, sfd, sni) == -1)
- errx(1, "%s: TLS connect failed", sni);
-
- if (tls_handshake(ctx) == -1)
- errx(1, "%s: %s", sni, tls_error(ctx));
-
- copy_loop(ctx, sfd);
- tls_close(ctx);
- return 0;
-}