Replumbing: Adapt the default and legacy providers to use library context upcall
authorRichard Levitte <levitte@openssl.org>
Fri, 14 Jun 2019 09:41:32 +0000 (11:41 +0200)
committerRichard Levitte <levitte@openssl.org>
Mon, 17 Jun 2019 09:38:11 +0000 (11:38 +0200)
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9160)

providers/default/defltprov.c
providers/legacy/legacyprov.c

index 98999405d6ae0bade7fbfcee06971f99a30761bc..b9c8c36ef0d1ec541dab4cabc83522910daf5a6f 100644 (file)
@@ -144,6 +144,8 @@ int ossl_default_provider_init(const OSSL_PROVIDER *provider,
                                const OSSL_DISPATCH **out,
                                void **provctx)
 {
+    OSSL_core_get_library_context_fn *c_get_libctx = NULL;
+
     for (; in->function_id != 0; in++) {
         switch (in->function_id) {
         case OSSL_FUNC_CORE_GET_PARAM_TYPES:
@@ -152,12 +154,25 @@ int ossl_default_provider_init(const OSSL_PROVIDER *provider,
         case OSSL_FUNC_CORE_GET_PARAMS:
             c_get_params = OSSL_get_core_get_params(in);
             break;
+        case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT:
+            c_get_libctx = OSSL_get_core_get_library_context(in);
+            break;
         default:
             /* Just ignore anything we don't understand */
             break;
         }
     }
 
+    if (c_get_libctx == NULL)
+        return 0;
+
     *out = deflt_dispatch_table;
+
+    /*
+     * We want to make sure that all calls from this provider that requires
+     * a library context use the same context as the one used to call our
+     * functions.  We do that by passing it along as the provider context.
+     */
+    *provctx = c_get_libctx(provider);
     return 1;
 }
index 9ca4e148332825be12fe7c6b9824ec5e087215ac..9b5533708f4b2c10cf37cb78b64a01027ae91cc6 100644 (file)
@@ -99,6 +99,8 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
                        const OSSL_DISPATCH **out,
                        void **provctx)
 {
+    OSSL_core_get_library_context_fn *c_get_libctx = NULL;
+
     for (; in->function_id != 0; in++) {
         switch (in->function_id) {
         case OSSL_FUNC_CORE_GET_PARAM_TYPES:
@@ -107,12 +109,25 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
         case OSSL_FUNC_CORE_GET_PARAMS:
             c_get_params = OSSL_get_core_get_params(in);
             break;
+        case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT:
+            c_get_libctx = OSSL_get_core_get_library_context(in);
+            break;
         /* Just ignore anything we don't understand */
         default:
             break;
         }
     }
 
+    if (c_get_libctx == NULL)
+        return 0;
+
     *out = legacy_dispatch_table;
+
+    /*
+     * We want to make sure that all calls from this provider that requires
+     * a library context use the same context as the one used to call our
+     * functions.  We do that by passing it along as the provider context.
+     */
+    *provctx = c_get_libctx(provider);
     return 1;
 }