Skip to content

Commit 18007ef

Browse files
authored
Merge pull request #190 from ca1e/master
Add UIDMODE command
2 parents 9f958e9 + fd70f10 commit 18007ef

File tree

9 files changed

+59
-3
lines changed

9 files changed

+59
-3
lines changed

Firmware/ChameleonMini/Application/MifareClassic.c

+9-1
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) {
664664
isFromHaltChain = (State == STATE_HALT);
665665
isCascadeStepOnePassed = false;
666666
#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE
667-
if (Buffer[0] == MFCLASSIC_CMD_CHINESE_UNLOCK) {
667+
if (Buffer[0] == MFCLASSIC_CMD_CHINESE_UNLOCK && AppMemoryUidMode()) {
668668
State = STATE_CHINESE_IDLE;
669669
Buffer[0] = MFCLASSIC_ACK_VALUE;
670670
retSize = MFCLASSIC_ACK_NAK_FRAME_SIZE;
@@ -785,6 +785,14 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) {
785785
break; /* End of state READY */
786786

787787
case STATE_ACTIVE:
788+
#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE
789+
if (Buffer[0] == MFCLASSIC_CMD_CHINESE_UNLOCK && AppMemoryUidMode()) {
790+
State = STATE_CHINESE_IDLE;
791+
Buffer[0] = MFCLASSIC_ACK_VALUE;
792+
retSize = MFCLASSIC_ACK_NAK_FRAME_SIZE;
793+
break;
794+
}
795+
#endif
788796
if ( (Buffer[0] == MFCLASSIC_CMD_AUTH_A) || (Buffer[0] == MFCLASSIC_CMD_AUTH_B) ) {
789797
if (ISO14443ACheckCRCA(Buffer, MFCLASSIC_CMD_AUTH_FRAME_SIZE)) {
790798
mfcHandleAuthenticationRequest(false, Buffer, &retSize);

Firmware/ChameleonMini/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ SETTINGS += -DCONFIG_MF_CLASSIC_DETECTION_SUPPORT
2626
#SETTINGS += -DCONFIG_MF_CLASSIC_LOG_SUPPORT
2727

2828
#Support magic mode on mifare classic configuration
29-
#SETTINGS += -DSUPPORT_MF_CLASSIC_MAGIC_MODE
29+
SETTINGS += -DSUPPORT_MF_CLASSIC_MAGIC_MODE
3030

3131
#Support activating firmware upgrade mode through command-line
3232
SETTINGS += -DSUPPORT_FIRMWARE_UPGRADE

Firmware/ChameleonMini/Memory/Memory.c

+4
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,7 @@ bool AppCardMemoryClear(void) {
270270
bool AppWorkingMemoryClear(void) {
271271
return AppWorkingMemoryClearForSetting(GlobalSettings.ActiveSetting);
272272
}
273+
274+
bool AppMemoryUidMode(void) {
275+
return GlobalSettings.UidMode;
276+
}

Firmware/ChameleonMini/Memory/Memory.h

+2
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,6 @@ bool AppCardMemoryClear(void);
8888
bool AppWorkingMemoryClearForSetting(uint8_t SettingNumber);
8989
bool AppWorkingMemoryClear(void);
9090

91+
bool AppMemoryUidMode(void);
92+
9193
#endif /* _MEM_MEMORY_H_ */

Firmware/ChameleonMini/Settings.c

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ SettingsType GlobalSettings;
1414
SettingsType EEMEM StoredSettings = {
1515
.ActiveSetting = DEFAULT_SETTING,
1616
.ActiveSettingPtr = &GlobalSettings.Settings[DEFAULT_SETTING],
17+
.UidMode = 0,
1718

1819
.Settings = { [SETTINGS_FIRST ... SETTINGS_LAST] = {
1920
.Configuration = DEFAULT_CONFIGURATION,
@@ -82,3 +83,8 @@ bool SettingsSetActiveByName(const char* Setting) {
8283
return false;
8384
}
8485
}
86+
87+
void SettingsSetUidMode(bool isActive) {
88+
GlobalSettings.UidMode = isActive;
89+
SettingsSave();
90+
}

Firmware/ChameleonMini/Settings.h

+3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ typedef struct {
3535
uint8_t ActiveSetting;
3636
SettingsEntryType* ActiveSettingPtr;
3737
SettingsEntryType Settings[SETTINGS_COUNT];
38+
bool UidMode;
3839
} SettingsType;
3940

4041
extern SettingsType GlobalSettings;
@@ -49,4 +50,6 @@ uint8_t SettingsGetActiveById(void);
4950
void SettingsGetActiveByName(char* SettingOut, uint16_t BufferSize);
5051
bool SettingsSetActiveByName(const char* Setting);
5152

53+
void SettingsSetUidMode(bool isActive);
54+
5255
#endif /* SETTINGS_H_ */

Firmware/ChameleonMini/Terminal/CommandLine.c

+8
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,14 @@ const PROGMEM CommandEntryType CommandTable[] = {
330330
.SetFunc = NO_FUNCTION,
331331
.GetFunc = CommandGetDetection,
332332
},
333+
#endif
334+
#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE
335+
{
336+
.Command = COMMAND_UIDMOD,
337+
.ExecFunc = NO_FUNCTION,
338+
.SetFunc = CommandSetUidMode,
339+
.GetFunc = CommandGetUidMode,
340+
},
333341
#endif
334342
{
335343
.Command = COMMAND_CLEARALL,

Firmware/ChameleonMini/Terminal/Commands.c

+19
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,25 @@ CommandStatusIdType CommandGetDetection(char* OutParam) {
428428
}
429429
#endif
430430

431+
#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE
432+
CommandStatusIdType CommandGetUidMode(char* OutParam) {
433+
snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), GlobalSettings.UidMode);
434+
return COMMAND_INFO_OK_WITH_TEXT_ID;
435+
}
436+
CommandStatusIdType CommandSetUidMode(char* OutMessage, const char* InParam) {
437+
if (InParam[1] == '\0') {
438+
if (InParam[0] == COMMAND_CHAR_TRUE) {
439+
SettingsSetUidMode(true);
440+
return COMMAND_INFO_OK_ID;
441+
} else if (InParam[0] == COMMAND_CHAR_FALSE) {
442+
SettingsSetUidMode(false);
443+
return COMMAND_INFO_OK_ID;
444+
}
445+
}
446+
return COMMAND_ERR_INVALID_PARAM_ID;
447+
}
448+
#endif
449+
431450
CommandStatusIdType CommandExecClearAll(char* OutMessage) {
432451
MemoryClearAll();
433452
for(uint8_t i = SETTINGS_FIRST; i <= SETTINGS_LAST; i++) {

Firmware/ChameleonMini/Terminal/Commands.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright 2013 Timo Kasper, Simon KŸppers, David Oswald ("ORIGINAL
1+
/* Copyright 2013 Timo Kasper, Simon KŸppers, David Oswald ("ORIGINAL
22
* AUTHORS"). All rights reserved.
33
*
44
* DEFINITIONS:
@@ -196,6 +196,12 @@ CommandStatusIdType CommandGetUltralightPassword(char* OutParam);
196196
CommandStatusIdType CommandGetDetection(char* OutParam);
197197
#endif
198198

199+
#ifdef SUPPORT_MF_CLASSIC_MAGIC_MODE
200+
#define COMMAND_UIDMOD "UIDMODE"
201+
CommandStatusIdType CommandGetUidMode(char* OutParam);
202+
CommandStatusIdType CommandSetUidMode(char* OutMessage, const char* InParam);
203+
#endif
204+
199205
#define COMMAND_CLEARALL "CLEARALL"
200206
CommandStatusIdType CommandExecClearAll(char* OutMessage);
201207

0 commit comments

Comments
 (0)