diff --git a/client/src/cmdlfem410x.c b/client/src/cmdlfem410x.c index e0af4ac01..23824426b 100644 --- a/client/src/cmdlfem410x.c +++ b/client/src/cmdlfem410x.c @@ -713,35 +713,35 @@ static int CmdEM410xClone(const char *Cmd) { switch (step) { case 0: { - hitags_config_t config = {0}; - config.MEMT = 0x02; // compatiable for 82xx, no impact on Hitag S - config.TTFM = 0x01; // 0 = "Block 0, Block 1, Block 2, Block 3", 1 = "Block 0, Block 1" - config.TTFC = 0x00; // Manchester - config.auth = 0x00; // Plain + hitags_config_page_t config_page = {0}; + config_page.s.MEMT = 0x02; // compatiable for 82xx, no impact on Hitag S + config_page.s.TTFM = 0x01; // 0 = "Block 0, Block 1, Block 2, Block 3", 1 = "Block 0, Block 1" + config_page.s.TTFC = 0x00; // Manchester + config_page.s.auth = 0x00; // Plain //compatiable for 82xx, no impact on Hitag S - config.RES1 = 0x01; - config.RES4 = 0x01; - config.RES5 = 0x01; + config_page.s.RES1 = 0x01; + config_page.s.RES4 = 0x01; + config_page.s.RES5 = 0x01; switch (clk) { case 64: { // 2 kBit/s - config.TTFDR = 0x02; + config_page.s.TTFDR = 0x02; break; } case 32: { // 4 kBit/s - config.TTFDR = 0x00; + config_page.s.TTFDR = 0x00; break; } case 16: { // 8 kBit/s - config.TTFDR = 0x01; + config_page.s.TTFDR = 0x01; break; } } //TODO: keep other fields? - memcpy(packet.data, &config, sizeof(config)); + memcpy(packet.data, &config_page, sizeof(config_page)); // PrintAndLogEx(INFO, "packet.data: %s", sprint_hex(packet.data, sizeof(packet.data))); packet.page = 1; break; @@ -792,27 +792,27 @@ static int CmdEM410xClone(const char *Cmd) { // 64 -> 0x00 2 kBit/s // 32 -> 0x01 4 kBit/s // 16 -> 0x10 8 kBit/s - hitagu82xx_config_t config = {0}; + hitagu_config_page_t config_page = {0}; - config.datarate_override = 0x00; // no datarate override - config.encoding = 0x00; // Manchester - config.ttf_mode = 0x01; // 01 = "Block 0, Block 1" - config.ttf = 0x01; // enable TTF + config_page.s82xx.datarate_override = 0x00; // no datarate override + config_page.s82xx.encoding = 0x00; // Manchester + config_page.s82xx.ttf_mode = 0x01; // 01 = "Block 0, Block 1" + config_page.s82xx.ttf = 0x01; // enable TTF switch (clk) { case 64: { break; } case 32: { - config.datarate = 0x01; + config_page.s82xx.datarate = 0x01; break; } case 16: { - config.datarate = 0x02; + config_page.s82xx.datarate = 0x02; break; } } - packet.data[0] = reflect8(*(uint8_t *)&config); + reverse_arraybytes_copy(config_page.asBytes, packet.data, sizeof(config_page)); packet.page = HITAGU_CONFIG_PADR; // Config block break; } diff --git a/include/hitag.h b/include/hitag.h index efc854d90..850ea68be 100644 --- a/include/hitag.h +++ b/include/hitag.h @@ -123,30 +123,30 @@ typedef enum TAG_STATE { 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; + uint8_t RES0 : 1; // for 82xx. Enable somekind extended TTF mode in conjunction with TTFM + uint8_t RES1 : 1; + uint8_t RES2 : 1; + uint8_t RES3 : 1; // for 82xx. Enable TTF FSK mode 0=RF/10 1=RF/8 + uint8_t RES4 : 1; + uint8_t 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 LKP : 1; // 0 = page2/3 read write 1 =page2/3 read only in Plain mode and no access in authenticate mode + uint8_t 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 + uint8_t TTFC : 1; // Transponder Talks first coding. 0 = Manchester 1 = Biphase + uint8_t 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 + uint8_t LCK0 : 1; // page48-63 + uint8_t LCK1 : 1; // page32-47 + uint8_t LCK2 : 1; // page24-31 + uint8_t LCK3 : 1; // page16-23 + uint8_t LCK4 : 1; // page12-15 + uint8_t LCK5 : 1; // page8-11 + uint8_t LCK6 : 1; // page6/7 + uint8_t LCK7 : 1; // page4/5 // reserved/pwdh0 uint8_t pwdh0; } PACKED hitags_config_t; @@ -257,22 +257,26 @@ typedef struct { uint8_t data[256]; } PACKED lf_hitag_crack_response_t; +typedef union { + uint8_t asBytes[HITAGS_PAGE_SIZE]; + hitags_config_t s; +} hitags_config_page_t; + typedef struct { - union { - uint8_t asBytes[HITAGS_PAGE_SIZE]; - hitags_config_t s; - } config_page; + hitags_config_page_t config_page; int8_t pages_reason[HITAGS_MAX_PAGES]; uint8_t pages[HITAGS_MAX_PAGES][HITAGS_PAGE_SIZE]; } PACKED lf_hts_read_response_t; +typedef union { + uint8_t asBytes[HITAGU_BLOCK_SIZE]; + hitagu_config_t s; + hitagu82xx_config_t s82xx; +} hitagu_config_page_t; + // Hitag ยต read response structure typedef struct { - union { - uint8_t asBytes[HITAGU_BLOCK_SIZE]; - hitagu_config_t s; - hitagu82xx_config_t s82xx; - } config_page; + hitagu_config_page_t config_page; uint8_t uid[HITAGU_UID_SIZE]; uint8_t icr; // IC Revision value for memory size detection int8_t pages_reason[HITAGU_MAX_PAGE_ADVANCED_PLUS];