]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhf14b.c
add: @pwpipi 's fixes to 14B
[proxmark3-svn] / client / cmdhf14b.c
index 5b9982fca38da3a61d1303b6623cad9dbcf0201f..52888bfdfbd9d83781ce5dd57e095907a5631158 100644 (file)
@@ -22,6 +22,9 @@
 #include "cmdparser.h"
 #include "cmdhf14b.h"
 #include "cmdmain.h"
+#include "cmdhf14a.h"
+//#include "sleep.h"
+#include "cmddata.h"
 
 static int CmdHelp(const char *Cmd);
 
@@ -153,6 +156,7 @@ int CmdHF14BList(const char *Cmd)
 int CmdHF14Sim(const char *Cmd)
 {
   UsbCommand c={CMD_SIMULATE_TAG_ISO_14443};
+       clearCommandBuffer();
   SendCommand(&c);
   return 0;
 }
@@ -160,6 +164,7 @@ int CmdHF14Sim(const char *Cmd)
 int CmdHFSimlisten(const char *Cmd)
 {
   UsbCommand c = {CMD_SIMULATE_TAG_HF_LISTEN};
+       clearCommandBuffer();
   SendCommand(&c);
   return 0;
 }
@@ -167,6 +172,7 @@ int CmdHFSimlisten(const char *Cmd)
 int CmdHF14BSnoop(const char *Cmd)
 {
   UsbCommand c = {CMD_SNOOP_ISO_14443};
+       clearCommandBuffer();
   SendCommand(&c);
   return 0;
 }
@@ -178,6 +184,7 @@ int CmdHF14BSnoop(const char *Cmd)
 int CmdSri512Read(const char *Cmd)
 {
   UsbCommand c = {CMD_READ_SRI512_TAG, {strtol(Cmd, NULL, 0), 0, 0}};
+       clearCommandBuffer();
   SendCommand(&c);
   return 0;
 }
@@ -189,13 +196,25 @@ int CmdSri512Read(const char *Cmd)
 int CmdSrix4kRead(const char *Cmd)
 {
   UsbCommand c = {CMD_READ_SRIX4K_TAG, {strtol(Cmd, NULL, 0), 0, 0}};
+       clearCommandBuffer();
   SendCommand(&c);
   return 0;
 }
 
-int HF14BCmdRaw(bool reply, bool *crc, bool power, uint8_t *data, uint8_t *datalen, bool verbose){
+int rawClose(void){
     UsbCommand resp;
-    UsbCommand c = {CMD_ISO_14443B_COMMAND, {0, 0, 0}}; // len,recv?
+       UsbCommand c = {CMD_ISO_14443B_COMMAND, {0, 0, 0}};
+       clearCommandBuffer();
+       SendCommand(&c);
+       if (!WaitForResponseTimeout(CMD_ACK,&resp,1000)) {
+               return 0;
+       }
+       return 0;       
+}
+
+int HF14BCmdRaw(bool reply, bool *crc, uint8_t power_trace, uint8_t *data, uint8_t *datalen, bool verbose){
+       UsbCommand resp;
+       UsbCommand c = {CMD_ISO_14443B_COMMAND, {0, 0, 0}}; // len,recv,power/trace
   if(*crc)
   {
     uint8_t first, second;
@@ -207,8 +226,9 @@ int HF14BCmdRaw(bool reply, bool *crc, bool power, uint8_t *data, uint8_t *datal
   
   c.arg[0] = *datalen;
   c.arg[1] = reply;
-  c.arg[2] = power;
+       c.arg[2] = power_trace;
   memcpy(c.d.asBytes,data,*datalen);
+       clearCommandBuffer();
   SendCommand(&c);
   
   if (!reply) return 1; 
@@ -218,9 +238,8 @@ int HF14BCmdRaw(bool reply, bool *crc, bool power, uint8_t *data, uint8_t *datal
     return 0;
   }
   *datalen = resp.arg[0];
-  if (verbose) PrintAndLog("received %i octets", *datalen);
-  if(!*datalen)
-    return 0;
+       if (verbose) PrintAndLog("received %u octets", *datalen);
+       if(*datalen<2) return 0;
 
   memcpy(data, resp.d.asBytes, *datalen);
   if (verbose) PrintAndLog("%s", sprint_hex(data, *datalen));
@@ -240,7 +259,7 @@ int HF14BCmdRaw(bool reply, bool *crc, bool power, uint8_t *data, uint8_t *datal
 int CmdHF14BCmdRaw (const char *Cmd) {
     bool reply = true;
     bool crc = false;
-    bool power = false;
+       uint8_t power_trace = 0;
     char buf[5]="";
     uint8_t data[100] = {0x00};
     uint8_t datalen = 0;
@@ -271,7 +290,7 @@ int CmdHF14BCmdRaw (const char *Cmd) {
                     break;
                 case 'p': 
                 case 'P': 
-                    power = true;
+                                       power_trace |= 1;
                     break;
                 default:
                     PrintAndLog("Invalid option");
@@ -303,11 +322,10 @@ int CmdHF14BCmdRaw (const char *Cmd) {
       return 0;
     }
 
-    return HF14BCmdRaw(reply, &crc, power, data, &datalen, true);
+       return HF14BCmdRaw(reply, &crc, power_trace, data, &datalen, true);
 }
 
-
-void print_atqb_resp(uint8_t *data){
+static void print_atqb_resp(uint8_t *data){
   PrintAndLog ("           UID: %s", sprint_hex(data+1,4));
   PrintAndLog ("      App Data: %s", sprint_hex(data+5,4));
   PrintAndLog ("      Protocol: %s", sprint_hex(data+9,3));
@@ -355,6 +373,32 @@ void print_atqb_resp(uint8_t *data){
   return;
 }
 
+char *get_ST_Chip_Model(uint8_t data){
+       static char model[20];
+       char *retStr = model;
+       memset(model,0, sizeof(model));
+
+       switch (data) {
+               case 0x0: sprintf(retStr, "SRIX4K (Special)"); break;
+               case 0x2: sprintf(retStr, "SR176"); break;
+               case 0x3: sprintf(retStr, "SRIX4K"); break;
+               case 0x4: sprintf(retStr, "SRIX512"); break;
+               case 0x6: sprintf(retStr, "SRI512"); break;
+               case 0x7: sprintf(retStr, "SRI4K"); break;
+               case 0xC: sprintf(retStr, "SRT512"); break;
+               default: sprintf(retStr, "Unknown"); break;
+       }
+       return retStr;
+}
+
+static void print_st_info(uint8_t *data){
+       //uid = first 8 bytes in data
+       PrintAndLog(" UID: %s", sprint_hex(data,8));
+       PrintAndLog(" MFG: %02X, %s", data[1], getTagInfo(data[1]));
+       PrintAndLog("Chip: %02X, %s", data[2]>>2, get_ST_Chip_Model(data[2]>>2));
+       return;
+}
+
 int HF14BStdRead(uint8_t *data, uint8_t *datalen){
   bool crc = true;
   *datalen = 3;
@@ -362,13 +406,10 @@ int HF14BStdRead(uint8_t *data, uint8_t *datalen){
   data[0] = 0x05;
   data[1] = 0x00;
   data[2] = 0x08;
-  //data[3] = 0x39;
-  //data[4] = 0x73;
 
-  int ans = HF14BCmdRaw(true, &crc, false, data, datalen, false);
+       if (HF14BCmdRaw(true, &crc, 0, data, datalen, false)==0) return 0;
 
-  if (!ans) return 0;
-  if (data[0] != 0x50  || *datalen < 14 || !crc) return 0;
+       if (data[0] != 0x50  || *datalen != 14 || !crc) return 0;
 
   PrintAndLog ("\n14443-3b tag found:");
   print_atqb_resp(data);
@@ -379,57 +420,75 @@ int HF14BStdRead(uint8_t *data, uint8_t *datalen){
 int HF14B_ST_Read(uint8_t *data, uint8_t *datalen){
   bool crc = true;
   *datalen = 2;
-  //std read cmd
+       //wake cmd
   data[0] = 0x06;
   data[1] = 0x00;
-  int ans = HF14BCmdRaw(true, &crc, true, data, datalen, false);
 
-  if (!ans) return 0;
-  if (*datalen < 3 || !crc) return 0;
+       //leave power on
+       // verbose on for now for testing - turn off when functional
+       if (HF14BCmdRaw(true, &crc, 1, data, datalen, true)==0) return rawClose();
+
+       if (*datalen != 3 || !crc) return rawClose();
 
   uint8_t chipID = data[0];
+       // select
   data[0] = 0x0E;
   data[1] = chipID;
   *datalen = 2;
-  ans = HF14BCmdRaw(true, &crc, true, data, datalen, false);
 
-  if (!ans) return 0;
-  if (*datalen < 3 || !crc) return 0;
+       //leave power on
+       // verbose on for now for testing - turn off when functional
+       if (HF14BCmdRaw(true, &crc, 1, data, datalen, true)==0) return rawClose();
 
+       if (*datalen != 3 || !crc || data[0] != chipID) return rawClose();
+
+       // get uid
   data[0] = 0x0B;
   *datalen = 1;
-  ans = HF14BCmdRaw(true, &crc, false, data, datalen, false);
 
-  if (!ans) return 0;
-  if (*datalen < 10 || !crc) return 0;
+       //power off
+       // verbose on for now for testing - turn off when functional
+       if (HF14BCmdRaw(true, &crc, 1, data, datalen, true)==0) return 0;
+       rawClose();
+       if (*datalen != 10 || !crc) return 0;
 
-  PrintAndLog ("14443-3b ST tag found");
-  //uid = first 8 bytes in data
-  PrintAndLog ("UID: %s", sprint_hex(data,8));
+       PrintAndLog("\n14443-3b ST tag found:");
+       print_st_info(data);
   return 1;
-
 }
 
-int CmdHF14BReader(const char *Cmd)
-    {
+int HF14BReader(bool verbose){
   uint8_t data[100];
   uint8_t datalen = 5;
   
   // try std 14b (atqb)
-  int ans = HF14BStdRead(data, &datalen);
-  if (ans) return 1;
+       if (HF14BStdRead(data, &datalen)) return 1;
 
   // try st 14b
-  ans = HF14B_ST_Read(data, &datalen);
-  if (ans) return 1;
+       if (HF14B_ST_Read(data, &datalen)) return 1;
 
-  //UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443, {strtol(Cmd, NULL, 0), 0, 0}};
-  //SendCommand(&c);
-    return 0;
+       if (verbose) PrintAndLog("no 14443B tag found");
+       return 0;
 }
 
-int CmdHF14BWrite( const char *Cmd){
+int CmdHF14BReader(const char *Cmd){
+       return HF14BReader(true);
+}
 
+int CmdHFRawSamples(const char *Cmd){
+       UsbCommand resp;
+       UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443, {strtol(Cmd,NULL,0), 0, 0}};
+       SendCommand(&c);
+
+       if (!WaitForResponseTimeout(CMD_ACK,&resp,1000)) {
+               PrintAndLog("timeout while waiting for reply.");
+               return 0;
+       }
+       getSamples("39999", true);
+       return 1;
+}
+
+int CmdHF14BWrite( const char *Cmd){
 /*
  * For SRIX4K  blocks 00 - 7F
  * hf 14b raw -c -p 09 $srix4kwblock $srix4kwdata
@@ -500,6 +559,7 @@ static command_t CommandTable[] =
 {
   {"help",        CmdHelp,        1, "This help"},
   {"demod",       CmdHF14BDemod,  1, "Demodulate ISO14443 Type B from tag"},
+       {"getsamples",  CmdHFRawSamples,0, "[atqb=0 or ST=1] Send wake cmd and Get raw HF samples to GraphBuffer"},
   {"list",        CmdHF14BList,   0, "[Deprecated] List ISO 14443b history"},
   {"reader",      CmdHF14BReader, 0, "Find 14b tag (HF ISO 14443b)"},
   {"sim",         CmdHF14Sim,     0, "Fake ISO 14443 tag"},
Impressum, Datenschutz