1 //----------------------------------------------------------------------------- 
   2 // Jonathan Westhues, split Nov 2006 
   5 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   6 // at your option, any later version. See the LICENSE.txt file for the text of 
   8 //----------------------------------------------------------------------------- 
   9 // Routines to support ISO 14443B. This includes both the reader software and 
  10 // the `fake tag' modes. 
  11 //----------------------------------------------------------------------------- 
  13 #include "iso14443b.h" 
  15 #include "proxmark3.h" 
  19 #include "iso14443crc.h" 
  20 #include "fpgaloader.h" 
  23 #define RECEIVE_SAMPLES_TIMEOUT 64 // TR0 max is 256/fs = 256/(848kHz) = 302us or 64 samples from FPGA 
  24 #define ISO14443B_DMA_BUFFER_SIZE 128 
  26 // PCB Block number for APDUs 
  27 static uint8_t pcb_blocknum 
= 0; 
  29 //============================================================================= 
  30 // An ISO 14443 Type B tag. We listen for commands from the reader, using 
  31 // a UART kind of thing that's implemented in software. When we get a 
  32 // frame (i.e., a group of bytes between SOF and EOF), we check the CRC. 
  33 // If it's good, then we can do something appropriate with it, and send 
  35 //============================================================================= 
  37 //----------------------------------------------------------------------------- 
  38 // Code up a string of octets at layer 2 (including CRC, we don't generate 
  39 // that here) so that they can be transmitted to the reader. Doesn't transmit 
  40 // them yet, just leaves them ready to send in ToSend[]. 
  41 //----------------------------------------------------------------------------- 
  42 static void CodeIso14443bAsTag(const uint8_t *cmd
, int len
) 
  48         // Transmit a burst of ones, as the initial thing that lets the 
  49         // reader get phase sync. This (TR1) must be > 80/fs, per spec, 
  50         // but tag that I've tried (a Paypass) exceeds that by a fair bit, 
  52         for(i 
= 0; i 
< 20; i
++) { 
  60         for(i 
= 0; i 
< 10; i
++) { 
  66         for(i 
= 0; i 
< 2; i
++) { 
  73         for(i 
= 0; i 
< len
; i
++) { 
  84                 for(j 
= 0; j 
< 8; j
++) { 
 107         for(i 
= 0; i 
< 10; i
++) { 
 113         for(i 
= 0; i 
< 2; i
++) { 
 120         // Convert from last byte pos to length 
 124 //----------------------------------------------------------------------------- 
 125 // The software UART that receives commands from the reader, and its state 
 127 //----------------------------------------------------------------------------- 
 131                 STATE_GOT_FALLING_EDGE_OF_SOF
, 
 132                 STATE_AWAITING_START_BIT
, 
 143 /* Receive & handle a bit coming from the reader. 
 145  * This function is called 4 times per bit (every 2 subcarrier cycles). 
 146  * Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 2,36us 
 149  * LED A -> ON once we have received the SOF and are expecting the rest. 
 150  * LED A -> OFF once we have received EOF or are in error state or unsynced 
 152  * Returns: true if we received a EOF 
 153  *          false if we are still waiting for some more 
 155 static RAMFUNC 
int Handle14443bUartBit(uint8_t 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) {  // sample every 4 1/fs in the middle of a bit 
 172                                         if(Uart
.bitCnt 
> 9) { 
 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_UNSYNCD
; 
 185                                         // do nothing, keep waiting 
 189                         if(Uart
.posCnt 
>= 4) Uart
.posCnt 
= 0; 
 190                         if(Uart
.bitCnt 
> 12) { 
 191                                 // Give up if we see too many zeros without 
 194                                 Uart
.state 
= STATE_UNSYNCD
; 
 198                 case STATE_AWAITING_START_BIT
: 
 201                                 if(Uart
.posCnt 
> 50/2) {        // max 57us between characters = 49 1/fs, max 3 etus after low phase of SOF = 24 1/fs 
 202                                         // stayed high for too long between 
 204                                         Uart
.state 
= STATE_UNSYNCD
; 
 207                                 // falling edge, this starts the data byte 
 211                                 Uart
.state 
= STATE_RECEIVING_DATA
; 
 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_UNSYNCD
; 
 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 
 248                                         Uart
.state 
= STATE_UNSYNCD
; 
 249                                         if (Uart
.byteCnt 
!= 0) { 
 255                                         Uart
.state 
= STATE_UNSYNCD
; 
 262                         Uart
.state 
= STATE_UNSYNCD
; 
 270 static void UartReset() 
 272         Uart
.byteCntMax 
= MAX_FRAME_SIZE
; 
 273         Uart
.state 
= STATE_UNSYNCD
; 
 279 static void UartInit(uint8_t *data
) 
 286 //----------------------------------------------------------------------------- 
 287 // Receive a command (from the reader to us, where we are the simulated tag), 
 288 // and store it in the given buffer, up to the given maximum length. Keeps 
 289 // spinning, waiting for a well-framed command, until either we get one 
 290 // (returns true) or someone presses the pushbutton on the board (false). 
 292 // Assume that we're called with the SSC (to the FPGA) and ADC path set 
 294 //----------------------------------------------------------------------------- 
 295 static int GetIso14443bCommandFromReader(uint8_t *received
, uint16_t *len
) 
 297         // Set FPGA mode to "simulated ISO 14443B tag", no modulation (listen 
 298         // only, since we are receiving, not transmitting). 
 299         // Signal field is off with the appropriate LED 
 301         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_NO_MODULATION
); 
 303         // Now run a `software UART' on the stream of incoming samples. 
 309                 if(BUTTON_PRESS()) return false; 
 311                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 312                         uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 313                         for(uint8_t mask 
= 0x80; mask 
!= 0x00; mask 
>>= 1) { 
 314                                 if(Handle14443bUartBit(b 
& mask
)) { 
 325 //----------------------------------------------------------------------------- 
 326 // Main loop of simulated tag: receive commands from reader, decide what 
 327 // response to send, and send it. 
 328 //----------------------------------------------------------------------------- 
 329 void SimulateIso14443bTag(void) 
 332         // the only commands we understand is WUPB, AFI=0, Select All, N=1: 
 333         static const uint8_t cmd1
[] = { 0x05, 0x00, 0x08, 0x39, 0x73 }; // WUPB 
 334         // ... and REQB, AFI=0, Normal Request, N=1: 
 335         static const uint8_t cmd2
[] = { 0x05, 0x00, 0x00, 0x71, 0xFF }; // REQB 
 337         static const uint8_t cmd3
[] = { 0x50, 0xff, 0xff, 0xff, 0xff }; // HLTB 
 339         static const uint8_t cmd4
[] = { 0x1D, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // ATTRIB 
 341         // ... and we always respond with ATQB, PUPI = 820de174, Application Data = 0x20381922, 
 342         // supports only 106kBit/s in both directions, max frame size = 32Bytes, 
 343         // supports ISO14443-4, FWI=8 (77ms), NAD supported, CID not supported: 
 344         static const uint8_t response1
[] = { 
 345                 0x50, 0x82, 0x0d, 0xe1, 0x74, 0x20, 0x38, 0x19, 0x22, 
 346                 0x00, 0x21, 0x85, 0x5e, 0xd7 
 348         // response to HLTB and ATTRIB 
 349         static const uint8_t response2
[] = {0x00, 0x78, 0xF0}; 
 352         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 359         uint16_t respLen
, respCodeLen
; 
 361         // allocate command receive buffer 
 363         uint8_t *receivedCmd 
= BigBuf_malloc(MAX_FRAME_SIZE
); 
 366         uint16_t cmdsRecvd 
= 0; 
 368         // prepare the (only one) tag answer: 
 369         CodeIso14443bAsTag(response1
, sizeof(response1
)); 
 370         uint8_t *resp1Code 
= BigBuf_malloc(ToSendMax
); 
 371         memcpy(resp1Code
, ToSend
, ToSendMax
); 
 372         uint16_t resp1CodeLen 
= ToSendMax
; 
 374         // prepare the (other) tag answer: 
 375         CodeIso14443bAsTag(response2
, sizeof(response2
)); 
 376         uint8_t *resp2Code 
= BigBuf_malloc(ToSendMax
); 
 377         memcpy(resp2Code
, ToSend
, ToSendMax
); 
 378         uint16_t resp2CodeLen 
= ToSendMax
; 
 380         // We need to listen to the high-frequency, peak-detected path. 
 381         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 382         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SIMULATOR
); 
 388                 if(!GetIso14443bCommandFromReader(receivedCmd
, &len
)) { 
 389                         Dbprintf("button pressed, received %d commands", cmdsRecvd
); 
 393                 LogTrace(receivedCmd
, len
, 0, 0, NULL
, true); 
 395                 // Good, look at the command now. 
 396                 if ( (len 
== sizeof(cmd1
) && memcmp(receivedCmd
, cmd1
, len
) == 0) 
 397                         || (len 
== sizeof(cmd2
) && memcmp(receivedCmd
, cmd2
, len
) == 0) ) { 
 399                         respLen 
= sizeof(response1
); 
 400                         respCode 
= resp1Code
; 
 401                         respCodeLen 
= resp1CodeLen
; 
 402                 } else if ( (len 
== sizeof(cmd3
) && receivedCmd
[0] == cmd3
[0]) 
 403                         || (len 
== sizeof(cmd4
) && receivedCmd
[0] == cmd4
[0]) ) { 
 405                         respLen 
= sizeof(response2
); 
 406                         respCode 
= resp2Code
; 
 407                         respCodeLen 
= resp2CodeLen
; 
 409                         Dbprintf("new cmd from reader: len=%d, cmdsRecvd=%d", len
, cmdsRecvd
); 
 410                         // And print whether the CRC fails, just for good measure 
 412                         if (len 
>= 3){ // if crc exists 
 413                                 ComputeCrc14443(CRC_14443_B
, receivedCmd
, len
-2, &b1
, &b2
); 
 414                                 if(b1 
!= receivedCmd
[len
-2] || b2 
!= receivedCmd
[len
-1]) { 
 415                                         // Not so good, try again. 
 416                                         DbpString("+++CRC fail"); 
 419                                         DbpString("CRC passes"); 
 422                         //get rid of compiler warning 
 426                         respCode 
= resp1Code
; 
 427                         //don't crash at new command just wait and see if reader will send other new cmds. 
 433                 if(cmdsRecvd 
> 0x30) { 
 434                         DbpString("many commands later..."); 
 438                 if(respCodeLen 
<= 0) continue; 
 441                 // Signal field is off with the appropriate LED 
 443                 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_MODULATE_BPSK
); 
 444                 AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 445                 FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SIMULATOR
); 
 447                 // Transmit the response. 
 450                         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 451                                 uint8_t b 
= respCode
[i
]; 
 453                                 AT91C_BASE_SSC
->SSC_THR 
= b
; 
 456                                 if(i 
> respCodeLen
) { 
 460                         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 461                                 volatile uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 466                 // trace the response: 
 467                 LogTrace(resp
, respLen
, 0, 0, NULL
, false); 
 471         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 475 //============================================================================= 
 476 // An ISO 14443 Type B reader. We take layer two commands, code them 
 477 // appropriately, and then send them to the tag. We then listen for the 
 478 // tag's response, which we leave in the buffer to be demodulated on the 
 480 //============================================================================= 
 485                 DEMOD_PHASE_REF_TRAINING
, 
 486                 DEMOD_AWAITING_FALLING_EDGE_OF_SOF
, 
 487                 DEMOD_GOT_FALLING_EDGE_OF_SOF
, 
 488                 DEMOD_AWAITING_START_BIT
, 
 494 /* this had been used to add RSSI (Received Signal Strength Indication) to traces. Currently not implemented. 
 506  * Handles reception of a bit from the tag 
 508  * This function is called 2 times per bit (every 4 subcarrier cycles). 
 509  * Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 4,72us 
 512  * LED C -> ON once we have received the SOF and are expecting the rest. 
 513  * LED C -> OFF once we have received EOF or are unsynced 
 515  * Returns: true if we received a EOF 
 516  *          false if we are still waiting for some more 
 519 static RAMFUNC 
int Handle14443bSamplesDemod(int ci
, int cq
) 
 523 // The soft decision on the bit uses an estimate of just the 
 524 // quadrant of the reference angle, not the exact angle. 
 525 #define MAKE_SOFT_DECISION() { \ 
 526                 if(Demod.sumI > 0) { \ 
 531                 if(Demod.sumQ > 0) { \ 
 538 #define SUBCARRIER_DETECT_THRESHOLD     8 
 540 // Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by max(abs(ci),abs(cq)) + 1/2*min(abs(ci),abs(cq))) 
 541 #define AMPLITUDE(ci,cq) (MAX(ABS(ci),ABS(cq)) + (MIN(ABS(ci),ABS(cq))/2)) 
 542         switch(Demod
.state
) { 
 544                         if(AMPLITUDE(ci
,cq
) > SUBCARRIER_DETECT_THRESHOLD
) {    // subcarrier detected 
 545                                 Demod
.state 
= DEMOD_PHASE_REF_TRAINING
; 
 552                 case DEMOD_PHASE_REF_TRAINING
: 
 553                         if(Demod
.posCount 
< 8) { 
 554                                 if (AMPLITUDE(ci
,cq
) > SUBCARRIER_DETECT_THRESHOLD
) { 
 555                                         // set the reference phase (will code a logic '1') by averaging over 32 1/fs. 
 556                                         // note: synchronization time > 80 1/fs 
 560                                 } else {                // subcarrier lost 
 561                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 564                                 Demod
.state 
= DEMOD_AWAITING_FALLING_EDGE_OF_SOF
; 
 568                 case DEMOD_AWAITING_FALLING_EDGE_OF_SOF
: 
 569                         MAKE_SOFT_DECISION(); 
 570                         if(v 
< 0) {     // logic '0' detected 
 571                                 Demod
.state 
= DEMOD_GOT_FALLING_EDGE_OF_SOF
; 
 572                                 Demod
.posCount 
= 0;     // start of SOF sequence 
 574                                 if(Demod
.posCount 
> 200/4) {    // maximum length of TR1 = 200 1/fs 
 575                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 581                 case DEMOD_GOT_FALLING_EDGE_OF_SOF
: 
 583                         MAKE_SOFT_DECISION(); 
 585                                 if(Demod
.posCount 
< 9*2) { // low phase of SOF too short (< 9 etu). Note: spec is >= 10, but FPGA tends to "smear" edges 
 586                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 588                                         LED_C_ON(); // Got SOF 
 589                                         Demod
.state 
= DEMOD_AWAITING_START_BIT
; 
 592 /* this had been used to add RSSI (Received Signal Strength Indication) to traces. Currently not implemented. 
 598                                 if(Demod
.posCount 
> 12*2) { // low phase of SOF too long (> 12 etu) 
 599                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 605                 case DEMOD_AWAITING_START_BIT
: 
 607                         MAKE_SOFT_DECISION(); 
 609                                 if(Demod
.posCount 
> 3*2) {              // max 19us between characters = 16 1/fs, max 3 etu after low phase of SOF = 24 1/fs 
 610                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 613                         } else {                                                        // start bit detected 
 615                                 Demod
.posCount 
= 1;                             // this was the first half 
 618                                 Demod
.state 
= DEMOD_RECEIVING_DATA
; 
 622                 case DEMOD_RECEIVING_DATA
: 
 623                         MAKE_SOFT_DECISION(); 
 624                         if(Demod
.posCount 
== 0) {                       // first half of bit 
 627                         } else {                                                        // second half of bit 
 630 /* this had been used to add RSSI (Received Signal Strength Indication) to traces. Currently not implemented. 
 631                                 if(Demod.thisBit > 0) { 
 632                                         Demod.metric += Demod.thisBit; 
 634                                         Demod.metric -= Demod.thisBit; 
 639                                 Demod
.shiftReg 
>>= 1; 
 640                                 if(Demod
.thisBit 
> 0) { // logic '1' 
 641                                         Demod
.shiftReg 
|= 0x200; 
 645                                 if(Demod
.bitCount 
== 10) { 
 646                                         uint16_t s 
= Demod
.shiftReg
; 
 647                                         if((s 
& 0x200) && !(s 
& 0x001)) { // stop bit == '1', start bit == '0' 
 648                                                 uint8_t b 
= (s 
>> 1); 
 649                                                 Demod
.output
[Demod
.len
] = b
; 
 651                                                 Demod
.state 
= DEMOD_AWAITING_START_BIT
; 
 653                                                 Demod
.state 
= DEMOD_UNSYNCD
; 
 656                                                         // This is EOF (start, stop and all data bits == '0' 
 666                         Demod
.state 
= DEMOD_UNSYNCD
; 
 675 static void DemodReset() 
 677         // Clear out the state of the "UART" that receives from the tag. 
 679         Demod
.state 
= DEMOD_UNSYNCD
; 
 681         memset(Demod
.output
, 0x00, MAX_FRAME_SIZE
); 
 685 static void DemodInit(uint8_t *data
) 
 693  *  Demodulate the samples we received from the tag, also log to tracebuffer 
 694  *  quiet: set to 'true' to disable debug output 
 696 static void GetSamplesFor14443bDemod(int timeout
, bool quiet
) 
 699         bool gotFrame 
= false; 
 700         int lastRxCounter
, samples 
= 0; 
 703         // Allocate memory from BigBuf for some buffers 
 704         // free all previous allocations first 
 707         // The response (tag -> reader) that we're receiving. 
 708         uint8_t *receivedResponse 
= BigBuf_malloc(MAX_FRAME_SIZE
); 
 710         // The DMA buffer, used to stream samples from the FPGA 
 711         uint16_t *dmaBuf 
= (uint16_t*) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE 
* sizeof(uint16_t)); 
 713         // Set up the demodulator for tag -> reader responses. 
 714         DemodInit(receivedResponse
); 
 716         // wait for last transfer to complete 
 717         while (!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_TXEMPTY
)) 
 719         // Setup and start DMA. 
 720         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
 721         FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO14443B_DMA_BUFFER_SIZE
); 
 723         uint16_t *upTo 
= dmaBuf
; 
 724         lastRxCounter 
= ISO14443B_DMA_BUFFER_SIZE
; 
 726         // Signal field is ON with the appropriate LED: 
 728         // And put the FPGA in the appropriate mode 
 729         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_SUBCARRIER_848_KHZ 
| FPGA_HF_READER_MODE_RECEIVE_IQ
); 
 732                 int behindBy 
= (lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
) & (ISO14443B_DMA_BUFFER_SIZE
-1); 
 733                 if(behindBy 
> maxBehindBy
) { 
 734                         maxBehindBy 
= behindBy
; 
 737                 if(behindBy 
< 1) continue; 
 743                 if(upTo 
>= dmaBuf 
+ ISO14443B_DMA_BUFFER_SIZE
) {               // we have read all of the DMA buffer content. 
 744                         upTo 
= dmaBuf
;                                             // start reading the circular buffer from the beginning 
 745                         lastRxCounter 
+= ISO14443B_DMA_BUFFER_SIZE
; 
 747                 if (AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_ENDRX
)) {              // DMA Counter Register had reached 0, already rotated. 
 748                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
;          // refresh the DMA Next Buffer and 
 749                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO14443B_DMA_BUFFER_SIZE
;  // DMA Next Counter registers 
 753                 if(Handle14443bSamplesDemod(ci
, cq
)) { 
 758                 if(samples 
> timeout 
&& Demod
.state 
< DEMOD_PHASE_REF_TRAINING
) { 
 766         if (!quiet
) Dbprintf("max behindby = %d, samples = %d, gotFrame = %d, Demod.len = %d, Demod.sumI = %d, Demod.sumQ = %d", maxBehindBy
, samples
, gotFrame
, Demod
.len
, Demod
.sumI
, Demod
.sumQ
); 
 769                 LogTrace(Demod
.output
, Demod
.len
, 0, 0, NULL
, false); 
 774 //----------------------------------------------------------------------------- 
 775 // Transmit the command (to the tag) that was placed in ToSend[]. 
 776 //----------------------------------------------------------------------------- 
 777 static void TransmitFor14443b(void) 
 779         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_MODE_SEND_SHALLOW_MOD
); 
 781         for(int c 
= 0; c 
< ToSendMax
; c
++) { 
 782                 uint8_t data 
= ToSend
[c
]; 
 783                 for (int i 
= 0; i 
< 8; i
++) { 
 784                         uint16_t send_word 
= (data 
& 0x80) ? 0x0000 : 0xffff; 
 785                         while (!(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
))) ; 
 786                         AT91C_BASE_SSC
->SSC_THR 
= send_word
; 
 787                         while (!(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
))) ; 
 788                         AT91C_BASE_SSC
->SSC_THR 
= send_word
; 
 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 TransmitFor14443b(). 
 800 //----------------------------------------------------------------------------- 
 801 static void CodeIso14443bAsReader(const uint8_t *cmd
, int len
) 
 809         for(i 
= 0; i 
< 10; i
++) { 
 815         for(i 
= 0; i 
< len
; i
++) { 
 820                 for(j 
= 0; j 
< 8; j
++) { 
 833         for(i 
= 0; i 
< 10; i
++) { 
 838         // ensure that last byte is filled up 
 839         for(i 
= 0; i 
< 8; i
++) { 
 843         // Convert from last character reference to length 
 849   Convenience function to encode, transmit and trace iso 14443b comms 
 851 static void CodeAndTransmit14443bAsReader(const uint8_t *cmd
, int len
) 
 853         CodeIso14443bAsReader(cmd
, len
); 
 855         LogTrace(cmd
,len
, 0, 0, NULL
, true); 
 858 /* Sends an APDU to the tag 
 859  * TODO: check CRC and preamble 
 861 int iso14443b_apdu(uint8_t const *message
, size_t message_length
, uint8_t *response
) 
 864         uint8_t message_frame
[message_length 
+ 4]; 
 866         message_frame
[0] = 0x0A | pcb_blocknum
; 
 869         message_frame
[1] = 0; 
 871         memcpy(message_frame 
+ 2, message
, message_length
); 
 873         ComputeCrc14443(CRC_14443_B
, message_frame
, message_length 
+ 2, &message_frame
[message_length 
+ 2], &message_frame
[message_length 
+ 3]); 
 875         CodeAndTransmit14443bAsReader(message_frame
, message_length 
+ 4); 
 877         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, true); 
 878         FpgaDisableTracing(); 
 885         // copy response contents 
 888                 memcpy(response
, Demod
.output
, Demod
.len
); 
 894 /* Perform the ISO 14443 B Card Selection procedure 
 895  * Currently does NOT do any collision handling. 
 896  * It expects 0-1 cards in the device's range. 
 897  * TODO: Support multiple cards (perform anticollision) 
 898  * TODO: Verify CRC checksums 
 900 int iso14443b_select_card() 
 902         // WUPB command (including CRC) 
 903         // Note: WUPB wakes up all tags, REQB doesn't wake up tags in HALT state 
 904         static const uint8_t wupb
[] = { 0x05, 0x00, 0x08, 0x39, 0x73 }; 
 905         // ATTRIB command (with space for CRC) 
 906         uint8_t attrib
[] = { 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}; 
 908         // first, wake up the tag 
 909         CodeAndTransmit14443bAsReader(wupb
, sizeof(wupb
)); 
 910         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, true); 
 918     // copy the PUPI to ATTRIB 
 919     memcpy(attrib 
+ 1, Demod
.output 
+ 1, 4); 
 920     /* copy the protocol info from ATQB (Protocol Info -> Protocol_Type) into 
 922     attrib
[7] = Demod
.output
[10] & 0x0F; 
 923     ComputeCrc14443(CRC_14443_B
, attrib
, 9, attrib 
+ 9, attrib 
+ 10); 
 924     CodeAndTransmit14443bAsReader(attrib
, sizeof(attrib
)); 
 925     GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, true); 
 926     // Answer to ATTRIB too short? 
 931         // reset PCB block number 
 936 // Set up ISO 14443 Type B communication (similar to iso14443a_setup) 
 937 void iso14443b_setup() { 
 938         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 939         // Set up the synchronous serial port 
 940         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
 941         // connect Demodulated Signal to ADC: 
 942         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 944         // Signal field is on with the appropriate LED 
 946         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_MODE_SEND_SHALLOW_MOD
); 
 952 //----------------------------------------------------------------------------- 
 953 // Read a SRI512 ISO 14443B tag. 
 955 // SRI512 tags are just simple memory tags, here we're looking at making a dump 
 956 // of the contents of the memory. No anticollision algorithm is done, we assume 
 957 // we have a single tag in the field. 
 959 // I tried to be systematic and check every answer of the tag, every CRC, etc... 
 960 //----------------------------------------------------------------------------- 
 961 void ReadSTMemoryIso14443b(uint32_t dwLast
) 
 966         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 967         // Make sure that we start from off, since the tags are stateful; 
 968         // confusing things will happen if we don't reset them between reads. 
 970         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 973         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 974         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
 976         // Now give it time to spin up. 
 977         // Signal field is on with the appropriate LED 
 979         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_MODE_SEND_SHALLOW_MOD
); 
 985         // First command: wake up the tag using the INITIATE command 
 986         uint8_t cmd1
[] = {0x06, 0x00, 0x97, 0x5b}; 
 987         CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
 988         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, true); 
 990         if (Demod
.len 
== 0) { 
 991                 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 992                 DbpString("No response from tag"); 
 996                 Dbprintf("Randomly generated Chip ID (+ 2 byte CRC): %02x %02x %02x", 
 997                                 Demod
.output
[0], Demod
.output
[1], Demod
.output
[2]); 
1000         // There is a response, SELECT the uid 
1001         DbpString("Now SELECT tag:"); 
1002         cmd1
[0] = 0x0E; // 0x0E is SELECT 
1003         cmd1
[1] = Demod
.output
[0]; 
1004         ComputeCrc14443(CRC_14443_B
, cmd1
, 2, &cmd1
[2], &cmd1
[3]); 
1005         CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
1006         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, true); 
1007         if (Demod
.len 
!= 3) { 
1008                 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1009                 Dbprintf("Expected 3 bytes from tag, got %d", Demod
.len
); 
1013         // Check the CRC of the answer: 
1014         ComputeCrc14443(CRC_14443_B
, Demod
.output
, 1 , &cmd1
[2], &cmd1
[3]); 
1015         if(cmd1
[2] != Demod
.output
[1] || cmd1
[3] != Demod
.output
[2]) { 
1016                 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1017                 DbpString("CRC Error reading select response."); 
1021         // Check response from the tag: should be the same UID as the command we just sent: 
1022         if (cmd1
[1] != Demod
.output
[0]) { 
1023                 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1024                 Dbprintf("Bad response to SELECT from Tag, aborting: %02x %02x", cmd1
[1], Demod
.output
[0]); 
1029         // Tag is now selected, 
1030         // First get the tag's UID: 
1032         ComputeCrc14443(CRC_14443_B
, cmd1
, 1 , &cmd1
[1], &cmd1
[2]); 
1033         CodeAndTransmit14443bAsReader(cmd1
, 3); // Only first three bytes for this one 
1034         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, true); 
1035         if (Demod
.len 
!= 10) { 
1036                 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1037                 Dbprintf("Expected 10 bytes from tag, got %d", Demod
.len
); 
1041         // The check the CRC of the answer (use cmd1 as temporary variable): 
1042         ComputeCrc14443(CRC_14443_B
, Demod
.output
, 8, &cmd1
[2], &cmd1
[3]); 
1043         if(cmd1
[2] != Demod
.output
[8] || cmd1
[3] != Demod
.output
[9]) { 
1044                 Dbprintf("CRC Error reading block! Expected: %04x got: %04x", 
1045                                 (cmd1
[2]<<8)+cmd1
[3], (Demod
.output
[8]<<8)+Demod
.output
[9]); 
1046                 // Do not return;, let's go on... (we should retry, maybe ?) 
1048         Dbprintf("Tag UID (64 bits): %08x %08x", 
1049                         (Demod
.output
[7]<<24) + (Demod
.output
[6]<<16) + (Demod
.output
[5]<<8) + Demod
.output
[4], 
1050                         (Demod
.output
[3]<<24) + (Demod
.output
[2]<<16) + (Demod
.output
[1]<<8) + Demod
.output
[0]); 
1052         // Now loop to read all 16 blocks, address from 0 to last block 
1053         Dbprintf("Tag memory dump, block 0 to %d", dwLast
); 
1059                         DbpString("System area block (0xff):"); 
1063                 ComputeCrc14443(CRC_14443_B
, cmd1
, 2, &cmd1
[2], &cmd1
[3]); 
1064                 CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
1065                 GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, true); 
1066                 if (Demod
.len 
!= 6) { // Check if we got an answer from the tag 
1067                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1068                         DbpString("Expected 6 bytes from tag, got less..."); 
1072                 // The check the CRC of the answer (use cmd1 as temporary variable): 
1073                 ComputeCrc14443(CRC_14443_B
, Demod
.output
, 4, &cmd1
[2], &cmd1
[3]); 
1074                 if(cmd1
[2] != Demod
.output
[4] || cmd1
[3] != Demod
.output
[5]) { 
1075                         Dbprintf("CRC Error reading block! Expected: %04x got: %04x", 
1076                                         (cmd1
[2]<<8)+cmd1
[3], (Demod
.output
[4]<<8)+Demod
.output
[5]); 
1077                         // Do not return;, let's go on... (we should retry, maybe ?) 
1079                 // Now print out the memory location: 
1080                 Dbprintf("Address=%02x, Contents=%08x, CRC=%04x", i
, 
1081                                 (Demod
.output
[3]<<24) + (Demod
.output
[2]<<16) + (Demod
.output
[1]<<8) + Demod
.output
[0], 
1082                                 (Demod
.output
[4]<<8)+Demod
.output
[5]); 
1089         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1094 //============================================================================= 
1095 // Finally, the `sniffer' combines elements from both the reader and 
1096 // simulated tag, to show both sides of the conversation. 
1097 //============================================================================= 
1099 //----------------------------------------------------------------------------- 
1100 // Record the sequence of commands sent by the reader to the tag, with 
1101 // triggering so that we start recording at the point that the tag is moved 
1103 //----------------------------------------------------------------------------- 
1105  * Memory usage for this function, (within BigBuf) 
1106  * Last Received command (reader->tag) - MAX_FRAME_SIZE 
1107  * Last Received command (tag->reader) - MAX_FRAME_SIZE 
1108  * DMA Buffer - ISO14443B_DMA_BUFFER_SIZE 
1109  * Demodulated samples received - all the rest 
1111 void RAMFUNC 
SnoopIso14443b(void) 
1114         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1120         // The DMA buffer, used to stream samples from the FPGA 
1121         uint16_t *dmaBuf 
= (uint16_t*) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE 
* sizeof(uint16_t)); 
1125         int maxBehindBy 
= 0; 
1127         // Count of samples received so far, so that we can include timing 
1128         // information in the trace buffer. 
1131         DemodInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
1132         UartInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
1134         // Print some debug information about the buffer sizes 
1135         Dbprintf("Snooping buffers initialized:"); 
1136         Dbprintf("  Trace: %i bytes", BigBuf_max_traceLen()); 
1137         Dbprintf("  Reader -> tag: %i bytes", MAX_FRAME_SIZE
); 
1138         Dbprintf("  tag -> Reader: %i bytes", MAX_FRAME_SIZE
); 
1139         Dbprintf("  DMA: %i bytes", ISO14443B_DMA_BUFFER_SIZE
); 
1141         // Signal field is off 
1144         // And put the FPGA in the appropriate mode 
1145         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_SUBCARRIER_848_KHZ 
| FPGA_HF_READER_MODE_SNOOP_IQ
); 
1146         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1148         // Setup for the DMA. 
1149         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
1151         lastRxCounter 
= ISO14443B_DMA_BUFFER_SIZE
; 
1152         FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO14443B_DMA_BUFFER_SIZE
); 
1154         bool TagIsActive 
= false; 
1155         bool ReaderIsActive 
= false; 
1156         // We won't start recording the frames that we acquire until we trigger. 
1157         // A good trigger condition to get started is probably when we see a 
1159         bool triggered 
= false; 
1161         // And now we loop, receiving samples. 
1163                 int behindBy 
= (lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
) & (ISO14443B_DMA_BUFFER_SIZE
-1); 
1164                 if(behindBy 
> maxBehindBy
) { 
1165                         maxBehindBy 
= behindBy
; 
1168                 if(behindBy 
< 1) continue; 
1174                 if(upTo 
>= dmaBuf 
+ ISO14443B_DMA_BUFFER_SIZE
) {               // we have read all of the DMA buffer content. 
1175                         upTo 
= dmaBuf
;                                             // start reading the circular buffer from the beginning again 
1176                         lastRxCounter 
+= ISO14443B_DMA_BUFFER_SIZE
; 
1177                         if(behindBy 
> (9*ISO14443B_DMA_BUFFER_SIZE
/10)) {  
1178                                 Dbprintf("About to blow circular buffer - aborted! behindBy=%d", behindBy
); 
1182                 if (AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_ENDRX
)) {              // DMA Counter Register had reached 0, already rotated. 
1183                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
;          // refresh the DMA Next Buffer and 
1184                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO14443B_DMA_BUFFER_SIZE
;  // DMA Next Counter registers 
1186                         if(BUTTON_PRESS()) { 
1187                                 DbpString("cancelled"); 
1194                 if (!TagIsActive
) {                                                     // no need to try decoding reader data if the tag is sending 
1195                         if(Handle14443bUartBit(ci 
& 0x01)) { 
1197                                 LogTrace(Uart
.output
, Uart
.byteCnt
, samples
, samples
, NULL
, true); 
1198                                 /* And ready to receive another command. */ 
1200                                 /* And also reset the demod code, which might have been */ 
1201                                 /* false-triggered by the commands from the reader. */ 
1204                         if(Handle14443bUartBit(cq 
& 0x01)) { 
1206                                 LogTrace(Uart
.output
, Uart
.byteCnt
, samples
, samples
, NULL
, true); 
1207                                 /* And ready to receive another command. */ 
1209                                 /* And also reset the demod code, which might have been */ 
1210                                 /* false-triggered by the commands from the reader. */ 
1213                         ReaderIsActive 
= (Uart
.state 
> STATE_GOT_FALLING_EDGE_OF_SOF
); 
1216                 if(!ReaderIsActive 
&& triggered
) {                                              // no need to try decoding tag data if the reader is sending or not yet triggered 
1217                         if(Handle14443bSamplesDemod(ci
/2, cq
/2)) { 
1218                                 //Use samples as a time measurement 
1219                                 LogTrace(Demod
.output
, Demod
.len
, samples
, samples
, NULL
, false); 
1220                                 // And ready to receive another response. 
1223                         TagIsActive 
= (Demod
.state 
> DEMOD_GOT_FALLING_EDGE_OF_SOF
); 
1228         FpgaDisableSscDma(); 
1229         DbpString("Snoop statistics:"); 
1230         Dbprintf("  Max behind by: %i", maxBehindBy
); 
1231         Dbprintf("  Uart State: %x", Uart
.state
); 
1232         Dbprintf("  Uart ByteCnt: %i", Uart
.byteCnt
); 
1233         Dbprintf("  Uart ByteCntMax: %i", Uart
.byteCntMax
); 
1234         Dbprintf("  Trace length: %i", BigBuf_get_traceLen()); 
1240  * Send raw command to tag ISO14443B 
1242  * datalen     len of buffer data 
1243  * recv        bool when true wait for data from tag and send to client 
1244  * powerfield  bool leave the field on when true 
1245  * data        buffer with byte to send 
1251 void SendRawCommand14443B(uint32_t datalen
, uint32_t recv
, uint8_t powerfield
, uint8_t data
[]) 
1254         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1255         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1257         // switch field on and give tag some time to power up 
1259         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_MODE_SEND_SHALLOW_MOD
); 
1260         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
1266                 CodeAndTransmit14443bAsReader(data
, datalen
); 
1269                         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, true); 
1270                         FpgaDisableTracing(); 
1271                         uint16_t iLen 
= MIN(Demod
.len
, USB_CMD_DATA_SIZE
); 
1272                         cmd_send(CMD_ACK
, iLen
, 0, 0, Demod
.output
, iLen
); 
1275                 FpgaDisableTracing(); 
1279                 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);