X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/bde10a5057cb280e5f08365502ec4a3f79301863..c1e745e465bea208fc888371ae20bde247dc3e16:/armsrc/hitag2.c

diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c
index 59f29eae..a2c1d823 100644
--- a/armsrc/hitag2.c
+++ b/armsrc/hitag2.c
@@ -27,6 +27,7 @@ static bool bQuiet;
 bool bCrypto;
 bool bAuthenticating;
 bool bPwd;
+bool bSuccessful;
 
 struct hitag2_tag {
 	uint32_t uid;
@@ -477,16 +478,26 @@ bool hitag2_password(byte_t* rx, const size_t rxlen, byte_t* tx, size_t* txlen)
 				*txlen = 32;
 				memcpy(tx,password,4);
 				bPwd = true;
-			} else {
-        if (blocknr > 7) {
-          DbpString("Read succesful!");
-          // We are done... for now
-          return false;
-        }
-        *txlen = 10;
-        tx[0] = 0xc0 | (blocknr << 3) | ((blocknr^7) >> 2);
-        tx[1] = ((blocknr^7) << 6);
+        memcpy(tag.sectors[blocknr],rx,4);
         blocknr++;
+			} else {
+				
+			if(blocknr == 1){
+				//store password in block1, the TAG answers with Block3, but we need the password in memory
+				memcpy(tag.sectors[blocknr],tx,4);
+			}else{
+				memcpy(tag.sectors[blocknr],rx,4);
+			}
+			
+			blocknr++;
+			if (blocknr > 7) {
+			  DbpString("Read succesful!");
+        bSuccessful = true;
+			  return false;
+			}
+			*txlen = 10;
+			tx[0] = 0xc0 | (blocknr << 3) | ((blocknr^7) >> 2);
+			tx[1] = ((blocknr^7) << 6);
 			}
 		} break;
 			
@@ -513,11 +524,32 @@ bool hitag2_crypto(byte_t* rx, const size_t rxlen, byte_t* tx, size_t* txlen) {
 		case 0: {
 			// Stop if there is no answer while we are in crypto mode (after sending NrAr)
 			if (bCrypto) {
-				DbpString("Authentication failed!");
-				return false;
-			}
-			*txlen = 5;
-			memcpy(tx,"\xc0",nbytes(*txlen));
+        // Failed during authentication
+        if (bAuthenticating) {
+          DbpString("Authentication failed!");
+          return false;
+        } else {
+          // Failed reading a block, could be (read/write) locked, skip block and re-authenticate
+          if (blocknr == 1) {
+            // Write the low part of the key in memory
+            memcpy(tag.sectors[1],key+2,4);
+          } else if (blocknr == 2) {
+            // Write the high part of the key in memory
+            tag.sectors[2][0] = 0x00;
+            tag.sectors[2][1] = 0x00;
+            tag.sectors[2][2] = key[0];
+            tag.sectors[2][3] = key[1];
+          } else {
+            // Just put zero's in the memory (of the unreadable block)
+            memset(tag.sectors[blocknr],0x00,4);
+          }
+          blocknr++;
+          bCrypto = false;
+        }
+			} else {
+        *txlen = 5;
+        memcpy(tx,"\xc0",nbytes(*txlen));
+      }
 		} break;
 			
       // Received UID, crypto tag answer
@@ -543,7 +575,7 @@ bool hitag2_crypto(byte_t* rx, const size_t rxlen, byte_t* tx, size_t* txlen) {
         }
         if (blocknr > 7) {
           DbpString("Read succesful!");
-          // We are done... for now
+          bSuccessful = true;
           return false;
         }
         *txlen = 10;
@@ -1064,7 +1096,10 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
 	int t_wait = HITAG_T_WAIT_MAX;
 	bool bStop;
 	bool bQuitTraceFull = false;
-	
+  
+  // Reset the return status
+  bSuccessful = false;
+  
 	// Clean up trace and prepare it for storing frames
   iso14a_set_tracing(TRUE);
   iso14a_clear_trace();
@@ -1162,26 +1197,26 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
 	lastbit = 1;
 	bStop = false;
 
-	// Tag specific configuration settings (sof, timings, etc.)
-	if (htf < 10){
-		// hitagS settings
-		reset_sof = 1;
-		t_wait = 200;
-		DbpString("Configured for hitagS reader");
-	} else if (htf < 20) {
-		// hitag1 settings
-		reset_sof = 1;
-		t_wait = 200;
-		DbpString("Configured for hitag1 reader");
-	} else if (htf < 30) {
-		// hitag2 settings
-		reset_sof = 4;
-		t_wait = HITAG_T_WAIT_2;
-		DbpString("Configured for hitag2 reader");
+  // Tag specific configuration settings (sof, timings, etc.)
+  if (htf < 10){
+    // hitagS settings
+    reset_sof = 1;
+    t_wait = 200;
+    DbpString("Configured for hitagS reader");
+  } else if (htf < 20) {
+    // hitag1 settings
+    reset_sof = 1;
+    t_wait = 200;
+    DbpString("Configured for hitag1 reader");
+  } else if (htf < 30) {
+    // hitag2 settings
+    reset_sof = 4;
+    t_wait = HITAG_T_WAIT_2;
+    DbpString("Configured for hitag2 reader");
 	} else {
-        Dbprintf("Error, unknown hitag reader type: %d",htf);
-        return;
-    }
+    Dbprintf("Error, unknown hitag reader type: %d",htf);
+    return;
+  }
 		
 	while(!bStop && !BUTTON_PRESS()) {
 		// Watchdog hit
@@ -1326,7 +1361,7 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
 	AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
 	AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-	
-//	Dbprintf("frame received: %d",frame_count);
-//	DbpString("All done");
+	Dbprintf("frame received: %d",frame_count);
+  DbpString("All done");
+  cmd_send(CMD_ACK,bSuccessful,0,0,(byte_t*)tag.sectors,48);
 }