From: iceman1001 Date: Mon, 15 Jun 2015 18:59:01 +0000 (+0200) Subject: ADD: @marshmellow42 's 14b changes. X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/d71d59dbd144f9d69d4252afb1e16611a66c56c4 ADD: @marshmellow42 's 14b changes. --- diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index bc7a0038..860e96f1 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -1225,8 +1225,14 @@ void RAMFUNC SnoopIso14443(void) * none * */ -void SendRawCommand14443B(uint32_t datalen, uint32_t recv, uint8_t powerfield, uint8_t data[]) +void SendRawCommand14443B(uint32_t datalen, uint32_t recv, uint8_t powerfield_trace, uint8_t data[]) { + uint8_t powerfield = powerfield_trace & 1; + uint8_t trace = powerfield_trace & 2; + if (trace){ + clear_trace(); + set_tracing(TRUE); + } FpgaDownloadAndGo(FPGA_BITSTREAM_HF); if(!powerfield) { diff --git a/client/cmdhf14b.c b/client/cmdhf14b.c index 5b9982fc..2a804c21 100644 --- a/client/cmdhf14b.c +++ b/client/cmdhf14b.c @@ -22,6 +22,8 @@ #include "cmdparser.h" #include "cmdhf14b.h" #include "cmdmain.h" +#include "cmdhf14a.h" +#include "sleep.h" static int CmdHelp(const char *Cmd); @@ -193,9 +195,19 @@ int CmdSrix4kRead(const char *Cmd) 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}}; + 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 if(*crc) { uint8_t first, second; @@ -207,7 +219,7 @@ 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); SendCommand(&c); @@ -218,7 +230,7 @@ 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 (verbose) PrintAndLog("received %u octets", *datalen); if(!*datalen) return 0; @@ -240,7 +252,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 +283,7 @@ int CmdHF14BCmdRaw (const char *Cmd) { break; case 'p': case 'P': - power = true; + power_trace |= 1; break; default: PrintAndLog("Invalid option"); @@ -303,11 +315,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 +366,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,10 +399,8 @@ 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); + int ans = HF14BCmdRaw(true, &crc, 2, data, datalen, false); if (!ans) return 0; if (data[0] != 0x50 || *datalen < 14 || !crc) return 0; @@ -376,42 +411,49 @@ int HF14BStdRead(uint8_t *data, uint8_t *datalen){ return 1; } + + 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); + //power on and reset tracing + int ans = HF14BCmdRaw(true, &crc, 3, data, datalen, true); - if (!ans) return 0; - if (*datalen < 3 || !crc) return 0; + if (!ans) 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); + msleep(100); + //power on + ans = HF14BCmdRaw(true, &crc, 1, data, datalen, true); - if (!ans) return 0; - if (*datalen < 3 || !crc) return 0; + if (!ans) return rawClose(); + if (*datalen < 3 || !crc) return rawClose(); + // get uid data[0] = 0x0B; *datalen = 1; - ans = HF14BCmdRaw(true, &crc, false, data, datalen, false); + msleep(100); + //power off + ans = HF14BCmdRaw(true, &crc, 0, data, datalen, true); if (!ans) return 0; 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; @@ -422,10 +464,16 @@ int CmdHF14BReader(const char *Cmd) // try st 14b ans = HF14B_ST_Read(data, &datalen); if (ans) return 1; + if (verbose) PrintAndLog("no 14443B tag found"); + return 0; +} + +int CmdHF14BReader(const char *Cmd) +{ + return HF14BReader(true); //UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443, {strtol(Cmd, NULL, 0), 0, 0}}; //SendCommand(&c); - return 0; } int CmdHF14BWrite( const char *Cmd){ diff --git a/client/cmdhf14b.h b/client/cmdhf14b.h index 0b0e2882..66fd430f 100644 --- a/client/cmdhf14b.h +++ b/client/cmdhf14b.h @@ -16,6 +16,7 @@ int CmdHF14B(const char *Cmd); int CmdHF14BDemod(const char *Cmd); int CmdHF14BList(const char *Cmd); int CmdHF14BReader(const char *Cmd); +int HF14BReader(bool verbose); int CmdHF14Sim(const char *Cmd); int CmdHFSimlisten(const char *Cmd); int CmdHF14BSnoop(const char *Cmd);