13c9bb3ece
Continuing from the previous commit this changes the way we do client side version negotiation. Similarly all of the s23* "up front" state machine code has been avoided and again things now work much the same way as they already did for DTLS, i.e. we just do most of the work in the ssl3_get_server_hello() function. Reviewed-by: Kurt Roeckx <kurt@openssl.org>
111 lines
2.4 KiB
C
111 lines
2.4 KiB
C
/* NOCW */
|
|
/* demos/bio/sconnect.c */
|
|
|
|
/*-
|
|
* A minimal program to do SSL to a passed host and port.
|
|
* It is actually using non-blocking IO but in a very simple manner
|
|
* sconnect host:port - it does a 'GET / HTTP/1.0'
|
|
*
|
|
* cc -I../../include sconnect.c -L../.. -lssl -lcrypto
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <openssl/err.h>
|
|
#include <openssl/ssl.h>
|
|
|
|
extern int errno;
|
|
|
|
int main(argc, argv)
|
|
int argc;
|
|
char *argv[];
|
|
{
|
|
char *host;
|
|
BIO *out;
|
|
char buf[1024 * 10], *p;
|
|
SSL_CTX *ssl_ctx = NULL;
|
|
SSL *ssl;
|
|
BIO *ssl_bio;
|
|
int i, len, off, ret = 1;
|
|
|
|
if (argc <= 1)
|
|
host = "localhost:4433";
|
|
else
|
|
host = argv[1];
|
|
|
|
#ifdef WATT32
|
|
dbug_init();
|
|
sock_init();
|
|
#endif
|
|
|
|
/* Lets get nice error messages */
|
|
SSL_load_error_strings();
|
|
|
|
/* Setup all the global SSL stuff */
|
|
OpenSSL_add_ssl_algorithms();
|
|
ssl_ctx = SSL_CTX_new(TLS_client_method());
|
|
|
|
/* Lets make a SSL structure */
|
|
ssl = SSL_new(ssl_ctx);
|
|
SSL_set_connect_state(ssl);
|
|
|
|
/* Use it inside an SSL BIO */
|
|
ssl_bio = BIO_new(BIO_f_ssl());
|
|
BIO_set_ssl(ssl_bio, ssl, BIO_CLOSE);
|
|
|
|
/* Lets use a connect BIO under the SSL BIO */
|
|
out = BIO_new(BIO_s_connect());
|
|
BIO_set_conn_hostname(out, host);
|
|
BIO_set_nbio(out, 1);
|
|
out = BIO_push(ssl_bio, out);
|
|
|
|
p = "GET / HTTP/1.0\r\n\r\n";
|
|
len = strlen(p);
|
|
|
|
off = 0;
|
|
for (;;) {
|
|
i = BIO_write(out, &(p[off]), len);
|
|
if (i <= 0) {
|
|
if (BIO_should_retry(out)) {
|
|
fprintf(stderr, "write DELAY\n");
|
|
sleep(1);
|
|
continue;
|
|
} else {
|
|
goto err;
|
|
}
|
|
}
|
|
off += i;
|
|
len -= i;
|
|
if (len <= 0)
|
|
break;
|
|
}
|
|
|
|
for (;;) {
|
|
i = BIO_read(out, buf, sizeof(buf));
|
|
if (i == 0)
|
|
break;
|
|
if (i < 0) {
|
|
if (BIO_should_retry(out)) {
|
|
fprintf(stderr, "read DELAY\n");
|
|
sleep(1);
|
|
continue;
|
|
}
|
|
goto err;
|
|
}
|
|
fwrite(buf, 1, i, stdout);
|
|
}
|
|
|
|
ret = 1;
|
|
goto done;
|
|
|
|
err:
|
|
if (ERR_peek_error() == 0) { /* system call error */
|
|
fprintf(stderr, "errno=%d ", errno);
|
|
perror("error");
|
|
} else
|
|
ERR_print_errors_fp(stderr);
|
|
done:
|
|
BIO_free_all(out);
|
|
SSL_CTX_free(ssl_ctx);
|
|
return (ret == 1);
|
|
}
|