Implement parameter validation for DHM module
This commit is contained in:
parent
6c5c45f400
commit
5c14ed6f86
1 changed files with 38 additions and 6 deletions
|
@ -60,6 +60,11 @@
|
||||||
|
|
||||||
#if !defined(MBEDTLS_DHM_ALT)
|
#if !defined(MBEDTLS_DHM_ALT)
|
||||||
|
|
||||||
|
#define DHM_VALIDATE_RET( cond ) \
|
||||||
|
MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_DHM_BAD_INPUT_DATA )
|
||||||
|
#define DHM_VALIDATE( cond ) \
|
||||||
|
MBEDTLS_INTERNAL_VALIDATE( cond )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* helper to validate the mbedtls_mpi size and import it
|
* helper to validate the mbedtls_mpi size and import it
|
||||||
*/
|
*/
|
||||||
|
@ -103,6 +108,7 @@ static int dhm_check_range( const mbedtls_mpi *param, const mbedtls_mpi *P )
|
||||||
mbedtls_mpi L, U;
|
mbedtls_mpi L, U;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
|
||||||
mbedtls_mpi_init( &L ); mbedtls_mpi_init( &U );
|
mbedtls_mpi_init( &L ); mbedtls_mpi_init( &U );
|
||||||
|
|
||||||
MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &L, 2 ) );
|
MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &L, 2 ) );
|
||||||
|
@ -121,6 +127,7 @@ cleanup:
|
||||||
|
|
||||||
void mbedtls_dhm_init( mbedtls_dhm_context *ctx )
|
void mbedtls_dhm_init( mbedtls_dhm_context *ctx )
|
||||||
{
|
{
|
||||||
|
DHM_VALIDATE( ctx != NULL );
|
||||||
memset( ctx, 0, sizeof( mbedtls_dhm_context ) );
|
memset( ctx, 0, sizeof( mbedtls_dhm_context ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,6 +139,9 @@ int mbedtls_dhm_read_params( mbedtls_dhm_context *ctx,
|
||||||
const unsigned char *end )
|
const unsigned char *end )
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
DHM_VALIDATE_RET( ctx != NULL );
|
||||||
|
DHM_VALIDATE_RET( p != NULL && *p != NULL );
|
||||||
|
DHM_VALIDATE_RET( end != NULL );
|
||||||
|
|
||||||
if( ( ret = dhm_read_bignum( &ctx->P, p, end ) ) != 0 ||
|
if( ( ret = dhm_read_bignum( &ctx->P, p, end ) ) != 0 ||
|
||||||
( ret = dhm_read_bignum( &ctx->G, p, end ) ) != 0 ||
|
( ret = dhm_read_bignum( &ctx->G, p, end ) ) != 0 ||
|
||||||
|
@ -157,6 +167,10 @@ int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size,
|
||||||
int ret, count = 0;
|
int ret, count = 0;
|
||||||
size_t n1, n2, n3;
|
size_t n1, n2, n3;
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
|
DHM_VALIDATE_RET( ctx != NULL );
|
||||||
|
DHM_VALIDATE_RET( output != NULL );
|
||||||
|
DHM_VALIDATE_RET( olen != NULL );
|
||||||
|
DHM_VALIDATE_RET( f_rng != NULL );
|
||||||
|
|
||||||
if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 )
|
if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 )
|
||||||
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
||||||
|
@ -227,9 +241,9 @@ int mbedtls_dhm_set_group( mbedtls_dhm_context *ctx,
|
||||||
const mbedtls_mpi *G )
|
const mbedtls_mpi *G )
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
DHM_VALIDATE_RET( ctx != NULL );
|
||||||
if( ctx == NULL || P == NULL || G == NULL )
|
DHM_VALIDATE_RET( P != NULL );
|
||||||
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
DHM_VALIDATE_RET( G != NULL );
|
||||||
|
|
||||||
if( ( ret = mbedtls_mpi_copy( &ctx->P, P ) ) != 0 ||
|
if( ( ret = mbedtls_mpi_copy( &ctx->P, P ) ) != 0 ||
|
||||||
( ret = mbedtls_mpi_copy( &ctx->G, G ) ) != 0 )
|
( ret = mbedtls_mpi_copy( &ctx->G, G ) ) != 0 )
|
||||||
|
@ -248,8 +262,10 @@ int mbedtls_dhm_read_public( mbedtls_dhm_context *ctx,
|
||||||
const unsigned char *input, size_t ilen )
|
const unsigned char *input, size_t ilen )
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
DHM_VALIDATE_RET( ctx != NULL );
|
||||||
|
DHM_VALIDATE_RET( input != NULL );
|
||||||
|
|
||||||
if( ctx == NULL || ilen < 1 || ilen > ctx->len )
|
if( ilen < 1 || ilen > ctx->len )
|
||||||
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
||||||
|
|
||||||
if( ( ret = mbedtls_mpi_read_binary( &ctx->GY, input, ilen ) ) != 0 )
|
if( ( ret = mbedtls_mpi_read_binary( &ctx->GY, input, ilen ) ) != 0 )
|
||||||
|
@ -267,8 +283,11 @@ int mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size,
|
||||||
void *p_rng )
|
void *p_rng )
|
||||||
{
|
{
|
||||||
int ret, count = 0;
|
int ret, count = 0;
|
||||||
|
DHM_VALIDATE_RET( ctx != NULL );
|
||||||
|
DHM_VALIDATE_RET( output != NULL );
|
||||||
|
DHM_VALIDATE_RET( f_rng != NULL );
|
||||||
|
|
||||||
if( ctx == NULL || olen < 1 || olen > ctx->len )
|
if( olen < 1 || olen > ctx->len )
|
||||||
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
||||||
|
|
||||||
if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 )
|
if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 )
|
||||||
|
@ -380,8 +399,11 @@ int mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx,
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
mbedtls_mpi GYb;
|
mbedtls_mpi GYb;
|
||||||
|
DHM_VALIDATE_RET( ctx != NULL );
|
||||||
|
DHM_VALIDATE_RET( output != NULL );
|
||||||
|
DHM_VALIDATE_RET( olen != NULL );
|
||||||
|
|
||||||
if( ctx == NULL || output_size < ctx->len )
|
if( output_size < ctx->len )
|
||||||
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
|
||||||
|
|
||||||
if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 )
|
if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 )
|
||||||
|
@ -428,6 +450,9 @@ cleanup:
|
||||||
*/
|
*/
|
||||||
void mbedtls_dhm_free( mbedtls_dhm_context *ctx )
|
void mbedtls_dhm_free( mbedtls_dhm_context *ctx )
|
||||||
{
|
{
|
||||||
|
if( ctx == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
mbedtls_mpi_free( &ctx->pX ); mbedtls_mpi_free( &ctx->Vf );
|
mbedtls_mpi_free( &ctx->pX ); mbedtls_mpi_free( &ctx->Vf );
|
||||||
mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->RP );
|
mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->RP );
|
||||||
mbedtls_mpi_free( &ctx->K ); mbedtls_mpi_free( &ctx->GY );
|
mbedtls_mpi_free( &ctx->K ); mbedtls_mpi_free( &ctx->GY );
|
||||||
|
@ -449,7 +474,12 @@ int mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin,
|
||||||
unsigned char *p, *end;
|
unsigned char *p, *end;
|
||||||
#if defined(MBEDTLS_PEM_PARSE_C)
|
#if defined(MBEDTLS_PEM_PARSE_C)
|
||||||
mbedtls_pem_context pem;
|
mbedtls_pem_context pem;
|
||||||
|
#endif /* MBEDTLS_PEM_PARSE_C */
|
||||||
|
|
||||||
|
DHM_VALIDATE_RET( dhm != NULL );
|
||||||
|
DHM_VALIDATE_RET( dhmin != NULL );
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_PEM_PARSE_C)
|
||||||
mbedtls_pem_init( &pem );
|
mbedtls_pem_init( &pem );
|
||||||
|
|
||||||
/* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
|
/* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
|
||||||
|
@ -596,6 +626,8 @@ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path )
|
||||||
int ret;
|
int ret;
|
||||||
size_t n;
|
size_t n;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
DHM_VALIDATE_RET( dhm != NULL );
|
||||||
|
DHM_VALIDATE_RET( path != NULL );
|
||||||
|
|
||||||
if( ( ret = load_file( path, &buf, &n ) ) != 0 )
|
if( ( ret = load_file( path, &buf, &n ) ) != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue