Introduce getter for MD handle from MD context

This commit is contained in:
Hanno Becker 2019-09-03 12:56:37 +01:00
parent 62a44d43b0
commit d3827c74d5
5 changed files with 117 additions and 66 deletions

View file

@ -104,6 +104,12 @@ typedef struct mbedtls_md_context_t
void *hmac_ctx; void *hmac_ctx;
} mbedtls_md_context_t; } mbedtls_md_context_t;
static inline mbedtls_md_handle_t mbedtls_md_get_handle(
struct mbedtls_md_context_t const *ctx )
{
return( ctx->md_info );
}
/** /**
* \brief This function returns the list of digests supported by the * \brief This function returns the list of digests supported by the
* generic digest module. * generic digest module.

View file

@ -70,7 +70,8 @@ int mbedtls_hmac_drbg_update_ret( mbedtls_hmac_drbg_context *ctx,
const unsigned char *additional, const unsigned char *additional,
size_t add_len ) size_t add_len )
{ {
size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info ); size_t md_len = mbedtls_md_get_size(
mbedtls_md_get_handle( &ctx->md_ctx ) );
unsigned char rounds = ( additional != NULL && add_len != 0 ) ? 2 : 1; unsigned char rounds = ( additional != NULL && add_len != 0 ) ? 2 : 1;
unsigned char sep[1]; unsigned char sep[1];
unsigned char K[MBEDTLS_MD_MAX_SIZE]; unsigned char K[MBEDTLS_MD_MAX_SIZE];
@ -329,7 +330,8 @@ int mbedtls_hmac_drbg_random_with_add( void *p_rng,
{ {
int ret; int ret;
mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng; mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng;
size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info ); size_t md_len = mbedtls_md_get_size(
mbedtls_md_get_handle( &ctx->md_ctx ) );
size_t left = out_len; size_t left = out_len;
unsigned char *out = output; unsigned char *out = output;

View file

@ -189,16 +189,19 @@ void mbedtls_md_init( mbedtls_md_context_t *ctx )
void mbedtls_md_free( mbedtls_md_context_t *ctx ) void mbedtls_md_free( mbedtls_md_context_t *ctx )
{ {
if( ctx == NULL || ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ) if( ctx == NULL || mbedtls_md_get_handle( ctx ) == MBEDTLS_MD_INVALID_HANDLE )
return; return;
if( ctx->md_ctx != NULL ) if( ctx->md_ctx != NULL )
mbedtls_md_info_ctx_free_func( ctx->md_info )( ctx->md_ctx ); {
mbedtls_md_info_ctx_free_func(
mbedtls_md_get_handle( ctx ) )( ctx->md_ctx );
}
if( ctx->hmac_ctx != NULL ) if( ctx->hmac_ctx != NULL )
{ {
mbedtls_platform_zeroize( ctx->hmac_ctx, mbedtls_platform_zeroize( ctx->hmac_ctx,
2 * mbedtls_md_info_block_size( ctx->md_info ) ); 2 * mbedtls_md_info_block_size( mbedtls_md_get_handle( ctx ) ) );
mbedtls_free( ctx->hmac_ctx ); mbedtls_free( ctx->hmac_ctx );
} }
@ -208,14 +211,15 @@ void mbedtls_md_free( mbedtls_md_context_t *ctx )
int mbedtls_md_clone( mbedtls_md_context_t *dst, int mbedtls_md_clone( mbedtls_md_context_t *dst,
const mbedtls_md_context_t *src ) const mbedtls_md_context_t *src )
{ {
if( dst == NULL || dst->md_info == MBEDTLS_MD_INVALID_HANDLE || if( dst == NULL || mbedtls_md_get_handle( dst ) == MBEDTLS_MD_INVALID_HANDLE ||
src == NULL || src->md_info == MBEDTLS_MD_INVALID_HANDLE || src == NULL || mbedtls_md_get_handle( src ) == MBEDTLS_MD_INVALID_HANDLE ||
dst->md_info != src->md_info ) mbedtls_md_get_handle( dst ) != mbedtls_md_get_handle( src ) )
{ {
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
} }
mbedtls_md_info_clone_func( dst->md_info )( dst->md_ctx, src->md_ctx ); mbedtls_md_info_clone_func( mbedtls_md_get_handle( dst ) )
( dst->md_ctx, src->md_ctx );
return( 0 ); return( 0 );
} }
@ -237,7 +241,8 @@ int mbedtls_md_setup( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info, in
if( hmac != 0 ) if( hmac != 0 )
{ {
ctx->hmac_ctx = mbedtls_calloc( 2, mbedtls_md_info_block_size( md_info ) ); ctx->hmac_ctx = mbedtls_calloc( 2,
mbedtls_md_info_block_size( md_info ) );
if( ctx->hmac_ctx == NULL ) if( ctx->hmac_ctx == NULL )
{ {
mbedtls_md_info_ctx_free_func( md_info )( ctx->md_ctx ); mbedtls_md_info_ctx_free_func( md_info )( ctx->md_ctx );
@ -252,28 +257,43 @@ int mbedtls_md_setup( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info, in
int mbedtls_md_starts( mbedtls_md_context_t *ctx ) int mbedtls_md_starts( mbedtls_md_context_t *ctx )
{ {
if( ctx == NULL || ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ) mbedtls_md_handle_t md_info;
if( ctx == NULL )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
return( mbedtls_md_info_starts_func( ctx->md_info )( ctx->md_ctx ) ); md_info = mbedtls_md_get_handle( ctx );
if( md_info == MBEDTLS_MD_INVALID_HANDLE )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
return( mbedtls_md_info_starts_func( md_info )( ctx->md_ctx ) );
} }
int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ) int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
{ {
if( ctx == NULL || ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ) mbedtls_md_handle_t md_info;
if( ctx == NULL )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
return( mbedtls_md_info_update_func( ctx->md_info )( ctx->md_ctx, md_info = mbedtls_md_get_handle( ctx );
input, ilen ) ); if( md_info == MBEDTLS_MD_INVALID_HANDLE )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
return( mbedtls_md_info_update_func( md_info )( ctx->md_ctx,
input, ilen ) );
} }
int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ) int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
{ {
if( ctx == NULL || ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ) mbedtls_md_handle_t md_info;
if( ctx == NULL )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
return( mbedtls_md_info_finish_func( ctx->md_info )( ctx->md_ctx, md_info = mbedtls_md_get_handle( ctx );
output ) ); if( md_info == MBEDTLS_MD_INVALID_HANDLE )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
return( mbedtls_md_info_finish_func( md_info )( ctx->md_ctx,
output ) );
} }
int mbedtls_md( mbedtls_md_handle_t md_info, const unsigned char *input, size_t ilen, int mbedtls_md( mbedtls_md_handle_t md_info, const unsigned char *input, size_t ilen,
@ -348,18 +368,20 @@ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key,
mbedtls_md_update_func_t *update; mbedtls_md_update_func_t *update;
mbedtls_md_finish_func_t *finish; mbedtls_md_finish_func_t *finish;
if( ctx == NULL || mbedtls_md_handle_t md_info;
ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ||
ctx->hmac_ctx == NULL ) if( ctx == NULL || ctx->hmac_ctx == NULL )
{
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
}
starts = mbedtls_md_info_starts_func( ctx->md_info ); md_info = mbedtls_md_get_handle( ctx );
update = mbedtls_md_info_update_func( ctx->md_info ); if( md_info == MBEDTLS_MD_INVALID_HANDLE )
finish = mbedtls_md_info_finish_func( ctx->md_info ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
if( keylen > (size_t) mbedtls_md_info_block_size( ctx->md_info ) ) starts = mbedtls_md_info_starts_func( md_info );
update = mbedtls_md_info_update_func( md_info );
finish = mbedtls_md_info_finish_func( md_info );
if( keylen > (size_t) mbedtls_md_info_block_size( md_info ) )
{ {
if( ( ret = starts( ctx->md_ctx ) ) != 0 ) if( ( ret = starts( ctx->md_ctx ) ) != 0 )
goto cleanup; goto cleanup;
@ -370,15 +392,16 @@ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key,
if( ( ret = finish( ctx->md_ctx, sum ) ) != 0 ) if( ( ret = finish( ctx->md_ctx, sum ) ) != 0 )
goto cleanup; goto cleanup;
keylen = mbedtls_md_info_size( ctx->md_info ); keylen = mbedtls_md_info_size( md_info );
key = sum; key = sum;
} }
ipad = (unsigned char *) ctx->hmac_ctx; ipad = (unsigned char *) ctx->hmac_ctx;
opad = (unsigned char *) ctx->hmac_ctx + mbedtls_md_info_block_size( ctx->md_info ); opad = (unsigned char *) ctx->hmac_ctx +
mbedtls_md_info_block_size( md_info );
memset( ipad, 0x36, mbedtls_md_info_block_size( ctx->md_info ) ); memset( ipad, 0x36, mbedtls_md_info_block_size( md_info ) );
memset( opad, 0x5C, mbedtls_md_info_block_size( ctx->md_info ) ); memset( opad, 0x5C, mbedtls_md_info_block_size( md_info ) );
for( i = 0; i < keylen; i++ ) for( i = 0; i < keylen; i++ )
{ {
@ -389,8 +412,11 @@ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key,
if( ( ret = starts( ctx->md_ctx ) ) != 0 ) if( ( ret = starts( ctx->md_ctx ) ) != 0 )
goto cleanup; goto cleanup;
if( ( ret = update( ctx->md_ctx, ipad, mbedtls_md_info_block_size( ctx->md_info ) ) ) != 0 ) if( ( ret = update( ctx->md_ctx, ipad,
mbedtls_md_info_block_size( md_info ) ) ) != 0 )
{
goto cleanup; goto cleanup;
}
cleanup: cleanup:
mbedtls_platform_zeroize( sum, sizeof( sum ) ); mbedtls_platform_zeroize( sum, sizeof( sum ) );
@ -398,16 +424,19 @@ cleanup:
return( ret ); return( ret );
} }
int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ) int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx,
const unsigned char *input, size_t ilen )
{ {
if( ctx == NULL || mbedtls_md_handle_t md_info;
ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ||
ctx->hmac_ctx == NULL )
{
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
}
return( mbedtls_md_info_update_func( ctx->md_info )( if( ctx == NULL || ctx->hmac_ctx == NULL )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
md_info = mbedtls_md_get_handle( ctx );
if( md_info == MBEDTLS_MD_INVALID_HANDLE )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
return( mbedtls_md_info_update_func( md_info )(
ctx->md_ctx, input, ilen ) ); ctx->md_ctx, input, ilen ) );
} }
@ -421,18 +450,21 @@ int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
mbedtls_md_update_func_t *update; mbedtls_md_update_func_t *update;
mbedtls_md_finish_func_t *finish; mbedtls_md_finish_func_t *finish;
if( ctx == NULL || mbedtls_md_handle_t md_info;
ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ||
ctx->hmac_ctx == NULL ) if( ctx == NULL || ctx->hmac_ctx == NULL )
{
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
}
starts = mbedtls_md_info_starts_func( ctx->md_info ); md_info = mbedtls_md_get_handle( ctx );
update = mbedtls_md_info_update_func( ctx->md_info ); if( md_info == MBEDTLS_MD_INVALID_HANDLE )
finish = mbedtls_md_info_finish_func( ctx->md_info ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
opad = (unsigned char *) ctx->hmac_ctx + mbedtls_md_info_block_size( ctx->md_info ); starts = mbedtls_md_info_starts_func( md_info );
update = mbedtls_md_info_update_func( md_info );
finish = mbedtls_md_info_finish_func( md_info );
opad = (unsigned char *) ctx->hmac_ctx +
mbedtls_md_info_block_size( md_info );
if( ( ret = finish( ctx->md_ctx, tmp ) ) != 0 ) if( ( ret = finish( ctx->md_ctx, tmp ) ) != 0 )
return( ret ); return( ret );
@ -440,11 +472,17 @@ int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
if( ( ret = starts( ctx->md_ctx ) ) != 0 ) if( ( ret = starts( ctx->md_ctx ) ) != 0 )
return( ret ); return( ret );
if( ( ret = update( ctx->md_ctx, opad, mbedtls_md_info_block_size( ctx->md_info ) ) ) != 0 ) if( ( ret = update( ctx->md_ctx, opad,
mbedtls_md_info_block_size( md_info ) ) ) != 0 )
{
return( ret ); return( ret );
}
if( ( ret = update( ctx->md_ctx, tmp, mbedtls_md_info_size( ctx->md_info ) ) ) != 0 ) if( ( ret = update( ctx->md_ctx, tmp,
mbedtls_md_info_size( md_info ) ) ) != 0 )
{
return( ret ); return( ret );
}
if( ( ret = finish( ctx->md_ctx, output ) ) != 0 ) if( ( ret = finish( ctx->md_ctx, output ) ) != 0 )
return( ret ); return( ret );
@ -457,21 +495,24 @@ int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
int ret; int ret;
unsigned char *ipad; unsigned char *ipad;
if( ctx == NULL || mbedtls_md_handle_t md_info;
ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ||
ctx->hmac_ctx == NULL ) if( ctx == NULL || ctx->hmac_ctx == NULL )
{ return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
md_info = mbedtls_md_get_handle( ctx );
if( md_info == MBEDTLS_MD_INVALID_HANDLE )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
}
ipad = (unsigned char *) ctx->hmac_ctx; ipad = (unsigned char *) ctx->hmac_ctx;
ret = mbedtls_md_info_starts_func( ctx->md_info )( ctx->md_ctx ); ret = mbedtls_md_info_starts_func( md_info )( ctx->md_ctx );
if( ret != 0 ) if( ret != 0 )
return( ret ); return( ret );
ret = mbedtls_md_info_update_func( ctx->md_info )( ret = mbedtls_md_info_update_func( md_info )(
ctx->md_ctx, ipad, mbedtls_md_info_block_size( ctx->md_info ) ); ctx->md_ctx, ipad,
mbedtls_md_info_block_size( md_info ) );
return( ret ); return( ret );
} }
@ -506,13 +547,15 @@ cleanup:
int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ) int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
{ {
if( ctx == NULL || mbedtls_md_handle_t md_info;
ctx->md_info == MBEDTLS_MD_INVALID_HANDLE ) if( ctx == NULL )
{
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
}
return( mbedtls_md_info_process_func( ctx->md_info )( md_info = mbedtls_md_get_handle( ctx );
if( md_info == MBEDTLS_MD_INVALID_HANDLE )
return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
return( mbedtls_md_info_process_func( md_info )(
ctx->md_ctx, data ) ); ctx->md_ctx, data ) );
} }

View file

@ -226,7 +226,7 @@ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *p
unsigned int i; unsigned int i;
unsigned char md1[MBEDTLS_MD_MAX_SIZE]; unsigned char md1[MBEDTLS_MD_MAX_SIZE];
unsigned char work[MBEDTLS_MD_MAX_SIZE]; unsigned char work[MBEDTLS_MD_MAX_SIZE];
unsigned char md_size = mbedtls_md_get_size( ctx->md_info ); unsigned char md_size = mbedtls_md_get_size( mbedtls_md_get_handle( ctx ) );
size_t use_len; size_t use_len;
unsigned char *out_p = output; unsigned char *out_p = output;
unsigned char counter[4]; unsigned char counter[4];

View file

@ -1076,7 +1076,7 @@ static int mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src,
memset( mask, 0, MBEDTLS_MD_MAX_SIZE ); memset( mask, 0, MBEDTLS_MD_MAX_SIZE );
memset( counter, 0, 4 ); memset( counter, 0, 4 );
hlen = mbedtls_md_get_size( md_ctx->md_info ); hlen = mbedtls_md_get_size( mbedtls_md_get_handle( md_ctx ) );
/* Generate and apply dbMask */ /* Generate and apply dbMask */
p = dst; p = dst;