From acaaeea450848bf951abf4789b1d2f7700f3d7eb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 16 Jan 2024 15:32:43 +0100 Subject: [PATCH] picopass uses a different CRC algo --- armsrc/iso14443b.c | 9 ++++++++- armsrc/iso14443b.h | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 1c9e94983..3df38098e 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -2643,7 +2643,14 @@ void SendRawCommand14443B(iso14b_raw_cmd_t *p) { if ((p->flags & ISO14B_RAW) == ISO14B_RAW) { if (((p->flags & ISO14B_APPEND_CRC) == ISO14B_APPEND_CRC) && (p->rawlen)) { - AddCrc14B(p->raw, p->rawlen); + + // Picopass uses different CRC algo + // it also excludes the first instruction byte + if ((p->flags & ISO14B_SELECT_PICOPASS) == ISO14B_SELECT_PICOPASS) { + AddCrc15(p->raw + 1, p->rawlen - 1); + } else { + AddCrc14B(p->raw, p->rawlen); + } p->rawlen += 2; } diff --git a/armsrc/iso14443b.h b/armsrc/iso14443b.h index bf0ac0bc6..83f617831 100644 --- a/armsrc/iso14443b.h +++ b/armsrc/iso14443b.h @@ -34,6 +34,10 @@ # define AddCrc14B(data, len) compute_crc(CRC_14443_B, (data), (len), (data)+(len), (data)+(len)+1) #endif +#ifndef AddCrc15 +#define AddCrc15(data, len) compute_crc(CRC_ICLASS, (data), (len), (data)+(len), (data)+(len)+1) +#endif + void iso14443b_setup(void); int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, void *rxdata, uint16_t rxmaxlen, uint8_t *res, uint16_t *responselen);