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