diff --git a/client/src/mifare/desfirecrypto.c b/client/src/mifare/desfirecrypto.c index e1015c2d8..b6bb5e961 100644 --- a/client/src/mifare/desfirecrypto.c +++ b/client/src/mifare/desfirecrypto.c @@ -345,6 +345,44 @@ uint8_t DesfireDESKeyGetVersion(uint8_t *key) { return version; } +DesfireCommunicationMode DesfireFileCommModeToCommMode(uint8_t file_comm_mode) { + DesfireCommunicationMode mode = DCMNone; + switch (file_comm_mode & 0x03) { + case 0x00: + case 0x02: + mode = DCMPlain; + break; + case 0x01: + mode = DCMMACed; + break; + case 0x03: + mode = DCMEncrypted; + break; + default: + break; + } + return mode; +} + +uint8_t DesfireCommModeToFileCommMode(DesfireCommunicationMode comm_mode) { + uint8_t fmode = DCMNone; + switch (comm_mode) { + case DCMPlain: + fmode = 0x00; + break; + case DCMMACed: + fmode = 0x01; + break; + case DCMEncrypted: + case DCMEncryptedPlain: + fmode = 0x11; + break; + case DCMNone: + break; + } + return fmode; +} + void desfire_crc32(const uint8_t *data, const size_t len, uint8_t *crc) { crc32_ex(data, len, crc); } diff --git a/client/src/mifare/desfirecrypto.h b/client/src/mifare/desfirecrypto.h index 0ec729a04..a559f11a9 100644 --- a/client/src/mifare/desfirecrypto.h +++ b/client/src/mifare/desfirecrypto.h @@ -105,6 +105,9 @@ void DesfireCryptoCMAC(DesfireContext *ctx, uint8_t *srcdata, size_t srcdatalen, void DesfireDESKeySetVersion(uint8_t *key, DesfireCryptoAlgorythm keytype, uint8_t version); uint8_t DesfireDESKeyGetVersion(uint8_t *key); +DesfireCommunicationMode DesfireFileCommModeToCommMode(uint8_t file_comm_mode); +uint8_t DesfireCommModeToFileCommMode(DesfireCommunicationMode comm_mode); + void desfire_crc32(const uint8_t *data, const size_t len, uint8_t *crc); void desfire_crc32_append(uint8_t *data, const size_t len); bool desfire_crc32_check(uint8_t *data, const size_t len, uint8_t *crc);