1*caf54c4fSMartin Matuska /*- 2*caf54c4fSMartin Matuska * Copyright (c) 2009 Joerg Sonnenberger 3*caf54c4fSMartin Matuska * All rights reserved. 4*caf54c4fSMartin Matuska * 5*caf54c4fSMartin Matuska * Redistribution and use in source and binary forms, with or without 6*caf54c4fSMartin Matuska * modification, are permitted provided that the following conditions 7*caf54c4fSMartin Matuska * are met: 8*caf54c4fSMartin Matuska * 1. Redistributions of source code must retain the above copyright 9*caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer. 10*caf54c4fSMartin Matuska * 2. Redistributions in binary form must reproduce the above copyright 11*caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer in the 12*caf54c4fSMartin Matuska * documentation and/or other materials provided with the distribution. 13*caf54c4fSMartin Matuska * 14*caf54c4fSMartin Matuska * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15*caf54c4fSMartin Matuska * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16*caf54c4fSMartin Matuska * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17*caf54c4fSMartin Matuska * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18*caf54c4fSMartin Matuska * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19*caf54c4fSMartin Matuska * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20*caf54c4fSMartin Matuska * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21*caf54c4fSMartin Matuska * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22*caf54c4fSMartin Matuska * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23*caf54c4fSMartin Matuska * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24*caf54c4fSMartin Matuska * 25*caf54c4fSMartin Matuska * $FreeBSD: head/lib/libarchive/archive_crc32.h 201102 2009-12-28 03:11:36Z kientzle $ 26*caf54c4fSMartin Matuska */ 27*caf54c4fSMartin Matuska 28*caf54c4fSMartin Matuska #ifndef __LIBARCHIVE_BUILD 29*caf54c4fSMartin Matuska #error This header is only to be used internally to libarchive. 30*caf54c4fSMartin Matuska #endif 31*caf54c4fSMartin Matuska 32*caf54c4fSMartin Matuska /* 33*caf54c4fSMartin Matuska * When zlib is unavailable, we should still be able to validate 34*caf54c4fSMartin Matuska * uncompressed zip archives. That requires us to be able to compute 35*caf54c4fSMartin Matuska * the CRC32 check value. This is a drop-in compatible replacement 36*caf54c4fSMartin Matuska * for crc32() from zlib. It's slower than the zlib implementation, 37*caf54c4fSMartin Matuska * but still pretty fast: This runs about 300MB/s on my 3GHz P4 38*caf54c4fSMartin Matuska * compared to about 800MB/s for the zlib implementation. 39*caf54c4fSMartin Matuska */ 40*caf54c4fSMartin Matuska static unsigned long 41*caf54c4fSMartin Matuska crc32(unsigned long crc, const void *_p, size_t len) 42*caf54c4fSMartin Matuska { 43*caf54c4fSMartin Matuska unsigned long crc2, b, i; 44*caf54c4fSMartin Matuska const unsigned char *p = _p; 45*caf54c4fSMartin Matuska static volatile int crc_tbl_inited = 0; 46*caf54c4fSMartin Matuska static unsigned long crc_tbl[256]; 47*caf54c4fSMartin Matuska 48*caf54c4fSMartin Matuska if (!crc_tbl_inited) { 49*caf54c4fSMartin Matuska for (b = 0; b < 256; ++b) { 50*caf54c4fSMartin Matuska crc2 = b; 51*caf54c4fSMartin Matuska for (i = 8; i > 0; --i) { 52*caf54c4fSMartin Matuska if (crc2 & 1) 53*caf54c4fSMartin Matuska crc2 = (crc2 >> 1) ^ 0xedb88320UL; 54*caf54c4fSMartin Matuska else 55*caf54c4fSMartin Matuska crc2 = (crc2 >> 1); 56*caf54c4fSMartin Matuska } 57*caf54c4fSMartin Matuska crc_tbl[b] = crc2; 58*caf54c4fSMartin Matuska } 59*caf54c4fSMartin Matuska crc_tbl_inited = 1; 60*caf54c4fSMartin Matuska } 61*caf54c4fSMartin Matuska 62*caf54c4fSMartin Matuska crc = crc ^ 0xffffffffUL; 63*caf54c4fSMartin Matuska while (len--) 64*caf54c4fSMartin Matuska crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); 65*caf54c4fSMartin Matuska return (crc ^ 0xffffffffUL); 66*caf54c4fSMartin Matuska } 67