mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 13:53:55 -07:00
Some more nasty bugs fixed in the lf t55xx manchester_decode method.
ADD: a little function to see if GraphBuffer is not used.
This commit is contained in:
parent
db297e69e1
commit
c6be64da09
7 changed files with 54 additions and 34 deletions
|
@ -22,6 +22,7 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
#define LF_TRACE_BUFF_SIZE 12000
|
#define LF_TRACE_BUFF_SIZE 12000
|
||||||
|
#define LF_BITSSTREAM_LEN 1000
|
||||||
|
|
||||||
char *global_em410xId;
|
char *global_em410xId;
|
||||||
|
|
||||||
|
@ -530,9 +531,9 @@ int CmdReadWord(const char *Cmd)
|
||||||
}
|
}
|
||||||
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||||
|
|
||||||
uint8_t bits[1000] = {0x00};
|
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||||
uint8_t * bitstream = bits;
|
uint8_t * bitstream = bits;
|
||||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream,LF_BITSSTREAM_LEN);
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -570,10 +571,9 @@ int CmdReadWordPWD(const char *Cmd)
|
||||||
}
|
}
|
||||||
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||||
|
|
||||||
uint8_t bits[1000] = {0x00};
|
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||||
uint8_t * bitstream = bits;
|
uint8_t * bitstream = bits;
|
||||||
|
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
|
||||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,15 +23,16 @@
|
||||||
|
|
||||||
|
|
||||||
#define LF_TRACE_BUFF_SIZE 12000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..)
|
#define LF_TRACE_BUFF_SIZE 12000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..)
|
||||||
|
#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits =
|
||||||
static int CmdHelp(const char *Cmd);
|
static int CmdHelp(const char *Cmd);
|
||||||
|
|
||||||
|
|
||||||
int CmdReadBlk(const char *Cmd)
|
int CmdReadBlk(const char *Cmd)
|
||||||
{
|
{
|
||||||
int Block = -1;
|
int block = -1;
|
||||||
sscanf(Cmd, "%d", &Block);
|
sscanf(Cmd, "%d", &block);
|
||||||
|
|
||||||
if ((Block > 7) | (Block < 0)) {
|
if ((block > 7) | (block < 0)) {
|
||||||
PrintAndLog("Block must be between 0 and 7");
|
PrintAndLog("Block must be between 0 and 7");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -55,7 +56,7 @@ int CmdReadBlk(const char *Cmd)
|
||||||
// }
|
// }
|
||||||
// GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
// GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||||
CmdSamples("12000");
|
CmdSamples("12000");
|
||||||
ManchesterDemod(Block);
|
ManchesterDemod(block);
|
||||||
// RepaintGraphWindow();
|
// RepaintGraphWindow();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -175,10 +176,10 @@ int CmdReadTrace(const char *Cmd)
|
||||||
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t bits[1000] = {0x00};
|
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||||
uint8_t * bitstream = bits;
|
uint8_t * bitstream = bits;
|
||||||
|
|
||||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
|
|
||||||
uint8_t si = 5;
|
uint8_t si = 5;
|
||||||
|
@ -253,10 +254,10 @@ int CmdInfo(const char *Cmd){
|
||||||
CmdReadBlk("0");
|
CmdReadBlk("0");
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t bits[1000] = {0x00};
|
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||||
uint8_t * bitstream = bits;
|
uint8_t * bitstream = bits;
|
||||||
|
|
||||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
|
||||||
|
|
||||||
uint8_t si = 5;
|
uint8_t si = 5;
|
||||||
uint32_t bl0 = PackBits(si, 32, bitstream);
|
uint32_t bl0 = PackBits(si, 32, bitstream);
|
||||||
|
@ -324,7 +325,7 @@ int CmdDump(const char *Cmd){
|
||||||
for ( int i = 0; i <8; ++i){
|
for ( int i = 0; i <8; ++i){
|
||||||
memset(s,0,sizeof(s));
|
memset(s,0,sizeof(s));
|
||||||
if ( hasPwd ) {
|
if ( hasPwd ) {
|
||||||
sprintf(s,"%d %s", i, sprint_hex(pwd,4));
|
sprintf(s,"%d %02x%02x%02x%02x", i, pwd[0],pwd[1],pwd[2],pwd[3]);
|
||||||
CmdReadBlkPWD(s);
|
CmdReadBlkPWD(s);
|
||||||
} else {
|
} else {
|
||||||
sprintf(s,"%d", i);
|
sprintf(s,"%d", i);
|
||||||
|
@ -335,6 +336,9 @@ int CmdDump(const char *Cmd){
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdIceFsk(const char *Cmd){
|
int CmdIceFsk(const char *Cmd){
|
||||||
|
|
||||||
|
if (!HasGraphData()) return 0;
|
||||||
|
|
||||||
iceFsk3(GraphBuffer, LF_TRACE_BUFF_SIZE);
|
iceFsk3(GraphBuffer, LF_TRACE_BUFF_SIZE);
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -343,16 +347,17 @@ int CmdIceManchester(const char *Cmd){
|
||||||
ManchesterDemod( -1);
|
ManchesterDemod( -1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int ManchesterDemod(int block){
|
int ManchesterDemod(int blockNum){
|
||||||
|
|
||||||
|
if (!HasGraphData()) return 0;
|
||||||
|
|
||||||
int blockNum = -1;
|
|
||||||
uint8_t sizebyte = 32;
|
uint8_t sizebyte = 32;
|
||||||
uint8_t offset = 5;
|
uint8_t offset = 5;
|
||||||
uint32_t blockData;
|
uint32_t blockData;
|
||||||
uint8_t bits[1000] = {0x00};
|
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||||
uint8_t * bitstream = bits;
|
uint8_t * bitstream = bits;
|
||||||
|
|
||||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
|
||||||
blockData = PackBits(offset, sizebyte, bitstream);
|
blockData = PackBits(offset, sizebyte, bitstream);
|
||||||
|
|
||||||
if ( blockNum < 0)
|
if ( blockNum < 0)
|
||||||
|
|
|
@ -51,9 +51,9 @@ static command_t CommandTable[] =
|
||||||
{
|
{
|
||||||
{"help", CmdHelp, 1, "This help. Use '<command> help' for details of a particular command."},
|
{"help", CmdHelp, 1, "This help. Use '<command> help' for details of a particular command."},
|
||||||
{"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"},
|
{"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"},
|
||||||
{"hf", CmdHF, 1, "{ HF commands... }"},
|
{"hf", CmdHF, 1, "{ High Frequency commands... }"},
|
||||||
{"hw", CmdHW, 1, "{ Hardware commands... }"},
|
{"hw", CmdHW, 1, "{ Hardware commands... }"},
|
||||||
{"lf", CmdLF, 1, "{ LF commands... }"},
|
{"lf", CmdLF, 1, "{ Low Frequency commands... }"},
|
||||||
{"script", CmdScript, 1,"{ Scripting commands }"},
|
{"script", CmdScript, 1,"{ Scripting commands }"},
|
||||||
{"quit", CmdQuit, 1, "Exit program"},
|
{"quit", CmdQuit, 1, "Exit program"},
|
||||||
{"exit", CmdQuit, 1, "Exit program"},
|
{"exit", CmdQuit, 1, "Exit program"},
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include "graph.h"
|
#include "graph.h"
|
||||||
|
@ -93,3 +94,15 @@ int GetClock(const char *str, int peak, int verbose)
|
||||||
|
|
||||||
return clock;
|
return clock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A simple test to see if there is any data inside Graphbuffer.
|
||||||
|
*/
|
||||||
|
bool HasGraphData(){
|
||||||
|
|
||||||
|
if ( GraphTraceLen <= 0) {
|
||||||
|
PrintAndLog("No data available, try reading something first");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -15,9 +15,9 @@ void AppendGraph(int redraw, int clock, int bit);
|
||||||
int ClearGraph(int redraw);
|
int ClearGraph(int redraw);
|
||||||
int DetectClock(int peak);
|
int DetectClock(int peak);
|
||||||
int GetClock(const char *str, int peak, int verbose);
|
int GetClock(const char *str, int peak, int verbose);
|
||||||
|
bool HasGraphData();
|
||||||
|
|
||||||
#define MAX_GRAPH_TRACE_LEN (1024*128)
|
#define MAX_GRAPH_TRACE_LEN (1024*128)
|
||||||
extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
|
extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
|
||||||
extern int GraphTraceLen;
|
extern int GraphTraceLen;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
20
client/ui.c
20
client/ui.c
|
@ -95,14 +95,14 @@ void SetLogFilename(char *fn)
|
||||||
logfilename = fn;
|
logfilename = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
int manchester_decode( int * data, const size_t len, uint8_t * dataout, size_t dataoutlen){
|
||||||
|
|
||||||
int bitlength = 0;
|
int bitlength = 0;
|
||||||
int i, clock, high, low, startindex;
|
int i, clock, high, low, startindex;
|
||||||
low = startindex = 0;
|
low = startindex = 0;
|
||||||
high = 1;
|
high = 1;
|
||||||
uint8_t * bitStream = (uint8_t* ) malloc(sizeof(uint8_t) * len);
|
uint8_t * bitStream = (uint8_t* ) malloc(sizeof(uint8_t) * dataoutlen);
|
||||||
memset(bitStream, 0x00, len);
|
memset(bitStream, 0x00, dataoutlen);
|
||||||
|
|
||||||
/* Detect high and lows */
|
/* Detect high and lows */
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
|
@ -116,12 +116,12 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
||||||
clock = GetT55x7Clock( data, len, high );
|
clock = GetT55x7Clock( data, len, high );
|
||||||
startindex = DetectFirstTransition(data, len, high);
|
startindex = DetectFirstTransition(data, len, high);
|
||||||
|
|
||||||
PrintAndLog(" Clock : %d", clock);
|
//PrintAndLog(" Clock : %d", clock);
|
||||||
|
|
||||||
if (high != 1)
|
if (high != 1)
|
||||||
bitlength = ManchesterConvertFrom255(data, len, bitStream, high, low, clock, startindex);
|
bitlength = ManchesterConvertFrom255(data, len, bitStream, dataoutlen, high, low, clock, startindex);
|
||||||
else
|
else
|
||||||
bitlength= ManchesterConvertFrom1(data, len, bitStream, clock, startindex);
|
bitlength= ManchesterConvertFrom1(data, len, bitStream, dataoutlen, clock, startindex);
|
||||||
|
|
||||||
memcpy(dataout, bitStream, bitlength);
|
memcpy(dataout, bitStream, bitlength);
|
||||||
free(bitStream);
|
free(bitStream);
|
||||||
|
@ -192,7 +192,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int high, int low, int clock, int startIndex){
|
int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int dataoutlen, int high, int low, int clock, int startIndex){
|
||||||
|
|
||||||
int i, j, z, hithigh, hitlow, bitIndex, startType;
|
int i, j, z, hithigh, hitlow, bitIndex, startType;
|
||||||
i = 0;
|
i = 0;
|
||||||
|
@ -205,7 +205,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
||||||
int firstST = 0;
|
int firstST = 0;
|
||||||
|
|
||||||
// i = clock frame of data
|
// i = clock frame of data
|
||||||
for (; i < (int)(len / clock); i++)
|
for (; i < (int)(len/clock); i++)
|
||||||
{
|
{
|
||||||
hithigh = 0;
|
hithigh = 0;
|
||||||
hitlow = 0;
|
hitlow = 0;
|
||||||
|
@ -261,11 +261,13 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
||||||
|
|
||||||
if ( firstST == 4)
|
if ( firstST == 4)
|
||||||
break;
|
break;
|
||||||
|
if ( bitIndex >= dataoutlen-1 )
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return bitIndex;
|
return bitIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int clock, int startIndex){
|
int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout,int dataoutlen, int clock, int startIndex){
|
||||||
|
|
||||||
PrintAndLog(" Path B");
|
PrintAndLog(" Path B");
|
||||||
|
|
||||||
|
|
|
@ -27,13 +27,13 @@ extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault;
|
||||||
extern int offline;
|
extern int offline;
|
||||||
extern int flushAfterWrite; //buzzy
|
extern int flushAfterWrite; //buzzy
|
||||||
|
|
||||||
int manchester_decode( int * data, const size_t len, uint8_t * dataout);
|
int manchester_decode( int * data, const size_t len, uint8_t * dataout, size_t dataoutlen);
|
||||||
int GetT55x7Clock( const int * data, const size_t len, int high );
|
int GetT55x7Clock( const int * data, const size_t len, int high );
|
||||||
int DetectFirstTransition(const int * data, const size_t len, int low);
|
int DetectFirstTransition(const int * data, const size_t len, int low);
|
||||||
void PrintPaddedManchester( uint8_t * bitStream, size_t len, size_t blocksize);
|
void PrintPaddedManchester( uint8_t * bitStream, size_t len, size_t blocksize);
|
||||||
void ManchesterDiffDecodedString( const uint8_t *bitStream, size_t len, uint8_t invert );
|
void ManchesterDiffDecodedString( const uint8_t *bitStream, size_t len, uint8_t invert );
|
||||||
int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int high, int low, int clock, int startIndex);
|
int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout,int dataoutlen, int high, int low, int clock, int startIndex);
|
||||||
int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int clock, int startIndex);
|
int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int dataoutlen, int clock, int startIndex);
|
||||||
void iceFsk2(int * data, const size_t len);
|
void iceFsk2(int * data, const size_t len);
|
||||||
void iceFsk3(int * data, const size_t len);
|
void iceFsk3(int * data, const size_t len);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue