]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/iso14443a.c
added initial test to emulate memory of mf ul tag
[proxmark3-svn] / armsrc / iso14443a.c
index 7c1db14ba842a3067f808fd09a0fffa71898d455..ca7c3ba4033e11acc0533a8a424760c6e398461c 100644 (file)
@@ -898,13 +898,21 @@ static int GetIso14443aCommandFromReader(uint8_t *received, int *len, int maxLen
         }
     }
 }
+
 static int EmSendCmd14443aRaw(uint8_t *resp, int respLen, int correctionNeeded);
+int EmSend4bitEx(uint8_t resp, int correctionNeeded);
+int EmSend4bit(uint8_t resp);
+int EmSendCmdExPar(uint8_t *resp, int respLen, int correctionNeeded, uint32_t par);
+int EmSendCmdExPar(uint8_t *resp, int respLen, int correctionNeeded, uint32_t par);
+int EmSendCmdEx(uint8_t *resp, int respLen, int correctionNeeded);
+int EmSendCmd(uint8_t *resp, int respLen);
+int EmSendCmdPar(uint8_t *resp, int respLen, uint32_t par);
 
 //-----------------------------------------------------------------------------
 // Main loop of simulated tag: receive commands from reader, decide what
 // response to send, and send it.
 //-----------------------------------------------------------------------------
-void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd)
+void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd, byte_t* data)
 {
   // Enable and clear the trace
        tracing = TRUE;
@@ -1024,7 +1032,7 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd)
 
        // Response to a read request - not implemented atm
        uint8_t *resp4 = (((uint8_t *)BigBuf) + FREE_BUFFER_OFFSET + (166*4));
-       int resp4Len;
+//     int resp4Len;
 
        // Authenticate response - nonce
        uint8_t *resp5 = (((uint8_t *)BigBuf) + FREE_BUFFER_OFFSET + (166*5));
@@ -1048,7 +1056,7 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd)
        int cmdsRecvd = 0;
        uint8_t* respdata = NULL;
        int respsize = 0;
-       uint8_t nack = 0x04;
+//     uint8_t nack = 0x04;
 
        memset(receivedCmd, 0x44, RECV_CMD_SIZE);
 
@@ -1077,7 +1085,7 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd)
 
        // Strange answer is an example of rare message size (3 bits)
        CodeStrangeAnswerAsTag();
-       memcpy(resp4, ToSend, ToSendMax); resp4Len = ToSendMax;
+       memcpy(resp4, ToSend, ToSendMax);// resp4Len = ToSendMax;
 
        // Authentication answer (random nonce)
        CodeIso14443aAsTag(response5, sizeof(response5));
@@ -1100,6 +1108,11 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd)
                        DbpString("button press");
                        break;
                }
+    
+    if (tracing) {
+                       LogTrace(receivedCmd,len, 0, Uart.parityBits, TRUE);
+    }
+    
                // doob - added loads of debug strings so we can see what the reader is saying to us during the sim as hi14alist is not populated
                // Okay, look at the command now.
                lastorder = order;
@@ -1128,12 +1141,15 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd)
                        respdata = response3a;
                        respsize = sizeof(response3a);
                } else if(receivedCmd[0] == 0x30) {     // Received a (plain) READ
-                       resp = resp4; respLen = resp4Len; order = 4; // Do nothing
+//                     resp = resp4; respLen = resp4Len; order = 4; // Do nothing
+//                     respdata = &nack;
+//                     respsize = sizeof(nack); // 4-bit answer
+      EmSendCmdEx(data+(4*receivedCmd[0]),16,false);
                        Dbprintf("Read request from reader: %x %x",receivedCmd[0],receivedCmd[1]);
-                       respdata = &nack;
-                       respsize = sizeof(nack); // 4-bit answer
+      // We already responded, do not send anything with the EmSendCmd14443aRaw() that is called below
+      respLen = 0;
                } else if(receivedCmd[0] == 0x50) {     // Received a HALT
-                       DbpString("Reader requested we HALT!:");
+//                     DbpString("Reader requested we HALT!:");
                        // Do not respond
                        resp = resp1; respLen = 0; order = 0;
                        respdata = NULL;
@@ -1147,16 +1163,19 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd)
                        respdata = response6;
                        respsize = sizeof(response6);
                } else {
-                       // Never seen this command before
-                       Dbprintf("Received (len=%d): %02x %02x %02x %02x %02x %02x %02x %02x %02x",
-                       len,
-                       receivedCmd[0], receivedCmd[1], receivedCmd[2],
-                       receivedCmd[3], receivedCmd[4], receivedCmd[5],
-                       receivedCmd[6], receivedCmd[7], receivedCmd[8]);
-                       // Do not respond
-                       resp = resp1; respLen = 0; order = 0;
-                       respdata = NULL;
-                       respsize = 0;
+      if (order == 7 && len ==8) {
+        uint32_t nr = bytes_to_num(receivedCmd,4);
+        uint32_t ar = bytes_to_num(receivedCmd+4,4);
+        Dbprintf("Auth attempt {nr}{ar}: %08x %08x",nr,ar);
+      } else {
+        // Never seen this command before
+        Dbprintf("Received unknown command (len=%d):",len);
+        Dbhexdump(len,receivedCmd,false);
+      }
+      // Do not respond
+      resp = resp1; respLen = 0; order = 0;
+      respdata = NULL;
+      respsize = 0;
                }
 
                // Count number of wakeups received after a halt
@@ -1183,7 +1202,6 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd)
                }
                
                if (tracing) {
-                       LogTrace(receivedCmd,len, 0, Uart.parityBits, TRUE);
                        if (respdata != NULL) {
                                LogTrace(respdata,respsize, 0, SwapBits(GetParity(respdata,respsize),respsize), FALSE);
                        }
@@ -1725,12 +1743,12 @@ int iso14443a_select_card(byte_t* uid_ptr, iso14a_card_select_t* p_hi14a_card, u
   }
 
        // Request for answer to select
-       if(p_hi14a_card) {  // JCOP cards - if reader sent RATS then there is no MIFARE session at all!!!
-               AppendCrc14443a(rats, 2);
-               ReaderTransmit(rats, sizeof(rats));
-               
-               if (!(len = ReaderReceive(resp))) return 0;
-               
+  AppendCrc14443a(rats, 2);
+  ReaderTransmit(rats, sizeof(rats));
+  
+  if (!(len = ReaderReceive(resp))) return 0;
+
+  if(p_hi14a_card) {
                memcpy(p_hi14a_card->ats, resp, sizeof(p_hi14a_card->ats));
                p_hi14a_card->ats_len = len;
        }
Impressum, Datenschutz