// The main application code. This is the first thing called after start.c
// executes.
//-----------------------------------------------------------------------------
-
#include "usb_cdc.h"
#include "cmd.h"
-
#include "proxmark3.h"
#include "apps.h"
#include "util.h"
#include "printf.h"
#include "string.h"
-
#include <stdarg.h>
-
#include "legicrf.h"
-#include <hitag2.h>
+#include "hitag2.h"
+#include "hitagS.h"
#include "lfsampling.h"
#include "BigBuf.h"
#include "mifareutil.h"
#include "pcf7931.h"
+
#ifdef WITH_LCD
#include "LCD.h"
#endif
#include "protocols.h"
#endif
-#define abs(x) ( ((x)<0) ? -(x) : (x) )
-
//=============================================================================
// A buffer where we can queue things up to be sent through the FPGA, for
// any purpose (fake tag, as reader, whatever). We go MSB first, since that
}
}
+void PrintToSendBuffer(void){
+ DbpString("Printing ToSendBuffer:");
+ Dbhexdump(ToSendMax, ToSend, 0);
+}
+
//=============================================================================
// Debug print functions, to go out over USB, to the usual PC-side client.
//=============================================================================
+void DbpStringEx(char *str, uint32_t cmd){
+ byte_t len = strlen(str);
+ cmd_send(CMD_DEBUG_PRINT_STRING,len, cmd,0,(byte_t*)str,len);
+}
+
void DbpString(char *str) {
- byte_t len = strlen(str);
- cmd_send(CMD_DEBUG_PRINT_STRING,len,0,0,(byte_t*)str,len);
+ DbpStringEx(str, 0);
}
#if 0
void DbpIntegers(int x1, int x2, int x3) {
- cmd_send(CMD_DEBUG_PRINT_INTEGERS,x1,x2,x3,0,0);
+ cmd_send(CMD_DEBUG_PRINT_INTEGERS,x1,x2,x3,0,0);
}
#endif
+void DbprintfEx(uint32_t cmd, const char *fmt, ...) {
+ // should probably limit size here; oh well, let's just use a big buffer
+ char output_string[128] = {0x00};
+ va_list ap;
+
+ va_start(ap, fmt);
+ kvsprintf(fmt, output_string, 10, ap);
+ va_end(ap);
+
+ DbpStringEx(output_string, cmd);
+}
void Dbprintf(const char *fmt, ...) {
// should probably limit size here; oh well, let's just use a big buffer
void MeasureAntennaTuningHf(void) {
int vHf = 0; // in mV
-
- DbpString("Measuring HF antenna, press button to exit");
-
// Let the FPGA drive the high-frequency antenna around 13.56 MHz.
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
- for (;;) {
+ while ( !BUTTON_PRESS() ){
SpinDelay(20);
vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
-
- Dbprintf("%d mV",vHf);
- if (BUTTON_PRESS()) break;
+ //Dbprintf("%d mV",vHf);
+ DbprintfEx(CMD_MEASURE_ANTENNA_TUNING_HF, "%d mV",vHf);
}
-
- DbpString("cancelled");
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+ DbpString("cancelled");
}
SpinDelay(500);
CmdHIDdemodFSK(1, &high[selected], &low[selected], 0);
- Dbprintf("Recorded %x %x %x", selected, high[selected], low[selected]);
+ Dbprintf("Recorded %x %x %08x", selected, high[selected], low[selected]);
LEDsoff();
LED(selected + 1, 0);
LED(LED_ORANGE, 0);
// record
- Dbprintf("Cloning %x %x %x", selected, high[selected], low[selected]);
+ Dbprintf("Cloning %x %x %08x", selected, high[selected], low[selected]);
// wait for button to be released
while(BUTTON_PRESS())
/* need this delay to prevent catching some weird data */
SpinDelay(500);
- CopyHIDtoT55x7(high[selected], low[selected], 0, 0);
- Dbprintf("Cloned %x %x %x", selected, high[selected], low[selected]);
+ CopyHIDtoT55x7(0, high[selected], low[selected], 0);
+ Dbprintf("Cloned %x %x %08x", selected, high[selected], low[selected]);
LEDsoff();
LED(selected + 1, 0);
while(BUTTON_PRESS())
WDT_HIT();
- Dbprintf("%x %x %x", selected, high[selected], low[selected]);
+ Dbprintf("%x %x %08x", selected, high[selected], low[selected]);
CmdHIDsimTAG(high[selected], low[selected], 0);
DbpString("Done playing");
if (limit != HF_ONLY) {
if(mode == 1) {
- if (abs(lf_av - lf_baseline) > REPORT_CHANGE)
+ if (ABS(lf_av - lf_baseline) > REPORT_CHANGE)
LED_D_ON();
else
LED_D_OFF();
lf_av_new = AvgAdc(ADC_CHAN_LF);
// see if there's a significant change
- if(abs(lf_av - lf_av_new) > REPORT_CHANGE) {
+ if(ABS(lf_av - lf_av_new) > REPORT_CHANGE) {
Dbprintf("LF 125/134kHz Field Change: %5dmV", (MAX_ADC_LF_VOLTAGE * lf_av_new) >> 10);
lf_av = lf_av_new;
if (lf_av > lf_max)
if (limit != LF_ONLY) {
if (mode == 1){
- if (abs(hf_av - hf_baseline) > REPORT_CHANGE)
+ if (ABS(hf_av - hf_baseline) > REPORT_CHANGE)
LED_B_ON();
else
LED_B_OFF();
hf_av_new = AvgAdc(ADC_CHAN_HF);
// see if there's a significant change
- if(abs(hf_av - hf_av_new) > REPORT_CHANGE) {
+ if(ABS(hf_av - hf_av_new) > REPORT_CHANGE) {
Dbprintf("HF 13.56MHz Field Change: %5dmV", (MAX_ADC_HF_VOLTAGE * hf_av_new) >> 10);
hf_av = hf_av_new;
if (hf_av > hf_max)
case CMD_READER_HITAG: // Reader for Hitag tags, args = type and function
ReaderHitag((hitag_function)c->arg[0],(hitag_data*)c->d.asBytes);
break;
+ case CMD_SIMULATE_HITAG_S:// Simulate Hitag s tag, args = memory content
+ SimulateHitagSTag((bool)c->arg[0],(byte_t*)c->d.asBytes);
+ break;
+ case CMD_TEST_HITAGS_TRACES:// Tests every challenge within the given file
+ check_challenges((bool)c->arg[0],(byte_t*)c->d.asBytes);
+ break;
+ case CMD_READ_HITAG_S: //Reader for only Hitag S tags, args = key or challenge
+ ReadHitagS((hitag_function)c->arg[0],(hitag_data*)c->d.asBytes);
+ break;
+ case CMD_WR_HITAG_S: //writer for Hitag tags args=data to write,page and key or challenge
+ WritePageHitagS((hitag_function)c->arg[0],(hitag_data*)c->d.asBytes,c->arg[2]);
+ break;
#endif
#ifdef WITH_ISO15693
#endif
#ifdef WITH_ISO14443b
- case CMD_READ_SRI512_TAG:
- ReadSTMemoryIso14443b(0x0F);
- break;
- case CMD_READ_SRIX4K_TAG:
- ReadSTMemoryIso14443b(0x7F);
+ case CMD_READ_SRI_TAG:
+ ReadSTMemoryIso14443b(c->arg[0]);
break;
case CMD_SNOOP_ISO_14443B:
SnoopIso14443b();
break;
case CMD_SIMULATE_TAG_ISO_14443B:
- SimulateIso14443bTag();
+ SimulateIso14443bTag(c->arg[0]);
break;
case CMD_ISO_14443B_COMMAND:
- SendRawCommand14443B(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes);
+ //SendRawCommand14443B(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes);
+ SendRawCommand14443B_Ex(c);
break;
#endif
case CMD_SIMULATE_TAG_ISO_14443a:
SimulateIso14443aTag(c->arg[0], c->arg[1], c->d.asBytes); // ## Simulate iso14443a tag - pass tag type & UID
break;
-
case CMD_EPA_PACE_COLLECT_NONCE:
EPA_PACE_Collect_Nonce(c);
break;
case CMD_EPA_PACE_REPLAY:
EPA_PACE_Replay(c);
break;
-
case CMD_READER_MIFARE:
ReaderMifare(c->arg[0], c->arg[1]);
break;
LED_D_OFF(); // LED D indicates field ON or OFF
break;
- case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K:
-
+ case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K: {
LED_B_ON();
uint8_t *BigBuf = BigBuf_get_addr();
size_t len = 0;
cmd_send(CMD_ACK,1,0,BigBuf_get_traceLen(),getSamplingConfig(),sizeof(sample_config));
LED_B_OFF();
break;
-
+ }
case CMD_DOWNLOADED_SIM_SAMPLES_125K: {
uint8_t *b = BigBuf_get_addr();
- memcpy(b+c->arg[0], c->d.asBytes, USB_CMD_DATA_SIZE);
+ memcpy( b + c->arg[0], c->d.asBytes, USB_CMD_DATA_SIZE);
cmd_send(CMD_ACK,0,0,0,0,0);
break;
- }
+ }
+ case CMD_DOWNLOAD_EML_BIGBUF: {
+ LED_B_ON();
+ uint8_t *cardmem = BigBuf_get_EM_addr();
+ size_t len = 0;
+ for(size_t i=0; i < c->arg[1]; i += USB_CMD_DATA_SIZE) {
+ len = MIN((c->arg[1] - i), USB_CMD_DATA_SIZE);
+ cmd_send(CMD_DOWNLOADED_EML_BIGBUF, i, len, CARD_MEMORY_SIZE, cardmem + c->arg[0] + i, len);
+ }
+ // Trigger a finish downloading signal with an ACK frame
+ cmd_send(CMD_ACK, 1, 0, CARD_MEMORY_SIZE, 0, 0);
+ LED_B_OFF();
+ break;
+ }
case CMD_READ_MEM:
ReadMem(c->arg[0]);
break;