Use new HMAC_DRBG module for deterministic ECDSA
diff --git a/include/polarssl/config.h b/include/polarssl/config.h
index a124720..7b08bbc 100644
--- a/include/polarssl/config.h
+++ b/include/polarssl/config.h
@@ -290,7 +290,7 @@
  * may result in a compromise of the long-term signing key. This is avoided by
  * the deterministic variant.
  *
- * Requires: POLARSSL_MD_C
+ * Requires: POLARSSL_HMAC_DRBG_C
  *
  * Comment this macro to disable deterministic ECDSA.
  */
@@ -1976,7 +1976,7 @@
 #error "POLARSSL_ECDSA_C defined, but not all prerequisites"
 #endif
 
-#if defined(POLARSSL_ECDSA_DETERMINISTIC) && !defined(POLARSSL_MD_C)
+#if defined(POLARSSL_ECDSA_DETERMINISTIC) && !defined(POLARSSL_HMAC_DRBG_C)
 #error "POLARSSL_ECDSA_DETERMINISTIC defined, but not all prerequisites"
 #endif
 
diff --git a/library/ecdsa.c b/library/ecdsa.c
index b208755..92f6eef 100644
--- a/library/ecdsa.c
+++ b/library/ecdsa.c
@@ -37,101 +37,10 @@
 #include "polarssl/asn1write.h"
 
 #if defined(POLARSSL_ECDSA_DETERMINISTIC)
-/*
- * Simplified HMAC_DRBG context.
- * No reseed counter, no prediction resistance flag.
- */
-typedef struct
-{
-    md_context_t md_ctx;
-    unsigned char V[POLARSSL_MD_MAX_SIZE];
-    unsigned char K[POLARSSL_MD_MAX_SIZE];
-} hmac_drbg_context;
+#include "polarssl/hmac_drbg.h"
+#endif
 
-/*
- * Simplified HMAC_DRBG update, using optional additional data
- */
-static void hmac_drbg_update( hmac_drbg_context *ctx,
-                              const unsigned char *data, size_t data_len )
-{
-    size_t md_len = ctx->md_ctx.md_info->size;
-    unsigned char rounds = ( data != NULL && data_len != 0 ) ? 2 : 1;
-    unsigned char sep[1];
-
-    for( sep[0] = 0; sep[0] < rounds; sep[0]++ )
-    {
-        md_hmac_starts( &ctx->md_ctx, ctx->K, md_len );
-        md_hmac_update( &ctx->md_ctx, ctx->V, md_len );
-        md_hmac_update( &ctx->md_ctx, sep, 1 );
-        if( rounds == 2 )
-            md_hmac_update( &ctx->md_ctx, data, data_len );
-        md_hmac_finish( &ctx->md_ctx, ctx->K );
-
-        md_hmac_starts( &ctx->md_ctx, ctx->K, md_len );
-        md_hmac_update( &ctx->md_ctx, ctx->V, md_len );
-        md_hmac_finish( &ctx->md_ctx, ctx->V );
-    }
-}
-
-/*
- * Simplified HMAC_DRBG initialisation.
- *
- * Uses an entropy buffer rather than callback,
- * assume personalisation string is included in entropy buffer,
- * assumes md_info is not NULL and valid.
- */
-static void hmac_drbg_init( hmac_drbg_context *ctx,
-                            const md_info_t * md_info,
-                            const unsigned char *data, size_t data_len )
-{
-    memset( ctx, 0, sizeof( hmac_drbg_context ) );
-    md_init_ctx( &ctx->md_ctx, md_info );
-
-    memset( ctx->V, 0x01, md_info->size );
-    /* ctx->K is already 0 */
-
-    hmac_drbg_update( ctx, data, data_len );
-}
-
-/*
- * Simplified HMAC_DRBG random function
- */
-static int hmac_drbg_random( void *state,
-                             unsigned char *output, size_t out_len )
-{
-    hmac_drbg_context *ctx = (hmac_drbg_context *) state;
-    size_t md_len = ctx->md_ctx.md_info->size;
-    size_t left = out_len;
-    unsigned char *out = output;
-
-    while( left != 0 )
-    {
-        size_t use_len = left > md_len ? md_len : left;
-
-        md_hmac_starts( &ctx->md_ctx, ctx->K, md_len );
-        md_hmac_update( &ctx->md_ctx, ctx->V, md_len );
-        md_hmac_finish( &ctx->md_ctx, ctx->V );
-
-        memcpy( out, ctx->V, use_len );
-        out += use_len;
-        left -= use_len;
-    }
-
-    hmac_drbg_update( ctx, NULL, 0 );
-
-    return( 0 );
-}
-
-static void hmac_drbg_free( hmac_drbg_context *ctx )
-{
-    if( ctx == NULL )
-        return;
-
-    md_free_ctx( &ctx->md_ctx );
-
-    memset( ctx, 0, sizeof( hmac_drbg_context ) );
-}
-
+#if defined(POLARSSL_ECDSA_DETERMINISTIC)
 /*
  * This a hopefully temporary compatibility function.
  *