| =pod |
| |
| =head1 NAME |
| |
| provider-rand - The random number generation library E<lt>-E<gt> provider |
| functions |
| |
| =head1 SYNOPSIS |
| |
| =for openssl multiple includes |
| |
| #include <openssl/core_dispatch.h> |
| #include <openssl/core_names.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. |
| */ |
| |
| /* Context management */ |
| void *OSSL_FUNC_rand_newctx(void *provctx, void *parent, |
| const OSSL_DISPATCH *parent_calls); |
| void OSSL_FUNC_rand_freectx(void *ctx); |
| |
| /* Random number generator functions: NIST */ |
| int OSSL_FUNC_rand_instantiate(void *ctx, unsigned int strength, |
| int prediction_resistance, |
| const unsigned char *pstr, size_t pstr_len, |
| const OSSL_PARAM params[]); |
| int OSSL_FUNC_rand_uninstantiate(void *ctx); |
| int OSSL_FUNC_rand_generate(void *ctx, unsigned char *out, size_t outlen, |
| unsigned int strength, int prediction_resistance, |
| const unsigned char *addin, size_t addin_len); |
| int OSSL_FUNC_rand_reseed(void *ctx, int prediction_resistance, |
| const unsigned char *ent, size_t ent_len, |
| const unsigned char *addin, size_t addin_len); |
| |
| /* Random number generator functions: additional */ |
| size_t OSSL_FUNC_rand_nonce(void *ctx, unsigned char *out, size_t outlen, |
| int strength, size_t min_noncelen, |
| size_t max_noncelen); |
| size_t OSSL_FUNC_rand_get_seed(void *ctx, unsigned char **buffer, |
| int entropy, size_t min_len, size_t max_len, |
| int prediction_resistance, |
| const unsigned char *adin, size_t adin_len); |
| void OSSL_FUNC_rand_clear_seed(void *ctx, unsigned char *buffer, size_t b_len); |
| int OSSL_FUNC_rand_verify_zeroization(void *ctx); |
| |
| /* Context Locking */ |
| int OSSL_FUNC_rand_enable_locking(void *ctx); |
| int OSSL_FUNC_rand_lock(void *ctx); |
| void OSSL_FUNC_rand_unlock(void *ctx); |
| |
| /* RAND parameter descriptors */ |
| const OSSL_PARAM *OSSL_FUNC_rand_gettable_params(void *provctx); |
| const OSSL_PARAM *OSSL_FUNC_rand_gettable_ctx_params(void *ctx, void *provctx); |
| const OSSL_PARAM *OSSL_FUNC_rand_settable_ctx_params(void *ctx, void *provctx); |
| |
| /* RAND parameters */ |
| int OSSL_FUNC_rand_get_params(OSSL_PARAM params[]); |
| int OSSL_FUNC_rand_get_ctx_params(void *ctx, OSSL_PARAM params[]); |
| int OSSL_FUNC_rand_set_ctx_params(void *ctx, const OSSL_PARAM params[]); |
| |
| =head1 DESCRIPTION |
| |
| This documentation is primarily aimed at provider authors. See L<provider(7)> |
| for further information. |
| |
| The RAND operation enables providers to implement random number generation |
| algorithms and random number sources and make |
| them available to applications via the API function L<EVP_RAND(3)>. |
| |
| =head2 Context Management Functions |
| |
| OSSL_FUNC_rand_newctx() should create and return a pointer to a provider side |
| structure for holding context information during a rand operation. |
| A pointer to this context will be passed back in a number of the other rand |
| operation function calls. |
| The parameter I<provctx> is the provider context generated during provider |
| initialisation (see L<provider(7)>). |
| The parameter I<parent> specifies another rand instance to be used for |
| seeding purposes. If NULL and the specific instance supports it, the |
| operating system will be used for seeding. |
| The parameter I<parent_calls> points to the dispatch table for I<parent>. |
| Thus, the parent need not be from the same provider as the new instance. |
| |
| OSSL_FUNC_rand_freectx() is passed a pointer to the provider side rand context in |
| the I<mctx> parameter. |
| If it receives NULL as I<ctx> value, it should not do anything other than |
| return. |
| This function should free any resources associated with that context. |
| |
| =head2 Random Number Generator Functions: NIST |
| |
| These functions correspond to those defined in NIST SP 800-90A and SP 800-90C. |
| |
| OSSL_FUNC_rand_instantiate() is used to instantiate the DRBG I<ctx> at a requested |
| security I<strength>. In addition, I<prediction_resistance> can be requested. |
| Additional input I<addin> of length I<addin_len> bytes can optionally |
| be provided. The parameters specified in I<params> configure the DRBG and these |
| should be processed before instantiation. |
| |
| OSSL_FUNC_rand_uninstantiate() is used to uninstantiate the DRBG I<ctx>. After being |
| uninstantiated, a DRBG is unable to produce output until it is instantiated |
| anew. |
| |
| OSSL_FUNC_rand_generate() is used to generate random bytes from the DRBG I<ctx>. |
| It will generate I<outlen> bytes placing them into the buffer pointed to by |
| I<out>. The generated bytes will meet the specified security I<strength> and, |
| if I<prediction_resistance> is true, the bytes will be produced after reseeding |
| from a live entropy source. Additional input I<addin> of length I<addin_len> |
| bytes can optionally be provided. |
| |
| =head2 Random Number Generator Functions: Additional |
| |
| OSSL_FUNC_rand_nonce() is used to generate a nonce of the given I<strength> with a |
| length from I<min_noncelen> to I<max_noncelen>. If the output buffer I<out> is |
| NULL, the length of the nonce should be returned. |
| |
| OSSL_FUNC_rand_get_seed() is used by deterministic generators to obtain their |
| seeding material from their parent. The seed bytes will meet the specified |
| security level of I<entropy> bits and there will be between I<min_len> |
| and I<max_len> inclusive bytes in total. If I<prediction_resistance> is |
| true, the bytes will be produced from a live entropy source. Additional |
| input I<addin> of length I<addin_len> bytes can optionally be provided. |
| A pointer to the seed material is returned in I<*buffer> and this must be |
| freed by a later call to OSSL_FUNC_rand_clear_seed(). |
| |
| OSSL_FUNC_rand_clear_seed() frees a seed I<buffer> of length I<b_len> bytes |
| which was previously allocated by OSSL_FUNC_rand_get_seed(). |
| |
| OSSL_FUNC_rand_verify_zeroization() is used to determine if the internal state of the |
| DRBG is zero. This capability is mandated by NIST as part of the self |
| tests, it is unlikely to be useful in other circumstances. |
| |
| =head2 Context Locking |
| |
| When DRBGs are used by multiple threads, there must be locking employed to |
| ensure their proper operation. Because locking introduces an overhead, it |
| is disabled by default. |
| |
| OSSL_FUNC_rand_enable_locking() allows locking to be turned on for a DRBG and all of |
| its parent DRBGs. From this call onwards, the DRBG can be used in a thread |
| safe manner. |
| |
| OSSL_FUNC_rand_lock() is used to lock a DRBG. Once locked, exclusive access |
| is guaranteed. |
| |
| OSSL_FUNC_rand_unlock() is used to unlock a DRBG. |
| |
| =head2 Rand Parameters |
| |
| See L<OSSL_PARAM(3)> for further details on the parameters structure used by |
| these functions. |
| |
| OSSL_FUNC_rand_get_params() gets details of parameter values associated with the |
| provider algorithm and stores them in I<params>. |
| |
| OSSL_FUNC_rand_set_ctx_params() sets rand parameters associated with the given |
| provider side rand context I<ctx> to I<params>. |
| Any parameter settings are additional to any that were previously set. |
| Passing NULL for I<params> should return true. |
| |
| OSSL_FUNC_rand_get_ctx_params() gets details of currently set parameter values |
| associated with the given provider side rand context I<ctx> and stores them |
| in I<params>. |
| Passing NULL for I<params> should return true. |
| |
| OSSL_FUNC_rand_gettable_params(), OSSL_FUNC_rand_gettable_ctx_params(), |
| and OSSL_FUNC_rand_settable_ctx_params() all return constant B<OSSL_PARAM> |
| arrays as descriptors of the parameters that OSSL_FUNC_rand_get_params(), |
| OSSL_FUNC_rand_get_ctx_params(), and OSSL_FUNC_rand_set_ctx_params() |
| can handle, respectively. OSSL_FUNC_rand_gettable_ctx_params() |
| and OSSL_FUNC_rand_settable_ctx_params() will return the parameters |
| associated with the provider side context I<ctx> in its current state |
| if it is not NULL. Otherwise, they return the parameters associated |
| with the provider side algorithm I<provctx>. |
| |
| |
| Parameters currently recognised by built-in rands are as follows. Not all |
| parameters are relevant to, or are understood by all rands: |
| |
| =over 4 |
| |
| =item "state" (B<OSSL_RAND_PARAM_STATE>) <integer> |
| |
| Returns the state of the random number generator. |
| |
| =item "strength" (B<OSSL_RAND_PARAM_STRENGTH>) <unsigned integer> |
| |
| Returns the bit strength of the random number generator. |
| |
| =back |
| |
| For rands that are also deterministic random bit generators (DRBGs), these |
| additional parameters are recognised. Not all |
| parameters are relevant to, or are understood by all DRBG rands: |
| |
| =over 4 |
| |
| =item "reseed_requests" (B<OSSL_DRBG_PARAM_RESEED_REQUESTS>) <unsigned integer> |
| |
| Reads or set the number of generate requests before reseeding the |
| associated RAND ctx. |
| |
| =item "reseed_time_interval" (B<OSSL_DRBG_PARAM_RESEED_TIME_INTERVAL>) <integer> |
| |
| Reads or set the number of elapsed seconds before reseeding the |
| associated RAND ctx. |
| |
| =item "max_request" (B<OSSL_DRBG_PARAM_RESEED_REQUESTS>) <unsigned integer> |
| |
| Specifies the maximum number of bytes that can be generated in a single |
| call to OSSL_FUNC_rand_generate. |
| |
| =item "min_entropylen" (B<OSSL_DRBG_PARAM_MIN_ENTROPYLEN>) <unsigned integer> |
| |
| =item "max_entropylen" (B<OSSL_DRBG_PARAM_MAX_ENTROPYLEN>) <unsigned integer> |
| |
| Specify the minimum and maximum number of bytes of random material that |
| can be used to seed the DRBG. |
| |
| =item "min_noncelen" (B<OSSL_DRBG_PARAM_MIN_NONCELEN>) <unsigned integer> |
| |
| =item "max_noncelen" (B<OSSL_DRBG_PARAM_MAX_NONCELEN>) <unsigned integer> |
| |
| Specify the minimum and maximum number of bytes of nonce that can be used to |
| instantiate the DRBG. |
| |
| =item "max_perslen" (B<OSSL_DRBG_PARAM_MAX_PERSLEN>) <unsigned integer> |
| |
| =item "max_adinlen" (B<OSSL_DRBG_PARAM_MAX_ADINLEN>) <unsigned integer> |
| |
| Specify the minimum and maximum number of bytes of personalisation string |
| that can be used with the DRBG. |
| |
| =item "reseed_counter" (B<OSSL_DRBG_PARAM_RESEED_COUNTER>) <unsigned integer> |
| |
| Specifies the number of times the DRBG has been seeded or reseeded. |
| |
| =item "digest" (B<OSSL_DRBG_PARAM_DIGEST>) <UTF8 string> |
| |
| =item "cipher" (B<OSSL_DRBG_PARAM_CIPHER>) <UTF8 string> |
| |
| =item "mac" (B<OSSL_DRBG_PARAM_MAC>) <UTF8 string> |
| |
| Sets the name of the underlying cipher, digest or MAC to be used. |
| It must name a suitable algorithm for the DRBG that's being used. |
| |
| =item "properties" (B<OSSL_DRBG_PARAM_PROPERTIES>) <UTF8 string> |
| |
| Sets the properties to be queried when trying to fetch an underlying algorithm. |
| This must be given together with the algorithm naming parameter to be |
| considered valid. |
| |
| =back |
| |
| =head1 RETURN VALUES |
| |
| OSSL_FUNC_rand_newctx() should return the newly created |
| provider side rand context, or NULL on failure. |
| |
| OSSL_FUNC_rand_gettable_params(), OSSL_FUNC_rand_gettable_ctx_params() and |
| OSSL_FUNC_rand_settable_ctx_params() should return a constant B<OSSL_PARAM> |
| array, or NULL if none is offered. |
| |
| OSSL_FUNC_rand_nonce() returns the size of the generated nonce, or 0 on error. |
| |
| OSSL_FUNC_rand_get_seed() returns the size of the generated seed, or 0 on |
| error. |
| |
| All of the remaining functions should return 1 for success or 0 on error. |
| |
| =head1 NOTES |
| |
| The RAND life-cycle is described in L<life_cycle-rand(7)>. Providers should |
| ensure that the various transitions listed there are supported. At some point |
| the EVP layer will begin enforcing the listed transitions. |
| |
| =head1 SEE ALSO |
| |
| L<provider(7)>, |
| L<RAND(7)>, |
| L<EVP_RAND(7)>, |
| L<life_cycle-rand(7)>, |
| L<EVP_RAND(3)> |
| |
| =head1 HISTORY |
| |
| The provider RAND interface was introduced in OpenSSL 3.0. |
| |
| =head1 COPYRIGHT |
| |
| Copyright 2020-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 |