xref: /openbmc/qemu/util/crc32c.c (revision 907209e3)
18e1b02b8SJeff Cody /*
28e1b02b8SJeff Cody  *  Castagnoli CRC32C Checksum Algorithm
38e1b02b8SJeff Cody  *
48e1b02b8SJeff Cody  *  Polynomial: 0x11EDC6F41
58e1b02b8SJeff Cody  *
68e1b02b8SJeff Cody  *  Castagnoli93: Guy Castagnoli and Stefan Braeuer and Martin Herrman
78e1b02b8SJeff Cody  *               "Optimization of Cyclic Redundancy-Check Codes with 24
88e1b02b8SJeff Cody  *                 and 32 Parity Bits",IEEE Transactions on Communication,
98e1b02b8SJeff Cody  *                Volume 41, Number 6, June 1993
108e1b02b8SJeff Cody  *
118e1b02b8SJeff Cody  *  Copyright (c) 2013 Red Hat, Inc.,
128e1b02b8SJeff Cody  *
138e1b02b8SJeff Cody  *  Authors:
148e1b02b8SJeff Cody  *   Jeff Cody <jcody@redhat.com>
158e1b02b8SJeff Cody  *
168e1b02b8SJeff Cody  *  Based on the Linux kernel cryptographic crc32c module,
178e1b02b8SJeff Cody  *
188e1b02b8SJeff Cody  *  Copyright (c) 2004 Cisco Systems, Inc.
198e1b02b8SJeff Cody  *  Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
208e1b02b8SJeff Cody  *
218e1b02b8SJeff Cody  * This program is free software; you can redistribute it and/or modify it
228e1b02b8SJeff Cody  * under the terms of the GNU General Public License as published by the Free
238e1b02b8SJeff Cody  * Software Foundation; either version 2 of the License, or (at your option)
248e1b02b8SJeff Cody  * any later version.
258e1b02b8SJeff Cody  *
268e1b02b8SJeff Cody  */
278e1b02b8SJeff Cody 
28aafd7584SPeter Maydell #include "qemu/osdep.h"
298e1b02b8SJeff Cody #include "qemu/crc32c.h"
308e1b02b8SJeff Cody 
318e1b02b8SJeff Cody /*
328e1b02b8SJeff Cody  * This is the CRC-32C table
338e1b02b8SJeff Cody  * Generated with:
348e1b02b8SJeff Cody  * width = 32 bits
358e1b02b8SJeff Cody  * poly = 0x1EDC6F41
368e1b02b8SJeff Cody  * reflect input bytes = true
378e1b02b8SJeff Cody  * reflect output bytes = true
388e1b02b8SJeff Cody  */
398e1b02b8SJeff Cody 
408e1b02b8SJeff Cody static const uint32_t crc32c_table[256] = {
418e1b02b8SJeff Cody     0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L,
428e1b02b8SJeff Cody     0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL,
438e1b02b8SJeff Cody     0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL,
448e1b02b8SJeff Cody     0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L,
458e1b02b8SJeff Cody     0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL,
468e1b02b8SJeff Cody     0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L,
478e1b02b8SJeff Cody     0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L,
488e1b02b8SJeff Cody     0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL,
498e1b02b8SJeff Cody     0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL,
508e1b02b8SJeff Cody     0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L,
518e1b02b8SJeff Cody     0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L,
528e1b02b8SJeff Cody     0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL,
538e1b02b8SJeff Cody     0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L,
548e1b02b8SJeff Cody     0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL,
558e1b02b8SJeff Cody     0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL,
568e1b02b8SJeff Cody     0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L,
578e1b02b8SJeff Cody     0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L,
588e1b02b8SJeff Cody     0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L,
598e1b02b8SJeff Cody     0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L,
608e1b02b8SJeff Cody     0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L,
618e1b02b8SJeff Cody     0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L,
628e1b02b8SJeff Cody     0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L,
638e1b02b8SJeff Cody     0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L,
648e1b02b8SJeff Cody     0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L,
658e1b02b8SJeff Cody     0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L,
668e1b02b8SJeff Cody     0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L,
678e1b02b8SJeff Cody     0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L,
688e1b02b8SJeff Cody     0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L,
698e1b02b8SJeff Cody     0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L,
708e1b02b8SJeff Cody     0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L,
718e1b02b8SJeff Cody     0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L,
728e1b02b8SJeff Cody     0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L,
738e1b02b8SJeff Cody     0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL,
748e1b02b8SJeff Cody     0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L,
758e1b02b8SJeff Cody     0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L,
768e1b02b8SJeff Cody     0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL,
778e1b02b8SJeff Cody     0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L,
788e1b02b8SJeff Cody     0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL,
798e1b02b8SJeff Cody     0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL,
808e1b02b8SJeff Cody     0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L,
818e1b02b8SJeff Cody     0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L,
828e1b02b8SJeff Cody     0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL,
838e1b02b8SJeff Cody     0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL,
848e1b02b8SJeff Cody     0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L,
858e1b02b8SJeff Cody     0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL,
868e1b02b8SJeff Cody     0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L,
878e1b02b8SJeff Cody     0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L,
888e1b02b8SJeff Cody     0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL,
898e1b02b8SJeff Cody     0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L,
908e1b02b8SJeff Cody     0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL,
918e1b02b8SJeff Cody     0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL,
928e1b02b8SJeff Cody     0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L,
938e1b02b8SJeff Cody     0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL,
948e1b02b8SJeff Cody     0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L,
958e1b02b8SJeff Cody     0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L,
968e1b02b8SJeff Cody     0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL,
978e1b02b8SJeff Cody     0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL,
988e1b02b8SJeff Cody     0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L,
998e1b02b8SJeff Cody     0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L,
1008e1b02b8SJeff Cody     0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL,
1018e1b02b8SJeff Cody     0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L,
1028e1b02b8SJeff Cody     0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL,
1038e1b02b8SJeff Cody     0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL,
1048e1b02b8SJeff Cody     0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L
1058e1b02b8SJeff Cody };
1068e1b02b8SJeff Cody 
1078e1b02b8SJeff Cody 
crc32c(uint32_t crc,const uint8_t * data,unsigned int length)1088e1b02b8SJeff Cody uint32_t crc32c(uint32_t crc, const uint8_t *data, unsigned int length)
1098e1b02b8SJeff Cody {
1108e1b02b8SJeff Cody     while (length--) {
1118e1b02b8SJeff Cody         crc = crc32c_table[(crc ^ *data++) & 0xFFL] ^ (crc >> 8);
1128e1b02b8SJeff Cody     }
1138e1b02b8SJeff Cody     return crc^0xffffffff;
1148e1b02b8SJeff Cody }
1158e1b02b8SJeff Cody 
iov_crc32c(uint32_t crc,const struct iovec * iov,size_t iov_cnt)116*907209e3SAkihiko Odaki uint32_t iov_crc32c(uint32_t crc, const struct iovec *iov, size_t iov_cnt)
117*907209e3SAkihiko Odaki {
118*907209e3SAkihiko Odaki     while (iov_cnt--) {
119*907209e3SAkihiko Odaki         crc = crc32c(crc, iov->iov_base, iov->iov_len) ^ 0xffffffff;
120*907209e3SAkihiko Odaki         iov++;
121*907209e3SAkihiko Odaki     }
122*907209e3SAkihiko Odaki     return crc ^ 0xffffffff;
123*907209e3SAkihiko Odaki }
124