Make sure standalone modes can be launched when connected on USB without client

This commit is contained in:
Philippe Teuwen 2019-06-02 23:20:02 +02:00
commit d7614684f8
6 changed files with 72 additions and 35 deletions

View file

@ -436,7 +436,7 @@ void SendCapabilities(void) {
capabilities_t capabilities; capabilities_t capabilities;
capabilities.version = CAPABILITIES_VERSION; capabilities.version = CAPABILITIES_VERSION;
capabilities.via_fpc = reply_via_fpc; capabilities.via_fpc = reply_via_fpc;
capabilities.via_usb = reply_via_usb;
capabilities.baudrate = 0; // no real baudrate for USB-CDC capabilities.baudrate = 0; // no real baudrate for USB-CDC
#ifdef WITH_FPC_USART #ifdef WITH_FPC_USART
if (reply_via_fpc) if (reply_via_fpc)
@ -742,6 +742,10 @@ static void PacketReceived(PacketCommandNG *packet) {
*/ */
switch (packet->cmd) { switch (packet->cmd) {
case CMD_QUIT_SESSION:
reply_via_fpc = false;
reply_via_usb = false;
break;
#ifdef WITH_LF #ifdef WITH_LF
case CMD_SET_LF_T55XX_CONFIG: case CMD_SET_LF_T55XX_CONFIG:
setT55xxConfig(packet->oldarg[0], (t55xx_config *) packet->data.asBytes); setT55xxConfig(packet->oldarg[0], (t55xx_config *) packet->data.asBytes);

View file

@ -211,6 +211,10 @@ main_loop(char *script_cmds_file, char *script_cmd) {
} }
} // end while } // end while
clearCommandBuffer();
SendCommandNG(CMD_QUIT_SESSION, NULL, 0);
msleep(100); // Make sure command is sent before killing client
if (sf) if (sf)
fclose(sf); fclose(sf);

View file

@ -37,15 +37,7 @@ bool reply_with_crc_on_usb = false;
bool reply_with_crc_on_fpc = true; bool reply_with_crc_on_fpc = true;
// "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART // "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART
bool reply_via_fpc = false; bool reply_via_fpc = false;
bool reply_via_usb = false;
#ifdef WITH_FPC_USART_HOST
extern void Dbprintf(const char *fmt, ...);
#define Dbprintf_usb(...) {\
bool tmp = reply_via_fpc;\
reply_via_fpc = false;\
Dbprintf(__VA_ARGS__);\
reply_via_fpc = tmp;}
#endif
int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) { int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) {
PacketResponseOLD txcmd; PacketResponseOLD txcmd;
@ -67,20 +59,25 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d
} }
} }
int result = PM3_EUNDEF; int resultfpc = PM3_EUNDEF;
int resultusb = PM3_EUNDEF;
// Send frame and make sure all bytes are transmitted // Send frame and make sure all bytes are transmitted
if (reply_via_usb) {
resultusb = usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD));
}
if (reply_via_fpc) { if (reply_via_fpc) {
#ifdef WITH_FPC_USART_HOST #ifdef WITH_FPC_USART_HOST
result = usart_writebuffer_sync((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); resultfpc = usart_writebuffer_sync((uint8_t *)&txcmd, sizeof(PacketResponseOLD));
#else #else
return PM3_EDEVNOTSUPP; return PM3_EDEVNOTSUPP;
#endif #endif
} else {
result = usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD));
} }
// we got two results, let's prioritize the faulty one and USB over FPC.
return result; if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb;
if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc;
return PM3_SUCCESS;
} }
static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t len, bool ng) { static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t len, bool ng) {
@ -107,7 +104,8 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t
} }
PacketResponseNGPostamble *tx_post = (PacketResponseNGPostamble *)((uint8_t *)&txBufferNG + sizeof(PacketResponseNGPreamble) + len); PacketResponseNGPostamble *tx_post = (PacketResponseNGPostamble *)((uint8_t *)&txBufferNG + sizeof(PacketResponseNGPreamble) + len);
if ((reply_via_fpc && reply_with_crc_on_fpc) || ((!reply_via_fpc) && reply_with_crc_on_usb)) { // Note: if we send to both FPC & USB, we'll set CRC for both if any of them require CRC
if ((reply_via_fpc && reply_with_crc_on_fpc) || ((reply_via_usb) && reply_with_crc_on_usb)) {
uint8_t first, second; uint8_t first, second;
compute_crc(CRC_14443_A, (uint8_t *)&txBufferNG, sizeof(PacketResponseNGPreamble) + len, &first, &second); compute_crc(CRC_14443_A, (uint8_t *)&txBufferNG, sizeof(PacketResponseNGPreamble) + len, &first, &second);
tx_post->crc = (first << 8) + second; tx_post->crc = (first << 8) + second;
@ -116,19 +114,24 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t
} }
txBufferNGLen = sizeof(PacketResponseNGPreamble) + len + sizeof(PacketResponseNGPostamble); txBufferNGLen = sizeof(PacketResponseNGPreamble) + len + sizeof(PacketResponseNGPostamble);
int result = PM3_EUNDEF; int resultfpc = PM3_EUNDEF;
int resultusb = PM3_EUNDEF;
// Send frame and make sure all bytes are transmitted // Send frame and make sure all bytes are transmitted
if (reply_via_usb) {
resultusb = usb_write((uint8_t *)&txBufferNG, txBufferNGLen);
}
if (reply_via_fpc) { if (reply_via_fpc) {
#ifdef WITH_FPC_USART_HOST #ifdef WITH_FPC_USART_HOST
result = usart_writebuffer_sync((uint8_t *)&txBufferNG, txBufferNGLen); resultfpc = usart_writebuffer_sync((uint8_t *)&txBufferNG, txBufferNGLen);
#else #else
return PM3_EDEVNOTSUPP; return PM3_EDEVNOTSUPP;
#endif #endif
} else {
result = usb_write((uint8_t *)&txBufferNG, txBufferNGLen);
} }
return result; // we got two results, let's prioritize the faulty one and USB over FPC.
if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb;
if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc;
return PM3_SUCCESS;
} }
int reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len) { int reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len) {
@ -150,7 +153,7 @@ int reply_mix(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d
return reply_ng_internal(cmd, status, cmddata, len + sizeof(arg), false); return reply_ng_internal(cmd, status, cmddata, len + sizeof(arg), false);
} }
static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *data, size_t len), bool fpc) { static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *data, size_t len), bool usb, bool fpc) {
PacketCommandNGRaw rx_raw; PacketCommandNGRaw rx_raw;
size_t bytes = read_ng((uint8_t *)&rx_raw.pre, sizeof(PacketCommandNGPreamble)); size_t bytes = read_ng((uint8_t *)&rx_raw.pre, sizeof(PacketCommandNGPreamble));
@ -202,6 +205,7 @@ static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *da
if ((first << 8) + second != rx->crc) if ((first << 8) + second != rx->crc)
return PM3_EIO; return PM3_EIO;
} }
reply_via_usb = usb;
reply_via_fpc = fpc; reply_via_fpc = fpc;
} else { // Old style command } else { // Old style command
PacketCommandOLD rx_old; PacketCommandOLD rx_old;
@ -210,6 +214,7 @@ static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *da
if (bytes != sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble)) if (bytes != sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble))
return PM3_EIO; return PM3_EIO;
reply_via_usb = usb;
reply_via_fpc = fpc; reply_via_fpc = fpc;
rx->ng = false; rx->ng = false;
rx->magic = 0; rx->magic = 0;
@ -228,12 +233,12 @@ int receive_ng(PacketCommandNG *rx) {
// Check if there is a packet available // Check if there is a packet available
if (usb_poll_validate_length()) if (usb_poll_validate_length())
return receive_ng_internal(rx, usb_read_ng, false); return receive_ng_internal(rx, usb_read_ng, true, false);
#ifdef WITH_FPC_USART_HOST #ifdef WITH_FPC_USART_HOST
// Check if there is a FPC packet available // Check if there is a FPC packet available
if (usart_rxdata_available() > 0) if (usart_rxdata_available() > 0)
return receive_ng_internal(rx, usart_read_ng, true); return receive_ng_internal(rx, usart_read_ng, false, true);
#endif #endif
return PM3_ENODATA; return PM3_ENODATA;
} }

View file

@ -47,8 +47,37 @@ int receive_ng(PacketCommandNG *rx);
// Flags to tell where to add CRC on sent replies // Flags to tell where to add CRC on sent replies
extern bool reply_with_crc_on_usb; extern bool reply_with_crc_on_usb;
extern bool reply_with_crc_on_fpc; extern bool reply_with_crc_on_fpc;
// "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART // "Session" flag, to tell via which interface next msgs should be sent: USB and/or FPC USART
extern bool reply_via_fpc; extern bool reply_via_fpc;
extern bool reply_via_usb;
extern void Dbprintf(const char *fmt, ...);
#define Dbprintf_usb(...) {\
bool tmpfpc = reply_via_fpc;\
bool tmpusb = reply_via_usb;\
reply_via_fpc = false;\
reply_via_usb = true;\
Dbprintf(__VA_ARGS__);\
reply_via_fpc = tmpfpc;\
reply_via_usb = tmpusb;}
#define Dbprintf_fpc(...) {\
bool tmpfpc = reply_via_fpc;\
bool tmpusb = reply_via_usb;\
reply_via_fpc = true;\
reply_via_usb = false;\
Dbprintf(__VA_ARGS__);\
reply_via_fpc = tmpfpc;\
reply_via_usb = tmpusb;}
#define Dbprintf_all(...) {\
bool tmpfpc = reply_via_fpc;\
bool tmpusb = reply_via_usb;\
reply_via_fpc = true;\
reply_via_usb = true;\
Dbprintf(__VA_ARGS__);\
reply_via_fpc = tmpfpc;\
reply_via_usb = tmpusb;}
#endif // _PROXMARK_CMD_H_ #endif // _PROXMARK_CMD_H_

View file

@ -8,6 +8,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// The main USART code, for serial communications over FPC connector // The main USART code, for serial communications over FPC connector
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "cmd.h"
#include "usart.h" #include "usart.h"
#include "string.h" #include "string.h"
#include "../armsrc/ticks.h" // startcountus #include "../armsrc/ticks.h" // startcountus
@ -109,14 +110,6 @@ uint16_t usart_rxdata_available(void) {
return sizeof(us_rxfifo) - us_rxfifo_low + us_rxfifo_high; return sizeof(us_rxfifo) - us_rxfifo_low + us_rxfifo_high;
} }
extern bool reply_via_fpc;
extern void Dbprintf(const char *fmt, ...);
#define Dbprintf_usb(...) {\
bool tmp = reply_via_fpc;\
reply_via_fpc = false;\
Dbprintf(__VA_ARGS__);\
reply_via_fpc = tmp;}
uint32_t usart_read_ng(uint8_t *data, size_t len) { uint32_t usart_read_ng(uint8_t *data, size_t len) {
if (len == 0) return 0; if (len == 0) return 0;
uint32_t packetSize, nbBytesRcv = 0; uint32_t packetSize, nbBytesRcv = 0;

View file

@ -141,6 +141,7 @@ typedef struct {
uint8_t version; uint8_t version;
uint32_t baudrate; uint32_t baudrate;
bool via_fpc : 1; bool via_fpc : 1;
bool via_usb : 1;
// rdv4 // rdv4
bool compiled_with_flash : 1; bool compiled_with_flash : 1;
bool compiled_with_smartcard : 1; bool compiled_with_smartcard : 1;
@ -165,7 +166,7 @@ typedef struct {
bool hw_available_flash : 1; bool hw_available_flash : 1;
bool hw_available_smartcard : 1; bool hw_available_smartcard : 1;
} PACKED capabilities_t; } PACKED capabilities_t;
#define CAPABILITIES_VERSION 1 #define CAPABILITIES_VERSION 2
extern capabilities_t pm3_capabilities; extern capabilities_t pm3_capabilities;
// For CMD_T55XX_WRITE_BLOCK // For CMD_T55XX_WRITE_BLOCK
@ -232,6 +233,7 @@ typedef struct {
#define CMD_DOWNLOAD_EML_BIGBUF 0x0110 #define CMD_DOWNLOAD_EML_BIGBUF 0x0110
#define CMD_DOWNLOADED_EML_BIGBUF 0x0111 #define CMD_DOWNLOADED_EML_BIGBUF 0x0111
#define CMD_CAPABILITIES 0x0112 #define CMD_CAPABILITIES 0x0112
#define CMD_QUIT_SESSION 0x0113
// RDV40, Flash memory operations // RDV40, Flash memory operations
#define CMD_FLASHMEM_READ 0x0120 #define CMD_FLASHMEM_READ 0x0120