crcutils.c revision 6bbe05905a1c10a2703f95fb4912eb14b87f6670
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * CDDL HEADER START
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * The contents of this file are subject to the terms of the
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Common Development and Distribution License (the "License").
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * You may not use this file except in compliance with the License.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * or http://www.opensolaris.org/os/licensing.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * See the License for the specific language governing permissions
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * and limitations under the License.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * When distributing Covered Code, include this CDDL HEADER in each
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * If applicable, add the following below this CDDL HEADER, with the
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * fields enclosed by brackets "[]" replaced with your own identifying
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * information: Portions Copyright [yyyy] [name of copyright owner]
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * CDDL HEADER END
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Use is subject to license terms.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Little-endian architectures need byte-swapping. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#define sws(x) (((x >> 8) & 0x00ff) | ((x << 8) & 0xff00))
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#define swl(x) (sws(x >> 16) | (sws(x) << 16))
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#else /* if !_LITTLE_ENDIAN */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Big-endian anchictectures don't need byte-swapping. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#define sws(x) (x)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#define swl(x) (x)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#endif /* _LITTLE_ENDIAN */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercompute_crc8(unsigned char *bytes, int length)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker unsigned char aCRC;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker p_crc->cm_poly = 0x107; /* = X^8 + x^2 + x + 1 */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (i = 0; i < length; i++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercompute_crc32(unsigned char *bytes, int length)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (i = 0; i < length; i++) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * This is the max value an uint32_t value can hold...
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Define this for Windows compilers which don't have "limits.h" or equivalant
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickercompute_checksum32(unsigned char *bytes, int length)
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker unsigned char tailbytes[4] = { 0x00, 0x00, 0x00, 0x00 };
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* Grab bytes in 4-byte chunks */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* Grab chunk as an int */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker (void) memcpy(&next4bytes, &(bytes[i]), 4);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* Add intval to regval */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker /* Grab any remaining bytes at the end */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker for (j = length-1, k = 3; j >= i; j--, k--) {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Treat any remaining bytes put into tailbytes as if they were
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * a left-zero-padded unsigned int (uint32_t == 4 bytes!)