MD: Embed digest context structure into MD wrapper context
diff --git a/library/md.c b/library/md.c
index 5e9c5b4..accf301 100644
--- a/library/md.c
+++ b/library/md.c
@@ -388,6 +388,11 @@
 void mbedtls_md_init( mbedtls_md_context_t *ctx )
 {
     memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
+
+#if defined(MBEDTLS_MD_SINGLE_HASH)
+    mbedtls_md_info_init( mbedtls_md_get_handle( ctx ),
+                          ctx->md_ctx );
+#endif
 }
 
 void mbedtls_md_free( mbedtls_md_context_t *ctx )
@@ -395,6 +400,7 @@
     if( ctx == NULL || mbedtls_md_get_handle( ctx ) == MBEDTLS_MD_INVALID_HANDLE )
         return;
 
+#if !defined(MBEDTLS_MD_SINGLE_HASH)
     if( ctx->md_ctx != NULL )
     {
         mbedtls_md_info_ctx_free( mbedtls_md_get_handle( ctx ), ctx->md_ctx );
@@ -406,6 +412,7 @@
             2 * mbedtls_md_info_block_size( mbedtls_md_get_handle( ctx ) ) );
         mbedtls_free( ctx->hmac_ctx );
     }
+#endif /* MBEDTLS_MD_SINGLE_HASH */
 
     mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) );
 }
@@ -437,6 +444,7 @@
     if( md_info == MBEDTLS_MD_INVALID_HANDLE || ctx == NULL )
         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
 
+#if !defined(MBEDTLS_MD_SINGLE_HASH)
     ctx->md_ctx = mbedtls_md_info_ctx_alloc( md_info );
     if( ctx->md_ctx == NULL )
         return( MBEDTLS_ERR_MD_ALLOC_FAILED );
@@ -452,8 +460,9 @@
         }
     }
 
-#if !defined(MBEDTLS_MD_SINGLE_HASH)
     ctx->md_info = md_info;
+#else
+    ((void) hmac);
 #endif
 
     return( 0 );