xref: /openbmc/qemu/util/crc32c.c (revision 709395f8)
1 /*
2  *  Castagnoli CRC32C Checksum Algorithm
3  *
4  *  Polynomial: 0x11EDC6F41
5  *
6  *  Castagnoli93: Guy Castagnoli and Stefan Braeuer and Martin Herrman
7  *               "Optimization of Cyclic Redundancy-Check Codes with 24
8  *                 and 32 Parity Bits",IEEE Transactions on Communication,
9  *                Volume 41, Number 6, June 1993
10  *
11  *  Copyright (c) 2013 Red Hat, Inc.,
12  *
13  *  Authors:
14  *   Jeff Cody <jcody@redhat.com>
15  *
16  *  Based on the Linux kernel cryptographic crc32c module,
17  *
18  *  Copyright (c) 2004 Cisco Systems, Inc.
19  *  Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
20  *
21  * This program is free software; you can redistribute it and/or modify it
22  * under the terms of the GNU General Public License as published by the Free
23  * Software Foundation; either version 2 of the License, or (at your option)
24  * any later version.
25  *
26  */
27 
28 #include "qemu/osdep.h"
29 #include "qemu-common.h"
30 #include "qemu/crc32c.h"
31 
32 /*
33  * This is the CRC-32C table
34  * Generated with:
35  * width = 32 bits
36  * poly = 0x1EDC6F41
37  * reflect input bytes = true
38  * reflect output bytes = true
39  */
40 
41 static const uint32_t crc32c_table[256] = {
42     0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L,
43     0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL,
44     0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL,
45     0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L,
46     0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL,
47     0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L,
48     0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L,
49     0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL,
50     0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL,
51     0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L,
52     0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L,
53     0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL,
54     0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L,
55     0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL,
56     0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL,
57     0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L,
58     0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L,
59     0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L,
60     0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L,
61     0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L,
62     0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L,
63     0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L,
64     0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L,
65     0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L,
66     0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L,
67     0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L,
68     0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L,
69     0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L,
70     0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L,
71     0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L,
72     0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L,
73     0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L,
74     0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL,
75     0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L,
76     0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L,
77     0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL,
78     0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L,
79     0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL,
80     0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL,
81     0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L,
82     0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L,
83     0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL,
84     0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL,
85     0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L,
86     0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL,
87     0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L,
88     0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L,
89     0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL,
90     0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L,
91     0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL,
92     0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL,
93     0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L,
94     0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL,
95     0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L,
96     0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L,
97     0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL,
98     0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL,
99     0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L,
100     0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L,
101     0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL,
102     0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L,
103     0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL,
104     0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL,
105     0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L
106 };
107 
108 
109 uint32_t crc32c(uint32_t crc, const uint8_t *data, unsigned int length)
110 {
111     while (length--) {
112         crc = crc32c_table[(crc ^ *data++) & 0xFFL] ^ (crc >> 8);
113     }
114     return crc^0xffffffff;
115 }
116 
117