mirror of
https://github.com/RfidResearchGroup/ChameleonMini.git
synced 2026-05-12 11:20:37 -07:00
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user