mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-26 01:05:40 +01:00
CTR_DRBG: support set_entropy_len() before seed()
mbedtls_ctr_drbg_seed() always set the entropy length to the default, so a call to mbedtls_ctr_drbg_set_entropy_len() before seed() had no effect. Change this to the more intuitive behavior that set_entropy_len() sets the entropy length and seed() respects that and only uses the default entropy length if there was no call to set_entropy_len(). The former test-only function mbedtls_ctr_drbg_seed_entropy_len() is no longer used, but keep it for strict ABI compatibility.
This commit is contained in:
parent
c4280acfa0
commit
912ffe414e
@ -214,11 +214,8 @@ void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx );
|
|||||||
* with mbedtls_entropy_init() (which registers the platform's default
|
* with mbedtls_entropy_init() (which registers the platform's default
|
||||||
* entropy sources).
|
* entropy sources).
|
||||||
*
|
*
|
||||||
* \p f_entropy is always called with a buffer size equal to the entropy
|
* The entropy length is #MBEDTLS_CTR_DRBG_ENTROPY_LEN by default.
|
||||||
* length. The entropy length is initially #MBEDTLS_CTR_DRBG_ENTROPY_LEN
|
* You can override it by calling mbedtls_ctr_drbg_set_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
|
* You can provide a personalization string in addition to the
|
||||||
* entropy source, to make this instantiation as unique as possible.
|
* entropy source, to make this instantiation as unique as possible.
|
||||||
@ -255,6 +252,8 @@ void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx );
|
|||||||
* \param f_entropy The entropy callback, taking as arguments the
|
* \param f_entropy The entropy callback, taking as arguments the
|
||||||
* \p p_entropy context, the buffer to fill, and the
|
* \p p_entropy context, the buffer to fill, and the
|
||||||
* length of the buffer.
|
* length of the buffer.
|
||||||
|
* \p f_entropy is always called with a buffer size
|
||||||
|
* equal to the entropy length.
|
||||||
* \param p_entropy The entropy context to pass to \p f_entropy.
|
* \param p_entropy The entropy context to pass to \p f_entropy.
|
||||||
* \param custom The personalization string.
|
* \param custom The personalization string.
|
||||||
* This can be \c NULL, in which case the personalization
|
* This can be \c NULL, in which case the personalization
|
||||||
@ -298,15 +297,10 @@ void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This function sets the amount of entropy grabbed on each
|
* \brief This function sets the amount of entropy grabbed on each
|
||||||
* subsequent reseed.
|
* seed or reseed.
|
||||||
*
|
*
|
||||||
* The default value is #MBEDTLS_CTR_DRBG_ENTROPY_LEN.
|
* 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
|
* \note The security strength of CTR_DRBG is bounded by the
|
||||||
* entropy length. Thus:
|
* entropy length. Thus:
|
||||||
* - When using AES-256
|
* - When using AES-256
|
||||||
|
@ -365,29 +365,22 @@ exit:
|
|||||||
return( ret );
|
return( ret );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Non-public function wrapped by mbedtls_ctr_drbg_seed(). Necessary to allow
|
|
||||||
* NIST tests to succeed (which require known length fixed entropy)
|
|
||||||
*/
|
|
||||||
/* CTR_DRBG_Instantiate with derivation function (SP 800-90A §10.2.1.3.2)
|
/* CTR_DRBG_Instantiate with derivation function (SP 800-90A §10.2.1.3.2)
|
||||||
* mbedtls_ctr_drbg_seed_entropy_len(ctx, f_entropy, p_entropy,
|
* mbedtls_ctr_drbg_seed(ctx, f_entropy, p_entropy, custom, len)
|
||||||
* custom, len, entropy_len)
|
|
||||||
* implements
|
* implements
|
||||||
* CTR_DRBG_Instantiate(entropy_input, nonce, personalization_string,
|
* CTR_DRBG_Instantiate(entropy_input, nonce, personalization_string,
|
||||||
* security_strength) -> initial_working_state
|
* security_strength) -> initial_working_state
|
||||||
* with inputs
|
* with inputs
|
||||||
* custom[:len] = nonce || personalization_string
|
* custom[:len] = nonce || personalization_string
|
||||||
* where entropy_input comes from f_entropy for entropy_len bytes
|
* where entropy_input comes from f_entropy for ctx->entropy_len bytes
|
||||||
* and with outputs
|
* and with outputs
|
||||||
* ctx = initial_working_state
|
* ctx = initial_working_state
|
||||||
*/
|
*/
|
||||||
int mbedtls_ctr_drbg_seed_entropy_len(
|
int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
|
||||||
mbedtls_ctr_drbg_context *ctx,
|
int (*f_entropy)(void *, unsigned char *, size_t),
|
||||||
int (*f_entropy)(void *, unsigned char *, size_t),
|
void *p_entropy,
|
||||||
void *p_entropy,
|
const unsigned char *custom,
|
||||||
const unsigned char *custom,
|
size_t len )
|
||||||
size_t len,
|
|
||||||
size_t entropy_len )
|
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE];
|
unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE];
|
||||||
@ -399,7 +392,8 @@ int mbedtls_ctr_drbg_seed_entropy_len(
|
|||||||
ctx->f_entropy = f_entropy;
|
ctx->f_entropy = f_entropy;
|
||||||
ctx->p_entropy = p_entropy;
|
ctx->p_entropy = p_entropy;
|
||||||
|
|
||||||
ctx->entropy_len = entropy_len;
|
if( ctx->entropy_len == 0 )
|
||||||
|
ctx->entropy_len = MBEDTLS_CTR_DRBG_ENTROPY_LEN;
|
||||||
ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL;
|
ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -417,14 +411,15 @@ int mbedtls_ctr_drbg_seed_entropy_len(
|
|||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
|
/* Backward compatibility wrapper */
|
||||||
int (*f_entropy)(void *, unsigned char *, size_t),
|
int mbedtls_ctr_drbg_seed_entropy_len(
|
||||||
void *p_entropy,
|
mbedtls_ctr_drbg_context *ctx,
|
||||||
const unsigned char *custom,
|
int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy,
|
||||||
size_t len )
|
const unsigned char *custom, size_t len,
|
||||||
|
size_t entropy_len )
|
||||||
{
|
{
|
||||||
return( mbedtls_ctr_drbg_seed_entropy_len( ctx, f_entropy, p_entropy, custom, len,
|
mbedtls_ctr_drbg_set_entropy_len( ctx, entropy_len );
|
||||||
MBEDTLS_CTR_DRBG_ENTROPY_LEN ) );
|
return( mbedtls_ctr_drbg_seed( ctx, f_entropy, p_entropy, custom, len ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CTR_DRBG_Generate with derivation function (SP 800-90A §10.2.1.5.2)
|
/* CTR_DRBG_Generate with derivation function (SP 800-90A §10.2.1.5.2)
|
||||||
@ -678,8 +673,11 @@ int mbedtls_ctr_drbg_self_test( int verbose )
|
|||||||
mbedtls_printf( " CTR_DRBG (PR = TRUE) : " );
|
mbedtls_printf( " CTR_DRBG (PR = TRUE) : " );
|
||||||
|
|
||||||
test_offset = 0;
|
test_offset = 0;
|
||||||
CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy,
|
mbedtls_ctr_drbg_set_entropy_len( &ctx, 32 );
|
||||||
(void *) entropy_source_pr, nonce_pers_pr, 16, 32 ) );
|
CHK( mbedtls_ctr_drbg_seed( &ctx,
|
||||||
|
ctr_drbg_self_test_entropy,
|
||||||
|
(void *) entropy_source_pr,
|
||||||
|
nonce_pers_pr, 16 ) );
|
||||||
mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON );
|
mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON );
|
||||||
CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );
|
CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );
|
||||||
CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );
|
CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );
|
||||||
@ -699,8 +697,11 @@ int mbedtls_ctr_drbg_self_test( int verbose )
|
|||||||
mbedtls_ctr_drbg_init( &ctx );
|
mbedtls_ctr_drbg_init( &ctx );
|
||||||
|
|
||||||
test_offset = 0;
|
test_offset = 0;
|
||||||
CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy,
|
mbedtls_ctr_drbg_set_entropy_len( &ctx, 32 );
|
||||||
(void *) entropy_source_nopr, nonce_pers_nopr, 16, 32 ) );
|
CHK( mbedtls_ctr_drbg_seed( &ctx,
|
||||||
|
ctr_drbg_self_test_entropy,
|
||||||
|
(void *) entropy_source_nopr,
|
||||||
|
nonce_pers_nopr, 16 ) );
|
||||||
CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) );
|
CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) );
|
||||||
CHK( mbedtls_ctr_drbg_reseed( &ctx, NULL, 0 ) );
|
CHK( mbedtls_ctr_drbg_reseed( &ctx, NULL, 0 ) );
|
||||||
CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) );
|
CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) );
|
||||||
|
@ -44,11 +44,11 @@ static void ctr_drbg_validate_internal( int reseed_mode, data_t * nonce,
|
|||||||
|
|
||||||
/* CTR_DRBG_Instantiate(entropy[:entropy->len], nonce, perso, <ignored>)
|
/* CTR_DRBG_Instantiate(entropy[:entropy->len], nonce, perso, <ignored>)
|
||||||
* where nonce||perso = nonce[nonce->len] */
|
* where nonce||perso = nonce[nonce->len] */
|
||||||
TEST_ASSERT( mbedtls_ctr_drbg_seed_entropy_len(
|
mbedtls_ctr_drbg_set_entropy_len( &ctx, entropy_chunk_len );
|
||||||
|
TEST_ASSERT( mbedtls_ctr_drbg_seed(
|
||||||
&ctx,
|
&ctx,
|
||||||
mbedtls_test_entropy_func, entropy->x,
|
mbedtls_test_entropy_func, entropy->x,
|
||||||
nonce->x, nonce->len,
|
nonce->x, nonce->len ) == 0 );
|
||||||
entropy_chunk_len ) == 0 );
|
|
||||||
if( reseed_mode == RESEED_ALWAYS )
|
if( reseed_mode == RESEED_ALWAYS )
|
||||||
mbedtls_ctr_drbg_set_prediction_resistance(
|
mbedtls_ctr_drbg_set_prediction_resistance(
|
||||||
&ctx,
|
&ctx,
|
||||||
|
Loading…
Reference in New Issue
Block a user