123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- =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
|