Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libcrc32c: Move implementation to crypto crc32c

This patch swaps the role of libcrc32c and crc32c. Previously
the implementation was in libcrc32c and crc32c was a wrapper.
Now the code is in crc32c and libcrc32c just calls the crypto
layer.

The reason for the change is to tap into the algorithm selection
capability of the crypto API so that optimised implementations
such as the one utilising Intel's CRC32C instruction can be
used where available.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

+156 -169
+1 -3
crypto/Kconfig
··· 256 256 config CRYPTO_CRC32C 257 257 tristate "CRC32c CRC algorithm" 258 258 select CRYPTO_HASH 259 - select LIBCRC32C 260 259 help 261 260 Castagnoli, et al Cyclic Redundancy-Check Algorithm. Used 262 261 by iSCSI for header and data digests and by others. 263 - See Castagnoli93. This implementation uses lib/libcrc32c. 264 - Module will be crc32c. 262 + See Castagnoli93. Module will be crc32c. 265 263 266 264 config CRYPTO_CRC32C_INTEL 267 265 tristate "CRC32c INTEL hardware acceleration"
+111 -2
crypto/crc32c.c
··· 3 3 * 4 4 * CRC32C chksum 5 5 * 6 - * This module file is a wrapper to invoke the lib/crc32c routines. 6 + *@Article{castagnoli-crc, 7 + * author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman}, 8 + * title = {{Optimization of Cyclic Redundancy-Check Codes with 24 9 + * and 32 Parity Bits}}, 10 + * journal = IEEE Transactions on Communication, 11 + * year = {1993}, 12 + * volume = {41}, 13 + * number = {6}, 14 + * pages = {}, 15 + * month = {June}, 16 + *} 17 + * Used by the iSCSI driver, possibly others, and derived from the 18 + * the iscsi-crc.c module of the linux-iscsi driver at 19 + * http://linux-iscsi.sourceforge.net. 7 20 * 21 + * Following the example of lib/crc32, this function is intended to be 22 + * flexible and useful for all users. Modules that currently have their 23 + * own crc32c, but hopefully may be able to use this one are: 24 + * net/sctp (please add all your doco to here if you change to 25 + * use this one!) 26 + * <endoflist> 27 + * 28 + * Copyright (c) 2004 Cisco Systems, Inc. 8 29 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 9 30 * 10 31 * This program is free software; you can redistribute it and/or modify it ··· 39 18 #include <linux/init.h> 40 19 #include <linux/module.h> 41 20 #include <linux/string.h> 42 - #include <linux/crc32c.h> 43 21 #include <linux/kernel.h> 44 22 45 23 #define CHKSUM_BLOCK_SIZE 1 ··· 51 31 struct chksum_desc_ctx { 52 32 u32 crc; 53 33 }; 34 + 35 + /* 36 + * This is the CRC-32C table 37 + * Generated with: 38 + * width = 32 bits 39 + * poly = 0x1EDC6F41 40 + * reflect input bytes = true 41 + * reflect output bytes = true 42 + */ 43 + 44 + static const u32 crc32c_table[256] = { 45 + 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, 46 + 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, 47 + 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, 48 + 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L, 49 + 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, 50 + 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L, 51 + 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, 52 + 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL, 53 + 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, 54 + 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L, 55 + 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, 56 + 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL, 57 + 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, 58 + 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL, 59 + 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, 60 + 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L, 61 + 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, 62 + 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L, 63 + 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, 64 + 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L, 65 + 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, 66 + 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L, 67 + 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, 68 + 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L, 69 + 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, 70 + 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L, 71 + 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, 72 + 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L, 73 + 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, 74 + 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L, 75 + 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, 76 + 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L, 77 + 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, 78 + 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L, 79 + 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, 80 + 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL, 81 + 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, 82 + 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL, 83 + 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, 84 + 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L, 85 + 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, 86 + 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL, 87 + 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, 88 + 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L, 89 + 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, 90 + 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L, 91 + 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, 92 + 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL, 93 + 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, 94 + 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL, 95 + 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, 96 + 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L, 97 + 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, 98 + 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L, 99 + 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, 100 + 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL, 101 + 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, 102 + 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L, 103 + 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, 104 + 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL, 105 + 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, 106 + 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL, 107 + 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, 108 + 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L 109 + }; 110 + 111 + /* 112 + * Steps through buffer one byte at at time, calculates reflected 113 + * crc using table. 114 + */ 115 + 116 + static u32 crc32c(u32 crc, const u8 *data, unsigned int length) 117 + { 118 + while (length--) 119 + crc = crc32c_table[(crc ^ *data++) & 0xFFL] ^ (crc >> 8); 120 + 121 + return crc; 122 + } 54 123 55 124 /* 56 125 * Steps through buffer one byte at at time, calculates reflected
+1 -4
include/linux/crc32c.h
··· 3 3 4 4 #include <linux/types.h> 5 5 6 - extern u32 crc32c_le(u32 crc, unsigned char const *address, size_t length); 7 - extern u32 crc32c_be(u32 crc, unsigned char const *address, size_t length); 8 - 9 - #define crc32c(seed, data, length) crc32c_le(seed, (unsigned char const *)data, length) 6 + extern u32 crc32c(u32 crc, const void *address, unsigned int length); 10 7 11 8 #endif /* _LINUX_CRC32C_H */
+1
lib/Kconfig
··· 64 64 65 65 config LIBCRC32C 66 66 tristate "CRC32c (Castagnoli, et al) Cyclic Redundancy-Check" 67 + select CRYPTO_CRC32C 67 68 help 68 69 This option is provided for the case where no in-kernel-tree 69 70 modules require CRC32c functions, but a module built outside the
+42 -160
lib/libcrc32c.c
··· 30 30 * any later version. 31 31 * 32 32 */ 33 - #include <linux/crc32c.h> 34 - #include <linux/compiler.h> 33 + 34 + #include <crypto/hash.h> 35 + #include <linux/err.h> 36 + #include <linux/init.h> 37 + #include <linux/kernel.h> 35 38 #include <linux/module.h> 39 + 40 + static struct crypto_shash *tfm; 41 + 42 + u32 crc32c(u32 crc, const void *address, unsigned int length) 43 + { 44 + struct { 45 + struct shash_desc shash; 46 + char ctx[crypto_shash_descsize(tfm)]; 47 + } desc; 48 + int err; 49 + 50 + desc.shash.tfm = tfm; 51 + desc.shash.flags = 0; 52 + *(u32 *)desc.ctx = crc; 53 + 54 + err = crypto_shash_update(&desc.shash, address, length); 55 + BUG_ON(err); 56 + 57 + return *(u32 *)desc.ctx; 58 + } 59 + 60 + static int __init libcrc32c_mod_init(void) 61 + { 62 + tfm = crypto_alloc_shash("crc32c", 0, 0); 63 + if (IS_ERR(tfm)) 64 + return PTR_ERR(tfm); 65 + 66 + return 0; 67 + } 68 + 69 + static void __exit libcrc32c_mod_fini(void) 70 + { 71 + crypto_free_shash(tfm); 72 + } 73 + 74 + module_init(libcrc32c_mod_init); 75 + module_exit(libcrc32c_mod_fini); 36 76 37 77 MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>"); 38 78 MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations"); 39 79 MODULE_LICENSE("GPL"); 40 - 41 - #define CRC32C_POLY_BE 0x1EDC6F41 42 - #define CRC32C_POLY_LE 0x82F63B78 43 - 44 - #ifndef CRC_LE_BITS 45 - # define CRC_LE_BITS 8 46 - #endif 47 - 48 - 49 - /* 50 - * Haven't generated a big-endian table yet, but the bit-wise version 51 - * should at least work. 52 - */ 53 - #if defined CRC_BE_BITS && CRC_BE_BITS != 1 54 - #undef CRC_BE_BITS 55 - #endif 56 - #ifndef CRC_BE_BITS 57 - # define CRC_BE_BITS 1 58 - #endif 59 - 60 - EXPORT_SYMBOL(crc32c_le); 61 - 62 - #if CRC_LE_BITS == 1 63 - /* 64 - * Compute things bit-wise, as done in crc32.c. We could share the tight 65 - * loop below with crc32 and vary the POLY if we don't find value in terms 66 - * of space and maintainability in keeping the two modules separate. 67 - */ 68 - u32 __pure 69 - crc32c_le(u32 crc, unsigned char const *p, size_t len) 70 - { 71 - int i; 72 - while (len--) { 73 - crc ^= *p++; 74 - for (i = 0; i < 8; i++) 75 - crc = (crc >> 1) ^ ((crc & 1) ? CRC32C_POLY_LE : 0); 76 - } 77 - return crc; 78 - } 79 - #else 80 - 81 - /* 82 - * This is the CRC-32C table 83 - * Generated with: 84 - * width = 32 bits 85 - * poly = 0x1EDC6F41 86 - * reflect input bytes = true 87 - * reflect output bytes = true 88 - */ 89 - 90 - static const u32 crc32c_table[256] = { 91 - 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, 92 - 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, 93 - 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, 94 - 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L, 95 - 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, 96 - 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L, 97 - 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, 98 - 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL, 99 - 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, 100 - 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L, 101 - 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, 102 - 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL, 103 - 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, 104 - 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL, 105 - 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, 106 - 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L, 107 - 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, 108 - 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L, 109 - 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, 110 - 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L, 111 - 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, 112 - 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L, 113 - 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, 114 - 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L, 115 - 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, 116 - 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L, 117 - 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, 118 - 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L, 119 - 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, 120 - 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L, 121 - 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, 122 - 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L, 123 - 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, 124 - 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L, 125 - 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, 126 - 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL, 127 - 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, 128 - 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL, 129 - 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, 130 - 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L, 131 - 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, 132 - 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL, 133 - 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, 134 - 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L, 135 - 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, 136 - 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L, 137 - 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, 138 - 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL, 139 - 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, 140 - 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL, 141 - 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, 142 - 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L, 143 - 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, 144 - 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L, 145 - 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, 146 - 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL, 147 - 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, 148 - 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L, 149 - 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, 150 - 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL, 151 - 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, 152 - 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL, 153 - 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, 154 - 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L 155 - }; 156 - 157 - /* 158 - * Steps through buffer one byte at at time, calculates reflected 159 - * crc using table. 160 - */ 161 - 162 - u32 __pure 163 - crc32c_le(u32 crc, unsigned char const *data, size_t length) 164 - { 165 - while (length--) 166 - crc = 167 - crc32c_table[(crc ^ *data++) & 0xFFL] ^ (crc >> 8); 168 - 169 - return crc; 170 - } 171 - 172 - #endif /* CRC_LE_BITS == 8 */ 173 - 174 - EXPORT_SYMBOL(crc32c_be); 175 - 176 - #if CRC_BE_BITS == 1 177 - u32 __pure 178 - crc32c_be(u32 crc, unsigned char const *p, size_t len) 179 - { 180 - int i; 181 - while (len--) { 182 - crc ^= *p++ << 24; 183 - for (i = 0; i < 8; i++) 184 - crc = 185 - (crc << 1) ^ ((crc & 0x80000000) ? CRC32C_POLY_BE : 186 - 0); 187 - } 188 - return crc; 189 - } 190 - #endif 191 - 192 - /* 193 - * Unit test 194 - * 195 - * A small unit test suite is implemented as part of the crypto suite. 196 - * Select CRYPTO_CRC32C and use the tcrypt module to run the tests. 197 - */