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