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