mirror of
https://github.com/openssl/openssl.git
synced 2024-12-15 06:01:37 +08:00
57cd10dd1e
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/16641)
155 lines
4.7 KiB
Plaintext
155 lines
4.7 KiB
Plaintext
=pod
|
|
|
|
=head1 NAME
|
|
|
|
ossl_lib_ctx_get_data, ossl_lib_ctx_run_once, ossl_lib_ctx_onfree,
|
|
ossl_lib_ctx_is_child
|
|
- internal OSSL_LIB_CTX routines
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
#include <openssl/types.h>
|
|
#include "internal/cryptlib.h"
|
|
|
|
typedef struct ossl_lib_ctx_method {
|
|
int priority;
|
|
void *(*new_func)(OSSL_LIB_CTX *ctx);
|
|
void (*free_func)(void *);
|
|
} OSSL_LIB_CTX_METHOD;
|
|
|
|
void *ossl_lib_ctx_get_data(OSSL_LIB_CTX *ctx, int index,
|
|
const OSSL_LIB_CTX_METHOD *meth);
|
|
|
|
int ossl_lib_ctx_run_once(OSSL_LIB_CTX *ctx, unsigned int idx,
|
|
ossl_lib_ctx_run_once_fn run_once_fn);
|
|
int ossl_lib_ctx_onfree(OSSL_LIB_CTX *ctx, ossl_lib_ctx_onfree_fn onfreefn);
|
|
|
|
int ossl_lib_ctx_is_child(OSSL_LIB_CTX *ctx);
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Internally, the OpenSSL library context B<OSSL_LIB_CTX> is implemented
|
|
as a B<CRYPTO_EX_DATA>, which allows data from diverse parts of the
|
|
library to be added and removed dynamically.
|
|
Each such data item must have a corresponding CRYPTO_EX_DATA index
|
|
associated with it. Unlike normal CRYPTO_EX_DATA objects we use static indexes
|
|
to identify data items. These are mapped transparently to CRYPTO_EX_DATA dynamic
|
|
indexes internally to the implementation.
|
|
See the example further down to see how that's done.
|
|
|
|
ossl_lib_ctx_get_data() is used to retrieve a pointer to the data in
|
|
the library context I<ctx> associated with the given I<index>. An
|
|
OSSL_LIB_CTX_METHOD must be defined and given in the I<meth> parameter. The index
|
|
for it should be defined in cryptlib.h. The functions through the method are
|
|
used to create or free items that are stored at that index whenever a library
|
|
context is created or freed, meaning that the code that use a data item of that
|
|
index doesn't have to worry about that, just use the data available.
|
|
|
|
Deallocation of an index happens automatically when the library
|
|
context is freed.
|
|
|
|
ossl_lib_ctx_run_once is used to run some initialisation routine I<run_once_fn>
|
|
exactly once per library context I<ctx> object. Each initialisation routine
|
|
should be allocate a unique run once index in cryptlib.h.
|
|
|
|
Any resources allocated via a run once initialisation routine can be cleaned up
|
|
using ossl_lib_ctx_onfree. This associates an "on free" routine I<onfreefn> with
|
|
the library context I<ctx>. When I<ctx> is freed all associated "on free"
|
|
routines are called.
|
|
|
|
ossl_lib_ctx_is_child() returns 1 if this library context is a child and 0
|
|
otherwise.
|
|
|
|
=head1 RETURN VALUES
|
|
|
|
ossl_lib_ctx_get_data() returns a pointer on success, or NULL on
|
|
failure.
|
|
|
|
=head1 EXAMPLES
|
|
|
|
=head2 Initialization
|
|
|
|
For a type C<FOO> that should end up in the OpenSSL library context, a
|
|
small bit of initialization is needed, i.e. to associate a constructor
|
|
and a destructor to an index.
|
|
|
|
typedef struct foo_st {
|
|
int i;
|
|
void *data;
|
|
} FOO;
|
|
|
|
static void *foo_new(OSSL_LIB_CTX *ctx)
|
|
{
|
|
FOO *ptr = OPENSSL_zalloc(sizeof(*foo));
|
|
if (ptr != NULL)
|
|
ptr->i = 42;
|
|
return ptr;
|
|
}
|
|
static void foo_free(void *ptr)
|
|
{
|
|
OPENSSL_free(ptr);
|
|
}
|
|
|
|
/*
|
|
* Include a reference to this in the methods table in context.c
|
|
* OSSL_LIB_CTX_FOO_INDEX should be added to internal/cryptlib.h
|
|
* Priorities can be OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
|
|
* OSSL_LIB_CTX_METHOD_PRIORITY_1, OSSL_LIB_CTX_METHOD_PRIORITY_2, etc.
|
|
* Default priority is low (0). The higher the priority the earlier the
|
|
* method's destructor will be called when the library context is cleaned up.
|
|
*/
|
|
const OSSL_LIB_CTX_METHOD foo_method = {
|
|
OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
|
|
foo_new,
|
|
foo_free
|
|
};
|
|
|
|
=head2 Usage
|
|
|
|
To get and use the data stored in the library context, simply do this:
|
|
|
|
/*
|
|
* ctx is received from a caller,
|
|
*/
|
|
FOO *data = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_FOO_INDEX, &foo_method);
|
|
|
|
=head2 Run Once
|
|
|
|
void foo_cleanup(OSSL_LIB_CTX *ctx)
|
|
{
|
|
/* Free foo resources associated with ctx */
|
|
}
|
|
|
|
static ossl_lib_ctx_run_once_fn do_foo_init;
|
|
static int do_foo_init(OSSL_LIB_CTX *ctx)
|
|
{
|
|
/* Allocate and initialise some foo resources and associated with ctx */
|
|
return ossl_lib_ctx_onfree(ctx, &foo_cleanup)
|
|
}
|
|
|
|
int foo_some_function(OSSL_LIB_CTX *ctx)
|
|
{
|
|
if (!ossl_lib_ctx_run_once(ctx,
|
|
OSSL_LIB_CTX_FOO_RUN_ONCE_INDEX,
|
|
do_foo_init))
|
|
return 0;
|
|
|
|
/* Do some work using foo resources in ctx */
|
|
}
|
|
|
|
|
|
=head1 SEE ALSO
|
|
|
|
L<OSSL_LIB_CTX(3)>
|
|
|
|
=head1 COPYRIGHT
|
|
|
|
Copyright 2019-2021 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
|