e74bd29053
Quite a few adaptations are needed, most prominently the added code to allow provider based MACs. As part of this, all the old information functions are gone, except for EVP_MAC_name(). Some of them will reappear later, for example EVP_MAC_do_all() in some form. MACs by EVP_PKEY was particularly difficult to deal with, as they need to allocate and deallocate EVP_MAC_CTXs "under the hood", and thereby implicitly fetch the corresponding EVP_MAC. This means that EVP_MACs can't be constant in a EVP_MAC_CTX, as their reference count may need to be incremented and decremented as part of the allocation or deallocation of the EVP_MAC_CTX. It may be that other provider based EVP operation types may need to be handled in a similar manner. Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/8877)
290 lines
11 KiB
Text
290 lines
11 KiB
Text
=pod
|
|
|
|
=head1 NAME
|
|
|
|
ossl_provider_find, ossl_provider_new, ossl_provider_up_ref,
|
|
ossl_provider_free,
|
|
ossl_provider_set_fallback, ossl_provider_set_module_path,
|
|
ossl_provider_add_parameter,
|
|
ossl_provider_activate, ossl_provider_available,
|
|
ossl_provider_ctx,
|
|
ossl_provider_forall_loaded,
|
|
ossl_provider_name, ossl_provider_dso,
|
|
ossl_provider_module_name, ossl_provider_module_path,
|
|
ossl_provider_library_context,
|
|
ossl_provider_teardown, ossl_provider_gettable_params,
|
|
ossl_provider_get_params, ossl_provider_query_operation
|
|
- internal provider routines
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
#include "internal/provider.h"
|
|
|
|
OSSL_PROVIDER *ossl_provider_find(OPENSSL_CTX *libctx, const char *name,
|
|
int noconfig);
|
|
OSSL_PROVIDER *ossl_provider_new(OPENSSL_CTX *libctx, const char *name,
|
|
ossl_provider_init_fn *init_function
|
|
int noconfig);
|
|
int ossl_provider_up_ref(OSSL_PROVIDER *prov);
|
|
void ossl_provider_free(OSSL_PROVIDER *prov);
|
|
|
|
/* Setters */
|
|
int ossl_provider_set_fallback(OSSL_PROVIDER *prov);
|
|
int ossl_provider_set_module_path(OSSL_PROVIDER *prov, const char *path);
|
|
int ossl_provider_add_parameter(OSSL_PROVIDER *prov, const char *name,
|
|
const char *value);
|
|
|
|
/* Load and initialize the Provider */
|
|
int ossl_provider_activate(OSSL_PROVIDER *prov);
|
|
/* Check if provider is available */
|
|
int ossl_provider_available(OSSL_PROVIDER *prov);
|
|
|
|
/* Return pointer to the provider's context */
|
|
void *ossl_provider_ctx(const OSSL_PROVIDER *prov);
|
|
|
|
/* Iterate over all loaded providers */
|
|
int ossl_provider_forall_loaded(OPENSSL_CTX *,
|
|
int (*cb)(OSSL_PROVIDER *provider,
|
|
void *cbdata),
|
|
void *cbdata);
|
|
|
|
/* Getters for other library functions */
|
|
const char *ossl_provider_name(OSSL_PROVIDER *prov);
|
|
const DSO *ossl_provider_dso(OSSL_PROVIDER *prov);
|
|
const char *ossl_provider_module_name(OSSL_PROVIDER *prov);
|
|
const char *ossl_provider_module_path(OSSL_PROVIDER *prov);
|
|
OPENSSL_CTX *ossl_provider_library_context(const OSSL_PROVIDER *prov);
|
|
|
|
/* Thin wrappers around calls to the provider */
|
|
void ossl_provider_teardown(const OSSL_PROVIDER *prov);
|
|
const OSSL_PARAM *ossl_provider_gettable_params(const OSSL_PROVIDER *prov);
|
|
int ossl_provider_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]);
|
|
const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov,
|
|
int operation_id,
|
|
int *no_cache);
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
I<OSSL_PROVIDER> is a type that holds all the necessary information
|
|
to handle a provider, regardless of if it's built in to the
|
|
application or the OpenSSL libraries, or if it's a loadable provider
|
|
module.
|
|
Instances of this type are commonly referred to as "provider objects".
|
|
|
|
A provider object is always stored in a set of provider objects
|
|
in the library context.
|
|
|
|
Provider objects are reference counted.
|
|
|
|
Provider objects are initially inactive, i.e. they are only recorded
|
|
in the store, but are not used.
|
|
They are activated with the first call to ossl_provider_activate(),
|
|
and are inactivated when ossl_provider_free() has been called as many
|
|
times as ossl_provider_activate() has.
|
|
|
|
=head2 Functions
|
|
|
|
ossl_provider_find() finds an existing provider object in the provider
|
|
object store by I<name>.
|
|
The config file will be automatically loaded unless I<noconfig> is set.
|
|
Typically I<noconfig> should be 0.
|
|
We set I<noconfig> to 1 only when calling these functions while processing a
|
|
config file in order to avoid recursively attempting to load the file.
|
|
The provider object it finds has its reference count incremented.
|
|
|
|
ossl_provider_new() creates a new provider object named I<name> and
|
|
stores it in the provider object store, unless there already is one
|
|
there with the same name.
|
|
If there already is one with the same name, it's returned with its
|
|
reference count incremented.
|
|
The config file will be automatically loaded unless I<noconfig> is set.
|
|
Typically I<noconfig> should be 0.
|
|
We set I<noconfig> to 1 only when calling these functions while processing a
|
|
config file in order to avoid recursively attempting to load the file.
|
|
The reference count of a newly created provider object will always
|
|
be 2; one for being added to the store, and one for the returned
|
|
reference.
|
|
If I<init_function> is NULL, the provider is assumed to be a
|
|
dynamically loadable module, with the symbol B<OSSL_provider_init> as
|
|
its initialisation function.
|
|
If I<init_function> isn't NULL, the provider is assumed to be built
|
|
in, with I<init_function> being the pointer to its initialisation
|
|
function.
|
|
For further description of the initialisation function, see the
|
|
description of ossl_provider_activate() below.
|
|
|
|
ossl_provider_up_ref() increments the provider object I<prov>'s
|
|
reference count.
|
|
|
|
ossl_provider_free() decrements the provider object I<prov>'s
|
|
reference count; if it drops below 2, the provider object is assumed
|
|
to have fallen out of use and will be deactivated (its I<teardown>
|
|
function is called); if it drops down to zero, I<prov> is assumed to
|
|
have been taken out of the store, and the associated module will be
|
|
unloaded if one was loaded, and I<prov> itself will be freed.
|
|
|
|
ossl_provider_set_fallback() marks an available provider I<prov> as
|
|
fallback.
|
|
Note that after this call, the provider object pointer that was
|
|
used can simply be dropped, but not freed.
|
|
|
|
ossl_provider_set_module_path() sets the module path to load the
|
|
provider module given the provider object I<prov>.
|
|
This will be used in preference to automatically trying to figure out
|
|
the path from the provider name and the default module directory (more
|
|
on this in L</NOTES>).
|
|
|
|
ossl_provider_library_context() returns the library context the given
|
|
provider I<prov> is registered in.
|
|
|
|
ossl_provider_add_parameter() adds a global parameter for the provider
|
|
to retrieve as it sees fit.
|
|
The parameters are a combination of I<name> and I<value>, and the
|
|
provider will use the name to find the value it wants.
|
|
Only text parameters can be given, and it's up to the provider to
|
|
interpret them.
|
|
|
|
ossl_provider_activate() "activates" the provider for the given
|
|
provider object I<prov>.
|
|
What "activates" means depends on what type of provider object it
|
|
is:
|
|
|
|
=over 4
|
|
|
|
=item *
|
|
|
|
If an initialization function was given with ossl_provider_new(), that
|
|
function will get called.
|
|
|
|
=item *
|
|
|
|
If no initialization function was given with ossl_provider_new(), a
|
|
loadable module with the I<name> that was given to ossl_provider_new()
|
|
will be located and loaded, then the symbol B<OSSL_provider_init> will
|
|
be located in that module, and called.
|
|
|
|
=back
|
|
|
|
ossl_provider_available() activates all fallbacks if no provider is
|
|
activated yet, then checks if given provider object I<prov> is
|
|
activated.
|
|
|
|
ossl_provider_ctx() returns a context created by the provider.
|
|
Outside of the provider, it's completely opaque, but it needs to be
|
|
passed back to some of the provider functions.
|
|
|
|
ossl_provider_forall_loaded() iterates over all the currently
|
|
"activated" providers, and calls I<cb> for each of them.
|
|
If no providers have been "activated" yet, it tries to activate all
|
|
available fallback providers and tries another iteration.
|
|
|
|
ossl_provider_name() returns the name that was given with
|
|
ossl_provider_new().
|
|
|
|
ossl_provider_dso() returns a reference to the module, for providers
|
|
that come in the form of loadable modules.
|
|
|
|
ossl_provider_module_name() returns the file name of the module, for
|
|
providers that come in the form of loadable modules.
|
|
|
|
ossl_provider_module_path() returns the full path of the module file,
|
|
for providers that come in the form of loadable modules.
|
|
|
|
ossl_provider_teardown() calls the provider's I<teardown> function, if
|
|
the provider has one.
|
|
|
|
ossl_provider_gettable_params() calls the provider's I<gettable_params>
|
|
function, if the provider has one.
|
|
It should return an array of I<OSSL_PARAM> to describe all the
|
|
parameters that the provider has for the provider object.
|
|
|
|
ossl_provider_get_params() calls the provider's parameter request
|
|
responder.
|
|
It should treat the given I<OSSL_PARAM> array as described in
|
|
L<OSSL_PARAM(3)>.
|
|
|
|
ossl_provider_query_operation() calls the provider's
|
|
I<query_operation> function, if the provider has one.
|
|
It should return an array of I<OSSL_ALGORITHM> for the given
|
|
I<operation_id>.
|
|
|
|
=head1 NOTES
|
|
|
|
Locating a provider module happens as follows:
|
|
|
|
=over 4
|
|
|
|
=item 1.
|
|
|
|
If a path was given with ossl_provider_set_module_path(), use that as
|
|
module path.
|
|
Otherwise, use the provider object's name as module path, with
|
|
platform specific standard extensions added.
|
|
|
|
=item 2.
|
|
|
|
If the environment variable B<OPENSSL_MODULES> is defined, assume its
|
|
value is a directory specification and merge it with the module path.
|
|
Otherwise, merge the value of the OpenSSL built in macro B<MODULESDIR>
|
|
with the module path.
|
|
|
|
=back
|
|
|
|
When this process is done, the result is used when trying to load the
|
|
provider module.
|
|
|
|
The command C<openssl version -m> can be used to find out the value
|
|
of the built in macro B<MODULESDIR>.
|
|
|
|
=head1 RETURN VALUES
|
|
|
|
ossl_provider_find() and ossl_provider_new() return a pointer to a
|
|
provider object (I<OSSL_PROVIDER>) on success, or NULL on error.
|
|
|
|
ossl_provider_up_ref() returns the value of the reference count after
|
|
it has been incremented.
|
|
|
|
ossl_provider_free() doesn't return any value.
|
|
|
|
ossl_provider_set_module_path(), ossl_provider_set_fallback() and
|
|
ossl_provider_activate() return 1 on success, or 0 on error.
|
|
|
|
ossl_provider_available() return 1 if the provider is available,
|
|
otherwise 0.
|
|
|
|
ossl_provider_name(), ossl_provider_dso(),
|
|
ossl_provider_module_name(), and ossl_provider_module_path() return a
|
|
pointer to their respective data if it's available, otherwise NULL
|
|
is returned.
|
|
|
|
ossl_provider_library_context() return a pointer to the library context.
|
|
This may be NULL, and is perfectly valid, as it denotes the default
|
|
global library context.
|
|
|
|
ossl_provider_teardown() doesnt't return any value.
|
|
|
|
ossl_provider_gettable_params() returns a pointer to a constant
|
|
I<OSSL_PARAM> array if this function is available in the provider,
|
|
otherwise NULL.
|
|
|
|
ossl_provider_get_params() returns 1 on success, or 0 on error.
|
|
If this function isn't available in the provider, 0 is returned.
|
|
|
|
=head1 SEE ALSO
|
|
|
|
L<OSSL_PROVIDER(3)>, L<provider(7)>, L<openssl(1)>
|
|
|
|
=head1 HISTORY
|
|
|
|
The functions described here were all added in OpenSSL 3.0.
|
|
|
|
=head1 COPYRIGHT
|
|
|
|
Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
|
|
|
Licensed under the Apache License 2.0 (the "License"). You may not use
|
|
this file except in compliance with the License. You can obtain a copy
|
|
in the file LICENSE in the source distribution or at
|
|
L<https://www.openssl.org/source/license.html>.
|
|
|
|
=cut
|