Skip to content

Commit

Permalink
Merge pull request #2557 from douniwan5788/82xx_config
Browse files Browse the repository at this point in the history
add: 82xx config parse
  • Loading branch information
iceman1001 authored Oct 4, 2024
2 parents e991542 + d361cd8 commit f00fac8
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 117 deletions.
24 changes: 12 additions & 12 deletions armsrc/hitagS.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,11 @@ static void calc_crc(unsigned char *crc, unsigned char data, unsigned char Bitco

static void update_tag_max_page(void) {
//check which memorysize this tag has
if ((tag.data.s.CON0 & 0x3) == 0x00) {
if (tag.data.s.config.MEMT == 0x00) {
tag.max_page = 32 / (HITAGS_PAGE_SIZE * 8) - 1;
} else if ((tag.data.s.CON0 & 0x3) == 0x1) {
} else if (tag.data.s.config.MEMT == 0x1) {
tag.max_page = 256 / (HITAGS_PAGE_SIZE * 8) - 1;
} else if ((tag.data.s.CON0 & 0x3) == 0x2) {
} else if (tag.data.s.config.MEMT == 0x2) {
tag.max_page = 2048 / (HITAGS_PAGE_SIZE * 8) - 1;
} else {
tag.max_page = HITAGS_MAX_PAGES - 1;
Expand Down Expand Up @@ -545,7 +545,7 @@ static void hts_handle_reader_command(uint8_t *rx, const size_t rxlen,

//send con2, pwdh0, pwdl0, pwdl1 encrypted as a response
tx[0] = ht2_hitag2_byte(&state) ^ tag.data.pages[HITAGS_CONFIG_PADR][2];
tx[1] = ht2_hitag2_byte(&state) ^ tag.data.s.pwdh0;
tx[1] = ht2_hitag2_byte(&state) ^ tag.data.s.config.pwdh0;
tx[2] = ht2_hitag2_byte(&state) ^ tag.data.s.pwdl0;
tx[3] = ht2_hitag2_byte(&state) ^ tag.data.s.pwdl1;

Expand All @@ -554,7 +554,7 @@ static void hts_handle_reader_command(uint8_t *rx, const size_t rxlen,
*txlen += 8;
crc = CRC_PRESET;
calc_crc(&crc, tag.data.pages[HITAGS_CONFIG_PADR][2], 8);
calc_crc(&crc, tag.data.s.pwdh0, 8);
calc_crc(&crc, tag.data.s.config.pwdh0, 8);
calc_crc(&crc, tag.data.s.pwdl0, 8);
calc_crc(&crc, tag.data.s.pwdl1, 8);
tx[4] = (crc ^ ht2_hitag2_byte(&state));
Expand Down Expand Up @@ -612,7 +612,7 @@ static void hts_handle_reader_command(uint8_t *rx, const size_t rxlen,
*txlen = 32;
memcpy(tx, tag.data.pages[page], HITAGS_PAGE_SIZE);

if (tag.data.s.auth && page == HITAGS_CONFIG_PADR) {
if (tag.data.s.config.auth && page == HITAGS_CONFIG_PADR) {
tx[3] = 0xFF;
}

Expand All @@ -626,7 +626,7 @@ static void hts_handle_reader_command(uint8_t *rx, const size_t rxlen,
tx[4] = crc;
}

if (tag.data.s.auth && tag.data.s.LKP && (page == 2 || page == 3)) {
if (tag.data.s.config.auth && tag.data.s.config.LKP && (page == 2 || page == 3)) {
//if reader asks for key or password and the LKP-mark is set do not respond
*txlen = 0;
}
Expand All @@ -650,8 +650,8 @@ static void hts_handle_reader_command(uint8_t *rx, const size_t rxlen,

} else if ((rx[0] & 0xf0) == HITAGS_WRITE_PAGE) { //write page
// TODO: handle con2 LCK*
if ((tag.data.s.LCON && page == 1)
|| (tag.data.s.LKP && (page == 2 || page == 3))) {
if ((tag.data.s.config.LCON && page == 1)
|| (tag.data.s.config.LKP && (page == 2 || page == 3))) {
//deny
*txlen = 0;
} else {
Expand All @@ -664,8 +664,8 @@ static void hts_handle_reader_command(uint8_t *rx, const size_t rxlen,

} else if ((rx[0] & 0xf0) == HITAGS_WRITE_BLOCK) { //write block
// TODO: handle LCON con2 LCK*
if ((tag.data.s.LCON && page == 1)
|| (tag.data.s.LKP && (page == 2 || page == 3))) {
if ((tag.data.s.config.LCON && page == 1)
|| (tag.data.s.config.LKP && (page == 2 || page == 3))) {
//deny
*txlen = 0;
} else {
Expand Down Expand Up @@ -1146,7 +1146,7 @@ static int hts_select_tag(const lf_hitag_data_t *packet, uint8_t *tx, size_t siz

DBG Dbprintf("conf 0: %02X conf 1: %02X conf 2: %02X", tag.data.pages[HITAGS_CONFIG_PADR][0], tag.data.pages[HITAGS_CONFIG_PADR][1], tag.data.pages[HITAGS_CONFIG_PADR][2]);

if (tag.data.s.auth == 1) {
if (tag.data.s.config.auth == 1) {

uint64_t key_le = 0;
// if the tag is in authentication mode try the key or challenge
Expand Down
45 changes: 19 additions & 26 deletions client/src/cmdlfhitaghts.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ static int CmdLFHitagSRead(const char *Cmd) {

lf_hts_read_response_t *card = (lf_hts_read_response_t *)resp.data.asBytes;

hitags_config_t config = hitags_config_unpack(card->config_page.asBytes);
hitags_config_t config = card->config_page.s;

PrintAndLogEx(NORMAL, "");
PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------");
Expand All @@ -298,7 +298,7 @@ static int CmdLFHitagSRead(const char *Cmd) {
const int hts_mem_sizes[] = {1, 8, 64, 64};

if (count == 0) {
count = hts_mem_sizes[config.memory_type] - page;
count = hts_mem_sizes[config.MEMT] - page;
}

// int page_end = page + count;
Expand Down Expand Up @@ -448,45 +448,38 @@ static int CmdLFHitagSList(const char *Cmd) {
return CmdTraceListAlias(Cmd, "lf hitag hts", "hitags");
}

hitags_config_t hitags_config_unpack(const uint8_t *config_bytes) {
hitags_config_t result = {
.memory_type = (config_bytes[0] >> 0) & 0x03,
.authentication = (config_bytes[1] >> 7) & 0x01,
.ttf_coding = (config_bytes[1] >> 6) & 0x01,
.ttf_data_rate = (config_bytes[1] >> 4) & 0x03,
.ttf_mode = (config_bytes[1] >> 2) & 0x03,
.lock_config = (config_bytes[1] >> 1) & 0x01,
.lock_key = (config_bytes[1] >> 0) & 0x01
};
return result;
}

void hitags_config_print(hitags_config_t config) {
PrintAndLogEx(INFO, " Memory type...... " _GREEN_("%s"),
(const char *[]) {
"Hitag S 32", "Hitag S 256", "Hitag S 2048",
"Unknown Hitag S/8211"
}[config.memory_type]);
}[config.MEMT]);

PrintAndLogEx(INFO, " Authenticaion.... %s", config.authentication ? _YELLOW_("Yes") : "No");
PrintAndLogEx(INFO, " Authenticaion.... %s", config.auth ? _YELLOW_("Yes") : "No");

PrintAndLogEx(INFO, " TTF coding....... %s",
(const char *[]) {"Manchester", "Biphase"}[config.ttf_coding]);
config.RES3 ? "FSK 0=RF/10 1=RF/8" : (const char *[]){"Manchester", "Biphase"}[config.TTFC]);

PrintAndLogEx(INFO, " TTF data rate.... %s",
(const char *[]) {
"4 kBit", "8 kBit", "2 kBit",
"2 kBit and Pigeon Race Standard"
}[config.ttf_data_rate]);
}[config.TTFDR]);

PrintAndLogEx(INFO, " TTF mode......... %s",
(const char *[]) {
"TTF Mode disabled (= RTF Mode)", "Page 4, Page 5",
"Page 4, Page 5, Page 6, Page 7", "Page 4"
}[config.ttf_mode]);

PrintAndLogEx(INFO, " Config locked.... %s", config.lock_config ? _RED_("Yes") : _GREEN_("No"));
PrintAndLogEx(INFO, " Key/PWD locked... %s", config.lock_key ? _RED_("Yes") : _GREEN_("No"));
(const char *[]){
"TTF Mode disabled (= RTF Mode)",
"Page 4, Page 5",
"Page 4, Page 5, Page 6, Page 7",
"Page 4",
"TTF Mode disabled (= RTF Mode)",
"Page 4, Page 5, Page 6",
"Page 4, Page 5, Page 6, Page 7, Page 8",
"Page 4, Page 5, Page 6, Page 7, Page 8, Page 9, Page 10, Page 11",
}[config.RES0 << 2 | config.TTFM]);

PrintAndLogEx(INFO, " Config locked.... %s", config.LCON ? _RED_("Yes") : _GREEN_("No"));
PrintAndLogEx(INFO, " Key/PWD locked... %s", config.LKP ? _RED_("Yes") : _GREEN_("No"));
}

static command_t CommandTable[] = {
Expand Down
36 changes: 1 addition & 35 deletions client/src/cmdlfhitaghts.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,45 +20,11 @@
#define CMDLFHITAGS_H__

#include "common.h"

typedef struct {
enum {
HITAGS_MEMORY_32,
HITAGS_MEMORY_256,
HITAGS_MEMORY_2048,
HITAGS_MEMORY_UNKNOWN
} memory_type;

bool authentication;

enum {
HITAGS_CODING_MANCHESTER,
HITAGS_CODING_BIPHASE
} ttf_coding;

enum {
HITAGS_DR_4KBIT,
HITAGS_DR_8KBIT,
HITAGS_DR_2KBIT,
HITAGS_DR_2KBIT_PIGEON
} ttf_data_rate;

enum {
HITAGS_TTF_DISABLED,
HITAGS_TTF_PAGE45,
HITAGS_TTF_PAGE4567,
HITAGS_TTF_PAGE4
} ttf_mode;

bool lock_config;
bool lock_key;
} hitags_config_t;
#include "hitag.h"

int CmdLFHitagS(const char *Cmd);

int read_hts_uid(void);
hitags_config_t hitags_config_unpack(const uint8_t *config_bytes);
void hitags_config_pack(hitags_config_t config, uint8_t *out);
void hitags_config_print(hitags_config_t config);

#endif //CMDLFHITAGS_H__
77 changes: 33 additions & 44 deletions include/hitag.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,37 @@ typedef enum SOF_TYPE {
HT_NO_BITS
} stype;

typedef struct {
// con0
uint8_t MEMT : 2;
bool RES0 : 1; // for 82xx. Enable somekind extended TTF mode in conjunction with TTFM
bool RES1 : 1;
bool RES2 : 1;
bool RES3 : 1; // for 82xx. Enable TTF FSK mode 0=RF/10 1=RF/8
bool RES4 : 1;
bool RES5 : 1;

// con1
bool LKP : 1; // 0 = page2/3 read write 1 =page2/3 read only in Plain mode and no access in authenticate mode
bool LCON : 1; // 0 = con1/2 read write 1 =con1 read only and con2 OTP
uint8_t TTFM : 2; // the number of pages that are sent to the RWD
uint8_t TTFDR : 2; // data rate in TTF Mode
bool TTFC : 1; // Transponder Talks first coding. 0 = Manchester 1 = Biphase
bool auth : 1; // 0 = Plain 1 = Auth
// con2
// 0 = read write 1 = read only
bool LCK0 : 1; // page48-63
bool LCK1 : 1; // page32-47
bool LCK2 : 1; // page24-31
bool LCK3 : 1; // page16-23
bool LCK4 : 1; // page12-15
bool LCK5 : 1; // page8-11
bool LCK6 : 1; // page6/7
bool LCK7 : 1; // page4/5
// reserved/pwdh0
uint8_t pwdh0;
} PACKED hitags_config_t;

struct hitagS_tag {
PSTATE pstate; // protocol-state
TSATE tstate; // tag-state
Expand All @@ -133,27 +164,7 @@ struct hitagS_tag {
// page 0
uint32_t uid_le;

// page 1
uint8_t CON0;
// con1
bool LKP : 1; // 0 = page2/3 read write 1 =page2/3 read only in Plain mode and no access in authenticate mode
bool LCON : 1; // 0 = con1/2 read write 1 =con1 read only and con2 OTP
int TTFM : 2; // the number of pages that are sent to the RWD
int TTFDR : 2; // data rate in TTF Mode
bool TTFC : 1; // Transponder Talks first coding. 0 = Manchester 1 = Biphase
bool auth : 1; // 0 = Plain 1 = Auth
// con2
// 0 = read write 1 = read only
bool LCK0 : 1; // page48-63
bool LCK1 : 1; // page32-47
bool LCK2 : 1; // page24-31
bool LCK3 : 1; // page16-23
bool LCK4 : 1; // page12-15
bool LCK5 : 1; // page8-11
bool LCK6 : 1; // page6/7
bool LCK7 : 1; // page4/5
// reserved/pwdh0
uint8_t pwdh0;
hitags_config_t config;

// page 2
uint8_t pwdl0;
Expand All @@ -169,29 +180,7 @@ struct hitagS_tag {
typedef struct {
union {
uint8_t asBytes[HITAGS_PAGE_SIZE];
struct {
// page 1
uint8_t CON0;
// con1
bool LKP : 1; // 0 = page2/3 read write 1 =page2/3 read only in Plain mode and no access in authenticate mode
bool LCON : 1; // 0 = con1/2 read write 1 =con1 read only and con2 OTP
int TTFM : 2; // the number of pages that are sent to the RWD
int TTFDR : 2; // data rate in TTF Mode
bool TTFC : 1; // Transponder Talks first coding. 0 = Manchester 1 = Biphase
bool auth : 1; // 0 = Plain 1 = Auth
// con2
// 0 = read write 1 = read only
bool LCK0 : 1; // page48-63
bool LCK1 : 1; // page32-47
bool LCK2 : 1; // page24-31
bool LCK3 : 1; // page16-23
bool LCK4 : 1; // page12-15
bool LCK5 : 1; // page8-11
bool LCK6 : 1; // page6/7
bool LCK7 : 1; // page4/5
// reserved/pwdh0
uint8_t pwdh0;
}s;
hitags_config_t s;
} config_page;
int8_t pages_reason[HITAGS_MAX_PAGES];
uint8_t pages[HITAGS_MAX_PAGES][HITAGS_PAGE_SIZE];
Expand Down

0 comments on commit f00fac8

Please sign in to comment.