SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Loading...
Searching...
No Matches
CRC32.cpp
Go to the documentation of this file.
2
3#include <BufferStream.h>
4
5using namespace sourcepp;
6
13namespace tomcrypt {
14
15namespace {
16
17constexpr uint32_t CRC32_NEGL = 0xffffffffUL;
18
19struct crc32_state {
20 uint32_t crc = CRC32_NEGL;
21};
22
23[[nodiscard]] bool crc32_update(crc32_state& ctx, const uint8_t* input, unsigned long length) {
24 if (!input) {
25 return false;
26 }
27 auto crc = ctx.crc;
28
29 while (length--) {
30 if constexpr (std::endian::native == std::endian::big) {
31 static constexpr std::array crc32_m_tab{
32 0x00000000ull, 0x96300777ull, 0x2c610eeeull, 0xba510999ull, 0x19c46d07ull, 0x8ff46a70ull, 0x35a563e9ull, 0xa395649eull,
33 0x3288db0eull, 0xa4b8dc79ull, 0x1ee9d5e0ull, 0x88d9d297ull, 0x2b4cb609ull, 0xbd7cb17eull, 0x072db8e7ull, 0x911dbf90ull,
34 0x6410b71dull, 0xf220b06aull, 0x4871b9f3ull, 0xde41be84ull, 0x7dd4da1aull, 0xebe4dd6dull, 0x51b5d4f4ull, 0xc785d383ull,
35 0x56986c13ull, 0xc0a86b64ull, 0x7af962fdull, 0xecc9658aull, 0x4f5c0114ull, 0xd96c0663ull, 0x633d0ffaull, 0xf50d088dull,
36 0xc8206e3bull, 0x5e10694cull, 0xe44160d5ull, 0x727167a2ull, 0xd1e4033cull, 0x47d4044bull, 0xfd850dd2ull, 0x6bb50aa5ull,
37 0xfaa8b535ull, 0x6c98b242ull, 0xd6c9bbdbull, 0x40f9bcacull, 0xe36cd832ull, 0x755cdf45ull, 0xcf0dd6dcull, 0x593dd1abull,
38 0xac30d926ull, 0x3a00de51ull, 0x8051d7c8ull, 0x1661d0bfull, 0xb5f4b421ull, 0x23c4b356ull, 0x9995bacfull, 0x0fa5bdb8ull,
39 0x9eb80228ull, 0x0888055full, 0xb2d90cc6ull, 0x24e90bb1ull, 0x877c6f2full, 0x114c6858ull, 0xab1d61c1ull, 0x3d2d66b6ull,
40 0x9041dc76ull, 0x0671db01ull, 0xbc20d298ull, 0x2a10d5efull, 0x8985b171ull, 0x1fb5b606ull, 0xa5e4bf9full, 0x33d4b8e8ull,
41 0xa2c90778ull, 0x34f9000full, 0x8ea80996ull, 0x18980ee1ull, 0xbb0d6a7full, 0x2d3d6d08ull, 0x976c6491ull, 0x015c63e6ull,
42 0xf4516b6bull, 0x62616c1cull, 0xd8306585ull, 0x4e0062f2ull, 0xed95066cull, 0x7ba5011bull, 0xc1f40882ull, 0x57c40ff5ull,
43 0xc6d9b065ull, 0x50e9b712ull, 0xeab8be8bull, 0x7c88b9fcull, 0xdf1ddd62ull, 0x492dda15ull, 0xf37cd38cull, 0x654cd4fbull,
44 0x5861b24dull, 0xce51b53aull, 0x7400bca3ull, 0xe230bbd4ull, 0x41a5df4aull, 0xd795d83dull, 0x6dc4d1a4ull, 0xfbf4d6d3ull,
45 0x6ae96943ull, 0xfcd96e34ull, 0x468867adull, 0xd0b860daull, 0x732d0444ull, 0xe51d0333ull, 0x5f4c0aaaull, 0xc97c0dddull,
46 0x3c710550ull, 0xaa410227ull, 0x10100bbeull, 0x86200cc9ull, 0x25b56857ull, 0xb3856f20ull, 0x09d466b9ull, 0x9fe461ceull,
47 0x0ef9de5eull, 0x98c9d929ull, 0x2298d0b0ull, 0xb4a8d7c7ull, 0x173db359ull, 0x810db42eull, 0x3b5cbdb7ull, 0xad6cbac0ull,
48 0x2083b8edull, 0xb6b3bf9aull, 0x0ce2b603ull, 0x9ad2b174ull, 0x3947d5eaull, 0xaf77d29dull, 0x1526db04ull, 0x8316dc73ull,
49 0x120b63e3ull, 0x843b6494ull, 0x3e6a6d0dull, 0xa85a6a7aull, 0x0bcf0ee4ull, 0x9dff0993ull, 0x27ae000aull, 0xb19e077dull,
50 0x44930ff0ull, 0xd2a30887ull, 0x68f2011eull, 0xfec20669ull, 0x5d5762f7ull, 0xcb676580ull, 0x71366c19ull, 0xe7066b6eull,
51 0x761bd4feull, 0xe02bd389ull, 0x5a7ada10ull, 0xcc4add67ull, 0x6fdfb9f9ull, 0xf9efbe8eull, 0x43beb717ull, 0xd58eb060ull,
52 0xe8a3d6d6ull, 0x7e93d1a1ull, 0xc4c2d838ull, 0x52f2df4full, 0xf167bbd1ull, 0x6757bca6ull, 0xdd06b53full, 0x4b36b248ull,
53 0xda2b0dd8ull, 0x4c1b0aafull, 0xf64a0336ull, 0x607a0441ull, 0xc3ef60dfull, 0x55df67a8ull, 0xef8e6e31ull, 0x79be6946ull,
54 0x8cb361cbull, 0x1a8366bcull, 0xa0d26f25ull, 0x36e26852ull, 0x95770cccull, 0x03470bbbull, 0xb9160222ull, 0x2f260555ull,
55 0xbe3bbac5ull, 0x280bbdb2ull, 0x925ab42bull, 0x046ab35cull, 0xa7ffd7c2ull, 0x31cfd0b5ull, 0x8b9ed92cull, 0x1daede5bull,
56 0xb0c2649bull, 0x26f263ecull, 0x9ca36a75ull, 0x0a936d02ull, 0xa906099cull, 0x3f360eebull, 0x85670772ull, 0x13570005ull,
57 0x824abf95ull, 0x147ab8e2ull, 0xae2bb17bull, 0x381bb60cull, 0x9b8ed292ull, 0x0dbed5e5ull, 0xb7efdc7cull, 0x21dfdb0bull,
58 0xd4d2d386ull, 0x42e2d4f1ull, 0xf8b3dd68ull, 0x6e83da1full, 0xcd16be81ull, 0x5b26b9f6ull, 0xe177b06full, 0x7747b718ull,
59 0xe65a0888ull, 0x706a0fffull, 0xca3b0666ull, 0x5c0b0111ull, 0xff9e658full, 0x69ae62f8ull, 0xd3ff6b61ull, 0x45cf6c16ull,
60 0x78e20aa0ull, 0xeed20dd7ull, 0x5483044eull, 0xc2b30339ull, 0x612667a7ull, 0xf71660d0ull, 0x4d476949ull, 0xdb776e3eull,
61 0x4a6ad1aeull, 0xdc5ad6d9ull, 0x660bdf40ull, 0xf03bd837ull, 0x53aebca9ull, 0xc59ebbdeull, 0x7fcfb247ull, 0xe9ffb530ull,
62 0x1cf2bdbdull, 0x8ac2bacaull, 0x3093b353ull, 0xa6a3b424ull, 0x0536d0baull, 0x9306d7cdull, 0x2957de54ull, 0xbf67d923ull,
63 0x2e7a66b3ull, 0xb84a61c4ull, 0x021b685dull, 0x942b6f2aull, 0x37be0bb4ull, 0xa18e0cc3ull, 0x1bdf055aull, 0x8def022dull,
64 };
65 crc = crc32_m_tab[(crc >> 24) ^ *input++] ^ (crc << 8);
66 } else {
67 static constexpr std::array crc32_m_tab{
68 0x00000000ull, 0x77073096ull, 0xee0e612cull, 0x990951baull, 0x076dc419ull, 0x706af48full, 0xe963a535ull, 0x9e6495a3ull,
69 0x0edb8832ull, 0x79dcb8a4ull, 0xe0d5e91eull, 0x97d2d988ull, 0x09b64c2bull, 0x7eb17cbdull, 0xe7b82d07ull, 0x90bf1d91ull,
70 0x1db71064ull, 0x6ab020f2ull, 0xf3b97148ull, 0x84be41deull, 0x1adad47dull, 0x6ddde4ebull, 0xf4d4b551ull, 0x83d385c7ull,
71 0x136c9856ull, 0x646ba8c0ull, 0xfd62f97aull, 0x8a65c9ecull, 0x14015c4full, 0x63066cd9ull, 0xfa0f3d63ull, 0x8d080df5ull,
72 0x3b6e20c8ull, 0x4c69105eull, 0xd56041e4ull, 0xa2677172ull, 0x3c03e4d1ull, 0x4b04d447ull, 0xd20d85fdull, 0xa50ab56bull,
73 0x35b5a8faull, 0x42b2986cull, 0xdbbbc9d6ull, 0xacbcf940ull, 0x32d86ce3ull, 0x45df5c75ull, 0xdcd60dcfull, 0xabd13d59ull,
74 0x26d930acull, 0x51de003aull, 0xc8d75180ull, 0xbfd06116ull, 0x21b4f4b5ull, 0x56b3c423ull, 0xcfba9599ull, 0xb8bda50full,
75 0x2802b89eull, 0x5f058808ull, 0xc60cd9b2ull, 0xb10be924ull, 0x2f6f7c87ull, 0x58684c11ull, 0xc1611dabull, 0xb6662d3dull,
76 0x76dc4190ull, 0x01db7106ull, 0x98d220bcull, 0xefd5102aull, 0x71b18589ull, 0x06b6b51full, 0x9fbfe4a5ull, 0xe8b8d433ull,
77 0x7807c9a2ull, 0x0f00f934ull, 0x9609a88eull, 0xe10e9818ull, 0x7f6a0dbbull, 0x086d3d2dull, 0x91646c97ull, 0xe6635c01ull,
78 0x6b6b51f4ull, 0x1c6c6162ull, 0x856530d8ull, 0xf262004eull, 0x6c0695edull, 0x1b01a57bull, 0x8208f4c1ull, 0xf50fc457ull,
79 0x65b0d9c6ull, 0x12b7e950ull, 0x8bbeb8eaull, 0xfcb9887cull, 0x62dd1ddfull, 0x15da2d49ull, 0x8cd37cf3ull, 0xfbd44c65ull,
80 0x4db26158ull, 0x3ab551ceull, 0xa3bc0074ull, 0xd4bb30e2ull, 0x4adfa541ull, 0x3dd895d7ull, 0xa4d1c46dull, 0xd3d6f4fbull,
81 0x4369e96aull, 0x346ed9fcull, 0xad678846ull, 0xda60b8d0ull, 0x44042d73ull, 0x33031de5ull, 0xaa0a4c5full, 0xdd0d7cc9ull,
82 0x5005713cull, 0x270241aaull, 0xbe0b1010ull, 0xc90c2086ull, 0x5768b525ull, 0x206f85b3ull, 0xb966d409ull, 0xce61e49full,
83 0x5edef90eull, 0x29d9c998ull, 0xb0d09822ull, 0xc7d7a8b4ull, 0x59b33d17ull, 0x2eb40d81ull, 0xb7bd5c3bull, 0xc0ba6cadull,
84 0xedb88320ull, 0x9abfb3b6ull, 0x03b6e20cull, 0x74b1d29aull, 0xead54739ull, 0x9dd277afull, 0x04db2615ull, 0x73dc1683ull,
85 0xe3630b12ull, 0x94643b84ull, 0x0d6d6a3eull, 0x7a6a5aa8ull, 0xe40ecf0bull, 0x9309ff9dull, 0x0a00ae27ull, 0x7d079eb1ull,
86 0xf00f9344ull, 0x8708a3d2ull, 0x1e01f268ull, 0x6906c2feull, 0xf762575dull, 0x806567cbull, 0x196c3671ull, 0x6e6b06e7ull,
87 0xfed41b76ull, 0x89d32be0ull, 0x10da7a5aull, 0x67dd4accull, 0xf9b9df6full, 0x8ebeeff9ull, 0x17b7be43ull, 0x60b08ed5ull,
88 0xd6d6a3e8ull, 0xa1d1937eull, 0x38d8c2c4ull, 0x4fdff252ull, 0xd1bb67f1ull, 0xa6bc5767ull, 0x3fb506ddull, 0x48b2364bull,
89 0xd80d2bdaull, 0xaf0a1b4cull, 0x36034af6ull, 0x41047a60ull, 0xdf60efc3ull, 0xa867df55ull, 0x316e8eefull, 0x4669be79ull,
90 0xcb61b38cull, 0xbc66831aull, 0x256fd2a0ull, 0x5268e236ull, 0xcc0c7795ull, 0xbb0b4703ull, 0x220216b9ull, 0x5505262full,
91 0xc5ba3bbeull, 0xb2bd0b28ull, 0x2bb45a92ull, 0x5cb36a04ull, 0xc2d7ffa7ull, 0xb5d0cf31ull, 0x2cd99e8bull, 0x5bdeae1dull,
92 0x9b64c2b0ull, 0xec63f226ull, 0x756aa39cull, 0x026d930aull, 0x9c0906a9ull, 0xeb0e363full, 0x72076785ull, 0x05005713ull,
93 0x95bf4a82ull, 0xe2b87a14ull, 0x7bb12baeull, 0x0cb61b38ull, 0x92d28e9bull, 0xe5d5be0dull, 0x7cdcefb7ull, 0x0bdbdf21ull,
94 0x86d3d2d4ull, 0xf1d4e242ull, 0x68ddb3f8ull, 0x1fda836eull, 0x81be16cdull, 0xf6b9265bull, 0x6fb077e1ull, 0x18b74777ull,
95 0x88085ae6ull, 0xff0f6a70ull, 0x66063bcaull, 0x11010b5cull, 0x8f659effull, 0xf862ae69ull, 0x616bffd3ull, 0x166ccf45ull,
96 0xa00ae278ull, 0xd70dd2eeull, 0x4e048354ull, 0x3903b3c2ull, 0xa7672661ull, 0xd06016f7ull, 0x4969474dull, 0x3e6e77dbull,
97 0xaed16a4aull, 0xd9d65adcull, 0x40df0b66ull, 0x37d83bf0ull, 0xa9bcae53ull, 0xdebb9ec5ull, 0x47b2cf7full, 0x30b5ffe9ull,
98 0xbdbdf21cull, 0xcabac28aull, 0x53b39330ull, 0x24b4a3a6ull, 0xbad03605ull, 0xcdd70693ull, 0x54de5729ull, 0x23d967bfull,
99 0xb3667a2eull, 0xc4614ab8ull, 0x5d681b02ull, 0x2a6f2b94ull, 0xb40bbe37ull, 0xc30c8ea1ull, 0x5a05df1bull, 0x2d02ef8dull,
100 };
101 crc = crc32_m_tab[(crc & 0xff) ^ *input++] ^ (crc >> 8);
102 }
103 }
104
105 ctx.crc = crc;
106 return true;
107}
108
109[[nodiscard]] uint32_t crc32_finish(const crc32_state& ctx) {
110 return ctx.crc ^ CRC32_NEGL;
111}
112
113} // namespace
114
115} // namespace tomcrypt
116
117uint32_t crypto::computeCRC32(std::span<const std::byte> buffer) {
118 if (buffer.empty()) {
119 return 0;
120 }
121
122 tomcrypt::crc32_state crc32;
123 if (!tomcrypt::crc32_update(crc32, reinterpret_cast<const unsigned char*>(buffer.data()), buffer.size())) {
124 return 0;
125 }
126 return tomcrypt::crc32_finish(crc32);
127}
uint32_t computeCRC32(std::span< const std::byte > buffer)
Definition CRC32.cpp:117
Adler-32 checksum algorithm Written and placed in the public domain by Wei Dai Adapted for libtomcryp...
Definition Adler32.cpp:13