Replumbing: Add support for the provider query_operation function
authorRichard Levitte <levitte@openssl.org>
Mon, 25 Feb 2019 00:57:28 +0000 (01:57 +0100)
committerRichard Levitte <levitte@openssl.org>
Tue, 12 Mar 2019 19:25:46 +0000 (20:25 +0100)
Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/8340)

crypto/provider_core.c
doc/internal/man3/ossl_provider_new.pod
include/internal/provider.h
include/openssl/core_numbers.h

index e7cbee2e439b62ec890d58ceeda2634d39a2a7c4..fb4be55676ebbdc3a058bbb0f5031f67a95a560e 100644 (file)
@@ -39,6 +39,7 @@ struct ossl_provider_st {
     OSSL_provider_teardown_fn *teardown;
     OSSL_provider_get_param_types_fn *get_param_types;
     OSSL_provider_get_params_fn *get_params;
     OSSL_provider_teardown_fn *teardown;
     OSSL_provider_get_param_types_fn *get_param_types;
     OSSL_provider_get_params_fn *get_params;
+    OSSL_provider_query_operation_fn *query_operation;
 };
 DEFINE_STACK_OF(OSSL_PROVIDER)
 
 };
 DEFINE_STACK_OF(OSSL_PROVIDER)
 
@@ -319,6 +320,10 @@ int ossl_provider_activate(OSSL_PROVIDER *prov)
             prov->get_params =
                 OSSL_get_provider_get_params(provider_dispatch);
             break;
             prov->get_params =
                 OSSL_get_provider_get_params(provider_dispatch);
             break;
+        case OSSL_FUNC_PROVIDER_QUERY_OPERATION:
+            prov->query_operation =
+                OSSL_get_provider_query_operation(provider_dispatch);
+            break;
         }
     }
 
         }
     }
 
@@ -392,6 +397,14 @@ int ossl_provider_get_params(const OSSL_PROVIDER *prov,
     return prov->get_params == NULL ? 0 : prov->get_params(prov, params);
 }
 
     return prov->get_params == NULL ? 0 : prov->get_params(prov, params);
 }
 
+
+const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov,
+                                                    int operation_id,
+                                                    int *no_cache)
+{
+    return prov->query_operation(prov, operation_id, no_cache);
+}
+
 /*-
  * Core functions for the provider
  * ===============================
 /*-
  * Core functions for the provider
  * ===============================
index c21012bf19abf0b1429437ec608cc9c3946f0fc7..7633e0e242a1209ba0b56789f3af497d9ef58c64 100644 (file)
@@ -8,7 +8,8 @@ ossl_provider_activate, ossl_provider_forall_loaded,
 ossl_provider_name, ossl_provider_dso,
 ossl_provider_module_name, ossl_provider_module_path,
 ossl_provider_teardown, ossl_provider_get_param_types,
 ossl_provider_name, ossl_provider_dso,
 ossl_provider_module_name, ossl_provider_module_path,
 ossl_provider_teardown, ossl_provider_get_param_types,
-ossl_provider_get_params - internal provider routines
+ossl_provider_get_params, ossl_provider_query_operation
+- internal provider routines
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
@@ -43,6 +44,9 @@ ossl_provider_get_params - internal provider routines
  const OSSL_ITEM *ossl_provider_get_param_types(const OSSL_PROVIDER *prov);
  int ossl_provider_get_params(const OSSL_PROVIDER *prov,
                               const OSSL_PARAM params[]);
  const OSSL_ITEM *ossl_provider_get_param_types(const OSSL_PROVIDER *prov);
  int ossl_provider_get_params(const OSSL_PROVIDER *prov,
                               const OSSL_PARAM params[]);
+ const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov,
+                                                     int operation_id,
+                                                     int *no_cache);
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
@@ -137,6 +141,11 @@ responder.
 It should treat the given C<OSSL_PARAM> array as described in
 L<OSSL_PARAM(3)>.
 
 It should treat the given C<OSSL_PARAM> array as described in
 L<OSSL_PARAM(3)>.
 
+ossl_provider_query_operation() calls the provider's
+C<query_operation> function, if the provider has one.
+It should return an array of C<OSSL_ALGORITHM> for the given
+C<operation_id>.
+
 =head1 NOTES
 
 Locating a provider module happens as follows:
 =head1 NOTES
 
 Locating a provider module happens as follows:
index dee5ee6b9f2606e9b3cf733382e7c35003f3bed6..ac70fcc5b6223dfdb0e84eec566d4926d88036e1 100644 (file)
@@ -59,6 +59,9 @@ void ossl_provider_teardown(const OSSL_PROVIDER *prov);
 const OSSL_ITEM *ossl_provider_get_param_types(const OSSL_PROVIDER *prov);
 int ossl_provider_get_params(const OSSL_PROVIDER *prov,
                              const OSSL_PARAM params[]);
 const OSSL_ITEM *ossl_provider_get_param_types(const OSSL_PROVIDER *prov);
 int ossl_provider_get_params(const OSSL_PROVIDER *prov,
                              const OSSL_PARAM params[]);
+const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov,
+                                                    int operation_id,
+                                                    int *no_cache);
 
 # ifdef __cplusplus
 }
 
 # ifdef __cplusplus
 }
index cd1093860ab43e3a882c56ca06dac13f88f80d1e..7be2a2bb75d1e61fde1c9db6f35f1e5ebe677e6c 100644 (file)
@@ -67,6 +67,10 @@ OSSL_CORE_MAKE_FUNC(const OSSL_ITEM *,
 # define OSSL_FUNC_PROVIDER_GET_PARAMS       1026
 OSSL_CORE_MAKE_FUNC(int,provider_get_params,(const OSSL_PROVIDER *prov,
                                              const OSSL_PARAM params[]))
 # define OSSL_FUNC_PROVIDER_GET_PARAMS       1026
 OSSL_CORE_MAKE_FUNC(int,provider_get_params,(const OSSL_PROVIDER *prov,
                                              const OSSL_PARAM params[]))
+# define OSSL_FUNC_PROVIDER_QUERY_OPERATION  1027
+OSSL_CORE_MAKE_FUNC(const OSSL_ALGORITHM *,provider_query_operation,
+                    (const OSSL_PROVIDER *, int operation_id,
+                     const int *no_store))
 
 
 # ifdef __cplusplus
 
 
 # ifdef __cplusplus