75 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/* 3 * CRC32C4 *@Article{castagnoli-crc,5 * author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman},6 * title = {{Optimization of Cyclic Redundancy-Check Codes with 247 * 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 from16 * the iscsi-crc.c module of the linux-iscsi driver at17 * http://linux-iscsi.sourceforge.net.18 *19 * Following the example of lib/crc32, this function is intended to be20 * flexible and useful for all users. Modules that currently have their21 * 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 to23 * 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 68module_init(libcrc32c_mod_init);69module_exit(libcrc32c_mod_fini);70 71MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");72MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");73MODULE_LICENSE("GPL");74MODULE_SOFTDEP("pre: crc32c");75