X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/f2c2b174cdf702045d5fdd59aecf5dac8e8b44f2..bdebc8dbab9ca3867faf32532c4db32966fce56a:/armsrc/appmain.c diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 428d187e..d4b22465 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -10,20 +10,15 @@ // executes. //----------------------------------------------------------------------------- #include "usb_cdc.h" -#include "cmd.h" #include "proxmark3.h" #include "apps.h" #include "util.h" #include "printf.h" #include "string.h" -#include #include "legicrf.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" @@ -71,6 +66,33 @@ void ToSendStuffBit(int b) { } } +void PrintToSendBuffer(void){ + DbpString("Printing ToSendBuffer:"); + Dbhexdump(ToSendMax, ToSend, 0); +} + +void print_result(char *name, uint8_t *buf, size_t len) { + uint8_t *p = buf; + + if ( len % 16 == 0 ) { + for(; p-buf < len; p += 16) + Dbprintf("[%s:%d/%d] %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", + name, + p-buf, + len, + p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15] + ); + } + else { + for(; p-buf < len; p += 8) + Dbprintf("[%s:%d/%d] %02x %02x %02x %02x %02x %02x %02x %02x", + name, + p-buf, + len, + p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); + } +} + //============================================================================= // Debug print functions, to go out over USB, to the usual PC-side client. //============================================================================= @@ -177,20 +199,21 @@ static int ReadAdc(int ch) int AvgAdc(int ch) // was static - merlok { - int i; - int a = 0; - + int i, a = 0; for(i = 0; i < 32; ++i) a += ReadAdc(ch); return (a + 15) >> 5; } + void MeasureAntennaTuning(void) { + uint8_t LF_Results[256]; - int i, adcval = 0, peak = 0, peakv = 0, peakf = 0; //ptr = 0 + int i, adcval = 0, peak = 0, peakv = 0, peakf = 0; int vLf125 = 0, vLf134 = 0, vHf = 0; // in mV + memset(LF_Results, 0, sizeof(LF_Results)); LED_B_ON(); /* @@ -204,8 +227,8 @@ void MeasureAntennaTuning(void) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); - - for (i=255; i>=19; i--) { + + for (i = 255; i >= 19; i--) { WDT_HIT(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i); SpinDelay(20); @@ -213,17 +236,14 @@ void MeasureAntennaTuning(void) { if (i==95) vLf125 = adcval; // voltage at 125Khz if (i==89) vLf134 = adcval; // voltage at 134Khz - LF_Results[i] = adcval>>8; // scale int to fit in byte for graphing purposes + LF_Results[i] = adcval >> 8; // scale int to fit in byte for graphing purposes if(LF_Results[i] > peak) { peakv = adcval; peak = LF_Results[i]; peakf = i; - //ptr = i; } } - for (i=18; i >= 0; i--) LF_Results[i] = 0; - LED_A_ON(); // Let the FPGA drive the high-frequency antenna around 13.56 MHz. FpgaDownloadAndGo(FPGA_BITSTREAM_HF); @@ -231,9 +251,8 @@ void MeasureAntennaTuning(void) { SpinDelay(20); vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; - cmd_send(CMD_MEASURED_ANTENNA_TUNING, vLf125 | (vLf134<<16), vHf, peakf | (peakv<<16), LF_Results, 256); + cmd_send(CMD_MEASURED_ANTENNA_TUNING, vLf125 | (vLf134 << 16), vHf, peakf | (peakv << 16), LF_Results, 256); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); } @@ -894,7 +913,7 @@ void UsbPacketReceived(uint8_t *packet, int len) { UsbCommand *c = (UsbCommand *)packet; - //Dbprintf("received %d bytes, with command: 0x%04x and args: %d %d %d",len,c->cmd,c->arg[0],c->arg[1],c->arg[2]); + //Dbprintf("received %d bytes, with command: 0x%04x and args: %d %d %d",len,c->cmd,c->arg[0],c->arg[1],c->arg[2]); switch(c->cmd) { #ifdef WITH_LF @@ -905,7 +924,7 @@ void UsbPacketReceived(uint8_t *packet, int len) cmd_send(CMD_ACK, SampleLF(c->arg[0]),0,0,0,0); break; case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K: - ModThenAcquireRawAdcSamples125k(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes); + ModThenAcquireRawAdcSamples125k(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes); break; case CMD_LF_SNOOP_RAW_ADC_SAMPLES: cmd_send(CMD_ACK,SnoopLF(),0,0,0,0); @@ -947,7 +966,7 @@ void UsbPacketReceived(uint8_t *packet, int len) WriteTItag(c->arg[0],c->arg[1],c->arg[2]); break; case CMD_SIMULATE_TAG_125K: - LED_A_ON(); + LED_A_ON(); SimulateTagLowFrequency(c->arg[0], c->arg[1], 1); LED_A_OFF(); break; @@ -1008,10 +1027,10 @@ void UsbPacketReceived(uint8_t *packet, int len) 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 + 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 + 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 @@ -1023,19 +1042,15 @@ void UsbPacketReceived(uint8_t *packet, int len) case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693: RecordRawAdcSamplesIso15693(); break; - case CMD_ISO_15693_COMMAND: DirectTag15693Command(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes); break; - case CMD_ISO_15693_FIND_AFI: BruteforceIso15693Afi(c->arg[0]); break; - case CMD_ISO_15693_DEBUG: SetDebugIso15693(c->arg[0]); break; - case CMD_READER_ISO_15693: ReaderIso15693(c->arg[0]); break; @@ -1048,31 +1063,33 @@ void UsbPacketReceived(uint8_t *packet, int len) case CMD_SIMULATE_TAG_LEGIC_RF: LegicRfSimulate(c->arg[0], c->arg[1], c->arg[2]); break; - case CMD_WRITER_LEGIC_RF: - LegicRfWriter(c->arg[1], c->arg[0]); + LegicRfWriter( c->arg[0], c->arg[1], c->arg[2], c->d.asBytes); break; - case CMD_READER_LEGIC_RF: - LegicRfReader(c->arg[0], c->arg[1]); + LegicRfReader(c->arg[0], c->arg[1], c->arg[2]); + break; + case CMD_LEGIC_INFO: + LegicRfInfo(); + break; + case CMD_LEGIC_ESET: + LegicEMemSet(c->arg[0], c->arg[1], c->d.asBytes); break; #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 @@ -1086,16 +1103,14 @@ void UsbPacketReceived(uint8_t *packet, int len) 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]); + ReaderMifare(c->arg[0], c->arg[1], c->arg[2]); break; case CMD_MIFARE_READBL: MifareReadBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes); @@ -1188,7 +1203,6 @@ void UsbPacketReceived(uint8_t *packet, int len) case CMD_MIFARE_DESFIRE: MifareSendCommand(c->arg[0], c->arg[1], c->d.asBytes); break; - case CMD_MIFARE_COLLECT_NONCES: break; #endif @@ -1219,7 +1233,7 @@ void UsbPacketReceived(uint8_t *packet, int len) case CMD_READER_ICLASS_REPLAY: ReaderIClass_Replay(c->arg[0], c->d.asBytes); break; - case CMD_ICLASS_EML_MEMSET: + case CMD_ICLASS_EML_MEMSET: emlSet(c->d.asBytes,c->arg[0], c->arg[1]); break; case CMD_ICLASS_WRITEBLOCK: @@ -1273,19 +1287,36 @@ void UsbPacketReceived(uint8_t *packet, int len) LED_B_ON(); uint8_t *BigBuf = BigBuf_get_addr(); size_t len = 0; - for(size_t i=0; iarg[1]; i += USB_CMD_DATA_SIZE) { - len = MIN((c->arg[1] - i),USB_CMD_DATA_SIZE); - cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K,i,len,BigBuf_get_traceLen(),BigBuf+c->arg[0]+i,len); + size_t startidx = c->arg[0]; + uint8_t isok = FALSE; + // arg0 = startindex + // arg1 = length bytes to transfer + // arg2 = RFU + //Dbprintf("transfer to client parameters: %llu | %llu | %llu", c->arg[0], c->arg[1], c->arg[2]); + + for(size_t i = 0; i < c->arg[1]; i += USB_CMD_DATA_SIZE) { + len = MIN( (c->arg[1] - i), USB_CMD_DATA_SIZE); + isok = cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K, i, len, BigBuf_get_traceLen(), BigBuf + startidx + i, len); + if (!isok) + Dbprintf("transfer to client failed :: | bytes %d", len); } // Trigger a finish downloading signal with an ACK frame - cmd_send(CMD_ACK,1,0,BigBuf_get_traceLen(),getSamplingConfig(),sizeof(sample_config)); + cmd_send(CMD_ACK, 1, 0, BigBuf_get_traceLen(), getSamplingConfig(), sizeof(sample_config)); LED_B_OFF(); break; } case CMD_DOWNLOADED_SIM_SAMPLES_125K: { + // iceman; since changing fpga_bitstreams clears bigbuff, Its better to call it before. + // to be able to use this one for uploading data to device + // arg1 = 0 upload for LF usage + // 1 upload for HF usage + if ( c->arg[1] == 0 ) + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); + else + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); uint8_t *b = BigBuf_get_addr(); memcpy( b + c->arg[0], c->d.asBytes, USB_CMD_DATA_SIZE); - cmd_send(CMD_ACK,0,0,0,0,0); + cmd_send(CMD_ACK,1,0,0,0,0); break; } case CMD_DOWNLOAD_EML_BIGBUF: { @@ -1380,10 +1411,7 @@ void __attribute__((noreturn)) AppMain(void) } common_area.flags.osimage_present = 1; - LED_D_OFF(); - LED_C_OFF(); - LED_B_OFF(); - LED_A_OFF(); + LEDsoff(); // Init USB device usb_enable(); @@ -1393,8 +1421,7 @@ void __attribute__((noreturn)) AppMain(void) AT91C_BASE_PIOA->PIO_PDR = GPIO_PCK0; AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK0; // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz - AT91C_BASE_PMC->PMC_PCKR[0] = AT91C_PMC_CSS_PLL_CLK | - AT91C_PMC_PRES_CLK_4; // 4 for 24Mhz pck0, 2 for 48 MHZ pck0 + AT91C_BASE_PMC->PMC_PCKR[0] = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_4; // 4 for 24Mhz pck0, 2 for 48 MHZ pck0 AT91C_BASE_PIOA->PIO_OER = GPIO_PCK0; // Reset SPI @@ -1416,10 +1443,11 @@ void __attribute__((noreturn)) AppMain(void) size_t rx_len; for(;;) { - if (usb_poll()) { - rx_len = usb_read(rx,sizeof(UsbCommand)); + if ( usb_poll_validate_length() ) { + rx_len = usb_read(rx, sizeof(UsbCommand)); + if (rx_len) - UsbPacketReceived(rx,rx_len); + UsbPacketReceived(rx, rx_len); } WDT_HIT();