cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

libcrc32c.c (2020B)


      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
     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");