Added base64_dump() helper function
authorSteve McIntyre <steve@einval.com>
Sun, 13 Mar 2005 22:22:52 +0000 (22:22 +0000)
committerSteve McIntyre <steve@einval.com>
Sun, 13 Mar 2005 22:22:52 +0000 (22:22 +0000)
md5.c
md5.h

diff --git a/md5.c b/md5.c
index ee01182..a0cbc3a 100644 (file)
--- a/md5.c
+++ b/md5.c
@@ -36,6 +36,7 @@
 #endif
 
 #include <string.h>    /* for memcpy() and memset() */
+#include <stdlib.h> /* for calloc() */
 
 #include "md5.h"
 
@@ -291,6 +292,36 @@ mk_MD5Transform (buf, inraw)
 }
 #endif
 
+char *base64_dump(unsigned char *buf, size_t buf_size)
+{
+    const char *b64_enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+    int value = 0;
+    unsigned int i;
+    int bits = 0;
+    char *out = calloc(1, 30);
+    unsigned int out_pos = 0;
+
+    if (!out)
+        return NULL;
+
+    for (i = 0; i < buf_size ; i++)
+    {
+        value = (value << 8) | buf[i];
+        bits += 2;
+        out[out_pos++] = b64_enc[(value >> bits) & 63U];
+        if (bits >= 8) {
+            bits -= 6;
+            out[out_pos++] = b64_enc[(value >> bits) & 63U];
+        }
+    }
+    if (bits > 0)
+    {
+        value <<= 8 - bits;
+        out[out_pos++] = b64_enc[(value >> bits) & 63U];
+    }
+    return out;
+}
+
 #ifdef TEST
 /* Simple test program.  Can use it to manually run the tests from
    RFC1321 for example.  */
diff --git a/md5.h b/md5.h
index 6c57445..05a7f57 100644 (file)
--- a/md5.h
+++ b/md5.h
@@ -23,4 +23,6 @@ void mk_MD5Final (unsigned char digest[16],
                          struct mk_MD5Context *context);
 void mk_MD5Transform (mk_uint32 buf[4], const unsigned char in[64]);
 
+char *base64_dump(unsigned char *buf, size_t buf_size);
+
 #endif /* !MD5_H */