]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
removed redundant function to compose reader short frame
authorroel@libnfc.org <roel@libnfc.org@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Wed, 3 Apr 2013 08:45:04 +0000 (08:45 +0000)
committerroel@libnfc.org <roel@libnfc.org@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Wed, 3 Apr 2013 08:45:04 +0000 (08:45 +0000)
armsrc/hitag2.c
armsrc/iso14443a.c
armsrc/util.c
armsrc/util.h

index aa9ce237f8d0facb73b79137076a4e73f3515db4..1a0e9b56aa9d9b1a5fe8fefe2dd0b7a3cd31735f 100644 (file)
@@ -29,10 +29,6 @@ bool bAuthenticating;
 bool bPwd;
 bool bSuccessful;
 
-size_t nbytes(size_t nbits) {
-       return (nbits/8)+((nbits%8)>0);
-}
-
 int LogTraceHitag(const uint8_t * btBytes, int iBits, int iSamples, uint32_t dwParity, int bReader)
 {
   // Return when trace is full
index ca7c3ba4033e11acc0533a8a424760c6e398461c..5a01178d334aa78eadc9f3469b83722b0a93e7a6 100644 (file)
@@ -1262,68 +1262,9 @@ static void TransmitFor14443a(const uint8_t *cmd, int len, int *samples, int *wa
 }
 
 //-----------------------------------------------------------------------------
-// Code a 7-bit command without parity bit
-// This is especially for 0x26 and 0x52 (REQA and WUPA)
+// Prepare reader command (in bits, support short frames) to send to FPGA
 //-----------------------------------------------------------------------------
-void ShortFrameFromReader(const uint8_t bt)
-{
-       int j;
-       int last;
-  uint8_t b;
-
-       ToSendReset();
-
-       // Start of Communication (Seq. Z)
-       ToSend[++ToSendMax] = SEC_Z;
-       last = 0;
-
-       b = bt;
-       for(j = 0; j < 7; j++) {
-               if(b & 1) {
-                       // Sequence X
-                       ToSend[++ToSendMax] = SEC_X;
-                       last = 1;
-               } else {
-                       if(last == 0) {
-                               // Sequence Z
-                               ToSend[++ToSendMax] = SEC_Z;
-                       }
-                       else {
-                               // Sequence Y
-                               ToSend[++ToSendMax] = SEC_Y;
-                               last = 0;
-                       }
-               }
-               b >>= 1;
-       }
-
-       // End of Communication
-       if(last == 0) {
-               // Sequence Z
-               ToSend[++ToSendMax] = SEC_Z;
-       }
-       else {
-               // Sequence Y
-               ToSend[++ToSendMax] = SEC_Y;
-               last = 0;
-       }
-       // Sequence Y
-       ToSend[++ToSendMax] = SEC_Y;
-
-       // Just to be sure!
-       ToSend[++ToSendMax] = SEC_Y;
-       ToSend[++ToSendMax] = SEC_Y;
-       ToSend[++ToSendMax] = SEC_Y;
-
-    // Convert from last character reference to length
-    ToSendMax++;
-}
-
-//-----------------------------------------------------------------------------
-// Prepare reader command to send to FPGA
-//
-//-----------------------------------------------------------------------------
-void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
+void CodeIso14443aBitsAsReaderPar(const uint8_t * cmd, int bits, uint32_t dwParity)
 {
   int i, j;
   int last;
@@ -1335,12 +1276,14 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
   ToSend[++ToSendMax] = SEC_Z;
   last = 0;
 
+  size_t bytecount = nbytes(bits);
   // Generate send structure for the data bits
-  for (i = 0; i < len; i++) {
+  for (i = 0; i < bytecount; i++) {
     // Get the current byte to send
     b = cmd[i];
+    size_t bitsleft = MIN((bits-(i*8)),8);
 
-    for (j = 0; j < 8; j++) {
+    for (j = 0; j < bitsleft; j++) {
       if (b & 1) {
         // Sequence X
          ToSend[++ToSendMax] = SEC_X;
@@ -1358,19 +1301,22 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
       b >>= 1;
     }
 
-    // Get the parity bit
-    if ((dwParity >> i) & 0x01) {
-      // Sequence X
-       ToSend[++ToSendMax] = SEC_X;
-      last = 1;
-    } else {
-      if (last == 0) {
-        // Sequence Z
-         ToSend[++ToSendMax] = SEC_Z;
+    // Only transmit (last) parity bit if we transmitted a complete byte
+    if (j == 8) {
+      // Get the parity bit
+      if ((dwParity >> i) & 0x01) {
+        // Sequence X
+        ToSend[++ToSendMax] = SEC_X;
+        last = 1;
       } else {
-        // Sequence Y
-         ToSend[++ToSendMax] = SEC_Y;
-        last = 0;
+        if (last == 0) {
+          // Sequence Z
+          ToSend[++ToSendMax] = SEC_Z;
+        } else {
+          // Sequence Y
+          ToSend[++ToSendMax] = SEC_Y;
+          last = 0;
+        }
       }
     }
   }
@@ -1396,6 +1342,14 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
   ToSendMax++;
 }
 
+//-----------------------------------------------------------------------------
+// Prepare reader command to send to FPGA
+//-----------------------------------------------------------------------------
+void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
+{
+  CodeIso14443aBitsAsReaderPar(cmd,len*8,dwParity);
+}
+
 //-----------------------------------------------------------------------------
 // Wait for commands from reader
 // Stop when button is pressed (return 1) or field was gone (return 2)
@@ -1598,7 +1552,8 @@ void ReaderTransmitShort(const uint8_t* bt)
   int wait = 0;
   int samples = 0;
 
-  ShortFrameFromReader(*bt);
+//  ShortFrameFromReader(*bt);
+  CodeIso14443aBitsAsReaderPar(bt,7,0);
 
   // Select the card
   TransmitFor14443a(ToSend, ToSendMax, &samples, &wait);
index 3870a6c68f6a98fd1c1c08bfba760a8229fd033d..f2298290246b2174101f9175e3df4d58e768dd9f 100644 (file)
 #include "util.h"
 #include "string.h"
 
+size_t nbytes(size_t nbits) {
+       return (nbits/8)+((nbits%8)>0);
+}
+
 uint32_t SwapBits(uint32_t value, int nrbits) {
        int i;
        uint32_t newvalue = 0;
index d2a85ba0059786b8c1d272b77317097ac08329d9..ac141065f2782649dd49421dbc76037e3c067b38 100644 (file)
@@ -27,6 +27,7 @@
 #define BUTTON_DOUBLE_CLICK -2
 #define BUTTON_ERROR -99
 
+size_t nbytes(size_t nbits);
 uint32_t SwapBits(uint32_t value, int nrbits);
 void num_to_bytes(uint64_t n, size_t len, uint8_t* dest);
 uint64_t bytes_to_num(uint8_t* src, size_t len);
Impressum, Datenschutz