mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-09-21 07:46:12 +08:00
Some minor changes [iclass-related]
This commit is contained in:
parent
3ad48540d4
commit
26c0d833ac
128
armsrc/iclass.c
128
armsrc/iclass.c
|
@ -1169,12 +1169,11 @@ int doIClassSimulation(uint8_t csn[], int breakAfterMacReceived, uint8_t *reader
|
||||||
} else if(receivedCmd[0] == 0x05) {
|
} else if(receivedCmd[0] == 0x05) {
|
||||||
// Reader random and reader MAC!!!
|
// Reader random and reader MAC!!!
|
||||||
// Do not respond
|
// Do not respond
|
||||||
// We do not know what to answer, so lets keep quit
|
// We do not know what to answer, so lets keep quiet
|
||||||
resp = resp1; respLen = 0; //order = 5;
|
resp = resp1; respLen = 0; //order = 5;
|
||||||
respdata = NULL;
|
respdata = NULL;
|
||||||
respsize = 0;
|
respsize = 0;
|
||||||
if (breakAfterMacReceived){
|
if (breakAfterMacReceived){
|
||||||
// TODO, actually return this to the caller instead of just
|
|
||||||
// dbprintf:ing ...
|
// dbprintf:ing ...
|
||||||
Dbprintf("CSN: %02x %02x %02x %02x %02x %02x %02x %02x",csn[0],csn[1],csn[2],csn[3],csn[4],csn[5],csn[6],csn[7]);
|
Dbprintf("CSN: %02x %02x %02x %02x %02x %02x %02x %02x",csn[0],csn[1],csn[2],csn[3],csn[4],csn[5],csn[6],csn[7]);
|
||||||
Dbprintf("RDR: (len=%02d): %02x %02x %02x %02x %02x %02x %02x %02x %02x",len,
|
Dbprintf("RDR: (len=%02d): %02x %02x %02x %02x %02x %02x %02x %02x %02x",len,
|
||||||
|
@ -1478,8 +1477,8 @@ void ReaderIClass(uint8_t arg0) {
|
||||||
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
||||||
|
|
||||||
// Reset trace buffer
|
// Reset trace buffer
|
||||||
memset(trace, 0x44, RECV_CMD_OFFSET);
|
iso14a_set_tracing(TRUE);
|
||||||
traceLen = 0;
|
iso14a_clear_trace();
|
||||||
|
|
||||||
// Setup SSC
|
// Setup SSC
|
||||||
FpgaSetupSsc();
|
FpgaSetupSsc();
|
||||||
|
@ -1554,10 +1553,11 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
|
||||||
} memory;
|
} memory;
|
||||||
|
|
||||||
uint8_t* resp = (((uint8_t *)BigBuf) + 3560); // was 3560 - tied to other size changes
|
uint8_t* resp = (((uint8_t *)BigBuf) + 3560); // was 3560 - tied to other size changes
|
||||||
|
// Enable and clear the trace
|
||||||
|
iso14a_set_tracing(TRUE);
|
||||||
|
iso14a_clear_trace();
|
||||||
|
|
||||||
|
|
||||||
// Reset trace buffer
|
|
||||||
memset(trace, 0x44, RECV_CMD_OFFSET);
|
|
||||||
traceLen = 0;
|
|
||||||
|
|
||||||
// Setup SSC
|
// Setup SSC
|
||||||
FpgaSetupSsc();
|
FpgaSetupSsc();
|
||||||
|
@ -1681,15 +1681,16 @@ void IClass_iso14443A_GetPublic(uint8_t arg0) {
|
||||||
uint8_t identify[] = { 0x0c };
|
uint8_t identify[] = { 0x0c };
|
||||||
uint8_t select[] = { 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
uint8_t select[] = { 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
uint8_t readcheck_cc[]= { 0x88, 0x02 };
|
uint8_t readcheck_cc[]= { 0x88, 0x02 };
|
||||||
//uint8_t read[] = { 0x0c, 0x00, 0x00, 0x00 };
|
|
||||||
uint8_t card_data[24]={0};
|
|
||||||
|
|
||||||
//bool read_success=false;
|
|
||||||
uint8_t* resp = (((uint8_t *)BigBuf) + 3560); // was 3560 - tied to other size changes
|
|
||||||
|
|
||||||
// Reset trace buffer
|
uint8_t card_data[24]={0};
|
||||||
memset(trace, 0x44, RECV_CMD_OFFSET);
|
uint8_t* resp = (((uint8_t *)BigBuf) + 3560); // was 3560 - tied to other size changes
|
||||||
traceLen = 0;
|
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
||||||
|
|
||||||
|
int read_success= 0;
|
||||||
|
|
||||||
|
// Enable and clear the trace
|
||||||
|
iso14a_set_tracing(TRUE);
|
||||||
|
iso14a_clear_trace();
|
||||||
|
|
||||||
// Setup SSC
|
// Setup SSC
|
||||||
FpgaSetupSsc();
|
FpgaSetupSsc();
|
||||||
|
@ -1708,67 +1709,50 @@ void IClass_iso14443A_GetPublic(uint8_t arg0) {
|
||||||
|
|
||||||
LED_A_ON();
|
LED_A_ON();
|
||||||
|
|
||||||
for(int i=0;i<1;i++) {
|
// Send act_all
|
||||||
|
ReaderTransmitIClass(act_all, 1);
|
||||||
if(traceLen > TRACE_SIZE) {
|
// Card present?
|
||||||
DbpString("Trace full");
|
if(ReaderReceiveIClass(resp)) {
|
||||||
break;
|
ReaderTransmitIClass(identify, 1);
|
||||||
}
|
if(ReaderReceiveIClass(resp) == 10) {
|
||||||
|
//Copy the Anti-collision CSN to our select-packet
|
||||||
if (BUTTON_PRESS()) break;
|
memcpy(&select[1],resp,8);
|
||||||
|
Dbprintf("Anti-collision CSN: %02x %02x %02x %02x %02x %02x %02x %02x");
|
||||||
|
//Select the card
|
||||||
|
ReaderTransmitIClass(select, sizeof(select));
|
||||||
|
|
||||||
// Send act_all
|
if(ReaderReceiveIClass(resp) == 10) {
|
||||||
ReaderTransmitIClass(act_all, 1);
|
Dbprintf(" Selected CSN: %02x %02x %02x %02x %02x %02x %02x %02x",
|
||||||
// Card present?
|
resp[0], resp[1], resp[2],
|
||||||
if(ReaderReceiveIClass(resp)) {
|
resp[3], resp[4], resp[5],
|
||||||
ReaderTransmitIClass(identify, 1);
|
resp[6], resp[7]);
|
||||||
if(ReaderReceiveIClass(resp) == 10) {
|
//Save CSN in response data
|
||||||
// Select card
|
memcpy(card_data,resp,8);
|
||||||
memcpy(&select[1],resp,8);
|
//Flag that we got to at least stage 1, read CSN
|
||||||
ReaderTransmitIClass(select, sizeof(select));
|
read_success = 1;
|
||||||
|
|
||||||
|
// Card selected
|
||||||
|
Dbprintf("Readcheck on Sector 2");
|
||||||
|
ReaderTransmitIClass(readcheck_cc, sizeof(readcheck_cc));
|
||||||
|
if(ReaderReceiveIClass(resp) == 8) {
|
||||||
|
Dbprintf(" CC: %02x %02x %02x %02x %02x %02x %02x %02x",
|
||||||
|
resp[0], resp[1], resp[2],
|
||||||
|
resp[3], resp[4], resp[5],
|
||||||
|
resp[6], resp[7]);
|
||||||
|
//Save CC (e-purse) in response data
|
||||||
|
memcpy(card_data+8,resp,8);
|
||||||
|
//Got both
|
||||||
|
read_success = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WDT_HIT();
|
||||||
|
|
||||||
if(ReaderReceiveIClass(resp) == 10) {
|
|
||||||
Dbprintf(" Selected CSN: %02x %02x %02x %02x %02x %02x %02x %02x",
|
|
||||||
resp[0], resp[1], resp[2],
|
|
||||||
resp[3], resp[4], resp[5],
|
|
||||||
resp[6], resp[7]);
|
|
||||||
}
|
|
||||||
memcpy(card_data,resp,8);
|
|
||||||
// Card selected
|
|
||||||
Dbprintf("Readcheck on Sector 2");
|
|
||||||
ReaderTransmitIClass(readcheck_cc, sizeof(readcheck_cc));
|
|
||||||
if(ReaderReceiveIClass(resp) == 8) {
|
|
||||||
Dbprintf(" CC: %02x %02x %02x %02x %02x %02x %02x %02x",
|
|
||||||
resp[0], resp[1], resp[2],
|
|
||||||
resp[3], resp[4], resp[5],
|
|
||||||
resp[6], resp[7]);
|
|
||||||
}
|
|
||||||
memcpy(card_data+8,resp,8);
|
|
||||||
//prep to read config block
|
|
||||||
/* read card configuration block
|
|
||||||
while(!read_success){
|
|
||||||
uint8_t sector_config=0x01;
|
|
||||||
memcpy(read+1,§or_config,1);
|
|
||||||
ReaderTransmitIClass(read, sizeof(read));
|
|
||||||
if(ReaderReceiveIClass(resp) == 8) {
|
|
||||||
Dbprintf(" CC: %02x %02x %02x %02x %02x %02x %02x %02x",
|
|
||||||
resp[0], resp[1], resp[2],
|
|
||||||
resp[3], resp[4], resp[5],
|
|
||||||
resp[6], resp[7]);
|
|
||||||
read_success=true;
|
|
||||||
memcpy(card_data+16,resp,8);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WDT_HIT();
|
|
||||||
}
|
|
||||||
//Dbprintf("DEBUG: %02x%02x%02x%02x%02x%02x%02x%02x",card_data[0],card_data[1],card_data[2],card_data[3],card_data[4],card_data[5],card_data[6],card_data[7]);
|
|
||||||
//Dbprintf("DEBUG: %02x%02x%02x%02x%02x%02x%02x%02x",card_data[8],card_data[9],card_data[10],card_data[11],card_data[12],card_data[13],card_data[14],card_data[15]);
|
|
||||||
LED_A_OFF();
|
LED_A_OFF();
|
||||||
LED_B_ON();
|
LED_B_ON();
|
||||||
//send data back to the client
|
//Send back to client
|
||||||
cmd_send(CMD_ACK,0,0,0,card_data,16);
|
cmd_send(CMD_ACK,read_success,0,0,card_data,16);
|
||||||
LED_B_OFF();
|
LED_B_OFF();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>, Hagen Fritsch
|
// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>, Hagen Fritsch
|
||||||
// Copyright (C) 2011 Gerhard de Koning Gans
|
// Copyright (C) 2011 Gerhard de Koning Gans
|
||||||
// Copyright (C) 2014 Midnitesnake & Andy Davies
|
// Copyright (C) 2014 Midnitesnake & Andy Davies & Martin Holst Swende
|
||||||
//
|
//
|
||||||
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
|
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
|
||||||
// at your option, any later version. See the LICENSE.txt file for the text of
|
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||||
|
@ -88,7 +88,7 @@ int CmdHFiClassList(const char *Cmd)
|
||||||
timestamp = *((uint32_t *)(got+i));
|
timestamp = *((uint32_t *)(got+i));
|
||||||
parityBits = *((uint32_t *)(got+i+4));
|
parityBits = *((uint32_t *)(got+i+4));
|
||||||
len = got[i+8];
|
len = got[i+8];
|
||||||
frame = (got+i+9);
|
frame = (got+i+9);
|
||||||
uint32_t next_timestamp = (*((uint32_t *)(got+i+9))) & 0x7fffffff;
|
uint32_t next_timestamp = (*((uint32_t *)(got+i+9))) & 0x7fffffff;
|
||||||
|
|
||||||
tagToReader = timestamp & 0x80000000;
|
tagToReader = timestamp & 0x80000000;
|
||||||
|
@ -98,7 +98,7 @@ int CmdHFiClassList(const char *Cmd)
|
||||||
first_timestamp = timestamp;
|
first_timestamp = timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Break and stick with current result if buffer was not completely full
|
// Break and stick with current result idf buffer was not completely full
|
||||||
if (frame[0] == 0x44 && frame[1] == 0x44 && frame[2] == 0x44 && frame[3] == 0x44) break;
|
if (frame[0] == 0x44 && frame[1] == 0x44 && frame[2] == 0x44 && frame[3] == 0x44) break;
|
||||||
|
|
||||||
char line[1000] = "";
|
char line[1000] = "";
|
||||||
|
@ -453,8 +453,6 @@ int CmdHFiClassReader_Dump(const char *Cmd)
|
||||||
|
|
||||||
if (strlen(Cmd)<1)
|
if (strlen(Cmd)<1)
|
||||||
{
|
{
|
||||||
//PrintAndLog("Usage: hf iclass dump <Key> <CSN> <CC>");
|
|
||||||
//PrintAndLog(" sample: hf iclass dump 0011223344556677 aabbccddeeffgghh FFFFFFFFFFFFFFFF");
|
|
||||||
PrintAndLog("Usage: hf iclass dump <Key>");
|
PrintAndLog("Usage: hf iclass dump <Key>");
|
||||||
PrintAndLog(" sample: hf iclass dump 0011223344556677");
|
PrintAndLog(" sample: hf iclass dump 0011223344556677");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -465,43 +463,43 @@ int CmdHFiClassReader_Dump(const char *Cmd)
|
||||||
PrintAndLog("KEY must include 16 HEX symbols");
|
PrintAndLog("KEY must include 16 HEX symbols");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if (param_gethex(Cmd, 1, CSN, 16))
|
|
||||||
{
|
|
||||||
PrintAndLog("CSN must include 16 HEX symbols");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (param_gethex(Cmd, 2, CC_temp, 16))
|
|
||||||
{
|
|
||||||
PrintAndLog("CC must include 16 HEX symbols");
|
|
||||||
return 1;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
UsbCommand c = {CMD_ICLASS_ISO14443A_GETPUBLIC, {0}};
|
UsbCommand c = {CMD_ICLASS_ISO14443A_GETPUBLIC, {0}};
|
||||||
//memcpy(c.d.asBytes, MAC, 4);
|
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
|
|
||||||
UsbCommand resp;
|
UsbCommand resp;
|
||||||
|
|
||||||
if (WaitForResponseTimeout(CMD_ACK,&resp,4500)) {
|
if (WaitForResponseTimeout(CMD_ACK,&resp,4500)) {
|
||||||
uint8_t isOK = resp.arg[0] & 0xff;
|
uint8_t isOK = resp.arg[0] & 0xff;
|
||||||
uint8_t * data = resp.d.asBytes;
|
uint8_t * data = resp.d.asBytes;
|
||||||
|
|
||||||
memcpy(CSN,data,8);
|
|
||||||
memcpy(CCNR,data+8,8);
|
|
||||||
PrintAndLog("DEBUG: %s",sprint_hex(CSN,8));
|
|
||||||
PrintAndLog("DEBUG: %s",sprint_hex(CCNR,8));
|
|
||||||
PrintAndLog("isOk:%02x", isOK);
|
|
||||||
} else {
|
|
||||||
PrintAndLog("Command execute timeout");
|
|
||||||
}
|
|
||||||
|
|
||||||
diversifyKey(CSN,KEY, div_key);
|
|
||||||
|
|
||||||
doMAC(CCNR,div_key, MAC);
|
memcpy(CSN,data,8);
|
||||||
|
memcpy(CCNR,data+8,8);
|
||||||
|
|
||||||
UsbCommand d = {CMD_READER_ICLASS_REPLAY, {readerType}};
|
PrintAndLog("isOk:%02x", isOK);
|
||||||
memcpy(d.d.asBytes, MAC, 4);
|
|
||||||
SendCommand(&d);
|
if(isOK > 0)
|
||||||
|
{
|
||||||
|
PrintAndLog("CSN: %s",sprint_hex(CSN,8));
|
||||||
|
}
|
||||||
|
if(isOK > 1)
|
||||||
|
{
|
||||||
|
PrintAndLog("CC: %s",sprint_hex(CCNR,8));
|
||||||
|
diversifyKey(CSN,KEY, div_key);
|
||||||
|
doMAC(CCNR,div_key, MAC);
|
||||||
|
|
||||||
|
UsbCommand d = {CMD_READER_ICLASS_REPLAY, {readerType}};
|
||||||
|
memcpy(d.d.asBytes, MAC, 4);
|
||||||
|
SendCommand(&d);
|
||||||
|
|
||||||
|
}else{
|
||||||
|
PrintAndLog("Failed to obtain CC! Aborting");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PrintAndLog("Command execute timeout");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue