diff --git a/CHANGELOG.md b/CHANGELOG.md index ef36f69b1..6c6cba7e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Fix issue #844 - `lf t55xx config` => recompute block0 (@cyberpunk-re) - EM4x50: changed cli parameter from w (word) to d (data) (@tharexde) - EM4x50: new function 4x50 login: authenticate against tag (@tharexde) - EM4x50: new function 4x50 brute: guess password within a given password range (@tharexde) @@ -21,7 +22,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - EM4x50: switched to cliparser for all functions (@tharexde) - EM4x50: stabilized and accelerated tag detection (@tharexde) - EM4x50: removed global tag structure on device side (@tharexde) - - Fix `hf 15 sim` - Added basic response to GET_SYSTEM_INFO and READBLOCK requests in order to fix iso15693 tag sim + - Fix `hf 15 sim` - Added basic response to GET_SYSTEM_INFO and READBLOCK requests in order to fix iso15693 tag sim (@cyberpunk-re) - Added `mf mfu sim t 7 n ` - MFU emulation now supports automatic exit after blocks read. (@cyberpunk-re) - Added T55xx Guide to assist in learning how to use the T55xx chip (@mwalker33) - Fix 'hf iclass wrbl' - dealing with tags in unsecured vs secured pagemode now is correct (@iceman1001) diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index 80c8eda4f..a3f5ca20b 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -51,6 +51,7 @@ t55xx_conf_block_t config = { .inverted = false, .offset = 0x00, .block0 = 0x00, + .block0Status = notSet, .Q5 = false, .usepwd = false, .downlink_mode = refFixedBit @@ -739,6 +740,7 @@ static int CmdT55xxSetConfig(const char *Cmd) { for (; i < 9; i++) { if (rates[i] == bitRate) { config.bitrate = i; + config.block0 = ((config.block0 & ~(0x1c0000)) | (i << 18)); break; } } @@ -789,6 +791,7 @@ static int CmdT55xxSetConfig(const char *Cmd) { PrintAndLogEx(WARNING, "Unknown modulation '%s'", modulation); errors = true; } + config.block0 = ((config.block0 & ~(0x1f000)) | (config.modulation << 12)); break; case 'i': if ((param_getchar(Cmd, cmdp + 1) == '0') || (param_getchar(Cmd, cmdp + 1) == '1')) { @@ -822,6 +825,7 @@ static int CmdT55xxSetConfig(const char *Cmd) { config.ST = true; cmdp += 1; } + config.block0 = ((config.block0 & ~(0x8)) | (config.ST << 3)); break; case 'r': errors = param_getdec(Cmd, cmdp + 1, &downlink_mode); @@ -841,10 +845,9 @@ static int CmdT55xxSetConfig(const char *Cmd) { //Validations if (errors) return usage_t55xx_config(); + config.block0Status = userSet; if (gotconf) { SetConfigWithBlock0Ex(block0, config.offset, config.Q5); - } else { - config.block0 = 0; } return printConfiguration(config); @@ -1335,6 +1338,7 @@ bool t55xxTryDetectModulationEx(uint8_t downlink_mode, bool print_config, uint32 config.pwd = pwd & 0xffffffff; } + config.block0Status = autoDetect; if (print_config) printConfiguration(config); @@ -1370,6 +1374,7 @@ bool t55xxTryDetectModulationEx(uint8_t downlink_mode, bool print_config, uint32 PrintAndLogEx(NORMAL, "--[%d]---------------", i + 1); } + config.block0Status = autoDetect; if (print_config) printConfiguration(tests[i]); } @@ -1640,7 +1645,7 @@ int printConfiguration(t55xx_conf_block_t b) { PrintAndLogEx(INFO, " Inverted : %s", (b.inverted) ? _GREEN_("Yes") : "No"); PrintAndLogEx(INFO, " Offset : %d", b.offset); PrintAndLogEx(INFO, " Seq. Term. : %s", (b.ST) ? _GREEN_("Yes") : "No"); - PrintAndLogEx(INFO, " Block0 : 0x%08X", b.block0); + PrintAndLogEx(INFO, " Block0 : 0x%08X %s", b.block0, GetConfigBlock0Source(b.block0Status)); PrintAndLogEx(INFO, " Downlink Mode : %s", GetDownlinkModeStr(b.downlink_mode)); PrintAndLogEx(INFO, " Password Set : %s", (b.usepwd) ? _RED_("Yes") : _GREEN_("No")); if (b.usepwd) { @@ -2800,6 +2805,28 @@ char *GetModelStrFromCID(uint32_t cid) { return buf; } +char *GetConfigBlock0Source(uint8_t id) { + + static char buf[40]; + char *retStr = buf; + + switch (id) { + case autoDetect: + snprintf(retStr, sizeof(buf), _YELLOW_("(Auto detect)")); + break; + case userSet: + snprintf(retStr, sizeof(buf), _YELLOW_("(User set)")); + break; + case tagRead: + snprintf(retStr, sizeof(buf), _GREEN_("(Tag read)")); + break; + default: + snprintf(retStr, sizeof(buf), _RED_("(Unknown)")); + break; + } + return buf; +} + char *GetSelectedModulationStr(uint8_t id) { static char buf[20]; diff --git a/client/src/cmdlft55xx.h b/client/src/cmdlft55xx.h index 4352eed64..90fbaa85d 100644 --- a/client/src/cmdlft55xx.h +++ b/client/src/cmdlft55xx.h @@ -125,6 +125,12 @@ typedef struct { bool inverted; uint8_t offset; uint32_t block0; + enum { + notSet = 0x00, + autoDetect = 0x01, + userSet = 0x02, + tagRead = 0x03, + } block0Status; enum { RF_8 = 0x00, RF_16 = 0x01, @@ -166,6 +172,7 @@ char *GetSaferStr(uint32_t id); char *GetQ5ModulationStr(uint32_t id); char *GetModulationStr(uint32_t id, bool xmode); char *GetModelStrFromCID(uint32_t cid); +char *GetConfigBlock0Source(uint8_t id); char *GetSelectedModulationStr(uint8_t id); char *GetDownlinkModeStr(uint8_t downlink_mode); void printT5xxHeader(uint8_t page);