/*
 * Copyright (c) 2008-2015 Freescale Semiconductor, Inc.
 * Copyright 2016-2018 NXP
 * All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */
#if !defined(_crc_h_)
#define CRYPTOPP_CRC32_H

#include "stdafx.h"

const uint32_t CRC32_NEGL = 0xffffffffL;

#ifdef __LITTLE_ENDIAN__
#define CRC32_INDEX(c) (c & 0xff)
#define CRC32_SHIFTED(c) (c >> 8)
#else
#define CRC32_INDEX(c) (c >> 24)
#define CRC32_SHIFTED(c) (c << 8)
#endif

//! CRC Checksum Calculation
class CRC32
{
public:
    enum
    {
        DIGESTSIZE = 4
    };

    CRC32();

    void update(const uint8_t *input, unsigned length);

    void truncatedFinal(uint8_t *hash, unsigned size);

    void updateByte(uint8_t b) { m_crc = m_tab[CRC32_INDEX(m_crc) ^ b] ^ CRC32_SHIFTED(m_crc); }
    uint8_t getCrcByte(unsigned i) const { return ((uint8_t *)&(m_crc))[i]; }
private:
    void reset()
    {
        m_crc = CRC32_NEGL;
        m_count = 0;
    }

    static const uint32_t m_tab[256];
    uint32_t m_crc;
    unsigned m_count;
};

#endif // _crc_h_
