mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
add: timeouts for "lf read"
chg: change command consistency "lf t55xx rd" -> "lf t55xx read" chg: buffer size used for armside is quite big. maybe to big. takes too long to read.
This commit is contained in:
parent
b359cee677
commit
68008fb517
4 changed files with 72 additions and 84 deletions
|
@ -72,8 +72,6 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1,
|
||||||
DoAcquisition_config(false);
|
DoAcquisition_config(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* blank r/w tag data stream
|
/* blank r/w tag data stream
|
||||||
...0000000000000000 01111111
|
...0000000000000000 01111111
|
||||||
1010101010101010101010101010101010101010101010101010101010101010
|
1010101010101010101010101010101010101010101010101010101010101010
|
||||||
|
@ -885,11 +883,12 @@ 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(uint32_t Block, uint32_t Pwd, uint8_t PwdMode)
|
||||||
{
|
{
|
||||||
uint8_t *dest = BigBuf_get_addr();
|
|
||||||
//uint16_t bufferlength = BigBuf_max_traceLen();
|
|
||||||
uint16_t bufferlength = T55xx_SAMPLES_SIZE;
|
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
// Clear destination buffer before sending the command 0x80 = average.
|
uint8_t *dest = BigBuf_get_addr();
|
||||||
|
uint16_t bufferlength = BigBuf_max_traceLen();
|
||||||
|
if ( bufferlength > T55xx_SAMPLES_SIZE )
|
||||||
|
bufferlength = T55xx_SAMPLES_SIZE;
|
||||||
|
|
||||||
memset(dest, 0x80, bufferlength);
|
memset(dest, 0x80, bufferlength);
|
||||||
|
|
||||||
// Set up FPGA, 125kHz
|
// Set up FPGA, 125kHz
|
||||||
|
@ -920,7 +919,6 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode)
|
||||||
for(;;) {
|
for(;;) {
|
||||||
if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) {
|
if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) {
|
||||||
AT91C_BASE_SSC->SSC_THR = 0x43;
|
AT91C_BASE_SSC->SSC_THR = 0x43;
|
||||||
//AT91C_BASE_SSC->SSC_THR = 0xff;
|
|
||||||
LED_D_ON();
|
LED_D_ON();
|
||||||
}
|
}
|
||||||
if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) {
|
if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) {
|
||||||
|
@ -938,12 +936,13 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode)
|
||||||
|
|
||||||
// Read card traceability data (page 1)
|
// Read card traceability data (page 1)
|
||||||
void T55xxReadTrace(void){
|
void T55xxReadTrace(void){
|
||||||
uint8_t *dest = BigBuf_get_addr();
|
|
||||||
//uint16_t bufferlength = BigBuf_max_traceLen();
|
|
||||||
uint16_t bufferlength = T55xx_SAMPLES_SIZE;
|
|
||||||
uint32_t i = 0;
|
|
||||||
|
|
||||||
// Clear destination buffer before sending the command 0x80 = average
|
uint32_t i = 0;
|
||||||
|
uint8_t *dest = BigBuf_get_addr();
|
||||||
|
uint16_t bufferlength = BigBuf_max_traceLen();
|
||||||
|
if ( bufferlength > T55xx_SAMPLES_SIZE )
|
||||||
|
bufferlength = T55xx_SAMPLES_SIZE;
|
||||||
|
|
||||||
memset(dest, 0x80, bufferlength);
|
memset(dest, 0x80, bufferlength);
|
||||||
|
|
||||||
LFSetupFPGAForADC(0, true);
|
LFSetupFPGAForADC(0, true);
|
||||||
|
@ -978,7 +977,7 @@ void T55xxReadTrace(void){
|
||||||
}
|
}
|
||||||
|
|
||||||
void TurnReadLFOn(){
|
void TurnReadLFOn(){
|
||||||
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
|
//FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
|
||||||
// Give it a bit of time for the resonant antenna to settle.
|
// Give it a bit of time for the resonant antenna to settle.
|
||||||
//SpinDelay(30);
|
//SpinDelay(30);
|
||||||
|
|
|
@ -489,7 +489,12 @@ int CmdLFRead(const char *Cmd)
|
||||||
//And ship it to device
|
//And ship it to device
|
||||||
UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K};
|
UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K};
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
WaitForResponse(CMD_ACK,NULL);
|
//WaitForResponse(CMD_ACK,NULL);
|
||||||
|
if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
|
||||||
|
PrintAndLog("command execution time out");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,17 +25,17 @@
|
||||||
#define LF_TRACE_BUFF_SIZE 20000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..)
|
#define LF_TRACE_BUFF_SIZE 20000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..)
|
||||||
#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits =
|
#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits =
|
||||||
|
|
||||||
int usage_t55xx_rd(){
|
int usage_t55xx_read(){
|
||||||
PrintAndLog("Usage: lf t55xx rd <block> <password>");
|
PrintAndLog("Usage: lf t55xx read <block> <password>");
|
||||||
PrintAndLog(" <block>, block number to read. Between 0-7");
|
PrintAndLog(" <block>, block number to read. Between 0-7");
|
||||||
PrintAndLog(" <password>, OPTIONAL password (8 hex characters)");
|
PrintAndLog(" <password>, OPTIONAL password (8 hex characters)");
|
||||||
PrintAndLog("");
|
PrintAndLog("");
|
||||||
PrintAndLog(" sample: lf t55xx rd 0 = try reading data from block 0");
|
PrintAndLog(" sample: lf t55xx read 0 = try reading data from block 0");
|
||||||
PrintAndLog(" : lf t55xx rd 0 feedbeef = try reading data from block 0 using password");
|
PrintAndLog(" : lf t55xx read 0 feedbeef = try reading data from block 0 using password");
|
||||||
PrintAndLog("");
|
PrintAndLog("");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int usage_t55xx_wr(){
|
int usage_t55xx_write(){
|
||||||
PrintAndLog("Usage: lf t55xx wr <block> <data> [password]");
|
PrintAndLog("Usage: lf t55xx wr <block> <data> [password]");
|
||||||
PrintAndLog(" <block>, block number to read. Between 0-7");
|
PrintAndLog(" <block>, block number to read. Between 0-7");
|
||||||
PrintAndLog(" <data>, 4 bytes of data to write (8 hex characters)");
|
PrintAndLog(" <data>, 4 bytes of data to write (8 hex characters)");
|
||||||
|
@ -78,23 +78,23 @@ static int CmdHelp(const char *Cmd);
|
||||||
|
|
||||||
int CmdReadBlk(const char *Cmd)
|
int CmdReadBlk(const char *Cmd)
|
||||||
{
|
{
|
||||||
|
int i = 0;
|
||||||
int block = -1;
|
int block = -1;
|
||||||
int password = 0xFFFFFFFF; //default to blank Block 7
|
int password = 0xFFFFFFFF; //default to blank Block 7
|
||||||
size_t bitlen;
|
size_t bitlen = 0;
|
||||||
uint32_t blockData;
|
uint32_t blockData = 0;
|
||||||
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};
|
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};
|
||||||
|
|
||||||
|
|
||||||
char cmdp = param_getchar(Cmd, 0);
|
char cmdp = param_getchar(Cmd, 0);
|
||||||
if (cmdp == 'h' || cmdp == 'H') {
|
if (cmdp == 'h' || cmdp == 'H') {
|
||||||
usage_t55xx_rd();
|
usage_t55xx_read();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int res = sscanf(Cmd, "%d %x", &block, &password);
|
int res = sscanf(Cmd, "%d %x", &block, &password);
|
||||||
|
|
||||||
if ( res < 1 || res > 2 ){
|
if ( res < 1 || res > 2 ){
|
||||||
usage_t55xx_rd();
|
usage_t55xx_read();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,30 +113,39 @@ int CmdReadBlk(const char *Cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
if ( !WaitForResponseTimeout(CMD_ACK,NULL,1500) ) {
|
if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
|
||||||
PrintAndLog("command execution time out");
|
PrintAndLog("command execution time out");
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
CmdSamples("12000");
|
uint8_t got[12000];
|
||||||
|
GetFromBigBuf(got,sizeof(got),0);
|
||||||
|
WaitForResponse(CMD_ACK,NULL);
|
||||||
|
|
||||||
|
setGraphBuf(got, 12000);
|
||||||
|
|
||||||
bitlen = getFromGraphBuf(bits);
|
bitlen = getFromGraphBuf(bits);
|
||||||
|
|
||||||
if ( !tryDemod(bits, bitlen) )
|
int ans = 0;
|
||||||
return 3;
|
ans = CmdFSKrawdemod("");
|
||||||
|
ans = CmdFSKrawdemod("1"); //invert?
|
||||||
|
ans = Cmdaskmandemod("");
|
||||||
|
ans = Cmdaskrawdemod("");
|
||||||
|
ans = CmdNRZrawDemod("");
|
||||||
|
ans = CmdPSK1rawDemod("");
|
||||||
|
ans = CmdPSK2rawDemod("");
|
||||||
|
|
||||||
//move bits back to DemodBuffer
|
// if ( !tryDemod(bits, bitlen) )
|
||||||
setDemodBuf(bits, bitlen, 0);
|
// return 3;
|
||||||
printBitStream(bits, bitlen);
|
|
||||||
|
|
||||||
// // bits has the manchester encoded data.
|
// //move bits back to DemodBuffer
|
||||||
// errCnt = manrawdecode(bits, &bitlen);
|
// setDemodBuf(bits, bitlen, 0);
|
||||||
// if ( errCnt == -1 || bitlen < 32 ){
|
// printBitStream(bits, bitlen);
|
||||||
// PrintAndLog("no data found");
|
if ( !DemodBufferLen)
|
||||||
// if (g_debugMode)
|
return 0;
|
||||||
// PrintAndLog("errCnt: %d, bitlen: %d, clk: %d, invert: %d", errCnt, bitlen, clk, invert);
|
|
||||||
// return 4;
|
for (;i<DemodBufferLen;++i)
|
||||||
// }
|
bits[i]=DemodBuffer[i];
|
||||||
|
|
||||||
blockData = PackBits(1, 32, bits);
|
blockData = PackBits(1, 32, bits);
|
||||||
|
|
||||||
|
@ -219,14 +228,14 @@ int CmdWriteBlk(const char *Cmd)
|
||||||
|
|
||||||
char cmdp = param_getchar(Cmd, 0);
|
char cmdp = param_getchar(Cmd, 0);
|
||||||
if (cmdp == 'h' || cmdp == 'H') {
|
if (cmdp == 'h' || cmdp == 'H') {
|
||||||
usage_t55xx_wr();
|
usage_t55xx_write();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int res = sscanf(Cmd, "%d %x %x",&block, &data, &password);
|
int res = sscanf(Cmd, "%d %x %x",&block, &data, &password);
|
||||||
|
|
||||||
if ( res < 2 || res > 3) {
|
if ( res < 2 || res > 3) {
|
||||||
usage_t55xx_wr();
|
usage_t55xx_write();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,26 +247,23 @@ int CmdWriteBlk(const char *Cmd)
|
||||||
UsbCommand c = {CMD_T55XX_WRITE_BLOCK, {data, block, 0}};
|
UsbCommand c = {CMD_T55XX_WRITE_BLOCK, {data, block, 0}};
|
||||||
c.d.asBytes[0] = 0x0;
|
c.d.asBytes[0] = 0x0;
|
||||||
|
|
||||||
if (res == 2) {
|
PrintAndLog("Writing to T55x7");
|
||||||
PrintAndLog("Writing block %d data %08X", block, data);
|
PrintAndLog("block : %d", block);
|
||||||
} else {
|
PrintAndLog("data : 0x%08X", data);
|
||||||
//Password mode
|
|
||||||
|
//Password mode
|
||||||
|
if (res == 3) {
|
||||||
c.arg[2] = password;
|
c.arg[2] = password;
|
||||||
c.d.asBytes[0] = 0x1;
|
c.d.asBytes[0] = 0x1;
|
||||||
PrintAndLog("Writing block %d data %08X password %08X", block, data, password);
|
PrintAndLog("pwd : 0x%08X", password);
|
||||||
}
|
}
|
||||||
|
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdReadTrace(const char *Cmd)
|
int CmdReadTrace(const char *Cmd)
|
||||||
{
|
{
|
||||||
int invert = 0;
|
|
||||||
int clk = 0;
|
|
||||||
int errCnt;
|
|
||||||
size_t bitlen;
|
size_t bitlen;
|
||||||
int maxErr = 100;
|
|
||||||
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};
|
uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};
|
||||||
|
|
||||||
char cmdp = param_getchar(Cmd, 0);
|
char cmdp = param_getchar(Cmd, 0);
|
||||||
|
@ -271,37 +277,16 @@ int CmdReadTrace(const char *Cmd)
|
||||||
|
|
||||||
UsbCommand c = {CMD_T55XX_READ_TRACE, {0, 0, 0}};
|
UsbCommand c = {CMD_T55XX_READ_TRACE, {0, 0, 0}};
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
WaitForResponse(CMD_ACK, NULL);
|
if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
|
||||||
|
PrintAndLog("command execution time out");
|
||||||
CmdSamples("12000");
|
return 1;
|
||||||
|
}
|
||||||
|
//darn
|
||||||
|
//CmdSamples("12000");
|
||||||
}
|
}
|
||||||
|
|
||||||
bitlen = getFromGraphBuf(bits);
|
bitlen = getFromGraphBuf(bits);
|
||||||
|
|
||||||
//errCnt = askrawdemod(bits, &bitlen, &clk, &invert, maxErr, askAmp);
|
|
||||||
errCnt = askmandemod(bits, &bitlen, &clk, &invert, maxErr);
|
|
||||||
|
|
||||||
//throw away static - allow 1 and -1 (in case of threshold command first)
|
|
||||||
if ( errCnt == -1 || bitlen < 16 ){
|
|
||||||
PrintAndLog("no data found");
|
|
||||||
if (g_debugMode)
|
|
||||||
PrintAndLog("errCnt: %d, bitlen: %d, clk: %d, invert: %d", errCnt, bitlen, clk, invert);
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
if (g_debugMode)
|
|
||||||
PrintAndLog("Using Clock: %d - invert: %d - Bits Found: %d", clk, invert, bitlen);
|
|
||||||
|
|
||||||
//move bits back to DemodBuffer
|
|
||||||
setDemodBuf(bits, bitlen, 0);
|
|
||||||
|
|
||||||
// bits has the manchester encoded data.
|
|
||||||
errCnt = manrawdecode(bits, &bitlen);
|
|
||||||
if ( errCnt == -1 || bitlen < 16 ){
|
|
||||||
PrintAndLog("no data found");
|
|
||||||
if (g_debugMode)
|
|
||||||
PrintAndLog("errCnt: %d, bitlen: %d, clk: %d, invert: %d", errCnt, bitlen, clk, invert);
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
|
|
||||||
|
@ -596,12 +581,11 @@ uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits){
|
||||||
static command_t CommandTable[] =
|
static command_t CommandTable[] =
|
||||||
{
|
{
|
||||||
{"help", CmdHelp, 1, "This help"},
|
{"help", CmdHelp, 1, "This help"},
|
||||||
{"rd", CmdReadBlk, 0, "<block> [password] -- Read T55xx block data (page 0) [optional password]"},
|
{"read", CmdReadBlk, 0, "<block> [password] -- Read T55xx block data (page 0) [optional password]"},
|
||||||
{"wr", CmdWriteBlk, 0, "<block> <data> [password] -- Write T55xx block data (page 0) [optional password]"},
|
{"write", CmdWriteBlk, 0, "<block> <data> [password] -- Write T55xx block data (page 0) [optional password]"},
|
||||||
{"trace", CmdReadTrace, 0, "[1] Read T55xx traceability data (page 1/ blk 0-1)"},
|
{"trace", CmdReadTrace, 0, "[1] Read T55xx traceability data (page 1/ blk 0-1)"},
|
||||||
{"info", CmdInfo, 0, "[1] Read T55xx configuration data (page 0/ blk 0)"},
|
{"info", CmdInfo, 0, "[1] Read T55xx configuration data (page 0/ blk 0)"},
|
||||||
{"dump", CmdDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"},
|
{"dump", CmdDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"},
|
||||||
{"man", CmdIceManchester, 0, "Manchester demod (with SST)"},
|
|
||||||
{NULL, NULL, 0, NULL}
|
{NULL, NULL, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -237,7 +237,7 @@ uint8_t param_get8(const char *line, int paramnum)
|
||||||
uint8_t param_getdec(const char *line, int paramnum, uint8_t *destination)
|
uint8_t param_getdec(const char *line, int paramnum, uint8_t *destination)
|
||||||
{
|
{
|
||||||
uint8_t val = param_get8ex(line, paramnum, 255, 10);
|
uint8_t val = param_get8ex(line, paramnum, 255, 10);
|
||||||
printf("read %i", (int8_t ) val);
|
printf("read %i\n", (int8_t ) val);
|
||||||
if( (int8_t) val == -1) return 1;
|
if( (int8_t) val == -1) return 1;
|
||||||
(*destination) = val;
|
(*destination) = val;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue