diff options
Diffstat (limited to 'lib/libssl/src/ssl/ssl_task.c')
-rw-r--r-- | lib/libssl/src/ssl/ssl_task.c | 287 |
1 files changed, 155 insertions, 132 deletions
diff --git a/lib/libssl/src/ssl/ssl_task.c b/lib/libssl/src/ssl/ssl_task.c index 366204f097a..25d20b06a0b 100644 --- a/lib/libssl/src/ssl/ssl_task.c +++ b/lib/libssl/src/ssl/ssl_task.c @@ -134,24 +134,28 @@ int LIB$INIT_TIMER(), LIB$SHOW_TIMER(); #include <openssl/ssl.h> #include <openssl/err.h> -int verify_callback(int ok, X509 *xs, X509 *xi, int depth, - int error); -BIO *bio_err=NULL; -BIO *bio_stdout=NULL; +int +verify_callback(int ok, X509 *xs, X509 *xi, int depth, +int error); +BIO *bio_err = NULL; +BIO *bio_stdout = NULL; BIO_METHOD *BIO_s_rtcp(); -static char *cipher=NULL; -int verbose=1; +static char *cipher = NULL; +int verbose = 1; #ifdef FIONBIO -static int s_nbio=0; +static int s_nbio = 0; #endif #define TEST_SERVER_CERT "SSL_SERVER_CERTIFICATE" /*************************************************************************/ -struct rpc_msg { /* Should have member alignment inhibited */ - char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ - char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ - unsigned short int length; /* Amount of data returned or max to return */ - char data[4092]; /* variable data */ + struct rpc_msg { /* Should have member alignment inhibited */ + char channel; + /* 'A'-app data. 'R'-remote client 'G'-global */ + char function; + /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ + unsigned short int length; /* Amount of data returned or max to return */ + char data[4092]; + /* variable data */ }; #define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) @@ -159,9 +163,9 @@ static $DESCRIPTOR(sysnet, "SYS$NET"); typedef unsigned short io_channel; struct io_status { - unsigned short status; - unsigned short count; - unsigned long stsval; + unsigned short status; + unsigned short count; + unsigned long stsval; }; int doit(io_channel chan, SSL_CTX *s_ctx ); /*****************************************************************************/ @@ -169,63 +173,66 @@ int doit(io_channel chan, SSL_CTX *s_ctx ); */ static int get ( io_channel chan, char *buffer, int maxlen, int *length ) { - int status; - struct io_status iosb; - status = SYS$QIOW ( 0, chan, IO$_READVBLK, &iosb, 0, 0, + int status; + struct io_status iosb; + status = SYS$QIOW ( 0, chan, IO$_READVBLK, &iosb, 0, 0, buffer, maxlen, 0, 0, 0, 0 ); - if ( (status&1) == 1 ) status = iosb.status; - if ( (status&1) == 1 ) *length = iosb.count; - return status; + if ((status&1) + == 1 ) status = iosb.status; + if ((status&1) + == 1 ) *length = iosb.count; + return status; } static int put ( io_channel chan, char *buffer, int length ) { - int status; - struct io_status iosb; - status = SYS$QIOW ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, + int status; + struct io_status iosb; + status = SYS$QIOW ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, buffer, length, 0, 0, 0, 0 ); - if ( (status&1) == 1 ) status = iosb.status; - return status; + if ((status&1) + == 1 ) status = iosb.status; + return status; } /***************************************************************************/ /* Handle operations on the 'G' channel. */ -static int general_request ( io_channel chan, struct rpc_msg *msg, int length ) -{ - return 48; +static int general_request ( io_channel chan, struct rpc_msg *msg, int length ) { + return 48; } /***************************************************************************/ int main ( int argc, char **argv ) { - int status, length; - io_channel chan; - struct rpc_msg msg; + int status, length; + io_channel chan; + struct rpc_msg msg; - char *CApath=NULL,*CAfile=NULL; - int badop=0; - int ret=1; - int client_auth=0; - int server_auth=0; - SSL_CTX *s_ctx=NULL; + char *CApath = NULL, *CAfile = NULL; + int badop = 0; + int ret = 1; + int client_auth = 0; + int server_auth = 0; + SSL_CTX *s_ctx = NULL; /* * Confirm logical link with initiating client. */ - LIB$INIT_TIMER(); - status = SYS$ASSIGN ( &sysnet, &chan, 0, 0, 0 ); - printf("status of assign to SYS$NET: %d\n", status ); + LIB$INIT_TIMER(); + status = SYS$ASSIGN ( &sysnet, &chan, 0, 0, 0 ); + printf("status of assign to SYS$NET: %d\n", status ); /* * Initialize standard out and error files. */ if (bio_err == NULL) - if ((bio_err=BIO_new(BIO_s_file())) != NULL) - BIO_set_fp(bio_err,stderr,BIO_NOCLOSE); + if ((bio_err = BIO_new(BIO_s_file())) != NULL) + BIO_set_fp(bio_err, stderr, BIO_NOCLOSE); if (bio_stdout == NULL) - if ((bio_stdout=BIO_new(BIO_s_file())) != NULL) - BIO_set_fp(bio_stdout,stdout,BIO_NOCLOSE); + if ((bio_stdout = BIO_new(BIO_s_file())) != NULL) + BIO_set_fp(bio_stdout, stdout, BIO_NOCLOSE); /* * get the preferred cipher list and other initialization */ - if (cipher == NULL) cipher=getenv("SSL_CIPHER"); + if (cipher == NULL) + cipher = getenv("SSL_CIPHER"); printf("cipher list: %s\n", cipher ? cipher : "{undefined}" ); SSL_load_error_strings(); @@ -234,48 +241,53 @@ int main ( int argc, char **argv ) /* DRM, this was the original, but there is no such thing as SSLv2() s_ctx=SSL_CTX_new(SSLv2()); */ - s_ctx=SSL_CTX_new(SSLv2_server_method()); + s_ctx = SSL_CTX_new(SSLv2_server_method()); - if (s_ctx == NULL) goto end; + if (s_ctx == NULL) + goto end; - SSL_CTX_use_certificate_file(s_ctx,TEST_SERVER_CERT,SSL_FILETYPE_PEM); - SSL_CTX_use_RSAPrivateKey_file(s_ctx,TEST_SERVER_CERT,SSL_FILETYPE_PEM); + SSL_CTX_use_certificate_file(s_ctx, TEST_SERVER_CERT, SSL_FILETYPE_PEM); + SSL_CTX_use_RSAPrivateKey_file(s_ctx, TEST_SERVER_CERT, SSL_FILETYPE_PEM); printf("Loaded server certificate: '%s'\n", TEST_SERVER_CERT ); /* * Take commands from client until bad status. */ - LIB$SHOW_TIMER(); - status = doit ( chan, s_ctx ); - LIB$SHOW_TIMER(); + LIB$SHOW_TIMER(); + status = doit ( chan, s_ctx ); + LIB$SHOW_TIMER(); /* * do final cleanup and exit. */ end: - if (s_ctx != NULL) SSL_CTX_free(s_ctx); - LIB$SHOW_TIMER(); - return 1; + if (s_ctx != NULL) + SSL_CTX_free(s_ctx); + LIB$SHOW_TIMER(); + return 1; } -int doit(io_channel chan, SSL_CTX *s_ctx ) +int +doit(io_channel chan, SSL_CTX *s_ctx ) { - int status, length, link_state; - struct rpc_msg msg; + int status, length, link_state; + struct rpc_msg msg; - SSL *s_ssl=NULL; - BIO *c_to_s=NULL; - BIO *s_to_c=NULL; - BIO *c_bio=NULL; - BIO *s_bio=NULL; + SSL *s_ssl = NULL; + BIO *c_to_s = NULL; + BIO *s_to_c = NULL; + BIO *c_bio = NULL; + BIO *s_bio = NULL; int i; - int done=0; + int done = 0; - s_ssl=SSL_new(s_ctx); - if (s_ssl == NULL) goto err; + s_ssl = SSL_new(s_ctx); + if (s_ssl == NULL) + goto err; - c_to_s=BIO_new(BIO_s_rtcp()); - s_to_c=BIO_new(BIO_s_rtcp()); - if ((s_to_c == NULL) || (c_to_s == NULL)) goto err; + c_to_s = BIO_new(BIO_s_rtcp()); + s_to_c = BIO_new(BIO_s_rtcp()); + if ((s_to_c == NULL) + || (c_to_s == NULL)) goto err; /* original, DRM 24-SEP-1997 BIO_set_fd ( c_to_s, "", chan ); BIO_set_fd ( s_to_c, "", chan ); @@ -283,13 +295,14 @@ int doit(io_channel chan, SSL_CTX *s_ctx ) BIO_set_fd ( c_to_s, 0, chan ); BIO_set_fd ( s_to_c, 0, chan ); - c_bio=BIO_new(BIO_f_ssl()); - s_bio=BIO_new(BIO_f_ssl()); - if ((c_bio == NULL) || (s_bio == NULL)) goto err; + c_bio = BIO_new(BIO_f_ssl()); + s_bio = BIO_new(BIO_f_ssl()); + if ((c_bio == NULL) + || (s_bio == NULL)) goto err; SSL_set_accept_state(s_ssl); - SSL_set_bio(s_ssl,c_to_s,s_to_c); - BIO_set_ssl(s_bio,s_ssl,BIO_CLOSE); + SSL_set_bio(s_ssl, c_to_s, s_to_c); + BIO_set_ssl(s_bio, s_ssl, BIO_CLOSE); /* We can always do writes */ printf("Begin doit main loop\n"); @@ -300,59 +313,65 @@ int doit(io_channel chan, SSL_CTX *s_ctx ) /* * Wait for remote end to request data action on A channel. */ - while ( link_state == 0 ) { - status = get ( chan, (char *) &msg, sizeof(msg), &length ); - if ( (status&1) == 0 ) { - printf("Error in main loop get: %d\n", status ); - link_state = 3; - break; - } - if ( length < RPC_HDR_SIZE ) { - printf("Error in main loop get size: %d\n", length ); - break; - link_state = 3; - } - if ( msg.channel != 'A' ) { - printf("Error in main loop, unexpected channel: %c\n", - msg.channel ); - break; - link_state = 3; - } - if ( msg.function == 'G' ) { - link_state = 1; - } else if ( msg.function == 'P' ) { - link_state = 2; /* write pending */ - } else if ( msg.function == 'X' ) { - link_state = 3; - } else { - link_state = 3; - } - } - if ( link_state == 1 ) { - i = BIO_read ( s_bio, msg.data, msg.length ); - if ( i < 0 ) link_state = 3; - else { - msg.channel = 'A'; - msg.function = 'C'; /* confirm */ - msg.length = i; - status = put ( chan, (char *) &msg, i+RPC_HDR_SIZE ); - if ( (status&1) == 0 ) break; - link_state = 0; + while (link_state == 0 ) { + status = get ( chan, (char *) &msg, sizeof(msg), &length ); + if ((status&1) == 0 ) { + printf("Error in main loop get: %d\n", status ); + link_state = 3; + break; + } + if (length < RPC_HDR_SIZE ) { + printf("Error in main loop get size: %d\n", length ); + break; + link_state = 3; + } + if (msg.channel != 'A' ) { + printf("Error in main loop, unexpected channel: %c\n", + msg.channel ); + break; + link_state = 3; + } + if (msg.function == 'G' ) { + link_state = 1; + } else if (msg.function == 'P' ) { + link_state = 2; /* write pending */ + } else if (msg.function == 'X' ) { + link_state = 3; + } else { + link_state = 3; + } } - } else if ( link_state == 2 ) { - i = BIO_write ( s_bio, msg.data, msg.length ); - if ( i < 0 ) link_state = 3; - else { - msg.channel = 'A'; - msg.function = 'C'; /* confirm */ - msg.length = 0; - status = put ( chan, (char *) &msg, RPC_HDR_SIZE ); - if ( (status&1) == 0 ) break; - link_state = 0; + if (link_state == 1 ) { + i = BIO_read ( s_bio, msg.data, msg.length ); + if (i < 0 ) + link_state = 3; + else { + msg.channel = 'A'; + msg.function = 'C'; + /* confirm */ + msg.length = i; + status = put ( chan, (char *) &msg, i + RPC_HDR_SIZE ); + if ((status&1) + == 0 ) break; + link_state = 0; + } + } else if (link_state == 2 ) { + i = BIO_write ( s_bio, msg.data, msg.length ); + if (i < 0 ) + link_state = 3; + else { + msg.channel = 'A'; + msg.function = 'C'; + /* confirm */ + msg.length = 0; + status = put ( chan, (char *) &msg, RPC_HDR_SIZE ); + if ((status&1) + == 0 ) break; + link_state = 0; + } } - } } - fprintf(stdout,"DONE\n"); + fprintf(stdout, "DONE\n"); err: /* We have to set the BIO's to NULL otherwise they will be * free()ed twice. Once when th s_ssl is SSL_free()ed and @@ -361,12 +380,16 @@ err: * BIO structure and SSL_set_bio() and SSL_free() automatically * BIO_free non NULL entries. * You should not normally do this or be required to do this */ - s_ssl->rbio=NULL; - s_ssl->wbio=NULL; + s_ssl->rbio = NULL; + s_ssl->wbio = NULL; - if (c_to_s != NULL) BIO_free(c_to_s); - if (s_to_c != NULL) BIO_free(s_to_c); - if (c_bio != NULL) BIO_free(c_bio); - if (s_bio != NULL) BIO_free(s_bio); - return(0); + if (c_to_s != NULL) + BIO_free(c_to_s); + if (s_to_c != NULL) + BIO_free(s_to_c); + if (c_bio != NULL) + BIO_free(c_bio); + if (s_bio != NULL) + BIO_free(s_bio); + return (0); } |