1e7b4ff9317fc4e551cf974684eaa88697de5a28srs/* 2e7b4ff9317fc4e551cf974684eaa88697de5a28srs * efone - Distributed internet phone system. 3e7b4ff9317fc4e551cf974684eaa88697de5a28srs * 4e7b4ff9317fc4e551cf974684eaa88697de5a28srs * (c) 1999,2000 Krzysztof Dabrowski 5e7b4ff9317fc4e551cf974684eaa88697de5a28srs * (c) 1999,2000 ElysiuM deeZine 6e7b4ff9317fc4e551cf974684eaa88697de5a28srs * 7e7b4ff9317fc4e551cf974684eaa88697de5a28srs * This program is free software; you can redistribute it and/or 8e7b4ff9317fc4e551cf974684eaa88697de5a28srs * modify it under the terms of the GNU General Public License 9e7b4ff9317fc4e551cf974684eaa88697de5a28srs * as published by the Free Software Foundation; either version 10e7b4ff9317fc4e551cf974684eaa88697de5a28srs * 2 of the License, or (at your option) any later version. 11e7b4ff9317fc4e551cf974684eaa88697de5a28srs * 12e7b4ff9317fc4e551cf974684eaa88697de5a28srs */ 13e7b4ff9317fc4e551cf974684eaa88697de5a28srs 14e7b4ff9317fc4e551cf974684eaa88697de5a28srs/* based on implementation by Finn Yannick Jacobs */ 15e7b4ff9317fc4e551cf974684eaa88697de5a28srs 16e7b4ff9317fc4e551cf974684eaa88697de5a28srs#include <stdio.h> 17e7b4ff9317fc4e551cf974684eaa88697de5a28srs#include <stdlib.h> 18221e08768de7fe42ba533ca22baf671420569c07srs#include <sys/types.h> 19546a9c7c369df465021feecb20f6a8f81b6df6bcsrs#include "crc32.h" 20e7b4ff9317fc4e551cf974684eaa88697de5a28srs 21e7b4ff9317fc4e551cf974684eaa88697de5a28srs/* crc_tab[] -- this crcTable is being build by chksum_crc32GenTab(). 22e7b4ff9317fc4e551cf974684eaa88697de5a28srs * so make sure, you call it before using the other 23e7b4ff9317fc4e551cf974684eaa88697de5a28srs * functions! 24e7b4ff9317fc4e551cf974684eaa88697de5a28srs */ 25546a9c7c369df465021feecb20f6a8f81b6df6bcsrsuint32_t crc_tab[256]; 26e7b4ff9317fc4e551cf974684eaa88697de5a28srs 27e7b4ff9317fc4e551cf974684eaa88697de5a28srs/* chksum_crc() -- to a given block, this one calculates the 28e7b4ff9317fc4e551cf974684eaa88697de5a28srs * crc32-checksum until the length is 29e7b4ff9317fc4e551cf974684eaa88697de5a28srs * reached. the crc32-checksum will be 30e7b4ff9317fc4e551cf974684eaa88697de5a28srs * the result. 31e7b4ff9317fc4e551cf974684eaa88697de5a28srs */ 32546a9c7c369df465021feecb20f6a8f81b6df6bcsrsuint32_t chksum_crc32 (unsigned char *block, unsigned int length) 33e7b4ff9317fc4e551cf974684eaa88697de5a28srs{ 34e7b4ff9317fc4e551cf974684eaa88697de5a28srs register unsigned long crc; 35e7b4ff9317fc4e551cf974684eaa88697de5a28srs unsigned long i; 36e7b4ff9317fc4e551cf974684eaa88697de5a28srs 37e7b4ff9317fc4e551cf974684eaa88697de5a28srs crc = 0xFFFFFFFF; 38e7b4ff9317fc4e551cf974684eaa88697de5a28srs for (i = 0; i < length; i++) 39e7b4ff9317fc4e551cf974684eaa88697de5a28srs { 40e7b4ff9317fc4e551cf974684eaa88697de5a28srs crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *block++) & 0xFF]; 41e7b4ff9317fc4e551cf974684eaa88697de5a28srs } 42e7b4ff9317fc4e551cf974684eaa88697de5a28srs return (crc ^ 0xFFFFFFFF); 43e7b4ff9317fc4e551cf974684eaa88697de5a28srs} 44e7b4ff9317fc4e551cf974684eaa88697de5a28srs 45e7b4ff9317fc4e551cf974684eaa88697de5a28srs/* chksum_crc32gentab() -- to a global crc_tab[256], this one will 46e7b4ff9317fc4e551cf974684eaa88697de5a28srs * calculate the crcTable for crc32-checksums. 47e7b4ff9317fc4e551cf974684eaa88697de5a28srs * it is generated to the polynom [..] 48e7b4ff9317fc4e551cf974684eaa88697de5a28srs */ 49e7b4ff9317fc4e551cf974684eaa88697de5a28srs 50e7b4ff9317fc4e551cf974684eaa88697de5a28srsvoid chksum_crc32gentab () 51e7b4ff9317fc4e551cf974684eaa88697de5a28srs{ 52e7b4ff9317fc4e551cf974684eaa88697de5a28srs unsigned long crc, poly; 53e7b4ff9317fc4e551cf974684eaa88697de5a28srs int i, j; 54e7b4ff9317fc4e551cf974684eaa88697de5a28srs 55e7b4ff9317fc4e551cf974684eaa88697de5a28srs poly = 0xEDB88320L; 56e7b4ff9317fc4e551cf974684eaa88697de5a28srs for (i = 0; i < 256; i++) 57e7b4ff9317fc4e551cf974684eaa88697de5a28srs { 58e7b4ff9317fc4e551cf974684eaa88697de5a28srs crc = i; 59e7b4ff9317fc4e551cf974684eaa88697de5a28srs for (j = 8; j > 0; j--) 60e7b4ff9317fc4e551cf974684eaa88697de5a28srs { 61e7b4ff9317fc4e551cf974684eaa88697de5a28srs if (crc & 1) 62e7b4ff9317fc4e551cf974684eaa88697de5a28srs { 63e7b4ff9317fc4e551cf974684eaa88697de5a28srs crc = (crc >> 1) ^ poly; 64e7b4ff9317fc4e551cf974684eaa88697de5a28srs } 65e7b4ff9317fc4e551cf974684eaa88697de5a28srs else 66e7b4ff9317fc4e551cf974684eaa88697de5a28srs { 67e7b4ff9317fc4e551cf974684eaa88697de5a28srs crc >>= 1; 68e7b4ff9317fc4e551cf974684eaa88697de5a28srs } 69e7b4ff9317fc4e551cf974684eaa88697de5a28srs } 70e7b4ff9317fc4e551cf974684eaa88697de5a28srs crc_tab[i] = crc; 71e7b4ff9317fc4e551cf974684eaa88697de5a28srs } 72e7b4ff9317fc4e551cf974684eaa88697de5a28srs} 73