Home | History | Annotate | Line # | Download | only in mkubootimage
      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