text
Some checks failed
MacOS Build and Test / macos-make-btaddon (push) Has been cancelled
MacOS Build and Test / macos-cmake (push) Has been cancelled
Ubuntu Build and Test / ubuntu-make (push) Has been cancelled
Ubuntu Build and Test / ubuntu-make-btaddon (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
MacOS Build and Test / macos-make (push) Has been cancelled
Ubuntu Build and Test / ubuntu-cmake (push) Has been cancelled
Windows Build and Test / proxspace (push) Has been cancelled
Windows Build and Test / wsl (push) Has been cancelled

This commit is contained in:
iceman1001 2025-06-22 20:34:54 +02:00
parent 488f7aa01e
commit 5de4dd68e5
15 changed files with 107 additions and 66 deletions

View file

@ -238,9 +238,9 @@ static int sam_send_request_iso15(const uint8_t *const request, const uint8_t re
} }
} }
if (sam_rx_buf[6] == 0x81 && sam_rx_buf[8] == 0x8a && sam_rx_buf[9] == 0x81 ){ //check if the response is an SNMP message if (sam_rx_buf[6] == 0x81 && sam_rx_buf[8] == 0x8a && sam_rx_buf[9] == 0x81) { //check if the response is an SNMP message
*response_len = sam_rx_buf[5 + 2] + 3; *response_len = sam_rx_buf[5 + 2] + 3;
}else{ //if not, use the old logic } else { //if not, use the old logic
*response_len = sam_rx_buf[5 + 1] + 2; *response_len = sam_rx_buf[5 + 1] + 2;
} }

View file

@ -5971,10 +5971,10 @@ static int CmdHFiClassSAM(const char *Cmd) {
} }
if (snmp_data) { if (snmp_data) {
uint8_t header[4] = {0xa0, cmdlen+2 , 0x94, cmdlen }; uint8_t header[4] = {0xa0, cmdlen + 2, 0x94, cmdlen };
memmove(data + 4, data, cmdlen+1); memmove(data + 4, data, cmdlen + 1);
data[0] = flags; data[0] = flags;
memcpy(data+1, header, 4); memcpy(data + 1, header, 4);
cmdlen += 4; cmdlen += 4;
} }
@ -6049,21 +6049,21 @@ static int CmdHFiClassSAM(const char *Cmd) {
} else { } else {
//if it is an error decode it //if it is an error decode it
if (memcmp(d, "\xBE\x07\x80\x01", 4) == 0) { //if it the string is 0xbe 0x07 0x80 0x01 the next byte will indicate the error code if (memcmp(d, "\xBE\x07\x80\x01", 4) == 0) { //if it the string is 0xbe 0x07 0x80 0x01 the next byte will indicate the error code
PrintAndLogEx(ERR,_RED_("Sam Error Code: %02x"), d[4]); PrintAndLogEx(ERR, _RED_("Sam Error Code: %02x"), d[4]);
print_hex(d, resp.length); print_hex(d, resp.length);
}else if (match_with_wildcard(d, snmp_pattern, snmp_mask, 6)){ } else if (match_with_wildcard(d, snmp_pattern, snmp_mask, 6)) {
is_snmp = true; is_snmp = true;
PrintAndLogEx(SUCCESS, _YELLOW_("[samSNMPMessageResponse] ")"%s", sprint_hex(d + 6, resp.length - 6)); PrintAndLogEx(SUCCESS, _YELLOW_("[samSNMPMessageResponse] ")"%s", sprint_hex(d + 6, resp.length - 6));
}else if (match_with_wildcard(d,ok_pattern, ok_mask, 3)){ } else if (match_with_wildcard(d, ok_pattern, ok_mask, 3)) {
PrintAndLogEx(SUCCESS, _YELLOW_("[samResponseAcknowledge] ")"%s", sprint_hex(d + 4, resp.length - 4)); PrintAndLogEx(SUCCESS, _YELLOW_("[samResponseAcknowledge] ")"%s", sprint_hex(d + 4, resp.length - 4));
}else{ } else {
print_hex(d, resp.length); print_hex(d, resp.length);
} }
} }
if (decodeTLV && is_snmp == false) { if (decodeTLV && is_snmp == false) {
asn1_print(d, d[1] + 2, " "); asn1_print(d, d[1] + 2, " ");
} else if (decodeTLV && is_snmp){ } else if (decodeTLV && is_snmp) {
asn1_print(d + 6, resp.length - 6, " "); asn1_print(d + 6, resp.length - 6, " ");
} }

View file

@ -433,9 +433,10 @@ static int mf_read_uid(uint8_t *uid, int *uidlen, int *nxptype) {
} }
static char *GenerateFilename(const char *prefix, const char *suffix) { static char *GenerateFilename(const char *prefix, const char *suffix) {
if (! IfPm3Iso14443a()) { if (IfPm3Iso14443a() == false) {
return NULL; return NULL;
} }
uint8_t uid[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t uid[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int uidlen = 0; int uidlen = 0;
char *fptr = calloc(sizeof(char) * (strlen(prefix) + strlen(suffix)) + sizeof(uid) * 2 + 1, sizeof(uint8_t)); char *fptr = calloc(sizeof(char) * (strlen(prefix) + strlen(suffix)) + sizeof(uid) * 2 + 1, sizeof(uint8_t));
@ -924,7 +925,7 @@ static int mfc_read_tag(iso14a_card_select_t *card, uint8_t *carddata, uint8_t n
size_t alen = 0, blen = 0; size_t alen = 0, blen = 0;
uint8_t *keyA = NULL, *keyB = NULL; uint8_t *keyA = NULL, *keyB = NULL;
if (loadFileBinaryKey(keyfn, "", (void **)&keyA, (void **)&keyB, &alen, &blen) != PM3_SUCCESS) { if (loadFileBinaryKey(keyfn, "", (void **)&keyA, (void **)&keyB, &alen, &blen, true) != PM3_SUCCESS) {
free(fptr); free(fptr);
return PM3_ESOFT; return PM3_ESOFT;
} }
@ -1565,7 +1566,7 @@ static int FastDumpWithEcFill(uint8_t numsectors) {
} }
if (resp.status != PM3_SUCCESS) { if (resp.status != PM3_SUCCESS) {
PrintAndLogEx(FAILED, "fast dump reported back failure w KEY A, swapping to KEY B"); PrintAndLogEx(FAILED, "fast dump reported back failure w KEY A. Swapping to KEY B");
// ecfill key B // ecfill key B
payload.keytype = MF_KEY_B; payload.keytype = MF_KEY_B;
@ -1823,12 +1824,10 @@ static int CmdHF14AMfRestore(const char *Cmd) {
// //
size_t alen = 0, blen = 0; size_t alen = 0, blen = 0;
uint8_t *keyA, *keyB; uint8_t *keyA, *keyB;
if (loadFileBinaryKey(keyfilename, "", (void **)&keyA, (void **)&keyB, &alen, &blen) != PM3_SUCCESS) { if (loadFileBinaryKey(keyfilename, "", (void **)&keyA, (void **)&keyB, &alen, &blen, true) != PM3_SUCCESS) {
return PM3_ESOFT; return PM3_ESOFT;
} }
PrintAndLogEx(INFO, "Using key file `" _YELLOW_("%s") "`", keyfilename);
// try reading card uid and create filename // try reading card uid and create filename
if (datafnlen == 0) { if (datafnlen == 0) {
char *fptr = GenerateFilename("hf-mf-", "-dump.bin"); char *fptr = GenerateFilename("hf-mf-", "-dump.bin");
@ -7311,12 +7310,10 @@ int CmdHFMFNDEFFormat(const char *Cmd) {
// //
size_t alen = 0, blen = 0; size_t alen = 0, blen = 0;
uint8_t *tmpA, *tmpB; uint8_t *tmpA, *tmpB;
if (loadFileBinaryKey(keyFilename, "", (void **)&tmpA, (void **)&tmpB, &alen, &blen) != PM3_SUCCESS) { if (loadFileBinaryKey(keyFilename, "", (void **)&tmpA, (void **)&tmpB, &alen, &blen, true) != PM3_SUCCESS) {
goto skipfile; goto skipfile;
} }
PrintAndLogEx(INFO, "Using `" _YELLOW_("%s") "`", keyFilename);
for (int i = 0; i < numSectors; i++) { for (int i = 0; i < numSectors; i++) {
memcpy(keyA[i], tmpA + (i * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); memcpy(keyA[i], tmpA + (i * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE);
memcpy(keyB[i], tmpB + (i * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE); memcpy(keyB[i], tmpB + (i * MIFARE_KEY_SIZE), MIFARE_KEY_SIZE);

View file

@ -1059,7 +1059,7 @@ static int AuthCheckDesfire(DesfireContext_t *dctx,
DesfireSetKeyNoClear(dctx, keyno, T_3DES, aeskeyList[curkey]); DesfireSetKeyNoClear(dctx, keyno, T_3DES, aeskeyList[curkey]);
res = DesfireAuthenticate(dctx, secureChannel, false); res = DesfireAuthenticate(dctx, secureChannel, false);
if (res == PM3_SUCCESS) { if (res == PM3_SUCCESS) {
PrintAndLogEx(SUCCESS, "AID 0x%06X, Found 2TDEA Key %02u : " _GREEN_("%s"), curaid, keyno, sprint_hex(aeskeyList[curkey], 16)); PrintAndLogEx(SUCCESS, "AID 0x%06X, Found 2TDEA Key %02u... " _GREEN_("%s"), curaid, keyno, sprint_hex_inrow(aeskeyList[curkey], 16));
foundKeys[1][keyno][0] = 0x01; foundKeys[1][keyno][0] = 0x01;
*result = true; *result = true;
memcpy(&foundKeys[1][keyno][1], aeskeyList[curkey], 16); memcpy(&foundKeys[1][keyno][1], aeskeyList[curkey], 16);
@ -1091,7 +1091,7 @@ static int AuthCheckDesfire(DesfireContext_t *dctx,
DesfireSetKeyNoClear(dctx, keyno, T_AES, aeskeyList[curkey]); DesfireSetKeyNoClear(dctx, keyno, T_AES, aeskeyList[curkey]);
res = DesfireAuthenticate(dctx, secureChannel, false); res = DesfireAuthenticate(dctx, secureChannel, false);
if (res == PM3_SUCCESS) { if (res == PM3_SUCCESS) {
PrintAndLogEx(SUCCESS, "AID 0x%06X, Found AES Key %02u : " _GREEN_("%s"), curaid, keyno, sprint_hex(aeskeyList[curkey], 16)); PrintAndLogEx(SUCCESS, "AID 0x%06X, Found AES Key %02u... " _GREEN_("%s"), curaid, keyno, sprint_hex_inrow(aeskeyList[curkey], 16));
foundKeys[2][keyno][0] = 0x01; foundKeys[2][keyno][0] = 0x01;
*result = true; *result = true;
memcpy(&foundKeys[2][keyno][1], aeskeyList[curkey], 16); memcpy(&foundKeys[2][keyno][1], aeskeyList[curkey], 16);
@ -1123,7 +1123,7 @@ static int AuthCheckDesfire(DesfireContext_t *dctx,
DesfireSetKeyNoClear(dctx, keyno, T_3K3DES, k3kkeyList[curkey]); DesfireSetKeyNoClear(dctx, keyno, T_3K3DES, k3kkeyList[curkey]);
res = DesfireAuthenticate(dctx, secureChannel, false); res = DesfireAuthenticate(dctx, secureChannel, false);
if (res == PM3_SUCCESS) { if (res == PM3_SUCCESS) {
PrintAndLogEx(SUCCESS, "AID 0x%06X, Found 3TDEA Key %02u : " _GREEN_("%s"), curaid, keyno, sprint_hex(k3kkeyList[curkey], 24)); PrintAndLogEx(SUCCESS, "AID 0x%06X, Found 3TDEA Key %02u... " _GREEN_("%s"), curaid, keyno, sprint_hex_inrow(k3kkeyList[curkey], 24));
foundKeys[3][keyno][0] = 0x01; foundKeys[3][keyno][0] = 0x01;
*result = true; *result = true;
memcpy(&foundKeys[3][keyno][1], k3kkeyList[curkey], 16); memcpy(&foundKeys[3][keyno][1], k3kkeyList[curkey], 16);

View file

@ -508,7 +508,7 @@ static void init_bitflip_bitarrays(void) {
{ {
char progress_text[100]; char progress_text[100];
memset(progress_text, 0, sizeof(progress_text)); memset(progress_text, 0, sizeof(progress_text));
snprintf(progress_text, sizeof(progress_text), "Loaded " _YELLOW_("%u") " RAW / " _YELLOW_("%u") " LZ4 / " _YELLOW_("%u") " BZ2 in %"PRIu64" ms" snprintf(progress_text, sizeof(progress_text), "Loaded " _YELLOW_("%u") " RAW / " _YELLOW_("%u") " LZ4 / " _YELLOW_("%u") " BZ2 in %4"PRIu64" ms"
, nraw , nraw
, nlz4 , nlz4
, nbz2 , nbz2

View file

@ -231,7 +231,7 @@ static int execute_system_command(const char *command) {
int ret; int ret;
#if defined(_WIN32) #if defined(_WIN32)
char wrapped_command[255]; char wrapped_command[255];
strncat(wrapped_command, "cmd /C \"", 9); strncat(wrapped_command, "cmd /C \"", 9);
strncat(wrapped_command, command, strlen(command)); strncat(wrapped_command, command, strlen(command));

View file

@ -181,7 +181,7 @@ static uint16_t extractChallenges(uint16_t tracepos, uint16_t traceLen, uint8_t
} }
*/ */
// extract MFU-C KEY when written. // extract UL-C KEY when written.
switch (frame[0]) { switch (frame[0]) {
case MIFARE_ULC_AUTH_1: { case MIFARE_ULC_AUTH_1: {

View file

@ -2353,7 +2353,7 @@ int loadFileDICTIONARY_safe_ex(const char *preferredName, const char *suffix, vo
keylen = 6; keylen = 6;
} }
size_t block_size = 10 * keylen; size_t block_size = 1000 * keylen;
// double up since its chars // double up since its chars
keylen <<= 1; keylen <<= 1;
@ -2428,10 +2428,9 @@ int loadFileDICTIONARY_safe_ex(const char *preferredName, const char *suffix, vo
continue; continue;
} }
if (hex_to_bytes( int ret = hex_to_bytes(line, (uint8_t *)*pdata + (*keycnt * (keylen >> 1)), keylen >> 1);
line, if (ret != (keylen >> 1)) {
(uint8_t *)*pdata + (*keycnt * (keylen >> 1)), PrintAndLogEx(INFO, "hex to bytes wrong %i", ret);
keylen >> 1) != (keylen >> 1)) {
continue; continue;
} }
@ -2450,16 +2449,16 @@ out:
return retval; return retval;
} }
int loadFileBinaryKey(const char *preferredName, const char *suffix, void **keya, void **keyb, size_t *alen, size_t *blen) { int loadFileBinaryKey(const char *preferredName, const char *suffix, void **keya, void **keyb, size_t *alen, size_t *blen, bool verbose) {
char *path; char *path;
int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, suffix, false); int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, suffix, false);
if (res != PM3_SUCCESS) { if (res != PM3_SUCCESS) {
return PM3_EFILE; return PM3_ENOFILE;
} }
FILE *f = fopen(path, "rb"); FILE *f = fopen(path, "rb");
if (!f) { if (f == NULL) {
PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", path); PrintAndLogEx(WARNING, "file not found or locked `" _YELLOW_("%s") "`", path);
free(path); free(path);
return PM3_EFILE; return PM3_EFILE;
@ -2502,7 +2501,9 @@ int loadFileBinaryKey(const char *preferredName, const char *suffix, void **keya
*blen = fread(*keyb, 1, fsize, f); *blen = fread(*keyb, 1, fsize, f);
fclose(f); fclose(f);
PrintAndLogEx(SUCCESS, "Loaded binary key file `" _YELLOW_("%s") "`", path); if (verbose) {
PrintAndLogEx(SUCCESS, "Loaded binary key file `" _YELLOW_("%s") "`", path);
}
free(path); free(path);
return PM3_SUCCESS; return PM3_SUCCESS;
} }

View file

@ -307,7 +307,7 @@ int loadFileDICTIONARY_safe_ex(const char *preferredName, const char *suffix, vo
*/ */
int loadFileXML_safe(const char *preferredName, const char *suffix, void **pdata, size_t *datalen); int loadFileXML_safe(const char *preferredName, const char *suffix, void **pdata, size_t *datalen);
int loadFileBinaryKey(const char *preferredName, const char *suffix, void **keya, void **keyb, size_t *alen, size_t *blen); int loadFileBinaryKey(const char *preferredName, const char *suffix, void **keya, void **keyb, size_t *alen, size_t *blen, bool verbose);
/** /**
* @brief Utility function to check and convert plain mfu dump format to new mfu binary format. * @brief Utility function to check and convert plain mfu dump format to new mfu binary format.

View file

@ -64,7 +64,7 @@ int mf_dark_side(uint8_t blockno, uint8_t key_type, uint64_t *key) {
//flush queue //flush queue
while (kbd_enter_pressed()) { while (kbd_enter_pressed()) {
SendCommandNG(CMD_BREAK_LOOP, NULL, 0); SendCommandNG(CMD_BREAK_LOOP, NULL, 0);
PrintAndLogEx(WARNING, "Aborted via keyboard"); PrintAndLogEx(WARNING, "aborted via keyboard");
return PM3_EOPABORTED; return PM3_EOPABORTED;
} }
@ -90,7 +90,7 @@ int mf_dark_side(uint8_t blockno, uint8_t key_type, uint64_t *key) {
//TODO: Not really stopping the command in time. //TODO: Not really stopping the command in time.
if (kbd_enter_pressed()) { if (kbd_enter_pressed()) {
SendCommandNG(CMD_BREAK_LOOP, NULL, 0); SendCommandNG(CMD_BREAK_LOOP, NULL, 0);
PrintAndLogEx(WARNING, "\nAborted via keyboard"); PrintAndLogEx(WARNING, "\naborted via keyboard");
return PM3_EOPABORTED; return PM3_EOPABORTED;
} }

View file

@ -18,38 +18,38 @@ typedef int pthread_spinlock_t;
#endif #endif
static inline int pthread_spin_init(pthread_spinlock_t *lock, int pshared) { static inline int pthread_spin_init(pthread_spinlock_t *lock, int pshared) {
__asm__ __volatile__ ("" ::: "memory"); __asm__ __volatile__("" ::: "memory");
*lock = 0; *lock = 0;
return 0; return 0;
} }
static inline int pthread_spin_destroy(pthread_spinlock_t *lock) { static inline int pthread_spin_destroy(pthread_spinlock_t *lock) {
return 0; return 0;
} }
static inline int pthread_spin_lock(pthread_spinlock_t *lock) { static inline int pthread_spin_lock(pthread_spinlock_t *lock) {
while (1) { while (1) {
int i; int i;
for (i=0; i < 10000; i++) { for (i = 0; i < 10000; i++) {
if (__sync_bool_compare_and_swap(lock, 0, 1)) { if (__sync_bool_compare_and_swap(lock, 0, 1)) {
return 0; return 0;
} }
} }
sched_yield(); sched_yield();
} }
} }
static inline int pthread_spin_trylock(pthread_spinlock_t *lock) { static inline int pthread_spin_trylock(pthread_spinlock_t *lock) {
if (__sync_bool_compare_and_swap(lock, 0, 1)) { if (__sync_bool_compare_and_swap(lock, 0, 1)) {
return 0; return 0;
} }
return 16; // EBUSY; return 16; // EBUSY;
} }
static inline int pthread_spin_unlock(pthread_spinlock_t *lock) { static inline int pthread_spin_unlock(pthread_spinlock_t *lock) {
__asm__ __volatile__ ("" ::: "memory"); __asm__ __volatile__("" ::: "memory");
*lock = 0; *lock = 0;
return 0; return 0;
} }
#endif #endif

View file

@ -450,6 +450,43 @@ void lslx(uint8_t *d, size_t n, uint8_t shifts) {
} }
} }
// right shift an array of length one bit
void rsl(uint8_t *d, size_t n) {
uint8_t carry = 0;
for (size_t i = 0; i < n; i++) {
// Save the LSB before shifting
uint8_t new_carry = d[i] & 0x1;
// Shift current byte right and incorporate previous carry
d[i] = (d[i] >> 1) | (carry ? 0x80 : 0);
// Update carry for next byte
carry = new_carry;
}
}
void rslx(uint8_t *d, size_t n, uint8_t shifts) {
uint8_t carry = 0;
for (uint8_t j = 0; j < shifts; j++) {
for (size_t i = 0; i < n; i++) {
// Save the LSB before shifting
uint8_t new_carry = d[i] & 0x1;
// Shift current byte right and incorporate previous carry
d[i] = (d[i] >> 1) | (carry ? 0x80 : 0);
// Update carry for next byte
carry = new_carry;
}
}
}
// BSWAP24 of array[3] // BSWAP24 of array[3]
uint32_t le24toh(const uint8_t data[3]) { uint32_t le24toh(const uint8_t data[3]) {

View file

@ -135,6 +135,9 @@ void xor(uint8_t *dest, const uint8_t *src, size_t n);
void lsl(uint8_t *d, size_t n); void lsl(uint8_t *d, size_t n);
void lslx(uint8_t *d, size_t n, uint8_t shifts); void lslx(uint8_t *d, size_t n, uint8_t shifts);
void rsl(uint8_t *d, size_t n);
void rslx(uint8_t *d, size_t n, uint8_t shifts);
uint32_t le24toh(const uint8_t data[3]); uint32_t le24toh(const uint8_t data[3]);
void htole24(uint32_t val, uint8_t data[3]); void htole24(uint32_t val, uint8_t data[3]);

View file

@ -3686,9 +3686,10 @@
"-p, --prevent fake epurse update", "-p, --prevent fake epurse update",
"--shallow shallow mod", "--shallow shallow mod",
"-d, --data <hex> DER encoded command to send to SAM", "-d, --data <hex> DER encoded command to send to SAM",
"-s, --snmp data is in snmp format without headers",
"--info get SAM infos (version, serial number)" "--info get SAM infos (version, serial number)"
], ],
"usage": "hf iclass sam [-hvkntp] [--break] [--shallow] [-d <hex>]... [--info]" "usage": "hf iclass sam [-hvkntps] [--break] [--shallow] [-d <hex>]... [--info]"
}, },
"hf iclass sim": { "hf iclass sim": {
"command": "hf iclass sim", "command": "hf iclass sim",
@ -12123,7 +12124,7 @@
}, },
"mem load": { "mem load": {
"command": "mem load", "command": "mem load",
"description": "Loads binary file into flash memory on device Warning: mem area to be written must have been wiped first ( dictionaries are serviced as files in spiffs so no wipe is needed )", "description": "Loads binary file into flash memory on device Warning! - mem area to be written must have been wiped first OBS! - dictionaries are serviced as files in spiffs so no wipe is needed",
"notes": [ "notes": [
"mem load -f myfile -> upload file myfile values at default offset 0", "mem load -f myfile -> upload file myfile values at default offset 0",
"mem load -f myfile -o 1024 -> upload file myfile values at offset 1024", "mem load -f myfile -o 1024 -> upload file myfile values at offset 1024",
@ -12136,14 +12137,14 @@
"options": [ "options": [
"-h, --help This help", "-h, --help This help",
"-o, --offset <dec> offset in memory", "-o, --offset <dec> offset in memory",
"-m, --mifare, --mfc upload 6 bytes keys (mifare key dictionary)", "-m, --mfc upload 6 bytes keys (MIFARE Classic dictionary)",
"-i, --iclass upload 8 bytes keys (iClass key dictionary)", "-i, --iclass upload 8 bytes keys (iClass dictionary)",
"-t, --t55xx upload 4 bytes keys (password dictionary)", "-t, --t55xx upload 4 bytes keys (T55xx dictionary)",
"--ulc upload 16 bytes keys (mifare UL-C key dictionary)", "--ulc upload 16 bytes keys (MIFARE UL-C dictionary)",
"--ulaes upload 16 bytes keys (mifare UL-AES key dictionary)", "--aes upload 16 bytes keys (MIFARE UL-AES dictionary)",
"-f, --file <fn> file name" "-f, --file <fn> file name"
], ],
"usage": "mem load [-hmit] [-o <dec>] [--ulc] [--ulaes] -f <fn>" "usage": "mem load [-hmit] [-o <dec>] [--ulc] [--aes] -f <fn>"
}, },
"mem spiffs check": { "mem spiffs check": {
"command": "mem spiffs check", "command": "mem spiffs check",
@ -13374,6 +13375,6 @@
"metadata": { "metadata": {
"commands_extracted": 768, "commands_extracted": 768,
"extracted_by": "PM3Help2JSON v1.00", "extracted_by": "PM3Help2JSON v1.00",
"extracted_on": "2025-06-19T15:01:51" "extracted_on": "2025-06-22T18:30:29"
} }
} }

View file

@ -964,6 +964,8 @@ typedef struct {
// Cryptographic error client/pm3: cryptographic operation failed // Cryptographic error client/pm3: cryptographic operation failed
#define PM3_ECRYPTO -29 #define PM3_ECRYPTO -29
// File error client: error related to file does not exist in search paths
#define PM3_ENOFILE -30
// No data client/pm3: no data available, no host frame available (not really an error) // No data client/pm3: no data available, no host frame available (not really an error)
#define PM3_ENODATA -98 #define PM3_ENODATA -98
// Quit program client: reserved, order to quit the program // Quit program client: reserved, order to quit the program