]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge pull request #1 from Proxmark/master
authormarshmellow42 <marshmellow42@users.noreply.github.com>
Mon, 29 Dec 2014 21:14:23 +0000 (16:14 -0500)
committermarshmellow42 <marshmellow42@users.noreply.github.com>
Mon, 29 Dec 2014 21:14:23 +0000 (16:14 -0500)
Test

1  2 
armsrc/appmain.c
armsrc/apps.h
client/cmddata.c

diff --combined armsrc/appmain.c
index 8347bed9009ad59df18db330459ee488573c366f,24c0c182e2c2fac89f4fce2975f820e23488c1b6..57c485e878b0c15cee795319d8561d004210e31e
@@@ -36,7 -36,8 +36,8 @@@
  // is the order in which they go out on the wire.
  //=============================================================================
  
- uint8_t ToSend[512];
+ #define TOSEND_BUFFER_SIZE (9*MAX_FRAME_SIZE + 1 + 1 + 2)  // 8 data bits and 1 parity bit per payload byte, 1 correction bit, 1 SOC bit, 2 EOC bits 
+ uint8_t ToSend[TOSEND_BUFFER_SIZE];
  int ToSendMax;
  static int ToSendBit;
  struct common_area common_area __attribute__((section(".commonarea")));
@@@ -67,7 -68,7 +68,7 @@@ void ToSendStuffBit(int b
  
        ToSendBit++;
  
-       if(ToSendBit >= sizeof(ToSend)) {
+       if(ToSendMax >= sizeof(ToSend)) {
                ToSendBit = 0;
                DbpString("ToSendStuffBit overflowed!");
        }
@@@ -195,15 -196,11 +196,11 @@@ int AvgAdc(int ch) // was static - merl
  
  void MeasureAntennaTuning(void)
  {
-       uint8_t *dest = (uint8_t *)BigBuf+FREE_BUFFER_OFFSET;
+       uint8_t LF_Results[256];
        int i, adcval = 0, peak = 0, peakv = 0, peakf = 0; //ptr = 0 
        int vLf125 = 0, vLf134 = 0, vHf = 0;    // in mV
  
- //    UsbCommand c;
-   LED_B_ON();
-       DbpString("Measuring antenna characteristics, please wait...");
-       memset(dest,0,FREE_BUFFER_SIZE);
+       LED_B_ON();
  
  /*
   * Sweeps the useful LF range of the proxmark from
    
        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);
                if (i==95)      vLf125 = adcval; // voltage at 125Khz
                if (i==89)      vLf134 = adcval; // voltage at 134Khz
  
-               dest[i] = adcval>>8; // scale int to fit in byte for graphing purposes
-               if(dest[i] > peak) {
+               LF_Results[i] = adcval>>8; // scale int to fit in byte for graphing purposes
+               if(LF_Results[i] > peak) {
                        peakv = adcval;
-                       peak = dest[i];
+                       peak = LF_Results[i];
                        peakf = i;
                        //ptr = i;
                }
        }
  
-   LED_A_ON();
+       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);
        FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
        // can measure voltages up to 33000 mV
        vHf = (33000 * AvgAdc(ADC_CHAN_HF)) >> 10;
  
- //    c.cmd = CMD_MEASURED_ANTENNA_TUNING;
- //    c.arg[0] = (vLf125 << 0) | (vLf134 << 16);
- //    c.arg[1] = vHf;
- //    c.arg[2] = peakf | (peakv << 16);
-   DbpString("Measuring complete, sending report back to host");
-   cmd_send(CMD_MEASURED_ANTENNA_TUNING,vLf125|(vLf134<<16),vHf,peakf|(peakv<<16),0,0);
- //    UsbSendPacket((uint8_t *)&c, sizeof(c));
+       cmd_send(CMD_MEASURED_ANTENNA_TUNING,vLf125|(vLf134<<16),vHf,peakf|(peakv<<16),LF_Results,256);
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-   LED_A_OFF();
-   LED_B_OFF();
-   return;
+       LED_A_OFF();
+       LED_B_OFF();
+       return;
  }
  
  void MeasureAntennaTuningHf(void)
@@@ -657,9 -649,6 +649,9 @@@ void UsbPacketReceived(uint8_t *packet
                case CMD_IO_CLONE_TAG: // Clone IO tag by ID to T55x7
                        CopyIOtoT55x7(c->arg[0], c->arg[1], c->d.asBytes[0]);
                        break;
 +              case CMD_EM410X_DEMOD:
 +                      CmdEM410xdemod(c->arg[0], 0, 0, 1);
 +                      break;
                case CMD_EM410X_WRITE_TAG:
                        WriteEM410x(c->arg[0], c->arg[1], c->arg[2]);
                        break;
diff --combined armsrc/apps.h
index ee9fea743010b4bb6d06b0342a13e2bb878ee100,f57cd44945d171208feaee1775e4a82fe51ef26b..ed51c7b94894faf9413b9d84e91b3aae5bbedd81
  
  // The large multi-purpose buffer, typically used to hold A/D samples,
  // maybe processed in some way.
- uint32_t BigBuf[10000];
- // BIG CHANGE - UNDERSTAND THIS BEFORE WE COMMIT
- #define TRACE_OFFSET          0
- #define TRACE_SIZE         3000
- #define RECV_CMD_OFFSET    3032
- #define RECV_CMD_SIZE        64
- #define RECV_RES_OFFSET    3096
- #define RECV_RES_SIZE        64
- #define DMA_BUFFER_OFFSET  3160
- #define DMA_BUFFER_SIZE    4096
- #define FREE_BUFFER_OFFSET 7256
- #define FREE_BUFFER_SIZE   2744
+ #define BIGBUF_SIZE                           40000
+ uint32_t BigBuf[BIGBUF_SIZE / sizeof(uint32_t)];
+ #define TRACE_OFFSET                  0
+ #define TRACE_SIZE                            3000
+ #define RECV_CMD_OFFSET                       (TRACE_OFFSET + TRACE_SIZE)
+ #define MAX_FRAME_SIZE                        256
+ #define MAX_PARITY_SIZE                       ((MAX_FRAME_SIZE + 1)/ 8)
+ #define RECV_CMD_PAR_OFFSET           (RECV_CMD_OFFSET + MAX_FRAME_SIZE)
+ #define RECV_RESP_OFFSET              (RECV_CMD_PAR_OFFSET + MAX_PARITY_SIZE)
+ #define RECV_RESP_PAR_OFFSET  (RECV_RESP_OFFSET + MAX_FRAME_SIZE)
+ #define CARD_MEMORY_OFFSET            (RECV_RESP_PAR_OFFSET + MAX_PARITY_SIZE)
+ #define CARD_MEMORY_SIZE              4096    
+ #define DMA_BUFFER_OFFSET             CARD_MEMORY_OFFSET
+ #define DMA_BUFFER_SIZE               CARD_MEMORY_SIZE
+ #define FREE_BUFFER_OFFSET            (CARD_MEMORY_OFFSET + CARD_MEMORY_SIZE)
+ #define FREE_BUFFER_SIZE              (BIGBUF_SIZE - FREE_BUFFER_OFFSET - 1)
  
  extern const uint8_t OddByteParity[256];
  extern uint8_t *trace; // = (uint8_t *) BigBuf;
@@@ -128,7 -132,6 +132,7 @@@ void AcquireRawBitsTI(void)
  void SimulateTagLowFrequency(int period, int gap, int ledcontrol);
  void CmdHIDsimTAG(int hi, int lo, int ledcontrol);
  void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol);
 +void CmdEM410xdemod(int findone, int *high, int *low, int ledcontrol);
  void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol);
  void CopyIOtoT55x7(uint32_t hi, uint32_t lo, uint8_t longFMT); // Clone an ioProx card to T5557/T5567
  void SimulateTagLowFrequencyBidir(int divisor, int max_bitlen);
@@@ -158,8 -161,8 +162,8 @@@ void RAMFUNC SnoopIso14443a(uint8_t par
  void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd, byte_t* data);
  void ReaderIso14443a(UsbCommand * c);
  // Also used in iclass.c
- bool RAMFUNC LogTrace(const uint8_t * btBytes, uint8_t iLen, uint32_t iSamples, uint32_t dwParity, bool readerToTag);
uint32_t GetParity(const uint8_t * pbtCmd, int iLen);
+ bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t len, uint32_t timestamp_start, uint32_t timestamp_end, uint8_t *parity, bool readerToTag);
void GetParity(const uint8_t *pbtCmd, uint16_t len, uint8_t *parity);
  void iso14a_set_trigger(bool enable);
  void iso14a_clear_trace();
  void iso14a_set_tracing(bool enable);
diff --combined client/cmddata.c
index 6416ebbc35e63923a50177068863d5394f002a42,2307c8af78d70e34e06750f7e089abf6a65d9a1f..9025e8f1b319ca670f07ed63af2bcabf92338fa5
@@@ -11,7 -11,6 +11,7 @@@
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
 +//#include <inttypes.h>
  #include <limits.h>
  #include "proxmark3.h"
  #include "data.h"
@@@ -21,7 -20,6 +21,7 @@@
  #include "util.h"
  #include "cmdmain.h"
  #include "cmddata.h"
 +#include "lfdemod.h"
  
  static int CmdHelp(const char *Cmd);
  
@@@ -71,7 -69,6 +71,7 @@@ int CmdAmp(const char *Cmd
   * Arguments:
   * c : 0 or 1
   */
 + //this method is dependant on all highs and lows to be the same(or clipped)  this creates issues[marshmellow] it also ignores the clock
  int Cmdaskdemod(const char *Cmd)
  {
    int i;
@@@ -82,7 -79,7 +82,7 @@@
    sscanf(Cmd, "%i", &c);
  
    /* Detect high and lows and clock */
 -  // (AL - clock???)
 +  // (AL - clock???) 
    for (i = 0; i < GraphTraceLen; ++i)
    {
      if (GraphBuffer[i] > high)
      else if (GraphBuffer[i] < low)
        low = GraphBuffer[i];
    }
 +  high=abs(high*.75);
 +  low=abs(low*.75);
    if (c != 0 && c != 1) {
      PrintAndLog("Invalid argument: %s", Cmd);
      return 0;
    }
 -
 +  //prime loop
    if (GraphBuffer[0] > 0) {
      GraphBuffer[0] = 1-c;
    } else {
       * low for long periods, others just reach the peak and go
       * down)
       */
 +    //[marhsmellow] change == to >= for high and <= for low for fuzz
      if ((GraphBuffer[i] == high) && (GraphBuffer[i - 1] == c)) {
        GraphBuffer[i] = 1 - c;
      } else if ((GraphBuffer[i] == low) && (GraphBuffer[i - 1] == (1 - c))){
    return 0;
  }
  
 +void printBitStream(uint8_t BitStream[], uint32_t bitLen){
 +  uint32_t i = 0;
 +  if (bitLen<16) {
 +    PrintAndLog("Too few bits found: %d",bitLen);
 +    return;
 +  }
 +  if (bitLen>512) bitLen=512;
 +   for (i = 0; i <= (bitLen-16); i+=16) {
 +    PrintAndLog("%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i",
 +      BitStream[i],
 +      BitStream[i+1],
 +      BitStream[i+2],
 +      BitStream[i+3],
 +      BitStream[i+4],
 +      BitStream[i+5],
 +      BitStream[i+6],
 +      BitStream[i+7],
 +      BitStream[i+8],
 +      BitStream[i+9],
 +      BitStream[i+10],
 +      BitStream[i+11],
 +      BitStream[i+12],
 +      BitStream[i+13],
 +      BitStream[i+14],
 +      BitStream[i+15]);
 +  }
 +  return; 
 +}
 +void printEM410x(uint64_t id)
 +{
 +  if (id !=0){
 +      uint64_t iii=1;
 +      uint64_t id2lo=0; //id2hi=0,
 +      uint32_t ii=0;
 +      uint32_t i=0;
 +      for (ii=5; ii>0;ii--){
 +        for (i=0;i<8;i++){
 +          id2lo=(id2lo<<1LL)|((id & (iii<<(i+((ii-1)*8))))>>(i+((ii-1)*8)));
 +        }
 +      }
 +      //output em id
 +      PrintAndLog("EM TAG ID    : %010llx", id);
 +      PrintAndLog("Unique TAG ID: %010llx",  id2lo); //id2hi,
 +      PrintAndLog("DEZ 8        : %08lld",id & 0xFFFFFF);
 +      PrintAndLog("DEZ 10       : %010lld",id & 0xFFFFFF);
 +      PrintAndLog("DEZ 5.5      : %05lld.%05lld",(id>>16LL) & 0xFFFF,(id & 0xFFFF));
 +      PrintAndLog("DEZ 3.5A     : %03lld.%05lld",(id>>32ll),(id & 0xFFFF));
 +      PrintAndLog("DEZ 14/IK2   : %014lld",id);
 +      PrintAndLog("DEZ 15/IK3   : %015lld",id2lo);
 +      PrintAndLog("Other        : %05lld_%03lld_%08lld",(id&0xFFFF),((id>>16LL) & 0xFF),(id & 0xFFFFFF));
 +    }  
 +    return;
 +}
 +
 +int CmdEm410xDecode(const char *Cmd)
 +{
 +  uint64_t id=0;
 +  uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
 +  uint32_t i=0;
 +  for (i=0;i<GraphTraceLen;++i){
 +    BitStream[i]=(uint8_t)(GraphBuffer[i]+128);
 +  }
 +  id = Em410xDecode(BitStream,i);
 +  printEM410x(id);
 +  return 0;
 +}
 +
 +int getFromGraphBuf(uint8_t *buff)
 +{
 +  uint32_t i;
 +  for (i=0;i<GraphTraceLen;++i)
 +    buff[i]=(uint8_t)(GraphBuffer[i]+128);
 +  return i;
 +}
 +
 +//by marshmellow
 +//takes 2 arguments - clock and invert both as integers
 +//attempts to demodulate ask while decoding manchester 
 +//prints binary found and saves in graphbuffer for further commands
 +int Cmdaskmandemod(const char *Cmd)
 +{
 +  int invert=0; 
 +  int clk=0; 
 +  uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
 +  sscanf(Cmd, "%i %i", &clk, &invert);    
 +  if (invert != 0 && invert != 1) {
 +    PrintAndLog("Invalid argument: %s", Cmd);
 +    return 0;
 +  }
 +  uint32_t BitLen = getFromGraphBuf(BitStream);
 +
 +  int errCnt=0;
 +   errCnt = askmandemod(BitStream, &BitLen,&clk,&invert);
 +  if (errCnt==-1){  //if fatal error (or -1)
 +    PrintAndLog("no data found"); 
 +    return 0;
 +  } 
 +  PrintAndLog("Using Clock: %d  and invert=%d",clk,invert);
 +    //PrintAndLog("Data start pos:%d, lastBit:%d, stop pos:%d, numBits:%d",iii,lastBit,i,bitnum);
 +    //move BitStream back to GraphBuffer
 +    /*
 +      ClearGraph(0);
 +      for (i=0; i < bitnum; ++i){
 +        GraphBuffer[i]=BitStream[i];
 +      }
 +      GraphTraceLen=bitnum;
 +      RepaintGraphWindow();
 +    */
 +    //output
 +  if (errCnt>0){
 +    PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
 +  }
 +  PrintAndLog("ASK/Manchester decoded bitstream:");
 +  // Now output the bitstream to the scrollback by line of 16 bits
 +  printBitStream(BitStream,BitLen);
 +  uint64_t lo =0;
 +  lo = Em410xDecode(BitStream,BitLen);
 +  printEM410x(lo);
 +  
 +  return 0;
 +}
 +
 +//by marshmellow
 +//biphase demod = 10 (or 01)=1 / 00 (or 11)=0
 +
 +
 +//by marshmellow
 +//manchester demod
 +//stricktly take 10 and 01 and convert to 0 and 1
 +int Cmdmandecoderaw(const char *Cmd)
 +{
 +  int i =0;
 +  int errCnt=0;
 +  int bitnum=0;
 +  uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
 +  int high=0,low=0;
 +  for (;i<GraphTraceLen;++i){
 +    if (GraphBuffer[i]>high) high=GraphBuffer[i];
 +    else if(GraphBuffer[i]<low) low=GraphBuffer[i];
 +    BitStream[i]=GraphBuffer[i];
 +  }
 +  if (high>1 || low <0 ){
 +    PrintAndLog("Error: please raw demod the wave first then mancheseter raw decode");
 +    return 0;
 +  }
 +  bitnum=i;
 +  errCnt=manrawdemod(BitStream,&bitnum);
 +  if (errCnt>=20){
 +    PrintAndLog("Too many errors: %d",errCnt);
 +    return 0;
 +  }
 +  PrintAndLog("Manchester Decoded - # errors:%d - data:",errCnt);
 +  printBitStream(BitStream,bitnum);
 +  if (errCnt==0){
 +    //put back in graphbuffer
 +    ClearGraph(0);
 +    for (i=0; i<bitnum;++i){
 +      GraphBuffer[i]=BitStream[i];
 +    }  
 +    GraphTraceLen=bitnum;
 +    RepaintGraphWindow();
 +    uint64_t id = 0; 
 +    id = Em410xDecode(BitStream,i);
 +    printEM410x(id);     
 +  }
 +  return 0;
 +}
 +
 +//by marshmellow
 +//takes 2 arguments - clock and invert both as integers
 +//attempts to demodulate ask only
 +//prints binary found and saves in graphbuffer for further commands
 +int Cmdaskrawdemod(const char *Cmd)
 +{
 +  uint32_t i;
 +  int invert=0; 
 +  int clk=0; 
 +  uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
 +  sscanf(Cmd, "%i %i", &clk, &invert);    
 +  if (invert != 0 && invert != 1) {
 +    PrintAndLog("Invalid argument: %s", Cmd);
 +    return 0;
 +  }
 +  int BitLen = getFromGraphBuf(BitStream);
 +  int errCnt=0;
 +  errCnt = askrawdemod(BitStream, &BitLen,&clk,&invert);
 +  if (errCnt==-1){  //throw away static - allow 1 and -1 (in case of threshold command first)
 +    PrintAndLog("no data found"); 
 +    return 0;
 +  } 
 +  PrintAndLog("Using Clock: %d  and invert=%d",clk,invert);
 +    //PrintAndLog("Data start pos:%d, lastBit:%d, stop pos:%d, numBits:%d",iii,lastBit,i,bitnum);
 +    //move BitStream back to GraphBuffer
 +    
 +  ClearGraph(0);
 +  for (i=0; i < BitLen; ++i){
 +    GraphBuffer[i]=BitStream[i];
 +  }
 +  GraphTraceLen=BitLen;
 +  RepaintGraphWindow();
 +    
 +    //output
 +  if (errCnt>0){
 +    PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
 +  }
 +  PrintAndLog("ASK demoded bitstream:");
 +  // Now output the bitstream to the scrollback by line of 16 bits
 +  printBitStream(BitStream,BitLen);
 +  
 +  return 0;
 +}
 +
  int CmdAutoCorr(const char *Cmd)
  {
    static int CorrelBuffer[MAX_GRAPH_TRACE_LEN];
@@@ -446,10 -228,10 +446,10 @@@ int CmdBitstream(const char *Cmd
        bit ^= 1;
  
      AppendGraph(0, clock, bit);
 -//    for (j = 0; j < (int)(clock/2); j++)
 -//      GraphBuffer[(i * clock) + j] = bit ^ 1;
 -//    for (j = (int)(clock/2); j < clock; j++)
 -//      GraphBuffer[(i * clock) + j] = bit;
 +  //    for (j = 0; j < (int)(clock/2); j++)
 +  //      GraphBuffer[(i * clock) + j] = bit ^ 1;
 +  //    for (j = (int)(clock/2); j < clock; j++)
 +  //      GraphBuffer[(i * clock) + j] = bit;
    }
  
    RepaintGraphWindow();
@@@ -482,168 -264,7 +482,168 @@@ int CmdDetectClockRate(const char *Cmd
    return 0;
  }
  
 -int CmdFSKdemod(const char *Cmd)
 +//by marshmellow
 +//fsk raw demod and print binary
 +//takes 2 arguments - Clock and invert
 +//defaults: clock = 50, invert=0
 +int CmdFSKrawdemod(const char *Cmd)
 +{
 +  //raw fsk demod  no manchester decoding no start bit finding just get binary from wave
 +  //set defaults
 +  uint8_t rfLen = 50;
 +  uint8_t invert=0;
 +  //set options from parameters entered with the command
 +  if (strlen(Cmd)>0 && strlen(Cmd)<=2) {
 +     rfLen=param_get8(Cmd, 0); //if rfLen option only is used
 +     if (rfLen==1){
 +      invert=1;   //if invert option only is used
 +      rfLen = 50;
 +     } else if(rfLen==0) rfLen=50;
 +  } 
 +  if (strlen(Cmd)>2) {
 +    rfLen=param_get8(Cmd, 0);  //if both options are used
 +    invert=param_get8(Cmd,1);
 +  }
 +  PrintAndLog("Args invert: %d \nClock:%d",invert,rfLen);
 +  uint32_t i=0;
 +  uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
 +  uint32_t BitLen = getFromGraphBuf(BitStream);
 +  int size  = fskdemod(BitStream,BitLen,rfLen,invert); 
 +  
 +  PrintAndLog("FSK decoded bitstream:");
 +  ClearGraph(0);
 +  for (i=0;i<size;++i){
 +    GraphBuffer[i]=BitStream[i];
 +  }
 +  GraphTraceLen=size;
 +  RepaintGraphWindow();
 +  
 +  // Now output the bitstream to the scrollback by line of 16 bits
 +  if(size > (8*32)+2) size = (8*32)+2; //only output a max of 8 blocks of 32 bits  most tags will have full bit stream inside that sample size
 +  printBitStream(BitStream,size);
 +  return 0;
 +}
 +
 +//by marshmellow (based on existing demod + holiman's refactor)
 +//HID Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded)
 +//print full HID Prox ID and some bit format details if found
 +int CmdFSKdemodHID(const char *Cmd)
 +{
 +  //raw fsk demod no manchester decoding no start bit finding just get binary from wave
 +  uint32_t hi2=0, hi=0, lo=0;
 +
 +  uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
 +  uint32_t BitLen = getFromGraphBuf(BitStream);
 +  //get binary from fsk wave
 +  size_t size  = HIDdemodFSK(BitStream,BitLen,&hi2,&hi,&lo); 
 +  if (size<0){
 +    PrintAndLog("Error demoding fsk");
 +    return 0;
 +  }
 +  if (hi2 != 0){ //extra large HID tags
 +    PrintAndLog("TAG ID: %x%08x%08x (%d)",
 +       (unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
 +  }
 +  else {  //standard HID tags <38 bits
 +    //Dbprintf("TAG ID: %x%08x (%d)",(unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF); //old print cmd
 +    uint8_t bitlen = 0;
 +    uint32_t fc = 0;
 +    uint32_t cardnum = 0;
 +    if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
 +      uint32_t lo2=0;
 +      lo2=(((hi & 15) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
 +      uint8_t idx3 = 1;
 +      while(lo2>1){ //find last bit set to 1 (format len bit)
 +        lo2=lo2>>1;
 +        idx3++;
 +      }
 +      bitlen =idx3+19;  
 +      fc =0;
 +      cardnum=0;
 +      if(bitlen==26){
 +        cardnum = (lo>>1)&0xFFFF;
 +        fc = (lo>>17)&0xFF;
 +      }
 +      if(bitlen==37){
 +        cardnum = (lo>>1)&0x7FFFF;
 +        fc = ((hi&0xF)<<12)|(lo>>20);
 +      }
 +      if(bitlen==34){
 +        cardnum = (lo>>1)&0xFFFF;
 +        fc= ((hi&1)<<15)|(lo>>17);
 +      }
 +      if(bitlen==35){
 +        cardnum = (lo>>1)&0xFFFFF;
 +        fc = ((hi&1)<<11)|(lo>>21);
 +      }
 +    }
 +    else { //if bit 38 is not set then 37 bit format is used
 +      bitlen= 37;
 +      fc =0;
 +      cardnum=0;
 +      if(bitlen==37){
 +        cardnum = (lo>>1)&0x7FFFF;
 +        fc = ((hi&0xF)<<12)|(lo>>20);
 +      }
 +    }    
 +    PrintAndLog("TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d",
 +      (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF,
 +      (unsigned int) bitlen, (unsigned int) fc, (unsigned int) cardnum);
 +    return 0;
 +  }
 +  return 0;
 +}
 +
 +//by marshmellow
 +//IO-Prox demod - FSK RF/64 with preamble of 000000001
 +//print ioprox ID and some format details
 +int CmdFSKdemodIO(const char *Cmd)
 +{
 +  //raw fsk demod no manchester decoding no start bit finding just get binary from wave
 +  //set defaults
 +  int idx=0; 
 +  //test samples are not just noise
 +  if (GraphTraceLen < 64) return 0;
 +  uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
 +  uint32_t BitLen = getFromGraphBuf(BitStream);
 +  //get binary from fsk wave
 +  idx = IOdemodFSK(BitStream,BitLen); 
 +  if (idx<0){
 +    PrintAndLog("Error demoding fsk");
 +    return 0;
 +  }
 +  if (idx==0){
 +    PrintAndLog("IO Prox Data not found - FSK Data:");
 +    printBitStream(BitStream,92);
 +  }
 +    //Index map
 +    //0           10          20          30          40          50          60
 +    //|           |           |           |           |           |           |
 +    //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23
 +    //-----------------------------------------------------------------------------
 +    //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11
 +    //
 +    //XSF(version)facility:codeone+codetwo (raw)
 +    //Handle the data
 +        
 +  PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx],    BitStream[idx+1],  BitStream[idx+2], BitStream[idx+3], BitStream[idx+4], BitStream[idx+5], BitStream[idx+6], BitStream[idx+7], BitStream[idx+8]);
 +  PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx+9],  BitStream[idx+10], BitStream[idx+11],BitStream[idx+12],BitStream[idx+13],BitStream[idx+14],BitStream[idx+15],BitStream[idx+16],BitStream[idx+17]);       
 +  PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx+18], BitStream[idx+19], BitStream[idx+20],BitStream[idx+21],BitStream[idx+22],BitStream[idx+23],BitStream[idx+24],BitStream[idx+25],BitStream[idx+26]);
 +  PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx+27], BitStream[idx+28], BitStream[idx+29],BitStream[idx+30],BitStream[idx+31],BitStream[idx+32],BitStream[idx+33],BitStream[idx+34],BitStream[idx+35]);
 +  PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx+36], BitStream[idx+37], BitStream[idx+38],BitStream[idx+39],BitStream[idx+40],BitStream[idx+41],BitStream[idx+42],BitStream[idx+43],BitStream[idx+44]);
 +  PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx+45], BitStream[idx+46], BitStream[idx+47],BitStream[idx+48],BitStream[idx+49],BitStream[idx+50],BitStream[idx+51],BitStream[idx+52],BitStream[idx+53]);
 +  PrintAndLog("%d%d%d%d%d%d%d%d %d%d",BitStream[idx+54],BitStream[idx+55],BitStream[idx+56],BitStream[idx+57],BitStream[idx+58],BitStream[idx+59],BitStream[idx+60],BitStream[idx+61],BitStream[idx+62],BitStream[idx+63]);
 +
 +  uint32_t code = bytebits_to_byte(BitStream+idx,32);
 +  uint32_t code2 = bytebits_to_byte(BitStream+idx+32,32); 
 +  short version = bytebits_to_byte(BitStream+idx+27,8); //14,4
 +  uint8_t facilitycode = bytebits_to_byte(BitStream+idx+19,8) ;
 +  uint16_t number = (bytebits_to_byte(BitStream+idx+36,8)<<8)|(bytebits_to_byte(BitStream+idx+45,8)); //36,9
 +  
 +  PrintAndLog("XSF(%02d)%02x:%d (%08x%08x)",version,facilitycode,number,code,code2);    
 +  return 0;
 +}
 +int CmdFSKdemod(const char *Cmd) //old CmdFSKdemod needs updating
  {
    static const int LowTone[]  = {
      1,  1,  1,  1,  1, -1, -1, -1, -1, -1,
  
    int lowLen = sizeof (LowTone) / sizeof (int);
    int highLen = sizeof (HighTone) / sizeof (int);
 -  int convLen = (highLen > lowLen) ? highLen : lowLen;
 +  int convLen = (highLen > lowLen) ? highLen : lowLen; //if highlen > lowLen then highlen else lowlen
    uint32_t hi = 0, lo = 0;
  
    int i, j;
    int minMark = 0, maxMark = 0;
 -
 +  
    for (i = 0; i < GraphTraceLen - convLen; ++i) {
      int lowSum = 0, highSum = 0;
  
    GraphTraceLen -= (convLen + 16);
    RepaintGraphWindow();
  
 -  // Find bit-sync (3 lo followed by 3 high)
 +  // Find bit-sync (3 lo followed by 3 high) (HID ONLY)
    int max = 0, maxPos = 0;
    for (i = 0; i < 6000; ++i) {
      int dec = 0;
@@@ -842,7 -463,7 +842,7 @@@ int CmdSamples(const char *Cmd
    uint8_t got[40000];
  
    n = strtol(Cmd, NULL, 0);
 -  if (n == 0) n = 512;
 +  if (n == 0) n = 6000;
    if (n > sizeof(got)) n = sizeof(got);
    
    PrintAndLog("Reading %d samples\n", n);
  
  int CmdTuneSamples(const char *Cmd)
  {
-   int cnt = 0;
-   int n = 255;
-   uint8_t got[255];
-   PrintAndLog("Reading %d samples\n", n);
-   GetFromBigBuf(got,n,7256); // armsrc/apps.h: #define FREE_BUFFER_OFFSET 7256
-   WaitForResponse(CMD_ACK,NULL);
-   for (int j = 0; j < n; j++) {
-     GraphBuffer[cnt++] = ((int)got[j]) - 128;
-   }
+       int timeout = 0;
+       printf("\nMeasuring antenna characteristics, please wait...");
+       UsbCommand c = {CMD_MEASURE_ANTENNA_TUNING};
+       SendCommand(&c);
+       UsbCommand resp;
+       while(!WaitForResponseTimeout(CMD_MEASURED_ANTENNA_TUNING,&resp,1000)) {
+               timeout++;
+               printf(".");
+               if (timeout > 7) {
+                       PrintAndLog("\nNo response from Proxmark. Aborting...");
+                       return 1;
+               }
+       }
+       int peakv, peakf;
+       int vLf125, vLf134, vHf;
+       vLf125 = resp.arg[0] & 0xffff;
+       vLf134 = resp.arg[0] >> 16;
+       vHf = resp.arg[1] & 0xffff;;
+       peakf = resp.arg[2] & 0xffff;
+       peakv = resp.arg[2] >> 16;
+       PrintAndLog("");
+       PrintAndLog("# LF antenna: %5.2f V @   125.00 kHz", vLf125/1000.0);
+       PrintAndLog("# LF antenna: %5.2f V @   134.00 kHz", vLf134/1000.0);
+       PrintAndLog("# LF optimal: %5.2f V @%9.2f kHz", peakv/1000.0, 12000.0/(peakf+1));
+       PrintAndLog("# HF antenna: %5.2f V @    13.56 MHz", vHf/1000.0);
+       if (peakv<2000)
+               PrintAndLog("# Your LF antenna is unusable.");
+       else if (peakv<10000)
+               PrintAndLog("# Your LF antenna is marginal.");
+       if (vHf<2000)
+               PrintAndLog("# Your HF antenna is unusable.");
+       else if (vHf<5000)
+               PrintAndLog("# Your HF antenna is marginal.");
+       for (int i = 0; i < 256; i++) {
+               GraphBuffer[i] = resp.d.asBytes[i] - 128;
+       }
    
-   PrintAndLog("Done! Divisor 89 is 134khz, 95 is 125khz.\n");
-   PrintAndLog("\n");
-   GraphTraceLen = n;
-   RepaintGraphWindow();
-   return 0;
+       PrintAndLog("Done! Divisor 89 is 134khz, 95 is 125khz.\n");
+       PrintAndLog("\n");
+       GraphTraceLen = 256;
+       ShowGraphWindow();
+       return 0;
  }
  
  int CmdLoad(const char *Cmd)
  {
    FILE *f = fopen(Cmd, "r");
@@@ -1036,30 -689,30 +1068,30 @@@ int CmdManchesterDemod(const char *Cmd
      {
        if (GraphBuffer[i-1] != GraphBuffer[i])
        {
 -      lc = i-lastval;
 -      lastval = i;
 -
 -      // Error check: if bitidx becomes too large, we do not
 -      // have a Manchester encoded bitstream or the clock is really
 -      // wrong!
 -      if (bitidx > (GraphTraceLen*2/clock+8) ) {
 -        PrintAndLog("Error: the clock you gave is probably wrong, aborting.");
 -        return 0;
 -      }
 -      // Then switch depending on lc length:
 -      // Tolerance is 1/4 of clock rate (arbitrary)
 -      if (abs(lc-clock/2) < tolerance) {
 -        // Short pulse : either "1" or "0"
 -        BitStream[bitidx++]=GraphBuffer[i-1];
 -      } else if (abs(lc-clock) < tolerance) {
 -        // Long pulse: either "11" or "00"
 -        BitStream[bitidx++]=GraphBuffer[i-1];
 -        BitStream[bitidx++]=GraphBuffer[i-1];
 -      } else {
 +        lc = i-lastval;
 +        lastval = i;
 +
 +        // Error check: if bitidx becomes too large, we do not
 +        // have a Manchester encoded bitstream or the clock is really
 +        // wrong!
 +        if (bitidx > (GraphTraceLen*2/clock+8) ) {
 +          PrintAndLog("Error: the clock you gave is probably wrong, aborting.");
 +          return 0;
 +        }
 +        // Then switch depending on lc length:
 +        // Tolerance is 1/4 of clock rate (arbitrary)
 +        if (abs(lc-clock/2) < tolerance) {
 +          // Short pulse : either "1" or "0"
 +          BitStream[bitidx++]=GraphBuffer[i-1];
 +        } else if (abs(lc-clock) < tolerance) {
 +          // Long pulse: either "11" or "00"
 +          BitStream[bitidx++]=GraphBuffer[i-1];
 +          BitStream[bitidx++]=GraphBuffer[i-1];
 +        } else {
          // Error
            warnings++;
 -        PrintAndLog("Warning: Manchester decode error for pulse width detection.");
 -        PrintAndLog("(too many of those messages mean either the stream is not Manchester encoded, or clock is wrong)");
 +          PrintAndLog("Warning: Manchester decode error for pulse width detection.");
 +          PrintAndLog("(too many of those messages mean either the stream is not Manchester encoded, or clock is wrong)");
  
            if (warnings > 10)
            {
      for (i = 0; i < bitidx; i += 2) {
        if ((BitStream[i] == 0) && (BitStream[i+1] == 1)) {
          BitStream[bit2idx++] = 1 ^ invert;
 -    } else if ((BitStream[i] == 1) && (BitStream[i+1] == 0)) {
 -      BitStream[bit2idx++] = 0 ^ invert;
 -    } else {
 -      // We cannot end up in this state, this means we are unsynchronized,
 -      // move up 1 bit:
 -      i++;
 +      } else if ((BitStream[i] == 1) && (BitStream[i+1] == 0)) {
 +        BitStream[bit2idx++] = 0 ^ invert;
 +      } else {
 +        // We cannot end up in this state, this means we are unsynchronized,
 +        // move up 1 bit:
 +        i++;
          warnings++;
 -      PrintAndLog("Unsynchronized, resync...");
 -      PrintAndLog("(too many of those messages mean the stream is not Manchester encoded)");
 +        PrintAndLog("Unsynchronized, resync...");
 +        PrintAndLog("(too many of those messages mean the stream is not Manchester encoded)");
  
          if (warnings > 10)
          {
@@@ -1287,8 -940,6 +1319,8 @@@ static command_t CommandTable[] 
    {"help",          CmdHelp,            1, "This help"},
    {"amp",           CmdAmp,             1, "Amplify peaks"},
    {"askdemod",      Cmdaskdemod,        1, "<0 or 1> -- Attempt to demodulate simple ASK tags"},
 +  {"askmandemod",   Cmdaskmandemod,     1, "[clock] [invert<0 or 1>] -- Attempt to demodulate ASK/Manchester tags and output binary (args optional[clock will try Auto-detect])"},
 +  {"askrawdemod",   Cmdaskrawdemod,     1, "[clock] [invert<0 or 1>] -- Attempt to demodulate ASK tags and output binary (args optional[clock will try Auto-detect])"},
    {"autocorr",      CmdAutoCorr,        1, "<window length> -- Autocorrelation over window"},
    {"bitsamples",    CmdBitsamples,      0, "Get raw samples as bitstring"},
    {"bitstream",     CmdBitstream,       1, "[clock rate] -- Convert waveform into a bitstream"},
    {"dec",           CmdDec,             1, "Decimate samples"},
    {"detectclock",   CmdDetectClockRate, 1, "Detect clock rate"},
    {"fskdemod",      CmdFSKdemod,        1, "Demodulate graph window as a HID FSK"},
 +  {"fskhiddemod",   CmdFSKdemodHID,     1, "Demodulate graph window as a HID FSK using raw"},
 +  {"fskiodemod",    CmdFSKdemodIO,      1, "Demodulate graph window as an IO Prox FSK using raw"},
 +  {"fskrawdemod",   CmdFSKrawdemod,     1, "[clock rate] [invert] Demodulate graph window from FSK to binary (clock = 64 or 50)(invert = 1 or 0)"},
    {"grid",          CmdGrid,            1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},
    {"hexsamples",    CmdHexsamples,      0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},  
    {"hide",          CmdHide,            1, "Hide graph window"},
    {"load",          CmdLoad,            1, "<filename> -- Load trace (to graph window"},
    {"ltrim",         CmdLtrim,           1, "<samples> -- Trim samples from left of trace"},
    {"mandemod",      CmdManchesterDemod, 1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)"},
 +  {"manrawdecode",  Cmdmandecoderaw,    1, "Manchester decode binary stream already in graph buffer"},
    {"manmod",        CmdManchesterMod,   1, "[clock rate] -- Manchester modulate a binary stream"},
    {"norm",          CmdNorm,            1, "Normalize max/min to +/-500"},
    {"plot",          CmdPlot,            1, "Show graph window (hit 'h' in window for keystroke help)"},
Impressum, Datenschutz