I wrote:
> OK, I think I found it.  ext/hash/php_hash_md.h has this:
> 
> #define PHP_MD4Init                     PHP_MD5Init
> 
> which breaks when the two implementations are not that similar anymore.
> Replacing the MD4 implementation with mine as well would fix this (or
> hide the bug, depending on your point of view), but for now I think the
> right fix would be to define a PHP_MD4Init() function explicitly.

The patch is attached.  It contains two other tiny changes:

1. Replaces two of MD4's basic functions with more optimal versions
(faster and smaller code).

2. Corrects a typo in a nearby comment.

This patch may be applied independently and before the MD5 replacement
patch - but it is required for the MD5 replacement patch.

Alexander
--- php-5.2.5/ext/hash/hash_md.c.orig   2007-01-09 01:29:25 +0300
+++ php-5.2.5/ext/hash/hash_md.c        2008-02-07 14:58:03 +0300
@@ -442,8 +442,8 @@ const unsigned char block[64];
 
 /* MD4 */
 
-#define MD4_F(x,y,z)                   (((x) & (y)) | ((~(x)) & (z)))
-#define MD4_G(x,y,z)                   (((x) & (y)) | ((x) & (z)) | ((y) & 
(z)))
+#define MD4_F(x,y,z)                   ((z) ^ ((x) & ((y) ^ (z))))
+#define MD4_G(x,y,z)                   (((x) & ((y) | (z))) | ((y) & (z)))
 #define MD4_H(x,y,z)                   ((x) ^ (y) ^ (z))
 
 #define ROTL32(s,v)                            (((v) << (s)) | ((v) >> (32 - 
(s))))
@@ -518,8 +518,23 @@ static void MD4Transform(php_hash_uint32
        state[3] += d;
 }
 
+/* {{{ PHP_MD4Init
+ * MD4 initialization. Begins an MD4 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_MD4Init(PHP_MD4_CTX * context)
+{
+       context->count[0] = context->count[1] = 0;
+       /* Load magic initialization constants.
+        */
+       context->state[0] = 0x67452301;
+       context->state[1] = 0xefcdab89;
+       context->state[2] = 0x98badcfe;
+       context->state[3] = 0x10325476;
+}
+/* }}} */
+
 /* {{{ PHP_MD4Update
-   MD4 block update operation. Continues an MD5 message-digest
+   MD4 block update operation. Continues an MD4 message-digest
    operation, processing another message block, and updating the
    context.
  */
--- php-5.2.5/ext/hash/php_hash_md.h.orig       2007-01-01 12:36:01 +0300
+++ php-5.2.5/ext/hash/php_hash_md.h    2008-02-07 14:58:35 +0300
@@ -81,7 +81,7 @@
        unsigned char buffer[64];
 } PHP_MD4_CTX;
 
-#define PHP_MD4Init                    PHP_MD5Init
+PHP_HASH_API void PHP_MD4Init(PHP_MD4_CTX *);
 PHP_HASH_API void PHP_MD4Update(PHP_MD4_CTX *context, const unsigned char *, 
unsigned int);
 PHP_HASH_API void PHP_MD4Final(unsigned char[16], PHP_MD4_CTX *);
 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to