md: Add parameter validation

Improve documentation on parameter constraints
diff --git a/library/md.c b/library/md.c
index 303cdcb..821a5e8 100644
--- a/library/md.c
+++ b/library/md.c
@@ -49,6 +49,12 @@
 #include <stdio.h>
 #endif
 
+#define MBEDTLS_MD_VALIDATE_RET(cond) \
+        MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_MD_BAD_INPUT_DATA )
+#define MBEDTLS_MD_VALIDATE_RET_NULL(cond) \
+        MBEDTLS_INTERNAL_VALIDATE_RET( cond, NULL )
+#define MBEDTLS_MD_VALIDATE(cond)    MBEDTLS_INTERNAL_VALIDATE( cond )
+
 /*
  * Reminder: update profiles in x509_crt.c when adding a new hash!
  */
@@ -94,8 +100,7 @@
 
 const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name )
 {
-    if( NULL == md_name )
-        return( NULL );
+    MBEDTLS_MD_VALIDATE_RET_NULL( md_name != NULL );
 
     /* Get the appropriate digest information */
 #if defined(MBEDTLS_MD2_C)
@@ -176,6 +181,7 @@
 
 void mbedtls_md_init( mbedtls_md_context_t *ctx )
 {
+    MBEDTLS_MD_VALIDATE( ctx != NULL );
     memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
 }
 
@@ -200,12 +206,11 @@
 int mbedtls_md_clone( mbedtls_md_context_t *dst,
                       const mbedtls_md_context_t *src )
 {
-    if( dst == NULL || dst->md_info == NULL ||
-        src == NULL || src->md_info == NULL ||
-        dst->md_info != src->md_info )
-    {
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
-    }
+    MBEDTLS_MD_VALIDATE_RET( dst != NULL );
+    MBEDTLS_MD_VALIDATE_RET( src != NULL );
+    MBEDTLS_MD_VALIDATE_RET( dst->md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( src->md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( dst->md_info == src->md_info );
 
     dst->md_info->clone_func( dst->md_ctx, src->md_ctx );
 
@@ -221,8 +226,8 @@
 
 int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac )
 {
-    if( md_info == NULL || ctx == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
 
     if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL )
         return( MBEDTLS_ERR_MD_ALLOC_FAILED );
@@ -244,24 +249,26 @@
 
 int mbedtls_md_starts( mbedtls_md_context_t *ctx )
 {
-    if( ctx == NULL || ctx->md_info == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->md_info != NULL );
 
     return( ctx->md_info->starts_func( ctx->md_ctx ) );
 }
 
 int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
 {
-    if( ctx == NULL || ctx->md_info == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( input != NULL );
 
     return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) );
 }
 
 int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
 {
-    if( ctx == NULL || ctx->md_info == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( output != NULL );
 
     return( ctx->md_info->finish_func( ctx->md_ctx, output ) );
 }
@@ -269,8 +276,8 @@
 int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
             unsigned char *output )
 {
-    if( md_info == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( output != NULL );
 
     return( md_info->digest_func( input, ilen, output ) );
 }
@@ -284,8 +291,9 @@
     mbedtls_md_context_t ctx;
     unsigned char buf[1024];
 
-    if( md_info == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( path != NULL );
+    MBEDTLS_MD_VALIDATE_RET( output != NULL );
 
     if( ( f = fopen( path, "rb" ) ) == NULL )
         return( MBEDTLS_ERR_MD_FILE_IO_ERROR );
@@ -323,8 +331,10 @@
     unsigned char *ipad, *opad;
     size_t i;
 
-    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->md_info  != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->hmac_ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( key != NULL );
 
     if( keylen > (size_t) ctx->md_info->block_size )
     {
@@ -365,8 +375,9 @@
 
 int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
 {
-    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->hmac_ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->md_info != NULL );
 
     return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) );
 }
@@ -377,8 +388,10 @@
     unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
     unsigned char *opad;
 
-    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->hmac_ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( output != NULL );
 
     opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
 
@@ -400,8 +413,9 @@
     int ret;
     unsigned char *ipad;
 
-    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->hmac_ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->md_info != NULL );
 
     ipad = (unsigned char *) ctx->hmac_ctx;
 
@@ -419,8 +433,9 @@
     mbedtls_md_context_t ctx;
     int ret;
 
-    if( md_info == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( md_info != NULL );
+    MBEDTLS_MD_VALIDATE_RET( key != NULL );
+    MBEDTLS_MD_VALIDATE_RET( output != NULL );
 
     mbedtls_md_init( &ctx );
 
@@ -442,32 +457,29 @@
 
 int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
 {
-    if( ctx == NULL || ctx->md_info == NULL )
-        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
+    MBEDTLS_MD_VALIDATE_RET( ctx != NULL );
+    MBEDTLS_MD_VALIDATE_RET( ctx->md_info != NULL );
 
     return( ctx->md_info->process_func( ctx->md_ctx, data ) );
 }
 
 unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info )
 {
-    if( md_info == NULL )
-        return( 0 );
+    MBEDTLS_INTERNAL_VALIDATE_RET( md_info != NULL, 0 );
 
     return md_info->size;
 }
 
 mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info )
 {
-    if( md_info == NULL )
-        return( MBEDTLS_MD_NONE );
+    MBEDTLS_INTERNAL_VALIDATE_RET( md_info != NULL, MBEDTLS_MD_NONE );
 
     return md_info->type;
 }
 
 const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info )
 {
-    if( md_info == NULL )
-        return( NULL );
+    MBEDTLS_MD_VALIDATE_RET_NULL( md_info != NULL );
 
     return md_info->name;
 }