Fix names in usage page of s_time, s_server and s_client
[openssl.git] / apps / s_client.c
index b5dc238878a73aa8b264ca57414a41950fb404fd..2830785c9594f039c698368ae8edcef81318eef5 100644 (file)
@@ -1,5 +1,5 @@
 /* apps/s_client.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
  * This package is an SSL implementation written
@@ -60,7 +60,7 @@
 #include <stdlib.h>
 #include <string.h>
 #define USE_SOCKETS
-#ifdef WIN16
+#ifdef NO_STDIO
 #define APPS_WIN16
 #endif
 #include "apps.h"
@@ -104,7 +104,7 @@ static int c_quiet=0;
 
 static void sc_usage()
        {
-       BIO_printf(bio_err,"usage: client args\n");
+       BIO_printf(bio_err,"usage: s_client args\n");
        BIO_printf(bio_err,"\n");
        BIO_printf(bio_err," -host host     - use -connect instead\n");
        BIO_printf(bio_err," -port port     - use -connect instead\n");
@@ -127,9 +127,11 @@ static void sc_usage()
        BIO_printf(bio_err," -quiet        - no s_client output\n");
        BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
        BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
+       BIO_printf(bio_err," -tls1         - just use TLSv1\n");
+       BIO_printf(bio_err," -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
        BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
-       BIO_printf(bio_err," -cipher       - prefered cipher to use, use the 'ssleay ciphers'\n");
-       BIO_printf(bio_err,"                 command to se what is available\n");
+       BIO_printf(bio_err," -cipher       - prefered cipher to use, use the 'openssl ciphers'\n");
+       BIO_printf(bio_err,"                 command to see what is available\n");
 
        }
 
@@ -137,6 +139,7 @@ int MAIN(argc, argv)
 int argc;
 char **argv;
        {
+       int off=0;
        SSL *con=NULL,*con2=NULL;
        int s,k,width,state=0;
        char *cbuf=NULL,*sbuf=NULL;
@@ -165,6 +168,7 @@ char **argv;
 #endif
 
        apps_startup();
+       c_Pause=0;
        c_quiet=0;
        c_debug=0;
 
@@ -234,6 +238,10 @@ char **argv;
 #ifndef NO_SSL3
                else if (strcmp(*argv,"-ssl3") == 0)
                        meth=SSLv3_client_method();
+#endif
+#ifndef NO_TLS1
+               else if (strcmp(*argv,"-tls1") == 0)
+                       meth=TLSv1_client_method();
 #endif
                else if (strcmp(*argv,"-bugs") == 0)
                        bugs=1;
@@ -256,6 +264,12 @@ char **argv;
                        if (--argc < 1) goto bad;
                        CAfile= *(++argv);
                        }
+               else if (strcmp(*argv,"-no_tls1") == 0)
+                       off|=SSL_OP_NO_TLSv1;
+               else if (strcmp(*argv,"-no_ssl3") == 0)
+                       off|=SSL_OP_NO_SSLv3;
+               else if (strcmp(*argv,"-no_ssl2") == 0)
+                       off|=SSL_OP_NO_SSLv2;
                else if (strcmp(*argv,"-cipher") == 0)
                        {
                        if (--argc < 1) goto bad;
@@ -302,7 +316,10 @@ bad:
                goto end;
                }
 
-       if (bugs) SSL_CTX_set_options(ctx,SSL_OP_ALL);
+       if (bugs)
+               SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
+       else
+               SSL_CTX_set_options(ctx,off);
 
        if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
        if (cipher != NULL)
@@ -319,20 +336,21 @@ bad:
        if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
                (!SSL_CTX_set_default_verify_paths(ctx)))
                {
-               BIO_printf(bio_err,"error seting default verify locations\n");
+               /* BIO_printf(bio_err,"error seting default verify locations\n"); */
                ERR_print_errors(bio_err);
-               goto end;
+               /* goto end; */
                }
 
        SSL_load_error_strings();
 
        con=(SSL *)SSL_new(ctx);
+/*     SSL_set_cipher_list(con,"RC4-MD5"); */
 
 re_start:
 
        if (init_client(&s,host,port) == 0)
                {
-               BIO_printf(bio_err,"connect:errno=%d\n",errno);
+               BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
                SHUTDOWN(s);
                goto end;
                }
@@ -343,7 +361,11 @@ re_start:
                {
                unsigned long l=1;
                BIO_printf(bio_c_out,"turning on non blocking io\n");
-               socket_ioctl(s,FIONBIO,&l);
+               if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
+                       {
+                       ERR_print_errors(bio_err);
+                       goto end;
+                       }
                }
 #endif                                              
        if (c_Pause & 0x01) con->debug=1;
@@ -386,7 +408,7 @@ re_start:
                FD_ZERO(&readfds);
                FD_ZERO(&writefds);
 
-               if (SSL_in_init(con))
+               if (SSL_in_init(con) && !SSL_total_renegotiations(con))
                        {
                        in_init=1;
                        tty_on=0;
@@ -427,11 +449,11 @@ re_start:
 /*             printf("mode tty(%d %d%d) ssl(%d%d)\n",
                        tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
 
-/*             printf("pending=%d\n",SSL_pending(con)); */
                i=select(width,&readfds,&writefds,NULL,NULL);
                if ( i < 0)
                        {
-                       BIO_printf(bio_err,"bad select %d\n",sock_err());
+                       BIO_printf(bio_err,"bad select %d\n",
+                               get_last_socket_error());
                        goto shut;
                        /* goto end; */
                        }
@@ -489,7 +511,7 @@ re_start:
                                if ((k != 0) || (cbuf_len != 0))
                                        {
                                        BIO_printf(bio_err,"write:errno=%d\n",
-                                               errno);
+                                               get_last_socket_error());
                                        goto shut;
                                        }
                                else
@@ -526,7 +548,18 @@ re_start:
 #endif
                else if (FD_ISSET(SSL_get_fd(con),&readfds))
                        {
-                       k=SSL_read(con,sbuf,BUFSIZZ);
+#ifdef RENEG
+{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
+#endif
+#if 1
+                       k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
+#else
+/* Demo for pending and peek :-) */
+                       k=SSL_read(con,sbuf,16);
+{ char zbuf[10240]; 
+printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
+}
+#endif
 
                        switch (SSL_get_error(con,k))
                                {
@@ -555,7 +588,7 @@ re_start:
                                BIO_printf(bio_c_out,"read X BLOCK\n");
                                break;
                        case SSL_ERROR_SYSCALL:
-                               BIO_printf(bio_err,"read:errno=%d\n",errno);
+                               BIO_printf(bio_err,"read:errno=%d\n",get_last_socket_error());
                                goto shut;
                        case SSL_ERROR_ZERO_RETURN:
                                BIO_printf(bio_c_out,"closed\n");
@@ -563,7 +596,7 @@ re_start:
                        case SSL_ERROR_SSL:
                                ERR_print_errors(bio_err);
                                goto shut;
-                               break;
+                               /* break; */
                                }
                        }
 
@@ -619,7 +652,7 @@ BIO *bio;
 SSL *s;
 int full;
        {
-       X509 *peer;
+       X509 *peer=NULL;
        char *p;
        static char *space="                ";
        char buf[BUFSIZ];
@@ -633,7 +666,7 @@ int full;
                sk=SSL_get_peer_cert_chain(s);
                if (sk != NULL)
                        {
-                       BIO_printf(bio,"---\nCertficate chain\n");
+                       BIO_printf(bio,"---\nCertificate chain\n");
                        for (i=0; i<sk_num(sk); i++)
                                {
                                X509_NAME_oneline(X509_get_subject_name((X509 *)
@@ -657,7 +690,6 @@ int full;
                        X509_NAME_oneline(X509_get_issuer_name(peer),
                                buf,BUFSIZ);
                        BIO_printf(bio,"issuer=%s\n",buf);
-                       X509_free(peer);
                        }
                else
                        BIO_printf(bio,"no peer certificate available\n");
@@ -687,7 +719,7 @@ int full;
                                {
                                if (*p == ':')
                                        {
-                                       BIO_write(bio,space,15-j);
+                                       BIO_write(bio,space,15-j%25);
                                        i++;
                                        j=0;
                                        BIO_write(bio,((i%3)?" ":"\n"),1);
@@ -711,7 +743,12 @@ int full;
        BIO_printf(bio,"%s, Cipher is %s\n",
                SSL_CIPHER_get_version(c),
                SSL_CIPHER_get_name(c));
+       if (peer != NULL)
+               BIO_printf(bio,"Server public key is %d bit\n",
+                       EVP_PKEY_bits(X509_get_pubkey(peer)));
        SSL_SESSION_print(bio,SSL_get_session(s));
        BIO_printf(bio,"---\n");
+       if (peer != NULL)
+               X509_free(peer);
        }