/src/serenity/Userland/Libraries/LibCrypto/Checksum/CRC32.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2020-2022, the SerenityOS developers. |
3 | | * |
4 | | * SPDX-License-Identifier: BSD-2-Clause |
5 | | */ |
6 | | |
7 | | #include <AK/Array.h> |
8 | | #include <AK/Span.h> |
9 | | #include <AK/Types.h> |
10 | | #include <LibCrypto/Checksum/CRC32.h> |
11 | | |
12 | | namespace Crypto::Checksum { |
13 | | |
14 | | static constexpr auto generate_table() |
15 | 0 | { |
16 | 0 | Array<u32, 256> data {}; |
17 | 0 | for (auto i = 0u; i < data.size(); i++) { |
18 | 0 | u32 value = i; |
19 | 0 |
|
20 | 0 | for (auto j = 0; j < 8; j++) { |
21 | 0 | if (value & 1) { |
22 | 0 | value = 0xEDB88320 ^ (value >> 1); |
23 | 0 | } else { |
24 | 0 | value = value >> 1; |
25 | 0 | } |
26 | 0 | } |
27 | 0 |
|
28 | 0 | data[i] = value; |
29 | 0 | } |
30 | 0 | return data; |
31 | 0 | } |
32 | | |
33 | | static constexpr auto table = generate_table(); |
34 | | |
35 | | void CRC32::update(ReadonlyBytes data) |
36 | 161k | { |
37 | 336M | for (size_t i = 0; i < data.size(); i++) { |
38 | 336M | m_state = table[(m_state ^ data.at(i)) & 0xFF] ^ (m_state >> 8); |
39 | 336M | } |
40 | 161k | }; |
41 | | |
42 | | u32 CRC32::digest() |
43 | 78.5k | { |
44 | 78.5k | return ~m_state; |
45 | 78.5k | } |
46 | | |
47 | | } |