Fix dump of SRT512 tag

This commit is contained in:
DidierA 2022-09-20 01:52:53 +02:00
commit c145c4b78b

View file

@ -789,23 +789,24 @@ static void print_ct_blocks(uint8_t *data, size_t len) {
static void print_sr_blocks(uint8_t *data, size_t len) { static void print_sr_blocks(uint8_t *data, size_t len) {
size_t blocks = len / ST25TB_SR_BLOCK_SIZE; size_t blocks = (len / ST25TB_SR_BLOCK_SIZE) -1 ;
uint8_t * systemblock = data + blocks * ST25TB_SR_BLOCK_SIZE ;
uint8_t chipid = get_st_chipid(data); uint8_t chipid = get_st_chipid(data);
PrintAndLogEx(SUCCESS, _GREEN_("%s") " tag", get_st_chip_model(chipid)); PrintAndLogEx(SUCCESS, _GREEN_("%s") " tag", get_st_chip_model(chipid));
PrintAndLogEx(DEBUG, "systemblock : %s", sprint_hex(data + (blocks * 4), 4)); PrintAndLogEx(DEBUG, "systemblock : %s", sprint_hex(systemblock, ST25TB_SR_BLOCK_SIZE));
PrintAndLogEx(DEBUG, " otp lock : %02x %02x", data[(blocks * 4)], data[(blocks * 4) + 1]); PrintAndLogEx(DEBUG, " otp lock : %02x %02x", *systemblock, *(systemblock + 1));
print_hdr(); print_hdr();
for (int i = 0; i <= blocks; i++) { for (int i = 0; i < blocks; i++) {
PrintAndLogEx(INFO, PrintAndLogEx(INFO,
"%3d/0x%02X | %s | %s | %s", "%3d/0x%02X | %s | %s | %s",
i, i,
i, i,
sprint_hex(data + (i * 4), 4), sprint_hex(data + (i * ST25TB_SR_BLOCK_SIZE), ST25TB_SR_BLOCK_SIZE),
get_st_lock_info(chipid, data + (blocks * 4), i), get_st_lock_info(chipid, systemblock, i),
sprint_ascii(data + (i * 4), 4) sprint_ascii(data + (i * ST25TB_SR_BLOCK_SIZE), ST25TB_SR_BLOCK_SIZE)
); );
} }
@ -813,9 +814,9 @@ static void print_sr_blocks(uint8_t *data, size_t len) {
"%3d/0x%02X | %s | %s | %s", "%3d/0x%02X | %s | %s | %s",
0xFF, 0xFF,
0xFF, 0xFF,
sprint_hex(data + (0xFF * 4), 4), sprint_hex(systemblock, ST25TB_SR_BLOCK_SIZE),
get_st_lock_info(chipid, data + (blocks * 4), 0xFF), get_st_lock_info(chipid, systemblock, 0xFF),
sprint_ascii(data + (0xFF * 4), 4) sprint_ascii(systemblock, ST25TB_SR_BLOCK_SIZE)
); );
print_footer(); print_footer();
@ -1405,18 +1406,18 @@ static int CmdHF14BDump(const char *Cmd) {
// 1 = 4096 // 1 = 4096
// 2 = 512 // 2 = 512
uint8_t cardtype = get_st_cardsize(card.uid); uint8_t cardtype = get_st_cardsize(card.uid);
uint8_t blocks = 0; uint8_t lastblock = 0;
uint16_t cardsize = 0; uint16_t cardsize = 0;
switch (cardtype) { switch (cardtype) {
case 2: case 2:
cardsize = (512 / 8) + 4; cardsize = (512 / 8) + ST25TB_SR_BLOCK_SIZE;
blocks = 0x0F; lastblock = 0x0F;
break; break;
case 1: case 1:
default: default:
cardsize = (4096 / 8) + 4; cardsize = (4096 / 8) + ST25TB_SR_BLOCK_SIZE;
blocks = 0x7F; lastblock = 0x7F;
break; break;
} }
@ -1486,15 +1487,15 @@ static int CmdHF14BDump(const char *Cmd) {
// last read // last read
if (blocknum == 0xFF) { if (blocknum == 0xFF) {
// we reserved space for this block after 0x0F and 0x7F, ie 0x10, 0x80 // we reserved space for this block after 0x0F and 0x7F, ie 0x10, 0x80
memcpy(data + (blocks * 4), recv, 4); memcpy(data + ((lastblock+1) * ST25TB_SR_BLOCK_SIZE), recv, ST25TB_SR_BLOCK_SIZE);
break; break;
} }
memcpy(data + (blocknum * 4), recv, 4); memcpy(data + (blocknum * ST25TB_SR_BLOCK_SIZE), recv, ST25TB_SR_BLOCK_SIZE);
retry = 0; retry = 0;
blocknum++; blocknum++;
if (blocknum > blocks) { if (blocknum > lastblock) {
// read config block // read config block
blocknum = 0xFF; blocknum = 0xFF;
} }
@ -1521,8 +1522,8 @@ static int CmdHF14BDump(const char *Cmd) {
FillFileNameByUID(fptr, SwapEndian64(card.uid, card.uidlen, 8), "-dump", card.uidlen); FillFileNameByUID(fptr, SwapEndian64(card.uid, card.uidlen, 8), "-dump", card.uidlen);
} }
size_t datalen = (blocks + 1) * 4; size_t datalen = (lastblock + 2) * ST25TB_SR_BLOCK_SIZE;
pm3_save_dump(filename, data, datalen, jsf14b, 4); pm3_save_dump(filename, data, datalen, jsf14b, ST25TB_SR_BLOCK_SIZE);
} }
return switch_off_field_14b(); return switch_off_field_14b();