Merge branch 'master' into fix_lf_bps

Signed-off-by: Self Not Found <wh201906@yandex.com>
This commit is contained in:
Self Not Found 2023-01-30 07:54:11 +08:00 committed by GitHub
commit d81974e89c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 490 additions and 439 deletions

View file

@ -3,6 +3,15 @@ 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... 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] ## [unreleased][unreleased]
- Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906)
## [Nitride.4.16191][2023-01-29]
- Changed `build_all_firmwares.sh` to fit GENERIC 256kb firmware images (@doegox)
- Fixed some coverity fixes (@iceman1001)
- Fixed `make accessrights` on Fedora (@mooey5775)
- Fixed `hf mfu info` - can now identify the 50 pF version of NTAG 210u(micro) (@mjacksn)
- Added `hf 15` sub-commands for controlling EAS, AFI, privacy mode, and the setting of passwords on SLIX tags (@mjacksn)
- Added new magic gen4 cards command in docs (@McEloff) - Added new magic gen4 cards command in docs (@McEloff)
- Added `hf tesla info` - intital information command to read TESLA cards (@iceman1001) - Added `hf tesla info` - intital information command to read TESLA cards (@iceman1001)
- Changed `hf emrtd info` - looking for lower case .bin extensions (@iceman1001) - Changed `hf emrtd info` - looking for lower case .bin extensions (@iceman1001)
@ -41,10 +50,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
- Fixed `pm3` shell script now automatically detects WSL2 with USBIPD serial ports (@iceman1001) - Fixed `pm3` shell script now automatically detects WSL2 with USBIPD serial ports (@iceman1001)
- Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001) - Fixed `trace list -c` - annotation of CRC bytes now is colored or squared if no ansi colors is supported (@iceman1001)
- Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001) - Fixed `trace list -t mf` - now also finds UID if anticollision is partial captured, to be used for mfkey (@iceman1001)
- Fixed `make accessrights` on Fedora (@mooey5775)
- Fixed the lf sampling when bits_per_sample is less than 8 (@wh201906)
- Fixed `hf mfu info` - can now identify the 50 pF version of NTAG 210u(micro) (@mjacksn)
- Added `hf 15` sub-commands for controlling EAS, AFI, privacy mode, and the setting of passwords on SLIX tags (@mjacksn)
## [Radium.4.15864][2022-10-29] ## [Radium.4.15864][2022-10-29]
- Changed `lf indala sim` - now accepts fc / cn (@iceman1001) - Changed `lf indala sim` - now accepts fc / cn (@iceman1001)

View file

@ -189,8 +189,7 @@ static int get_uid_slix(uint32_t start_time, uint32_t* eof_time, uint8_t* uid) {
uint16_t recvlen = 0; uint16_t recvlen = 0;
SendDataTag(cmd, sizeof(cmd), false, true, answer, ISO15693_MAX_RESPONSE_LENGTH, start_time, ISO15693_READER_TIMEOUT, eof_time, &recvlen); SendDataTag(cmd, sizeof(cmd), false, true, answer, ISO15693_MAX_RESPONSE_LENGTH, start_time, ISO15693_READER_TIMEOUT, eof_time, &recvlen);
if(recvlen != 12) if (recvlen != 12) {
{
return PM3_ETIMEOUT; return PM3_ETIMEOUT;
} }
@ -2781,13 +2780,11 @@ static uint32_t disable_eas_15693_Slix(uint32_t start_time, uint32_t* eof_time,
return PM3_ETIMEOUT; return PM3_ETIMEOUT;
} }
if(usepwd) if (usepwd) {
{
int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid);
if(res_setpass != PM3_SUCCESS) if (res_setpass != PM3_SUCCESS) {
{
return PM3_EWRONGANSWER; return PM3_EWRONGANSWER;
} }
} }
@ -2817,12 +2814,10 @@ static uint32_t enable_eas_15693_Slix(uint32_t start_time, uint32_t* eof_time, u
return PM3_ETIMEOUT; return PM3_ETIMEOUT;
} }
if(usepwd) if (usepwd) {
{
int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid);
if(res_setpass != PM3_SUCCESS) if (res_setpass != PM3_SUCCESS) {
{
return PM3_EWRONGANSWER; return PM3_EWRONGANSWER;
} }
} }
@ -2882,8 +2877,7 @@ static uint32_t pass_protect_EASAFI_15693_Slix(uint32_t start_time, uint32_t *eo
int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid);
if(res_setpass != PM3_SUCCESS) if (res_setpass != PM3_SUCCESS) {
{
return PM3_EWRONGANSWER; return PM3_EWRONGANSWER;
} }
@ -2902,25 +2896,20 @@ static uint32_t pass_protect_EASAFI_15693_Slix(uint32_t start_time, uint32_t *eo
return PM3_SUCCESS; return PM3_SUCCESS;
} }
static uint32_t write_afi_15693(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi) static uint32_t write_afi_15693(uint32_t start_time, uint32_t *eof_time, uint8_t *password, bool usepwd, uint8_t *uid, bool use_uid, uint8_t afi) {
{
if(!use_uid) if (!use_uid) {
{
int res_getuid = get_uid_slix(start_time, eof_time, uid); int res_getuid = get_uid_slix(start_time, eof_time, uid);
if(res_getuid != PM3_SUCCESS) if (res_getuid != PM3_SUCCESS) {
{
return res_getuid; return res_getuid;
} }
} }
if(usepwd) if (usepwd) {
{
int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid); int res_setpass = set_pass_15693_Slix(start_time, eof_time, 0x10, password, uid);
if(res_setpass != PM3_SUCCESS) if (res_setpass != PM3_SUCCESS) {
{
return PM3_EWRONGANSWER; return PM3_EWRONGANSWER;
} }
} }
@ -3023,8 +3012,7 @@ void WritePasswordSlixIso15693(uint8_t *old_password, uint8_t *new_password, uin
get_uid_slix(start_time, &eof_time, uid); get_uid_slix(start_time, &eof_time, uid);
res = set_pass_15693_Slix(start_time, &eof_time, pwd_id, old_password, uid); res = set_pass_15693_Slix(start_time, &eof_time, pwd_id, old_password, uid);
if(res != PM3_SUCCESS) if (res != PM3_SUCCESS) {
{
reply_ng(CMD_HF_ISO15693_SLIX_WRITE_PWD, res, NULL, 0); reply_ng(CMD_HF_ISO15693_SLIX_WRITE_PWD, res, NULL, 0);
switch_off(); switch_off();
return; return;

View file

@ -641,6 +641,10 @@ static int CmdFlashMemInfo(const char *Cmd) {
// Verify (public key) // Verify (public key)
bool is_verified = (mbedtls_rsa_pkcs1_verify(rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 20, sha_hash, from_device) == 0); bool is_verified = (mbedtls_rsa_pkcs1_verify(rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 20, sha_hash, from_device) == 0);
if (got_private == false) {
mbedtls_rsa_free(rsa);
}
mbedtls_pk_free(&pkctx); mbedtls_pk_free(&pkctx);
PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "");

View file

@ -1460,8 +1460,9 @@ static int CmdHF14AChaining(const char *Cmd) {
CLIParserContext *ctx; CLIParserContext *ctx;
CLIParserInit(&ctx, "hf 14a chaining", CLIParserInit(&ctx, "hf 14a chaining",
"Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.",
"hf 14a chaining -> show chaining enable/disable state\n"
"hf 14a chaining --off -> disable chaining\n" "hf 14a chaining --off -> disable chaining\n"
"hf 14a chaining -> show chaining enable/disable state\n"); );
void *argtable[] = { void *argtable[] = {
arg_param_begin, arg_param_begin,
@ -1473,6 +1474,7 @@ static int CmdHF14AChaining(const char *Cmd) {
bool on = arg_get_lit(ctx, 1); bool on = arg_get_lit(ctx, 1);
bool off = arg_get_lit(ctx, 2); bool off = arg_get_lit(ctx, 2);
CLIParserFree(ctx);
if ((on + off) > 1) { if ((on + off) > 1) {
PrintAndLogEx(INFO, "Select only one option"); PrintAndLogEx(INFO, "Select only one option");
@ -1485,8 +1487,6 @@ static int CmdHF14AChaining(const char *Cmd) {
if (off) if (off)
Set_apdu_in_framing(false); Set_apdu_in_framing(false);
CLIParserFree(ctx);
PrintAndLogEx(INFO, "\nISO 14443-4 input chaining %s.\n", g_apdu_in_framing_enable ? "enabled" : "disabled"); PrintAndLogEx(INFO, "\nISO 14443-4 input chaining %s.\n", g_apdu_in_framing_enable ? "enabled" : "disabled");
return PM3_SUCCESS; return PM3_SUCCESS;
} }

View file

@ -1378,18 +1378,17 @@ static int CmdHF15WriteAfi(const char *Cmd) {
payload.afi = arg_get_int_def(ctx, 2, 0); payload.afi = arg_get_int_def(ctx, 2, 0);
int pwdlen; int pwdlen;
CLIGetHexWithReturn(ctx, 3, payload.pwd, &pwdlen); CLIGetHexWithReturn(ctx, 3, payload.pwd, &pwdlen);
CLIParserFree(ctx); CLIParserFree(ctx);
if(pwdlen == 4) payload.use_pwd = false;
{ if (pwdlen == 4) {
payload.use_pwd = true; payload.use_pwd = true;
} }
if(uidlen == 8) payload.use_uid = false;
{ if (uidlen == 8) {
payload.use_uid = true; payload.use_uid = true;
} }
@ -1399,8 +1398,7 @@ static int CmdHF15WriteAfi(const char *Cmd) {
return PM3_EINVARG; return PM3_EINVARG;
} }
if(pwdlen > 0 && pwdlen != 4) if (pwdlen > 0 && pwdlen != 4) {
{
PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided");
return PM3_ESOFT; return PM3_ESOFT;
} }
@ -2387,25 +2385,20 @@ static int CmdHF15SlixEASEnable(const char *Cmd) {
int pwdlen = 0; int pwdlen = 0;
int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen); int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen);
if((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) if ((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) {
{
PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided");
CLIParserFree(ctx);
return PM3_ESOFT; return PM3_ESOFT;
} }
//CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen);
CLIParserFree(ctx); CLIParserFree(ctx);
if (pwdlen > 0) {
if(pwdlen > 0 )
{
PrintAndLogEx(INFO, "Trying to enable EAS mode using password " _GREEN_("%s") PrintAndLogEx(INFO, "Trying to enable EAS mode using password " _GREEN_("%s")
, sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd))
); );
payload.usepwd = true; payload.usepwd = true;
} } else {
else
{
PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password"); PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password");
payload.usepwd = false; payload.usepwd = false;
} }
@ -2426,12 +2419,9 @@ static int CmdHF15SlixEASEnable(const char *Cmd) {
break; break;
} }
case PM3_EWRONGANSWER: { case PM3_EWRONGANSWER: {
if(pwdlen > 0 ) if (pwdlen > 0) {
{
PrintAndLogEx(WARNING, "the password provided was not accepted"); PrintAndLogEx(WARNING, "the password provided was not accepted");
} } else {
else
{
PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked"); PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked");
} }
break; break;
@ -2457,6 +2447,7 @@ static int CmdHF15SlixEASDisable(const char *Cmd) {
arg_param_end arg_param_end
}; };
CLIExecWithReturn(ctx, Cmd, argtable, true); CLIExecWithReturn(ctx, Cmd, argtable, true);
struct { struct {
uint8_t pwd[4]; uint8_t pwd[4];
bool usepwd; bool usepwd;
@ -2465,25 +2456,19 @@ static int CmdHF15SlixEASDisable(const char *Cmd) {
int pwdlen = 0; int pwdlen = 0;
int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen); int ret_pwdparse = CLIParamHexToBuf(arg_get_str(ctx, 1), payload.pwd, 4, &pwdlen);
if((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) CLIParserFree(ctx);
{
if ((pwdlen > 0 && pwdlen != 4) || ret_pwdparse != 0) {
PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided"); PrintAndLogEx(WARNING, "password must be 4 hex bytes if provided");
return PM3_ESOFT; return PM3_ESOFT;
} }
//CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); if (pwdlen > 0) {
CLIParserFree(ctx);
if(pwdlen > 0 )
{
PrintAndLogEx(INFO, "Trying to disable EAS mode using password " _GREEN_("%s") PrintAndLogEx(INFO, "Trying to disable EAS mode using password " _GREEN_("%s")
, sprint_hex_inrow(payload.pwd, sizeof(payload.pwd)) , sprint_hex_inrow(payload.pwd, sizeof(payload.pwd))
); );
payload.usepwd = true; payload.usepwd = true;
} } else {
else
{
PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password"); PrintAndLogEx(INFO, "Trying to enable EAS mode without using a password");
payload.usepwd = false; payload.usepwd = false;
} }
@ -2503,12 +2488,9 @@ static int CmdHF15SlixEASDisable(const char *Cmd) {
break; break;
} }
case PM3_EWRONGANSWER: { case PM3_EWRONGANSWER: {
if(pwdlen > 0 ) if (pwdlen > 0) {
{
PrintAndLogEx(WARNING, "the password provided was not accepted"); PrintAndLogEx(WARNING, "the password provided was not accepted");
} } else {
else
{
PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked"); PrintAndLogEx(WARNING, "either a password is required or EAS mode is locked");
} }
break; break;
@ -2624,12 +2606,13 @@ static int CmdHF15SlixEnable(const char* Cmd) {
static int CmdHF15SlixWritePassword(const char *Cmd) { static int CmdHF15SlixWritePassword(const char *Cmd) {
CLIParserContext *ctx; CLIParserContext *ctx;
CLIParserInit(&ctx, "hf 15 slixwritepwd", CLIParserInit(&ctx, "hf 15 slixwritepwd",
"Write a password on a SLIX family ISO-15693 tag", "Write a password on a SLIX family ISO-15693 tag.n"
"Some tags do not support all different password types.",
"hf 15 slixwritepwd -t READ -o 00000000 -n 12131415"); "hf 15 slixwritepwd -t READ -o 00000000 -n 12131415");
void *argtable[] = { void *argtable[] = {
arg_param_begin, arg_param_begin,
arg_str1("t", "type", "<read|write|privacy|destroy|easafi>", "which password field to write to (some tags do not support all password types)"), arg_str1("t", "type", "<read|write|privacy|destroy|easafi>", "which password field to write to"),
arg_str0("o", "old", "<hex>", "old password (if present), 8 hex bytes"), arg_str0("o", "old", "<hex>", "old password (if present), 8 hex bytes"),
arg_str1("n", "new", "<hex>", "new password, 8 hex bytes"), arg_str1("n", "new", "<hex>", "new password, 8 hex bytes"),
arg_param_end arg_param_end
@ -2644,64 +2627,49 @@ static int CmdHF15SlixWritePassword(const char *Cmd) {
} PACKED payload; } PACKED payload;
int pwdlen = 0; int pwdlen = 0;
CLIGetHexWithReturn(ctx, 2, payload.old_pwd, &pwdlen); CLIGetHexWithReturn(ctx, 2, payload.old_pwd, &pwdlen);
if(pwdlen > 0 && pwdlen != 4) if (pwdlen > 0 && pwdlen != 4) {
{
PrintAndLogEx(WARNING, "old password must be 4 hex bytes if provided"); PrintAndLogEx(WARNING, "old password must be 4 hex bytes if provided");
CLIParserFree(ctx);
return PM3_ESOFT; return PM3_ESOFT;
} }
CLIGetHexWithReturn(ctx, 3, payload.new_pwd, &pwdlen); CLIGetHexWithReturn(ctx, 3, payload.new_pwd, &pwdlen);
if(pwdlen != 4) if (pwdlen != 4) {
{
PrintAndLogEx(WARNING, "new password must be 4 hex bytes"); PrintAndLogEx(WARNING, "new password must be 4 hex bytes");
CLIParserFree(ctx);
return PM3_ESOFT; return PM3_ESOFT;
} }
int vlen = 0; int vlen = 0;
char value[10]; char value[10];
CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)value, sizeof(value), &vlen); CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)value, sizeof(value), &vlen);
CLIParserFree(ctx);
if (vlen > 0) { if (vlen > 0) {
if (strcmp(value, "read") == 0) if (strcmp(value, "read") == 0) {
{
PrintAndLogEx(SUCCESS, "Selected read pass"); PrintAndLogEx(SUCCESS, "Selected read pass");
payload.pwd_id = 0x01; payload.pwd_id = 0x01;
} } else if (strcmp(value, "write") == 0) {
else if (strcmp(value, "write") == 0)
{
PrintAndLogEx(SUCCESS, "Selected write pass"); PrintAndLogEx(SUCCESS, "Selected write pass");
payload.pwd_id = 0x02; payload.pwd_id = 0x02;
} } else if (strcmp(value, "privacy") == 0) {
else if (strcmp(value, "privacy") == 0)
{
PrintAndLogEx(SUCCESS, "Selected privacy pass"); PrintAndLogEx(SUCCESS, "Selected privacy pass");
payload.pwd_id = 0x04; payload.pwd_id = 0x04;
} } else if (strcmp(value, "destroy") == 0) {
else if (strcmp(value, "destroy") == 0)
{
PrintAndLogEx(SUCCESS, "Selected destroy pass"); PrintAndLogEx(SUCCESS, "Selected destroy pass");
payload.pwd_id = 0x08; payload.pwd_id = 0x08;
} } else if (strcmp(value, "easafi") == 0) {
else if (strcmp(value, "easafi") == 0)
{
PrintAndLogEx(SUCCESS, "Selected easafi pass"); PrintAndLogEx(SUCCESS, "Selected easafi pass");
payload.pwd_id = 0x10; payload.pwd_id = 0x10;
} } else {
else
{
PrintAndLogEx(ERR, "t argument must be 'read', 'write', 'privacy', 'destroy', or 'easafi'"); PrintAndLogEx(ERR, "t argument must be 'read', 'write', 'privacy', 'destroy', or 'easafi'");
return PM3_EINVARG; return PM3_EINVARG;
} }
} }
CLIParserFree(ctx);
PrintAndLogEx(INFO, "Trying to write " _YELLOW_("%s") " as " _YELLOW_("%s") " password" PrintAndLogEx(INFO, "Trying to write " _YELLOW_("%s") " as " _YELLOW_("%s") " password"
, sprint_hex_inrow(payload.new_pwd, sizeof(payload.new_pwd)), value); , sprint_hex_inrow(payload.new_pwd, sizeof(payload.new_pwd)), value);
@ -2735,13 +2703,14 @@ static int CmdHF15AFIPassProtect(const char *Cmd) {
CLIParserContext *ctx; CLIParserContext *ctx;
CLIParserInit(&ctx, "hf 15 passprotectafi", CLIParserInit(&ctx, "hf 15 passprotectafi",
"Password protect AFI. Cannot be undone.", "This command enables the password protect of AFI.\n"
"hf 15 passprotectafi -p 00000000 -c"); "*** OBS! This action can not be undone! ***",
"hf 15 passprotectafi -p 00000000 --force");
void *argtable[] = { void *argtable[] = {
arg_param_begin, arg_param_begin,
arg_str1("p", "password", "<hex>", "EAS/AFI password, 8 hex bytes"), arg_str1("p", "pwd", "<hex>", "EAS/AFI password, 8 hex bytes"),
arg_lit0("c", "confirm", "confirm the execution of this irreversible command"), arg_lit0(NULL, "force", "Force execution of command (irreversible) "),
arg_param_end arg_param_end
}; };
@ -2754,22 +2723,20 @@ static int CmdHF15AFIPassProtect(const char *Cmd) {
CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen);
bool confirmation = arg_get_lit(ctx, 2); bool force = arg_get_lit(ctx, 2);
CLIParserFree(ctx);
if(pwdlen != 4) if (pwdlen != 4) {
{
PrintAndLogEx(WARNING, "password must be 4 hex bytes"); PrintAndLogEx(WARNING, "password must be 4 hex bytes");
return PM3_ESOFT; return PM3_ESOFT;
} }
if(confirmation == 0) if (force == false) {
{ PrintAndLogEx(WARNING, "Use `--force` flag to override. OBS! Irreversable command");
PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag");
return PM3_ESOFT; return PM3_ESOFT;
} }
PrintAndLogEx(INFO, "Trying to enable AFI password protection...");
PrintAndLogEx(INFO, "Trying to enable AFI password protection");
PacketResponseNG resp; PacketResponseNG resp;
clearCommandBuffer(); clearCommandBuffer();
@ -2802,13 +2769,14 @@ static int CmdHF15EASPassProtect(const char *Cmd) {
CLIParserContext *ctx; CLIParserContext *ctx;
CLIParserInit(&ctx, "hf 15 passprotecteas", CLIParserInit(&ctx, "hf 15 passprotecteas",
"Password protect EAS. Cannot be undone.", "This command enables the password protect of EAS.\n"
"hf 15 passprotecteas -p 00000000 -c"); "*** OBS! This action can not be undone! ***",
"hf 15 passprotecteas -p 00000000 --force");
void *argtable[] = { void *argtable[] = {
arg_param_begin, arg_param_begin,
arg_str1("p", "password", "<hex>", "EAS/AFI password, 8 hex bytes"), arg_str1("p", "pwd", "<hex>", "EAS/AFI password, 8 hex bytes"),
arg_lit0("c", "confirm", "confirm the execution of this irreversible command"), arg_lit0(NULL, "force", "Force execution of command (irreversible) "),
arg_param_end arg_param_end
}; };
@ -2821,21 +2789,20 @@ static int CmdHF15EASPassProtect(const char *Cmd) {
CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen); CLIGetHexWithReturn(ctx, 1, payload.pwd, &pwdlen);
bool confirmation = arg_get_lit(ctx, 2); bool force = arg_get_lit(ctx, 2);
CLIParserFree(ctx);
if(pwdlen != 4) if (pwdlen != 4) {
{
PrintAndLogEx(WARNING, "password must be 4 hex bytes"); PrintAndLogEx(WARNING, "password must be 4 hex bytes");
return PM3_ESOFT; return PM3_ESOFT;
} }
if(confirmation == 0) if (force == false) {
{ PrintAndLogEx(WARNING, "Use `--force` flag to override. OBS! Irreversable command");
PrintAndLogEx(WARNING, "This irreversible command must be confirmed with the -c flag");
return PM3_ESOFT; return PM3_ESOFT;
} }
PrintAndLogEx(INFO, "Trying to enable EAS password protection"); PrintAndLogEx(INFO, "Trying to enable EAS password protection...");
PacketResponseNG resp; PacketResponseNG resp;
clearCommandBuffer(); clearCommandBuffer();

View file

@ -152,7 +152,7 @@ int preferences_save(void) {
} }
uint8_t dummyData = 0x00; uint8_t dummyData = 0x00;
size_t dummyDL = 0x00; size_t dummyDL = 0x01;
if (saveFileJSON(fn, jsfCustom, &dummyData, dummyDL, &preferences_save_callback) != PM3_SUCCESS) if (saveFileJSON(fn, jsfCustom, &dummyData, dummyDL, &preferences_save_callback) != PM3_SUCCESS)
PrintAndLogEx(ERR, "Error saving preferences to \"%s\"", fn); PrintAndLogEx(ERR, "Error saving preferences to \"%s\"", fn);

View file

@ -41,7 +41,7 @@ static int mainret = PM3_ESOFT;
#ifndef LIBPM3 #ifndef LIBPM3
#define BANNERMSG1 "" #define BANNERMSG1 ""
#define BANNERMSG2 " [ :snowflake: ]" #define BANNERMSG2 " [ :coffee: ]"
#define BANNERMSG3 "" #define BANNERMSG3 ""
typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode; typedef enum LogoMode { UTF8, ANSI, ASCII } LogoMode;

View file

@ -1101,8 +1101,8 @@
"command": "hf 14a chaining", "command": "hf 14a chaining",
"description": "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", "description": "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.",
"notes": [ "notes": [
"hf 14a chaining --off -> disable chaining", "hf 14a chaining -> show chaining enable/disable state",
"hf 14a chaining -> show chaining enable/disable state" "hf 14a chaining --off -> disable chaining"
], ],
"offline": false, "offline": false,
"options": [ "options": [
@ -1656,6 +1656,34 @@
], ],
"usage": "hf 15 list [-h1crux] [--frame] [-f <fn>]" "usage": "hf 15 list [-h1crux] [--frame] [-f <fn>]"
}, },
"hf 15 passprotectafi": {
"command": "hf 15 passprotectafi",
"description": "This command enables the password protect of AFI. *** OBS! This action can not be undone! ***",
"notes": [
"hf 15 passprotectafi -p 00000000 --force"
],
"offline": false,
"options": [
"-h, --help This help",
"-p, --pwd <hex> EAS/AFI password, 8 hex bytes",
"--force Force execution of command (irreversible)"
],
"usage": "hf 15 passprotectafi [-h] -p <hex> [--force]"
},
"hf 15 passprotecteas": {
"command": "hf 15 passprotecteas",
"description": "This command enables the password protect of EAS. *** OBS! This action can not be undone! ***",
"notes": [
"hf 15 passprotecteas -p 00000000 --force"
],
"offline": false,
"options": [
"-h, --help This help",
"-p, --pwd <hex> EAS/AFI password, 8 hex bytes",
"--force Force execution of command (irreversible)"
],
"usage": "hf 15 passprotecteas [-h] -p <hex> [--force]"
},
"hf 15 raw": { "hf 15 raw": {
"command": "hf 15 raw", "command": "hf 15 raw",
"description": "Sends raw bytes over ISO-15693 to card", "description": "Sends raw bytes over ISO-15693 to card",
@ -1776,8 +1804,34 @@
], ],
"usage": "hf 15 sim [-h] -u <8b hex> [-b <dec>]" "usage": "hf 15 sim [-h] -u <8b hex> [-b <dec>]"
}, },
"hf 15 slixdisable": { "hf 15 slixeasdisable": {
"command": "hf 15 slixdisable", "command": "hf 15 slixeasdisable",
"description": "Disable EAS mode on SLIX ISO-15693 tag",
"notes": [
"hf 15 slixeasdisable -p 0F0F0F0F"
],
"offline": false,
"options": [
"-h, --help This help",
"-p, --pwd <hex> optional password, 8 hex bytes"
],
"usage": "hf 15 slixeasdisable [-h] [-p <hex>]"
},
"hf 15 slixeasenable": {
"command": "hf 15 slixeasenable",
"description": "Enable EAS mode on SLIX ISO-15693 tag",
"notes": [
"hf 15 slixeasenable -p 0F0F0F0F"
],
"offline": false,
"options": [
"-h, --help This help",
"-p, --pwd <hex> optional password, 8 hex bytes"
],
"usage": "hf 15 slixeasenable [-h] [-p <hex>]"
},
"hf 15 slixprivacydisable": {
"command": "hf 15 slixprivacydisable",
"description": "Disable privacy mode on SLIX ISO-15693 tag", "description": "Disable privacy mode on SLIX ISO-15693 tag",
"notes": [ "notes": [
"hf 15 slixdisable -p 0F0F0F0F" "hf 15 slixdisable -p 0F0F0F0F"
@ -1787,7 +1841,35 @@
"-h, --help This help", "-h, --help This help",
"-p, --pwd <hex> password, 8 hex bytes" "-p, --pwd <hex> password, 8 hex bytes"
], ],
"usage": "hf 15 slixdisable [-h] -p <hex>" "usage": "hf 15 slixprivacydisable [-h] -p <hex>"
},
"hf 15 slixprivacyenable": {
"command": "hf 15 slixprivacyenable",
"description": "Enable privacy mode on SLIX ISO-15693 tag",
"notes": [
"hf 15 slixenable -p 0F0F0F0F"
],
"offline": false,
"options": [
"-h, --help This help",
"-p, --pwd <hex> password, 8 hex bytes"
],
"usage": "hf 15 slixprivacyenable [-h] -p <hex>"
},
"hf 15 slixwritepwd": {
"command": "hf 15 slixwritepwd",
"description": "Write a password on a SLIX family ISO-15693 tag",
"notes": [
"hf 15 slixwritepwd -t READ -o 00000000 -n 12131415"
],
"offline": false,
"options": [
"-h, --help This help",
"-t, --type <read|write|privacy|destroy|easafi> which password field to write to (some tags do not support all password types)",
"-o, --old <hex> old password (if present), 8 hex bytes",
"-n, --new <hex> new password, 8 hex bytes"
],
"usage": "hf 15 slixwritepwd [-h] -t <read|write|privacy|destroy|easafi> [-o <hex>] -n <hex>"
}, },
"hf 15 sniff": { "hf 15 sniff": {
"command": "hf 15 sniff", "command": "hf 15 sniff",
@ -1827,19 +1909,16 @@
"description": "Write AFI on card", "description": "Write AFI on card",
"notes": [ "notes": [
"hf 15 writeafi -* --afi 12", "hf 15 writeafi -* --afi 12",
"hf 15 writeafi -u E011223344556677 --afi 12" "hf 15 writeafi -u E011223344556677 --afi 12 -p 0F0F0F0F"
], ],
"offline": false, "offline": false,
"options": [ "options": [
"-h, --help This help", "-h, --help This help",
"-u, --uid <hex> full UID, 8 bytes", "-u, --uid <hex> full UID, 8 bytes",
"--ua unaddressed mode", "--afi <dec> AFI number (0-255)",
"-* scan for tag", "-p, --pwd <hex> optional AFI/EAS password"
"-2 use slower '1 out of 256' mode",
"-o, --opt set OPTION Flag (needed for TI)",
"--afi <dec> AFI number (0-255)"
], ],
"usage": "hf 15 writeafi [-h*2o] [-u <hex>] [--ua] --afi <dec>" "usage": "hf 15 writeafi [-h] [-u <hex>] --afi <dec> [-p <hex>]"
}, },
"hf 15 writedsfid": { "hf 15 writedsfid": {
"command": "hf 15 writedsfid", "command": "hf 15 writedsfid",
@ -11408,7 +11487,7 @@
}, },
"script help": { "script help": {
"command": "script help", "command": "script help",
"description": "This is a feature to run Lua/Cmd/Python scripts. You can place scripts within the luascripts/cmdscripts/pyscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes", "description": "This is a feature to run Lua/Cmd scripts. You can place scripts within the luascripts/cmdscripts folders. --------------------------------------------------------------------------------------- script list available offline: yes",
"notes": [], "notes": [],
"offline": true, "offline": true,
"options": [], "options": [],
@ -11803,8 +11882,8 @@
} }
}, },
"metadata": { "metadata": {
"commands_extracted": 742, "commands_extracted": 748,
"extracted_by": "PM3Help2JSON v1.00", "extracted_by": "PM3Help2JSON v1.00",
"extracted_on": "2023-01-27T01:57:37" "extracted_on": "2023-01-29T17:39:28"
} }
} }

View file

@ -236,7 +236,13 @@ Check column "offline" for their availability.
|`hf 15 esave `|N |`Save emulator memory into image file` |`hf 15 esave `|N |`Save emulator memory into image file`
|`hf 15 eview `|N |`View emulator memory` |`hf 15 eview `|N |`View emulator memory`
|`hf 15 sim `|N |`Fake an ISO-15693 tag` |`hf 15 sim `|N |`Fake an ISO-15693 tag`
|`hf 15 slixdisable `|N |`Disable privacy mode on SLIX ISO-15693 tag` |`hf 15 slixwritepwd `|N |`Writes a password on a SLIX ISO-15693 tag`
|`hf 15 slixeasdisable `|N |`Disable EAS mode on SLIX ISO-15693 tag`
|`hf 15 slixeasenable `|N |`Enable EAS mode on SLIX ISO-15693 tag`
|`hf 15 slixprivacydisable`|N |`Disable privacy mode on SLIX ISO-15693 tag`
|`hf 15 slixprivacyenable`|N |`Enable privacy mode on SLIX ISO-15693 tag`
|`hf 15 passprotectafi `|N |`Password protect AFI - Cannot be undone`
|`hf 15 passprotecteas `|N |`Password protect EAS - Cannot be undone`
|`hf 15 wrbl `|N |`Write a block` |`hf 15 wrbl `|N |`Write a block`
|`hf 15 findafi `|N |`Brute force AFI of an ISO-15693 tag` |`hf 15 findafi `|N |`Brute force AFI of an ISO-15693 tag`
|`hf 15 writeafi `|N |`Writes the AFI on an ISO-15693 tag` |`hf 15 writeafi `|N |`Writes the AFI on an ISO-15693 tag`

View file

@ -22,7 +22,8 @@ echo "Destination: ${DEST:=firmware}"
echo "Produce stats?: ${STATS:=false}" echo "Produce stats?: ${STATS:=false}"
# Which parts to skip for the 256kb version? # Which parts to skip for the 256kb version?
SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_ISO14443b=1" SKIPS256="SKIP_HITAG=1 SKIP_LEGICRF=1 SKIP_FELICA=1 SKIP_EM4x50=1 SKIP_ISO14443b=1 SKIP_NFCBARCODE=1 SKIP_ZX8211=1"
make $MKFLAGS bootrom || exit 1 make $MKFLAGS bootrom || exit 1
chmod 644 bootrom/obj/bootrom.elf chmod 644 bootrom/obj/bootrom.elf