From 2882ea383d01ee300a9150e46ebfedbef50ee0bd Mon Sep 17 00:00:00 2001 From: Eric Betts Date: Tue, 16 Jul 2024 19:04:51 -0700 Subject: [PATCH] Validate LRC --- ccid.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/ccid.c b/ccid.c index c2595ce..15b37f8 100644 --- a/ccid.c +++ b/ccid.c @@ -19,12 +19,21 @@ uint8_t getSequence(uint8_t slot) { return sequence[slot]++; } -size_t seader_ccid_add_lrc(uint8_t* data, size_t len) { +uint8_t seader_ccid_calc_lrc(uint8_t* data, size_t len) { uint8_t lrc = 0; for(size_t i = 0; i < len; i++) { lrc ^= data[i]; } - data[len] = lrc; + return lrc; +} + +bool seader_ccid_validate_lrc(uint8_t* data, size_t len) { + uint8_t lrc = seader_ccid_calc_lrc(data, len - 1); + return lrc == data[len - 1]; +} + +size_t seader_ccid_add_lrc(uint8_t* data, size_t len) { + data[len] = seader_ccid_calc_lrc(data, len); return len + 1; } @@ -234,10 +243,21 @@ size_t seader_ccid_process(Seader* seader, uint8_t* cmd, size_t cmd_len) { } if(cmd_len < 2 + 10 + message.dwLength + 1) { + // Incomplete return message.consumed; } message.consumed += 2 + 10 + message.dwLength + 1; + if(seader_ccid_validate_lrc(cmd, 2 + 10 + message.dwLength + 1) == false) { + FURI_LOG_W( + TAG, + "Invalid LRC. Recv: %02x vs Calc: %02x", + cmd[2 + 10 + message.dwLength + 1], + seader_ccid_calc_lrc(cmd, 2 + 10 + message.dwLength)); + // TODO: Should I respond with an error? + return message.consumed; + } + /* if(message.dwLength == 0) { FURI_LOG_D(