Teach ssl_test_old how to run tests in a non-default library context
authorMatt Caswell <matt@openssl.org>
Fri, 10 Apr 2020 13:31:19 +0000 (14:31 +0100)
committerMatt Caswell <matt@openssl.org>
Mon, 20 Apr 2020 10:39:08 +0000 (11:39 +0100)
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/11534)

test/ssltest_old.c

index d2c764c..90f1605 100644 (file)
@@ -65,6 +65,7 @@
 #ifndef OPENSSL_NO_CT
 # include <openssl/ct.h>
 #endif
+#include <openssl/provider.h>
 
 /*
  * Or gethostname won't be declared properly
@@ -725,6 +726,7 @@ static void sv_usage(void)
     fprintf(stderr, " -client_sess_in <file>     - Read the client session from a file\n");
     fprintf(stderr, " -should_reuse <number>     - The expected state of reusing the session\n");
     fprintf(stderr, " -no_ticket    - do not issue TLS session ticket\n");
+    fprintf(stderr, " -provider <name>    - Load the given provider into the library context\n");
 }
 
 static void print_key_details(BIO *out, EVP_PKEY *key)
@@ -922,6 +924,9 @@ int main(int argc, char *argv[])
     SSL_CONF_CTX *s_cctx = NULL, *c_cctx = NULL, *s_cctx2 = NULL;
     STACK_OF(OPENSSL_STRING) *conf_args = NULL;
     char *arg = NULL, *argn = NULL;
+    const char *provider = NULL, *config = NULL;
+    OSSL_PROVIDER *thisprov = NULL, *defctxnull = NULL;
+    OPENSSL_CTX *libctx = NULL;
 
     verbose = 0;
     debug = 0;
@@ -1183,6 +1188,10 @@ int main(int argc, char *argv[])
             should_reuse = !!atoi(*(++argv));
         } else if (strcmp(*argv, "-no_ticket") == 0) {
             no_ticket = 1;
+        } else if (strcmp(*argv, "-provider") == 0) {
+            if (--argc < 1)
+                goto bad;
+            provider = *(++argv);
         } else {
             int rv;
             arg = argv[0];
@@ -1350,9 +1359,22 @@ int main(int argc, char *argv[])
     }
 #endif
 
-    c_ctx = SSL_CTX_new(meth);
-    s_ctx = SSL_CTX_new(meth);
-    s_ctx2 = SSL_CTX_new(meth); /* no SSL_CTX_dup! */
+    if (provider != NULL) {
+        defctxnull = OSSL_PROVIDER_load(NULL, "null");
+        if (defctxnull == NULL)
+            goto end;
+        libctx = OPENSSL_CTX_new();
+        if (libctx == NULL)
+            goto end;
+
+        thisprov = OSSL_PROVIDER_load(libctx, provider);
+        if (thisprov == NULL)
+            goto end;
+    }
+
+    c_ctx = SSL_CTX_new_with_libctx(libctx, NULL, meth);
+    s_ctx = SSL_CTX_new_with_libctx(libctx, NULL, meth);
+    s_ctx2 = SSL_CTX_new_with_libctx(libctx, NULL, meth); /* no SSL_CTX_dup! */
     if ((c_ctx == NULL) || (s_ctx == NULL) || (s_ctx2 == NULL)) {
         ERR_print_errors(bio_err);
         goto end;
@@ -1859,6 +1881,10 @@ int main(int argc, char *argv[])
     SSL_SESSION_free(server_sess);
     SSL_SESSION_free(client_sess);
 
+    OSSL_PROVIDER_unload(defctxnull);
+    OSSL_PROVIDER_unload(thisprov);
+    OPENSSL_CTX_free(libctx);
+
     BIO_free(bio_err);
     EXIT(ret);
 }