2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
* CRC32C
* @ Article { castagnoli - crc ,
* author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman } ,
* title = { { Optimization of Cyclic Redundancy - Check Codes with 24
* and 32 Parity Bits } } ,
* journal = IEEE Transactions on Communication ,
* year = { 1993 } ,
* volume = { 41 } ,
* number = { 6 } ,
* pages = { } ,
* month = { June } ,
* }
2020-10-16 06:10:48 +03:00
* Used by the iSCSI driver , possibly others , and derived from
2005-04-17 02:20:36 +04:00
* the iscsi - crc . c module of the linux - iscsi driver at
* http : //linux-iscsi.sourceforge.net.
*
* Following the example of lib / crc32 , this function is intended to be
* flexible and useful for all users . Modules that currently have their
* own crc32c , but hopefully may be able to use this one are :
* net / sctp ( please add all your doco to here if you change to
* use this one ! )
* < endoflist >
*
* Copyright ( c ) 2004 Cisco Systems , Inc .
*/
2008-11-07 10:11:47 +03:00
# include <crypto/hash.h>
# include <linux/err.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/module.h>
2016-01-21 01:58:06 +03:00
# include <linux/crc32c.h>
2005-04-17 02:20:36 +04:00
2008-11-07 10:11:47 +03:00
static struct crypto_shash * tfm ;
2005-04-17 02:20:36 +04:00
2008-11-07 10:11:47 +03:00
u32 crc32c ( u32 crc , const void * address , unsigned int length )
2005-04-17 02:20:36 +04:00
{
2012-07-02 14:54:28 +04:00
SHASH_DESC_ON_STACK ( shash , tfm ) ;
2017-06-02 18:28:54 +03:00
u32 ret , * ctx = ( u32 * ) shash_desc_ctx ( shash ) ;
2008-11-07 10:11:47 +03:00
int err ;
2005-04-17 02:20:36 +04:00
2012-07-02 14:54:28 +04:00
shash - > tfm = tfm ;
* ctx = crc ;
2005-04-17 02:20:36 +04:00
2012-07-02 14:54:28 +04:00
err = crypto_shash_update ( shash , address , length ) ;
2008-11-07 10:11:47 +03:00
BUG_ON ( err ) ;
2005-04-17 02:20:36 +04:00
2017-06-02 18:28:54 +03:00
ret = * ctx ;
barrier_data ( ctx ) ;
return ret ;
2008-11-07 10:11:47 +03:00
}
2005-04-17 02:20:36 +04:00
2008-11-11 07:14:00 +03:00
EXPORT_SYMBOL ( crc32c ) ;
2008-11-07 10:11:47 +03:00
static int __init libcrc32c_mod_init ( void )
2005-04-17 02:20:36 +04:00
{
2008-11-07 10:11:47 +03:00
tfm = crypto_alloc_shash ( " crc32c " , 0 , 0 ) ;
2014-06-05 03:11:51 +04:00
return PTR_ERR_OR_ZERO ( tfm ) ;
2005-04-17 02:20:36 +04:00
}
2008-11-07 10:11:47 +03:00
static void __exit libcrc32c_mod_fini ( void )
2005-04-17 02:20:36 +04:00
{
2008-11-07 10:11:47 +03:00
crypto_free_shash ( tfm ) ;
2005-04-17 02:20:36 +04:00
}
2018-01-08 12:45:04 +03:00
const char * crc32c_impl ( void )
{
return crypto_shash_driver_name ( tfm ) ;
}
EXPORT_SYMBOL ( crc32c_impl ) ;
2008-11-07 10:11:47 +03:00
module_init ( libcrc32c_mod_init ) ;
module_exit ( libcrc32c_mod_fini ) ;
MODULE_AUTHOR ( " Clay Haapala <chaapala@cisco.com> " ) ;
MODULE_DESCRIPTION ( " CRC32c (Castagnoli) calculations " ) ;
MODULE_LICENSE ( " GPL " ) ;
2016-01-18 19:06:05 +03:00
MODULE_SOFTDEP ( " pre: crc32c " ) ;