root/lib/libcrc32c.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. crc32c
  2. libcrc32c_mod_init
  3. libcrc32c_mod_fini
  4. crc32c_impl

   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 
  36 static struct crypto_shash *tfm;
  37 
  38 u32 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 
  55 EXPORT_SYMBOL(crc32c);
  56 
  57 static int __init libcrc32c_mod_init(void)
  58 {
  59         tfm = crypto_alloc_shash("crc32c", 0, 0);
  60         return PTR_ERR_OR_ZERO(tfm);
  61 }
  62 
  63 static void __exit libcrc32c_mod_fini(void)
  64 {
  65         crypto_free_shash(tfm);
  66 }
  67 
  68 const char *crc32c_impl(void)
  69 {
  70         return crypto_shash_driver_name(tfm);
  71 }
  72 EXPORT_SYMBOL(crc32c_impl);
  73 
  74 module_init(libcrc32c_mod_init);
  75 module_exit(libcrc32c_mod_fini);
  76 
  77 MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
  78 MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");
  79 MODULE_LICENSE("GPL");
  80 MODULE_SOFTDEP("pre: crc32c");

/* [<][>][^][v][top][bottom][index][help] */