mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-22 14:13:42 -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 "data.h"
|
||||
#define LF_TRACE_BUFF_SIZE 12000
|
||||
#define LF_BITSSTREAM_LEN 1000
|
||||
|
||||
char *global_em410xId;
|
||||
|
||||
|
@ -530,9 +531,9 @@ int CmdReadWord(const char *Cmd)
|
|||
}
|
||||
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||
|
||||
uint8_t bits[1000] = {0x00};
|
||||
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||
uint8_t * bitstream = bits;
|
||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream,LF_BITSSTREAM_LEN);
|
||||
RepaintGraphWindow();
|
||||
return 0;
|
||||
}
|
||||
|
@ -570,10 +571,9 @@ int CmdReadWordPWD(const char *Cmd)
|
|||
}
|
||||
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||
|
||||
uint8_t bits[1000] = {0x00};
|
||||
uint8_t * bitstream = bits;
|
||||
|
||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
||||
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||
uint8_t * bitstream = bits;
|
||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
|
||||
RepaintGraphWindow();
|
||||
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_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits =
|
||||
static int CmdHelp(const char *Cmd);
|
||||
|
||||
|
||||
int CmdReadBlk(const char *Cmd)
|
||||
{
|
||||
int Block = -1;
|
||||
sscanf(Cmd, "%d", &Block);
|
||||
int block = -1;
|
||||
sscanf(Cmd, "%d", &block);
|
||||
|
||||
if ((Block > 7) | (Block < 0)) {
|
||||
if ((block > 7) | (block < 0)) {
|
||||
PrintAndLog("Block must be between 0 and 7");
|
||||
return 1;
|
||||
}
|
||||
|
@ -55,7 +56,7 @@ int CmdReadBlk(const char *Cmd)
|
|||
// }
|
||||
// GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||
CmdSamples("12000");
|
||||
ManchesterDemod(Block);
|
||||
ManchesterDemod(block);
|
||||
// RepaintGraphWindow();
|
||||
return 0;
|
||||
}
|
||||
|
@ -175,10 +176,10 @@ int CmdReadTrace(const char *Cmd)
|
|||
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||
}
|
||||
|
||||
uint8_t bits[1000] = {0x00};
|
||||
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||
uint8_t * bitstream = bits;
|
||||
|
||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
|
||||
RepaintGraphWindow();
|
||||
|
||||
uint8_t si = 5;
|
||||
|
@ -253,10 +254,10 @@ int CmdInfo(const char *Cmd){
|
|||
CmdReadBlk("0");
|
||||
}
|
||||
|
||||
uint8_t bits[1000] = {0x00};
|
||||
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||
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;
|
||||
uint32_t bl0 = PackBits(si, 32, bitstream);
|
||||
|
@ -324,7 +325,7 @@ int CmdDump(const char *Cmd){
|
|||
for ( int i = 0; i <8; ++i){
|
||||
memset(s,0,sizeof(s));
|
||||
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);
|
||||
} else {
|
||||
sprintf(s,"%d", i);
|
||||
|
@ -335,6 +336,9 @@ int CmdDump(const char *Cmd){
|
|||
}
|
||||
|
||||
int CmdIceFsk(const char *Cmd){
|
||||
|
||||
if (!HasGraphData()) return 0;
|
||||
|
||||
iceFsk3(GraphBuffer, LF_TRACE_BUFF_SIZE);
|
||||
RepaintGraphWindow();
|
||||
return 0;
|
||||
|
@ -343,16 +347,17 @@ int CmdIceManchester(const char *Cmd){
|
|||
ManchesterDemod( -1);
|
||||
return 0;
|
||||
}
|
||||
int ManchesterDemod(int block){
|
||||
int ManchesterDemod(int blockNum){
|
||||
|
||||
int blockNum = -1;
|
||||
if (!HasGraphData()) return 0;
|
||||
|
||||
uint8_t sizebyte = 32;
|
||||
uint8_t offset = 5;
|
||||
uint32_t blockData;
|
||||
uint8_t bits[1000] = {0x00};
|
||||
uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
|
||||
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);
|
||||
|
||||
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."},
|
||||
{"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"},
|
||||
{"hf", CmdHF, 1, "{ HF commands... }"},
|
||||
{"hf", CmdHF, 1, "{ High Frequency commands... }"},
|
||||
{"hw", CmdHW, 1, "{ Hardware commands... }"},
|
||||
{"lf", CmdLF, 1, "{ LF commands... }"},
|
||||
{"lf", CmdLF, 1, "{ Low Frequency commands... }"},
|
||||
{"script", CmdScript, 1,"{ Scripting commands }"},
|
||||
{"quit", CmdQuit, 1, "Exit program"},
|
||||
{"exit", CmdQuit, 1, "Exit program"},
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include "ui.h"
|
||||
#include "graph.h"
|
||||
|
@ -93,3 +94,15 @@ int GetClock(const char *str, int peak, int verbose)
|
|||
|
||||
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 DetectClock(int peak);
|
||||
int GetClock(const char *str, int peak, int verbose);
|
||||
bool HasGraphData();
|
||||
|
||||
#define MAX_GRAPH_TRACE_LEN (1024*128)
|
||||
extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
|
||||
extern int GraphTraceLen;
|
||||
|
||||
#endif
|
||||
|
|
20
client/ui.c
20
client/ui.c
|
@ -95,14 +95,14 @@ void SetLogFilename(char *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 i, clock, high, low, startindex;
|
||||
low = startindex = 0;
|
||||
high = 1;
|
||||
uint8_t * bitStream = (uint8_t* ) malloc(sizeof(uint8_t) * len);
|
||||
memset(bitStream, 0x00, len);
|
||||
uint8_t * bitStream = (uint8_t* ) malloc(sizeof(uint8_t) * dataoutlen);
|
||||
memset(bitStream, 0x00, dataoutlen);
|
||||
|
||||
/* Detect high and lows */
|
||||
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 );
|
||||
startindex = DetectFirstTransition(data, len, high);
|
||||
|
||||
PrintAndLog(" Clock : %d", clock);
|
||||
//PrintAndLog(" Clock : %d", clock);
|
||||
|
||||
if (high != 1)
|
||||
bitlength = ManchesterConvertFrom255(data, len, bitStream, high, low, clock, startindex);
|
||||
bitlength = ManchesterConvertFrom255(data, len, bitStream, dataoutlen, high, low, clock, startindex);
|
||||
else
|
||||
bitlength= ManchesterConvertFrom1(data, len, bitStream, clock, startindex);
|
||||
bitlength= ManchesterConvertFrom1(data, len, bitStream, dataoutlen, clock, startindex);
|
||||
|
||||
memcpy(dataout, bitStream, bitlength);
|
||||
free(bitStream);
|
||||
|
@ -192,7 +192,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
|||
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;
|
||||
i = 0;
|
||||
|
@ -205,7 +205,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
|||
int firstST = 0;
|
||||
|
||||
// i = clock frame of data
|
||||
for (; i < (int)(len / clock); i++)
|
||||
for (; i < (int)(len/clock); i++)
|
||||
{
|
||||
hithigh = 0;
|
||||
hitlow = 0;
|
||||
|
@ -261,11 +261,13 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
|||
|
||||
if ( firstST == 4)
|
||||
break;
|
||||
if ( bitIndex >= dataoutlen-1 )
|
||||
break;
|
||||
}
|
||||
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");
|
||||
|
||||
|
|
|
@ -27,13 +27,13 @@ extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault;
|
|||
extern int offline;
|
||||
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 DetectFirstTransition(const int * data, const size_t len, int low);
|
||||
void PrintPaddedManchester( uint8_t * bitStream, size_t len, size_t blocksize);
|
||||
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 ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, 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 dataoutlen, int clock, int startIndex);
|
||||
void iceFsk2(int * data, const size_t len);
|
||||
void iceFsk3(int * data, const size_t len);
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue