From c867b3bc9a67a674dcc1ff9e8fa3205e7ce1f168 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 8 May 2019 01:24:46 +0200 Subject: [PATCH] Add cmd: usart btpin to change add-on BT PIN --- client/cmdparser.c | 9 +++++ client/cmdparser.h | 1 + client/cmdusart.c | 91 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 94 insertions(+), 7 deletions(-) diff --git a/client/cmdparser.c b/client/cmdparser.c index 5a40538e7..077ba8ac5 100644 --- a/client/cmdparser.c +++ b/client/cmdparser.c @@ -55,6 +55,15 @@ bool IfPm3FpcUsartHost(void) { return pm3_capabilities.compiled_with_fpc_usart_host; } +bool IfPm3FpcUsartHostFromUsb(void) { + // true if FPC USART Host support and if talking from USB-CDC interface + if (!IfPm3Present()) + return false; + if (!pm3_capabilities.compiled_with_fpc_usart_host) + return false; + return !conn.send_via_fpc_usart; +} + bool IfPm3FpcUsartDevFromUsb(void) { // true if FPC USART developer support and if talking from USB-CDC interface if (!IfPm3Present()) diff --git a/client/cmdparser.h b/client/cmdparser.h index 8f58abeb8..c5aa5460e 100644 --- a/client/cmdparser.h +++ b/client/cmdparser.h @@ -26,6 +26,7 @@ bool IfPm3Flash(void); bool IfPm3Smartcard(void); bool IfPm3FpcUsart(void); bool IfPm3FpcUsartHost(void); +bool IfPm3FpcUsartHostFromUsb(void); bool IfPm3FpcUsartDevFromUsb(void); bool IfPm3Lf(void); bool IfPm3Hitag(void); diff --git a/client/cmdusart.c b/client/cmdusart.c index 8a328e2cb..309ca3cf1 100644 --- a/client/cmdusart.c +++ b/client/cmdusart.c @@ -11,6 +11,24 @@ static int CmdHelp(const char *Cmd); +static int usage_usart_bt_pin(void) { + PrintAndLogEx(NORMAL, "Change BT add-on PIN"); + PrintAndLogEx(NORMAL, "WARNING: this requires"); + PrintAndLogEx(NORMAL, " 1) BTpower to be turned ON"); + PrintAndLogEx(NORMAL, " 2) BT add-on to NOT be connected"); + PrintAndLogEx(NORMAL, " => the blue LED must blink"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Usage: usart btpin [h] d NNNN"); + PrintAndLogEx(NORMAL, "Options:"); + PrintAndLogEx(NORMAL, " h This help"); + PrintAndLogEx(NORMAL, " d NNNN Desired PIN"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Example:"); + PrintAndLogEx(NORMAL, " usart btpin 1234"); + PrintAndLogEx(NORMAL, "expected output: nothing"); + return PM3_SUCCESS; +} + static int usage_usart_tx(void) { PrintAndLogEx(NORMAL, "Send string over USART"); PrintAndLogEx(NORMAL, "WARNING: it will have side-effects if used in USART HOST mode!"); @@ -133,6 +151,64 @@ static int usart_txrx(uint8_t *srcdata, size_t srclen, uint8_t *dstdata, size_t return resp.status; } +static int CmdUsartBtPin(const char *Cmd) { + uint8_t cmdp = 0; + bool errors = false; + char pin[5] = {0}; + + while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { + switch (tolower(param_getchar(Cmd, cmdp))) { + case 'h': + return usage_usart_bt_pin(); + case 'd': + if (param_getstr(Cmd, cmdp + 1, pin, sizeof(pin)) != sizeof(pin)-1) { + PrintAndLogEx(FAILED, "PIN has wrong length, must be 4 digits"); + errors = true; + break; + } + for (size_t i = 0; i < sizeof(pin) - 1; i++) { + if ((pin[i] < '0') || (pin[i] > '9')) { + PrintAndLogEx(FAILED, "PIN has wrong char \"%c\", must be 4 digits", pin[i]); + errors = true; + break; + } + } + cmdp += 2; + break; + default: + PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); + errors = true; + break; + } + } + //Validations + if (errors || cmdp == 0) { + usage_usart_bt_pin(); + return PM3_EINVARG; + } + char string[6 + sizeof(pin)] = {0}; + sprintf(string, "AT+PIN%s", pin); + uint8_t data[PM3_CMD_DATA_SIZE] = {0x00}; + size_t len = 0; +// PrintAndLogEx(NORMAL, "TX (%3u):%.*s", strlen(string), strlen(string), string); + int ret = usart_txrx((uint8_t *)string, strlen(string), data, &len, 600); + if (ret == PM3_ENODATA) { + PrintAndLogEx(FAILED, "No response from add-on, is it ON and blinking?"); + return ret; + } + if (ret != PM3_SUCCESS) { + PrintAndLogEx(FAILED, "Command failed, ret=%i", ret); + return ret; + } +// PrintAndLogEx(NORMAL, "RX (%3u):%.*s", len, len, data); + if (strcmp((char*)data, "OKsetPIN") == 0) { + PrintAndLogEx(NORMAL, "PIN changed " _GREEN_("successfully")); + } else { + PrintAndLogEx(WARNING, "Unexpected answer: %.*s", len, data); + } + return PM3_SUCCESS; +} + static int CmdUsartTX(const char *Cmd) { uint8_t cmdp = 0; bool errors = false; @@ -352,13 +428,14 @@ static int CmdUsartRXhex(const char *Cmd) { } static command_t CommandTable[] = { - {"help", CmdHelp, AlwaysAvailable, "This help"}, - {"tx", CmdUsartTX, IfPm3FpcUsartDevFromUsb, "Send string over USART"}, - {"rx", CmdUsartRX, IfPm3FpcUsartDevFromUsb, "Receive string over USART"}, - {"txrx", CmdUsartTXRX, IfPm3FpcUsartDevFromUsb, "Send string over USART and wait for response"}, - {"txhex", CmdUsartTXhex, IfPm3FpcUsartDevFromUsb, "Send bytes over USART"}, - {"rxhex", CmdUsartRXhex, IfPm3FpcUsartDevFromUsb, "Receive bytes over USART"}, -// {"bridge", CmdUsartBridge, IfPm3FpcUsartDevFromUsb, "Bridge USB-CDC & USART"}, + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"btpin", CmdUsartBtPin, IfPm3FpcUsartHostFromUsb, "Change BT add-on PIN"}, + {"tx", CmdUsartTX, IfPm3FpcUsartDevFromUsb, "Send string over USART"}, + {"rx", CmdUsartRX, IfPm3FpcUsartDevFromUsb, "Receive string over USART"}, + {"txrx", CmdUsartTXRX, IfPm3FpcUsartDevFromUsb, "Send string over USART and wait for response"}, + {"txhex", CmdUsartTXhex, IfPm3FpcUsartDevFromUsb, "Send bytes over USART"}, + {"rxhex", CmdUsartRXhex, IfPm3FpcUsartDevFromUsb, "Receive bytes over USART"}, +// {"bridge", CmdUsartBridge, IfPm3FpcUsartDevFromUsb, "Bridge USB-CDC & USART"}, {NULL, NULL, NULL, NULL} };