146197Sphk/*	$NetBSD: crc.c,v 1.10 2021/03/18 20:02:18 cheusov Exp $	*/
246197Sphk
346197Sphk/*-
446197Sphk * Copyright (c) 1991, 1993
546197Sphk *	The Regents of the University of California.  All rights reserved.
646197Sphk *
746197Sphk * This code is derived from software contributed to Berkeley by
846197Sphk * James W. Williams of NASA Goddard Space Flight Center.
950477Speter *
1046197Sphk * Redistribution and use in source and binary forms, with or without
1146197Sphk * modification, are permitted provided that the following conditions
1246155Sphk * are met:
1346155Sphk * 1. Redistributions of source code must retain the above copyright
1446155Sphk *    notice, this list of conditions and the following disclaimer.
1546155Sphk * 2. Redistributions in binary form must reproduce the above copyright
1646155Sphk *    notice, this list of conditions and the following disclaimer in the
1746155Sphk *    documentation and/or other materials provided with the distribution.
1846155Sphk * 3. Neither the name of the University nor the names of its contributors
1946155Sphk *    may be used to endorse or promote products derived from this software
2046155Sphk *    without specific prior written permission.
2146155Sphk *
2246155Sphk * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2357163Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2446155Sphk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2546155Sphk * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2646155Sphk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2746155Sphk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2846155Sphk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2957163Srwatson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3057163Srwatson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3157163Srwatson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3257163Srwatson * SUCH DAMAGE.
3357163Srwatson */
3457163Srwatson
3557163Srwatson#if HAVE_NBTOOL_CONFIG_H
3657163Srwatson#include "nbtool_config.h"
3761235Srwatson#endif
3861235Srwatson
3961235Srwatson#include <sys/cdefs.h>
4061235Srwatson#if defined(__RCSID) && !defined(lint)
4161235Srwatson#if 0
4268024Srwatsonstatic char sccsid[] = "@(#)crc.c	8.1 (Berkeley) 6/17/93";
4368024Srwatson#else
4468024Srwatson__RCSID("$NetBSD: crc.c,v 1.10 2021/03/18 20:02:18 cheusov Exp $");
4568024Srwatson#endif
4668024Srwatson#endif /* not lint */
4782710Sdillon
4882710Sdillon#include <sys/types.h>
4982710Sdillon
5046155Sphk#include <stdio.h>
5146155Sphk#include <time.h>
5272786Srwatson#include <unistd.h>
5372786Srwatson
5472786Srwatson#include "extern.h"
5572786Srwatson
5646155Sphkstatic const uint32_t crctab[] = {
5746155Sphk	0x0,
5846155Sphk	0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
5946155Sphk	0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
6046155Sphk	0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
6146155Sphk	0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
6282710Sdillon	0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
6382710Sdillon	0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
6472786Srwatson	0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
6546155Sphk	0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
6646155Sphk	0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
6782710Sdillon	0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
6846155Sphk	0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
6946155Sphk	0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
7082710Sdillon	0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
7182710Sdillon	0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
7282710Sdillon	0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
7382710Sdillon	0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
7482710Sdillon	0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
7569781Sdwmalone	0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
7646155Sphk	0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
7746155Sphk	0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
7846155Sphk	0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
7946155Sphk	0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
8046155Sphk	0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
8146155Sphk	0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
8246155Sphk	0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
8346155Sphk	0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
8446155Sphk	0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
8546155Sphk	0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
8672786Srwatson	0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
8772786Srwatson	0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
8872786Srwatson	0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
8982710Sdillon	0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
9046155Sphk	0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
9146155Sphk	0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
9246155Sphk	0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
9346155Sphk	0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
9482710Sdillon	0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
9582710Sdillon	0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
9646155Sphk	0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
9746155Sphk	0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
9846155Sphk	0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
9972786Srwatson	0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
10072786Srwatson	0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
10172786Srwatson	0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
10272786Srwatson	0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
10372786Srwatson	0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
10472786Srwatson	0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
10572786Srwatson	0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
10672786Srwatson	0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
10772786Srwatson	0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
10872786Srwatson	0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
10972786Srwatson};
11072786Srwatson
11172786Srwatson/*
11272786Srwatson * Compute a POSIX 1003.2 checksum.  This routine has been broken out so that
11372786Srwatson * other programs can use it.  It takes a file descriptor to read from and
11472786Srwatson * locations to store the crc and the number of bytes read.  It returns 0 on
11572786Srwatson * success and 1 on failure.  Errno is set on failure.
11672786Srwatson */
11772786Srwatsonuint32_t crc_total = ~0;		/* The crc over a number of files. */
11846155Sphk
11972786Srwatsonint
12046155Sphkcrc(int fd, uint32_t *cval, uint32_t *clen)
12146155Sphk{
12246155Sphk	u_char *p;
12372786Srwatson	int nr;
12446155Sphk	uint32_t thecrc, len;
12546155Sphk	uint32_t crctot;
12646155Sphk	u_char buf[16 * 1024];
12746155Sphk
12846155Sphk#define	COMPUTE(var, ch)	(var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)]
12946155Sphk
13046155Sphk	thecrc = len = crctot = 0;
13172786Srwatson	if (sflag)
13246155Sphk		crctot = ~crc_total;
13372786Srwatson	while ((nr = read(fd, buf, sizeof(buf))) > 0)
13446155Sphk		if (sflag) {
13546155Sphk			for (len += nr, p = buf; nr--; ++p) {
13681114Srwatson				COMPUTE(thecrc, *p);
13781114Srwatson				COMPUTE(crctot, *p);
13881114Srwatson			}
13981114Srwatson		} else {
14081114Srwatson			for (len += nr, p = buf; nr--; ++p)
14181114Srwatson				COMPUTE(thecrc, *p);
14281114Srwatson		}
14372786Srwatson	if (nr < 0)
14446155Sphk		return 1;
14546155Sphk
14646155Sphk	*clen = len;
14746155Sphk
14846155Sphk	/* Include the length of the file. */
14972786Srwatson	if (sflag) {
15046155Sphk		for (; len != 0; len >>= 8) {
15146155Sphk			COMPUTE(thecrc, len & 0xff);
15246155Sphk			COMPUTE(crctot, len & 0xff);
15372786Srwatson		}
15446155Sphk	} else {
15546155Sphk		for (; len != 0; len >>= 8)
15646155Sphk			COMPUTE(thecrc, len & 0xff);
15746155Sphk	}
15846155Sphk
15981114Srwatson	*cval = ~thecrc;
16046155Sphk	if (sflag)
16172786Srwatson		crc_total = ~crctot;
16246155Sphk	return 0;
16372786Srwatson}
16446155Sphk