diff options
author | phk <phk@FreeBSD.org> | 1997-09-26 08:02:18 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1997-09-26 08:02:18 +0000 |
commit | f5b2fcb0c6f815432425d9ea40997a1fbf5e5ad0 (patch) | |
tree | 497278b0189320a5cb0a67bdfad51d1c684c87e6 /usr.bin/cksum | |
parent | fac1bc9849ae1889e0cb9b40de0921d076888090 (diff) | |
download | FreeBSD-src-f5b2fcb0c6f815432425d9ea40997a1fbf5e5ad0.zip FreeBSD-src-f5b2fcb0c6f815432425d9ea40997a1fbf5e5ad0.tar.gz |
Add canonical 32bit crc as alorithm 3.
PR: 4615
Reviewed by: phk
Submitted by: Mike Meyer <mwm@shiva.the-park.com>
Diffstat (limited to 'usr.bin/cksum')
-rw-r--r-- | usr.bin/cksum/Makefile | 2 | ||||
-rw-r--r-- | usr.bin/cksum/cksum.1 | 7 | ||||
-rw-r--r-- | usr.bin/cksum/cksum.c | 5 | ||||
-rw-r--r-- | usr.bin/cksum/crc32.c | 115 | ||||
-rw-r--r-- | usr.bin/cksum/extern.h | 1 |
5 files changed, 127 insertions, 3 deletions
diff --git a/usr.bin/cksum/Makefile b/usr.bin/cksum/Makefile index ee680bec..f4fa373 100644 --- a/usr.bin/cksum/Makefile +++ b/usr.bin/cksum/Makefile @@ -1,7 +1,7 @@ # @(#)Makefile 8.2 (Berkeley) 4/28/95 PROG= cksum -SRCS= cksum.c crc.c print.c sum1.c sum2.c +SRCS= cksum.c crc.c print.c sum1.c sum2.c crc32.c LINKS= ${BINDIR}/cksum ${BINDIR}/sum MLINKS= cksum.1 sum.1 diff --git a/usr.bin/cksum/cksum.1 b/usr.bin/cksum/cksum.1 index c94fceb..43fdf29 100644 --- a/usr.bin/cksum/cksum.1 +++ b/usr.bin/cksum/cksum.1 @@ -33,7 +33,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)cksum.1 8.2 (Berkeley) 4/28/95 -.\" $Id: cksum.1,v 1.4 1997/06/25 07:02:00 charnier Exp $ +.\" $Id: cksum.1,v 1.5 1997/07/06 03:03:06 bde Exp $ .\" .Dd April 28, 1995 .Dt CKSUM 1 @@ -98,6 +98,11 @@ r = s % 2^16 + (s % 2^32) / 2^16; cksum = (r % 2^16) + r / 2^16; .Ed .Pp +Algorithm 3 is what is commonly called the +.Ql 32bit CRC +algorithm. +This is a 32-bit checksum. +.Pp Both algorithm 1 and 2 write to the standard output the same fields as the default algorithm except that the size of the file in bytes is replaced with the size of the file in blocks. diff --git a/usr.bin/cksum/cksum.c b/usr.bin/cksum/cksum.c index 1917558..7a0e4b8 100644 --- a/usr.bin/cksum/cksum.c +++ b/usr.bin/cksum/cksum.c @@ -45,7 +45,7 @@ static const char copyright[] = static char sccsid[] = "@(#)cksum.c 8.2 (Berkeley) 4/28/95"; #endif static const char rcsid[] = - "$Id$"; + "$Id: cksum.c,v 1.5 1997/07/06 03:18:13 bde Exp $"; #endif /* not lint */ #include <sys/cdefs.h> @@ -95,6 +95,9 @@ main(argc, argv) } else if (!strcmp(optarg, "2")) { cfncn = csum2; pfncn = psum2; + } else if (*optarg == '3') { + cfncn = crc32; + pfncn = pcrc; } else { warnx("illegal argument to -o option"); usage(); diff --git a/usr.bin/cksum/crc32.c b/usr.bin/cksum/crc32.c new file mode 100644 index 0000000..ffeacc1 --- /dev/null +++ b/usr.bin/cksum/crc32.c @@ -0,0 +1,115 @@ +/* + * This code implements the AUTODIN II polynomial used by Ethernet, + * and can be used to calculate multicast address hash indices. + * It assumes that the low order bits will be transmitted first, + * and consequently the low byte should be sent first when + * the crc computation is finished. The crc should be complemented + * before transmission. + * The variable corresponding to the macro argument "crc" should + * be an unsigned long and should be preset to all ones for Ethernet + * use. An error-free packet will leave 0xDEBB20E3 in the crc. + * Spencer Garrett <srg@quick.com> + */ + +#define CRC(crc, ch) (crc = (crc >> 8) ^ crctab[(crc ^ (ch)) & 0xff]) + +/* generated using the AUTODIN II polynomial + * x^32 + x^26 + x^23 + x^22 + x^16 + + * x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1 + */ +unsigned long crctab[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, +}; + +#include <stdio.h> +#include <sys/types.h> + +u_long crc32_total = 0 ; + +crc32(fd, cval, clen) + register int fd; + u_long *cval, *clen; +{ + u_long crc = ~0; + char buf[BUFSIZ], *p ; + int len, nr ; + FILE *in; + + len = 0 ; + crc32_total = ~crc32_total ; + while (nr = read(fd, buf, sizeof(buf))) + for (len += nr, p = buf; nr--; ++p) { + CRC(crc, *p) ; + CRC(crc32_total, *p) ; + } + if (nr < 0) + return 1 ; + + *clen = len ; + *cval = ~crc ; + crc32_total = ~crc32_total ; + return 0 ; +} diff --git a/usr.bin/cksum/extern.h b/usr.bin/cksum/extern.h index ed61120..2d43490 100644 --- a/usr.bin/cksum/extern.h +++ b/usr.bin/cksum/extern.h @@ -42,4 +42,5 @@ void psum1 __P((char *, unsigned long, unsigned long)); void psum2 __P((char *, unsigned long, unsigned long)); int csum1 __P((int, unsigned long *, unsigned long *)); int csum2 __P((int, unsigned long *, unsigned long *)); +int crc32 __P((int, unsigned long *, unsigned long *)); __END_DECLS |