1 //----------------------------------------------------------------------------- 
   2 // Copyright (C) 2010 iZsh <izsh at fail0verflow.com> 
   4 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   5 // at your option, any later version. See the LICENSE.txt file for the text of 
   7 //----------------------------------------------------------------------------- 
   8 // High frequency commands 
   9 //----------------------------------------------------------------------------- 
  13 #include "proxmark3.h" 
  16 #include "cmdparser.h" 
  22 #include "cmdhflegic.h" 
  23 #include "cmdhficlass.h" 
  27 static int CmdHelp(const char *Cmd
); 
  29 int CmdHFTune(const char *Cmd
) 
  31   UsbCommand c
={CMD_MEASURE_ANTENNA_TUNING_HF
}; 
  35 // for the time being. Need better Bigbuf handling. 
  36 #define TRACE_SIZE 3000 
  38 //The following data is taken from http://www.proxmark.org/forum/viewtopic.php?pid=13501#p13501 
  40 ISO14443A (usually NFC tags) 
  42         30 = Read (usage: 30+1byte block number+2bytes ISO14443A-CRC - answer: 16bytes) 
  43         A2 = Write (usage: A2+1byte block number+4bytes data+2bytes ISO14443A-CRC - answer: 0A [ACK] or 00 [NAK]) 
  44         52 (7bits) = WUPA (usage: 52(7bits) - answer: 2bytes ATQA) 
  45         93 20 = Anticollision (usage: 9320 - answer: 4bytes UID+1byte UID-bytes-xor) 
  46         93 70 = Select (usage: 9370+5bytes 9320 answer - answer: 1byte SAK) 
  47         95 20 = Anticollision of cascade level2 
  48         95 70 = Select of cascade level2 
  49         50 00 = Halt (usage: 5000+2bytes ISO14443A-CRC - no answer from card) 
  51         60 = Authenticate with KeyA 
  52         61 = Authenticate with KeyB 
  53         40 (7bits) = Used to put Chinese Changeable UID cards in special mode (must be followed by 43 (8bits) - answer: 0A) 
  59         A0 = Compatibility Write (to accomodate MIFARE commands) 
  60         1A = Step1 Authenticate 
  61         AF = Step2 Authenticate 
  68 SRIX4K (tag does not respond to 05) 
  70         0E xx = SELECT ID (xx = Chip-ID) 
  72         08 yy = Read Block (yy = block number) 
  73         09 yy dd dd dd dd = Write Block (yy = block number; dd dd dd dd = data to be written) 
  74         0C = Reset to Inventory 
  76         0A 11 22 33 44 55 66 = Authenticate (11 22 33 44 55 66 = data to authenticate) 
  80         MANDATORY COMMANDS (all ISO15693 tags must support those) 
  81                 01 = Inventory (usage: 260100+2bytes ISO15693-CRC - answer: 12bytes) 
  83         OPTIONAL COMMANDS (not all tags support them) 
  84                 20 = Read Block (usage: 0220+1byte block number+2bytes ISO15693-CRC - answer: 4bytes) 
  85                 21 = Write Block (usage: 0221+1byte block number+4bytes data+2bytes ISO15693-CRC - answer: 4bytes) 
  87                 23 = Read Multiple Blocks (usage: 0223+1byte 1st block to read+1byte last block to read+2bytes ISO15693-CRC) 
  94                 2B = Get_System_Info (usage: 022B+2bytes ISO15693-CRC - answer: 14 or more bytes) 
  95                 2C = Read Multiple Block Security Status (usage: 022C+1byte 1st block security to read+1byte last block security to read+2bytes ISO15693-CRC) 
  97 EM Microelectronic CUSTOM COMMANDS 
  98         A5 = Active EAS (followed by 1byte IC Manufacturer code+1byte EAS type) 
  99         A7 = Write EAS ID (followed by 1byte IC Manufacturer code+2bytes EAS value) 
 100         B8 = Get Protection Status for a specific block (followed by 1byte IC Manufacturer code+1byte block number+1byte of how many blocks after the previous is needed the info) 
 101         E4 = Login (followed by 1byte IC Manufacturer code+4bytes password) 
 102 NXP/Philips CUSTOM COMMANDS 
 104         A1 = Fast Inventory Read 
 109         A6 = Password Protect EAS 
 112         B0 = Inventory Page Read 
 113         B1 = Fast Inventory Page Read 
 114         B2 = Get Random Number 
 118         B6 = Bit Password Protection 
 119         B7 = Lock Page Protection Condition 
 120         B8 = Get Multiple Block Protection Status 
 123         BB = 64bit Password Protection 
 124         40 = Long Range CMD (Standard ISO/TR7003:1990) 
 127 #define ICLASS_CMD_ACTALL           0x0A 
 128 #define ICLASS_CMD_READ_OR_IDENTIFY 0x0C 
 129 #define ICLASS_CMD_SELECT           0x81 
 130 #define ICLASS_CMD_PAGESEL          0x84 
 131 #define ICLASS_CMD_READCHECK_KD     0x88 
 132 #define ICLASS_CMD_READCHECK_KC     0x18 
 133 #define ICLASS_CMD_CHECK            0x05 
 134 #define ICLASS_CMD_DETECT           0x0F 
 135 #define ICLASS_CMD_HALT             0x00 
 136 #define ICLASS_CMD_UPDATE                       0x87 
 137 #define ICLASS_CMD_ACT              0x8E 
 138 #define ICLASS_CMD_READ4            0x06 
 141 #define ISO14443A_CMD_REQA       0x26 
 142 #define ISO14443A_CMD_READBLOCK  0x30 
 143 #define ISO14443A_CMD_WUPA       0x52 
 144 #define ISO14443A_CMD_ANTICOLL_OR_SELECT     0x93 
 145 #define ISO14443A_CMD_ANTICOLL_OR_SELECT_2   0x95 
 146 #define ISO14443A_CMD_WRITEBLOCK 0xA0 // or 0xA2 ? 
 147 #define ISO14443A_CMD_HALT       0x50 
 148 #define ISO14443A_CMD_RATS       0xE0 
 150 #define MIFARE_AUTH_KEYA            0x60 
 151 #define MIFARE_AUTH_KEYB            0x61 
 152 #define MIFARE_MAGICMODE            0x40 
 153 #define MIFARE_CMD_INC          0xC0 
 154 #define MIFARE_CMD_DEC          0xC1 
 155 #define MIFARE_CMD_RESTORE      0xC2 
 156 #define MIFARE_CMD_TRANSFER     0xB0 
 158 #define MIFARE_ULC_WRITE        0xA0 
 159 #define MIFARE_ULC_AUTH_1       0x1A 
 160 #define MIFARE_ULC_AUTH_2        0xAF 
 162 #define ISO14443B_REQB         0x05 
 163 #define ISO14443B_ATTRIB       0x1D 
 164 #define ISO14443B_HALT         0x50 
 167 #define ISO15693_INVENTORY     0x01 
 168 #define ISO15693_STAYQUIET     0x02 
 170 #define ISO15693_READBLOCK            0x20 
 171 #define ISO15693_WRITEBLOCK           0x21 
 172 #define ISO15693_LOCKBLOCK            0x22 
 173 #define ISO15693_READ_MULTI_BLOCK     0x23 
 174 #define ISO15693_SELECT               0x25 
 175 #define ISO15693_RESET_TO_READY       0x26 
 176 #define ISO15693_WRITE_AFI            0x27 
 177 #define ISO15693_LOCK_AFI             0x28 
 178 #define ISO15693_WRITE_DSFID          0x29 
 179 #define ISO15693_LOCK_DSFID           0x2A 
 180 #define ISO15693_GET_SYSTEM_INFO      0x2B 
 181 #define ISO15693_READ_MULTI_SECSTATUS 0x2C 
 189 void annotateIso14443a(char *exp
, size_t size
, uint8_t* cmd
, uint8_t cmdsize
) 
 193         case ISO14443A_CMD_WUPA
:        snprintf(exp
,size
,"WUPA"); break; 
 194         case ISO14443A_CMD_ANTICOLL_OR_SELECT
:{ 
 195                 // 93 20 = Anticollision (usage: 9320 - answer: 4bytes UID+1byte UID-bytes-xor) 
 196                 // 93 70 = Select (usage: 9370+5bytes 9320 answer - answer: 1byte SAK) 
 199                         snprintf(exp
,size
,"SELECT_UID"); break; 
 202                         snprintf(exp
,size
,"ANTICOLL"); break; 
 205         case ISO14443A_CMD_ANTICOLL_OR_SELECT_2
:{ 
 206                 //95 20 = Anticollision of cascade level2 
 207                 //95 70 = Select of cascade level2 
 210                         snprintf(exp
,size
,"SELECT_UID-2"); break; 
 213                         snprintf(exp
,size
,"ANTICOLL-2"); break; 
 216         case ISO14443A_CMD_REQA
:       snprintf(exp
,size
,"REQA"); break; 
 217         case ISO14443A_CMD_READBLOCK
:  snprintf(exp
,size
,"READBLOCK(%d)",cmd
[1]); break; 
 218         case ISO14443A_CMD_WRITEBLOCK
: snprintf(exp
,size
,"WRITEBLOCK(%d)",cmd
[1]); break; 
 219         case ISO14443A_CMD_HALT
:       snprintf(exp
,size
,"HALT"); break; 
 220         case ISO14443A_CMD_RATS
:       snprintf(exp
,size
,"RATS"); break; 
 221         case MIFARE_CMD_INC
:          snprintf(exp
,size
,"INC(%d)",cmd
[1]); break; 
 222         case MIFARE_CMD_DEC
:          snprintf(exp
,size
,"DEC(%d)",cmd
[1]); break; 
 223         case MIFARE_CMD_RESTORE
:      snprintf(exp
,size
,"RESTORE(%d)",cmd
[1]); break; 
 224         case MIFARE_CMD_TRANSFER
:     snprintf(exp
,size
,"TRANSFER(%d)",cmd
[1]); break; 
 225         case MIFARE_AUTH_KEYA
:        snprintf(exp
,size
,"AUTH-A(%d)",cmd
[1]); break; 
 226         case MIFARE_AUTH_KEYB
:        snprintf(exp
,size
,"AUTH-B(%d)",cmd
[1]); break; 
 227         case MIFARE_MAGICMODE
:        snprintf(exp
,size
,"MAGIC"); break; 
 228         default:                      snprintf(exp
,size
,"?"); break; 
 233 void annotateIclass(char *exp
, size_t size
, uint8_t* cmd
, uint8_t cmdsize
) 
 237         case ICLASS_CMD_ACTALL
:      snprintf(exp
,size
,"ACTALL"); break; 
 238         case ICLASS_CMD_READ_OR_IDENTIFY
:{ 
 240                         snprintf(exp
,size
,"READ(%d)",cmd
[1]); 
 242                         snprintf(exp
,size
,"IDENTIFY"); 
 246         case ICLASS_CMD_SELECT
:      snprintf(exp
,size
,"SELECT"); break; 
 247         case ICLASS_CMD_PAGESEL
:     snprintf(exp
,size
,"PAGESEL(%d)", cmd
[1]); break; 
 248         case ICLASS_CMD_READCHECK_KC
:snprintf(exp
,size
,"READCHECK[Kc](%d)", cmd
[1]); break; 
 249         case ICLASS_CMD_READCHECK_KD
:snprintf(exp
,size
,"READCHECK[Kd](%d)", cmd
[1]); break; 
 250         case ICLASS_CMD_CHECK
:       snprintf(exp
,size
,"CHECK"); break; 
 251         case ICLASS_CMD_DETECT
:      snprintf(exp
,size
,"DETECT"); break; 
 252         case ICLASS_CMD_HALT
:        snprintf(exp
,size
,"HALT"); break; 
 253         case ICLASS_CMD_UPDATE
:      snprintf(exp
,size
,"UPDATE(%d)",cmd
[1]); break; 
 254         case ICLASS_CMD_ACT
:         snprintf(exp
,size
,"ACT"); break; 
 255         case ICLASS_CMD_READ4
:       snprintf(exp
,size
,"READ4(%d)",cmd
[1]); break; 
 256         default:                     snprintf(exp
,size
,"?"); break; 
 261 void annotateIso15693(char *exp
, size_t size
, uint8_t* cmd
, uint8_t cmdsize
) 
 267                 case ISO15693_INVENTORY           
:snprintf(exp
, size
, "INVENTORY");break; 
 268                 case ISO15693_STAYQUIET           
:snprintf(exp
, size
, "STAY_QUIET");break; 
 269                 default:                     snprintf(exp
,size
,"?"); break; 
 272         }else if(cmd
[0] == 0x02) 
 276                 case ISO15693_READBLOCK            
:snprintf(exp
, size
, "READBLOCK");break; 
 277                 case ISO15693_WRITEBLOCK           
:snprintf(exp
, size
, "WRITEBLOCK");break; 
 278                 case ISO15693_LOCKBLOCK            
:snprintf(exp
, size
, "LOCKBLOCK");break; 
 279                 case ISO15693_READ_MULTI_BLOCK     
:snprintf(exp
, size
, "READ_MULTI_BLOCK");break; 
 280                 case ISO15693_SELECT               
:snprintf(exp
, size
, "SELECT");break; 
 281                 case ISO15693_RESET_TO_READY       
:snprintf(exp
, size
, "RESET_TO_READY");break; 
 282                 case ISO15693_WRITE_AFI            
:snprintf(exp
, size
, "WRITE_AFI");break; 
 283                 case ISO15693_LOCK_AFI             
:snprintf(exp
, size
, "LOCK_AFI");break; 
 284                 case ISO15693_WRITE_DSFID          
:snprintf(exp
, size
, "WRITE_DSFID");break; 
 285                 case ISO15693_LOCK_DSFID           
:snprintf(exp
, size
, "LOCK_DSFID");break; 
 286                 case ISO15693_GET_SYSTEM_INFO      
:snprintf(exp
, size
, "GET_SYSTEM_INFO");break; 
 287                 case ISO15693_READ_MULTI_SECSTATUS 
:snprintf(exp
, size
, "READ_MULTI_SECSTATUS");break; 
 288                 default:                            snprintf(exp
,size
,"?"); break; 
 292 void annotateIso14443b(char *exp
, size_t size
, uint8_t* cmd
, uint8_t cmdsize
) 
 295         case ISO14443B_REQB   
: snprintf(exp
,size
,"REQB");break; 
 296         case ISO14443B_ATTRIB 
: snprintf(exp
,size
,"ATTRIB");break; 
 297         case ISO14443B_HALT   
: snprintf(exp
,size
,"HALT");break; 
 298         default:                snprintf(exp
,size 
,"?");break; 
 304  * @brief iso14443B_CRC_Ok Checks CRC in command or response 
 308  * @return  0 : CRC-command, CRC not ok 
 309  *          1 : CRC-command, CRC ok 
 310  *          2 : Not crc-command 
 313 uint8_t iso14443B_CRC_check(bool isResponse
, uint8_t* data
, uint8_t len
) 
 317         if(len 
<= 2) return 2; 
 319         ComputeCrc14443(CRC_14443_B
, data
, len
-2, &b1
, &b2
); 
 320         if(b1 
!= data
[len
-2] || b2 
!= data
[len
-1]) { 
 327  * @brief iclass_CRC_Ok Checks CRC in command or response 
 331  * @return  0 : CRC-command, CRC not ok 
 332  *              1 : CRC-command, CRC ok 
 333  *          2 : Not crc-command 
 335 uint8_t iclass_CRC_check(bool isResponse
, uint8_t* data
, uint8_t len
) 
 337         if(len 
< 4) return 2;//CRC commands (and responses) are all at least 4 bytes 
 341         if(!isResponse
)//Commands to tag 
 344                   These commands should have CRC. Total length leftmost 
 347                   12 UPDATE - unsecured, ends with CRC16 
 348                   14 UPDATE - secured, ends with signature instead 
 351                 if(len 
== 4 || len 
== 12)//Covers three of them 
 353                         //Don't include the command byte 
 354                         ComputeCrc14443(CRC_ICLASS
, (data
+1), len
-3, &b1
, &b2
); 
 355                         return b1 
== data
[len 
-2] && b2 
== data
[len
-1]; 
 360                 These tag responses should have CRC. Total length leftmost 
 362                 10  READ                data[8] crc[2] 
 363                 34  READ4               data[32]crc[2] 
 364                 10  UPDATE      data[8] crc[2] 
 365                 10 SELECT       csn[8] crc[2] 
 366                 10  IDENTIFY  asnb[8] crc[2] 
 367                 10  PAGESEL   block1[8] crc[2] 
 368                 10  DETECT    csn[8] crc[2] 
 372                 4  CHECK                chip_response[4] 
 377                 In conclusion, without looking at the command; any response 
 378                 of length 10 or 34 should have CRC 
 380                 if(len 
!= 10 && len 
!= 34) return true; 
 382                 ComputeCrc14443(CRC_ICLASS
, data
, len
-2, &b1
, &b2
); 
 383                 return b1 
== data
[len 
-2] && b2 
== data
[len
-1]; 
 387 uint16_t printTraceLine(uint16_t tracepos
, uint8_t* trace
, uint8_t protocol
, bool showWaitCycles
) 
 390         uint16_t duration
, data_len
,parity_len
; 
 392         uint32_t timestamp
, first_timestamp
, EndOfTransmissionTimestamp
; 
 393         char explanation
[30] = {0}; 
 395         first_timestamp 
= *((uint32_t *)(trace
)); 
 396         timestamp 
= *((uint32_t *)(trace 
+ tracepos
)); 
 397         // Break and stick with current result if buffer was not completely full 
 398         if (timestamp 
== 0x44444444) return TRACE_SIZE
; 
 401         duration 
= *((uint16_t *)(trace 
+ tracepos
)); 
 403         data_len 
= *((uint16_t *)(trace 
+ tracepos
)); 
 406         if (data_len 
& 0x8000) { 
 412         parity_len 
= (data_len
-1)/8 + 1; 
 414         if (tracepos 
+ data_len 
+ parity_len 
>= TRACE_SIZE
) { 
 418         uint8_t *frame 
= trace 
+ tracepos
; 
 419         tracepos 
+= data_len
; 
 420         uint8_t *parityBytes 
= trace 
+ tracepos
; 
 421         tracepos 
+= parity_len
; 
 423         //--- Draw the data column 
 425         for (int j 
= 0; j 
< data_len
; j
++) { 
 426                 int oddparity 
= 0x01; 
 429                 for (k
=0 ; k
<8 ; k
++) { 
 430                         oddparity 
^= (((frame
[j
] & 0xFF) >> k
) & 0x01); 
 433                 uint8_t parityBits 
= parityBytes
[j
>>3]; 
 435                 if (isResponse 
&& (oddparity 
!= ((parityBits 
>> (7-(j
&0x0007))) & 0x01))) { 
 436                         sprintf(line
[j
/16]+((j%16
)*4), "%02x! ", frame
[j
]); 
 438                         sprintf(line
[j
/16]+((j%16
)*4), "%02x  ", frame
[j
]); 
 441         //--- Draw the CRC column 
 442         uint8_t crcStatus 
= 2; 
 446                 if(protocol 
== ICLASS
) 
 448                         crcStatus 
= iclass_CRC_check(isResponse
, frame
, data_len
); 
 450                 }else if (protocol 
== ISO_14443B
) 
 452                         crcStatus 
= iso14443B_CRC_check(isResponse
, frame
, data_len
); 
 454                 else if (protocol 
== ISO_14443A
){//Iso 14443a 
 456                         ComputeCrc14443(CRC_14443_A
, frame
, data_len
-2, &b1
, &b2
); 
 458                         if (b1 
!= frame
[data_len
-2] || b2 
!= frame
[data_len
-1]) { 
 459                                 if(!(isResponse 
& (data_len 
< 6))) 
 466         //0 CRC-command, CRC not ok 
 467         //1 CRC-command, CRC ok 
 469         char *crc 
= (crcStatus 
== 0 ? "!crc" : (crcStatus 
== 1 ? " ok " : "    ")); 
 471         EndOfTransmissionTimestamp 
= timestamp 
+ duration
; 
 475                 if(protocol 
== ICLASS
) 
 476                         annotateIclass(explanation
,sizeof(explanation
),frame
,data_len
); 
 477                 else if (protocol 
== ISO_14443A
) 
 478                         annotateIso14443a(explanation
,sizeof(explanation
),frame
,data_len
); 
 479                 else if(protocol 
== ISO_14443B
) 
 480                         annotateIso14443b(explanation
,sizeof(explanation
),frame
,data_len
); 
 483         int num_lines 
= (data_len 
- 1)/16 + 1; 
 484         for (int j 
= 0; j 
< num_lines
; j
++) { 
 486                         PrintAndLog(" %9d | %9d | %s | %-64s| %s| %s", 
 487                                 (timestamp 
- first_timestamp
), 
 488                                 (EndOfTransmissionTimestamp 
- first_timestamp
), 
 489                                 (isResponse 
? "Tag" : "Rdr"), 
 491                                 (j 
== num_lines
-1) ? crc 
: "    ", 
 492                                 (j 
== num_lines
-1) ? explanation 
: ""); 
 494                         PrintAndLog("           |           |     | %-64s| %s| %s", 
 496                                 (j 
== num_lines
-1)?crc
:"    ", 
 497                                 (j 
== num_lines
-1) ? explanation 
: ""); 
 501         bool next_isResponse 
= *((uint16_t *)(trace 
+ tracepos 
+ 6)) & 0x8000; 
 503         if (showWaitCycles 
&& !isResponse 
&& next_isResponse
) { 
 504                 uint32_t next_timestamp 
= *((uint32_t *)(trace 
+ tracepos
)); 
 505                 if (next_timestamp 
!= 0x44444444) { 
 506                         PrintAndLog(" %9d | %9d | %s | fdt (Frame Delay Time): %d", 
 507                                 (EndOfTransmissionTimestamp 
- first_timestamp
), 
 508                                 (next_timestamp 
- first_timestamp
), 
 510                                 (next_timestamp 
- EndOfTransmissionTimestamp
)); 
 516 int CmdHFList(const char *Cmd
) 
 518         bool showWaitCycles 
= false; 
 520         int tlen 
= param_getstr(Cmd
,0,type
); 
 521         char param 
= param_getchar(Cmd
, 1); 
 523         uint8_t protocol 
= 0; 
 529         if(param 
== 'h' || (param 
!=0 && param 
!= 'f')) 
 535                 if(strcmp(type
, "iclass") == 0) 
 538                 }else if(strcmp(type
, "14a") == 0) 
 540                         protocol 
= ISO_14443A
; 
 542                 else if(strcmp(type
, "14b") == 0) 
 544                         protocol 
= ISO_14443B
; 
 545                 }else if(strcmp(type
,"raw")== 0) 
 547                         protocol 
= -1;//No crc, no annotations 
 554                 PrintAndLog("List protocol data in trace buffer."); 
 555                 PrintAndLog("Usage:  hf list [14a|14b|iclass] [f]"); 
 556                 PrintAndLog("    14a    - interpret data as iso14443a communications"); 
 557                 PrintAndLog("    14b    - interpret data as iso14443b communications"); 
 558                 PrintAndLog("    iclass - interpret data as iclass communications"); 
 559                 PrintAndLog("    raw    - just show raw data"); 
 560                 PrintAndLog("    f      - show frame delay times as well"); 
 562                 PrintAndLog("example: hf list 14a f"); 
 563                 PrintAndLog("example: hf list iclass"); 
 569                 showWaitCycles 
= true; 
 573         uint8_t trace
[TRACE_SIZE
]; 
 574         uint16_t tracepos 
= 0; 
 575         GetFromBigBuf(trace
, TRACE_SIZE
, 0); 
 576         WaitForResponse(CMD_ACK
, NULL
); 
 578         PrintAndLog("Recorded Activity"); 
 580         PrintAndLog("Start = Start of Start Bit, End = End of last modulation. Src = Source of Transfer"); 
 581         PrintAndLog("iso14443a - All times are in carrier periods (1/13.56Mhz)"); 
 582         PrintAndLog("iClass    - Timings are not as accurate"); 
 584         PrintAndLog("     Start |       End | Src | Data (! denotes parity error)                                   | CRC | Annotation         |"); 
 585         PrintAndLog("-----------|-----------|-----|-----------------------------------------------------------------|-----|--------------------|"); 
 587         while(tracepos 
< TRACE_SIZE
) 
 589                 tracepos 
= printTraceLine(tracepos
, trace
, protocol
, showWaitCycles
); 
 595 static command_t CommandTable
[] =  
 597   {"help",        CmdHelp
,          1, "This help"}, 
 598   {"14a",         CmdHF14A
,         1, "{ ISO14443A RFIDs... }"}, 
 599   {"14b",         CmdHF14B
,         1, "{ ISO14443B RFIDs... }"}, 
 600   {"15",          CmdHF15
,          1, "{ ISO15693 RFIDs... }"}, 
 601   {"epa",         CmdHFEPA
,         1, "{ German Identification Card... }"}, 
 602   {"legic",       CmdHFLegic
,       0, "{ LEGIC RFIDs... }"}, 
 603   {"iclass",      CmdHFiClass
,      1, "{ ICLASS RFIDs... }"}, 
 604   {"mf",                CmdHFMF
,                1, "{ MIFARE RFIDs... }"}, 
 605   {"mfu",                       CmdHFMFUltra
,           1, "{ MIFARE Ultralight RFIDs... }"}, 
 606   {"tune",        CmdHFTune
,        0, "Continuously measure HF antenna tuning"}, 
 607   {"list",       CmdHFList
,         1, "List protocol data in trace buffer"}, 
 608         {NULL
, NULL
, 0, NULL
} 
 611 int CmdHF(const char *Cmd
) 
 613   CmdsParse(CommandTable
, Cmd
); 
 617 int CmdHelp(const char *Cmd
) 
 619   CmdsHelp(CommandTable
);