1 //----------------------------------------------------------------------------- 
   2 // Jonathan Westhues, Mar 2006 
   3 // Edits by Gerhard de Koning Gans, Sep 2007 (##) 
   5 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   6 // at your option, any later version. See the LICENSE.txt file for the text of 
   8 //----------------------------------------------------------------------------- 
   9 // The main application code. This is the first thing called after start.c 
  11 //----------------------------------------------------------------------------- 
  17 #include "proxmark3.h" 
  24 #include "legicrfsim.h" 
  27 #include "iso14443b.h" 
  29 #include "lfsampling.h" 
  31 #include "mifareutil.h" 
  32 #include "mifaresim.h" 
  36 #include "fpgaloader.h" 
  41 static uint32_t hw_capabilities
; 
  43 // Craig Young - 14a stand-alone code 
  45  #include "iso14443a.h" 
  48 //============================================================================= 
  49 // A buffer where we can queue things up to be sent through the FPGA, for 
  50 // any purpose (fake tag, as reader, whatever). We go MSB first, since that 
  51 // is the order in which they go out on the wire. 
  52 //============================================================================= 
  54 #define TOSEND_BUFFER_SIZE (9*MAX_FRAME_SIZE + 1 + 1 + 2)  // 8 data bits and 1 parity bit per payload byte, 1 correction bit, 1 SOC bit, 2 EOC bits  
  55 uint8_t ToSend
[TOSEND_BUFFER_SIZE
]; 
  58 struct common_area common_area 
__attribute__((section(".commonarea"))); 
  60 void ToSendReset(void) 
  66 void ToSendStuffBit(int b
) 
  70                 ToSend
[ToSendMax
] = 0; 
  75                 ToSend
[ToSendMax
] |= (1 << (7 - ToSendBit
)); 
  80         if(ToSendMax 
>= sizeof(ToSend
)) { 
  82                 DbpString("ToSendStuffBit overflowed!"); 
  86 //============================================================================= 
  87 // Debug print functions, to go out over USB, to the usual PC-side client. 
  88 //============================================================================= 
  90 void DbpString(char *str
) 
  92   byte_t len 
= strlen(str
); 
  93   cmd_send(CMD_DEBUG_PRINT_STRING
,len
,0,0,(byte_t
*)str
,len
); 
  97 void DbpIntegers(int x1
, int x2
, int x3
) 
  99   cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0); 
 103 void Dbprintf(const char *fmt
, ...) { 
 104 // should probably limit size here; oh well, let's just use a big buffer 
 105         char output_string
[128]; 
 109         kvsprintf(fmt
, output_string
, 10, ap
); 
 112         DbpString(output_string
); 
 115 // prints HEX & ASCII 
 116 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) { 
 129                         if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.'; 
 132                         Dbprintf("%-8s %*D",ascii
,l
,d
," "); 
 134                         Dbprintf("%*D",l
,d
," "); 
 142 //----------------------------------------------------------------------------- 
 143 // Read an ADC channel and block till it completes, then return the result 
 144 // in ADC units (0 to 1023). Also a routine to average 32 samples and 
 146 //----------------------------------------------------------------------------- 
 147 static int ReadAdc(int ch
) 
 149         // Note: ADC_MODE_PRESCALE and ADC_MODE_SAMPLE_HOLD_TIME are set to the maximum allowed value.  
 150         // AMPL_HI is a high impedance (10MOhm || 1MOhm) output, the input capacitance of the ADC is 12pF (typical). This results in a time constant 
 151         // of RC = (0.91MOhm) * 12pF = 10.9us. Even after the maximum configurable sample&hold time of 40us the input capacitor will not be fully charged.  
 154         // If there is a voltage v_in at the input, the voltage v_cap at the capacitor (this is what we are measuring) will be 
 156         //       v_cap = v_in * (1 - exp(-SHTIM/RC))  =   v_in * (1 - exp(-40us/10.9us))  =  v_in * 0,97                   (i.e. an error of 3%) 
 158         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_SWRST
; 
 159         AT91C_BASE_ADC
->ADC_MR 
= 
 160                 ADC_MODE_PRESCALE(63) |                                                 // ADC_CLK = MCK / ((63+1) * 2) = 48MHz / 128 = 375kHz 
 161                 ADC_MODE_STARTUP_TIME(1) |                                              // Startup Time = (1+1) * 8 / ADC_CLK = 16 / 375kHz = 42,7us     Note: must be > 20us 
 162                 ADC_MODE_SAMPLE_HOLD_TIME(15);                                  // Sample & Hold Time SHTIM = 15 / ADC_CLK = 15 / 375kHz = 40us 
 164         AT91C_BASE_ADC
->ADC_CHER 
= ADC_CHANNEL(ch
); 
 165         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
 167         while(!(AT91C_BASE_ADC
->ADC_SR 
& ADC_END_OF_CONVERSION(ch
))) {}; 
 169         return AT91C_BASE_ADC
->ADC_CDR
[ch
] & 0x3ff; 
 172 int AvgAdc(int ch
) // was static - merlok 
 177         for(i 
= 0; i 
< 32; i
++) { 
 181         return (a 
+ 15) >> 5; 
 184 static int AvgAdc_Voltage_HF(void) 
 186         int AvgAdc_Voltage_Low
, AvgAdc_Voltage_High
; 
 188         AvgAdc_Voltage_Low
= (MAX_ADC_HF_VOLTAGE_LOW 
* AvgAdc(ADC_CHAN_HF_LOW
)) >> 10; 
 189         // if voltage range is about to be exceeded, use high voltage ADC channel if available (RDV40 only) 
 190         if (AvgAdc_Voltage_Low 
> MAX_ADC_HF_VOLTAGE_LOW 
- 300) { 
 191                 AvgAdc_Voltage_High 
= (MAX_ADC_HF_VOLTAGE_HIGH 
* AvgAdc(ADC_CHAN_HF_HIGH
)) >> 10; 
 192                 if (AvgAdc_Voltage_High 
>= AvgAdc_Voltage_Low
) { 
 193                         return AvgAdc_Voltage_High
; 
 196         return AvgAdc_Voltage_Low
; 
 199 static int AvgAdc_Voltage_LF(void) 
 201         return (MAX_ADC_LF_VOLTAGE 
* AvgAdc(ADC_CHAN_LF
)) >> 10; 
 204 void MeasureAntennaTuningLfOnly(int *vLf125
, int *vLf134
, int *peakf
, int *peakv
, uint8_t LF_Results
[]) 
 206         int i
, adcval 
= 0, peak 
= 0; 
 209  * Sweeps the useful LF range of the proxmark from 
 210  * 46.8kHz (divisor=255) to 600kHz (divisor=19) and 
 211  * read the voltage in the antenna, the result left 
 212  * in the buffer is a graph which should clearly show 
 213  * the resonating frequency of your LF antenna 
 214  * ( hopefully around 95 if it is tuned to 125kHz!) 
 217         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 218         FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC 
| FPGA_LF_ADC_READER_FIELD
); 
 221         for (i
=255; i
>=19; i
--) { 
 223                 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
); 
 225                 adcval 
= AvgAdc_Voltage_LF(); 
 226                 if (i
==95) *vLf125 
= adcval
; // voltage at 125Khz 
 227                 if (i
==89) *vLf134 
= adcval
; // voltage at 134Khz 
 229                 LF_Results
[i
] = adcval 
>> 9; // scale int to fit in byte for graphing purposes 
 230                 if(LF_Results
[i
] > peak
) { 
 232                         peak 
= LF_Results
[i
]; 
 238         for (i
=18; i 
>= 0; i
--) LF_Results
[i
] = 0; 
 243 void MeasureAntennaTuningHfOnly(int *vHf
) 
 245         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 247         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 248         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER
); 
 250         *vHf 
= AvgAdc_Voltage_HF(); 
 255 void MeasureAntennaTuning(int mode
) 
 257         uint8_t LF_Results
[256] = {0}; 
 258         int peakv 
= 0, peakf 
= 0; 
 259         int vLf125 
= 0, vLf134 
= 0, vHf 
= 0; // in mV 
 263         if (((mode 
& FLAG_TUNE_ALL
) == FLAG_TUNE_ALL
) && (FpgaGetCurrent() == FPGA_BITSTREAM_HF
)) { 
 264                 // Reverse "standard" order if HF already loaded, to avoid unnecessary swap. 
 265                 MeasureAntennaTuningHfOnly(&vHf
); 
 266                 MeasureAntennaTuningLfOnly(&vLf125
, &vLf134
, &peakf
, &peakv
, LF_Results
); 
 268                 if (mode 
& FLAG_TUNE_LF
) { 
 269                         MeasureAntennaTuningLfOnly(&vLf125
, &vLf134
, &peakf
, &peakv
, LF_Results
); 
 271                 if (mode 
& FLAG_TUNE_HF
) { 
 272                         MeasureAntennaTuningHfOnly(&vHf
); 
 276         cmd_send(CMD_MEASURED_ANTENNA_TUNING
, vLf125
>>1 | (vLf134
>>1<<16), vHf
, peakf 
| (peakv
>>1<<16), LF_Results
, 256); 
 277         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 282 void MeasureAntennaTuningHf(void) 
 284         int vHf 
= 0;    // in mV 
 286         DbpString("Measuring HF antenna, press button to exit"); 
 288         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 289         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 290         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER
); 
 294                 vHf 
= AvgAdc_Voltage_HF(); 
 296                 Dbprintf("%d mV",vHf
); 
 297                 if (BUTTON_PRESS()) break; 
 299         DbpString("cancelled"); 
 301         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 306 void ReadMem(int addr
) 
 308         const uint8_t *data 
= ((uint8_t *)addr
); 
 310         Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", 
 311                 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]); 
 314 /* osimage version information is linked in */ 
 315 extern struct version_information version_information
; 
 316 /* bootrom version information is pointed to from _bootphase1_version_pointer */ 
 317 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
, _bootrom_start
, _bootrom_end
, __data_src_start__
; 
 320 void set_hw_capabilities(void) 
 322         if (I2C_is_available()) { 
 323                 hw_capabilities 
|= HAS_SMARTCARD_SLOT
; 
 326         if (false) { // TODO: implement a test 
 327                 hw_capabilities 
|= HAS_EXTRA_FLASH_MEM
; 
 332 void SendVersion(void) 
 334         set_hw_capabilities(); 
 336         char temp
[USB_CMD_DATA_SIZE
]; /* Limited data payload in USB packets */ 
 337         char VersionString
[USB_CMD_DATA_SIZE
] = { '\0' }; 
 339         /* Try to find the bootrom version information. Expect to find a pointer at 
 340          * symbol _bootphase1_version_pointer, perform slight sanity checks on the 
 341          * pointer, then use it. 
 343         char *bootrom_version 
= *(char**)&_bootphase1_version_pointer
; 
 344         if( bootrom_version 
< &_flash_start 
|| bootrom_version 
>= &_flash_end 
) { 
 345                 strcat(VersionString
, "bootrom version information appears invalid\n"); 
 347                 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
); 
 348                 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1); 
 351         FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
); 
 352         strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1); 
 354         for (int i 
= 0; i 
< fpga_bitstream_num
; i
++) { 
 355                 strncat(VersionString
, fpga_version_information
[i
], sizeof(VersionString
) - strlen(VersionString
) - 1); 
 356                 strncat(VersionString
, "\n", sizeof(VersionString
) - strlen(VersionString
) - 1); 
 359         // test availability of SmartCard slot 
 360         if (I2C_is_available()) { 
 361                 strncat(VersionString
, "SmartCard Slot: available\n", sizeof(VersionString
) - strlen(VersionString
) - 1); 
 363                 strncat(VersionString
, "SmartCard Slot: not available\n", sizeof(VersionString
) - strlen(VersionString
) - 1); 
 366         // Send Chip ID and used flash memory 
 367         uint32_t text_and_rodata_section_size 
= (uint32_t)&__data_src_start__ 
- (uint32_t)&_flash_start
; 
 368         uint32_t compressed_data_section_size 
= common_area
.arg1
; 
 369         cmd_send(CMD_ACK
, *(AT91C_DBGU_CIDR
), text_and_rodata_section_size 
+ compressed_data_section_size
, hw_capabilities
, VersionString
, strlen(VersionString
)); 
 372 // measure the USB Speed by sending SpeedTestBufferSize bytes to client and measuring the elapsed time. 
 373 // Note: this mimics GetFromBigbuf(), i.e. we have the overhead of the UsbCommand structure included. 
 374 void printUSBSpeed(void)  
 376         Dbprintf("USB Speed:"); 
 377         Dbprintf("  Sending USB packets to client..."); 
 379         #define USB_SPEED_TEST_MIN_TIME 1500    // in milliseconds 
 380         uint8_t *test_data 
= BigBuf_get_addr(); 
 383         uint32_t start_time 
= end_time 
= GetTickCount(); 
 384         uint32_t bytes_transferred 
= 0; 
 387         while(end_time 
< start_time 
+ USB_SPEED_TEST_MIN_TIME
) { 
 388                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
, 0, USB_CMD_DATA_SIZE
, 0, test_data
, USB_CMD_DATA_SIZE
); 
 389                 end_time 
= GetTickCount(); 
 390                 bytes_transferred 
+= USB_CMD_DATA_SIZE
; 
 394         Dbprintf("  Time elapsed:      %dms", end_time 
- start_time
); 
 395         Dbprintf("  Bytes transferred: %d", bytes_transferred
); 
 396         Dbprintf("  USB Transfer Speed PM3 -> Client = %d Bytes/s",  
 397                 1000 * bytes_transferred 
/ (end_time 
- start_time
)); 
 402   * Prints runtime information about the PM3. 
 404 void SendStatus(void) 
 406         BigBuf_print_status(); 
 408 #ifdef WITH_SMARTCARD 
 411         printConfig(); //LF Sampling config 
 414         Dbprintf("  MF_DBGLEVEL........%d", MF_DBGLEVEL
); 
 415         Dbprintf("  ToSendMax..........%d", ToSendMax
); 
 416         Dbprintf("  ToSendBit..........%d", ToSendBit
); 
 418         cmd_send(CMD_ACK
,1,0,0,0,0); 
 421 #if defined(WITH_ISO14443a_StandAlone) || defined(WITH_LF_StandAlone) 
 425 void StandAloneMode() 
 427         DbpString("Stand-alone mode! No PC necessary."); 
 428         // Oooh pretty -- notify user we're in elite samy mode now 
 430         LED(LED_ORANGE
, 200); 
 432         LED(LED_ORANGE
, 200); 
 434         LED(LED_ORANGE
, 200); 
 436         LED(LED_ORANGE
, 200); 
 445 #ifdef WITH_ISO14443a_StandAlone 
 446 void StandAloneMode14a() 
 449         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 452         bool playing 
= false, GotoRecord 
= false, GotoClone 
= false; 
 453         bool cardRead
[OPTS
] = {false}; 
 454         uint8_t readUID
[10] = {0}; 
 455         uint32_t uid_1st
[OPTS
]={0}; 
 456         uint32_t uid_2nd
[OPTS
]={0}; 
 457         uint32_t uid_tmp1 
= 0; 
 458         uint32_t uid_tmp2 
= 0; 
 459         iso14a_card_select_t hi14a_card
[OPTS
]; 
 461         LED(selected 
+ 1, 0); 
 469                 if (GotoRecord 
|| !cardRead
[selected
]) 
 473                         LED(selected 
+ 1, 0); 
 477                         Dbprintf("Enabling iso14443a reader mode for [Bank: %u]...", selected
); 
 478                         /* need this delay to prevent catching some weird data */ 
 480                         /* Code for reading from 14a tag */ 
 481                         uint8_t uid
[10]  ={0}; 
 483                         iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD
); 
 488                                 if (BUTTON_PRESS()) { 
 489                                         if (cardRead
[selected
]) { 
 490                                                 Dbprintf("Button press detected -- replaying card in bank[%d]", selected
); 
 493                                         else if (cardRead
[(selected
+1)%OPTS
]) { 
 494                                                 Dbprintf("Button press detected but no card in bank[%d] so playing from bank[%d]", selected
, (selected
+1)%OPTS
); 
 495                                                 selected 
= (selected
+1)%OPTS
; 
 499                                                 Dbprintf("Button press detected but no stored tag to play. (Ignoring button)"); 
 503                                 if (!iso14443a_select_card(uid
, &hi14a_card
[selected
], &cuid
, true, 0, true)) 
 507                                         Dbprintf("Read UID:"); Dbhexdump(10,uid
,0); 
 508                                         memcpy(readUID
,uid
,10*sizeof(uint8_t)); 
 509                                         uint8_t *dst 
= (uint8_t *)&uid_tmp1
; 
 510                                         // Set UID byte order 
 511                                         for (int i
=0; i
<4; i
++) 
 513                                         dst 
= (uint8_t *)&uid_tmp2
; 
 514                                         for (int i
=0; i
<4; i
++) 
 516                                         if (uid_1st
[(selected
+1)%OPTS
] == uid_tmp1 
&& uid_2nd
[(selected
+1)%OPTS
] == uid_tmp2
) { 
 517                                                 Dbprintf("Card selected has same UID as what is stored in the other bank. Skipping."); 
 521                                                         Dbprintf("Bank[%d] received a 7-byte UID",selected
); 
 522                                                         uid_1st
[selected
] = (uid_tmp1
)>>8; 
 523                                                         uid_2nd
[selected
] = (uid_tmp1
<<24) + (uid_tmp2
>>8); 
 526                                                         Dbprintf("Bank[%d] received a 4-byte UID",selected
); 
 527                                                         uid_1st
[selected
] = uid_tmp1
; 
 528                                                         uid_2nd
[selected
] = uid_tmp2
; 
 534                         Dbprintf("ATQA = %02X%02X",hi14a_card
[selected
].atqa
[0],hi14a_card
[selected
].atqa
[1]); 
 535                         Dbprintf("SAK = %02X",hi14a_card
[selected
].sak
); 
 538                         LED(LED_ORANGE
, 200); 
 540                         LED(LED_ORANGE
, 200); 
 543                         LED(selected 
+ 1, 0); 
 545                         // Next state is replay: 
 548                         cardRead
[selected
] = true; 
 550                 /* MF Classic UID clone */ 
 555                         LED(selected 
+ 1, 0); 
 556                         LED(LED_ORANGE
, 250); 
 560                         Dbprintf("Preparing to Clone card [Bank: %x]; uid: %08x", selected
, uid_1st
[selected
]); 
 562                         // wait for button to be released 
 563                         while(BUTTON_PRESS()) 
 565                                 // Delay cloning until card is in place 
 568                         Dbprintf("Starting clone. [Bank: %u]", selected
); 
 569                         // need this delay to prevent catching some weird data 
 571                         // Begin clone function here: 
 572                         /* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards: 
 573                                         UsbCommand c = {CMD_MIFARE_CSETBLOCK, {wantWipe, params & (0xFE | (uid == NULL ? 0:1)), blockNo}}; 
 574                                         memcpy(c.d.asBytes, data, 16); 
 577                                         Block read is similar: 
 578                                         UsbCommand c = {CMD_MIFARE_CGETBLOCK, {params, 0, blockNo}}; 
 579                                         We need to imitate that call with blockNo 0 to set a uid. 
 581                                         The get and set commands are handled in this file: 
 582                                         // Work with "magic Chinese" card 
 583                                         case CMD_MIFARE_CSETBLOCK: 
 584                                                 MifareCSetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes); 
 586                                         case CMD_MIFARE_CGETBLOCK: 
 587                                                 MifareCGetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes); 
 590                                 mfCSetUID provides example logic for UID set workflow: 
 591                                         -Read block0 from card in field with MifareCGetBlock() 
 592                                         -Configure new values without replacing reserved bytes 
 593                                                         memcpy(block0, uid, 4); // Copy UID bytes from byte array 
 595                                                         block0[4] = block0[0]^block0[1]^block0[2]^block0[3]; // BCC on byte 5 
 596                                                         Bytes 5-7 are reserved SAK and ATQA for mifare classic 
 597                                         -Use mfCSetBlock(0, block0, oldUID, wantWipe, CSETBLOCK_SINGLE_OPER) to write it 
 599                         uint8_t oldBlock0
[16] = {0}, newBlock0
[16] = {0}, testBlock0
[16] = {0}; 
 600                         // arg0 = Flags == CSETBLOCK_SINGLE_OPER=0x1F, arg1=returnSlot, arg2=blockNo 
 601                         MifareCGetBlock(0x3F, 1, 0, oldBlock0
); 
 602                         if (oldBlock0
[0] == 0 && oldBlock0
[0] == oldBlock0
[1]  && oldBlock0
[1] == oldBlock0
[2] && oldBlock0
[2] == oldBlock0
[3]) { 
 603                                 Dbprintf("No changeable tag detected. Returning to replay mode for bank[%d]", selected
); 
 607                                 Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0
[0],oldBlock0
[1],oldBlock0
[2],oldBlock0
[3]); 
 608                                 memcpy(newBlock0
,oldBlock0
,16); 
 609                                 // Copy uid_1st for bank (2nd is for longer UIDs not supported if classic) 
 611                                 newBlock0
[0] = uid_1st
[selected
]>>24; 
 612                                 newBlock0
[1] = 0xFF & (uid_1st
[selected
]>>16); 
 613                                 newBlock0
[2] = 0xFF & (uid_1st
[selected
]>>8); 
 614                                 newBlock0
[3] = 0xFF & (uid_1st
[selected
]); 
 615                                 newBlock0
[4] = newBlock0
[0]^newBlock0
[1]^newBlock0
[2]^newBlock0
[3]; 
 616                                 // arg0 = needWipe, arg1 = workFlags, arg2 = blockNo, datain 
 617                                 MifareCSetBlock(0, 0xFF,0, newBlock0
); 
 618                                 MifareCGetBlock(0x3F, 1, 0, testBlock0
); 
 619                                 if (memcmp(testBlock0
,newBlock0
,16)==0) 
 621                                         DbpString("Cloned successfull!"); 
 622                                         cardRead
[selected
] = false; // Only if the card was cloned successfully should we clear it 
 625                                         selected 
= (selected
+1) % OPTS
; 
 628                                         Dbprintf("Clone failed. Back to replay mode on bank[%d]", selected
); 
 633                         LED(selected 
+ 1, 0); 
 636                 // Change where to record (or begin playing) 
 637                 else if (playing
) // button_pressed == BUTTON_SINGLE_CLICK && cardRead[selected]) 
 640                         LED(selected 
+ 1, 0); 
 642                         // Begin transmitting 
 644                         DbpString("Playing"); 
 647                                 int button_action 
= BUTTON_HELD(1000); 
 648                                 if (button_action 
== 0) { // No button action, proceed with sim 
 649                                         uint8_t data
[512] = {0}; // in case there is a read command received we shouldn't break 
 650                                         Dbprintf("Simulating ISO14443a tag with uid[0]: %08x, uid[1]: %08x [Bank: %u]", uid_1st
[selected
],uid_2nd
[selected
],selected
); 
 651                                         if (hi14a_card
[selected
].sak 
== 8 && hi14a_card
[selected
].atqa
[0] == 4 && hi14a_card
[selected
].atqa
[1] == 0) { 
 652                                                 DbpString("Mifare Classic"); 
 653                                                 SimulateIso14443aTag(1,uid_1st
[selected
], uid_2nd
[selected
], data
); // Mifare Classic 
 655                                         else if (hi14a_card
[selected
].sak 
== 0 && hi14a_card
[selected
].atqa
[0] == 0x44 && hi14a_card
[selected
].atqa
[1] == 0) { 
 656                                                 DbpString("Mifare Ultralight"); 
 657                                                 SimulateIso14443aTag(2,uid_1st
[selected
],uid_2nd
[selected
],data
); // Mifare Ultralight 
 659                                         else if (hi14a_card
[selected
].sak 
== 20 && hi14a_card
[selected
].atqa
[0] == 0x44 && hi14a_card
[selected
].atqa
[1] == 3) { 
 660                                                 DbpString("Mifare DESFire"); 
 661                                                 SimulateIso14443aTag(3,uid_1st
[selected
],uid_2nd
[selected
],data
); // Mifare DESFire 
 664                                                 Dbprintf("Unrecognized tag type -- defaulting to Mifare Classic emulation"); 
 665                                                 SimulateIso14443aTag(1,uid_1st
[selected
], uid_2nd
[selected
], data
); 
 668                                 else if (button_action 
== BUTTON_SINGLE_CLICK
) { 
 669                                         selected 
= (selected 
+ 1) % OPTS
; 
 670                                         Dbprintf("Done playing. Switching to record mode on bank %d",selected
); 
 674                                 else if (button_action 
== BUTTON_HOLD
) { 
 675                                         Dbprintf("Playtime over. Begin cloning..."); 
 682                         /* We pressed a button so ignore it here with a delay */ 
 685                         LED(selected 
+ 1, 0); 
 689 #elif WITH_LF_StandAlone 
 690 // samy's sniff and repeat routine 
 694         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 696         int tops
[OPTS
], high
[OPTS
], low
[OPTS
]; 
 701         // Turn on selected LED 
 702         LED(selected 
+ 1, 0); 
 709                 // Was our button held down or pressed? 
 710                 int button_pressed 
= BUTTON_HELD(1000); 
 713                 // Button was held for a second, begin recording 
 714                 if (button_pressed 
> 0 && cardRead 
== 0) 
 717                         LED(selected 
+ 1, 0); 
 721                         DbpString("Starting recording"); 
 723                         // wait for button to be released 
 724                         while(BUTTON_PRESS()) 
 727                         /* need this delay to prevent catching some weird data */ 
 730                         CmdHIDdemodFSK(1, &tops
[selected
], &high
[selected
], &low
[selected
], 0); 
 731                         if (tops
[selected
] > 0) 
 732                                 Dbprintf("Recorded %x %x%08x%08x", selected
, tops
[selected
], high
[selected
], low
[selected
]); 
 734                                 Dbprintf("Recorded %x %x%08x", selected
, high
[selected
], low
[selected
]); 
 737                         LED(selected 
+ 1, 0); 
 738                         // Finished recording 
 740                         // If we were previously playing, set playing off 
 741                         // so next button push begins playing what we recorded 
 748                 else if (button_pressed 
> 0 && cardRead 
== 1) 
 751                                         LED(selected 
+ 1, 0); 
 755                                         if (tops
[selected
] > 0) 
 756                                                 Dbprintf("Cloning %x %x%08x%08x", selected
, tops
[selected
], high
[selected
], low
[selected
]); 
 758                                                 Dbprintf("Cloning %x %x%08x", selected
, high
[selected
], low
[selected
]); 
 760                                         // wait for button to be released 
 761                                         while(BUTTON_PRESS()) 
 764                                         /* need this delay to prevent catching some weird data */ 
 767                                         CopyHIDtoT55x7(tops
[selected
] & 0x000FFFFF, high
[selected
], low
[selected
], (tops
[selected
] != 0 && ((high
[selected
]& 0xFFFFFFC0) != 0)), 0x1D); 
 768                                         if (tops
[selected
] > 0) 
 769                                                 Dbprintf("Cloned %x %x%08x%08x", selected
, tops
[selected
], high
[selected
], low
[selected
]); 
 771                                                 Dbprintf("Cloned %x %x%08x", selected
, high
[selected
], low
[selected
]); 
 774                                         LED(selected 
+ 1, 0); 
 775                                         // Finished recording 
 777                                         // If we were previously playing, set playing off 
 778                                         // so next button push begins playing what we recorded 
 785                 // Change where to record (or begin playing) 
 786                 else if (button_pressed
) 
 788                         // Next option if we were previously playing 
 790                                 selected 
= (selected 
+ 1) % OPTS
; 
 794                         LED(selected 
+ 1, 0); 
 796                         // Begin transmitting 
 800                                 DbpString("Playing"); 
 801                                 // wait for button to be released 
 802                                 while(BUTTON_PRESS()) 
 804                                 if (tops
[selected
] > 0) 
 805                                         Dbprintf("%x %x%08x%08x", selected
, tops
[selected
], high
[selected
], low
[selected
]); 
 807                                         Dbprintf("%x %x%08x", selected
, high
[selected
], low
[selected
]); 
 809                                 CmdHIDsimTAG(tops
[selected
], high
[selected
], low
[selected
], 0); 
 810                                 DbpString("Done playing"); 
 811                                 if (BUTTON_HELD(1000) > 0) 
 813                                         DbpString("Exiting"); 
 818                                 /* We pressed a button so ignore it here with a delay */ 
 821                                 // when done, we're done playing, move to next option 
 822                                 selected 
= (selected 
+ 1) % OPTS
; 
 825                                 LED(selected 
+ 1, 0); 
 828                                 while(BUTTON_PRESS()) 
 837 Listen and detect an external reader. Determine the best location 
 841 Inside the ListenReaderField() function, there is two mode. 
 842 By default, when you call the function, you will enter mode 1. 
 843 If you press the PM3 button one time, you will enter mode 2. 
 844 If you press the PM3 button a second time, you will exit the function. 
 846 DESCRIPTION OF MODE 1: 
 847 This mode just listens for an external reader field and lights up green 
 848 for HF and/or red for LF. This is the original mode of the detectreader 
 851 DESCRIPTION OF MODE 2: 
 852 This mode will visually represent, using the LEDs, the actual strength of the 
 853 current compared to the maximum current detected. Basically, once you know 
 854 what kind of external reader is present, it will help you spot the best location to place 
 855 your antenna. You will probably not get some good results if there is a LF and a HF reader 
 856 at the same place! :-) 
 860 static const char LIGHT_SCHEME
[] = { 
 861                 0x0, /* ----     | No field detected */ 
 862                 0x1, /* X---     | 14% of maximum current detected */ 
 863                 0x2, /* -X--     | 29% of maximum current detected */ 
 864                 0x4, /* --X-     | 43% of maximum current detected */ 
 865                 0x8, /* ---X     | 57% of maximum current detected */ 
 866                 0xC, /* --XX     | 71% of maximum current detected */ 
 867                 0xE, /* -XXX     | 86% of maximum current detected */ 
 868                 0xF, /* XXXX     | 100% of maximum current detected */ 
 870 static const int LIGHT_LEN 
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]); 
 872 void ListenReaderField(int limit
) 
 874         int lf_av
, lf_av_new
=0, lf_baseline
= 0, lf_max
; 
 875         int hf_av
, hf_av_new
=0,  hf_baseline
= 0, hf_max
; 
 876         int mode
=1, display_val
, display_max
, i
; 
 880 #define REPORT_CHANGE_PERCENT      5    // report new values only if they have changed at least by REPORT_CHANGE_PERCENT 
 881 #define MIN_HF_FIELD             300    // in mode 1 signal HF field greater than MIN_HF_FIELD above baseline 
 882 #define MIN_LF_FIELD            1200    // in mode 1 signal LF field greater than MIN_LF_FIELD above baseline 
 885         // switch off FPGA - we don't want to measure our own signal 
 886         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 887         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 891         lf_av 
= lf_max 
= AvgAdc_Voltage_LF(); 
 893         if(limit 
!= HF_ONLY
) { 
 894                 Dbprintf("LF 125/134kHz Baseline: %dmV", lf_av
); 
 898         hf_av 
= hf_max 
= AvgAdc_Voltage_HF(); 
 900         if (limit 
!= LF_ONLY
) { 
 901                 Dbprintf("HF 13.56MHz Baseline: %dmV", hf_av
); 
 907                 if (BUTTON_PRESS()) { 
 911                                         DbpString("Signal Strength Mode"); 
 915                                         DbpString("Stopped"); 
 920                         while (BUTTON_PRESS()); 
 924                 if (limit 
!= HF_ONLY
) { 
 926                                 if (lf_av 
- lf_baseline 
> MIN_LF_FIELD
) 
 932                         lf_av_new 
= AvgAdc_Voltage_LF(); 
 933                         // see if there's a significant change 
 934                         if (ABS((lf_av 
- lf_av_new
)*100/(lf_av
?lf_av
:1)) > REPORT_CHANGE_PERCENT
) { 
 935                                 Dbprintf("LF 125/134kHz Field Change: %5dmV", lf_av_new
); 
 942                 if (limit 
!= LF_ONLY
) { 
 944                                 if (hf_av 
- hf_baseline 
> MIN_HF_FIELD
) 
 950                         hf_av_new 
= AvgAdc_Voltage_HF(); 
 952                         // see if there's a significant change 
 953                         if (ABS((hf_av 
- hf_av_new
)*100/(hf_av
?hf_av
:1)) > REPORT_CHANGE_PERCENT
) { 
 954                                 Dbprintf("HF 13.56MHz Field Change: %5dmV", hf_av_new
); 
 962                         if (limit 
== LF_ONLY
) { 
 964                                 display_max 
= lf_max
; 
 965                         } else if (limit 
== HF_ONLY
) { 
 967                                 display_max 
= hf_max
; 
 968                         } else { /* Pick one at random */ 
 969                                 if( (hf_max 
- hf_baseline
) > (lf_max 
- lf_baseline
) ) { 
 971                                         display_max 
= hf_max
; 
 974                                         display_max 
= lf_max
; 
 977                         for (i
=0; i
<LIGHT_LEN
; i
++) { 
 978                                 if (display_val 
>= ((display_max
/LIGHT_LEN
)*i
) && display_val 
<= ((display_max
/LIGHT_LEN
)*(i
+1))) { 
 979                                         if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF(); 
 980                                         if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF(); 
 981                                         if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF(); 
 982                                         if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF(); 
 990 void UsbPacketReceived(uint8_t *packet
, int len
) 
 992         UsbCommand 
*c 
= (UsbCommand 
*)packet
; 
 994 //  Dbprintf("received %d bytes, with command: 0x%04x and args: %d %d %d",len,c->cmd,c->arg[0],c->arg[1],c->arg[2]); 
 998                 case CMD_SET_LF_SAMPLING_CONFIG
: 
 999                         setSamplingConfig((sample_config 
*) c
->d
.asBytes
); 
1001                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
1002                         cmd_send(CMD_ACK
,SampleLF(c
->arg
[0], c
->arg
[1]),0,0,0,0); 
1004                 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
1005                         ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
1007                 case CMD_LF_SNOOP_RAW_ADC_SAMPLES
: 
1008                         cmd_send(CMD_ACK
,SnoopLF(),0,0,0,0); 
1010                 case CMD_HID_DEMOD_FSK
: 
1011                         CmdHIDdemodFSK(c
->arg
[0], 0, 0, 0, 1); 
1013                 case CMD_HID_SIM_TAG
: 
1014                         CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], c
->arg
[2], 1); 
1016                 case CMD_FSK_SIM_TAG
: 
1017                         CmdFSKsimTAG(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1019                 case CMD_ASK_SIM_TAG
: 
1020                         CmdASKsimTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1022                 case CMD_PSK_SIM_TAG
: 
1023                         CmdPSKsimTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1025                 case CMD_HID_CLONE_TAG
: 
1026                         CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0], 0x1D); 
1028                 case CMD_PARADOX_CLONE_TAG
: 
1029                         // Paradox cards are the same as HID, with a different preamble, so we can reuse the same function 
1030                         CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0], 0x0F); 
1032                 case CMD_IO_DEMOD_FSK
: 
1033                         CmdIOdemodFSK(c
->arg
[0], 0, 0, 1); 
1035                 case CMD_IO_CLONE_TAG
: 
1036                         CopyIOtoT55x7(c
->arg
[0], c
->arg
[1]); 
1038                 case CMD_EM410X_DEMOD
: 
1039                         CmdEM410xdemod(c
->arg
[0], 0, 0, 1); 
1041                 case CMD_EM410X_WRITE_TAG
: 
1042                         WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
1044                 case CMD_READ_TI_TYPE
: 
1047                 case CMD_WRITE_TI_TYPE
: 
1048                         WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]); 
1050                 case CMD_SIMULATE_TAG_125K
: 
1052                         SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1); 
1055                 case CMD_LF_SIMULATE_BIDIR
: 
1056                         SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]); 
1058                 case CMD_INDALA_CLONE_TAG
: 
1059                         CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);                                       
1061                 case CMD_INDALA_CLONE_TAG_L
: 
1062                         CopyIndala224toT55x7(c
->d
.asDwords
[0], c
->d
.asDwords
[1], c
->d
.asDwords
[2], c
->d
.asDwords
[3], c
->d
.asDwords
[4], c
->d
.asDwords
[5], c
->d
.asDwords
[6]); 
1064                 case CMD_T55XX_READ_BLOCK
: 
1065                         T55xxReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
1067                 case CMD_T55XX_WRITE_BLOCK
: 
1068                         T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
1070                 case CMD_T55XX_WAKEUP
: 
1071                         T55xxWakeUp(c
->arg
[0]); 
1073                 case CMD_T55XX_RESET_READ
: 
1076                 case CMD_PCF7931_READ
: 
1079                 case CMD_PCF7931_WRITE
: 
1080                         WritePCF7931(c
->d
.asBytes
[0],c
->d
.asBytes
[1],c
->d
.asBytes
[2],c
->d
.asBytes
[3],c
->d
.asBytes
[4],c
->d
.asBytes
[5],c
->d
.asBytes
[6], c
->d
.asBytes
[9], c
->d
.asBytes
[7]-128,c
->d
.asBytes
[8]-128, c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
1082                 case CMD_PCF7931_BRUTEFORCE
: 
1083                         BruteForcePCF7931(c
->arg
[0], (c
->arg
[1] & 0xFF), c
->d
.asBytes
[9], c
->d
.asBytes
[7]-128,c
->d
.asBytes
[8]-128); 
1085                 case CMD_EM4X_READ_WORD
: 
1086                         EM4xReadWord(c
->arg
[0], c
->arg
[1],c
->arg
[2]); 
1088                 case CMD_EM4X_WRITE_WORD
: 
1089                         EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
1091                 case CMD_EM4X_PROTECT
: 
1092                         EM4xProtect(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
1094                 case CMD_AWID_DEMOD_FSK
: // Set realtime AWID demodulation 
1095                         CmdAWIDdemodFSK(c
->arg
[0], 0, 0, 1); 
1097                 case CMD_VIKING_CLONE_TAG
: 
1098                         CopyVikingtoT55xx(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
1106                 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type 
1107                         SnoopHitag(c
->arg
[0]); 
1109                 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content 
1110                         SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
); 
1112                 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function 
1113                         ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
); 
1115                 case CMD_SIMULATE_HITAG_S
:// Simulate Hitag s tag, args = memory content 
1116                         SimulateHitagSTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
); 
1118                 case CMD_TEST_HITAGS_TRACES
:// Tests every challenge within the given file 
1119                         check_challenges_cmd((bool)c
->arg
[0], (byte_t
*)c
->d
.asBytes
, (uint8_t)c
->arg
[1]); 
1121                 case CMD_READ_HITAG_S
://Reader for only Hitag S tags, args = key or challenge 
1122                         ReadHitagSCmd((hitag_function
)c
->arg
[0], (hitag_data
*)c
->d
.asBytes
, (uint8_t)c
->arg
[1], (uint8_t)c
->arg
[2], false); 
1124                 case CMD_READ_HITAG_S_BLK
: 
1125                         ReadHitagSCmd((hitag_function
)c
->arg
[0], (hitag_data
*)c
->d
.asBytes
, (uint8_t)c
->arg
[1], (uint8_t)c
->arg
[2], true); 
1127                 case CMD_WR_HITAG_S
://writer for Hitag tags args=data to write,page and key or challenge 
1128                         if ((hitag_function
)c
->arg
[0] < 10) { 
1129                                 WritePageHitagS((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
,c
->arg
[2]); 
1131                         else if ((hitag_function
)c
->arg
[0] >= 10) { 
1132                           WriterHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
, c
->arg
[2]); 
1137 #ifdef WITH_ISO15693 
1138                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
: 
1139                         AcquireRawAdcSamplesIso15693(); 
1142                 case CMD_SNOOP_ISO_15693
: 
1146                 case CMD_ISO_15693_COMMAND
: 
1147                         DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
1150                 case CMD_ISO_15693_FIND_AFI
: 
1151                         BruteforceIso15693Afi(c
->arg
[0]); 
1154                 case CMD_ISO_15693_DEBUG
: 
1155                         SetDebugIso15693(c
->arg
[0]); 
1158                 case CMD_READER_ISO_15693
: 
1159                         ReaderIso15693(c
->arg
[0]); 
1162                 case CMD_SIMTAG_ISO_15693
: 
1163                         SimTagIso15693(c
->arg
[0], c
->d
.asBytes
); 
1166                 case CMD_CSETUID_ISO_15693
: 
1167                         SetTag15693Uid(c
->d
.asBytes
); 
1172                 case CMD_SIMULATE_TAG_LEGIC_RF
: 
1173                         LegicRfSimulate(c
->arg
[0]); 
1176                 case CMD_WRITER_LEGIC_RF
: 
1177                         LegicRfWriter(c
->arg
[1], c
->arg
[0]); 
1180                 case CMD_READER_LEGIC_RF
: 
1181                         LegicRfReader(c
->arg
[0], c
->arg
[1]); 
1185 #ifdef WITH_ISO14443b 
1186                 case CMD_READ_SRI512_TAG
: 
1187                         ReadSTMemoryIso14443b(0x0F); 
1189                 case CMD_READ_SRIX4K_TAG
: 
1190                         ReadSTMemoryIso14443b(0x7F); 
1192                 case CMD_SNOOP_ISO_14443B
: 
1195                 case CMD_SIMULATE_TAG_ISO_14443B
: 
1196                         SimulateIso14443bTag(); 
1198                 case CMD_ISO_14443B_COMMAND
: 
1199                         SendRawCommand14443B(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
1203 #ifdef WITH_ISO14443a 
1204                 case CMD_SNOOP_ISO_14443a
: 
1205                         SnoopIso14443a(c
->arg
[0]); 
1207                 case CMD_READER_ISO_14443a
: 
1210                 case CMD_SIMULATE_TAG_ISO_14443a
: 
1211                         SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);  // ## Simulate iso14443a tag - pass tag type & UID 
1214                 case CMD_EPA_PACE_COLLECT_NONCE
: 
1215                         EPA_PACE_Collect_Nonce(c
); 
1217                 case CMD_EPA_PACE_REPLAY
: 
1221                 case CMD_READER_MIFARE
: 
1222                         ReaderMifare(c
->arg
[0]); 
1224                 case CMD_MIFARE_READBL
: 
1225                         MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1227                 case CMD_MIFAREU_READBL
: 
1228                         MifareUReadBlock(c
->arg
[0],c
->arg
[1], c
->d
.asBytes
); 
1230                 case CMD_MIFAREUC_AUTH
: 
1231                         MifareUC_Auth(c
->arg
[0],c
->d
.asBytes
); 
1233                 case CMD_MIFAREU_READCARD
: 
1234                         MifareUReadCard(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1236                 case CMD_MIFAREUC_SETPWD
:  
1237                         MifareUSetPwd(c
->arg
[0], c
->d
.asBytes
); 
1239                 case CMD_MIFARE_READSC
: 
1240                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1242                 case CMD_MIFARE_WRITEBL
: 
1243                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1245                 //case CMD_MIFAREU_WRITEBL_COMPAT: 
1246                         //MifareUWriteBlockCompat(c->arg[0], c->d.asBytes); 
1248                 case CMD_MIFAREU_WRITEBL
: 
1249                         MifareUWriteBlock(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
); 
1251                 case CMD_MIFARE_ACQUIRE_ENCRYPTED_NONCES
: 
1252                         MifareAcquireEncryptedNonces(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1254                 case CMD_MIFARE_NESTED
: 
1255                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1257                 case CMD_MIFARE_CHKKEYS
: 
1258                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1260                 case CMD_SIMULATE_MIFARE_CARD
: 
1261                         MifareSim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1265                 case CMD_MIFARE_SET_DBGMODE
: 
1266                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1268                 case CMD_MIFARE_EML_MEMCLR
: 
1269                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1271                 case CMD_MIFARE_EML_MEMSET
: 
1272                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1274                 case CMD_MIFARE_EML_MEMGET
: 
1275                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1277                 case CMD_MIFARE_EML_CARDLOAD
: 
1278                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1281                 // Work with "magic Chinese" card 
1282                 case CMD_MIFARE_CWIPE
: 
1283                         MifareCWipe(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1285                 case CMD_MIFARE_CSETBLOCK
: 
1286                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1288                 case CMD_MIFARE_CGETBLOCK
: 
1289                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1291                 case CMD_MIFARE_CIDENT
: 
1296                 case CMD_MIFARE_SNIFFER
: 
1297                         SniffMifare(c
->arg
[0]); 
1303                 // Makes use of ISO14443a FPGA Firmware 
1304                 case CMD_SNOOP_ICLASS
: 
1307                 case CMD_SIMULATE_TAG_ICLASS
: 
1308                         SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
1310                 case CMD_READER_ICLASS
: 
1311                         ReaderIClass(c
->arg
[0]); 
1313                 case CMD_READER_ICLASS_REPLAY
: 
1314                         ReaderIClass_Replay(c
->arg
[0], c
->d
.asBytes
); 
1316                 case CMD_ICLASS_EML_MEMSET
: 
1317                         emlSet(c
->d
.asBytes
,c
->arg
[0], c
->arg
[1]); 
1319                 case CMD_ICLASS_WRITEBLOCK
: 
1320                         iClass_WriteBlock(c
->arg
[0], c
->d
.asBytes
); 
1322                 case CMD_ICLASS_READCHECK
:  // auth step 1 
1323                         iClass_ReadCheck(c
->arg
[0], c
->arg
[1]); 
1325                 case CMD_ICLASS_READBLOCK
: 
1326                         iClass_ReadBlk(c
->arg
[0]); 
1328                 case CMD_ICLASS_AUTHENTICATION
: //check 
1329                         iClass_Authentication(c
->d
.asBytes
); 
1331                 case CMD_ICLASS_DUMP
: 
1332                         iClass_Dump(c
->arg
[0], c
->arg
[1]); 
1334                 case CMD_ICLASS_CLONE
: 
1335                         iClass_Clone(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
); 
1340                 case CMD_HF_SNIFFER
: 
1341                         HfSnoop(c
->arg
[0], c
->arg
[1]); 
1348 #ifdef WITH_SMARTCARD 
1349                 case CMD_SMART_ATR
: { 
1353                 case CMD_SMART_SETCLOCK
:{ 
1354                         SmartCardSetClock(c
->arg
[0]); 
1357                 case CMD_SMART_RAW
: { 
1358                         SmartCardRaw(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
); 
1361                 case CMD_SMART_UPLOAD
: { 
1362                         // upload file from client 
1363                         uint8_t *mem 
= BigBuf_get_addr(); 
1364                         memcpy( mem 
+ c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
); 
1365                         cmd_send(CMD_ACK
,1,0,0,0,0); 
1368                 case CMD_SMART_UPGRADE
: { 
1369                         SmartCardUpgrade(c
->arg
[0]); 
1374                 case CMD_BUFF_CLEAR
: 
1378                 case CMD_MEASURE_ANTENNA_TUNING
: 
1379                         MeasureAntennaTuning(c
->arg
[0]); 
1382                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
1383                         MeasureAntennaTuningHf(); 
1386                 case CMD_LISTEN_READER_FIELD
: 
1387                         ListenReaderField(c
->arg
[0]); 
1390                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
1391                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1393                         LED_D_OFF(); // LED D indicates field ON or OFF 
1396                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: 
1398                         uint8_t *BigBuf 
= BigBuf_get_addr(); 
1399                         for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
1400                                 size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
1401                                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,BigBuf_get_traceLen(),BigBuf
+c
->arg
[0]+i
,len
); 
1403                         // Trigger a finish downloading signal with an ACK frame 
1404                         cmd_send(CMD_ACK
,1,0,BigBuf_get_traceLen(),getSamplingConfig(),sizeof(sample_config
)); 
1408                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
1409                         // iceman; since changing fpga_bitstreams clears bigbuff, Its better to call it before. 
1410                         // to be able to use this one for uploading data to device  
1411                         // arg1 = 0 upload for LF usage  
1412                         //        1 upload for HF usage 
1414                                 FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
1416                                 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1418                         uint8_t *b 
= BigBuf_get_addr(); 
1419                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
); 
1420                         cmd_send(CMD_ACK
,0,0,0,0,0); 
1427                 case CMD_SET_LF_DIVISOR
: 
1428                         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
1429                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
1432                 case CMD_SET_ADC_MUX
: 
1434                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
1435                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
1436                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
1437                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
1448                         cmd_send(CMD_ACK
,0,0,0,0,0); 
1458                 case CMD_SETUP_WRITE
: 
1459                 case CMD_FINISH_WRITE
: 
1460                 case CMD_HARDWARE_RESET
: 
1464                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
1466                                 // We're going to reset, and the bootrom will take control. 
1470                 case CMD_START_FLASH
: 
1471                         if(common_area
.flags
.bootrom_present
) { 
1472                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
1475                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
1479                 case CMD_DEVICE_INFO
: { 
1480                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
1481                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
1482                         cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);      
1486                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
1491 void  __attribute__((noreturn
)) AppMain(void) 
1495         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
1496                 /* Initialize common area */ 
1497                 memset(&common_area
, 0, sizeof(common_area
)); 
1498                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
1499                 common_area
.version 
= 1; 
1501         common_area
.flags
.osimage_present 
= 1; 
1508         // The FPGA gets its clock from us from PCK0 output, so set that up. 
1509         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_PCK0
; 
1510         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_PCK0
; 
1511         AT91C_BASE_PMC
->PMC_SCER 
= AT91C_PMC_PCK0
; 
1512         // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz 
1513         AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK 
| 
1514                 AT91C_PMC_PRES_CLK_4
; //  4 for 24Mhz pck0, 2 for 48 MHZ pck0 
1515         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_PCK0
; 
1518         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SWRST
; 
1520         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
1522         // Load the FPGA image, which we have stored in our flash. 
1523         // (the HF version by default) 
1524         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1532   byte_t rx
[sizeof(UsbCommand
)]; 
1537       rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1539         UsbPacketReceived(rx
,rx_len
); 
1544 #ifdef WITH_LF_StandAlone 
1545 #ifndef WITH_ISO14443a_StandAlone 
1546                 if (BUTTON_HELD(1000) > 0) 
1550 #ifdef WITH_ISO14443a 
1551 #ifdef WITH_ISO14443a_StandAlone 
1552                 if (BUTTON_HELD(1000) > 0) 
1553                         StandAloneMode14a();