bool EbmlCrc32::CheckCRC(uint32 inputCRC, const binary *input, uint32 length) { uint32 crc = CRC32_NEGL; for(; !IsAligned<uint32>(input) && length > 0; length--) crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc); while (length >= 4) { crc ^= *(const uint32 *)input; crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); length -= 4; input += 4; } while (length--) crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc); //Now we finalize the CRC32 crc ^= CRC32_NEGL; if (crc == inputCRC) return true; return false; };
void CRC32C::Update(const byte *s, size_t n) { #if CRYPTOPP_BOOL_SSE4_INTRINSICS_AVAILABLE if (HasSSE4()) { for(; !IsAligned<word32>(s) && n > 0; s++, n--) m_crc = _mm_crc32_u8(m_crc, *s); for(; n > 4; s+=4, n-=4) m_crc = _mm_crc32_u32(m_crc, *(const word32 *)(void*)s); for(; n > 0; s++, n--) m_crc = _mm_crc32_u8(m_crc, *s); return; } #elif (CRYPTOPP_BOOL_ARM_CRC32_INTRINSICS_AVAILABLE) if (HasCRC32()) { for(; !IsAligned<word32>(s) && n > 0; s++, n--) m_crc = __crc32cb(m_crc, *s); for(; n > 4; s+=4, n-=4) m_crc = __crc32cw(m_crc, *(const word32 *)(void*)s); for(; n > 0; s++, n--) m_crc = __crc32cb(m_crc, *s); return; } #endif word32 crc = m_crc; for(; !IsAligned<word32>(s) && n > 0; n--) crc = m_tab[CRC32_INDEX(crc) ^ *s++] ^ CRC32_SHIFTED(crc); while (n >= 4) { crc ^= *(const word32 *)(void*)s; crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); n -= 4; s += 4; } while (n--) crc = m_tab[CRC32_INDEX(crc) ^ *s++] ^ CRC32_SHIFTED(crc); m_crc = crc; }
void crc32::update(const char * s, size_t n) { for(; (size_t(s) % 4 != 0) && n > 0; n--) { crc = table[CRC32_INDEX(crc) ^ uint8_t(*s++)] ^ CRC32_SHIFTED(crc); } while(n >= 4) { crc ^= *reinterpret_cast<const uint32_t *>(s); crc = table[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = table[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = table[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = table[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); n -= 4; s += 4; } while(n--) { crc = table[CRC32_INDEX(crc) ^ uint8_t(*s++)] ^ CRC32_SHIFTED(crc); } }
void EbmlCrc32::Update(const binary *input, uint32 length) { uint32 crc = m_crc; for(; !IsAligned<uint32>(input) && length > 0; length--) crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc); while (length >= 4) { crc ^= *(const uint32 *)input; crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); length -= 4; input += 4; } while (length--) crc = m_tab[CRC32_INDEX(crc) ^ *input++] ^ CRC32_SHIFTED(crc); m_crc = crc; }
void CRC32::Update(const byte *s, size_t n) { uint crc = m_crc; for(; !IsAligned<uint>(s) && n > 0; n--) crc = m_tab[CRC32_INDEX(crc) ^ *s++] ^ CRC32_SHIFTED(crc); while (n >= 4) { crc ^= *(const uint*)s; crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); crc = m_tab[CRC32_INDEX(crc)] ^ CRC32_SHIFTED(crc); n -= 4; s += 4; } while (n--) crc = m_tab[CRC32_INDEX(crc) ^ *s++] ^ CRC32_SHIFTED(crc); m_crc = crc; }
void EbmlCrc32::UpdateByte(binary b) { m_crc = m_tab[CRC32_INDEX(m_crc) ^ b] ^ CRC32_SHIFTED(m_crc); }