2 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
3 * code or tables extracted from it, as desired without restriction.
6 /* crc32c code taken from 2.6.29 Linux kernel crypto/crc32c.c:
7 * Copyright (c) 2004 Cisco Systems, Inc.
8 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the Free
12 * Software Foundation; either version 2 of the License, or (at your option)
13 * any later version. */
20 * This is the CRC-32C table
24 * reflect input bytes = true
25 * reflect output bytes = true
27 static const uint32_t crc32c_tab[] = {
28 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
29 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
30 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
31 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
32 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
33 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
34 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
35 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
36 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
37 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
38 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
39 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
40 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
41 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
42 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
43 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
44 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
45 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
46 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
47 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
48 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
49 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
50 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
51 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
52 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
53 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
54 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
55 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
56 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
57 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
58 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
59 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
60 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
61 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
62 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
63 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
64 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
65 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
66 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
67 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
68 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
69 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
70 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
71 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
72 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
73 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
74 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
75 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
76 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
77 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
78 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
79 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
80 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
81 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
82 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
83 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
84 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
85 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
86 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
87 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
88 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
89 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
90 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
91 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
95 * Steps through buffer one byte at at time, calculates reflected
98 uint32_t crc32c(uint32_t crc, const void *buf, size_t size)
100 const uint8_t *p = buf;
103 crc = crc32c_tab[(crc ^ *p++) & 0xFFL] ^ (crc >> 8);
108 const uint32_t *crc32c_table(void)
113 static const uint32_t crc32_ieee_tab[] = {
114 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
115 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
116 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
117 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
118 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
119 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
120 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
121 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
122 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
123 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
124 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
125 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
126 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
127 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
128 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
129 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
130 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
131 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
132 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
133 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
134 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
135 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
136 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
137 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
138 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
139 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
140 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
141 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
142 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
143 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
144 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
145 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
146 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
147 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
148 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
149 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
150 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
151 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
152 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
153 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
154 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
155 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
156 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
159 uint32_t crc32_ieee(uint32_t crc, const void *buf, size_t size)
167 crc = crc32_ieee_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
172 const uint32_t *crc32_ieee_table(void)
174 return crc32_ieee_tab;