]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge branch 'topaz'
authorpwpiwi <pwpiwi@users.noreply.github.com>
Tue, 3 Nov 2015 20:06:59 +0000 (21:06 +0100)
committerpwpiwi <pwpiwi@users.noreply.github.com>
Tue, 3 Nov 2015 20:06:59 +0000 (21:06 +0100)
Conflicts:
CHANGELOG.md
client/cmdhf.c

1  2 
CHANGELOG.md
client/cmdhf.c
common/protocols.h

diff --combined CHANGELOG.md
index 6eb9a4006a674a1ff018a077b7e4533cf9026e13,33824bbb32a0969602c3e2e01af386c53c179f3b..80c16ffaba1a703771faeeec6da6fa9e71901092
@@@ -5,22 -5,16 +5,24 @@@ This project uses the changelog in acco
  ## [unreleased][unreleased]
  
  ### Added
 +- `hf iclass managekeys` to save, load and manage iclass keys.  (adjusted most commands to accept a loaded key in memory) (marshmellow)
 +- `hf iclass readblk` to select, authenticate, and read 1 block from an iclass card (marshmellow)
 +- `hf iclass writeblk` to select, authenticate, and write 1 block to an iclass card (or picopass) (marshmellow + others)
 +- `hf iclass clone` to take a saved dump file and clone selected blocks to a new tag (marshmellow + others)
 +- `hf iclass calcnewkey` - to calculate the div_key change to change a key - (experimental) (marshmellow + others)
 +- `hf iclass encryptblk` - to encrypt a data block hex to prep for writing that block (marshmellow)
  - ISO14443a stand-alone operation with ARM CFLAG="WITH_ISO14443a_StandAlone". This code can read & emulate two banks of 14a tag UIDs and write to "magic" cards  (Craig Young) 
  - AWID26 command context added as 'lf awid' containing realtime demodulation as well as cloning/simulation based on tag numbers (Craig Young)
  - Added 'hw status'. This command makes the ARM print out some runtime information. (holiman) 
  - Added 'hw ping'. This command just sends a usb packets and checks if the pm3 is responsive. Can be used to abort certain operations which supports abort over usb. (holiman)
  - Added `data hex2bin` and `data bin2hex` for command line conversion between binary and hexadecimal (holiman)
 +- Added 'hf snoop'. This command take digitalized signal from FPGA and put in BigBuffer. (pwpiwi + enio)
+ - Added Topaz (NFC type 1) protocol support ('hf topaz reader', 'hf list topaz', 'hf 14a raw -T', 'hf topaz snoop'). (piwi)
+ - Added option c to 'hf list' (mark CRC bytes) (piwi)
  
 -
  ### Changed
 +- changed `lf config t <threshold>` to be 0 - 128 and will trigger on + or - threshold value (marshmellow) 
 +- `hf iclass dump` cli options - can now dump AA1 and AA2 with different keys in one run (does not go to muliple pages for the larger tags yet)
  - Revised workflow for StandAloneMode14a (Craig Young)
  - EPA functions (`hf epa`) now support both ISO 14443-A and 14443-B cards (frederikmoellers)
  - 'hw version' only talks to ARM at startup, after that the info is cached. (pwpiwi)
diff --combined client/cmdhf.c
index b1e670059a849d0758c79a350b36a8a5a95dd361,caae08e5dba137c1c96529e3a0fbd6e86fa60b19..e3671a4267fa1c7cb0a2710d48ddc960f7f0badf
@@@ -23,6 -23,7 +23,7 @@@
  #include "cmdhficlass.h"
  #include "cmdhfmf.h"
  #include "cmdhfmfu.h"
+ #include "cmdhftopaz.h"
  #include "protocols.h"
  
  static int CmdHelp(const char *Cmd);
@@@ -187,6 -188,26 +188,26 @@@ void annotateIso15693(char *exp, size_
        }
  }
  
+ void annotateTopaz(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
+ {
+       switch(cmd[0]) {
+               case TOPAZ_REQA                                         :snprintf(exp, size, "REQA");break;
+               case TOPAZ_WUPA                                         :snprintf(exp, size, "WUPA");break;
+               case TOPAZ_RID                                          :snprintf(exp, size, "RID");break;
+               case TOPAZ_RALL                                         :snprintf(exp, size, "RALL");break;
+               case TOPAZ_READ                                         :snprintf(exp, size, "READ");break;
+               case TOPAZ_WRITE_E                                      :snprintf(exp, size, "WRITE-E");break;
+               case TOPAZ_WRITE_NE                                     :snprintf(exp, size, "WRITE-NE");break;
+               case TOPAZ_RSEG                                         :snprintf(exp, size, "RSEG");break;
+               case TOPAZ_READ8                                        :snprintf(exp, size, "READ8");break;
+               case TOPAZ_WRITE_E8                                     :snprintf(exp, size, "WRITE-E8");break;
+               case TOPAZ_WRITE_NE8                            :snprintf(exp, size, "WRITE-NE8");break;
+               default:                            snprintf(exp,size,"?"); break;
+       }
+ }
  /**
  06 00 = INITIATE
  0E xx = SELECT ID (xx = Chip-ID)
@@@ -218,7 -239,34 +239,34 @@@ void annotateIso14443b(char *exp, size_
  }
  
  /**
-  * @brief iso14443B_CRC_Ok Checks CRC in command or response
+  * @brief iso14443A_CRC_check Checks CRC in command or response
+  * @param isResponse
+  * @param data
+  * @param len
+  * @return  0 : CRC-command, CRC not ok
+  *          1 : CRC-command, CRC ok
+  *          2 : Not crc-command
+  */
+ uint8_t iso14443A_CRC_check(bool isResponse, uint8_t* data, uint8_t len)
+ {
+       uint8_t b1,b2;
+       if(len <= 2) return 2;
+       if(isResponse & (len < 6)) return 2;
+       
+       ComputeCrc14443(CRC_14443_A, data, len-2, &b1, &b2);
+       if (b1 != data[len-2] || b2 != data[len-1]) {
+               return 0;
+       } else {
+               return 1;
+       }
+ }
+ /**
+  * @brief iso14443B_CRC_check Checks CRC in command or response
   * @param isResponse
   * @param data
   * @param len
@@@ -235,9 -283,10 +283,10 @@@ uint8_t iso14443B_CRC_check(bool isResp
  
        ComputeCrc14443(CRC_14443_B, data, len-2, &b1, &b2);
        if(b1 != data[len-2] || b2 != data[len-1]) {
-         return 0;
+               return 0;
+       } else {
+               return 1;
        }
-       return 1;
  }
  
  /**
@@@ -301,11 -350,66 +350,66 @@@ uint8_t iclass_CRC_check(bool isRespons
        }
  }
  
- uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, uint8_t protocol, bool showWaitCycles)
+ bool is_last_record(uint16_t tracepos, uint8_t *trace, uint16_t traceLen)
  {
-       bool isResponse;
-       uint16_t duration, data_len, parity_len;
+       return(tracepos + sizeof(uint32_t) + sizeof(uint16_t) + sizeof(uint16_t) >= traceLen);
+ }
+ bool next_record_is_response(uint16_t tracepos, uint8_t *trace)
+ {
+       uint16_t next_records_datalen = *((uint16_t *)(trace + tracepos + sizeof(uint32_t) + sizeof(uint16_t)));
+       
+       return(next_records_datalen & 0x8000);
+ }
+ bool merge_topaz_reader_frames(uint32_t timestamp, uint32_t *duration, uint16_t *tracepos, uint16_t traceLen, uint8_t *trace, uint8_t *frame, uint8_t *topaz_reader_command, uint16_t *data_len)
+ {
+ #define MAX_TOPAZ_READER_CMD_LEN      16
+       uint32_t last_timestamp = timestamp + *duration;
+       if ((*data_len != 1) || (frame[0] == TOPAZ_WUPA) || (frame[0] == TOPAZ_REQA)) return false;
  
+       memcpy(topaz_reader_command, frame, *data_len);
+       while (!is_last_record(*tracepos, trace, traceLen) && !next_record_is_response(*tracepos, trace)) {
+               uint32_t next_timestamp = *((uint32_t *)(trace + *tracepos));
+               *tracepos += sizeof(uint32_t);
+               uint16_t next_duration = *((uint16_t *)(trace + *tracepos));
+               *tracepos += sizeof(uint16_t);
+               uint16_t next_data_len = *((uint16_t *)(trace + *tracepos)) & 0x7FFF;
+               *tracepos += sizeof(uint16_t);
+               uint8_t *next_frame = (trace + *tracepos);
+               *tracepos += next_data_len;
+               if ((next_data_len == 1) && (*data_len + next_data_len <= MAX_TOPAZ_READER_CMD_LEN)) {
+                       memcpy(topaz_reader_command + *data_len, next_frame, next_data_len);
+                       *data_len += next_data_len;
+                       last_timestamp = next_timestamp + next_duration;
+               } else {
+                       // rewind and exit
+                       *tracepos = *tracepos - next_data_len - sizeof(uint16_t) - sizeof(uint16_t) - sizeof(uint32_t);
+                       break;
+               }
+               uint16_t next_parity_len = (next_data_len-1)/8 + 1;
+               *tracepos += next_parity_len;
+       }
+       *duration = last_timestamp - timestamp;
+       
+       return true;
+ }
+ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, uint8_t protocol, bool showWaitCycles, bool markCRCBytes)
+ {
+       bool isResponse;
+       uint16_t data_len, parity_len;
+       uint32_t duration;
+       uint8_t topaz_reader_command[9];
        uint32_t timestamp, first_timestamp, EndOfTransmissionTimestamp;
        char explanation[30] = {0};
  
        uint8_t *parityBytes = trace + tracepos;
        tracepos += parity_len;
  
+       if (protocol == TOPAZ && !isResponse) {
+               // topaz reader commands come in 1 or 9 separate frames with 7 or 8 Bits each.
+               // merge them:
+               if (merge_topaz_reader_frames(timestamp, &duration, &tracepos, traceLen, trace, frame, topaz_reader_command, &data_len)) {
+                       frame = topaz_reader_command;
+               }
+       }
+       
        //Check the CRC status
        uint8_t crcStatus = 2;
  
        if (data_len > 2) {
-               uint8_t b1, b2;
-               if(protocol == ICLASS)
-               {
-                       crcStatus = iclass_CRC_check(isResponse, frame, data_len);
-               }else if (protocol == ISO_14443B)
-               {
-                       crcStatus = iso14443B_CRC_check(isResponse, frame, data_len);
-               }
-               else if (protocol == ISO_14443A){//Iso 14443a
-                       ComputeCrc14443(CRC_14443_A, frame, data_len-2, &b1, &b2);
-                       if (b1 != frame[data_len-2] || b2 != frame[data_len-1]) {
-                               if(!(isResponse & (data_len < 6)))
-                               {
-                                               crcStatus = 0;
-                               }
-                       }
+               switch (protocol) {
+                       case ICLASS:
+                               crcStatus = iclass_CRC_check(isResponse, frame, data_len);
+                               break;
+                       case ISO_14443B:
+                       case TOPAZ:
+                               crcStatus = iso14443B_CRC_check(isResponse, frame, data_len); 
+                               break;
+                       case ISO_14443A:
+                               crcStatus = iso14443A_CRC_check(isResponse, frame, data_len);
+                               break;
+                       default: 
+                               break;
                }
        }
        //0 CRC-command, CRC not ok
                uint8_t parityBits = parityBytes[j>>3];
                if (protocol != ISO_14443B && (isResponse || protocol == ISO_14443A) && (oddparity != ((parityBits >> (7-(j&0x0007))) & 0x01))) {
                        snprintf(line[j/16]+(( j % 16) * 4),110, "%02x! ", frame[j]);
                } else {
-                       snprintf(line[j/16]+(( j % 16) * 4),110, "%02x  ", frame[j]);
+                       snprintf(line[j/16]+(( j % 16) * 4), 110, " %02x ", frame[j]);
                }
  
        }
-       if(crcStatus == 1)
-       {//CRC-command
-               char *pos1 = line[(data_len-2)/16]+(((data_len-2) % 16) * 4)-1;
-               (*pos1) = '[';
-               char *pos2 = line[(data_len)/16]+(((data_len) % 16) * 4)-2;
-               (*pos2) = ']';
+       if (markCRCBytes) {
+               if(crcStatus == 0 || crcStatus == 1)
+               {//CRC-command
+                       char *pos1 = line[(data_len-2)/16]+(((data_len-2) % 16) * 4);
+                       (*pos1) = '[';
+                       char *pos2 = line[(data_len)/16]+(((data_len) % 16) * 4);
+                       sprintf(pos2, "%c", ']');
+               }
        }
        if(data_len == 0)
        {
                if(data_len == 0){
  
        if(!isResponse)
        {
-               if(protocol == ICLASS)
-                       annotateIclass(explanation,sizeof(explanation),frame,data_len);
-               else if (protocol == ISO_14443A)
-                       annotateIso14443a(explanation,sizeof(explanation),frame,data_len);
-               else if(protocol == ISO_14443B)
-                       annotateIso14443b(explanation,sizeof(explanation),frame,data_len);
+               switch(protocol) {
+                       case ICLASS:            annotateIclass(explanation,sizeof(explanation),frame,data_len); break;
+                       case ISO_14443A:        annotateIso14443a(explanation,sizeof(explanation),frame,data_len); break;
+                       case ISO_14443B:        annotateIso14443b(explanation,sizeof(explanation),frame,data_len); break;
+                       case TOPAZ:                     annotateTopaz(explanation,sizeof(explanation),frame,data_len); break;
+                       default:                        break;
+               }
        }
  
        int num_lines = MIN((data_len - 1)/16 + 1, 16);
        for (int j = 0; j < num_lines ; j++) {
                if (j == 0) {
-                       PrintAndLog(" %9d | %9d | %s | %-64s| %s| %s",
+                       PrintAndLog(" %10d | %10d | %s |%-64s | %s| %s",
                                (timestamp - first_timestamp),
                                (EndOfTransmissionTimestamp - first_timestamp),
                                (isResponse ? "Tag" : "Rdr"),
                                (j == num_lines-1) ? crc : "    ",
                                (j == num_lines-1) ? explanation : "");
                } else {
-                       PrintAndLog("           |           |     | %-64s| %s| %s",
+                       PrintAndLog("            |            |     |%-64s | %s| %s",
                                line[j],
-                               (j == num_lines-1)?crc:"    ",
+                               (j == num_lines-1) ? crc : "    ",
                                (j == num_lines-1) ? explanation : "");
                }
        }
  
-       if (tracepos + sizeof(uint32_t) + sizeof(uint16_t) + sizeof(uint16_t) > traceLen) return traceLen;
+       if (is_last_record(tracepos, trace, traceLen)) return traceLen;
        
-       bool next_isResponse = *((uint16_t *)(trace + tracepos + 6)) & 0x8000;
-       if (showWaitCycles && !isResponse && next_isResponse) {
+       if (showWaitCycles && !isResponse && next_record_is_response(tracepos, trace)) {
                uint32_t next_timestamp = *((uint32_t *)(trace + tracepos));
-               if (next_timestamp != 0x44444444) {
-                       PrintAndLog(" %9d | %9d | %s | fdt (Frame Delay Time): %d",
-                               (EndOfTransmissionTimestamp - first_timestamp),
-                               (next_timestamp - first_timestamp),
-                               "   ",
-                               (next_timestamp - EndOfTransmissionTimestamp));
-               }
+               PrintAndLog(" %9d | %9d | %s | fdt (Frame Delay Time): %d",
+                       (EndOfTransmissionTimestamp - first_timestamp),
+                       (next_timestamp - first_timestamp),
+                       "   ",
+                       (next_timestamp - EndOfTransmissionTimestamp));
        }
  
        return tracepos;
  int CmdHFList(const char *Cmd)
  {
        bool showWaitCycles = false;
+       bool markCRCBytes = false;
        char type[40] = {0};
        int tlen = param_getstr(Cmd,0,type);
-       char param = param_getchar(Cmd, 1);
+       char param1 = param_getchar(Cmd, 1);
+       char param2 = param_getchar(Cmd, 2);
        bool errors = false;
        uint8_t protocol = 0;
        //Validate params
-       if(tlen == 0)
-       {
+       if(tlen == 0) {
                errors = true;
        }
-       if(param == 'h' || (param !=0 && param != 'f'))
-       {
+       if(param1 == 'h'
+                       || (param1 != 0 && param1 != 'f' && param1 != 'c')
+                       || (param2 != 0 && param2 != 'f' && param2 != 'c')) {
                errors = true;
        }
-       if(!errors)
-       {
-               if(strcmp(type, "iclass") == 0)
-               {
+       if(!errors) {
+               if(strcmp(type, "iclass") == 0) {
                        protocol = ICLASS;
-               }else if(strcmp(type, "14a") == 0)
-               {
+               } else if(strcmp(type, "14a") == 0) {
                        protocol = ISO_14443A;
-               }
-               else if(strcmp(type, "14b") == 0)
-               {
+               } else if(strcmp(type, "14b") == 0)     {
                        protocol = ISO_14443B;
-               }else if(strcmp(type,"raw")== 0)
-               {
+               } else if(strcmp(type,"topaz")== 0) {
+                       protocol = TOPAZ;
+               } else if(strcmp(type,"raw")== 0) {
                        protocol = -1;//No crc, no annotations
-               }else{
+               } else {
                        errors = true;
                }
        }
  
        if (errors) {
                PrintAndLog("List protocol data in trace buffer.");
-               PrintAndLog("Usage:  hf list <protocol> [f]");
+               PrintAndLog("Usage:  hf list <protocol> [f][c]");
                PrintAndLog("    f      - show frame delay times as well");
+               PrintAndLog("    c      - mark CRC bytes");
                PrintAndLog("Supported <protocol> values:");
                PrintAndLog("    raw    - just show raw data without annotations");
                PrintAndLog("    14a    - interpret data as iso14443a communications");
                PrintAndLog("    14b    - interpret data as iso14443b communications");
                PrintAndLog("    iclass - interpret data as iclass communications");
+               PrintAndLog("    topaz  - interpret data as topaz communications");
                PrintAndLog("");
                PrintAndLog("example: hf list 14a f");
                PrintAndLog("example: hf list iclass");
        }
  
  
-       if (param == 'f') {
+       if (param1 == 'f' || param2 == 'f') {
                showWaitCycles = true;
        }
  
+       if (param1 == 'c' || param2 == 'c') {
+               markCRCBytes = true;
+       }
  
        uint8_t *trace;
        uint16_t tracepos = 0;
        PrintAndLog("iso14443a - All times are in carrier periods (1/13.56Mhz)");
        PrintAndLog("iClass    - Timings are not as accurate");
        PrintAndLog("");
-       PrintAndLog("     Start |       End | Src | Data (! denotes parity error)                                   | CRC | Annotation         |");
-       PrintAndLog("-----------|-----------|-----|-----------------------------------------------------------------|-----|--------------------|");
+       PrintAndLog("      Start |        End | Src | Data (! denotes parity error)                                   | CRC | Annotation         |");
+       PrintAndLog("------------|------------|-----|-----------------------------------------------------------------|-----|--------------------|");
  
        while(tracepos < traceLen)
        {
-               tracepos = printTraceLine(tracepos, traceLen, trace, protocol, showWaitCycles);
+               tracepos = printTraceLine(tracepos, traceLen, trace, protocol, showWaitCycles, markCRCBytes);
        }
  
        free(trace);
@@@ -557,14 -669,14 +669,14 @@@ int CmdHFSearch(const char *Cmd)
                PrintAndLog("\nValid ISO14443A Tag Found - Quiting Search\n");
                return ans;
        }
 -      ans = HF14BInfo(false);
 +      ans = HFiClassReader("", false, false);
        if (ans) {
 -              PrintAndLog("\nValid ISO14443B Tag Found - Quiting Search\n");
 +              PrintAndLog("\nValid iClass Tag (or PicoPass Tag) Found - Quiting Search\n");
                return ans;
        }
 -      ans = HFiClassReader("", false, false);
 +      ans = HF14BInfo(false);
        if (ans) {
 -              PrintAndLog("\nValid iClass Tag (or PicoPass Tag) Found - Quiting Search\n");
 +              PrintAndLog("\nValid ISO14443B Tag Found - Quiting Search\n");
                return ans;
        }
        ans = HF15Reader("", false);
        return 0;
  }
  
 +int CmdHFSnoop(const char *Cmd)
 +{
 +      char * pEnd;
 +      UsbCommand c = {CMD_HF_SNIFFER, {strtol(Cmd, &pEnd,0),strtol(pEnd, &pEnd,0),0}};
 +      SendCommand(&c);
 +      return 0;
 +}
 +
  static command_t CommandTable[] = 
  {
-   {"help",        CmdHelp,          1, "This help"},
-   {"14a",         CmdHF14A,         1, "{ ISO14443A RFIDs... }"},
-   {"14b",         CmdHF14B,         1, "{ ISO14443B RFIDs... }"},
-   {"15",          CmdHF15,          1, "{ ISO15693 RFIDs... }"},
-   {"epa",         CmdHFEPA,         1, "{ German Identification Card... }"},
-   {"legic",       CmdHFLegic,       0, "{ LEGIC RFIDs... }"},
-   {"iclass",      CmdHFiClass,      1, "{ ICLASS RFIDs... }"},
-   {"mf",          CmdHFMF,          1, "{ MIFARE RFIDs... }"},
-   {"mfu",         CmdHFMFUltra,     1, "{ MIFARE Ultralight RFIDs... }"},
-   {"tune",        CmdHFTune,        0, "Continuously measure HF antenna tuning"},
-   {"list",        CmdHFList,        1, "List protocol data in trace buffer"},
-   {"search",      CmdHFSearch,      1, "Search for known HF tags [preliminary]"},
-   {"snoop",       CmdHFSnoop,       0, "<samples to skip (10000)> <triggers to skip (1)> Generic HF Snoop"},
-   {NULL, NULL, 0, NULL}
+       {"help",        CmdHelp,                1, "This help"},
+       {"14a",         CmdHF14A,               1, "{ ISO14443A RFIDs... }"},
+       {"14b",         CmdHF14B,               1, "{ ISO14443B RFIDs... }"},
+       {"15",          CmdHF15,                1, "{ ISO15693 RFIDs... }"},
+       {"epa",         CmdHFEPA,               1, "{ German Identification Card... }"},
+       {"legic",       CmdHFLegic,             0, "{ LEGIC RFIDs... }"},
+       {"iclass",      CmdHFiClass,    1, "{ ICLASS RFIDs... }"},
+       {"mf",          CmdHFMF,                1, "{ MIFARE RFIDs... }"},
+       {"mfu",         CmdHFMFUltra,   1, "{ MIFARE Ultralight RFIDs... }"},
+       {"topaz",       CmdHFTopaz,             1, "{ TOPAZ (NFC Type 1) RFIDs... }"},
+       {"tune",        CmdHFTune,              0, "Continuously measure HF antenna tuning"},
+       {"list",        CmdHFList,              1, "List protocol data in trace buffer"},
+       {"search",      CmdHFSearch,    1, "Search for known HF tags [preliminary]"},
++      {"snoop",   CmdHFSnoop,     0, "<samples to skip (10000)> <triggers to skip (1)> Generic HF Snoop"},
+       {NULL,          NULL,                   0, NULL}
  };
  
  int CmdHF(const char *Cmd)
diff --combined common/protocols.h
index 177632aafacf5afa4e042582156ab24914889333,169cee47d599023dc94ceef3adc60531d48886e5..dd023bb8f403b4c19e6491adeb33049a719ef183
@@@ -99,7 -99,7 +99,7 @@@ NXP/Philips CUSTOM COMMAND
  #define ICLASS_CMD_CHECK            0x05
  #define ICLASS_CMD_DETECT           0x0F
  #define ICLASS_CMD_HALT             0x00
 -#define ICLASS_CMD_UPDATE                     0x87
 +#define ICLASS_CMD_UPDATE           0x87
  #define ICLASS_CMD_ACT              0x8E
  #define ICLASS_CMD_READ4            0x06
  
  #define ISO15693_READ_MULTI_SECSTATUS 0x2C
  
  
- #define ISO_14443A 0
- #define ICLASS     1
- #define ISO_14443B 2
+ // Topaz command set:
+ #define       TOPAZ_REQA                                              0x26    // Request
+ #define       TOPAZ_WUPA                                              0x52    // WakeUp
+ #define       TOPAZ_RID                                               0x78    // Read ID
+ #define       TOPAZ_RALL                                              0x00    // Read All (all bytes)
+ #define       TOPAZ_READ                                              0x01    // Read (a single byte)
+ #define       TOPAZ_WRITE_E                                   0x53    // Write-with-erase (a single byte)
+ #define       TOPAZ_WRITE_NE                                  0x1a    // Write-no-erase (a single byte)
+ // additional commands for Dynamic Memory Model
+ #define TOPAZ_RSEG                                            0x10    // Read segment
+ #define TOPAZ_READ8                                           0x02    // Read (eight bytes)
+ #define TOPAZ_WRITE_E8                                        0x54    // Write-with-erase (eight bytes)
+ #define TOPAZ_WRITE_NE8                                       0x1B    // Write-no-erase (eight bytes)
+ #define ISO_14443A    0
+ #define ICLASS                1
+ #define ISO_14443B    2
+ #define TOPAZ         3
  
  //-- Picopass fuses
  #define FUSE_FPERS   0x80
  
  
  void printIclassDumpInfo(uint8_t* iclass_dump);
 +void getMemConfig(uint8_t mem_cfg, uint8_t chip_cfg, uint8_t *max_blk, uint8_t *app_areas, uint8_t *kb);
  
  #endif // PROTOCOLS_H
Impressum, Datenschutz