aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libcrc32c.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
commit1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch)
tree0bba044c4ce775e45a88a51686b5d9f90697ea9d /lib/libcrc32c.c
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
Diffstat (limited to 'lib/libcrc32c.c')
-rw-r--r--lib/libcrc32c.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/lib/libcrc32c.c b/lib/libcrc32c.c
new file mode 100644
index 000000000000..52b6dc144ce3
--- /dev/null
+++ b/lib/libcrc32c.c
@@ -0,0 +1,200 @@
1/*
2 * CRC32C
3 *@Article{castagnoli-crc,
4 * author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
5 * title = {{Optimization of Cyclic Redundancy-Check Codes with 24
6 * and 32 Parity Bits}},
7 * journal = IEEE Transactions on Communication,
8 * year = {1993},
9 * volume = {41},
10 * number = {6},
11 * pages = {},
12 * month = {June},
13 *}
14 * Used by the iSCSI driver, possibly others, and derived from the
15 * the iscsi-crc.c module of the linux-iscsi driver at
16 * http://linux-iscsi.sourceforge.net.
17 *
18 * Following the example of lib/crc32, this function is intended to be
19 * flexible and useful for all users. Modules that currently have their
20 * own crc32c, but hopefully may be able to use this one are:
21 * net/sctp (please add all your doco to here if you change to
22 * use this one!)
23 * <endoflist>
24 *
25 * Copyright (c) 2004 Cisco Systems, Inc.
26 *
27 * This program is free software; you can redistribute it and/or modify it
28 * under the terms of the GNU General Public License as published by the Free
29 * Software Foundation; either version 2 of the License, or (at your option)
30 * any later version.
31 *
32 */
33#include <linux/crc32c.h>
34#include <linux/compiler.h>
35#include <linux/module.h>
36#include <asm/byteorder.h>
37
38MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
39MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");
40MODULE_LICENSE("GPL");
41
42#define CRC32C_POLY_BE 0x1EDC6F41
43#define CRC32C_POLY_LE 0x82F63B78
44
45#ifndef CRC_LE_BITS
46# define CRC_LE_BITS 8
47#endif
48
49
50/*
51 * Haven't generated a big-endian table yet, but the bit-wise version
52 * should at least work.
53 */
54#if defined CRC_BE_BITS && CRC_BE_BITS != 1
55#undef CRC_BE_BITS
56#endif
57#ifndef CRC_BE_BITS
58# define CRC_BE_BITS 1
59#endif
60
61EXPORT_SYMBOL(crc32c_le);
62
63#if CRC_LE_BITS == 1
64/*
65 * Compute things bit-wise, as done in crc32.c. We could share the tight
66 * loop below with crc32 and vary the POLY if we don't find value in terms
67 * of space and maintainability in keeping the two modules separate.
68 */
69u32 __attribute_pure__
70crc32c_le(u32 crc, unsigned char const *p, size_t len)
71{
72 int i;
73 while (len--) {
74 crc ^= *p++;
75 for (i = 0; i < 8; i++)
76 crc = (crc >> 1) ^ ((crc & 1) ? CRC32C_POLY_LE : 0);
77 }
78 return crc;
79}
80#else
81
82/*
83 * This is the CRC-32C table
84 * Generated with:
85 * width = 32 bits
86 * poly = 0x1EDC6F41
87 * reflect input bytes = true
88 * reflect output bytes = true
89 */
90
91static u32 crc32c_table[256] = {
92 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L,
93 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL,
94 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL,
95 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L,
96 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL,
97 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L,
98 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L,
99 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL,
100 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL,
101 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L,
102 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L,
103 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL,
104 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L,
105 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL,
106 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL,
107 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L,
108 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L,
109 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L,
110 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L,
111 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L,
112 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L,
113 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L,
114 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L,
115 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L,
116 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L,
117 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L,
118 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L,
119 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L,
120 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L,
121 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L,
122 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L,
123 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L,
124 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL,
125 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L,
126 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L,
127 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL,
128 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L,
129 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL,
130 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL,
131 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L,
132 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L,
133 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL,
134 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL,
135 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L,
136 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL,
137 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L,
138 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L,
139 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL,
140 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L,
141 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL,
142 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL,
143 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L,
144 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL,
145 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L,
146 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L,
147 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL,
148 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL,
149 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L,
150 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L,
151 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL,
152 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L,
153 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL,
154 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL,
155 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L
156};
157
158/*
159 * Steps through buffer one byte at at time, calculates reflected
160 * crc using table.
161 */
162
163u32 __attribute_pure__
164crc32c_le(u32 seed, unsigned char const *data, size_t length)
165{
166 u32 crc = __cpu_to_le32(seed);
167
168 while (length--)
169 crc =
170 crc32c_table[(crc ^ *data++) & 0xFFL] ^ (crc >> 8);
171
172 return __le32_to_cpu(crc);
173}
174
175#endif /* CRC_LE_BITS == 8 */
176
177EXPORT_SYMBOL(crc32c_be);
178
179#if CRC_BE_BITS == 1
180u32 __attribute_pure__
181crc32c_be(u32 crc, unsigned char const *p, size_t len)
182{
183 int i;
184 while (len--) {
185 crc ^= *p++ << 24;
186 for (i = 0; i < 8; i++)
187 crc =
188 (crc << 1) ^ ((crc & 0x80000000) ? CRC32C_POLY_BE :
189 0);
190 }
191 return crc;
192}
193#endif
194
195/*
196 * Unit test
197 *
198 * A small unit test suite is implemented as part of the crypto suite.
199 * Select CRYPTO_CRC32C and use the tcrypt module to run the tests.
200 */