1 1.5 christos /* $NetBSD: crc32.c,v 1.5 2024/02/09 16:10:18 christos Exp $ */ 2 1.1 jmcneill 3 1.1 jmcneill /*- 4 1.1 jmcneill * Copyright (c) 2002 Marcel Moolenaar 5 1.1 jmcneill * All rights reserved. 6 1.1 jmcneill * 7 1.1 jmcneill * Redistribution and use in source and binary forms, with or without 8 1.1 jmcneill * modification, are permitted provided that the following conditions 9 1.1 jmcneill * are met: 10 1.1 jmcneill * 11 1.1 jmcneill * 1. Redistributions of source code must retain the above copyright 12 1.1 jmcneill * notice, this list of conditions and the following disclaimer. 13 1.1 jmcneill * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 jmcneill * notice, this list of conditions and the following disclaimer in the 15 1.1 jmcneill * documentation and/or other materials provided with the distribution. 16 1.1 jmcneill * 17 1.1 jmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 1.1 jmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 1.1 jmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 1.1 jmcneill * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 1.1 jmcneill * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 1.1 jmcneill * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 1.1 jmcneill * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 1.1 jmcneill * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 1.1 jmcneill * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 1.1 jmcneill * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 1.1 jmcneill * 28 1.1 jmcneill * CRC32 code derived from work by Gary S. Brown. 29 1.1 jmcneill */ 30 1.1 jmcneill 31 1.2 dogcow #if HAVE_NBTOOL_CONFIG_H 32 1.2 dogcow #include "nbtool_config.h" 33 1.2 dogcow #endif 34 1.2 dogcow 35 1.1 jmcneill #include <sys/cdefs.h> 36 1.5 christos __RCSID("$NetBSD: crc32.c,v 1.5 2024/02/09 16:10:18 christos Exp $"); 37 1.1 jmcneill 38 1.1 jmcneill #include <sys/types.h> 39 1.3 jmcneill #include <sys/uio.h> 40 1.1 jmcneill #include <stdint.h> 41 1.5 christos #include "crc32.h" 42 1.1 jmcneill 43 1.1 jmcneill static uint32_t crc32_tab[] = { 44 1.1 jmcneill 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 45 1.1 jmcneill 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 46 1.1 jmcneill 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 47 1.1 jmcneill 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 48 1.1 jmcneill 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 49 1.1 jmcneill 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 50 1.1 jmcneill 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 51 1.1 jmcneill 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 52 1.1 jmcneill 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 53 1.1 jmcneill 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 54 1.1 jmcneill 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 55 1.1 jmcneill 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 56 1.1 jmcneill 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 57 1.1 jmcneill 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 58 1.1 jmcneill 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 59 1.1 jmcneill 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 60 1.1 jmcneill 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 61 1.1 jmcneill 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 62 1.1 jmcneill 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 63 1.1 jmcneill 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 64 1.1 jmcneill 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 65 1.1 jmcneill 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 66 1.1 jmcneill 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 67 1.1 jmcneill 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 68 1.1 jmcneill 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 69 1.1 jmcneill 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 70 1.1 jmcneill 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 71 1.1 jmcneill 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 72 1.1 jmcneill 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 73 1.1 jmcneill 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 74 1.1 jmcneill 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 75 1.1 jmcneill 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 76 1.1 jmcneill 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 77 1.1 jmcneill 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 78 1.1 jmcneill 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 79 1.1 jmcneill 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 80 1.1 jmcneill 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 81 1.1 jmcneill 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 82 1.1 jmcneill 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 83 1.1 jmcneill 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 84 1.1 jmcneill 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 85 1.1 jmcneill 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 86 1.1 jmcneill 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 87 1.1 jmcneill }; 88 1.1 jmcneill 89 1.1 jmcneill uint32_t 90 1.3 jmcneill crc32v(const struct iovec *iov, int cnt) 91 1.1 jmcneill { 92 1.1 jmcneill const uint8_t *p; 93 1.1 jmcneill uint32_t crc; 94 1.3 jmcneill int i, len; 95 1.1 jmcneill 96 1.1 jmcneill crc = ~0U; 97 1.1 jmcneill 98 1.3 jmcneill for (i = 0; i < cnt; i++) { 99 1.3 jmcneill p = iov[i].iov_base; 100 1.5 christos /*###102 [lint] warning conversion from 'unsigned long' to 'int' may lose accuracy [132]%%%*/ 101 1.3 jmcneill len = iov[i].iov_len; 102 1.3 jmcneill while (len--) 103 1.3 jmcneill crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); 104 1.3 jmcneill } 105 1.1 jmcneill 106 1.1 jmcneill return crc ^ ~0U; 107 1.1 jmcneill } 108 1.3 jmcneill 109 1.3 jmcneill uint32_t 110 1.3 jmcneill crc32(const void *buf, size_t size) 111 1.3 jmcneill { 112 1.3 jmcneill struct iovec iov[1]; 113 1.3 jmcneill 114 1.3 jmcneill iov[0].iov_base = __UNCONST(buf); 115 1.3 jmcneill iov[0].iov_len = size; 116 1.3 jmcneill 117 1.3 jmcneill return crc32v(iov, 1); 118 1.3 jmcneill } 119