From 8e99ec25edb501c00d1d0a9fc57709ff88f56495 Mon Sep 17 00:00:00 2001 From: marshmellow42 Date: Sat, 17 Oct 2015 15:01:26 -0400 Subject: [PATCH] add wake option to t55xx read command --- CHANGELOG.md | 1 + armsrc/appmain.c | 2 +- armsrc/apps.h | 2 +- armsrc/lfops.c | 21 ++++++---- client/cmdlft55xx.c | 93 +++++++++++++++++++++++++++++++-------------- 5 files changed, 81 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21292088..67aec2c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac ## [unreleased][unreleased] ### Added +- `lf t55xx read w` added wake with password then read following stream option to standard t55xx read commands (marshmellow) - `hf iclass managekeys` to save, load and manage iclass keys. (adjusted most commands to accept a loaded key in memory) (marshmellow) - `hf iclass readblk` to select, authenticate, and read 1 block from an iclass card (marshmellow) - `hf iclass writeblk` to select, authenticate, and write 1 block to an iclass card (or picopass) (marshmellow + others) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 3a819edf..bbb062c0 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -975,7 +975,7 @@ void UsbPacketReceived(uint8_t *packet, int len) CopyIndala224toT55x7(c->d.asDwords[0], c->d.asDwords[1], c->d.asDwords[2], c->d.asDwords[3], c->d.asDwords[4], c->d.asDwords[5], c->d.asDwords[6]); break; case CMD_T55XX_READ_BLOCK: - T55xxReadBlock(c->arg[1], c->arg[2],c->d.asBytes[0]); + T55xxReadBlock(c->arg[0], c->arg[1], c->arg[2]); break; case CMD_T55XX_WRITE_BLOCK: T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]); diff --git a/armsrc/apps.h b/armsrc/apps.h index aaace18b..d0be7503 100644 --- a/armsrc/apps.h +++ b/armsrc/apps.h @@ -80,7 +80,7 @@ void WriteEM410x(uint32_t card, uint32_t id_hi, uint32_t id_lo); void CopyIndala64toT55x7(int hi, int lo); // Clone Indala 64-bit tag by UID to T55x7 void CopyIndala224toT55x7(int uid1, int uid2, int uid3, int uid4, int uid5, int uid6, int uid7); // Clone Indala 224-bit tag by UID to T55x7 void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMode); -void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode ); +void T55xxReadBlock(uint16_t arg0, uint8_t Block, uint32_t Pwd); void T55xxReadTrace(void); void EM4xReadWord(uint8_t Address, uint32_t Pwd, uint8_t PwdMode); void EM4xWriteWord(uint32_t Data, uint8_t Address, uint32_t Pwd, uint8_t PwdMode); diff --git a/armsrc/lfops.c b/armsrc/lfops.c index cf04c31b..b5647edd 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -1202,9 +1202,10 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod } // Read one card block in page 0 -void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) { +void T55xxReadBlock(uint16_t arg0, uint8_t Block, uint32_t Pwd) { LED_A_ON(); - + uint8_t PwdMode = arg0 & 0xFF; + uint8_t wake = arg0 >> 8; uint32_t i = 0; //clear buffer now so it does not interfere with timing later @@ -1237,17 +1238,21 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) { T55xxWriteBit(1); T55xxWriteBit(0); //Page 0 - if (PwdMode == 1){ + if (PwdMode || wake){ // Send Pwd for (i = 0x80000000; i != 0; i >>= 1) T55xxWriteBit(Pwd & i); } - // Send a zero bit separation - T55xxWriteBit(0); - // Send Block number - for (i = 0x04; i != 0; i >>= 1) - T55xxWriteBit(Block & i); + // reading a block - send rest of read block cmd else skip for wake command + if (!wake) { + // Send a zero bit separation + T55xxWriteBit(0); + + // Send Block number + for (i = 0x04; i != 0; i >>= 1) + T55xxWriteBit(Block & i); + } // Turn field on to read the response TurnReadLFOn(READ_GAP); diff --git a/client/cmdlft55xx.c b/client/cmdlft55xx.c index 2297d249..efa6c22d 100644 --- a/client/cmdlft55xx.c +++ b/client/cmdlft55xx.c @@ -121,12 +121,12 @@ static int CmdHelp(const char *Cmd); int CmdT55xxSetConfig(const char *Cmd) { uint8_t offset = 0; - bool errors = FALSE; - uint8_t cmdp = 0; char modulation[5] = {0x00}; char tmp = 0x00; uint8_t bitRate = 0; uint8_t rates[9] = {8,16,32,40,50,64,100,128,0}; + uint8_t cmdp = 0; + bool errors = FALSE; while(param_getchar(Cmd, cmdp) != 0x00 && !errors) { tmp = param_getchar(Cmd, cmdp); @@ -220,39 +220,72 @@ int CmdT55xxSetConfig(const char *Cmd) { } int CmdT55xxReadBlock(const char *Cmd) { - int block = -1; - int password = 0xFFFFFFFF; //default to blank Block 7 - int override = 0; - char cmdp = param_getchar(Cmd, 0); - if (cmdp == 'h' || cmdp == 'H') - return usage_t55xx_read(); - - int res = sscanf(Cmd, "%d %x %d", &block, &password, &override); - - if ( res < 1 || res > 3 ) - return usage_t55xx_read(); - - if ((block < 0) || (block > 7)) { + uint8_t block = 255; + uint8_t wake = 0; + uint8_t usepwd = 0; + uint32_t password = 0xFFFFFFFF; //default to blank Block 7 + uint8_t override = 0; + uint8_t cmdp = 0; + bool errors = false; + while(param_getchar(Cmd, cmdp) != 0x00 && !errors) { + switch(param_getchar(Cmd, cmdp)) { + case 'h': + case 'H': + return usage_t55xx_read(); + case 'b': + case 'B': + errors |= param_getdec(Cmd, cmdp+1, &block); + cmdp+=2; + break; + case 'o': + case 'O': + override = 1; + cmdp++; + break; + case 'p': + case 'P': + password = param_get32ex(Cmd, cmdp+1, 0, 10); + usepwd = 1; + cmdp+=2; + break; + case 'w': + case 'W': + wake = 1; + cmdp++; + break; + default: + PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp)); + errors = true; + break; + } + } + if (errors) return usage_t55xx_read(); + if (wake && !usepwd) { + PrintAndLog("Wake command must use a pwd"); + return 1; + } + if ((block > 7) && !wake) { PrintAndLog("Block must be between 0 and 7"); return 1; } - UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, 0}}; - c.d.asBytes[0] = 0x0; + UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, password}}; //Password mode - if ( res > 1 ) { + if ( usepwd || wake ) { // try reading the config block and verify that PWD bit is set before doing this! - AquireData( CONFIGURATION_BLOCK ); - if ( !tryDetectModulation() && !override) { - PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits."); - return 1; - } else if (override) { - PrintAndLog("Safety Check Overriden - proceeding despite risk"); - c.arg[2] = password; - c.d.asBytes[0] = 0x1; + if ( wake || override ) { + c.arg[0] = (wake<<8) & usepwd; + if ( !wake && override ) + PrintAndLog("Safety Check Overriden - proceeding despite risk"); } else { - PrintAndLog("Safety Check: PWD bit is NOT set in config block. Reading without password..."); + AquireData( CONFIGURATION_BLOCK ); + if ( !tryDetectModulation() ) { + PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits."); + return 1; + } else { + PrintAndLog("Safety Check: PWD bit is NOT set in config block. Reading without password..."); + } } } @@ -270,7 +303,11 @@ int CmdT55xxReadBlock(const char *Cmd) { //DemodBufferLen=0; if (!DecodeT55xxBlock()) return 3; char blk[10]={0}; - sprintf(blk,"%d", block); + if ( wake ) { + sprintf(blk,"wake"); + } else { + sprintf(blk,"%d", block); + } printT55xxBlock(blk); return 0; } -- 2.39.2