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