mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-10 15:30:55 +00:00
54 lines
1.2 KiB
C
54 lines
1.2 KiB
C
|
/*
|
||
|
* Copyright (c) 2020 Intel Corporation
|
||
|
* Copyright (c) 2017 Nordic Semiconductor ASA
|
||
|
* Copyright (c) 2015 Runtime Inc
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
#include "crc8.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};
|
||
|
|
||
|
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(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) {
|
||
|
crc = (crc >> 1) ^ polynomial;
|
||
|
} else {
|
||
|
crc >>= 1;
|
||
|
}
|
||
|
} else {
|
||
|
if (crc & 0x80) {
|
||
|
crc = (crc << 1) ^ polynomial;
|
||
|
} else {
|
||
|
crc <<= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return crc;
|
||
|
}
|