{
memset(BigBuf,0,BIGBUF_SIZE);
if (verbose)
- Dbprintf("Buffer cleared (%i bytes)",BIGBUF_SIZE);
+ Dbprintf("Buffer cleared (%i bytes)",BIGBUF_SIZE);
}
SRC_ISO14443b = iso14443b.c
SRC_CRAPTO1 = crapto1.c crypto1.c des.c aes.c desfire_key.c desfire_crypto.c mifaredesfire.c
SRC_CRC = iso14443crc.c crc.c crc16.c crc32.c
+SRC_EMV = tlv.c emvdataels.c emvutil.c emvcmd.c
#the FPGA bitstream files. Note: order matters!
FPGA_BITSTREAMS = fpga_lf.bit fpga_hf.bit
optimized_cipher.c \
hfsnoop.c \
parity.c
+# $(SRC_EMV)
# Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC
include ../common/Makefile.common
/* need this delay to prevent catching some weird data */
SpinDelay(500);
/* Code for reading from 14a tag */
- uint8_t uid[10] ={0};
- uint32_t cuid;
+ uint8_t uid[10] = {0};
+ uint32_t cuid = 0;
iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD);
for ( ; ; )
break;
case CMD_READER_MIFARE:
- ReaderMifare(c->arg[0]);
+ ReaderMifare(c->arg[0], c->arg[1]);
break;
case CMD_MIFARE_READBL:
MifareReadBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
case CMD_MIFARE_COLLECT_NONCES:
break;
#endif
-
+#ifdef WITH_EMV
+ case CMD_EMV_TRANSACTION:
+ EMVTransaction();
+ break;
+ case CMD_EMV_GET_RANDOM_NUM:
+ //EMVgetUDOL();
+ break;
+ case CMD_EMV_LOAD_VALUE:
+ EMVloadvalue(c->arg[0], c->d.asBytes);
+ break;
+ case CMD_EMV_DUMP_CARD:
+ EMVdumpcard();
+#endif
#ifdef WITH_ICLASS
// Makes use of ISO14443a FPGA Firmware
case CMD_SNOOP_ICLASS:
void EPA_PACE_Replay(UsbCommand *c);
// mifarecmd.h
-void ReaderMifare(bool first_try);
+//void ReaderMifare(bool first_try);
+void ReaderMifare(bool first_try, uint8_t block );
int32_t dist_nt(uint32_t nt1, uint32_t nt2);
void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *data);
void MifareUReadBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain);
/// util.h
void HfSnoop(int , int);
+//EMV functions emvcmd.h
+void EMVTransaction(void);
+void EMVgetUDOL(void);
+void EMVloadvalue(uint32_t tag, uint8_t* datain);
+void EMVdumpcard(void);
#endif
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
// Clean up trace and prepare it for storing frames
- set_tracing(TRUE);
clear_trace();
+ set_tracing(TRUE);
auth_table_len = 0;
auth_table_pos = 0;
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
// Clean up trace and prepare it for storing frames
- set_tracing(TRUE);
clear_trace();
-
+ set_tracing(TRUE);
+
auth_table_len = 0;
auth_table_pos = 0;
byte_t* auth_table;
bSuccessful = false;
// Clean up trace and prepare it for storing frames
- set_tracing(TRUE);
clear_trace();
-
+ set_tracing(TRUE);
+
DbpString("Starting Hitag reader family");
// Check configuration
// The DMA buffer, used to stream samples from the FPGA
uint8_t *dmaBuf = BigBuf_malloc(DMA_BUFFER_SIZE);
- set_tracing(TRUE);
clear_trace();
+ set_tracing(TRUE);
+
iso14a_set_trigger(FALSE);
int lastRxCounter;
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
// Enable and clear the trace
- set_tracing(TRUE);
clear_trace();
+ set_tracing(TRUE);
+
//Use the emulator memory for SIM
uint8_t *emulator = BigBuf_get_EM_addr();
GetParity(trace_data, trace_data_size, parity);
LogTrace(trace_data, trace_data_size, (t2r_time-time_0) << 4, (t2r_time-time_0) << 4, parity, FALSE);
}
- if(!tracing) {
+ if(!tracing)
DbpString("Trace full");
- //break;
- }
}
}
{
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
// Reset trace buffer
- set_tracing(TRUE);
clear_trace();
-
+ set_tracing(TRUE);
+
// Setup SSC
FpgaSetupSsc();
// Start from off (no field generated)
while(!BUTTON_PRESS())
{
if (try_once && tryCnt > 5) break;
+
tryCnt++;
+
if(!tracing) {
DbpString("Trace full");
break;
//p_response = &responses[9];
} else if(receivedCmd[0] == 0x50) { // Received a HALT
-
- if (tracing) {
- LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
- }
+ LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
p_response = NULL;
} else if(receivedCmd[0] == 0x60 || receivedCmd[0] == 0x61) { // Received an authentication request
p_response = &responses[6]; order = 70;
}
} else if (order == 7 && len == 8) { // Received {nr] and {ar} (part of authentication)
- if (tracing) {
- LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
- }
+ LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
uint32_t nonce = bytes_to_num(response5,4);
uint32_t nr = bytes_to_num(receivedCmd,4);
uint32_t ar = bytes_to_num(receivedCmd+4,4);
default: {
// Never seen this command before
- if (tracing) {
- LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
- }
+ LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
Dbprintf("Received unknown command (len=%d):",len);
Dbhexdump(len,receivedCmd,false);
// Do not respond
if (prepare_tag_modulation(&dynamic_response_info,DYNAMIC_MODULATION_BUFFER_SIZE) == false) {
Dbprintf("Error preparing tag response");
- if (tracing) {
- LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
- }
+ LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
break;
}
p_response = &dynamic_response_info;
if (p_response != NULL) {
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n, receivedCmd[0] == 0x52);
// do the tracing for the previous reader request and this tag answer:
- uint8_t par[MAX_PARITY_SIZE];
+ uint8_t par[MAX_PARITY_SIZE] = {0x00};
GetParity(p_response->response, p_response->response_n, par);
EmLogTrace(Uart.output,
bool EmLogTrace(uint8_t *reader_data, uint16_t reader_len, uint32_t reader_StartTime, uint32_t reader_EndTime, uint8_t *reader_Parity,
uint8_t *tag_data, uint16_t tag_len, uint32_t tag_StartTime, uint32_t tag_EndTime, uint8_t *tag_Parity)
{
- if (tracing) {
- // we cannot exactly measure the end and start of a received command from reader. However we know that the delay from
- // end of the received command to start of the tag's (simulated by us) answer is n*128+20 or n*128+84 resp.
- // with n >= 9. The start of the tags answer can be measured and therefore the end of the received command be calculated:
- uint16_t reader_modlen = reader_EndTime - reader_StartTime;
- uint16_t approx_fdt = tag_StartTime - reader_EndTime;
- uint16_t exact_fdt = (approx_fdt - 20 + 32)/64 * 64 + 20;
- reader_EndTime = tag_StartTime - exact_fdt;
- reader_StartTime = reader_EndTime - reader_modlen;
+ // we cannot exactly measure the end and start of a received command from reader. However we know that the delay from
+ // end of the received command to start of the tag's (simulated by us) answer is n*128+20 or n*128+84 resp.
+ // with n >= 9. The start of the tags answer can be measured and therefore the end of the received command be calculated:
+ uint16_t reader_modlen = reader_EndTime - reader_StartTime;
+ uint16_t approx_fdt = tag_StartTime - reader_EndTime;
+ uint16_t exact_fdt = (approx_fdt - 20 + 32)/64 * 64 + 20;
+ reader_EndTime = tag_StartTime - exact_fdt;
+ reader_StartTime = reader_EndTime - reader_modlen;
- if (!LogTrace(reader_data, reader_len, reader_StartTime, reader_EndTime, reader_Parity, TRUE))
- return FALSE;
- else
- return(!LogTrace(tag_data, tag_len, tag_StartTime, tag_EndTime, tag_Parity, FALSE));
-
- } else {
- return TRUE;
- }
+ if (!LogTrace(reader_data, reader_len, reader_StartTime, reader_EndTime, reader_Parity, TRUE))
+ return FALSE;
+ else
+ return(!LogTrace(tag_data, tag_len, tag_StartTime, tag_EndTime, tag_Parity, FALSE));
+
}
//-----------------------------------------------------------------------------
LED_A_ON();
// Log reader command in trace buffer
- if (tracing)
- LogTrace(frame, nbytes(bits), LastTimeProxToAirStart*16 + DELAY_ARM2AIR_AS_READER, (LastTimeProxToAirStart + LastProxToAirDuration)*16 + DELAY_ARM2AIR_AS_READER, par, TRUE);
+ LogTrace(frame, nbytes(bits), LastTimeProxToAirStart*16 + DELAY_ARM2AIR_AS_READER, (LastTimeProxToAirStart + LastProxToAirDuration)*16 + DELAY_ARM2AIR_AS_READER, par, TRUE);
}
void ReaderTransmitPar(uint8_t* frame, uint16_t len, uint8_t *par, uint32_t *timing)
if (!GetIso14443aAnswerFromTag(receivedAnswer, parity, offset))
return FALSE;
- if (tracing)
- LogTrace(receivedAnswer, Demod.len, Demod.startTime*16 - DELAY_AIR2ARM_AS_READER, Demod.endTime*16 - DELAY_AIR2ARM_AS_READER, parity, FALSE);
-
+ LogTrace(receivedAnswer, Demod.len, Demod.startTime*16 - DELAY_AIR2ARM_AS_READER, Demod.endTime*16 - DELAY_AIR2ARM_AS_READER, parity, FALSE);
return Demod.len;
}
if (!GetIso14443aAnswerFromTag(receivedAnswer, parity, 0))
return FALSE;
- if (tracing)
- LogTrace(receivedAnswer, Demod.len, Demod.startTime*16 - DELAY_AIR2ARM_AS_READER, Demod.endTime*16 - DELAY_AIR2ARM_AS_READER, parity, FALSE);
-
+ LogTrace(receivedAnswer, Demod.len, Demod.startTime*16 - DELAY_AIR2ARM_AS_READER, Demod.endTime*16 - DELAY_AIR2ARM_AS_READER, parity, FALSE);
return Demod.len;
}
if (!ReaderReceive(resp, resp_par)) return 0;
sak = resp[0];
- // Test if more parts of the uid are coming
+ // Test if more parts of the uid are coming
if ((sak & 0x04) /* && uid_resp[0] == 0x88 */) {
// Remove first byte, 0x88 is not an UID byte, it CT, see page 3 of:
// http://www.nxp.com/documents/application_note/AN10927.pdf
}
int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data) {
- uint8_t parity[MAX_PARITY_SIZE];
+ uint8_t parity[MAX_PARITY_SIZE] = {0x00};
uint8_t real_cmd[cmd_len+4];
real_cmd[0] = 0x0a; //I-Block
// put block number into the PCB
size_t lenbits = c->arg[1] >> 16;
uint32_t timeout = c->arg[2];
uint32_t arg0 = 0;
- byte_t buf[USB_CMD_DATA_SIZE];
- uint8_t par[MAX_PARITY_SIZE];
+ byte_t buf[USB_CMD_DATA_SIZE] = {0x00};
+ uint8_t par[MAX_PARITY_SIZE] = {0x00};
- if(param & ISO14A_CONNECT) {
+ if (param & ISO14A_CONNECT)
clear_trace();
- }
set_tracing(TRUE);
- if(param & ISO14A_REQUEST_TRIGGER) {
+ if (param & ISO14A_REQUEST_TRIGGER)
iso14a_set_trigger(TRUE);
- }
- if(param & ISO14A_CONNECT) {
+
+ if (param & ISO14A_CONNECT) {
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
if(!(param & ISO14A_NO_SELECT)) {
iso14a_card_select_t *card = (iso14a_card_select_t*)buf;
}
}
- if(param & ISO14A_SET_TIMEOUT) {
+ if (param & ISO14A_SET_TIMEOUT)
iso14a_set_timeout(timeout);
- }
- if(param & ISO14A_APDU) {
+ if (param & ISO14A_APDU) {
arg0 = iso14_apdu(cmd, len, buf);
cmd_send(CMD_ACK,arg0,0,0,buf,sizeof(buf));
}
- if(param & ISO14A_RAW) {
+ if (param & ISO14A_RAW) {
if(param & ISO14A_APPEND_CRC) {
if(param & ISO14A_TOPAZMODE) {
AppendCrc14443b(cmd,len);
cmd_send(CMD_ACK,arg0,0,0,buf,sizeof(buf));
}
- if(param & ISO14A_REQUEST_TRIGGER) {
+ if (param & ISO14A_REQUEST_TRIGGER)
iso14a_set_trigger(FALSE);
- }
- if(param & ISO14A_NO_DISCONNECT) {
+
+ if (param & ISO14A_NO_DISCONNECT)
return;
- }
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
set_tracing(FALSE);
// Therefore try in alternating directions.
int32_t dist_nt(uint32_t nt1, uint32_t nt2) {
- uint16_t i;
- uint32_t nttmp1, nttmp2;
-
if (nt1 == nt2) return 0;
-
- nttmp1 = nt1;
- nttmp2 = nt2;
- for (i = 1; i < 0xFFFF; i++) {
+ uint16_t i;
+ uint32_t nttmp1 = nt1;
+ uint32_t nttmp2 = nt2;
+
+ for (i = 1; i < 0xFFFF; ++i) {
nttmp1 = prng_successor(nttmp1, 1);
if (nttmp1 == nt2) return i;
+
nttmp2 = prng_successor(nttmp2, 1);
- if (nttmp2 == nt1) return -i;
- }
+ if (nttmp2 == nt1) return -i;
+ }
return(-99999); // either nt1 or nt2 are invalid nonces
}
// Cloning MiFare Classic Rail and Building Passes, Anywhere, Anytime"
// (article by Nicolas T. Courtois, 2009)
//-----------------------------------------------------------------------------
-void ReaderMifare(bool first_try)
+void ReaderMifare(bool first_try, uint8_t block )
{
// Mifare AUTH
- uint8_t mf_auth[] = { 0x60,0x00,0xf5,0x7b };
+ //uint8_t mf_auth[] = { 0x60,0x00,0xf5,0x7b };
+ //uint8_t mf_auth[] = { 0x60,0x05, 0x58, 0x2c };
+ uint8_t mf_auth[] = { 0x60,0x00, 0x00, 0x00 };
uint8_t mf_nr_ar[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
static uint8_t mf_nr_ar3;
+ mf_auth[1] = block;
+ AppendCrc14443a(mf_auth, 2);
+
uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};
uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00};
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
LEDsoff();
- if(flags & FLAG_INTERACTIVE)// Interactive mode flag, means we need to send ACK
- {
+ // Interactive mode flag, means we need to send ACK
+ if(flags & FLAG_INTERACTIVE) {
//May just aswell send the collected ar_nr in the response aswell
uint8_t len = ar_nr_collected*5*4;
cmd_send(CMD_ACK, CMD_SIMULATE_MIFARE_CARD, len, 0, &ar_nr_responses, len);
}
- if(flags & FLAG_NR_AR_ATTACK && MF_DBGLEVEL >= 1 )
- {
+ if(flags & FLAG_NR_AR_ATTACK && MF_DBGLEVEL >= 1 ) {
if(ar_nr_collected > 1 ) {
Dbprintf("Collected two pairs of AR/NR which can be used to extract keys from reader:");
Dbprintf("../tools/mfkey/mfkey32 %06x%08x %08x %08x %08x %08x %08x",
// param:
// bit 0 - trigger from first card answer
// bit 1 - trigger from first reader 7-bit request
-
- // C(red) A(yellow) B(green)
LEDsoff();
+
// init trace buffer
clear_trace();
set_tracing(TRUE);
// The command (reader -> tag) that we're receiving.
// The length of a received command will in most cases be no more than 18 bytes.
// So 32 should be enough!
- uint8_t receivedCmd[MAX_MIFARE_FRAME_SIZE] = {0x00};
+ uint8_t receivedCmd[MAX_MIFARE_FRAME_SIZE] = {0x00};
uint8_t receivedCmdPar[MAX_MIFARE_PARITY_SIZE] = {0x00};
+
// The response (tag -> reader) that we're receiving.
uint8_t receivedResponse[MAX_MIFARE_FRAME_SIZE] = {0x00};
uint8_t receivedResponsePar[MAX_MIFARE_PARITY_SIZE] = {0x00};
// free eventually allocated BigBuf memory
BigBuf_free();
+
// allocate the DMA buffer, used to stream samples from the FPGA
uint8_t *dmaBuf = BigBuf_malloc(DMA_BUFFER_SIZE);
uint8_t *data = dmaBuf;
// response to HLTB and ATTRIB
static const uint8_t response2[] = {0x00, 0x78, 0xF0};
- uint8_t parity[MAX_PARITY_SIZE];
+ uint8_t parity[MAX_PARITY_SIZE] = {0x00};
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
for(;;) {
- if(!GetIso14443bCommandFromReader(receivedCmd, &len)) {
- Dbprintf("button pressed, received %d commands", cmdsRecvd);
- break;
+ if (!GetIso14443bCommandFromReader(receivedCmd, &len)) {
+ Dbprintf("button pressed, received %d commands", cmdsRecvd);
+ break;
}
- if (tracing) {
- LogTrace(receivedCmd, len, 0, 0, parity, TRUE);
- }
+ LogTrace(receivedCmd, len, 0, 0, parity, TRUE);
// Good, look at the command now.
if ( (len == sizeof(cmd1) && memcmp(receivedCmd, cmd1, len) == 0)
// And print whether the CRC fails, just for good measure
uint8_t b1, b2;
if (len >= 3){ // if crc exists
- ComputeCrc14443(CRC_14443_B, receivedCmd, len-2, &b1, &b2);
- if(b1 != receivedCmd[len-2] || b2 != receivedCmd[len-1]) {
- // Not so good, try again.
- DbpString("+++CRC fail");
-
- } else {
- DbpString("CRC passes");
- }
+ ComputeCrc14443(CRC_14443_B, receivedCmd, len-2, &b1, &b2);
+ if(b1 != receivedCmd[len-2] || b2 != receivedCmd[len-1]) {
+ // Not so good, try again.
+ DbpString("+++CRC fail");
+
+ } else {
+ DbpString("CRC passes");
+ }
}
//get rid of compiler warning
respCodeLen = 0;
AT91C_BASE_SSC->SSC_THR = respCode[i++];
FpgaSendQueueDelay = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
}
- if(BUTTON_PRESS()) break;
+ if(BUTTON_PRESS()) break;
}
// Ensure that the FPGA Delay Queue is empty before we switch to TAGSIM_LISTEN again:
}
}
- // trace the response:
- if (tracing) LogTrace(resp, respLen, 0, 0, parity, FALSE);
+ LogTrace(resp, respLen, 0, 0, parity, FALSE);
}
FpgaDisableSscDma();
set_tracing(FALSE);
}
//Tracing
- if (tracing && Demod.len > 0) {
- uint8_t parity[MAX_PARITY_SIZE];
+ if (Demod.len > 0) {
+ uint8_t parity[MAX_PARITY_SIZE] = {0x00};
LogTrace(Demod.output, Demod.len, 0, 0, parity, FALSE);
}
}
upTo = dmaBuf;
lastRxCounter = ISO14443B_DMA_BUFFER_SIZE;
FpgaSetupSscDma((uint8_t*) dmaBuf, ISO14443B_DMA_BUFFER_SIZE);
- uint8_t parity[MAX_PARITY_SIZE];
+ uint8_t parity[MAX_PARITY_SIZE] = {0x00};
bool TagIsActive = FALSE;
bool ReaderIsActive = FALSE;
Dbprintf("blew circular buffer! behindBy=%d", behindBy);
break;
}
+
if(!tracing) {
- DbpString("Reached trace limit");
+ DbpString("Trace full");
break;
}
+
if(BUTTON_PRESS()) {
DbpString("cancelled");
break;
samples += 2;
if (!TagIsActive) { // no need to try decoding reader data if the tag is sending
- if(Handle14443bUartBit(ci & 0x01)) {
- if(triggered && tracing) {
+ if (Handle14443bUartBit(ci & 0x01)) {
+ if ( triggered)
LogTrace(Uart.output, Uart.byteCnt, samples, samples, parity, TRUE);
+
+ /* And ready to receive another command. */
+ UartReset();
+ /* And also reset the demod code, which might have been */
+ /* false-triggered by the commands from the reader. */
+ DemodReset();
}
- /* And ready to receive another command. */
- UartReset();
- /* And also reset the demod code, which might have been */
- /* false-triggered by the commands from the reader. */
- DemodReset();
- }
- if(Handle14443bUartBit(cq & 0x01)) {
- if(triggered && tracing) {
+ if (Handle14443bUartBit(cq & 0x01)) {
+ if (triggered)
LogTrace(Uart.output, Uart.byteCnt, samples, samples, parity, TRUE);
- }
- /* And ready to receive another command. */
- UartReset();
- /* And also reset the demod code, which might have been */
- /* false-triggered by the commands from the reader. */
- DemodReset();
- }
+
+ /* And ready to receive another command. */
+ UartReset();
+ /* And also reset the demod code, which might have been */
+ /* false-triggered by the commands from the reader. */
+ DemodReset();
+ }
ReaderIsActive = (Uart.state > STATE_GOT_FALLING_EDGE_OF_SOF);
}
// is this | 0x01 the error? & 0xfe in https://github.com/Proxmark/proxmark3/issues/103
if(Handle14443bSamplesDemod(ci & 0xfe, cq & 0xfe)) {
- //Use samples as a time measurement
- if(tracing)
- {
- //uint8_t parity[MAX_PARITY_SIZE];
+ //Use samples as a time measurement
LogTrace(Demod.output, Demod.len, samples, samples, parity, FALSE);
- }
- triggered = TRUE;
- // And ready to receive another response.
- DemodReset();
- }
+ triggered = TRUE;
+
+ // And ready to receive another response.
+ DemodReset();
+ }
TagIsActive = (Demod.state > DEMOD_GOT_FALLING_EDGE_OF_SOF);
}
}
FpgaDisableSscDma();
LEDsoff();
- set_tracing(FALSE);
-
+
AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_RXTDIS;
DbpString("Snoop statistics:");
Dbprintf(" Max behind by: %i", maxBehindBy);
Dbprintf(" Uart ByteCnt: %i", Uart.byteCnt);
Dbprintf(" Uart ByteCntMax: %i", Uart.byteCntMax);
Dbprintf(" Trace length: %i", BigBuf_get_traceLen());
+ set_tracing(FALSE);
}
CodeAndTransmit14443bAsReader(data, datalen);
}
- if(recv) {
+ if (recv) {
GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT, FALSE);
uint16_t iLen = MIN(Demod.len, USB_CMD_DATA_SIZE);
cmd_send(CMD_ACK, iLen, 0, 0, Demod.output, iLen);
}
- if(!powerfield) {
+ if (!powerfield) {
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
FpgaDisableSscDma();
set_tracing(FALSE);
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
clear_trace();\r
+ set_tracing(true);\r
\r
LED_A_ON();\r
LED_B_OFF();\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
clear_trace();\r
+ set_tracing(true);\r
\r
if(!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {\r
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card");\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
clear_trace();\r
+ set_tracing(true);\r
\r
int len = iso14443a_select_card(NULL, NULL, NULL, true, 0);\r
if(!len) {\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
clear_trace();\r
-\r
+ set_tracing(true);\r
+ \r
LED_A_ON();\r
LED_B_OFF();\r
LED_C_OFF();\r
// free eventually allocated BigBuf memory\r
BigBuf_free();\r
clear_trace();\r
-\r
+ set_tracing(true);\r
+ \r
// params\r
uint8_t blockNo = arg0;\r
uint16_t blocks = arg1;\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
clear_trace();\r
-\r
+ set_tracing(true);\r
+ \r
LED_A_ON();\r
LED_B_OFF();\r
LED_C_OFF();\r
LED_A_ON(); LED_B_OFF(); LED_C_OFF();\r
\r
clear_trace();\r
+ set_tracing(true);\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
if(!iso14443a_select_card(uid, NULL, NULL, true, 0)) {\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
clear_trace();\r
-\r
+ set_tracing(true);\r
+ \r
if(!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {\r
if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");\r
OnError(0);\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
clear_trace();\r
-\r
+ set_tracing(true);\r
+ \r
if(!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {\r
if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");\r
OnError(0);\r
LED_C_OFF();\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
\r
- if (clearTrace) clear_trace();\r
+ if (clearTrace) \r
+ clear_trace();\r
+ \r
set_tracing(TRUE);\r
\r
for (i = 0; i < keyCount; i++) {\r
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
clear_trace();\r
+ set_tracing(true);\r
\r
int len = iso14443a_select_card(uid, NULL, &cuid, true, 0);\r
if(!len) {\r
print_result(" RX : ", datain, datalen);
}
- if ( flags & CLEARTRACE ){
+ if ( flags & CLEARTRACE )
clear_trace();
- }
if ( flags & INIT ){
if ( !InitDesfireCard() )
}
int len = DesfireAPDU(datain, datalen, resp);
- if (MF_DBGLEVEL >= 4) {
+ if (MF_DBGLEVEL >= 4)
print_result("ERR <--: ", resp, len);
- }
if ( !len ) {
OnError(2);
// reset the pcb_blocknum,
pcb_blocknum = 0;
- if ( flags & DISCONNECT ){
+ if ( flags & DISCONNECT )
OnSuccess();
- }
cmd_send(CMD_ACK,1,len,0,resp,len);
}
LED_B_OFF();\r
\r
clear_trace();\r
- \r
return TRUE;\r
}\r
}
char line[80];
- int offset = 0, j;
+ int offset = 0;
uint32_t data[8] = {0x00};
while ( fgets(line, sizeof(line), f) ) {
uint64_t par_list = 0, ks_list = 0, r_key = 0;\r
int16_t isOK = 0;\r
int tmpchar; \r
+ uint8_t blockNo = 0;\r
+ \r
+ char cmdp = param_getchar(Cmd, 0); \r
+ if ( cmdp == 'H' || cmdp == 'h') {\r
+ PrintAndLog("Usage: hf mf mifare <block number>");\r
+ PrintAndLog(" sample: hf mf mifare 0");\r
+ return 0;\r
+ } \r
\r
- UsbCommand c = {CMD_READER_MIFARE, {true, 0, 0}};\r
+ blockNo = param_get8(Cmd, 0);\r
+ UsbCommand c = {CMD_READER_MIFARE, {true, blockNo, 0}};\r
\r
// message\r
printf("-------------------------------------------------------------------------\n");\r
\r
uint8_t sectrail = (FirstBlockOfSector(i) + NumBlocksPerSector(i) - 1);\r
\r
+ PrintAndLog("Reading block %d", sectrail);\r
+ \r
UsbCommand c = {CMD_MIFARE_READBL, {sectrail, 0, 0}};\r
num_to_bytes(e_sector[i].Key[0], 6, c.d.asBytes); // KEY A\r
clearCommandBuffer();\r
for (i = 0; i < SectorsCnt; i++) {\r
// KEY A but not KEY B\r
if ( e_sector[i].foundKey[0] && !e_sector[i].foundKey[1] ) {\r
- \r
+ \r
uint8_t sectrail = (FirstBlockOfSector(i) + NumBlocksPerSector(i) - 1);\r
\r
+ PrintAndLog("Reading block %d", sectrail);\r
+ \r
UsbCommand c = {CMD_MIFARE_READBL, {sectrail, 0, 0}};\r
num_to_bytes(e_sector[i].Key[0], 6, c.d.asBytes); // KEY A\r
clearCommandBuffer();\r
} noncelist_t;
-static uint32_t cuid;
+static uint32_t cuid = 0;
static noncelist_t nonces[256];
static uint8_t best_first_bytes[256];
static uint16_t first_byte_Sum = 0;