mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 13:23:51 -07:00
cleanup
This commit is contained in:
parent
605d7a2343
commit
8b047ae9f5
1 changed files with 66 additions and 44 deletions
110
common/lfdemod.c
110
common/lfdemod.c
|
@ -51,7 +51,9 @@
|
||||||
#define NOICE_AMPLITUDE_THRESHOLD 10
|
#define NOICE_AMPLITUDE_THRESHOLD 10
|
||||||
//to allow debug print calls when used not on dev
|
//to allow debug print calls when used not on dev
|
||||||
|
|
||||||
void dummy(char *fmt, ...){}
|
//void dummy(char *fmt, ...){}
|
||||||
|
extern void Dbprintf(const char *fmt, ...);
|
||||||
|
|
||||||
#ifndef ON_DEVICE
|
#ifndef ON_DEVICE
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
# include "cmdparser.h"
|
# include "cmdparser.h"
|
||||||
|
@ -59,7 +61,7 @@ void dummy(char *fmt, ...){}
|
||||||
# define prnt PrintAndLog
|
# define prnt PrintAndLog
|
||||||
#else
|
#else
|
||||||
uint8_t g_debugMode = 0;
|
uint8_t g_debugMode = 0;
|
||||||
# define prnt dummy
|
# define prnt Dbprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
signal_t signalprop = { 255, -255, 0, 0, true };
|
signal_t signalprop = { 255, -255, 0, 0, true };
|
||||||
|
@ -105,10 +107,9 @@ int32_t compute_mean_int(int *in, size_t N) {
|
||||||
|
|
||||||
//test samples are not just noise
|
//test samples are not just noise
|
||||||
// By measuring mean and look at amplitude of signal from HIGH / LOW, we can detect noise
|
// By measuring mean and look at amplitude of signal from HIGH / LOW, we can detect noise
|
||||||
bool justNoise_int(int *bits, uint32_t size) {
|
bool isNoise_int(int *bits, uint32_t size) {
|
||||||
resetSignal();
|
resetSignal();
|
||||||
if ( bits == NULL ) return true;
|
if ( bits == NULL || size < 100 ) return true;
|
||||||
if ( size < 100 ) return true;
|
|
||||||
|
|
||||||
int32_t sum = 0;
|
int32_t sum = 0;
|
||||||
for ( size_t i = 0; i < size; i++) {
|
for ( size_t i = 0; i < size; i++) {
|
||||||
|
@ -130,10 +131,9 @@ bool justNoise_int(int *bits, uint32_t size) {
|
||||||
//test samples are not just noise
|
//test samples are not just noise
|
||||||
// By measuring mean and look at amplitude of signal from HIGH / LOW,
|
// By measuring mean and look at amplitude of signal from HIGH / LOW,
|
||||||
// we can detect noise
|
// we can detect noise
|
||||||
bool justNoise(uint8_t *bits, uint32_t size) {
|
bool isNoise(uint8_t *bits, uint32_t size) {
|
||||||
resetSignal();
|
resetSignal();
|
||||||
if ( bits == NULL ) return true;
|
if ( bits == NULL || size < 100 ) return true;
|
||||||
if ( size < 100 ) return true;
|
|
||||||
|
|
||||||
uint32_t sum = 0;
|
uint32_t sum = 0;
|
||||||
for ( uint32_t i = 0; i < size; i++) {
|
for ( uint32_t i = 0; i < size; i++) {
|
||||||
|
@ -1553,16 +1553,15 @@ size_t fsk_wave_demod(uint8_t *dest, size_t size, uint8_t fchigh, uint8_t fclow,
|
||||||
size_t currSample = 0;
|
size_t currSample = 0;
|
||||||
size_t last_transition = 0;
|
size_t last_transition = 0;
|
||||||
size_t idx = 1;
|
size_t idx = 1;
|
||||||
|
size_t numBits = 0;
|
||||||
|
|
||||||
//find start of modulating data in trace
|
//find start of modulating data in trace
|
||||||
idx = findModStart(dest, size, fchigh);
|
idx = findModStart(dest, size, fchigh);
|
||||||
// Need to threshold first sample
|
// Need to threshold first sample
|
||||||
if(dest[idx] < FSK_PSK_THRESHOLD) dest[0] = 0;
|
dest[0] = (dest[idx] < FSK_PSK_THRESHOLD) ? 0 : 1;
|
||||||
else dest[0] = 1;
|
|
||||||
|
|
||||||
last_transition = idx;
|
last_transition = idx;
|
||||||
idx++;
|
idx++;
|
||||||
size_t numBits = 0;
|
|
||||||
|
|
||||||
// Definition: cycles between consecutive lo-hi transitions
|
// Definition: cycles between consecutive lo-hi transitions
|
||||||
// Lets define some expected lengths. FSK1 is easier since it has bigger differences between.
|
// Lets define some expected lengths. FSK1 is easier since it has bigger differences between.
|
||||||
|
@ -1595,9 +1594,9 @@ size_t fsk_wave_demod(uint8_t *dest, size_t size, uint8_t fchigh, uint8_t fclow,
|
||||||
// the 1-0 to 0-1 width should be divided with exp_zero. Ie: 3+5+6+7 = 21/6 = 3
|
// the 1-0 to 0-1 width should be divided with exp_zero. Ie: 3+5+6+7 = 21/6 = 3
|
||||||
|
|
||||||
for(; idx < size-20; idx++) {
|
for(; idx < size-20; idx++) {
|
||||||
|
|
||||||
// threshold current value
|
// threshold current value
|
||||||
if (dest[idx] < FSK_PSK_THRESHOLD) dest[idx] = 0;
|
dest[idx] = (dest[idx] < FSK_PSK_THRESHOLD) ? 0 : 1;
|
||||||
else dest[idx] = 1;
|
|
||||||
|
|
||||||
// Check for 0->1 transition
|
// Check for 0->1 transition
|
||||||
if (dest[idx-1] < dest[idx]) {
|
if (dest[idx-1] < dest[idx]) {
|
||||||
|
@ -1612,16 +1611,24 @@ size_t fsk_wave_demod(uint8_t *dest, size_t size, uint8_t fchigh, uint8_t fclow,
|
||||||
dest[numBits-1]=1;
|
dest[numBits-1]=1;
|
||||||
}
|
}
|
||||||
dest[numBits++]=1;
|
dest[numBits++]=1;
|
||||||
if (numBits > 0 && *startIdx==0) *startIdx = idx - fclow;
|
|
||||||
|
|
||||||
|
if (numBits > 0 && *startIdx == 0)
|
||||||
|
*startIdx = idx - fclow;
|
||||||
|
|
||||||
} else if (currSample > (fchigh+1) && numBits < 3) { //12 + and first two bit = unusable garbage
|
} else if (currSample > (fchigh+1) && numBits < 3) { //12 + and first two bit = unusable garbage
|
||||||
//do nothing with beginning garbage and reset.. should be rare..
|
//do nothing with beginning garbage and reset.. should be rare..
|
||||||
numBits = 0;
|
numBits = 0;
|
||||||
} else if (currSample == (fclow+1) && LastSample == (fclow-1)) { // had a 7 then a 9 should be two 8's (or 4 then a 6 should be two 5's)
|
} else if (currSample == (fclow+1) && LastSample == (fclow-1)) { // had a 7 then a 9 should be two 8's (or 4 then a 6 should be two 5's)
|
||||||
dest[numBits++]=1;
|
dest[numBits++]=1;
|
||||||
if (numBits > 0 && *startIdx==0) *startIdx = idx - fclow;
|
if (numBits > 0 && *startIdx == 0) {
|
||||||
|
*startIdx = idx - fclow;
|
||||||
|
}
|
||||||
} else { //9+ = 10 sample waves (or 6+ = 7)
|
} else { //9+ = 10 sample waves (or 6+ = 7)
|
||||||
dest[numBits++]=0;
|
dest[numBits++]=0;
|
||||||
if (numBits > 0 && *startIdx==0) *startIdx = idx - fchigh;
|
if (numBits > 0 && *startIdx == 0) {
|
||||||
|
*startIdx = idx - fchigh;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
last_transition = idx;
|
last_transition = idx;
|
||||||
}
|
}
|
||||||
|
@ -1632,6 +1639,7 @@ size_t fsk_wave_demod(uint8_t *dest, size_t size, uint8_t fchigh, uint8_t fclow,
|
||||||
//translate 11111100000 to 10
|
//translate 11111100000 to 10
|
||||||
//rfLen = clock, fchigh = larger field clock, fclow = smaller field clock
|
//rfLen = clock, fchigh = larger field clock, fclow = smaller field clock
|
||||||
size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t clk, uint8_t invert, uint8_t fchigh, uint8_t fclow, int *startIdx) {
|
size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t clk, uint8_t invert, uint8_t fchigh, uint8_t fclow, int *startIdx) {
|
||||||
|
|
||||||
uint8_t lastval = dest[0];
|
uint8_t lastval = dest[0];
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
size_t numBits = 0;
|
size_t numBits = 0;
|
||||||
|
@ -1643,13 +1651,16 @@ size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t clk, uint8_t invert, u
|
||||||
if (dest[i] == lastval) continue; //skip until we hit a transition
|
if (dest[i] == lastval) continue; //skip until we hit a transition
|
||||||
|
|
||||||
//find out how many bits (n) we collected (use 1/2 clk tolerance)
|
//find out how many bits (n) we collected (use 1/2 clk tolerance)
|
||||||
|
|
||||||
|
if (dest[i-1] == 1)
|
||||||
//if lastval was 1, we have a 1->0 crossing
|
//if lastval was 1, we have a 1->0 crossing
|
||||||
if (dest[i-1] == 1) {
|
|
||||||
n = (n * fclow + hclk) / clk;
|
n = (n * fclow + hclk) / clk;
|
||||||
} else {// 0->1 crossing
|
else
|
||||||
|
// 0->1 crossing
|
||||||
n = (n * fchigh + hclk) / clk;
|
n = (n * fchigh + hclk) / clk;
|
||||||
}
|
|
||||||
if (n == 0) n = 1;
|
if (n == 0)
|
||||||
|
n = 1;
|
||||||
|
|
||||||
//first transition - save startidx
|
//first transition - save startidx
|
||||||
if (numBits == 0) {
|
if (numBits == 0) {
|
||||||
|
@ -1664,12 +1675,13 @@ size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t clk, uint8_t invert, u
|
||||||
|
|
||||||
//add to our destination the bits we collected
|
//add to our destination the bits we collected
|
||||||
memset(dest+numBits, dest[i-1] ^ invert , n);
|
memset(dest+numBits, dest[i-1] ^ invert , n);
|
||||||
//if (g_debugMode == 2) prnt("ICCE:: n %u | numbits %u", n, numBits);
|
|
||||||
numBits += n;
|
numBits += n;
|
||||||
n = 0;
|
n = 0;
|
||||||
lastval = dest[i];
|
lastval = dest[i];
|
||||||
|
|
||||||
}//end for
|
}//end for
|
||||||
|
|
||||||
// if valid extra bits at the end were all the same frequency - add them in
|
// if valid extra bits at the end were all the same frequency - add them in
|
||||||
if (n > clk/fchigh) {
|
if (n > clk/fchigh) {
|
||||||
if (dest[i-2] == 1) {
|
if (dest[i-2] == 1) {
|
||||||
|
@ -1696,14 +1708,15 @@ size_t fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8
|
||||||
// by marshmellow
|
// by marshmellow
|
||||||
// convert psk1 demod to psk2 demod
|
// convert psk1 demod to psk2 demod
|
||||||
// only transition waves are 1s
|
// only transition waves are 1s
|
||||||
|
//TODO: Iceman - hard coded value 7, should be #define
|
||||||
void psk1TOpsk2(uint8_t *bits, size_t size) {
|
void psk1TOpsk2(uint8_t *bits, size_t size) {
|
||||||
uint8_t lastBit = bits[0];
|
uint8_t lastbit = bits[0];
|
||||||
for (size_t i = 1; i < size; i++){
|
for (size_t i = 1; i < size; i++){
|
||||||
//ignore errors
|
//ignore errors
|
||||||
if (bits[i] == 7) continue;
|
if (bits[i] == 7) continue;
|
||||||
|
|
||||||
if (lastBit != bits[i]){
|
if (lastbit != bits[i]){
|
||||||
lastBit = bits[i];
|
lastbit = bits[i];
|
||||||
bits[i] = 1;
|
bits[i] = 1;
|
||||||
} else {
|
} else {
|
||||||
bits[i] = 0;
|
bits[i] = 0;
|
||||||
|
@ -1726,6 +1739,7 @@ void psk2TOpsk1(uint8_t *bits, size_t size) {
|
||||||
|
|
||||||
//by marshmellow - demodulate PSK1 wave
|
//by marshmellow - demodulate PSK1 wave
|
||||||
//uses wave lengths (# Samples)
|
//uses wave lengths (# Samples)
|
||||||
|
//TODO: Iceman - hard coded value 7, should be #define
|
||||||
int pskRawDemod_ext(uint8_t *dest, size_t *size, int *clock, int *invert, int *startIdx) {
|
int pskRawDemod_ext(uint8_t *dest, size_t *size, int *clock, int *invert, int *startIdx) {
|
||||||
|
|
||||||
// sanity check
|
// sanity check
|
||||||
|
@ -1763,7 +1777,7 @@ int pskRawDemod_ext(uint8_t *dest, size_t *size, int *clock, int *invert, int *s
|
||||||
//set start of wave as clock align
|
//set start of wave as clock align
|
||||||
lastClkBit = firstFullWave;
|
lastClkBit = firstFullWave;
|
||||||
if (g_debugMode==2) prnt("DEBUG PSK: firstFullWave: %u, waveLen: %u, startIdx %i",firstFullWave,fullWaveLen, *startIdx);
|
if (g_debugMode==2) prnt("DEBUG PSK: firstFullWave: %u, waveLen: %u, startIdx %i",firstFullWave,fullWaveLen, *startIdx);
|
||||||
if (g_debugMode==2) prnt("DEBUG PSK: clk: %d, lastClkBit: %u, fc: %u", *clock, lastClkBit,(unsigned int) fc);
|
if (g_debugMode == 2) prnt("DEBUG PSK: clk: %d, lastClkBit: %u, fc: %u", *clock, lastClkBit, fc);
|
||||||
waveStart = 0;
|
waveStart = 0;
|
||||||
dest[numBits++] = curPhase; //set first read bit
|
dest[numBits++] = curPhase; //set first read bit
|
||||||
for (i = firstFullWave + fullWaveLen - 1; i < *size-3; i++){
|
for (i = firstFullWave + fullWaveLen - 1; i < *size-3; i++){
|
||||||
|
@ -1809,8 +1823,8 @@ int pskRawDemod_ext(uint8_t *dest, size_t *size, int *clock, int *invert, int *s
|
||||||
}
|
}
|
||||||
|
|
||||||
int pskRawDemod(uint8_t *dest, size_t *size, int *clock, int *invert) {
|
int pskRawDemod(uint8_t *dest, size_t *size, int *clock, int *invert) {
|
||||||
int startIdx = 0;
|
int start_idx = 0;
|
||||||
return pskRawDemod_ext(dest, size, clock, invert, &startIdx);
|
return pskRawDemod_ext(dest, size, clock, invert, &start_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1833,38 +1847,38 @@ int detectAWID(uint8_t *dest, size_t *size, int *waveStartIdx) {
|
||||||
//did we get a good demod?
|
//did we get a good demod?
|
||||||
if (*size < 96) return -3;
|
if (*size < 96) return -3;
|
||||||
|
|
||||||
size_t startIdx = 0;
|
size_t start_idx = 0;
|
||||||
uint8_t preamble[] = {0,0,0,0,0,0,0,1};
|
uint8_t preamble[] = {0,0,0,0,0,0,0,1};
|
||||||
if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
|
if (!preambleSearch(dest, preamble, sizeof(preamble), size, &start_idx))
|
||||||
return -4; //preamble not found
|
return -4; //preamble not found
|
||||||
|
|
||||||
// wrong size? (between to preambles)
|
// wrong size? (between to preambles)
|
||||||
if (*size != 96) return -5;
|
if (*size != 96) return -5;
|
||||||
|
|
||||||
return (int)startIdx;
|
return (int)start_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
//by marshmellow
|
//by marshmellow
|
||||||
//takes 1s and 0s and searches for EM410x format - output EM ID
|
//takes 1s and 0s and searches for EM410x format - output EM ID
|
||||||
int Em410xDecode(uint8_t *bits, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo) {
|
int Em410xDecode(uint8_t *bits, size_t *size, size_t *start_idx, uint32_t *hi, uint64_t *lo) {
|
||||||
// sanity check
|
// sanity check
|
||||||
if (bits[1] > 1) return -1;
|
if (bits[1] > 1) return -1;
|
||||||
if (*size < 64) return -2;
|
if (*size < 64) return -2;
|
||||||
|
|
||||||
uint8_t fmtlen;
|
uint8_t fmtlen;
|
||||||
*startIdx = 0;
|
*start_idx = 0;
|
||||||
|
|
||||||
// preamble 0111111111
|
// preamble 0111111111
|
||||||
// include 0 in front to help get start pos
|
// include 0 in front to help get start pos
|
||||||
uint8_t preamble[] = {0,1,1,1,1,1,1,1,1,1};
|
uint8_t preamble[] = {0,1,1,1,1,1,1,1,1,1};
|
||||||
if (!preambleSearch(bits, preamble, sizeof(preamble), size, startIdx))
|
if (!preambleSearch(bits, preamble, sizeof(preamble), size, start_idx))
|
||||||
return -4;
|
return -4;
|
||||||
|
|
||||||
// (iceman) if the preamble doesn't find two occuriences, this identification fails.
|
// (iceman) if the preamble doesn't find two occuriences, this identification fails.
|
||||||
fmtlen = (*size == 128) ? 22 : 10;
|
fmtlen = (*size == 128) ? 22 : 10;
|
||||||
|
|
||||||
//skip last 4bit parity row for simplicity
|
//skip last 4bit parity row for simplicity
|
||||||
*size = removeParity(bits, *startIdx + sizeof(preamble), 5, 0, fmtlen * 5);
|
*size = removeParity(bits, *start_idx + sizeof(preamble), 5, 0, fmtlen * 5);
|
||||||
|
|
||||||
switch (*size) {
|
switch (*size) {
|
||||||
case 40: {
|
case 40: {
|
||||||
|
@ -1898,14 +1912,17 @@ int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32
|
||||||
if (*size < 96*2) return -3;
|
if (*size < 96*2) return -3;
|
||||||
|
|
||||||
// 00011101 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1
|
// 00011101 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1
|
||||||
size_t startIdx = 0;
|
size_t start_idx = 0;
|
||||||
uint8_t preamble[] = {0,0,0,1,1,1,0,1};
|
uint8_t preamble[] = {0,0,0,1,1,1,0,1};
|
||||||
if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
|
if (!preambleSearch(dest, preamble, sizeof(preamble), size, &start_idx))
|
||||||
return -4; //preamble not found
|
return -4; //preamble not found
|
||||||
|
|
||||||
size_t numStart = startIdx + sizeof(preamble);
|
// wrong size? (between to preambles)
|
||||||
|
//if (*size != 96) return -5;
|
||||||
|
|
||||||
|
size_t num_start = start_idx + sizeof(preamble);
|
||||||
// final loop, go over previously decoded FSK data and manchester decode into usable tag ID
|
// final loop, go over previously decoded FSK data and manchester decode into usable tag ID
|
||||||
for (size_t idx = numStart; (idx-numStart) < *size - sizeof(preamble); idx+=2){
|
for (size_t idx = num_start; (idx - num_start) < *size - sizeof(preamble); idx += 2) {
|
||||||
if (dest[idx] == dest[idx+1]){
|
if (dest[idx] == dest[idx+1]){
|
||||||
return -5; //not manchester data
|
return -5; //not manchester data
|
||||||
}
|
}
|
||||||
|
@ -1918,7 +1935,7 @@ int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32
|
||||||
else // 0 1
|
else // 0 1
|
||||||
*lo |= 0;
|
*lo |= 0;
|
||||||
}
|
}
|
||||||
return (int)startIdx;
|
return (int)start_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find IDTEC PSK1, RF Preamble == 0x4944544B, Demodsize 64bits
|
// Find IDTEC PSK1, RF Preamble == 0x4944544B, Demodsize 64bits
|
||||||
|
@ -1943,7 +1960,7 @@ int detectIOProx(uint8_t *dest, size_t *size, int *waveStartIdx) {
|
||||||
// FSK demodulator RF/64, fsk2a so invert, and fc/10/8
|
// FSK demodulator RF/64, fsk2a so invert, and fc/10/8
|
||||||
*size = fskdemod(dest, *size, 64, 1, 10, 8, waveStartIdx); //io fsk2a
|
*size = fskdemod(dest, *size, 64, 1, 10, 8, waveStartIdx); //io fsk2a
|
||||||
|
|
||||||
//did we get a good demod?
|
//did we get enough demod data?
|
||||||
if (*size < 64) return -3;
|
if (*size < 64) return -3;
|
||||||
|
|
||||||
//Index map
|
//Index map
|
||||||
|
@ -1955,18 +1972,23 @@ int detectIOProx(uint8_t *dest, size_t *size, int *waveStartIdx) {
|
||||||
//
|
//
|
||||||
//XSF(version)facility:codeone+codetwo
|
//XSF(version)facility:codeone+codetwo
|
||||||
|
|
||||||
size_t startIdx = 0;
|
size_t start_idx = 0;
|
||||||
uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,1};
|
uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,1};
|
||||||
if (! preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
|
if (!preambleSearch(dest, preamble, sizeof(preamble), size, &start_idx))
|
||||||
return -4; //preamble not found
|
return -4; //preamble not found
|
||||||
|
|
||||||
// wrong size? (between to preambles)
|
// wrong size? (between to preambles)
|
||||||
if (*size != 64) return -5;
|
if (*size != 64) return -5;
|
||||||
|
|
||||||
if (!dest[startIdx+8] && dest[startIdx+17]==1 && dest[startIdx+26]==1 && dest[startIdx+35]==1 && dest[startIdx+44]==1 && dest[startIdx+53]==1){
|
if ( !dest[start_idx + 8]
|
||||||
|
&& dest[start_idx + 17] == 1
|
||||||
|
&& dest[start_idx + 26] == 1
|
||||||
|
&& dest[start_idx + 35] == 1
|
||||||
|
&& dest[start_idx + 44] == 1
|
||||||
|
&& dest[start_idx + 53] == 1) {
|
||||||
//confirmed proper separator bits found
|
//confirmed proper separator bits found
|
||||||
//return start position
|
//return start position
|
||||||
return (int) startIdx;
|
return (int) start_idx;
|
||||||
}
|
}
|
||||||
return -6;
|
return -6;
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue