1b8e80941Smrg/************************************************************************** 2b8e80941Smrg * 3b8e80941Smrg * Copyright 2008 VMware, Inc. 4b8e80941Smrg * All Rights Reserved. 5b8e80941Smrg * 6b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a 7b8e80941Smrg * copy of this software and associated documentation files (the 8b8e80941Smrg * "Software"), to deal in the Software without restriction, including 9b8e80941Smrg * without limitation the rights to use, copy, modify, merge, publish, 10b8e80941Smrg * distribute, sub license, and/or sell copies of the Software, and to 11b8e80941Smrg * permit persons to whom the Software is furnished to do so, subject to 12b8e80941Smrg * the following conditions: 13b8e80941Smrg * 14b8e80941Smrg * The above copyright notice and this permission notice (including the 15b8e80941Smrg * next paragraph) shall be included in all copies or substantial portions 16b8e80941Smrg * of the Software. 17b8e80941Smrg * 18b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19b8e80941Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20b8e80941Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21b8e80941Smrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22b8e80941Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23b8e80941Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24b8e80941Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25b8e80941Smrg * 26b8e80941Smrg **************************************************************************/ 27b8e80941Smrg 28b8e80941Smrg/** 29b8e80941Smrg * @file 30b8e80941Smrg * CRC32 implementation. 31b8e80941Smrg * 32b8e80941Smrg * @author Jose Fonseca 33b8e80941Smrg */ 34b8e80941Smrg 35b8e80941Smrg 36b8e80941Smrg#ifdef HAVE_ZLIB 37b8e80941Smrg#include <zlib.h> 38b8e80941Smrg#endif 39b8e80941Smrg#include "crc32.h" 40b8e80941Smrg 41b8e80941Smrg 42b8e80941Smrgstatic const uint32_t 43b8e80941Smrgutil_crc32_table[256] = { 44b8e80941Smrg 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 45b8e80941Smrg 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 46b8e80941Smrg 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 47b8e80941Smrg 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 48b8e80941Smrg 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 49b8e80941Smrg 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 50b8e80941Smrg 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 51b8e80941Smrg 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 52b8e80941Smrg 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 53b8e80941Smrg 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 54b8e80941Smrg 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 55b8e80941Smrg 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 56b8e80941Smrg 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 57b8e80941Smrg 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 58b8e80941Smrg 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 59b8e80941Smrg 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 60b8e80941Smrg 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 61b8e80941Smrg 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 62b8e80941Smrg 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 63b8e80941Smrg 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 64b8e80941Smrg 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 65b8e80941Smrg 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 66b8e80941Smrg 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 67b8e80941Smrg 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 68b8e80941Smrg 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 69b8e80941Smrg 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 70b8e80941Smrg 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 71b8e80941Smrg 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 72b8e80941Smrg 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 73b8e80941Smrg 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 74b8e80941Smrg 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 75b8e80941Smrg 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 76b8e80941Smrg 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 77b8e80941Smrg 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 78b8e80941Smrg 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 79b8e80941Smrg 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 80b8e80941Smrg 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 81b8e80941Smrg 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 82b8e80941Smrg 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 83b8e80941Smrg 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 84b8e80941Smrg 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 85b8e80941Smrg 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 86b8e80941Smrg 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 87b8e80941Smrg 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 88b8e80941Smrg 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 89b8e80941Smrg 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 90b8e80941Smrg 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 91b8e80941Smrg 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 92b8e80941Smrg 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 93b8e80941Smrg 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 94b8e80941Smrg 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 95b8e80941Smrg 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 96b8e80941Smrg 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 97b8e80941Smrg 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 98b8e80941Smrg 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 99b8e80941Smrg 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 100b8e80941Smrg 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 101b8e80941Smrg 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 102b8e80941Smrg 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 103b8e80941Smrg 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 104b8e80941Smrg 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 105b8e80941Smrg 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 106b8e80941Smrg 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 107b8e80941Smrg 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 108b8e80941Smrg}; 109b8e80941Smrg 110b8e80941Smrg 111b8e80941Smrg/** 112b8e80941Smrg * @sa http://www.w3.org/TR/PNG/#D-CRCAppendix 113b8e80941Smrg */ 114b8e80941Smrguint32_t 115b8e80941Smrgutil_hash_crc32(const void *data, size_t size) 116b8e80941Smrg{ 117b8e80941Smrg const uint8_t *p = data; 118b8e80941Smrg uint32_t crc = 0xffffffff; 119b8e80941Smrg 120b8e80941Smrg#ifdef HAVE_ZLIB 121b8e80941Smrg /* Prefer zlib's implementation for better performance. 122b8e80941Smrg * zlib's uInt is always "unsigned int" while size_t can be 64bit. 123b8e80941Smrg * Since 1.2.9 there's crc32_z that takes size_t, but use the more 124b8e80941Smrg * available function to avoid build system complications. 125b8e80941Smrg */ 126b8e80941Smrg if ((uInt)size == size) 127b8e80941Smrg return ~crc32(0, data, size); 128b8e80941Smrg#endif 129b8e80941Smrg 130b8e80941Smrg while (size--) 131b8e80941Smrg crc = util_crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8); 132b8e80941Smrg 133b8e80941Smrg return crc; 134b8e80941Smrg} 135