-
Notifications
You must be signed in to change notification settings - Fork 96
DRBG documentation improvements #287
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
08875d4
944bc58
223deea
6fdf0b3
ec51dd1
74efcd2
3457b5e
10f16ac
2d8f069
217b815
5d9fd07
017778e
2884ba3
d0c64c8
1540e5b
7e27936
dddda81
77d4457
e249c0e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,44 @@ | ||
/** | ||
* \file ctr_drbg.h | ||
* | ||
* \brief This file contains CTR_DRBG definitions and functions. | ||
* \brief This file contains definitions and functions for the | ||
* CTR_DRBG pseudorandom generator. | ||
* | ||
* CTR_DRBG is a standardized way of building a PRNG from a block-cipher | ||
* in counter mode operation, as defined in <em>NIST SP 800-90A: | ||
* Recommendation for Random Number Generation Using Deterministic Random | ||
* Bit Generators</em>. | ||
* | ||
* The Mbed TLS implementation of CTR_DRBG uses AES-256 (default) or AES-128 | ||
* as the underlying block cipher. | ||
* | ||
* \warning Using 128-bit keys for CTR_DRBG limits the security of generated | ||
* keys and operations that use random values generated to 128-bit security. | ||
* (if \c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled at compile time) | ||
* as the underlying block cipher, with a derivation function. | ||
* The initial seeding grabs #MBEDTLS_CTR_DRBG_ENTROPY_LEN bytes of entropy. | ||
* See the documentation of mbedtls_ctr_drbg_seed() for more details. | ||
* | ||
* Based on NIST SP 800-90A §10.2.1 table 3 and NIST SP 800-57 part 1 table 2, | ||
* here are the security strengths achieved in typical configuration: | ||
* - 256 bits under the default configuration of the library, with AES-256 | ||
* and with #MBEDTLS_CTR_DRBG_ENTROPY_LEN set to 48 or more. | ||
* - 256 bits if AES-256 is used, #MBEDTLS_CTR_DRBG_ENTROPY_LEN is set | ||
* to 32 or more, and the DRBG is initialized with an explicit | ||
* nonce in the \c custom parameter to mbedtls_ctr_drbg_seed(). | ||
* - 128 bits if AES-256 is used but #MBEDTLS_CTR_DRBG_ENTROPY_LEN is | ||
* between 24 and 47 and the DRBG is not initialized with an explicit | ||
* nonce (see mbedtls_ctr_drbg_seed()). | ||
* - 128 bits if AES-128 is used (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY enabled) | ||
* and #MBEDTLS_CTR_DRBG_ENTROPY_LEN is set to 24 or more (which is | ||
* always the case unless it is explicitly set to a different value | ||
* in config.h). | ||
* | ||
* Note that the value of #MBEDTLS_CTR_DRBG_ENTROPY_LEN defaults to: | ||
* - \c 48 if the module \c MBEDTLS_SHA512_C is enabled and the symbol | ||
* \c MBEDTLS_ENTROPY_FORCE_SHA256 is disabled at compile time. | ||
* This is the default configuration of the library. | ||
* - \c 32 if the module \c MBEDTLS_SHA512_C is disabled at compile time. | ||
* - \c 32 if \c MBEDTLS_ENTROPY_FORCE_SHA256 is enabled at compile time. | ||
*/ | ||
/* | ||
* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved | ||
* Copyright (C) 2006-2019, Arm Limited (or its affiliates), All Rights Reserved | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may | ||
|
@@ -56,9 +79,19 @@ | |
#define MBEDTLS_CTR_DRBG_BLOCKSIZE 16 /**< The block size used by the cipher. */ | ||
|
||
#if defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) | ||
#define MBEDTLS_CTR_DRBG_KEYSIZE 16 /**< The key size used by the cipher (compile-time choice: 128 bits). */ | ||
#define MBEDTLS_CTR_DRBG_KEYSIZE 16 | ||
/**< The key size in bytes used by the cipher. | ||
* | ||
* Compile-time choice: 16 bytes (128 bits) | ||
* because #MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled. | ||
*/ | ||
#else | ||
#define MBEDTLS_CTR_DRBG_KEYSIZE 32 /**< The key size used by the cipher (compile-time choice: 256 bits). */ | ||
#define MBEDTLS_CTR_DRBG_KEYSIZE 32 | ||
/**< The key size in bytes used by the cipher. | ||
* | ||
* Compile-time choice: 32 bytes (256 bits) | ||
* because \c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is disabled. | ||
*/ | ||
#endif | ||
|
||
#define MBEDTLS_CTR_DRBG_KEYBITS ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 ) /**< The key size for the DRBG operation, in bits. */ | ||
|
@@ -73,21 +106,31 @@ | |
* \{ | ||
*/ | ||
|
||
/** \def MBEDTLS_CTR_DRBG_ENTROPY_LEN | ||
* | ||
* \brief The amount of entropy used per seed by default, in bytes. | ||
*/ | ||
#if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) | ||
#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) | ||
/** This is 48 bytes because the entropy module uses SHA-512 | ||
* (\c MBEDTLS_ENTROPY_FORCE_SHA256 is disabled). | ||
*/ | ||
#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 | ||
/**< The amount of entropy used per seed by default: | ||
* <ul><li>48 with SHA-512.</li> | ||
* <li>32 with SHA-256.</li></ul> | ||
|
||
#else /* defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) */ | ||
|
||
/** This is 32 bytes because the entropy module uses SHA-256 | ||
* (the SHA512 module is disabled or | ||
* \c MBEDTLS_ENTROPY_FORCE_SHA256 is enabled). | ||
*/ | ||
#else | ||
#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 32 | ||
/**< Amount of entropy used per seed by default: | ||
* <ul><li>48 with SHA-512.</li> | ||
* <li>32 with SHA-256.</li></ul> | ||
#if !defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) | ||
/** \warning To achieve a 256-bit security strength, you must pass a nonce | ||
* to mbedtls_ctr_drbg_seed(). | ||
*/ | ||
#endif | ||
#endif | ||
#endif /* !defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) */ | ||
#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 32 | ||
#endif /* defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) */ | ||
#endif /* !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) */ | ||
|
||
#if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL) | ||
#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 | ||
|
@@ -106,7 +149,7 @@ | |
|
||
#if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) | ||
#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 | ||
/**< The maximum size of seed or reseed buffer. */ | ||
/**< The maximum size of seed or reseed buffer in bytes. */ | ||
#endif | ||
|
||
/* \} name SECTION: Module settings */ | ||
|
@@ -164,17 +207,62 @@ void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ); | |
* \brief This function seeds and sets up the CTR_DRBG | ||
* entropy source for future reseeds. | ||
* | ||
* \note Personalization data can be provided in addition to the more generic | ||
* entropy source, to make this instantiation as unique as possible. | ||
* | ||
* A typical choice for the \p f_entropy and \p p_entropy parameters is | ||
* to use the entropy module: | ||
* - \p f_entropy is mbedtls_entropy_func(); | ||
* - \p p_entropy is an instance of ::mbedtls_entropy_context initialized | ||
* with mbedtls_entropy_init() (which registers the platform's default | ||
* entropy sources). | ||
* | ||
* \p f_entropy is always called with a buffer size equal to the entropy | ||
* length. The entropy length is initially #MBEDTLS_CTR_DRBG_ENTROPY_LEN | ||
* and this value is always used for the initial seeding. You can change | ||
* the entropy length for subsequent seeding by calling | ||
* mbedtls_ctr_drbg_set_entropy_len() after this function. | ||
* | ||
* You can provide a personalization string in addition to the | ||
* entropy source, to make this instantiation as unique as possible. | ||
* | ||
* \note The _seed_material_ value passed to the derivation | ||
* function in the CTR_DRBG Instantiate Process | ||
* described in NIST SP 800-90A §10.2.1.3.2 | ||
* is the concatenation of the string obtained from | ||
* calling \p f_entropy and the \p custom string. | ||
* The origin of the nonce depends on the value of | ||
* the entropy length relative to the security strength. | ||
* - If the entropy length is at least 1.5 times the | ||
* security strength then the nonce is taken from the | ||
* string obtained with \p f_entropy. | ||
* - If the entropy length is less than the security | ||
* strength, then the nonce is taken from \p custom. | ||
* In this case, for compliance with SP 800-90A, | ||
* you must pass a unique value of \p custom at | ||
* each invocation. See SP 800-90A §8.6.7 for more | ||
* details. | ||
*/ | ||
#if MBEDTLS_CTR_DRBG_ENTROPY_LEN < MBEDTLS_CTR_DRBG_KEYSIZE * 3 / 2 | ||
/** \warning When #MBEDTLS_CTR_DRBG_ENTROPY_LEN is less than | ||
* #MBEDTLS_CTR_DRBG_KEYSIZE * 3 / 2, to achieve the | ||
* maximum security strength permitted by CTR_DRBG, | ||
* you must pass a value of \p custom that is a nonce: | ||
* this value must never be repeated in subsequent | ||
* runs of the same application or on a different | ||
* device. | ||
*/ | ||
#endif | ||
/** | ||
* \param ctx The CTR_DRBG context to seed. | ||
* \param f_entropy The entropy callback, taking as arguments the | ||
* \p p_entropy context, the buffer to fill, and the | ||
length of the buffer. | ||
* \param p_entropy The entropy context. | ||
* \param custom Personalization data, that is device-specific | ||
identifiers. Can be NULL. | ||
* \param len The length of the personalization data. | ||
* length of the buffer. | ||
* \param p_entropy The entropy context to pass to \p f_entropy. | ||
* \param custom The personalization string. | ||
* This can be \c NULL, in which case the personalization | ||
* string is empty regardless of the value of \p len. | ||
* \param len The length of the personalization string. | ||
* This must be at most | ||
* #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT | ||
* - #MBEDTLS_CTR_DRBG_ENTROPY_LEN. | ||
* | ||
* \return \c 0 on success. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure. | ||
|
@@ -197,7 +285,8 @@ void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx ); | |
* The default value is off. | ||
* | ||
* \note If enabled, entropy is gathered at the beginning of | ||
* every call to mbedtls_ctr_drbg_random_with_add(). | ||
* every call to mbedtls_ctr_drbg_random_with_add() | ||
* or mbedtls_ctr_drbg_random(). | ||
* Only use this if your entropy source has sufficient | ||
* throughput. | ||
* | ||
|
@@ -209,18 +298,42 @@ void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, | |
|
||
/** | ||
* \brief This function sets the amount of entropy grabbed on each | ||
* seed or reseed. The default value is | ||
* #MBEDTLS_CTR_DRBG_ENTROPY_LEN. | ||
* subsequent reseed. | ||
* | ||
* The default value is #MBEDTLS_CTR_DRBG_ENTROPY_LEN. | ||
* | ||
* \note mbedtls_ctr_drbg_seed() always sets the entropy length | ||
* to #MBEDTLS_CTR_DRBG_ENTROPY_LEN, so this function | ||
* only has an effect when it is called after | ||
* mbedtls_ctr_drbg_seed(). | ||
* | ||
* \note The security strength of CTR_DRBG is bounded by the | ||
* entropy length. Thus: | ||
* - When using AES-256 | ||
* (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is disabled, | ||
* which is the default), | ||
* \p len must be at least 32 (in bytes) | ||
* to achieve a 256-bit strength. | ||
* - When using AES-128 | ||
* (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled) | ||
* \p len must be at least 16 (in bytes) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Didn't you mention previously that in such case the entropy len has to be at least 24?
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 24 for the initial seeding, 16 for subsequent reseeds. This function only influences subsequent reseeds. |
||
* to achieve a 128-bit strength. | ||
* | ||
* \param ctx The CTR_DRBG context. | ||
* \param len The amount of entropy to grab. | ||
* \param len The amount of entropy to grab, in bytes. | ||
* This must be at most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. | ||
*/ | ||
void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, | ||
size_t len ); | ||
|
||
/** | ||
* \brief This function sets the reseed interval. | ||
* The default value is #MBEDTLS_CTR_DRBG_RESEED_INTERVAL. | ||
* | ||
* The reseed interval is the number of calls to mbedtls_ctr_drbg_random() | ||
* or mbedtls_ctr_drbg_random_with_add() after which the entropy function | ||
* is called again. | ||
* | ||
* The default value is #MBEDTLS_CTR_DRBG_RESEED_INTERVAL. | ||
* | ||
* \param ctx The CTR_DRBG context. | ||
* \param interval The reseed interval. | ||
|
@@ -233,8 +346,12 @@ void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, | |
* extracts data from the entropy source. | ||
* | ||
* \param ctx The CTR_DRBG context. | ||
* \param additional Additional data to add to the state. Can be NULL. | ||
* \param additional Additional data to add to the state. Can be \c NULL. | ||
* \param len The length of the additional data. | ||
* This must be less than | ||
* #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - \c entropy_len | ||
* where \c entropy_len is the entropy length | ||
* configured for the context. | ||
* | ||
* \return \c 0 on success. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure. | ||
|
@@ -246,7 +363,8 @@ int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx, | |
* \brief This function updates the state of the CTR_DRBG context. | ||
* | ||
* \param ctx The CTR_DRBG context. | ||
* \param additional The data to update the state with. | ||
* \param additional The data to update the state with. This must not be | ||
* \c NULL unless \p add_len is \c 0. | ||
* \param add_len Length of \p additional in bytes. This must be at | ||
* most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. | ||
* | ||
|
@@ -264,14 +382,23 @@ int mbedtls_ctr_drbg_update_ret( mbedtls_ctr_drbg_context *ctx, | |
* \brief This function updates a CTR_DRBG instance with additional | ||
* data and uses it to generate random data. | ||
* | ||
* \note The function automatically reseeds if the reseed counter is exceeded. | ||
* This function automatically reseeds if the reseed counter is exceeded | ||
* or prediction resistance is enabled. | ||
* | ||
* \param p_rng The CTR_DRBG context. This must be a pointer to a | ||
* #mbedtls_ctr_drbg_context structure. | ||
* \param output The buffer to fill. | ||
* \param output_len The length of the buffer. | ||
* \param additional Additional data to update. Can be NULL. | ||
* \param add_len The length of the additional data. | ||
* \param output_len The length of the buffer in bytes. | ||
* \param additional Additional data to update. Can be \c NULL, in which | ||
* case the additional data is empty regardless of | ||
* the value of \p add_len. | ||
* \param add_len The length of the additional data | ||
* if \p additional is not \c NULL. | ||
* This must be less than #MBEDTLS_CTR_DRBG_MAX_INPUT | ||
* and less than | ||
* #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - \c entropy_len | ||
* where \c entropy_len is the entropy length | ||
* configured for the context. | ||
* | ||
* \return \c 0 on success. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or | ||
|
@@ -284,12 +411,14 @@ int mbedtls_ctr_drbg_random_with_add( void *p_rng, | |
/** | ||
* \brief This function uses CTR_DRBG to generate random data. | ||
* | ||
* \note The function automatically reseeds if the reseed counter is exceeded. | ||
* This function automatically reseeds if the reseed counter is exceeded | ||
* or prediction resistance is enabled. | ||
* | ||
* | ||
* \param p_rng The CTR_DRBG context. This must be a pointer to a | ||
* #mbedtls_ctr_drbg_context structure. | ||
* \param output The buffer to fill. | ||
* \param output_len The length of the buffer. | ||
* \param output_len The length of the buffer in bytes. | ||
* | ||
* \return \c 0 on success. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or | ||
|
@@ -336,7 +465,7 @@ MBEDTLS_DEPRECATED void mbedtls_ctr_drbg_update( | |
* | ||
* \return \c 0 on success. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on | ||
* \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on reseed | ||
* failure. | ||
*/ | ||
int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); | ||
|
@@ -350,8 +479,10 @@ int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char | |
* | ||
* \return \c 0 on success. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or | ||
* #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG on failure. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on | ||
* reseed failure. | ||
* \return #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if the existing | ||
* seed file is too large. | ||
*/ | ||
int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); | ||
#endif /* MBEDTLS_FS_IO */ | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the difference between
#MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
and\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
? Since I can see that both of these versions are used.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#MACRO
typesetsMACRO
and links to the definition ofMACRO
ifMACRO
is defined, but typesets#MACRO
ifMACRO
is undefined, so it isn't good for preprocessor symbols that may or may not be defined. Hence the use of\c MACRO
for symbols that may or may not be defined.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't it be
\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
everywhere then? Or will doxygen ignore blocks that won't get compiled?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It can be
#MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
here because this comment is surrounded by#ifdef MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
.