libcrc32c.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. #include <linux/crc32c.h>
  39. static struct crypto_shash *tfm;
  40. u32 crc32c(u32 crc, const void *address, unsigned int length)
  41. {
  42. SHASH_DESC_ON_STACK(shash, tfm);
  43. u32 ret, *ctx = (u32 *)shash_desc_ctx(shash);
  44. int err;
  45. shash->tfm = tfm;
  46. shash->flags = 0;
  47. *ctx = crc;
  48. err = crypto_shash_update(shash, address, length);
  49. BUG_ON(err);
  50. ret = *ctx;
  51. barrier_data(ctx);
  52. return ret;
  53. }
  54. EXPORT_SYMBOL(crc32c);
  55. static int __init libcrc32c_mod_init(void)
  56. {
  57. tfm = crypto_alloc_shash("crc32c", 0, 0);
  58. return PTR_ERR_OR_ZERO(tfm);
  59. }
  60. static void __exit libcrc32c_mod_fini(void)
  61. {
  62. crypto_free_shash(tfm);
  63. }
  64. module_init(libcrc32c_mod_init);
  65. module_exit(libcrc32c_mod_fini);
  66. MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
  67. MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");
  68. MODULE_LICENSE("GPL");
  69. MODULE_SOFTDEP("pre: crc32c");