]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/lib/crc32.c
Add crc32 test program
[bacula/bacula] / bacula / src / lib / crc32.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version three of the GNU Affero General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU Affero General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  *  32 bit CRC.  Algorithm from RFC 2083 (png format)
30  *
31  *   By Kern Sibbald, January 2001
32  *
33  */
34
35 #ifdef GENERATE_STATIC_CRC_TABLE
36 /*
37  * The following code can be used to generate the static CRC table.
38  *
39  * Note, the magic number 0xedb88320L below comes from the terms
40  * of the defining polynomial x^n,
41  * where n=0,1,2,4,5,7,8,10,11,12,16,22,23,26
42  */
43 #include <stdio.h>
44
45 main()
46 {
47    unsigned long crc;
48    unsigned long buf[5];
49    int i, j, k;
50    k = 0;
51    for (i = 0; i < 256; i++) {
52       crc = (unsigned long)i;
53       for (j = 0; j < 8; j++) {
54          if (crc & 1) {
55             crc = 0xedb88320L ^ (crc >> 1);
56          } else {
57             crc = crc >> 1;
58          }
59       }
60       buf[k++] = crc;
61       if (k == 5) {
62          k = 0;
63          printf("  0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x,\n",
64             buf[0], buf[1], buf[2], buf[3], buf[4]);
65       }
66    }
67    printf("  0x%08x\n", buf[0]);
68 }
69 #endif
70
71 #include "bacula.h"
72
73 static uint32_t crc_table[256] = {
74   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
75   0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
76   0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
77   0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
78   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
79   0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
80   0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
81   0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
82   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
83   0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
84   0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
85   0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
86   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
87   0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
88   0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
89   0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
90   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
91   0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
92   0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
93   0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
94   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
95   0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
96   0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
97   0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
98   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
99   0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
100   0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
101   0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
102   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
103   0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
104   0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
105   0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
106   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
107   0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
108   0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
109   0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
110   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
111   0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
112   0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
113   0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
114   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
115   0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
116   0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
117   0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
118   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
119   0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
120   0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
121   0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
122   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
123   0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
124   0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
125   0x2d02ef8d
126 };
127
128 /*
129  * Calculate the PNG 32 bit CRC on a buffer */
130 uint32_t bcrc32(uint8_t *buf, int len)
131 {
132   uint32_t crc = 0xFFFFFFFFL;
133   int i;
134
135   for (i=0; i < len; i++) {
136      crc = crc_table[(crc ^ buf[i]) & 0xFF] ^ (crc >> 8);
137   }
138   return crc ^ 0xFFFFFFFFL;
139 }
140
141
142
143 #ifdef CRC32_SUM
144
145 static void usage()
146 {
147    fprintf(stderr,
148 "\n"
149 "Usage: crc32 <data-file>\n"
150 "       -?          print this message.\n"
151 "\n\n");
152
153    exit(1);
154 }
155
156 /*
157  * Reads a single ASCII file and prints the HEX md5 sum.
158  */
159 #include <stdio.h>
160 int main(int argc, char *argv[]) 
161 {
162    FILE *fd;
163    char buf[5000];
164    int ch;
165
166    while ((ch = getopt(argc, argv, "h?")) != -1) {
167       switch (ch) {
168       case 'h':
169       case '?':
170       default:
171          usage();
172       }
173    }
174
175    argc -= optind;
176    argv += optind;
177
178    if (argc < 1) {
179       printf("Must have filename\n");
180       exit(1);
181    }
182
183    fd = fopen(argv[0], "rb");
184    if (!fd) {
185       printf("Could not open %s: ERR=%s\n", argv[0], strerror(errno));
186       exit(1);
187    }
188    uint32_t res;
189    while (fgets(buf, sizeof(buf), fd)) {
190       res = bcrc32((unsigned char *)buf, strlen(buf));
191       printf("%02x\n", res); 
192    }
193    printf("  %s (old)\n", argv[0]);
194    fclose(fd);
195 }
196 #endif