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