xref: /csrg-svn/usr.bin/cksum/crc.c (revision 51821)
147720Sbostic /*-
247720Sbostic  * Copyright (c) 1991 The Regents of the University of California.
347720Sbostic  * All rights reserved.
447720Sbostic  *
547720Sbostic  * This code is derived from software contributed to Berkeley by
651066Sbostic  * James W. Williams of NASA Goddard Space Flight Center.
747720Sbostic  *
847720Sbostic  * %sccs.include.redist.c%
947720Sbostic  */
1047720Sbostic 
1147720Sbostic #ifndef lint
12*51821Sbostic static char sccsid[] = "@(#)crc.c	5.4 (Berkeley) 11/27/91";
1347720Sbostic #endif /* not lint */
1447720Sbostic 
1547720Sbostic #include <sys/types.h>
1647720Sbostic #include <unistd.h>
1747720Sbostic 
18*51821Sbostic static u_long crctab[] = {
19*51821Sbostic 	0x0,
2047720Sbostic 	0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
2147720Sbostic 	0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e,
2247720Sbostic 	0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
2347720Sbostic 	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,
2447720Sbostic 	0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0,
2547720Sbostic 	0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63,
2647720Sbostic 	0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
2747720Sbostic 	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa,
2847720Sbostic 	0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75,
2947720Sbostic 	0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180,
3047720Sbostic 	0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
3147720Sbostic 	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87,
3247720Sbostic 	0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
3347720Sbostic 	0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5,
3447720Sbostic 	0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
3547720Sbostic 	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4,
3647720Sbostic 	0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b,
3747720Sbostic 	0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,
3847720Sbostic 	0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
3947720Sbostic 	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541,
4047720Sbostic 	0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc,
4147720Sbostic 	0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f,
4247720Sbostic 	0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
4347720Sbostic 	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e,
4447720Sbostic 	0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
4547720Sbostic 	0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c,
4647720Sbostic 	0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
4747720Sbostic 	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b,
4847720Sbostic 	0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2,
4947720Sbostic 	0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671,
5047720Sbostic 	0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
5147720Sbostic 	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,
5247720Sbostic 	0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767,
5347720Sbostic 	0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6,
5447720Sbostic 	0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
5547720Sbostic 	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795,
5647720Sbostic 	0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
5747720Sbostic 	0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b,
5847720Sbostic 	0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
5947720Sbostic 	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82,
6047720Sbostic 	0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d,
6147720Sbostic 	0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8,
6247720Sbostic 	0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
6347720Sbostic 	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff,
6447720Sbostic 	0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee,
6547720Sbostic 	0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,
6647720Sbostic 	0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
6747720Sbostic 	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c,
6847720Sbostic 	0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
6947720Sbostic 	0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02,
7047720Sbostic 	0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
7147720Sbostic };
7247720Sbostic 
7347720Sbostic /*
7447720Sbostic  * crc --
7547720Sbostic  *	Compute a POSIX.2 checksum.  This routine has been broken out since
7647720Sbostic  *	it is anticipated that other programs will use it.  It takes a file
7747720Sbostic  *	descriptor to read from and locations to store the crc and the number
7847720Sbostic  *	of bytes read.  It returns 0 on success and 1 on failure.  Errno is
7947720Sbostic  *	set on failure.
8047720Sbostic  */
81*51821Sbostic int
8247720Sbostic crc(fd, cval, clen)
8347720Sbostic 	register int fd;
8447720Sbostic 	u_long *cval, *clen;
8547720Sbostic {
8647720Sbostic 	register u_char *p;
87*51821Sbostic 	register int nr;
88*51821Sbostic 	register u_long crc, len;
89*51821Sbostic 	u_char buf[16 * 1024];
9047720Sbostic 
91*51821Sbostic 	crc = len = 0;
9247720Sbostic 	while ((nr = read(fd, buf, sizeof(buf))) > 0)
93*51821Sbostic 		for (len += nr, p = buf; nr--; ++p)
94*51821Sbostic 			crc = crc << 8 ^ crctab[crc >> 24 ^ *p];
9547720Sbostic 	if (nr < 0)
9647720Sbostic 		return(1);
9747720Sbostic 
98*51821Sbostic 	*clen = len;
99*51821Sbostic 
100*51821Sbostic 	/* Include the length of the file. */
101*51821Sbostic 	for (; len != 0; len >>= 8)
102*51821Sbostic 		crc = crc << 8 ^ crctab[crc >> 24 ^ len & 0xff];
103*51821Sbostic 
104*51821Sbostic 	*cval = ~crc;
10547720Sbostic 	return(0);
10647720Sbostic }
107