CRC32.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Span.h>
  8. #include <AK/Types.h>
  9. #include <LibCrypto/Checksum/ChecksumFunction.h>
  10. namespace Crypto::Checksum {
  11. struct Table {
  12. u32 data[256];
  13. constexpr Table()
  14. : data()
  15. {
  16. for (auto i = 0; i < 256; i++) {
  17. u32 value = i;
  18. for (auto j = 0; j < 8; j++) {
  19. if (value & 1) {
  20. value = 0xEDB88320 ^ (value >> 1);
  21. } else {
  22. value = value >> 1;
  23. }
  24. }
  25. data[i] = value;
  26. }
  27. }
  28. constexpr u32 operator[](int index) const
  29. {
  30. return data[index];
  31. }
  32. };
  33. constexpr static auto table = Table();
  34. class CRC32 : public ChecksumFunction<u32> {
  35. public:
  36. CRC32() { }
  37. CRC32(ReadonlyBytes data)
  38. {
  39. update(data);
  40. }
  41. CRC32(u32 initial_state, ReadonlyBytes data)
  42. : m_state(initial_state)
  43. {
  44. update(data);
  45. }
  46. void update(ReadonlyBytes data);
  47. u32 digest();
  48. private:
  49. u32 m_state { ~0u };
  50. };
  51. }