libcrc32c.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * CRC32C
  3. *@Article{castagnoli-crc,
  4. * author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
  5. * title = {{Optimization of Cyclic Redundancy-Check Codes with 24
  6. * and 32 Parity Bits}},
  7. * journal = IEEE Transactions on Communication,
  8. * year = {1993},
  9. * volume = {41},
  10. * number = {6},
  11. * pages = {},
  12. * month = {June},
  13. *}
  14. * Used by the iSCSI driver, possibly others, and derived from the
  15. * the iscsi-crc.c module of the linux-iscsi driver at
  16. * http://linux-iscsi.sourceforge.net.
  17. *
  18. * Following the example of lib/crc32, this function is intended to be
  19. * flexible and useful for all users. Modules that currently have their
  20. * own crc32c, but hopefully may be able to use this one are:
  21. * net/sctp (please add all your doco to here if you change to
  22. * use this one!)
  23. * <endoflist>
  24. *
  25. * Copyright (c) 2004 Cisco Systems, Inc.
  26. *
  27. * This program is free software; you can redistribute it and/or modify it
  28. * under the terms of the GNU General Public License as published by the Free
  29. * Software Foundation; either version 2 of the License, or (at your option)
  30. * any later version.
  31. *
  32. */
  33. #include <crypto/hash.h>
  34. #include <linux/err.h>
  35. #include <linux/init.h>
  36. #include <linux/kernel.h>
  37. #include <linux/module.h>
  38. static struct crypto_shash *tfm;
  39. u32 crc32c(u32 crc, const void *address, unsigned int length)
  40. {
  41. SHASH_DESC_ON_STACK(shash, tfm);
  42. u32 *ctx = (u32 *)shash_desc_ctx(shash);
  43. int err;
  44. shash->tfm = tfm;
  45. shash->flags = 0;
  46. *ctx = crc;
  47. err = crypto_shash_update(shash, address, length);
  48. BUG_ON(err);
  49. return *ctx;
  50. }
  51. EXPORT_SYMBOL(crc32c);
  52. static int __init libcrc32c_mod_init(void)
  53. {
  54. tfm = crypto_alloc_shash("crc32c", 0, 0);
  55. return PTR_ERR_OR_ZERO(tfm);
  56. }
  57. static void __exit libcrc32c_mod_fini(void)
  58. {
  59. crypto_free_shash(tfm);
  60. }
  61. module_init(libcrc32c_mod_init);
  62. module_exit(libcrc32c_mod_fini);
  63. MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
  64. MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");
  65. MODULE_LICENSE("GPL");
  66. MODULE_SOFTDEP("pre: crc32c");