Enable DH tests
[openssl.git] / test / ssltest.c
index 25bec77031fee14f11d0d06d367d5b55fe15860e..26cf96c87059c585d29498fa26661796ca061191 100644 (file)
 #endif
 
 /*
- * There is really no standard for this, so let's assign some tentative
- * numbers.  In any case, these numbers are only for this test
+ * There is really no standard for this, so let's assign something
+ * only for this test
  */
-#define COMP_RLE        255
 #define COMP_ZLIB       1
 
 static int verify_callback(int ok, X509_STORE_CTX *ctx);
@@ -466,10 +465,8 @@ static int verify_alpn(SSL *client, SSL *server)
     SSL_get0_alpn_selected(client, &client_proto, &client_proto_len);
     SSL_get0_alpn_selected(server, &server_proto, &server_proto_len);
 
-    if (alpn_selected != NULL) {
-        OPENSSL_free(alpn_selected);
-        alpn_selected = NULL;
-    }
+    OPENSSL_free(alpn_selected);
+    alpn_selected = NULL;
 
     if (client_proto_len != server_proto_len ||
         memcmp(client_proto, server_proto, client_proto_len) != 0) {
@@ -769,7 +766,9 @@ static void sv_usage(void)
             " -bytes <val>  - number of bytes to swap between client/server\n");
 #ifndef OPENSSL_NO_DH
     fprintf(stderr,
-            " -dhe1024      - use 1024 bit key (safe prime) for DHE\n");
+            " -dhe512       - use 512 bit key for DHE (to test failure)\n");
+    fprintf(stderr,
+            " -dhe1024      - use 1024 bit key (safe prime) for DHE (default, no-op)\n");
     fprintf(stderr,
             " -dhe1024dsa   - use 1024 bit key (with 160-bit subprime) for DHE\n");
     fprintf(stderr, " -no_dhe       - disable DHE\n");
@@ -806,7 +805,6 @@ static void sv_usage(void)
     fprintf(stderr,
             " -time         - measure processor time used by client and server\n");
     fprintf(stderr, " -zlib         - use zlib compression\n");
-    fprintf(stderr, " -rle          - use rle compression\n");
 #ifndef OPENSSL_NO_EC
     fprintf(stderr,
             " -named_curve arg  - Elliptic curve name to use for ephemeral ECDH keys.\n"
@@ -982,7 +980,7 @@ int main(int argc, char *argv[])
     long bytes = 256L;
 #ifndef OPENSSL_NO_DH
     DH *dh;
-    int dhe1024 = 0, dhe1024dsa = 0;
+    int dhe512 = 0, dhe1024dsa = 0;
 #endif
 #ifndef OPENSSL_NO_EC
     EC_KEY *ecdh = NULL;
@@ -999,7 +997,7 @@ int main(int argc, char *argv[])
     int print_time = 0;
     clock_t s_time = 0, c_time = 0;
 #ifndef OPENSSL_NO_COMP
-    int comp = 0;
+    int n, comp = 0;
     COMP_METHOD *cm = NULL;
     STACK_OF(SSL_COMP) *ssl_comp_methods = NULL;
 #endif
@@ -1062,7 +1060,7 @@ int main(int argc, char *argv[])
     argv++;
 
     while (argc >= 1) {
-        if (!strcmp(*argv, "-F")) {
+        if (strcmp(*argv, "-F") == 0) {
 #ifdef OPENSSL_FIPS
             fips_mode = 1;
 #else
@@ -1088,19 +1086,19 @@ int main(int argc, char *argv[])
             debug = 1;
         else if (strcmp(*argv, "-reuse") == 0)
             reuse = 1;
-        else if (strcmp(*argv, "-dhe1024") == 0) {
+        else if (strcmp(*argv, "-dhe512") == 0) {
 #ifndef OPENSSL_NO_DH
-            dhe1024 = 1;
+            dhe512 = 1;
 #else
             fprintf(stderr,
-                    "ignoring -dhe1024, since I'm compiled without DH\n");
+                    "ignoring -dhe512, since I'm compiled without DH\n");
 #endif
         } else if (strcmp(*argv, "-dhe1024dsa") == 0) {
 #ifndef OPENSSL_NO_DH
             dhe1024dsa = 1;
 #else
             fprintf(stderr,
-                    "ignoring -dhe1024, since I'm compiled without DH\n");
+                    "ignoring -dhe1024dsa, since I'm compiled without DH\n");
 #endif
         } else if (strcmp(*argv, "-no_dhe") == 0)
             no_dhe = 1;
@@ -1213,8 +1211,6 @@ int main(int argc, char *argv[])
 #ifndef OPENSSL_NO_COMP
         else if (strcmp(*argv, "-zlib") == 0) {
             comp = COMP_ZLIB;
-        } else if (strcmp(*argv, "-rle") == 0) {
-            comp = COMP_RLE;
         }
 #endif
         else if (strcmp(*argv, "-named_curve") == 0) {
@@ -1377,10 +1373,8 @@ int main(int argc, char *argv[])
 #ifndef OPENSSL_NO_COMP
     if (comp == COMP_ZLIB)
         cm = COMP_zlib();
-    if (comp == COMP_RLE)
-        cm = COMP_rle();
     if (cm != NULL) {
-        if (cm->type != NID_undef) {
+        if (COMP_get_type(cm) != NID_undef) {
             if (SSL_COMP_add_compression_method(comp, cm) != 0) {
                 fprintf(stderr, "Failed to add compression method\n");
                 ERR_print_errors_fp(stderr);
@@ -1388,24 +1382,20 @@ int main(int argc, char *argv[])
         } else {
             fprintf(stderr,
                     "Warning: %s compression not supported\n",
-                    (comp == COMP_RLE ? "rle" :
-                     (comp == COMP_ZLIB ? "zlib" : "unknown")));
+                    comp == COMP_ZLIB ? "zlib" : "unknown");
             ERR_print_errors_fp(stderr);
         }
     }
     ssl_comp_methods = SSL_COMP_get_compression_methods();
-    fprintf(stderr, "Available compression methods:");
-    {
-        int j, n = sk_SSL_COMP_num(ssl_comp_methods);
-        if (n == 0)
-            fprintf(stderr, "  NONE\n");
-        else {
-            for (j = 0; j < n; j++) {
-                SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
-                fprintf(stderr, "  %s:%d", c->name, c->id);
-            }
-            fprintf(stderr, "\n");
+    n = sk_SSL_COMP_num(ssl_comp_methods);
+    if (n) {
+        int j;
+        printf("Available compression methods:");
+        for (j = 0; j < n; j++) {
+            SSL_COMP *c = sk_SSL_COMP_value(ssl_comp_methods, j);
+            printf("  %s:%d", c->name, c->id);
         }
+        printf("\n");
     }
 #endif
 
@@ -1429,7 +1419,7 @@ int main(int argc, char *argv[])
     if (tls1)
         meth = TLSv1_method();
     else
-        meth = SSLv23_method();
+        meth = TLS_method();
 
     c_ctx = SSL_CTX_new(meth);
     s_ctx = SSL_CTX_new(meth);
@@ -1439,13 +1429,14 @@ int main(int argc, char *argv[])
     }
     /*
      * Since we will use low security ciphersuites and keys for testing set
-     * security level to zero.
+     * security level to zero by default. Tests can override this by adding
+     * "@SECLEVEL=n" to the cipher string.
      */
     SSL_CTX_set_security_level(c_ctx, 0);
     SSL_CTX_set_security_level(s_ctx, 0);
 
     if (cipher != NULL) {
-        if(!SSL_CTX_set_cipher_list(c_ctx, cipher)
+        if (!SSL_CTX_set_cipher_list(c_ctx, cipher)
            || !SSL_CTX_set_cipher_list(s_ctx, cipher)) {
             ERR_print_errors(bio_err);
             goto end;
@@ -1485,10 +1476,10 @@ int main(int argc, char *argv[])
              */
             SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
             dh = get_dh1024dsa();
-        } else if (dhe1024)
-            dh = get_dh1024();
-        else
+        } else if (dhe512)
             dh = get_dh512();
+        else
+            dh = get_dh1024();
         SSL_CTX_set_tmp_dh(s_ctx, dh);
         DH_free(dh);
     }
@@ -1506,12 +1497,9 @@ int main(int argc, char *argv[])
                 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
                 goto end;
             }
-        } else
-# ifdef OPENSSL_NO_EC2M
+        } else {
             nid = NID_X9_62_prime256v1;
-# else
-            nid = NID_sect163r2;
-# endif
+        }
 
         ecdh = EC_KEY_new_by_curve_name(nid);
         if (ecdh == NULL) {
@@ -1542,7 +1530,7 @@ int main(int argc, char *argv[])
     }
 
     if (client_auth) {
-        if(!SSL_CTX_use_certificate_file(c_ctx, client_cert, SSL_FILETYPE_PEM)
+        if (!SSL_CTX_use_certificate_file(c_ctx, client_cert, SSL_FILETYPE_PEM)
            || !SSL_CTX_use_PrivateKey_file(c_ctx,
                                     (client_key ? client_key : client_cert),
                                     SSL_FILETYPE_PEM)) {
@@ -1561,7 +1549,7 @@ int main(int argc, char *argv[])
     }
 
     if (client_auth) {
-        BIO_printf(bio_err, "client authentication\n");
+        printf("client authentication\n");
         SSL_CTX_set_verify(s_ctx,
                            SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
                            verify_callback);
@@ -1569,7 +1557,7 @@ int main(int argc, char *argv[])
                                          &app_verify_arg);
     }
     if (server_auth) {
-        BIO_printf(bio_err, "server authentication\n");
+        printf("server authentication\n");
         SSL_CTX_set_verify(c_ctx, SSL_VERIFY_PEER, verify_callback);
         SSL_CTX_set_cert_verify_callback(c_ctx, app_verify_callback,
                                          &app_verify_arg);
@@ -1577,7 +1565,7 @@ int main(int argc, char *argv[])
 
     {
         int session_id_context = 0;
-        if(!SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context,
+        if (!SSL_CTX_set_session_id_context(s_ctx, (void *)&session_id_context,
                                        sizeof session_id_context)) {
             ERR_print_errors(bio_err);
             goto end;
@@ -1649,7 +1637,7 @@ int main(int argc, char *argv[])
 #endif
 
     if (serverinfo_sct) {
-        if(!SSL_CTX_add_client_custom_ext(c_ctx, SCT_EXT_TYPE,
+        if (!SSL_CTX_add_client_custom_ext(c_ctx, SCT_EXT_TYPE,
                                       NULL, NULL, NULL,
                                       serverinfo_cli_parse_cb, NULL)) {
             BIO_printf(bio_err, "Error adding SCT extension\n");
@@ -1657,7 +1645,7 @@ int main(int argc, char *argv[])
         }
     }
     if (serverinfo_tack) {
-        if(!SSL_CTX_add_client_custom_ext(c_ctx, TACK_EXT_TYPE,
+        if (!SSL_CTX_add_client_custom_ext(c_ctx, TACK_EXT_TYPE,
                                       NULL, NULL, NULL,
                                       serverinfo_cli_parse_cb, NULL)) {
             BIO_printf(bio_err, "Error adding TACK extension\n");
@@ -1671,35 +1659,35 @@ int main(int argc, char *argv[])
         }
 
     if (custom_ext) {
-        if(!SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_0,
+        if (!SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_0,
                                       custom_ext_0_cli_add_cb,
                                       NULL, NULL,
                                       custom_ext_0_cli_parse_cb, NULL)
-           || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_1,
+            || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_1,
                                       custom_ext_1_cli_add_cb,
                                       NULL, NULL,
                                       custom_ext_1_cli_parse_cb, NULL)
-           || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_2,
+            || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_2,
                                       custom_ext_2_cli_add_cb,
                                       NULL, NULL,
                                       custom_ext_2_cli_parse_cb, NULL)
-           || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_3,
+            || !SSL_CTX_add_client_custom_ext(c_ctx, CUSTOM_EXT_TYPE_3,
                                       custom_ext_3_cli_add_cb,
                                       NULL, NULL,
                                       custom_ext_3_cli_parse_cb, NULL)
-           || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_0,
+            || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_0,
                                       custom_ext_0_srv_add_cb,
                                       NULL, NULL,
                                       custom_ext_0_srv_parse_cb, NULL)
-           || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_1,
+            || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_1,
                                       custom_ext_1_srv_add_cb,
                                       NULL, NULL,
                                       custom_ext_1_srv_parse_cb, NULL)
-           || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_2,
+            || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_2,
                                       custom_ext_2_srv_add_cb,
                                       NULL, NULL,
                                       custom_ext_2_srv_parse_cb, NULL)
-           || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_3,
+            || !SSL_CTX_add_server_custom_ext(s_ctx, CUSTOM_EXT_TYPE_3,
                                       custom_ext_3_srv_add_cb,
                                       NULL, NULL,
                                       custom_ext_3_srv_parse_cb, NULL)) {
@@ -1720,7 +1708,7 @@ int main(int argc, char *argv[])
             goto end;
         }
         /* Returns 0 on success!! */
-        if(SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len)) {
+        if (SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len)) {
             BIO_printf(bio_err, "Error setting ALPN\n");
             OPENSSL_free(alpn);
             goto end;
@@ -1731,24 +1719,10 @@ int main(int argc, char *argv[])
     c_ssl = SSL_new(c_ctx);
     s_ssl = SSL_new(s_ctx);
 
-#ifndef OPENSSL_NO_KRB5
-    if (c_ssl && c_ssl->kssl_ctx) {
-        char localhost[MAXHOSTNAMELEN + 2];
-
-        if (gethostname(localhost, sizeof localhost - 1) == 0) {
-            localhost[sizeof localhost - 1] = '\0';
-            if (strlen(localhost) == sizeof localhost - 1) {
-                BIO_printf(bio_err, "localhost name too long\n");
-                goto end;
-            }
-            kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER, localhost);
-        }
-    }
-#endif                          /* OPENSSL_NO_KRB5 */
-
+    BIO_printf(bio_stdout, "Doing handshakes=%d bytes=%ld\n", number, bytes);
     for (i = 0; i < number; i++) {
         if (!reuse) {
-            if(!SSL_set_session(c_ssl, NULL)) {
+            if (!SSL_set_session(c_ssl, NULL)) {
                 BIO_printf(bio_err, "Failed to set session\n");
                 goto end;
             }
@@ -1763,9 +1737,6 @@ int main(int argc, char *argv[])
     if (!verbose) {
         print_details(c_ssl, "");
     }
-    if ((i > 1) || (bytes > 1L))
-        BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n", i,
-                   bytes);
     if (print_time) {
 #ifdef CLOCKS_PER_SEC
         /*
@@ -2461,11 +2432,8 @@ int doit(SSL *s_ssl, SSL *c_ssl, long count)
     BIO_free(s_to_c);
     BIO_free_all(c_bio);
     BIO_free_all(s_bio);
-
-    if (cbuf)
-        OPENSSL_free(cbuf);
-    if (sbuf)
-        OPENSSL_free(sbuf);
+    OPENSSL_free(cbuf);
+    OPENSSL_free(sbuf);
 
     return (ret);
 }
@@ -2493,7 +2461,7 @@ static int verify_callback(int ok, X509_STORE_CTX *ctx)
                           sizeof buf);
     if (s != NULL) {
         if (ok)
-            fprintf(stderr, "depth=%d %s\n", ctx->error_depth, buf);
+            printf("depth=%d %s\n", ctx->error_depth, buf);
         else {
             fprintf(stderr, "depth=%d error=%d %s\n",
                     ctx->error_depth, ctx->error, buf);
@@ -2501,13 +2469,14 @@ static int verify_callback(int ok, X509_STORE_CTX *ctx)
     }
 
     if (ok == 0) {
-        fprintf(stderr, "Error string: %s\n",
-                X509_verify_cert_error_string(ctx->error));
         switch (ctx->error) {
+        default:
+            fprintf(stderr, "Error string: %s\n",
+                    X509_verify_cert_error_string(ctx->error));
+            break;
         case X509_V_ERR_CERT_NOT_YET_VALID:
         case X509_V_ERR_CERT_HAS_EXPIRED:
         case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
-            fprintf(stderr, "  ... ignored.\n");
             ok = 1;
         }
     }
@@ -2566,7 +2535,7 @@ static int verify_callback(int ok, X509_STORE_CTX *ctx)
                      * others.
                      */
 
-                    fprintf(stderr, "  Certificate proxy rights = %*.*s", i,
+                    printf("  Certificate proxy rights = %*.*s", i,
                             i, s);
                     while (i-- > 0) {
                         int c = *s++;
@@ -2584,15 +2553,15 @@ static int verify_callback(int ok, X509_STORE_CTX *ctx)
                 }
 
                 found_any = 0;
-                fprintf(stderr, ", resulting proxy rights = ");
+                printf(", resulting proxy rights = ");
                 for (i = 0; i < 26; i++)
                     if (letters[i]) {
-                        fprintf(stderr, "%c", i + 'A');
+                        printf("%c", i + 'A');
                         found_any = 1;
                     }
                 if (!found_any)
-                    fprintf(stderr, "none");
-                fprintf(stderr, "\n");
+                    printf("none");
+                printf("\n");
 
                 PROXY_CERT_INFO_EXTENSION_free(pci);
             }
@@ -2851,15 +2820,14 @@ static int app_verify_callback(X509_STORE_CTX *ctx, void *arg)
     if (cb_arg->app_verify) {
         char *s = NULL, buf[256];
 
-        fprintf(stderr, "In app_verify_callback, allowing cert. ");
-        fprintf(stderr, "Arg is: %s\n", cb_arg->string);
-        fprintf(stderr,
-                "Finished printing do we have a context? 0x%p a cert? 0x%p\n",
+        printf("In app_verify_callback, allowing cert. ");
+        printf("Arg is: %s\n", cb_arg->string);
+        printf("Finished printing do we have a context? 0x%p a cert? 0x%p\n",
                 (void *)ctx, (void *)ctx->cert);
         if (ctx->cert)
             s = X509_NAME_oneline(X509_get_subject_name(ctx->cert), buf, 256);
         if (s != NULL) {
-            fprintf(stderr, "cert depth=%d %s\n", ctx->error_depth, buf);
+            printf("cert depth=%d %s\n", ctx->error_depth, buf);
         }
         return (1);
     }
@@ -2878,15 +2846,15 @@ static int app_verify_callback(X509_STORE_CTX *ctx, void *arg)
             }
         }
 
-        fprintf(stderr, "  Initial proxy rights = ");
+        printf("  Initial proxy rights = ");
         for (i = 0; i < 26; i++)
             if (letters[i]) {
-                fprintf(stderr, "%c", i + 'A');
+                printf("%c", i + 'A');
                 found_any = 1;
             }
         if (!found_any)
-            fprintf(stderr, "none");
-        fprintf(stderr, "\n");
+            printf("none");
+        printf("\n");
 
         X509_STORE_CTX_set_ex_data(ctx,
                                    get_proxy_auth_ex_data_idx(), letters);
@@ -2911,11 +2879,10 @@ static int app_verify_callback(X509_STORE_CTX *ctx, void *arg)
             }
             if (!ok)
                 fprintf(stderr,
-                        "Proxy rights check with condition '%s' proved invalid\n",
+                        "Proxy rights check with condition '%s' invalid\n",
                         cb_arg->proxy_cond);
             else
-                fprintf(stderr,
-                        "Proxy rights check with condition '%s' proved valid\n",
+                printf("Proxy rights check with condition '%s' ok\n",
                         cb_arg->proxy_cond);
         }
     }
@@ -2935,19 +2902,16 @@ static RSA *tmp_rsa_cb(SSL *s, int is_export, int keylength)
             BIO_printf(bio_err, "Memory error...");
             goto end;
         }
-        BIO_printf(bio_err, "Generating temp (%d bit) RSA key...", keylength);
-        (void)BIO_flush(bio_err);
+        printf("Generating temp (%d bit) RSA key...", keylength);
         if (!RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL)) {
             BIO_printf(bio_err, "Error generating key.");
             RSA_free(rsa_tmp);
             rsa_tmp = NULL;
         }
  end:
-        BIO_printf(bio_err, "\n");
-        (void)BIO_flush(bio_err);
+        printf("\n");
     }
-    if (bn)
-        BN_free(bn);
+    BN_free(bn);
     return (rsa_tmp);
 }
 
@@ -3113,8 +3077,7 @@ static int psk_key2bn(const char *pskkey, unsigned char *psk,
     if (!ret) {
         BIO_printf(bio_err, "Could not convert PSK key '%s' to BIGNUM\n",
                    pskkey);
-        if (bn)
-            BN_free(bn);
+        BN_free(bn);
         return 0;
     }
     if (BN_num_bytes(bn) > (int)max_psk_len) {
@@ -3174,31 +3137,29 @@ static int do_test_cipherlist(void)
     const SSL_CIPHER *ci, *tci = NULL;
 
 #ifndef OPENSSL_NO_SSL3
-    fprintf(stderr, "testing SSLv3 cipher list order: ");
     meth = SSLv3_method();
     tci = NULL;
     while ((ci = meth->get_cipher(i++)) != NULL) {
         if (tci != NULL)
             if (ci->id >= tci->id) {
+                fprintf(stderr, "testing SSLv3 cipher list order: ");
                 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
                 return 0;
             }
         tci = ci;
     }
-    fprintf(stderr, "ok\n");
 #endif
-    fprintf(stderr, "testing TLSv1 cipher list order: ");
     meth = TLSv1_method();
     tci = NULL;
     while ((ci = meth->get_cipher(i++)) != NULL) {
         if (tci != NULL)
             if (ci->id >= tci->id) {
+                fprintf(stderr, "testing TLSv1 cipher list order: ");
                 fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id);
                 return 0;
             }
         tci = ci;
     }
-    fprintf(stderr, "ok\n");
 
     return 1;
 }