diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 9a95a0304..75bff89ad 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -225,7 +225,7 @@ static int bitstream_target_to_index(FPGA_config bitstream_target) { static int8_t bitstream_index_map[FPGA_BITSTREAM_MAX] = {-1}; // Initialize - if (bitstream_index_map[0] == -1){ + if (bitstream_index_map[0] == -1) { bitstream_index_map[0] = 0; for (size_t i = 0; i < g_fpga_bitstream_num; i++) { diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index d826ddeb2..c3b5936ea 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -419,7 +419,7 @@ static int CmdHf14AConfig(const char *Cmd) { return hf14a_setconfig(&config, verbose); } -static const char* get_uid_type(iso14a_card_select_t *card) { +static const char *get_uid_type(iso14a_card_select_t *card) { static char s[60] = {0}; memset(s, 0, sizeof(s)); @@ -2296,14 +2296,14 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { int16_t fsci = card.ats[1] & 0x0f; PrintAndLogEx(INFO, " " _YELLOW_("%02X") "............ T0 TA1 is%s present, TB1 is%s present, " - "TC1 is%s present, FSCI is %d (FSC = %d)", - card.ats[1], - (ta1 ? "" : _RED_(" NOT")), - (tb1 ? "" : _RED_(" NOT")), - (tc1 ? "" : _RED_(" NOT")), - fsci, - fsci < ARRAYLEN(atsFSC) ? atsFSC[fsci] : -1 - ); + "TC1 is%s present, FSCI is %d (FSC = %d)", + card.ats[1], + (ta1 ? "" : _RED_(" NOT")), + (tb1 ? "" : _RED_(" NOT")), + (tc1 ? "" : _RED_(" NOT")), + fsci, + fsci < ARRAYLEN(atsFSC) ? atsFSC[fsci] : -1 + ); } int pos = 2; if (ta1 && (card.ats_len > pos + 2)) { @@ -2318,12 +2318,12 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { if (strlen(ds) != 0) ds[strlen(ds) - 2] = '\0'; if (strlen(dr) != 0) dr[strlen(dr) - 2] = '\0'; PrintAndLogEx(INFO, " " _YELLOW_("%02X") "......... TA1 different divisors are%s supported, " - "DR: [%s], DS: [%s]", - card.ats[pos], - ((card.ats[pos] & 0x80) ? _RED_(" NOT") : ""), - dr, - ds - ); + "DR: [%s], DS: [%s]", + card.ats[pos], + ((card.ats[pos] & 0x80) ? _RED_(" NOT") : ""), + dr, + ds + ); pos++; } @@ -2333,22 +2333,22 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { uint32_t fwi = card.ats[pos] >> 4; PrintAndLogEx(INFO, " " _YELLOW_("%02X") "...... TB1 SFGI = %d (SFGT = %s%d/fc), FWI = " _YELLOW_("%d") " (FWT = %d/fc)", - card.ats[pos], - (sfgi), - sfgi ? "" : "(not needed) ", - sfgi ? (1 << 12) << sfgi : 0, - fwi, - (1 << 12) << fwi - ); + card.ats[pos], + (sfgi), + sfgi ? "" : "(not needed) ", + sfgi ? (1 << 12) << sfgi : 0, + fwi, + (1 << 12) << fwi + ); pos++; } if (tc1 && (card.ats_len > pos + 2)) { PrintAndLogEx(INFO, " " _YELLOW_("%02X") "... TC1 NAD is%s supported, CID is%s supported", - card.ats[pos], - (card.ats[pos] & 0x01) ? "" : _RED_(" NOT"), - (card.ats[pos] & 0x02) ? "" : _RED_(" NOT") - ); + card.ats[pos], + (card.ats[pos] & 0x01) ? "" : _RED_(" NOT"), + (card.ats[pos] & 0x02) ? "" : _RED_(" NOT") + ); pos++; } @@ -2479,9 +2479,9 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { get_compact_tlv(card.ats + pos, calen); } else { PrintAndLogEx(SUCCESS, "%s - %s" - , sprint_hex_inrow(card.ats + pos, calen) - , sprint_ascii(card.ats + pos, calen) - ); + , sprint_hex_inrow(card.ats + pos, calen) + , sprint_ascii(card.ats + pos, calen) + ); } PrintAndLogEx(NORMAL, ""); diff --git a/client/src/cmdhfmf.c b/client/src/cmdhfmf.c index 9cc25462c..657497102 100644 --- a/client/src/cmdhfmf.c +++ b/client/src/cmdhfmf.c @@ -9565,13 +9565,13 @@ static int CmdHF14AMfInfo(const char *Cmd) { uint8_t k08s[6] = {0xA3, 0x96, 0xEF, 0xA4, 0xE2, 0x4F}; if (mfReadBlock(0, 4, k08s, blockdata) == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "Backdoor key..... " _YELLOW_("%s"), sprint_hex_inrow(k08s, sizeof(k08s))); + PrintAndLogEx(SUCCESS, "Backdoor key..... " _YELLOW_("%s"), sprint_hex_inrow(k08s, sizeof(k08s))); fKeyType = MF_KEY_BD08S; } uint8_t k08[6] = {0xA3, 0x16, 0x67, 0xA8, 0xCE, 0xC1}; if (mfReadBlock(0, 4, k08, blockdata) == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "Backdoor key..... " _YELLOW_("%02X%02X%02X%02X%02X%02X"), k08[0], k08[1], k08[2], k08[3], k08[4], k08[5]); + PrintAndLogEx(SUCCESS, "Backdoor key..... " _YELLOW_("%02X%02X%02X%02X%02X%02X"), k08[0], k08[1], k08[2], k08[3], k08[4], k08[5]); fKeyType = MF_KEY_BD08; } diff --git a/client/src/cmdhfmfu.c b/client/src/cmdhfmfu.c index 0e2099f6c..10c478c25 100644 --- a/client/src/cmdhfmfu.c +++ b/client/src/cmdhfmfu.c @@ -270,7 +270,7 @@ static int get_ulc_3des_key_magic(uint64_t magic_type, uint8_t *key) { reverse_array(d, 8); reverse_array(d + 8, 8); memcpy(key, d, MFBLOCK_SIZE); - } + } return resp.status; } @@ -2770,10 +2770,10 @@ static int CmdHF14AMfUWrBl(const char *Cmd) { int res = 0; if (datalen == 16) { // Comp write may take 16bytes, but only write 4bytes. See UL-C datasheet - for (uint8_t i = 0; i < 4; i++ ) { + for (uint8_t i = 0; i < 4; i++) { res = mfu_write_block(d, 4, has_auth_key, has_pwd, auth_key_ptr, blockno + i); - if ( res == PM3_SUCCESS) { + if (res == PM3_SUCCESS) { d += 4; } else { PrintAndLogEx(INFO, "Write ( %s )", _RED_("fail")); @@ -2788,23 +2788,23 @@ static int CmdHF14AMfUWrBl(const char *Cmd) { } else { res = mfu_write_block(data, datalen, has_auth_key, has_pwd, auth_key_ptr, blockno); - switch (res) { - case PM3_SUCCESS: { - PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); - PrintAndLogEx(HINT, "Try `" _YELLOW_("hf mfu rdbl -b %u") "` to verify ", blockno); - break; + switch (res) { + case PM3_SUCCESS: { + PrintAndLogEx(SUCCESS, "Write ( " _GREEN_("ok") " )"); + PrintAndLogEx(HINT, "Try `" _YELLOW_("hf mfu rdbl -b %u") "` to verify ", blockno); + break; + } + case PM3_ESOFT: { + PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); + PrintAndLogEx(HINT, "Check password / key!"); + break; + } + case PM3_ETIMEOUT: + default: { + PrintAndLogEx(WARNING, "Command execute timeout"); + break; + } } - case PM3_ESOFT: { - PrintAndLogEx(FAILED, "Write ( " _RED_("fail") " )"); - PrintAndLogEx(HINT, "Check password / key!"); - break; - } - case PM3_ETIMEOUT: - default: { - PrintAndLogEx(WARNING, "Command execute timeout"); - break; - } - } } return res; diff --git a/client/src/cmdlfhitaghts.c b/client/src/cmdlfhitaghts.c index 0ecf44a5b..1c8dcd1e0 100644 --- a/client/src/cmdlfhitaghts.c +++ b/client/src/cmdlfhitaghts.c @@ -48,14 +48,14 @@ static int CmdLFHitagSRead(const char *Cmd) { " lf hitag hts read --nrar 0102030411223344 -> Hitag S, challenge mode\n" " lf hitag hts read --crypto -> Hitag S, crypto mode, def key\n" " lf hitag hts read -k 4F4E4D494B52 -> Hitag S, crypto mode\n\n" - ); + ); void *argtable[] = { - arg_param_begin, - arg_str0(NULL, "nrar", "", "nonce / answer writer, 8 hex bytes"), - arg_lit0(NULL, "crypto", "crypto mode"), - arg_str0("k", "key", "", "key, 4 or 6 hex bytes"), - arg_param_end + arg_param_begin, + arg_str0(NULL, "nrar", "", "nonce / answer writer, 8 hex bytes"), + arg_lit0(NULL, "crypto", "crypto mode"), + arg_str0("k", "key", "", "key, 4 or 6 hex bytes"), + arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -173,16 +173,16 @@ static int CmdLFHitagSWrite(const char *Cmd) { " lf hitag hts write -p 6 -d 01020304 --nrar 0102030411223344 -> Hitag S, challenge mode\n" " lf hitag hts write -p 6 -d 01020304 --crypto -> Hitag S, crypto mode, default key\n" " lf hitag hts write -p 6 -d 01020304 -k 4F4E4D494B52 -> Hitag S, crypto mode\n\n" - ); + ); void *argtable[] = { - arg_param_begin, - arg_str0(NULL, "nrar", "", "nonce / answer writer, 8 hex bytes"), - arg_lit0(NULL, "crypto", "crypto mode"), - arg_str0("k", "key", "", "key, 6 hex bytes"), - arg_int1("p", "page", "", "page address to write to"), - arg_str1("d", "data", "", "data, 4 hex bytes"), - arg_param_end + arg_param_begin, + arg_str0(NULL, "nrar", "", "nonce / answer writer, 8 hex bytes"), + arg_lit0(NULL, "crypto", "crypto mode"), + arg_str0("k", "key", "", "key, 6 hex bytes"), + arg_int1("p", "page", "", "page address to write to"), + arg_str1("d", "data", "", "data, 4 hex bytes"), + arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, false); @@ -290,13 +290,15 @@ static int CmdLFHitagSList(const char *Cmd) { } static command_t CommandTable[] = { - {"help", CmdHelp, AlwaysAvailable, "This help"}, - {"list", CmdLFHitagSList, AlwaysAvailable, "List Hitag S trace history"}, - {"-----------", CmdHelp, IfPm3Hitag, "----------------------- " _CYAN_( - "General") " ------------------------"}, - {"read", CmdLFHitagSRead, IfPm3Hitag, "Read Hitag S memory"}, - {"write", CmdLFHitagSWrite, IfPm3Hitag, "Write Hitag S page"}, - {NULL, NULL, 0, NULL} + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"list", CmdLFHitagSList, AlwaysAvailable, "List Hitag S trace history"}, + { + "-----------", CmdHelp, IfPm3Hitag, "----------------------- " _CYAN_( + "General") " ------------------------" + }, + {"read", CmdLFHitagSRead, IfPm3Hitag, "Read Hitag S memory"}, + {"write", CmdLFHitagSWrite, IfPm3Hitag, "Write Hitag S page"}, + {NULL, NULL, 0, NULL} }; static int CmdHelp(const char *Cmd) { @@ -312,34 +314,40 @@ int CmdLFHitagS(const char *Cmd) { 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 + .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]); + (const char *[]) { + "Hitag S 32", "Hitag S 256", "Hitag S 2048", + "Unknown Hitag S/8211" + }[config.memory_type]); PrintAndLogEx(INFO, " Authenticaion.... %s", config.authentication ? _YELLOW_("Yes") : "No"); PrintAndLogEx(INFO, " TTF coding....... %s", - (const char *[]) {"Manchester", "Biphase"}[config.ttf_coding]); + (const char *[]) {"Manchester", "Biphase"}[config.ttf_coding]); PrintAndLogEx(INFO, " TTF data rate.... %s", - (const char *[]) {"4 kBit", "8 kBit", "2 kBit", - "2 kBit and Pigeon Race Standard"}[config.ttf_data_rate]); + (const char *[]) { + "4 kBit", "8 kBit", "2 kBit", + "2 kBit and Pigeon Race Standard" + }[config.ttf_data_rate]); 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]); + (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")); diff --git a/client/src/cmdlft55xx.c b/client/src/cmdlft55xx.c index d0da08d99..9233ec660 100644 --- a/client/src/cmdlft55xx.c +++ b/client/src/cmdlft55xx.c @@ -2519,7 +2519,7 @@ static int CmdT55xxDump(const char *Cmd) { arg_str0("f", "file", "", "filename (default is generated on blk 0)"), arg_lit0("o", "override", "override, force pwd read despite danger to card"), arg_str0("p", "pwd", "", "password (4 hex bytes)"), - arg_lit0(NULL, "ns", "no save"), + arg_lit0(NULL, "ns", "no save to file"), }; uint8_t idx = 5; arg_add_t55xx_downloadlink(argtable, &idx, T55XX_DLMODE_SINGLE, T55XX_DLMODE_SINGLE); diff --git a/client/src/pm3line_vocabulary.h b/client/src/pm3line_vocabulary.h index 10e72a4de..7407dc76a 100644 --- a/client/src/pm3line_vocabulary.h +++ b/client/src/pm3line_vocabulary.h @@ -669,6 +669,10 @@ const static vocabulary_t vocabulary[] = { { 0, "lf hitag chk" }, { 1, "lf hitag lookup" }, { 0, "lf hitag ta" }, + { 1, "lf hitag hts help" }, + { 1, "lf hitag hts list" }, + { 0, "lf hitag hts read" }, + { 0, "lf hitag hts write" }, { 1, "lf idteck help" }, { 1, "lf idteck demod" }, { 0, "lf idteck reader" }, diff --git a/common/commonutil.c b/common/commonutil.c index 87bc051c2..09608ac9e 100644 --- a/common/commonutil.c +++ b/common/commonutil.c @@ -562,4 +562,4 @@ void reverse_arraybytes_copy(uint8_t *arr, uint8_t *dest, size_t len) { for (i = 0; i < len ; i++) { dest[i] = reflect8(arr[i]); } -} \ No newline at end of file +} diff --git a/common_fpga/fpga.h b/common_fpga/fpga.h index 8248896da..07746893c 100644 --- a/common_fpga/fpga.h +++ b/common_fpga/fpga.h @@ -33,8 +33,7 @@ #define FPGA_TRACE_SIZE 3072 // definitions for multiple FPGA config files support -typedef enum -{ +typedef enum { FPGA_BITSTREAM_UNKNOWN = 0, FPGA_BITSTREAM_LF = 1, FPGA_BITSTREAM_HF, @@ -43,8 +42,7 @@ typedef enum FPGA_BITSTREAM_MAX = FPGA_BITSTREAM_HF_15, } FPGA_config; -typedef struct -{ +typedef struct { const char *const versionString; const FPGA_config target_config; } FPGA_VERSION_INFORMATION; diff --git a/doc/commands.json b/doc/commands.json index 35a6c7ac5..86150f560 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -4253,11 +4253,11 @@ "--slow Slower acquisition (required by some non standard cards)", "-l, --legacy legacy mode (use the slow `hf mf chk`)", "-v, --verbose verbose output", + "--ns No save to file", "--mini MIFARE Classic Mini / S20", "--1k MIFARE Classic 1k / S50 (default)", "--2k MIFARE Classic/Plus 2k", "--4k MIFARE Classic 4k / S70", - "--ns No save", "--in None (use CPU regular instruction set)", "--im MMX", "--is SSE2", @@ -4265,7 +4265,7 @@ "--i2 AVX2", "--i5 AVX512" ], - "usage": "hf mf autopwn [-hablv] [-k ]... [-s ] [-f ] [--slow] [--mini] [--1k] [--2k] [--4k] [--ns] [--in] [--im] [--is] [--ia] [--i2] [--i5]" + "usage": "hf mf autopwn [-hablv] [-k ]... [-s ] [-f ] [--slow] [--ns] [--mini] [--1k] [--2k] [--4k] [--in] [--im] [--is] [--ia] [--i2] [--i5]" }, "hf mf brute": { "command": "hf mf brute", @@ -4346,7 +4346,7 @@ "--emu Fill simulator keys from found keys", "--dump Dump found keys to binary file", "-f, --file Filename of dictionary", - "--no-default Don't add the bunch of extra default keys" + "--no-default Skip check default keys" ], "usage": "hf mf chk [-hab*] [-k ]... [--tblk ] [--mini] [--1k] [--2k] [--4k] [--emu] [--dump] [-f ] [--no-default]" }, @@ -4710,7 +4710,7 @@ "--blk block number (single block recovery mode)", "-a single block recovery key A", "-b single block recovery key B", - "--no-default Don't add the bunch of extra default keys" + "--no-default Skip check default keys" ], "usage": "hf mf fchk [-hab] [-k ]... [--mini] [--1k] [--2k] [--4k] [--emu] [--dump] [--mem] [-f ] [--blk ] [--no-default]" }, @@ -7228,10 +7228,10 @@ }, "hf mfu wipe": { "command": "hf mfu wipe", - "description": "Wipe card to zeros. It will ignore block0,1,2,3 you will need to call it with password in order to wipe the config and sett default pwd/pack Abort by pressing a key New password.... FFFFFFFF New 3-DES key... 425245414B4D454946594F5543414E21", + "description": "Wipe card to zeros. It will ignore block0,1,2,3 you will need to call it with password in order to wipe the config and sett default pwd/pack Abort by pressing a key New password.... FFFFFFFF New 3-DES key... 49454D4B41455242214E4143554F5946", "notes": [ "hf mfu wipe", - "hf mfu wipe -k 425245414B4D454946594F5543414E21" + "hf mfu wipe -k 49454D4B41455242214E4143554F5946" ], "offline": false, "options": [ @@ -9681,7 +9681,7 @@ }, "lf hitag help": { "command": "lf hitag help", - "description": "help This help list List Hitag trace history test Perform self tests view Display content from tag dump file lookup Uses authentication trace to check for key in dictionary file --------------------------------------------------------------------------------------- lf hitag list available offline: yes Alias of `trace list -t hitag2` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "description": "help This help list List Hitag trace history hts { Hitag S/8211 operations } test Perform self tests view Display content from tag dump file lookup Uses authentication trace to check for key in dictionary file --------------------------------------------------------------------------------------- lf hitag list available offline: yes Alias of `trace list -t hitag2` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "notes": [ "lf hitag list --frame -> show frame delay times", "lf hitag list -1 -> use trace buffer" @@ -9700,6 +9700,65 @@ ], "usage": "lf hitag list [-h1crux] [--frame] [-f ]" }, + "lf hitag hts help": { + "command": "lf hitag hts help", + "description": "help This help list List Hitag S trace history --------------------------------------------------------------------------------------- lf hitag hts list available offline: yes Alias of `trace list -t hitags` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", + "notes": [ + "lf hitag hts list --frame -> show frame delay times", + "lf hitag hts list -1 -> use trace buffer" + ], + "offline": true, + "options": [ + "-h, --help This help", + "-1, --buffer use data from trace buffer", + "--frame show frame delay times", + "-c mark CRC bytes", + "-r show relative times (gap and duration)", + "-u display times in microseconds instead of clock cycles", + "-x show hexdump to convert to pcap(ng)", + "or to import into Wireshark using encapsulation type \"ISO 14443\"", + "-f, --file filename of dictionary" + ], + "usage": "lf hitag hts list [-h1crux] [--frame] [-f ]" + }, + "lf hitag hts read": { + "command": "lf hitag hts read", + "description": "Read Hitag S memory. Crypto mode: - key format ISK high + ISK low - default key 4F4E4D494B52 (ONMIKR)", + "notes": [ + "lf hitag s read -> Hitag S, plain mode", + "lf hitag hts read --nrar 0102030411223344 -> Hitag S, challenge mode", + "lf hitag hts read --crypto -> Hitag S, crypto mode, def key", + "lf hitag hts read -k 4F4E4D494B52 -> Hitag S, crypto mode" + ], + "offline": false, + "options": [ + "-h, --help This help", + "--nrar nonce / answer writer, 8 hex bytes", + "--crypto crypto mode", + "-k, --key key, 4 or 6 hex bytes" + ], + "usage": "lf hitag hts read [-h] [--nrar ] [--crypto] [-k ]" + }, + "lf hitag hts write": { + "command": "lf hitag hts write", + "description": "Write a page in Hitag S memory. Crypto mode: - key format ISK high + ISK low - default key 4F4E4D494B52 (ONMIKR)", + "notes": [ + "lf hitag write -p 6 -d 01020304 -> Hitag S, plain mode", + "lf hitag hts write -p 6 -d 01020304 --nrar 0102030411223344 -> Hitag S, challenge mode", + "lf hitag hts write -p 6 -d 01020304 --crypto -> Hitag S, crypto mode, default key", + "lf hitag hts write -p 6 -d 01020304 -k 4F4E4D494B52 -> Hitag S, crypto mode" + ], + "offline": false, + "options": [ + "-h, --help This help", + "--nrar nonce / answer writer, 8 hex bytes", + "--crypto crypto mode", + "-k, --key key, 6 hex bytes", + "-p, --page page address to write to", + "-d, --data data, 4 hex bytes" + ], + "usage": "lf hitag hts write [-h] [--nrar ] [--crypto] [-k ] -p -d " + }, "lf hitag info": { "command": "lf hitag info", "description": "Hitag 2 tag information", @@ -11090,7 +11149,7 @@ "-f, --file filename (default is generated on blk 0)", "-o, --override override, force pwd read despite danger to card", "-p, --pwd password (4 hex bytes)", - "--ns no save", + "--ns no save to file", "--r0 downlink - fixed bit length", "--r1 downlink - long leading reference", "--r2 downlink - leading zero", @@ -12820,8 +12879,8 @@ } }, "metadata": { - "commands_extracted": 740, + "commands_extracted": 743, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2024-08-25T12:04:45" + "extracted_on": "2024-08-29T10:28:11" } } diff --git a/doc/commands.md b/doc/commands.md index bab730a4a..a31c55984 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -1067,6 +1067,18 @@ Check column "offline" for their availability. |`lf hitag ta `|N |`Hitag 2: test all recorded authentications` +### lf hitag hts + + { Hitag S/8211 operations } + +|command |offline |description +|------- |------- |----------- +|`lf hitag hts help `|Y |`This help` +|`lf hitag hts list `|Y |`List Hitag S trace history` +|`lf hitag hts read `|N |`Read Hitag S memory` +|`lf hitag hts write `|N |`Write Hitag S page` + + ### lf idteck { Idteck RFIDs... }