summaryrefslogtreecommitdiff
path: root/plugins/CryptoPP/crypto/crc.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CryptoPP/crypto/crc.h')
-rw-r--r--plugins/CryptoPP/crypto/crc.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/plugins/CryptoPP/crypto/crc.h b/plugins/CryptoPP/crypto/crc.h
new file mode 100644
index 0000000000..ffe90f4c46
--- /dev/null
+++ b/plugins/CryptoPP/crypto/crc.h
@@ -0,0 +1,41 @@
+#ifndef CRYPTOPP_CRC32_H
+#define CRYPTOPP_CRC32_H
+
+#include "cryptlib.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+const word32 CRC32_NEGL = 0xffffffffL;
+
+#ifdef IS_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 HashTransformation
+{
+public:
+ CRYPTOPP_CONSTANT(DIGESTSIZE = 4)
+ CRC32();
+ void Update(const byte *input, size_t length);
+ void TruncatedFinal(byte *hash, size_t size);
+ unsigned int DigestSize() const {return DIGESTSIZE;}
+ std::string AlgorithmName() const {return "CRC32";}
+
+ void UpdateByte(byte b) {m_crc = m_tab[CRC32_INDEX(m_crc) ^ b] ^ CRC32_SHIFTED(m_crc);}
+ byte GetCrcByte(size_t i) const {return ((byte *)&(m_crc))[i];}
+
+private:
+ void Reset() {m_crc = CRC32_NEGL;}
+
+ static const word32 m_tab[256];
+ word32 m_crc;
+};
+
+NAMESPACE_END
+
+#endif