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 } ,
* }
* Used by the iSCSI driver , possibly others , and derived from the
* 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 .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation ; either version 2 of the License , or ( at your option )
* any later version .
*
*/
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>
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
{
2008-11-07 10:11:47 +03:00
struct {
struct shash_desc shash ;
char ctx [ crypto_shash_descsize ( tfm ) ] ;
} desc ;
int err ;
2005-04-17 02:20:36 +04:00
2008-11-07 10:11:47 +03:00
desc . shash . tfm = tfm ;
desc . shash . flags = 0 ;
* ( u32 * ) desc . ctx = crc ;
2005-04-17 02:20:36 +04:00
2008-11-07 10:11:47 +03:00
err = crypto_shash_update ( & desc . shash , address , length ) ;
BUG_ON ( err ) ;
2005-04-17 02:20:36 +04:00
2008-11-07 10:11:47 +03:00
return * ( u32 * ) desc . ctx ;
}
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
}
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 " ) ;