]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
CHG: minor code clean up in ArmSrc.
authoriceman1001 <iceman@iuse.se>
Wed, 7 Jan 2015 23:08:33 +0000 (00:08 +0100)
committericeman1001 <iceman@iuse.se>
Wed, 7 Jan 2015 23:08:33 +0000 (00:08 +0100)
ADD: added some more default keys in Hf mf nested,  maybe it runs faster :)

armsrc/appmain.c
armsrc/mifarecmd.c
armsrc/mifareutil.c
armsrc/util.c
armsrc/util.h
client/cmdhfmf.c

index d52ed94a3beab578483d68ebc2820799d182ecc4..ca16ee60f472da16b8ef45bb8752ea0db7040240 100644 (file)
@@ -667,9 +667,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
                        WriteTItag(c->arg[0],c->arg[1],c->arg[2]);
                        break;
                case CMD_SIMULATE_TAG_125K:
-                       LED_A_ON();
                        SimulateTagLowFrequency(c->arg[0], c->arg[1], 1);
-                       LED_A_OFF();
                        break;
                case CMD_LF_SIMULATE_BIDIR:
                        SimulateTagLowFrequencyBidir(c->arg[0], c->arg[1]);
index a52ee4c91cde0b5ae6c3c1c43e1e67bbaeb1056c..2619a9763c1fc8f95dea093580b61716ce5a4f3a 100644 (file)
@@ -15,6 +15,7 @@
 \r
 #include "mifarecmd.h"\r
 #include "apps.h"\r
+#include "util.h"\r
 \r
 //-----------------------------------------------------------------------------\r
 // Select, Authenticate, Read a MIFARE tag. \r
@@ -86,48 +87,40 @@ void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
 \r
 void MifareUReadBlock(uint8_t arg0,uint8_t *datain)\r
 {\r
-    // params\r
        uint8_t blockNo = arg0;\r
-       \r
-       // variables\r
-       byte_t isOK = 0;\r
-       byte_t dataoutbuf[16];\r
-       uint8_t uid[10];\r
+       byte_t dataout[16] = {0x00};\r
+       uint8_t uid[10] = {0x00};\r
        uint32_t cuid;\r
     \r
-       // clear trace\r
-       iso14a_clear_trace();\r
-       iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
-    \r
        LED_A_ON();\r
        LED_B_OFF();\r
        LED_C_OFF();\r
     \r
-       while (true) {\r
-               if(!iso14443a_select_card(uid, NULL, &cuid)) {\r
-            if (MF_DBGLEVEL >= 1)      Dbprintf("Can't select card");\r
-                       break;\r
+       iso14a_clear_trace();\r
+       iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
+    \r
+       int len = iso14443a_select_card(uid, NULL, &cuid);\r
+       if(!len) {\r
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("Can't select card");\r
+               OnError(1);\r
+               return;\r
                };\r
         \r
-               if(mifare_ultra_readblock(cuid, blockNo, dataoutbuf)) {\r
-            if (MF_DBGLEVEL >= 1)      Dbprintf("Read block error");\r
-                       break;\r
+       len = mifare_ultra_readblock(cuid, blockNo, dataout);\r
+       if(len) {\r
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("Read block error");\r
+               OnError(2);\r
+               return;\r
                };\r
         \r
-               if(mifare_ultra_halt(cuid)) {\r
-            if (MF_DBGLEVEL >= 1)      Dbprintf("Halt error");\r
-                       break;\r
+       len = mifare_ultra_halt(cuid);\r
+       if(len) {\r
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)        Dbprintf("Halt error");\r
+               OnError(3);\r
+               return;\r
                };\r
                \r
-               isOK = 1;\r
-               break;\r
-       }\r
-       \r
-       if (MF_DBGLEVEL >= 2)   DbpString("READ BLOCK FINISHED");\r
-    \r
-       LED_B_ON();\r
-    cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,16);\r
-       LED_B_OFF();\r
+    cmd_send(CMD_ACK,1,0,0,dataout,16);\r
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
        LEDsoff();\r
 }\r
@@ -200,57 +193,70 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
        LEDsoff();\r
 }\r
 \r
-\r
-void MifareUReadCard(uint8_t arg0, uint8_t *datain)\r
+void MifareUReadCard(uint8_t arg0, int arg1, uint8_t *datain)\r
 {\r
   // params\r
         uint8_t sectorNo = arg0;\r
-        \r
-        // variables\r
-        byte_t isOK = 0;\r
-        byte_t dataoutbuf[16 * 4];\r
-        uint8_t uid[10];\r
+       int Pages = arg1;\r
+       int count_Pages = 0;\r
+       byte_t dataout[176] = {0x00};;\r
+       uint8_t uid[10] = {0x00};\r
         uint32_t cuid;\r
 \r
-        // clear trace\r
-        iso14a_clear_trace();\r
-\r
-               iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
-\r
         LED_A_ON();\r
         LED_B_OFF();\r
         LED_C_OFF();\r
 \r
-        while (true) {\r
-                if(!iso14443a_select_card(uid, NULL, &cuid)) {\r
-                if (MF_DBGLEVEL >= 1)   Dbprintf("Can't select card");\r
-                        break;\r
-                };\r
-               for(int sec=0;sec<16;sec++){\r
-                    if(mifare_ultra_readblock(cuid, sectorNo * 4 + sec, dataoutbuf + 4 * sec)) {\r
-                    if (MF_DBGLEVEL >= 1)   Dbprintf("Read block %d error",sec);\r
-                        break;\r
-                    };\r
-                }\r
-                if(mifare_ultra_halt(cuid)) {\r
-                if (MF_DBGLEVEL >= 1)   Dbprintf("Halt error");\r
-                        break;\r
-                };\r
+       if (MF_DBGLEVEL >= MF_DBG_ALL) \r
+               Dbprintf("Pages %d",Pages);\r
+       \r
+       iso14a_clear_trace();\r
+       iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
 \r
-                isOK = 1;\r
-                break;\r
-        }\r
-        \r
-        if (MF_DBGLEVEL >= 2) DbpString("READ CARD FINISHED");\r
+       int len = iso14443a_select_card(uid, NULL, &cuid);\r
+       \r
+       if (!len) {\r
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("Can't select card");\r
+               OnError(1);\r
+               return;\r
+       }\r
+       \r
+       for (int i = 0; i < Pages; i++){\r
+       \r
+               len = mifare_ultra_readblock(cuid, sectorNo * 4 + i, dataout + 4 * i);\r
+               \r
+               if (len) {\r
+                       if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                               Dbprintf("Read block %d error",i);\r
+                       OnError(2);\r
+                       return;\r
+               } else {\r
+                       count_Pages++;\r
+               }\r
+       }\r
+               \r
+       len = mifare_ultra_halt(cuid);\r
+       if (len) {\r
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("Halt error");\r
+               OnError(3);\r
+               return;\r
+       }\r
+       \r
+       if (MF_DBGLEVEL >= MF_DBG_ALL) {\r
+               Dbprintf("Pages read %d", count_Pages);\r
+       }\r
 \r
-        LED_B_ON();\r
-               cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,64);\r
-        LED_B_OFF();\r
+       len = 16*4; //64 bytes\r
+       \r
+       // Read a UL-C\r
+       if (Pages == 44 && count_Pages > 16) \r
+               len = 176;\r
 \r
-        // Thats it...\r
+       cmd_send(CMD_ACK, 1, 0, 0, dataout, len);       \r
         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
         LEDsoff();\r
-\r
 }\r
 \r
 \r
@@ -330,19 +336,16 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
 {\r
         // params\r
         uint8_t blockNo = arg0;\r
-        byte_t blockdata[16];\r
+       byte_t blockdata[16] = {0x00};\r
 \r
-        memset(blockdata,'\0',16);\r
         memcpy(blockdata, datain,16);\r
         \r
         // variables\r
         byte_t isOK = 0;\r
-        uint8_t uid[10];\r
+       uint8_t uid[10] = {0x00};\r
         uint32_t cuid;\r
 \r
-        // clear trace\r
         iso14a_clear_trace();\r
-\r
                iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
 \r
         LED_A_ON();\r
@@ -371,33 +374,25 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
         \r
         if (MF_DBGLEVEL >= 2)   DbpString("WRITE BLOCK FINISHED");\r
 \r
-        LED_B_ON();\r
                cmd_send(CMD_ACK,isOK,0,0,0,0);\r
-        LED_B_OFF();\r
-\r
-\r
-        // Thats it...\r
         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
         LEDsoff();\r
-//  iso14a_set_tracing(TRUE);\r
 }\r
 \r
 void MifareUWriteBlock_Special(uint8_t arg0, uint8_t *datain)\r
 {\r
        // params\r
        uint8_t blockNo = arg0;\r
-       byte_t blockdata[4];\r
+       byte_t blockdata[4] = {0x00};\r
        \r
        memcpy(blockdata, datain,4);\r
 \r
        // variables\r
        byte_t isOK = 0;\r
-       uint8_t uid[10];\r
+       uint8_t uid[10] = {0x00};\r
        uint32_t cuid;\r
 \r
-       // clear trace\r
        iso14a_clear_trace();\r
-\r
        iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);\r
 \r
        LED_A_ON();\r
@@ -426,11 +421,7 @@ void MifareUWriteBlock_Special(uint8_t arg0, uint8_t *datain)
 \r
        if (MF_DBGLEVEL >= 2)   DbpString("WRITE BLOCK FINISHED");\r
 \r
-       LED_B_ON();\r
        cmd_send(CMD_ACK,isOK,0,0,0,0);\r
-       LED_B_OFF();\r
-\r
-       // Thats it...\r
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
        LEDsoff();\r
 }\r
index 680af0fed24c16472f0506b291d05e7d25a75854..976f6dca7651ca54436b45b6b8df11b2a5b01c42 100644 (file)
@@ -149,7 +149,7 @@ int mifare_sendcmd_shortex(struct Crypto1State *pcs, uint8_t crypted, uint8_t cm
        return len;\r
 }\r
 \r
-// mifare commands\r
+// mifare classic commands\r
 int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested) \r
 {\r
        return mifare_classic_authex(pcs, uid, blockNo, keyType, ui64Key, isNested, NULL, NULL);\r
@@ -280,10 +280,8 @@ int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blo
 
 int mifare_ultra_readblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData)
 {
-       // variables
        uint16_t len;
        uint8_t bt[2];
-       
        uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();\r
        uint8_t* receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;
        
@@ -291,18 +289,21 @@ int mifare_ultra_readblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData)
        // command MIFARE_CLASSIC_READBLOCK
        len = mifare_sendcmd_short(NULL, 1, 0x30, blockNo, receivedAnswer, receivedAnswerPar, NULL);
        if (len == 1) {
-               if (MF_DBGLEVEL >= 1)   Dbprintf("Cmd Error: %02x", receivedAnswer[0]);
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("Cmd Error: %02x", receivedAnswer[0]);
                return 1;
        }
        if (len != 18) {
-               if (MF_DBGLEVEL >= 1)   Dbprintf("Cmd Error: card timeout. len: %x", len);
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("Cmd Error: card timeout. len: %x", len);
                return 2;
        }
     
        memcpy(bt, receivedAnswer + 16, 2);
        AppendCrc14443a(receivedAnswer, 16);
        if (bt[0] != receivedAnswer[16] || bt[1] != receivedAnswer[17]) {
-               if (MF_DBGLEVEL >= 1)   Dbprintf("Cmd CRC response error.");
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("Cmd CRC response error.");
                return 3;
        }
        
@@ -360,10 +361,9 @@ int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t bl
 
 int mifare_ultra_writeblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData) 
 {
-    // variables
     uint16_t len;     
     uint8_t par[3] = {0};  // enough for 18 parity bits
-    uint8_t d_block[18];
+       uint8_t d_block[18] = {0x00};
     uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();\r
        uint8_t* receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;
         
@@ -371,49 +371,46 @@ int mifare_ultra_writeblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData)
     len = mifare_sendcmd_short(NULL, true, 0xA0, blockNo, receivedAnswer, receivedAnswerPar, NULL);
 
     if ((len != 1) || (receivedAnswer[0] != 0x0A)) {   //  0x0a - ACK
-        if (MF_DBGLEVEL >= 1)   Dbprintf("Cmd Addr Error: %02x", receivedAnswer[0]);  
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("Cmd Addr Error: %02x", receivedAnswer[0]);  
         return 1;
     }
 
-       memset(d_block,'\0',18);
        memcpy(d_block, blockData, 16);
     AppendCrc14443a(d_block, 16);
 
        ReaderTransmitPar(d_block, sizeof(d_block), par, NULL);
 
-    // Receive the response
     len = ReaderReceive(receivedAnswer, receivedAnswerPar);    
 
        if ((len != 1) || (receivedAnswer[0] != 0x0A)) {   //  0x0a - ACK
-        if (MF_DBGLEVEL >= 1)   Dbprintf("Cmd Data Error: %02x %d", receivedAnswer[0],len);
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("Cmd Data Error: %02x %d", receivedAnswer[0],len);
         return 2;
     }        
-
     return 0;
 } 
 
 int mifare_ultra_special_writeblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData)
 {
     uint16_t len;
-    uint8_t d_block[8];
+       uint8_t d_block[8] = {0x00};
     uint8_t *receivedAnswer = get_bigbufptr_recvrespbuf();\r
        uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;
 
     // command MIFARE_CLASSIC_WRITEBLOCK
-       memset(d_block,'\0',8);
        d_block[0]= blockNo;
        memcpy(d_block+1,blockData,4);
        AppendCrc14443a(d_block, 6);
 
-       //i know the data send here is correct
     len = mifare_sendcmd_short_special(NULL, 1, 0xA2, d_block, receivedAnswer, receivedAnswerPar, NULL);
 
     if (receivedAnswer[0] != 0x0A) {   //  0x0a - ACK
-        if (MF_DBGLEVEL >= 1)   Dbprintf("Cmd Send Error: %02x %d", receivedAnswer[0],len);
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("Cmd Send Error: %02x %d", receivedAnswer[0],len);
         return 1;
     }
-\r\r
-    return 0;
+\r    return 0;
 }
 
 int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid) 
@@ -424,7 +421,8 @@ int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid)
 \r
        len = mifare_sendcmd_short(pcs, pcs == NULL ? false:true, 0x50, 0x00, receivedAnswer, receivedAnswerPar, NULL);\r
        if (len != 0) {\r
-               if (MF_DBGLEVEL >= 1)   Dbprintf("halt error. response len: %x", len);  \r
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("halt error. response len: %x", len);  \r
                return 1;\r
        }\r
 \r
@@ -439,10 +437,10 @@ int mifare_ultra_halt(uint32_t uid)
     
        len = mifare_sendcmd_short(NULL, true, 0x50, 0x00, receivedAnswer, receivedAnswerPar, NULL);
        if (len != 0) {
-               if (MF_DBGLEVEL >= 1)   Dbprintf("halt error. response len: %x", len);
+               if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
+                       Dbprintf("halt error. response len: %x", len);
                return 1;
        }
-    
        return 0;
 }
 
index 5b68f5134cf16a1991aed51c463acb87b02994c8..674f1b91f5ef76d129fa3b200eeb0605ef49b364 100644 (file)
 #include "string.h"
 #include "apps.h"
 
+
+
+void print_result(char *name, uint8_t *buf, size_t len) {
+   uint8_t *p = buf;
+
+   if ( len % 16 == 0 ) {
+          for(; p-buf < len; p += 16)
+       Dbprintf("[%s:%d/%d] %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
+                               name,
+                               p-buf,
+                               len,
+                               p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]
+          );
+   }
+   else {
+   for(; p-buf < len; p += 8)
+       Dbprintf("[%s:%d/%d] %02x %02x %02x %02x %02x %02x %02x %02x", name, p-buf, len, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
+   }
+}
+
 size_t nbytes(size_t nbits) {
        return (nbits/8)+((nbits%8)>0);
 }
@@ -45,6 +65,26 @@ uint64_t bytes_to_num(uint8_t* src, size_t len)
        return num;
 }
 
+// RotateLeft - Ultralight, Desfire
+void rol(uint8_t *data, const size_t len){
+    uint8_t first = data[0];
+    for (size_t i = 0; i < len-1; i++) {
+        data[i] = data[i+1];
+    }
+    data[len-1] = first;
+}
+void lsl (uint8_t *data, size_t len) {
+    for (size_t n = 0; n < len - 1; n++) {
+        data[n] = (data[n] << 1) | (data[n+1] >> 7);
+    }
+    data[len - 1] <<= 1;
+}
+
+int32_t le24toh (uint8_t data[3])
+{
+    return (data[2] << 16) | (data[1] << 8) | data[0];
+}
+
 void LEDsoff()
 {
        LED_A_OFF();
index e8b9cdffbc8dd2ebf3a537ae9592a9207fba8ae0..d7eacd705ee75b7c311256c0abe94f41243cdfd3 100644 (file)
 #define BUTTON_DOUBLE_CLICK -2
 #define BUTTON_ERROR -99
 
+void print_result(char *name, uint8_t *buf, size_t len);
 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);
+void rol(uint8_t *data, const size_t len);
+void lsl (uint8_t *data, size_t len);
+int32_t le24toh (uint8_t data[3]);
 
 void SpinDelay(int ms);
 void SpinDelayUs(int us);
index 7ad6e0a1eee9e5cff32b1b76a7d86804d5b82a1e..66c0b25d1d97f3f1b32c870929e54feb779df4b8 100644 (file)
@@ -513,7 +513,6 @@ int CmdHF14AMfDump(const char *Cmd)
        }\r
        \r
        fclose(fin);\r
-       // Read access rights to sectors\r
 \r
        PrintAndLog("|-----------------------------------------|");\r
        PrintAndLog("|------ Reading sector access bits...-----|");\r
@@ -544,8 +543,6 @@ int CmdHF14AMfDump(const char *Cmd)
                }\r
        }\r
        \r
-       // Read blocks and print to file\r
-       \r
        PrintAndLog("|-----------------------------------------|");\r
        PrintAndLog("|----- Dumping all blocks to file... -----|");\r
        PrintAndLog("|-----------------------------------------|");\r
@@ -739,7 +736,7 @@ int CmdHF14AMfNested(const char *Cmd)
        uint8_t trgKeyType = 0;\r
        uint8_t SectorsCnt = 0;\r
        uint8_t key[6] = {0, 0, 0, 0, 0, 0};\r
-       uint8_t keyBlock[6*6];\r
+       uint8_t keyBlock[13*6];\r
        uint64_t key64 = 0;\r
        bool transferToEml = false;\r
        \r
@@ -856,6 +853,14 @@ int CmdHF14AMfNested(const char *Cmd)
                num_to_bytes(0xa0a1a2a3a4a5, 6, (uint8_t*)(keyBlock + 3 * 6));\r
                num_to_bytes(0xb0b1b2b3b4b5, 6, (uint8_t*)(keyBlock + 4 * 6));\r
                num_to_bytes(0xaabbccddeeff, 6, (uint8_t*)(keyBlock + 5 * 6));\r
+               num_to_bytes(0x4d3a99c351dd, 6, (uint8_t*)(keyBlock + 6 * 6));\r
+               num_to_bytes(0x1a982c7e459a, 6, (uint8_t*)(keyBlock + 7 * 6));\r
+               num_to_bytes(0xd3f7d3f7d3f7, 6, (uint8_t*)(keyBlock + 8 * 6));\r
+               num_to_bytes(0x714c5c886e97, 6, (uint8_t*)(keyBlock + 9 * 6));\r
+               num_to_bytes(0x587ee5f9350f, 6, (uint8_t*)(keyBlock + 10 * 6));\r
+               num_to_bytes(0xa0478cc39091, 6, (uint8_t*)(keyBlock + 11 * 6));\r
+               num_to_bytes(0x533cb6c723f6, 6, (uint8_t*)(keyBlock + 12 * 6));\r
+               num_to_bytes(0x8fd0a4f256e9, 6, (uint8_t*)(keyBlock + 13 * 6));\r
 \r
                PrintAndLog("Testing known keys. Sector count=%d", SectorsCnt);\r
                for (i = 0; i < SectorsCnt; i++) {\r
@@ -883,8 +888,7 @@ int CmdHF14AMfNested(const char *Cmd)
                                        if(mfnested(blockNo, keyType, key, FirstBlockOfSector(sectorNo), trgKeyType, keyBlock, calibrate)) {\r
                                                PrintAndLog("Nested error.\n");\r
                                                free(e_sector);\r
-                                               return 2;\r
-                                       }\r
+                                               return 2;                                       }\r
                                        else {\r
                                                calibrate = false;\r
                                        }\r
Impressum, Datenschutz