hash_crc32.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 5 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2016 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.01 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.php.net/license/3_01.txt |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Michael Wallner <mike@php.net> |
  16. | Sara Golemon <pollita@php.net> |
  17. +----------------------------------------------------------------------+
  18. */
  19. /* $Id$ */
  20. #include "php_hash.h"
  21. #include "php_hash_crc32.h"
  22. #include "php_hash_crc32_tables.h"
  23. PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context)
  24. {
  25. context->state = ~0;
  26. }
  27. PHP_HASH_API void PHP_CRC32Update(PHP_CRC32_CTX *context, const unsigned char *input, size_t len)
  28. {
  29. size_t i;
  30. for (i = 0; i < len; ++i) {
  31. context->state = (context->state << 8) ^ crc32_table[(context->state >> 24) ^ (input[i] & 0xff)];
  32. }
  33. }
  34. PHP_HASH_API void PHP_CRC32BUpdate(PHP_CRC32_CTX *context, const unsigned char *input, size_t len)
  35. {
  36. size_t i;
  37. for (i = 0; i < len; ++i) {
  38. context->state = (context->state >> 8) ^ crc32b_table[(context->state ^ input[i]) & 0xff];
  39. }
  40. }
  41. PHP_HASH_API void PHP_CRC32Final(unsigned char digest[4], PHP_CRC32_CTX *context)
  42. {
  43. context->state=~context->state;
  44. digest[3] = (unsigned char) ((context->state >> 24) & 0xff);
  45. digest[2] = (unsigned char) ((context->state >> 16) & 0xff);
  46. digest[1] = (unsigned char) ((context->state >> 8) & 0xff);
  47. digest[0] = (unsigned char) (context->state & 0xff);
  48. context->state = 0;
  49. }
  50. PHP_HASH_API void PHP_CRC32BFinal(unsigned char digest[4], PHP_CRC32_CTX *context)
  51. {
  52. context->state=~context->state;
  53. digest[0] = (unsigned char) ((context->state >> 24) & 0xff);
  54. digest[1] = (unsigned char) ((context->state >> 16) & 0xff);
  55. digest[2] = (unsigned char) ((context->state >> 8) & 0xff);
  56. digest[3] = (unsigned char) (context->state & 0xff);
  57. context->state = 0;
  58. }
  59. PHP_HASH_API int PHP_CRC32Copy(const php_hash_ops *ops, PHP_CRC32_CTX *orig_context, PHP_CRC32_CTX *copy_context)
  60. {
  61. copy_context->state = orig_context->state;
  62. return SUCCESS;
  63. }
  64. const php_hash_ops php_hash_crc32_ops = {
  65. (php_hash_init_func_t) PHP_CRC32Init,
  66. (php_hash_update_func_t) PHP_CRC32Update,
  67. (php_hash_final_func_t) PHP_CRC32Final,
  68. (php_hash_copy_func_t) PHP_CRC32Copy,
  69. 4, /* what to say here? */
  70. 4,
  71. sizeof(PHP_CRC32_CTX)
  72. };
  73. const php_hash_ops php_hash_crc32b_ops = {
  74. (php_hash_init_func_t) PHP_CRC32Init,
  75. (php_hash_update_func_t) PHP_CRC32BUpdate,
  76. (php_hash_final_func_t) PHP_CRC32BFinal,
  77. (php_hash_copy_func_t) PHP_CRC32Copy,
  78. 4, /* what to say here? */
  79. 4,
  80. sizeof(PHP_CRC32_CTX)
  81. };
  82. /*
  83. * Local variables:
  84. * tab-width: 4
  85. * c-basic-offset: 4
  86. * End:
  87. * vim600: sw=4 ts=4 fdm=marker
  88. * vim<600: sw=4 ts=4
  89. */