mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-19 12:59:44 -07:00
Always enable fast response mode (was enabled for flasher only)
* ensure that CMD_ACK is used exclusively for the very last response of each PM3 operation. All Dbprintf() must be before. * always switch off field before exiting * append null packet for USB transfers % 64 bytes * reformatting and whitespace fixes
This commit is contained in:
parent
b8ed9975e5
commit
929b61c670
17 changed files with 501 additions and 474 deletions
|
|
@ -46,28 +46,28 @@ int CmdHF14AList(const char *Cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int Hf14443_4aGetCardData(iso14a_card_select_t * card) {
|
||||
int Hf14443_4aGetCardData(iso14a_card_select_t *card) {
|
||||
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT, 0, 0}};
|
||||
SendCommand(&c);
|
||||
|
||||
UsbCommand resp;
|
||||
WaitForResponse(CMD_ACK,&resp);
|
||||
WaitForResponse(CMD_NACK, &resp);
|
||||
|
||||
memcpy(card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));
|
||||
|
||||
uint64_t select_status = resp.arg[0]; // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision
|
||||
|
||||
if(select_status == 0) {
|
||||
if (select_status == 0) {
|
||||
PrintAndLog("E->iso14443a card select failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(select_status == 2) {
|
||||
if (select_status == 2) {
|
||||
PrintAndLog("E->Card doesn't support iso14443-4 mode");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(select_status == 3) {
|
||||
if (select_status == 3) {
|
||||
PrintAndLog("E->Card doesn't support standard iso14443-3 anticollision");
|
||||
PrintAndLog("\tATQA : %02x %02x", card->atqa[1], card->atqa[0]);
|
||||
return 1;
|
||||
|
|
@ -156,20 +156,24 @@ int CmdHF14AReader(const char *Cmd) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int CmdHF14AInfo(const char *Cmd)
|
||||
{
|
||||
|
||||
int CmdHF14AInfo(const char *Cmd) {
|
||||
|
||||
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0}};
|
||||
SendCommand(&c);
|
||||
|
||||
UsbCommand resp;
|
||||
WaitForResponse(CMD_ACK,&resp);
|
||||
|
||||
if (!WaitForResponseTimeout(CMD_NACK, &resp, 500)) {
|
||||
if (Cmd[0] != 's') PrintAndLog("Error: No response from Proxmark.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
iso14a_card_select_t card;
|
||||
memcpy(&card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));
|
||||
|
||||
uint64_t select_status = resp.arg[0]; // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision
|
||||
|
||||
if(select_status == 0) {
|
||||
if (select_status == 0) {
|
||||
if (Cmd[0] != 's') PrintAndLog("iso14443a card select failed");
|
||||
// disconnect
|
||||
c.arg[0] = 0;
|
||||
|
|
@ -217,13 +221,13 @@ int CmdHF14AInfo(const char *Cmd)
|
|||
SendCommand(&c);
|
||||
|
||||
UsbCommand resp;
|
||||
WaitForResponse(CMD_ACK,&resp);
|
||||
WaitForResponse(CMD_NACK,&resp);
|
||||
|
||||
memcpy(&card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));
|
||||
|
||||
select_status = resp.arg[0]; // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS
|
||||
|
||||
if(select_status == 0) {
|
||||
if (select_status == 0) {
|
||||
//PrintAndLog("iso14443a card select failed");
|
||||
// disconnect
|
||||
c.arg[0] = 0;
|
||||
|
|
@ -272,7 +276,7 @@ int CmdHF14AInfo(const char *Cmd)
|
|||
|
||||
// Double & triple sized UID, can be mapped to a manufacturer.
|
||||
// HACK: does this apply for Ultralight cards?
|
||||
if ( card.uidlen > 4 ) {
|
||||
if (card.uidlen > 4) {
|
||||
PrintAndLog("MANUFACTURER : %s", getManufacturerName(card.uid[0]));
|
||||
}
|
||||
|
||||
|
|
@ -430,7 +434,7 @@ int CmdHF14AInfo(const char *Cmd)
|
|||
(void)mfCIdentify();
|
||||
|
||||
if (isMifareClassic) {
|
||||
switch(DetectClassicPrng()) {
|
||||
switch (DetectClassicPrng()) {
|
||||
case 0:
|
||||
PrintAndLog("Prng detection: HARDENED (hardnested)");
|
||||
break;
|
||||
|
|
@ -462,7 +466,7 @@ int CmdHF14ACUIDs(const char *Cmd)
|
|||
SendCommand(&c);
|
||||
|
||||
UsbCommand resp;
|
||||
WaitForResponse(CMD_ACK,&resp);
|
||||
WaitForResponse(CMD_NACK,&resp);
|
||||
|
||||
iso14a_card_select_t *card = (iso14a_card_select_t *) resp.d.asBytes;
|
||||
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ int HFiClassReader(bool loop, bool verbose) {
|
|||
|
||||
while (!ukbhit()) {
|
||||
SendCommand(&c);
|
||||
if (WaitForResponseTimeout(CMD_ACK,&resp, 4500)) {
|
||||
if (WaitForResponseTimeout(CMD_ACK, &resp, 1000)) {
|
||||
uint8_t readStatus = resp.arg[0] & 0xff;
|
||||
uint8_t *data = resp.d.asBytes;
|
||||
|
||||
|
|
@ -368,7 +368,8 @@ int HFiClassReader(bool loop, bool verbose) {
|
|||
|
||||
if (tagFound && !loop) return 1;
|
||||
} else {
|
||||
if (verbose) PrintAndLog("Command execute timeout");
|
||||
if (verbose) PrintAndLog("Error: No response from Proxmark.");
|
||||
break;
|
||||
}
|
||||
if (!loop) break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2672,7 +2672,7 @@ int CmdHF14AMfSniff(const char *Cmd){
|
|||
}
|
||||
|
||||
UsbCommand resp;
|
||||
if (WaitForResponseTimeoutW(CMD_ACK, &resp, 2000, false)) {
|
||||
if (WaitForResponseTimeoutW(CMD_UNKNOWN, &resp, 2000, false)) {
|
||||
res = resp.arg[0] & 0xff;
|
||||
uint16_t traceLen = resp.arg[1];
|
||||
len = resp.arg[2];
|
||||
|
|
|
|||
|
|
@ -11,11 +11,12 @@
|
|||
|
||||
#include "comms.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#if defined(__linux__) && !defined(NO_UNLINK)
|
||||
#include <unistd.h> // for unlink()
|
||||
#include <unistd.h> // for unlink()
|
||||
#endif
|
||||
#include "uart.h"
|
||||
#include "ui.h"
|
||||
|
|
@ -33,7 +34,6 @@ static bool offline;
|
|||
|
||||
typedef struct {
|
||||
bool run; // If TRUE, continue running the uart_communication thread
|
||||
bool block_after_ACK; // if true, block after receiving an ACK package
|
||||
} communication_arg_t;
|
||||
|
||||
static communication_arg_t conn;
|
||||
|
|
@ -78,11 +78,11 @@ void SendCommand(UsbCommand *c) {
|
|||
if (offline) {
|
||||
PrintAndLog("Sending bytes to proxmark failed - offline");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&txBufferMutex);
|
||||
/**
|
||||
This causes hangups at times, when the pm3 unit is unresponsive or disconnected. The main console thread is alive,
|
||||
This causes hangups at times, when the pm3 unit is unresponsive or disconnected. The main console thread is alive,
|
||||
but comm thread just spins here. Not good.../holiman
|
||||
**/
|
||||
while (txBuffer_pending) {
|
||||
|
|
@ -183,7 +183,7 @@ static void UsbCommandReceived(UsbCommand *UC)
|
|||
} break;
|
||||
|
||||
default:
|
||||
storeCommand(UC);
|
||||
storeCommand(UC);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -195,21 +195,23 @@ static bool receive_from_serial(serial_port sp, uint8_t *rx_buf, size_t len, siz
|
|||
*received_len = 0;
|
||||
// we eventually need to call uart_receive several times if it times out in the middle of a transfer
|
||||
while (uart_receive(sp, rx_buf + *received_len, len - *received_len, &bytes_read) && bytes_read && *received_len < len) {
|
||||
#ifdef COMMS_DEBUG
|
||||
if (bytes_read != len - *received_len) {
|
||||
printf("uart_receive() returned true but not enough bytes could be received. received: %d, wanted to receive: %d, already received before: %d\n",
|
||||
bytes_read, len - *received_len, *received_len);
|
||||
}
|
||||
#endif
|
||||
*received_len += bytes_read;
|
||||
bytes_read = 0;
|
||||
}
|
||||
return (*received_len == len);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
#ifdef __has_attribute
|
||||
#if __has_attribute(force_align_arg_pointer)
|
||||
__attribute__((force_align_arg_pointer))
|
||||
__attribute__((force_align_arg_pointer))
|
||||
#endif
|
||||
#endif
|
||||
*uart_communication(void *targ) {
|
||||
|
|
@ -231,12 +233,12 @@ __attribute__((force_align_arg_pointer))
|
|||
if (receive_from_serial(sp, prx, bytes_to_read, &rxlen)) {
|
||||
prx += rxlen;
|
||||
if (response->cmd & CMD_VARIABLE_SIZE_FLAG) { // new style response with variable size
|
||||
// printf("received new style response %04" PRIx16 ", datalen = %d, arg[0] = %08" PRIx32 ", arg[1] = %08" PRIx32 ", arg[2] = %08" PRIx32 "\n",
|
||||
// PrintAndLog("received new style response %04" PRIx16 ", datalen = %d, arg[0] = %08" PRIx32 ", arg[1] = %08" PRIx32 ", arg[2] = %08" PRIx32 "\n",
|
||||
// response->cmd, response->datalen, response->arg[0], response->arg[1], response->arg[2]);
|
||||
bytes_to_read = response->datalen;
|
||||
if (receive_from_serial(sp, prx, bytes_to_read, &rxlen)) {
|
||||
UsbCommand resp;
|
||||
resp.cmd = response->cmd & ~CMD_VARIABLE_SIZE_FLAG;
|
||||
resp.cmd = response->cmd & ~CMD_VARIABLE_SIZE_FLAG; // remove the flag
|
||||
resp.arg[0] = response->arg[0];
|
||||
resp.arg[1] = response->arg[1];
|
||||
resp.arg[2] = response->arg[2];
|
||||
|
|
@ -247,9 +249,9 @@ __attribute__((force_align_arg_pointer))
|
|||
}
|
||||
}
|
||||
} else { // old style response uses same data structure as commands. Fixed size.
|
||||
// printf("received old style response %016" PRIx64 ", arg[0] = %016" PRIx64 "\n", command->cmd, command->arg[0]);
|
||||
// PrintAndLog("received old style response %016" PRIx64 ", arg[0] = %016" PRIx64 "\n", command->cmd, command->arg[0]);
|
||||
bytes_to_read = sizeof(UsbCommand) - bytes_to_read;
|
||||
if (receive_from_serial(sp, prx, bytes_to_read, &rxlen)) {
|
||||
if (receive_from_serial(sp, prx, bytes_to_read, &rxlen)) {
|
||||
UsbCommandReceived(command);
|
||||
if (command->cmd == CMD_ACK) {
|
||||
ACK_received = true;
|
||||
|
|
@ -257,26 +259,23 @@ __attribute__((force_align_arg_pointer))
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&txBufferMutex);
|
||||
|
||||
if (conn->block_after_ACK) {
|
||||
// if we just received an ACK, wait here until a new command is to be transmitted
|
||||
if (ACK_received) {
|
||||
while (!txBuffer_pending) {
|
||||
pthread_cond_wait(&txBufferSig, &txBufferMutex);
|
||||
}
|
||||
pthread_mutex_lock(&txBufferMutex);
|
||||
// if we received an ACK the PM has done its job and waits for another command.
|
||||
// We therefore can wait here as well until a new command is to be transmitted.
|
||||
// The advantage is that the next command will be transmitted immediately without the need to wait for a receive timeout
|
||||
if (ACK_received) {
|
||||
while (!txBuffer_pending) {
|
||||
pthread_cond_wait(&txBufferSig, &txBufferMutex);
|
||||
}
|
||||
}
|
||||
|
||||
if(txBuffer_pending) {
|
||||
if (txBuffer_pending) {
|
||||
if (!uart_send(sp, (uint8_t*) &txBuffer, sizeof(UsbCommand))) {
|
||||
PrintAndLog("Sending bytes to proxmark failed");
|
||||
}
|
||||
txBuffer_pending = false;
|
||||
pthread_cond_signal(&txBufferSig); // tell main thread that txBuffer is empty
|
||||
}
|
||||
|
||||
pthread_cond_signal(&txBufferSig); // tell main thread that txBuffer is empty
|
||||
pthread_mutex_unlock(&txBufferMutex);
|
||||
}
|
||||
|
||||
|
|
@ -309,7 +308,7 @@ bool GetFromBigBuf(uint8_t *dest, int bytes, int start_index, UsbCommand *respon
|
|||
uint64_t start_time = msclock();
|
||||
|
||||
UsbCommand resp;
|
||||
if (response == NULL) {
|
||||
if (response == NULL) {
|
||||
response = &resp;
|
||||
}
|
||||
|
||||
|
|
@ -339,7 +338,7 @@ bool GetFromBigBuf(uint8_t *dest, int bytes, int start_index, UsbCommand *respon
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool GetFromFpgaRAM(uint8_t *dest, int bytes)
|
||||
{
|
||||
UsbCommand c = {CMD_HF_PLOT, {0, 0, 0}};
|
||||
|
|
@ -348,7 +347,7 @@ bool GetFromFpgaRAM(uint8_t *dest, int bytes)
|
|||
uint64_t start_time = msclock();
|
||||
|
||||
UsbCommand response;
|
||||
|
||||
|
||||
int bytes_completed = 0;
|
||||
bool show_warning = true;
|
||||
while(true) {
|
||||
|
|
@ -373,7 +372,7 @@ bool GetFromFpgaRAM(uint8_t *dest, int bytes)
|
|||
}
|
||||
|
||||
|
||||
bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode) {
|
||||
bool OpenProxmark(void *port, bool wait_for_port, int timeout) {
|
||||
char *portname = (char *)port;
|
||||
if (!wait_for_port) {
|
||||
sp = uart_open(portname);
|
||||
|
|
@ -405,7 +404,6 @@ bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode)
|
|||
// start the USB communication thread
|
||||
serial_port_name = portname;
|
||||
conn.run = true;
|
||||
conn.block_after_ACK = flash_mode;
|
||||
pthread_create(&USB_communication_thread, NULL, &uart_communication, &conn);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -477,7 +475,7 @@ bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeo
|
|||
|
||||
// Wait until the command is received
|
||||
while (true) {
|
||||
while(getCommand(response)) {
|
||||
while (getCommand(response)) {
|
||||
if (cmd == CMD_UNKNOWN || response->cmd == cmd) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
extern void SetOffline(bool new_offline);
|
||||
extern bool IsOffline();
|
||||
extern bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode);
|
||||
extern bool OpenProxmark(void *port, bool wait_for_port, int timeout);
|
||||
extern void CloseProxmark(void);
|
||||
extern void SendCommand(UsbCommand *c);
|
||||
extern void clearCommandBuffer();
|
||||
|
|
|
|||
|
|
@ -336,7 +336,7 @@ static int enter_bootloader(char *serial_port_name)
|
|||
msleep(100);
|
||||
CloseProxmark();
|
||||
|
||||
bool opened = OpenProxmark(serial_port_name, true, 120, true); // wait for 2 minutes
|
||||
bool opened = OpenProxmark(serial_port_name, true, 120); // wait for 2 minutes
|
||||
if (opened) {
|
||||
fprintf(stderr," Found.\n");
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ int main(int argc, char **argv)
|
|||
|
||||
char* serial_port_name = argv[1];
|
||||
|
||||
if (!OpenProxmark(serial_port_name, true, 120, true)) { // wait for 2 minutes
|
||||
if (!OpenProxmark(serial_port_name, true, 120)) { // wait for 2 minutes
|
||||
fprintf(stderr, "Could not find Proxmark on %s.\n\n", serial_port_name);
|
||||
return -1;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -1164,7 +1164,7 @@ int DetectClassicPrng(void){
|
|||
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) {
|
||||
if (!WaitForResponseTimeout(CMD_NACK, &resp, 2000)) {
|
||||
PrintAndLog("PRNG UID: Reply timeout.");
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -286,7 +286,7 @@ int main(int argc, char* argv[]) {
|
|||
set_my_executable_path();
|
||||
|
||||
// try to open USB connection to Proxmark
|
||||
usb_present = OpenProxmark(argv[1], waitCOMPort, 20, false);
|
||||
usb_present = OpenProxmark(argv[1], waitCOMPort, 20);
|
||||
|
||||
#ifdef HAVE_GUI
|
||||
#ifdef _WIN32
|
||||
|
|
@ -309,8 +309,10 @@ int main(int argc, char* argv[]) {
|
|||
main_loop(script_cmds_file, script_cmd, usb_present);
|
||||
#endif
|
||||
|
||||
// Clean up the port
|
||||
// Switch off field and clean up the port
|
||||
if (usb_present) {
|
||||
UsbCommand c = {CMD_FPGA_MAJOR_MODE_OFF};
|
||||
SendCommand(&c);
|
||||
CloseProxmark();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue