Add HMAC support to RIPEMD-160
diff --git a/include/polarssl/rmd160.h b/include/polarssl/rmd160.h
index 5d6c6b7..c8fe119 100644
--- a/include/polarssl/rmd160.h
+++ b/include/polarssl/rmd160.h
@@ -52,6 +52,9 @@
     uint32_t total[2];          /*!< number of bytes processed  */
     uint32_t state[5];          /*!< intermediate digest state  */
     unsigned char buffer[64];   /*!< data block being processed */
+
+    unsigned char ipad[64];     /*!< HMAC: inner padding        */
+    unsigned char opad[64];     /*!< HMAC: outer padding        */
 }
 rmd160_context;
 
@@ -78,7 +81,7 @@
  * \param ctx      RMD160 context
  * \param output   RMD160 checksum result
  */
-void rmd160_finish( rmd160_context *ctx, unsigned char output[16] );
+void rmd160_finish( rmd160_context *ctx, unsigned char output[20] );
 
 /**
  * \brief          Output = RMD160( input buffer )
@@ -88,7 +91,7 @@
  * \param output   RMD160 checksum result
  */
 void rmd160( const unsigned char *input, size_t ilen,
-             unsigned char output[16] );
+             unsigned char output[20] );
 
 #if defined(POLARSSL_FS_IO)
 /**
@@ -99,9 +102,56 @@
  *
  * \return         0 if successful, or POLARSSL_ERR_RMD160_FILE_IO_ERROR
  */
-int rmd160_file( const char *path, unsigned char output[16] );
+int rmd160_file( const char *path, unsigned char output[20] );
 #endif /* POLARSSL_FS_IO */
 
+/**
+ * \brief          RMD160 HMAC context setup
+ *
+ * \param ctx      HMAC context to be initialized
+ * \param key      HMAC secret key
+ * \param keylen   length of the HMAC key
+ */
+void rmd160_hmac_starts( rmd160_context *ctx,
+                         const unsigned char *key, size_t keylen );
+
+/**
+ * \brief          RMD160 HMAC process buffer
+ *
+ * \param ctx      HMAC context
+ * \param input    buffer holding the  data
+ * \param ilen     length of the input data
+ */
+void rmd160_hmac_update( rmd160_context *ctx,
+                         const unsigned char *input, size_t ilen );
+
+/**
+ * \brief          RMD160 HMAC final digest
+ *
+ * \param ctx      HMAC context
+ * \param output   RMD160 HMAC checksum result
+ */
+void rmd160_hmac_finish( rmd160_context *ctx, unsigned char output[20] );
+
+/**
+ * \brief          RMD160 HMAC context reset
+ *
+ * \param ctx      HMAC context to be reset
+ */
+void rmd160_hmac_reset( rmd160_context *ctx );
+
+/**
+ * \brief          Output = HMAC-RMD160( hmac key, input buffer )
+ *
+ * \param key      HMAC secret key
+ * \param keylen   length of the HMAC key
+ * \param input    buffer holding the  data
+ * \param ilen     length of the input data
+ * \param output   HMAC-RMD160 result
+ */
+void rmd160_hmac( const unsigned char *key, size_t keylen,
+                  const unsigned char *input, size_t ilen,
+                  unsigned char output[20] );
 
 /**
  * \brief          Checkup routine