1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2013-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <string.h> 11e1051a39Sopenharmony_ci#include <openssl/err.h> 12e1051a39Sopenharmony_ci#include <openssl/ssl.h> 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_ciint main(int argc, char **argv) 15e1051a39Sopenharmony_ci{ 16e1051a39Sopenharmony_ci BIO *sbio = NULL, *out = NULL; 17e1051a39Sopenharmony_ci int len; 18e1051a39Sopenharmony_ci char tmpbuf[1024]; 19e1051a39Sopenharmony_ci SSL_CTX *ctx; 20e1051a39Sopenharmony_ci SSL_CONF_CTX *cctx; 21e1051a39Sopenharmony_ci SSL *ssl; 22e1051a39Sopenharmony_ci char **args = argv + 1; 23e1051a39Sopenharmony_ci const char *connect_str = "localhost:4433"; 24e1051a39Sopenharmony_ci int nargs = argc - 1; 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_ci ctx = SSL_CTX_new(TLS_client_method()); 27e1051a39Sopenharmony_ci cctx = SSL_CONF_CTX_new(); 28e1051a39Sopenharmony_ci SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT); 29e1051a39Sopenharmony_ci SSL_CONF_CTX_set_ssl_ctx(cctx, ctx); 30e1051a39Sopenharmony_ci while (*args && **args == '-') { 31e1051a39Sopenharmony_ci int rv; 32e1051a39Sopenharmony_ci /* Parse standard arguments */ 33e1051a39Sopenharmony_ci rv = SSL_CONF_cmd_argv(cctx, &nargs, &args); 34e1051a39Sopenharmony_ci if (rv == -3) { 35e1051a39Sopenharmony_ci fprintf(stderr, "Missing argument for %s\n", *args); 36e1051a39Sopenharmony_ci goto end; 37e1051a39Sopenharmony_ci } 38e1051a39Sopenharmony_ci if (rv < 0) { 39e1051a39Sopenharmony_ci fprintf(stderr, "Error in command %s\n", *args); 40e1051a39Sopenharmony_ci ERR_print_errors_fp(stderr); 41e1051a39Sopenharmony_ci goto end; 42e1051a39Sopenharmony_ci } 43e1051a39Sopenharmony_ci /* If rv > 0 we processed something so proceed to next arg */ 44e1051a39Sopenharmony_ci if (rv > 0) 45e1051a39Sopenharmony_ci continue; 46e1051a39Sopenharmony_ci /* Otherwise application specific argument processing */ 47e1051a39Sopenharmony_ci if (strcmp(*args, "-connect") == 0) { 48e1051a39Sopenharmony_ci connect_str = args[1]; 49e1051a39Sopenharmony_ci if (connect_str == NULL) { 50e1051a39Sopenharmony_ci fprintf(stderr, "Missing -connect argument\n"); 51e1051a39Sopenharmony_ci goto end; 52e1051a39Sopenharmony_ci } 53e1051a39Sopenharmony_ci args += 2; 54e1051a39Sopenharmony_ci nargs -= 2; 55e1051a39Sopenharmony_ci continue; 56e1051a39Sopenharmony_ci } else { 57e1051a39Sopenharmony_ci fprintf(stderr, "Unknown argument %s\n", *args); 58e1051a39Sopenharmony_ci goto end; 59e1051a39Sopenharmony_ci } 60e1051a39Sopenharmony_ci } 61e1051a39Sopenharmony_ci 62e1051a39Sopenharmony_ci if (!SSL_CONF_CTX_finish(cctx)) { 63e1051a39Sopenharmony_ci fprintf(stderr, "Finish error\n"); 64e1051a39Sopenharmony_ci ERR_print_errors_fp(stderr); 65e1051a39Sopenharmony_ci goto end; 66e1051a39Sopenharmony_ci } 67e1051a39Sopenharmony_ci 68e1051a39Sopenharmony_ci /* 69e1051a39Sopenharmony_ci * We'd normally set some stuff like the verify paths and * mode here 70e1051a39Sopenharmony_ci * because as things stand this will connect to * any server whose 71e1051a39Sopenharmony_ci * certificate is signed by any CA. 72e1051a39Sopenharmony_ci */ 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci sbio = BIO_new_ssl_connect(ctx); 75e1051a39Sopenharmony_ci 76e1051a39Sopenharmony_ci BIO_get_ssl(sbio, &ssl); 77e1051a39Sopenharmony_ci 78e1051a39Sopenharmony_ci if (!ssl) { 79e1051a39Sopenharmony_ci fprintf(stderr, "Can't locate SSL pointer\n"); 80e1051a39Sopenharmony_ci goto end; 81e1051a39Sopenharmony_ci } 82e1051a39Sopenharmony_ci 83e1051a39Sopenharmony_ci /* We might want to do other things with ssl here */ 84e1051a39Sopenharmony_ci 85e1051a39Sopenharmony_ci BIO_set_conn_hostname(sbio, connect_str); 86e1051a39Sopenharmony_ci 87e1051a39Sopenharmony_ci out = BIO_new_fp(stdout, BIO_NOCLOSE); 88e1051a39Sopenharmony_ci if (BIO_do_connect(sbio) <= 0) { 89e1051a39Sopenharmony_ci fprintf(stderr, "Error connecting to server\n"); 90e1051a39Sopenharmony_ci ERR_print_errors_fp(stderr); 91e1051a39Sopenharmony_ci goto end; 92e1051a39Sopenharmony_ci } 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ci /* Could examine ssl here to get connection info */ 95e1051a39Sopenharmony_ci 96e1051a39Sopenharmony_ci BIO_puts(sbio, "GET / HTTP/1.0\n\n"); 97e1051a39Sopenharmony_ci for (;;) { 98e1051a39Sopenharmony_ci len = BIO_read(sbio, tmpbuf, 1024); 99e1051a39Sopenharmony_ci if (len <= 0) 100e1051a39Sopenharmony_ci break; 101e1051a39Sopenharmony_ci BIO_write(out, tmpbuf, len); 102e1051a39Sopenharmony_ci } 103e1051a39Sopenharmony_ci end: 104e1051a39Sopenharmony_ci SSL_CONF_CTX_free(cctx); 105e1051a39Sopenharmony_ci BIO_free_all(sbio); 106e1051a39Sopenharmony_ci BIO_free(out); 107e1051a39Sopenharmony_ci return 0; 108e1051a39Sopenharmony_ci} 109