Typo (PR2959).
[openssl.git] / apps / s_server.c
index cabe0980a69affcc8efc20ed2ff7835fbda6588d..2b8754bbf524ddd6f5a56c939c0b42b3645d3159 100644 (file)
@@ -212,9 +212,6 @@ static int init_ssl_connection(SSL *s);
 static void print_stats(BIO *bp,SSL_CTX *ctx);
 static int generate_session_id(const SSL *ssl, unsigned char *id,
                                unsigned int *id_len);
-static int ssl_load_stores(SSL_CTX *sctx,
-                       const char *vfyCApath, const char *vfyCAfile,
-                       const char *chCApath, const char *chCAfile);
 #ifndef OPENSSL_NO_DH
 static DH *load_dh_param(const char *dhfile);
 static DH *get_dh512(void);
@@ -273,9 +270,6 @@ static int s_server_session_id_context = 1; /* anything will do */
 static const char *s_cert_file=TEST_CERT,*s_key_file=NULL, *s_chain_file=NULL;
 #ifndef OPENSSL_NO_TLSEXT
 static const char *s_cert_file2=TEST_CERT2,*s_key_file2=NULL;
-static char *curves=NULL;
-static char *sigalgs=NULL;
-static char *client_sigalgs=NULL;
 #endif
 static char *s_dcert_file=NULL,*s_dkey_file=NULL, *s_dchain_file=NULL;
 #ifdef FIONBIO
@@ -290,6 +284,7 @@ static SSL_CTX *ctx2=NULL;
 static int www=0;
 
 static BIO *bio_s_out=NULL;
+static BIO *bio_s_msg = NULL;
 static int s_debug=0;
 #ifndef OPENSSL_NO_TLSEXT
 static int s_tlsextdebug=0;
@@ -445,7 +440,6 @@ static void s_server_init(void)
        s_key_file=NULL;
        s_chain_file=NULL;
 #ifndef OPENSSL_NO_TLSEXT
-       curves=NULL;
        s_cert_file2=TEST_CERT2;
        s_key_file2=NULL;
        ctx2=NULL;
@@ -933,6 +927,9 @@ int MAIN(int, char **);
 
 #ifndef OPENSSL_NO_JPAKE
 static char *jpake_secret = NULL;
+#define no_jpake !jpake_secret
+#else
+#define no_jpake 1
 #endif
 #ifndef OPENSSL_NO_SRP
        static srpsrvparm srp_callback_parm;
@@ -952,10 +949,8 @@ int MAIN(int argc, char *argv[])
 #ifndef OPENSSL_NO_ECDH
        char *named_curve = NULL;
 #endif
-       int badop=0,bugs=0;
+       int badop=0;
        int ret=1;
-       int off=0;
-       unsigned int cert_flags = 0;
        int build_chain = 0;
        int no_tmp_rsa=0,no_dhe=0,no_ecdhe=0,nocert=0;
        int state=0;
@@ -989,6 +984,8 @@ int MAIN(int argc, char *argv[])
        char *srp_verifier_file = NULL;
 #endif
        SSL_EXCERT *exc = NULL;
+       SSL_CONF_CTX *cctx = NULL;
+       STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
        meth=SSLv23_server_method();
 
        local_argc=argc;
@@ -1005,6 +1002,12 @@ int MAIN(int argc, char *argv[])
        if (!load_config(bio_err, NULL))
                goto end;
 
+       cctx = SSL_CONF_CTX_new();
+       if (!cctx)
+               goto end;
+       SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_SERVER);
+       SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
+
        verify_depth=0;
 #ifdef FIONBIO
        s_nbio=0;
@@ -1155,17 +1158,14 @@ int MAIN(int argc, char *argv[])
                                goto bad;
                        continue;
                        }
-               else if (strcmp(*argv,"-verify_return_error") == 0)
-                       verify_return_error = 1;
-               else if (strcmp(*argv,"-serverpref") == 0)
-                       { off|=SSL_OP_CIPHER_SERVER_PREFERENCE; }
-               else if (strcmp(*argv,"-legacy_renegotiation") == 0)
-                       off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
-               else if (strcmp(*argv,"-cipher") == 0)
+               else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args))
                        {
-                       if (--argc < 1) goto bad;
-                       cipher= *(++argv);
+                       if (badarg)
+                               goto bad;
+                       continue;
                        }
+               else if (strcmp(*argv,"-verify_return_error") == 0)
+                       verify_return_error = 1;
                else if (strcmp(*argv,"-build_chain") == 0)
                        build_chain = 1;
                else if (strcmp(*argv,"-CAfile") == 0)
@@ -1226,24 +1226,18 @@ int MAIN(int argc, char *argv[])
                                goto bad;
                                }
                        }
-               else if (strcmp(*argv,"-curves") == 0)
-                       {
-                       if (--argc < 1) goto bad;
-                       curves= *(++argv);
-                       }
-               else if (strcmp(*argv,"-sigalgs") == 0)
-                       {
-                       if (--argc < 1) goto bad;
-                       sigalgs= *(++argv);
-                       }
-               else if (strcmp(*argv,"-client_sigalgs") == 0)
+#endif
+               else if (strcmp(*argv,"-msg") == 0)
+                       { s_msg=1; }
+               else if (strcmp(*argv,"-msgfile") == 0)
                        {
                        if (--argc < 1) goto bad;
-                       client_sigalgs= *(++argv);
+                       bio_s_msg = BIO_new_file(*(++argv), "w");
                        }
+#ifndef OPENSSL_NO_SSL_TRACE
+               else if (strcmp(*argv,"-trace") == 0)
+                       { s_msg=2; }
 #endif
-               else if (strcmp(*argv,"-msg") == 0)
-                       { s_msg=1; }
                else if (strcmp(*argv,"-hack") == 0)
                        { hack=1; }
                else if (strcmp(*argv,"-state") == 0)
@@ -1252,8 +1246,6 @@ int MAIN(int argc, char *argv[])
                        { s_crlf=1; }
                else if (strcmp(*argv,"-quiet") == 0)
                        { s_quiet=1; }
-               else if (strcmp(*argv,"-bugs") == 0)
-                       { bugs=1; }
                else if (strcmp(*argv,"-no_tmp_rsa") == 0)
                        { no_tmp_rsa=1; }
                else if (strcmp(*argv,"-no_dhe") == 0)
@@ -1301,22 +1293,6 @@ int MAIN(int argc, char *argv[])
                        { www=2; }
                else if (strcmp(*argv,"-HTTP") == 0)
                        { www=3; }
-               else if (strcmp(*argv,"-no_ssl2") == 0)
-                       { off|=SSL_OP_NO_SSLv2; }
-               else if (strcmp(*argv,"-no_ssl3") == 0)
-                       { off|=SSL_OP_NO_SSLv3; }
-               else if (strcmp(*argv,"-no_tls1") == 0)
-                       { off|=SSL_OP_NO_TLSv1; }
-               else if (strcmp(*argv,"-no_tls1_1") == 0)
-                       { off|=SSL_OP_NO_TLSv1_1; }
-               else if (strcmp(*argv,"-no_tls1_2") == 0)
-                       { off|=SSL_OP_NO_TLSv1_2; }
-               else if (strcmp(*argv,"-no_comp") == 0)
-                       { off|=SSL_OP_NO_COMPRESSION; }
-#ifndef OPENSSL_NO_TLSEXT
-               else if (strcmp(*argv,"-no_ticket") == 0)
-                       { off|=SSL_OP_NO_TICKET; }
-#endif
 #ifndef OPENSSL_NO_SSL2
                else if (strcmp(*argv,"-ssl2") == 0)
                        { meth=SSLv2_server_method(); }
@@ -1415,8 +1391,6 @@ int MAIN(int argc, char *argv[])
                        keymatexportlen=atoi(*(++argv));
                        if (keymatexportlen == 0) goto bad;
                        }
-               else if (strcmp(*argv, "-cert_strict") == 0)
-                       cert_flags |= SSL_CERT_FLAG_TLS_STRICT;
                else
                        {
                        BIO_printf(bio_err,"unknown option %s\n",*argv);
@@ -1443,14 +1417,7 @@ bad:
                        goto end;
                        }
                psk_identity = "JPAKE";
-               if (cipher)
-                       {
-                       BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
-                       goto end;
-                       }
-               cipher = "PSK";
                }
-
 #endif
 
        SSL_load_error_strings();
@@ -1589,6 +1556,8 @@ bad:
                if (s_quiet && !s_debug && !s_msg)
                        {
                        bio_s_out=BIO_new(BIO_s_null());
+                       if (s_msg && !bio_s_msg)
+                               bio_s_msg=BIO_new_fp(stdout,BIO_NOCLOSE);
                        }
                else
                        {
@@ -1634,10 +1603,7 @@ bad:
                BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
                }
        SSL_CTX_set_quiet_shutdown(ctx,1);
-       if (bugs) SSL_CTX_set_options(ctx,SSL_OP_ALL);
        if (hack) SSL_CTX_set_options(ctx,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
-       SSL_CTX_set_options(ctx,off);
-       if (cert_flags) SSL_CTX_set_cert_flags(ctx, cert_flags);
        if (exc) ssl_ctx_set_excert(ctx, exc);
        /* DTLS: partial reads end up discarding unread UDP bytes :-( 
         * Setting read ahead solves this problem.
@@ -1675,6 +1641,9 @@ bad:
        if (vpm)
                SSL_CTX_set1_param(ctx, vpm);
 
+       if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, no_ecdhe, no_jpake))
+               goto end;
+
        if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile))
                {
                BIO_printf(bio_err, "Error loading store locations\n");
@@ -1714,10 +1683,7 @@ bad:
                        BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
                        }
                SSL_CTX_set_quiet_shutdown(ctx2,1);
-               if (bugs) SSL_CTX_set_options(ctx2,SSL_OP_ALL);
                if (hack) SSL_CTX_set_options(ctx2,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
-               SSL_CTX_set_options(ctx2,off);
-               if (cert_flags) SSL_CTX_set_cert_flags(ctx2, cert_flags);
                if (exc) ssl_ctx_set_excert(ctx2, exc);
                /* DTLS: partial reads end up discarding unread UDP bytes :-( 
                 * Setting read ahead solves this problem.
@@ -1738,6 +1704,9 @@ bad:
                        }
                if (vpm)
                        SSL_CTX_set1_param(ctx2, vpm);
+
+               if (!args_ssl_call(ctx2, bio_err, cctx, ssl_args, no_ecdhe, no_jpake))
+                       goto end;
                }
 
 # ifndef OPENSSL_NO_NEXTPROTONEG
@@ -1936,53 +1905,6 @@ bad:
                        }
 #endif
                }
-#ifndef OPENSSL_NO_TLSEXT
-       if (curves)
-               {
-               if(!SSL_CTX_set1_curves_list(ctx,curves))
-                       {
-                       BIO_printf(bio_err,"error setting curves list\n");
-                       ERR_print_errors(bio_err);
-                       goto end;
-                       }
-               if(ctx2 && !SSL_CTX_set1_curves_list(ctx2,curves))
-                       {
-                       BIO_printf(bio_err,"error setting curves list\n");
-                       ERR_print_errors(bio_err);
-                       goto end;
-                       }
-               }
-       if (sigalgs)
-               {
-               if(!SSL_CTX_set1_sigalgs_list(ctx,sigalgs))
-                       {
-                       BIO_printf(bio_err,"error setting signature algorithms\n");
-                       ERR_print_errors(bio_err);
-                       goto end;
-                       }
-               if(ctx2 && !SSL_CTX_set1_sigalgs_list(ctx2,sigalgs))
-                       {
-                       BIO_printf(bio_err,"error setting signature algorithms\n");
-                       ERR_print_errors(bio_err);
-                       goto end;
-                       }
-               }
-       if (client_sigalgs)
-               {
-               if(!SSL_CTX_set1_client_sigalgs_list(ctx,client_sigalgs))
-                       {
-                       BIO_printf(bio_err,"error setting client signature algorithms\n");
-                       ERR_print_errors(bio_err);
-                       goto end;
-                       }
-               if(ctx2 && !SSL_CTX_set1_client_sigalgs_list(ctx2,client_sigalgs))
-                       {
-                       BIO_printf(bio_err,"error setting client signature algorithms\n");
-                       ERR_print_errors(bio_err);
-                       goto end;
-                       }
-               }
-#endif
        SSL_CTX_set_verify(ctx,s_server_verify,verify_callback);
        SSL_CTX_set_session_id_context(ctx,(void*)&s_server_session_id_context,
                sizeof s_server_session_id_context);
@@ -2078,11 +2000,24 @@ end:
                BIO_free(authz_in);
 #endif
        ssl_excert_free(exc);
+       if (ssl_args)
+               sk_OPENSSL_STRING_free(ssl_args);
+       if (cctx)
+               SSL_CONF_CTX_free(cctx);
+#ifndef OPENSSL_NO_JPAKE
+       if (jpake_secret && psk_key)
+               OPENSSL_free(psk_key);
+#endif
        if (bio_s_out != NULL)
                {
-        BIO_free(bio_s_out);
+               BIO_free(bio_s_out);
                bio_s_out=NULL;
                }
+       if (bio_s_msg != NULL)
+               {
+               BIO_free(bio_s_msg);
+               bio_s_msg = NULL;
+               }
        apps_shutdown();
        OPENSSL_EXIT(ret);
        }
@@ -2237,8 +2172,13 @@ static int sv_body(char *hostname, int s, unsigned char *context)
                }
        if (s_msg)
                {
-               SSL_set_msg_callback(con, msg_cb);
-               SSL_set_msg_callback_arg(con, bio_s_out);
+#ifndef OPENSSL_NO_SSL_TRACE
+               if (s_msg == 2)
+                       SSL_set_msg_callback(con, SSL_trace);
+               else
+#endif
+                       SSL_set_msg_callback(con, msg_cb);
+               SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
                }
 #ifndef OPENSSL_NO_TLSEXT
        if (s_tlsextdebug)
@@ -2588,8 +2528,8 @@ static int init_ssl_connection(SSL *con)
                        BIO_printf(bio_err,"verify error:%s\n",
                                X509_verify_cert_error_string(verify_error));
                        }
-               else
-                       ERR_print_errors(bio_err);
+               /* Always print any error messages */
+               ERR_print_errors(bio_err);
                return(0);
                }
 
@@ -2794,8 +2734,13 @@ static int www_body(char *hostname, int s, unsigned char *context)
                }
        if (s_msg)
                {
-               SSL_set_msg_callback(con, msg_cb);
-               SSL_set_msg_callback_arg(con, bio_s_out);
+#ifndef OPENSSL_NO_SSL_TRACE
+               if (s_msg == 2)
+                       SSL_set_msg_callback(con, SSL_trace);
+               else
+#endif
+                       SSL_set_msg_callback(con, msg_cb);
+               SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
                }
 
        for (;;)
@@ -3174,33 +3119,3 @@ static int generate_session_id(const SSL *ssl, unsigned char *id,
                return 0;
        return 1;
        }
-
-static int ssl_load_stores(SSL_CTX *sctx,
-                       const char *vfyCApath, const char *vfyCAfile,
-                       const char *chCApath, const char *chCAfile)
-       {
-       X509_STORE *vfy = NULL, *ch = NULL;
-       int rv = 0;
-       if (vfyCApath || vfyCAfile)
-               {
-               vfy = X509_STORE_new();
-               if (!X509_STORE_load_locations(vfy, vfyCAfile, vfyCApath))
-                       goto err;
-               SSL_CTX_set1_verify_cert_store(ctx, vfy);
-               }
-       if (chCApath || chCAfile)
-               {
-               ch = X509_STORE_new();
-               if (!X509_STORE_load_locations(ch, chCAfile, chCApath))
-                       goto err;
-               /*X509_STORE_set_verify_cb(ch, verify_callback);*/
-               SSL_CTX_set1_chain_cert_store(ctx, ch);
-               }
-       rv = 1;
-       err:
-       if (vfy)
-               X509_STORE_free(vfy);
-       if (ch)
-               X509_STORE_free(ch);
-       return rv;
-       }