1 1.11 christos /* $NetBSD: crc.c,v 1.11 2024/12/05 17:17:43 christos Exp $ */ 2 1.1 mycroft 3 1.1 mycroft /*- 4 1.1 mycroft * Copyright (c) 1991, 1993 5 1.1 mycroft * The Regents of the University of California. All rights reserved. 6 1.1 mycroft * 7 1.1 mycroft * This code is derived from software contributed to Berkeley by 8 1.1 mycroft * James W. Williams of NASA Goddard Space Flight Center. 9 1.1 mycroft * 10 1.1 mycroft * Redistribution and use in source and binary forms, with or without 11 1.1 mycroft * modification, are permitted provided that the following conditions 12 1.1 mycroft * are met: 13 1.1 mycroft * 1. Redistributions of source code must retain the above copyright 14 1.1 mycroft * notice, this list of conditions and the following disclaimer. 15 1.1 mycroft * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 mycroft * notice, this list of conditions and the following disclaimer in the 17 1.1 mycroft * documentation and/or other materials provided with the distribution. 18 1.5 agc * 3. Neither the name of the University nor the names of its contributors 19 1.1 mycroft * may be used to endorse or promote products derived from this software 20 1.1 mycroft * without specific prior written permission. 21 1.1 mycroft * 22 1.1 mycroft * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 1.1 mycroft * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 1.1 mycroft * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 1.1 mycroft * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 1.1 mycroft * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 1.1 mycroft * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 1.1 mycroft * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 1.1 mycroft * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 1.1 mycroft * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 1.1 mycroft * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 1.1 mycroft * SUCH DAMAGE. 33 1.1 mycroft */ 34 1.1 mycroft 35 1.6 jmc #if HAVE_NBTOOL_CONFIG_H 36 1.6 jmc #include "nbtool_config.h" 37 1.6 jmc #endif 38 1.6 jmc 39 1.1 mycroft #include <sys/cdefs.h> 40 1.4 tv #if defined(__RCSID) && !defined(lint) 41 1.1 mycroft #if 0 42 1.1 mycroft static char sccsid[] = "@(#)crc.c 8.1 (Berkeley) 6/17/93"; 43 1.1 mycroft #else 44 1.11 christos __RCSID("$NetBSD: crc.c,v 1.11 2024/12/05 17:17:43 christos Exp $"); 45 1.1 mycroft #endif 46 1.1 mycroft #endif /* not lint */ 47 1.1 mycroft 48 1.1 mycroft #include <sys/types.h> 49 1.1 mycroft 50 1.2 lukem #include <stdio.h> 51 1.2 lukem #include <time.h> 52 1.1 mycroft #include <unistd.h> 53 1.1 mycroft 54 1.1 mycroft #include "extern.h" 55 1.1 mycroft 56 1.10 cheusov static const uint32_t crctab[] = { 57 1.1 mycroft 0x0, 58 1.1 mycroft 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 59 1.1 mycroft 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 60 1.1 mycroft 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 61 1.1 mycroft 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 62 1.1 mycroft 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 63 1.1 mycroft 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 64 1.1 mycroft 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 65 1.1 mycroft 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 66 1.1 mycroft 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 67 1.1 mycroft 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 68 1.1 mycroft 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 69 1.1 mycroft 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 70 1.1 mycroft 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 71 1.1 mycroft 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 72 1.1 mycroft 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 73 1.1 mycroft 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 74 1.1 mycroft 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 75 1.1 mycroft 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 76 1.1 mycroft 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 77 1.1 mycroft 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 78 1.1 mycroft 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 79 1.1 mycroft 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 80 1.1 mycroft 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 81 1.1 mycroft 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 82 1.1 mycroft 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 83 1.1 mycroft 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 84 1.1 mycroft 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 85 1.1 mycroft 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 86 1.1 mycroft 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 87 1.1 mycroft 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 88 1.1 mycroft 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 89 1.1 mycroft 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 90 1.1 mycroft 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 91 1.1 mycroft 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 92 1.1 mycroft 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 93 1.1 mycroft 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 94 1.1 mycroft 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 95 1.1 mycroft 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 96 1.1 mycroft 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 97 1.1 mycroft 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 98 1.1 mycroft 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 99 1.1 mycroft 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 100 1.1 mycroft 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 101 1.1 mycroft 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 102 1.1 mycroft 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 103 1.1 mycroft 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 104 1.1 mycroft 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 105 1.1 mycroft 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 106 1.1 mycroft 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 107 1.1 mycroft 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 108 1.1 mycroft 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 109 1.1 mycroft }; 110 1.1 mycroft 111 1.1 mycroft /* 112 1.1 mycroft * Compute a POSIX 1003.2 checksum. This routine has been broken out so that 113 1.1 mycroft * other programs can use it. It takes a file descriptor to read from and 114 1.1 mycroft * locations to store the crc and the number of bytes read. It returns 0 on 115 1.1 mycroft * success and 1 on failure. Errno is set on failure. 116 1.1 mycroft */ 117 1.11 christos uint32_t crc_total = ~0u; /* The crc over a number of files. */ 118 1.1 mycroft 119 1.1 mycroft int 120 1.10 cheusov crc(int fd, uint32_t *cval, uint32_t *clen) 121 1.1 mycroft { 122 1.7 perry u_char *p; 123 1.11 christos ssize_t nr; 124 1.10 cheusov uint32_t thecrc, len; 125 1.10 cheusov uint32_t crctot; 126 1.1 mycroft u_char buf[16 * 1024]; 127 1.1 mycroft 128 1.1 mycroft #define COMPUTE(var, ch) (var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)] 129 1.1 mycroft 130 1.8 lukem thecrc = len = crctot = 0; 131 1.1 mycroft if (sflag) 132 1.1 mycroft crctot = ~crc_total; 133 1.1 mycroft while ((nr = read(fd, buf, sizeof(buf))) > 0) 134 1.1 mycroft if (sflag) { 135 1.11 christos for (len += (uint32_t)nr, p = buf; nr--; ++p) { 136 1.1 mycroft COMPUTE(thecrc, *p); 137 1.1 mycroft COMPUTE(crctot, *p); 138 1.1 mycroft } 139 1.1 mycroft } else { 140 1.11 christos for (len += (uint32_t)nr, p = buf; nr--; ++p) 141 1.1 mycroft COMPUTE(thecrc, *p); 142 1.1 mycroft } 143 1.1 mycroft if (nr < 0) 144 1.7 perry return 1; 145 1.1 mycroft 146 1.1 mycroft *clen = len; 147 1.1 mycroft 148 1.1 mycroft /* Include the length of the file. */ 149 1.1 mycroft if (sflag) { 150 1.1 mycroft for (; len != 0; len >>= 8) { 151 1.1 mycroft COMPUTE(thecrc, len & 0xff); 152 1.1 mycroft COMPUTE(crctot, len & 0xff); 153 1.1 mycroft } 154 1.1 mycroft } else { 155 1.1 mycroft for (; len != 0; len >>= 8) 156 1.1 mycroft COMPUTE(thecrc, len & 0xff); 157 1.1 mycroft } 158 1.1 mycroft 159 1.1 mycroft *cval = ~thecrc; 160 1.1 mycroft if (sflag) 161 1.1 mycroft crc_total = ~crctot; 162 1.7 perry return 0; 163 1.1 mycroft } 164