Add RIPEMD-160 to the generic MD layer
diff --git a/library/md.c b/library/md.c
index af66756..291219d 100644
--- a/library/md.c
+++ b/library/md.c
@@ -55,6 +55,10 @@
         POLARSSL_MD_MD5,
 #endif
 
+#if defined(POLARSSL_RMD160_C)
+        POLARSSL_MD_RMD160,
+#endif
+
 #if defined(POLARSSL_SHA1_C)
         POLARSSL_MD_SHA1,
 #endif
@@ -95,6 +99,10 @@
     if( !strcasecmp( "MD5", md_name ) )
         return md_info_from_type( POLARSSL_MD_MD5 );
 #endif
+#if defined(POLARSSL_RMD160_C)
+    if( !strcasecmp( "RMD160", md_name ) )
+        return md_info_from_type( POLARSSL_MD_RMD160 );
+#endif
 #if defined(POLARSSL_SHA1_C)
     if( !strcasecmp( "SHA1", md_name ) || !strcasecmp( "SHA", md_name ) )
         return md_info_from_type( POLARSSL_MD_SHA1 );
@@ -130,6 +138,10 @@
         case POLARSSL_MD_MD5:
             return &md5_info;
 #endif
+#if defined(POLARSSL_RMD160_C)
+        case POLARSSL_MD_RMD160:
+            return &rmd160_info;
+#endif
 #if defined(POLARSSL_SHA1_C)
         case POLARSSL_MD_SHA1:
             return &sha1_info;
diff --git a/library/md_wrap.c b/library/md_wrap.c
index 038b132..bc159ba 100644
--- a/library/md_wrap.c
+++ b/library/md_wrap.c
@@ -45,6 +45,10 @@
 #include "polarssl/md5.h"
 #endif
 
+#if defined(POLARSSL_RMD160_C)
+#include "polarssl/rmd160.h"
+#endif
+
 #if defined(POLARSSL_SHA1_C)
 #include "polarssl/sha1.h"
 #endif
@@ -320,6 +324,90 @@
 
 #endif
 
+#if defined(POLARSSL_RMD160_C)
+
+static void rmd160_starts_wrap( void *ctx )
+{
+    rmd160_starts( (rmd160_context *) ctx );
+}
+
+static void rmd160_update_wrap( void *ctx, const unsigned char *input, size_t ilen )
+{
+    rmd160_update( (rmd160_context *) ctx, input, ilen );
+}
+
+static void rmd160_finish_wrap( void *ctx, unsigned char *output )
+{
+    rmd160_finish( (rmd160_context *) ctx, output );
+}
+
+static int rmd160_file_wrap( const char *path, unsigned char *output )
+{
+#if defined(POLARSSL_FS_IO)
+    return rmd160_file( path, output );
+#else
+    ((void) path);
+    ((void) output);
+    return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE;
+#endif
+}
+
+static void rmd160_hmac_starts_wrap( void *ctx, const unsigned char *key, size_t keylen )
+{
+    rmd160_hmac_starts( (rmd160_context *) ctx, key, keylen );
+}
+
+static void rmd160_hmac_update_wrap( void *ctx, const unsigned char *input, size_t ilen )
+{
+    rmd160_hmac_update( (rmd160_context *) ctx, input, ilen );
+}
+
+static void rmd160_hmac_finish_wrap( void *ctx, unsigned char *output )
+{
+    rmd160_hmac_finish( (rmd160_context *) ctx, output );
+}
+
+static void rmd160_hmac_reset_wrap( void *ctx )
+{
+    rmd160_hmac_reset( (rmd160_context *) ctx );
+}
+
+static void * rmd160_ctx_alloc( void )
+{
+    return polarssl_malloc( sizeof( rmd160_context ) );
+}
+
+static void rmd160_ctx_free( void *ctx )
+{
+    polarssl_free( ctx );
+}
+
+static void rmd160_process_wrap( void *ctx, const unsigned char *data )
+{
+    rmd160_process( (rmd160_context *) ctx, data );
+}
+
+const md_info_t rmd160_info = {
+    POLARSSL_MD_RMD160,
+    "RMD160",
+    20,
+    rmd160_starts_wrap,
+    rmd160_update_wrap,
+    rmd160_finish_wrap,
+    rmd160,
+    rmd160_file_wrap,
+    rmd160_hmac_starts_wrap,
+    rmd160_hmac_update_wrap,
+    rmd160_hmac_finish_wrap,
+    rmd160_hmac_reset_wrap,
+    rmd160_hmac,
+    rmd160_ctx_alloc,
+    rmd160_ctx_free,
+    rmd160_process_wrap,
+};
+
+#endif
+
 #if defined(POLARSSL_SHA1_C)
 
 static void sha1_starts_wrap( void *ctx )
diff --git a/library/rmd160.c b/library/rmd160.c
index 515ed1c..5dadb3a 100644
--- a/library/rmd160.c
+++ b/library/rmd160.c
@@ -81,6 +81,9 @@
     ctx->state[4] = 0xC3D2E1F0;
 }
 
+/*
+ * Process one block
+ */
 void rmd160_process( rmd160_context *ctx, const unsigned char data[64] )
 {
     uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];