Skip to content
This repository has been archived by the owner on Mar 18, 2023. It is now read-only.

Commit

Permalink
ACR122U USB/PCSC reader stopped being responsive after all of the PM3…
Browse files Browse the repository at this point in the history
… compat changes: Attempt to fix this problem (PM3 command support verified as still working) -- Cf. emsec#313
  • Loading branch information
maxieds committed Jun 15, 2022
1 parent 1ce7b55 commit 39de8cc
Show file tree
Hide file tree
Showing 11 changed files with 157 additions and 73 deletions.
19 changes: 11 additions & 8 deletions Firmware/Chameleon-Mini/.gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
/Chameleon-Mini.eep
/Chameleon-Mini.hex
/Chameleon-Mini.elf
/Chameleon-Mini.map
/Chameleon-Mini.bin
/Chameleon-Mini.lss
/Chameleon-Mini.sym
/Bin/
Chameleon-Mini.eep
Chameleon-Mini.hex
Chameleon-Mini.elf
Chameleon-Mini.map
Chameleon-Mini.bin
Chameleon-Mini.lss
Chameleon-Mini.sym
Bin/
Bin/*
Latest/
Latest/*
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ uint8_t LastReaderSentCmd = 0x00;

uint8_t ISO14443ALastDataFrame[MAX_DATA_FRAME_XFER_SIZE] = { 0x00 };
uint16_t ISO14443ALastDataFrameBits = 0;
uint8_t ISO14443ALastIncomingDataFrame[MAX_DATA_FRAME_XFER_SIZE] = { 0x00 };
uint16_t ISO14443ALastIncomingDataFrameBits = 0;

bool CheckStateRetryCount2(bool resetByDefault, bool performLogging) {
if (resetByDefault || ++StateRetryCount > MAX_STATE_RETRY_COUNT) {
Expand Down Expand Up @@ -157,6 +159,8 @@ static uint16_t ISO144434ProcessBlock(uint8_t *Buffer, uint16_t ByteCount, uint1
case ISO14443_4_STATE_LAST: {
return ISO14443A_APP_NO_RESPONSE;
}
default:
break;
}

switch (PCB & ISO14443_PCB_BLOCK_TYPE_MASK) {
Expand Down Expand Up @@ -186,9 +190,9 @@ static uint16_t ISO144434ProcessBlock(uint8_t *Buffer, uint16_t ByteCount, uint1
}
Buffer[0] = PCB;
/* Let the DESFire application code process the input data */
ByteCount = MifareDesfireProcessCommand(Buffer + PrologueLength, ByteCount - PrologueLength);
ByteCount = MifareDesfireProcessCommand(&Buffer[PrologueLength], ByteCount - PrologueLength);
/* Short-circuit in case the app decides not to respond at all */
if (ByteCount == ISO14443A_APP_NO_RESPONSE) {
if (ByteCount == 0) {
const char *debugPrintStr = PSTR("ISO14443-4: APP_NO_RESP");
LogDebuggingMsg(debugPrintStr);
return ISO14443A_APP_NO_RESPONSE;
Expand Down Expand Up @@ -295,6 +299,7 @@ void ISO144433AReset(void) {
void ISO144433AHalt(void) {
ISO144433ASwitchState(ISO14443_3A_STATE_HALT);
Iso144433AIdleState = ISO14443_3A_STATE_HALT;
ISO144433AReset();
StateRetryCount = 0x00;
}

Expand All @@ -318,23 +323,25 @@ uint16_t ISO144433APiccProcess(uint8_t *Buffer, uint16_t BitCount) {
/* Wakeup and Request may occure in all states */
bool checkStateRetryStatus = CheckStateRetryCount(false);
bool incrementRetryCount = true;
if ((Cmd == ISO14443A_CMD_REQA) && (LastReaderSentCmd == ISO14443A_CMD_REQA) && !checkStateRetryStatus) {
/* Catch timing issues where the reader sends multiple
REQA bytes, in between which we would have already sent
back a response, so that we should not reset. */
if (Cmd == ISO14443A_CMD_REQA) {
LOG_AT_LEVEL(LogEntry(LOG_INFO_APP_CMD_REQA, NULL, 0), VERBOSE);
//ISO144434Reset();
ISO144433ASwitchState(ISO14443_3A_STATE_IDLE);
incrementRetryCount = false;
} else if (Cmd == ISO14443A_CMD_REQA || ISO14443ACmdIsWUPA(Cmd)) {
ISO144434Reset();
} else if (ISO14443ACmdIsWUPA(Cmd)) {
LOG_AT_LEVEL(LogEntry(LOG_INFO_APP_CMD_WUPA, NULL, 0), VERBOSE);
//ISO144434Reset();
ISO144433ASwitchState(ISO14443_3A_STATE_IDLE);
incrementRetryCount = false;
//return ISO14443A_APP_NO_RESPONSE;
} else if (ISO144433AIsHalt(Buffer, BitCount)) {
LogEntry(LOG_INFO_APP_CMD_HALT, NULL, 0);
LOG_AT_LEVEL(LogEntry(LOG_INFO_APP_CMD_HALT, NULL, 0), VERBOSE);
const char *logMsg = PSTR("ISO14443-3: HALTING");
LogDebuggingMsg(logMsg);
ISO144434Reset();
ISO144433AHalt();
return ISO14443A_APP_NO_RESPONSE;
}

LastReaderSentCmd = Cmd;
if (incrementRetryCount) {
StateRetryCount += 1;
Expand Down Expand Up @@ -424,8 +431,26 @@ uint16_t ISO144433APiccProcess(uint8_t *Buffer, uint16_t BitCount) {
LogDebuggingMsg(logMsg);
} else if (Cmd == ISO14443A_CMD_SELECT_CL3) {
Buffer[0] = ISO14443A_SAK_COMPLETE_NOT_COMPLIANT;
ISO14443AAppendCRCA(Buffer, 1);
ISO14443AAppendCRCA(&Buffer[0], 1);
return ISO14443A_SAK_FRAME_SIZE;
} else if (Cmd == ISO14443A_CMD_DESELECT) {
LOG_AT_LEVEL(LogEntry(LOG_INFO_APP_CMD_DESELECT, NULL, 0), VERBOSE);
/* See if the process can make sense of the first byte: */
//uint16_t ByteCount = ASBYTES(BitCount);
//uint16_t ReturnBits = ISO144434ProcessBlock(Buffer, ByteCount, BitCount);
//if (ReturnBits > 0) {
// return ReturnBits;
//}
/* Otherwise (doesn't seem to work): Return a HALT frame to the reader: */
//Buffer[0] = ISO14443A_CMD_HLTA;
//Buffer[1] = 0x00;
//ISO14443AAppendCRCA(&Buffer[0], 2);
//ISO144434SwitchState(ISO14443_3A_STATE_HALT);
//return ISO14443A_DESELECT_FRAME_SIZE;
/* Otherwise: Return a WUPA frame to the reader to reset: */
//Buffer[0] = ISO14443A_CMD_WUPA;
//ISO144434SwitchState(ISO14443_3A_STATE_HALT);
//return ASBITS(1);
}
/* Forward to ISO/IEC 14443-4 processing code */
uint16_t ByteCount = ASBYTES(BitCount);
Expand All @@ -439,7 +464,7 @@ uint16_t ISO144433APiccProcess(uint8_t *Buffer, uint16_t BitCount) {

}

/* Unknown command. Reset back to idle/halt state. */
/* Fallthrough: Unknown command. Reset back to idle/halt state. */
bool defaultReset = false;
if (!CheckStateRetryCount(defaultReset)) {
const char *logMsg = PSTR("ISO14443-3: RESET TO IDLE 0x%02x");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ This notice must be retained at the top of all source files where indicated.
#define ISO14443A_RATS_FRAME_SIZE ASBITS(6) /* Bit */
#define ISO14443A_CMD_RNAK 0xB2
#define ISO14443A_CRC_FRAME_SIZE ASBITS(ISO14443A_CRCA_SIZE)
#define ISO14443A_CMD_DESELECT 0xC2
#define ISO14443A_DESELECT_FRAME_SIZE (ISO14443A_HLTA_FRAME_SIZE + ASBITS(ISO14443A_CRCA_SIZE))

#define ISO14443ACmdIsPM3WUPA(cmd) ((cmd & 0x54) == 0x54)
#define ISO14443ACmdIsWUPA(cmd) ((cmd == ISO14443A_CMD_WUPA) || ISO14443ACmdIsPM3WUPA(cmd))
Expand Down Expand Up @@ -101,6 +103,8 @@ extern uint8_t LastReaderSentCmd;
#define MAX_DATA_FRAME_XFER_SIZE (64)
extern uint8_t ISO14443ALastDataFrame[MAX_DATA_FRAME_XFER_SIZE];
extern uint16_t ISO14443ALastDataFrameBits;
extern uint8_t ISO14443ALastIncomingDataFrame[MAX_DATA_FRAME_XFER_SIZE];
extern uint16_t ISO14443ALastIncomingDataFrameBits;

INLINE ISO14443AStoreLastDataFrameAndReturn(const uint8_t *Buffer, uint16_t BufferBitCount) {
uint16_t ISO14443ALastDataFrameBytes = MIN((BufferBitCount + BITS_PER_BYTE - 1) / BITS_PER_BYTE, MAX_DATA_FRAME_XFER_SIZE);
Expand All @@ -113,7 +117,7 @@ INLINE ISO14443AStoreLastDataFrameAndReturn(const uint8_t *Buffer, uint16_t Buff

/* Setup some fuzzy response handling for problematic readers like the ACR122U */

#define MAX_STATE_RETRY_COUNT (0x0a)
#define MAX_STATE_RETRY_COUNT (0x0b)
extern uint8_t StateRetryCount;
bool CheckStateRetryCount(bool resetByDefault);
bool CheckStateRetryCount2(bool resetByDefault, bool performLogging);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,6 @@ typedef enum DESFIRE_FIRMWARE_ENUM_PACKING {
CMD_ISO7816_UPDATE_BINARY = 0xD6,
CMD_ISO7816_APPEND_RECORD = 0xE2,

/* Space for undocumented command codes --
* Need command codes and parameters to make these work moving forward: */
//CMD_READ_SIGNATURE /* See page 87 of AN12343.pdf (for Mifare DESFire Light tags) */

} DESFireCommandType;

typedef uint16_t (*InsCodeHandlerFunc)(uint8_t *Buffer, uint16_t ByteCount);
Expand Down
12 changes: 12 additions & 0 deletions Firmware/Chameleon-Mini/Application/DESFire/DESFireLogging.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,18 @@ typedef enum DESFIRE_FIRMWARE_ENUM_PACKING {
DEBUGGING = 3,
} DESFireLoggingMode;

#ifndef DESFIRE_DEFAULT_LOGGING_MODE
#define DESFIRE_DEFAULT_LOGGING_MODE (OFF)
#endif

#define LOG_AT_LEVEL(cmdToRun, loggingThreshold) ({ \
do { \
if (loggingThreshold >= DESFIRE_DEFAULT_LOGGING_MODE) { \
cmdToRun; \
} \
} while(0); \
})

extern DESFireLoggingMode LocalLoggingMode;

/*
Expand Down
34 changes: 34 additions & 0 deletions Firmware/Chameleon-Mini/Application/MifareDESFire.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ This notice must be retained at the top of all source files where indicated.
#define MIFARE_DESFIRE_EV1 (0x01)
#define MIFARE_DESFIRE_EV2 (0x02)

#define IsControlCmd(Buffer, BitCount) \
(BitCount > 0 && \
((Buffer[0] == ISO14443A_CMD_WUPA) || \
(Buffer[0] == ISO14443A_CMD_REQA)))

DesfireStateType DesfireState = DESFIRE_HALT;
DesfireStateType DesfirePreviousState = DESFIRE_IDLE;
bool DesfireFromHalt = false;
Expand Down Expand Up @@ -127,10 +132,15 @@ uint16_t MifareDesfireProcessCommand(uint8_t *Buffer, uint16_t ByteCount) {

if (ByteCount == 0) {
return ISO14443A_APP_NO_RESPONSE;
} else if (MutualAuthenticateCmd(Buffer[0])) {
LastReaderSentCmd = Buffer[0];
} else if (Buffer[0] != STATUS_ADDITIONAL_FRAME) {
DesfireState = DESFIRE_IDLE;
LastReaderSentCmd = Buffer[0];
uint16_t ReturnBytes = CallInstructionHandler(Buffer, ByteCount);
return ReturnBytes;
} else {
LastReaderSentCmd = Buffer[0];
}

uint16_t ReturnBytes = 0;
Expand All @@ -153,6 +163,18 @@ uint16_t MifareDesfireProcessCommand(uint8_t *Buffer, uint16_t ByteCount) {
case DESFIRE_AES_AUTHENTICATE2:
ReturnBytes = DesfireCmdAuthenticateAES2(Buffer, ByteCount);
break;
case DESFIRE_ISO7816_EXT_AUTH:
DEBUG_PRINT_P(PSTR("TODO -- ISO7816-ExtAuth"));
ReturnBytes = ISO14443A_APP_NO_RESPONSE;
break;
case DESFIRE_ISO7816_INT_AUTH:
DEBUG_PRINT_P(PSTR("TODO -- ISO7816-IntAuth"));
ReturnBytes = ISO14443A_APP_NO_RESPONSE;
break;
case DESFIRE_ISO7816_GET_CHALLENGE:
DEBUG_PRINT_P(PSTR("TODO -- ISO7816-GetChall"));
ReturnBytes = ISO14443A_APP_NO_RESPONSE;
break;
case DESFIRE_READ_DATA_FILE:
ReturnBytes = ReadDataFileIterator(Buffer);
break;
Expand Down Expand Up @@ -226,6 +248,18 @@ uint16_t MifareDesfireAppProcess(uint8_t *Buffer, uint16_t BitCount) {
uint16_t ReturnedBytes = 0;
uint16_t ByteCount = ASBYTES(BitCount);
LogEntry(LOG_INFO_DESFIRE_INCOMING_DATA, Buffer, ByteCount);
if (ByteCount > 1 &&
!memcmp(&Buffer[0], &ISO14443ALastIncomingDataFrame[0], MIN(ASBYTES(ISO14443ALastIncomingDataFrameBits), ByteCount))) {
/* The PCD resent the same data frame (probably a synchronization issue):
* Send out the same data as last time:
*/
memcpy(&Buffer[0], &ISO14443ALastDataFrame[0], ASBYTES(ISO14443ALastDataFrameBits));
return ISO14443ALastDataFrameBits;
} else {
memcpy(&ISO14443ALastIncomingDataFrame[0], &Buffer[0], ByteCount);
ISO14443ALastIncomingDataFrameBits = BitCount;
LastReaderSentCmd = Buffer[0];
}
if (ByteCount >= 3 && Buffer[2] == STATUS_ADDITIONAL_FRAME &&
DesfireStateExpectingAdditionalFrame(DesfireState)) {
/* [PM3-V1] : Handle the ISO-prologue-only-wrapped version of the additional frame data: */
Expand Down
24 changes: 16 additions & 8 deletions Firmware/Chameleon-Mini/Application/MifareDESFire.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,20 +81,28 @@ typedef enum DESFIRE_FIRMWARE_ENUM_PACKING {
DESFIRE_ISO_AUTHENTICATE2,
DESFIRE_AES_AUTHENTICATE,
DESFIRE_AES_AUTHENTICATE2,
DESFIRE_ISO7816_EXT_AUTH,
DESFIRE_ISO7816_INT_AUTH,
DESFIRE_ISO7816_GET_CHALLENGE,
DESFIRE_READ_DATA_FILE,
DESFIRE_WRITE_DATA_FILE,
} DesfireStateType;

#define DesfireStateExpectingAdditionalFrame(dfState) \
((dfState == DESFIRE_GET_VERSION2) || \
(dfState == DESFIRE_GET_VERSION3) || \
(dfState == DESFIRE_GET_APPLICATION_IDS2) || \
(dfState == DESFIRE_LEGACY_AUTHENTICATE2) || \
(dfState == DESFIRE_ISO_AUTHENTICATE2) || \
(dfState == DESFIRE_AES_AUTHENTICATE2) || \
(dfState == DESFIRE_READ_DATA_FILE) || \
#define DesfireStateExpectingAdditionalFrame(dfState) \
((dfState == DESFIRE_GET_VERSION2) || \
(dfState == DESFIRE_GET_VERSION3) || \
(dfState == DESFIRE_GET_APPLICATION_IDS2) || \
(dfState == DESFIRE_LEGACY_AUTHENTICATE2) || \
(dfState == DESFIRE_ISO_AUTHENTICATE2) || \
(dfState == DESFIRE_AES_AUTHENTICATE2) || \
(dfState == DESFIRE_READ_DATA_FILE) || \
(dfState == DESFIRE_WRITE_DATA_FILE))

#define MutualAuthenticateCmd(cmdCode) \
((cmdCode == CMD_ISO7816_EXTERNAL_AUTHENTICATE) || \
(cmdCode == CMD_ISO7816_INTERNAL_AUTHENTICATE) || \
(cmdCode == CMD_ISO7816_GET_CHALLENGE))

extern DesfireStateType DesfireState;
extern DesfireStateType DesfirePreviousState;
extern bool DesfireFromHalt;
Expand Down
11 changes: 7 additions & 4 deletions Firmware/Chameleon-Mini/BuildScripts/lufa_build_extra.mk
Original file line number Diff line number Diff line change
Expand Up @@ -193,14 +193,17 @@ ifneq ($(UNKNOWN_SOURCE),)
endif

# Convert input source filenames into a list of required output object files
FWSRC_OBJECT_FILES := $(addsuffix .o, $(basename $(FULL_SOURCE)))
OBJECT_FILES += $(sort $(FWSRC_OBJECT_FILES))
LUFA_OBJECT_FILES := $(addsuffix .o, $(basename $(LUFA_SRC)))
FWSRC_OBJECT_FILES := $(addsuffix .o, $(basename $(FULL_SOURCE)))
OBJECT_FILES += $(sort $(FWSRC_OBJECT_FILES))
CHAMELEON_OBJECT_FILES := $(addsuffix .o, $(basename $(SRC)))
LUFA_OBJECT_FILES := $(addsuffix .o, $(basename $(LUFA_SRC)))

# Check if an output object file directory was specified instead of the input file location
ifneq ("$(OBJDIR)",".")
# Prefix all the object filenames with the output object file directory path
OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES)))
OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES)))
CHAMELEON_OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(CHAMELEON_OBJECT_FILES)))
LUFA_OBJECT_FILES := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(LUFA_OBJECT_FILES)))

# Check if any object file (without path) appears more than once in the object file list
ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES)))
Expand Down
51 changes: 27 additions & 24 deletions Firmware/Chameleon-Mini/Log.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,38 +19,41 @@ extern uint16_t LogMemLeft;
/** Enum for log entry type. \note Every entry type has a specific integer value, which can be found in the source code. */
typedef enum {
/* Generic */
LOG_INFO_GENERIC = 0x10, ///< Unspecific log entry.
LOG_INFO_CONFIG_SET = 0x11, ///< Configuration change.
LOG_INFO_SETTING_SET = 0x12, ///< Setting change.
LOG_INFO_UID_SET = 0x13, ///< UID change.
LOG_INFO_RESET_APP = 0x20, ///< Application reset.
LOG_INFO_GENERIC = 0x10, ///< Unspecific log entry.
LOG_INFO_CONFIG_SET = 0x11, ///< Configuration change.
LOG_INFO_SETTING_SET = 0x12, ///< Setting change.
LOG_INFO_UID_SET = 0x13, ///< UID change.
LOG_INFO_RESET_APP = 0x20, ///< Application reset.

/* Codec */
LOG_INFO_CODEC_RX_DATA = 0x40, ///< Currently active codec received data.
LOG_INFO_CODEC_TX_DATA = 0x41, ///< Currently active codec sent data.
LOG_INFO_CODEC_RX_DATA_W_PARITY = 0x42, ///< Currently active codec received data.
LOG_INFO_CODEC_TX_DATA_W_PARITY = 0x43, ///< Currently active codec sent data.
LOG_INFO_CODEC_SNI_READER_DATA = 0x44, //< Sniffing codec receive data from reader
LOG_INFO_CODEC_SNI_READER_DATA_W_PARITY = 0x45, //< Sniffing codec receive data from reader
LOG_INFO_CODEC_SNI_CARD_DATA = 0x46, //< Sniffing codec receive data from card
LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY = 0x47, //< Sniffing codec receive data from card
LOG_INFO_CODEC_READER_FIELD_DETECTED = 0x48, ///< Add logging of the LEDHook case for FIELD_DETECTED
LOG_INFO_CODEC_RX_DATA = 0x40, ///< Currently active codec received data.
LOG_INFO_CODEC_TX_DATA = 0x41, ///< Currently active codec sent data.
LOG_INFO_CODEC_RX_DATA_W_PARITY = 0x42, ///< Currently active codec received data.
LOG_INFO_CODEC_TX_DATA_W_PARITY = 0x43, ///< Currently active codec sent data.
LOG_INFO_CODEC_SNI_READER_DATA = 0x44, //< Sniffing codec receive data from reader
LOG_INFO_CODEC_SNI_READER_DATA_W_PARITY = 0x45, //< Sniffing codec receive data from reader
LOG_INFO_CODEC_SNI_CARD_DATA = 0x46, //< Sniffing codec receive data from card
LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY = 0x47, //< Sniffing codec receive data from card
LOG_INFO_CODEC_READER_FIELD_DETECTED = 0x48, ///< Add logging of the LEDHook case for FIELD_DETECTED

/* App */
LOG_INFO_APP_CMD_READ = 0x80, ///< Application processed read command.
LOG_INFO_APP_CMD_WRITE = 0x81, ///< Application processed write command.
LOG_INFO_APP_CMD_INC = 0x84, ///< Application processed increment command.
LOG_INFO_APP_CMD_DEC = 0x85, ///< Application processed decrement command.
LOG_INFO_APP_CMD_READ = 0x80, ///< Application processed read command.
LOG_INFO_APP_CMD_WRITE = 0x81, ///< Application processed write command.
LOG_INFO_APP_CMD_INC = 0x84, ///< Application processed increment command.
LOG_INFO_APP_CMD_DEC = 0x85, ///< Application processed decrement command.
LOG_INFO_APP_CMD_TRANSFER = 0x86, ///< Application processed transfer command.
LOG_INFO_APP_CMD_RESTORE = 0x87, ///< Application processed restore command.
LOG_INFO_APP_CMD_AUTH = 0x90, ///< Application processed authentication command.
LOG_INFO_APP_CMD_HALT = 0x91, ///< Application processed halt command.
LOG_INFO_APP_CMD_AUTH = 0x90, ///< Application processed authentication command.
LOG_INFO_APP_CMD_HALT = 0x91, ///< Application processed halt command.
LOG_INFO_APP_CMD_UNKNOWN = 0x92, ///< Application processed an unknown command.
LOG_INFO_APP_AUTHING = 0xA0, ///< Application is in `authing` state.
LOG_INFO_APP_AUTHED = 0xA1, ///< Application is in `auth` state.
LOG_ERR_APP_AUTH_FAIL = 0xC0, ///< Application authentication failed.
LOG_INFO_APP_CMD_REQA = 0x93, ///< Application (ISO14443A handler) processed REQA.
LOG_INFO_APP_CMD_WUPA = 0x94, ///< Application (ISO14443A handler) processed WUPA.
LOG_INFO_APP_CMD_DESELECT = 0x95, ///< Application (ISO14443A handler) processed DESELECT.
LOG_INFO_APP_AUTHING = 0xA0, ///< Application is in `authing` state.
LOG_INFO_APP_AUTHED = 0xA1, ///< Application is in `auth` state.
LOG_ERR_APP_AUTH_FAIL = 0xC0, ///< Application authentication failed.
LOG_ERR_APP_CHECKSUM_FAIL = 0xC1, ///< Application had a checksum fail.
LOG_ERR_APP_NOT_AUTHED = 0xC2, ///< Application is not authenticated.
LOG_ERR_APP_NOT_AUTHED = 0xC2, ///< Application is not authenticated.

/* DESFire emulation and development related logging messages (0xEx): */
#ifdef CONFIG_MF_DESFIRE_SUPPORT
Expand Down
Loading

0 comments on commit 39de8cc

Please sign in to comment.