Blame src/openct/checksum.c

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