blob: 59900e14a62f1f0623b98b1ac041614d6e3b5568 [file] [log] [blame]
/*
* Copyright (c) 2020 Intel Corporation
* Copyright (c) 2017 Nordic Semiconductor ASA
* Copyright (c) 2015 Runtime Inc
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/sys/crc.h>
static const uint8_t crc8_ccitt_small_table[16] = {
0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15,
0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d
};
static const uint8_t crc8_rohc_small_table[16] = {
0x00, 0x1c, 0x38, 0x24, 0x70, 0x6c, 0x48, 0x54,
0xe0, 0xfc, 0xd8, 0xc4, 0x90, 0x8c, 0xa8, 0xb4
};
uint8_t crc8_ccitt(uint8_t val, const void *buf, size_t cnt)
{
size_t i;
const uint8_t *p = buf;
for (i = 0; i < cnt; i++) {
val ^= p[i];
val = (val << 4) ^ crc8_ccitt_small_table[val >> 4];
val = (val << 4) ^ crc8_ccitt_small_table[val >> 4];
}
return val;
}
uint8_t crc8_rohc(uint8_t val, const void *buf, size_t cnt)
{
size_t i;
const uint8_t *p = buf;
for (i = 0; i < cnt; i++) {
val ^= p[i];
val = (val >> 4) ^ crc8_rohc_small_table[val & 0x0f];
val = (val >> 4) ^ crc8_rohc_small_table[val & 0x0f];
}
return val;
}
uint8_t crc8(const uint8_t *src, size_t len, uint8_t polynomial, uint8_t initial_value,
bool reversed)
{
uint8_t crc = initial_value;
size_t i, j;
for (i = 0; i < len; i++) {
crc ^= src[i];
for (j = 0; j < 8; j++) {
if (reversed) {
if ((crc & 0x01) != 0) {
crc = (crc >> 1) ^ polynomial;
} else {
crc >>= 1;
}
} else {
if ((crc & 0x80) != 0) {
crc = (crc << 1) ^ polynomial;
} else {
crc <<= 1;
}
}
}
}
return crc;
}