crc32.c revision 906520ee2cece20c875835697db08cd5e29b919b
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen/* Copyright (c) 2006-2008 Dovecot authors, see the included COPYING file */
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen#include "lib.h"
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen#include "crc32.h"
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainenstatic uint32_t crc32tab[256] = {
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x00000000,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E,
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC,
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82,
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D,
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8,
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF,
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE,
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D,
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C,
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02,
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen};
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainenuint32_t crc32_data(const void *data, size_t size)
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen{
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen return crc32_data_more((uint32_t)-1, data, size);
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen}
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainenuint32_t crc32_data_more(uint32_t crc, const void *data, size_t size)
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen{
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen const uint8_t *p = data, *end = p + size;
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen for (; p != end; p++)
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen crc = (crc >> 8) ^ crc32tab[((crc ^ *p) & 0xff)];
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen return crc;
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen}
baf3e87e186453fda13bd21f7cbcb2efc8492e8bTimo Sirainen
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainenuint32_t crc32_str(const char *str)
b162e16ade1e0d9bfae62e366caf57a3132f5963Timo Sirainen{
96e1ed172ae59cae6bc6e6ddd24d22a158e23dfeTimo Sirainen return crc32_str_more((uint32_t)-1, str);
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen}
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainenuint32_t crc32_str_more(uint32_t crc, const char *str)
b2ff0468c298dd2f525fff5977f1f24fba3a9f3bTimo Sirainen{
const uint8_t *p = (const uint8_t *)str;
for (; *p != '\0'; p++)
crc = (crc >> 8) ^ crc32tab[((crc ^ *p) & 0xff)];
return crc;
}