mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-30 03:28:32 -07:00
Small lf bug fixes and threshold adjustments
adjusted lf demod thresholds based on additional testing fixed bug in hid bit length calc in cmddata.c fixed bugs in lf search
This commit is contained in:
parent
ae6ead3dc8
commit
84871873a4
3 changed files with 73 additions and 47 deletions
|
@ -618,7 +618,7 @@ int CmdFSKdemodHID(const char *Cmd)
|
||||||
uint32_t cardnum = 0;
|
uint32_t cardnum = 0;
|
||||||
if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
|
if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
|
||||||
uint32_t lo2=0;
|
uint32_t lo2=0;
|
||||||
lo2=(((hi & 15) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
|
lo2=(((hi & 31) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit
|
||||||
uint8_t idx3 = 1;
|
uint8_t idx3 = 1;
|
||||||
while(lo2>1){ //find last bit set to 1 (format len bit)
|
while(lo2>1){ //find last bit set to 1 (format len bit)
|
||||||
lo2=lo2>>1;
|
lo2=lo2>>1;
|
||||||
|
@ -631,10 +631,6 @@ int CmdFSKdemodHID(const char *Cmd)
|
||||||
cardnum = (lo>>1)&0xFFFF;
|
cardnum = (lo>>1)&0xFFFF;
|
||||||
fc = (lo>>17)&0xFF;
|
fc = (lo>>17)&0xFF;
|
||||||
}
|
}
|
||||||
if(fmtLen==37){
|
|
||||||
cardnum = (lo>>1)&0x7FFFF;
|
|
||||||
fc = ((hi&0xF)<<12)|(lo>>20);
|
|
||||||
}
|
|
||||||
if(fmtLen==34){
|
if(fmtLen==34){
|
||||||
cardnum = (lo>>1)&0xFFFF;
|
cardnum = (lo>>1)&0xFFFF;
|
||||||
fc= ((hi&1)<<15)|(lo>>17);
|
fc= ((hi&1)<<15)|(lo>>17);
|
||||||
|
@ -870,24 +866,35 @@ int PSKnrzDemod(const char *Cmd){
|
||||||
// optional arguments - same as CmdpskNRZrawDemod (clock & invert)
|
// optional arguments - same as CmdpskNRZrawDemod (clock & invert)
|
||||||
int CmdIndalaDecode(const char *Cmd)
|
int CmdIndalaDecode(const char *Cmd)
|
||||||
{
|
{
|
||||||
|
uint8_t verbose = 1;
|
||||||
int ans;
|
int ans;
|
||||||
if (strlen(Cmd)>0)
|
if (strlen(Cmd)>0){
|
||||||
ans=PSKnrzDemod(Cmd);
|
if (Cmd[0]=='0'){
|
||||||
else
|
verbose=0;
|
||||||
ans = PSKnrzDemod("32");
|
ans = PSKnrzDemod("32");
|
||||||
|
}else{
|
||||||
|
ans = PSKnrzDemod(Cmd);
|
||||||
|
}
|
||||||
|
} else{ //default to RF/32
|
||||||
|
ans = PSKnrzDemod("32");
|
||||||
|
}
|
||||||
|
|
||||||
if (ans < 0){
|
if (ans < 0){
|
||||||
|
if (verbose)
|
||||||
PrintAndLog("Error1: %d",ans);
|
PrintAndLog("Error1: %d",ans);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
uint8_t invert=0;
|
uint8_t invert=0;
|
||||||
ans = indala26decode(DemodBuffer,(size_t *) &DemodBufferLen, &invert);
|
ans = indala26decode(DemodBuffer,(size_t *) &DemodBufferLen, &invert);
|
||||||
if (ans < 1) {
|
if (ans < 1) {
|
||||||
|
if (verbose)
|
||||||
PrintAndLog("Error2: %d",ans);
|
PrintAndLog("Error2: %d",ans);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
char showbits[251];
|
char showbits[251];
|
||||||
if(invert==1) PrintAndLog("Had to invert bits");
|
if (invert)
|
||||||
|
if (verbose)
|
||||||
|
PrintAndLog("Had to invert bits");
|
||||||
//convert UID to HEX
|
//convert UID to HEX
|
||||||
uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
|
uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
|
||||||
int idx;
|
int idx;
|
||||||
|
@ -951,10 +958,18 @@ int CmdPskClean(const char *Cmd)
|
||||||
//prints binary found and saves in graphbuffer for further commands
|
//prints binary found and saves in graphbuffer for further commands
|
||||||
int CmdpskNRZrawDemod(const char *Cmd)
|
int CmdpskNRZrawDemod(const char *Cmd)
|
||||||
{
|
{
|
||||||
int errCnt= PSKnrzDemod(Cmd);
|
uint8_t verbose = 1;
|
||||||
|
int errCnt;
|
||||||
|
if (strlen(Cmd)>0){
|
||||||
|
if (Cmd[0]=='0')
|
||||||
|
verbose=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
errCnt = PSKnrzDemod(Cmd);
|
||||||
//output
|
//output
|
||||||
if (errCnt<0) return 0;
|
if (errCnt<0) return 0;
|
||||||
if (errCnt>0){
|
if (errCnt>0){
|
||||||
|
if (verbose)
|
||||||
PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
|
PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
|
||||||
}
|
}
|
||||||
PrintAndLog("PSK or NRZ demoded bitstream:");
|
PrintAndLog("PSK or NRZ demoded bitstream:");
|
||||||
|
|
|
@ -566,7 +566,7 @@ int CmdLFfind(const char *Cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!offline || (cmdp != '1') ){
|
if (!offline && (cmdp != '1')){
|
||||||
ans=CmdLFRead("");
|
ans=CmdLFRead("");
|
||||||
ans=CmdSamples("20000");
|
ans=CmdSamples("20000");
|
||||||
} else if (GraphTraceLen < 1000) {
|
} else if (GraphTraceLen < 1000) {
|
||||||
|
@ -574,18 +574,29 @@ int CmdLFfind(const char *Cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PrintAndLog("NOTE: some demods output possible binary\n if it finds something that looks like a tag");
|
||||||
PrintAndLog("Checking for known tags:");
|
PrintAndLog("Checking for known tags:");
|
||||||
ans=Cmdaskmandemod("");
|
|
||||||
if (ans>0) return 1;
|
|
||||||
ans=CmdFSKdemodHID("");
|
|
||||||
if (ans>0) return 1;
|
|
||||||
ans=CmdFSKdemodIO("");
|
ans=CmdFSKdemodIO("");
|
||||||
if (ans>0) return 1;
|
if (ans>0) {
|
||||||
|
PrintAndLog("Valid IO Prox ID Found!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
ans=CmdFSKdemodHID("");
|
||||||
|
if (ans>0) {
|
||||||
|
PrintAndLog("Valid HID Prox ID Found!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
//add psk and indala
|
//add psk and indala
|
||||||
ans=CmdIndalaDemod("");
|
ans=CmdIndalaDecode("0");
|
||||||
if (ans>0) return 1;
|
if (ans>0) {
|
||||||
ans=CmdIndalaDemod("224");
|
PrintAndLog("Valid Indala ID Found!");
|
||||||
if (ans>0) return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
ans=Cmdaskmandemod("");
|
||||||
|
if (ans>0) {
|
||||||
|
PrintAndLog("Valid EM410x ID Found!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
PrintAndLog("No Known Tags Found!\n");
|
PrintAndLog("No Known Tags Found!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size)
|
||||||
//no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future
|
//no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future
|
||||||
// otherwise could be a void with no arguments
|
// otherwise could be a void with no arguments
|
||||||
//set defaults
|
//set defaults
|
||||||
int high=0, low=128;
|
int high=0, low=255;
|
||||||
uint64_t lo=0;
|
uint64_t lo=0;
|
||||||
|
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
|
@ -84,7 +84,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size)
|
||||||
int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
|
int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int high = 0, low = 128;
|
int high = 0, low = 255;
|
||||||
*clk=DetectASKClock(BinStream, *size, *clk); //clock default
|
*clk=DetectASKClock(BinStream, *size, *clk); //clock default
|
||||||
|
|
||||||
if (*clk<8) *clk =64;
|
if (*clk<8) *clk =64;
|
||||||
|
@ -100,7 +100,7 @@ int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
|
||||||
else if (BinStream[i] < low)
|
else if (BinStream[i] < low)
|
||||||
low = BinStream[i];
|
low = BinStream[i];
|
||||||
}
|
}
|
||||||
if ((high < 158) ){ //throw away static
|
if ((high < 129) ){ //throw away static (anything < 1 graph)
|
||||||
//PrintAndLog("no data found");
|
//PrintAndLog("no data found");
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
@ -283,7 +283,7 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
// int invert=0; //invert default
|
// int invert=0; //invert default
|
||||||
int high = 0, low = 128;
|
int high = 0, low = 255;
|
||||||
*clk=DetectASKClock(BinStream, *size, *clk); //clock default
|
*clk=DetectASKClock(BinStream, *size, *clk); //clock default
|
||||||
uint8_t BitStream[502] = {0};
|
uint8_t BitStream[502] = {0};
|
||||||
|
|
||||||
|
@ -300,7 +300,8 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert)
|
||||||
else if (BinStream[i] < low)
|
else if (BinStream[i] < low)
|
||||||
low = BinStream[i];
|
low = BinStream[i];
|
||||||
}
|
}
|
||||||
if ((high < 134)){ //throw away static high has to be more than 6 on graph. noise <= -10 here
|
if ((high < 129)){ //throw away static high has to be more than 0 on graph.
|
||||||
|
//noise <= -10 here
|
||||||
// PrintAndLog("no data found");
|
// PrintAndLog("no data found");
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
@ -410,8 +411,8 @@ size_t fsk_wave_demod(uint8_t * dest, size_t size, uint8_t fchigh, uint8_t fclow
|
||||||
//uint32_t maxVal=0;
|
//uint32_t maxVal=0;
|
||||||
if (fchigh==0) fchigh=10;
|
if (fchigh==0) fchigh=10;
|
||||||
if (fclow==0) fclow=8;
|
if (fclow==0) fclow=8;
|
||||||
//set the threshold close to 0 (graph) to avoid static
|
//set the threshold close to 0 (graph) or 128 std to avoid static
|
||||||
uint8_t threshold_value = 134; //(uint8_t)(((maxVal-128)*.75)+128);
|
uint8_t threshold_value = 123;
|
||||||
|
|
||||||
// sync to first lo-hi transition, and threshold
|
// sync to first lo-hi transition, and threshold
|
||||||
|
|
||||||
|
@ -471,7 +472,7 @@ size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t maxCons
|
||||||
if ( dest[idx-1]==1 ) {
|
if ( dest[idx-1]==1 ) {
|
||||||
n=myround2((float)(n+1)/((float)(rfLen)/(float)fclow));
|
n=myround2((float)(n+1)/((float)(rfLen)/(float)fclow));
|
||||||
} else {// 0->1 crossing
|
} else {// 0->1 crossing
|
||||||
n=myround2((float)(n+1)/((float)(rfLen-2)/(float)fchigh)); //-2 for fudge factor
|
n=myround2((float)(n+1)/((float)(rfLen-1)/(float)fchigh)); //-1 for fudge factor
|
||||||
}
|
}
|
||||||
if (n == 0) n = 1;
|
if (n == 0) n = 1;
|
||||||
|
|
||||||
|
@ -563,7 +564,7 @@ uint32_t bytebits_to_byte(uint8_t* src, size_t numbits)
|
||||||
|
|
||||||
int IOdemodFSK(uint8_t *dest, size_t size)
|
int IOdemodFSK(uint8_t *dest, size_t size)
|
||||||
{
|
{
|
||||||
static const uint8_t THRESHOLD = 134;
|
static const uint8_t THRESHOLD = 129;
|
||||||
uint32_t idx=0;
|
uint32_t idx=0;
|
||||||
//make sure buffer has data
|
//make sure buffer has data
|
||||||
if (size < 66) return -1;
|
if (size < 66) return -1;
|
||||||
|
@ -607,7 +608,7 @@ int DetectASKClock(uint8_t dest[], size_t size, int clock)
|
||||||
{
|
{
|
||||||
int i=0;
|
int i=0;
|
||||||
int peak=0;
|
int peak=0;
|
||||||
int low=128;
|
int low=255;
|
||||||
int clk[]={16,32,40,50,64,100,128,256};
|
int clk[]={16,32,40,50,64,100,128,256};
|
||||||
int loopCnt = 256; //don't need to loop through entire array...
|
int loopCnt = 256; //don't need to loop through entire array...
|
||||||
if (size<loopCnt) loopCnt = size;
|
if (size<loopCnt) loopCnt = size;
|
||||||
|
@ -679,7 +680,7 @@ int DetectpskNRZClock(uint8_t dest[], size_t size, int clock)
|
||||||
{
|
{
|
||||||
int i=0;
|
int i=0;
|
||||||
int peak=0;
|
int peak=0;
|
||||||
int low=128;
|
int low=255;
|
||||||
int clk[]={16,32,40,50,64,100,128,256};
|
int clk[]={16,32,40,50,64,100,128,256};
|
||||||
int loopCnt = 2048; //don't need to loop through entire array...
|
int loopCnt = 2048; //don't need to loop through entire array...
|
||||||
if (size<loopCnt) loopCnt = size;
|
if (size<loopCnt) loopCnt = size;
|
||||||
|
@ -763,7 +764,7 @@ int DetectpskNRZClock(uint8_t dest[], size_t size, int clock)
|
||||||
void pskCleanWave(uint8_t *bitStream, size_t size)
|
void pskCleanWave(uint8_t *bitStream, size_t size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int low=128;
|
int low=255;
|
||||||
int high=0;
|
int high=0;
|
||||||
int gap = 4;
|
int gap = 4;
|
||||||
// int loopMax = 2048;
|
// int loopMax = 2048;
|
||||||
|
@ -805,8 +806,7 @@ int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert)
|
||||||
{
|
{
|
||||||
//26 bit 40134 format (don't know other formats)
|
//26 bit 40134 format (don't know other formats)
|
||||||
int i;
|
int i;
|
||||||
int long_wait;
|
int long_wait=29;//29 leading zeros in format
|
||||||
long_wait = 29;//29 leading zeros in format
|
|
||||||
int start;
|
int start;
|
||||||
int first = 0;
|
int first = 0;
|
||||||
int first2 = 0;
|
int first2 = 0;
|
||||||
|
@ -828,7 +828,6 @@ int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert)
|
||||||
// did not find start sequence
|
// did not find start sequence
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
//found start once now test length by finding next one
|
|
||||||
// Inverting signal if needed
|
// Inverting signal if needed
|
||||||
if (first == 1) {
|
if (first == 1) {
|
||||||
for (i = start; i < *size; i++) {
|
for (i = start; i < *size; i++) {
|
||||||
|
@ -838,6 +837,7 @@ int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert)
|
||||||
}else *invert=0;
|
}else *invert=0;
|
||||||
|
|
||||||
int iii;
|
int iii;
|
||||||
|
//found start once now test length by finding next one
|
||||||
for (ii=start+29; ii <= *size - 250; ii++) {
|
for (ii=start+29; ii <= *size - 250; ii++) {
|
||||||
first2 = bitStream[ii];
|
first2 = bitStream[ii];
|
||||||
for (iii = ii; iii < ii + long_wait; iii++) {
|
for (iii = ii; iii < ii + long_wait; iii++) {
|
||||||
|
@ -873,7 +873,7 @@ int pskNRZrawDemod(uint8_t *dest, size_t *size, int *clk, int *invert)
|
||||||
int clk2 = DetectpskNRZClock(dest, *size, *clk);
|
int clk2 = DetectpskNRZClock(dest, *size, *clk);
|
||||||
*clk=clk2;
|
*clk=clk2;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint8_t high=0, low=128;
|
uint8_t high=0, low=255;
|
||||||
uint32_t gLen = *size;
|
uint32_t gLen = *size;
|
||||||
if (gLen > 1280) gLen=1280;
|
if (gLen > 1280) gLen=1280;
|
||||||
// get high
|
// get high
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue