ADD: @marshmellow42 's 14b changes.

This commit is contained in:
iceman1001 2015-06-15 20:59:01 +02:00
commit d71d59dbd1
3 changed files with 82 additions and 27 deletions

View file

@ -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)
{

View file

@ -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){

View file

@ -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);