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 14443. This includes both the reader software and 
   9 // the `fake tag' modes. At the moment only the Type B modulation is 
  11 //----------------------------------------------------------------------------- 
  13 #include "proxmark3.h" 
  18 #include "iso14443crc.h" 
  20 //static void GetSamplesFor14443(int weTx, int n); 
  22 /*#define DEMOD_TRACE_SIZE 4096 
  23 #define READER_TAG_BUFFER_SIZE 2048 
  24 #define TAG_READER_BUFFER_SIZE 2048 
  25 #define DEMOD_DMA_BUFFER_SIZE 1024 
  27 //============================================================================= 
  28 // An ISO 14443 Type B tag. We listen for commands from the reader, using 
  29 // a UART kind of thing that's implemented in software. When we get a 
  30 // frame (i.e., a group of bytes between SOF and EOF), we check the CRC. 
  31 // If it's good, then we can do something appropriate with it, and send 
  33 //============================================================================= 
  35 //----------------------------------------------------------------------------- 
  36 // Code up a string of octets at layer 2 (including CRC, we don't generate 
  37 // that here) so that they can be transmitted to the reader. Doesn't transmit 
  38 // them yet, just leaves them ready to send in ToSend[]. 
  39 //----------------------------------------------------------------------------- 
  40 static void CodeIso14443bAsTag(const uint8_t *cmd
, int len
) 
  46     // Transmit a burst of ones, as the initial thing that lets the 
  47     // reader get phase sync. This (TR1) must be > 80/fs, per spec, 
  48     // but tag that I've tried (a Paypass) exceeds that by a fair bit, 
  50     for(i 
= 0; i 
< 20; i
++) { 
  58     for(i 
= 0; i 
< 10; i
++) { 
  64     for(i 
= 0; i 
< 2; i
++) { 
  71     for(i 
= 0; i 
< len
; i
++) { 
  82         for(j 
= 0; j 
< 8; j
++) { 
 105     for(i 
= 0; i 
< 10; i
++) { 
 111     for(i 
= 0; i 
< 10; i
++) { 
 118     // Convert from last byte pos to length 
 121     // Add a few more for slop 
 125 //----------------------------------------------------------------------------- 
 126 // The software UART that receives commands from the reader, and its state 
 128 //----------------------------------------------------------------------------- 
 132         STATE_GOT_FALLING_EDGE_OF_SOF
, 
 133         STATE_AWAITING_START_BIT
, 
 134         STATE_RECEIVING_DATA
, 
 145 /* Receive & handle a bit coming from the reader. 
 148  * LED A -> ON once we have received the SOF and are expecting the rest. 
 149  * LED A -> OFF once we have received EOF or are in error state or unsynced 
 151  * Returns: true if we received a EOF 
 152  *          false if we are still waiting for some more 
 154 static int Handle14443UartBit(int bit
) 
 160                 // we went low, so this could be the beginning 
 162                 Uart
.state 
= STATE_GOT_FALLING_EDGE_OF_SOF
; 
 168         case STATE_GOT_FALLING_EDGE_OF_SOF
: 
 170             if(Uart
.posCnt 
== 2) { 
 172                     if(Uart
.bitCnt 
>= 10) { 
 173                         // we've seen enough consecutive 
 174                         // zeros that it's a valid SOF 
 177                         Uart
.state 
= STATE_AWAITING_START_BIT
; 
 178                         LED_A_ON(); // Indicate we got a valid SOF 
 180                         // didn't stay down long enough 
 181                         // before going high, error 
 182                         Uart
.state 
= STATE_ERROR_WAIT
; 
 185                     // do nothing, keep waiting 
 189             if(Uart
.posCnt 
>= 4) Uart
.posCnt 
= 0; 
 190             if(Uart
.bitCnt 
> 14) { 
 191                 // Give up if we see too many zeros without 
 193                 Uart
.state 
= STATE_ERROR_WAIT
; 
 197         case STATE_AWAITING_START_BIT
: 
 200                 if(Uart
.posCnt 
> 25) { 
 201                     // stayed high for too long between 
 203                     Uart
.state 
= STATE_ERROR_WAIT
; 
 206                 // falling edge, this starts the data byte 
 210                 Uart
.state 
= STATE_RECEIVING_DATA
; 
 211                 LED_A_ON(); // Indicate we're receiving 
 215         case STATE_RECEIVING_DATA
: 
 217             if(Uart
.posCnt 
== 2) { 
 218                 // time to sample a bit 
 221                     Uart
.shiftReg 
|= 0x200; 
 225             if(Uart
.posCnt 
>= 4) { 
 228             if(Uart
.bitCnt 
== 10) { 
 229                 if((Uart
.shiftReg 
& 0x200) && !(Uart
.shiftReg 
& 0x001)) 
 231                     // this is a data byte, with correct 
 232                     // start and stop bits 
 233                     Uart
.output
[Uart
.byteCnt
] = (Uart
.shiftReg 
>> 1) & 0xff; 
 236                     if(Uart
.byteCnt 
>= Uart
.byteCntMax
) { 
 237                         // Buffer overflowed, give up 
 239                         Uart
.state 
= STATE_ERROR_WAIT
; 
 241                         // so get the next byte now 
 243                         Uart
.state 
= STATE_AWAITING_START_BIT
; 
 245                 } else if(Uart
.shiftReg 
== 0x000) { 
 246                     // this is an EOF byte 
 247                         LED_A_OFF(); // Finished receiving 
 252                     Uart
.state 
= STATE_ERROR_WAIT
; 
 257         case STATE_ERROR_WAIT
: 
 258             // We're all screwed up, so wait a little while 
 259             // for whatever went wrong to finish, and then 
 262             if(Uart
.posCnt 
> 10) { 
 263                 Uart
.state 
= STATE_UNSYNCD
; 
 268             Uart
.state 
= STATE_UNSYNCD
; 
 272     // This row make the error blew circular buffer in hf 14b snoop 
 273     //if (Uart.state == STATE_ERROR_WAIT) LED_A_OFF(); // Error 
 278 //----------------------------------------------------------------------------- 
 279 // Receive a command (from the reader to us, where we are the simulated tag), 
 280 // and store it in the given buffer, up to the given maximum length. Keeps 
 281 // spinning, waiting for a well-framed command, until either we get one 
 282 // (returns TRUE) or someone presses the pushbutton on the board (FALSE). 
 284 // Assume that we're called with the SSC (to the FPGA) and ADC path set 
 286 //----------------------------------------------------------------------------- 
 287 static int GetIso14443CommandFromReader(uint8_t *received
, int *len
, int maxLen
) 
 292     // Set FPGA mode to "simulated ISO 14443 tag", no modulation (listen 
 293     // only, since we are receiving, not transmitting). 
 294     // Signal field is off with the appropriate LED 
 296     FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_NO_MODULATION
); 
 299     // Now run a `software UART' on the stream of incoming samples. 
 300     Uart
.output 
= received
; 
 301     Uart
.byteCntMax 
= maxLen
; 
 302     Uart
.state 
= STATE_UNSYNCD
; 
 307         if(BUTTON_PRESS()) return FALSE
; 
 309         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 310             AT91C_BASE_SSC
->SSC_THR 
= 0x00; 
 312         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 313             uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 316             for(i 
= 0; i 
< 8; i
++, mask 
>>= 1) { 
 318                 if(Handle14443UartBit(bit
)) { 
 327 //----------------------------------------------------------------------------- 
 328 // Main loop of simulated tag: receive commands from reader, decide what 
 329 // response to send, and send it. 
 330 //----------------------------------------------------------------------------- 
 331 void SimulateIso14443Tag(void) 
 333     static const uint8_t cmd1
[] = { 0x05, 0x00, 0x08, 0x39, 0x73 }; 
 334     static const uint8_t response1
[] = { 
 335         0x50, 0x82, 0x0d, 0xe1, 0x74, 0x20, 0x38, 0x19, 0x22, 
 336         0x00, 0x21, 0x85, 0x5e, 0xd7 
 342     uint8_t *resp1 
= (((uint8_t *)BigBuf
) + 800); 
 345     uint8_t *receivedCmd 
= (uint8_t *)BigBuf
; 
 352     FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 353     memset(receivedCmd
, 0x44, 400); 
 355     CodeIso14443bAsTag(response1
, sizeof(response1
)); 
 356     memcpy(resp1
, ToSend
, ToSendMax
); resp1Len 
= ToSendMax
; 
 358     // We need to listen to the high-frequency, peak-detected path. 
 359     SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 367         if(!GetIso14443CommandFromReader(receivedCmd
, &len
, 100)) { 
 368                 Dbprintf("button pressed, received %d commands", cmdsRecvd
); 
 372         // Good, look at the command now. 
 374         if(len 
== sizeof(cmd1
) && memcmp(receivedCmd
, cmd1
, len
)==0) { 
 375             resp 
= resp1
; respLen 
= resp1Len
; 
 377             Dbprintf("new cmd from reader: len=%d, cmdsRecvd=%d", len
, cmdsRecvd
); 
 378             // And print whether the CRC fails, just for good measure 
 379             ComputeCrc14443(CRC_14443_B
, receivedCmd
, len
-2, &b1
, &b2
); 
 380             if(b1 
!= receivedCmd
[len
-2] || b2 
!= receivedCmd
[len
-1]) { 
 381                 // Not so good, try again. 
 382                 DbpString("+++CRC fail"); 
 384                 DbpString("CRC passes"); 
 389         memset(receivedCmd
, 0x44, 32); 
 393         if(cmdsRecvd 
> 0x30) { 
 394             DbpString("many commands later..."); 
 398         if(respLen 
<= 0) continue; 
 401         // Signal field is off with the appropriate LED 
 403         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_MODULATE_BPSK
); 
 404         AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 407         // Transmit the response. 
 410             if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 413                 AT91C_BASE_SSC
->SSC_THR 
= b
; 
 420             if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 421                 volatile uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 428 //============================================================================= 
 429 // An ISO 14443 Type B reader. We take layer two commands, code them 
 430 // appropriately, and then send them to the tag. We then listen for the 
 431 // tag's response, which we leave in the buffer to be demodulated on the 
 433 //============================================================================= 
 438         DEMOD_PHASE_REF_TRAINING
, 
 439         DEMOD_AWAITING_FALLING_EDGE_OF_SOF
, 
 440         DEMOD_GOT_FALLING_EDGE_OF_SOF
, 
 441         DEMOD_AWAITING_START_BIT
, 
 442         DEMOD_RECEIVING_DATA
, 
 458  * Handles reception of a bit from the tag 
 461  * LED C -> ON once we have received the SOF and are expecting the rest. 
 462  * LED C -> OFF once we have received EOF or are unsynced 
 464  * Returns: true if we received a EOF 
 465  *          false if we are still waiting for some more 
 468 static RAMFUNC 
int Handle14443SamplesDemod(int ci
, int cq
) 
 472     // The soft decision on the bit uses an estimate of just the 
 473     // quadrant of the reference angle, not the exact angle. 
 474 #define MAKE_SOFT_DECISION() { \ 
 475         if(Demod.sumI > 0) { \ 
 480         if(Demod.sumQ > 0) { \ 
 487     switch(Demod
.state
) { 
 498                 Demod
.state 
= DEMOD_PHASE_REF_TRAINING
; 
 504         case DEMOD_PHASE_REF_TRAINING
: 
 505             if(Demod
.posCount 
< 8) { 
 508             } else if(Demod
.posCount 
> 100) { 
 509                 // error, waited too long 
 510                 Demod
.state 
= DEMOD_UNSYNCD
; 
 512                 MAKE_SOFT_DECISION(); 
 514                     Demod
.state 
= DEMOD_AWAITING_FALLING_EDGE_OF_SOF
; 
 521         case DEMOD_AWAITING_FALLING_EDGE_OF_SOF
: 
 522             MAKE_SOFT_DECISION(); 
 524                 Demod
.state 
= DEMOD_GOT_FALLING_EDGE_OF_SOF
; 
 527                 if(Demod
.posCount 
> 100) { 
 528                     Demod
.state 
= DEMOD_UNSYNCD
; 
 534         case DEMOD_GOT_FALLING_EDGE_OF_SOF
: 
 535             MAKE_SOFT_DECISION(); 
 537                 if(Demod
.posCount 
< 12) { 
 538                     Demod
.state 
= DEMOD_UNSYNCD
; 
 540                     LED_C_ON(); // Got SOF 
 541                     Demod
.state 
= DEMOD_AWAITING_START_BIT
; 
 548                 if(Demod
.posCount 
> 100) { 
 549                     Demod
.state 
= DEMOD_UNSYNCD
; 
 555         case DEMOD_AWAITING_START_BIT
: 
 556             MAKE_SOFT_DECISION(); 
 558                 if(Demod
.posCount 
> 10) { 
 559                     Demod
.state 
= DEMOD_UNSYNCD
; 
 566                 Demod
.state 
= DEMOD_RECEIVING_DATA
; 
 570         case DEMOD_RECEIVING_DATA
: 
 571             MAKE_SOFT_DECISION(); 
 572             if(Demod
.posCount 
== 0) { 
 578                 if(Demod
.thisBit 
> 0) { 
 579                     Demod
.metric 
+= Demod
.thisBit
; 
 581                     Demod
.metric 
-= Demod
.thisBit
; 
 585                 Demod
.shiftReg 
>>= 1; 
 586                 if(Demod
.thisBit 
> 0) { 
 587                     Demod
.shiftReg 
|= 0x200; 
 591                 if(Demod
.bitCount 
== 10) { 
 592                     uint16_t s 
= Demod
.shiftReg
; 
 593                     if((s 
& 0x200) && !(s 
& 0x001)) { 
 594                         uint8_t b 
= (s 
>> 1); 
 595                         Demod
.output
[Demod
.len
] = b
; 
 597                         Demod
.state 
= DEMOD_AWAITING_START_BIT
; 
 598                     } else if(s 
== 0x000) { 
 601                         Demod
.state 
= DEMOD_UNSYNCD
; 
 604                         Demod
.state 
= DEMOD_UNSYNCD
; 
 612             Demod
.state 
= DEMOD_UNSYNCD
; 
 616     if (Demod
.state 
== DEMOD_UNSYNCD
) LED_C_OFF(); // Not synchronized... 
 620 static void DemodReset() 
 622         // Clear out the state of the "UART" that receives from the tag. 
 623         Demod
.output 
= ((uint8_t *)BigBuf
) + RECV_RESP_OFFSET
; 
 625         Demod
.state 
= DEMOD_UNSYNCD
; 
 626         memset(Demod
.output
, 0x00, MAX_FRAME_SIZE
); 
 630 static void UartReset() 
 632         // And the UART that receives from the reader 
 633         Uart
.output 
= ((uint8_t *)BigBuf
) + RECV_CMD_OFFSET
; 
 634         Uart
.byteCntMax 
= MAX_FRAME_SIZE
; 
 635         Uart
.state 
= STATE_UNSYNCD
; 
 639  *  Demodulate the samples we received from the tag, also log to tracebuffer 
 640  *  weTx: set to 'TRUE' if we behave like a reader 
 641  *        set to 'FALSE' if we behave like a snooper 
 642  *  quiet: set to 'TRUE' to disable debug output 
 644 static void GetSamplesFor14443Demod(int weTx
, int n
, int quiet
) 
 647     int gotFrame 
= FALSE
; 
 658         // The DMA buffer, used to stream samples from the FPGA 
 659         int8_t *dmaBuf 
= ((int8_t *)BigBuf
) + DMA_BUFFER_OFFSET
; 
 660         int8_t *upTo
= dmaBuf
; 
 661         lastRxCounter 
= DMA_BUFFER_SIZE
; 
 662         FpgaSetupSscDma((uint8_t *)dmaBuf
, DMA_BUFFER_SIZE
); 
 664     // Signal field is ON with the appropriate LED: 
 665     if (weTx
) LED_D_ON(); else LED_D_OFF(); 
 666     // And put the FPGA in the appropriate mode 
 668         FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| 
 669         (weTx 
? 0 : FPGA_HF_READER_RX_XCORR_SNOOP
)); 
 672         int behindBy 
= lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
; 
 673         if(behindBy 
> max
) max 
= behindBy
; 
 675                 while(((lastRxCounter
-AT91C_BASE_PDC_SSC
->PDC_RCR
) & (DMA_BUFFER_SIZE
-1)) 
 681                         if(upTo 
- dmaBuf 
> DMA_BUFFER_SIZE
) { 
 682                                 upTo 
-= DMA_BUFFER_SIZE
; 
 683                 AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) upTo
; 
 684                                 AT91C_BASE_PDC_SSC
->PDC_RNCR 
= DMA_BUFFER_SIZE
; 
 687             if(lastRxCounter 
<= 0) { 
 688                                 lastRxCounter 
+= DMA_BUFFER_SIZE
; 
 693             Handle14443UartBit(1); 
 694             Handle14443UartBit(1); 
 696             if(Handle14443SamplesDemod(ci
, cq
)) { 
 705     AT91C_BASE_PDC_SSC
->PDC_PTCR 
= AT91C_PDC_RXTDIS
; 
 706     if (!quiet
) Dbprintf("%x %x %x", max
, gotFrame
, Demod
.len
); 
 708         if (tracing 
&& Demod
.len 
> 0) { 
 709                 uint8_t parity
[MAX_PARITY_SIZE
]; 
 710                 GetParity(Demod
.output 
, Demod
.len
, parity
); 
 711                 LogTrace(Demod
.output
,Demod
.len
, 0, 0, parity
, FALSE
); 
 715 //----------------------------------------------------------------------------- 
 716 // Read the tag's response. We just receive a stream of slightly-processed 
 717 // samples from the FPGA, which we will later do some signal processing on, 
 719 //----------------------------------------------------------------------------- 
 720 /*static void GetSamplesFor14443(int weTx, int n) 
 722     uint8_t *dest = (uint8_t *)BigBuf; 
 726         FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ | 
 727         (weTx ? 0 : FPGA_HF_READER_RX_XCORR_SNOOP)); 
 731         if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { 
 732             AT91C_BASE_SSC->SSC_THR = 0x43; 
 734         if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { 
 736             b = (int8_t)AT91C_BASE_SSC->SSC_RHR; 
 738             dest[c++] = (uint8_t)b; 
 747 //----------------------------------------------------------------------------- 
 748 // Transmit the command (to the tag) that was placed in ToSend[]. 
 749 //----------------------------------------------------------------------------- 
 750 static void TransmitFor14443(void) 
 756     while(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 757         AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 760     // Signal field is ON with the appropriate Red LED 
 762         // Signal we are transmitting with the Green LED 
 765         FPGA_MAJOR_MODE_HF_READER_TX 
| FPGA_HF_READER_TX_SHALLOW_MOD
); 
 767     for(c 
= 0; c 
< 10;) { 
 768         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 769             AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 772         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 773             volatile uint32_t r 
= AT91C_BASE_SSC
->SSC_RHR
; 
 781         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 782             AT91C_BASE_SSC
->SSC_THR 
= ToSend
[c
]; 
 788         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 789             volatile uint32_t r 
= AT91C_BASE_SSC
->SSC_RHR
; 
 794     LED_B_OFF(); // Finished sending 
 797 //----------------------------------------------------------------------------- 
 798 // Code a layer 2 command (string of octets, including CRC) into ToSend[], 
 799 // so that it is ready to transmit to the tag using TransmitFor14443(). 
 800 //----------------------------------------------------------------------------- 
 801 static void CodeIso14443bAsReader(const uint8_t *cmd
, int len
) 
 808     // Establish initial reference level 
 809     for(i 
= 0; i 
< 40; i
++) { 
 813     for(i 
= 0; i 
< 10; i
++) { 
 817     for(i 
= 0; i 
< len
; i
++) { 
 825         for(j 
= 0; j 
< 8; j
++) { 
 836     for(i 
= 0; i 
< 10; i
++) { 
 839     for(i 
= 0; i 
< 8; i
++) { 
 843     // And then a little more, to make sure that the last character makes 
 844     // it out before we switch to rx mode. 
 845     for(i 
= 0; i 
< 24; i
++) { 
 849     // Convert from last character reference to length 
 853 //----------------------------------------------------------------------------- 
 854 // Read an ISO 14443 tag. We send it some set of commands, and record the 
 856 // The command name is misleading, it actually decodes the reponse in HEX 
 857 // into the output buffer (read the result using hexsamples, not hisamples) 
 859 // obsolete function only for test 
 860 //----------------------------------------------------------------------------- 
 861 void AcquireRawAdcSamplesIso14443(uint32_t parameter
) 
 863     uint8_t cmd1
[] = { 0x05, 0x00, 0x08, 0x39, 0x73 }; 
 865     SendRawCommand14443B(sizeof(cmd1
),1,1,cmd1
); 
 869   Convenience function to encode, transmit and trace iso 14443b comms 
 871 static void CodeAndTransmit14443bAsReader(const uint8_t *cmd
, int len
) 
 873         CodeIso14443bAsReader(cmd
, len
); 
 876                 uint8_t parity
[MAX_PARITY_SIZE
]; 
 877                 GetParity(cmd
, len
, parity
); 
 878                 LogTrace(cmd
,len
, 0, 0, parity
, TRUE
); 
 882 //----------------------------------------------------------------------------- 
 883 // Read a SRI512 ISO 14443 tag. 
 885 // SRI512 tags are just simple memory tags, here we're looking at making a dump 
 886 // of the contents of the memory. No anticollision algorithm is done, we assume 
 887 // we have a single tag in the field. 
 889 // I tried to be systematic and check every answer of the tag, every CRC, etc... 
 890 //----------------------------------------------------------------------------- 
 891 void ReadSTMemoryIso14443(uint32_t dwLast
) 
 898     FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 899     // Make sure that we start from off, since the tags are stateful; 
 900     // confusing things will happen if we don't reset them between reads. 
 902     FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 905     SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 908     // Now give it time to spin up. 
 909     // Signal field is on with the appropriate LED 
 912         FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ
); 
 915     // First command: wake up the tag using the INITIATE command 
 916     uint8_t cmd1
[] = { 0x06, 0x00, 0x97, 0x5b}; 
 918         CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
 920     GetSamplesFor14443Demod(TRUE
, 2000,TRUE
); 
 923     if (Demod
.len 
== 0) { 
 924         DbpString("No response from tag"); 
 927         Dbprintf("Randomly generated UID from tag (+ 2 byte CRC): %x %x %x", 
 928                 Demod
.output
[0], Demod
.output
[1],Demod
.output
[2]); 
 930     // There is a response, SELECT the uid 
 931     DbpString("Now SELECT tag:"); 
 932     cmd1
[0] = 0x0E; // 0x0E is SELECT 
 933     cmd1
[1] = Demod
.output
[0]; 
 934     ComputeCrc14443(CRC_14443_B
, cmd1
, 2, &cmd1
[2], &cmd1
[3]); 
 935         CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
 938     GetSamplesFor14443Demod(TRUE
, 2000,TRUE
); 
 940     if (Demod
.len 
!= 3) { 
 941         Dbprintf("Expected 3 bytes from tag, got %d", Demod
.len
); 
 944     // Check the CRC of the answer: 
 945     ComputeCrc14443(CRC_14443_B
, Demod
.output
, 1 , &cmd1
[2], &cmd1
[3]); 
 946     if(cmd1
[2] != Demod
.output
[1] || cmd1
[3] != Demod
.output
[2]) { 
 947         DbpString("CRC Error reading select response."); 
 950     // Check response from the tag: should be the same UID as the command we just sent: 
 951     if (cmd1
[1] != Demod
.output
[0]) { 
 952         Dbprintf("Bad response to SELECT from Tag, aborting: %x %x", cmd1
[1], Demod
.output
[0]); 
 955     // Tag is now selected, 
 956     // First get the tag's UID: 
 958     ComputeCrc14443(CRC_14443_B
, cmd1
, 1 , &cmd1
[1], &cmd1
[2]); 
 959         CodeAndTransmit14443bAsReader(cmd1
, 3); // Only first three bytes for this one 
 962     GetSamplesFor14443Demod(TRUE
, 2000,TRUE
); 
 964     if (Demod
.len 
!= 10) { 
 965         Dbprintf("Expected 10 bytes from tag, got %d", Demod
.len
); 
 968     // The check the CRC of the answer (use cmd1 as temporary variable): 
 969     ComputeCrc14443(CRC_14443_B
, Demod
.output
, 8, &cmd1
[2], &cmd1
[3]); 
 970            if(cmd1
[2] != Demod
.output
[8] || cmd1
[3] != Demod
.output
[9]) { 
 971         Dbprintf("CRC Error reading block! - Below: expected, got %x %x", 
 972                 (cmd1
[2]<<8)+cmd1
[3], (Demod
.output
[8]<<8)+Demod
.output
[9]); 
 973         // Do not return;, let's go on... (we should retry, maybe ?) 
 975     Dbprintf("Tag UID (64 bits): %08x %08x", 
 976         (Demod
.output
[7]<<24) + (Demod
.output
[6]<<16) + (Demod
.output
[5]<<8) + Demod
.output
[4], 
 977         (Demod
.output
[3]<<24) + (Demod
.output
[2]<<16) + (Demod
.output
[1]<<8) + Demod
.output
[0]); 
 979     // Now loop to read all 16 blocks, address from 0 to last block 
 980     Dbprintf("Tag memory dump, block 0 to %d",dwLast
); 
 986                     DbpString("System area block (0xff):"); 
 990             ComputeCrc14443(CRC_14443_B
, cmd1
, 2, &cmd1
[2], &cmd1
[3]); 
 991                 CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
 994             GetSamplesFor14443Demod(TRUE
, 2000,TRUE
); 
 996             if (Demod
.len 
!= 6) { // Check if we got an answer from the tag 
 997                 DbpString("Expected 6 bytes from tag, got less..."); 
1000             // The check the CRC of the answer (use cmd1 as temporary variable): 
1001             ComputeCrc14443(CRC_14443_B
, Demod
.output
, 4, &cmd1
[2], &cmd1
[3]); 
1002             if(cmd1
[2] != Demod
.output
[4] || cmd1
[3] != Demod
.output
[5]) { 
1003                 Dbprintf("CRC Error reading block! - Below: expected, got %x %x", 
1004                         (cmd1
[2]<<8)+cmd1
[3], (Demod
.output
[4]<<8)+Demod
.output
[5]); 
1005                 // Do not return;, let's go on... (we should retry, maybe ?) 
1007             // Now print out the memory location: 
1008             Dbprintf("Address=%x, Contents=%x, CRC=%x", i
, 
1009                 (Demod
.output
[3]<<24) + (Demod
.output
[2]<<16) + (Demod
.output
[1]<<8) + Demod
.output
[0], 
1010                 (Demod
.output
[4]<<8)+Demod
.output
[5]); 
1019 //============================================================================= 
1020 // Finally, the `sniffer' combines elements from both the reader and 
1021 // simulated tag, to show both sides of the conversation. 
1022 //============================================================================= 
1024 //----------------------------------------------------------------------------- 
1025 // Record the sequence of commands sent by the reader to the tag, with 
1026 // triggering so that we start recording at the point that the tag is moved 
1028 //----------------------------------------------------------------------------- 
1030  * Memory usage for this function, (within BigBuf) 
1031  * 0-4095 : Demodulated samples receive (4096 bytes) - DEMOD_TRACE_SIZE 
1032  * 4096-6143 : Last Received command, 2048 bytes (reader->tag) - READER_TAG_BUFFER_SIZE 
1033  * 6144-8191 : Last Received command, 2048 bytes(tag->reader) - TAG_READER_BUFFER_SIZE 
1034  * 8192-9215 : DMA Buffer, 1024 bytes (samples) - DEMOD_DMA_BUFFER_SIZE 
1036 void RAMFUNC 
SnoopIso14443(void) 
1038     // We won't start recording the frames that we acquire until we trigger; 
1039     // a good trigger condition to get started is probably when we see a 
1040     // response from the tag. 
1041     int triggered 
= TRUE
; 
1043     FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1048     // The DMA buffer, used to stream samples from the FPGA. 
1049         int8_t *dmaBuf 
= ((int8_t *)BigBuf
) + DMA_BUFFER_OFFSET
; 
1053     int maxBehindBy 
= 0; 
1055     // Count of samples received so far, so that we can include timing 
1056     // information in the trace buffer. 
1062     // Print some debug information about the buffer sizes 
1063     Dbprintf("Snooping buffers initialized:"); 
1064         Dbprintf("  Trace: %i bytes", TRACE_SIZE
); 
1065         Dbprintf("  Reader -> tag: %i bytes", MAX_FRAME_SIZE
); 
1066         Dbprintf("  tag -> Reader: %i bytes", MAX_FRAME_SIZE
); 
1067         Dbprintf("  DMA: %i bytes", DMA_BUFFER_SIZE
); 
1069         // Signal field is off with the appropriate LED 
1072         // And put the FPGA in the appropriate mode 
1074         FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| 
1075         FPGA_HF_READER_RX_XCORR_SNOOP
); 
1076     SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1078     // Setup for the DMA. 
1081         lastRxCounter 
= DMA_BUFFER_SIZE
; 
1082         FpgaSetupSscDma((uint8_t *)dmaBuf
, DMA_BUFFER_SIZE
); 
1083         uint8_t parity
[MAX_PARITY_SIZE
]; 
1086     // And now we loop, receiving samples. 
1088         int behindBy 
= (lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
) & 
1089                                                                 (DMA_BUFFER_SIZE
-1); 
1090         if(behindBy 
> maxBehindBy
) { 
1091             maxBehindBy 
= behindBy
; 
1092                         if(behindBy 
> (DMA_BUFFER_SIZE
-2)) { // TODO: understand whether we can increase/decrease as we want or not? 
1093                 Dbprintf("blew circular buffer! behindBy=0x%x", behindBy
); 
1097         if(behindBy 
< 2) continue; 
1103                 if(upTo 
- dmaBuf 
> DMA_BUFFER_SIZE
) { 
1104                         upTo 
-= DMA_BUFFER_SIZE
; 
1105                         lastRxCounter 
+= DMA_BUFFER_SIZE
; 
1106             AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) upTo
; 
1107                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= DMA_BUFFER_SIZE
; 
1112         if(Handle14443UartBit(ci 
& 1)) { 
1113                         if(triggered 
&& tracing
) { 
1114                                 GetParity(Uart
.output
, Uart
.byteCnt
, parity
); 
1115                                 LogTrace(Uart
.output
,Uart
.byteCnt
,samples
, samples
,parity
,TRUE
); 
1117                         /* And ready to receive another command. */ 
1119                         /* And also reset the demod code, which might have been */ 
1120                         /* false-triggered by the commands from the reader. */ 
1123         if(Handle14443UartBit(cq 
& 1)) { 
1124                         if(triggered 
&& tracing
) { 
1125                                 GetParity(Uart
.output
, Uart
.byteCnt
, parity
); 
1126                                 LogTrace(Uart
.output
,Uart
.byteCnt
,samples
, samples
,parity
,TRUE
); 
1128                         /* And ready to receive another command. */ 
1130                         /* And also reset the demod code, which might have been */ 
1131                         /* false-triggered by the commands from the reader. */ 
1135         if(Handle14443SamplesDemod(ci
, cq
)) { 
1137                         //Use samples as a time measurement 
1140                                 uint8_t parity
[MAX_PARITY_SIZE
]; 
1141                                 GetParity(Demod
.output
, Demod
.len
, parity
); 
1142                                 LogTrace(Demod
.output
,Demod
.len
,samples
, samples
,parity
,FALSE
); 
1148             // And ready to receive another response. 
1154                         DbpString("Reached trace limit"); 
1158         if(BUTTON_PRESS()) { 
1159             DbpString("cancelled"); 
1163         FpgaDisableSscDma(); 
1167         AT91C_BASE_PDC_SSC
->PDC_PTCR 
= AT91C_PDC_RXTDIS
; 
1168         DbpString("Snoop statistics:"); 
1169         Dbprintf("  Max behind by: %i", maxBehindBy
); 
1170         Dbprintf("  Uart State: %x", Uart
.state
); 
1171         Dbprintf("  Uart ByteCnt: %i", Uart
.byteCnt
); 
1172         Dbprintf("  Uart ByteCntMax: %i", Uart
.byteCntMax
); 
1173         Dbprintf("  Trace length: %i", traceLen
); 
1177  * Send raw command to tag ISO14443B 
1179  * datalen     len of buffer data 
1180  * recv        bool when true wait for data from tag and send to client 
1181  * powerfield  bool leave the field on when true 
1182  * data        buffer with byte to send 
1189 void SendRawCommand14443B(uint32_t datalen
, uint32_t recv
,uint8_t powerfield
, uint8_t data
[]) 
1191     FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1194         // Make sure that we start from off, since the tags are stateful; 
1195         // confusing things will happen if we don't reset them between reads. 
1196         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1201     if(!GETBIT(GPIO_LED_D
)) 
1203         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1206         // Now give it time to spin up. 
1207         // Signal field is on with the appropriate LED 
1210             FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ
); 
1214         CodeAndTransmit14443bAsReader(data
, datalen
); 
1218         uint16_t iLen 
= MIN(Demod
.len
,USB_CMD_DATA_SIZE
); 
1219         GetSamplesFor14443Demod(TRUE
, 2000, TRUE
); 
1220         cmd_send(CMD_ACK
,iLen
,0,0,Demod
.output
,iLen
); 
1224         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);