1*a03ca8b9SKrzysztof Kosiński // Copyright 2017 The Chromium Authors. All rights reserved. 2*a03ca8b9SKrzysztof Kosiński // Use of this source code is governed by a BSD-style license that can be 3*a03ca8b9SKrzysztof Kosiński // found in the LICENSE file. 4*a03ca8b9SKrzysztof Kosiński 5*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/crc32.h" 6*a03ca8b9SKrzysztof Kosiński 7*a03ca8b9SKrzysztof Kosiński #include <array> 8*a03ca8b9SKrzysztof Kosiński 9*a03ca8b9SKrzysztof Kosiński #include "base/check_op.h" 10*a03ca8b9SKrzysztof Kosiński 11*a03ca8b9SKrzysztof Kosiński namespace zucchini { 12*a03ca8b9SKrzysztof Kosiński 13*a03ca8b9SKrzysztof Kosiński namespace { 14*a03ca8b9SKrzysztof Kosiński MakeCrc32Table()15*a03ca8b9SKrzysztof Kosińskistd::array<uint32_t, 256> MakeCrc32Table() { 16*a03ca8b9SKrzysztof Kosiński constexpr uint32_t kCrc32Poly = 0xEDB88320; 17*a03ca8b9SKrzysztof Kosiński 18*a03ca8b9SKrzysztof Kosiński std::array<uint32_t, 256> crc32Table; 19*a03ca8b9SKrzysztof Kosiński for (uint32_t i = 0; i < 256; ++i) { 20*a03ca8b9SKrzysztof Kosiński uint32_t r = i; 21*a03ca8b9SKrzysztof Kosiński for (int j = 0; j < 8; ++j) 22*a03ca8b9SKrzysztof Kosiński r = (r >> 1) ^ (kCrc32Poly & ~((r & 1) - 1)); 23*a03ca8b9SKrzysztof Kosiński crc32Table[i] = r; 24*a03ca8b9SKrzysztof Kosiński } 25*a03ca8b9SKrzysztof Kosiński return crc32Table; 26*a03ca8b9SKrzysztof Kosiński } 27*a03ca8b9SKrzysztof Kosiński 28*a03ca8b9SKrzysztof Kosiński } // namespace 29*a03ca8b9SKrzysztof Kosiński 30*a03ca8b9SKrzysztof Kosiński // Minimalistic CRC-32 implementation for Zucchini usage. Adapted from LZMA SDK 31*a03ca8b9SKrzysztof Kosiński // (found at third_party/lzma_sdk/7zCrc.c), which is public domain. CalculateCrc32(const uint8_t * first,const uint8_t * last)32*a03ca8b9SKrzysztof Kosińskiuint32_t CalculateCrc32(const uint8_t* first, const uint8_t* last) { 33*a03ca8b9SKrzysztof Kosiński DCHECK_GE(last, first); 34*a03ca8b9SKrzysztof Kosiński 35*a03ca8b9SKrzysztof Kosiński static const std::array<uint32_t, 256> kCrc32Table = MakeCrc32Table(); 36*a03ca8b9SKrzysztof Kosiński 37*a03ca8b9SKrzysztof Kosiński uint32_t ret = 0xFFFFFFFF; 38*a03ca8b9SKrzysztof Kosiński for (; first != last; ++first) 39*a03ca8b9SKrzysztof Kosiński ret = kCrc32Table[(ret ^ *first) & 0xFF] ^ (ret >> 8); 40*a03ca8b9SKrzysztof Kosiński return ret ^ 0xFFFFFFFF; 41*a03ca8b9SKrzysztof Kosiński } 42*a03ca8b9SKrzysztof Kosiński 43*a03ca8b9SKrzysztof Kosiński } // namespace zucchini 44