From 0fdc1b43ceb734490d206caee1d229170a617c5c Mon Sep 17 00:00:00 2001 From: Lava Git Date: Fri, 16 Aug 2019 14:27:48 +0100 Subject: [PATCH] Add Mifare Mini support --- .../Application/MifareClassic.c | 68 +++++++++++-------- .../Application/MifareClassic.h | 8 ++- Firmware/Chameleon-Mini/Configuration.c | 22 ++++++ Firmware/Chameleon-Mini/Configuration.h | 3 + Firmware/Chameleon-Mini/Makefile | 2 + 5 files changed, 71 insertions(+), 32 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index e96cf45..9233b6d 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -13,27 +13,29 @@ #include "Crypto1.h" #include "../Random.h" -#define MFCLASSIC_1K_ATQA_VALUE 0x0004 -#define MFCLASSIC_1K_7B_ATQA_VALUE 0x0044 -#define MFCLASSIC_4K_ATQA_VALUE 0x0002 -#define MFCLASSIC_4K_7B_ATQA_VALUE 0x0042 +#define MFCLASSIC_MINI_4B_ATQA_VALUE 0x0004 +#define MFCLASSIC_1K_ATQA_VALUE 0x0004 +#define MFCLASSIC_1K_7B_ATQA_VALUE 0x0044 +#define MFCLASSIC_4K_ATQA_VALUE 0x0002 +#define MFCLASSIC_4K_7B_ATQA_VALUE 0x0042 -#define MFCLASSIC_1K_SAK_VALUE 0x08 -#define MFCLASSIC_4K_SAK_VALUE 0x18 -#define SAK_UID_NOT_FINISHED 0x04 +#define MFCLASSIC_MINI_4B_SAK_VALUE 0x09 +#define MFCLASSIC_1K_SAK_VALUE 0x08 +#define MFCLASSIC_4K_SAK_VALUE 0x18 +#define SAK_UID_NOT_FINISHED 0x04 #define MEM_UID_CL1_ADDRESS 0x00 #define MEM_UID_CL1_SIZE 4 #define MEM_UID_BCC1_ADDRESS 0x04 -#define MEM_UID_CL2_ADDRESS 0x03 +#define MEM_UID_CL2_ADDRESS 0x03 #define MEM_UID_CL2_SIZE 4 #define MEM_KEY_A_OFFSET 48 /* Bytes */ #define MEM_KEY_B_OFFSET 58 /* Bytes */ -#define MEM_KEY_BIGSECTOR_OFFSET 192 +#define MEM_KEY_BIGSECTOR_OFFSET 192 #define MEM_KEY_SIZE 6 /* Bytes */ #define MEM_ACC_GPB_SIZE 4 /* Bytes */ #define MEM_SECTOR_ADDR_MASK 0xFC -#define MEM_BIGSECTOR_ADDR_MASK 0xF0 +#define MEM_BIGSECTOR_ADDR_MASK 0xF0 #define MEM_BYTES_PER_BLOCK 16 /* Bytes */ #define MEM_VALUE_SIZE 4 /* Bytes */ @@ -111,19 +113,19 @@ C1 C2 C3 read write read write read write /* Access conditions for data blocks -Access bits Access condition for Application -C1 C2 C3 read write increment decrement, +Access bits Access condition for Application +C1 C2 C3 read write increment decrement, transfer, restore -0 0 0 key A|B key A|B key A|B key A|B transport configuration -0 1 0 key A|B never never never read/write block -1 0 0 key A|B key B never never read/write block -1 1 0 key A|B key B key B key A|B value block -0 0 1 key A|B never never key A|B value block -0 1 1 key B key B never never read/write block -1 0 1 key B never never never read/write block -1 1 1 never never never never read/write block +0 0 0 key A|B key A|B key A|B key A|B transport configuration +0 1 0 key A|B never never never read/write block +1 0 0 key A|B key B never never read/write block +1 1 0 key A|B key B key B key A|B value block +0 0 1 key A|B never never key A|B value block +0 1 1 key B key B never never read/write block +1 0 1 key B never never never read/write block +1 1 1 never never never never read/write block */ #define ACC_BLOCK_READ 0x01 @@ -138,56 +140,56 @@ C1 C2 C3 read write increment decrement, static const uint8_t abBlockAccessConditions[8][2] = { /*C1C2C3 */ - /* 0 0 0 R:key A|B W: key A|B I:key A|B D:key A|B transport configuration */ + /* 0 0 0 R:key A|B W: key A|B I:key A|B D:key A|B transport configuration */ { /* Access with Key A */ ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT, /* Access with Key B */ ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT }, - /* 1 0 0 R:key A|B W:key B I:never D:never read/write block */ + /* 1 0 0 R:key A|B W:key B I:never D:never read/write block */ { /* Access with Key A */ ACC_BLOCK_READ, /* Access with Key B */ ACC_BLOCK_READ | ACC_BLOCK_WRITE }, - /* 0 1 0 R:key A|B W:never I:never D:never read/write block */ + /* 0 1 0 R:key A|B W:never I:never D:never read/write block */ { /* Access with Key A */ ACC_BLOCK_READ, /* Access with Key B */ ACC_BLOCK_READ }, - /* 1 1 0 R:key A|B W:key B I:key B D:key A|B value block */ + /* 1 1 0 R:key A|B W:key B I:key B D:key A|B value block */ { /* Access with Key A */ ACC_BLOCK_READ | ACC_BLOCK_DECREMENT, /* Access with Key B */ ACC_BLOCK_READ | ACC_BLOCK_WRITE | ACC_BLOCK_INCREMENT | ACC_BLOCK_DECREMENT }, - /* 0 0 1 R:key A|B W:never I:never D:key A|B value block */ + /* 0 0 1 R:key A|B W:never I:never D:key A|B value block */ { /* Access with Key A */ ACC_BLOCK_READ | ACC_BLOCK_DECREMENT, /* Access with Key B */ ACC_BLOCK_READ | ACC_BLOCK_DECREMENT }, - /* 1 0 1 R:key B W:never I:never D:never read/write block */ + /* 1 0 1 R:key B W:never I:never D:never read/write block */ { /* Access with Key A */ 0, /* Access with Key B */ ACC_BLOCK_READ }, - /* 0 1 1 R:key B W:key B I:never D:never read/write block */ + /* 0 1 1 R:key B W:key B I:never D:never read/write block */ { /* Access with Key A */ 0, /* Access with Key B */ ACC_BLOCK_READ | ACC_BLOCK_WRITE }, - /* 1 1 1 R:never W:never I:never D:never read/write block */ + /* 1 1 1 R:never W:never I:never D:never read/write block */ { /* Access with Key A */ 0, @@ -199,7 +201,7 @@ static const uint8_t abBlockAccessConditions[8][2] = /* Decoding table for Access conditions of the sector trailor */ static const uint8_t abTrailorAccessConditions[8][2] = { - /* 0 0 0 RdKA:never WrKA:key A RdAcc:key A WrAcc:never RdKB:key A WrKB:key A Key B may be read[1] */ + /* 0 0 0 RdKA:never WrKA:key A RdAcc:key A WrAcc:never RdKB:key A WrKB:key A Key B may be read[1] */ { /* Access with Key A */ ACC_TRAILOR_WRITE_KEYA | ACC_TRAILOR_READ_ACC | ACC_TRAILOR_WRITE_ACC | ACC_TRAILOR_READ_KEYB | ACC_TRAILOR_WRITE_KEYB, @@ -381,6 +383,14 @@ INLINE void ValueToBlock(uint8_t* Block, uint32_t Value) Block[11] = Block[3]; } +void MifareClassicAppInitMini4B(void) +{ + State = STATE_IDLE; + CardATQAValue = MFCLASSIC_MINI_4B_ATQA_VALUE; + CardSAKValue = MFCLASSIC_MINI_4B_SAK_VALUE; + FromHalt = false; +} + void MifareClassicAppInit1K(void) { State = STATE_IDLE; diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.h b/Firmware/Chameleon-Mini/Application/MifareClassic.h index 204efbc..f297443 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.h +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.h @@ -11,10 +11,12 @@ #include "Application.h" #include "ISO14443-3A.h" -#define MIFARE_CLASSIC_UID_SIZE ISO14443A_UID_SIZE_SINGLE -#define MIFARE_CLASSIC_1K_MEM_SIZE 1024 -#define MIFARE_CLASSIC_4K_MEM_SIZE 4096 +#define MIFARE_CLASSIC_UID_SIZE ISO14443A_UID_SIZE_SINGLE +#define MIFARE_CLASSIC_MINI_MEM_SIZE 320 +#define MIFARE_CLASSIC_1K_MEM_SIZE 1024 +#define MIFARE_CLASSIC_4K_MEM_SIZE 4096 +void MifareClassicAppInitMini4B(void); void MifareClassicAppInit1K(void); void MifareClassicAppInit4K(void); void MifareClassicAppInit1K7B(void); diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index df5a1ff..cefa5f3 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -19,6 +19,9 @@ static const MapEntryType PROGMEM ConfigurationMap[] = { { .Id = CONFIG_MF_ULTRALIGHT_EV1_80B, .Text = "MF_ULTRALIGHT_EV1_80B" }, { .Id = CONFIG_MF_ULTRALIGHT_EV1_164B, .Text = "MF_ULTRALIGHT_EV1_164B" }, #endif +#ifdef CONFIG_MF_CLASSIC_MINI_4B_SUPPORT + { .Id = CONFIG_MF_CLASSIC_MINI_4B, .Text = "MF_CLASSIC_MINI_4B" }, +#endif #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT { .Id = CONFIG_MF_CLASSIC_1K, .Text = "MF_CLASSIC_1K" }, #endif @@ -137,6 +140,24 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { .TagFamily = TAG_FAMILY_ISO14443A }, #endif +#ifdef CONFIG_MF_CLASSIC_MINI_4B_SUPPORT + [CONFIG_MF_CLASSIC_MINI_4B] = { + .CodecInitFunc = ISO14443ACodecInit, + .CodecDeInitFunc = ISO14443ACodecDeInit, + .CodecTaskFunc = ISO14443ACodecTask, + .ApplicationInitFunc = MifareClassicAppInitMini4B, + .ApplicationResetFunc = MifareClassicAppReset, + .ApplicationTaskFunc = MifareClassicAppTask, + .ApplicationTickFunc = ApplicationTickDummy, + .ApplicationProcessFunc = MifareClassicAppProcess, + .ApplicationGetUidFunc = MifareClassicGetUid, + .ApplicationSetUidFunc = MifareClassicSetUid, + .UidSize = MIFARE_CLASSIC_UID_SIZE, + .MemorySize = MIFARE_CLASSIC_MINI_MEM_SIZE, + .ReadOnly = false, + .TagFamily = TAG_FAMILY_ISO14443A + }, +#endif #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT [CONFIG_MF_CLASSIC_1K] = { .CodecInitFunc = ISO14443ACodecInit, @@ -386,3 +407,4 @@ void ConfigurationGetList(char* List, uint16_t BufferSize) MapToString(ConfigurationMap, ARRAY_COUNT(ConfigurationMap), List, BufferSize); } + diff --git a/Firmware/Chameleon-Mini/Configuration.h b/Firmware/Chameleon-Mini/Configuration.h index 9d53936..230f8e7 100644 --- a/Firmware/Chameleon-Mini/Configuration.h +++ b/Firmware/Chameleon-Mini/Configuration.h @@ -25,6 +25,9 @@ typedef enum { CONFIG_MF_ULTRALIGHT_EV1_80B, CONFIG_MF_ULTRALIGHT_EV1_164B, #endif +#ifdef CONFIG_MF_CLASSIC_MINI_4B_SUPPORT + CONFIG_MF_CLASSIC_MINI_4B, +#endif #ifdef CONFIG_MF_CLASSIC_1K_SUPPORT CONFIG_MF_CLASSIC_1K, #endif diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 5e61f05..89d375b 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -5,6 +5,7 @@ SHELL = /bin/sh #Supported configurations +SETTINGS += -DCONFIG_MF_CLASSIC_MINI_4B_SUPPORT SETTINGS += -DCONFIG_MF_CLASSIC_1K_SUPPORT SETTINGS += -DCONFIG_MF_CLASSIC_1K_7B_SUPPORT SETTINGS += -DCONFIG_MF_CLASSIC_4K_SUPPORT @@ -28,6 +29,7 @@ SETTINGS += -DSUPPORT_UID7_FIX_MANUFACTURER_BYTE SETTINGS += -DSUPPORT_FIRMWARE_UPGRADE #Default configuration +#SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_CLASSIC_MINI_4B #SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_CLASSIC_1K #SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_CLASSIC_4K #SETTINGS += -DDEFAULT_CONFIGURATION=CONFIG_MF_ULTRALIGHT