Blame src/openct/checksum.c

Packit 9f0df5
/*
Packit 9f0df5
 * Checksum handling
Packit 9f0df5
 *
Packit 9f0df5
 * Copyright Matthias Bruestle 1999-2002
Packit 9f0df5
 * For licensing, see the file LICENCE
Packit 9f0df5
 */
Packit 9f0df5
Packit 9f0df5
#include <config.h>
Packit 9f0df5
#ifdef HAVE_STDINT_H
Packit 9f0df5
#include <stdint.h>
Packit 9f0df5
#endif
Packit 9f0df5
#include "checksum.h"
Packit 9f0df5
Packit 9f0df5
#define min( a, b )   ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
Packit 9f0df5
Packit 9f0df5
/* ISO STD 3309 */
Packit 9f0df5
/* From: medin@catbyte.b30.ingr.com (Dave Medin)
Packit 9f0df5
 * Subject: CCITT checksums
Packit 9f0df5
 * Newsgroups: sci.electronics
Packit 9f0df5
 * Date: Mon, 7 Dec 1992 17:33:39 GMT
Packit 9f0df5
 */
Packit 9f0df5
Packit 9f0df5
/* Correct Table? */
Packit 9f0df5
Packit 9f0df5
static unsigned short crctab[256] = {
Packit 9f0df5
	0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
Packit 9f0df5
	0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
Packit 9f0df5
	0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
Packit 9f0df5
	0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
Packit 9f0df5
	0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
Packit 9f0df5
	0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
Packit 9f0df5
	0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
Packit 9f0df5
	0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
Packit 9f0df5
	0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
Packit 9f0df5
	0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
Packit 9f0df5
	0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
Packit 9f0df5
	0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
Packit 9f0df5
	0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
Packit 9f0df5
	0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
Packit 9f0df5
	0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
Packit 9f0df5
	0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
Packit 9f0df5
	0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
Packit 9f0df5
	0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
Packit 9f0df5
	0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
Packit 9f0df5
	0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
Packit 9f0df5
	0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
Packit 9f0df5
	0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
Packit 9f0df5
	0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
Packit 9f0df5
	0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
Packit 9f0df5
	0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
Packit 9f0df5
	0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
Packit 9f0df5
	0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
Packit 9f0df5
	0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
Packit 9f0df5
	0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
Packit 9f0df5
	0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
Packit 9f0df5
	0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
Packit 9f0df5
	0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
Packit 9f0df5
};
Packit 9f0df5
Packit 9f0df5
/*
Packit 9f0df5
 * Returns LRC of data.
Packit 9f0df5
 */
Packit 9f0df5
unsigned int
Packit 9f0df5
csum_lrc_compute(const uint8_t *in, size_t len, unsigned char *rc)
Packit 9f0df5
{
Packit 9f0df5
	unsigned char	lrc = 0;
Packit 9f0df5
Packit 9f0df5
	while (len--)
Packit 9f0df5
		lrc ^= *in++;
Packit 9f0df5
Packit 9f0df5
	if (rc)
Packit 9f0df5
		*rc = lrc;
Packit 9f0df5
	return 1;
Packit 9f0df5
}
Packit 9f0df5
Packit 9f0df5
/*
Packit 9f0df5
 * Compute CRC of data.
Packit 9f0df5
 */
Packit 9f0df5
unsigned int
Packit 9f0df5
csum_crc_compute(const uint8_t * data, size_t len, unsigned char *rc)
Packit 9f0df5
{
Packit 9f0df5
	unsigned short v = 0xFFFF;
Packit 9f0df5
Packit 9f0df5
	while (len--) {
Packit 9f0df5
		v = ((v >> 8) & 0xFF) ^ crctab[(v ^ *data++) & 0xFF];
Packit 9f0df5
	}
Packit 9f0df5
Packit 9f0df5
	if (rc) {
Packit 9f0df5
		rc[0] = (v >> 8) & 0xFF;
Packit 9f0df5
		rc[1] = v & 0xFF;
Packit 9f0df5
	}
Packit 9f0df5
Packit 9f0df5
	return 2;
Packit 9f0df5
}
Packit 9f0df5