diff --git a/sha1.c b/sha1.c
index c04ab7756eb1823ea95cd414d9cfb8b3a7ffee14..a9c9ec127a5870e6d302fe63e03e311bfa70f1c2 100644
--- a/sha1.c
+++ b/sha1.c
@@ -49,117 +49,36 @@
 #include "macros.h"
 #include "nettle-write.h"
 
-/* A block, treated as a sequence of 32-bit words. */
-#define SHA1_DATA_LENGTH 16
-
-/* SHA initial values */
-
-#define h0init  0x67452301L
-#define h1init  0xEFCDAB89L
-#define h2init  0x98BADCFEL
-#define h3init  0x10325476L
-#define h4init  0xC3D2E1F0L
-
 /* Initialize the SHA values */
-
 void
 sha1_init(struct sha1_ctx *ctx)
 {
-  /* Set the h-vars to their initial values */
-  ctx->digest[ 0 ] = h0init;
-  ctx->digest[ 1 ] = h1init;
-  ctx->digest[ 2 ] = h2init;
-  ctx->digest[ 3 ] = h3init;
-  ctx->digest[ 4 ] = h4init;
-
-  /* Initialize bit count */
+  /* FIXME: Put the buffer last in the struct, and arrange so that we
+     can initialize with a single memcpy. */
+  static const uint32_t iv[_SHA1_DIGEST_LENGTH] = 
+    {
+      /* SHA initial values */
+      0x67452301L,
+      0xEFCDAB89L,
+      0x98BADCFEL,
+      0x10325476L,
+      0xC3D2E1F0L,
+    };
+
+  memcpy(ctx->state, iv, sizeof(ctx->state));
   ctx->count_low = ctx->count_high = 0;
   
   /* Initialize buffer */
   ctx->index = 0;
 }
 
-#define SHA1_INCR(ctx) ((ctx)->count_high += !++(ctx)->count_low)
-
 void
 sha1_update(struct sha1_ctx *ctx,
-	    unsigned length, const uint8_t *buffer)
+	    unsigned length, const uint8_t *data)
 {
-  if (ctx->index)
-    { /* Try to fill partial block */
-      unsigned left = SHA1_DATA_SIZE - ctx->index;
-      if (length < left)
-	{
-	  memcpy(ctx->block + ctx->index, buffer, length);
-	  ctx->index += length;
-	  return; /* Finished */
-	}
-      else
-	{
-	  memcpy(ctx->block + ctx->index, buffer, left);
-
-	  _nettle_sha1_compress(ctx->digest, ctx->block);
-	  SHA1_INCR(ctx);
-
-	  buffer += left;
-	  length -= left;
-	}
-    }
-  while (length >= SHA1_DATA_SIZE)
-    {
-      _nettle_sha1_compress(ctx->digest, buffer);
-      SHA1_INCR(ctx);
-
-      buffer += SHA1_DATA_SIZE;
-      length -= SHA1_DATA_SIZE;
-    }
-  if ((ctx->index = length))     /* This assignment is intended */
-    /* Buffer leftovers */
-    memcpy(ctx->block, buffer, length);
+  MD_UPDATE (ctx, length, data, _nettle_sha1_compress);
 }
 	  
-/* Final wrapup - pad to SHA1_DATA_SIZE-byte boundary with the bit pattern
-   1 0* (64-bit count of bits processed, MSB-first) */
-
-static void
-sha1_final(struct sha1_ctx *ctx)
-{
-  uint32_t bitcount_high;
-  uint32_t bitcount_low;
-  unsigned i;
-  
-  i = ctx->index;
-  
-  /* Set the first char of padding to 0x80.  This is safe since there is
-     always at least one byte free */
-
-  assert(i < SHA1_DATA_SIZE);
-  ctx->block[i++] = 0x80;
-
-  if (i > (SHA1_DATA_SIZE - 8))
-    { /* No room for length in this block. Process it and
-	 pad with another one */
-      memset(ctx->block + i, 0, SHA1_DATA_SIZE - i);
-      
-      _nettle_sha1_compress(ctx->digest, ctx->block);
-      i = 0;
-    }
-  if (i < (SHA1_DATA_SIZE - 8))
-    memset(ctx->block + i, 0, (SHA1_DATA_SIZE - 8) - i);
-
-  /* There are 512 = 2^9 bits in one block */  
-  bitcount_high = (ctx->count_high << 9) | (ctx->count_low >> 23);
-  bitcount_low = (ctx->count_low << 9) | (ctx->index << 3);
-
-  /* This is slightly inefficient, as the numbers are converted to
-     big-endian format, and will be converted back by the compression
-     function. It's probably not worth the effort to fix this. */
-  WRITE_UINT32(ctx->block + (SHA1_DATA_SIZE - 8), bitcount_high);
-  WRITE_UINT32(ctx->block + (SHA1_DATA_SIZE - 4), bitcount_low);
-
-  _nettle_sha1_compress(ctx->digest, ctx->block);
-}
-
 void
 sha1_digest(struct sha1_ctx *ctx,
 	    unsigned length,
@@ -167,7 +86,8 @@ sha1_digest(struct sha1_ctx *ctx,
 {
   assert(length <= SHA1_DIGEST_SIZE);
 
-  sha1_final(ctx);
-  _nettle_write_be32(length, digest, ctx->digest);
+  /* There are 512 = 2^9 bits in one block */  
+  MD_FINAL(ctx, 32, 9, _nettle_sha1_compress, WRITE_UINT32);
+  _nettle_write_be32(length, digest, ctx->state);
   sha1_init(ctx);
 }