mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-04-06 04:20:38 +08:00
ADD: Jonor's timeout patch for "Hf 14a raw".
minor code clean up
This commit is contained in:
parent
b5be31f996
commit
79bf1ad2cc
2 changed files with 35 additions and 12 deletions
client
|
@ -342,8 +342,7 @@ uint16_t printTraceLine(uint16_t tracepos, uint8_t* trace, bool iclass, bool sho
|
||||||
// Rough guess that this is a command from the reader
|
// Rough guess that this is a command from the reader
|
||||||
// For iClass the command byte is not part of the CRC
|
// For iClass the command byte is not part of the CRC
|
||||||
ComputeCrc14443(CRC_ICLASS, &frame[1], data_len-3, &b1, &b2);
|
ComputeCrc14443(CRC_ICLASS, &frame[1], data_len-3, &b1, &b2);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// For other data.. CRC might not be applicable (UPDATE commands etc.)
|
// For other data.. CRC might not be applicable (UPDATE commands etc.)
|
||||||
ComputeCrc14443(CRC_ICLASS, frame, data_len-2, &b1, &b2);
|
ComputeCrc14443(CRC_ICLASS, frame, data_len-2, &b1, &b2);
|
||||||
}
|
}
|
||||||
|
@ -363,7 +362,6 @@ uint16_t printTraceLine(uint16_t tracepos, uint8_t* trace, bool iclass, bool sho
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
char *crc = crcError ? "!crc" :" ";
|
char *crc = crcError ? "!crc" :" ";
|
||||||
|
|
||||||
|
@ -371,8 +369,10 @@ uint16_t printTraceLine(uint16_t tracepos, uint8_t* trace, bool iclass, bool sho
|
||||||
|
|
||||||
if(!isResponse)
|
if(!isResponse)
|
||||||
{
|
{
|
||||||
if(iclass) annotateIclass(explanation,sizeof(explanation),frame,data_len);
|
if(iclass)
|
||||||
else annotateIso14443a(explanation,sizeof(explanation),frame,data_len);
|
annotateIclass(explanation,sizeof(explanation),frame,data_len);
|
||||||
|
else
|
||||||
|
annotateIso14443a(explanation,sizeof(explanation),frame,data_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int num_lines = (data_len - 1)/16 + 1;
|
int num_lines = (data_len - 1)/16 + 1;
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
static int CmdHelp(const char *Cmd);
|
static int CmdHelp(const char *Cmd);
|
||||||
static void waitCmd(uint8_t iLen);
|
static void waitCmd(uint8_t iLen);
|
||||||
|
|
||||||
|
|
||||||
// structure and database for uid -> tagtype lookups
|
// structure and database for uid -> tagtype lookups
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t uid;
|
uint8_t uid;
|
||||||
|
@ -515,19 +514,22 @@ int CmdHF14ACmdRaw(const char *cmd) {
|
||||||
uint8_t active=0;
|
uint8_t active=0;
|
||||||
uint8_t active_select=0;
|
uint8_t active_select=0;
|
||||||
uint16_t numbits=0;
|
uint16_t numbits=0;
|
||||||
|
uint16_t timeout=0;
|
||||||
|
uint8_t bTimeout=0;
|
||||||
char buf[5]="";
|
char buf[5]="";
|
||||||
int i=0;
|
int i=0;
|
||||||
uint8_t data[100];
|
uint8_t data[USB_CMD_DATA_SIZE];
|
||||||
unsigned int datalen=0, temp;
|
unsigned int datalen=0, temp;
|
||||||
|
|
||||||
if (strlen(cmd)<2) {
|
if (strlen(cmd)<2) {
|
||||||
PrintAndLog("Usage: hf 14a raw [-r] [-c] [-p] [-f] [-b] <number of bits> <0A 0B 0C ... hex>");
|
PrintAndLog("Usage: hf 14a raw [-r] [-c] [-p] [-f] [-b] [-t] <number of bits> <0A 0B 0C ... hex>");
|
||||||
PrintAndLog(" -r do not read response");
|
PrintAndLog(" -r do not read response");
|
||||||
PrintAndLog(" -c calculate and append CRC");
|
PrintAndLog(" -c calculate and append CRC");
|
||||||
PrintAndLog(" -p leave the signal field ON after receive");
|
PrintAndLog(" -p leave the signal field ON after receive");
|
||||||
PrintAndLog(" -a active signal field ON without select");
|
PrintAndLog(" -a active signal field ON without select");
|
||||||
PrintAndLog(" -s active signal field ON with select");
|
PrintAndLog(" -s active signal field ON with select");
|
||||||
PrintAndLog(" -b number of bits to send. Useful for send partial byte");
|
PrintAndLog(" -b number of bits to send. Useful for send partial byte");
|
||||||
|
PrintAndLog(" -t timeout");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -560,6 +562,14 @@ int CmdHF14ACmdRaw(const char *cmd) {
|
||||||
while(cmd[i]!=' ' && cmd[i]!='\0') { i++; }
|
while(cmd[i]!=' ' && cmd[i]!='\0') { i++; }
|
||||||
i-=2;
|
i-=2;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
bTimeout=1;
|
||||||
|
sscanf(cmd+i+2,"%d",&temp);
|
||||||
|
timeout = temp & 0xFFFF;
|
||||||
|
i+=3;
|
||||||
|
while(cmd[i]!=' ' && cmd[i]!='\0') { i++; }
|
||||||
|
i+=2;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
PrintAndLog("Invalid option");
|
PrintAndLog("Invalid option");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -577,15 +587,19 @@ int CmdHF14ACmdRaw(const char *cmd) {
|
||||||
if (strlen(buf)>=2) {
|
if (strlen(buf)>=2) {
|
||||||
sscanf(buf,"%x",&temp);
|
sscanf(buf,"%x",&temp);
|
||||||
data[datalen]=(uint8_t)(temp & 0xff);
|
data[datalen]=(uint8_t)(temp & 0xff);
|
||||||
datalen++;
|
|
||||||
*buf=0;
|
*buf=0;
|
||||||
|
if (++datalen>sizeof(data)){
|
||||||
|
if (crc)
|
||||||
|
PrintAndLog("Buffer is full, we can't add CRC to your data");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
PrintAndLog("Invalid char on input");
|
PrintAndLog("Invalid char on input");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(crc && datalen>0)
|
if(crc && datalen>0 && datalen<sizeof(data)-2)
|
||||||
{
|
{
|
||||||
uint8_t first, second;
|
uint8_t first, second;
|
||||||
ComputeCrc14443(CRC_14443_A, data, datalen, &first, &second);
|
ComputeCrc14443(CRC_14443_A, data, datalen, &first, &second);
|
||||||
|
@ -599,13 +613,22 @@ int CmdHF14ACmdRaw(const char *cmd) {
|
||||||
if(active)
|
if(active)
|
||||||
c.arg[0] |= ISO14A_NO_SELECT;
|
c.arg[0] |= ISO14A_NO_SELECT;
|
||||||
}
|
}
|
||||||
|
if(bTimeout){
|
||||||
|
#define MAX_TIMEOUT 624*105 // max timeout is 624 ms
|
||||||
|
c.arg[0] |= ISO14A_SET_TIMEOUT;
|
||||||
|
c.arg[2] = timeout * 105; // each bit is about 9.4 us
|
||||||
|
if(c.arg[2]>MAX_TIMEOUT) {
|
||||||
|
c.arg[2] = MAX_TIMEOUT;
|
||||||
|
PrintAndLog("Set timeout to 624 ms. The max we can wait for response");
|
||||||
|
}
|
||||||
|
}
|
||||||
if(power)
|
if(power)
|
||||||
c.arg[0] |= ISO14A_NO_DISCONNECT;
|
c.arg[0] |= ISO14A_NO_DISCONNECT;
|
||||||
if(datalen>0)
|
if(datalen>0)
|
||||||
c.arg[0] |= ISO14A_RAW;
|
c.arg[0] |= ISO14A_RAW;
|
||||||
|
|
||||||
c.arg[1] = datalen;
|
// Max buffer is USB_CMD_DATA_SIZE
|
||||||
c.arg[2] = numbits;
|
c.arg[1] = (datalen & 0xFFFF) | (numbits << 16);
|
||||||
memcpy(c.d.asBytes,data,datalen);
|
memcpy(c.d.asBytes,data,datalen);
|
||||||
|
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
|
|
Loading…
Add table
Reference in a new issue