linux/lib/libcrc32c.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* 
   3 * CRC32C
   4 *@Article{castagnoli-crc,
   5 * author =       { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
   6 * title =        {{Optimization of Cyclic Redundancy-Check Codes with 24
   7 *                 and 32 Parity Bits}},
   8 * journal =      IEEE Transactions on Communication,
   9 * year =         {1993},
  10 * volume =       {41},
  11 * number =       {6},
  12 * pages =        {},
  13 * month =        {June},
  14 *}
  15 * Used by the iSCSI driver, possibly others, and derived from the
  16 * the iscsi-crc.c module of the linux-iscsi driver at
  17 * http://linux-iscsi.sourceforge.net.
  18 *
  19 * Following the example of lib/crc32, this function is intended to be
  20 * flexible and useful for all users.  Modules that currently have their
  21 * own crc32c, but hopefully may be able to use this one are:
  22 *  net/sctp (please add all your doco to here if you change to
  23 *            use this one!)
  24 *  <endoflist>
  25 *
  26 * Copyright (c) 2004 Cisco Systems, Inc.
  27 */
  28
  29#include <crypto/hash.h>
  30#include <linux/err.h>
  31#include <linux/init.h>
  32#include <linux/kernel.h>
  33#include <linux/module.h>
  34#include <linux/crc32c.h>
  35
  36static struct crypto_shash *tfm;
  37
  38u32 crc32c(u32 crc, const void *address, unsigned int length)
  39{
  40        SHASH_DESC_ON_STACK(shash, tfm);
  41        u32 ret, *ctx = (u32 *)shash_desc_ctx(shash);
  42        int err;
  43
  44        shash->tfm = tfm;
  45        *ctx = crc;
  46
  47        err = crypto_shash_update(shash, address, length);
  48        BUG_ON(err);
  49
  50        ret = *ctx;
  51        barrier_data(ctx);
  52        return ret;
  53}
  54
  55EXPORT_SYMBOL(crc32c);
  56
  57static int __init libcrc32c_mod_init(void)
  58{
  59        tfm = crypto_alloc_shash("crc32c", 0, 0);
  60        return PTR_ERR_OR_ZERO(tfm);
  61}
  62
  63static void __exit libcrc32c_mod_fini(void)
  64{
  65        crypto_free_shash(tfm);
  66}
  67
  68const char *crc32c_impl(void)
  69{
  70        return crypto_shash_driver_name(tfm);
  71}
  72EXPORT_SYMBOL(crc32c_impl);
  73
  74module_init(libcrc32c_mod_init);
  75module_exit(libcrc32c_mod_fini);
  76
  77MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
  78MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");
  79MODULE_LICENSE("GPL");
  80MODULE_SOFTDEP("pre: crc32c");
  81