]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/appmain.c
fix 'hf iclass replay' (#888)
[proxmark3-svn] / armsrc / appmain.c
index 573a3a71251cadb61bb9a983b142cd1ac32ee8aa..cb8fd2910b00066837bf73d80fc36468f5636d3b 100644 (file)
 #include "legicrfsim.h"
 #include "hitag2.h"
 #include "hitagS.h"
+#include "iclass.h"
+#include "iso14443b.h"
+#include "iso15693.h"
 #include "lfsampling.h"
 #include "BigBuf.h"
+#include "mifarecmd.h"
 #include "mifareutil.h"
+#include "mifaresim.h"
 #include "pcf7931.h"
 #include "i2c.h"
+#include "hfsnoop.h"
+#include "fpgaloader.h"
 #ifdef WITH_LCD
  #include "LCD.h"
 #endif
 
+static uint32_t hw_capabilities;
 
 // Craig Young - 14a stand-alone code
 #ifdef WITH_ISO14443a
@@ -239,7 +247,7 @@ void MeasureAntennaTuningHfOnly(int *vHf)
        // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
        LED_A_ON();
        FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
-       FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
+       FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER);
        SpinDelay(20);
        *vHf = AvgAdc_Voltage_HF();
        LED_A_OFF();
@@ -281,7 +289,7 @@ void MeasureAntennaTuningHf(void)
 
        // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
        FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
-       FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
+       FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER);
 
        for (;;) {
                SpinDelay(500);
@@ -311,8 +319,22 @@ extern struct version_information version_information;
 extern char *_bootphase1_version_pointer, _flash_start, _flash_end, _bootrom_start, _bootrom_end, __data_src_start__;
 
 
+void set_hw_capabilities(void)
+{
+       if (I2C_is_available()) {
+               hw_capabilities |= HAS_SMARTCARD_SLOT;
+       }
+       
+       if (false) { // TODO: implement a test
+               hw_capabilities |= HAS_EXTRA_FLASH_MEM;
+       }
+}      
+
+
 void SendVersion(void)
 {
+       set_hw_capabilities();
+       
        char temp[USB_CMD_DATA_SIZE]; /* Limited data payload in USB packets */
        char VersionString[USB_CMD_DATA_SIZE] = { '\0' };
 
@@ -346,7 +368,7 @@ void SendVersion(void)
        // Send Chip ID and used flash memory
        uint32_t text_and_rodata_section_size = (uint32_t)&__data_src_start__ - (uint32_t)&_flash_start;
        uint32_t compressed_data_section_size = common_area.arg1;
-       cmd_send(CMD_ACK, *(AT91C_DBGU_CIDR), text_and_rodata_section_size + compressed_data_section_size, 0, VersionString, strlen(VersionString));
+       cmd_send(CMD_ACK, *(AT91C_DBGU_CIDR), text_and_rodata_section_size + compressed_data_section_size, hw_capabilities, VersionString, strlen(VersionString));
 }
 
 // measure the USB Speed by sending SpeedTestBufferSize bytes to client and measuring the elapsed time.
@@ -744,7 +766,7 @@ void SamyRun()
                                        /* need this delay to prevent catching some weird data */
                                        SpinDelay(500);
 
-                                       CopyHIDtoT55x7(tops[selected] & 0x000FFFFF, high[selected], low[selected], (tops[selected] != 0 && ((high[selected]& 0xFFFFFFC0) != 0)));
+                                       CopyHIDtoT55x7(tops[selected] & 0x000FFFFF, high[selected], low[selected], (tops[selected] != 0 && ((high[selected]& 0xFFFFFFC0) != 0)), 0x1D);
                                        if (tops[selected] > 0)
                                                Dbprintf("Cloned %x %x%08x%08x", selected, tops[selected], high[selected], low[selected]);
                                        else
@@ -976,7 +998,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
        switch(c->cmd) {
 #ifdef WITH_LF
                case CMD_SET_LF_SAMPLING_CONFIG:
-                       setSamplingConfig((sample_config *) c->d.asBytes);
+                       setSamplingConfig(c->d.asBytes);
                        break;
                case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K:
                        cmd_send(CMD_ACK,SampleLF(c->arg[0], c->arg[1]),0,0,0,0);
@@ -1003,7 +1025,11 @@ void UsbPacketReceived(uint8_t *packet, int len)
                        CmdPSKsimTag(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
                        break;
                case CMD_HID_CLONE_TAG:
-                       CopyHIDtoT55x7(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
+                       CopyHIDtoT55x7(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0], 0x1D);
+                       break;
+               case CMD_PARADOX_CLONE_TAG:
+                       // Paradox cards are the same as HID, with a different preamble, so we can reuse the same function
+                       CopyHIDtoT55x7(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0], 0x0F);
                        break;
                case CMD_IO_DEMOD_FSK:
                        CmdIOdemodFSK(c->arg[0], 0, 0, 1);
@@ -1055,12 +1081,18 @@ void UsbPacketReceived(uint8_t *packet, int len)
                case CMD_PCF7931_WRITE:
                        WritePCF7931(c->d.asBytes[0],c->d.asBytes[1],c->d.asBytes[2],c->d.asBytes[3],c->d.asBytes[4],c->d.asBytes[5],c->d.asBytes[6], c->d.asBytes[9], c->d.asBytes[7]-128,c->d.asBytes[8]-128, c->arg[0], c->arg[1], c->arg[2]);
                        break;
+               case CMD_PCF7931_BRUTEFORCE:
+                       BruteForcePCF7931(c->arg[0], (c->arg[1] & 0xFF), c->d.asBytes[9], c->d.asBytes[7]-128,c->d.asBytes[8]-128);
+                       break;
                case CMD_EM4X_READ_WORD:
                        EM4xReadWord(c->arg[0], c->arg[1],c->arg[2]);
                        break;
                case CMD_EM4X_WRITE_WORD:
                        EM4xWriteWord(c->arg[0], c->arg[1], c->arg[2]);
                        break;
+               case CMD_EM4X_PROTECT:
+                       EM4xProtect(c->arg[0], c->arg[1], c->arg[2]);
+                       break;
                case CMD_AWID_DEMOD_FSK: // Set realtime AWID demodulation
                        CmdAWIDdemodFSK(c->arg[0], 0, 0, 1);
                        break;
@@ -1086,10 +1118,13 @@ void UsbPacketReceived(uint8_t *packet, int len)
                        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);
+                       check_challenges_cmd((bool)c->arg[0], (byte_t*)c->d.asBytes, (uint8_t)c->arg[1]);
                        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);
+                       ReadHitagSCmd((hitag_function)c->arg[0], (hitag_data*)c->d.asBytes, (uint8_t)c->arg[1], (uint8_t)c->arg[2], false);
+                       break;
+               case CMD_READ_HITAG_S_BLK:
+                       ReadHitagSCmd((hitag_function)c->arg[0], (hitag_data*)c->d.asBytes, (uint8_t)c->arg[1], (uint8_t)c->arg[2], true);
                        break;
                case CMD_WR_HITAG_S://writer for Hitag tags args=data to write,page and key or challenge
                        if ((hitag_function)c->arg[0] < 10) {
@@ -1105,8 +1140,9 @@ void UsbPacketReceived(uint8_t *packet, int len)
                case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693:
                        AcquireRawAdcSamplesIso15693();
                        break;
-               case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693:
-                       RecordRawAdcSamplesIso15693();
+                       
+               case CMD_SNOOP_ISO_15693:
+                       SnoopIso15693(0, NULL);
                        break;
                        
                case CMD_ISO_15693_COMMAND:
@@ -1124,9 +1160,14 @@ void UsbPacketReceived(uint8_t *packet, int len)
                case CMD_READER_ISO_15693:
                        ReaderIso15693(c->arg[0]);
                        break;
+
                case CMD_SIMTAG_ISO_15693:
                        SimTagIso15693(c->arg[0], c->d.asBytes);
                        break;
+
+               case CMD_CSETUID_ISO_15693:
+                       SetTag15693Uid(c->d.asBytes);
+                       break;
 #endif
 
 #ifdef WITH_LEGICRF
@@ -1203,6 +1244,9 @@ void UsbPacketReceived(uint8_t *packet, int len)
                case CMD_MIFARE_WRITEBL:
                        MifareWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
                        break;
+               case CMD_MIFARE_PERSONALIZE_UID:
+                       MifarePersonalizeUID(c->arg[0], c->arg[1], c->d.asBytes);
+                       break;
                //case CMD_MIFAREU_WRITEBL_COMPAT:
                        //MifareUWriteBlockCompat(c->arg[0], c->d.asBytes);
                        //break;
@@ -1219,7 +1263,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
                        MifareChkKeys(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
                        break;
                case CMD_SIMULATE_MIFARE_CARD:
-                       Mifare1ksim(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+                       MifareSim(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
                        break;
                
                // emulator
@@ -1263,7 +1307,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
 #ifdef WITH_ICLASS
                // Makes use of ISO14443a FPGA Firmware
                case CMD_SNOOP_ICLASS:
-                       SnoopIClass();
+                       SnoopIClass(c->arg[0], c->d.asBytes);
                        break;
                case CMD_SIMULATE_TAG_ICLASS:
                        SimulateIClass(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
@@ -1271,23 +1315,20 @@ void UsbPacketReceived(uint8_t *packet, int len)
                case CMD_READER_ICLASS:
                        ReaderIClass(c->arg[0]);
                        break;
-               case CMD_READER_ICLASS_REPLAY:
-                       ReaderIClass_Replay(c->arg[0], c->d.asBytes);
-                       break;
                case CMD_ICLASS_EML_MEMSET:
                        emlSet(c->d.asBytes,c->arg[0], c->arg[1]);
                        break;
                case CMD_ICLASS_WRITEBLOCK:
                        iClass_WriteBlock(c->arg[0], c->d.asBytes);
                        break;
-               case CMD_ICLASS_READCHECK:  // auth step 1
-                       iClass_ReadCheck(c->arg[0], c->arg[1]);
-                       break;
                case CMD_ICLASS_READBLOCK:
                        iClass_ReadBlk(c->arg[0]);
                        break;
-               case CMD_ICLASS_AUTHENTICATION: //check
-                       iClass_Authentication(c->d.asBytes);
+               case CMD_ICLASS_CHECK:
+                       iClass_Check(c->d.asBytes);
+                       break;
+               case CMD_ICLASS_READCHECK:
+                       iClass_Readcheck(c->arg[0], c->arg[1]);
                        break;
                case CMD_ICLASS_DUMP:
                        iClass_Dump(c->arg[0], c->arg[1]);
@@ -1296,11 +1337,16 @@ void UsbPacketReceived(uint8_t *packet, int len)
                        iClass_Clone(c->arg[0], c->arg[1], c->d.asBytes);
                        break;
 #endif
+
 #ifdef WITH_HFSNOOP
                case CMD_HF_SNIFFER:
                        HfSnoop(c->arg[0], c->arg[1]);
                        break;
+               case CMD_HF_PLOT:
+                       HfPlot();
+                       break;
 #endif
+
 #ifdef WITH_SMARTCARD
                case CMD_SMART_ATR: {
                        SmartCardAtr();
@@ -1350,7 +1396,6 @@ void UsbPacketReceived(uint8_t *packet, int len)
                        break;
 
                case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K:
-
                        LED_B_ON();
                        uint8_t *BigBuf = BigBuf_get_addr();
                        for(size_t i=0; i<c->arg[1]; i += USB_CMD_DATA_SIZE) {
@@ -1457,11 +1502,8 @@ 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();
 
Impressum, Datenschutz