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 //----------------------------------------------------------------------------- 
  13 #include "proxmark3.h" 
  19 #include "iso14443crc.h" 
  20 #include "iso14443a.h" 
  22 #include "mifareutil.h" 
  24 static uint32_t iso14a_timeout
; 
  25 uint8_t *trace 
= (uint8_t *) BigBuf
+TRACE_OFFSET
; 
  30 // the block number for the ISO14443-4 PCB 
  31 static uint8_t iso14_pcb_blocknum 
= 0; 
  36 // minimum time between the start bits of consecutive transfers from reader to tag: 7000 carrier (13.56Mhz) cycles 
  37 #define REQUEST_GUARD_TIME (7000/16 + 1) 
  38 // minimum time between last modulation of tag and next start bit from reader to tag: 1172 carrier cycles  
  39 #define FRAME_DELAY_TIME_PICC_TO_PCD (1172/16 + 1)  
  40 // bool LastCommandWasRequest = FALSE; 
  43 // Total delays including SSC-Transfers between ARM and FPGA. These are in carrier clock cycles (1/13,56MHz) 
  45 // When the PM acts as reader and is receiving tag data, it takes 
  46 // 3 ticks delay in the AD converter 
  47 // 16 ticks until the modulation detector completes and sets curbit 
  48 // 8 ticks until bit_to_arm is assigned from curbit 
  49 // 8*16 ticks for the transfer from FPGA to ARM 
  50 // 4*16 ticks until we measure the time 
  51 // - 8*16 ticks because we measure the time of the previous transfer  
  52 #define DELAY_AIR2ARM_AS_READER (3 + 16 + 8 + 8*16 + 4*16 - 8*16)  
  54 // When the PM acts as a reader and is sending, it takes 
  55 // 4*16 ticks until we can write data to the sending hold register 
  56 // 8*16 ticks until the SHR is transferred to the Sending Shift Register 
  57 // 8 ticks until the first transfer starts 
  58 // 8 ticks later the FPGA samples the data 
  59 // 1 tick to assign mod_sig_coil 
  60 #define DELAY_ARM2AIR_AS_READER (4*16 + 8*16 + 8 + 8 + 1) 
  62 // When the PM acts as tag and is receiving it takes 
  63 // 2 ticks delay in the RF part (for the first falling edge), 
  64 // 3 ticks for the A/D conversion, 
  65 // 8 ticks on average until the start of the SSC transfer, 
  66 // 8 ticks until the SSC samples the first data 
  67 // 7*16 ticks to complete the transfer from FPGA to ARM 
  68 // 8 ticks until the next ssp_clk rising edge 
  69 // 4*16 ticks until we measure the time  
  70 // - 8*16 ticks because we measure the time of the previous transfer  
  71 #define DELAY_AIR2ARM_AS_TAG (2 + 3 + 8 + 8 + 7*16 + 8 + 4*16 - 8*16) 
  73 // The FPGA will report its internal sending delay in 
  74 uint16_t FpgaSendQueueDelay
; 
  75 // the 5 first bits are the number of bits buffered in mod_sig_buf 
  76 // the last three bits are the remaining ticks/2 after the mod_sig_buf shift 
  77 #define DELAY_FPGA_QUEUE (FpgaSendQueueDelay<<1) 
  79 // When the PM acts as tag and is sending, it takes 
  80 // 4*16 ticks until we can write data to the sending hold register 
  81 // 8*16 ticks until the SHR is transferred to the Sending Shift Register 
  82 // 8 ticks until the first transfer starts 
  83 // 8 ticks later the FPGA samples the data 
  84 // + a varying number of ticks in the FPGA Delay Queue (mod_sig_buf) 
  85 // + 1 tick to assign mod_sig_coil 
  86 #define DELAY_ARM2AIR_AS_TAG (4*16 + 8*16 + 8 + 8 + DELAY_FPGA_QUEUE + 1) 
  88 // When the PM acts as sniffer and is receiving tag data, it takes 
  89 // 3 ticks A/D conversion 
  90 // 14 ticks to complete the modulation detection 
  91 // 8 ticks (on average) until the result is stored in to_arm 
  92 // + the delays in transferring data - which is the same for 
  93 // sniffing reader and tag data and therefore not relevant 
  94 #define DELAY_TAG_AIR2ARM_AS_SNIFFER (3 + 14 + 8)  
  96 // When the PM acts as sniffer and is receiving reader data, it takes 
  97 // 2 ticks delay in analogue RF receiver (for the falling edge of the  
  98 // start bit, which marks the start of the communication) 
  99 // 3 ticks A/D conversion 
 100 // 8 ticks on average until the data is stored in to_arm. 
 101 // + the delays in transferring data - which is the same for 
 102 // sniffing reader and tag data and therefore not relevant 
 103 #define DELAY_READER_AIR2ARM_AS_SNIFFER (2 + 3 + 8)  
 105 //variables used for timing purposes: 
 106 //these are in ssp_clk cycles: 
 107 static uint32_t NextTransferTime
; 
 108 static uint32_t LastTimeProxToAirStart
; 
 109 static uint32_t LastProxToAirDuration
; 
 113 // CARD TO READER - manchester 
 114 // Sequence D: 11110000 modulation with subcarrier during first half 
 115 // Sequence E: 00001111 modulation with subcarrier during second half 
 116 // Sequence F: 00000000 no modulation with subcarrier 
 117 // READER TO CARD - miller 
 118 // Sequence X: 00001100 drop after half a period 
 119 // Sequence Y: 00000000 no drop 
 120 // Sequence Z: 11000000 drop at start 
 128 const uint8_t OddByteParity
[256] = { 
 129   1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 
 130   0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 
 131   0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 
 132   1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 
 133   0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 
 134   1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 
 135   1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 
 136   0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 
 137   0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 
 138   1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 
 139   1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 
 140   0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 
 141   1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 
 142   0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 
 143   0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 
 144   1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1 
 148 void iso14a_set_trigger(bool enable
) { 
 152 void iso14a_clear_trace() { 
 153         memset(trace
, 0x44, TRACE_SIZE
); 
 157 void iso14a_set_tracing(bool enable
) { 
 161 void iso14a_set_timeout(uint32_t timeout
) { 
 162         iso14a_timeout 
= timeout
; 
 165 //----------------------------------------------------------------------------- 
 166 // Generate the parity value for a byte sequence 
 168 //----------------------------------------------------------------------------- 
 169 byte_t 
oddparity (const byte_t bt
) 
 171         return OddByteParity
[bt
]; 
 174 void GetParity(const uint8_t *pbtCmd
, uint16_t iLen
, uint8_t *par
) 
 176         uint16_t paritybit_cnt 
= 0; 
 177         uint16_t paritybyte_cnt 
= 0; 
 178         uint8_t parityBits 
= 0; 
 180         for (uint16_t i 
= 0; i 
< iLen
; i
++) { 
 181                 // Generate the parity bits 
 182                 parityBits 
|= ((OddByteParity
[pbtCmd
[i
]]) << (7-paritybit_cnt
)); 
 183                 if (paritybit_cnt 
== 7) { 
 184                         par
[paritybyte_cnt
] = parityBits
;       // save 8 Bits parity 
 185                         parityBits 
= 0;                                         // and advance to next Parity Byte 
 193         // save remaining parity bits 
 194         par
[paritybyte_cnt
] = parityBits
; 
 198 void AppendCrc14443a(uint8_t* data
, int len
) 
 200         ComputeCrc14443(CRC_14443_A
,data
,len
,data
+len
,data
+len
+1); 
 203 // The function LogTrace() is also used by the iClass implementation in iClass.c 
 204 bool RAMFUNC 
LogTrace(const uint8_t *btBytes
, uint16_t iLen
, uint32_t timestamp_start
, uint32_t timestamp_end
, uint8_t *parity
, bool readerToTag
) 
 206         if (!tracing
) return FALSE
; 
 208         uint16_t num_paritybytes 
= (iLen
-1)/8 + 1;      // number of valid paritybytes in *parity 
 209         uint16_t duration 
= timestamp_end 
- timestamp_start
; 
 211         // Return when trace is full 
 212         if (traceLen 
+ sizeof(iLen
) + sizeof(timestamp_start
) + sizeof(duration
) + num_paritybytes 
+ iLen 
>= TRACE_SIZE
) { 
 213                 tracing 
= FALSE
;        // don't trace any more 
 218         // 32 bits timestamp (little endian) 
 219         // 16 bits duration (little endian) 
 220         // 16 bits data length (little endian, Highest Bit used as readerToTag flag) 
 222         // x Bytes parity (one byte per 8 bytes data) 
 225         trace
[traceLen
++] = ((timestamp_start 
>> 0) & 0xff); 
 226         trace
[traceLen
++] = ((timestamp_start 
>> 8) & 0xff); 
 227         trace
[traceLen
++] = ((timestamp_start 
>> 16) & 0xff); 
 228         trace
[traceLen
++] = ((timestamp_start 
>> 24) & 0xff); 
 231         trace
[traceLen
++] = ((duration 
>> 0) & 0xff); 
 232         trace
[traceLen
++] = ((duration 
>> 8) & 0xff); 
 235         trace
[traceLen
++] = ((iLen 
>> 0) & 0xff); 
 236         trace
[traceLen
++] = ((iLen 
>> 8) & 0xff); 
 240                 trace
[traceLen 
- 1] |= 0x80; 
 244         if (btBytes 
!= NULL 
&& iLen 
!= 0) { 
 245                 memcpy(trace 
+ traceLen
, btBytes
, iLen
); 
 250         if (parity 
!= NULL 
&& iLen 
!= 0) { 
 251                 memcpy(trace 
+ traceLen
, parity
, num_paritybytes
); 
 253         traceLen 
+= num_paritybytes
; 
 258 //============================================================================= 
 259 // ISO 14443 Type A - Miller decoder 
 260 //============================================================================= 
 262 // This decoder is used when the PM3 acts as a tag. 
 263 // The reader will generate "pauses" by temporarily switching of the field.  
 264 // At the PM3 antenna we will therefore measure a modulated antenna voltage.  
 265 // The FPGA does a comparison with a threshold and would deliver e.g.: 
 266 // ........  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  ....... 
 267 // The Miller decoder needs to identify the following sequences: 
 268 // 2 (or 3) ticks pause followed by 6 (or 5) ticks unmodulated:         pause at beginning - Sequence Z ("start of communication" or a "0") 
 269 // 8 ticks without a modulation:                                                                        no pause - Sequence Y (a "0" or "end of communication" or "no information") 
 270 // 4 ticks unmodulated followed by 2 (or 3) ticks pause:                        pause in second half - Sequence X (a "1") 
 271 // Note 1: the bitstream may start at any time. We therefore need to sync. 
 272 // Note 2: the interpretation of Sequence Y and Z depends on the preceding sequence. 
 273 //----------------------------------------------------------------------------- 
 276 // Lookup-Table to decide if 4 raw bits are a modulation. 
 277 // We accept two or three consecutive "0" in any position with the rest "1" 
 278 const bool Mod_Miller_LUT
[] = { 
 279         TRUE
,  TRUE
,  FALSE
, TRUE
,  FALSE
, FALSE
, FALSE
, FALSE
, 
 280         TRUE
,  TRUE
,  FALSE
, FALSE
, TRUE
,  FALSE
, FALSE
, FALSE
 
 282 #define IsMillerModulationNibble1(b) (Mod_Miller_LUT[(b & 0x00F0) >> 4]) 
 283 #define IsMillerModulationNibble2(b) (Mod_Miller_LUT[(b & 0x000F)]) 
 287         Uart
.state 
= STATE_UNSYNCD
; 
 289         Uart
.len 
= 0;                                           // number of decoded data bytes 
 290         Uart
.parityLen 
= 0;                                     // number of decoded parity bytes 
 291         Uart
.shiftReg 
= 0;                                      // shiftreg to hold decoded data bits 
 292         Uart
.parityBits 
= 0;                            // holds 8 parity bits 
 293         Uart
.twoBits 
= 0x0000;                          // buffer for 2 Bits 
 299 void UartInit(uint8_t *data
, uint8_t *parity
) 
 302         Uart
.parity 
= parity
; 
 306 // use parameter non_real_time to provide a timestamp. Set to 0 if the decoder should measure real time 
 307 static RAMFUNC 
bool MillerDecoding(uint8_t bit
, uint32_t non_real_time
) 
 310         Uart
.twoBits 
= (Uart
.twoBits 
<< 8) | bit
; 
 312         if (Uart
.state 
== STATE_UNSYNCD
) {                                                                                              // not yet synced 
 313                 if (Uart
.highCnt 
< 7) {                                                                                                 // wait for a stable unmodulated signal 
 314                         if (Uart
.twoBits 
== 0xffff) { 
 320                         Uart
.syncBit 
= 0xFFFF; // not set 
 321                         // look for 00xx1111 (the start bit) 
 322                         if              ((Uart
.twoBits 
& 0x6780) == 0x0780) Uart
.syncBit 
= 7;  
 323                         else if ((Uart
.twoBits 
& 0x33C0) == 0x03C0) Uart
.syncBit 
= 6; 
 324                         else if ((Uart
.twoBits 
& 0x19E0) == 0x01E0) Uart
.syncBit 
= 5; 
 325                         else if ((Uart
.twoBits 
& 0x0CF0) == 0x00F0) Uart
.syncBit 
= 4; 
 326                         else if ((Uart
.twoBits 
& 0x0678) == 0x0078) Uart
.syncBit 
= 3; 
 327                         else if ((Uart
.twoBits 
& 0x033C) == 0x003C) Uart
.syncBit 
= 2; 
 328                         else if ((Uart
.twoBits 
& 0x019E) == 0x001E) Uart
.syncBit 
= 1; 
 329                         else if ((Uart
.twoBits 
& 0x00CF) == 0x000F) Uart
.syncBit 
= 0; 
 330                         if (Uart
.syncBit 
!= 0xFFFF) { 
 331                                 Uart
.startTime 
= non_real_time
?non_real_time
:(GetCountSspClk() & 0xfffffff8); 
 332                                 Uart
.startTime 
-= Uart
.syncBit
; 
 333                                 Uart
.endTime 
= Uart
.startTime
; 
 334                                 Uart
.state 
= STATE_START_OF_COMMUNICATION
; 
 340                 if (IsMillerModulationNibble1(Uart
.twoBits 
>> Uart
.syncBit
)) {                   
 341                         if (IsMillerModulationNibble2(Uart
.twoBits 
>> Uart
.syncBit
)) {          // Modulation in both halves - error 
 344                         } else {                                                                                                                        // Modulation in first half = Sequence Z = logic "0" 
 345                                 if (Uart
.state 
== STATE_MILLER_X
) {                                                             // error - must not follow after X 
 350                                         Uart
.shiftReg 
= (Uart
.shiftReg 
>> 1);                                           // add a 0 to the shiftreg 
 351                                         Uart
.state 
= STATE_MILLER_Z
; 
 352                                         Uart
.endTime 
= Uart
.startTime 
+ 8*(9*Uart
.len 
+ Uart
.bitCount 
+ 1) - 6; 
 353                                         if(Uart
.bitCount 
>= 9) {                                                                        // if we decoded a full byte (including parity) 
 354                                                 Uart
.output
[Uart
.len
++] = (Uart
.shiftReg 
& 0xff); 
 355                                                 Uart
.parityBits 
<<= 1;                                                                  // make room for the parity bit 
 356                                                 Uart
.parityBits 
|= ((Uart
.shiftReg 
>> 8) & 0x01);               // store parity bit 
 359                                                 if((Uart
.len
&0x0007) == 0) {                                                    // every 8 data bytes 
 360                                                         Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;        // store 8 parity bits 
 367                         if (IsMillerModulationNibble2(Uart
.twoBits 
>> Uart
.syncBit
)) {          // Modulation second half = Sequence X = logic "1" 
 369                                 Uart
.shiftReg 
= (Uart
.shiftReg 
>> 1) | 0x100;                                   // add a 1 to the shiftreg 
 370                                 Uart
.state 
= STATE_MILLER_X
; 
 371                                 Uart
.endTime 
= Uart
.startTime 
+ 8*(9*Uart
.len 
+ Uart
.bitCount 
+ 1) - 2; 
 372                                 if(Uart
.bitCount 
>= 9) {                                                                                // if we decoded a full byte (including parity) 
 373                                         Uart
.output
[Uart
.len
++] = (Uart
.shiftReg 
& 0xff); 
 374                                         Uart
.parityBits 
<<= 1;                                                                          // make room for the new parity bit 
 375                                         Uart
.parityBits 
|= ((Uart
.shiftReg 
>> 8) & 0x01);                       // store parity bit 
 378                                         if ((Uart
.len
&0x0007) == 0) {                                                           // every 8 data bytes 
 379                                                 Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;                // store 8 parity bits 
 383                         } else {                                                                                                                        // no modulation in both halves - Sequence Y 
 384                                 if (Uart
.state 
== STATE_MILLER_Z 
|| Uart
.state 
== STATE_MILLER_Y
) {     // Y after logic "0" - End of Communication 
 385                                         Uart
.state 
= STATE_UNSYNCD
; 
 386                                         Uart
.bitCount
--;                                                                                        // last "0" was part of EOC sequence 
 387                                         Uart
.shiftReg 
<<= 1;                                                                            // drop it 
 388                                         if(Uart
.bitCount 
> 0) {                                                                         // if we decoded some bits 
 389                                                 Uart
.shiftReg 
>>= (9 - Uart
.bitCount
);                                  // right align them 
 390                                                 Uart
.output
[Uart
.len
++] = (Uart
.shiftReg 
& 0xff);               // add last byte to the output 
 391                                                 Uart
.parityBits 
<<= 1;                                                                  // add a (void) parity bit 
 392                                                 Uart
.parityBits 
<<= (8 - (Uart
.len
&0x0007));                    // left align parity bits 
 393                                                 Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;                // and store it 
 395                                         } else if (Uart
.len 
& 0x0007) {                                                         // there are some parity bits to store 
 396                                                 Uart
.parityBits 
<<= (8 - (Uart
.len
&0x0007));                    // left align remaining parity bits 
 397                                                 Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;                // and store them 
 400                                                 return TRUE
;                                                                                    // we are finished with decoding the raw data sequence 
 402                                                 UartReset();                                                                                    // Nothing received - try again 
 405                                 if (Uart
.state 
== STATE_START_OF_COMMUNICATION
) {                               // error - must not follow directly after SOC 
 408                                 } else {                                                                                                                // a logic "0" 
 410                                         Uart
.shiftReg 
= (Uart
.shiftReg 
>> 1);                                           // add a 0 to the shiftreg 
 411                                         Uart
.state 
= STATE_MILLER_Y
; 
 412                                         if(Uart
.bitCount 
>= 9) {                                                                        // if we decoded a full byte (including parity) 
 413                                                 Uart
.output
[Uart
.len
++] = (Uart
.shiftReg 
& 0xff); 
 414                                                 Uart
.parityBits 
<<= 1;                                                                  // make room for the parity bit 
 415                                                 Uart
.parityBits 
|= ((Uart
.shiftReg 
>> 8) & 0x01);               // store parity bit 
 418                                                 if ((Uart
.len
&0x0007) == 0) {                                                   // every 8 data bytes 
 419                                                         Uart
.parity
[Uart
.parityLen
++] = Uart
.parityBits
;        // store 8 parity bits 
 429     return FALSE
;       // not finished yet, need more data 
 434 //============================================================================= 
 435 // ISO 14443 Type A - Manchester decoder 
 436 //============================================================================= 
 438 // This decoder is used when the PM3 acts as a reader. 
 439 // The tag will modulate the reader field by asserting different loads to it. As a consequence, the voltage 
 440 // at the reader antenna will be modulated as well. The FPGA detects the modulation for us and would deliver e.g. the following: 
 441 // ........ 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 ....... 
 442 // The Manchester decoder needs to identify the following sequences: 
 443 // 4 ticks modulated followed by 4 ticks unmodulated:   Sequence D = 1 (also used as "start of communication") 
 444 // 4 ticks unmodulated followed by 4 ticks modulated:   Sequence E = 0 
 445 // 8 ticks unmodulated:                                                                 Sequence F = end of communication 
 446 // 8 ticks modulated:                                                                   A collision. Save the collision position and treat as Sequence D 
 447 // Note 1: the bitstream may start at any time. We therefore need to sync. 
 448 // Note 2: parameter offset is used to determine the position of the parity bits (required for the anticollision command only) 
 451 // Lookup-Table to decide if 4 raw bits are a modulation. 
 452 // We accept three or four "1" in any position 
 453 const bool Mod_Manchester_LUT
[] = { 
 454         FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, FALSE
, TRUE
, 
 455         FALSE
, FALSE
, FALSE
, TRUE
,  FALSE
, TRUE
,  TRUE
,  TRUE
 
 458 #define IsManchesterModulationNibble1(b) (Mod_Manchester_LUT[(b & 0x00F0) >> 4]) 
 459 #define IsManchesterModulationNibble2(b) (Mod_Manchester_LUT[(b & 0x000F)]) 
 464         Demod
.state 
= DEMOD_UNSYNCD
; 
 465         Demod
.len 
= 0;                                          // number of decoded data bytes 
 467         Demod
.shiftReg 
= 0;                                     // shiftreg to hold decoded data bits 
 468         Demod
.parityBits 
= 0;                           //  
 469         Demod
.collisionPos 
= 0;                         // Position of collision bit 
 470         Demod
.twoBits 
= 0xffff;                         // buffer for 2 Bits 
 477 void DemodInit(uint8_t *data
, uint8_t *parity
) 
 480         Demod
.parity 
= parity
; 
 484 // use parameter non_real_time to provide a timestamp. Set to 0 if the decoder should measure real time 
 485 static RAMFUNC 
int ManchesterDecoding(uint8_t bit
, uint16_t offset
, uint32_t non_real_time
) 
 488         Demod
.twoBits 
= (Demod
.twoBits 
<< 8) | bit
; 
 490         if (Demod
.state 
== DEMOD_UNSYNCD
) { 
 492                 if (Demod
.highCnt 
< 2) {                                                                                        // wait for a stable unmodulated signal 
 493                         if (Demod
.twoBits 
== 0x0000) { 
 499                         Demod
.syncBit 
= 0xFFFF;                 // not set 
 500                         if              ((Demod
.twoBits 
& 0x7700) == 0x7000) Demod
.syncBit 
= 7;  
 501                         else if ((Demod
.twoBits 
& 0x3B80) == 0x3800) Demod
.syncBit 
= 6; 
 502                         else if ((Demod
.twoBits 
& 0x1DC0) == 0x1C00) Demod
.syncBit 
= 5; 
 503                         else if ((Demod
.twoBits 
& 0x0EE0) == 0x0E00) Demod
.syncBit 
= 4; 
 504                         else if ((Demod
.twoBits 
& 0x0770) == 0x0700) Demod
.syncBit 
= 3; 
 505                         else if ((Demod
.twoBits 
& 0x03B8) == 0x0380) Demod
.syncBit 
= 2; 
 506                         else if ((Demod
.twoBits 
& 0x01DC) == 0x01C0) Demod
.syncBit 
= 1; 
 507                         else if ((Demod
.twoBits 
& 0x00EE) == 0x00E0) Demod
.syncBit 
= 0; 
 508                         if (Demod
.syncBit 
!= 0xFFFF) { 
 509                                 Demod
.startTime 
= non_real_time
?non_real_time
:(GetCountSspClk() & 0xfffffff8); 
 510                                 Demod
.startTime 
-= Demod
.syncBit
; 
 511                                 Demod
.bitCount 
= offset
;                        // number of decoded data bits 
 512                                 Demod
.state 
= DEMOD_MANCHESTER_DATA
; 
 518                 if (IsManchesterModulationNibble1(Demod
.twoBits 
>> Demod
.syncBit
)) {            // modulation in first half 
 519                         if (IsManchesterModulationNibble2(Demod
.twoBits 
>> Demod
.syncBit
)) {    // ... and in second half = collision 
 520                                 if (!Demod
.collisionPos
) { 
 521                                         Demod
.collisionPos 
= (Demod
.len 
<< 3) + Demod
.bitCount
; 
 523                         }                                                                                                                       // modulation in first half only - Sequence D = 1 
 525                         Demod
.shiftReg 
= (Demod
.shiftReg 
>> 1) | 0x100;                         // in both cases, add a 1 to the shiftreg 
 526                         if(Demod
.bitCount 
== 9) {                                                                       // if we decoded a full byte (including parity) 
 527                                 Demod
.output
[Demod
.len
++] = (Demod
.shiftReg 
& 0xff); 
 528                                 Demod
.parityBits 
<<= 1;                                                                 // make room for the parity bit 
 529                                 Demod
.parityBits 
|= ((Demod
.shiftReg 
>> 8) & 0x01);     // store parity bit 
 532                                 if((Demod
.len
&0x0007) == 0) {                                                   // every 8 data bytes 
 533                                         Demod
.parity
[Demod
.parityLen
++] = Demod
.parityBits
;     // store 8 parity bits 
 534                                         Demod
.parityBits 
= 0; 
 537                         Demod
.endTime 
= Demod
.startTime 
+ 8*(9*Demod
.len 
+ Demod
.bitCount 
+ 1) - 4; 
 538                 } else {                                                                                                                // no modulation in first half 
 539                         if (IsManchesterModulationNibble2(Demod
.twoBits 
>> Demod
.syncBit
)) {    // and modulation in second half = Sequence E = 0 
 541                                 Demod
.shiftReg 
= (Demod
.shiftReg 
>> 1);                                 // add a 0 to the shiftreg 
 542                                 if(Demod
.bitCount 
>= 9) {                                                               // if we decoded a full byte (including parity) 
 543                                         Demod
.output
[Demod
.len
++] = (Demod
.shiftReg 
& 0xff); 
 544                                         Demod
.parityBits 
<<= 1;                                                         // make room for the new parity bit 
 545                                         Demod
.parityBits 
|= ((Demod
.shiftReg 
>> 8) & 0x01); // store parity bit 
 548                                         if ((Demod
.len
&0x0007) == 0) {                                          // every 8 data bytes 
 549                                                 Demod
.parity
[Demod
.parityLen
++] = Demod
.parityBits
;     // store 8 parity bits1 
 550                                                 Demod
.parityBits 
= 0; 
 553                                 Demod
.endTime 
= Demod
.startTime 
+ 8*(9*Demod
.len 
+ Demod
.bitCount 
+ 1); 
 554                         } else {                                                                                                        // no modulation in both halves - End of communication 
 555                                 if(Demod
.bitCount 
> 0) {                                                                // there are some remaining data bits 
 556                                         Demod
.shiftReg 
>>= (9 - Demod
.bitCount
);                        // right align the decoded bits 
 557                                         Demod
.output
[Demod
.len
++] = Demod
.shiftReg 
& 0xff;      // and add them to the output 
 558                                         Demod
.parityBits 
<<= 1;                                                         // add a (void) parity bit 
 559                                         Demod
.parityBits 
<<= (8 - (Demod
.len
&0x0007));          // left align remaining parity bits 
 560                                         Demod
.parity
[Demod
.parityLen
++] = Demod
.parityBits
;     // and store them 
 562                                 } else if (Demod
.len 
& 0x0007) {                                                // there are some parity bits to store 
 563                                         Demod
.parityBits 
<<= (8 - (Demod
.len
&0x0007));          // left align remaining parity bits 
 564                                         Demod
.parity
[Demod
.parityLen
++] = Demod
.parityBits
;     // and store them 
 567                                         return TRUE
;                                                                            // we are finished with decoding the raw data sequence 
 568                                 } else {                                                                                                // nothing received. Start over 
 576     return FALSE
;       // not finished yet, need more data 
 579 //============================================================================= 
 580 // Finally, a `sniffer' for ISO 14443 Type A 
 581 // Both sides of communication! 
 582 //============================================================================= 
 584 //----------------------------------------------------------------------------- 
 585 // Record the sequence of commands sent by the reader to the tag, with 
 586 // triggering so that we start recording at the point that the tag is moved 
 588 //----------------------------------------------------------------------------- 
 589 void RAMFUNC 
SnoopIso14443a(uint8_t param
) { 
 591         // bit 0 - trigger from first card answer 
 592         // bit 1 - trigger from first reader 7-bit request 
 596         iso14a_clear_trace(); 
 597         iso14a_set_tracing(TRUE
); 
 599         // We won't start recording the frames that we acquire until we trigger; 
 600         // a good trigger condition to get started is probably when we see a 
 601         // response from the tag. 
 602         // triggered == FALSE -- to wait first for card 
 603         bool triggered 
= !(param 
& 0x03);  
 605         // The command (reader -> tag) that we're receiving. 
 606         // The length of a received command will in most cases be no more than 18 bytes. 
 607         // So 32 should be enough! 
 608         uint8_t *receivedCmd 
= ((uint8_t *)BigBuf
) + RECV_CMD_OFFSET
; 
 609         uint8_t *receivedCmdPar 
= ((uint8_t *)BigBuf
) + RECV_CMD_PAR_OFFSET
; 
 611         // The response (tag -> reader) that we're receiving. 
 612         uint8_t *receivedResponse 
= ((uint8_t *)BigBuf
) + RECV_RESP_OFFSET
; 
 613         uint8_t *receivedResponsePar 
= ((uint8_t *)BigBuf
) + RECV_RESP_PAR_OFFSET
; 
 615         // As we receive stuff, we copy it from receivedCmd or receivedResponse 
 616         // into trace, along with its length and other annotations. 
 617         //uint8_t *trace = (uint8_t *)BigBuf; 
 619         // The DMA buffer, used to stream samples from the FPGA 
 620         uint8_t *dmaBuf 
= ((uint8_t *)BigBuf
) + DMA_BUFFER_OFFSET
; 
 621         uint8_t *data 
= dmaBuf
; 
 622         uint8_t previous_data 
= 0; 
 625         bool TagIsActive 
= FALSE
; 
 626         bool ReaderIsActive 
= FALSE
; 
 628         iso14443a_setup(FPGA_HF_ISO14443A_SNIFFER
); 
 630         // Set up the demodulator for tag -> reader responses. 
 631         DemodInit(receivedResponse
, receivedResponsePar
); 
 633         // Set up the demodulator for the reader -> tag commands 
 634         UartInit(receivedCmd
, receivedCmdPar
); 
 636         // Setup and start DMA. 
 637         FpgaSetupSscDma((uint8_t *)dmaBuf
, DMA_BUFFER_SIZE
); 
 639         // And now we loop, receiving samples. 
 640         for(uint32_t rsamples 
= 0; TRUE
; ) { 
 643                         DbpString("cancelled by button"); 
 650                 int register readBufDataP 
= data 
- dmaBuf
; 
 651                 int register dmaBufDataP 
= DMA_BUFFER_SIZE 
- AT91C_BASE_PDC_SSC
->PDC_RCR
; 
 652                 if (readBufDataP 
<= dmaBufDataP
){ 
 653                         dataLen 
= dmaBufDataP 
- readBufDataP
; 
 655                         dataLen 
= DMA_BUFFER_SIZE 
- readBufDataP 
+ dmaBufDataP
; 
 657                 // test for length of buffer 
 658                 if(dataLen 
> maxDataLen
) { 
 659                         maxDataLen 
= dataLen
; 
 661                                 Dbprintf("blew circular buffer! dataLen=%d", dataLen
); 
 665                 if(dataLen 
< 1) continue; 
 667                 // primary buffer was stopped( <-- we lost data! 
 668                 if (!AT91C_BASE_PDC_SSC
->PDC_RCR
) { 
 669                         AT91C_BASE_PDC_SSC
->PDC_RPR 
= (uint32_t) dmaBuf
; 
 670                         AT91C_BASE_PDC_SSC
->PDC_RCR 
= DMA_BUFFER_SIZE
; 
 671                         Dbprintf("RxEmpty ERROR!!! data length:%d", dataLen
); // temporary 
 673                 // secondary buffer sets as primary, secondary buffer was stopped 
 674                 if (!AT91C_BASE_PDC_SSC
->PDC_RNCR
) { 
 675                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
; 
 676                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= DMA_BUFFER_SIZE
; 
 681                 if (rsamples 
& 0x01) {                          // Need two samples to feed Miller and Manchester-Decoder 
 683                         if(!TagIsActive
) {              // no need to try decoding reader data if the tag is sending 
 684                                 uint8_t readerdata 
= (previous_data 
& 0xF0) | (*data 
>> 4); 
 685                                 if (MillerDecoding(readerdata
, (rsamples
-1)*4)) { 
 688                                         // check - if there is a short 7bit request from reader 
 689                                         if ((!triggered
) && (param 
& 0x02) && (Uart
.len 
== 1) && (Uart
.bitCount 
== 7)) triggered 
= TRUE
; 
 692                                                 if (!LogTrace(receivedCmd
,  
 694                                                                                 Uart
.startTime
*16 - DELAY_READER_AIR2ARM_AS_SNIFFER
, 
 695                                                                                 Uart
.endTime
*16 - DELAY_READER_AIR2ARM_AS_SNIFFER
, 
 699                                         /* And ready to receive another command. */ 
 701                                         /* And also reset the demod code, which might have been */ 
 702                                         /* false-triggered by the commands from the reader. */ 
 706                                 ReaderIsActive 
= (Uart
.state 
!= STATE_UNSYNCD
); 
 709                         if(!ReaderIsActive
) {           // no need to try decoding tag data if the reader is sending - and we cannot afford the time 
 710                                 uint8_t tagdata 
= (previous_data 
<< 4) | (*data 
& 0x0F); 
 711                                 if(ManchesterDecoding(tagdata
, 0, (rsamples
-1)*4)) { 
 714                                         if (!LogTrace(receivedResponse
,  
 716                                                                         Demod
.startTime
*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER
,  
 717                                                                         Demod
.endTime
*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER
, 
 721                                         if ((!triggered
) && (param 
& 0x01)) triggered 
= TRUE
; 
 723                                         // And ready to receive another response. 
 727                                 TagIsActive 
= (Demod
.state 
!= DEMOD_UNSYNCD
); 
 731                 previous_data 
= *data
; 
 734                 if(data 
== dmaBuf 
+ DMA_BUFFER_SIZE
) { 
 739         DbpString("COMMAND FINISHED"); 
 742         Dbprintf("maxDataLen=%d, Uart.state=%x, Uart.len=%d", maxDataLen
, Uart
.state
, Uart
.len
); 
 743         Dbprintf("traceLen=%d, Uart.output[0]=%08x", traceLen
, (uint32_t)Uart
.output
[0]); 
 747 //----------------------------------------------------------------------------- 
 748 // Prepare tag messages 
 749 //----------------------------------------------------------------------------- 
 750 static void CodeIso14443aAsTagPar(const uint8_t *cmd
, uint16_t len
, uint8_t *parity
) 
 754         // Correction bit, might be removed when not needed 
 759         ToSendStuffBit(1);  // 1 
 765         ToSend
[++ToSendMax
] = SEC_D
; 
 767         LastProxToAirDuration 
= 8 * ToSendMax 
- 4; 
 769         for(uint16_t i 
= 0; i 
< len
; i
++) { 
 773                 for(uint16_t j 
= 0; j 
< 8; j
++) { 
 775                                 ToSend
[++ToSendMax
] = SEC_D
; 
 777                                 ToSend
[++ToSendMax
] = SEC_E
; 
 782                 // Get the parity bit 
 783                 if (parity
[i
>>3] & (0x80>>(i
&0x0007))) { 
 784                         ToSend
[++ToSendMax
] = SEC_D
; 
 785                         LastProxToAirDuration 
= 8 * ToSendMax 
- 4; 
 787                         ToSend
[++ToSendMax
] = SEC_E
; 
 788                         LastProxToAirDuration 
= 8 * ToSendMax
; 
 793         ToSend
[++ToSendMax
] = SEC_F
; 
 795         // Convert from last byte pos to length 
 799 static void CodeIso14443aAsTag(const uint8_t *cmd
, uint16_t len
) 
 801         uint8_t par
[MAX_PARITY_SIZE
]; 
 803         GetParity(cmd
, len
, par
); 
 804         CodeIso14443aAsTagPar(cmd
, len
, par
); 
 808 static void Code4bitAnswerAsTag(uint8_t cmd
) 
 814         // Correction bit, might be removed when not needed 
 819         ToSendStuffBit(1);  // 1 
 825         ToSend
[++ToSendMax
] = SEC_D
; 
 828         for(i 
= 0; i 
< 4; i
++) { 
 830                         ToSend
[++ToSendMax
] = SEC_D
; 
 831                         LastProxToAirDuration 
= 8 * ToSendMax 
- 4; 
 833                         ToSend
[++ToSendMax
] = SEC_E
; 
 834                         LastProxToAirDuration 
= 8 * ToSendMax
; 
 840         ToSend
[++ToSendMax
] = SEC_F
; 
 842         // Convert from last byte pos to length 
 846 //----------------------------------------------------------------------------- 
 847 // Wait for commands from reader 
 848 // Stop when button is pressed 
 849 // Or return TRUE when command is captured 
 850 //----------------------------------------------------------------------------- 
 851 static int GetIso14443aCommandFromReader(uint8_t *received
, uint8_t *parity
, int *len
) 
 853     // Set FPGA mode to "simulated ISO 14443 tag", no modulation (listen 
 854     // only, since we are receiving, not transmitting). 
 855     // Signal field is off with the appropriate LED 
 857     FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_TAGSIM_LISTEN
); 
 859     // Now run a `software UART' on the stream of incoming samples. 
 860         UartInit(received
, parity
); 
 863     uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 868         if(BUTTON_PRESS()) return FALSE
; 
 870         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 871             b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 872                         if(MillerDecoding(b
, 0)) { 
 880 static int EmSendCmd14443aRaw(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
); 
 881 int EmSend4bitEx(uint8_t resp
, bool correctionNeeded
); 
 882 int EmSend4bit(uint8_t resp
); 
 883 int EmSendCmdExPar(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
, uint8_t *par
); 
 884 int EmSendCmdEx(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
); 
 885 int EmSendCmd(uint8_t *resp
, uint16_t respLen
); 
 886 int EmSendCmdPar(uint8_t *resp
, uint16_t respLen
, uint8_t *par
); 
 887 bool EmLogTrace(uint8_t *reader_data
, uint16_t reader_len
, uint32_t reader_StartTime
, uint32_t reader_EndTime
, uint8_t *reader_Parity
, 
 888                                  uint8_t *tag_data
, uint16_t tag_len
, uint32_t tag_StartTime
, uint32_t tag_EndTime
, uint8_t *tag_Parity
); 
 890 static uint8_t* free_buffer_pointer 
= (((uint8_t *)BigBuf
) + FREE_BUFFER_OFFSET
); 
 897   uint32_t ProxToAirDuration
; 
 898 } tag_response_info_t
; 
 900 void reset_free_buffer() { 
 901   free_buffer_pointer 
= (((uint8_t *)BigBuf
) + FREE_BUFFER_OFFSET
); 
 904 bool prepare_tag_modulation(tag_response_info_t
* response_info
, size_t max_buffer_size
) { 
 905         // Example response, answer to MIFARE Classic read block will be 16 bytes + 2 CRC = 18 bytes 
 906         // This will need the following byte array for a modulation sequence 
 907         //    144        data bits (18 * 8) 
 910         //      1        Correction bit (Answer in 1172 or 1236 periods, see FPGA) 
 911         //      1        just for the case 
 913         //    166 bytes, since every bit that needs to be send costs us a byte 
 916   // Prepare the tag modulation bits from the message 
 917   CodeIso14443aAsTag(response_info
->response
,response_info
->response_n
); 
 919   // Make sure we do not exceed the free buffer space 
 920   if (ToSendMax 
> max_buffer_size
) { 
 921     Dbprintf("Out of memory, when modulating bits for tag answer:"); 
 922     Dbhexdump(response_info
->response_n
,response_info
->response
,false); 
 926   // Copy the byte array, used for this modulation to the buffer position 
 927   memcpy(response_info
->modulation
,ToSend
,ToSendMax
); 
 929   // Store the number of bytes that were used for encoding/modulation and the time needed to transfer them 
 930   response_info
->modulation_n 
= ToSendMax
; 
 931   response_info
->ProxToAirDuration 
= LastProxToAirDuration
; 
 936 bool prepare_allocated_tag_modulation(tag_response_info_t
* response_info
) { 
 937   // Retrieve and store the current buffer index 
 938   response_info
->modulation 
= free_buffer_pointer
; 
 940   // Determine the maximum size we can use from our buffer 
 941   size_t max_buffer_size 
= (((uint8_t *)BigBuf
) + FREE_BUFFER_OFFSET 
+ FREE_BUFFER_SIZE
) - free_buffer_pointer
; 
 943   // Forward the prepare tag modulation function to the inner function 
 944   if (prepare_tag_modulation(response_info
,max_buffer_size
)) { 
 945     // Update the free buffer offset 
 946     free_buffer_pointer 
+= ToSendMax
; 
 953 //----------------------------------------------------------------------------- 
 954 // Main loop of simulated tag: receive commands from reader, decide what 
 955 // response to send, and send it. 
 956 //----------------------------------------------------------------------------- 
 957 void SimulateIso14443aTag(int tagType
, int uid_1st
, int uid_2nd
, byte_t
* data
) 
 959         // Enable and clear the trace 
 960         iso14a_clear_trace(); 
 961         iso14a_set_tracing(TRUE
); 
 965         // The first response contains the ATQA (note: bytes are transmitted in reverse order). 
 966         uint8_t response1
[2]; 
 969                 case 1: { // MIFARE Classic 
 970                         // Says: I am Mifare 1k - original line 
 975                 case 2: { // MIFARE Ultralight 
 976                         // Says: I am a stupid memory tag, no crypto 
 981                 case 3: { // MIFARE DESFire 
 982                         // Says: I am a DESFire tag, ph33r me 
 987                 case 4: { // ISO/IEC 14443-4 
 988                         // Says: I am a javacard (JCOP) 
 994                         Dbprintf("Error: unkown tagtype (%d)",tagType
); 
 999         // The second response contains the (mandatory) first 24 bits of the UID 
1000         uint8_t response2
[5]; 
1002         // Check if the uid uses the (optional) part 
1003         uint8_t response2a
[5]; 
1005                 response2
[0] = 0x88; 
1006                 num_to_bytes(uid_1st
,3,response2
+1); 
1007                 num_to_bytes(uid_2nd
,4,response2a
); 
1008                 response2a
[4] = response2a
[0] ^ response2a
[1] ^ response2a
[2] ^ response2a
[3]; 
1010                 // Configure the ATQA and SAK accordingly 
1011                 response1
[0] |= 0x40; 
1014                 num_to_bytes(uid_1st
,4,response2
); 
1015                 // Configure the ATQA and SAK accordingly 
1016                 response1
[0] &= 0xBF; 
1020         // Calculate the BitCountCheck (BCC) for the first 4 bytes of the UID. 
1021         response2
[4] = response2
[0] ^ response2
[1] ^ response2
[2] ^ response2
[3]; 
1023         // Prepare the mandatory SAK (for 4 and 7 byte UID) 
1024         uint8_t response3
[3]; 
1026         ComputeCrc14443(CRC_14443_A
, response3
, 1, &response3
[1], &response3
[2]); 
1028         // Prepare the optional second SAK (for 7 byte UID), drop the cascade bit 
1029         uint8_t response3a
[3]; 
1030         response3a
[0] = sak 
& 0xFB; 
1031         ComputeCrc14443(CRC_14443_A
, response3a
, 1, &response3a
[1], &response3a
[2]); 
1033         uint8_t response5
[] = { 0x00, 0x00, 0x00, 0x00 }; // Very random tag nonce 
1034         uint8_t response6
[] = { 0x04, 0x58, 0x80, 0x02, 0x00, 0x00 }; // dummy ATS (pseudo-ATR), answer to RATS:  
1035         // Format byte = 0x58: FSCI=0x08 (FSC=256), TA(1) and TC(1) present,  
1036         // TA(1) = 0x80: different divisors not supported, DR = 1, DS = 1 
1037         // 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) 
1038         // TC(1) = 0x02: CID supported, NAD not supported 
1039         ComputeCrc14443(CRC_14443_A
, response6
, 4, &response6
[4], &response6
[5]); 
1041         #define TAG_RESPONSE_COUNT 7 
1042         tag_response_info_t responses
[TAG_RESPONSE_COUNT
] = { 
1043                 { .response 
= response1
,  .response_n 
= sizeof(response1
)  },  // Answer to request - respond with card type 
1044                 { .response 
= response2
,  .response_n 
= sizeof(response2
)  },  // Anticollision cascade1 - respond with uid 
1045                 { .response 
= response2a
, .response_n 
= sizeof(response2a
) },  // Anticollision cascade2 - respond with 2nd half of uid if asked 
1046                 { .response 
= response3
,  .response_n 
= sizeof(response3
)  },  // Acknowledge select - cascade 1 
1047                 { .response 
= response3a
, .response_n 
= sizeof(response3a
) },  // Acknowledge select - cascade 2 
1048                 { .response 
= response5
,  .response_n 
= sizeof(response5
)  },  // Authentication answer (random nonce) 
1049                 { .response 
= response6
,  .response_n 
= sizeof(response6
)  },  // dummy ATS (pseudo-ATR), answer to RATS 
1052         // Allocate 512 bytes for the dynamic modulation, created when the reader queries for it 
1053         // Such a response is less time critical, so we can prepare them on the fly 
1054         #define DYNAMIC_RESPONSE_BUFFER_SIZE 64 
1055         #define DYNAMIC_MODULATION_BUFFER_SIZE 512 
1056         uint8_t dynamic_response_buffer
[DYNAMIC_RESPONSE_BUFFER_SIZE
]; 
1057         uint8_t dynamic_modulation_buffer
[DYNAMIC_MODULATION_BUFFER_SIZE
]; 
1058         tag_response_info_t dynamic_response_info 
= { 
1059                 .response 
= dynamic_response_buffer
, 
1061                 .modulation 
= dynamic_modulation_buffer
, 
1065         // Reset the offset pointer of the free buffer 
1066         reset_free_buffer(); 
1068         // Prepare the responses of the anticollision phase 
1069         // there will be not enough time to do this at the moment the reader sends it REQA 
1070         for (size_t i
=0; i
<TAG_RESPONSE_COUNT
; i
++) { 
1071                 prepare_allocated_tag_modulation(&responses
[i
]); 
1076         // To control where we are in the protocol 
1080         // Just to allow some checks 
1085         // We need to listen to the high-frequency, peak-detected path. 
1086         iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN
); 
1088         // buffers used on software Uart: 
1089         uint8_t *receivedCmd 
= ((uint8_t *)BigBuf
) + RECV_CMD_OFFSET
; 
1090         uint8_t *receivedCmdPar 
= ((uint8_t *)BigBuf
) + RECV_CMD_PAR_OFFSET
; 
1093         tag_response_info_t
* p_response
; 
1097                 // Clean receive command buffer 
1099                 if(!GetIso14443aCommandFromReader(receivedCmd
, receivedCmdPar
, &len
)) { 
1100                         DbpString("Button press"); 
1106                 // Okay, look at the command now. 
1108                 if(receivedCmd
[0] == 0x26) { // Received a REQUEST 
1109                         p_response 
= &responses
[0]; order 
= 1; 
1110                 } else if(receivedCmd
[0] == 0x52) { // Received a WAKEUP 
1111                         p_response 
= &responses
[0]; order 
= 6; 
1112                 } else if(receivedCmd
[1] == 0x20 && receivedCmd
[0] == 0x93) {   // Received request for UID (cascade 1) 
1113                         p_response 
= &responses
[1]; order 
= 2; 
1114                 } else if(receivedCmd
[1] == 0x20 && receivedCmd
[0] == 0x95) {   // Received request for UID (cascade 2) 
1115                         p_response 
= &responses
[2]; order 
= 20; 
1116                 } else if(receivedCmd
[1] == 0x70 && receivedCmd
[0] == 0x93) {   // Received a SELECT (cascade 1) 
1117                         p_response 
= &responses
[3]; order 
= 3; 
1118                 } else if(receivedCmd
[1] == 0x70 && receivedCmd
[0] == 0x95) {   // Received a SELECT (cascade 2) 
1119                         p_response 
= &responses
[4]; order 
= 30; 
1120                 } else if(receivedCmd
[0] == 0x30) {     // Received a (plain) READ 
1121                         EmSendCmdEx(data
+(4*receivedCmd
[1]),16,false); 
1122                         // Dbprintf("Read request from reader: %x %x",receivedCmd[0],receivedCmd[1]); 
1123                         // We already responded, do not send anything with the EmSendCmd14443aRaw() that is called below 
1125                 } else if(receivedCmd
[0] == 0x50) {     // Received a HALT 
1126 //                      DbpString("Reader requested we HALT!:"); 
1128                                 LogTrace(receivedCmd
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
1131                 } else if(receivedCmd
[0] == 0x60 || receivedCmd
[0] == 0x61) {   // Received an authentication request 
1132                         p_response 
= &responses
[5]; order 
= 7; 
1133                 } else if(receivedCmd
[0] == 0xE0) {     // Received a RATS request 
1134                         if (tagType 
== 1 || tagType 
== 2) {     // RATS not supported 
1135                                 EmSend4bit(CARD_NACK_NA
); 
1138                                 p_response 
= &responses
[6]; order 
= 70; 
1140                 } else if (order 
== 7 && len 
== 8) { // Received {nr] and {ar} (part of authentication) 
1142                                 LogTrace(receivedCmd
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
1144                         uint32_t nr 
= bytes_to_num(receivedCmd
,4); 
1145                         uint32_t ar 
= bytes_to_num(receivedCmd
+4,4); 
1146                         Dbprintf("Auth attempt {nr}{ar}: %08x %08x",nr
,ar
); 
1148                         // Check for ISO 14443A-4 compliant commands, look at left nibble 
1149                         switch (receivedCmd
[0]) { 
1152                                 case 0x0A: { // IBlock (command) 
1153                                   dynamic_response_info
.response
[0] = receivedCmd
[0]; 
1154                                   dynamic_response_info
.response
[1] = 0x00; 
1155                                   dynamic_response_info
.response
[2] = 0x90; 
1156                                   dynamic_response_info
.response
[3] = 0x00; 
1157                                   dynamic_response_info
.response_n 
= 4; 
1161                                 case 0x1B: { // Chaining command 
1162                                   dynamic_response_info
.response
[0] = 0xaa | ((receivedCmd
[0]) & 1); 
1163                                   dynamic_response_info
.response_n 
= 2; 
1168                                   dynamic_response_info
.response
[0] = receivedCmd
[0] ^ 0x11; 
1169                                   dynamic_response_info
.response_n 
= 2; 
1173                                   memcpy(dynamic_response_info
.response
,"\xAB\x00",2); 
1174                                   dynamic_response_info
.response_n 
= 2; 
1178                                 case 0xC2: { // Readers sends deselect command 
1179                                   memcpy(dynamic_response_info
.response
,"\xCA\x00",2); 
1180                                   dynamic_response_info
.response_n 
= 2; 
1184                                         // Never seen this command before 
1186                                                 LogTrace(receivedCmd
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
1188                                         Dbprintf("Received unknown command (len=%d):",len
); 
1189                                         Dbhexdump(len
,receivedCmd
,false); 
1191                                         dynamic_response_info
.response_n 
= 0; 
1195                         if (dynamic_response_info
.response_n 
> 0) { 
1196                                 // Copy the CID from the reader query 
1197                                 dynamic_response_info
.response
[1] = receivedCmd
[1]; 
1199                                 // Add CRC bytes, always used in ISO 14443A-4 compliant cards 
1200                                 AppendCrc14443a(dynamic_response_info
.response
,dynamic_response_info
.response_n
); 
1201                                 dynamic_response_info
.response_n 
+= 2; 
1203                                 if (prepare_tag_modulation(&dynamic_response_info
,DYNAMIC_MODULATION_BUFFER_SIZE
) == false) { 
1204                                         Dbprintf("Error preparing tag response"); 
1206                                                 LogTrace(receivedCmd
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
1210                                 p_response 
= &dynamic_response_info
; 
1214                 // Count number of wakeups received after a halt 
1215                 if(order 
== 6 && lastorder 
== 5) { happened
++; } 
1217                 // Count number of other messages after a halt 
1218                 if(order 
!= 6 && lastorder 
== 5) { happened2
++; } 
1220                 if(cmdsRecvd 
> 999) { 
1221                         DbpString("1000 commands later..."); 
1226                 if (p_response 
!= NULL
) { 
1227                         EmSendCmd14443aRaw(p_response
->modulation
, p_response
->modulation_n
, receivedCmd
[0] == 0x52); 
1228                         // do the tracing for the previous reader request and this tag answer: 
1229                         uint8_t par
[MAX_PARITY_SIZE
]; 
1230                         GetParity(p_response
->response
, p_response
->response_n
, par
); 
1231                         EmLogTrace(Uart
.output
,  
1233                                                 Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1234                                                 Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1236                                                 p_response
->response
,  
1237                                                 p_response
->response_n
, 
1238                                                 LastTimeProxToAirStart
*16 + DELAY_ARM2AIR_AS_TAG
, 
1239                                                 (LastTimeProxToAirStart 
+ p_response
->ProxToAirDuration
)*16 + DELAY_ARM2AIR_AS_TAG
,  
1244                         Dbprintf("Trace Full. Simulation stopped."); 
1249         Dbprintf("%x %x %x", happened
, happened2
, cmdsRecvd
); 
1254 // prepare a delayed transfer. This simply shifts ToSend[] by a number 
1255 // of bits specified in the delay parameter. 
1256 void PrepareDelayedTransfer(uint16_t delay
) 
1258         uint8_t bitmask 
= 0; 
1259         uint8_t bits_to_shift 
= 0; 
1260         uint8_t bits_shifted 
= 0; 
1264                 for (uint16_t i 
= 0; i 
< delay
; i
++) { 
1265                         bitmask 
|= (0x01 << i
); 
1267                 ToSend
[ToSendMax
++] = 0x00; 
1268                 for (uint16_t i 
= 0; i 
< ToSendMax
; i
++) { 
1269                         bits_to_shift 
= ToSend
[i
] & bitmask
; 
1270                         ToSend
[i
] = ToSend
[i
] >> delay
; 
1271                         ToSend
[i
] = ToSend
[i
] | (bits_shifted 
<< (8 - delay
)); 
1272                         bits_shifted 
= bits_to_shift
; 
1278 //------------------------------------------------------------------------------------- 
1279 // Transmit the command (to the tag) that was placed in ToSend[]. 
1280 // Parameter timing: 
1281 // if NULL: transfer at next possible time, taking into account 
1282 //                      request guard time and frame delay time 
1283 // if == 0:     transfer immediately and return time of transfer 
1284 // if != 0: delay transfer until time specified 
1285 //------------------------------------------------------------------------------------- 
1286 static void TransmitFor14443a(const uint8_t *cmd
, uint16_t len
, uint32_t *timing
) 
1289         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_READER_MOD
); 
1291         uint32_t ThisTransferTime 
= 0; 
1294                 if(*timing 
== 0) {                                                                              // Measure time 
1295                         *timing 
= (GetCountSspClk() + 8) & 0xfffffff8; 
1297                         PrepareDelayedTransfer(*timing 
& 0x00000007);           // Delay transfer (fine tuning - up to 7 MF clock ticks) 
1299                 if(MF_DBGLEVEL 
>= 4 && GetCountSspClk() >= (*timing 
& 0xfffffff8)) Dbprintf("TransmitFor14443a: Missed timing"); 
1300                 while(GetCountSspClk() < (*timing 
& 0xfffffff8));               // Delay transfer (multiple of 8 MF clock ticks) 
1301                 LastTimeProxToAirStart 
= *timing
; 
1303                 ThisTransferTime 
= ((MAX(NextTransferTime
, GetCountSspClk()) & 0xfffffff8) + 8); 
1304                 while(GetCountSspClk() < ThisTransferTime
); 
1305                 LastTimeProxToAirStart 
= ThisTransferTime
; 
1309         AT91C_BASE_SSC
->SSC_THR 
= SEC_Y
; 
1311         // for(uint16_t c = 0; c < 10;) {       // standard delay for each transfer (allow tag to be ready after last transmission) 
1312                 // if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { 
1313                         // AT91C_BASE_SSC->SSC_THR = SEC_Y;      
1320                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
1321                         AT91C_BASE_SSC
->SSC_THR 
= cmd
[c
]; 
1329         NextTransferTime 
= MAX(NextTransferTime
, LastTimeProxToAirStart 
+ REQUEST_GUARD_TIME
); 
1334 //----------------------------------------------------------------------------- 
1335 // Prepare reader command (in bits, support short frames) to send to FPGA 
1336 //----------------------------------------------------------------------------- 
1337 void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd
, uint16_t bits
, const uint8_t *parity
) 
1345         // Start of Communication (Seq. Z) 
1346         ToSend
[++ToSendMax
] = SEC_Z
; 
1347         LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 6; 
1350         size_t bytecount 
= nbytes(bits
); 
1351         // Generate send structure for the data bits 
1352         for (i 
= 0; i 
< bytecount
; i
++) { 
1353                 // Get the current byte to send 
1355                 size_t bitsleft 
= MIN((bits
-(i
*8)),8); 
1357                 for (j 
= 0; j 
< bitsleft
; j
++) { 
1360                                 ToSend
[++ToSendMax
] = SEC_X
; 
1361                                 LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 2; 
1366                                 ToSend
[++ToSendMax
] = SEC_Z
; 
1367                                 LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 6; 
1370                                         ToSend
[++ToSendMax
] = SEC_Y
; 
1377                 // Only transmit parity bit if we transmitted a complete byte 
1379                         // Get the parity bit 
1380                         if (parity
[i
>>3] & (0x80 >> (i
&0x0007))) { 
1382                                 ToSend
[++ToSendMax
] = SEC_X
; 
1383                                 LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 2; 
1388                                         ToSend
[++ToSendMax
] = SEC_Z
; 
1389                                         LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 6; 
1392                                         ToSend
[++ToSendMax
] = SEC_Y
; 
1399         // End of Communication: Logic 0 followed by Sequence Y 
1402                 ToSend
[++ToSendMax
] = SEC_Z
; 
1403                 LastProxToAirDuration 
= 8 * (ToSendMax
+1) - 6; 
1406                 ToSend
[++ToSendMax
] = SEC_Y
; 
1409         ToSend
[++ToSendMax
] = SEC_Y
; 
1411         // Convert to length of command: 
1415 //----------------------------------------------------------------------------- 
1416 // Prepare reader command to send to FPGA 
1417 //----------------------------------------------------------------------------- 
1418 void CodeIso14443aAsReaderPar(const uint8_t *cmd
, uint16_t len
, const uint8_t *parity
) 
1420   CodeIso14443aBitsAsReaderPar(cmd
, len
*8, parity
); 
1423 //----------------------------------------------------------------------------- 
1424 // Wait for commands from reader 
1425 // Stop when button is pressed (return 1) or field was gone (return 2) 
1426 // Or return 0 when command is captured 
1427 //----------------------------------------------------------------------------- 
1428 static int EmGetCmd(uint8_t *received
, uint16_t *len
, uint8_t *parity
) 
1432         uint32_t timer 
= 0, vtime 
= 0; 
1436         // Set FPGA mode to "simulated ISO 14443 tag", no modulation (listen 
1437         // only, since we are receiving, not transmitting). 
1438         // Signal field is off with the appropriate LED 
1440         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_TAGSIM_LISTEN
); 
1442         // Set ADC to read field strength 
1443         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_SWRST
; 
1444         AT91C_BASE_ADC
->ADC_MR 
= 
1445                                 ADC_MODE_PRESCALE(32) | 
1446                                 ADC_MODE_STARTUP_TIME(16) | 
1447                                 ADC_MODE_SAMPLE_HOLD_TIME(8); 
1448         AT91C_BASE_ADC
->ADC_CHER 
= ADC_CHANNEL(ADC_CHAN_HF
); 
1450         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
1452         // Now run a 'software UART' on the stream of incoming samples. 
1453         UartInit(received
, parity
); 
1456     uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1461                 if (BUTTON_PRESS()) return 1; 
1463                 // test if the field exists 
1464                 if (AT91C_BASE_ADC
->ADC_SR 
& ADC_END_OF_CONVERSION(ADC_CHAN_HF
)) { 
1466                         analogAVG 
+= AT91C_BASE_ADC
->ADC_CDR
[ADC_CHAN_HF
]; 
1467                         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
1468                         if (analogCnt 
>= 32) { 
1469                                 if ((33000 * (analogAVG 
/ analogCnt
) >> 10) < MF_MINFIELDV
) { 
1470                                         vtime 
= GetTickCount(); 
1471                                         if (!timer
) timer 
= vtime
; 
1472                                         // 50ms no field --> card to idle state 
1473                                         if (vtime 
- timer 
> 50) return 2; 
1475                                         if (timer
) timer 
= 0; 
1481                 // receive and test the miller decoding 
1482         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
1483             b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1484                         if(MillerDecoding(b
, 0)) { 
1494 static int EmSendCmd14443aRaw(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
) 
1498         uint32_t ThisTransferTime
; 
1500         // Modulate Manchester 
1501         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_TAGSIM_MOD
); 
1503         // include correction bit if necessary 
1504         if (Uart
.parityBits 
& 0x01) { 
1505                 correctionNeeded 
= TRUE
; 
1507         if(correctionNeeded
) { 
1508                 // 1236, so correction bit needed 
1514         // clear receiving shift register and holding register 
1515         while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
1516         b 
= AT91C_BASE_SSC
->SSC_RHR
; (void) b
; 
1517         while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
1518         b 
= AT91C_BASE_SSC
->SSC_RHR
; (void) b
; 
1520         // wait for the FPGA to signal fdt_indicator == 1 (the FPGA is ready to queue new data in its delay line) 
1521         for (uint16_t j 
= 0; j 
< 5; j
++) {      // allow timeout - better late than never 
1522                 while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
1523                 if (AT91C_BASE_SSC
->SSC_RHR
) break; 
1526         while ((ThisTransferTime 
= GetCountSspClk()) & 0x00000007); 
1529         AT91C_BASE_SSC
->SSC_THR 
= SEC_F
; 
1532         for(; i 
<= respLen
; ) { 
1533                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
1534                         AT91C_BASE_SSC
->SSC_THR 
= resp
[i
++]; 
1535                         FpgaSendQueueDelay 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1538                 if(BUTTON_PRESS()) { 
1543         // Ensure that the FPGA Delay Queue is empty before we switch to TAGSIM_LISTEN again: 
1544         for (i 
= 0; i 
< 2 ; ) { 
1545                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
1546                         AT91C_BASE_SSC
->SSC_THR 
= SEC_F
; 
1547                         FpgaSendQueueDelay 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1552         LastTimeProxToAirStart 
= ThisTransferTime 
+ (correctionNeeded
?8:0); 
1557 int EmSend4bitEx(uint8_t resp
, bool correctionNeeded
){ 
1558         Code4bitAnswerAsTag(resp
); 
1559         int res 
= EmSendCmd14443aRaw(ToSend
, ToSendMax
, correctionNeeded
); 
1560         // do the tracing for the previous reader request and this tag answer: 
1562         GetParity(&resp
, 1, par
); 
1563         EmLogTrace(Uart
.output
,  
1565                                 Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1566                                 Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1570                                 LastTimeProxToAirStart
*16 + DELAY_ARM2AIR_AS_TAG
, 
1571                                 (LastTimeProxToAirStart 
+ LastProxToAirDuration
)*16 + DELAY_ARM2AIR_AS_TAG
,  
1576 int EmSend4bit(uint8_t resp
){ 
1577         return EmSend4bitEx(resp
, false); 
1580 int EmSendCmdExPar(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
, uint8_t *par
){ 
1581         CodeIso14443aAsTagPar(resp
, respLen
, par
); 
1582         int res 
= EmSendCmd14443aRaw(ToSend
, ToSendMax
, correctionNeeded
); 
1583         // do the tracing for the previous reader request and this tag answer: 
1584         EmLogTrace(Uart
.output
,  
1586                                 Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1587                                 Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
,  
1591                                 LastTimeProxToAirStart
*16 + DELAY_ARM2AIR_AS_TAG
, 
1592                                 (LastTimeProxToAirStart 
+ LastProxToAirDuration
)*16 + DELAY_ARM2AIR_AS_TAG
,  
1597 int EmSendCmdEx(uint8_t *resp
, uint16_t respLen
, bool correctionNeeded
){ 
1598         uint8_t par
[MAX_PARITY_SIZE
]; 
1599         GetParity(resp
, respLen
, par
); 
1600         return EmSendCmdExPar(resp
, respLen
, correctionNeeded
, par
); 
1603 int EmSendCmd(uint8_t *resp
, uint16_t respLen
){ 
1604         uint8_t par
[MAX_PARITY_SIZE
]; 
1605         GetParity(resp
, respLen
, par
); 
1606         return EmSendCmdExPar(resp
, respLen
, false, par
); 
1609 int EmSendCmdPar(uint8_t *resp
, uint16_t respLen
, uint8_t *par
){ 
1610         return EmSendCmdExPar(resp
, respLen
, false, par
); 
1613 bool EmLogTrace(uint8_t *reader_data
, uint16_t reader_len
, uint32_t reader_StartTime
, uint32_t reader_EndTime
, uint8_t *reader_Parity
, 
1614                                  uint8_t *tag_data
, uint16_t tag_len
, uint32_t tag_StartTime
, uint32_t tag_EndTime
, uint8_t *tag_Parity
) 
1617                 // we cannot exactly measure the end and start of a received command from reader. However we know that the delay from 
1618                 // end of the received command to start of the tag's (simulated by us) answer is n*128+20 or n*128+84 resp. 
1619                 // with n >= 9. The start of the tags answer can be measured and therefore the end of the received command be calculated: 
1620                 uint16_t reader_modlen 
= reader_EndTime 
- reader_StartTime
; 
1621                 uint16_t approx_fdt 
= tag_StartTime 
- reader_EndTime
; 
1622                 uint16_t exact_fdt 
= (approx_fdt 
- 20 + 32)/64 * 64 + 20; 
1623                 reader_EndTime 
= tag_StartTime 
- exact_fdt
; 
1624                 reader_StartTime 
= reader_EndTime 
- reader_modlen
; 
1625                 if (!LogTrace(reader_data
, reader_len
, reader_StartTime
, reader_EndTime
, reader_Parity
, TRUE
)) { 
1627                 } else return(!LogTrace(tag_data
, tag_len
, tag_StartTime
, tag_EndTime
, tag_Parity
, FALSE
)); 
1633 //----------------------------------------------------------------------------- 
1634 // Wait a certain time for tag response 
1635 //  If a response is captured return TRUE 
1636 //  If it takes too long return FALSE 
1637 //----------------------------------------------------------------------------- 
1638 static int GetIso14443aAnswerFromTag(uint8_t *receivedResponse
, uint8_t *receivedResponsePar
, uint16_t offset
) 
1642         // Set FPGA mode to "reader listen mode", no modulation (listen 
1643         // only, since we are receiving, not transmitting). 
1644         // Signal field is on with the appropriate LED 
1646         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| FPGA_HF_ISO14443A_READER_LISTEN
); 
1648         // Now get the answer from the card 
1649         DemodInit(receivedResponse
, receivedResponsePar
); 
1652     uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1658                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
1659                         b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
1660                         if(ManchesterDecoding(b
, offset
, 0)) { 
1661                                 NextTransferTime 
= MAX(NextTransferTime
, Demod
.endTime 
- (DELAY_AIR2ARM_AS_READER 
+ DELAY_ARM2AIR_AS_READER
)/16 + FRAME_DELAY_TIME_PICC_TO_PCD
); 
1663                         } else if (c
++ > iso14a_timeout
) { 
1670 void ReaderTransmitBitsPar(uint8_t* frame
, uint16_t bits
, uint8_t *par
, uint32_t *timing
) 
1673         CodeIso14443aBitsAsReaderPar(frame
, bits
, par
); 
1675         // Send command to tag 
1676         TransmitFor14443a(ToSend
, ToSendMax
, timing
); 
1680         // Log reader command in trace buffer 
1682                 LogTrace(frame
, nbytes(bits
), LastTimeProxToAirStart
*16 + DELAY_ARM2AIR_AS_READER
, (LastTimeProxToAirStart 
+ LastProxToAirDuration
)*16 + DELAY_ARM2AIR_AS_READER
, par
, TRUE
); 
1686 void ReaderTransmitPar(uint8_t* frame
, uint16_t len
, uint8_t *par
, uint32_t *timing
) 
1688   ReaderTransmitBitsPar(frame
, len
*8, par
, timing
); 
1691 void ReaderTransmitBits(uint8_t* frame
, uint16_t len
, uint32_t *timing
) 
1693   // Generate parity and redirect 
1694   uint8_t par
[MAX_PARITY_SIZE
]; 
1695   GetParity(frame
, len
/8, par
); 
1696   ReaderTransmitBitsPar(frame
, len
, par
, timing
); 
1699 void ReaderTransmit(uint8_t* frame
, uint16_t len
, uint32_t *timing
) 
1701   // Generate parity and redirect 
1702   uint8_t par
[MAX_PARITY_SIZE
]; 
1703   GetParity(frame
, len
, par
); 
1704   ReaderTransmitBitsPar(frame
, len
*8, par
, timing
); 
1707 int ReaderReceiveOffset(uint8_t* receivedAnswer
, uint16_t offset
, uint8_t *parity
) 
1709         if (!GetIso14443aAnswerFromTag(receivedAnswer
, parity
, offset
)) return FALSE
; 
1711                 LogTrace(receivedAnswer
, Demod
.len
, Demod
.startTime
*16 - DELAY_AIR2ARM_AS_READER
, Demod
.endTime
*16 - DELAY_AIR2ARM_AS_READER
, parity
, FALSE
); 
1716 int ReaderReceive(uint8_t *receivedAnswer
, uint8_t *parity
) 
1718         if (!GetIso14443aAnswerFromTag(receivedAnswer
, parity
, 0)) return FALSE
; 
1720                 LogTrace(receivedAnswer
, Demod
.len
, Demod
.startTime
*16 - DELAY_AIR2ARM_AS_READER
, Demod
.endTime
*16 - DELAY_AIR2ARM_AS_READER
, parity
, FALSE
); 
1725 /* performs iso14443a anticollision procedure 
1726  * fills the uid pointer unless NULL 
1727  * fills resp_data unless NULL */ 
1728 int iso14443a_select_card(byte_t 
*uid_ptr
, iso14a_card_select_t 
*p_hi14a_card
, uint32_t *cuid_ptr
) { 
1729         uint8_t wupa
[]       = { 0x52 };  // 0x26 - REQA  0x52 - WAKE-UP 
1730         uint8_t sel_all
[]    = { 0x93,0x20 }; 
1731         uint8_t sel_uid
[]    = { 0x93,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 
1732         uint8_t rats
[]       = { 0xE0,0x80,0x00,0x00 }; // FSD=256, FSDI=8, CID=0 
1733         uint8_t *resp 
= ((uint8_t *)BigBuf
) + RECV_RESP_OFFSET
; 
1734         uint8_t *resp_par 
= ((uint8_t *)BigBuf
) + RECV_RESP_PAR_OFFSET
; 
1736         size_t uid_resp_len
; 
1738         uint8_t sak 
= 0x04; // cascade uid 
1739         int cascade_level 
= 0; 
1742         // Broadcast for a card, WUPA (0x52) will force response from all cards in the field 
1743     ReaderTransmitBitsPar(wupa
,7,0, NULL
); 
1746         if(!ReaderReceive(resp
, resp_par
)) return 0; 
1747         //Dbprintf("atqa: %02x %02x",resp[1],resp[0]); 
1750                 memcpy(p_hi14a_card
->atqa
, resp
, 2); 
1751                 p_hi14a_card
->uidlen 
= 0; 
1752                 memset(p_hi14a_card
->uid
,0,10); 
1757                 memset(uid_ptr
,0,10); 
1760         // OK we will select at least at cascade 1, lets see if first byte of UID was 0x88 in 
1761         // which case we need to make a cascade 2 request and select - this is a long UID 
1762         // While the UID is not complete, the 3nd bit (from the right) is set in the SAK. 
1763         for(; sak 
& 0x04; cascade_level
++) { 
1764                 // SELECT_* (L1: 0x93, L2: 0x95, L3: 0x97) 
1765                 sel_uid
[0] = sel_all
[0] = 0x93 + cascade_level 
* 2; 
1768                 ReaderTransmit(sel_all
, sizeof(sel_all
), NULL
); 
1769                 if (!ReaderReceive(resp
, resp_par
)) return 0; 
1771                 if (Demod
.collisionPos
) {                       // we had a collision and need to construct the UID bit by bit 
1772                         memset(uid_resp
, 0, 4); 
1773                         uint16_t uid_resp_bits 
= 0; 
1774                         uint16_t collision_answer_offset 
= 0; 
1775                         // anti-collision-loop: 
1776                         while (Demod
.collisionPos
) { 
1777                                 Dbprintf("Multiple tags detected. Collision after Bit %d", Demod
.collisionPos
); 
1778                                 for (uint16_t i 
= collision_answer_offset
; i 
< Demod
.collisionPos
; i
++, uid_resp_bits
++) {      // add valid UID bits before collision point 
1779                                         uint16_t UIDbit 
= (resp
[i
/8] >> (i 
% 8)) & 0x01; 
1780                                         uid_resp
[uid_resp_bits 
& 0xf8] |= UIDbit 
<< (uid_resp_bits 
% 8); 
1782                                 uid_resp
[uid_resp_bits
/8] |= 1 << (uid_resp_bits 
% 8);                                  // next time select the card(s) with a 1 in the collision position 
1784                                 // construct anticollosion command: 
1785                                 sel_uid
[1] = ((2 + uid_resp_bits
/8) << 4) | (uid_resp_bits 
& 0x07);     // length of data in bytes and bits 
1786                                 for (uint16_t i 
= 0; i 
<= uid_resp_bits
/8; i
++) { 
1787                                         sel_uid
[2+i
] = uid_resp
[i
]; 
1789                                 collision_answer_offset 
= uid_resp_bits%8
; 
1790                                 ReaderTransmitBits(sel_uid
, 16 + uid_resp_bits
, NULL
); 
1791                                 if (!ReaderReceiveOffset(resp
, collision_answer_offset
, resp_par
)) return 0; 
1793                         // finally, add the last bits and BCC of the UID 
1794                         for (uint16_t i 
= collision_answer_offset
; i 
< (Demod
.len
-1)*8; i
++, uid_resp_bits
++) { 
1795                                 uint16_t UIDbit 
= (resp
[i
/8] >> (i%8
)) & 0x01; 
1796                                 uid_resp
[uid_resp_bits
/8] |= UIDbit 
<< (uid_resp_bits 
% 8); 
1799                 } else {                // no collision, use the response to SELECT_ALL as current uid 
1800                         memcpy(uid_resp
, resp
, 4); 
1803                 //Dbprintf("uid: %02x %02x %02x %02x",uid_resp[0],uid_resp[1],uid_resp[2],uid_resp[3]); 
1805                 // calculate crypto UID. Always use last 4 Bytes. 
1807                         *cuid_ptr 
= bytes_to_num(uid_resp
, 4); 
1810                 // Construct SELECT UID command 
1811                 sel_uid
[1] = 0x70;                                                                                                      // transmitting a full UID (1 Byte cmd, 1 Byte NVB, 4 Byte UID, 1 Byte BCC, 2 Bytes CRC) 
1812                 memcpy(sel_uid
+2, uid_resp
, 4);                                                                         // the UID 
1813                 sel_uid
[6] = sel_uid
[2] ^ sel_uid
[3] ^ sel_uid
[4] ^ sel_uid
[5];         // calculate and add BCC 
1814                 AppendCrc14443a(sel_uid
, 7);                                                                            // calculate and add CRC 
1815                 ReaderTransmit(sel_uid
, sizeof(sel_uid
), NULL
); 
1818                 if (!ReaderReceive(resp
, resp_par
)) return 0; 
1821                 // Test if more parts of the uid are comming 
1822                 if ((sak 
& 0x04) /* && uid_resp[0] == 0x88 */) { 
1823                         // Remove first byte, 0x88 is not an UID byte, it CT, see page 3 of: 
1824                         // http://www.nxp.com/documents/application_note/AN10927.pdf 
1825                         // This was earlier: 
1826                         //memcpy(uid_resp, uid_resp + 1, 3); 
1827                         // But memcpy should not be used for overlapping arrays,  
1828                         // and memmove appears to not be available in the arm build.  
1830                         uid_resp
[0] = uid_resp
[1]; 
1831                         uid_resp
[1] = uid_resp
[2]; 
1832                         uid_resp
[2] = uid_resp
[3];  
1838                         memcpy(uid_ptr 
+ (cascade_level
*3), uid_resp
, uid_resp_len
); 
1842                         memcpy(p_hi14a_card
->uid 
+ (cascade_level
*3), uid_resp
, uid_resp_len
); 
1843                         p_hi14a_card
->uidlen 
+= uid_resp_len
; 
1848                 p_hi14a_card
->sak 
= sak
; 
1849                 p_hi14a_card
->ats_len 
= 0; 
1852         if( (sak 
& 0x20) == 0) { 
1853                 return 2; // non iso14443a compliant tag 
1856         // Request for answer to select 
1857         AppendCrc14443a(rats
, 2); 
1858         ReaderTransmit(rats
, sizeof(rats
), NULL
); 
1860         if (!(len 
= ReaderReceive(resp
, resp_par
))) return 0; 
1863                 memcpy(p_hi14a_card
->ats
, resp
, sizeof(p_hi14a_card
->ats
)); 
1864                 p_hi14a_card
->ats_len 
= len
; 
1867         // reset the PCB block number 
1868         iso14_pcb_blocknum 
= 0; 
1873 void iso14443a_setup(uint8_t fpga_minor_mode
) { 
1874         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1875         // Set up the synchronous serial port 
1877         // connect Demodulated Signal to ADC: 
1878         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1880         // Signal field is on with the appropriate LED 
1881         if (fpga_minor_mode 
== FPGA_HF_ISO14443A_READER_MOD
 
1882                 || fpga_minor_mode 
== FPGA_HF_ISO14443A_READER_LISTEN
) { 
1887         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A 
| fpga_minor_mode
); 
1894         NextTransferTime 
= 2*DELAY_ARM2AIR_AS_READER
; 
1895         iso14a_set_timeout(1050); // 10ms default 
1898 int iso14_apdu(uint8_t *cmd
, uint16_t cmd_len
, void *data
) { 
1899         uint8_t parity
[MAX_PARITY_SIZE
]; 
1900         uint8_t real_cmd
[cmd_len
+4]; 
1901         real_cmd
[0] = 0x0a; //I-Block 
1902         // put block number into the PCB 
1903         real_cmd
[0] |= iso14_pcb_blocknum
; 
1904         real_cmd
[1] = 0x00; //CID: 0 //FIXME: allow multiple selected cards 
1905         memcpy(real_cmd
+2, cmd
, cmd_len
); 
1906         AppendCrc14443a(real_cmd
,cmd_len
+2); 
1908         ReaderTransmit(real_cmd
, cmd_len
+4, NULL
); 
1909         size_t len 
= ReaderReceive(data
, parity
); 
1910         uint8_t *data_bytes 
= (uint8_t *) data
; 
1912                 return 0; //DATA LINK ERROR 
1913         // if we received an I- or R(ACK)-Block with a block number equal to the 
1914         // current block number, toggle the current block number 
1915         else if (len 
>= 4 // PCB+CID+CRC = 4 bytes 
1916                  && ((data_bytes
[0] & 0xC0) == 0 // I-Block 
1917                      || (data_bytes
[0] & 0xD0) == 0x80) // R-Block with ACK bit set to 0 
1918                  && (data_bytes
[0] & 0x01) == iso14_pcb_blocknum
) // equal block numbers 
1920                 iso14_pcb_blocknum 
^= 1; 
1926 //----------------------------------------------------------------------------- 
1927 // Read an ISO 14443a tag. Send out commands and store answers. 
1929 //----------------------------------------------------------------------------- 
1930 void ReaderIso14443a(UsbCommand 
*c
) 
1932         iso14a_command_t param 
= c
->arg
[0]; 
1933         uint8_t *cmd 
= c
->d
.asBytes
; 
1934         size_t len 
= c
->arg
[1]; 
1935         size_t lenbits 
= c
->arg
[2]; 
1937         byte_t buf
[USB_CMD_DATA_SIZE
]; 
1938         uint8_t par
[MAX_PARITY_SIZE
]; 
1940         if(param 
& ISO14A_CONNECT
) { 
1941                 iso14a_clear_trace(); 
1944         iso14a_set_tracing(TRUE
); 
1946         if(param 
& ISO14A_REQUEST_TRIGGER
) { 
1947                 iso14a_set_trigger(TRUE
); 
1950         if(param 
& ISO14A_CONNECT
) { 
1951                 iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN
); 
1952                 if(!(param 
& ISO14A_NO_SELECT
)) { 
1953                         iso14a_card_select_t 
*card 
= (iso14a_card_select_t
*)buf
; 
1954                         arg0 
= iso14443a_select_card(NULL
,card
,NULL
); 
1955                         cmd_send(CMD_ACK
,arg0
,card
->uidlen
,0,buf
,sizeof(iso14a_card_select_t
)); 
1959         if(param 
& ISO14A_SET_TIMEOUT
) { 
1960                 iso14a_timeout 
= c
->arg
[2]; 
1963         if(param 
& ISO14A_APDU
) { 
1964                 arg0 
= iso14_apdu(cmd
, len
, buf
); 
1965                 cmd_send(CMD_ACK
,arg0
,0,0,buf
,sizeof(buf
)); 
1968         if(param 
& ISO14A_RAW
) { 
1969                 if(param 
& ISO14A_APPEND_CRC
) { 
1970                         AppendCrc14443a(cmd
,len
); 
1972                         if (lenbits
) lenbits 
+= 16; 
1975                         GetParity(cmd
, lenbits
/8, par
); 
1976                         ReaderTransmitBitsPar(cmd
, lenbits
, par
, NULL
); 
1978                         ReaderTransmit(cmd
,len
, NULL
); 
1980                 arg0 
= ReaderReceive(buf
, par
); 
1981                 cmd_send(CMD_ACK
,arg0
,0,0,buf
,sizeof(buf
)); 
1984         if(param 
& ISO14A_REQUEST_TRIGGER
) { 
1985                 iso14a_set_trigger(FALSE
); 
1988         if(param 
& ISO14A_NO_DISCONNECT
) { 
1992         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1997 // Determine the distance between two nonces. 
1998 // Assume that the difference is small, but we don't know which is first. 
1999 // Therefore try in alternating directions. 
2000 int32_t dist_nt(uint32_t nt1
, uint32_t nt2
) { 
2003         uint32_t nttmp1
, nttmp2
; 
2005         if (nt1 
== nt2
) return 0; 
2010         for (i 
= 1; i 
< 32768; i
++) { 
2011                 nttmp1 
= prng_successor(nttmp1
, 1); 
2012                 if (nttmp1 
== nt2
) return i
; 
2013                 nttmp2 
= prng_successor(nttmp2
, 1); 
2014                         if (nttmp2 
== nt1
) return -i
; 
2017         return(-99999); // either nt1 or nt2 are invalid nonces 
2021 //----------------------------------------------------------------------------- 
2022 // Recover several bits of the cypher stream. This implements (first stages of) 
2023 // the algorithm described in "The Dark Side of Security by Obscurity and 
2024 // Cloning MiFare Classic Rail and Building Passes, Anywhere, Anytime" 
2025 // (article by Nicolas T. Courtois, 2009) 
2026 //----------------------------------------------------------------------------- 
2027 void ReaderMifare(bool first_try
) 
2030         uint8_t mf_auth
[]    = { 0x60,0x00,0xf5,0x7b }; 
2031         uint8_t mf_nr_ar
[]   = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; 
2032         static uint8_t mf_nr_ar3
; 
2034         uint8_t* receivedAnswer 
= (((uint8_t *)BigBuf
) + RECV_RESP_OFFSET
); 
2035         uint8_t* receivedAnswerPar 
= (((uint8_t *)BigBuf
) + RECV_RESP_PAR_OFFSET
); 
2037         iso14a_clear_trace(); 
2038         iso14a_set_tracing(TRUE
); 
2041         uint8_t par
[1] = {0};   // maximum 8 Bytes to be sent here, 1 byte parity is therefore enough 
2042         static byte_t par_low 
= 0; 
2044         uint8_t uid
[10]  ={0}; 
2048         uint32_t previous_nt 
= 0; 
2049         static uint32_t nt_attacked 
= 0; 
2050         byte_t par_list
[8] = {0,0,0,0,0,0,0,0}; 
2051         byte_t ks_list
[8] = {0,0,0,0,0,0,0,0}; 
2053         static uint32_t sync_time
; 
2054         static uint32_t sync_cycles
; 
2055         int catch_up_cycles 
= 0; 
2056         int last_catch_up 
= 0; 
2057         uint16_t consecutive_resyncs 
= 0; 
2064                 iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD
); 
2065                 sync_time 
= GetCountSspClk() & 0xfffffff8; 
2066                 sync_cycles 
= 65536;                                                                    // theory: Mifare Classic's random generator repeats every 2^16 cycles (and so do the nonces). 
2072                 // we were unsuccessful on a previous call. Try another READER nonce (first 3 parity bits remain the same) 
2074                 mf_nr_ar
[3] = mf_nr_ar3
; 
2083         for(uint16_t i 
= 0; TRUE
; i
++) { 
2087                 // Test if the action was cancelled 
2088                 if(BUTTON_PRESS()) { 
2094                 if(!iso14443a_select_card(uid
, NULL
, &cuid
)) { 
2095                         if (MF_DBGLEVEL 
>= 1)   Dbprintf("Mifare: Can't select card"); 
2099                 sync_time 
= (sync_time 
& 0xfffffff8) + sync_cycles 
+ catch_up_cycles
; 
2100                 catch_up_cycles 
= 0; 
2102                 // if we missed the sync time already, advance to the next nonce repeat 
2103                 while(GetCountSspClk() > sync_time
) { 
2104                         sync_time 
= (sync_time 
& 0xfffffff8) + sync_cycles
; 
2107                 // Transmit MIFARE_CLASSIC_AUTH at synctime. Should result in returning the same tag nonce (== nt_attacked)  
2108                 ReaderTransmit(mf_auth
, sizeof(mf_auth
), &sync_time
); 
2110                 // Receive the (4 Byte) "random" nonce 
2111                 if (!ReaderReceive(receivedAnswer
, receivedAnswerPar
)) { 
2112                         if (MF_DBGLEVEL 
>= 1)   Dbprintf("Mifare: Couldn't receive tag nonce"); 
2117                 nt 
= bytes_to_num(receivedAnswer
, 4); 
2119                 // Transmit reader nonce with fake par 
2120                 ReaderTransmitPar(mf_nr_ar
, sizeof(mf_nr_ar
), par
, NULL
); 
2122                 if (first_try 
&& previous_nt 
&& !nt_attacked
) { // we didn't calibrate our clock yet 
2123                         int nt_distance 
= dist_nt(previous_nt
, nt
); 
2124                         if (nt_distance 
== 0) { 
2128                                 if (nt_distance 
== -99999) { // invalid nonce received, try again 
2131                                 sync_cycles 
= (sync_cycles 
- nt_distance
); 
2132                                 if (MF_DBGLEVEL 
>= 3) Dbprintf("calibrating in cycle %d. nt_distance=%d, Sync_cycles: %d\n", i
, nt_distance
, sync_cycles
); 
2137                 if ((nt 
!= nt_attacked
) && nt_attacked
) {       // we somehow lost sync. Try to catch up again... 
2138                         catch_up_cycles 
= -dist_nt(nt_attacked
, nt
); 
2139                         if (catch_up_cycles 
== 99999) {                 // invalid nonce received. Don't resync on that one. 
2140                                 catch_up_cycles 
= 0; 
2143                         if (catch_up_cycles 
== last_catch_up
) { 
2144                                 consecutive_resyncs
++; 
2147                                 last_catch_up 
= catch_up_cycles
; 
2148                             consecutive_resyncs 
= 0; 
2150                         if (consecutive_resyncs 
< 3) { 
2151                                 if (MF_DBGLEVEL 
>= 3) Dbprintf("Lost sync in cycle %d. nt_distance=%d. Consecutive Resyncs = %d. Trying one time catch up...\n", i
, -catch_up_cycles
, consecutive_resyncs
); 
2154                                 sync_cycles 
= sync_cycles 
+ catch_up_cycles
; 
2155                                 if (MF_DBGLEVEL 
>= 3) 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
); 
2160                 consecutive_resyncs 
= 0; 
2162                 // Receive answer. This will be a 4 Bit NACK when the 8 parity bits are OK after decoding 
2163                 if (ReaderReceive(receivedAnswer
, receivedAnswerPar
)) 
2165                         catch_up_cycles 
= 8;    // the PRNG is delayed by 8 cycles due to the NAC (4Bits = 0x05 encrypted) transfer 
2169                                 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 
2173                         if(led_on
) LED_B_ON(); else LED_B_OFF(); 
2175                         par_list
[nt_diff
] = SwapBits(par
[0], 8); 
2176                         ks_list
[nt_diff
] = receivedAnswer
[0] ^ 0x05; 
2178                         // Test if the information is complete 
2179                         if (nt_diff 
== 0x07) { 
2184                         nt_diff 
= (nt_diff 
+ 1) & 0x07; 
2185                         mf_nr_ar
[3] = (mf_nr_ar
[3] & 0x1F) | (nt_diff 
<< 5); 
2188                         if (nt_diff 
== 0 && first_try
) 
2192                                 par
[0] = ((par
[0] & 0x1F) + 1) | par_low
; 
2198         mf_nr_ar
[3] &= 0x1F; 
2201         memcpy(buf 
+ 0,  uid
, 4); 
2202         num_to_bytes(nt
, 4, buf 
+ 4); 
2203         memcpy(buf 
+ 8,  par_list
, 8); 
2204         memcpy(buf 
+ 16, ks_list
, 8); 
2205         memcpy(buf 
+ 24, mf_nr_ar
, 4); 
2207         cmd_send(CMD_ACK
,isOK
,0,0,buf
,28); 
2210         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
2213         iso14a_set_tracing(FALSE
); 
2217   *MIFARE 1K simulate. 
2220   *     FLAG_INTERACTIVE - In interactive mode, we are expected to finish the operation with an ACK 
2221   * 4B_FLAG_UID_IN_DATA - means that there is a 4-byte UID in the data-section, we're expected to use that 
2222   * 7B_FLAG_UID_IN_DATA - means that there is a 7-byte UID in the data-section, we're expected to use that 
2223   *     FLAG_NR_AR_ATTACK  - means we should collect NR_AR responses for bruteforcing later 
2224   *@param exitAfterNReads, exit simulation after n blocks have been read, 0 is inifite 
2226 void Mifare1ksim(uint8_t flags
, uint8_t exitAfterNReads
, uint8_t arg2
, uint8_t *datain
) 
2228         int cardSTATE 
= MFEMUL_NOFIELD
; 
2230         int vHf 
= 0;    // in mV 
2232         uint32_t selTimer 
= 0; 
2233         uint32_t authTimer 
= 0; 
2235         uint8_t cardWRBL 
= 0; 
2236         uint8_t cardAUTHSC 
= 0; 
2237         uint8_t cardAUTHKEY 
= 0xff;  // no authentication 
2238         uint32_t cardRr 
= 0; 
2240         //uint32_t rn_enc = 0; 
2242         uint32_t cardINTREG 
= 0; 
2243         uint8_t cardINTBLOCK 
= 0; 
2244         struct Crypto1State mpcs 
= {0, 0}; 
2245         struct Crypto1State 
*pcs
; 
2247         uint32_t numReads 
= 0;//Counts numer of times reader read a block 
2248         uint8_t* receivedCmd 
= get_bigbufptr_recvcmdbuf(); 
2249         uint8_t* receivedCmd_par 
= receivedCmd 
+ MAX_FRAME_SIZE
; 
2250         uint8_t* response 
= get_bigbufptr_recvrespbuf(); 
2251         uint8_t* response_par 
= response 
+ MAX_FRAME_SIZE
; 
2253         uint8_t rATQA
[] = {0x04, 0x00}; // Mifare classic 1k 4BUID 
2254         uint8_t rUIDBCC1
[] = {0xde, 0xad, 0xbe, 0xaf, 0x62}; 
2255         uint8_t rUIDBCC2
[] = {0xde, 0xad, 0xbe, 0xaf, 0x62}; // !!! 
2256         uint8_t rSAK
[] = {0x08, 0xb6, 0xdd}; 
2257         uint8_t rSAK1
[] = {0x04, 0xda, 0x17}; 
2259         uint8_t rAUTH_NT
[] = {0x01, 0x02, 0x03, 0x04}; 
2260         uint8_t rAUTH_AT
[] = {0x00, 0x00, 0x00, 0x00}; 
2262         //Here, we collect UID,NT,AR,NR,UID2,NT2,AR2,NR2 
2263         // This can be used in a reader-only attack. 
2264         // (it can also be retrieved via 'hf 14a list', but hey... 
2265         uint32_t ar_nr_responses
[] = {0,0,0,0,0,0,0,0}; 
2266         uint8_t ar_nr_collected 
= 0; 
2269     iso14a_clear_trace(); 
2270         iso14a_set_tracing(TRUE
); 
2272         // Authenticate response - nonce 
2273         uint32_t nonce 
= bytes_to_num(rAUTH_NT
, 4); 
2275         //-- Determine the UID 
2276         // Can be set from emulator memory, incoming data 
2277         // and can be 7 or 4 bytes long 
2278         if (flags 
& FLAG_4B_UID_IN_DATA
) 
2280                 // 4B uid comes from data-portion of packet 
2281                 memcpy(rUIDBCC1
,datain
,4); 
2282                 rUIDBCC1
[4] = rUIDBCC1
[0] ^ rUIDBCC1
[1] ^ rUIDBCC1
[2] ^ rUIDBCC1
[3]; 
2284         } else if (flags 
& FLAG_7B_UID_IN_DATA
) { 
2285                 // 7B uid comes from data-portion of packet 
2286                 memcpy(&rUIDBCC1
[1],datain
,3); 
2287                 memcpy(rUIDBCC2
, datain
+3, 4); 
2290                 // get UID from emul memory 
2291                 emlGetMemBt(receivedCmd
, 7, 1); 
2292                 _7BUID 
= !(receivedCmd
[0] == 0x00); 
2293                 if (!_7BUID
) {                     // ---------- 4BUID 
2294                         emlGetMemBt(rUIDBCC1
, 0, 4); 
2295                 } else {                           // ---------- 7BUID 
2296                         emlGetMemBt(&rUIDBCC1
[1], 0, 3); 
2297                         emlGetMemBt(rUIDBCC2
, 3, 4); 
2302          * Regardless of what method was used to set the UID, set fifth byte and modify 
2303          * the ATQA for 4 or 7-byte UID 
2305         rUIDBCC1
[4] = rUIDBCC1
[0] ^ rUIDBCC1
[1] ^ rUIDBCC1
[2] ^ rUIDBCC1
[3]; 
2309                 rUIDBCC2
[4] = rUIDBCC2
[0] ^ rUIDBCC2
[1] ^ rUIDBCC2
[2] ^ rUIDBCC2
[3]; 
2312         // We need to listen to the high-frequency, peak-detected path. 
2313         iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN
); 
2316         if (MF_DBGLEVEL 
>= 1)   { 
2318                         Dbprintf("4B UID: %02x%02x%02x%02x",  
2319                                 rUIDBCC1
[0], rUIDBCC1
[1], rUIDBCC1
[2], rUIDBCC1
[3]); 
2321                         Dbprintf("7B UID: (%02x)%02x%02x%02x%02x%02x%02x%02x", 
2322                                 rUIDBCC1
[0], rUIDBCC1
[1], rUIDBCC1
[2], rUIDBCC1
[3], 
2323                                 rUIDBCC2
[0], rUIDBCC2
[1] ,rUIDBCC2
[2], rUIDBCC2
[3]); 
2327         bool finished 
= FALSE
; 
2328         while (!BUTTON_PRESS() && !finished
) { 
2331                 // find reader field 
2332                 // Vref = 3300mV, and an 10:1 voltage divider on the input 
2333                 // can measure voltages up to 33000 mV 
2334                 if (cardSTATE 
== MFEMUL_NOFIELD
) { 
2335                         vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
2336                         if (vHf 
> MF_MINFIELDV
) { 
2337                                 cardSTATE_TO_IDLE(); 
2341                 if(cardSTATE 
== MFEMUL_NOFIELD
) continue; 
2345                 res 
= EmGetCmd(receivedCmd
, &len
, receivedCmd_par
); 
2346                 if (res 
== 2) { //Field is off! 
2347                         cardSTATE 
= MFEMUL_NOFIELD
; 
2350                 } else if (res 
== 1) { 
2351                         break;  //return value 1 means button press 
2354                 // REQ or WUP request in ANY state and WUP in HALTED state 
2355                 if (len 
== 1 && ((receivedCmd
[0] == 0x26 && cardSTATE 
!= MFEMUL_HALTED
) || receivedCmd
[0] == 0x52)) { 
2356                         selTimer 
= GetTickCount(); 
2357                         EmSendCmdEx(rATQA
, sizeof(rATQA
), (receivedCmd
[0] == 0x52)); 
2358                         cardSTATE 
= MFEMUL_SELECT1
; 
2360                         // init crypto block 
2363                         crypto1_destroy(pcs
); 
2368                 switch (cardSTATE
) { 
2369                         case MFEMUL_NOFIELD
: 
2372                                 LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2375                         case MFEMUL_SELECT1
:{ 
2377                                 if (len 
== 2 && (receivedCmd
[0] == 0x93 && receivedCmd
[1] == 0x20)) { 
2378                                         if (MF_DBGLEVEL 
>= 4)   Dbprintf("SELECT ALL received"); 
2379                                         EmSendCmd(rUIDBCC1
, sizeof(rUIDBCC1
)); 
2383                                 if (MF_DBGLEVEL 
>= 4 && len 
== 9 && receivedCmd
[0] == 0x93 && receivedCmd
[1] == 0x70 ) 
2385                                         Dbprintf("SELECT %02x%02x%02x%02x received",receivedCmd
[2],receivedCmd
[3],receivedCmd
[4],receivedCmd
[5]); 
2389                                                 (receivedCmd
[0] == 0x93 && receivedCmd
[1] == 0x70 && memcmp(&receivedCmd
[2], rUIDBCC1
, 4) == 0)) { 
2390                                         EmSendCmd(_7BUID
?rSAK1
:rSAK
, _7BUID
?sizeof(rSAK1
):sizeof(rSAK
)); 
2391                                         cuid 
= bytes_to_num(rUIDBCC1
, 4); 
2393                                                 cardSTATE 
= MFEMUL_WORK
; 
2395                                                 if (MF_DBGLEVEL 
>= 4)   Dbprintf("--> WORK. anticol1 time: %d", GetTickCount() - selTimer
); 
2398                                                 cardSTATE 
= MFEMUL_SELECT2
; 
2406                                         cardSTATE_TO_IDLE(); 
2407                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2410                                 uint32_t ar 
= bytes_to_num(receivedCmd
, 4); 
2411                                 uint32_t nr 
= bytes_to_num(&receivedCmd
[4], 4); 
2414                                 if(ar_nr_collected 
< 2){ 
2415                                         if(ar_nr_responses
[2] != ar
) 
2416                                         {// Avoid duplicates... probably not necessary, ar should vary.  
2417                                                 ar_nr_responses
[ar_nr_collected
*4] = cuid
; 
2418                                                 ar_nr_responses
[ar_nr_collected
*4+1] = nonce
; 
2419                                                 ar_nr_responses
[ar_nr_collected
*4+2] = ar
; 
2420                                                 ar_nr_responses
[ar_nr_collected
*4+3] = nr
; 
2426                                 crypto1_word(pcs
, ar 
, 1); 
2427                                 cardRr 
= nr 
^ crypto1_word(pcs
, 0, 0); 
2430                                 if (cardRr 
!= prng_successor(nonce
, 64)){ 
2431                                         if (MF_DBGLEVEL 
>= 2) Dbprintf("AUTH FAILED for sector %d with key %c. cardRr=%08x, succ=%08x", 
2432                                                         cardAUTHSC
, cardAUTHKEY 
== 0 ? 'A' : 'B', 
2433                                                         cardRr
, prng_successor(nonce
, 64)); 
2434                                         // Shouldn't we respond anything here? 
2435                                         // Right now, we don't nack or anything, which causes the 
2436                                         // reader to do a WUPA after a while. /Martin 
2437                                         // -- which is the correct response. /piwi 
2438                                         cardSTATE_TO_IDLE(); 
2439                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2443                                 ans 
= prng_successor(nonce
, 96) ^ crypto1_word(pcs
, 0, 0); 
2445                                 num_to_bytes(ans
, 4, rAUTH_AT
); 
2447                                 EmSendCmd(rAUTH_AT
, sizeof(rAUTH_AT
)); 
2449                                 cardSTATE 
= MFEMUL_WORK
; 
2450                                 if (MF_DBGLEVEL 
>= 4)   Dbprintf("AUTH COMPLETED for sector %d with key %c. time=%d",  
2451                                         cardAUTHSC
, cardAUTHKEY 
== 0 ? 'A' : 'B', 
2452                                         GetTickCount() - authTimer
); 
2455                         case MFEMUL_SELECT2
:{ 
2457                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2460                                 if (len 
== 2 && (receivedCmd
[0] == 0x95 && receivedCmd
[1] == 0x20)) { 
2461                                         EmSendCmd(rUIDBCC2
, sizeof(rUIDBCC2
)); 
2467                                                 (receivedCmd
[0] == 0x95 && receivedCmd
[1] == 0x70 && memcmp(&receivedCmd
[2], rUIDBCC2
, 4) == 0)) { 
2468                                         EmSendCmd(rSAK
, sizeof(rSAK
)); 
2469                                         cuid 
= bytes_to_num(rUIDBCC2
, 4); 
2470                                         cardSTATE 
= MFEMUL_WORK
; 
2472                                         if (MF_DBGLEVEL 
>= 4)   Dbprintf("--> WORK. anticol2 time: %d", GetTickCount() - selTimer
); 
2476                                 // i guess there is a command). go into the work state. 
2478                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2481                                 cardSTATE 
= MFEMUL_WORK
; 
2483                                 //intentional fall-through to the next case-stmt 
2488                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2492                                 bool encrypted_data 
= (cardAUTHKEY 
!= 0xFF) ; 
2494                                 if(encrypted_data
) { 
2496                                         mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
2499                                 if (len 
== 4 && (receivedCmd
[0] == 0x60 || receivedCmd
[0] == 0x61)) { 
2500                                         authTimer 
= GetTickCount(); 
2501                                         cardAUTHSC 
= receivedCmd
[1] / 4;  // received block num 
2502                                         cardAUTHKEY 
= receivedCmd
[0] - 0x60; 
2503                                         crypto1_destroy(pcs
);//Added by martin 
2504                                         crypto1_create(pcs
, emlGetKey(cardAUTHSC
, cardAUTHKEY
)); 
2506                                         if (!encrypted_data
) { // first authentication 
2507                                                 if (MF_DBGLEVEL 
>= 4) Dbprintf("Reader authenticating for block %d (0x%02x) with key %d",receivedCmd
[1] ,receivedCmd
[1],cardAUTHKEY  
); 
2509                                                 crypto1_word(pcs
, cuid 
^ nonce
, 0);//Update crypto state 
2510                                                 num_to_bytes(nonce
, 4, rAUTH_AT
); // Send nonce 
2511                                         } else { // nested authentication 
2512                                                 if (MF_DBGLEVEL 
>= 4) Dbprintf("Reader doing nested authentication for block %d (0x%02x) with key %d",receivedCmd
[1] ,receivedCmd
[1],cardAUTHKEY 
); 
2513                                                 ans 
= nonce 
^ crypto1_word(pcs
, cuid 
^ nonce
, 0);  
2514                                                 num_to_bytes(ans
, 4, rAUTH_AT
); 
2516                                         EmSendCmd(rAUTH_AT
, sizeof(rAUTH_AT
)); 
2517                                         //Dbprintf("Sending rAUTH %02x%02x%02x%02x", rAUTH_AT[0],rAUTH_AT[1],rAUTH_AT[2],rAUTH_AT[3]); 
2518                                         cardSTATE 
= MFEMUL_AUTH1
; 
2522                                 // rule 13 of 7.5.3. in ISO 14443-4. chaining shall be continued 
2523                                 // BUT... ACK --> NACK 
2524                                 if (len 
== 1 && receivedCmd
[0] == CARD_ACK
) { 
2525                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2529                                 // rule 12 of 7.5.3. in ISO 14443-4. R(NAK) --> R(ACK) 
2530                                 if (len 
== 1 && receivedCmd
[0] == CARD_NACK_NA
) { 
2531                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2536                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2540                                 if(receivedCmd
[0] == 0x30 // read block 
2541                                                 || receivedCmd
[0] == 0xA0 // write block 
2542                                                 || receivedCmd
[0] == 0xC0 // inc 
2543                                                 || receivedCmd
[0] == 0xC1 // dec 
2544                                                 || receivedCmd
[0] == 0xC2 // restore 
2545                                                 || receivedCmd
[0] == 0xB0) { // transfer 
2546                                         if (receivedCmd
[1] >= 16 * 4) { 
2547                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2548                                                 if (MF_DBGLEVEL 
>= 2) Dbprintf("Reader tried to operate (0x%02) on out of range block: %d (0x%02x), nacking",receivedCmd
[0],receivedCmd
[1],receivedCmd
[1]); 
2552                                         if (receivedCmd
[1] / 4 != cardAUTHSC
) { 
2553                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2554                                                 if (MF_DBGLEVEL 
>= 2) Dbprintf("Reader tried to operate (0x%02) on block (0x%02x) not authenticated for (0x%02x), nacking",receivedCmd
[0],receivedCmd
[1],cardAUTHSC
); 
2559                                 if (receivedCmd
[0] == 0x30) { 
2560                                         if (MF_DBGLEVEL 
>= 4) { 
2561                                                 Dbprintf("Reader reading block %d (0x%02x)",receivedCmd
[1],receivedCmd
[1]); 
2563                                         emlGetMem(response
, receivedCmd
[1], 1); 
2564                                         AppendCrc14443a(response
, 16); 
2565                                         mf_crypto1_encrypt(pcs
, response
, 18, response_par
); 
2566                                         EmSendCmdPar(response
, 18, response_par
); 
2568                                         if(exitAfterNReads 
> 0 && numReads 
== exitAfterNReads
) { 
2569                                                 Dbprintf("%d reads done, exiting", numReads
); 
2575                                 if (receivedCmd
[0] == 0xA0) { 
2576                                         if (MF_DBGLEVEL 
>= 4) Dbprintf("RECV 0xA0 write block %d (%02x)",receivedCmd
[1],receivedCmd
[1]); 
2577                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2578                                         cardSTATE 
= MFEMUL_WRITEBL2
; 
2579                                         cardWRBL 
= receivedCmd
[1]; 
2582                                 // increment, decrement, restore 
2583                                 if (receivedCmd
[0] == 0xC0 || receivedCmd
[0] == 0xC1 || receivedCmd
[0] == 0xC2) { 
2584                                         if (MF_DBGLEVEL 
>= 4) Dbprintf("RECV 0x%02x inc(0xC1)/dec(0xC0)/restore(0xC2) block %d (%02x)",receivedCmd
[0],receivedCmd
[1],receivedCmd
[1]); 
2585                                         if (emlCheckValBl(receivedCmd
[1])) { 
2586                                                 if (MF_DBGLEVEL 
>= 2) Dbprintf("Reader tried to operate on block, but emlCheckValBl failed, nacking"); 
2587                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2590                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2591                                         if (receivedCmd
[0] == 0xC1) 
2592                                                 cardSTATE 
= MFEMUL_INTREG_INC
; 
2593                                         if (receivedCmd
[0] == 0xC0) 
2594                                                 cardSTATE 
= MFEMUL_INTREG_DEC
; 
2595                                         if (receivedCmd
[0] == 0xC2) 
2596                                                 cardSTATE 
= MFEMUL_INTREG_REST
; 
2597                                         cardWRBL 
= receivedCmd
[1]; 
2601                                 if (receivedCmd
[0] == 0xB0) { 
2602                                         if (MF_DBGLEVEL 
>= 4) Dbprintf("RECV 0x%02x transfer block %d (%02x)",receivedCmd
[0],receivedCmd
[1],receivedCmd
[1]); 
2603                                         if (emlSetValBl(cardINTREG
, cardINTBLOCK
, receivedCmd
[1])) 
2604                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2606                                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2610                                 if (receivedCmd
[0] == 0x50 && receivedCmd
[1] == 0x00) { 
2613                                         cardSTATE 
= MFEMUL_HALTED
; 
2614                                         if (MF_DBGLEVEL 
>= 4)   Dbprintf("--> HALTED. Selected time: %d ms",  GetTickCount() - selTimer
); 
2615                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2619                                 if (receivedCmd
[0] == 0xe0) {//RATS 
2620                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2623                                 // command not allowed 
2624                                 if (MF_DBGLEVEL 
>= 4)   Dbprintf("Received command not allowed, nacking"); 
2625                                 EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2628                         case MFEMUL_WRITEBL2
:{ 
2630                                         mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
2631                                         emlSetMem(receivedCmd
, cardWRBL
, 1); 
2632                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_ACK
)); 
2633                                         cardSTATE 
= MFEMUL_WORK
; 
2635                                         cardSTATE_TO_IDLE(); 
2636                                         LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2641                         case MFEMUL_INTREG_INC
:{ 
2642                                 mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
2643                                 memcpy(&ans
, receivedCmd
, 4); 
2644                                 if (emlGetValBl(&cardINTREG
, &cardINTBLOCK
, cardWRBL
)) { 
2645                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2646                                         cardSTATE_TO_IDLE(); 
2649                                 LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2650                                 cardINTREG 
= cardINTREG 
+ ans
; 
2651                                 cardSTATE 
= MFEMUL_WORK
; 
2654                         case MFEMUL_INTREG_DEC
:{ 
2655                                 mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
2656                                 memcpy(&ans
, receivedCmd
, 4); 
2657                                 if (emlGetValBl(&cardINTREG
, &cardINTBLOCK
, cardWRBL
)) { 
2658                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2659                                         cardSTATE_TO_IDLE(); 
2662                                 LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2663                                 cardINTREG 
= cardINTREG 
- ans
; 
2664                                 cardSTATE 
= MFEMUL_WORK
; 
2667                         case MFEMUL_INTREG_REST
:{ 
2668                                 mf_crypto1_decrypt(pcs
, receivedCmd
, len
); 
2669                                 memcpy(&ans
, receivedCmd
, 4); 
2670                                 if (emlGetValBl(&cardINTREG
, &cardINTBLOCK
, cardWRBL
)) { 
2671                                         EmSend4bit(mf_crypto1_encrypt4bit(pcs
, CARD_NACK_NA
)); 
2672                                         cardSTATE_TO_IDLE(); 
2675                                 LogTrace(Uart
.output
, Uart
.len
, Uart
.startTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.endTime
*16 - DELAY_AIR2ARM_AS_TAG
, Uart
.parity
, TRUE
); 
2676                                 cardSTATE 
= MFEMUL_WORK
; 
2682         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
2685         if(flags 
& FLAG_INTERACTIVE
)// Interactive mode flag, means we need to send ACK 
2687                 //May just aswell send the collected ar_nr in the response aswell 
2688                 cmd_send(CMD_ACK
,CMD_SIMULATE_MIFARE_CARD
,0,0,&ar_nr_responses
,ar_nr_collected
*4*4); 
2691         if(flags 
& FLAG_NR_AR_ATTACK
) 
2693                 if(ar_nr_collected 
> 1) { 
2694                         Dbprintf("Collected two pairs of AR/NR which can be used to extract keys from reader:"); 
2695                         Dbprintf("../tools/mfkey/mfkey32 %08x %08x %08x %08x %08x %08x", 
2696                                          ar_nr_responses
[0], // UID 
2697                                         ar_nr_responses
[1], //NT 
2698                                         ar_nr_responses
[2], //AR1 
2699                                         ar_nr_responses
[3], //NR1 
2700                                         ar_nr_responses
[6], //AR2 
2701                                         ar_nr_responses
[7] //NR2 
2704                         Dbprintf("Failed to obtain two AR/NR pairs!"); 
2705                         if(ar_nr_collected 
>0) { 
2706                                 Dbprintf("Only got these: UID=%08x, nonce=%08x, AR1=%08x, NR1=%08x", 
2707                                                 ar_nr_responses
[0], // UID 
2708                                                 ar_nr_responses
[1], //NT 
2709                                                 ar_nr_responses
[2], //AR1 
2710                                                 ar_nr_responses
[3] //NR1 
2715         if (MF_DBGLEVEL 
>= 1)   Dbprintf("Emulator stopped. Tracing: %d  trace length: %d ",    tracing
, traceLen
); 
2720 //----------------------------------------------------------------------------- 
2723 //----------------------------------------------------------------------------- 
2724 void RAMFUNC 
SniffMifare(uint8_t param
) { 
2726         // bit 0 - trigger from first card answer 
2727         // bit 1 - trigger from first reader 7-bit request 
2729         // C(red) A(yellow) B(green) 
2731         // init trace buffer 
2732         iso14a_clear_trace(); 
2733         iso14a_set_tracing(TRUE
); 
2735         // The command (reader -> tag) that we're receiving. 
2736         // The length of a received command will in most cases be no more than 18 bytes. 
2737         // So 32 should be enough! 
2738         uint8_t *receivedCmd 
= (((uint8_t *)BigBuf
) + RECV_CMD_OFFSET
); 
2739         uint8_t *receivedCmdPar 
= ((uint8_t *)BigBuf
) + RECV_CMD_PAR_OFFSET
; 
2740         // The response (tag -> reader) that we're receiving. 
2741         uint8_t *receivedResponse 
= (((uint8_t *)BigBuf
) + RECV_RESP_OFFSET
); 
2742         uint8_t *receivedResponsePar 
= ((uint8_t *)BigBuf
) + RECV_RESP_PAR_OFFSET
; 
2744         // As we receive stuff, we copy it from receivedCmd or receivedResponse 
2745         // into trace, along with its length and other annotations. 
2746         //uint8_t *trace = (uint8_t *)BigBuf; 
2748         // The DMA buffer, used to stream samples from the FPGA 
2749         uint8_t *dmaBuf 
= ((uint8_t *)BigBuf
) + DMA_BUFFER_OFFSET
; 
2750         uint8_t *data 
= dmaBuf
; 
2751         uint8_t previous_data 
= 0; 
2754         bool ReaderIsActive 
= FALSE
; 
2755         bool TagIsActive 
= FALSE
; 
2757         iso14443a_setup(FPGA_HF_ISO14443A_SNIFFER
); 
2759         // Set up the demodulator for tag -> reader responses. 
2760         DemodInit(receivedResponse
, receivedResponsePar
); 
2762         // Set up the demodulator for the reader -> tag commands 
2763         UartInit(receivedCmd
, receivedCmdPar
); 
2765         // Setup for the DMA. 
2766         FpgaSetupSscDma((uint8_t *)dmaBuf
, DMA_BUFFER_SIZE
); // set transfer address and number of bytes. Start transfer. 
2773         // And now we loop, receiving samples. 
2774         for(uint32_t sniffCounter 
= 0; TRUE
; ) { 
2776                 if(BUTTON_PRESS()) { 
2777                         DbpString("cancelled by button"); 
2784                 if ((sniffCounter 
& 0x0000FFFF) == 0) { // from time to time 
2785                         // check if a transaction is completed (timeout after 2000ms). 
2786                         // if yes, stop the DMA transfer and send what we have so far to the client 
2787                         if (MfSniffSend(2000)) {                         
2788                                 // Reset everything - we missed some sniffed data anyway while the DMA was stopped 
2792                                 ReaderIsActive 
= FALSE
; 
2793                                 TagIsActive 
= FALSE
; 
2794                                 FpgaSetupSscDma((uint8_t *)dmaBuf
, DMA_BUFFER_SIZE
); // set transfer address and number of bytes. Start transfer. 
2798                 int register readBufDataP 
= data 
- dmaBuf
;      // number of bytes we have processed so far 
2799                 int register dmaBufDataP 
= DMA_BUFFER_SIZE 
- AT91C_BASE_PDC_SSC
->PDC_RCR
; // number of bytes already transferred 
2800                 if (readBufDataP 
<= dmaBufDataP
){                       // we are processing the same block of data which is currently being transferred 
2801                         dataLen 
= dmaBufDataP 
- readBufDataP
;   // number of bytes still to be processed 
2803                         dataLen 
= DMA_BUFFER_SIZE 
- readBufDataP 
+ dmaBufDataP
; // number of bytes still to be processed 
2805                 // test for length of buffer 
2806                 if(dataLen 
> maxDataLen
) {                                      // we are more behind than ever... 
2807                         maxDataLen 
= dataLen
;                                    
2809                                 Dbprintf("blew circular buffer! dataLen=0x%x", dataLen
); 
2813                 if(dataLen 
< 1) continue; 
2815                 // primary buffer was stopped ( <-- we lost data! 
2816                 if (!AT91C_BASE_PDC_SSC
->PDC_RCR
) { 
2817                         AT91C_BASE_PDC_SSC
->PDC_RPR 
= (uint32_t) dmaBuf
; 
2818                         AT91C_BASE_PDC_SSC
->PDC_RCR 
= DMA_BUFFER_SIZE
; 
2819                         Dbprintf("RxEmpty ERROR!!! data length:%d", dataLen
); // temporary 
2821                 // secondary buffer sets as primary, secondary buffer was stopped 
2822                 if (!AT91C_BASE_PDC_SSC
->PDC_RNCR
) { 
2823                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
; 
2824                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= DMA_BUFFER_SIZE
; 
2829                 if (sniffCounter 
& 0x01) { 
2831                         if(!TagIsActive
) {              // no need to try decoding tag data if the reader is sending 
2832                                 uint8_t readerdata 
= (previous_data 
& 0xF0) | (*data 
>> 4); 
2833                                 if(MillerDecoding(readerdata
, (sniffCounter
-1)*4)) { 
2835                                         if (MfSniffLogic(receivedCmd
, Uart
.len
, Uart
.parity
, Uart
.bitCount
, TRUE
)) break; 
2837                                         /* And ready to receive another command. */ 
2840                                         /* And also reset the demod code */ 
2843                                 ReaderIsActive 
= (Uart
.state 
!= STATE_UNSYNCD
); 
2846                         if(!ReaderIsActive
) {           // no need to try decoding tag data if the reader is sending 
2847                                 uint8_t tagdata 
= (previous_data 
<< 4) | (*data 
& 0x0F); 
2848                                 if(ManchesterDecoding(tagdata
, 0, (sniffCounter
-1)*4)) { 
2851                                         if (MfSniffLogic(receivedResponse
, Demod
.len
, Demod
.parity
, Demod
.bitCount
, FALSE
)) break; 
2853                                         // And ready to receive another response. 
2856                                 TagIsActive 
= (Demod
.state 
!= DEMOD_UNSYNCD
); 
2860                 previous_data 
= *data
; 
2863                 if(data 
== dmaBuf 
+ DMA_BUFFER_SIZE
) { 
2869         DbpString("COMMAND FINISHED"); 
2871         FpgaDisableSscDma(); 
2874         Dbprintf("maxDataLen=%x, Uart.state=%x, Uart.len=%x", maxDataLen
, Uart
.state
, Uart
.len
);