]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/iclass.c
ADD: the option to simulate tnp3xxx inthe command "hf mf sim"
[proxmark3-svn] / armsrc / iclass.c
index f71607d2bedee62fbcefc33fc9ccf5fc2fee84ec..91a802ca567a1293e9029368d65b4a8f9e45ad42 100644 (file)
@@ -47,6 +47,7 @@
 // different initial value (CRC_ICLASS)
 #include "../common/iso14443crc.h"
 #include "../common/iso15693tools.h"
 // different initial value (CRC_ICLASS)
 #include "../common/iso14443crc.h"
 #include "../common/iso15693tools.h"
+#include "iso15693tools.h"
 
 
 static int timeout = 4096;
 
 
 static int timeout = 4096;
@@ -227,7 +228,8 @@ static RAMFUNC int OutOfNDecoding(int bit)
 
                                                        // Calculate the parity bit for the client...
                                                        Uart.parityBits <<= 1;
 
                                                        // Calculate the parity bit for the client...
                                                        Uart.parityBits <<= 1;
-                                                       Uart.parityBits ^= OddByteParity[(Uart.shiftReg & 0xff)];
+                                                       //Uart.parityBits ^= OddByteParity[(Uart.shiftReg & 0xff)];
+                                                       Uart.parityBits ^= oddparity(Uart.shiftReg & 0xff);
 
                                                        Uart.bitCnt = 0;
                                                        Uart.shiftReg = 0;
 
                                                        Uart.bitCnt = 0;
                                                        Uart.shiftReg = 0;
@@ -250,7 +252,8 @@ static RAMFUNC int OutOfNDecoding(int bit)
 
                                        // Calculate the parity bit for the client...
                                        Uart.parityBits <<= 1;
 
                                        // Calculate the parity bit for the client...
                                        Uart.parityBits <<= 1;
-                                       Uart.parityBits ^= OddByteParity[(Uart.dropPosition & 0xff)];
+                                       //Uart.parityBits ^= OddByteParity[(Uart.dropPosition & 0xff)];
+                                       Uart.parityBits ^= oddparity((Uart.dropPosition & 0xff));
 
                                        Uart.bitCnt = 0;
                                        Uart.shiftReg = 0;
 
                                        Uart.bitCnt = 0;
                                        Uart.shiftReg = 0;
@@ -451,8 +454,7 @@ static RAMFUNC int ManchesterDecoding(int v)
        else {
                modulation = bit & Demod.syncBit;
                modulation |= ((bit << 1) ^ ((Demod.buffer & 0x08) >> 3)) & Demod.syncBit;
        else {
                modulation = bit & Demod.syncBit;
                modulation |= ((bit << 1) ^ ((Demod.buffer & 0x08) >> 3)) & Demod.syncBit;
-               //modulation = ((bit << 1) ^ ((Demod.buffer & 0x08) >> 3)) & Demod.syncBit;
-
+       
                Demod.samples += 4;
 
                if(Demod.posCount==0) {
                Demod.samples += 4;
 
                if(Demod.posCount==0) {
@@ -487,7 +489,8 @@ static RAMFUNC int ManchesterDecoding(int v)
                                        Demod.output[Demod.len] = 0x0f;
                                        Demod.len++;
                                        Demod.parityBits <<= 1;
                                        Demod.output[Demod.len] = 0x0f;
                                        Demod.len++;
                                        Demod.parityBits <<= 1;
-                                       Demod.parityBits ^= OddByteParity[0x0f];
+                                       //Demod.parityBits ^= OddByteParity[0x0f];
+                                       Demod.parityBits ^= oddparity(0x0f);
                                        Demod.state = DEMOD_UNSYNCD;
 //                                     error = 0x0f;
                                        return TRUE;
                                        Demod.state = DEMOD_UNSYNCD;
 //                                     error = 0x0f;
                                        return TRUE;
@@ -612,7 +615,8 @@ static RAMFUNC int ManchesterDecoding(int v)
 
                                // FOR ISO15639 PARITY NOT SEND OTA, JUST CALCULATE IT FOR THE CLIENT
                                Demod.parityBits <<= 1;
 
                                // FOR ISO15639 PARITY NOT SEND OTA, JUST CALCULATE IT FOR THE CLIENT
                                Demod.parityBits <<= 1;
-                               Demod.parityBits ^= OddByteParity[(Demod.shiftReg & 0xff)];
+                               //Demod.parityBits ^= OddByteParity[(Demod.shiftReg & 0xff)];
+                               Demod.parityBits ^= oddparity((Demod.shiftReg & 0xff));
 
                                Demod.bitCount = 0;
                                Demod.shiftReg = 0;
 
                                Demod.bitCount = 0;
                                Demod.shiftReg = 0;
@@ -869,10 +873,7 @@ static int GetIClassCommandFromReader(uint8_t *received, int *len, int maxLen)
         }
         if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
             uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
         }
         if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
             uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
-                       /*if(OutOfNDecoding((b & 0xf0) >> 4)) {
-                               *len = Uart.byteCnt;
-                               return TRUE;
-                       }*/
+
                        if(OutOfNDecoding(b & 0x0f)) {
                                *len = Uart.byteCnt;
                                return TRUE;
                        if(OutOfNDecoding(b & 0x0f)) {
                                *len = Uart.byteCnt;
                                return TRUE;
@@ -1394,7 +1395,6 @@ void ReaderTransmitIClass(uint8_t* frame, int len)
   int par = 0;
 
   // This is tied to other size changes
   int par = 0;
 
   // This is tied to other size changes
-  //   uint8_t* frame_addr = ((uint8_t*)BigBuf) + 2024;
   CodeIClassCommand(frame,len);
 
   // Select the card
   CodeIClassCommand(frame,len);
 
   // Select the card
@@ -1434,7 +1434,7 @@ static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *samples,
        for(;;) {
                WDT_HIT();
 
        for(;;) {
                WDT_HIT();
 
-               if(BUTTON_PRESS()) return FALSE;
+           if(BUTTON_PRESS()) return FALSE;
 
                if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
                        AT91C_BASE_SSC->SSC_THR = 0x00;  // To make use of exact timing of next command from reader!!
 
                if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
                        AT91C_BASE_SSC->SSC_THR = 0x00;  // To make use of exact timing of next command from reader!!
@@ -1445,10 +1445,7 @@ static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *samples,
                        b = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
                        skip = !skip;
                        if(skip) continue;
                        b = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
                        skip = !skip;
                        if(skip) continue;
-                       /*if(ManchesterDecoding((b>>4) & 0xf)) {
-                               *samples = ((c - 1) << 3) + 4;
-                               return TRUE;
-                       }*/
+               
                        if(ManchesterDecoding(b & 0x0f)) {
                                *samples = c << 3;
                                return  TRUE;
                        if(ManchesterDecoding(b & 0x0f)) {
                                *samples = c << 3;
                                return  TRUE;
@@ -1514,23 +1511,23 @@ void ReaderIClass(uint8_t arg0) {
     {
         WDT_HIT();
 
     {
         WDT_HIT();
 
-               // Send act_all
-               ReaderTransmitIClass(act_all, 1);
-               // Card present?
-               if(ReaderReceiveIClass(resp)) {
+        // Send act_all
+        ReaderTransmitIClass(act_all, 1);
+        // Card present?
+        if(ReaderReceiveIClass(resp)) {
 
 
-                       ReaderTransmitIClass(identify, 1);
+            ReaderTransmitIClass(identify, 1);
 
 
-                       if(ReaderReceiveIClass(resp) == 10) {
+            if(ReaderReceiveIClass(resp) == 10) {
                 //Copy the Anti-collision CSN to our select-packet
                 //Copy the Anti-collision CSN to our select-packet
-                               memcpy(&select[1],resp,8);
+                memcpy(&select[1],resp,8);
                 //Dbprintf("Anti-collision CSN: %02x %02x %02x %02x %02x %02x %02x %02x",resp[0], resp[1], resp[2],
                 //        resp[3], resp[4], resp[5],
                 //        resp[6], resp[7]);
                 //Select the card
                 //Dbprintf("Anti-collision CSN: %02x %02x %02x %02x %02x %02x %02x %02x",resp[0], resp[1], resp[2],
                 //        resp[3], resp[4], resp[5],
                 //        resp[6], resp[7]);
                 //Select the card
-                               ReaderTransmitIClass(select, sizeof(select));
+                ReaderTransmitIClass(select, sizeof(select));
 
 
-                               if(ReaderReceiveIClass(resp) == 10) {
+                if(ReaderReceiveIClass(resp) == 10) {
                     //Save CSN in response data
                     memcpy(card_data,resp,8);
                     datasize += 8;
                     //Save CSN in response data
                     memcpy(card_data,resp,8);
                     datasize += 8;
@@ -1569,7 +1566,7 @@ void ReaderIClass(uint8_t arg0) {
             break;
         }
     }
             break;
         }
     }
-       LED_A_OFF();
+    LED_A_OFF();
 }
 
 void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
 }
 
 void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
@@ -1580,7 +1577,7 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
        uint8_t check[]       = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        uint8_t read[]        = { 0x0c, 0x00, 0x00, 0x00 };
        
        uint8_t check[]       = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        uint8_t read[]        = { 0x0c, 0x00, 0x00, 0x00 };
        
-        uint16_t crc = 0;
+    uint16_t crc = 0;
        uint8_t cardsize=0;
        bool read_success=false;
        uint8_t mem=0;
        uint8_t cardsize=0;
        bool read_success=false;
        uint8_t mem=0;
@@ -1814,7 +1811,7 @@ void IClass_iso14443A_write(uint8_t arg0, uint8_t blockNo, uint8_t *data, uint8_
                                memcpy(write+10,mac,4);
                                while(!send_success){
                                  ReaderTransmitIClass(write, sizeof(write));
                                memcpy(write+10,mac,4);
                                while(!send_success){
                                  ReaderTransmitIClass(write, sizeof(write));
-                                     if(ReaderReceiveIClass(resp) == 10) {
+                                 if(ReaderReceiveIClass(resp) == 10) {
                                    write_success=true;
                                }
                        }//
                                    write_success=true;
                                }
                        }//
Impressum, Datenschutz