]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - common/lfdemod.c
CHG: Updated the README.md
[proxmark3-svn] / common / lfdemod.c
index 1c05920d66227b903433f22ba445ec682815ba62..862d05ba5addd355f744c908a10f13b1857685b0 100644 (file)
@@ -68,7 +68,7 @@ uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType)
 
 //by marshmellow
 // takes a array of binary values, start position, length of bits per parity (includes parity bit),
-//   Parity Type (1 for odd; 0 for even; 2 Always 1's), and binary Length (length to run) 
+//   Parity Type (1 for odd; 0 for even; 2 for Always 1's; 3 for Always 0's), and binary Length (length to run) 
 size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen)
 {
        uint32_t parityWd = 0;
@@ -80,10 +80,11 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p
                }
                j--; // overwrite parity with next data
                // if parity fails then return 0
-               if (pType == 2) { // then marker bit which should be a 1
-                       if (!BitStream[j]) return 0;
-               } else {
-                       if (parityTest(parityWd, pLen, pType) == 0) return 0;                   
+               switch (pType) {
+                       case 3: if (BitStream[j]==1) return 0; break; //should be 0 spacer bit
+                       case 2: if (BitStream[j]==0) return 0; break; //should be 1 spacer bit
+                       default: //test parity
+                               if (parityTest(parityWd, pLen, pType) == 0) return 0; break;
                }
                bitCnt+=(pLen-1);
                parityWd = 0;
@@ -95,7 +96,8 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p
 
 // by marshmellow
 // takes a array of binary values, length of bits per parity (includes parity bit),
-//   Parity Type (1 for odd; 0 for even; 2 Always 1's), and binary Length (length to run)
+//   Parity Type (1 for odd; 0 for even; 2 Always 1's; 3 Always 0's), and binary Length (length to run)
+//   Make sure *dest is long enough to store original sourceLen + #_of_parities_to_be_added
 size_t addParity(uint8_t *BitSource, uint8_t *dest, uint8_t sourceLen, uint8_t pLen, uint8_t pType)
 {
        uint32_t parityWd = 0;
@@ -105,11 +107,14 @@ size_t addParity(uint8_t *BitSource, uint8_t *dest, uint8_t sourceLen, uint8_t p
                        parityWd = (parityWd << 1) | BitSource[word+bit];
                        dest[j++] = (BitSource[word+bit]);
                }
+               
                // if parity fails then return 0
-               if (pType == 2) { // then marker bit which should be a 1
-                       dest[j++]=1;
-               } else {
-                       dest[j++] = parityTest(parityWd, pLen-1, pType) ^ 1;
+               switch (pType) {
+                       case 3: dest[j++]=0; break; // marker bit which should be a 0
+                       case 2: dest[j++]=1; break; // marker bit which should be a 1
+                       default: 
+                               dest[j++] = parityTest(parityWd, pLen-1, pType) ^ 1;
+                               break;
                }
                bitCnt += pLen;
                parityWd = 0;
@@ -122,8 +127,7 @@ size_t addParity(uint8_t *BitSource, uint8_t *dest, uint8_t sourceLen, uint8_t p
 uint32_t bytebits_to_byte(uint8_t *src, size_t numbits)
 {
        uint32_t num = 0;
-       for(int i = 0 ; i < numbits ; i++)
-       {
+       for(int i = 0 ; i < numbits ; i++) {
                num = (num << 1) | (*src);
                src++;
        }
Impressum, Datenschutz