| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982 |
- .\" -*- mode: troff; coding: utf-8 -*-
- .\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
- .\"
- .\" Standard preamble:
- .\" ========================================================================
- .de Sp \" Vertical space (when we can't use .PP)
- .if t .sp .5v
- .if n .sp
- ..
- .de Vb \" Begin verbatim text
- .ft CW
- .nf
- .ne \\$1
- ..
- .de Ve \" End verbatim text
- .ft R
- .fi
- ..
- .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
- .ie n \{\
- . ds C` ""
- . ds C' ""
- 'br\}
- .el\{\
- . ds C`
- . ds C'
- 'br\}
- .\"
- .\" Escape single quotes in literal strings from groff's Unicode transform.
- .ie \n(.g .ds Aq \(aq
- .el .ds Aq '
- .\"
- .\" If the F register is >0, we'll generate index entries on stderr for
- .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
- .\" entries marked with X<> in POD. Of course, you'll have to process the
- .\" output yourself in some meaningful fashion.
- .\"
- .\" Avoid warning from groff about undefined register 'F'.
- .de IX
- ..
- .nr rF 0
- .if \n(.g .if rF .nr rF 1
- .if (\n(rF:(\n(.g==0)) \{\
- . if \nF \{\
- . de IX
- . tm Index:\\$1\t\\n%\t"\\$2"
- ..
- . if !\nF==2 \{\
- . nr % 0
- . nr F 2
- . \}
- . \}
- .\}
- .rr rF
- .\" ========================================================================
- .\"
- .IX Title "PROVIDER-BASE 7ossl"
- .TH PROVIDER-BASE 7ossl 2025-01-17 3.4.0 OpenSSL
- .\" For nroff, turn off justification. Always turn off hyphenation; it makes
- .\" way too many mistakes in technical documents.
- .if n .ad l
- .nh
- .SH NAME
- provider\-base
- \&\- The basic OpenSSL library <\-> provider functions
- .SH SYNOPSIS
- .IX Header "SYNOPSIS"
- .Vb 1
- \& #include <openssl/core_dispatch.h>
- \&
- \& /*
- \& * None of these are actual functions, but are displayed like this for
- \& * the function signatures for functions that are offered as function
- \& * pointers in OSSL_DISPATCH arrays.
- \& */
- \&
- \& /* Functions offered by libcrypto to the providers */
- \& const OSSL_ITEM *core_gettable_params(const OSSL_CORE_HANDLE *handle);
- \& int core_get_params(const OSSL_CORE_HANDLE *handle, OSSL_PARAM params[]);
- \&
- \& typedef void (*OSSL_thread_stop_handler_fn)(void *arg);
- \& int core_thread_start(const OSSL_CORE_HANDLE *handle,
- \& OSSL_thread_stop_handler_fn handfn,
- \& void *arg);
- \&
- \& OPENSSL_CORE_CTX *core_get_libctx(const OSSL_CORE_HANDLE *handle);
- \& void core_new_error(const OSSL_CORE_HANDLE *handle);
- \& void core_set_error_debug(const OSSL_CORE_HANDLE *handle,
- \& const char *file, int line, const char *func);
- \& void core_vset_error(const OSSL_CORE_HANDLE *handle,
- \& uint32_t reason, const char *fmt, va_list args);
- \&
- \& int core_obj_add_sigid(const OSSL_CORE_HANDLE *prov, const char *sign_name,
- \& const char *digest_name, const char *pkey_name);
- \& int core_obj_create(const OSSL_CORE_HANDLE *handle, const char *oid,
- \& const char *sn, const char *ln);
- \&
- \& /*
- \& * Some OpenSSL functionality is directly offered to providers via
- \& * dispatch
- \& */
- \& void *CRYPTO_malloc(size_t num, const char *file, int line);
- \& void *CRYPTO_zalloc(size_t num, const char *file, int line);
- \& void CRYPTO_free(void *ptr, const char *file, int line);
- \& void CRYPTO_clear_free(void *ptr, size_t num,
- \& const char *file, int line);
- \& void *CRYPTO_realloc(void *addr, size_t num,
- \& const char *file, int line);
- \& void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num,
- \& const char *file, int line);
- \& void *CRYPTO_secure_malloc(size_t num, const char *file, int line);
- \& void *CRYPTO_secure_zalloc(size_t num, const char *file, int line);
- \& void CRYPTO_secure_free(void *ptr, const char *file, int line);
- \& void CRYPTO_secure_clear_free(void *ptr, size_t num,
- \& const char *file, int line);
- \& int CRYPTO_secure_allocated(const void *ptr);
- \& void OPENSSL_cleanse(void *ptr, size_t len);
- \&
- \& unsigned char *OPENSSL_hexstr2buf(const char *str, long *buflen);
- \&
- \& OSSL_CORE_BIO *BIO_new_file(const char *filename, const char *mode);
- \& OSSL_CORE_BIO *BIO_new_membuf(const void *buf, int len);
- \& int BIO_read_ex(OSSL_CORE_BIO *bio, void *data, size_t data_len,
- \& size_t *bytes_read);
- \& int BIO_write_ex(OSSL_CORE_BIO *bio, const void *data, size_t data_len,
- \& size_t *written);
- \& int BIO_up_ref(OSSL_CORE_BIO *bio);
- \& int BIO_free(OSSL_CORE_BIO *bio);
- \& int BIO_vprintf(OSSL_CORE_BIO *bio, const char *format, va_list args);
- \& int BIO_vsnprintf(char *buf, size_t n, const char *fmt, va_list args);
- \&
- \& void OSSL_SELF_TEST_set_callback(OSSL_LIB_CTX *libctx, OSSL_CALLBACK *cb,
- \& void *cbarg);
- \&
- \& size_t get_entropy(const OSSL_CORE_HANDLE *handle,
- \& unsigned char **pout, int entropy,
- \& size_t min_len, size_t max_len);
- \& size_t get_user_entropy(const OSSL_CORE_HANDLE *handle,
- \& unsigned char **pout, int entropy,
- \& size_t min_len, size_t max_len);
- \& void cleanup_entropy(const OSSL_CORE_HANDLE *handle,
- \& unsigned char *buf, size_t len);
- \& void cleanup_user_entropy(const OSSL_CORE_HANDLE *handle,
- \& unsigned char *buf, size_t len);
- \& size_t get_nonce(const OSSL_CORE_HANDLE *handle,
- \& unsigned char **pout, size_t min_len, size_t max_len,
- \& const void *salt, size_t salt_len);
- \& size_t get_user_nonce(const OSSL_CORE_HANDLE *handle,
- \& unsigned char **pout, size_t min_len, size_t max_len,
- \& const void *salt, size_t salt_len);
- \& void cleanup_nonce(const OSSL_CORE_HANDLE *handle,
- \& unsigned char *buf, size_t len);
- \& void cleanup_user_nonce(const OSSL_CORE_HANDLE *handle,
- \& unsigned char *buf, size_t len);
- \&
- \& /* Functions for querying the providers in the application library context */
- \& int provider_register_child_cb(const OSSL_CORE_HANDLE *handle,
- \& int (*create_cb)(const OSSL_CORE_HANDLE *provider,
- \& void *cbdata),
- \& int (*remove_cb)(const OSSL_CORE_HANDLE *provider,
- \& void *cbdata),
- \& int (*global_props_cb)(const char *props, void *cbdata),
- \& void *cbdata);
- \& void provider_deregister_child_cb(const OSSL_CORE_HANDLE *handle);
- \& const char *provider_name(const OSSL_CORE_HANDLE *prov);
- \& void *provider_get0_provider_ctx(const OSSL_CORE_HANDLE *prov);
- \& const OSSL_DISPATCH *provider_get0_dispatch(const OSSL_CORE_HANDLE *prov);
- \& int provider_up_ref(const OSSL_CORE_HANDLE *prov, int activate);
- \& int provider_free(const OSSL_CORE_HANDLE *prov, int deactivate);
- \&
- \& /* Functions offered by the provider to libcrypto */
- \& void provider_teardown(void *provctx);
- \& const OSSL_ITEM *provider_gettable_params(void *provctx);
- \& int provider_get_params(void *provctx, OSSL_PARAM params[]);
- \& const OSSL_ALGORITHM *provider_query_operation(void *provctx,
- \& int operation_id,
- \& const int *no_store);
- \& void provider_unquery_operation(void *provctx, int operation_id,
- \& const OSSL_ALGORITHM *algs);
- \& const OSSL_ITEM *provider_get_reason_strings(void *provctx);
- \& int provider_get_capabilities(void *provctx, const char *capability,
- \& OSSL_CALLBACK *cb, void *arg);
- \& int provider_self_test(void *provctx);
- .Ve
- .SH DESCRIPTION
- .IX Header "DESCRIPTION"
- All "functions" mentioned here are passed as function pointers between
- \&\fIlibcrypto\fR and the provider in \fBOSSL_DISPATCH\fR\|(3) arrays, in the call
- of the provider initialization function. See "Provider" in \fBprovider\fR\|(7)
- for a description of the initialization function. They are known as "upcalls".
- .PP
- All these "functions" have a corresponding function type definition
- named \fBOSSL_FUNC_{name}_fn\fR, and a helper function to retrieve the
- function pointer from a \fBOSSL_DISPATCH\fR\|(3) element named
- \&\fBOSSL_FUNC_{name}\fR.
- For example, the "function" \fBcore_gettable_params()\fR has these:
- .PP
- .Vb 4
- \& typedef OSSL_PARAM *
- \& (OSSL_FUNC_core_gettable_params_fn)(const OSSL_CORE_HANDLE *handle);
- \& static ossl_inline OSSL_NAME_core_gettable_params_fn
- \& OSSL_FUNC_core_gettable_params(const OSSL_DISPATCH *opf);
- .Ve
- .PP
- \&\fBOSSL_DISPATCH\fR\|(3) arrays are indexed by numbers that are provided as
- macros in \fBopenssl\-core_dispatch.h\fR\|(7), as follows:
- .PP
- For \fIin\fR (the \fBOSSL_DISPATCH\fR\|(3) array passed from \fIlibcrypto\fR to the
- provider):
- .PP
- .Vb 10
- \& core_gettable_params OSSL_FUNC_CORE_GETTABLE_PARAMS
- \& core_get_params OSSL_FUNC_CORE_GET_PARAMS
- \& core_thread_start OSSL_FUNC_CORE_THREAD_START
- \& core_get_libctx OSSL_FUNC_CORE_GET_LIBCTX
- \& core_new_error OSSL_FUNC_CORE_NEW_ERROR
- \& core_set_error_debug OSSL_FUNC_CORE_SET_ERROR_DEBUG
- \& core_vset_error OSSL_FUNC_CORE_VSET_ERROR
- \& core_obj_add_sigid OSSL_FUNC_CORE_OBJ_ADD_SIGID
- \& core_obj_create OSSL_FUNC_CORE_OBJ_CREATE
- \& CRYPTO_malloc OSSL_FUNC_CRYPTO_MALLOC
- \& CRYPTO_zalloc OSSL_FUNC_CRYPTO_ZALLOC
- \& CRYPTO_free OSSL_FUNC_CRYPTO_FREE
- \& CRYPTO_clear_free OSSL_FUNC_CRYPTO_CLEAR_FREE
- \& CRYPTO_realloc OSSL_FUNC_CRYPTO_REALLOC
- \& CRYPTO_clear_realloc OSSL_FUNC_CRYPTO_CLEAR_REALLOC
- \& CRYPTO_secure_malloc OSSL_FUNC_CRYPTO_SECURE_MALLOC
- \& CRYPTO_secure_zalloc OSSL_FUNC_CRYPTO_SECURE_ZALLOC
- \& CRYPTO_secure_free OSSL_FUNC_CRYPTO_SECURE_FREE
- \& CRYPTO_secure_clear_free OSSL_FUNC_CRYPTO_SECURE_CLEAR_FREE
- \& CRYPTO_secure_allocated OSSL_FUNC_CRYPTO_SECURE_ALLOCATED
- \& BIO_new_file OSSL_FUNC_BIO_NEW_FILE
- \& BIO_new_mem_buf OSSL_FUNC_BIO_NEW_MEMBUF
- \& BIO_read_ex OSSL_FUNC_BIO_READ_EX
- \& BIO_write_ex OSSL_FUNC_BIO_WRITE_EX
- \& BIO_up_ref OSSL_FUNC_BIO_UP_REF
- \& BIO_free OSSL_FUNC_BIO_FREE
- \& BIO_vprintf OSSL_FUNC_BIO_VPRINTF
- \& BIO_vsnprintf OSSL_FUNC_BIO_VSNPRINTF
- \& BIO_puts OSSL_FUNC_BIO_PUTS
- \& BIO_gets OSSL_FUNC_BIO_GETS
- \& BIO_ctrl OSSL_FUNC_BIO_CTRL
- \& OPENSSL_cleanse OSSL_FUNC_OPENSSL_CLEANSE
- \& OSSL_SELF_TEST_set_callback OSSL_FUNC_SELF_TEST_CB
- \& ossl_rand_get_entropy OSSL_FUNC_GET_ENTROPY
- \& ossl_rand_get_user_entropy OSSL_FUNC_GET_USER_ENTROPY
- \& ossl_rand_cleanup_entropy OSSL_FUNC_CLEANUP_ENTROPY
- \& ossl_rand_cleanup_user_entropy OSSL_FUNC_CLEANUP_USER_ENTROPY
- \& ossl_rand_get_nonce OSSL_FUNC_GET_NONCE
- \& ossl_rand_get_user_nonce OSSL_FUNC_GET_USER_NONCE
- \& ossl_rand_cleanup_nonce OSSL_FUNC_CLEANUP_NONCE
- \& ossl_rand_cleanup_user_nonce OSSL_FUNC_CLEANUP_USER_NONCE
- \& provider_register_child_cb OSSL_FUNC_PROVIDER_REGISTER_CHILD_CB
- \& provider_deregister_child_cb OSSL_FUNC_PROVIDER_DEREGISTER_CHILD_CB
- \& provider_name OSSL_FUNC_PROVIDER_NAME
- \& provider_get0_provider_ctx OSSL_FUNC_PROVIDER_GET0_PROVIDER_CTX
- \& provider_get0_dispatch OSSL_FUNC_PROVIDER_GET0_DISPATCH
- \& provider_up_ref OSSL_FUNC_PROVIDER_UP_REF
- \& provider_free OSSL_FUNC_PROVIDER_FREE
- .Ve
- .PP
- For \fI*out\fR (the \fBOSSL_DISPATCH\fR\|(3) array passed from the provider to
- \&\fIlibcrypto\fR):
- .PP
- .Vb 8
- \& provider_teardown OSSL_FUNC_PROVIDER_TEARDOWN
- \& provider_gettable_params OSSL_FUNC_PROVIDER_GETTABLE_PARAMS
- \& provider_get_params OSSL_FUNC_PROVIDER_GET_PARAMS
- \& provider_query_operation OSSL_FUNC_PROVIDER_QUERY_OPERATION
- \& provider_unquery_operation OSSL_FUNC_PROVIDER_UNQUERY_OPERATION
- \& provider_get_reason_strings OSSL_FUNC_PROVIDER_GET_REASON_STRINGS
- \& provider_get_capabilities OSSL_FUNC_PROVIDER_GET_CAPABILITIES
- \& provider_self_test OSSL_FUNC_PROVIDER_SELF_TEST
- .Ve
- .SS "Core functions"
- .IX Subsection "Core functions"
- \&\fBcore_gettable_params()\fR returns a constant array of descriptor
- \&\fBOSSL_PARAM\fR\|(3), for parameters that \fBcore_get_params()\fR can handle.
- .PP
- \&\fBcore_get_params()\fR retrieves parameters from the core for the given \fIhandle\fR.
- See "Core parameters" below for a description of currently known
- parameters.
- .PP
- The \fBcore_thread_start()\fR function informs the core that the provider has stated
- an interest in the current thread. The core will inform the provider when the
- thread eventually stops. It must be passed the \fIhandle\fR for this provider, as
- well as a callback \fIhandfn\fR which will be called when the thread stops. The
- callback will subsequently be called, with the supplied argument \fIarg\fR, from
- the thread that is stopping and gets passed the provider context as an
- argument. This may be useful to perform thread specific clean up such as
- freeing thread local variables.
- .PP
- \&\fBcore_get_libctx()\fR retrieves the core context in which the library
- object for the current provider is stored, accessible through the \fIhandle\fR.
- This function is useful only for built-in providers such as the default
- provider. Never cast this to OSSL_LIB_CTX in a provider that is not
- built-in as the OSSL_LIB_CTX of the library loading the provider might be
- a completely different structure than the OSSL_LIB_CTX of the library the
- provider is linked to. Use \fBOSSL_LIB_CTX_new_child\fR\|(3) instead to obtain
- a proper library context that is linked to the application library context.
- .PP
- \&\fBcore_new_error()\fR, \fBcore_set_error_debug()\fR and \fBcore_vset_error()\fR are
- building blocks for reporting an error back to the core, with
- reference to the \fIhandle\fR.
- .IP \fBcore_new_error()\fR 4
- .IX Item "core_new_error()"
- allocates a new thread specific error record.
- .Sp
- This corresponds to the OpenSSL function \fBERR_new\fR\|(3).
- .IP \fBcore_set_error_debug()\fR 4
- .IX Item "core_set_error_debug()"
- sets debugging information in the current thread specific error
- record.
- The debugging information includes the name of the file \fIfile\fR, the
- line \fIline\fR and the function name \fIfunc\fR where the error occurred.
- .Sp
- This corresponds to the OpenSSL function \fBERR_set_debug\fR\|(3).
- .IP \fBcore_vset_error()\fR 4
- .IX Item "core_vset_error()"
- sets the \fIreason\fR for the error, along with any addition data.
- The \fIreason\fR is a number defined by the provider and used to index
- the reason strings table that's returned by
- \&\fBprovider_get_reason_strings()\fR.
- The additional data is given as a format string \fIfmt\fR and a set of
- arguments \fIargs\fR, which are treated in the same manner as with
- \&\fBBIO_vsnprintf()\fR.
- \&\fIfile\fR and \fIline\fR may also be passed to indicate exactly where the
- error occurred or was reported.
- .Sp
- This corresponds to the OpenSSL function \fBERR_vset_error\fR\|(3).
- .PP
- The \fBcore_obj_create()\fR function registers a new OID and associated short name
- \&\fIsn\fR and long name \fIln\fR for the given \fIhandle\fR. It is similar to the OpenSSL
- function \fBOBJ_create\fR\|(3) except that it returns 1 on success or 0 on failure.
- It will treat as success the case where the OID already exists (even if the
- short name \fIsn\fR or long name \fIln\fR provided as arguments differ from those
- associated with the existing OID, in which case the new names are not
- associated).
- .PP
- The \fBcore_obj_add_sigid()\fR function registers a new composite signature algorithm
- (\fIsign_name\fR) consisting of an underlying signature algorithm (\fIpkey_name\fR)
- and digest algorithm (\fIdigest_name\fR) for the given \fIhandle\fR. It assumes that
- the OIDs for the composite signature algorithm as well as for the underlying
- signature and digest algorithms are either already known to OpenSSL or have been
- registered via a call to \fBcore_obj_create()\fR. It corresponds to the OpenSSL
- function \fBOBJ_add_sigid\fR\|(3), except that the objects are identified by name
- rather than a numeric NID. Any name (OID, short name or long name) can be used
- to identify the object. It will treat as success the case where the composite
- signature algorithm already exists (even if registered against a different
- underlying signature or digest algorithm). For \fIdigest_name\fR, NULL or an
- empty string is permissible for signature algorithms that do not need a digest
- to operate correctly. The function returns 1 on success or 0 on failure.
- .PP
- \&\fBCRYPTO_malloc()\fR, \fBCRYPTO_zalloc()\fR, \fBCRYPTO_free()\fR, \fBCRYPTO_clear_free()\fR,
- \&\fBCRYPTO_realloc()\fR, \fBCRYPTO_clear_realloc()\fR, \fBCRYPTO_secure_malloc()\fR,
- \&\fBCRYPTO_secure_zalloc()\fR, \fBCRYPTO_secure_free()\fR,
- \&\fBCRYPTO_secure_clear_free()\fR, \fBCRYPTO_secure_allocated()\fR,
- \&\fBBIO_new_file()\fR, \fBBIO_new_mem_buf()\fR, \fBBIO_read_ex()\fR, \fBBIO_write_ex()\fR, \fBBIO_up_ref()\fR,
- \&\fBBIO_free()\fR, \fBBIO_vprintf()\fR, \fBBIO_vsnprintf()\fR, \fBBIO_gets()\fR, \fBBIO_puts()\fR,
- \&\fBBIO_ctrl()\fR, \fBOPENSSL_cleanse()\fR and
- \&\fBOPENSSL_hexstr2buf()\fR correspond exactly to the public functions with
- the same name. As a matter of fact, the pointers in the \fBOSSL_DISPATCH\fR\|(3)
- array are typically direct pointers to those public functions. Note that the BIO
- functions take an \fBOSSL_CORE_BIO\fR type rather than the standard \fBBIO\fR
- type. This is to ensure that a provider does not mix BIOs from the core
- with BIOs used on the provider side (the two are not compatible).
- \&\fBOSSL_SELF_TEST_set_callback()\fR is used to set an optional callback that can be
- passed into a provider. This may be ignored by a provider.
- .PP
- \&\fBget_entropy()\fR retrieves seeding material from the operating system.
- The seeding material will have at least \fIentropy\fR bytes of randomness and the
- output will have at least \fImin_len\fR and at most \fImax_len\fR bytes.
- The buffer address is stored in \fI*pout\fR and the buffer length is
- returned to the caller. On error, zero is returned.
- .PP
- \&\fBget_user_entropy()\fR is the same as \fBget_entropy()\fR except that it will
- attempt to gather seed material via the seed source specified by a call to
- \&\fBRAND_set_seed_source_type\fR\|(3) or via "Random Configuration" in \fBconfig\fR\|(5).
- .PP
- \&\fBcleanup_entropy()\fR is used to clean up and free the buffer returned by
- \&\fBget_entropy()\fR. The entropy pointer returned by \fBget_entropy()\fR
- is passed in \fBbuf\fR and its length in \fBlen\fR.
- .PP
- \&\fBcleanup_user_entropy()\fR is used to clean up and free the buffer returned by
- \&\fBget_user_entropy()\fR. The entropy pointer returned by \fBget_user_entropy()\fR
- is passed in \fBbuf\fR and its length in \fBlen\fR.
- .PP
- \&\fBget_nonce()\fR retrieves a nonce using the passed \fIsalt\fR parameter
- of length \fIsalt_len\fR and operating system specific information.
- The \fIsalt\fR should contain uniquely identifying information and this is
- included, in an unspecified manner, as part of the output.
- The output is stored in a buffer which contains at least \fImin_len\fR and at
- most \fImax_len\fR bytes. The buffer address is stored in \fI*pout\fR and the
- buffer length returned to the caller. On error, zero is returned.
- .PP
- \&\fBget_user_nonce()\fR is the same as \fBget_nonce()\fR except that it will attempt
- to gather seed material via the seed source specified by a call to
- \&\fBRAND_set_seed_source_type\fR\|(3) or via "Random Configuration" in \fBconfig\fR\|(5).
- .PP
- \&\fBcleanup_nonce()\fR is used to clean up and free the buffer returned by
- \&\fBget_nonce()\fR. The nonce pointer returned by \fBget_nonce()\fR
- is passed in \fBbuf\fR and its length in \fBlen\fR.
- .PP
- \&\fBcleanup_user_nonce()\fR is used to clean up and free the buffer returned by
- \&\fBget_user_nonce()\fR. The nonce pointer returned by \fBget_user_nonce()\fR
- is passed in \fBbuf\fR and its length in \fBlen\fR.
- .PP
- \&\fBprovider_register_child_cb()\fR registers callbacks for being informed about the
- loading and unloading of providers in the application's library context.
- \&\fIhandle\fR is this provider's handle and \fIcbdata\fR is this provider's data
- that will be passed back to the callbacks. It returns 1 on success or 0
- otherwise. These callbacks may be called while holding locks in libcrypto. In
- order to avoid deadlocks the callback implementation must not be long running
- and must not call other OpenSSL API functions or upcalls.
- .PP
- \&\fIcreate_cb\fR is a callback that will be called when a new provider is loaded
- into the application's library context. It is also called for any providers that
- are already loaded at the point that this callback is registered. The callback
- is passed the handle being used for the new provider being loadded and this
- provider's data in \fIcbdata\fR. It should return 1 on success or 0 on failure.
- .PP
- \&\fIremove_cb\fR is a callback that will be called when a new provider is unloaded
- from the application's library context. It is passed the handle being used for
- the provider being unloaded and this provider's data in \fIcbdata\fR. It should
- return 1 on success or 0 on failure.
- .PP
- \&\fIglobal_props_cb\fR is a callback that will be called when the global properties
- from the parent library context are changed. It should return 1 on success
- or 0 on failure.
- .PP
- \&\fBprovider_deregister_child_cb()\fR unregisters callbacks previously registered via
- \&\fBprovider_register_child_cb()\fR. If \fBprovider_register_child_cb()\fR has been called
- then \fBprovider_deregister_child_cb()\fR should be called at or before the point that
- this provider's teardown function is called.
- .PP
- \&\fBprovider_name()\fR returns a string giving the name of the provider identified by
- \&\fIhandle\fR.
- .PP
- \&\fBprovider_get0_provider_ctx()\fR returns the provider context that is associated
- with the provider identified by \fIprov\fR.
- .PP
- \&\fBprovider_get0_dispatch()\fR gets the dispatch table registered by the provider
- identified by \fIprov\fR when it initialised.
- .PP
- \&\fBprovider_up_ref()\fR increments the reference count on the provider \fIprov\fR. If
- \&\fIactivate\fR is nonzero then the provider is also loaded if it is not already
- loaded. It returns 1 on success or 0 on failure.
- .PP
- \&\fBprovider_free()\fR decrements the reference count on the provider \fIprov\fR. If
- \&\fIdeactivate\fR is nonzero then the provider is also unloaded if it is not
- already loaded. It returns 1 on success or 0 on failure.
- .SS "Provider functions"
- .IX Subsection "Provider functions"
- \&\fBprovider_teardown()\fR is called when a provider is shut down and removed
- from the core's provider store.
- It must free the passed \fIprovctx\fR.
- .PP
- \&\fBprovider_gettable_params()\fR should return a constant array of
- descriptor \fBOSSL_PARAM\fR\|(3), for parameters that \fBprovider_get_params()\fR
- can handle.
- .PP
- \&\fBprovider_get_params()\fR should process the \fBOSSL_PARAM\fR\|(3) array
- \&\fIparams\fR, setting the values of the parameters it understands.
- .PP
- \&\fBprovider_query_operation()\fR should return a constant \fBOSSL_ALGORITHM\fR\|(3)
- that corresponds to the given \fIoperation_id\fR.
- It should indicate if the core may store a reference to this array by
- setting \fI*no_store\fR to 0 (core may store a reference) or 1 (core may
- not store a reference).
- .PP
- \&\fBprovider_unquery_operation()\fR informs the provider that the result of a
- \&\fBprovider_query_operation()\fR is no longer directly required and that the function
- pointers have been copied. The \fIoperation_id\fR should match that passed to
- \&\fBprovider_query_operation()\fR and \fIalgs\fR should be its return value.
- .PP
- \&\fBprovider_get_reason_strings()\fR should return a constant \fBOSSL_ITEM\fR\|(3)
- array that provides reason strings for reason codes the provider may
- use when reporting errors using \fBcore_put_error()\fR.
- .PP
- The \fBprovider_get_capabilities()\fR function should call the callback \fIcb\fR passing
- it a set of \fBOSSL_PARAM\fR\|(3)s and the caller supplied argument \fIarg\fR. The
- \&\fBOSSL_PARAM\fR\|(3)s should provide details about the capability with the name given
- in the \fIcapability\fR argument relevant for the provider context \fIprovctx\fR. If a
- provider supports multiple capabilities with the given name then it may call the
- callback multiple times (one for each capability). Capabilities can be useful for
- describing the services that a provider can offer. For further details see the
- "CAPABILITIES" section below. It should return 1 on success or 0 on error.
- .PP
- The \fBprovider_self_test()\fR function should perform known answer tests on a subset
- of the algorithms that it uses, and may also verify the integrity of the
- provider module. It should return 1 on success or 0 on error. It will return 1
- if this function is not used.
- .PP
- None of these functions are mandatory, but a provider is fairly
- useless without at least \fBprovider_query_operation()\fR, and
- \&\fBprovider_gettable_params()\fR is fairly useless if not accompanied by
- \&\fBprovider_get_params()\fR.
- .SS "Provider parameters"
- .IX Subsection "Provider parameters"
- \&\fBprovider_get_params()\fR can return the following provider parameters to the core:
- .IP """name"" (\fBOSSL_PROV_PARAM_NAME\fR) <UTF8 ptr>" 4
- .IX Item """name"" (OSSL_PROV_PARAM_NAME) <UTF8 ptr>"
- This points to a string that should give a unique name for the provider.
- .IP """version"" (\fBOSSL_PROV_PARAM_VERSION\fR) <UTF8 ptr>" 4
- .IX Item """version"" (OSSL_PROV_PARAM_VERSION) <UTF8 ptr>"
- This points to a string that is a version number associated with this provider.
- OpenSSL in-built providers use OPENSSL_VERSION_STR, but this may be different
- for any third party provider. This string is for informational purposes only.
- .IP """buildinfo"" (\fBOSSL_PROV_PARAM_BUILDINFO\fR) <UTF8 ptr>" 4
- .IX Item """buildinfo"" (OSSL_PROV_PARAM_BUILDINFO) <UTF8 ptr>"
- This points to a string that is a build information associated with this provider.
- OpenSSL in-built providers use OPENSSL_FULL_VERSION_STR, but this may be
- different for any third party provider.
- .IP """status"" (\fBOSSL_PROV_PARAM_STATUS\fR) <unsigned integer>" 4
- .IX Item """status"" (OSSL_PROV_PARAM_STATUS) <unsigned integer>"
- This returns 0 if the provider has entered an error state, otherwise it returns
- 1.
- .PP
- \&\fBprovider_gettable_params()\fR should return the above parameters.
- .SS "Core parameters"
- .IX Subsection "Core parameters"
- \&\fBcore_get_params()\fR can retrieve the following core parameters for each provider:
- .IP """openssl-version"" (\fBOSSL_PROV_PARAM_CORE_VERSION\fR) <UTF8 string ptr>" 4
- .IX Item """openssl-version"" (OSSL_PROV_PARAM_CORE_VERSION) <UTF8 string ptr>"
- This points to the OpenSSL libraries' full version string, i.e. the string
- expanded from the macro \fBOPENSSL_VERSION_STR\fR.
- .IP """provider-name"" (\fBOSSL_PROV_PARAM_CORE_PROV_NAME\fR) <UTF8 string ptr>" 4
- .IX Item """provider-name"" (OSSL_PROV_PARAM_CORE_PROV_NAME) <UTF8 string ptr>"
- This points to the OpenSSL libraries' idea of what the calling provider is named.
- .IP """module-filename"" (\fBOSSL_PROV_PARAM_CORE_MODULE_FILENAME\fR) <UTF8 string ptr>" 4
- .IX Item """module-filename"" (OSSL_PROV_PARAM_CORE_MODULE_FILENAME) <UTF8 string ptr>"
- This points to a string containing the full filename of the providers
- module file.
- .PP
- Additionally, provider specific configuration parameters from the
- config file are available, in dotted name form.
- The dotted name form is a concatenation of section names and final
- config command name separated by periods.
- .PP
- For example, let's say we have the following config example:
- .PP
- .Vb 2
- \& config_diagnostics = 1
- \& openssl_conf = openssl_init
- \&
- \& [openssl_init]
- \& providers = providers_sect
- \&
- \& [providers_sect]
- \& foo = foo_sect
- \&
- \& [foo_sect]
- \& activate = 1
- \& data1 = 2
- \& data2 = str
- \& more = foo_more
- \&
- \& [foo_more]
- \& data3 = foo,bar
- .Ve
- .PP
- The provider will have these additional parameters available:
- .IP """activate""" 4
- .IX Item """activate"""
- pointing at the string "1"
- .IP """data1""" 4
- .IX Item """data1"""
- pointing at the string "2"
- .IP """data2""" 4
- .IX Item """data2"""
- pointing at the string "str"
- .IP """more.data3""" 4
- .IX Item """more.data3"""
- pointing at the string "foo,bar"
- .PP
- For more information on handling parameters, see \fBOSSL_PARAM\fR\|(3) as
- \&\fBOSSL_PARAM_int\fR\|(3).
- .SH CAPABILITIES
- .IX Header "CAPABILITIES"
- Capabilities describe some of the services that a provider can offer.
- Applications can query the capabilities to discover those services.
- .PP
- \fI"TLS-GROUP" Capability\fR
- .IX Subsection """TLS-GROUP"" Capability"
- .PP
- The "TLS-GROUP" capability can be queried by libssl to discover the list of
- TLS groups that a provider can support. Each group supported can be used for
- \&\fIkey exchange\fR (KEX) or \fIkey encapsulation method\fR (KEM) during a TLS
- handshake.
- TLS clients can advertise the list of TLS groups they support in the
- supported_groups extension, and TLS servers can select a group from the offered
- list that they also support. In this way a provider can add to the list of
- groups that libssl already supports with additional ones.
- .PP
- Each TLS group that a provider supports should be described via the callback
- passed in through the provider_get_capabilities function. Each group should have
- the following details supplied (all are mandatory, except
- \&\fBOSSL_CAPABILITY_TLS_GROUP_IS_KEM\fR):
- .IP """tls-group-name"" (\fBOSSL_CAPABILITY_TLS_GROUP_NAME\fR) <UTF8 string>" 4
- .IX Item """tls-group-name"" (OSSL_CAPABILITY_TLS_GROUP_NAME) <UTF8 string>"
- The name of the group as given in the IANA TLS Supported Groups registry
- <https://www.iana.org/assignments/tls\-parameters/tls\-parameters.xhtml#tls\-parameters\-8>.
- .IP """tls-group-name-internal"" (\fBOSSL_CAPABILITY_TLS_GROUP_NAME_INTERNAL\fR) <UTF8 string>" 4
- .IX Item """tls-group-name-internal"" (OSSL_CAPABILITY_TLS_GROUP_NAME_INTERNAL) <UTF8 string>"
- The name of the group as known by the provider. This could be the same as the
- "tls-group-name", but does not have to be.
- .IP """tls-group-id"" (\fBOSSL_CAPABILITY_TLS_GROUP_ID\fR) <unsigned integer>" 4
- .IX Item """tls-group-id"" (OSSL_CAPABILITY_TLS_GROUP_ID) <unsigned integer>"
- The TLS group id value as given in the IANA TLS Supported Groups registry.
- .IP """tls-group-alg"" (\fBOSSL_CAPABILITY_TLS_GROUP_ALG\fR) <UTF8 string>" 4
- .IX Item """tls-group-alg"" (OSSL_CAPABILITY_TLS_GROUP_ALG) <UTF8 string>"
- The name of a Key Management algorithm that the provider offers and that should
- be used with this group. Keys created should be able to support \fIkey exchange\fR
- or \fIkey encapsulation method\fR (KEM), as implied by the optional
- \&\fBOSSL_CAPABILITY_TLS_GROUP_IS_KEM\fR flag.
- The algorithm must support key and parameter generation as well as the
- key/parameter generation parameter, \fBOSSL_PKEY_PARAM_GROUP_NAME\fR. The group
- name given via "tls-group-name-internal" above will be passed via
- \&\fBOSSL_PKEY_PARAM_GROUP_NAME\fR when libssl wishes to generate keys/parameters.
- .IP """tls-group-sec-bits"" (\fBOSSL_CAPABILITY_TLS_GROUP_SECURITY_BITS\fR) <unsigned integer>" 4
- .IX Item """tls-group-sec-bits"" (OSSL_CAPABILITY_TLS_GROUP_SECURITY_BITS) <unsigned integer>"
- The number of bits of security offered by keys in this group. The number of bits
- should be comparable with the ones given in table 2 and 3 of the NIST SP800\-57
- document.
- .IP """tls-group-is-kem"" (\fBOSSL_CAPABILITY_TLS_GROUP_IS_KEM\fR) <unsigned integer>" 4
- .IX Item """tls-group-is-kem"" (OSSL_CAPABILITY_TLS_GROUP_IS_KEM) <unsigned integer>"
- Boolean flag to describe if the group should be used in \fIkey exchange\fR (KEX)
- mode (0, default) or in \fIkey encapsulation method\fR (KEM) mode (1).
- .Sp
- This parameter is optional: if not specified, KEX mode is assumed as the default
- mode for the group.
- .Sp
- In KEX mode, in a typical Diffie-Hellman fashion, both sides execute \fIkeygen\fR
- then \fIderive\fR against the peer public key. To operate in KEX mode, the group
- implementation must support the provider functions as described in
- \&\fBprovider\-keyexch\fR\|(7).
- .Sp
- In KEM mode, the client executes \fIkeygen\fR and sends its public key, the server
- executes \fIencapsulate\fR using the client's public key and sends back the
- resulting \fIciphertext\fR, finally the client executes \fIdecapsulate\fR to retrieve
- the same \fIshared secret\fR generated by the server's \fIencapsulate\fR. To operate
- in KEM mode, the group implementation must support the provider functions as
- described in \fBprovider\-kem\fR\|(7).
- .Sp
- Both in KEX and KEM mode, the resulting \fIshared secret\fR is then used according
- to the protocol specification.
- .IP """tls-min-tls"" (\fBOSSL_CAPABILITY_TLS_GROUP_MIN_TLS\fR) <integer>" 4
- .IX Item """tls-min-tls"" (OSSL_CAPABILITY_TLS_GROUP_MIN_TLS) <integer>"
- .PD 0
- .IP """tls-max-tls"" (\fBOSSL_CAPABILITY_TLS_GROUP_MAX_TLS\fR) <integer>" 4
- .IX Item """tls-max-tls"" (OSSL_CAPABILITY_TLS_GROUP_MAX_TLS) <integer>"
- .IP """tls-min-dtls"" (\fBOSSL_CAPABILITY_TLS_GROUP_MIN_DTLS\fR) <integer>" 4
- .IX Item """tls-min-dtls"" (OSSL_CAPABILITY_TLS_GROUP_MIN_DTLS) <integer>"
- .IP """tls-max-dtls"" (\fBOSSL_CAPABILITY_TLS_GROUP_MAX_DTLS\fR) <integer>" 4
- .IX Item """tls-max-dtls"" (OSSL_CAPABILITY_TLS_GROUP_MAX_DTLS) <integer>"
- .PD
- These parameters can be used to describe the minimum and maximum TLS and DTLS
- versions supported by the group. The values equate to the on-the-wire encoding
- of the various TLS versions. For example TLSv1.3 is 0x0304 (772 decimal), and
- TLSv1.2 is 0x0303 (771 decimal). A 0 indicates that there is no defined minimum
- or maximum. A \-1 indicates that the group should not be used in that protocol.
- .PP
- \fI"TLS-SIGALG" Capability\fR
- .IX Subsection """TLS-SIGALG"" Capability"
- .PP
- The "TLS-SIGALG" capability can be queried by libssl to discover the list of
- TLS signature algorithms that a provider can support. Each signature supported
- can be used for client\- or server-authentication in addition to the built-in
- signature algorithms.
- TLS1.3 clients can advertise the list of TLS signature algorithms they support
- in the signature_algorithms extension, and TLS servers can select an algorithm
- from the offered list that they also support. In this way a provider can add
- to the list of signature algorithms that libssl already supports with
- additional ones.
- .PP
- Each TLS signature algorithm that a provider supports should be described via
- the callback passed in through the provider_get_capabilities function. Each
- algorithm can have the following details supplied:
- .IP """iana-name"" (\fBOSSL_CAPABILITY_TLS_SIGALG_IANA_NAME\fR) <UTF8 string>" 4
- .IX Item """iana-name"" (OSSL_CAPABILITY_TLS_SIGALG_IANA_NAME) <UTF8 string>"
- The name of the signature algorithm as given in the IANA TLS Signature Scheme
- registry as "Description":
- <https://www.iana.org/assignments/tls\-parameters/tls\-parameters.xhtml#tls\-signaturescheme>.
- This value must be supplied.
- .IP """iana-code-point"" (\fBOSSL_CAPABILITY_TLS_SIGALG_CODE_POINT\fR) <unsigned integer>" 4
- .IX Item """iana-code-point"" (OSSL_CAPABILITY_TLS_SIGALG_CODE_POINT) <unsigned integer>"
- The TLS algorithm ID value as given in the IANA TLS SignatureScheme registry.
- This value must be supplied.
- .IP """sigalg-name"" (\fBOSSL_CAPABILITY_TLS_SIGALG_NAME\fR) <UTF8 string>" 4
- .IX Item """sigalg-name"" (OSSL_CAPABILITY_TLS_SIGALG_NAME) <UTF8 string>"
- A name for the full (possibly composite hash-and-signature) signature
- algorithm.
- The provider may, but is not obligated to, provide a signature implementation
- with this name; if it doesn't, this is assumed to be a composite of a pure
- signature algorithm and a hash algorithm, which must be given with the
- parameters "sig-name" and "hash-name".
- This value must be supplied.
- .IP """sigalg-oid"" (\fBOSSL_CAPABILITY_TLS_SIGALG_OID\fR) <UTF8 string>" 4
- .IX Item """sigalg-oid"" (OSSL_CAPABILITY_TLS_SIGALG_OID) <UTF8 string>"
- The OID of the "sigalg-name" algorithm in canonical numeric text form. If
- this parameter is given, \fBOBJ_create()\fR will be used to create an OBJ and
- a NID for this OID, using the "sigalg-name" parameter for its (short) name.
- Otherwise, it's assumed to already exist in the object database, possibly
- done by the provider with the \fBcore_obj_create()\fR upcall.
- This value is optional.
- .IP """sig-name"" (\fBOSSL_CAPABILITY_TLS_SIGALG_SIG_NAME\fR) <UTF8 string>" 4
- .IX Item """sig-name"" (OSSL_CAPABILITY_TLS_SIGALG_SIG_NAME) <UTF8 string>"
- The name of the pure signature algorithm that is part of a composite
- "sigalg-name". If "sigalg-name" is implemented by the provider, this
- parameter is redundant and must not be given.
- This value is optional.
- .IP """sig-oid"" (\fBOSSL_CAPABILITY_TLS_SIGALG_SIG_OID\fR) <UTF8 string>" 4
- .IX Item """sig-oid"" (OSSL_CAPABILITY_TLS_SIGALG_SIG_OID) <UTF8 string>"
- The OID of the "sig-name" algorithm in canonical numeric text form. If
- this parameter is given, \fBOBJ_create()\fR will be used to create an OBJ and
- a NID for this OID, using the "sig-name" parameter for its (short) name.
- Otherwise, it is assumed to already exist in the object database. This
- can be done by the provider using the \fBcore_obj_create()\fR upcall.
- This value is optional.
- .IP """hash-name"" (\fBOSSL_CAPABILITY_TLS_SIGALG_HASH_NAME\fR) <UTF8 string>" 4
- .IX Item """hash-name"" (OSSL_CAPABILITY_TLS_SIGALG_HASH_NAME) <UTF8 string>"
- The name of the hash algorithm that is part of a composite "sigalg-name".
- If "sigalg-name" is implemented by the provider, this parameter is redundant
- and must not be given.
- This value is optional.
- .IP """hash-oid"" (\fBOSSL_CAPABILITY_TLS_SIGALG_HASH_OID\fR) <UTF8 string>" 4
- .IX Item """hash-oid"" (OSSL_CAPABILITY_TLS_SIGALG_HASH_OID) <UTF8 string>"
- The OID of the "hash-name" algorithm in canonical numeric text form. If
- this parameter is given, \fBOBJ_create()\fR will be used to create an OBJ and
- a NID for this OID, using the "hash-name" parameter for its (short) name.
- Otherwise, it's assumed to already exist in the object database, possibly
- done by the provider with the \fBcore_obj_create()\fR upcall.
- This value is optional.
- .IP """key-type"" (\fBOSSL_CAPABILITY_TLS_SIGALG_KEYTYPE\fR) <UTF8 string>" 4
- .IX Item """key-type"" (OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE) <UTF8 string>"
- The key type of the public key of applicable certificates. If this parameter
- isn't present, it's assumed to be the same as "sig-name" if that's present,
- otherwise "sigalg-name".
- This value is optional.
- .IP """key-type-oid"" (\fBOSSL_CAPABILITY_TLS_SIGALG_KEYTYPE_OID\fR) <UTF8 string>" 4
- .IX Item """key-type-oid"" (OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE_OID) <UTF8 string>"
- The OID of the "key-type" in canonical numeric text form. If
- this parameter is given, \fBOBJ_create()\fR will be used to create an OBJ and
- a NID for this OID, using the "key-type" parameter for its (short) name.
- Otherwise, it's assumed to already exist in the object database, possibly
- done by the provider with the \fBcore_obj_create()\fR upcall.
- This value is optional.
- .IP """sec-bits"" (\fBOSSL_CAPABILITY_TLS_SIGALG_SECURITY_BITS\fR) <unsigned integer>" 4
- .IX Item """sec-bits"" (OSSL_CAPABILITY_TLS_SIGALG_SECURITY_BITS) <unsigned integer>"
- The number of bits of security offered by keys of this algorithm. The number
- of bits should be comparable with the ones given in table 2 and 3 of the NIST
- SP800\-57 document. This number is used to determine the security strength of
- the algorithm if no digest algorithm has been registered that otherwise
- defines the security strength. If the signature algorithm implements its own
- digest internally, this value needs to be set to properly reflect the overall
- security strength.
- This value must be supplied.
- .IP """tls-min-tls"" (\fBOSSL_CAPABILITY_TLS_SIGALG_MIN_TLS\fR) <integer>" 4
- .IX Item """tls-min-tls"" (OSSL_CAPABILITY_TLS_SIGALG_MIN_TLS) <integer>"
- .PD 0
- .IP """tls-max-tls"" (\fBOSSL_CAPABILITY_TLS_SIGALG_MAX_TLS\fR) <integer>" 4
- .IX Item """tls-max-tls"" (OSSL_CAPABILITY_TLS_SIGALG_MAX_TLS) <integer>"
- .PD
- These parameters can be used to describe the minimum and maximum TLS
- versions supported by the signature algorithm. The values equate to the
- on-the-wire encoding of the various TLS versions. For example TLSv1.3 is
- 0x0304 (772 decimal), and TLSv1.2 is 0x0303 (771 decimal). A 0 indicates that
- there is no defined minimum or maximum. A \-1 indicates that the signature
- algorithm should not be used in that protocol.
- Presently values representing anything other than TLS1.3 mean that the
- complete algorithm is ignored.
- .SH NOTES
- .IX Header "NOTES"
- The \fBcore_obj_create()\fR and \fBcore_obj_add_sigid()\fR functions were not thread safe
- in OpenSSL 3.0.
- .SH EXAMPLES
- .IX Header "EXAMPLES"
- This is an example of a simple provider made available as a
- dynamically loadable module.
- It implements the fictitious algorithm \f(CW\*(C`FOO\*(C'\fR for the fictitious
- operation \f(CW\*(C`BAR\*(C'\fR.
- .PP
- .Vb 3
- \& #include <malloc.h>
- \& #include <openssl/core.h>
- \& #include <openssl/core_dispatch.h>
- \&
- \& /* Errors used in this provider */
- \& #define E_MALLOC 1
- \&
- \& static const OSSL_ITEM reasons[] = {
- \& { E_MALLOC, "memory allocation failure" }.
- \& OSSL_DISPATCH_END
- \& };
- \&
- \& /*
- \& * To ensure we get the function signature right, forward declare
- \& * them using function types provided by openssl/core_dispatch.h
- \& */
- \& OSSL_FUNC_bar_newctx_fn foo_newctx;
- \& OSSL_FUNC_bar_freectx_fn foo_freectx;
- \& OSSL_FUNC_bar_init_fn foo_init;
- \& OSSL_FUNC_bar_update_fn foo_update;
- \& OSSL_FUNC_bar_final_fn foo_final;
- \&
- \& OSSL_FUNC_provider_query_operation_fn p_query;
- \& OSSL_FUNC_provider_get_reason_strings_fn p_reasons;
- \& OSSL_FUNC_provider_teardown_fn p_teardown;
- \&
- \& OSSL_provider_init_fn OSSL_provider_init;
- \&
- \& OSSL_FUNC_core_put_error *c_put_error = NULL;
- \&
- \& /* Provider context */
- \& struct prov_ctx_st {
- \& OSSL_CORE_HANDLE *handle;
- \& }
- \&
- \& /* operation context for the algorithm FOO */
- \& struct foo_ctx_st {
- \& struct prov_ctx_st *provctx;
- \& int b;
- \& };
- \&
- \& static void *foo_newctx(void *provctx)
- \& {
- \& struct foo_ctx_st *fooctx = malloc(sizeof(*fooctx));
- \&
- \& if (fooctx != NULL)
- \& fooctx\->provctx = provctx;
- \& else
- \& c_put_error(provctx\->handle, E_MALLOC, _\|_FILE_\|_, _\|_LINE_\|_);
- \& return fooctx;
- \& }
- \&
- \& static void foo_freectx(void *fooctx)
- \& {
- \& free(fooctx);
- \& }
- \&
- \& static int foo_init(void *vfooctx)
- \& {
- \& struct foo_ctx_st *fooctx = vfooctx;
- \&
- \& fooctx\->b = 0x33;
- \& }
- \&
- \& static int foo_update(void *vfooctx, unsigned char *in, size_t inl)
- \& {
- \& struct foo_ctx_st *fooctx = vfooctx;
- \&
- \& /* did you expect something serious? */
- \& if (inl == 0)
- \& return 1;
- \& for (; inl\-\- > 0; in++)
- \& *in ^= fooctx\->b;
- \& return 1;
- \& }
- \&
- \& static int foo_final(void *vfooctx)
- \& {
- \& struct foo_ctx_st *fooctx = vfooctx;
- \&
- \& fooctx\->b = 0x66;
- \& }
- \&
- \& static const OSSL_DISPATCH foo_fns[] = {
- \& { OSSL_FUNC_BAR_NEWCTX, (void (*)(void))foo_newctx },
- \& { OSSL_FUNC_BAR_FREECTX, (void (*)(void))foo_freectx },
- \& { OSSL_FUNC_BAR_INIT, (void (*)(void))foo_init },
- \& { OSSL_FUNC_BAR_UPDATE, (void (*)(void))foo_update },
- \& { OSSL_FUNC_BAR_FINAL, (void (*)(void))foo_final },
- \& OSSL_DISPATCH_END
- \& };
- \&
- \& static const OSSL_ALGORITHM bars[] = {
- \& { "FOO", "provider=chumbawamba", foo_fns },
- \& { NULL, NULL, NULL }
- \& };
- \&
- \& static const OSSL_ALGORITHM *p_query(void *provctx, int operation_id,
- \& int *no_store)
- \& {
- \& switch (operation_id) {
- \& case OSSL_OP_BAR:
- \& return bars;
- \& }
- \& return NULL;
- \& }
- \&
- \& static const OSSL_ITEM *p_reasons(void *provctx)
- \& {
- \& return reasons;
- \& }
- \&
- \& static void p_teardown(void *provctx)
- \& {
- \& free(provctx);
- \& }
- \&
- \& static const OSSL_DISPATCH prov_fns[] = {
- \& { OSSL_FUNC_PROVIDER_TEARDOWN, (void (*)(void))p_teardown },
- \& { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))p_query },
- \& { OSSL_FUNC_PROVIDER_GET_REASON_STRINGS, (void (*)(void))p_reasons },
- \& OSSL_DISPATCH_END
- \& };
- \&
- \& int OSSL_provider_init(const OSSL_CORE_HANDLE *handle,
- \& const OSSL_DISPATCH *in,
- \& const OSSL_DISPATCH **out,
- \& void **provctx)
- \& {
- \& struct prov_ctx_st *pctx = NULL;
- \&
- \& for (; in\->function_id != 0; in++)
- \& switch (in\->function_id) {
- \& case OSSL_FUNC_CORE_PUT_ERROR:
- \& c_put_error = OSSL_FUNC_core_put_error(in);
- \& break;
- \& }
- \&
- \& *out = prov_fns;
- \&
- \& if ((pctx = malloc(sizeof(*pctx))) == NULL) {
- \& /*
- \& * ALEA IACTA EST, if the core retrieves the reason table
- \& * regardless, that string will be displayed, otherwise not.
- \& */
- \& c_put_error(handle, E_MALLOC, _\|_FILE_\|_, _\|_LINE_\|_);
- \& return 0;
- \& }
- \& pctx\->handle = handle;
- \& return 1;
- \& }
- .Ve
- .PP
- This relies on a few things existing in \fIopenssl/core_dispatch.h\fR:
- .PP
- .Vb 1
- \& #define OSSL_OP_BAR 4711
- \&
- \& #define OSSL_FUNC_BAR_NEWCTX 1
- \& typedef void *(OSSL_FUNC_bar_newctx_fn)(void *provctx);
- \& static ossl_inline OSSL_FUNC_bar_newctx(const OSSL_DISPATCH *opf)
- \& { return (OSSL_FUNC_bar_newctx_fn *)opf\->function; }
- \&
- \& #define OSSL_FUNC_BAR_FREECTX 2
- \& typedef void (OSSL_FUNC_bar_freectx_fn)(void *ctx);
- \& static ossl_inline OSSL_FUNC_bar_freectx(const OSSL_DISPATCH *opf)
- \& { return (OSSL_FUNC_bar_freectx_fn *)opf\->function; }
- \&
- \& #define OSSL_FUNC_BAR_INIT 3
- \& typedef void *(OSSL_FUNC_bar_init_fn)(void *ctx);
- \& static ossl_inline OSSL_FUNC_bar_init(const OSSL_DISPATCH *opf)
- \& { return (OSSL_FUNC_bar_init_fn *)opf\->function; }
- \&
- \& #define OSSL_FUNC_BAR_UPDATE 4
- \& typedef void *(OSSL_FUNC_bar_update_fn)(void *ctx,
- \& unsigned char *in, size_t inl);
- \& static ossl_inline OSSL_FUNC_bar_update(const OSSL_DISPATCH *opf)
- \& { return (OSSL_FUNC_bar_update_fn *)opf\->function; }
- \&
- \& #define OSSL_FUNC_BAR_FINAL 5
- \& typedef void *(OSSL_FUNC_bar_final_fn)(void *ctx);
- \& static ossl_inline OSSL_FUNC_bar_final(const OSSL_DISPATCH *opf)
- \& { return (OSSL_FUNC_bar_final_fn *)opf\->function; }
- .Ve
- .SH "SEE ALSO"
- .IX Header "SEE ALSO"
- \&\fBprovider\fR\|(7)
- .SH HISTORY
- .IX Header "HISTORY"
- The concept of providers and everything surrounding them was
- introduced in OpenSSL 3.0.
- .SH COPYRIGHT
- .IX Header "COPYRIGHT"
- Copyright 2019\-2023 The OpenSSL Project Authors. All Rights Reserved.
- .PP
- 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
- <https://www.openssl.org/source/license.html>.
|