add wake option to t55xx read command

This commit is contained in:
marshmellow42 2015-10-17 15:01:26 -04:00
commit 8e99ec25ed
5 changed files with 81 additions and 38 deletions

View file

@ -5,6 +5,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
## [unreleased][unreleased] ## [unreleased][unreleased]
### Added ### 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 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 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) - `hf iclass writeblk` to select, authenticate, and write 1 block to an iclass card (or picopass) (marshmellow + others)

View file

@ -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]); 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; break;
case CMD_T55XX_READ_BLOCK: 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; break;
case CMD_T55XX_WRITE_BLOCK: case CMD_T55XX_WRITE_BLOCK:
T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]); T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);

View file

@ -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 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 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 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 T55xxReadTrace(void);
void EM4xReadWord(uint8_t Address, uint32_t Pwd, uint8_t PwdMode); 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); void EM4xWriteWord(uint32_t Data, uint8_t Address, uint32_t Pwd, uint8_t PwdMode);

View file

@ -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 // 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(); LED_A_ON();
uint8_t PwdMode = arg0 & 0xFF;
uint8_t wake = arg0 >> 8;
uint32_t i = 0; uint32_t i = 0;
//clear buffer now so it does not interfere with timing later //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(1);
T55xxWriteBit(0); //Page 0 T55xxWriteBit(0); //Page 0
if (PwdMode == 1){ if (PwdMode || wake){
// Send Pwd // Send Pwd
for (i = 0x80000000; i != 0; i >>= 1) for (i = 0x80000000; i != 0; i >>= 1)
T55xxWriteBit(Pwd & i); T55xxWriteBit(Pwd & i);
} }
// Send a zero bit separation
T55xxWriteBit(0);
// Send Block number // reading a block - send rest of read block cmd else skip for wake command
for (i = 0x04; i != 0; i >>= 1) if (!wake) {
T55xxWriteBit(Block & i); // 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 // Turn field on to read the response
TurnReadLFOn(READ_GAP); TurnReadLFOn(READ_GAP);

View file

@ -121,12 +121,12 @@ static int CmdHelp(const char *Cmd);
int CmdT55xxSetConfig(const char *Cmd) { int CmdT55xxSetConfig(const char *Cmd) {
uint8_t offset = 0; uint8_t offset = 0;
bool errors = FALSE;
uint8_t cmdp = 0;
char modulation[5] = {0x00}; char modulation[5] = {0x00};
char tmp = 0x00; char tmp = 0x00;
uint8_t bitRate = 0; uint8_t bitRate = 0;
uint8_t rates[9] = {8,16,32,40,50,64,100,128,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) while(param_getchar(Cmd, cmdp) != 0x00 && !errors)
{ {
tmp = param_getchar(Cmd, cmdp); tmp = param_getchar(Cmd, cmdp);
@ -220,39 +220,72 @@ int CmdT55xxSetConfig(const char *Cmd) {
} }
int CmdT55xxReadBlock(const char *Cmd) { int CmdT55xxReadBlock(const char *Cmd) {
int block = -1; uint8_t block = 255;
int password = 0xFFFFFFFF; //default to blank Block 7 uint8_t wake = 0;
int override = 0; uint8_t usepwd = 0;
char cmdp = param_getchar(Cmd, 0); uint32_t password = 0xFFFFFFFF; //default to blank Block 7
if (cmdp == 'h' || cmdp == 'H') uint8_t override = 0;
return usage_t55xx_read(); uint8_t cmdp = 0;
bool errors = false;
int res = sscanf(Cmd, "%d %x %d", &block, &password, &override); while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {
switch(param_getchar(Cmd, cmdp)) {
if ( res < 1 || res > 3 ) case 'h':
return usage_t55xx_read(); case 'H':
return usage_t55xx_read();
if ((block < 0) || (block > 7)) { 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"); PrintAndLog("Block must be between 0 and 7");
return 1; return 1;
} }
UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, 0}}; UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, password}};
c.d.asBytes[0] = 0x0;
//Password mode //Password mode
if ( res > 1 ) { if ( usepwd || wake ) {
// try reading the config block and verify that PWD bit is set before doing this! // try reading the config block and verify that PWD bit is set before doing this!
AquireData( CONFIGURATION_BLOCK ); if ( wake || override ) {
if ( !tryDetectModulation() && !override) { c.arg[0] = (wake<<8) & usepwd;
PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits."); if ( !wake && override )
return 1; PrintAndLog("Safety Check Overriden - proceeding despite risk");
} else if (override) {
PrintAndLog("Safety Check Overriden - proceeding despite risk");
c.arg[2] = password;
c.d.asBytes[0] = 0x1;
} else { } 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; //DemodBufferLen=0;
if (!DecodeT55xxBlock()) return 3; if (!DecodeT55xxBlock()) return 3;
char blk[10]={0}; char blk[10]={0};
sprintf(blk,"%d", block); if ( wake ) {
sprintf(blk,"wake");
} else {
sprintf(blk,"%d", block);
}
printT55xxBlock(blk); printT55xxBlock(blk);
return 0; return 0;
} }