1 //----------------------------------------------------------------------------- 
   2 // Jonathan Westhues, split Nov 2006 
   4 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   5 // at your option, any later version. See the LICENSE.txt file for the text of 
   7 //----------------------------------------------------------------------------- 
   8 // Routines to support ISO 14443B. This includes both the reader software and 
   9 // the `fake tag' modes. 
  10 //----------------------------------------------------------------------------- 
  11 #include "iso14443b.h" 
  13 #define RECEIVE_SAMPLES_TIMEOUT 50000 
  14 #define ISO14443B_DMA_BUFFER_SIZE 256 
  16 // Guard Time (per 14443-2) 
  18 // Synchronization time (per 14443-2) 
  20 // Frame Delay Time PICC to PCD  (per 14443-3 Amendment 1) 
  24 #define SEND4STUFFBIT(x) ToSendStuffBit(x);ToSendStuffBit(x);ToSendStuffBit(x);ToSendStuffBit(x); 
  25 //#define SEND4STUFFBIT(x) ToSendStuffBit(x); 
  27 static void switch_off(void); 
  29 // the block number for the ISO14443-4 PCB  (used with APDUs) 
  30 static uint8_t pcb_blocknum 
= 0; 
  32 static uint32_t iso14b_timeout 
= RECEIVE_SAMPLES_TIMEOUT
; 
  33 // param timeout is in ftw_  
  34 void iso14b_set_timeout(uint32_t timeout
) { 
  36         // clock is about 1.5 us 
  37         iso14b_timeout 
= timeout
; 
  38         if(MF_DBGLEVEL 
>= 2) Dbprintf("ISO14443B Timeout set to %ld fwt", iso14b_timeout
); 
  41 static void switch_off(void){    
  42         if (MF_DBGLEVEL 
> 3) Dbprintf("switch_off"); 
  43         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
  50 //============================================================================= 
  51 // An ISO 14443 Type B tag. We listen for commands from the reader, using 
  52 // a UART kind of thing that's implemented in software. When we get a 
  53 // frame (i.e., a group of bytes between SOF and EOF), we check the CRC. 
  54 // If it's good, then we can do something appropriate with it, and send 
  56 //============================================================================= 
  59 //----------------------------------------------------------------------------- 
  60 // The software UART that receives commands from the reader, and its state variables. 
  61 //----------------------------------------------------------------------------- 
  65                 STATE_GOT_FALLING_EDGE_OF_SOF
, 
  66                 STATE_AWAITING_START_BIT
, 
  77 static void UartReset() { 
  78         Uart
.state 
= STATE_UNSYNCD
; 
  82         Uart
.byteCntMax 
= MAX_FRAME_SIZE
; 
  86 static void UartInit(uint8_t *data
) { 
  89 //              memset(Uart.output, 0x00, MAX_FRAME_SIZE); 
  92 //----------------------------------------------------------------------------- 
  93 // The software Demod that receives commands from the tag, and its state variables. 
  94 //----------------------------------------------------------------------------- 
  98                 DEMOD_PHASE_REF_TRAINING
, 
  99                 DEMOD_AWAITING_FALLING_EDGE_OF_SOF
, 
 100                 DEMOD_GOT_FALLING_EDGE_OF_SOF
, 
 101                 DEMOD_AWAITING_START_BIT
, 
 107 /* this had been used to add RSSI (Received Signal Strength Indication) to traces. Currently not implemented. 
 116         uint32_t startTime
, endTime
; 
 119 // Clear out the state of the "UART" that receives from the tag. 
 120 static void DemodReset() { 
 121         Demod
.state 
= DEMOD_UNSYNCD
; 
 133 static void DemodInit(uint8_t *data
) { 
 136         //      memset(Demod.output, 0x00, MAX_FRAME_SIZE);  
 139 void AppendCrc14443b(uint8_t* data
, int len
) { 
 140         ComputeCrc14443(CRC_14443_B
, data
, len
, data
+len
, data
+len
+1); 
 143 //----------------------------------------------------------------------------- 
 144 // Code up a string of octets at layer 2 (including CRC, we don't generate 
 145 // that here) so that they can be transmitted to the reader. Doesn't transmit 
 146 // them yet, just leaves them ready to send in ToSend[]. 
 147 //----------------------------------------------------------------------------- 
 148 static void CodeIso14443bAsTag(const uint8_t *cmd
, int len
) { 
 151         * Reader to card | ASK  - Amplitude Shift Keying Modulation (PCD to PICC for Type B) (NRZ-L encodig) 
 152         * Card to reader | BPSK - Binary Phase Shift Keying Modulation, (PICC to PCD for Type B) 
 154         * fc - carrier frequency 13.56mHz 
 155         * TR0 - Guard Time per 14443-2 
 156         * TR1 - Synchronization Time per 14443-2 
 157         * TR2 - PICC to PCD Frame Delay Time (per 14443-3 Amendment 1) 
 159         * Elementary Time Unit (ETU) is 
 160         * - 128 Carrier Cycles (9.4395 µS) = 8 Subcarrier Units  
 162         * - 10 ETU = 1 startbit, 8 databits, 1 stopbit (10bits length) 
 166         * Start of frame (SOF) is 
 167         * - [10-11] ETU of ZEROS, unmodulated time 
 168         * - [2-3] ETU of ONES,   
 170         * End of frame (EOF) is 
 171         * - [10-11] ETU of ZEROS, unmodulated time 
 173         *  -TO VERIFY THIS BELOW- 
 174         * The mode FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_MODULATE_BPSK which we use to simulate tag 
 176         * - A 1-bit input to the FPGA becomes 8 pulses at 847.5kHz (9.44µS) 
 177         * - A 0-bit input to the FPGA becomes an unmodulated time of 9.44µS 
 181         * Card sends data ub 847.e kHz subcarrier 
 182         * 848k = 9.44µS  = 128 fc 
 183         * 424k = 18.88µS = 256 fc 
 184         * 212k = 37.76µS = 512 fc 
 185         * 106k = 75.52µS = 1024 fc 
 187         *  Reader data transmission: 
 188         *   - no modulation ONES 
 190         *   - Command, data and CRC_B 
 192         *   - no modulation ONES 
 194         *  Card data transmission 
 197         *   - data  (each bytes is:  1startbit,8bits, 1stopbit) 
 201         * FPGA implementation : 
 202         * At this point only Type A is implemented. This means that we are using a 
 203         * bit rate of 106 kbit/s, or fc/128. Oversample by 4, which ought to make 
 204         * things practical for the ARM (fc/32, 423.8 kbits/s, ~50 kbytes/s) 
 213         // Transmit a burst of ones, as the initial thing that lets the 
 214         // reader get phase sync.  
 215         // This loop is TR1, per specification 
 216         // TR1 minimum must be > 80/fs 
 217         // TR1 maximum 200/fs  
 218         // 80/fs < TR1 < 200/fs 
 219         // 10 ETU < TR1 < 24 ETU 
 222         // 10-11 ETU * 4times samples ZEROS 
 223         for(i 
= 0; i 
< 10; i
++) { SEND4STUFFBIT(0); } 
 224         //for(i = 0; i < 10; i++) { ToSendStuffBit(0); } 
 226         // 2-3 ETU * 4times samples ONES 
 227         for(i 
= 0; i 
< 3; i
++)  { SEND4STUFFBIT(1); } 
 228         //for(i = 0; i < 3; i++)  { ToSendStuffBit(1); } 
 231         for(i 
= 0; i 
< len
; ++i
) { 
 239                 for(j 
= 0; j 
< 8; ++j
) { 
 255                 // For PICC it ranges 0-18us (1etu = 9us) 
 261         // 10-11 ETU * 4 sample rate = ZEROS 
 262         for(i 
= 0; i 
< 10; i
++) { SEND4STUFFBIT(0); } 
 263         //for(i = 0; i < 10; i++) { ToSendStuffBit(0); } 
 266         for(i 
= 0; i 
< 40; i
++) { SEND4STUFFBIT(1); } 
 267         //for(i = 0; i < 40; i++) { ToSendStuffBit(1); } 
 269         // Convert from last byte pos to length 
 274 /* Receive & handle a bit coming from the reader. 
 276  * This function is called 4 times per bit (every 2 subcarrier cycles). 
 277  * Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 2,36us 
 280  * LED A -> ON once we have received the SOF and are expecting the rest. 
 281  * LED A -> OFF once we have received EOF or are in error state or unsynced 
 283  * Returns: true if we received a EOF 
 284  *          false if we are still waiting for some more 
 286 static RAMFUNC 
int Handle14443bReaderUartBit(uint8_t bit
) { 
 290                                 // we went low, so this could be the beginning of an SOF 
 291                                 Uart
.state 
= STATE_GOT_FALLING_EDGE_OF_SOF
; 
 297                 case STATE_GOT_FALLING_EDGE_OF_SOF
: 
 299                         if(Uart
.posCnt 
== 2) {  // sample every 4 1/fs in the middle of a bit 
 301                                         if(Uart
.bitCnt 
> 9) { 
 302                                                 // we've seen enough consecutive 
 303                                                 // zeros that it's a valid SOF 
 306                                                 Uart
.state 
= STATE_AWAITING_START_BIT
; 
 307                                                 LED_A_ON(); // Indicate we got a valid SOF 
 309                                                 // didn't stay down long enough 
 310                                                 // before going high, error 
 311                                                 Uart
.state 
= STATE_UNSYNCD
; 
 314                                         // do nothing, keep waiting 
 318                         if(Uart
.posCnt 
>= 4) Uart
.posCnt 
= 0; 
 319                         if(Uart
.bitCnt 
> 12) { 
 320                                 // Give up if we see too many zeros without 
 323                                 Uart
.state 
= STATE_UNSYNCD
; 
 327                 case STATE_AWAITING_START_BIT
: 
 330                                 if(Uart
.posCnt 
> 50/2) {        // max 57us between characters = 49 1/fs, max 3 etus after low phase of SOF = 24 1/fs 
 331                                         // stayed high for too long between 
 333                                         Uart
.state 
= STATE_UNSYNCD
; 
 336                                 // falling edge, this starts the data byte 
 340                                 Uart
.state 
= STATE_RECEIVING_DATA
; 
 344                 case STATE_RECEIVING_DATA
: 
 346                         if(Uart
.posCnt 
== 2) { 
 347                                 // time to sample a bit 
 350                                         Uart
.shiftReg 
|= 0x200; 
 354                         if(Uart
.posCnt 
>= 4) { 
 357                         if(Uart
.bitCnt 
== 10) { 
 358                                 if((Uart
.shiftReg 
& 0x200) && !(Uart
.shiftReg 
& 0x001)) 
 360                                         // this is a data byte, with correct 
 361                                         // start and stop bits 
 362                                         Uart
.output
[Uart
.byteCnt
] = (Uart
.shiftReg 
>> 1) & 0xff; 
 365                                         if(Uart
.byteCnt 
>= Uart
.byteCntMax
) { 
 366                                                 // Buffer overflowed, give up 
 368                                                 Uart
.state 
= STATE_UNSYNCD
; 
 370                                                 // so get the next byte now 
 372                                                 Uart
.state 
= STATE_AWAITING_START_BIT
; 
 374                                 } else if (Uart
.shiftReg 
== 0x000) { 
 375                                         // this is an EOF byte 
 376                                         LED_A_OFF(); // Finished receiving 
 377                                         Uart
.state 
= STATE_UNSYNCD
; 
 378                                         if (Uart
.byteCnt 
!= 0) { 
 384                                         Uart
.state 
= STATE_UNSYNCD
; 
 391                         Uart
.state 
= STATE_UNSYNCD
; 
 398 //----------------------------------------------------------------------------- 
 399 // Receive a command (from the reader to us, where we are the simulated tag), 
 400 // and store it in the given buffer, up to the given maximum length. Keeps 
 401 // spinning, waiting for a well-framed command, until either we get one 
 402 // (returns TRUE) or someone presses the pushbutton on the board (FALSE). 
 404 // Assume that we're called with the SSC (to the FPGA) and ADC path set 
 406 //----------------------------------------------------------------------------- 
 407 static int GetIso14443bCommandFromReader(uint8_t *received
, uint16_t *len
) { 
 408         // Set FPGA mode to "simulated ISO 14443B tag", no modulation (listen 
 409         // only, since we are receiving, not transmitting). 
 410         // Signal field is off with the appropriate LED 
 412         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_NO_MODULATION
); 
 418         // clear receiving shift register and holding register 
 419         // What does this loop do? Is it TR1? 
 420         for(uint8_t c 
= 0; c 
< 10;) { 
 421                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 422                         AT91C_BASE_SSC
->SSC_THR 
= 0xFF; 
 427         // Now run a `software UART' on the stream of incoming samples. 
 432         while( !BUTTON_PRESS() ) { 
 435                 if ( AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY 
) { 
 436                         b 
= (uint8_t) AT91C_BASE_SSC
->SSC_RHR
; 
 437                         for ( mask 
= 0x80; mask 
!= 0; mask 
>>= 1) { 
 438                                 if ( Handle14443bReaderUartBit(b 
& mask
)) { 
 448 void ClearFpgaShiftingRegisters(void){ 
 452         // clear receiving shift register and holding register 
 453         while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
 455         b 
= AT91C_BASE_SSC
->SSC_RHR
; (void) b
; 
 457         while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
 459         b 
= AT91C_BASE_SSC
->SSC_RHR
; (void) b
; 
 462         // wait for the FPGA to signal fdt_indicator == 1 (the FPGA is ready to queue new data in its delay line) 
 463         for (uint8_t j 
= 0; j 
< 5; j
++) {       // allow timeout - better late than never 
 464                 while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
 465                 if (AT91C_BASE_SSC
->SSC_RHR
) break; 
 469         //AT91C_BASE_SSC->SSC_THR = 0xFF; 
 472 void WaitForFpgaDelayQueueIsEmpty( uint16_t delay 
){ 
 473         // Ensure that the FPGA Delay Queue is empty before we switch to TAGSIM_LISTEN again: 
 474         uint8_t fpga_queued_bits 
= delay 
>> 3;  // twich /8 ??   >>3,  
 475         for (uint8_t i 
= 0; i 
<= fpga_queued_bits
/8 + 1; ) { 
 476                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 477                         AT91C_BASE_SSC
->SSC_THR 
= 0xFF; 
 483 static void TransmitFor14443b_AsTag( uint8_t *response
, uint16_t len
) { 
 485                 // Signal field is off with the appropriate LED 
 487                 //uint16_t fpgasendQueueDelay = 0; 
 490                 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_MODULATE_BPSK
); 
 492                 ClearFpgaShiftingRegisters(); 
 497                 // Transmit the response. 
 498                 for(uint16_t i 
= 0; i 
< len
;) { 
 499                         if(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_TXRDY
) { 
 500                                 AT91C_BASE_SSC
->SSC_THR 
= response
[++i
]; 
 502                         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 503                                 b 
= AT91C_BASE_SSC
->SSC_RHR
; 
 508                 //WaitForFpgaDelayQueueIsEmpty(fpgasendQueueDelay); 
 509                 AT91C_BASE_SSC
->SSC_THR 
= 0xFF;          
 511 //----------------------------------------------------------------------------- 
 512 // Main loop of simulated tag: receive commands from reader, decide what 
 513 // response to send, and send it. 
 514 //----------------------------------------------------------------------------- 
 515 void SimulateIso14443bTag(uint32_t pupi
) { 
 517         ///////////// setup device. 
 518         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 520         // allocate command receive buffer 
 522         BigBuf_Clear_ext(false); 
 526         // connect Demodulated Signal to ADC: 
 527         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 529         // Set up the synchronous serial port 
 533         uint16_t len
, cmdsReceived 
= 0; 
 534         int cardSTATE 
= SIM_NOFIELD
; 
 535         int vHf 
= 0;    // in mV 
 536         // uint32_t time_0 = 0; 
 537         // uint32_t t2r_time = 0; 
 538         // uint32_t r2t_time = 0; 
 539         uint8_t *receivedCmd 
= BigBuf_malloc(MAX_FRAME_SIZE
);    
 541         // the only commands we understand is WUPB, AFI=0, Select All, N=1: 
 542 //      static const uint8_t cmdWUPB[] = { ISO14443B_REQB, 0x00, 0x08, 0x39, 0x73 }; // WUPB 
 543         // ... and REQB, AFI=0, Normal Request, N=1: 
 544 //      static const uint8_t cmdREQB[] = { ISO14443B_REQB, 0x00, 0x00, 0x71, 0xFF }; // REQB 
 546 //      static const uint8_t cmdATTRIB[] = { ISO14443B_ATTRIB, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // ATTRIB 
 548         // ... if not PUPI/UID is supplied we always respond with ATQB, PUPI = 820de174, Application Data = 0x20381922, 
 549         // supports only 106kBit/s in both directions, max frame size = 32Bytes, 
 550         // supports ISO14443-4, FWI=8 (77ms), NAD supported, CID not supported: 
 551         uint8_t respATQB
[] = {  0x50, 0x82, 0x0d, 0xe1, 0x74, 0x20, 0x38, 0x19,  
 552                                                         0x22, 0x00, 0x21, 0x85, 0x5e, 0xd7 }; 
 554         // response to HLTB and ATTRIB 
 555         static const uint8_t respOK
[] = {0x00, 0x78, 0xF0}; 
 557         // ...PUPI/UID supplied from user. Adjust ATQB response accordingly 
 559                 uint8_t len 
= sizeof(respATQB
); 
 560                 num_to_bytes(pupi
, 4, respATQB
+1); 
 561                 ComputeCrc14443(CRC_14443_B
, respATQB
, 12, &respATQB
[len
-2], &respATQB
[len
-1]); 
 564         // prepare "ATQB" tag answer (encoded): 
 565         CodeIso14443bAsTag(respATQB
, sizeof(respATQB
)); 
 566         uint8_t *encodedATQB 
= BigBuf_malloc(ToSendMax
); 
 567         uint16_t encodedATQBLen 
= ToSendMax
; 
 568         memcpy(encodedATQB
, ToSend
, ToSendMax
);  
 571         // prepare "OK" tag answer (encoded): 
 572         CodeIso14443bAsTag(respOK
, sizeof(respOK
)); 
 573         uint8_t *encodedOK 
= BigBuf_malloc(ToSendMax
); 
 574         uint16_t encodedOKLen 
= ToSendMax
;       
 575         memcpy(encodedOK
, ToSend
, ToSendMax
);  
 578         while (!BUTTON_PRESS() && !usb_poll_validate_length()) { 
 582                 if (cardSTATE 
== SIM_NOFIELD
) { 
 583                         vHf 
= (MAX_ADC_HF_VOLTAGE 
* AvgAdc(ADC_CHAN_HF
)) >> 10; 
 584                         if ( vHf 
> MF_MINFIELDV 
) { 
 585                                 cardSTATE 
= SIM_IDLE
;  
 589                 if (cardSTATE 
== SIM_NOFIELD
) continue; 
 591                 // Get reader command 
 592                 if (!GetIso14443bCommandFromReader(receivedCmd
, &len
)) { 
 593                         Dbprintf("button pressed, received %d commands", cmdsReceived
); 
 597                 // ISO14443-B protocol states: 
 598                 // REQ or WUP request in ANY state  
 599                 // WUP in HALTED state 
 601                                 if ( (receivedCmd
[0] == ISO14443B_REQB 
&& (receivedCmd
[2] & 0x8)== 0x8 && cardSTATE 
== SIM_HALTED
) || 
 602                       receivedCmd
[0] == ISO14443B_REQB 
){ 
 603                                 LogTrace(receivedCmd
, len
, 0, 0, NULL
, TRUE
);                                              
 604                                 cardSTATE 
= SIM_SELECTING
; 
 609                 * How should this flow go? 
 611                 *   send response  ( waiting for Attrib) 
 613                 *   send response  ( waiting for commands 7816)  
 615                     send halt response ( waiting for wupb ) 
 622                                 LogTrace(receivedCmd
, len
, 0, 0, NULL
, TRUE
);    
 625                         case SIM_SELECTING
: { 
 626                                 TransmitFor14443b_AsTag( encodedATQB
, encodedATQBLen 
); 
 627                                 LogTrace(respATQB
, sizeof(respATQB
), 0, 0, NULL
, FALSE
); 
 628                                 cardSTATE 
= SIM_WORK
; 
 632                                 TransmitFor14443b_AsTag( encodedOK
, encodedOKLen 
); 
 633                                 LogTrace(respOK
, sizeof(respOK
), 0, 0, NULL
, FALSE
); 
 634                                 cardSTATE 
= SIM_HALTED
; 
 637                         case SIM_ACKNOWLEDGE
:{ 
 638                                 TransmitFor14443b_AsTag( encodedOK
, encodedOKLen 
); 
 639                                 LogTrace(respOK
, sizeof(respOK
), 0, 0, NULL
, FALSE
); 
 640                                 cardSTATE 
= SIM_IDLE
;                    
 644                                 if ( len 
== 7 && receivedCmd
[0] == ISO14443B_HALT 
) { 
 645                                         cardSTATE 
= SIM_HALTED
; 
 646                                 } else if ( len 
== 11 && receivedCmd
[0] == ISO14443B_ATTRIB 
) { 
 647                                         cardSTATE 
= SIM_ACKNOWLEDGE
; 
 652                                         // - emulate with a memory dump 
 653                                         Dbprintf("new cmd from reader: len=%d, cmdsRecvd=%d", len
, cmdsReceived
); 
 657                                         if (len 
>= 3){ // if crc exists 
 658                                                 ComputeCrc14443(CRC_14443_B
, receivedCmd
, len
-2, &b1
, &b2
); 
 659                                                 if(b1 
!= receivedCmd
[len
-2] || b2 
!= receivedCmd
[len
-1]) 
 660                                                         DbpString("+++CRC fail"); 
 662                                                         DbpString("CRC passes"); 
 664                                         cardSTATE 
= SIM_IDLE
;  
 672                 if(cmdsReceived 
> 1000) { 
 673                         DbpString("14B Simulate, 1000 commands later..."); 
 677         if (MF_DBGLEVEL 
>= 1) Dbprintf("Emulator stopped. Tracing: %d  trace length: %d ", tracing
, BigBuf_get_traceLen()); 
 678         switch_off(); //simulate 
 681 //============================================================================= 
 682 // An ISO 14443 Type B reader. We take layer two commands, code them 
 683 // appropriately, and then send them to the tag. We then listen for the 
 684 // tag's response, which we leave in the buffer to be demodulated on the 
 686 //============================================================================= 
 689  * Handles reception of a bit from the tag 
 691  * This function is called 2 times per bit (every 4 subcarrier cycles). 
 692  * Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 4,72us 
 695  * LED C -> ON once we have received the SOF and are expecting the rest. 
 696  * LED C -> OFF once we have received EOF or are unsynced 
 698  * Returns: true if we received a EOF 
 699  *          false if we are still waiting for some more 
 702 #ifndef SUBCARRIER_DETECT_THRESHOLD 
 703 # define SUBCARRIER_DETECT_THRESHOLD    8 
 706 static RAMFUNC 
int Handle14443bTagSamplesDemod(int ci
, int cq
) { 
 707         int v
=0;// , myI, myQ = 0; 
 708 // The soft decision on the bit uses an estimate of just the 
 709 // quadrant of the reference angle, not the exact angle. 
 710 #define MAKE_SOFT_DECISION() { \ 
 711                 if(Demod.sumI > 0) { \ 
 716                 if(Demod.sumQ > 0) { \ 
 723 // Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by abs(ci) + abs(cq) 
 724 // Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by max(abs(ci),abs(cq)) + 1/2*min(abs(ci),abs(cq))) 
 725 #define CHECK_FOR_SUBCARRIER() { \ 
 727                         if(cq < 0) { /* ci < 0, cq < 0 */ \ 
 729                                         v = -cq - (ci >> 1); \ 
 731                                         v = -ci - (cq >> 1); \ 
 733                         } else {        /* ci < 0, cq >= 0 */ \ 
 735                                         v = -ci + (cq >> 1); \ 
 737                                         v = cq - (ci >> 1); \ 
 741                         if(cq < 0) { /* ci >= 0, cq < 0 */ \ 
 743                                         v = ci - (cq >> 1); \ 
 745                                         v = -cq + (ci >> 1); \ 
 747                         } else {        /* ci >= 0, cq >= 0 */ \ 
 749                                         v = ci + (cq >> 1); \ 
 751                                         v = cq + (ci >> 1); \ 
 757 //note: couldn't we just use MAX(ABS(ci),ABS(cq)) + (MIN(ABS(ci),ABS(cq))/2) from common.h - marshmellow 
 758 #define CHECK_FOR_SUBCARRIER_un() { \ 
 761                 v = MAX(myI,myQ) + (MIN(myI,myQ) >> 1); \ 
 764         switch(Demod
.state
) { 
 767                         CHECK_FOR_SUBCARRIER(); 
 769                         // subcarrier detected 
 770                         if(v 
> SUBCARRIER_DETECT_THRESHOLD
) { 
 771                                 Demod
.state 
= DEMOD_PHASE_REF_TRAINING
; 
 778                 case DEMOD_PHASE_REF_TRAINING
: 
 779                         if(Demod
.posCount 
< 8) { 
 781                                 CHECK_FOR_SUBCARRIER(); 
 783                                 if (v 
> SUBCARRIER_DETECT_THRESHOLD
) { 
 784                                         // set the reference phase (will code a logic '1') by averaging over 32 1/fs. 
 785                                         // note: synchronization time > 80 1/fs 
 791                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 794                                 Demod
.state 
= DEMOD_AWAITING_FALLING_EDGE_OF_SOF
; 
 798                 case DEMOD_AWAITING_FALLING_EDGE_OF_SOF
: 
 800                         MAKE_SOFT_DECISION(); 
 802                         if(v 
< 0) {     // logic '0' detected 
 803                                 Demod
.state 
= DEMOD_GOT_FALLING_EDGE_OF_SOF
; 
 804                                 Demod
.posCount 
= 0;     // start of SOF sequence 
 806                                 // maximum length of TR1 = 200 1/fs 
 807                                 if(Demod
.posCount 
> 26*2) Demod
.state 
= DEMOD_UNSYNCD
; 
 812                 case DEMOD_GOT_FALLING_EDGE_OF_SOF
: 
 815                         MAKE_SOFT_DECISION(); 
 818                                 // low phase of SOF too short (< 9 etu). Note: spec is >= 10, but FPGA tends to "smear" edges 
 819                                 if(Demod
.posCount 
< 8*2) {  
 820                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 822                                         LED_C_ON(); // Got SOF 
 823                                         Demod
.startTime 
= GetCountSspClk(); 
 824                                         Demod
.state 
= DEMOD_AWAITING_START_BIT
; 
 829                                 // low phase of SOF too long (> 12 etu) 
 830                                 if (Demod
.posCount 
> 14*2) {  
 831                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 837                 case DEMOD_AWAITING_START_BIT
: 
 840                         MAKE_SOFT_DECISION(); 
 843                                 if(Demod
.posCount 
> 2*2) {              // max 19us between characters = 16 1/fs, max 3 etu after low phase of SOF = 24 1/fs 
 844                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 847                         } else {                                                        // start bit detected 
 849                                 Demod
.posCount 
= 1;                             // this was the first half 
 852                                 Demod
.state 
= DEMOD_RECEIVING_DATA
; 
 856                 case DEMOD_RECEIVING_DATA
: 
 858                         MAKE_SOFT_DECISION(); 
 860                         if (Demod
.posCount 
== 0) {  
 865                                 // second half of bit 
 867                                 Demod
.shiftReg 
>>= 1; 
 870                                 if(Demod
.thisBit 
> 0)  Demod
.shiftReg 
|= 0x200; 
 874                                 if(Demod
.bitCount 
== 10) { 
 876                                         uint16_t s 
= Demod
.shiftReg
; 
 878                                         // stop bit == '1', start bit == '0' 
 879                                         if((s 
& 0x200) && !(s 
& 0x001)) {  
 880                                                 uint8_t b 
= (s 
>> 1); 
 881                                                 Demod
.output
[Demod
.len
] = b
; 
 883                                                 Demod
.state 
= DEMOD_AWAITING_START_BIT
; 
 885                                                 Demod
.state 
= DEMOD_UNSYNCD
; 
 886                                                 Demod
.endTime 
= GetCountSspClk(); 
 889                                                 // This is EOF (start, stop and all data bits == '0' 
 890                                                 if(s 
== 0) return TRUE
; 
 898                         Demod
.state 
= DEMOD_UNSYNCD
; 
 907  *  Demodulate the samples we received from the tag, also log to tracebuffer 
 908  *  quiet: set to 'TRUE' to disable debug output 
 910 static void GetTagSamplesFor14443bDemod() { 
 911         bool gotFrame 
= FALSE
; 
 912         int lastRxCounter 
= ISO14443B_DMA_BUFFER_SIZE
; 
 913         int max 
= 0, ci 
= 0, cq 
= 0, samples 
= 0; 
 914         uint32_t time_0 
= 0, time_stop 
= 0; 
 918         // Set up the demodulator for tag -> reader responses. 
 919         DemodInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
 921         // The DMA buffer, used to stream samples from the FPGA 
 922         int8_t *dmaBuf 
= (int8_t*) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE
); 
 923         int8_t *upTo 
= dmaBuf
; 
 925         // Setup and start DMA. 
 926         if ( !FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO14443B_DMA_BUFFER_SIZE
) ){ 
 927                 if (MF_DBGLEVEL 
> 1) Dbprintf("FpgaSetupSscDma failed. Exiting");  
 931         time_0 
= GetCountSspClk(); 
 933         // And put the FPGA in the appropriate mode 
 934         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ
); 
 936         while( !BUTTON_PRESS() ) { 
 939                 int behindBy 
= lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
; 
 940                 if(behindBy 
> max
) max 
= behindBy
; 
 942                 // rx counter - dma counter? (how much?) & (mod) dma buff / 2.  (since 2bytes at the time is read) 
 943                 while(((lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
) & (ISO14443B_DMA_BUFFER_SIZE
-1)) > 2) { 
 950                         // restart DMA buffer to receive again. 
 951                         if(upTo 
>= dmaBuf 
+ ISO14443B_DMA_BUFFER_SIZE
) { 
 953                                 AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) upTo
; 
 954                                 AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO14443B_DMA_BUFFER_SIZE
; 
 958                         if(lastRxCounter 
<= 0) 
 959                                 lastRxCounter 
+= ISO14443B_DMA_BUFFER_SIZE
; 
 961                         // is this | 0x01 the error?   & 0xfe  in https://github.com/Proxmark/proxmark3/issues/103 
 962                         //gotFrame =  Handle14443bTagSamplesDemod(ci & 0xfe, cq & 0xfe); 
 963                         gotFrame 
=  Handle14443bTagSamplesDemod(ci
, cq
); 
 964                         if ( gotFrame 
) break; 
 968                 time_stop 
= GetCountSspClk() - time_0
; 
 970                 if(time_stop 
> iso14b_timeout 
|| gotFrame
)      break; 
 975         if (MF_DBGLEVEL 
>= 3) { 
 976                 Dbprintf("max behindby = %d, samples = %d, gotFrame = %s, Demod.state = %d, Demod.len = %u", 
 979                         (gotFrame
) ? "true" : "false",  
 985                 LogTrace(Demod
.output
, Demod
.len
, Demod
.startTime
, Demod
.endTime
, NULL
, FALSE
); 
 989 //----------------------------------------------------------------------------- 
 990 // Transmit the command (to the tag) that was placed in ToSend[]. 
 991 //----------------------------------------------------------------------------- 
 992 static void TransmitFor14443b_AsReader(void) { 
 994         // we could been in following mode: 
 995         // FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ 
 996         // if its second call or more 
 998         // while(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { 
 999                 // AT91C_BASE_SSC->SSC_THR = 0XFF; 
1002         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX 
| FPGA_HF_READER_TX_SHALLOW_MOD
); 
1006         volatile uint32_t b
; 
1008         // What does this loop do? Is it TR1? 
1009         // 0xFF = 8 bits of 1.    1 bit == 1Etu,..   
1010         // loop 10 * 8 = 80 ETU of delay, with a non modulated signal.  why? 
1012         for(c 
= 0; c 
< 50;) { 
1013                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
1014                         AT91C_BASE_SSC
->SSC_THR 
= 0xFF; 
1017                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
1018                         b 
= AT91C_BASE_SSC
->SSC_RHR
; 
1024         for(c 
= 0; c 
< ToSendMax
;) { 
1025                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
1026                         AT91C_BASE_SSC
->SSC_THR 
= ToSend
[c
++]; 
1028                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
1029                         b 
= AT91C_BASE_SSC
->SSC_RHR
; 
1033         //WaitForFpgaDelayQueueIsEmpty(delay); 
1034         // We should wait here for the FPGA to send all bits. 
1038 //----------------------------------------------------------------------------- 
1039 // Code a layer 2 command (string of octets, including CRC) into ToSend[], 
1040 // so that it is ready to transmit to the tag using TransmitFor14443b(). 
1041 //----------------------------------------------------------------------------- 
1042 static void CodeIso14443bAsReader(const uint8_t *cmd
, int len
) 
1045         *  Reader data transmission: 
1046         *   - no modulation ONES 
1048         *   - Command, data and CRC_B 
1050         *   - no modulation ONES 
1053         *   TR0 - 8 ETUS minimum. 
1055         *   QUESTION:  how long is a 1 or 0 in pulses in the xcorr_848 mode? 
1056         *              1 "stuffbit" = 1ETU (9us) 
1064         // 10-11 ETUs of ZERO  
1065         for(i 
= 0; i 
< 10; ++i
) ToSendStuffBit(0); 
1073         // from here we add BITS 
1074         for(i 
= 0; i 
< len
; ++i
) { 
1079                 if (  b 
& 1 )    ToSendStuffBit(1); else ToSendStuffBit(0); 
1080                 if ( (b
>>1) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); 
1081                 if ( (b
>>2) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); 
1082                 if ( (b
>>3) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); 
1083                 if ( (b
>>4) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); 
1084                 if ( (b
>>5) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); 
1085                 if ( (b
>>6) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); 
1086                 if ( (b
>>7) & 1) ToSendStuffBit(1); else ToSendStuffBit(0);              
1089                 // EGT extra guard time 
1090                 // For PCD it ranges 0-57us (1etu = 9us) 
1097         // 10-11 ETUs of ZERO 
1098         for(i 
= 0; i 
< 10; ++i
) ToSendStuffBit(0); 
1100         // Transition time. TR0 - guard time 
1102         // Per specification, Subcarrier must be stopped no later than 2 ETUs after EOF.         
1103         // I'm guessing this is for the FPGA to be able to send all bits before we switch to listening mode 
1104         for(i 
= 0; i 
< 32 ; ++i
) ToSendStuffBit(1); 
1106         // TR1 - Synchronization time 
1107         // Convert from last character reference to length 
1113   Convenience function to encode, transmit and trace iso 14443b comms 
1115 static void CodeAndTransmit14443bAsReader(const uint8_t *cmd
, int len
) { 
1117         CodeIso14443bAsReader(cmd
, len
); 
1119         uint32_t time_start 
= GetCountSspClk(); 
1121         TransmitFor14443b_AsReader(); 
1123         if(trigger
) LED_A_ON(); 
1125         LogTrace(cmd
, len
, time_start
, GetCountSspClk()-time_start
, NULL
, TRUE
); 
1128 /* Sends an APDU to the tag 
1129  * TODO: check CRC and preamble 
1131 uint8_t iso14443b_apdu(uint8_t const *message
, size_t message_length
, uint8_t *response
) 
1133         uint8_t crc
[2] = {0x00, 0x00}; 
1134         uint8_t message_frame
[message_length 
+ 4]; 
1136         message_frame
[0] = 0x0A | pcb_blocknum
; 
1139         message_frame
[1] = 0; 
1141         memcpy(message_frame 
+ 2, message
, message_length
); 
1143         ComputeCrc14443(CRC_14443_B
, message_frame
, message_length 
+ 2, &message_frame
[message_length 
+ 2], &message_frame
[message_length 
+ 3]); 
1145         CodeAndTransmit14443bAsReader(message_frame
, message_length 
+ 4); //no 
1147         GetTagSamplesFor14443bDemod(); //no 
1152     ComputeCrc14443(CRC_14443_B
, Demod
.output
, Demod
.len
-2, &crc
[0], &crc
[1]); 
1153         if ( crc
[0] != Demod
.output
[Demod
.len
-2] || crc
[1] != Demod
.output
[Demod
.len
-1] ) 
1156         // copy response contents 
1157         if(response 
!= NULL
) 
1158                 memcpy(response
, Demod
.output
, Demod
.len
); 
1166 uint8_t iso14443b_select_srx_card(iso14b_card_select_t 
*card 
) 
1168         // INITIATE command: wake up the tag using the INITIATE 
1169         static const uint8_t init_srx
[] = { ISO14443B_INITIATE
, 0x00, 0x97, 0x5b }; 
1170         // SELECT command (with space for CRC) 
1171         uint8_t select_srx
[] = { ISO14443B_SELECT
, 0x00, 0x00, 0x00}; 
1172         // temp to calc crc. 
1173         uint8_t crc
[2] = {0x00, 0x00}; 
1175         CodeAndTransmit14443bAsReader(init_srx
, sizeof(init_srx
)); 
1176         GetTagSamplesFor14443bDemod(); //no 
1178         if (Demod
.len 
== 0) return 2; 
1180         // Randomly generated Chip ID    
1181         if (card
) card
->chipid 
= Demod
.output
[0]; 
1183         select_srx
[1] = Demod
.output
[0]; 
1185         ComputeCrc14443(CRC_14443_B
, select_srx
, 2, &select_srx
[2], &select_srx
[3]); 
1186         CodeAndTransmit14443bAsReader(select_srx
, sizeof(select_srx
)); 
1187         GetTagSamplesFor14443bDemod(); //no 
1189         if (Demod
.len 
!= 3)     return 2; 
1191         // Check the CRC of the answer: 
1192         ComputeCrc14443(CRC_14443_B
, Demod
.output
, Demod
.len
-2 , &crc
[0], &crc
[1]); 
1193         if(crc
[0] != Demod
.output
[1] || crc
[1] != Demod
.output
[2]) return 3; 
1195         // Check response from the tag: should be the same UID as the command we just sent: 
1196         if (select_srx
[1] != Demod
.output
[0]) return 1; 
1198         // First get the tag's UID: 
1199         select_srx
[0] = ISO14443B_GET_UID
; 
1201         ComputeCrc14443(CRC_14443_B
, select_srx
, 1 , &select_srx
[1], &select_srx
[2]); 
1202         CodeAndTransmit14443bAsReader(select_srx
, 3); // Only first three bytes for this one 
1203         GetTagSamplesFor14443bDemod(); //no 
1205         if (Demod
.len 
!= 10) return 2; 
1207         // The check the CRC of the answer 
1208         ComputeCrc14443(CRC_14443_B
, Demod
.output
, Demod
.len
-2, &crc
[0], &crc
[1]); 
1209         if(crc
[0] != Demod
.output
[8] || crc
[1] != Demod
.output
[9]) return 3; 
1213                 memcpy(card
->uid
, Demod
.output
, 8); 
1218 /* Perform the ISO 14443 B Card Selection procedure 
1219  * Currently does NOT do any collision handling. 
1220  * It expects 0-1 cards in the device's range. 
1221  * TODO: Support multiple cards (perform anticollision) 
1222  * TODO: Verify CRC checksums 
1224 uint8_t iso14443b_select_card(iso14b_card_select_t 
*card 
) 
1226         // WUPB command (including CRC) 
1227         // Note: WUPB wakes up all tags, REQB doesn't wake up tags in HALT state 
1228         static const uint8_t wupb
[] = { ISO14443B_REQB
, 0x00, 0x08, 0x39, 0x73 }; 
1229         // ATTRIB command (with space for CRC) 
1230         uint8_t attrib
[] = { ISO14443B_ATTRIB
, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}; 
1232         // temp to calc crc. 
1233         uint8_t crc
[2] = {0x00, 0x00}; 
1235         // first, wake up the tag 
1236         CodeAndTransmit14443bAsReader(wupb
, sizeof(wupb
)); 
1237         GetTagSamplesFor14443bDemod(); //select_card 
1240         if (Demod
.len 
< 14) return 2; 
1243     ComputeCrc14443(CRC_14443_B
, Demod
.output
, Demod
.len
-2, &crc
[0], &crc
[1]); 
1244         if ( crc
[0] != Demod
.output
[12] || crc
[1] != Demod
.output
[13] ) 
1249                 memcpy(card
->uid
, Demod
.output
+1, 4); 
1250                 memcpy(card
->atqb
, Demod
.output
+5, 7); 
1253     // copy the PUPI to ATTRIB  ( PUPI == UID ) 
1254     memcpy(attrib 
+ 1, Demod
.output 
+ 1, 4); 
1256     // copy the protocol info from ATQB (Protocol Info -> Protocol_Type) into ATTRIB (Param 3) 
1257     attrib
[7] = Demod
.output
[10] & 0x0F; 
1258     ComputeCrc14443(CRC_14443_B
, attrib
, 9, attrib 
+ 9, attrib 
+ 10); 
1260     CodeAndTransmit14443bAsReader(attrib
, sizeof(attrib
)); 
1261     GetTagSamplesFor14443bDemod();//select_card 
1263     // Answer to ATTRIB too short? 
1264     if(Demod
.len 
< 3) return 2; 
1267     ComputeCrc14443(CRC_14443_B
, Demod
.output
, Demod
.len
-2, &crc
[0], &crc
[1]); 
1268         if ( crc
[0] != Demod
.output
[1] || crc
[1] != Demod
.output
[2] )  
1273                 card
->cid 
= Demod
.output
[0]; 
1274                 uint8_t fwt 
= card
->atqb
[6] >> 4; 
1276                         uint32_t fwt_time 
= (302 << fwt
); 
1277                         iso14b_set_timeout( fwt_time
); 
1280         // reset PCB block number 
1285 // Set up ISO 14443 Type B communication (similar to iso14443a_setup) 
1286 // field is setup for "Sending as Reader" 
1287 void iso14443b_setup() { 
1288         if (MF_DBGLEVEL 
> 3) Dbprintf("iso1443b_setup Enter"); 
1290         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1292         //BigBuf_Clear_ext(false); 
1294         // Initialize Demod and Uart structs 
1295         DemodInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
1296         UartInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
1298         // connect Demodulated Signal to ADC: 
1299         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1301         // Set up the synchronous serial port 
1304         // Signal field is on with the appropriate LED 
1305         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX 
| FPGA_HF_READER_TX_SHALLOW_MOD
); 
1312         if (MF_DBGLEVEL 
> 3) Dbprintf("iso1443b_setup Exit"); 
1315 //----------------------------------------------------------------------------- 
1316 // Read a SRI512 ISO 14443B tag. 
1318 // SRI512 tags are just simple memory tags, here we're looking at making a dump 
1319 // of the contents of the memory. No anticollision algorithm is done, we assume 
1320 // we have a single tag in the field. 
1322 // I tried to be systematic and check every answer of the tag, every CRC, etc... 
1323 //----------------------------------------------------------------------------- 
1324 void ReadSTMemoryIso14443b(uint8_t numofblocks
) 
1326         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1328         // Make sure that we start from off, since the tags are stateful; 
1329         // confusing things will happen if we don't reset them between reads. 
1330         switch_off();  // before ReadStMemory 
1336         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1339         // Now give it time to spin up. 
1340         // Signal field is on with the appropriate LED 
1342         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ
); 
1345         // First command: wake up the tag using the INITIATE command 
1346         uint8_t cmd1
[] = {ISO14443B_INITIATE
, 0x00, 0x97, 0x5b}; 
1347         CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); //no 
1348         GetTagSamplesFor14443bDemod(); // no 
1350         if (Demod
.len 
== 0) { 
1351                 DbpString("No response from tag"); 
1355                 Dbprintf("Randomly generated Chip ID (+ 2 byte CRC): %02x %02x %02x", 
1356                                 Demod
.output
[0], Demod
.output
[1], Demod
.output
[2]); 
1359         // There is a response, SELECT the uid 
1360         DbpString("Now SELECT tag:"); 
1361         cmd1
[0] = ISO14443B_SELECT
; // 0x0E is SELECT 
1362         cmd1
[1] = Demod
.output
[0]; 
1363         ComputeCrc14443(CRC_14443_B
, cmd1
, 2, &cmd1
[2], &cmd1
[3]); 
1364         CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); //no 
1365         GetTagSamplesFor14443bDemod(); //no 
1366         if (Demod
.len 
!= 3) { 
1367                 Dbprintf("Expected 3 bytes from tag, got %d", Demod
.len
); 
1371         // Check the CRC of the answer: 
1372         ComputeCrc14443(CRC_14443_B
, Demod
.output
, 1 , &cmd1
[2], &cmd1
[3]); 
1373         if(cmd1
[2] != Demod
.output
[1] || cmd1
[3] != Demod
.output
[2]) { 
1374                 DbpString("CRC Error reading select response."); 
1378         // Check response from the tag: should be the same UID as the command we just sent: 
1379         if (cmd1
[1] != Demod
.output
[0]) { 
1380                 Dbprintf("Bad response to SELECT from Tag, aborting: %02x %02x", cmd1
[1], Demod
.output
[0]); 
1385         // Tag is now selected, 
1386         // First get the tag's UID: 
1387         cmd1
[0] = ISO14443B_GET_UID
; 
1388         ComputeCrc14443(CRC_14443_B
, cmd1
, 1 , &cmd1
[1], &cmd1
[2]); 
1389         CodeAndTransmit14443bAsReader(cmd1
, 3); // no --  Only first three bytes for this one 
1390         GetTagSamplesFor14443bDemod(); //no 
1391         if (Demod
.len 
!= 10) { 
1392                 Dbprintf("Expected 10 bytes from tag, got %d", Demod
.len
); 
1396         // The check the CRC of the answer (use cmd1 as temporary variable): 
1397         ComputeCrc14443(CRC_14443_B
, Demod
.output
, 8, &cmd1
[2], &cmd1
[3]); 
1398         if(cmd1
[2] != Demod
.output
[8] || cmd1
[3] != Demod
.output
[9]) { 
1399                 Dbprintf("CRC Error reading block! Expected: %04x got: %04x", 
1400                                 (cmd1
[2]<<8)+cmd1
[3], (Demod
.output
[8]<<8)+Demod
.output
[9]); 
1401         // Do not return;, let's go on... (we should retry, maybe ?) 
1403         Dbprintf("Tag UID (64 bits): %08x %08x", 
1404                         (Demod
.output
[7]<<24) + (Demod
.output
[6]<<16) + (Demod
.output
[5]<<8) + Demod
.output
[4], 
1405                         (Demod
.output
[3]<<24) + (Demod
.output
[2]<<16) + (Demod
.output
[1]<<8) + Demod
.output
[0]); 
1407         // Now loop to read all 16 blocks, address from 0 to last block 
1408         Dbprintf("Tag memory dump, block 0 to %d", numofblocks
); 
1414                 if (i 
== numofblocks
) { 
1415                         DbpString("System area block (0xff):"); 
1419                 ComputeCrc14443(CRC_14443_B
, cmd1
, 2, &cmd1
[2], &cmd1
[3]); 
1420                 CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); //no 
1421                 GetTagSamplesFor14443bDemod(); //no 
1423                 if (Demod
.len 
!= 6) { // Check if we got an answer from the tag 
1424                         DbpString("Expected 6 bytes from tag, got less..."); 
1427                 // The check the CRC of the answer (use cmd1 as temporary variable): 
1428                 ComputeCrc14443(CRC_14443_B
, Demod
.output
, 4, &cmd1
[2], &cmd1
[3]); 
1429                         if(cmd1
[2] != Demod
.output
[4] || cmd1
[3] != Demod
.output
[5]) { 
1430                         Dbprintf("CRC Error reading block! Expected: %04x got: %04x", 
1431                                         (cmd1
[2]<<8)+cmd1
[3], (Demod
.output
[4]<<8)+Demod
.output
[5]); 
1432                 // Do not return;, let's go on... (we should retry, maybe ?) 
1434                 // Now print out the memory location: 
1435                 Dbprintf("Address=%02x, Contents=%08x, CRC=%04x", i
, 
1436                                 (Demod
.output
[3]<<24) + (Demod
.output
[2]<<16) + (Demod
.output
[1]<<8) + Demod
.output
[0], 
1437                                 (Demod
.output
[4]<<8)+Demod
.output
[5]); 
1439                 if (i 
== 0xff) break; 
1447 static void iso1444b_setup_snoop(void){ 
1448         if (MF_DBGLEVEL 
> 3) Dbprintf("iso1443b_setup_snoop Enter"); 
1450         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1452         BigBuf_Clear_ext(false);  
1453         clear_trace();//setup snoop 
1456         // Initialize Demod and Uart structs 
1457         DemodInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
1458         UartInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
1460         if (MF_DBGLEVEL 
> 1) { 
1461                 // Print debug information about the buffer sizes 
1462                 Dbprintf("Snooping buffers initialized:"); 
1463                 Dbprintf("  Trace: %i bytes", BigBuf_max_traceLen()); 
1464                 Dbprintf("  Reader -> tag: %i bytes", MAX_FRAME_SIZE
); 
1465                 Dbprintf("  tag -> Reader: %i bytes", MAX_FRAME_SIZE
); 
1466                 Dbprintf("  DMA: %i bytes", ISO14443B_DMA_BUFFER_SIZE
); 
1469         // connect Demodulated Signal to ADC: 
1470         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1472         // Setup for the DMA. 
1475         // Set FPGA in the appropriate mode 
1476         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| FPGA_HF_READER_RX_XCORR_SNOOP
); 
1479         // Start the SSP timer 
1481         if (MF_DBGLEVEL 
> 3) Dbprintf("iso1443b_setup_snoop Exit"); 
1484 //============================================================================= 
1485 // Finally, the `sniffer' combines elements from both the reader and 
1486 // simulated tag, to show both sides of the conversation. 
1487 //============================================================================= 
1489 //----------------------------------------------------------------------------- 
1490 // Record the sequence of commands sent by the reader to the tag, with 
1491 // triggering so that we start recording at the point that the tag is moved 
1493 //----------------------------------------------------------------------------- 
1495  * Memory usage for this function, (within BigBuf) 
1496  * Last Received command (reader->tag) - MAX_FRAME_SIZE 
1497  * Last Received command (tag->reader) - MAX_FRAME_SIZE 
1498  * DMA Buffer - ISO14443B_DMA_BUFFER_SIZE 
1499  * Demodulated samples received - all the rest 
1501 void RAMFUNC 
SnoopIso14443b(void) { 
1503         uint32_t time_0 
= 0, time_start 
= 0, time_stop 
= 0; 
1505         // We won't start recording the frames that we acquire until we trigger; 
1506         // a good trigger condition to get started is probably when we see a 
1507         // response from the tag. 
1508         int triggered 
= TRUE
;                   // TODO: set and evaluate trigger condition      
1510         int maxBehindBy 
= 0; 
1512         int lastRxCounter 
= ISO14443B_DMA_BUFFER_SIZE
; 
1514         bool TagIsActive 
= FALSE
; 
1515         bool ReaderIsActive 
= FALSE
; 
1517         iso1444b_setup_snoop(); 
1519         // The DMA buffer, used to stream samples from the FPGA 
1520         int8_t *dmaBuf 
= (int8_t*) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE
); 
1521         int8_t *upTo 
= dmaBuf
; 
1523         // Setup and start DMA. 
1524         if ( !FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO14443B_DMA_BUFFER_SIZE
) ){ 
1525                 if (MF_DBGLEVEL 
> 1) Dbprintf("FpgaSetupSscDma failed. Exiting");  
1530         time_0 
= GetCountSspClk(); 
1532         // And now we loop, receiving samples. 
1537                 int behindBy 
= (lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
) & (ISO14443B_DMA_BUFFER_SIZE
-1); 
1539                 if ( behindBy 
> maxBehindBy 
) 
1540                         maxBehindBy 
= behindBy
; 
1542                 if ( behindBy 
< 2 ) continue; 
1550                 if (upTo 
>= dmaBuf 
+ ISO14443B_DMA_BUFFER_SIZE
) { 
1552                         lastRxCounter 
+= ISO14443B_DMA_BUFFER_SIZE
; 
1553                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
; 
1554                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO14443B_DMA_BUFFER_SIZE
; 
1557                         // TODO: understand whether we can increase/decrease as we want or not? 
1558                         if ( behindBy 
> ( 9 * ISO14443B_DMA_BUFFER_SIZE
/10) ) {  
1559                                 Dbprintf("blew circular buffer! behindBy=%d", behindBy
); 
1564                                 DbpString("Trace full"); 
1568                         if(BUTTON_PRESS()) { 
1569                                 DbpString("cancelled"); 
1578                         // no need to try decoding reader data if the tag is sending 
1579                         if (Handle14443bReaderUartBit(ci 
& 0x01)) { 
1581                                 time_stop 
= (GetCountSspClk()-time_0
); 
1584                                         LogTrace(Uart
.output
, Uart
.byteCnt
, time_start
, time_stop
, NULL
, TRUE
); 
1586                                 /* And ready to receive another command. */ 
1588                                 /* And also reset the demod code, which might have been */ 
1589                                 /* false-triggered by the commands from the reader. */ 
1592                                 time_start 
= (GetCountSspClk()-time_0
); 
1595                         if (Handle14443bReaderUartBit(cq 
& 0x01)) { 
1597                                 time_stop 
= (GetCountSspClk()-time_0
); 
1600                                         LogTrace(Uart
.output
, Uart
.byteCnt
, time_start
, time_stop
, NULL
, TRUE
); 
1602                                         /* And ready to receive another command. */ 
1604                                         /* And also reset the demod code, which might have been */ 
1605                                         /* false-triggered by the commands from the reader. */ 
1608                                 time_start 
= (GetCountSspClk()-time_0
); 
1610                         ReaderIsActive 
= (Uart
.state 
> STATE_GOT_FALLING_EDGE_OF_SOF
); 
1614                 if(!ReaderIsActive
) { 
1615                         // no need to try decoding tag data if the reader is sending - and we cannot afford the time 
1616                         // is this | 0x01 the error?   & 0xfe  in https://github.com/Proxmark/proxmark3/issues/103 
1617                         if(Handle14443bTagSamplesDemod(ci 
& 0xFE, cq 
& 0xFE)) { 
1619                                 time_stop 
= (GetCountSspClk()-time_0
); 
1621                                 LogTrace(Demod
.output
, Demod
.len
, time_start
, time_stop
, NULL
, FALSE
); 
1625                                 // And ready to receive another response. 
1628                                 time_start 
= (GetCountSspClk()-time_0
); 
1630                         TagIsActive 
= (Demod
.state 
> DEMOD_GOT_FALLING_EDGE_OF_SOF
); 
1634         switch_off(); // Snoop 
1636         DbpString("Snoop statistics:"); 
1637         Dbprintf("  Max behind by: %i", maxBehindBy
); 
1638         Dbprintf("  Uart State: %x  ByteCount: %i  ByteCountMax: %i", Uart
.state
,  Uart
.byteCnt
,  Uart
.byteCntMax
); 
1639         Dbprintf("  Trace length: %i", BigBuf_get_traceLen()); 
1642         if ( upTo 
)   upTo 
= NULL
; 
1644         // Uart.byteCntMax  should be set with ATQB value.. 
1647 void iso14b_set_trigger(bool enable
) { 
1652  * Send raw command to tag ISO14443B 
1654  * param   flags enum ISO14B_COMMAND.  (mifare.h) 
1655  * len     len of buffer data 
1656  * data    buffer with bytes to send 
1662 void SendRawCommand14443B_Ex(UsbCommand 
*c
) 
1664         iso14b_command_t param 
= c
->arg
[0]; 
1665         size_t len 
= c
->arg
[1] & 0xffff; 
1666         uint8_t *cmd 
= c
->d
.asBytes
; 
1668         uint32_t sendlen 
= sizeof(iso14b_card_select_t
); 
1669         uint8_t buf
[USB_CMD_DATA_SIZE
] = {0x00}; 
1671         if (MF_DBGLEVEL 
> 3) Dbprintf("14b raw: param, %04x", param 
); 
1673         // turn on trigger (LED_A) 
1674         if ((param 
& ISO14B_REQUEST_TRIGGER
) == ISO14B_REQUEST_TRIGGER
) 
1675                 iso14b_set_trigger(TRUE
); 
1677         if ((param 
& ISO14B_CONNECT
) == ISO14B_CONNECT
) { 
1678                 // Make sure that we start from off, since the tags are stateful; 
1679                 // confusing things will happen if we don't reset them between reads. 
1680                 //switch_off();  // before connect in raw 
1686         if ((param 
& ISO14B_SELECT_STD
) == ISO14B_SELECT_STD
) { 
1687                 iso14b_card_select_t 
*card 
= (iso14b_card_select_t
*)buf
; 
1688                 status 
= iso14443b_select_card(card
);    
1689                 cmd_send(CMD_ACK
, status
, sendlen
, 0, buf
, sendlen
); 
1690                 // 0: OK 2: attrib fail, 3:crc fail, 
1691                 if ( status 
> 0 ) return; 
1694         if ((param 
& ISO14B_SELECT_SR
) == ISO14B_SELECT_SR
) { 
1695                 iso14b_card_select_t 
*card 
= (iso14b_card_select_t
*)buf
; 
1696                 status 
= iso14443b_select_srx_card(card
); 
1697                 cmd_send(CMD_ACK
, status
, sendlen
, 0, buf
, sendlen
); 
1698                 // 0: OK 2: attrib fail, 3:crc fail, 
1699                 if ( status 
> 0 ) return; 
1702         if ((param 
& ISO14B_APDU
) == ISO14B_APDU
) { 
1703                 status 
= iso14443b_apdu(cmd
, len
, buf
); 
1704                 cmd_send(CMD_ACK
, status
, status
, 0, buf
, status
); 
1707         if ((param 
& ISO14B_RAW
) == ISO14B_RAW
) { 
1708                 if((param 
& ISO14B_APPEND_CRC
) == ISO14B_APPEND_CRC
) { 
1709                         AppendCrc14443b(cmd
, len
); 
1713                 CodeAndTransmit14443bAsReader(cmd
, len
); // raw          
1714                 GetTagSamplesFor14443bDemod(); // raw 
1716                 sendlen 
= MIN(Demod
.len
, USB_CMD_DATA_SIZE
); 
1717                 status 
=  (Demod
.len 
> 0) ? 0 : 1; 
1718                 cmd_send(CMD_ACK
, status
, sendlen
, 0, Demod
.output
, sendlen
); 
1721         // turn off trigger (LED_A) 
1722         if ((param 
& ISO14B_REQUEST_TRIGGER
) == ISO14B_REQUEST_TRIGGER
) 
1723                 iso14b_set_trigger(FALSE
); 
1725         // turn off antenna et al 
1726         // we don't send a HALT command. 
1727         if ((param 
& ISO14B_DISCONNECT
) == ISO14B_DISCONNECT
) { 
1728                 if (MF_DBGLEVEL 
> 3) Dbprintf("disconnect"); 
1729                 switch_off(); // disconnect raw 
1731                 //FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX | FPGA_HF_READER_TX_SHALLOW_MOD);