Coverage Report

Created: 2022-05-20 06:13

/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
}