]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge branch 'master' of https://github.com/Proxmark/proxmark3
authoriceman1001 <iceman@iuse.se>
Fri, 24 Apr 2015 17:04:01 +0000 (19:04 +0200)
committericeman1001 <iceman@iuse.se>
Fri, 24 Apr 2015 17:04:01 +0000 (19:04 +0200)
Conflicts:
client/cmddata.c
client/cmddata.h
client/cmdhfmf.c
client/cmdlf.c
client/cmdlfem4x.h
client/cmdlft55xx.c
client/lualibs/default_toys.lua
client/scripts/tnp3clone.lua
client/scripts/tnp3dump.lua
client/scripts/tnp3sim.lua

1  2 
armsrc/lfops.c
client/cmdlf.c
client/cmdlfem4x.c
client/scripts/tnp3sim.lua

diff --cc armsrc/lfops.c
Simple merge
diff --cc client/cmdlf.c
index 30c8bb229fa98b6ffe86f73cac00bfcce24b58f3,dfbbe992a76a6a3bdeadb0d01becdc2cb7a051e5..e4fadadc04ab4b930759f13fa3b05f67b9a5a162
@@@ -517,46 -512,47 +517,47 @@@ int CmdLFSnoop(const char *Cmd
  
  static void ChkBitstream(const char *str)
  {
 -      int i;
 +  int i;
   
 -      /* convert to bitstream if necessary */
 +  /* convert to bitstream if necessary */
        for (i = 0; i < (int)(GraphTraceLen / 2); i++){
                if (GraphBuffer[i] > 1 || GraphBuffer[i] < 0) {
 -                      CmdGetBitStream("");
 -                      break;
 -              }
 -      }
 +      CmdGetBitStream("");
 +      break;
 +    }
 +  }
  }
- //appears to attempt to simulate manchester
+ //Attempt to simulate any wave in buffer (one bit per output sample)
+ // converts GraphBuffer to bitstream (based on zero crossings) if needed.
  int CmdLFSim(const char *Cmd)
  {
 -      int i,j;
 -      static int gap;
 +  int i,j;
 +  static int gap;
  
 -      sscanf(Cmd, "%i", &gap);
 +  sscanf(Cmd, "%i", &gap);
  
-   /* convert to bitstream if necessary */
+       // convert to bitstream if necessary 
  
 -      ChkBitstream(Cmd);
 +  ChkBitstream(Cmd);
  
-   //can send 512 bits at a time (1 byte sent per bit...)
+       //can send only 512 bits at a time (1 byte sent per bit...)
 -      printf("Sending [%d bytes]", GraphTraceLen);
 -      for (i = 0; i < GraphTraceLen; i += USB_CMD_DATA_SIZE) {
 -              UsbCommand c={CMD_DOWNLOADED_SIM_SAMPLES_125K, {i, 0, 0}};
 -
 -              for (j = 0; j < USB_CMD_DATA_SIZE; j++) {
 -                      c.d.asBytes[j] = GraphBuffer[i+j];
 -              }
 -              SendCommand(&c);
 -              WaitForResponse(CMD_ACK,NULL);
 -              printf(".");
 -      }
 -
 -      printf("\n");
 -      PrintAndLog("Starting to simulate");
 -      UsbCommand c = {CMD_SIMULATE_TAG_125K, {GraphTraceLen, gap, 0}};
 -      SendCommand(&c);
 -      return 0;
 +  printf("Sending [%d bytes]", GraphTraceLen);
 +  for (i = 0; i < GraphTraceLen; i += USB_CMD_DATA_SIZE) {
 +    UsbCommand c={CMD_DOWNLOADED_SIM_SAMPLES_125K, {i, 0, 0}};
 +
 +    for (j = 0; j < USB_CMD_DATA_SIZE; j++) {
 +      c.d.asBytes[j] = GraphBuffer[i+j];
 +    }
 +    SendCommand(&c);
 +    WaitForResponse(CMD_ACK,NULL);
 +    printf(".");
 +  }
 +
 +  printf("\n");
 +  PrintAndLog("Starting to simulate");
 +  UsbCommand c = {CMD_SIMULATE_TAG_125K, {GraphTraceLen, gap, 0}};
 +  SendCommand(&c);
 +  return 0;
  }
  
  int usage_lf_simfsk(void)
@@@ -611,193 -607,194 +612,194 @@@ int usage_lf_simpsk(void
  // - allow pull data from DemodBuffer
  int CmdLFfskSim(const char *Cmd)
  {
-   //might be able to autodetect FC and clock from Graphbuffer if using demod buffer
-   //will need FChigh, FClow, Clock, and bitstream
+       //might be able to autodetect FCs and clock from Graphbuffer if using demod buffer
+       // otherwise will need FChigh, FClow, Clock, and bitstream
 -      uint8_t fcHigh=0, fcLow=0, clk=0;
 -      uint8_t invert=0;
 -      bool errors = FALSE;
 -      char hexData[32] = {0x00}; // store entered hex data
 -      uint8_t data[255] = {0x00}; 
 -      int dataLen = 0;
 -      uint8_t cmdp = 0;
 -      while(param_getchar(Cmd, cmdp) != 0x00)
 -      {
 -              switch(param_getchar(Cmd, cmdp))
 -              {
 -              case 'h':
 -                      return usage_lf_simfsk();
 -              case 'i':
 -                      invert = 1;
 -                      cmdp++;
 -                      break;
 -              case 'c':
 -                      errors |= param_getdec(Cmd,cmdp+1,&clk);
 -                      cmdp+=2;
 -                      break;
 -              case 'H':
 -                      errors |= param_getdec(Cmd,cmdp+1,&fcHigh);
 -                      cmdp+=2;
 -                      break;
 -              case 'L':
 -                      errors |= param_getdec(Cmd,cmdp+1,&fcLow);
 -                      cmdp+=2;
 -                      break;
 -              //case 's':
 -              //  separator=1;
 -              //  cmdp++;
 -              //  break;
 -              case 'd':
 -                      dataLen = param_getstr(Cmd, cmdp+1, hexData);
 -                      if (dataLen==0) {
 -                              errors=TRUE; 
 -                      } else {
 -                              dataLen = hextobinarray((char *)data, hexData);
 -                      }   
 -                      if (dataLen==0) errors=TRUE; 
 -                      if (errors) PrintAndLog ("Error getting hex data");
 -                      cmdp+=2;
 -                      break;
 -              default:
 -                      PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
 -                      errors = TRUE;
 -                      break;
 -              }
 -              if(errors) break;
 -      }
 -      if(cmdp == 0 && DemodBufferLen == 0)
 -      {
 -              errors = TRUE;// No args
 -      }
 -
 -      //Validations
 -      if(errors)
 -      {
 -              return usage_lf_simfsk();
 -      }
 -
 -      if (dataLen == 0){ //using DemodBuffer 
 -              if (clk==0 || fcHigh==0 || fcLow==0){ //manual settings must set them all
 -                      uint8_t ans = fskClocks(&fcHigh, &fcLow, &clk, 0);
 -                      if (ans==0){
 -                              if (!fcHigh) fcHigh=10;
 -                              if (!fcLow) fcLow=8;
 -                              if (!clk) clk=50;
 -                      }
 -              }
 -      } else {
 -              setDemodBuf(data, dataLen, 0);
 -      }
 +  uint8_t fcHigh=0, fcLow=0, clk=0;
 +  uint8_t invert=0;
 +  bool errors = FALSE;
 +  char hexData[32] = {0x00}; // store entered hex data
 +  uint8_t data[255] = {0x00}; 
 +  int dataLen = 0;
 +  uint8_t cmdp = 0;
 +  while(param_getchar(Cmd, cmdp) != 0x00)
 +  {
 +    switch(param_getchar(Cmd, cmdp))
 +    {
 +    case 'h':
 +      return usage_lf_simfsk();
 +    case 'i':
 +      invert = 1;
 +      cmdp++;
 +      break;
 +    case 'c':
 +      errors |= param_getdec(Cmd,cmdp+1,&clk);
 +      cmdp+=2;
 +      break;
 +    case 'H':
 +      errors |= param_getdec(Cmd,cmdp+1,&fcHigh);
 +      cmdp+=2;
 +      break;
 +    case 'L':
 +      errors |= param_getdec(Cmd,cmdp+1,&fcLow);
 +      cmdp+=2;
 +      break;
 +    //case 's':
 +    //  separator=1;
 +    //  cmdp++;
 +    //  break;
 +    case 'd':
 +      dataLen = param_getstr(Cmd, cmdp+1, hexData);
 +      if (dataLen==0) {
 +        errors=TRUE; 
 +      } else {
 +        dataLen = hextobinarray((char *)data, hexData);
 +      }   
 +      if (dataLen==0) errors=TRUE; 
 +      if (errors) PrintAndLog ("Error getting hex data");
 +      cmdp+=2;
 +      break;
 +    default:
 +      PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
 +      errors = TRUE;
 +      break;
 +    }
 +    if(errors) break;
 +  }
 +  if(cmdp == 0 && DemodBufferLen == 0)
 +  {
 +    errors = TRUE;// No args
 +  }
 +
 +  //Validations
 +  if(errors)
 +  {
 +    return usage_lf_simfsk();
 +  }
 +
 +  if (dataLen == 0){ //using DemodBuffer 
 +    if (clk==0 || fcHigh==0 || fcLow==0){ //manual settings must set them all
 +      uint8_t ans = fskClocks(&fcHigh, &fcLow, &clk, 0);
 +      if (ans==0){
 +        if (!fcHigh) fcHigh=10;
 +        if (!fcLow) fcLow=8;
 +        if (!clk) clk=50;
 +      }
 +    }
 +  } else {
 +    setDemodBuf(data, dataLen, 0);
 +  }
+       //default if not found
 -      if (clk == 0) clk = 50;
 -      if (fcHigh == 0) fcHigh = 10;
 -      if (fcLow == 0) fcLow = 8;
 -
 -      uint16_t arg1, arg2;
 -      arg1 = fcHigh << 8 | fcLow;
 -      arg2 = invert << 8 | clk;
 -      size_t size = DemodBufferLen;
 -      if (size > USB_CMD_DATA_SIZE) {
 -              PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", size, USB_CMD_DATA_SIZE);
 -              size = USB_CMD_DATA_SIZE;
 -      
 -      UsbCommand c = {CMD_FSK_SIM_TAG, {arg1, arg2, size}};
 -
 -      memcpy(c.d.asBytes, DemodBuffer, size);
 -      SendCommand(&c);
 -      return 0;
 +  if (clk == 0) clk = 50;
 +  if (fcHigh == 0) fcHigh = 10;
 +  if (fcLow == 0) fcLow = 8;
 +
 +  uint16_t arg1, arg2;
 +  arg1 = fcHigh << 8 | fcLow;
 +  arg2 = invert << 8 | clk;
 +  size_t size = DemodBufferLen;
 +  if (size > USB_CMD_DATA_SIZE) {
 +    PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", size, USB_CMD_DATA_SIZE);
 +    size = USB_CMD_DATA_SIZE;
 +  } 
 +  UsbCommand c = {CMD_FSK_SIM_TAG, {arg1, arg2, size}};
 +
 +  memcpy(c.d.asBytes, DemodBuffer, size);
 +  SendCommand(&c);
 +  return 0;
  }
  
  // by marshmellow - sim ask data given clock, invert, manchester or raw, separator 
  // - allow pull data from DemodBuffer
  int CmdLFaskSim(const char *Cmd)
  {
 -      //autodetect clock from Graphbuffer if using demod buffer
 +  //autodetect clock from Graphbuffer if using demod buffer
-   //will need clock, invert, manchester/raw as m or r, separator as s, and bitstream
+       // needs clock, invert, manchester/raw as m or r, separator as s, and bitstream
 -      uint8_t encoding = 1, separator = 0;
 -      uint8_t clk=0, invert=0;
 -      bool errors = FALSE;
 -      char hexData[32] = {0x00}; 
 -      uint8_t data[255]= {0x00}; // store entered hex data
 -      int dataLen = 0;
 -      uint8_t cmdp = 0;
 -      while(param_getchar(Cmd, cmdp) != 0x00)
 -      {
 -              switch(param_getchar(Cmd, cmdp))
 -              {
 -              case 'h':
 -                      return usage_lf_simask();
 -              case 'i':
 -                      invert = 1;
 -                      cmdp++;
 -                      break;
 -              case 'c':
 -                      errors |= param_getdec(Cmd,cmdp+1,&clk);
 -                      cmdp+=2;
 -                      break;
 -              case 'b':
 -                      encoding=2; //biphase
 -                      cmdp++;
 -                      break;
 -              case 'm':
 -                      encoding=1;
 -                      cmdp++;
 -                      break;
 -              case 'r':
 -                      encoding=0;
 -                      cmdp++;
 -                      break;
 -              case 's':
 -                      separator=1;
 -                      cmdp++;
 -                      break;
 -              case 'd':
 -                      dataLen = param_getstr(Cmd, cmdp+1, hexData);
 -                      if (dataLen==0) {
 -                              errors=TRUE; 
 -                      } else {
 -                              dataLen = hextobinarray((char *)data, hexData);
 -                      }
 -                      if (dataLen==0) errors=TRUE; 
 -                      if (errors) PrintAndLog ("Error getting hex data, datalen: %d",dataLen);
 -                              cmdp+=2;
 -                      break;
 -              default:
 -                      PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
 -                      errors = TRUE;
 -                      break;
 -              }
 -              if(errors) break;
 -      }
 -      if(cmdp == 0 && DemodBufferLen == 0)
 -      {
 -              errors = TRUE;// No args
 -      }
 -
 -      //Validations
 -      if(errors)
 -      {
 -              return usage_lf_simask();
 -      }
 -      if (dataLen == 0){ //using DemodBuffer
 -              if (clk == 0) clk = GetAskClock("0", false, false);
 -      } else {
 -              setDemodBuf(data, dataLen, 0);
 -      }
 -      if (clk == 0) clk = 64;
 -      if (encoding == 0) clk = clk/2; //askraw needs to double the clock speed
 -      uint16_t arg1, arg2;
 -      size_t size=DemodBufferLen;
 -      arg1 = clk << 8 | encoding;
 -      arg2 = invert << 8 | separator;
 -      if (size > USB_CMD_DATA_SIZE) {
 -              PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", size, USB_CMD_DATA_SIZE);
 -              size = USB_CMD_DATA_SIZE;
 -      }
 -      UsbCommand c = {CMD_ASK_SIM_TAG, {arg1, arg2, size}};
 -      PrintAndLog("preparing to sim ask data: %d bits", size);
 -      memcpy(c.d.asBytes, DemodBuffer, size);
 -      SendCommand(&c);
 -      return 0;
 +  uint8_t encoding = 1, separator = 0;
-   //char cmdp = Cmd[0], par3='m', par4=0;
 +  uint8_t clk=0, invert=0;
 +  bool errors = FALSE;
 +  char hexData[32] = {0x00}; 
 +  uint8_t data[255]= {0x00}; // store entered hex data
 +  int dataLen = 0;
 +  uint8_t cmdp = 0;
 +  while(param_getchar(Cmd, cmdp) != 0x00)
 +  {
 +    switch(param_getchar(Cmd, cmdp))
 +    {
 +    case 'h':
 +      return usage_lf_simask();
 +    case 'i':
 +      invert = 1;
 +      cmdp++;
 +      break;
 +    case 'c':
 +      errors |= param_getdec(Cmd,cmdp+1,&clk);
 +      cmdp+=2;
 +      break;
 +    case 'b':
 +      encoding=2; //biphase
 +      cmdp++;
 +      break;
 +    case 'm':
 +      encoding=1;
 +      cmdp++;
 +      break;
 +    case 'r':
 +      encoding=0;
 +      cmdp++;
 +      break;
 +    case 's':
 +      separator=1;
 +      cmdp++;
 +      break;
 +    case 'd':
 +      dataLen = param_getstr(Cmd, cmdp+1, hexData);
 +      if (dataLen==0) {
 +        errors=TRUE; 
 +      } else {
 +        dataLen = hextobinarray((char *)data, hexData);
 +      }
 +      if (dataLen==0) errors=TRUE; 
 +      if (errors) PrintAndLog ("Error getting hex data, datalen: %d",dataLen);
 +        cmdp+=2;
 +      break;
 +    default:
 +      PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
 +      errors = TRUE;
 +      break;
 +    }
 +    if(errors) break;
 +  }
 +  if(cmdp == 0 && DemodBufferLen == 0)
 +  {
 +    errors = TRUE;// No args
 +  }
 +
 +  //Validations
 +  if(errors)
 +  {
 +    return usage_lf_simask();
 +  }
 +  if (dataLen == 0){ //using DemodBuffer
 +    if (clk == 0) clk = GetAskClock("0", false, false);
 +  } else {
 +    setDemodBuf(data, dataLen, 0);
 +  }
 +  if (clk == 0) clk = 64;
 +  if (encoding == 0) clk = clk/2; //askraw needs to double the clock speed
 +  uint16_t arg1, arg2;
 +  size_t size=DemodBufferLen;
 +  arg1 = clk << 8 | encoding;
 +  arg2 = invert << 8 | separator;
 +  if (size > USB_CMD_DATA_SIZE) {
 +    PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", size, USB_CMD_DATA_SIZE);
 +    size = USB_CMD_DATA_SIZE;
 +  }
 +  UsbCommand c = {CMD_ASK_SIM_TAG, {arg1, arg2, size}};
 +  PrintAndLog("preparing to sim ask data: %d bits", size);
 +  memcpy(c.d.asBytes, DemodBuffer, size);
 +  SendCommand(&c);
 +  return 0;
  }
  
  // by marshmellow - sim psk data given carrier, clock, invert 
@@@ -910,284 -907,240 +912,268 @@@ int CmdLFpskSim(const char *Cmd
  
  int CmdLFSimBidir(const char *Cmd)
  {
 -      // Set ADC to twice the carrier for a slight supersampling
 -      // HACK: not implemented in ARMSRC.
 -      PrintAndLog("Not implemented yet.");
 -      UsbCommand c = {CMD_LF_SIMULATE_BIDIR, {47, 384, 0}};
 -      SendCommand(&c);
 -      return 0;
 +  // Set ADC to twice the carrier for a slight supersampling
 +  // HACK: not implemented in ARMSRC.
 +  PrintAndLog("Not implemented yet.");
 +  UsbCommand c = {CMD_LF_SIMULATE_BIDIR, {47, 384, 0}};
 +  SendCommand(&c);
 +  return 0;
  }
  
- /* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */
- /*
- int CmdLFSimManchester(const char *Cmd)
- {
-   static int clock, gap;
-   static char data[1024], gapstring[8];
-   sscanf(Cmd, "%i %s %i", &clock, &data[0], &gap);
-   ClearGraph(0);
-   for (int i = 0; i < strlen(data) ; ++i)
-     AppendGraph(0, clock, data[i]- '0');
-   CmdManchesterMod("");
-   RepaintGraphWindow();
-   sprintf(&gapstring[0], "%i", gap);
-   CmdLFSim(gapstring);
-   return 0;
- }
- */
  int CmdVchDemod(const char *Cmd)
  {
 -      // Is this the entire sync pattern, or does this also include some
 -      // data bits that happen to be the same everywhere? That would be
 -      // lovely to know.
 -      static const int SyncPattern[] = {
 -              1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 -              1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -              1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 -              1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -              1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 -              1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -              1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 -              1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -              1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 -              1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -      };
 -
 -      // So first, we correlate for the sync pattern, and mark that.
 -      int bestCorrel = 0, bestPos = 0;
 -      int i;
 -      // It does us no good to find the sync pattern, with fewer than
 -      // 2048 samples after it...
 -      for (i = 0; i < (GraphTraceLen-2048); i++) {
 -              int sum = 0;
 -              int j;
 -              for (j = 0; j < arraylen(SyncPattern); j++) {
 -                      sum += GraphBuffer[i+j]*SyncPattern[j];
 -              }
 -              if (sum > bestCorrel) {
 -                      bestCorrel = sum;
 -                      bestPos = i;
 -              }
 -      }
 -      PrintAndLog("best sync at %d [metric %d]", bestPos, bestCorrel);
 -
 -      char bits[257];
 -      bits[256] = '\0';
 -
 -      int worst = INT_MAX;
 -      int worstPos = 0;
 -
 -      for (i = 0; i < 2048; i += 8) {
 -              int sum = 0;
 -              int j;
 -              for (j = 0; j < 8; j++) {
 -                      sum += GraphBuffer[bestPos+i+j];
 -              }
 -              if (sum < 0) {
 -                      bits[i/8] = '.';
 -              } else {
 -                      bits[i/8] = '1';
 -              }
 -              if(abs(sum) < worst) {
 -                      worst = abs(sum);
 -                      worstPos = i;
 -              }
 -      }
 -      PrintAndLog("bits:");
 -      PrintAndLog("%s", bits);
 -      PrintAndLog("worst metric: %d at pos %d", worst, worstPos);
 -
 -      if (strcmp(Cmd, "clone")==0) {
 -              GraphTraceLen = 0;
 -              char *s;
 -              for(s = bits; *s; s++) {
 -                      int j;
 -                      for(j = 0; j < 16; j++) {
 -                              GraphBuffer[GraphTraceLen++] = (*s == '1') ? 1 : 0;
 -                      }
 -              }
 -              RepaintGraphWindow();
 -      }
 -      return 0;
 +  // Is this the entire sync pattern, or does this also include some
 +  // data bits that happen to be the same everywhere? That would be
 +  // lovely to know.
 +  static const int SyncPattern[] = {
 +    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 +    1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 +    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 +    1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 +    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 +    1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 +    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 +    1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 +    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 +    1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 +  };
 +
 +  // So first, we correlate for the sync pattern, and mark that.
 +  int bestCorrel = 0, bestPos = 0;
 +  int i;
 +  // It does us no good to find the sync pattern, with fewer than
 +  // 2048 samples after it...
 +  for (i = 0; i < (GraphTraceLen-2048); i++) {
 +    int sum = 0;
 +    int j;
 +    for (j = 0; j < arraylen(SyncPattern); j++) {
 +      sum += GraphBuffer[i+j]*SyncPattern[j];
 +    }
 +    if (sum > bestCorrel) {
 +      bestCorrel = sum;
 +      bestPos = i;
 +    }
 +  }
 +  PrintAndLog("best sync at %d [metric %d]", bestPos, bestCorrel);
 +
 +  char bits[257];
 +  bits[256] = '\0';
 +
 +  int worst = INT_MAX;
 +  int worstPos = 0;
 +
 +  for (i = 0; i < 2048; i += 8) {
 +    int sum = 0;
 +    int j;
 +    for (j = 0; j < 8; j++) {
 +      sum += GraphBuffer[bestPos+i+j];
 +    }
 +    if (sum < 0) {
 +      bits[i/8] = '.';
 +    } else {
 +      bits[i/8] = '1';
 +    }
 +    if(abs(sum) < worst) {
 +      worst = abs(sum);
 +      worstPos = i;
 +    }
 +  }
 +  PrintAndLog("bits:");
 +  PrintAndLog("%s", bits);
 +  PrintAndLog("worst metric: %d at pos %d", worst, worstPos);
 +
 +  if (strcmp(Cmd, "clone")==0) {
 +    GraphTraceLen = 0;
 +    char *s;
 +    for(s = bits; *s; s++) {
 +      int j;
 +      for(j = 0; j < 16; j++) {
 +        GraphBuffer[GraphTraceLen++] = (*s == '1') ? 1 : 0;
 +      }
 +    }
 +    RepaintGraphWindow();
 +  }
 +  return 0;
  }
  
  //by marshmellow
  int CmdLFfind(const char *Cmd)
  {
 -      int ans=0;
 -      char cmdp = param_getchar(Cmd, 0);
 -      char testRaw = param_getchar(Cmd, 1);
 -      if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') {
 -              PrintAndLog("Usage:  lf search <0|1> [u]");
 -              PrintAndLog("     <use data from Graphbuffer> , if not set, try reading data from tag.");
 -              PrintAndLog("     [Search for Unknown tags] , if not set, reads only known tags.");
 -              PrintAndLog("");
 -              PrintAndLog("    sample: lf search     = try reading data from tag & search for known tags");
 -              PrintAndLog("          : lf search 1   = use data from GraphBuffer & search for known tags");
 -              PrintAndLog("          : lf search u   = try reading data from tag & search for known and unknown tags");
 -              PrintAndLog("          : lf search 1 u = use data from GraphBuffer & search for known and unknown tags");
 -
 -              return 0;
 -      }
 -
 -      if (!offline && (cmdp != '1')){
 +  int ans=0;
 +  char cmdp = param_getchar(Cmd, 0);
 +  char testRaw = param_getchar(Cmd, 1);
 +  if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') {
 +    PrintAndLog("Usage:  lf search <0|1> [u]");
 +    PrintAndLog("     <use data from Graphbuffer> , if not set, try reading data from tag.");
 +    PrintAndLog("     [Search for Unknown tags] , if not set, reads only known tags.");
 +    PrintAndLog("");
 +    PrintAndLog("    sample: lf search     = try reading data from tag & search for known tags");
 +    PrintAndLog("          : lf search 1   = use data from GraphBuffer & search for known tags");
 +    PrintAndLog("          : lf search u   = try reading data from tag & search for known and unknown tags");
 +    PrintAndLog("          : lf search 1 u = use data from GraphBuffer & search for known and unknown tags");
 +    return 0;
 +  }
 +
 +  if (!offline && (cmdp != '1')){
-     ans=CmdLFRead("");
-     ans=CmdSamples("20000");
+               CmdLFRead("s");
+               getSamples("30000",false);
 -      } else if (GraphTraceLen < 1000) {
 -              PrintAndLog("Data in Graphbuffer was too small.");
 -              return 0;
 -      }
 -      if (cmdp == 'u' || cmdp == 'U') testRaw = 'u';
 -
 -      PrintAndLog("NOTE: some demods output possible binary\n  if it finds something that looks like a tag");
 -      PrintAndLog("False Positives ARE possible\n");  
 -      PrintAndLog("\nChecking for known tags:\n");
 -
 -      ans=CmdFSKdemodIO("");
 -      if (ans>0) {
 -              PrintAndLog("\nValid IO Prox ID Found!");
 -              return 1;
 -      }
 -
 -      ans=CmdFSKdemodPyramid("");
 -      if (ans>0) {
 -              PrintAndLog("\nValid Pyramid ID Found!");
 -              return 1;
 -      }
 -
 -      ans=CmdFSKdemodParadox("");
 -      if (ans>0) {
 -              PrintAndLog("\nValid Paradox ID Found!");
 -              return 1;
 -      }
 -
 -      ans=CmdFSKdemodAWID("");
 -      if (ans>0) {
 -              PrintAndLog("\nValid AWID ID Found!");
 -              return 1;
 -      }
 -
 -      ans=CmdFSKdemodHID("");
 -      if (ans>0) {
 -              PrintAndLog("\nValid HID Prox ID Found!");
 -              return 1;
 -      }
 -
 -      //add psk and indala
 -      ans=CmdIndalaDecode("");
 -      if (ans>0) {
 -              PrintAndLog("\nValid Indala ID Found!");
 -              return 1;
 -      }
 -
 -      ans=CmdAskEM410xDemod("");
 -      if (ans>0) {
 -              PrintAndLog("\nValid EM410x ID Found!");
 -              return 1;
 -      }
 -
 -      ans=CmdG_Prox_II_Demod("");
 -      if (ans>0) {
 -              PrintAndLog("\nValid G Prox II ID Found!");
 -              return 1;
 -      }
 +  } else if (GraphTraceLen < 1000) {
 +    PrintAndLog("Data in Graphbuffer was too small.");
 +    return 0;
 +  }
 +  if (cmdp == 'u' || cmdp == 'U') testRaw = 'u';
 +
 +  PrintAndLog("NOTE: some demods output possible binary\n  if it finds something that looks like a tag");
 +  PrintAndLog("False Positives ARE possible\n");  
 +  PrintAndLog("\nChecking for known tags:\n");
 +
 +  ans=CmdFSKdemodIO("");
 +  
 +  if (ans>0) {
 +    PrintAndLog("\nValid IO Prox ID Found!");
 +    return 1;
 +  }
 +
 +  ans=CmdFSKdemodPyramid("");
 +  if (ans>0) {
 +    PrintAndLog("\nValid Pyramid ID Found!");
 +    return 1;
 +  }
 +
 +  ans=CmdFSKdemodParadox("");
 +  if (ans>0) {
 +    PrintAndLog("\nValid Paradox ID Found!");
 +    return 1;
 +  }
 +
 +  ans=CmdFSKdemodAWID("");
 +  if (ans>0) {
 +    PrintAndLog("\nValid AWID ID Found!");
 +    return 1;
 +  }
 +
 +  ans=CmdFSKdemodHID("");
 +  if (ans>0) {
 +    PrintAndLog("\nValid HID Prox ID Found!");
 +    return 1;
 +  }
 +
 +  //add psk and indala
 +  ans=CmdIndalaDecode("");
 +  if (ans>0) {
 +    PrintAndLog("\nValid Indala ID Found!");
 +    return 1;
 +  }
 +
 +  ans=CmdAskEM410xDemod("");
 +  if (ans>0) {
 +    PrintAndLog("\nValid EM410x ID Found!");
 +    return 1;
 +  }
 +
 +  ans=CmdG_Prox_II_Demod("");
 +  if (ans>0) {
 +    PrintAndLog("\nValid G Prox II ID Found!");
 +    return 1;
 +  }
  
 -      PrintAndLog("\nNo Known Tags Found!\n");
 -      if (testRaw=='u' || testRaw=='U'){
 -              //test unknown tag formats (raw mode)
 -              PrintAndLog("\nChecking for Unknown tags:\n");
 -              ans=AutoCorrelate(4000, FALSE, FALSE);
 -              if (ans > 0) PrintAndLog("Possible Auto Correlation of %d repeating samples",ans);
 -              ans=GetFskClock("",FALSE,FALSE); 
 -              if (ans != 0){ //fsk
 -                      ans=FSKrawDemod("",TRUE);
 -                      if (ans>0) {
 -                              PrintAndLog("\nUnknown FSK Modulated Tag Found!");
 -                              return 1;
+       ans=EM4x50Read("", false);
+       if (ans>0) {
+               PrintAndLog("\nValid EM4x50 ID Found!");
+               return 1;
+       }       
+       ans=CmdPSKNexWatch("");
+       if (ans>0) {
+               PrintAndLog("\nValid NexWatch ID Found!");
+               return 1;
+       }
 +  PrintAndLog("\nNo Known Tags Found!\n");
 +  if (testRaw=='u' || testRaw=='U'){
 +    //test unknown tag formats (raw mode)
 +    PrintAndLog("\nChecking for Unknown tags:\n");
 +    ans=AutoCorrelate(4000, FALSE, FALSE);
 +      
 +    if (ans > 0) {
 +
 +              PrintAndLog("Possible Auto Correlation of %d repeating samples",ans);
 +
 +              if ( ans % 8 == 0)  {
 +                      int bytes = (ans / 8);
 +                      PrintAndLog("Possible %d bytes", bytes);
 +                      int blocks = 0;
 +                      if ( bytes % 2 == 0) {
 +                              blocks = (bytes / 2);   
 +                              PrintAndLog("Possible  2 blocks, width %d", blocks);
 +                      }
 +                      if ( bytes % 4 == 0) {
 +                              blocks = (bytes / 4);   
 +                              PrintAndLog("Possible  4 blocks, width %d", blocks);
 +                      }
 +                      if ( bytes % 8 == 0) {
 +                              blocks = (bytes / 8);   
 +                              PrintAndLog("Possible  8 blocks, width %d", blocks);
 +                      }
 +                      if ( bytes % 16 == 0) {
 +                              blocks = (bytes / 16);  
 +                              PrintAndLog("Possible 16 blocks, width %d", blocks);
                        }
                }
 -              ans=ASKDemod("0 0 0",TRUE,FALSE,1);
 -              if (ans>0) {
 -                      PrintAndLog("\nUnknown ASK Modulated and Manchester encoded Tag Found!");
 -                      PrintAndLog("\nif it does not look right it could instead be ASK/Biphase - try 'data rawdemod ab'");
 -                      return 1;
 -              }
 -              ans=CmdPSK1rawDemod("");
 -              if (ans>0) {
 -                      PrintAndLog("Possible unknown PSK1 Modulated Tag Found above!\n\nCould also be PSK2 - try 'data rawdemod p2'");
 -                      PrintAndLog("\nCould also be PSK3 - [currently not supported]");
 -                      PrintAndLog("\nCould also be NRZ - try 'data nrzrawdemod");
 -                      return 1;
 -              }
 -              PrintAndLog("\nNo Data Found!\n");
        }
-     ans=GetFskClock("",FALSE,FALSE); //CmdDetectClockRate("F"); //
 -      return 0;
++              ans=GetFskClock("",FALSE,FALSE); 
 +    if (ans != 0){ //fsk
-       ans=FSKrawDemod("",FALSE);
++                      ans=FSKrawDemod("",TRUE);
 +      if (ans>0) {
 +        PrintAndLog("\nUnknown FSK Modulated Tag Found!");
-         printDemodBuff();
 +        return 1;
 +      }
 +    }
-     ans=ASKmanDemod("",FALSE,FALSE);
++              ans=ASKDemod("0 0 0",TRUE,FALSE,1);
 +    if (ans>0) {
 +      PrintAndLog("\nUnknown ASK Modulated and Manchester encoded Tag Found!");
 +      PrintAndLog("\nif it does not look right it could instead be ASK/Biphase - try 'data rawdemod ab'");
-       printDemodBuff();
 +      return 1;
 +    }
 +    ans=CmdPSK1rawDemod("");
 +    if (ans>0) {
 +      PrintAndLog("Possible unknown PSK1 Modulated Tag Found above!\n\nCould also be PSK2 - try 'data rawdemod p2'");
 +      PrintAndLog("\nCould also be PSK3 - [currently not supported]");
 +      PrintAndLog("\nCould also be NRZ - try 'data nrzrawdemod");
-       printDemodBuff();
 +      return 1;
 +    }
 +    PrintAndLog("\nNo Data Found!\n");
 +  }
 +  return 0;
  }
  
  static command_t CommandTable[] = 
  {
 -      {"help",        CmdHelp,            1, "This help"},
 -      {"cmdread",     CmdLFCommandRead,   0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"},
 -      {"em4x",        CmdLFEM4X,          1, "{ EM4X RFIDs... }"},
 -      {"config",      CmdLFSetConfig,     0, "Set config for LF sampling, bit/sample, decimation, frequency"},
 -      {"flexdemod",   CmdFlexdemod,       1, "Demodulate samples for FlexPass"},
 -      {"hid",         CmdLFHID,           1, "{ HID RFIDs... }"},
 -      {"io",            CmdLFIO,                1, "{ ioProx tags... }"},
 -      {"indalademod", CmdIndalaDemod,     1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"},
 -      {"indalaclone", CmdIndalaClone,     0, "<UID> ['l']-- Clone Indala to T55x7 (tag must be in antenna)(UID in HEX)(option 'l' for 224 UID"},
 -      {"read",        CmdLFRead,          0, "['s' silent] Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"},
 -      {"search",      CmdLFfind,          1, "[offline] ['u'] Read and Search for valid known tag (in offline mode it you can load first then search) - 'u' to search for unknown tags"},
 -      {"sim",         CmdLFSim,           0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},
 -      {"simask",      CmdLFaskSim,        0, "[clock] [invert <1|0>] [manchester/raw <'m'|'r'>] [msg separator 's'] [d <hexdata>] -- Simulate LF ASK tag from demodbuffer or input"},
 -      {"simfsk",      CmdLFfskSim,        0, "[c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>] -- Simulate LF FSK tag from demodbuffer or input"},
 -      {"simpsk",      CmdLFpskSim,        0, "[1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>] -- Simulate LF PSK tag from demodbuffer or input"},
 -      {"simbidir",    CmdLFSimBidir,      0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
 -      {"snoop",       CmdLFSnoop,         0, "['l'|'h'|<divisor>] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"},
 -      {"ti",          CmdLFTI,            1, "{ TI RFIDs... }"},
 -      {"hitag",       CmdLFHitag,         1, "{ Hitag tags and transponders... }"},
 -      {"vchdemod",    CmdVchDemod,        1, "['clone'] -- Demodulate samples for VeriChip"},
 -      {"t55xx",       CmdLFT55XX,         1, "{ T55xx RFIDs... }"},
 -      {"pcf7931",     CmdLFPCF7931,       1, "{PCF7931 RFIDs...}"},
 -      {NULL, NULL, 0, NULL}
 +  {"help",        CmdHelp,            1, "This help"},
 +  {"em4x",        CmdLFEM4X,          1, "{ EM4X RFIDs... }"},
 +  {"hid",         CmdLFHID,           1, "{ HID RFIDs... }"},
 +  {"hitag",       CmdLFHitag,         1, "{ HITAG RFIDs... }"},
 +  {"io",                CmdLFIO,                1, "{ IOPROX RFIDs... }"},
 +  {"pcf7931",     CmdLFPCF7931,       1, "{ PCF7931 RFIDs... }"},
 +  {"ti",          CmdLFTI,            1, "{ TI RFIDs... }"},
 +  {"t55xx",       CmdLFT55XX,         1, "{ T55X7 RFIDs... }"},
 +
 +  {"config",      CmdLFSetConfig,     0, "Set config for LF sampling, bit/sample, decimation, frequency"},
 + 
 +  {"cmdread",     CmdLFCommandRead,   0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"},
 +  {"flexdemod",   CmdFlexdemod,       1, "Demodulate samples for FlexPass"},
 +  {"indalademod", CmdIndalaDemod,     1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"},
 +  {"indalaclone", CmdIndalaClone,     0, "<UID> ['l']-- Clone Indala to T55x7 (tag must be in antenna)(UID in HEX)(option 'l' for 224 UID"},
 +  {"read",        CmdLFRead,          0, "['s' silent] Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"},
 +  {"search",      CmdLFfind,          1, "[offline] ['u'] Read and Search for valid known tag (in offline mode it you can load first then search) - 'u' to search for unknown tags"},
 +  {"sim",         CmdLFSim,           0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},
 +  {"simask",      CmdLFaskSim,        0, "[clock] [invert <1|0>] [manchester/raw <'m'|'r'>] [msg separator 's'] [d <hexdata>] -- Simulate LF ASK tag from demodbuffer or input"},
 +  {"simfsk",      CmdLFfskSim,        0, "[c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>] -- Simulate LF FSK tag from demodbuffer or input"},
 +  {"simpsk",      CmdLFpskSim,        0, "[1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>] -- Simulate LF PSK tag from demodbuffer or input"},
 +  {"simbidir",    CmdLFSimBidir,      0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
-   //{"simman",      CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},
 +  {"snoop",       CmdLFSnoop,         0, "['l'|'h'|<divisor>] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"},
 +  {"vchdemod",    CmdVchDemod,        1, "['clone'] -- Demodulate samples for VeriChip"},
 +  {NULL, NULL, 0, NULL}
  };
  
  int CmdLF(const char *Cmd)
Simple merge
index 6d17a09b607e90ad72549380327f452ecc552220,af3d2d4cfeb5a060bd4df6a36e0771b43948c4bf..4e10eb75382ac8b4e05f54b2648fb2eb58dd409f
@@@ -23,13 -23,12 +23,24 @@@ Arguments
        -h             : this help
        -m             : Maxed out items (experimental)
        -i             : filename for the datadump to read (bin)
 -]]
 +
 +      ]]
  
  local TIMEOUT = 2000 -- Shouldn't take longer than 2 seconds
 -local DEBUG = true -- the debug flag
 +local DEBUG = false -- the debug flag
 +local RANDOM = '20436F707972696768742028432920323031302041637469766973696F6E2E20416C6C205269676874732052657365727665642E20'
 +
++local band = bit32.band
++local bor = bit32.bor
++local lshift = bit32.lshift
++local rshift = bit32.rshift
++local byte = string.byte
++local char = string.char
++local sub = string.sub
++local format = string.format
++
  local band = bit32.band
  local bor = bit32.bor
  local lshift = bit32.lshift
@@@ -198,8 -197,8 +209,6 @@@ local function ValidateCheckSums(blocks
        io.write( ('TYPE 3 area 2: %04x = %04x -- %s\n'):format(crc,calc,isOk))
  end
  
--local function LoadEmulator(blocks)
 -      local HASHCONSTANT = '20436F707972696768742028432920323031302041637469766973696F6E2E20416C6C205269676874732052657365727665642E20'
        local cmd
        local blockdata
        for _,b in pairs(blocks) do 
@@@ -418,12 -425,6 +427,12 @@@ local function main(args
        
        local hat = blocks[9]:sub(8,11)
        print(('Hat         : %d'):format(utils.SwapEndianness(hat,16)))
-       --hälsa: 667 029b  
 +
 +      local level = blocks[13]:sub(27,28)
 +      print(('LEVEL : %d'):format( tonumber(level,16)))
++      --hälsa: 667 029b  
 +      --local health = blocks[]:sub();
 +      --print(('Health : %d'):format( tonumber(health,16))
        
        --0x0D    0x29    0x0A    0x02    16-bit hero points value. Maximum 100.
        local heropoints = blocks[13]:sub(20,23)
Impressum, Datenschutz