From 52164a4fd1781c32b3cab3bc4a747d1208234b31 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 27 Oct 2020 18:26:14 +0100 Subject: [PATCH] hf 14b sriread -> hf 14b rdbl, renamed and refactored it to read a block. use dump, to dump whole tag --- armsrc/appmain.c | 6 ++++- armsrc/iso14443b.c | 63 +++++++++++++++++++------------------------ client/src/cmdhf14b.c | 39 +++++++++++++++++---------- include/pm3_cmd.h | 3 +++ 4 files changed, 60 insertions(+), 51 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 416bf91e4..4ee594414 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1182,7 +1182,11 @@ static void PacketReceived(PacketCommandNG *packet) { #ifdef WITH_ISO14443b case CMD_HF_SRI_READ: { - ReadSTMemoryIso14443b(packet->oldarg[0]); + struct p { + uint8_t blockno; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + ReadSTBlock(payload->blockno); break; } case CMD_HF_ISO14443B_SNIFF: { diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 64c0ba67f..eab139ea9 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -1540,7 +1540,8 @@ void iso14443b_setup(void) { // // I tried to be systematic and check every answer of the tag, every CRC, etc... //----------------------------------------------------------------------------- -static bool ReadSTBlock(uint8_t blocknr, uint8_t *block) { +static int read_srx_block(uint8_t blocknr, uint8_t *block) { + uint8_t cmd[] = {ISO14443B_READ_BLK, blocknr, 0x00, 0x00}; AddCrc14B(cmd, 2); @@ -1557,60 +1558,50 @@ static bool ReadSTBlock(uint8_t blocknr, uint8_t *block) { // Check if we got an answer from the tag if (retlen != 6) { DbpString("[!] expected 6 bytes from tag, got less..."); - return false; + return PM3_EWRONGANSWER; } // The check the CRC of the answer - if (!check_crc(CRC_14443_B, r_block, retlen)) { + if (check_crc(CRC_14443_B, r_block, retlen) == false) { DbpString("CRC fail"); - return false; + return PM3_ECRC; } if (block) { memcpy(block, r_block, 4); } - Dbprintf("Address=%02x, Contents=%08x, CRC=%04x", - blocknr, - (r_block[3] << 24) + (r_block[2] << 16) + (r_block[1] << 8) + r_block[0], - (r_block[4] << 8) + r_block[5]); + if (DBGLEVEL >= DBG_DEBUG) { + Dbprintf("Address=%02x, Contents=%08x, CRC=%04x", + blocknr, + (r_block[3] << 24) + (r_block[2] << 16) + (r_block[1] << 8) + r_block[0], + (r_block[4] << 8) + r_block[5] + ); + } - return true; + return PM3_SUCCESS; } -void ReadSTMemoryIso14443b(uint16_t numofblocks) { - +void ReadSTBlock(uint8_t blocknr) { iso14443b_setup(); - - uint8_t *mem = BigBuf_malloc((numofblocks + 1) * 4); - iso14b_card_select_t card; int res = iso14443b_select_srx_card(&card); - int isOK = PM3_SUCCESS; - - // 0: OK 2: attrib fail, 3:crc fail, - if (res < 1) { - isOK = PM3_ETIMEOUT; - goto out; - } - - ++numofblocks; - - for (uint8_t i = 0; i < numofblocks; i++) { - - if (ReadSTBlock(i, mem + (i * 4)) == false) { - isOK = PM3_ETIMEOUT; - break; + // 0: OK -1 wrong len, -2: attrib fail, -3:crc fail, + switch(res) { + case -1: + case -3: { + reply_ng(CMD_HF_SRI_READ, PM3_EWRONGANSWER, NULL, 0); + goto out; + } + case -2: { + reply_ng(CMD_HF_SRI_READ, PM3_ECRC, NULL, 0); + goto out; } } - - // System area block (0xFF) - if (ReadSTBlock(0xFF, mem + (numofblocks * 4)) == false) - isOK = PM3_ETIMEOUT; + uint8_t *data = BigBuf_malloc(4); + res = read_srx_block(blocknr, data); + reply_ng(CMD_HF_SRI_READ, res, data, 4); out: - - reply_ng(CMD_HF_SRI_READ, isOK, mem, numofblocks * 4); - BigBuf_free(); switch_off(); } diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index bf883c37f..e49e91784 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -959,25 +959,25 @@ static int CmdHF14BReader(const char *Cmd) { return readHF14B(verbose); } -/* New command to read the contents of a SRI512|SRIX4K tag - * SRI* tags are ISO14443-B modulated memory tags, - * this command just dumps the contents of the memory/ - */ -static int CmdHF14BReadSri(const char *Cmd) { +// Read SRI512|SRIX4K block +static int CmdHF14BSriRdBl(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "hf 14b sriread", - "Read contents of a SRI512 | SRIX4K tag", - "hf 14b sriread\n" + CLIParserInit(&ctx, "hf 14b rdbl", + "Read SRI512 | SRIX4K block", + "hf 14b rdbl -b 06\n" ); void *argtable[] = { arg_param_begin, + arg_int0("b", "block", "", "block number"), arg_param_end }; - CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, false); + int blockno = arg_get_int_def(ctx, 1, -1); CLIParserFree(ctx); +/* iso14b_card_select_t card; if (get_14b_UID(&card) == false) { PrintAndLogEx(WARNING, "no tag found"); @@ -994,12 +994,23 @@ static int CmdHF14BReadSri(const char *Cmd) { // 2 = 512 uint8_t cardtype = get_st_cardsize(card.uid); uint8_t blocks = (cardtype == 1) ? 0x7F : 0x0F; +*/ + struct { + uint8_t blockno; + } PACKED payload; + + payload.blockno = blockno; + PacketResponseNG resp; clearCommandBuffer(); - SendCommandMIX(CMD_HF_SRI_READ, blocks, 0, 0, NULL, 0); - - // iceman: should download read data and print in client. - return PM3_SUCCESS; + SendCommandNG(CMD_HF_SRI_READ, (uint8_t*)&payload, sizeof(payload)); + if (WaitForResponseTimeout(CMD_HF_SRI_READ, &resp, TIMEOUT) == false) { + return PM3_ETIMEOUT; + } + if (resp.status == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "block %02u : " _GREEN_("%s") " | " _GREEN_("%s"), blockno, sprint_hex(resp.data.asBytes, resp.length), sprint_ascii(resp.data.asBytes, resp.length)); + } + return resp.status; } // New command to write a SRI512/SRIX4K tag. @@ -1787,7 +1798,7 @@ static command_t CommandTable[] = { {"reader", CmdHF14BReader, IfPm3Iso14443b, "Act as a 14443B reader to identify a tag"}, {"sim", CmdHF14BSim, IfPm3Iso14443b, "Fake ISO 14443B tag"}, {"sniff", CmdHF14BSniff, IfPm3Iso14443b, "Eavesdrop ISO 14443B"}, - {"sriread", CmdHF14BReadSri, IfPm3Iso14443b, "Read contents of a SRI512 | SRIX4K tag"}, + {"rdbl", CmdHF14BSriRdBl, IfPm3Iso14443b, "Read SRI512/SRIX4x block"}, {"sriwrite", CmdHF14BWriteSri, IfPm3Iso14443b, "Write data to a SRI512 | SRIX4K tag"}, // {"valid", srix4kValid, AlwaysAvailable, "srix4k checksum test"}, {NULL, NULL, NULL, NULL} diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index c393ae218..dc26eb2b8 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -794,6 +794,9 @@ typedef struct { // tearoff occured client/pm3: when a tearoff hook was called and a tearoff actually happened #define PM3_ETEAROFF -23 +// Got bad CRC client/pm3: error in transfer of data, crc mismatch. +#define PM3_ECRC -24 + // No data pm3: no data available, no host frame available (not really an error) #define PM3_ENODATA -98 // Quit program client: reserved, order to quit the program