mirror of
https://github.com/infiniteCable2/opendbc.git
synced 2026-06-08 10:54:51 +08:00
40 lines
1.0 KiB
C
40 lines
1.0 KiB
C
#pragma once
|
|
|
|
static uint32_t chrysler_get_checksum(const CANPacket_t *msg) {
|
|
int checksum_byte = GET_LEN(msg) - 1U;
|
|
return (uint8_t)(msg->data[checksum_byte]);
|
|
}
|
|
|
|
static uint32_t chrysler_compute_checksum(const CANPacket_t *msg) {
|
|
// TODO: clean this up
|
|
// http://illmatics.com/Remote%20Car%20Hacking.pdf
|
|
uint8_t checksum = 0xFFU;
|
|
int len = GET_LEN(msg);
|
|
for (int j = 0; j < (len - 1); j++) {
|
|
uint8_t shift = 0x80U;
|
|
uint8_t curr = (uint8_t)msg->data[j];
|
|
for (int i=0; i<8; i++) {
|
|
uint8_t bit_sum = curr & shift;
|
|
uint8_t temp_chk = checksum & 0x80U;
|
|
if (bit_sum != 0U) {
|
|
bit_sum = 0x1C;
|
|
if (temp_chk != 0U) {
|
|
bit_sum = 1;
|
|
}
|
|
checksum = checksum << 1;
|
|
temp_chk = checksum | 1U;
|
|
bit_sum ^= temp_chk;
|
|
} else {
|
|
if (temp_chk != 0U) {
|
|
bit_sum = 0x1D;
|
|
}
|
|
checksum = checksum << 1;
|
|
bit_sum ^= checksum;
|
|
}
|
|
checksum = bit_sum;
|
|
shift = shift >> 1;
|
|
}
|
|
}
|
|
return (uint8_t)(~checksum);
|
|
}
|