From bad582468fd7617e99db8c37789b5523e3ff6b9d Mon Sep 17 00:00:00 2001
From: =?utf8?q?Andr=C3=A1s=20Veres-Szentkir=C3=A1lyi?= <vsza@vsza.hu>
Date: Fri, 12 Apr 2019 08:52:18 +0200
Subject: [PATCH] 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)
-- 
2.39.5