From: Antony Dovgal Date: Mon, 18 Aug 2008 14:28:57 +0000 (+0000) Subject: fix bug #45028 (CRC32 output endianness is different between crc32() and hash()) X-Git-Tag: BEFORE_HEAD_NS_CHANGE~659 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=be2f5ce9e75c06f15d877bcb26c2ece46e6f4a42;p=php fix bug #45028 (CRC32 output endianness is different between crc32() and hash()) --- diff --git a/ext/hash/hash_crc32.c b/ext/hash/hash_crc32.c index ccc6de3b0d..9f03ad0704 100644 --- a/ext/hash/hash_crc32.c +++ b/ext/hash/hash_crc32.c @@ -56,6 +56,16 @@ PHP_HASH_API void PHP_CRC32Final(unsigned char digest[4], PHP_CRC32_CTX *context context->state = 0; } +PHP_HASH_API void PHP_CRC32BFinal(unsigned char digest[4], PHP_CRC32_CTX *context) +{ + context->state=~context->state; + digest[0] = (unsigned char) ((context->state >> 24) & 0xff); + digest[1] = (unsigned char) ((context->state >> 16) & 0xff); + digest[2] = (unsigned char) ((context->state >> 8) & 0xff); + digest[3] = (unsigned char) (context->state & 0xff); + context->state = 0; +} + PHP_HASH_API int PHP_CRC32Copy(const php_hash_ops *ops, PHP_CRC32_CTX *orig_context, PHP_CRC32_CTX *copy_context) { copy_context->state = orig_context->state; @@ -75,7 +85,7 @@ const php_hash_ops php_hash_crc32_ops = { const php_hash_ops php_hash_crc32b_ops = { (php_hash_init_func_t) PHP_CRC32Init, (php_hash_update_func_t) PHP_CRC32BUpdate, - (php_hash_final_func_t) PHP_CRC32Final, + (php_hash_final_func_t) PHP_CRC32BFinal, (php_hash_copy_func_t) PHP_CRC32Copy, 4, /* what to say here? */ 4, diff --git a/ext/hash/tests/crc32.phpt b/ext/hash/tests/crc32.phpt index a6ae3aefdf..42bb73c437 100644 --- a/ext/hash/tests/crc32.phpt +++ b/ext/hash/tests/crc32.phpt @@ -28,9 +28,9 @@ echo hash('crc32b', '12345678901234567890123456789012345678901234567890123456789 882174a0 96790816 00000000 -43beb7e8 -c2412435 -7f9d1520 -bd50274c -d2e6c21f -724aa97c +e8b7be43 +352441c2 +20159d7f +4c2750bd +1fc2e6d2 +7ca94a72 diff --git a/ext/hash/tests/hash_copy_001.phpt b/ext/hash/tests/hash_copy_001.phpt index d1a0016dc2..6c3d83bc31 100644 --- a/ext/hash/tests/hash_copy_001.phpt +++ b/ext/hash/tests/hash_copy_001.phpt @@ -75,8 +75,8 @@ unicode(8) "28097c6f" unicode(8) "28097c6f" unicode(8) "e5cfc160" unicode(8) "e5cfc160" -unicode(8) "4e7a1469" -unicode(8) "4e7a1469" +unicode(8) "69147a4e" +unicode(8) "69147a4e" unicode(32) "86362472c8895e68e223ef8b3711d8d9" unicode(32) "86362472c8895e68e223ef8b3711d8d9" unicode(40) "fabdf6905f3ba18a3c93d6a16b91e31f7222a7a4" @@ -155,8 +155,8 @@ unicode(8) "28097c6f" unicode(8) "471714d9" unicode(8) "e5cfc160" unicode(8) "59f8d3d2" -unicode(8) "4e7a1469" -unicode(8) "9939e63e" +unicode(8) "69147a4e" +unicode(8) "3ee63999" unicode(32) "86362472c8895e68e223ef8b3711d8d9" unicode(32) "ebeeeb05c18af1e53d2d127b561d5e0d" unicode(40) "fabdf6905f3ba18a3c93d6a16b91e31f7222a7a4"