crc.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // SPDX-License-Identifier: LGPL-2.1-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2011-2014 Intel Corporation
  7. * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
  8. *
  9. *
  10. */
  11. #ifdef HAVE_CONFIG_H
  12. #include <config.h>
  13. #endif
  14. #include "crc.h"
  15. uint32_t crc24_bit_reverse(uint32_t value)
  16. {
  17. uint32_t result = 0;
  18. uint8_t i;
  19. for (i = 0; i < 24; i++)
  20. result |= ((value >> i) & 1) << (23 - i);
  21. return result;
  22. }
  23. uint32_t crc24_calculate(uint32_t preset, const uint8_t *data, uint8_t len)
  24. {
  25. uint32_t state = preset;
  26. uint8_t i;
  27. for (i = 0; i < len; i++) {
  28. uint8_t n, cur = data[i];
  29. for (n = 0; n < 8; n++) {
  30. int next_bit = (state ^ cur) & 1;
  31. cur >>= 1;
  32. state >>= 1;
  33. if (next_bit) {
  34. state |= 1 << 23;
  35. state ^= 0x5a6000;
  36. }
  37. }
  38. }
  39. return state;
  40. }
  41. uint32_t crc24_reverse(uint32_t crc, const uint8_t *data, uint8_t len)
  42. {
  43. uint32_t state = crc;
  44. uint8_t i;
  45. for (i = 0; i < len; i++) {
  46. uint8_t n, cur = data[len - i - 1];
  47. for (n = 0; n < 8; n++) {
  48. int top_bit = state >> 23;
  49. state = (state << 1) & 0xffffff;
  50. state |= top_bit ^ ((cur >> (7 - n)) & 1);
  51. if (top_bit)
  52. state ^= 0xb4c000;
  53. }
  54. }
  55. return state;
  56. }