1   //----------------------------------------------------------------------------- 
   2 // Merlok - June 2011, 2012 
   3 // Gerhard de Koning Gans - May 2008 
   4 // Hagen Fritsch - June 2010 
   6 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   7 // at your option, any later version. See the LICENSE.txt file for the text of 
   9 //----------------------------------------------------------------------------- 
  10 // Routines to support ISO 14443 type A. 
  11 //----------------------------------------------------------------------------- 
  12 #include "iso14443a.h" 
  14 static uint32_t iso14a_timeout
; 
  17 // the block number for the ISO14443-4 PCB 
  18 static uint8_t iso14_pcb_blocknum 
= 0; 
  20 static uint8_t* free_buffer_pointer
; 
  25 // minimum time between the start bits of consecutive transfers from reader to tag: 7000 carrier (13.56Mhz) cycles 
  26 #define REQUEST_GUARD_TIME (7000/16 + 1) 
  27 // minimum time between last modulation of tag and next start bit from reader to tag: 1172 carrier cycles  
  28 #define FRAME_DELAY_TIME_PICC_TO_PCD (1172/16 + 1)  
  29 // bool LastCommandWasRequest = FALSE; 
  32 // Total delays including SSC-Transfers between ARM and FPGA. These are in carrier clock cycles (1/13,56MHz) 
  34 // When the PM acts as reader and is receiving tag data, it takes 
  35 // 3 ticks delay in the AD converter 
  36 // 16 ticks until the modulation detector completes and sets curbit 
  37 // 8 ticks until bit_to_arm is assigned from curbit 
  38 // 8*16 ticks for the transfer from FPGA to ARM 
  39 // 4*16 ticks until we measure the time 
  40 // - 8*16 ticks because we measure the time of the previous transfer  
  41 #define DELAY_AIR2ARM_AS_READER (3 + 16 + 8 + 8*16 + 4*16 - 8*16)  
  43 // When the PM acts as a reader and is sending, it takes 
  44 // 4*16 ticks until we can write data to the sending hold register 
  45 // 8*16 ticks until the SHR is transferred to the Sending Shift Register 
  46 // 8 ticks until the first transfer starts 
  47 // 8 ticks later the FPGA samples the data 
  48 // 1 tick to assign mod_sig_coil 
  49 #define DELAY_ARM2AIR_AS_READER (4*16 + 8*16 + 8 + 8 + 1) 
  51 // When the PM acts as tag and is receiving it takes 
  52 // 2 ticks delay in the RF part (for the first falling edge), 
  53 // 3 ticks for the A/D conversion, 
  54 // 8 ticks on average until the start of the SSC transfer, 
  55 // 8 ticks until the SSC samples the first data 
  56 // 7*16 ticks to complete the transfer from FPGA to ARM 
  57 // 8 ticks until the next ssp_clk rising edge 
  58 // 4*16 ticks until we measure the time  
  59 // - 8*16 ticks because we measure the time of the previous transfer  
  60 #define DELAY_AIR2ARM_AS_TAG (2 + 3 + 8 + 8 + 7*16 + 8 + 4*16 - 8*16) 
  62 // The FPGA will report its internal sending delay in 
  63 uint16_t FpgaSendQueueDelay
; 
  64 // the 5 first bits are the number of bits buffered in mod_sig_buf 
  65 // the last three bits are the remaining ticks/2 after the mod_sig_buf shift 
  66 #define DELAY_FPGA_QUEUE (FpgaSendQueueDelay<<1) 
  68 // When the PM acts as tag and is sending, it takes 
  69 // 4*16 ticks until we can write data to the sending hold register 
  70 // 8*16 ticks until the SHR is transferred to the Sending Shift Register 
  71 // 8 ticks until the first transfer starts 
  72 // 8 ticks later the FPGA samples the data 
  73 // + a varying number of ticks in the FPGA Delay Queue (mod_sig_buf) 
  74 // + 1 tick to assign mod_sig_coil 
  75 #define DELAY_ARM2AIR_AS_TAG (4*16 + 8*16 + 8 + 8 + DELAY_FPGA_QUEUE + 1) 
  77 // When the PM acts as sniffer and is receiving tag data, it takes 
  78 // 3 ticks A/D conversion 
  79 // 14 ticks to complete the modulation detection 
  80 // 8 ticks (on average) until the result is stored in to_arm 
  81 // + the delays in transferring data - which is the same for 
  82 // sniffing reader and tag data and therefore not relevant 
  83 #define DELAY_TAG_AIR2ARM_AS_SNIFFER (3 + 14 + 8)  
  85 // When the PM acts as sniffer and is receiving reader data, it takes 
  86 // 2 ticks delay in analogue RF receiver (for the falling edge of the  
  87 // start bit, which marks the start of the communication) 
  88 // 3 ticks A/D conversion 
  89 // 8 ticks on average until the data is stored in to_arm. 
  90 // + the delays in transferring data - which is the same for 
  91 // sniffing reader and tag data and therefore not relevant 
  92 #define DELAY_READER_AIR2ARM_AS_SNIFFER (2 + 3 + 8)  
  94 //variables used for timing purposes: 
  95 //these are in ssp_clk cycles: 
  96 static uint32_t NextTransferTime
; 
  97 static uint32_t LastTimeProxToAirStart
; 
  98 static uint32_t LastProxToAirDuration
; 
 100 // CARD TO READER - manchester 
 101 // Sequence D: 11110000 modulation with subcarrier during first half 
 102 // Sequence E: 00001111 modulation with subcarrier during second half 
 103 // Sequence F: 00000000 no modulation with subcarrier 
 104 // READER TO CARD - miller 
 105 // Sequence X: 00001100 drop after half a period 
 106 // Sequence Y: 00000000 no drop 
 107 // Sequence Z: 11000000 drop at start 
 115 void iso14a_set_trigger(bool enable
) { 
 119 void iso14a_set_timeout(uint32_t timeout
) { 
 120         iso14a_timeout 
= timeout
; 
 121         if(MF_DBGLEVEL 
>= 3) Dbprintf("ISO14443A Timeout set to %ld (%dms)", iso14a_timeout
, iso14a_timeout 
/ 106); 
 124 void iso14a_set_ATS_timeout(uint8_t *ats
) { 
 129         if (ats
[0] > 1) {                                                       // there is a format byte T0 
 130                 if ((ats
[1] & 0x20) == 0x20) {                  // there is an interface byte TB(1) 
 132                         if ((ats
[1] & 0x10) == 0x10)            // there is an interface byte TA(1) preceding TB(1) 
 137                         fwi 
= (tb1 
& 0xf0) >> 4;                        // frame waiting indicator (FWI) 
 138                         fwt 
= 256 * 16 * (1 << fwi
);            // frame waiting time (FWT) in 1/fc 
 139                         //fwt = 4096 * (1 << fwi); 
 141                         iso14a_set_timeout(fwt
/(8*16)); 
 142                         //iso14a_set_timeout(fwt/128); 
 147 //----------------------------------------------------------------------------- 
 148 // Generate the parity value for a byte sequence 
 150 //----------------------------------------------------------------------------- 
 151 void GetParity(const uint8_t *pbtCmd
, uint16_t iLen
, uint8_t *par
) { 
 152         uint16_t paritybit_cnt 
= 0; 
 153         uint16_t paritybyte_cnt 
= 0; 
 154         uint8_t parityBits 
= 0; 
 156         for (uint16_t i 
= 0; i 
< iLen
; i
++) { 
 157                 // Generate the parity bits 
 158                 parityBits 
|= ((oddparity8(pbtCmd
[i
])) << (7-paritybit_cnt
)); 
 159                 if (paritybit_cnt 
== 7) { 
 160                         par
[paritybyte_cnt
] = parityBits
;       // save 8 Bits parity 
 161                         parityBits 
= 0;                                         // and advance to next Parity Byte 
 169         // save remaining parity bits 
 170         par
[paritybyte_cnt
] = parityBits
;        
 173 void AppendCrc14443a(uint8_t* data
, int len
) { 
 174         ComputeCrc14443(CRC_14443_A
,data
,len
,data
+len
,data
+len
+1); 
 177 //============================================================================= 
 178 // ISO 14443 Type A - Miller decoder 
 179 //============================================================================= 
 181 // This decoder is used when the PM3 acts as a tag. 
 182 // The reader will generate "pauses" by temporarily switching of the field.  
 183 // At the PM3 antenna we will therefore measure a modulated antenna voltage.  
 184 // The FPGA does a comparison with a threshold and would deliver e.g.: 
 185 // ........  1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1  ....... 
 186 // The Miller decoder needs to identify the following sequences: 
 187 // 2 (or 3) ticks pause followed by 6 (or 5) ticks unmodulated:         pause at beginning - Sequence Z ("start of communication" or a "0") 
 188 // 8 ticks without a modulation:                                                                        no pause - Sequence Y (a "0" or "end of communication" or "no information") 
 189 // 4 ticks unmodulated followed by 2 (or 3) ticks pause:                        pause in second half - Sequence X (a "1") 
 190 // Note 1: the bitstream may start at any time. We therefore need to sync. 
 191 // Note 2: the interpretation of Sequence Y and Z depends on the preceding sequence. 
 192 //----------------------------------------------------------------------------- 
 195 // Lookup-Table to decide if 4 raw bits are a modulation. 
 196 // We accept the following: 
 197 // 0001  -   a 3 tick wide pause 
 198 // 0011  -   a 2 tick wide pause, or a three tick wide pause shifted left 
 199 // 0111  -   a 2 tick wide pause shifted left 
 200 // 1001  -   a 2 tick wide pause shifted right 
 201 const bool Mod_Miller_LUT
[] = { 
 202         FALSE
,  TRUE
, FALSE
, TRUE
,  FALSE
, FALSE
, FALSE
, TRUE
, 
 203         FALSE
,  TRUE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
 
 205 #define IsMillerModulationNibble1(b) (Mod_Miller_LUT[(b & 0x000000F0) >> 4]) 
 206 #define IsMillerModulationNibble2(b) (Mod_Miller_LUT[(b & 0x0000000F)]) 
 209         Uart
.state 
= STATE_UNSYNCD
; 
 211         Uart
.len 
= 0;                                           // number of decoded data bytes 
 212         Uart
.parityLen 
= 0;                                     // number of decoded parity bytes 
 213         Uart
.shiftReg 
= 0;                                      // shiftreg to hold decoded data bits 
 214         Uart
.parityBits 
= 0;                            // holds 8 parity bits 
 223 void UartInit(uint8_t *data
, uint8_t *parity
) { 
 225         Uart
.parity 
= parity
; 
 226         Uart
.fourBits 
= 0x00000000;                     // clear the buffer for 4 Bits 
 230 // use parameter non_real_time to provide a timestamp. Set to 0 if the decoder should measure real time 
 231 static RAMFUNC 
bool MillerDecoding(uint8_t bit
, uint32_t non_real_time
) { 
 232         Uart
.fourBits 
= (Uart
.fourBits 
<< 8) | bit
; 
 234         if (Uart
.state 
== STATE_UNSYNCD
) {                                                                                      // not yet synced 
 235                         Uart
.syncBit 
= 9999;                                                                                            // not set 
 237                 // 00x11111 2|3 ticks pause followed by 6|5 ticks unmodulated           Sequence Z (a "0" or "start of communication") 
 238                 // 11111111 8 ticks unmodulation                                                                        Sequence Y (a "0" or "end of communication" or "no information") 
 239                 // 111100x1 4 ticks unmodulated followed by 2|3 ticks pause                     Sequence X (a "1") 
 241                 // The start bit is one ore more Sequence Y followed by a Sequence Z (... 11111111 00x11111). We need to distinguish from 
 242                 // Sequence X followed by Sequence Y followed by Sequence Z     (111100x1 11111111 00x11111) 
 243                 // we therefore look for a ...xx1111 11111111 00x11111xxxxxx... pattern  
 244                 // (12 '1's followed by 2 '0's, eventually followed by another '0', followed by 5 '1's) 
 246 #define ISO14443A_STARTBIT_MASK         0x07FFEF80              // mask is    00001111 11111111 1110 1111 10000000 
 247 #define ISO14443A_STARTBIT_PATTERN      0x07FF8F80              // pattern is 00001111 11111111 1000 1111 10000000 
 249                 if              ((Uart
.fourBits 
& (ISO14443A_STARTBIT_MASK 
>> 0)) == ISO14443A_STARTBIT_PATTERN 
>> 0) Uart
.syncBit 
= 7; 
 250                 else if ((Uart
.fourBits 
& (ISO14443A_STARTBIT_MASK 
>> 1)) == ISO14443A_STARTBIT_PATTERN 
>> 1) Uart
.syncBit 
= 6; 
 251                 else if ((Uart
.fourBits 
& (ISO14443A_STARTBIT_MASK 
>> 2)) == ISO14443A_STARTBIT_PATTERN 
>> 2) Uart
.syncBit 
= 5; 
 252                 else if ((Uart
.fourBits 
& (ISO14443A_STARTBIT_MASK 
>> 3)) == ISO14443A_STARTBIT_PATTERN 
>> 3) Uart
.syncBit 
= 4; 
 253                 else if ((Uart
.fourBits 
& (ISO14443A_STARTBIT_MASK 
>> 4)) == ISO14443A_STARTBIT_PATTERN 
>> 4) Uart
.syncBit 
= 3; 
 254                 else if ((Uart
.fourBits 
& (ISO14443A_STARTBIT_MASK 
>> 5)) == ISO14443A_STARTBIT_PATTERN 
>> 5) Uart
.syncBit 
= 2; 
 255                 else if ((Uart
.fourBits 
& (ISO14443A_STARTBIT_MASK 
>> 6)) == ISO14443A_STARTBIT_PATTERN 
>> 6) Uart
.syncBit 
= 1; 
 256                 else if ((Uart
.fourBits 
& (ISO14443A_STARTBIT_MASK 
>> 7)) == ISO14443A_STARTBIT_PATTERN 
>> 7) Uart
.syncBit 
= 0; 
 258                 if (Uart
.syncBit 
!= 9999) {                                                                                             // found a sync bit 
 259                         Uart
.startTime 
= non_real_time 
? non_real_time 
: (GetCountSspClk() & 0xfffffff8); 
 260                         Uart
.startTime 
-= Uart
.syncBit
; 
 261                         Uart
.endTime 
= Uart
.startTime
; 
 262                         Uart
.state 
= STATE_START_OF_COMMUNICATION
; 
 266                 if (IsMillerModulationNibble1(Uart
.fourBits 
>> Uart
.syncBit
)) {                  
 267                         if (IsMillerModulationNibble2(Uart
.fourBits 
>> Uart
.syncBit
)) {         // Modulation in both halves - error 
 269                         } else {                                                                                                                        // Modulation in first half = Sequence Z = logic "0" 
 270                                 if (Uart
.state 
== STATE_MILLER_X
) {                                                             // error - must not follow after X 
 274                                         Uart
.shiftReg 
= (Uart
.shiftReg 
>> 1);                                           // add a 0 to the shiftreg 
 275                                         Uart
.state 
= STATE_MILLER_Z
; 
 276                                         Uart
.endTime 
= Uart
.startTime 
+ 8*(9*Uart
.len 
+ Uart
.bitCount 
+ 1) - 6; 
 277                                         if(Uart
.bitCount 
>= 9) {                                                                        // if we decoded a full byte (including parity) 
 278                                                 Uart
.output
[Uart
.len
++] = (Uart
.shiftReg 
& 0xff); 
 279                                                 Uart
.parityBits 
<<= 1;                                                                  // make room for the parity bit 
 280                                                 Uart
.parityBits 
|= ((Uart
.shiftReg 
>> 8) & 0x01);               // store parity bit 
 283                                                 if((Uart
.len
&0x0007) == 0) {                                                    // every 8 data bytes 
 284                                                         Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;        // store 8 parity bits 
 291                         if (IsMillerModulationNibble2(Uart
.fourBits 
>> Uart
.syncBit
)) {         // Modulation second half = Sequence X = logic "1" 
 293                                 Uart
.shiftReg 
= (Uart
.shiftReg 
>> 1) | 0x100;                                   // add a 1 to the shiftreg 
 294                                 Uart
.state 
= STATE_MILLER_X
; 
 295                                 Uart
.endTime 
= Uart
.startTime 
+ 8*(9*Uart
.len 
+ Uart
.bitCount 
+ 1) - 2; 
 296                                 if(Uart
.bitCount 
>= 9) {                                                                                // if we decoded a full byte (including parity) 
 297                                         Uart
.output
[Uart
.len
++] = (Uart
.shiftReg 
& 0xff); 
 298                                         Uart
.parityBits 
<<= 1;                                                                          // make room for the new parity bit 
 299                                         Uart
.parityBits 
|= ((Uart
.shiftReg 
>> 8) & 0x01);                       // store parity bit 
 302                                         if ((Uart
.len
&0x0007) == 0) {                                                           // every 8 data bytes 
 303                                                 Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;                // store 8 parity bits 
 307                         } else {                                                                                                                        // no modulation in both halves - Sequence Y 
 308                                 if (Uart
.state 
== STATE_MILLER_Z 
|| Uart
.state 
== STATE_MILLER_Y
) {     // Y after logic "0" - End of Communication 
 309                                         Uart
.state 
= STATE_UNSYNCD
; 
 310                                         Uart
.bitCount
--;                                                                                        // last "0" was part of EOC sequence 
 311                                         Uart
.shiftReg 
<<= 1;                                                                            // drop it 
 312                                         if(Uart
.bitCount 
> 0) {                                                                         // if we decoded some bits 
 313                                                 Uart
.shiftReg 
>>= (9 - Uart
.bitCount
);                                  // right align them 
 314                                                 Uart
.output
[Uart
.len
++] = (Uart
.shiftReg 
& 0xff);               // add last byte to the output 
 315                                                 Uart
.parityBits 
<<= 1;                                                                  // add a (void) parity bit 
 316                                                 Uart
.parityBits 
<<= (8 - (Uart
.len
&0x0007));                    // left align parity bits 
 317                                                 Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;                // and store it 
 319                                         } else if (Uart
.len 
& 0x0007) {                                                         // there are some parity bits to store 
 320                                                 Uart
.parityBits 
<<= (8 - (Uart
.len
&0x0007));                    // left align remaining parity bits 
 321                                                 Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;                // and store them 
 324                                                 return TRUE
;                                                                                    // we are finished with decoding the raw data sequence 
 326                                                 UartReset();                                                                                    // Nothing received - start over 
 329                                 if (Uart
.state 
== STATE_START_OF_COMMUNICATION
) {                               // error - must not follow directly after SOC 
 331                                 } else {                                                                                                                // a logic "0" 
 333                                         Uart
.shiftReg 
= (Uart
.shiftReg 
>> 1);                                           // add a 0 to the shiftreg 
 334                                         Uart
.state 
= STATE_MILLER_Y
; 
 335                                         if(Uart
.bitCount 
>= 9) {                                                                        // if we decoded a full byte (including parity) 
 336                                                 Uart
.output
[Uart
.len
++] = (Uart
.shiftReg 
& 0xff); 
 337                                                 Uart
.parityBits 
<<= 1;                                                                  // make room for the parity bit 
 338                                                 Uart
.parityBits 
|= ((Uart
.shiftReg 
>> 8) & 0x01);               // store parity bit 
 341                                                 if ((Uart
.len
&0x0007) == 0) {                                                   // every 8 data bytes 
 342                                                         Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;        // store 8 parity bits 
 350     return FALSE
;       // not finished yet, need more data 
 353 //============================================================================= 
 354 // ISO 14443 Type A - Manchester decoder 
 355 //============================================================================= 
 357 // This decoder is used when the PM3 acts as a reader. 
 358 // The tag will modulate the reader field by asserting different loads to it. As a consequence, the voltage 
 359 // at the reader antenna will be modulated as well. The FPGA detects the modulation for us and would deliver e.g. the following: 
 360 // ........ 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ....... 
 361 // The Manchester decoder needs to identify the following sequences: 
 362 // 4 ticks modulated followed by 4 ticks unmodulated:   Sequence D = 1 (also used as "start of communication") 
 363 // 4 ticks unmodulated followed by 4 ticks modulated:   Sequence E = 0 
 364 // 8 ticks unmodulated:                                                                 Sequence F = end of communication 
 365 // 8 ticks modulated:                                                                   A collision. Save the collision position and treat as Sequence D 
 366 // Note 1: the bitstream may start at any time. We therefore need to sync. 
 367 // Note 2: parameter offset is used to determine the position of the parity bits (required for the anticollision command only) 
 370 // Lookup-Table to decide if 4 raw bits are a modulation. 
 371 // We accept three or four "1" in any position 
 372 const bool Mod_Manchester_LUT
[] = { 
 373         FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, 
 374         FALSE
, FALSE
, FALSE
, TRUE
,  FALSE
, TRUE
,  TRUE
,  TRUE
 
 377 #define IsManchesterModulationNibble1(b) (Mod_Manchester_LUT[(b & 0x00F0) >> 4]) 
 378 #define IsManchesterModulationNibble2(b) (Mod_Manchester_LUT[(b & 0x000F)]) 
 381         Demod
.state 
= DEMOD_UNSYNCD
; 
 382         Demod
.len 
= 0;                                          // number of decoded data bytes 
 384         Demod
.shiftReg 
= 0;                                     // shiftreg to hold decoded data bits 
 385         Demod
.parityBits 
= 0;                           //  
 386         Demod
.collisionPos 
= 0;                         // Position of collision bit 
 387         Demod
.twoBits 
= 0xffff;                         // buffer for 2 Bits 
 392         Demod
.syncBit 
= 0xFFFF; 
 396 void DemodInit(uint8_t *data
, uint8_t *parity
) { 
 398         Demod
.parity 
= parity
; 
 402 // use parameter non_real_time to provide a timestamp. Set to 0 if the decoder should measure real time 
 403 static RAMFUNC 
int ManchesterDecoding(uint8_t bit
, uint16_t offset
, uint32_t non_real_time
) { 
 404         Demod
.twoBits 
= (Demod
.twoBits 
<< 8) | bit
; 
 406         if (Demod
.state 
== DEMOD_UNSYNCD
) { 
 408                 if (Demod
.highCnt 
< 2) {                                                                                        // wait for a stable unmodulated signal 
 409                         if (Demod
.twoBits 
== 0x0000) { 
 415                         Demod
.syncBit 
= 0xFFFF;                 // not set 
 416                         if              ((Demod
.twoBits 
& 0x7700) == 0x7000) Demod
.syncBit 
= 7;  
 417                         else if ((Demod
.twoBits 
& 0x3B80) == 0x3800) Demod
.syncBit 
= 6; 
 418                         else if ((Demod
.twoBits 
& 0x1DC0) == 0x1C00) Demod
.syncBit 
= 5; 
 419                         else if ((Demod
.twoBits 
& 0x0EE0) == 0x0E00) Demod
.syncBit 
= 4; 
 420                         else if ((Demod
.twoBits 
& 0x0770) == 0x0700) Demod
.syncBit 
= 3; 
 421                         else if ((Demod
.twoBits 
& 0x03B8) == 0x0380) Demod
.syncBit 
= 2; 
 422                         else if ((Demod
.twoBits 
& 0x01DC) == 0x01C0) Demod
.syncBit 
= 1; 
 423                         else if ((Demod
.twoBits 
& 0x00EE) == 0x00E0) Demod
.syncBit 
= 0; 
 424                         if (Demod
.syncBit 
!= 0xFFFF) { 
 425                                 Demod
.startTime 
= non_real_time
?non_real_time
:(GetCountSspClk() & 0xfffffff8); 
 426                                 Demod
.startTime 
-= Demod
.syncBit
; 
 427                                 Demod
.bitCount 
= offset
;                        // number of decoded data bits 
 428                                 Demod
.state 
= DEMOD_MANCHESTER_DATA
; 
 433                 if (IsManchesterModulationNibble1(Demod
.twoBits 
>> Demod
.syncBit
)) {            // modulation in first half 
 434                         if (IsManchesterModulationNibble2(Demod
.twoBits 
>> Demod
.syncBit
)) {    // ... and in second half = collision 
 435                                 if (!Demod
.collisionPos
) { 
 436                                         Demod
.collisionPos 
= (Demod
.len 
<< 3) + Demod
.bitCount
; 
 438                         }                                                                                                                       // modulation in first half only - Sequence D = 1 
 440                         Demod
.shiftReg 
= (Demod
.shiftReg 
>> 1) | 0x100;                         // in both cases, add a 1 to the shiftreg 
 441                         if(Demod
.bitCount 
== 9) {                                                                       // if we decoded a full byte (including parity) 
 442                                 Demod
.output
[Demod
.len
++] = (Demod
.shiftReg 
& 0xff); 
 443                                 Demod
.parityBits 
<<= 1;                                                                 // make room for the parity bit 
 444                                 Demod
.parityBits 
|= ((Demod
.shiftReg 
>> 8) & 0x01);     // store parity bit 
 447                                 if((Demod
.len
&0x0007) == 0) {                                                   // every 8 data bytes 
 448                                         Demod
.parity
[Demod
.parityLen
++] = Demod
.parityBits
;     // store 8 parity bits 
 449                                         Demod
.parityBits 
= 0; 
 452                         Demod
.endTime 
= Demod
.startTime 
+ 8*(9*Demod
.len 
+ Demod
.bitCount 
+ 1) - 4; 
 453                 } else {                                                                                                                // no modulation in first half 
 454                         if (IsManchesterModulationNibble2(Demod
.twoBits 
>> Demod
.syncBit
)) {    // and modulation in second half = Sequence E = 0 
 456                                 Demod
.shiftReg 
= (Demod
.shiftReg 
>> 1);                                 // add a 0 to the shiftreg 
 457                                 if(Demod
.bitCount 
>= 9) {                                                               // if we decoded a full byte (including parity) 
 458                                         Demod
.output
[Demod
.len
++] = (Demod
.shiftReg 
& 0xff); 
 459                                         Demod
.parityBits 
<<= 1;                                                         // make room for the new parity bit 
 460                                         Demod
.parityBits 
|= ((Demod
.shiftReg 
>> 8) & 0x01); // store parity bit 
 463                                         if ((Demod
.len
&0x0007) == 0) {                                          // every 8 data bytes 
 464                                                 Demod
.parity
[Demod
.parityLen
++] = Demod
.parityBits
;     // store 8 parity bits1 
 465                                                 Demod
.parityBits 
= 0; 
 468                                 Demod
.endTime 
= Demod
.startTime 
+ 8*(9*Demod
.len 
+ Demod
.bitCount 
+ 1); 
 469                         } else {                                                                                                        // no modulation in both halves - End of communication 
 470                                 if(Demod
.bitCount 
> 0) {                                                                // there are some remaining data bits 
 471                                         Demod
.shiftReg 
>>= (9 - Demod
.bitCount
);                        // right align the decoded bits 
 472                                         Demod
.output
[Demod
.len
++] = Demod
.shiftReg 
& 0xff;      // and add them to the output 
 473                                         Demod
.parityBits 
<<= 1;                                                         // add a (void) parity bit 
 474                                         Demod
.parityBits 
<<= (8 - (Demod
.len
&0x0007));          // left align remaining parity bits 
 475                                         Demod
.parity
[Demod
.parityLen
++] = Demod
.parityBits
;     // and store them 
 477                                 } else if (Demod
.len 
& 0x0007) {                                                // there are some parity bits to store 
 478                                         Demod
.parityBits 
<<= (8 - (Demod
.len
&0x0007));          // left align remaining parity bits 
 479                                         Demod
.parity
[Demod
.parityLen
++] = Demod
.parityBits
;     // and store them 
 482                                         return TRUE
;                                                                            // we are finished with decoding the raw data sequence 
 483                                 } else {                                                                                                // nothing received. Start over 
 489     return FALSE
;       // not finished yet, need more data 
 492 //============================================================================= 
 493 // Finally, a `sniffer' for ISO 14443 Type A 
 494 // Both sides of communication! 
 495 //============================================================================= 
 497 //----------------------------------------------------------------------------- 
 498 // Record the sequence of commands sent by the reader to the tag, with 
 499 // triggering so that we start recording at the point that the tag is moved 
 502 //----------------------------------------------------------------------------- 
 503 void RAMFUNC 
SniffIso14443a(uint8_t param
) { 
 505         // bit 0 - trigger from first card answer 
 506         // bit 1 - trigger from first reader 7-bit request 
 509         iso14443a_setup(FPGA_HF_ISO14443A_SNIFFER
); 
 511         // Allocate memory from BigBuf for some buffers 
 512         // free all previous allocations first 
 513         BigBuf_free(); BigBuf_Clear_ext(false); 
 517         // The command (reader -> tag) that we're receiving. 
 518         uint8_t *receivedCmd 
= BigBuf_malloc(MAX_FRAME_SIZE
); 
 519         uint8_t *receivedCmdPar 
= BigBuf_malloc(MAX_PARITY_SIZE
); 
 521         // The response (tag -> reader) that we're receiving. 
 522         uint8_t *receivedResponse 
= BigBuf_malloc(MAX_FRAME_SIZE
); 
 523         uint8_t *receivedResponsePar 
= BigBuf_malloc(MAX_PARITY_SIZE
); 
 525         // The DMA buffer, used to stream samples from the FPGA 
 526         uint8_t *dmaBuf 
= BigBuf_malloc(DMA_BUFFER_SIZE
); 
 528         uint8_t *data 
= dmaBuf
; 
 529         uint8_t previous_data 
= 0; 
 532         bool TagIsActive 
= FALSE
; 
 533         bool ReaderIsActive 
= FALSE
; 
 535         // Set up the demodulator for tag -> reader responses. 
 536         DemodInit(receivedResponse
, receivedResponsePar
); 
 538         // Set up the demodulator for the reader -> tag commands 
 539         UartInit(receivedCmd
, receivedCmdPar
); 
 541         // Setup and start DMA. 
 542         if ( !FpgaSetupSscDma((uint8_t*) dmaBuf
, DMA_BUFFER_SIZE
) ){ 
 543                 if (MF_DBGLEVEL 
> 1) Dbprintf("FpgaSetupSscDma failed. Exiting");  
 547         // We won't start recording the frames that we acquire until we trigger; 
 548         // a good trigger condition to get started is probably when we see a 
 549         // response from the tag. 
 550         // triggered == FALSE -- to wait first for card 
 551         bool triggered 
= !(param 
& 0x03);  
 553         // And now we loop, receiving samples. 
 554         for(uint32_t rsamples 
= 0; TRUE
; ) { 
 557                         DbpString("cancelled by button"); 
 564                 int register readBufDataP 
= data 
- dmaBuf
; 
 565                 int register dmaBufDataP 
= DMA_BUFFER_SIZE 
- AT91C_BASE_PDC_SSC
->PDC_RCR
; 
 566                 if (readBufDataP 
<= dmaBufDataP
){ 
 567                         dataLen 
= dmaBufDataP 
- readBufDataP
; 
 569                         dataLen 
= DMA_BUFFER_SIZE 
- readBufDataP 
+ dmaBufDataP
; 
 571                 // test for length of buffer 
 572                 if(dataLen 
> maxDataLen
) { 
 573                         maxDataLen 
= dataLen
; 
 574                         if(dataLen 
> (9 * DMA_BUFFER_SIZE 
/ 10)) { 
 575                                 Dbprintf("blew circular buffer! dataLen=%d", dataLen
); 
 579                 if(dataLen 
< 1) continue; 
 581                 // primary buffer was stopped( <-- we lost data! 
 582                 if (!AT91C_BASE_PDC_SSC
->PDC_RCR
) { 
 583                         AT91C_BASE_PDC_SSC
->PDC_RPR 
= (uint32_t) dmaBuf
; 
 584                         AT91C_BASE_PDC_SSC
->PDC_RCR 
= DMA_BUFFER_SIZE
; 
 585                         Dbprintf("RxEmpty ERROR!!! data length:%d", dataLen
); // temporary 
 587                 // secondary buffer sets as primary, secondary buffer was stopped 
 588                 if (!AT91C_BASE_PDC_SSC
->PDC_RNCR
) { 
 589                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
; 
 590                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= DMA_BUFFER_SIZE
; 
 595                 if (rsamples 
& 0x01) {                          // Need two samples to feed Miller and Manchester-Decoder 
 597                         if(!TagIsActive
) {              // no need to try decoding reader data if the tag is sending 
 598                                 uint8_t readerdata 
= (previous_data 
& 0xF0) | (*data 
>> 4); 
 599                                 if (MillerDecoding(readerdata
, (rsamples
-1)*4)) { 
 602                                         // check - if there is a short 7bit request from reader 
 603                                         if ((!triggered
) && (param 
& 0x02) && (Uart
.len 
== 1) && (Uart
.bitCount 
== 7)) triggered 
= TRUE
; 
 606                                                 if (!LogTrace(receivedCmd
,  
 608                                                                                 Uart
.startTime
*16 - DELAY_READER_AIR2ARM_AS_SNIFFER
, 
 609                                                                                 Uart
.endTime
*16 - DELAY_READER_AIR2ARM_AS_SNIFFER
, 
 613                                         /* And ready to receive another command. */ 
 615                                         /* And also reset the demod code, which might have been */ 
 616                                         /* false-triggered by the commands from the reader. */ 
 620                                 ReaderIsActive 
= (Uart
.state 
!= STATE_UNSYNCD
); 
 623                         if(!ReaderIsActive
) {           // no need to try decoding tag data if the reader is sending - and we cannot afford the time 
 624                                 uint8_t tagdata 
= (previous_data 
<< 4) | (*data 
& 0x0F); 
 625                                 if(ManchesterDecoding(tagdata
, 0, (rsamples
-1)*4)) { 
 628                                         if (!LogTrace(receivedResponse
,  
 630                                                                         Demod
.startTime
*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER
,  
 631                                                                         Demod
.endTime
*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER
, 
 635                                         if ((!triggered
) && (param 
& 0x01)) triggered 
= TRUE
; 
 637                                         // And ready to receive another response. 
 639                                         // And reset the Miller decoder including itS (now outdated) input buffer 
 640                                         UartInit(receivedCmd
, receivedCmdPar
); 
 643                                 TagIsActive 
= (Demod
.state 
!= DEMOD_UNSYNCD
); 
 647                 previous_data 
= *data
; 
 650                 if(data 
== dmaBuf 
+ DMA_BUFFER_SIZE
) { 
 655         if (MF_DBGLEVEL 
>= 1) { 
 656                 Dbprintf("maxDataLen=%d, Uart.state=%x, Uart.len=%d", maxDataLen
, Uart
.state
, Uart
.len
); 
 657                 Dbprintf("traceLen=%d, Uart.output[0]=%08x", BigBuf_get_traceLen(), (uint32_t)Uart
.output
[0]); 
 660         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 665 //----------------------------------------------------------------------------- 
 666 // Prepare tag messages 
 667 //----------------------------------------------------------------------------- 
 668 static void CodeIso14443aAsTagPar(const uint8_t *cmd
, uint16_t len
, uint8_t *parity
) { 
 671         // Correction bit, might be removed when not needed 
 676         ToSendStuffBit(1);  // 1 
 682         ToSend
[++ToSendMax
] = SEC_D
; 
 683         LastProxToAirDuration 
= 8 * ToSendMax 
- 4; 
 685         for(uint16_t i 
= 0; i 
< len
; i
++) { 
 689                 for(uint16_t j 
= 0; j 
< 8; j
++) { 
 691                                 ToSend
[++ToSendMax
] = SEC_D
; 
 693                                 ToSend
[++ToSendMax
] = SEC_E
; 
 698                 // Get the parity bit 
 699                 if (parity
[i
>>3] & (0x80>>(i
&0x0007))) { 
 700                         ToSend
[++ToSendMax
] = SEC_D
; 
 701                         LastProxToAirDuration 
= 8 * ToSendMax 
- 4; 
 703                         ToSend
[++ToSendMax
] = SEC_E
; 
 704                         LastProxToAirDuration 
= 8 * ToSendMax
; 
 709         ToSend
[++ToSendMax
] = SEC_F
; 
 711         // Convert from last byte pos to length 
 715 static void CodeIso14443aAsTag(const uint8_t *cmd
, uint16_t len
) { 
 716         uint8_t par
[MAX_PARITY_SIZE
] = {0}; 
 717         GetParity(cmd
, len
, par
); 
 718         CodeIso14443aAsTagPar(cmd
, len
, par
); 
 721 static void Code4bitAnswerAsTag(uint8_t cmd
) { 
 726         // Correction bit, might be removed when not needed 
 731         ToSendStuffBit(1);  // 1 
 737         ToSend
[++ToSendMax
] = SEC_D
; 
 739         for(uint8_t i 
= 0; i 
< 4; i
++) { 
 741                         ToSend
[++ToSendMax
] = SEC_D
; 
 742                         LastProxToAirDuration 
= 8 * ToSendMax 
- 4; 
 744                         ToSend
[++ToSendMax
] = SEC_E
; 
 745                         LastProxToAirDuration 
= 8 * ToSendMax
; 
 751         ToSend
[++ToSendMax
] = SEC_F
; 
 753         // Convert from last byte pos to length 
 757 //----------------------------------------------------------------------------- 
 758 // Wait for commands from reader 
 759 // Stop when button is pressed 
 760 // Or return TRUE when command is captured 
 761 //----------------------------------------------------------------------------- 
 762 static int GetIso14443aCommandFromReader(uint8_t *received
, uint8_t *parity
, int *len
) { 
 763     // Set FPGA mode to "simulated ISO 14443 tag", no modulation (listen 
 764     // only, since we are receiving, not transmitting). 
 765     // Signal field is off with the appropriate LED 
 767     FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_TAGSIM_LISTEN
); 
 769     // Now run a `software UART` on the stream of incoming samples. 
 770         UartInit(received
, parity
); 
 773     uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 778         if(BUTTON_PRESS()) return FALSE
; 
 780         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 781             b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 782                         if(MillerDecoding(b
, 0)) { 
 790 bool prepare_tag_modulation(tag_response_info_t
* response_info
, size_t max_buffer_size
) { 
 791         // Example response, answer to MIFARE Classic read block will be 16 bytes + 2 CRC = 18 bytes 
 792         // This will need the following byte array for a modulation sequence 
 793         //    144        data bits (18 * 8) 
 796         //      1        Correction bit (Answer in 1172 or 1236 periods, see FPGA) 
 797         //      1        just for the case 
 799         //    166 bytes, since every bit that needs to be send costs us a byte 
 801         // Prepare the tag modulation bits from the message 
 802         CodeIso14443aAsTag(response_info
->response
,response_info
->response_n
); 
 804         // Make sure we do not exceed the free buffer space 
 805         if (ToSendMax 
> max_buffer_size
) { 
 806                 Dbprintf("Out of memory, when modulating bits for tag answer:"); 
 807                 Dbhexdump(response_info
->response_n
,response_info
->response
,false); 
 811         // Copy the byte array, used for this modulation to the buffer position 
 812         memcpy(response_info
->modulation
,ToSend
,ToSendMax
); 
 814         // Store the number of bytes that were used for encoding/modulation and the time needed to transfer them 
 815         response_info
->modulation_n 
= ToSendMax
; 
 816         response_info
->ProxToAirDuration 
= LastProxToAirDuration
; 
 820 // "precompile" responses. There are 7 predefined responses with a total of 28 bytes data to transmit. 
 821 // Coded responses need one byte per bit to transfer (data, parity, start, stop, correction)  
 822 // 28 * 8 data bits, 28 * 1 parity bits, 7 start bits, 7 stop bits, 7 correction bits 
 823 // -> need 273 bytes buffer 
 824 // 44 * 8 data bits, 44 * 1 parity bits, 9 start bits, 9 stop bits, 9 correction bits --370 
 825 // 47 * 8 data bits, 47 * 1 parity bits, 10 start bits, 10 stop bits, 10 correction bits  
 826 #define ALLOCATED_TAG_MODULATION_BUFFER_SIZE 453  
 828 bool prepare_allocated_tag_modulation(tag_response_info_t
* response_info
) { 
 829         // Retrieve and store the current buffer index 
 830         response_info
->modulation 
= free_buffer_pointer
; 
 832         // Determine the maximum size we can use from our buffer 
 833         size_t max_buffer_size 
= ALLOCATED_TAG_MODULATION_BUFFER_SIZE
; 
 835         // Forward the prepare tag modulation function to the inner function 
 836         if (prepare_tag_modulation(response_info
, max_buffer_size
)) { 
 837                 // Update the free buffer offset 
 838                 free_buffer_pointer 
+= ToSendMax
; 
 845 //----------------------------------------------------------------------------- 
 846 // Main loop of simulated tag: receive commands from reader, decide what 
 847 // response to send, and send it. 
 849 //----------------------------------------------------------------------------- 
 850 void SimulateIso14443aTag(int tagType
, int flags
, byte_t
* data
) { 
 852         #define ATTACK_KEY_COUNT 8 // keep same as define in cmdhfmf.c -> readerAttack() 
 860         // PACK response to PWD AUTH for EV1/NTAG 
 861         uint8_t response8
[4] = {0,0,0,0}; 
 862         // Counter for EV1/NTAG 
 863         uint32_t counters
[] = {0,0,0}; 
 865         // The first response contains the ATQA (note: bytes are transmitted in reverse order). 
 866         uint8_t response1
[] = {0,0}; 
 868         // Here, we collect CUID, block1, keytype1, NT1, NR1, AR1, CUID, block2, keytyp2, NT2, NR2, AR2 
 869         // it should also collect block, keytype. 
 870         uint8_t cardAUTHSC 
= 0; 
 871         uint8_t cardAUTHKEY 
= 0xff;  // no authentication 
 872         // allow collecting up to 8 sets of nonces to allow recovery of up to 8 keys 
 874         nonces_t ar_nr_nonces
[ATTACK_KEY_COUNT
]; // for attack types moebius 
 875         memset(ar_nr_nonces
, 0x00, sizeof(ar_nr_nonces
)); 
 876         uint8_t moebius_count 
= 0; 
 879                 case 1: { // MIFARE Classic 1k  
 883                 case 2: { // MIFARE Ultralight 
 887                 case 3: { // MIFARE DESFire 
 892                 case 4: { // ISO/IEC 14443-4 - javacard (JCOP) 
 896                 case 5: { // MIFARE TNP3XXX 
 901                 case 6: { // MIFARE Mini 320b 
 911                         ComputeCrc14443(CRC_14443_A
, response8
, 2, &response8
[2], &response8
[3]); 
 912                         // uid not supplied then get from emulator memory 
 914                                 uint16_t start 
= 4 * (0+12);   
 916                                 emlGetMemBt( emdata
, start
, sizeof(emdata
)); 
 917                                 memcpy(data
, emdata
, 3); // uid bytes 0-2 
 918                                 memcpy(data
+3, emdata
+4, 4); // uid bytes 3-7 
 919                                 flags 
|= FLAG_7B_UID_IN_DATA
; 
 922                 case 8: { // MIFARE Classic 4k 
 927                         Dbprintf("Error: unkown tagtype (%d)",tagType
); 
 932         // The second response contains the (mandatory) first 24 bits of the UID 
 933         uint8_t response2
[5] = {0x00}; 
 936         uint8_t response2a
[5] = {0x00}; 
 938         if ( (flags 
& FLAG_7B_UID_IN_DATA
) == FLAG_7B_UID_IN_DATA 
) { 
 939                 response2
[0] = 0x88;  // Cascade Tag marker 
 940                 response2
[1] = data
[0]; 
 941                 response2
[2] = data
[1]; 
 942                 response2
[3] = data
[2]; 
 944                 response2a
[0] = data
[3]; 
 945                 response2a
[1] = data
[4]; 
 946                 response2a
[2] = data
[5]; 
 947                 response2a
[3] = data
[6]; //?? 
 948                 response2a
[4] = response2a
[0] ^ response2a
[1] ^ response2a
[2] ^ response2a
[3]; 
 950                 // Configure the ATQA and SAK accordingly 
 951                 response1
[0] |= 0x40; 
 954                 cuid 
= bytes_to_num(data
+3, 4); 
 956                 memcpy(response2
, data
, 4); 
 957                 // Configure the ATQA and SAK accordingly 
 958                 response1
[0] &= 0xBF; 
 960                 cuid 
= bytes_to_num(data
, 4); 
 963         // Calculate the BitCountCheck (BCC) for the first 4 bytes of the UID. 
 964         response2
[4] = response2
[0] ^ response2
[1] ^ response2
[2] ^ response2
[3]; 
 966         // Prepare the mandatory SAK (for 4 and 7 byte UID) 
 967         uint8_t response3
[3]  = {sak
, 0x00, 0x00}; 
 968         ComputeCrc14443(CRC_14443_A
, response3
, 1, &response3
[1], &response3
[2]); 
 970         // Prepare the optional second SAK (for 7 byte UID), drop the cascade bit 
 971         uint8_t response3a
[3]  = {0x00}; 
 972         response3a
[0] = sak 
& 0xFB; 
 973         ComputeCrc14443(CRC_14443_A
, response3a
, 1, &response3a
[1], &response3a
[2]); 
 976         uint8_t response5
[4];  
 978         uint8_t response6
[] = { 0x04, 0x58, 0x80, 0x02, 0x00, 0x00 };   // dummy ATS (pseudo-ATR), answer to RATS:  
 979         // Format byte = 0x58: FSCI=0x08 (FSC=256), TA(1) and TC(1) present,  
 980         // TA(1) = 0x80: different divisors not supported, DR = 1, DS = 1 
 981         // TB(1) = not present. Defaults: FWI = 4 (FWT = 256 * 16 * 2^4 * 1/fc = 4833us), SFGI = 0 (SFG = 256 * 16 * 2^0 * 1/fc = 302us) 
 982         // TC(1) = 0x02: CID supported, NAD not supported 
 983         ComputeCrc14443(CRC_14443_A
, response6
, 4, &response6
[4], &response6
[5]); 
 985         // Prepare GET_VERSION (different for UL EV-1 / NTAG) 
 986         // uint8_t response7_EV1[] = {0x00, 0x04, 0x03, 0x01, 0x01, 0x00, 0x0b, 0x03, 0xfd, 0xf7};  //EV1 48bytes VERSION. 
 987         // uint8_t response7_NTAG[] = {0x00, 0x04, 0x04, 0x02, 0x01, 0x00, 0x11, 0x03, 0x01, 0x9e}; //NTAG 215   
 988         // Prepare CHK_TEARING 
 989         // uint8_t response9[] =  {0xBD,0x90,0x3f}; 
 991         #define TAG_RESPONSE_COUNT 10 
 992         tag_response_info_t responses
[TAG_RESPONSE_COUNT
] = { 
 993                 { .response 
= response1
,  .response_n 
= sizeof(response1
)  },  // Answer to request - respond with card type 
 994                 { .response 
= response2
,  .response_n 
= sizeof(response2
)  },  // Anticollision cascade1 - respond with uid 
 995                 { .response 
= response2a
, .response_n 
= sizeof(response2a
) },  // Anticollision cascade2 - respond with 2nd half of uid if asked 
 996                 { .response 
= response3
,  .response_n 
= sizeof(response3
)  },  // Acknowledge select - cascade 1 
 997                 { .response 
= response3a
, .response_n 
= sizeof(response3a
) },  // Acknowledge select - cascade 2 
 998                 { .response 
= response5
,  .response_n 
= sizeof(response5
)  },  // Authentication answer (random nonce) 
 999                 { .response 
= response6
,  .response_n 
= sizeof(response6
)  },  // dummy ATS (pseudo-ATR), answer to RATS 
1001                 { .response 
= response8
,   .response_n 
= sizeof(response8
) }  // EV1/NTAG PACK response 
1003                 // { .response = response7_NTAG, .response_n = sizeof(response7_NTAG)}, // EV1/NTAG GET_VERSION response 
1004                 // { .response = response9,      .response_n = sizeof(response9)     }  // EV1/NTAG CHK_TEAR response 
1007         // Allocate 512 bytes for the dynamic modulation, created when the reader queries for it 
1008         // Such a response is less time critical, so we can prepare them on the fly 
1009         #define DYNAMIC_RESPONSE_BUFFER_SIZE 64 
1010         #define DYNAMIC_MODULATION_BUFFER_SIZE 512 
1011         uint8_t dynamic_response_buffer
[DYNAMIC_RESPONSE_BUFFER_SIZE
]; 
1012         uint8_t dynamic_modulation_buffer
[DYNAMIC_MODULATION_BUFFER_SIZE
]; 
1013         tag_response_info_t dynamic_response_info 
= { 
1014                 .response 
= dynamic_response_buffer
, 
1016                 .modulation 
= dynamic_modulation_buffer
, 
1020         // We need to listen to the high-frequency, peak-detected path. 
1021         iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN
); 
1023         BigBuf_free_keep_EM(); 
1027         // allocate buffers: 
1028         uint8_t *receivedCmd 
= BigBuf_malloc(MAX_FRAME_SIZE
); 
1029         uint8_t *receivedCmdPar 
= BigBuf_malloc(MAX_PARITY_SIZE
); 
1030         free_buffer_pointer 
= BigBuf_malloc(ALLOCATED_TAG_MODULATION_BUFFER_SIZE
); 
1032         // Prepare the responses of the anticollision phase 
1033         // there will be not enough time to do this at the moment the reader sends it REQA 
1034         for (size_t i
=0; i
<TAG_RESPONSE_COUNT
; i
++) 
1035                 prepare_allocated_tag_modulation(&responses
[i
]); 
1039         // To control where we are in the protocol 
1043         // Just to allow some checks 
1047         tag_response_info_t
* p_response
; 
1053                 // Clean receive command buffer 
1054                 if(!GetIso14443aCommandFromReader(receivedCmd
, receivedCmdPar
, &len
)) { 
1055                         Dbprintf("Emulator stopped. Tracing: %d  trace length: %d ", tracing
, BigBuf_get_traceLen()); 
1060                 // Okay, look at the command now. 
1062                 if(receivedCmd
[0] == ISO14443A_CMD_REQA
) { // Received a REQUEST 
1063                         p_response 
= &responses
[0]; order 
= 1; 
1064                 } else if(receivedCmd
[0] == ISO14443A_CMD_WUPA
) { // Received a WAKEUP 
1065                         p_response 
= &responses
[0]; order 
= 6; 
1066                 } else if(receivedCmd
[1] == 0x20 && receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT
) {       // Received request for UID (cascade 1) 
1067                         p_response 
= &responses
[1]; order 
= 2; 
1068                 } else if(receivedCmd
[1] == 0x20 && receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2
) {     // Received request for UID (cascade 2) 
1069                         p_response 
= &responses
[2]; order 
= 20; 
1070                 } else if(receivedCmd
[1] == 0x70 && receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT
) {       // Received a SELECT (cascade 1) 
1071                         p_response 
= &responses
[3]; order 
= 3; 
1072                 } else if(receivedCmd
[1] == 0x70 && receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2
) {     // Received a SELECT (cascade 2) 
1073                         p_response 
= &responses
[4]; order 
= 30;          
1074                 } else if(receivedCmd
[0] == ISO14443A_CMD_READBLOCK
) {  // Received a (plain) READ 
1075                         uint8_t block 
= receivedCmd
[1]; 
1076                         // if Ultralight or NTAG (4 byte blocks) 
1077                         if ( tagType 
== 7 || tagType 
== 2 ) { 
1078                                 // first 12 blocks of emu are [getversion answer - check tearing - pack - 0x00 - signature] 
1079                                 uint16_t start 
= 4 * (block
+12);   
1080                                 uint8_t emdata
[MAX_MIFARE_FRAME_SIZE
]; 
1081                                 emlGetMemBt( emdata
, start
, 16); 
1082                                 AppendCrc14443a(emdata
, 16); 
1083                                 EmSendCmdEx(emdata
, sizeof(emdata
), false); 
1084                                 // We already responded, do not send anything with the EmSendCmd14443aRaw() that is called below 
1086                         } else { // all other tags (16 byte block tags) 
1087                                 uint8_t emdata
[MAX_MIFARE_FRAME_SIZE
]; 
1088                                 emlGetMemBt( emdata
, block
, 16); 
1089                                 AppendCrc14443a(emdata
, 16); 
1090                                 EmSendCmdEx(emdata
, sizeof(emdata
), false); 
1091                                 // EmSendCmdEx(data+(4*receivedCmd[1]),16,false); 
1092                                 // Dbprintf("Read request from reader: %x %x",receivedCmd[0],receivedCmd[1]); 
1093                                 // We already responded, do not send anything with the EmSendCmd14443aRaw() that is called below 
1096                 } else if(receivedCmd
[0] == MIFARE_ULEV1_FASTREAD
) {    // Received a FAST READ (ranged read)                            
1097                         uint8_t emdata
[MAX_FRAME_SIZE
]; 
1098                         // first 12 blocks of emu are [getversion answer - check tearing - pack - 0x00 - signature] 
1099                         int start 
=  (receivedCmd
[1]+12) * 4;  
1100                         int len   
= (receivedCmd
[2] - receivedCmd
[1] + 1) * 4; 
1101                         emlGetMemBt( emdata
, start
, len
); 
1102                         AppendCrc14443a(emdata
, len
); 
1103                         EmSendCmdEx(emdata
, len
+2, false);                               
1105                 } else if(receivedCmd
[0] == MIFARE_ULEV1_READSIG 
&& tagType 
== 7) {     // Received a READ SIGNATURE --  
1106                         // first 12 blocks of emu are [getversion answer - check tearing - pack - 0x00 - signature] 
1107                         uint16_t start 
= 4 * 4; 
1109                         emlGetMemBt( emdata
, start
, 32); 
1110                         AppendCrc14443a(emdata
, 32); 
1111                         EmSendCmdEx(emdata
, sizeof(emdata
), false); 
1113                 } else if (receivedCmd
[0] == MIFARE_ULEV1_READ_CNT 
&& tagType 
== 7) {   // Received a READ COUNTER --  
1114                         uint8_t index 
= receivedCmd
[1]; 
1115                         uint8_t cmd
[] =  {0x00,0x00,0x00,0x14,0xa5}; 
1116                         if ( counters
[index
] > 0) { 
1117                                 num_to_bytes(counters
[index
], 3, cmd
); 
1118                                 AppendCrc14443a(cmd
, sizeof(cmd
)-2); 
1120                         EmSendCmdEx(cmd
,sizeof(cmd
),false);                              
1122                 } else if (receivedCmd
[0] == MIFARE_ULEV1_INCR_CNT 
&& tagType 
== 7) {   // Received a INC COUNTER --  
1123                         // number of counter 
1124                         uint8_t counter 
= receivedCmd
[1]; 
1125                         uint32_t val 
= bytes_to_num(receivedCmd
+2,4); 
1126                         counters
[counter
] = val
; 
1129                         uint8_t ack
[] = {0x0a}; 
1130                         EmSendCmdEx(ack
,sizeof(ack
),false); 
1132                 } else if(receivedCmd
[0] == MIFARE_ULEV1_CHECKTEAR 
&& tagType 
== 7) {   // Received a CHECK_TEARING_EVENT --  
1133                         // first 12 blocks of emu are [getversion answer - check tearing - pack - 0x00 - signature] 
1136                         if (receivedCmd
[1]<3) counter 
= receivedCmd
[1]; 
1137                         emlGetMemBt( emdata
, 10+counter
, 1); 
1138                         AppendCrc14443a(emdata
, sizeof(emdata
)-2); 
1139                         EmSendCmdEx(emdata
, sizeof(emdata
), false);      
1141                 } else if(receivedCmd
[0] == ISO14443A_CMD_HALT
) {       // Received a HALT 
1142                         LogTrace(receivedCmd
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
1144                 } else if(receivedCmd
[0] == MIFARE_AUTH_KEYA 
|| receivedCmd
[0] == MIFARE_AUTH_KEYB
) {   // Received an authentication request                            
1145                         if ( tagType 
== 7 ) {   // IF NTAG /EV1  0x60 == GET_VERSION, not a authentication request. 
1147                                 emlGetMemBt( emdata
, 0, 8 ); 
1148                                 AppendCrc14443a(emdata
, sizeof(emdata
)-2); 
1149                                 EmSendCmdEx(emdata
, sizeof(emdata
), false); 
1153                                 cardAUTHKEY 
= receivedCmd
[0] - 0x60; 
1154                                 cardAUTHSC 
= receivedCmd
[1] / 4; // received block num 
1156                                 // incease nonce at AUTH requests. this is time consuming. 
1158                                 //num_to_bytes(nonce, 4, response5); 
1159                                 num_to_bytes(nonce
, 4, dynamic_response_info
.response
);                          
1160                                 dynamic_response_info
.response_n 
= 4; 
1162                                 //prepare_tag_modulation(&responses[5], DYNAMIC_MODULATION_BUFFER_SIZE); 
1163                                 prepare_tag_modulation(&dynamic_response_info
, DYNAMIC_MODULATION_BUFFER_SIZE
); 
1164                                 p_response 
= &dynamic_response_info
; 
1165                                 //p_response = &responses[5];  
1168                 } else if(receivedCmd
[0] == ISO14443A_CMD_RATS
) {       // Received a RATS request 
1169                         if (tagType 
== 1 || tagType 
== 2) {     // RATS not supported 
1170                                 EmSend4bit(CARD_NACK_NA
); 
1173                                 p_response 
= &responses
[6]; order 
= 70; 
1175                 } else if (order 
== 7 && len 
== 8) { // Received {nr] and {ar} (part of authentication) 
1176                         LogTrace(receivedCmd
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
1177                         uint32_t nr 
= bytes_to_num(receivedCmd
,4); 
1178                         uint32_t ar 
= bytes_to_num(receivedCmd
+4,4); 
1180                         // Collect AR/NR per keytype & sector 
1181                         if ( (flags 
& FLAG_NR_AR_ATTACK
) == FLAG_NR_AR_ATTACK 
) { 
1185                                 for (uint8_t i 
= 0; i 
< ATTACK_KEY_COUNT
; i
++) { 
1186                                         // find which index to use 
1187                                         if ( (cardAUTHSC 
== ar_nr_nonces
[i
].sector
) &&  (cardAUTHKEY 
== ar_nr_nonces
[i
].keytype
))  
1190                                         // keep track of empty slots. 
1191                                         if ( ar_nr_nonces
[i
].state 
== EMPTY
) 
1194                                 // if no empty slots.  Choose first and overwrite. 
1195                                 if ( index 
== -1 ) { 
1196                                         if ( empty 
== -1 ) { 
1198                                                 ar_nr_nonces
[index
].state 
= EMPTY
; 
1204                                 switch(ar_nr_nonces
[index
].state
) { 
1206                                                 // first nonce collect 
1207                                                 ar_nr_nonces
[index
].cuid 
= cuid
; 
1208                                                 ar_nr_nonces
[index
].sector 
= cardAUTHSC
; 
1209                                                 ar_nr_nonces
[index
].keytype 
= cardAUTHKEY
; 
1210                                                 ar_nr_nonces
[index
].nonce 
= nonce
; 
1211                                                 ar_nr_nonces
[index
].nr 
= nr
; 
1212                                                 ar_nr_nonces
[index
].ar 
= ar
; 
1213                                                 ar_nr_nonces
[index
].state 
= FIRST
; 
1217                                                 // second nonce collect 
1218                                                 ar_nr_nonces
[index
].nonce2 
= nonce
; 
1219                                                 ar_nr_nonces
[index
].nr2 
= nr
; 
1220                                                 ar_nr_nonces
[index
].ar2 
= ar
; 
1221                                                 ar_nr_nonces
[index
].state 
= SECOND
; 
1224                                                 cmd_send(CMD_ACK
, CMD_SIMULATE_MIFARE_CARD
, 0, 0, &ar_nr_nonces
[index
], sizeof(nonces_t
)); 
1226                                                 ar_nr_nonces
[index
].state 
= EMPTY
; 
1227                                                 ar_nr_nonces
[index
].sector 
= 0; 
1228                                                 ar_nr_nonces
[index
].keytype 
= 0; 
1238                 } else if (receivedCmd
[0] == MIFARE_ULC_AUTH_1 
) { // ULC authentication, or Desfire Authentication 
1239                 } else if (receivedCmd
[0] == MIFARE_ULEV1_AUTH
) { // NTAG / EV-1 authentication 
1240                         if ( tagType 
== 7 ) { 
1241                                 uint16_t start 
= 13; // first 4 blocks of emu are [getversion answer - check tearing - pack - 0x00] 
1243                                 emlGetMemBt( emdata
, start
, 2); 
1244                                 AppendCrc14443a(emdata
, 2); 
1245                                 EmSendCmdEx(emdata
, sizeof(emdata
), false); 
1247                                 uint32_t pwd 
= bytes_to_num(receivedCmd
+1,4); 
1249                                 if ( MF_DBGLEVEL 
>= 3) Dbprintf("Auth attempt: %08x", pwd
);      
1252                         // Check for ISO 14443A-4 compliant commands, look at left nibble 
1253                         switch (receivedCmd
[0]) { 
1255                                 case 0x03: {  // IBlock (command no CID) 
1256                                         dynamic_response_info
.response
[0] = receivedCmd
[0]; 
1257                                         dynamic_response_info
.response
[1] = 0x90; 
1258                                         dynamic_response_info
.response
[2] = 0x00; 
1259                                         dynamic_response_info
.response_n 
= 3; 
1262                                 case 0x0A: { // IBlock (command CID) 
1263                                   dynamic_response_info
.response
[0] = receivedCmd
[0]; 
1264                                   dynamic_response_info
.response
[1] = 0x00; 
1265                                   dynamic_response_info
.response
[2] = 0x90; 
1266                                   dynamic_response_info
.response
[3] = 0x00; 
1267                                   dynamic_response_info
.response_n 
= 4; 
1271                                 case 0x1B: { // Chaining command 
1272                                   dynamic_response_info
.response
[0] = 0xaa | ((receivedCmd
[0]) & 1); 
1273                                   dynamic_response_info
.response_n 
= 2; 
1278                                   dynamic_response_info
.response
[0] = receivedCmd
[0] ^ 0x11; 
1279                                   dynamic_response_info
.response_n 
= 2; 
1282                                 case 0xBA: { // ping / pong 
1283                                         dynamic_response_info
.response
[0] = 0xAB; 
1284                                         dynamic_response_info
.response
[1] = 0x00; 
1285                                         dynamic_response_info
.response_n 
= 2; 
1289                                 case 0xC2: { // Readers sends deselect command 
1290                                         dynamic_response_info
.response
[0] = 0xCA; 
1291                                         dynamic_response_info
.response
[1] = 0x00; 
1292                                         dynamic_response_info
.response_n 
= 2; 
1296                                         // Never seen this command before 
1297                                         LogTrace(receivedCmd
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
1298                                         Dbprintf("Received unknown command (len=%d):",len
); 
1299                                         Dbhexdump(len
,receivedCmd
,false); 
1301                                         dynamic_response_info
.response_n 
= 0; 
1305                         if (dynamic_response_info
.response_n 
> 0) { 
1306                                 // Copy the CID from the reader query 
1307                                 dynamic_response_info
.response
[1] = receivedCmd
[1]; 
1309                                 // Add CRC bytes, always used in ISO 14443A-4 compliant cards 
1310                                 AppendCrc14443a(dynamic_response_info
.response
, dynamic_response_info
.response_n
); 
1311                                 dynamic_response_info
.response_n 
+= 2; 
1313                                 if (prepare_tag_modulation(&dynamic_response_info
,DYNAMIC_MODULATION_BUFFER_SIZE
) == false) { 
1314                                         DbpString("Error preparing tag response"); 
1315                                         LogTrace(receivedCmd
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
1318                                 p_response 
= &dynamic_response_info
; 
1322                 // Count number of wakeups received after a halt 
1323                 if(order 
== 6 && lastorder 
== 5) { happened
++; } 
1325                 // Count number of other messages after a halt 
1326                 if(order 
!= 6 && lastorder 
== 5) { happened2
++; } 
1328                 // comment this limit if you want to simulation longer           
1330                         DbpString("Trace Full. Simulation stopped."); 
1333                 // comment this limit if you want to simulation longer 
1334                 if(cmdsRecvd 
> 999) { 
1335                         DbpString("1000 commands later..."); 
1340                 if (p_response 
!= NULL
) { 
1341                         EmSendCmd14443aRaw(p_response
->modulation
, p_response
->modulation_n
, receivedCmd
[0] == 0x52); 
1342                         // do the tracing for the previous reader request and this tag answer: 
1343                         uint8_t par
[MAX_PARITY_SIZE
] = {0x00}; 
1344                         GetParity(p_response
->response
, p_response
->response_n
, par
); 
1346                         EmLogTrace(Uart
.output
,  
1348                                                 Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1349                                                 Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1351                                                 p_response
->response
,  
1352                                                 p_response
->response_n
, 
1353                                                 LastTimeProxToAirStart
*16 + DELAY_ARM2AIR_AS_TAG
, 
1354                                                 (LastTimeProxToAirStart 
+ p_response
->ProxToAirDuration
)*16 + DELAY_ARM2AIR_AS_TAG
,  
1359         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1361         BigBuf_free_keep_EM(); 
1365         if(flags & FLAG_NR_AR_ATTACK && MF_DBGLEVEL >= 1) { 
1367                 for ( uint8_t   i = 0; i < ATTACK_KEY_COUNT; i++) { 
1368                         if (ar_nr_collected[i] == 2) { 
1369                                 Dbprintf("Collected two pairs of AR/NR which can be used to extract %s from reader for sector %d:", (i<ATTACK_KEY_COUNT/2) ? "keyA" : "keyB", ar_nr_resp[i].sector); 
1370                                 Dbprintf("../tools/mfkey/mfkey32 %08x %08x %08x %08x %08x %08x", 
1371                                                 ar_nr_resp[i].cuid,  //UID 
1372                                                 ar_nr_resp[i].nonce, //NT 
1373                                                 ar_nr_resp[i].nr,    //NR1 
1374                                                 ar_nr_resp[i].ar,    //AR1 
1375                                                 ar_nr_resp[i].nr2,   //NR2 
1376                                                 ar_nr_resp[i].ar2    //AR2 
1381                 for ( uint8_t   i = ATTACK_KEY_COUNT; i < ATTACK_KEY_COUNT*2; i++) { 
1382                         if (ar_nr_collected[i] == 2) { 
1383                                 Dbprintf("Collected two pairs of AR/NR which can be used to extract %s from reader for sector %d:", (i<ATTACK_KEY_COUNT/2) ? "keyA" : "keyB", ar_nr_resp[i].sector); 
1384                                 Dbprintf("../tools/mfkey/mfkey32v2 %08x %08x %08x %08x %08x %08x %08x", 
1385                                                 ar_nr_resp[i].cuid,  //UID 
1386                                                 ar_nr_resp[i].nonce, //NT 
1387                                                 ar_nr_resp[i].nr,    //NR1 
1388                                                 ar_nr_resp[i].ar,    //AR1 
1389                                                 ar_nr_resp[i].nonce2,//NT2 
1390                                                 ar_nr_resp[i].nr2,   //NR2 
1391                                                 ar_nr_resp[i].ar2    //AR2 
1398         if (MF_DBGLEVEL 
>= 4){ 
1399                 Dbprintf("-[ Wake ups after halt  [%d]", happened
); 
1400                 Dbprintf("-[ Messages after halt  [%d]", happened2
); 
1401                 Dbprintf("-[ Num of received cmd  [%d]", cmdsRecvd
); 
1402                 Dbprintf("-[ Num of moebius tries [%d]", moebius_count
); 
1405         cmd_send(CMD_ACK
,1,0,0,0,0); 
1408 // prepare a delayed transfer. This simply shifts ToSend[] by a number 
1409 // of bits specified in the delay parameter. 
1410 void PrepareDelayedTransfer(uint16_t delay
) { 
1414         uint8_t bitmask 
= 0; 
1415         uint8_t bits_to_shift 
= 0; 
1416         uint8_t bits_shifted 
= 0; 
1419         for (i 
= 0; i 
< delay
; ++i
) 
1420                 bitmask 
|= (0x01 << i
); 
1422         ToSend
[++ToSendMax
] = 0x00; 
1424         for (i 
= 0; i 
< ToSendMax
; ++i
) { 
1425                         bits_to_shift 
= ToSend
[i
] & bitmask
; 
1426                         ToSend
[i
] = ToSend
[i
] >> delay
; 
1427                         ToSend
[i
] = ToSend
[i
] | (bits_shifted 
<< (8 - delay
)); 
1428                         bits_shifted 
= bits_to_shift
; 
1433 //------------------------------------------------------------------------------------- 
1434 // Transmit the command (to the tag) that was placed in ToSend[]. 
1435 // Parameter timing: 
1436 // if NULL: transfer at next possible time, taking into account 
1437 //                      request guard time and frame delay time 
1438 // if == 0:     transfer immediately and return time of transfer 
1439 // if != 0: delay transfer until time specified 
1440 //------------------------------------------------------------------------------------- 
1441 static void TransmitFor14443a(const uint8_t *cmd
, uint16_t len
, uint32_t *timing
) { 
1442         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_READER_MOD
); 
1444         uint32_t ThisTransferTime 
= 0; 
1447                 if(*timing 
== 0) {                                                                              // Measure time 
1448                         *timing 
= (GetCountSspClk() + 8) & 0xfffffff8; 
1450                         PrepareDelayedTransfer(*timing 
& 0x00000007);           // Delay transfer (fine tuning - up to 7 MF clock ticks) 
1452                 if(MF_DBGLEVEL 
>= 4 && GetCountSspClk() >= (*timing 
& 0xfffffff8)) Dbprintf("TransmitFor14443a: Missed timing"); 
1453                 while(GetCountSspClk() < (*timing 
& 0xfffffff8));               // Delay transfer (multiple of 8 MF clock ticks) 
1454                 LastTimeProxToAirStart 
= *timing
; 
1456                 ThisTransferTime 
= ((MAX(NextTransferTime
, GetCountSspClk()) & 0xfffffff8) + 8); 
1458                 while(GetCountSspClk() < ThisTransferTime
); 
1460                 LastTimeProxToAirStart 
= ThisTransferTime
; 
1464         AT91C_BASE_SSC
->SSC_THR 
= SEC_Y
; 
1468                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
1469                         AT91C_BASE_SSC
->SSC_THR 
= cmd
[c
]; 
1476         NextTransferTime 
= MAX(NextTransferTime
, LastTimeProxToAirStart 
+ REQUEST_GUARD_TIME
); 
1479 //----------------------------------------------------------------------------- 
1480 // Prepare reader command (in bits, support short frames) to send to FPGA 
1481 //----------------------------------------------------------------------------- 
1482 void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd
, uint16_t bits
, const uint8_t *parity
) { 
1489         // Start of Communication (Seq. Z) 
1490         ToSend
[++ToSendMax
] = SEC_Z
; 
1491         LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 6; 
1493         size_t bytecount 
= nbytes(bits
); 
1494         // Generate send structure for the data bits 
1495         for (i 
= 0; i 
< bytecount
; i
++) { 
1496                 // Get the current byte to send 
1498                 size_t bitsleft 
= MIN((bits
-(i
*8)),8); 
1500                 for (j 
= 0; j 
< bitsleft
; j
++) { 
1503                                 ToSend
[++ToSendMax
] = SEC_X
; 
1504                                 LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 2; 
1509                                 ToSend
[++ToSendMax
] = SEC_Z
; 
1510                                 LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 6; 
1513                                         ToSend
[++ToSendMax
] = SEC_Y
; 
1520                 // Only transmit parity bit if we transmitted a complete byte 
1521                 if (j 
== 8 && parity 
!= NULL
) { 
1522                         // Get the parity bit 
1523                         if (parity
[i
>>3] & (0x80 >> (i
&0x0007))) { 
1525                                 ToSend
[++ToSendMax
] = SEC_X
; 
1526                                 LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 2; 
1531                                         ToSend
[++ToSendMax
] = SEC_Z
; 
1532                                         LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 6; 
1535                                         ToSend
[++ToSendMax
] = SEC_Y
; 
1542         // End of Communication: Logic 0 followed by Sequence Y 
1545                 ToSend
[++ToSendMax
] = SEC_Z
; 
1546                 LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 6; 
1549                 ToSend
[++ToSendMax
] = SEC_Y
; 
1552         ToSend
[++ToSendMax
] = SEC_Y
; 
1554         // Convert to length of command: 
1558 //----------------------------------------------------------------------------- 
1559 // Prepare reader command to send to FPGA 
1560 //----------------------------------------------------------------------------- 
1561 void CodeIso14443aAsReaderPar(const uint8_t *cmd
, uint16_t len
, const uint8_t *parity
) { 
1562   CodeIso14443aBitsAsReaderPar(cmd
, len
*8, parity
); 
1565 //----------------------------------------------------------------------------- 
1566 // Wait for commands from reader 
1567 // Stop when button is pressed (return 1) or field was gone (return 2) 
1568 // Or return 0 when command is captured 
1569 //----------------------------------------------------------------------------- 
1570 static int EmGetCmd(uint8_t *received
, uint16_t *len
, uint8_t *parity
) { 
1573         uint32_t timer 
= 0, vtime 
= 0; 
1577         // Set FPGA mode to "simulated ISO 14443 tag", no modulation (listen 
1578         // only, since we are receiving, not transmitting). 
1579         // Signal field is off with the appropriate LED 
1581         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_TAGSIM_LISTEN
); 
1583         // Set ADC to read field strength 
1584         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_SWRST
; 
1585         AT91C_BASE_ADC
->ADC_MR 
= 
1586                                 ADC_MODE_PRESCALE(63) | 
1587                                 ADC_MODE_STARTUP_TIME(1) | 
1588                                 ADC_MODE_SAMPLE_HOLD_TIME(15); 
1589         AT91C_BASE_ADC
->ADC_CHER 
= ADC_CHANNEL(ADC_CHAN_HF
); 
1591         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
1593         // Now run a 'software UART' on the stream of incoming samples. 
1594         UartInit(received
, parity
); 
1597     uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1602                 if (BUTTON_PRESS()) return 1; 
1604                 // test if the field exists 
1605                 if (AT91C_BASE_ADC
->ADC_SR 
& ADC_END_OF_CONVERSION(ADC_CHAN_HF
)) { 
1607                         analogAVG 
+= AT91C_BASE_ADC
->ADC_CDR
[ADC_CHAN_HF
]; 
1608                         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
1609                         if (analogCnt 
>= 32) { 
1610                                 if ((MAX_ADC_HF_VOLTAGE 
* (analogAVG 
/ analogCnt
) >> 10) < MF_MINFIELDV
) { 
1611                                         vtime 
= GetTickCount(); 
1612                                         if (!timer
) timer 
= vtime
; 
1613                                         // 50ms no field --> card to idle state 
1614                                         if (vtime 
- timer 
> 50) return 2; 
1616                                         if (timer
) timer 
= 0; 
1622                 // receive and test the miller decoding 
1623         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
1624             b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1625                         if(MillerDecoding(b
, 0)) { 
1633 int EmSendCmd14443aRaw(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
) { 
1636         uint32_t ThisTransferTime
; 
1638         // Modulate Manchester 
1639         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_TAGSIM_MOD
); 
1641         // include correction bit if necessary 
1642         if (Uart
.parityBits 
& 0x01) { 
1643                 correctionNeeded 
= TRUE
; 
1645         // 1236, so correction bit needed 
1646         i 
= (correctionNeeded
) ? 0 : 1; 
1648         // clear receiving shift register and holding register 
1649         while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
1650         b 
= AT91C_BASE_SSC
->SSC_RHR
; (void) b
; 
1651         while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
1652         b 
= AT91C_BASE_SSC
->SSC_RHR
; (void) b
; 
1654         // wait for the FPGA to signal fdt_indicator == 1 (the FPGA is ready to queue new data in its delay line) 
1655         for (uint8_t j 
= 0; j 
< 5; j
++) {       // allow timeout - better late than never 
1656                 while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
1657                 if (AT91C_BASE_SSC
->SSC_RHR
) break; 
1660         while ((ThisTransferTime 
= GetCountSspClk()) & 0x00000007); 
1663         AT91C_BASE_SSC
->SSC_THR 
= SEC_F
; 
1666         for(; i 
< respLen
; ) { 
1667                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
1668                         AT91C_BASE_SSC
->SSC_THR 
= resp
[i
++]; 
1669                         FpgaSendQueueDelay 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1672                 if(BUTTON_PRESS()) break; 
1675         // Ensure that the FPGA Delay Queue is empty before we switch to TAGSIM_LISTEN again: 
1676         uint8_t fpga_queued_bits 
= FpgaSendQueueDelay 
>> 3;  // twich /8 ??   >>3,  
1677         for (i 
= 0; i 
<= fpga_queued_bits
/8 + 1; ) { 
1678                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
1679                         AT91C_BASE_SSC
->SSC_THR 
= SEC_F
; 
1680                         FpgaSendQueueDelay 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1684         LastTimeProxToAirStart 
= ThisTransferTime 
+ (correctionNeeded
?8:0); 
1688 int EmSend4bitEx(uint8_t resp
, bool correctionNeeded
){ 
1689         Code4bitAnswerAsTag(resp
); 
1690         int res 
= EmSendCmd14443aRaw(ToSend
, ToSendMax
, correctionNeeded
); 
1691         // do the tracing for the previous reader request and this tag answer: 
1692         uint8_t par
[1] = {0x00}; 
1693         GetParity(&resp
, 1, par
); 
1694         EmLogTrace(Uart
.output
,  
1696                                 Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1697                                 Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1701                                 LastTimeProxToAirStart
*16 + DELAY_ARM2AIR_AS_TAG
, 
1702                                 (LastTimeProxToAirStart 
+ LastProxToAirDuration
)*16 + DELAY_ARM2AIR_AS_TAG
,  
1707 int EmSend4bit(uint8_t resp
){ 
1708         return EmSend4bitEx(resp
, false); 
1711 int EmSendCmdExPar(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
, uint8_t *par
){ 
1712         CodeIso14443aAsTagPar(resp
, respLen
, par
); 
1713         int res 
= EmSendCmd14443aRaw(ToSend
, ToSendMax
, correctionNeeded
); 
1714         // do the tracing for the previous reader request and this tag answer: 
1715         EmLogTrace(Uart
.output
,  
1717                                 Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1718                                 Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1722                                 LastTimeProxToAirStart
*16 + DELAY_ARM2AIR_AS_TAG
, 
1723                                 (LastTimeProxToAirStart 
+ LastProxToAirDuration
)*16 + DELAY_ARM2AIR_AS_TAG
,  
1728 int EmSendCmdEx(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
){ 
1729         uint8_t par
[MAX_PARITY_SIZE
] = {0x00}; 
1730         GetParity(resp
, respLen
, par
); 
1731         return EmSendCmdExPar(resp
, respLen
, correctionNeeded
, par
); 
1734 int EmSendCmd(uint8_t *resp
, uint16_t respLen
){ 
1735         uint8_t par
[MAX_PARITY_SIZE
] = {0x00}; 
1736         GetParity(resp
, respLen
, par
); 
1737         return EmSendCmdExPar(resp
, respLen
, false, par
); 
1740 int EmSendCmdPar(uint8_t *resp
, uint16_t respLen
, uint8_t *par
){ 
1741         return EmSendCmdExPar(resp
, respLen
, false, par
); 
1744 bool EmLogTrace(uint8_t *reader_data
, uint16_t reader_len
, uint32_t reader_StartTime
, uint32_t reader_EndTime
, uint8_t *reader_Parity
, 
1745                                  uint8_t *tag_data
, uint16_t tag_len
, uint32_t tag_StartTime
, uint32_t tag_EndTime
, uint8_t *tag_Parity
) 
1747         // we cannot exactly measure the end and start of a received command from reader. However we know that the delay from 
1748         // end of the received command to start of the tag's (simulated by us) answer is n*128+20 or n*128+84 resp. 
1749         // with n >= 9. The start of the tags answer can be measured and therefore the end of the received command be calculated: 
1750         uint16_t reader_modlen 
= reader_EndTime 
- reader_StartTime
; 
1751         uint16_t approx_fdt 
= tag_StartTime 
- reader_EndTime
; 
1752         uint16_t exact_fdt 
= (approx_fdt 
- 20 + 32)/64 * 64 + 20; 
1753         reader_EndTime 
= tag_StartTime 
- exact_fdt
; 
1754         reader_StartTime 
= reader_EndTime 
- reader_modlen
; 
1756         if (!LogTrace(reader_data
, reader_len
, reader_StartTime
, reader_EndTime
, reader_Parity
, TRUE
)) 
1759                 return(!LogTrace(tag_data
, tag_len
, tag_StartTime
, tag_EndTime
, tag_Parity
, FALSE
)); 
1763 //----------------------------------------------------------------------------- 
1764 // Wait a certain time for tag response 
1765 //  If a response is captured return TRUE 
1766 //  If it takes too long return FALSE 
1767 //----------------------------------------------------------------------------- 
1768 static int GetIso14443aAnswerFromTag(uint8_t *receivedResponse
, uint8_t *receivedResponsePar
, uint16_t offset
) { 
1771         // Set FPGA mode to "reader listen mode", no modulation (listen 
1772         // only, since we are receiving, not transmitting). 
1773         // Signal field is on with the appropriate LED 
1775         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_READER_LISTEN
); 
1777         // Now get the answer from the card 
1778         DemodInit(receivedResponse
, receivedResponsePar
); 
1781     uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1786                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
1787                         b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1788                         if(ManchesterDecoding(b
, offset
, 0)) { 
1789                                 NextTransferTime 
= MAX(NextTransferTime
, Demod
.endTime 
- (DELAY_AIR2ARM_AS_READER 
+ DELAY_ARM2AIR_AS_READER
)/16 + FRAME_DELAY_TIME_PICC_TO_PCD
); 
1791                         } else if (c
++ > iso14a_timeout 
&& Demod
.state 
== DEMOD_UNSYNCD
) { 
1798 void ReaderTransmitBitsPar(uint8_t* frame
, uint16_t bits
, uint8_t *par
, uint32_t *timing
) { 
1800         CodeIso14443aBitsAsReaderPar(frame
, bits
, par
); 
1801         // Send command to tag 
1802         TransmitFor14443a(ToSend
, ToSendMax
, timing
); 
1803         if(trigger
) LED_A_ON(); 
1805         LogTrace(frame
, nbytes(bits
), (LastTimeProxToAirStart
<<4) + DELAY_ARM2AIR_AS_READER
, ((LastTimeProxToAirStart 
+ LastProxToAirDuration
)<<4) + DELAY_ARM2AIR_AS_READER
, par
, TRUE
); 
1808 void ReaderTransmitPar(uint8_t* frame
, uint16_t len
, uint8_t *par
, uint32_t *timing
) { 
1809   ReaderTransmitBitsPar(frame
, len
*8, par
, timing
); 
1812 void ReaderTransmitBits(uint8_t* frame
, uint16_t len
, uint32_t *timing
) { 
1813         // Generate parity and redirect 
1814         uint8_t par
[MAX_PARITY_SIZE
] = {0x00}; 
1815         GetParity(frame
, len
/8, par
);   
1816         ReaderTransmitBitsPar(frame
, len
, par
, timing
); 
1819 void ReaderTransmit(uint8_t* frame
, uint16_t len
, uint32_t *timing
) { 
1820         // Generate parity and redirect 
1821         uint8_t par
[MAX_PARITY_SIZE
] = {0x00}; 
1822         GetParity(frame
, len
, par
); 
1823         ReaderTransmitBitsPar(frame
, len
*8, par
, timing
); 
1826 int ReaderReceiveOffset(uint8_t* receivedAnswer
, uint16_t offset
, uint8_t *parity
) { 
1827         if (!GetIso14443aAnswerFromTag(receivedAnswer
, parity
, offset
)) 
1829         LogTrace(receivedAnswer
, Demod
.len
, Demod
.startTime
*16 - DELAY_AIR2ARM_AS_READER
, Demod
.endTime
*16 - DELAY_AIR2ARM_AS_READER
, parity
, FALSE
); 
1833 int ReaderReceive(uint8_t *receivedAnswer
, uint8_t *parity
) { 
1834         if (!GetIso14443aAnswerFromTag(receivedAnswer
, parity
, 0)) 
1836         LogTrace(receivedAnswer
, Demod
.len
, Demod
.startTime
*16 - DELAY_AIR2ARM_AS_READER
, Demod
.endTime
*16 - DELAY_AIR2ARM_AS_READER
, parity
, FALSE
); 
1840 // performs iso14443a anticollision (optional) and card select procedure 
1841 // fills the uid and cuid pointer unless NULL 
1842 // fills the card info record unless NULL 
1843 // if anticollision is false, then the UID must be provided in uid_ptr[]  
1844 // and num_cascades must be set (1: 4 Byte UID, 2: 7 Byte UID, 3: 10 Byte UID) 
1845 int iso14443a_select_card(byte_t 
*uid_ptr
, iso14a_card_select_t 
*p_hi14a_card
, uint32_t *cuid_ptr
, bool anticollision
, uint8_t num_cascades
) { 
1846         uint8_t wupa
[]       = { ISO14443A_CMD_WUPA 
};  // 0x26 - ISO14443A_CMD_REQA  0x52 - ISO14443A_CMD_WUPA 
1847         uint8_t sel_all
[]    = { ISO14443A_CMD_ANTICOLL_OR_SELECT
,0x20 }; 
1848         uint8_t sel_uid
[]    = { ISO14443A_CMD_ANTICOLL_OR_SELECT
,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 
1849         uint8_t rats
[]       = { ISO14443A_CMD_RATS
,0x80,0x00,0x00 }; // FSD=256, FSDI=8, CID=0 
1850         uint8_t resp
[MAX_FRAME_SIZE
] = {0}; // theoretically. A usual RATS will be much smaller 
1851         uint8_t resp_par
[MAX_PARITY_SIZE
] = {0}; 
1852         byte_t uid_resp
[4] = {0}; 
1853         size_t uid_resp_len 
= 0; 
1855         uint8_t sak 
= 0x04; // cascade uid 
1856         int cascade_level 
= 0; 
1859         // Broadcast for a card, WUPA (0x52) will force response from all cards in the field 
1860     ReaderTransmitBitsPar(wupa
, 7, NULL
, NULL
); 
1863         if(!ReaderReceive(resp
, resp_par
)) return 0; 
1866                 memcpy(p_hi14a_card
->atqa
, resp
, 2); 
1867                 p_hi14a_card
->uidlen 
= 0; 
1868                 memset(p_hi14a_card
->uid
,0,10); 
1871         if (anticollision
) { 
1874                         memset(uid_ptr
,0,10); 
1877         // reset the PCB block number 
1878         iso14_pcb_blocknum 
= 0; 
1880         // check for proprietary anticollision: 
1881         if ((resp
[0] & 0x1F) == 0) return 3; 
1883         // OK we will select at least at cascade 1, lets see if first byte of UID was 0x88 in 
1884         // which case we need to make a cascade 2 request and select - this is a long UID 
1885         // While the UID is not complete, the 3nd bit (from the right) is set in the SAK. 
1886         for(; sak 
& 0x04; cascade_level
++) { 
1887                 // SELECT_* (L1: 0x93, L2: 0x95, L3: 0x97) 
1888                 sel_uid
[0] = sel_all
[0] = 0x93 + cascade_level 
* 2; 
1890                 if (anticollision
) { 
1892                         ReaderTransmit(sel_all
, sizeof(sel_all
), NULL
); 
1893                         if (!ReaderReceive(resp
, resp_par
)) return 0; 
1895                         if (Demod
.collisionPos
) {                       // we had a collision and need to construct the UID bit by bit 
1896                                 memset(uid_resp
, 0, 4); 
1897                                 uint16_t uid_resp_bits 
= 0; 
1898                                 uint16_t collision_answer_offset 
= 0; 
1899                                 // anti-collision-loop: 
1900                                 while (Demod
.collisionPos
) { 
1901                                         Dbprintf("Multiple tags detected. Collision after Bit %d", Demod
.collisionPos
); 
1902                                         for (uint16_t i 
= collision_answer_offset
; i 
< Demod
.collisionPos
; i
++, uid_resp_bits
++) {      // add valid UID bits before collision point 
1903                                                 uint16_t UIDbit 
= (resp
[i
/8] >> (i 
% 8)) & 0x01; 
1904                                                 uid_resp
[uid_resp_bits 
/ 8] |= UIDbit 
<< (uid_resp_bits 
% 8); 
1906                                         uid_resp
[uid_resp_bits
/8] |= 1 << (uid_resp_bits 
% 8);                                  // next time select the card(s) with a 1 in the collision position 
1908                                         // construct anticollosion command: 
1909                                         sel_uid
[1] = ((2 + uid_resp_bits
/8) << 4) | (uid_resp_bits 
& 0x07);     // length of data in bytes and bits 
1910                                         for (uint16_t i 
= 0; i 
<= uid_resp_bits
/8; i
++) { 
1911                                                 sel_uid
[2+i
] = uid_resp
[i
]; 
1913                                         collision_answer_offset 
= uid_resp_bits%8
; 
1914                                         ReaderTransmitBits(sel_uid
, 16 + uid_resp_bits
, NULL
); 
1915                                         if (!ReaderReceiveOffset(resp
, collision_answer_offset
, resp_par
)) return 0; 
1917                                 // finally, add the last bits and BCC of the UID 
1918                                 for (uint16_t i 
= collision_answer_offset
; i 
< (Demod
.len
-1)*8; i
++, uid_resp_bits
++) { 
1919                                         uint16_t UIDbit 
= (resp
[i
/8] >> (i%8
)) & 0x01; 
1920                                         uid_resp
[uid_resp_bits
/8] |= UIDbit 
<< (uid_resp_bits 
% 8); 
1923                         } else {                // no collision, use the response to SELECT_ALL as current uid 
1924                                 memcpy(uid_resp
, resp
, 4); 
1928                         if (cascade_level 
< num_cascades 
- 1) { 
1930                                 memcpy(uid_resp
+1, uid_ptr
+cascade_level
*3, 3); 
1932                                 memcpy(uid_resp
, uid_ptr
+cascade_level
*3, 4); 
1937                 // calculate crypto UID. Always use last 4 Bytes. 
1939                         *cuid_ptr 
= bytes_to_num(uid_resp
, 4); 
1941                 // Construct SELECT UID command 
1942                 sel_uid
[1] = 0x70;                                                                                                      // transmitting a full UID (1 Byte cmd, 1 Byte NVB, 4 Byte UID, 1 Byte BCC, 2 Bytes CRC) 
1943                 memcpy(sel_uid
+2, uid_resp
, 4);                                                                         // the UID received during anticollision, or the provided UID 
1944                 sel_uid
[6] = sel_uid
[2] ^ sel_uid
[3] ^ sel_uid
[4] ^ sel_uid
[5];         // calculate and add BCC 
1945                 AppendCrc14443a(sel_uid
, 7);                                                                            // calculate and add CRC 
1946                 ReaderTransmit(sel_uid
, sizeof(sel_uid
), NULL
); 
1949                 if (!ReaderReceive(resp
, resp_par
)) return 0; 
1953                 // Test if more parts of the uid are coming 
1954                 if ((sak 
& 0x04) /* && uid_resp[0] == 0x88 */) { 
1955                         // Remove first byte, 0x88 is not an UID byte, it CT, see page 3 of: 
1956                         // http://www.nxp.com/documents/application_note/AN10927.pdf 
1957                         uid_resp
[0] = uid_resp
[1]; 
1958                         uid_resp
[1] = uid_resp
[2]; 
1959                         uid_resp
[2] = uid_resp
[3];  
1963                 if(uid_ptr 
&& anticollision
) 
1964                         memcpy(uid_ptr 
+ (cascade_level
*3), uid_resp
, uid_resp_len
); 
1967                         memcpy(p_hi14a_card
->uid 
+ (cascade_level
*3), uid_resp
, uid_resp_len
); 
1968                         p_hi14a_card
->uidlen 
+= uid_resp_len
; 
1973                 p_hi14a_card
->sak 
= sak
; 
1974                 p_hi14a_card
->ats_len 
= 0; 
1977         // non iso14443a compliant tag 
1978         if( (sak 
& 0x20) == 0) return 2;  
1980         // Request for answer to select 
1981         AppendCrc14443a(rats
, 2); 
1982         ReaderTransmit(rats
, sizeof(rats
), NULL
); 
1984         if (!(len 
= ReaderReceive(resp
, resp_par
))) return 0; 
1987                 memcpy(p_hi14a_card
->ats
, resp
, sizeof(p_hi14a_card
->ats
)); 
1988                 p_hi14a_card
->ats_len 
= len
; 
1991         // set default timeout based on ATS 
1992         iso14a_set_ATS_timeout(resp
); 
1996 void iso14443a_setup(uint8_t fpga_minor_mode
) { 
1998         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1999         // Set up the synchronous serial port 
2001         // connect Demodulated Signal to ADC: 
2002         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
2005         // Signal field is on with the appropriate LED 
2006         if (fpga_minor_mode 
== FPGA_HF_ISO14443A_READER_MOD 
|| 
2007                 fpga_minor_mode 
== FPGA_HF_ISO14443A_READER_LISTEN
) 
2010         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| fpga_minor_mode
); 
2017         // Prepare the demodulation functions 
2020         NextTransferTime 
= 2 * DELAY_ARM2AIR_AS_READER
; 
2021         iso14a_set_timeout(10*106); // 20ms default      
2024 int iso14_apdu(uint8_t *cmd
, uint16_t cmd_len
, void *data
) { 
2025         uint8_t parity
[MAX_PARITY_SIZE
] = {0x00}; 
2026         uint8_t real_cmd
[cmd_len
+4]; 
2027         real_cmd
[0] = 0x0a; //I-Block 
2028         // put block number into the PCB 
2029         real_cmd
[0] |= iso14_pcb_blocknum
; 
2030         real_cmd
[1] = 0x00; //CID: 0 //FIXME: allow multiple selected cards 
2031         memcpy(real_cmd
+2, cmd
, cmd_len
); 
2032         AppendCrc14443a(real_cmd
,cmd_len
+2); 
2034         ReaderTransmit(real_cmd
, cmd_len
+4, NULL
); 
2035         size_t len 
= ReaderReceive(data
, parity
); 
2039         uint8_t *data_bytes 
= (uint8_t *) data
; 
2041         // if we received an I- or R(ACK)-Block with a block number equal to the 
2042         // current block number, toggle the current block number 
2043         if (len 
>= 4 // PCB+CID+CRC = 4 bytes 
2044                  && ((data_bytes
[0] & 0xC0) == 0 // I-Block 
2045                      || (data_bytes
[0] & 0xD0) == 0x80) // R-Block with ACK bit set to 0 
2046                  && (data_bytes
[0] & 0x01) == iso14_pcb_blocknum
) // equal block numbers 
2048                 iso14_pcb_blocknum 
^= 1; 
2054 //----------------------------------------------------------------------------- 
2055 // Read an ISO 14443a tag. Send out commands and store answers. 
2056 //----------------------------------------------------------------------------- 
2057 void ReaderIso14443a(UsbCommand 
*c
) { 
2058         iso14a_command_t param 
= c
->arg
[0]; 
2059         size_t len 
= c
->arg
[1] & 0xffff; 
2060         size_t lenbits 
= c
->arg
[1] >> 16; 
2061         uint32_t timeout 
= c
->arg
[2]; 
2062         uint8_t *cmd 
= c
->d
.asBytes
; 
2064         byte_t buf
[USB_CMD_DATA_SIZE
] = {0x00}; 
2065         uint8_t par
[MAX_PARITY_SIZE
] = {0x00}; 
2067         if (param 
& ISO14A_CONNECT
) 
2072         if (param 
& ISO14A_REQUEST_TRIGGER
) 
2073                 iso14a_set_trigger(TRUE
); 
2075         if (param 
& ISO14A_CONNECT
) { 
2076                 iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN
); 
2077                 if(!(param 
& ISO14A_NO_SELECT
)) { 
2078                         iso14a_card_select_t 
*card 
= (iso14a_card_select_t
*)buf
; 
2079                         arg0 
= iso14443a_select_card(NULL
,card
,NULL
, true, 0); 
2080                         cmd_send(CMD_ACK
, arg0
, card
->uidlen
, 0, buf
, sizeof(iso14a_card_select_t
)); 
2081                         // if it fails,  the cmdhf14a.c client quites.. however this one still executes. 
2082                         if ( arg0 
== 0 ) return; 
2086         if (param 
& ISO14A_SET_TIMEOUT
) 
2087                 iso14a_set_timeout(timeout
); 
2089         if (param 
& ISO14A_APDU
) { 
2090                 arg0 
= iso14_apdu(cmd
, len
, buf
); 
2091                 cmd_send(CMD_ACK
,arg0
,0,0,buf
,sizeof(buf
)); 
2094         if (param 
& ISO14A_RAW
) { 
2095                 if (param 
& ISO14A_APPEND_CRC
) { 
2096                         if (param 
& ISO14A_TOPAZMODE
) 
2097                                 AppendCrc14443b(cmd
,len
); 
2099                                 AppendCrc14443a(cmd
,len
); 
2102                         if (lenbits
) lenbits 
+= 16; 
2104                 if (lenbits
>0) {                                // want to send a specific number of bits (e.g. short commands) 
2105                         if (param 
& ISO14A_TOPAZMODE
) { 
2106                                 int bits_to_send 
= lenbits
; 
2108                                 ReaderTransmitBitsPar(&cmd
[i
++], MIN(bits_to_send
, 7), NULL
, NULL
);             // first byte is always short (7bits) and no parity 
2110                                 while (bits_to_send 
> 0) { 
2111                                         ReaderTransmitBitsPar(&cmd
[i
++], MIN(bits_to_send
, 8), NULL
, NULL
);     // following bytes are 8 bit and no parity 
2115                         GetParity(cmd
, lenbits
/8, par
); 
2116                                 ReaderTransmitBitsPar(cmd
, lenbits
, par
, NULL
);                                                 // bytes are 8 bit with odd parity 
2118                 } else {                                        // want to send complete bytes only 
2119                         if (param 
& ISO14A_TOPAZMODE
) { 
2121                                 ReaderTransmitBitsPar(&cmd
[i
++], 7, NULL
, NULL
);                                                // first byte: 7 bits, no paritiy 
2123                                         ReaderTransmitBitsPar(&cmd
[i
++], 8, NULL
, NULL
);                                        // following bytes: 8 bits, no paritiy 
2126                                 ReaderTransmit(cmd
,len
, NULL
);                                                                                  // 8 bits, odd parity 
2129                 arg0 
= ReaderReceive(buf
, par
); 
2130                 cmd_send(CMD_ACK
,arg0
,0,0,buf
,sizeof(buf
)); 
2133         if (param 
& ISO14A_REQUEST_TRIGGER
) 
2134                 iso14a_set_trigger(FALSE
); 
2136         if (param 
& ISO14A_NO_DISCONNECT
) 
2139         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
2144 // Determine the distance between two nonces. 
2145 // Assume that the difference is small, but we don't know which is first. 
2146 // Therefore try in alternating directions. 
2147 int32_t dist_nt(uint32_t nt1
, uint32_t nt2
) { 
2149         if (nt1 
== nt2
) return 0; 
2151         uint32_t nttmp1 
= nt1
; 
2152         uint32_t nttmp2 
= nt2
; 
2154         // 0xFFFF -- Half up and half down to find distance between nonces 
2155         for (uint16_t i 
= 1; i 
< 32768/8; i 
+= 8) { 
2156                 nttmp1 
= prng_successor(nttmp1
, 1);     if (nttmp1 
== nt2
) return i
; 
2157                 nttmp1 
= prng_successor(nttmp1
, 1);     if (nttmp1 
== nt2
) return i
+1; 
2158                 nttmp1 
= prng_successor(nttmp1
, 1);     if (nttmp1 
== nt2
) return i
+2; 
2159                 nttmp1 
= prng_successor(nttmp1
, 1);     if (nttmp1 
== nt2
) return i
+3; 
2160                 nttmp1 
= prng_successor(nttmp1
, 1);     if (nttmp1 
== nt2
) return i
+4; 
2161                 nttmp1 
= prng_successor(nttmp1
, 1);     if (nttmp1 
== nt2
) return i
+5; 
2162                 nttmp1 
= prng_successor(nttmp1
, 1);     if (nttmp1 
== nt2
) return i
+6; 
2163                 nttmp1 
= prng_successor(nttmp1
, 1);     if (nttmp1 
== nt2
) return i
+7; 
2165                 nttmp2 
= prng_successor(nttmp2
, 1);     if (nttmp2 
== nt1
) return -i
; 
2166                 nttmp2 
= prng_successor(nttmp2
, 1);     if (nttmp2 
== nt1
) return -(i
+1); 
2167                 nttmp2 
= prng_successor(nttmp2
, 1);     if (nttmp2 
== nt1
) return -(i
+2); 
2168                 nttmp2 
= prng_successor(nttmp2
, 1);     if (nttmp2 
== nt1
) return -(i
+3); 
2169                 nttmp2 
= prng_successor(nttmp2
, 1);     if (nttmp2 
== nt1
) return -(i
+4); 
2170                 nttmp2 
= prng_successor(nttmp2
, 1);     if (nttmp2 
== nt1
) return -(i
+5); 
2171                 nttmp2 
= prng_successor(nttmp2
, 1);     if (nttmp2 
== nt1
) return -(i
+6); 
2172                 nttmp2 
= prng_successor(nttmp2
, 1);     if (nttmp2 
== nt1
) return -(i
+7);                
2174         // either nt1 or nt2 are invalid nonces  
2178 //----------------------------------------------------------------------------- 
2179 // Recover several bits of the cypher stream. This implements (first stages of) 
2180 // the algorithm described in "The Dark Side of Security by Obscurity and 
2181 // Cloning MiFare Classic Rail and Building Passes, Anywhere, Anytime" 
2182 // (article by Nicolas T. Courtois, 2009) 
2183 //----------------------------------------------------------------------------- 
2185 void ReaderMifare(bool first_try
, uint8_t block
, uint8_t keytype 
) { 
2187         uint8_t mf_auth
[]       = { keytype
, block
, 0x00, 0x00 }; 
2188         uint8_t mf_nr_ar
[]      = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; 
2189         uint8_t uid
[10]         = {0,0,0,0,0,0,0,0,0,0}; 
2190         uint8_t par_list
[8]     = {0,0,0,0,0,0,0,0}; 
2191         uint8_t ks_list
[8]      = {0,0,0,0,0,0,0,0}; 
2192         uint8_t receivedAnswer
[MAX_MIFARE_FRAME_SIZE
] = {0x00}; 
2193         uint8_t receivedAnswerPar
[MAX_MIFARE_PARITY_SIZE
] = {0x00}; 
2194         uint8_t par
[1] = {0};   // maximum 8 Bytes to be sent here, 1 byte parity is therefore enough 
2197         uint32_t previous_nt 
= 0;        
2200         int32_t catch_up_cycles 
= 0; 
2201         int32_t last_catch_up 
= 0; 
2203         int32_t nt_distance 
= 0; 
2205         uint16_t elapsed_prng_sequences 
= 1; 
2206         uint16_t consecutive_resyncs 
= 0; 
2207         uint16_t unexpected_random 
= 0; 
2208         uint16_t sync_tries 
= 0; 
2210         // static variables here, is re-used in the next call 
2211         static uint32_t nt_attacked 
= 0; 
2212         static uint32_t sync_time 
= 0; 
2213         static uint32_t sync_cycles 
= 0; 
2214         static uint8_t par_low 
= 0; 
2215         static uint8_t mf_nr_ar3 
= 0; 
2217         #define PRNG_SEQUENCE_LENGTH    (1 << 16) 
2218         #define MAX_UNEXPECTED_RANDOM   4               // maximum number of unexpected (i.e. real) random numbers when trying to sync. Then give up. 
2219         #define MAX_SYNC_TRIES          32 
2221         AppendCrc14443a(mf_auth
, 2); 
2223         BigBuf_free(); BigBuf_Clear_ext(false);  
2226         iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD
); 
2228         sync_time 
= GetCountSspClk() & 0xfffffff8; 
2229         sync_cycles 
= PRNG_SEQUENCE_LENGTH
; // Mifare Classic's random generator repeats every 2^16 cycles (and so do the nonces).               
2232    if (MF_DBGLEVEL 
>= 4)        Dbprintf("Mifare::Sync %u", sync_time
); 
2238                 // we were unsuccessful on a previous call.  
2239                 // Try another READER nonce (first 3 parity bits remain the same) 
2241                 mf_nr_ar
[3] = mf_nr_ar3
; 
2245         bool have_uid 
= FALSE
; 
2246         uint8_t cascade_levels 
= 0; 
2250         for(i 
= 0; TRUE
; ++i
) { 
2254                 // Test if the action was cancelled 
2255                 if(BUTTON_PRESS()) { 
2260                 // this part is from Piwi's faster nonce collecting part in Hardnested. 
2261                 if (!have_uid
) { // need a full select cycle to get the uid first 
2262                         iso14a_card_select_t card_info
;          
2263                         if(!iso14443a_select_card(uid
, &card_info
, &cuid
, true, 0)) { 
2264                                 if (MF_DBGLEVEL 
>= 4)   Dbprintf("Mifare: Can't select card (ALL)"); 
2267                         switch (card_info
.uidlen
) { 
2268                                 case 4 : cascade_levels 
= 1; break; 
2269                                 case 7 : cascade_levels 
= 2; break; 
2270                                 case 10: cascade_levels 
= 3; break; 
2274                 } else { // no need for anticollision. We can directly select the card 
2275                         if(!iso14443a_select_card(uid
, NULL
, &cuid
, false, cascade_levels
)) { 
2276                                 if (MF_DBGLEVEL 
>= 4)   Dbprintf("Mifare: Can't select card (UID)"); 
2281                 // Sending timeslot of ISO14443a frame           
2282                 sync_time 
= (sync_time 
& 0xfffffff8 ) + sync_cycles 
+ catch_up_cycles
; 
2283                 catch_up_cycles 
= 0; 
2285                 // if we missed the sync time already, advance to the next nonce repeat 
2286                 while( GetCountSspClk() > sync_time
) { 
2287                         ++elapsed_prng_sequences
; 
2288                         sync_time 
= (sync_time 
& 0xfffffff8 ) + sync_cycles
; 
2291                 // Transmit MIFARE_CLASSIC_AUTH at synctime. Should result in returning the same tag nonce (== nt_attacked) 
2292                 ReaderTransmit(mf_auth
, sizeof(mf_auth
), &sync_time
); 
2294                 // Receive the (4 Byte) "random" nonce from TAG 
2295                 if (!ReaderReceive(receivedAnswer
, receivedAnswerPar
)) 
2299                 nt 
= bytes_to_num(receivedAnswer
, 4); 
2301                 // Transmit reader nonce with fake par 
2302                 ReaderTransmitPar(mf_nr_ar
, sizeof(mf_nr_ar
), par
, NULL
); 
2304                 // we didn't calibrate our clock yet, 
2305                 // iceman: has to be calibrated every time. 
2306                 if (previous_nt 
&& !nt_attacked
) {  
2308                         nt_distance 
= dist_nt(previous_nt
, nt
); 
2310                         // if no distance between,  then we are in sync. 
2311                         if (nt_distance 
== 0) { 
2314                                 if (nt_distance 
== -99999) { // invalid nonce received 
2315                                         ++unexpected_random
; 
2316                                         if (unexpected_random 
> MAX_UNEXPECTED_RANDOM
) { 
2317                                                 isOK 
= -3;              // Card has an unpredictable PRNG. Give up       
2320                                                 if (sync_cycles 
<= 0) sync_cycles 
+= PRNG_SEQUENCE_LENGTH
; 
2322                                                 continue;               // continue trying... 
2326                                 if (++sync_tries 
> MAX_SYNC_TRIES
) { 
2327                                         isOK 
= -4;                      // Card's PRNG runs at an unexpected frequency or resets unexpectedly 
2331                                 sync_cycles 
= (sync_cycles 
- nt_distance
)/elapsed_prng_sequences
; 
2333                                 if (sync_cycles 
<= 0) 
2334                                         sync_cycles 
+= PRNG_SEQUENCE_LENGTH
; 
2336                                 if (MF_DBGLEVEL 
>= 4) 
2337                                         Dbprintf("calibrating in cycle %d. nt_distance=%d, elapsed_prng_sequences=%d, new sync_cycles: %d\n", i
, nt_distance
, elapsed_prng_sequences
, sync_cycles
); 
2345                 if ( (nt 
!= nt_attacked
) && nt_attacked
) {      // we somehow lost sync. Try to catch up again... 
2347                         catch_up_cycles 
= ABS(dist_nt(nt_attacked
, nt
)); 
2348                         if (catch_up_cycles 
== 99999) {                 // invalid nonce received. Don't resync on that one. 
2349                                 catch_up_cycles 
= 0; 
2353                         catch_up_cycles 
/= elapsed_prng_sequences
; 
2355                         if (catch_up_cycles 
== last_catch_up
) { 
2356                                 ++consecutive_resyncs
; 
2358                                 last_catch_up 
= catch_up_cycles
; 
2359                             consecutive_resyncs 
= 0; 
2362                         if (consecutive_resyncs 
< 3) { 
2363                                 if (MF_DBGLEVEL 
>= 4) 
2364                                         Dbprintf("Lost sync in cycle %d. nt_distance=%d. Consecutive Resyncs = %d. Trying one time catch up...\n", i
, catch_up_cycles
, consecutive_resyncs
); 
2366                                 sync_cycles 
+= catch_up_cycles
; 
2368                                 if (MF_DBGLEVEL 
>= 4)  
2369                                         Dbprintf("Lost sync in cycle %d for the fourth time consecutively (nt_distance = %d). Adjusting sync_cycles to %d.\n", i
, catch_up_cycles
, sync_cycles
); 
2372                                 catch_up_cycles 
= 0; 
2373                                 consecutive_resyncs 
= 0; 
2378                 // Receive answer. This will be a 4 Bit NACK when the 8 parity bits are OK after decoding 
2379                 if (ReaderReceive(receivedAnswer
, receivedAnswerPar
)) { 
2380                         catch_up_cycles 
= 8;    // the PRNG is delayed by 8 cycles due to the NAC (4Bits = 0x05 encrypted) transfer 
2383                                 par_low 
= par
[0] & 0xE0; // there is no need to check all parities for other nt_diff. Parity Bits for mf_nr_ar[0..2] won't change 
2385                         par_list
[nt_diff
] = SwapBits(par
[0], 8); 
2386                         ks_list
[nt_diff
] = receivedAnswer
[0] ^ 0x05;  // xor with NACK value to get keystream 
2388                         // Test if the information is complete 
2389                         if (nt_diff 
== 0x07) { 
2394                         nt_diff 
= (nt_diff 
+ 1) & 0x07; 
2395                         mf_nr_ar
[3] = (mf_nr_ar
[3] & 0x1F) | (nt_diff 
<< 5); 
2400                         if (nt_diff 
== 0 && first_try
) { 
2402                                 if (par
[0] == 0x00) {   // tried all 256 possible parities without success. Card doesn't send NACK. 
2408                                 par
[0] = ((par
[0] & 0x1F) + 1) | par_low
; 
2412                 // reset the resyncs since we got a complete transaction on right time. 
2413                 consecutive_resyncs 
= 0; 
2416         mf_nr_ar
[3] &= 0x1F; 
2418         if (MF_DBGLEVEL 
>= 4) Dbprintf("Number of sent auth requestes: %u", i
); 
2420         uint8_t buf
[28] = {0x00}; 
2421         memset(buf
, 0x00, sizeof(buf
)); 
2422         num_to_bytes(cuid
, 4, buf
); 
2423         num_to_bytes(nt
, 4, buf 
+ 4); 
2424         memcpy(buf 
+ 8,  par_list
, 8); 
2425         memcpy(buf 
+ 16, ks_list
, 8); 
2426         memcpy(buf 
+ 24, mf_nr_ar
, 4); 
2428         cmd_send(CMD_ACK
, isOK
, 0, 0, buf
, sizeof(buf
) ); 
2430         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
2437   *MIFARE 1K simulate. 
2440   *     FLAG_INTERACTIVE                - In interactive mode, we are expected to finish the operation with an ACK 
2441   * FLAG_4B_UID_IN_DATA         - use 4-byte UID in the data-section 
2442   * FLAG_7B_UID_IN_DATA         - use 7-byte UID in the data-section 
2443   * FLAG_10B_UID_IN_DATA        - use 10-byte UID in the data-section 
2444   * FLAG_UID_IN_EMUL            - use 4-byte UID from emulator memory 
2445   *     FLAG_NR_AR_ATTACK               - collect NR_AR responses for bruteforcing later 
2446   *@param exitAfterNReads, exit simulation after n blocks have been read, 0 is inifite 
2448 void Mifare1ksim(uint8_t flags
, uint8_t exitAfterNReads
, uint8_t arg2
, uint8_t *datain
) { 
2451         fast_prand( GetTickCount() ); 
2453         int cardSTATE 
= MFEMUL_NOFIELD
; 
2454         int _UID_LEN 
= 0;  // 4, 7, 10 
2455         int vHf 
= 0;    // in mV 
2457         uint32_t selTimer 
= 0; 
2458         uint32_t authTimer 
= 0; 
2460         uint8_t cardWRBL 
= 0; 
2461         uint8_t cardAUTHSC 
= 0; 
2462         uint8_t cardAUTHKEY 
= 0xff;  // no authentication 
2465         uint32_t cardINTREG 
= 0; 
2466         uint8_t cardINTBLOCK 
= 0; 
2467         struct Crypto1State mpcs 
= {0, 0}; 
2468         struct Crypto1State 
*pcs
; 
2470         uint32_t numReads 
= 0;  // Counts numer of times reader read a block 
2471         uint8_t receivedCmd
[MAX_MIFARE_FRAME_SIZE
] = {0x00}; 
2472         uint8_t receivedCmd_par
[MAX_MIFARE_PARITY_SIZE
] = {0x00}; 
2473         uint8_t response
[MAX_MIFARE_FRAME_SIZE
] = {0x00}; 
2474         uint8_t response_par
[MAX_MIFARE_PARITY_SIZE
] = {0x00}; 
2476         uint8_t atqa
[]   = {0x04, 0x00}; // Mifare classic 1k 
2477         uint8_t sak_4
[]  = {0x0C, 0x00, 0x00}; // CL1 - 4b uid 
2478         uint8_t sak_7
[]  = {0x0C, 0x00, 0x00}; // CL2 - 7b uid 
2479         uint8_t sak_10
[] = {0x0C, 0x00, 0x00}; // CL3 - 10b uid 
2480         // uint8_t sak[] = {0x09, 0x3f, 0xcc };  // Mifare Mini  
2482         uint8_t rUIDBCC1
[] = {0xde, 0xad, 0xbe, 0xaf, 0x62};  
2483         uint8_t rUIDBCC2
[] = {0xde, 0xad, 0xbe, 0xaf, 0x62};  
2484         uint8_t rUIDBCC3
[] = {0xde, 0xad, 0xbe, 0xaf, 0x62}; 
2486         // TAG Nonce - Authenticate response 
2487         uint8_t rAUTH_NT
[4]; 
2488         uint32_t nonce 
= prand(); 
2489         num_to_bytes(nonce
, 4, rAUTH_NT
); 
2491         // uint8_t rAUTH_NT[] = {0x55, 0x41, 0x49, 0x92};// nonce from nested? why this? 
2492         uint8_t rAUTH_AT
[] = {0x00, 0x00, 0x00, 0x00}; 
2494         // Here, we collect CUID, NT, NR, AR, CUID2, NT2, NR2, AR2 
2495         // This can be used in a reader-only attack. 
2496         nonces_t ar_nr_nonces
[ATTACK_KEY_COUNT
]; 
2497         memset(ar_nr_nonces
, 0x00, sizeof(ar_nr_nonces
)); 
2499         // -- Determine the UID 
2500         // Can be set from emulator memory or incoming data 
2501         // Length: 4,7,or 10 bytes 
2502         if ( (flags 
& FLAG_UID_IN_EMUL
) == FLAG_UID_IN_EMUL
) 
2503                 emlGetMemBt(datain
, 0, 10);  // load 10bytes from EMUL to the datain pointer. to be used below. 
2505         if ( (flags 
& FLAG_4B_UID_IN_DATA
) == FLAG_4B_UID_IN_DATA
) { 
2506                 memcpy(rUIDBCC1
, datain
, 4); 
2508         } else if ( (flags 
& FLAG_7B_UID_IN_DATA
) == FLAG_7B_UID_IN_DATA
) { 
2509                 memcpy(&rUIDBCC1
[1], datain
,   3); 
2510                 memcpy( rUIDBCC2
,    datain
+3, 4); 
2512         } else if ( (flags 
& FLAG_10B_UID_IN_DATA
) == FLAG_10B_UID_IN_DATA
) { 
2513                 memcpy(&rUIDBCC1
[1], datain
,   3); 
2514                 memcpy(&rUIDBCC2
[1], datain
+3, 3); 
2515                 memcpy( rUIDBCC3
,    datain
+6, 4); 
2523                         cuid 
= bytes_to_num(rUIDBCC1
, 4); 
2525                         rUIDBCC1
[4] = rUIDBCC1
[0] ^ rUIDBCC1
[1] ^ rUIDBCC1
[2] ^ rUIDBCC1
[3]; 
2526                         if (MF_DBGLEVEL 
>= 2)   { 
2527                                 Dbprintf("4B UID: %02x%02x%02x%02x",  
2539                         cuid 
= bytes_to_num(rUIDBCC2
, 4);                        
2543                         rUIDBCC1
[4] = rUIDBCC1
[0] ^ rUIDBCC1
[1] ^ rUIDBCC1
[2] ^ rUIDBCC1
[3];  
2544                         rUIDBCC2
[4] = rUIDBCC2
[0] ^ rUIDBCC2
[1] ^ rUIDBCC2
[2] ^ rUIDBCC2
[3];  
2545                         if (MF_DBGLEVEL 
>= 2)   { 
2546                                 Dbprintf("7B UID: %02x %02x %02x %02x %02x %02x %02x", 
2561                         cuid 
= bytes_to_num(rUIDBCC3
, 4); 
2566                         rUIDBCC1
[4] = rUIDBCC1
[0] ^ rUIDBCC1
[1] ^ rUIDBCC1
[2] ^ rUIDBCC1
[3]; 
2567                         rUIDBCC2
[4] = rUIDBCC2
[0] ^ rUIDBCC2
[1] ^ rUIDBCC2
[2] ^ rUIDBCC2
[3]; 
2568                         rUIDBCC3
[4] = rUIDBCC3
[0] ^ rUIDBCC3
[1] ^ rUIDBCC3
[2] ^ rUIDBCC3
[3]; 
2570                         if (MF_DBGLEVEL 
>= 2)   { 
2571                                 Dbprintf("10B UID: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", 
2589         ComputeCrc14443(CRC_14443_A
, sak_4
, 1, &sak_4
[1], &sak_4
[2]); 
2590         ComputeCrc14443(CRC_14443_A
, sak_7
, 1, &sak_7
[1], &sak_7
[2]); 
2591         ComputeCrc14443(CRC_14443_A
, sak_10
, 1, &sak_10
[1], &sak_10
[2]); 
2593         // We need to listen to the high-frequency, peak-detected path. 
2594         iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN
); 
2596         // free eventually allocated BigBuf memory but keep Emulator Memory 
2597         BigBuf_free_keep_EM(); 
2601         bool finished 
= FALSE
; 
2602         while (!BUTTON_PRESS() && !finished 
&& !usb_poll_validate_length()) { 
2605                 // find reader field 
2606                 if (cardSTATE 
== MFEMUL_NOFIELD
) { 
2607                         vHf 
= (MAX_ADC_HF_VOLTAGE 
* AvgAdc(ADC_CHAN_HF
)) >> 10; 
2608                         if (vHf 
> MF_MINFIELDV
) { 
2609                                 cardSTATE_TO_IDLE(); 
2613                 if (cardSTATE 
== MFEMUL_NOFIELD
) continue; 
2616                 res 
= EmGetCmd(receivedCmd
, &len
, receivedCmd_par
); 
2617                 if (res 
== 2) { //Field is off! 
2618                         cardSTATE 
= MFEMUL_NOFIELD
; 
2621                 } else if (res 
== 1) { 
2622                         break;  // return value 1 means button press 
2625                 // REQ or WUP request in ANY state and WUP in HALTED state 
2626                 // this if-statement doesn't match the specification above. (iceman) 
2627                 if (len 
== 1 && ((receivedCmd
[0] == ISO14443A_CMD_REQA 
&& cardSTATE 
!= MFEMUL_HALTED
) || receivedCmd
[0] == ISO14443A_CMD_WUPA
)) { 
2628                         selTimer 
= GetTickCount(); 
2629                         EmSendCmdEx(atqa
, sizeof(atqa
), (receivedCmd
[0] == ISO14443A_CMD_WUPA
)); 
2630                         cardSTATE 
= MFEMUL_SELECT1
; 
2631                         crypto1_destroy(pcs
); 
2638                 switch (cardSTATE
) { 
2639                         case MFEMUL_NOFIELD
: 
2642                                 LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2645                         case MFEMUL_SELECT1
:{ 
2646                                 if (len 
== 2 && (receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT 
&& receivedCmd
[1] == 0x20)) { 
2647                                         if (MF_DBGLEVEL 
>= 4)   Dbprintf("SELECT ALL received"); 
2648                                         EmSendCmd(rUIDBCC1
, sizeof(rUIDBCC1
)); 
2653                                                 ( receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT 
&& 
2654                                                   receivedCmd
[1] == 0x70 &&  
2655                                                   memcmp(&receivedCmd
[2], rUIDBCC1
, 4) == 0)) { 
2658                                         EmSendCmd(sak_4
, sizeof(sak_4
)); 
2661                                                         cardSTATE 
= MFEMUL_WORK
; 
2663                                                         if (MF_DBGLEVEL 
>= 4)   Dbprintf("--> WORK. anticol1 time: %d", GetTickCount() - selTimer
); 
2667                                                         cardSTATE 
= MFEMUL_SELECT2
; 
2672                                         cardSTATE_TO_IDLE(); 
2676                         case MFEMUL_SELECT2
:{ 
2678                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2681                                 if (len 
== 2 && (receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2 
&& receivedCmd
[1] == 0x20)) { 
2682                                         EmSendCmd(rUIDBCC2
, sizeof(rUIDBCC2
)); 
2686                                                 (receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2 
&& 
2687                                                  receivedCmd
[1] == 0x70 &&  
2688                                                  memcmp(&receivedCmd
[2], rUIDBCC2
, 4) == 0) ) { 
2690                                         EmSendCmd(sak_7
, sizeof(sak_7
)); 
2693                                                         cardSTATE 
= MFEMUL_WORK
; 
2695                                                         if (MF_DBGLEVEL 
>= 4)   Dbprintf("--> WORK. anticol2 time: %d", GetTickCount() - selTimer
); 
2698                                                         cardSTATE 
= MFEMUL_SELECT3
; 
2703                                 cardSTATE_TO_IDLE(); 
2706                         case MFEMUL_SELECT3
:{ 
2708                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2711                                 if (len 
== 2 && (receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_3 
&& receivedCmd
[1] == 0x20)) { 
2712                                         EmSendCmd(rUIDBCC3
, sizeof(rUIDBCC3
)); 
2716                                                 (receivedCmd
[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_3 
&& 
2717                                                  receivedCmd
[1] == 0x70 &&  
2718                                                  memcmp(&receivedCmd
[2], rUIDBCC3
, 4) == 0) ) { 
2720                                         EmSendCmd(sak_10
, sizeof(sak_10
)); 
2721                                         cardSTATE 
= MFEMUL_WORK
; 
2723                                         if (MF_DBGLEVEL 
>= 4)   Dbprintf("--> WORK. anticol3 time: %d", GetTickCount() - selTimer
); 
2726                                 cardSTATE_TO_IDLE(); 
2731                                         cardSTATE_TO_IDLE(); 
2732                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2736                                 uint32_t nr 
= bytes_to_num(receivedCmd
, 4); 
2737                                 uint32_t ar 
= bytes_to_num(&receivedCmd
[4], 4); 
2739                                 // Collect AR/NR per keytype & sector 
2740                                 if ( (flags 
& FLAG_NR_AR_ATTACK
) == FLAG_NR_AR_ATTACK 
) { 
2744                                         for (uint8_t i 
= 0; i 
< ATTACK_KEY_COUNT
; i
++) { 
2745                                                 // find which index to use 
2746                                                 if ( (cardAUTHSC 
== ar_nr_nonces
[i
].sector
) &&  (cardAUTHKEY 
== ar_nr_nonces
[i
].keytype
))  
2749                                                 // keep track of empty slots. 
2750                                                 if ( ar_nr_nonces
[i
].state 
== EMPTY
) 
2753                                         // if no empty slots.  Choose first and overwrite. 
2754                                         if ( index 
== -1 ) { 
2755                                                 if ( empty 
== -1 ) { 
2757                                                         ar_nr_nonces
[index
].state 
= EMPTY
; 
2763                                         switch(ar_nr_nonces
[index
].state
) { 
2765                                                         // first nonce collect 
2766                                                         ar_nr_nonces
[index
].cuid 
= cuid
; 
2767                                                         ar_nr_nonces
[index
].sector 
= cardAUTHSC
; 
2768                                                         ar_nr_nonces
[index
].keytype 
= cardAUTHKEY
; 
2769                                                         ar_nr_nonces
[index
].nonce 
= nonce
; 
2770                                                         ar_nr_nonces
[index
].nr 
= nr
; 
2771                                                         ar_nr_nonces
[index
].ar 
= ar
; 
2772                                                         ar_nr_nonces
[index
].state 
= FIRST
; 
2776                                                         // second nonce collect 
2777                                                         ar_nr_nonces
[index
].nonce2 
= nonce
; 
2778                                                         ar_nr_nonces
[index
].nr2 
= nr
; 
2779                                                         ar_nr_nonces
[index
].ar2 
= ar
; 
2780                                                         ar_nr_nonces
[index
].state 
= SECOND
; 
2783                                                         cmd_send(CMD_ACK
, CMD_SIMULATE_MIFARE_CARD
, 0, 0, &ar_nr_nonces
[index
], sizeof(nonces_t
)); 
2785                                                         ar_nr_nonces
[index
].state 
= EMPTY
; 
2786                                                         ar_nr_nonces
[index
].sector 
= 0; 
2787                                                         ar_nr_nonces
[index
].keytype 
= 0; 
2794                                 crypto1_word(pcs
, nr 
, 1); 
2795                                 uint32_t cardRr 
= ar 
^ crypto1_word(pcs
, 0, 0); 
2798                                 if (cardRr 
!= prng_successor(nonce
, 64)){ 
2800                                         if (MF_DBGLEVEL 
>= 3)  
2801                                                 Dbprintf("AUTH FAILED for sector %d with key %c. [nr=%08x  cardRr=%08x] [nt=%08x succ=%08x]" 
2803                                                         , (cardAUTHKEY 
== 0) ? 'A' : 'B' 
2807                                                         , prng_successor(nonce
, 64) 
2810                                         // Shouldn't we respond anything here? 
2811                                         // Right now, we don't nack or anything, which causes the 
2812                                         // reader to do a WUPA after a while. /Martin 
2813                                         // -- which is the correct response. /piwi 
2814                                         cardSTATE_TO_IDLE(); 
2815                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2819                                 ans 
= prng_successor(nonce
, 96) ^ crypto1_word(pcs
, 0, 0); 
2820                                 num_to_bytes(ans
, 4, rAUTH_AT
); 
2821                                 EmSendCmd(rAUTH_AT
, sizeof(rAUTH_AT
)); 
2824                                 if (MF_DBGLEVEL 
>= 1) { 
2825                                         Dbprintf("AUTH COMPLETED for sector %d with key %c. time=%d",  
2827                                                 cardAUTHKEY 
== 0 ? 'A' : 'B', 
2828                                                 GetTickCount() - authTimer
 
2831                                 cardSTATE 
= MFEMUL_WORK
; 
2836                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2839                                 bool encrypted_data 
= (cardAUTHKEY 
!= 0xFF) ; 
2842                                         mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
2844                                 if (len 
== 4 && (receivedCmd
[0] == MIFARE_AUTH_KEYA 
||  
2845                                                  receivedCmd
[0] == MIFARE_AUTH_KEYB
)  ) { 
2847                                         authTimer 
= GetTickCount(); 
2848                                         cardAUTHSC 
= receivedCmd
[1] / 4;  // received block -> sector 
2849                                         cardAUTHKEY 
= receivedCmd
[0] & 0x1; 
2850                                         crypto1_destroy(pcs
); 
2852                                         // load key into crypto 
2853                                         crypto1_create(pcs
, emlGetKey(cardAUTHSC
, cardAUTHKEY
)); 
2855                                         if (!encrypted_data
) {  
2856                                                 // first authentication 
2857                                                 // Update crypto state init  (UID ^ NONCE) 
2858                                                 crypto1_word(pcs
, cuid 
^ nonce
, 0); 
2859                                                 num_to_bytes(nonce
, 4, rAUTH_AT
); 
2863                                                 // nested authentication 
2864                                                 ans 
= nonce 
^ crypto1_word(pcs
, cuid 
^ nonce
, 0);  
2865                                                 num_to_bytes(ans
, 4, rAUTH_AT
); 
2867                                                 if (MF_DBGLEVEL 
>= 3) Dbprintf("Reader doing nested authentication for block %d (0x%02x) with key %c", receivedCmd
[1], receivedCmd
[1],  cardAUTHKEY 
== 0 ? 'A' : 'B'); 
2870                                         EmSendCmd(rAUTH_AT
, sizeof(rAUTH_AT
)); 
2871                                         cardSTATE 
= MFEMUL_AUTH1
; 
2875                                 // rule 13 of 7.5.3. in ISO 14443-4. chaining shall be continued 
2876                                 // BUT... ACK --> NACK 
2877                                 if (len 
== 1 && receivedCmd
[0] == CARD_ACK
) { 
2878                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2882                                 // rule 12 of 7.5.3. in ISO 14443-4. R(NAK) --> R(ACK) 
2883                                 if (len 
== 1 && receivedCmd
[0] == CARD_NACK_NA
) { 
2884                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2889                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2893                                 if ( receivedCmd
[0] == ISO14443A_CMD_READBLOCK 
|| 
2894                                          receivedCmd
[0] == ISO14443A_CMD_WRITEBLOCK 
|| 
2895                                          receivedCmd
[0] == MIFARE_CMD_INC 
|| 
2896                                          receivedCmd
[0] == MIFARE_CMD_DEC 
|| 
2897                                          receivedCmd
[0] == MIFARE_CMD_RESTORE 
|| 
2898                                          receivedCmd
[0] == MIFARE_CMD_TRANSFER 
) { 
2900                                         if (receivedCmd
[1] >= 16 * 4) { 
2901                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2902                                                 if (MF_DBGLEVEL 
>= 4) Dbprintf("Reader tried to operate (0x%02) on out of range block: %d (0x%02x), nacking",receivedCmd
[0],receivedCmd
[1],receivedCmd
[1]); 
2906                                         if (receivedCmd
[1] / 4 != cardAUTHSC
) { 
2907                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2908                                                 if (MF_DBGLEVEL 
>= 4) Dbprintf("Reader tried to operate (0x%02) on block (0x%02x) not authenticated for (0x%02x), nacking",receivedCmd
[0],receivedCmd
[1],cardAUTHSC
); 
2913                                 if (receivedCmd
[0] == ISO14443A_CMD_READBLOCK
) { 
2914                                         if (MF_DBGLEVEL 
>= 4) Dbprintf("Reader reading block %d (0x%02x)", receivedCmd
[1], receivedCmd
[1]); 
2916                                         emlGetMem(response
, receivedCmd
[1], 1); 
2917                                         AppendCrc14443a(response
, 16); 
2918                                         mf_crypto1_encrypt(pcs
, response
, 18, response_par
); 
2919                                         EmSendCmdPar(response
, 18, response_par
); 
2921                                         if(exitAfterNReads 
> 0 && numReads 
>= exitAfterNReads
) { 
2922                                                 Dbprintf("%d reads done, exiting", numReads
); 
2928                                 if (receivedCmd
[0] == ISO14443A_CMD_WRITEBLOCK
) { 
2929                                         if (MF_DBGLEVEL 
>= 4) Dbprintf("RECV 0xA0 write block %d (%02x)", receivedCmd
[1], receivedCmd
[1]); 
2930                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2931                                         cardSTATE 
= MFEMUL_WRITEBL2
; 
2932                                         cardWRBL 
= receivedCmd
[1]; 
2935                                 // increment, decrement, restore 
2936                                 if ( receivedCmd
[0] == MIFARE_CMD_INC 
||  
2937                                      receivedCmd
[0] == MIFARE_CMD_DEC 
||  
2938                                          receivedCmd
[0] == MIFARE_CMD_RESTORE
) { 
2940                                          if (MF_DBGLEVEL 
>= 4) Dbprintf("RECV 0x%02x inc(0xC1)/dec(0xC0)/restore(0xC2) block %d (%02x)",receivedCmd
[0], receivedCmd
[1], receivedCmd
[1]); 
2942                                         if (emlCheckValBl(receivedCmd
[1])) { 
2943                                                 if (MF_DBGLEVEL 
>= 4) Dbprintf("Reader tried to operate on block, but emlCheckValBl failed, nacking"); 
2944                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2947                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2948                                         if (receivedCmd
[0] == MIFARE_CMD_INC
)           cardSTATE 
= MFEMUL_INTREG_INC
; 
2949                                         if (receivedCmd
[0] == MIFARE_CMD_DEC
)           cardSTATE 
= MFEMUL_INTREG_DEC
; 
2950                                         if (receivedCmd
[0] == MIFARE_CMD_RESTORE
)       cardSTATE 
= MFEMUL_INTREG_REST
; 
2951                                         cardWRBL 
= receivedCmd
[1]; 
2955                                 if (receivedCmd
[0] == MIFARE_CMD_TRANSFER
) { 
2956                                         if (MF_DBGLEVEL 
>= 4) Dbprintf("RECV 0x%02x transfer block %d (%02x)", receivedCmd
[0], receivedCmd
[1], receivedCmd
[1]); 
2957                                         if (emlSetValBl(cardINTREG
, cardINTBLOCK
, receivedCmd
[1])) 
2958                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2960                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2964                                 if (receivedCmd
[0] == ISO14443A_CMD_HALT 
&& receivedCmd
[1] == 0x00) { 
2967                                         cardSTATE 
= MFEMUL_HALTED
; 
2968                                         if (MF_DBGLEVEL 
>= 4)   Dbprintf("--> HALTED. Selected time: %d ms",  GetTickCount() - selTimer
); 
2969                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2973                                 if (receivedCmd
[0] == ISO14443A_CMD_RATS
) { 
2974                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2977                                 // command not allowed 
2978                                 if (MF_DBGLEVEL 
>= 4)   Dbprintf("Received command not allowed, nacking"); 
2979                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2982                         case MFEMUL_WRITEBL2
:{ 
2984                                         mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
2985                                         emlSetMem(receivedCmd
, cardWRBL
, 1); 
2986                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2987                                         cardSTATE 
= MFEMUL_WORK
; 
2989                                         cardSTATE_TO_IDLE(); 
2990                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2994                         case MFEMUL_INTREG_INC
:{ 
2995                                 mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
2996                                 memcpy(&ans
, receivedCmd
, 4); 
2997                                 if (emlGetValBl(&cardINTREG
, &cardINTBLOCK
, cardWRBL
)) { 
2998                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2999                                         cardSTATE_TO_IDLE(); 
3002                                 LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
3003                                 cardINTREG 
= cardINTREG 
+ ans
; 
3004                                 cardSTATE 
= MFEMUL_WORK
; 
3007                         case MFEMUL_INTREG_DEC
:{ 
3008                                 mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
3009                                 memcpy(&ans
, receivedCmd
, 4); 
3010                                 if (emlGetValBl(&cardINTREG
, &cardINTBLOCK
, cardWRBL
)) { 
3011                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
3012                                         cardSTATE_TO_IDLE(); 
3015                                 LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
3016                                 cardINTREG 
= cardINTREG 
- ans
; 
3017                                 cardSTATE 
= MFEMUL_WORK
; 
3020                         case MFEMUL_INTREG_REST
:{ 
3021                                 mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
3022                                 memcpy(&ans
, receivedCmd
, 4); 
3023                                 if (emlGetValBl(&cardINTREG
, &cardINTBLOCK
, cardWRBL
)) { 
3024                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
3025                                         cardSTATE_TO_IDLE(); 
3028                                 LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
3029                                 cardSTATE 
= MFEMUL_WORK
; 
3035         if (MF_DBGLEVEL 
>= 1)  
3036                 Dbprintf("Emulator stopped. Tracing: %d  trace length: %d ", tracing
, BigBuf_get_traceLen()); 
3038         cmd_send(CMD_ACK
,1,0,0,0,0);    FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
3044 //----------------------------------------------------------------------------- 
3047 // if no activity for 2sec, it sends the collected data to the client. 
3048 //----------------------------------------------------------------------------- 
3050 void RAMFUNC 
SniffMifare(uint8_t param
) { 
3054         // free eventually allocated BigBuf memory 
3055         BigBuf_free(); BigBuf_Clear_ext(false); 
3059         // The command (reader -> tag) that we're receiving. 
3060         uint8_t receivedCmd
[MAX_MIFARE_FRAME_SIZE
] = {0x00};     
3061         uint8_t receivedCmdPar
[MAX_MIFARE_PARITY_SIZE
] = {0x00}; 
3063         // The response (tag -> reader) that we're receiving. 
3064         uint8_t receivedResponse
[MAX_MIFARE_FRAME_SIZE
] = {0x00}; 
3065         uint8_t receivedResponsePar
[MAX_MIFARE_PARITY_SIZE
] = {0x00}; 
3067         iso14443a_setup(FPGA_HF_ISO14443A_SNIFFER
); 
3069         // allocate the DMA buffer, used to stream samples from the FPGA 
3070         // [iceman] is this sniffed data unsigned? 
3071         uint8_t *dmaBuf 
= BigBuf_malloc(DMA_BUFFER_SIZE
); 
3072         uint8_t *data 
= dmaBuf
; 
3073         uint8_t previous_data 
= 0; 
3076         bool ReaderIsActive 
= FALSE
; 
3077         bool TagIsActive 
= FALSE
; 
3079         // Set up the demodulator for tag -> reader responses. 
3080         DemodInit(receivedResponse
, receivedResponsePar
); 
3082         // Set up the demodulator for the reader -> tag commands 
3083         UartInit(receivedCmd
, receivedCmdPar
); 
3085         // Setup and start DMA. 
3086         // set transfer address and number of bytes. Start transfer. 
3087         if ( !FpgaSetupSscDma((uint8_t*) dmaBuf
, DMA_BUFFER_SIZE
) ){ 
3088                 if (MF_DBGLEVEL 
> 1) Dbprintf("FpgaSetupSscDma failed. Exiting");  
3096         // And now we loop, receiving samples. 
3097         for(uint32_t sniffCounter 
= 0;; ) { 
3102                 if(BUTTON_PRESS()) { 
3103                         DbpString("cancelled by button"); 
3107                 if ((sniffCounter 
& 0x0000FFFF) == 0) { // from time to time 
3108                         // check if a transaction is completed (timeout after 2000ms). 
3109                         // if yes, stop the DMA transfer and send what we have so far to the client 
3110                         if (MfSniffSend(2000)) {                         
3111                                 // Reset everything - we missed some sniffed data anyway while the DMA was stopped 
3115                                 ReaderIsActive 
= FALSE
; 
3116                                 TagIsActive 
= FALSE
; 
3117                                 // Setup and start DMA. set transfer address and number of bytes. Start transfer. 
3118                                 if ( !FpgaSetupSscDma((uint8_t*) dmaBuf
, DMA_BUFFER_SIZE
) ){ 
3119                                         if (MF_DBGLEVEL 
> 1) Dbprintf("FpgaSetupSscDma failed. Exiting");  
3125                 int register readBufDataP 
= data 
- dmaBuf
;      // number of bytes we have processed so far 
3126                 int register dmaBufDataP 
= DMA_BUFFER_SIZE 
- AT91C_BASE_PDC_SSC
->PDC_RCR
; // number of bytes already transferred 
3128                 if (readBufDataP 
<= dmaBufDataP
)                        // we are processing the same block of data which is currently being transferred 
3129                         dataLen 
= dmaBufDataP 
- readBufDataP
;   // number of bytes still to be processed 
3131                         dataLen 
= DMA_BUFFER_SIZE 
- readBufDataP 
+ dmaBufDataP
; // number of bytes still to be processed 
3133                 // test for length of buffer 
3134                 if(dataLen 
> maxDataLen
) {                                      // we are more behind than ever... 
3135                         maxDataLen 
= dataLen
;                                    
3136                         if(dataLen 
> (9 * DMA_BUFFER_SIZE 
/ 10)) { 
3137                                 Dbprintf("blew circular buffer! dataLen=0x%x", dataLen
); 
3141                 if(dataLen 
< 1) continue; 
3143                 // primary buffer was stopped ( <-- we lost data! 
3144                 if (!AT91C_BASE_PDC_SSC
->PDC_RCR
) { 
3145                         AT91C_BASE_PDC_SSC
->PDC_RPR 
= (uint32_t) dmaBuf
; 
3146                         AT91C_BASE_PDC_SSC
->PDC_RCR 
= DMA_BUFFER_SIZE
; 
3147                         Dbprintf("RxEmpty ERROR, data length:%d", dataLen
); // temporary 
3149                 // secondary buffer sets as primary, secondary buffer was stopped 
3150                 if (!AT91C_BASE_PDC_SSC
->PDC_RNCR
) { 
3151                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
; 
3152                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= DMA_BUFFER_SIZE
; 
3157                 if (sniffCounter 
& 0x01) { 
3159                         // no need to try decoding tag data if the reader is sending 
3161                                 uint8_t readerdata 
= (previous_data 
& 0xF0) | (*data 
>> 4); 
3162                                 if(MillerDecoding(readerdata
, (sniffCounter
-1)*4)) { 
3165                                         if (MfSniffLogic(receivedCmd
, Uart
.len
, Uart
.parity
, Uart
.bitCount
, TRUE
)) break; 
3167                                         UartInit(receivedCmd
, receivedCmdPar
); 
3170                                 ReaderIsActive 
= (Uart
.state 
!= STATE_UNSYNCD
); 
3173                         // no need to try decoding tag data if the reader is sending 
3174                         if(!ReaderIsActive
) {            
3175                                 uint8_t tagdata 
= (previous_data 
<< 4) | (*data 
& 0x0F); 
3176                                 if(ManchesterDecoding(tagdata
, 0, (sniffCounter
-1)*4)) { 
3179                                         if (MfSniffLogic(receivedResponse
, Demod
.len
, Demod
.parity
, Demod
.bitCount
, FALSE
)) break; 
3182                                         UartInit(receivedCmd
, receivedCmdPar
); 
3184                                 TagIsActive 
= (Demod
.state 
!= DEMOD_UNSYNCD
); 
3188                 previous_data 
= *data
; 
3192                 if(data 
== dmaBuf 
+ DMA_BUFFER_SIZE
) 
3197         if (MF_DBGLEVEL 
>= 1) Dbprintf("maxDataLen=%x, Uart.state=%x, Uart.len=%x", maxDataLen
, Uart
.state
, Uart
.len
); 
3199         FpgaDisableSscDma(); 
3201         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);