diff --git a/src/ChangeLog b/src/ChangeLog
index 0e2a8504..f9f4b4f1 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2005-04-23  Hrvoje Niksic  <hniksic@xemacs.org>
+
+	* utils.c (base64_encode): Treat input as unsigned chars.
+	Required for correct encoding of binary stuff.
+
 2005-04-23  Hrvoje Niksic  <hniksic@xemacs.org>
 
 	* http-ntlm.c: Format the function definitions in an
diff --git a/src/utils.c b/src/utils.c
index 0692bcb3..38700e04 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1825,7 +1825,7 @@ xsleep (double seconds)
 
 #endif /* not WINDOWS */
 
-/* Encode the string S of length LENGTH to base64 format and place it
+/* Encode the string STR of length LENGTH to base64 format and place it
    to B64STORE.  The output will be \0-terminated, and must point to a
    writable buffer of at least 1+BASE64_LENGTH(length) bytes.  It
    returns the length of the resulting base64 data, not counting the
@@ -1835,7 +1835,7 @@ xsleep (double seconds)
    base64 data.  */
 
 int
-base64_encode (const char *s, int length, char *b64store)
+base64_encode (const char *str, int length, char *b64store)
 {
   /* Conversion table.  */
   static char tbl[64] = {
@@ -1849,7 +1849,8 @@ base64_encode (const char *s, int length, char *b64store)
     '4','5','6','7','8','9','+','/'
   };
   int i;
-  unsigned char *p = (unsigned char *) b64store;
+  const unsigned char *s = (const unsigned char *) str;
+  char *p = b64store;
 
   /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
   for (i = 0; i < length; i += 3)
@@ -1870,7 +1871,7 @@ base64_encode (const char *s, int length, char *b64store)
   /* ...and zero-terminate it.  */
   *p = '\0';
 
-  return p - (unsigned char *) b64store;
+  return p - b64store;
 }
 
 #define IS_ASCII(c) (((c) & 0x80) == 0)