From 9c1d59ce6978e43b9626b008692d6eac1cf67423 Mon Sep 17 00:00:00 2001 From: "Malte F. Hillmann" Date: Wed, 27 Mar 2019 14:04:01 +0100 Subject: [PATCH 1/5] fixed bug in CmdBiphaseDecodeRaw() --- client/cmddata.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/client/cmddata.c b/client/cmddata.c index c4f0e8a3..fd31fac4 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -367,18 +367,20 @@ int Cmdmandecoderaw(const char *Cmd) return 1; } -//by marshmellow -//biphase decode -//take 01 or 10 = 0 and 11 or 00 = 1 -//takes 2 arguments "offset" default = 0 if 1 it will shift the decode by one bit -// and "invert" default = 0 if 1 it will invert output -// the argument offset allows us to manually shift if the output is incorrect - [EDIT: now auto detects] +/** + * @author marshmellow + * biphase decode + * decdoes 01 or 10 to 0 and 11 or 00 to 1 + * param offset adjust start position + * param invert invert output + * param maxErr maximum tolerated errors + */ int CmdBiphaseDecodeRaw(const char *Cmd) { size_t size=0; int offset=0, invert=0, maxErr=20, errCnt=0; char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') { + if (strlen(Cmd) > 5 || cmdp == 'h' || cmdp == 'H') { PrintAndLog("Usage: data biphaserawdecode [offset] [invert] [maxErr]"); PrintAndLog(" Converts 10 or 01 to 1 and 11 or 00 to 0"); PrintAndLog(" --must have binary sequence in demodbuffer (run data askrawdemod first)"); From 7361a18f7a24a7b0dd6e76919ef389202543cdc5 Mon Sep 17 00:00:00 2001 From: "Malte F. Hillmann" Date: Wed, 27 Mar 2019 14:34:42 +0100 Subject: [PATCH 2/5] fixed bug in ASKbiphaseDemod() --- client/cmddata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/cmddata.c b/client/cmddata.c index fd31fac4..30148163 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -429,7 +429,7 @@ int CmdBiphaseDecodeRaw(const char *Cmd) int ASKbiphaseDemod(const char *Cmd, bool verbose) { //ask raw demod GraphBuffer first - int offset=0, clk=0, invert=0, maxErr=0; + int offset=0, clk=0, invert=0, maxErr=100; sscanf(Cmd, "%i %i %i %i", &offset, &clk, &invert, &maxErr); uint8_t BitStream[MAX_GRAPH_TRACE_LEN]; From 4306de82770fb4e7e033e03996710d3c50f699f7 Mon Sep 17 00:00:00 2001 From: "Malte F. Hillmann" Date: Wed, 27 Mar 2019 14:36:39 +0100 Subject: [PATCH 3/5] fixed bug in CmdFdxDemod --- client/cmdlffdx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/cmdlffdx.c b/client/cmdlffdx.c index 20f834ce..5677c79d 100644 --- a/client/cmdlffdx.c +++ b/client/cmdlffdx.c @@ -137,7 +137,7 @@ int CmdFdxDemod(const char *Cmd){ //Differential Biphase / di-phase (inverted biphase) //get binary from ask wave - if (!ASKbiphaseDemod("0 32 1 0", false)) { + if (!ASKbiphaseDemod("0 32 1 100", false)) { if (g_debugMode) PrintAndLog("DEBUG: Error - FDX-B ASKbiphaseDemod failed"); return 0; } From 3f306c6ded0e995a7150de7d4168ca689e09868f Mon Sep 17 00:00:00 2001 From: "Malte F. Hillmann" Date: Thu, 28 Mar 2019 22:40:29 +0100 Subject: [PATCH 4/5] Bugfixes for LF FDX Changed CmdBiphaseDecodeRaw to allow 7 digits Changed CmdFdxRead to read 39999 samples instead of 10000 to improve reading from small tags --- client/cmddata.c | 2 +- client/cmdlffdx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/cmddata.c b/client/cmddata.c index 30148163..8f93ba17 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -380,7 +380,7 @@ int CmdBiphaseDecodeRaw(const char *Cmd) size_t size=0; int offset=0, invert=0, maxErr=20, errCnt=0; char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) > 5 || cmdp == 'h' || cmdp == 'H') { + if (strlen(Cmd) > 7 || cmdp == 'h' || cmdp == 'H') { PrintAndLog("Usage: data biphaserawdecode [offset] [invert] [maxErr]"); PrintAndLog(" Converts 10 or 01 to 1 and 11 or 00 to 0"); PrintAndLog(" --must have binary sequence in demodbuffer (run data askrawdemod first)"); diff --git a/client/cmdlffdx.c b/client/cmdlffdx.c index 5677c79d..d0ac52c0 100644 --- a/client/cmdlffdx.c +++ b/client/cmdlffdx.c @@ -206,7 +206,7 @@ int CmdFdxDemod(const char *Cmd){ } int CmdFdxRead(const char *Cmd) { - lf_read(true, 10000); + lf_read(true, 39999); return CmdFdxDemod(Cmd); } From bad582468fd7617e99db8c37789b5523e3ff6b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Veres-Szentkir=C3=A1lyi?= Date: Fri, 12 Apr 2019 08:52:18 +0200 Subject: [PATCH 5/5] Added support for Legic tags to `hf search` command (#815) * hf legic: use CMD_ACK instead of Dbprintf * hf search: add support for Legic tags --- CHANGELOG.md | 1 + armsrc/legicrf.c | 10 ++++------ client/cmdhf.c | 5 +++++ client/cmdhflegic.c | 17 ++++++++++++++++- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50c33d0f..adff821f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Added `hf plot` (piwi) - Added `hf mfp mad` `hf mf mad` parsing MAD1 and MAD2 (Merlok) - Added `hf mfp ndef` `hf mf ndef` parsing NDEF records (Merlok) +- Added Legic detection to `hf search` (dnet) ## [v3.1.0][2018-10-10] diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index c848e647..97af8843 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -379,8 +379,9 @@ void LegicRfReader(int offset, int bytes) { // establish shared secret and detect card type DbpString("Reading card ..."); uint8_t card_type = setup_phase(SESSION_IV); + uint8_t result = 0; if(init_card(card_type, &card) != 0) { - Dbprintf("No or unknown card found, aborting"); + result = 1; goto OUT; } @@ -397,17 +398,14 @@ void LegicRfReader(int offset, int bytes) { for(uint16_t i = 0; i < bytes; ++i) { int16_t byte = read_byte(offset + i, card.cmdsize); if(byte == -1) { - Dbprintf("operation failed @ 0x%03.3x", bytes); + result = 2; goto OUT; } BigBuf[i] = byte; } - // OK - Dbprintf("Card (MIM %i) read, use 'hf legic decode' or", card.cardsize); - Dbprintf("'data hexsamples %d' to view results", (bytes+7) & ~7); - OUT: + cmd_send(CMD_ACK, result, bytes, 0, &card, sizeof(card)); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LED_B_OFF(); LED_C_OFF(); diff --git a/client/cmdhf.c b/client/cmdhf.c index 73b0bc76..6d25cac0 100644 --- a/client/cmdhf.c +++ b/client/cmdhf.c @@ -66,6 +66,11 @@ int CmdHFSearch(const char *Cmd){ PrintAndLog("\nValid ISO14443B Tag Found - Quiting Search\n"); return ans; } + ans = CmdLegicRFRead(""); + if (ans == 0) { + PrintAndLog("\nValid Legic Tag Found - Quiting Search\n"); + return ans; + } PrintAndLog("\nno known/supported 13.56 MHz tags found\n"); return 0; } diff --git a/client/cmdhflegic.c b/client/cmdhflegic.c index 8fbd4578..66e8ebb1 100644 --- a/client/cmdhflegic.c +++ b/client/cmdhflegic.c @@ -18,6 +18,7 @@ #include "cmdparser.h" #include "cmdmain.h" #include "util.h" +#include "../include/legic.h" static int CmdHelp(const char *Cmd); @@ -214,7 +215,21 @@ int CmdLegicRFRead(const char *Cmd) if(byte_count + offset > 1024) byte_count = 1024 - offset; UsbCommand c={CMD_READER_LEGIC_RF, {offset, byte_count, 0}}; SendCommand(&c); - return 0; + UsbCommand resp; + WaitForResponse(CMD_ACK,&resp); + switch (resp.arg[0]) { + case 0: + PrintAndLog("Card (MIM %i) read, use 'hf legic decode' or", ((legic_card_select_t*)resp.d.asBytes)->cardsize); + PrintAndLog("'data hexsamples %d' to view results", (resp.arg[1] + 7) & ~7); + break; + case 1: + PrintAndLog("No or unknown card found, aborting"); + break; + case 2: + PrintAndLog("operation failed @ 0x%03.3x", resp.arg[1]); + break; + } + return resp.arg[0]; } int CmdLegicLoad(const char *Cmd)