hash_crc32.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 7 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2018 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. #include "php_hash.h"
  20. #include "php_hash_crc32.h"
  21. #include "php_hash_crc32_tables.h"
  22. PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context)
  23. {
  24. context->state = ~0;
  25. }
  26. PHP_HASH_API void PHP_CRC32Update(PHP_CRC32_CTX *context, const unsigned char *input, size_t len)
  27. {
  28. size_t i;
  29. for (i = 0; i < len; ++i) {
  30. context->state = (context->state << 8) ^ crc32_table[(context->state >> 24) ^ (input[i] & 0xff)];
  31. }
  32. }
  33. PHP_HASH_API void PHP_CRC32BUpdate(PHP_CRC32_CTX *context, const unsigned char *input, size_t len)
  34. {
  35. size_t i;
  36. for (i = 0; i < len; ++i) {
  37. context->state = (context->state >> 8) ^ crc32b_table[(context->state ^ input[i]) & 0xff];
  38. }
  39. }
  40. PHP_HASH_API void PHP_CRC32Final(unsigned char digest[4], PHP_CRC32_CTX *context)
  41. {
  42. context->state=~context->state;
  43. digest[3] = (unsigned char) ((context->state >> 24) & 0xff);
  44. digest[2] = (unsigned char) ((context->state >> 16) & 0xff);
  45. digest[1] = (unsigned char) ((context->state >> 8) & 0xff);
  46. digest[0] = (unsigned char) (context->state & 0xff);
  47. context->state = 0;
  48. }
  49. PHP_HASH_API void PHP_CRC32BFinal(unsigned char digest[4], PHP_CRC32_CTX *context)
  50. {
  51. context->state=~context->state;
  52. digest[0] = (unsigned char) ((context->state >> 24) & 0xff);
  53. digest[1] = (unsigned char) ((context->state >> 16) & 0xff);
  54. digest[2] = (unsigned char) ((context->state >> 8) & 0xff);
  55. digest[3] = (unsigned char) (context->state & 0xff);
  56. context->state = 0;
  57. }
  58. PHP_HASH_API int PHP_CRC32Copy(const php_hash_ops *ops, PHP_CRC32_CTX *orig_context, PHP_CRC32_CTX *copy_context)
  59. {
  60. copy_context->state = orig_context->state;
  61. return SUCCESS;
  62. }
  63. const php_hash_ops php_hash_crc32_ops = {
  64. (php_hash_init_func_t) PHP_CRC32Init,
  65. (php_hash_update_func_t) PHP_CRC32Update,
  66. (php_hash_final_func_t) PHP_CRC32Final,
  67. (php_hash_copy_func_t) PHP_CRC32Copy,
  68. 4, /* what to say here? */
  69. 4,
  70. sizeof(PHP_CRC32_CTX),
  71. 0
  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. 0
  82. };
  83. /*
  84. * Local variables:
  85. * tab-width: 4
  86. * c-basic-offset: 4
  87. * End:
  88. * vim600: sw=4 ts=4 fdm=marker
  89. * vim<600: sw=4 ts=4
  90. */