Use the default_md config file value when signing CRLs.
[openssl.git] / apps / s_server.c
index e39a8f7f1a65c25731b0bfcced3eb17c89ba6771..cce835c23902d53c43b3038011c74b9f5056547e 100644 (file)
  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
  */
 
+/* Until the key-gen callbacks are modified to use newer prototypes, we allow
+ * deprecated functions for openssl-internal code */
+#ifdef OPENSSL_NO_DEPRECATED
+#undef OPENSSL_NO_DEPRECATED
+#endif
+
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <sys/types.h>
+
 #include <sys/stat.h>
 #include <openssl/e_os2.h>
 #ifdef OPENSSL_NO_STDIO
 #define APPS_WIN16
 #endif
 
+#if !defined(OPENSSL_SYS_NETWARE)  /* conflicts with winsock2 stuff on netware */
+#include <sys/types.h>
+#endif
+
 /* With IPv6, it looks like Digital has mixed up the proper order of
    recursive header file inclusion, resulting in the compiler complaining
    that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
@@ -145,8 +155,12 @@ typedef unsigned int u_int;
 #include <openssl/rand.h>
 #include "s_apps.h"
 
-#ifdef OPENSSL_SYS_WINDOWS
-#include <conio.h>
+#ifdef OPENSSL_SYS_WINCE
+/* Windows CE incorrectly defines fileno as returning void*, so to avoid problems below... */
+#ifdef fileno
+#undef fileno
+#endif
+#define fileno(a) (int)_fileno(a)
 #endif
 
 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
@@ -241,7 +255,9 @@ static int s_msg=0;
 static int s_quiet=0;
 
 static int hack=0;
+#ifndef OPENSSL_NO_ENGINE
 static char *engine_id=NULL;
+#endif
 static const char *session_id_prefix=NULL;
 
 #ifdef MONOLITH
@@ -266,7 +282,9 @@ static void s_server_init(void)
        s_msg=0;
        s_quiet=0;
        hack=0;
+#ifndef OPENSSL_NO_ENGINE
        engine_id=NULL;
+#endif
        }
 #endif
 
@@ -323,7 +341,9 @@ static void sv_usage(void)
        BIO_printf(bio_err," -WWW          - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
        BIO_printf(bio_err," -HTTP         - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
         BIO_printf(bio_err,"                 with the assumption it contains a complete HTTP response.\n");
+#ifndef OPENSSL_NO_ENGINE
        BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
+#endif
        BIO_printf(bio_err," -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg'\n");
        BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
        }
@@ -498,7 +518,9 @@ int MAIN(int argc, char *argv[])
        int no_tmp_rsa=0,no_dhe=0,no_ecdhe=0,nocert=0;
        int state=0;
        SSL_METHOD *meth=NULL;
+#ifndef OPENSSL_NO_ENGINE
        ENGINE *e=NULL;
+#endif
        char *inrand=NULL;
 
 #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
@@ -682,11 +704,13 @@ int MAIN(int argc, char *argv[])
                        if (--argc < 1) goto bad;
                        session_id_prefix = *(++argv);
                        }
+#ifndef OPENSSL_NO_ENGINE
                else if (strcmp(*argv,"-engine") == 0)
                        {
                        if (--argc < 1) goto bad;
                        engine_id= *(++argv);
                        }
+#endif
                else if (strcmp(*argv,"-rand") == 0)
                        {
                        if (--argc < 1) goto bad;
@@ -711,7 +735,9 @@ bad:
        SSL_load_error_strings();
        OpenSSL_add_ssl_algorithms();
 
+#ifndef OPENSSL_NO_ENGINE
         e = setup_engine(bio_err, engine_id, 1);
+#endif
 
        if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
                && !RAND_status())
@@ -938,30 +964,30 @@ end:
                bio_s_out=NULL;
                }
        apps_shutdown();
-       EXIT(ret);
+       OPENSSL_EXIT(ret);
        }
 
 static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
        {
        BIO_printf(bio,"%4ld items in the session cache\n",
                SSL_CTX_sess_number(ssl_ctx));
-       BIO_printf(bio,"%4d client connects (SSL_connect())\n",
+       BIO_printf(bio,"%4ld client connects (SSL_connect())\n",
                SSL_CTX_sess_connect(ssl_ctx));
-       BIO_printf(bio,"%4d client renegotiates (SSL_connect())\n",
+       BIO_printf(bio,"%4ld client renegotiates (SSL_connect())\n",
                SSL_CTX_sess_connect_renegotiate(ssl_ctx));
-       BIO_printf(bio,"%4d client connects that finished\n",
+       BIO_printf(bio,"%4ld client connects that finished\n",
                SSL_CTX_sess_connect_good(ssl_ctx));
-       BIO_printf(bio,"%4d server accepts (SSL_accept())\n",
+       BIO_printf(bio,"%4ld server accepts (SSL_accept())\n",
                SSL_CTX_sess_accept(ssl_ctx));
-       BIO_printf(bio,"%4d server renegotiates (SSL_accept())\n",
+       BIO_printf(bio,"%4ld server renegotiates (SSL_accept())\n",
                SSL_CTX_sess_accept_renegotiate(ssl_ctx));
-       BIO_printf(bio,"%4d server accepts that finished\n",
+       BIO_printf(bio,"%4ld server accepts that finished\n",
                SSL_CTX_sess_accept_good(ssl_ctx));
-       BIO_printf(bio,"%4d session cache hits\n",SSL_CTX_sess_hits(ssl_ctx));
-       BIO_printf(bio,"%4d session cache misses\n",SSL_CTX_sess_misses(ssl_ctx));
-       BIO_printf(bio,"%4d session cache timeouts\n",SSL_CTX_sess_timeouts(ssl_ctx));
-       BIO_printf(bio,"%4d callback cache hits\n",SSL_CTX_sess_cb_hits(ssl_ctx));
-       BIO_printf(bio,"%4d cache full overflows (%d allowed)\n",
+       BIO_printf(bio,"%4ld session cache hits\n",SSL_CTX_sess_hits(ssl_ctx));
+       BIO_printf(bio,"%4ld session cache misses\n",SSL_CTX_sess_misses(ssl_ctx));
+       BIO_printf(bio,"%4ld session cache timeouts\n",SSL_CTX_sess_timeouts(ssl_ctx));
+       BIO_printf(bio,"%4ld callback cache hits\n",SSL_CTX_sess_cb_hits(ssl_ctx));
+       BIO_printf(bio,"%4ld cache full overflows (%ld allowed)\n",
                SSL_CTX_sess_cache_full(ssl_ctx),
                SSL_CTX_sess_get_cache_size(ssl_ctx));
        }
@@ -975,7 +1001,7 @@ static int sv_body(char *hostname, int s, unsigned char *context)
        unsigned long l;
        SSL *con=NULL;
        BIO *sbio;
-#ifdef OPENSSL_SYS_WINDOWS
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
        struct timeval tv;
 #endif
 
@@ -1028,7 +1054,7 @@ static int sv_body(char *hostname, int s, unsigned char *context)
        if (s_debug)
                {
                con->debug=1;
-               BIO_set_callback(SSL_get_rbio(con),bio_dump_cb);
+               BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
                BIO_set_callback_arg(SSL_get_rbio(con),bio_s_out);
                }
        if (s_msg)
@@ -1049,7 +1075,7 @@ static int sv_body(char *hostname, int s, unsigned char *context)
                if (!read_from_sslcon)
                        {
                        FD_ZERO(&readfds);
-#ifndef OPENSSL_SYS_WINDOWS
+#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)
                        FD_SET(fileno(stdin),&readfds);
 #endif
                        FD_SET(s,&readfds);
@@ -1059,8 +1085,8 @@ static int sv_body(char *hostname, int s, unsigned char *context)
                         * the compiler: if you do have a cast then you can either
                         * go for (int *) or (void *).
                         */
-#ifdef OPENSSL_SYS_WINDOWS
-                       /* Under Windows we can't select on stdin: only
+#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
+                        /* Under DOS (non-djgpp) and Windows we can't select on stdin: only
                         * on sockets. As a workaround we timeout the select every
                         * second and check for any keypress. In a proper Windows
                         * application we wouldn't do this because it is inefficient.
@@ -1254,7 +1280,7 @@ err:
        BIO_printf(bio_s_out,"CONNECTION CLOSED\n");
        if (buf != NULL)
                {
-               memset(buf,0,bufsize);
+               OPENSSL_cleanse(buf,bufsize);
                OPENSSL_free(buf);
                }
        if (ret >= 0)
@@ -1321,7 +1347,13 @@ static int init_ssl_connection(SSL *con)
        if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) &
                TLS1_FLAGS_TLS_PADDING_BUG)
                BIO_printf(bio_s_out,"Peer has incorrect TLSv1 block padding\n");
-
+#ifndef OPENSSL_NO_KRB5
+       if (con->kssl_ctx->client_princ != NULL)
+               {
+               BIO_printf(bio_s_out,"Kerberos peer principal is %s\n",
+                       con->kssl_ctx->client_princ);
+               }
+#endif /* OPENSSL_NO_KRB5 */
        return(1);
        }
 
@@ -1425,7 +1457,7 @@ static int www_body(char *hostname, int s, unsigned char *context)
        if (s_debug)
                {
                con->debug=1;
-               BIO_set_callback(SSL_get_rbio(con),bio_dump_cb);
+               BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
                BIO_set_callback_arg(SSL_get_rbio(con),bio_s_out);
                }
        if (s_msg)
@@ -1473,7 +1505,9 @@ static int www_body(char *hostname, int s, unsigned char *context)
                        else
                                {
                                BIO_printf(bio_s_out,"read R BLOCK\n");
-#ifndef OPENSSL_SYS_MSDOS
+#if defined(OPENSSL_SYS_NETWARE)
+            delay(1000);
+#elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
                                sleep(1);
 #endif
                                continue;
@@ -1748,21 +1782,30 @@ err:
 #ifndef OPENSSL_NO_RSA
 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
        {
+       BIGNUM *bn = NULL;
        static RSA *rsa_tmp=NULL;
 
-       if (rsa_tmp == NULL)
+       if (!rsa_tmp && ((bn = BN_new()) == NULL))
+               BIO_printf(bio_err,"Allocation error in generating RSA key\n");
+       if (!rsa_tmp && bn)
                {
                if (!s_quiet)
                        {
                        BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
                        (void)BIO_flush(bio_err);
                        }
-               rsa_tmp=RSA_generate_key(keylength,RSA_F4,NULL,NULL);
+               if(!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) ||
+                               !RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL))
+                       {
+                       if(rsa_tmp) RSA_free(rsa_tmp);
+                       rsa_tmp = NULL;
+                       }
                if (!s_quiet)
                        {
                        BIO_printf(bio_err,"\n");
                        (void)BIO_flush(bio_err);
                        }
+               BN_free(bn);
                }
        return(rsa_tmp);
        }