Added mk_MD5File() helper function
authorSteve McIntyre <steve@einval.com>
Thu, 26 May 2005 23:30:08 +0000 (23:30 +0000)
committerSteve McIntyre <steve@einval.com>
Thu, 26 May 2005 23:30:08 +0000 (23:30 +0000)
md5.c
md5.h

diff --git a/md5.c b/md5.c
index 7f6bd3e..ff2e5d4 100644 (file)
--- a/md5.c
+++ b/md5.c
 
 #include <string.h>    /* for memcpy() and memset() */
 #include <stdlib.h> /* for calloc() */
+#include <stdio.h>
+#include <errno.h>
+
+#define BUF_SIZE 65536
 
 #include "md5.h"
 
@@ -292,6 +296,45 @@ mk_MD5Transform (buf, inraw)
 }
 #endif
 
+int mk_MD5File(char *filename, unsigned char digest[16])
+{
+    int error = 0;
+    FILE *input_file = NULL;
+    unsigned char buf[BUF_SIZE];
+    int num_read = 0;
+    struct mk_MD5Context file_context;
+
+    input_file = fopen(filename, "rb");
+    if (!input_file)
+        return errno;
+
+    mk_MD5Init(&file_context);
+
+    do
+    {
+        num_read = fread(buf, 1, BUF_SIZE, input_file);
+        switch (num_read)
+        {
+            case -1:
+                /* error */
+                fclose(input_file);
+                return errno;
+            case 0:
+                /* we're finished */
+                break;
+            default:
+                mk_MD5Update(&file_context, buf, num_read);
+                break;
+        }
+    } while (num_read);
+
+    fclose(input_file);
+
+    mk_MD5Final(digest, &file_context);
+    
+    return error;
+}
+
 char *base64_dump(unsigned char *buf, size_t buf_size)
 {
     const char *b64_enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
diff --git a/md5.h b/md5.h
index 05a7f57..6ff4032 100644 (file)
--- a/md5.h
+++ b/md5.h
@@ -22,6 +22,7 @@ void mk_MD5Update (struct mk_MD5Context *context,
 void mk_MD5Final (unsigned char digest[16],
                          struct mk_MD5Context *context);
 void mk_MD5Transform (mk_uint32 buf[4], const unsigned char in[64]);
+int  mk_MD5File(char *filename, unsigned char digest[16]);
 
 char *base64_dump(unsigned char *buf, size_t buf_size);