diff --git a/library/md.c b/library/md.c
new file mode 100644
index 0000000..143efa5
--- /dev/null
+++ b/library/md.c
@@ -0,0 +1,475 @@
+/**
+ * \file mbedcrypto_md.c
+ *
+ * \brief Generic message digest wrapper for Mbed Crypto
+ *
+ * \author Adriaan de Jong <dejong@fox-it.com>
+ *
+ *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
+ *  SPDX-License-Identifier: Apache-2.0
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License"); you may
+ *  not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  This file is part of Mbed Crypto (https://tls.mbed.org)
+ */
+
+#if !defined(MBEDCRYPTO_CONFIG_FILE)
+#include "mbedcrypto/config.h"
+#else
+#include MBEDCRYPTO_CONFIG_FILE
+#endif
+
+#if defined(MBEDCRYPTO_MD_C)
+
+#include "mbedcrypto/md.h"
+#include "mbedcrypto/md_internal.h"
+#include "mbedcrypto/platform_util.h"
+
+#if defined(MBEDCRYPTO_PLATFORM_C)
+#include "mbedcrypto/platform.h"
+#else
+#include <stdlib.h>
+#define mbedcrypto_calloc    calloc
+#define mbedcrypto_free       free
+#endif
+
+#include <string.h>
+
+#if defined(MBEDCRYPTO_FS_IO)
+#include <stdio.h>
+#endif
+
+/*
+ * Reminder: update profiles in x509_crt.c when adding a new hash!
+ */
+static const int supported_digests[] = {
+
+#if defined(MBEDCRYPTO_SHA512_C)
+        MBEDCRYPTO_MD_SHA512,
+        MBEDCRYPTO_MD_SHA384,
+#endif
+
+#if defined(MBEDCRYPTO_SHA256_C)
+        MBEDCRYPTO_MD_SHA256,
+        MBEDCRYPTO_MD_SHA224,
+#endif
+
+#if defined(MBEDCRYPTO_SHA1_C)
+        MBEDCRYPTO_MD_SHA1,
+#endif
+
+#if defined(MBEDCRYPTO_RIPEMD160_C)
+        MBEDCRYPTO_MD_RIPEMD160,
+#endif
+
+#if defined(MBEDCRYPTO_MD5_C)
+        MBEDCRYPTO_MD_MD5,
+#endif
+
+#if defined(MBEDCRYPTO_MD4_C)
+        MBEDCRYPTO_MD_MD4,
+#endif
+
+#if defined(MBEDCRYPTO_MD2_C)
+        MBEDCRYPTO_MD_MD2,
+#endif
+
+        MBEDCRYPTO_MD_NONE
+};
+
+const int *mbedcrypto_md_list( void )
+{
+    return( supported_digests );
+}
+
+const mbedcrypto_md_info_t *mbedcrypto_md_info_from_string( const char *md_name )
+{
+    if( NULL == md_name )
+        return( NULL );
+
+    /* Get the appropriate digest information */
+#if defined(MBEDCRYPTO_MD2_C)
+    if( !strcmp( "MD2", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_MD2 );
+#endif
+#if defined(MBEDCRYPTO_MD4_C)
+    if( !strcmp( "MD4", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_MD4 );
+#endif
+#if defined(MBEDCRYPTO_MD5_C)
+    if( !strcmp( "MD5", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_MD5 );
+#endif
+#if defined(MBEDCRYPTO_RIPEMD160_C)
+    if( !strcmp( "RIPEMD160", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_RIPEMD160 );
+#endif
+#if defined(MBEDCRYPTO_SHA1_C)
+    if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_SHA1 );
+#endif
+#if defined(MBEDCRYPTO_SHA256_C)
+    if( !strcmp( "SHA224", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_SHA224 );
+    if( !strcmp( "SHA256", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_SHA256 );
+#endif
+#if defined(MBEDCRYPTO_SHA512_C)
+    if( !strcmp( "SHA384", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_SHA384 );
+    if( !strcmp( "SHA512", md_name ) )
+        return mbedcrypto_md_info_from_type( MBEDCRYPTO_MD_SHA512 );
+#endif
+    return( NULL );
+}
+
+const mbedcrypto_md_info_t *mbedcrypto_md_info_from_type( mbedcrypto_md_type_t md_type )
+{
+    switch( md_type )
+    {
+#if defined(MBEDCRYPTO_MD2_C)
+        case MBEDCRYPTO_MD_MD2:
+            return( &mbedcrypto_md2_info );
+#endif
+#if defined(MBEDCRYPTO_MD4_C)
+        case MBEDCRYPTO_MD_MD4:
+            return( &mbedcrypto_md4_info );
+#endif
+#if defined(MBEDCRYPTO_MD5_C)
+        case MBEDCRYPTO_MD_MD5:
+            return( &mbedcrypto_md5_info );
+#endif
+#if defined(MBEDCRYPTO_RIPEMD160_C)
+        case MBEDCRYPTO_MD_RIPEMD160:
+            return( &mbedcrypto_ripemd160_info );
+#endif
+#if defined(MBEDCRYPTO_SHA1_C)
+        case MBEDCRYPTO_MD_SHA1:
+            return( &mbedcrypto_sha1_info );
+#endif
+#if defined(MBEDCRYPTO_SHA256_C)
+        case MBEDCRYPTO_MD_SHA224:
+            return( &mbedcrypto_sha224_info );
+        case MBEDCRYPTO_MD_SHA256:
+            return( &mbedcrypto_sha256_info );
+#endif
+#if defined(MBEDCRYPTO_SHA512_C)
+        case MBEDCRYPTO_MD_SHA384:
+            return( &mbedcrypto_sha384_info );
+        case MBEDCRYPTO_MD_SHA512:
+            return( &mbedcrypto_sha512_info );
+#endif
+        default:
+            return( NULL );
+    }
+}
+
+void mbedcrypto_md_init( mbedcrypto_md_context_t *ctx )
+{
+    memset( ctx, 0, sizeof( mbedcrypto_md_context_t ) );
+}
+
+void mbedcrypto_md_free( mbedcrypto_md_context_t *ctx )
+{
+    if( ctx == NULL || ctx->md_info == NULL )
+        return;
+
+    if( ctx->md_ctx != NULL )
+        ctx->md_info->ctx_free_func( ctx->md_ctx );
+
+    if( ctx->hmac_ctx != NULL )
+    {
+        mbedcrypto_platform_zeroize( ctx->hmac_ctx,
+                                  2 * ctx->md_info->block_size );
+        mbedcrypto_free( ctx->hmac_ctx );
+    }
+
+    mbedcrypto_platform_zeroize( ctx, sizeof( mbedcrypto_md_context_t ) );
+}
+
+int mbedcrypto_md_clone( mbedcrypto_md_context_t *dst,
+                      const mbedcrypto_md_context_t *src )
+{
+    if( dst == NULL || dst->md_info == NULL ||
+        src == NULL || src->md_info == NULL ||
+        dst->md_info != src->md_info )
+    {
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+    }
+
+    dst->md_info->clone_func( dst->md_ctx, src->md_ctx );
+
+    return( 0 );
+}
+
+#if ! defined(MBEDCRYPTO_DEPRECATED_REMOVED)
+int mbedcrypto_md_init_ctx( mbedcrypto_md_context_t *ctx, const mbedcrypto_md_info_t *md_info )
+{
+    return mbedcrypto_md_setup( ctx, md_info, 1 );
+}
+#endif
+
+int mbedcrypto_md_setup( mbedcrypto_md_context_t *ctx, const mbedcrypto_md_info_t *md_info, int hmac )
+{
+    if( md_info == NULL || ctx == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL )
+        return( MBEDCRYPTO_ERR_MD_ALLOC_FAILED );
+
+    if( hmac != 0 )
+    {
+        ctx->hmac_ctx = mbedcrypto_calloc( 2, md_info->block_size );
+        if( ctx->hmac_ctx == NULL )
+        {
+            md_info->ctx_free_func( ctx->md_ctx );
+            return( MBEDCRYPTO_ERR_MD_ALLOC_FAILED );
+        }
+    }
+
+    ctx->md_info = md_info;
+
+    return( 0 );
+}
+
+int mbedcrypto_md_starts( mbedcrypto_md_context_t *ctx )
+{
+    if( ctx == NULL || ctx->md_info == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    return( ctx->md_info->starts_func( ctx->md_ctx ) );
+}
+
+int mbedcrypto_md_update( mbedcrypto_md_context_t *ctx, const unsigned char *input, size_t ilen )
+{
+    if( ctx == NULL || ctx->md_info == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) );
+}
+
+int mbedcrypto_md_finish( mbedcrypto_md_context_t *ctx, unsigned char *output )
+{
+    if( ctx == NULL || ctx->md_info == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    return( ctx->md_info->finish_func( ctx->md_ctx, output ) );
+}
+
+int mbedcrypto_md( const mbedcrypto_md_info_t *md_info, const unsigned char *input, size_t ilen,
+            unsigned char *output )
+{
+    if( md_info == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    return( md_info->digest_func( input, ilen, output ) );
+}
+
+#if defined(MBEDCRYPTO_FS_IO)
+int mbedcrypto_md_file( const mbedcrypto_md_info_t *md_info, const char *path, unsigned char *output )
+{
+    int ret;
+    FILE *f;
+    size_t n;
+    mbedcrypto_md_context_t ctx;
+    unsigned char buf[1024];
+
+    if( md_info == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    if( ( f = fopen( path, "rb" ) ) == NULL )
+        return( MBEDCRYPTO_ERR_MD_FILE_IO_ERROR );
+
+    mbedcrypto_md_init( &ctx );
+
+    if( ( ret = mbedcrypto_md_setup( &ctx, md_info, 0 ) ) != 0 )
+        goto cleanup;
+
+    if( ( ret = md_info->starts_func( ctx.md_ctx ) ) != 0 )
+        goto cleanup;
+
+    while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
+        if( ( ret = md_info->update_func( ctx.md_ctx, buf, n ) ) != 0 )
+            goto cleanup;
+
+    if( ferror( f ) != 0 )
+        ret = MBEDCRYPTO_ERR_MD_FILE_IO_ERROR;
+    else
+        ret = md_info->finish_func( ctx.md_ctx, output );
+
+cleanup:
+    mbedcrypto_platform_zeroize( buf, sizeof( buf ) );
+    fclose( f );
+    mbedcrypto_md_free( &ctx );
+
+    return( ret );
+}
+#endif /* MBEDCRYPTO_FS_IO */
+
+int mbedcrypto_md_hmac_starts( mbedcrypto_md_context_t *ctx, const unsigned char *key, size_t keylen )
+{
+    int ret;
+    unsigned char sum[MBEDCRYPTO_MD_MAX_SIZE];
+    unsigned char *ipad, *opad;
+    size_t i;
+
+    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    if( keylen > (size_t) ctx->md_info->block_size )
+    {
+        if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
+            goto cleanup;
+        if( ( ret = ctx->md_info->update_func( ctx->md_ctx, key, keylen ) ) != 0 )
+            goto cleanup;
+        if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, sum ) ) != 0 )
+            goto cleanup;
+
+        keylen = ctx->md_info->size;
+        key = sum;
+    }
+
+    ipad = (unsigned char *) ctx->hmac_ctx;
+    opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
+
+    memset( ipad, 0x36, ctx->md_info->block_size );
+    memset( opad, 0x5C, ctx->md_info->block_size );
+
+    for( i = 0; i < keylen; i++ )
+    {
+        ipad[i] = (unsigned char)( ipad[i] ^ key[i] );
+        opad[i] = (unsigned char)( opad[i] ^ key[i] );
+    }
+
+    if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
+        goto cleanup;
+    if( ( ret = ctx->md_info->update_func( ctx->md_ctx, ipad,
+                                           ctx->md_info->block_size ) ) != 0 )
+        goto cleanup;
+
+cleanup:
+    mbedcrypto_platform_zeroize( sum, sizeof( sum ) );
+
+    return( ret );
+}
+
+int mbedcrypto_md_hmac_update( mbedcrypto_md_context_t *ctx, const unsigned char *input, size_t ilen )
+{
+    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) );
+}
+
+int mbedcrypto_md_hmac_finish( mbedcrypto_md_context_t *ctx, unsigned char *output )
+{
+    int ret;
+    unsigned char tmp[MBEDCRYPTO_MD_MAX_SIZE];
+    unsigned char *opad;
+
+    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
+
+    if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, tmp ) ) != 0 )
+        return( ret );
+    if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
+        return( ret );
+    if( ( ret = ctx->md_info->update_func( ctx->md_ctx, opad,
+                                           ctx->md_info->block_size ) ) != 0 )
+        return( ret );
+    if( ( ret = ctx->md_info->update_func( ctx->md_ctx, tmp,
+                                           ctx->md_info->size ) ) != 0 )
+        return( ret );
+    return( ctx->md_info->finish_func( ctx->md_ctx, output ) );
+}
+
+int mbedcrypto_md_hmac_reset( mbedcrypto_md_context_t *ctx )
+{
+    int ret;
+    unsigned char *ipad;
+
+    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    ipad = (unsigned char *) ctx->hmac_ctx;
+
+    if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 )
+        return( ret );
+    return( ctx->md_info->update_func( ctx->md_ctx, ipad,
+                                       ctx->md_info->block_size ) );
+}
+
+int mbedcrypto_md_hmac( const mbedcrypto_md_info_t *md_info,
+                     const unsigned char *key, size_t keylen,
+                     const unsigned char *input, size_t ilen,
+                     unsigned char *output )
+{
+    mbedcrypto_md_context_t ctx;
+    int ret;
+
+    if( md_info == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    mbedcrypto_md_init( &ctx );
+
+    if( ( ret = mbedcrypto_md_setup( &ctx, md_info, 1 ) ) != 0 )
+        goto cleanup;
+
+    if( ( ret = mbedcrypto_md_hmac_starts( &ctx, key, keylen ) ) != 0 )
+        goto cleanup;
+    if( ( ret = mbedcrypto_md_hmac_update( &ctx, input, ilen ) ) != 0 )
+        goto cleanup;
+    if( ( ret = mbedcrypto_md_hmac_finish( &ctx, output ) ) != 0 )
+        goto cleanup;
+
+cleanup:
+    mbedcrypto_md_free( &ctx );
+
+    return( ret );
+}
+
+int mbedcrypto_md_process( mbedcrypto_md_context_t *ctx, const unsigned char *data )
+{
+    if( ctx == NULL || ctx->md_info == NULL )
+        return( MBEDCRYPTO_ERR_MD_BAD_INPUT_DATA );
+
+    return( ctx->md_info->process_func( ctx->md_ctx, data ) );
+}
+
+unsigned char mbedcrypto_md_get_size( const mbedcrypto_md_info_t *md_info )
+{
+    if( md_info == NULL )
+        return( 0 );
+
+    return md_info->size;
+}
+
+mbedcrypto_md_type_t mbedcrypto_md_get_type( const mbedcrypto_md_info_t *md_info )
+{
+    if( md_info == NULL )
+        return( MBEDCRYPTO_MD_NONE );
+
+    return md_info->type;
+}
+
+const char *mbedcrypto_md_get_name( const mbedcrypto_md_info_t *md_info )
+{
+    if( md_info == NULL )
+        return( NULL );
+
+    return md_info->name;
+}
+
+#endif /* MBEDCRYPTO_MD_C */
