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 //----------------------------------------------------------------------------- 
  12 #include "proxmark3.h" 
  16 #include "iso14443crc.h" 
  18 #define RECEIVE_SAMPLES_TIMEOUT 600000 
  19 #define ISO14443B_DMA_BUFFER_SIZE 256 
  22 // PCB Block number for APDUs 
  23 static uint8_t pcb_blocknum 
= 0; 
  25 //============================================================================= 
  26 // An ISO 14443 Type B tag. We listen for commands from the reader, using 
  27 // a UART kind of thing that's implemented in software. When we get a 
  28 // frame (i.e., a group of bytes between SOF and EOF), we check the CRC. 
  29 // If it's good, then we can do something appropriate with it, and send 
  31 //============================================================================= 
  33 //----------------------------------------------------------------------------- 
  34 // Code up a string of octets at layer 2 (including CRC, we don't generate 
  35 // that here) so that they can be transmitted to the reader. Doesn't transmit 
  36 // them yet, just leaves them ready to send in ToSend[]. 
  37 //----------------------------------------------------------------------------- 
  38 static void CodeIso14443bAsTag(const uint8_t *cmd
, int len
) 
  44         // Transmit a burst of ones, as the initial thing that lets the 
  45         // reader get phase sync. This (TR1) must be > 80/fs, per spec, 
  46         // but tag that I've tried (a Paypass) exceeds that by a fair bit, 
  48         for(i 
= 0; i 
< 20; i
++) { 
  56         for(i 
= 0; i 
< 10; i
++) { 
  62         for(i 
= 0; i 
< 2; i
++) { 
  69         for(i 
= 0; i 
< len
; i
++) { 
  80                 for(j 
= 0; j 
< 8; j
++) { 
 103         for(i 
= 0; i 
< 10; i
++) { 
 109         for(i 
= 0; i 
< 2; i
++) { 
 116         // Convert from last byte pos to length 
 120 //----------------------------------------------------------------------------- 
 121 // The software UART that receives commands from the reader, and its state 
 123 //----------------------------------------------------------------------------- 
 127                 STATE_GOT_FALLING_EDGE_OF_SOF
, 
 128                 STATE_AWAITING_START_BIT
, 
 139 /* Receive & handle a bit coming from the reader. 
 141  * This function is called 4 times per bit (every 2 subcarrier cycles). 
 142  * Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 2,36us 
 145  * LED A -> ON once we have received the SOF and are expecting the rest. 
 146  * LED A -> OFF once we have received EOF or are in error state or unsynced 
 148  * Returns: true if we received a EOF 
 149  *          false if we are still waiting for some more 
 151 static RAMFUNC 
int Handle14443bUartBit(uint8_t bit
) 
 156                                 // we went low, so this could be the beginning 
 158                                 Uart
.state 
= STATE_GOT_FALLING_EDGE_OF_SOF
; 
 164                 case STATE_GOT_FALLING_EDGE_OF_SOF
: 
 166                         if(Uart
.posCnt 
== 2) {  // sample every 4 1/fs in the middle of a bit 
 168                                         if(Uart
.bitCnt 
> 9) { 
 169                                                 // we've seen enough consecutive 
 170                                                 // zeros that it's a valid SOF 
 173                                                 Uart
.state 
= STATE_AWAITING_START_BIT
; 
 174                                                 LED_A_ON(); // Indicate we got a valid SOF 
 176                                                 // didn't stay down long enough 
 177                                                 // before going high, error 
 178                                                 Uart
.state 
= STATE_UNSYNCD
; 
 181                                         // do nothing, keep waiting 
 185                         if(Uart
.posCnt 
>= 4) Uart
.posCnt 
= 0; 
 186                         if(Uart
.bitCnt 
> 12) { 
 187                                 // Give up if we see too many zeros without 
 190                                 Uart
.state 
= STATE_UNSYNCD
; 
 194                 case STATE_AWAITING_START_BIT
: 
 197                                 if(Uart
.posCnt 
> 50/2) {        // max 57us between characters = 49 1/fs, max 3 etus after low phase of SOF = 24 1/fs 
 198                                         // stayed high for too long between 
 200                                         Uart
.state 
= STATE_UNSYNCD
; 
 203                                 // falling edge, this starts the data byte 
 207                                 Uart
.state 
= STATE_RECEIVING_DATA
; 
 211                 case STATE_RECEIVING_DATA
: 
 213                         if(Uart
.posCnt 
== 2) { 
 214                                 // time to sample a bit 
 217                                         Uart
.shiftReg 
|= 0x200; 
 221                         if(Uart
.posCnt 
>= 4) { 
 224                         if(Uart
.bitCnt 
== 10) { 
 225                                 if((Uart
.shiftReg 
& 0x200) && !(Uart
.shiftReg 
& 0x001)) 
 227                                         // this is a data byte, with correct 
 228                                         // start and stop bits 
 229                                         Uart
.output
[Uart
.byteCnt
] = (Uart
.shiftReg 
>> 1) & 0xff; 
 232                                         if(Uart
.byteCnt 
>= Uart
.byteCntMax
) { 
 233                                                 // Buffer overflowed, give up 
 235                                                 Uart
.state 
= STATE_UNSYNCD
; 
 237                                                 // so get the next byte now 
 239                                                 Uart
.state 
= STATE_AWAITING_START_BIT
; 
 241                                 } else if (Uart
.shiftReg 
== 0x000) { 
 242                                         // this is an EOF byte 
 243                                         LED_A_OFF(); // Finished receiving 
 244                                         Uart
.state 
= STATE_UNSYNCD
; 
 245                                         if (Uart
.byteCnt 
!= 0) { 
 251                                         Uart
.state 
= STATE_UNSYNCD
; 
 258                         Uart
.state 
= STATE_UNSYNCD
; 
 266 static void UartReset() 
 268         Uart
.byteCntMax 
= MAX_FRAME_SIZE
; 
 269         Uart
.state 
= STATE_UNSYNCD
; 
 273         memset(Uart
.output
, 0x00, MAX_FRAME_SIZE
); 
 277 static void UartInit(uint8_t *data
) 
 284 //----------------------------------------------------------------------------- 
 285 // Receive a command (from the reader to us, where we are the simulated tag), 
 286 // and store it in the given buffer, up to the given maximum length. Keeps 
 287 // spinning, waiting for a well-framed command, until either we get one 
 288 // (returns TRUE) or someone presses the pushbutton on the board (FALSE). 
 290 // Assume that we're called with the SSC (to the FPGA) and ADC path set 
 292 //----------------------------------------------------------------------------- 
 293 static int GetIso14443bCommandFromReader(uint8_t *received
, uint16_t *len
) 
 295         // Set FPGA mode to "simulated ISO 14443B tag", no modulation (listen 
 296         // only, since we are receiving, not transmitting). 
 297         // Signal field is off with the appropriate LED 
 299         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_NO_MODULATION
); 
 301         // Now run a `software UART' on the stream of incoming samples. 
 307                 if(BUTTON_PRESS()) return FALSE
; 
 309                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 310                         uint8_t b 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 311                         for(uint8_t mask 
= 0x80; mask 
!= 0x00; mask 
>>= 1) { 
 312                                 if(Handle14443bUartBit(b 
& mask
)) { 
 323 //----------------------------------------------------------------------------- 
 324 // Main loop of simulated tag: receive commands from reader, decide what 
 325 // response to send, and send it. 
 326 //----------------------------------------------------------------------------- 
 327 void SimulateIso14443bTag(void) 
 329         // the only commands we understand is WUPB, AFI=0, Select All, N=1: 
 330         static const uint8_t cmd1
[] = { 0x05, 0x00, 0x08, 0x39, 0x73 }; // WUPB 
 331         // ... and REQB, AFI=0, Normal Request, N=1: 
 332         static const uint8_t cmd2
[] = { 0x05, 0x00, 0x00, 0x71, 0xFF }; // REQB 
 334         static const uint8_t cmd3
[] = { 0x50, 0xff, 0xff, 0xff, 0xff }; // HLTB 
 336         static const uint8_t cmd4
[] = { 0x1D, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // ATTRIB 
 338         // ... and we always respond with ATQB, PUPI = 820de174, Application Data = 0x20381922, 
 339         // supports only 106kBit/s in both directions, max frame size = 32Bytes, 
 340         // supports ISO14443-4, FWI=8 (77ms), NAD supported, CID not supported: 
 341         static const uint8_t response1
[] = { 
 342                 0x50, 0x82, 0x0d, 0xe1, 0x74, 0x20, 0x38, 0x19, 0x22, 
 343                 0x00, 0x21, 0x85, 0x5e, 0xd7 
 345         // response to HLTB and ATTRIB 
 346         static const uint8_t response2
[] = {0x00, 0x78, 0xF0}; 
 348         uint8_t parity
[MAX_PARITY_SIZE
]; 
 350         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 357         uint16_t respLen
, respCodeLen
; 
 359         // allocate command receive buffer 
 361         uint8_t *receivedCmd 
= BigBuf_malloc(MAX_FRAME_SIZE
); 
 364         uint16_t cmdsRecvd 
= 0; 
 366         // prepare the (only one) tag answer: 
 367         CodeIso14443bAsTag(response1
, sizeof(response1
)); 
 368         uint8_t *resp1Code 
= BigBuf_malloc(ToSendMax
); 
 369         memcpy(resp1Code
, ToSend
, ToSendMax
);  
 370         uint16_t resp1CodeLen 
= ToSendMax
; 
 372         // prepare the (other) tag answer: 
 373         CodeIso14443bAsTag(response2
, sizeof(response2
)); 
 374         uint8_t *resp2Code 
= BigBuf_malloc(ToSendMax
); 
 375         memcpy(resp2Code
, ToSend
, ToSendMax
);  
 376         uint16_t resp2CodeLen 
= ToSendMax
; 
 378         // We need to listen to the high-frequency, peak-detected path. 
 379         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 386                 if(!GetIso14443bCommandFromReader(receivedCmd
, &len
)) { 
 387                 Dbprintf("button pressed, received %d commands", cmdsRecvd
); 
 392                         LogTrace(receivedCmd
, len
, 0, 0, parity
, 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; 
 448                 // clear receiving shift register and holding register 
 449                 while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
 450                 c 
= AT91C_BASE_SSC
->SSC_RHR
; (void) c
; 
 451                 while(!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)); 
 452                 c 
= AT91C_BASE_SSC
->SSC_RHR
; (void) c
; 
 455                 AT91C_BASE_SSC
->SSC_THR 
= 0x00; 
 457                 // Transmit the response. 
 458                 uint16_t FpgaSendQueueDelay 
= 0; 
 460                 for(;i 
< respCodeLen
; ) { 
 461                         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 462                                 AT91C_BASE_SSC
->SSC_THR 
= respCode
[i
++]; 
 463                                 FpgaSendQueueDelay 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 465                                 if(BUTTON_PRESS()) break; 
 468                 // Ensure that the FPGA Delay Queue is empty before we switch to TAGSIM_LISTEN again: 
 469                 uint8_t fpga_queued_bits 
= FpgaSendQueueDelay 
>> 3; 
 470                 for (i 
= 0; i 
<= fpga_queued_bits
/8 + 1; ) { 
 471                         if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 472                                 AT91C_BASE_SSC
->SSC_THR 
= 0x00; 
 473                                 FpgaSendQueueDelay 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 478                 // trace the response: 
 479                 if (tracing
) LogTrace(resp
, respLen
, 0, 0, parity
, FALSE
);                       
 485 //============================================================================= 
 486 // An ISO 14443 Type B reader. We take layer two commands, code them 
 487 // appropriately, and then send them to the tag. We then listen for the 
 488 // tag's response, which we leave in the buffer to be demodulated on the 
 490 //============================================================================= 
 495                 DEMOD_PHASE_REF_TRAINING
, 
 496                 DEMOD_AWAITING_FALLING_EDGE_OF_SOF
, 
 497                 DEMOD_GOT_FALLING_EDGE_OF_SOF
, 
 498                 DEMOD_AWAITING_START_BIT
, 
 504 /* this had been used to add RSSI (Received Signal Strength Indication) to traces. Currently not implemented. 
 516  * Handles reception of a bit from the tag 
 518  * This function is called 2 times per bit (every 4 subcarrier cycles). 
 519  * Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 4,72us 
 522  * LED C -> ON once we have received the SOF and are expecting the rest. 
 523  * LED C -> OFF once we have received EOF or are unsynced 
 525  * Returns: true if we received a EOF 
 526  *          false if we are still waiting for some more 
 529  #define abs(x) ( ((x)<0) ? -(x) : (x) ) 
 530 static RAMFUNC 
int Handle14443bSamplesDemod(int ci
, int cq
) 
 535         int halfci 
= (ai 
>> 1); 
 536         int halfcq 
= (aq 
>> 1); 
 538 // The soft decision on the bit uses an estimate of just the 
 539 // quadrant of the reference angle, not the exact angle. 
 540 #define MAKE_SOFT_DECISION() { \ 
 541                 if(Demod.sumI > 0) { \ 
 546                 if(Demod.sumQ > 0) { \ 
 553 #define SUBCARRIER_DETECT_THRESHOLD     8 
 555 // Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by max(abs(ci),abs(cq)) + 1/2*min(abs(ci),abs(cq))) 
 556 #define CHECK_FOR_SUBCARRIER() { \ 
 557                 v = MAX(ai, aq) + MIN(halfci, halfcq); \ 
 561         switch(Demod
.state
) { 
 563                         CHECK_FOR_SUBCARRIER(); 
 564                         if(v 
> SUBCARRIER_DETECT_THRESHOLD
) {   // subcarrier detected 
 565                                 Demod
.state 
= DEMOD_PHASE_REF_TRAINING
; 
 572                 case DEMOD_PHASE_REF_TRAINING
: 
 573                         if(Demod
.posCount 
< 8) { 
 574                         //if(Demod.posCount < 10*2) { 
 575                                 CHECK_FOR_SUBCARRIER(); 
 576                                 if (v 
> SUBCARRIER_DETECT_THRESHOLD
) { 
 577                                         // set the reference phase (will code a logic '1') by averaging over 32 1/fs. 
 578                                         // note: synchronization time > 80 1/fs 
 582                                 } else {                // subcarrier lost 
 583                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 586                                 Demod
.state 
= DEMOD_AWAITING_FALLING_EDGE_OF_SOF
; 
 590                 case DEMOD_AWAITING_FALLING_EDGE_OF_SOF
: 
 591                         MAKE_SOFT_DECISION(); 
 592                         //Dbprintf("ICE: %d %d %d %d %d", v, Demod.sumI, Demod.sumQ, ci, cq ); 
 593                         if(v 
<= 0) {    // logic '0' detected 
 594                                 Demod
.state 
= DEMOD_GOT_FALLING_EDGE_OF_SOF
; 
 595                                 Demod
.posCount 
= 0;     // start of SOF sequence 
 597                                 if(Demod
.posCount 
> 25*2) {     // maximum length of TR1 = 200 1/fs 
 598                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 604                 case DEMOD_GOT_FALLING_EDGE_OF_SOF
: 
 606                         MAKE_SOFT_DECISION(); 
 608                                 if(Demod
.posCount 
< 10*2) { // low phase of SOF too short (< 9 etu). Note: spec is >= 10, but FPGA tends to "smear" edges 
 609                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 611                                         LED_C_ON(); // Got SOF 
 612                                         Demod
.state 
= DEMOD_AWAITING_START_BIT
; 
 615 /* this had been used to add RSSI (Received Signal Strength Indication) to traces. Currently not implemented. 
 621                                 if(Demod
.posCount 
> 13*2) { // low phase of SOF too long (> 12 etu) 
 622                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 628                 case DEMOD_AWAITING_START_BIT
: 
 630                         MAKE_SOFT_DECISION(); 
 632                                 if(Demod
.posCount 
> 3*2) {              // max 19us between characters = 16 1/fs, max 3 etu after low phase of SOF = 24 1/fs 
 633                                         Demod
.state 
= DEMOD_UNSYNCD
; 
 636                         } else {                                                        // start bit detected 
 638                                 Demod
.posCount 
= 1;                             // this was the first half 
 641                                 Demod
.state 
= DEMOD_RECEIVING_DATA
; 
 645                 case DEMOD_RECEIVING_DATA
: 
 646                         MAKE_SOFT_DECISION(); 
 647                         if(Demod
.posCount 
== 0) {                       // first half of bit 
 650                         } else {                                                        // second half of bit 
 653 /* this had been used to add RSSI (Received Signal Strength Indication) to traces. Currently not implemented. 
 654                                 if(Demod.thisBit > 0) { 
 655                                         Demod.metric += Demod.thisBit; 
 657                                         Demod.metric -= Demod.thisBit; 
 662                                 Demod
.shiftReg 
>>= 1; 
 663                                 if(Demod
.thisBit 
> 0) { // logic '1' 
 664                                         Demod
.shiftReg 
|= 0x200; 
 668                                 if(Demod
.bitCount 
== 10) { 
 669                                         uint16_t s 
= Demod
.shiftReg
; 
 670                                         if((s 
& 0x200) && !(s 
& 0x001)) { // stop bit == '1', start bit == '0' 
 671                                                 uint8_t b 
= (s 
>> 1); 
 672                                                 Demod
.output
[Demod
.len
] = b
; 
 674                                                 Demod
.state 
= DEMOD_AWAITING_START_BIT
; 
 676                                                 Demod
.state 
= DEMOD_UNSYNCD
; 
 679                                                         // This is EOF (start, stop and all data bits == '0' 
 689                         Demod
.state 
= DEMOD_UNSYNCD
; 
 697 static void DemodReset() 
 699         // Clear out the state of the "UART" that receives from the tag. 
 701         Demod
.state 
= DEMOD_UNSYNCD
; 
 708         memset(Demod
.output
, 0x00, MAX_FRAME_SIZE
); 
 712 static void DemodInit(uint8_t *data
) 
 720  *  Demodulate the samples we received from the tag, also log to tracebuffer 
 721  *  quiet: set to 'TRUE' to disable debug output 
 723 static void GetSamplesFor14443bDemod(int n
, bool quiet
) 
 726         bool gotFrame 
= FALSE
; 
 727         int lastRxCounter
, ci
, cq
, samples 
= 0; 
 729         // Allocate memory from BigBuf for some buffers 
 730         // free all previous allocations first 
 733         // And put the FPGA in the appropriate mode 
 734         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ
); 
 736         // The response (tag -> reader) that we're receiving. 
 737         // Set up the demodulator for tag -> reader responses. 
 738         DemodInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
 740         // The DMA buffer, used to stream samples from the FPGA 
 741         int8_t *dmaBuf 
= (int8_t*) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE
); 
 743         // Setup and start DMA. 
 744         FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO14443B_DMA_BUFFER_SIZE
); 
 746         int8_t *upTo 
= dmaBuf
; 
 747         lastRxCounter 
= ISO14443B_DMA_BUFFER_SIZE
; 
 749         // Signal field is ON with the appropriate LED: 
 752                 int behindBy 
= lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
; 
 753                 if(behindBy 
> max
) max 
= behindBy
; 
 755                 while(((lastRxCounter
-AT91C_BASE_PDC_SSC
->PDC_RCR
) & (ISO14443B_DMA_BUFFER_SIZE
-1)) > 2) { 
 759                         if(upTo 
>= dmaBuf 
+ ISO14443B_DMA_BUFFER_SIZE
) { 
 761                                 AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) upTo
; 
 762                                 AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO14443B_DMA_BUFFER_SIZE
; 
 765                         if(lastRxCounter 
<= 0) { 
 766                                 lastRxCounter 
= ISO14443B_DMA_BUFFER_SIZE
; 
 772                         gotFrame 
= Handle14443bSamplesDemod(ci 
, cq 
); 
 777                 if(samples 
> n 
|| gotFrame
) { 
 782         AT91C_BASE_PDC_SSC
->PDC_PTCR 
= AT91C_PDC_RXTDIS
; 
 784         if (!quiet 
&& Demod
.len 
== 0) { 
 785                 Dbprintf("max behindby = %d, samples = %d, gotFrame = %d, Demod.len = %d, Demod.sumI = %d, Demod.sumQ = %d", 
 796         if (tracing 
&& Demod
.len 
> 0) { 
 797                 uint8_t parity
[MAX_PARITY_SIZE
]; 
 798                 LogTrace(Demod
.output
, Demod
.len
, 0, 0, parity
, FALSE
); 
 803 //----------------------------------------------------------------------------- 
 804 // Transmit the command (to the tag) that was placed in ToSend[]. 
 805 //----------------------------------------------------------------------------- 
 806 static void TransmitFor14443b(void) 
 812         while(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 813                 AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 816         // Signal field is ON with the appropriate Red LED 
 818         // Signal we are transmitting with the Green LED 
 820         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX 
| FPGA_HF_READER_TX_SHALLOW_MOD
); 
 822         for(c 
= 0; c 
< 10;) { 
 823                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 824                         AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 827                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 828                         volatile uint32_t r 
= AT91C_BASE_SSC
->SSC_RHR
; 
 836                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 837                         AT91C_BASE_SSC
->SSC_THR 
= ToSend
[c
]; 
 843                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 844                         volatile uint32_t r 
= AT91C_BASE_SSC
->SSC_RHR
; 
 849         LED_B_OFF(); // Finished sending 
 853 //----------------------------------------------------------------------------- 
 854 // Code a layer 2 command (string of octets, including CRC) into ToSend[], 
 855 // so that it is ready to transmit to the tag using TransmitFor14443b(). 
 856 //----------------------------------------------------------------------------- 
 857 static void CodeIso14443bAsReader(const uint8_t *cmd
, int len
) 
 864         // Establish initial reference level 
 865         for(i 
= 0; i 
< 40; i
++) { 
 869         for(i 
= 0; i 
< 11; i
++) { 
 873         for(i 
= 0; i 
< len
; i
++) { 
 881                 for(j 
= 0; j 
< 8; j
++) { 
 892         for(i 
= 0; i 
< 11; i
++) { 
 895         for(i 
= 0; i 
< 8; i
++) { 
 899         // And then a little more, to make sure that the last character makes 
 900         // it out before we switch to rx mode. 
 901         for(i 
= 0; i 
< 10; i
++) { 
 905         // Convert from last character reference to length 
 911   Convenience function to encode, transmit and trace iso 14443b comms 
 913 static void CodeAndTransmit14443bAsReader(const uint8_t *cmd
, int len
) 
 915         CodeIso14443bAsReader(cmd
, len
); 
 918                 uint8_t parity
[MAX_PARITY_SIZE
]; 
 919                 LogTrace(cmd
,len
, 0, 0, parity
, TRUE
); 
 923 /* Sends an APDU to the tag 
 924  * TODO: check CRC and preamble 
 926 int iso14443b_apdu(uint8_t const *message
, size_t message_length
, uint8_t *response
) 
 928         uint8_t message_frame
[message_length 
+ 4]; 
 930         message_frame
[0] = 0x0A | pcb_blocknum
; 
 933         message_frame
[1] = 0; 
 935         memcpy(message_frame 
+ 2, message
, message_length
); 
 937         ComputeCrc14443(CRC_14443_B
, message_frame
, message_length 
+ 2, &message_frame
[message_length 
+ 2], &message_frame
[message_length 
+ 3]); 
 939         CodeAndTransmit14443bAsReader(message_frame
, message_length 
+ 4); 
 941         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
*100, TRUE
); 
 947         // copy response contents 
 950                 memcpy(response
, Demod
.output
, Demod
.len
); 
 955 /* Perform the ISO 14443 B Card Selection procedure 
 956  * Currently does NOT do any collision handling. 
 957  * It expects 0-1 cards in the device's range. 
 958  * TODO: Support multiple cards (perform anticollision) 
 959  * TODO: Verify CRC checksums 
 961 int iso14443b_select_card() 
 963         // WUPB command (including CRC) 
 964         // Note: WUPB wakes up all tags, REQB doesn't wake up tags in HALT state 
 965         static const uint8_t wupb
[] = { 0x05, 0x00, 0x08, 0x39, 0x73 }; 
 966         // ATTRIB command (with space for CRC) 
 967         uint8_t attrib
[] = { 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}; 
 969         // first, wake up the tag 
 970         CodeAndTransmit14443bAsReader(wupb
, sizeof(wupb
)); 
 971         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, TRUE
); 
 979     // copy the PUPI to ATTRIB 
 980     memcpy(attrib 
+ 1, Demod
.output 
+ 1, 4); 
 981     /* copy the protocol info from ATQB (Protocol Info -> Protocol_Type) into 
 983     attrib
[7] = Demod
.output
[10] & 0x0F; 
 984     ComputeCrc14443(CRC_14443_B
, attrib
, 9, attrib 
+ 9, attrib 
+ 10); 
 985     CodeAndTransmit14443bAsReader(attrib
, sizeof(attrib
)); 
 986     GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, TRUE
); 
 987     // Answer to ATTRIB too short? 
 992         // reset PCB block number 
 997 // Set up ISO 14443 Type B communication (similar to iso14443a_setup) 
 998 void iso14443b_setup() { 
1000         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1003         // Set up the synchronous serial port 
1005         // connect Demodulated Signal to ADC: 
1006         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1008         // Signal field is on with the appropriate LED 
1010         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX 
| FPGA_HF_READER_TX_SHALLOW_MOD
); 
1015         //StartCountSspClk(); 
1021 //----------------------------------------------------------------------------- 
1022 // Read a SRI512 ISO 14443B tag. 
1024 // SRI512 tags are just simple memory tags, here we're looking at making a dump 
1025 // of the contents of the memory. No anticollision algorithm is done, we assume 
1026 // we have a single tag in the field. 
1028 // I tried to be systematic and check every answer of the tag, every CRC, etc... 
1029 //----------------------------------------------------------------------------- 
1030 void ReadSTMemoryIso14443b(uint32_t dwLast
) 
1032         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1040         // Make sure that we start from off, since the tags are stateful; 
1041         // confusing things will happen if we don't reset them between reads. 
1043         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1046         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1049         // Now give it time to spin up. 
1050         // Signal field is on with the appropriate LED 
1052         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ
); 
1055         // First command: wake up the tag using the INITIATE command 
1056         uint8_t cmd1
[] = {0x06, 0x00, 0x97, 0x5b}; 
1057         CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
1058         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, TRUE
); 
1060         if (Demod
.len 
== 0) { 
1061                 DbpString("No response from tag"); 
1065                 Dbprintf("Randomly generated Chip ID (+ 2 byte CRC): %02x %02x %02x", 
1066                                 Demod
.output
[0], Demod
.output
[1], Demod
.output
[2]); 
1069         // There is a response, SELECT the uid 
1070         DbpString("Now SELECT tag:"); 
1071         cmd1
[0] = 0x0E; // 0x0E is SELECT 
1072         cmd1
[1] = Demod
.output
[0]; 
1073         ComputeCrc14443(CRC_14443_B
, cmd1
, 2, &cmd1
[2], &cmd1
[3]); 
1074         CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
1075         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, TRUE
); 
1076         if (Demod
.len 
!= 3) { 
1077                 Dbprintf("Expected 3 bytes from tag, got %d", Demod
.len
); 
1081         // Check the CRC of the answer: 
1082         ComputeCrc14443(CRC_14443_B
, Demod
.output
, 1 , &cmd1
[2], &cmd1
[3]); 
1083         if(cmd1
[2] != Demod
.output
[1] || cmd1
[3] != Demod
.output
[2]) { 
1084                 DbpString("CRC Error reading select response."); 
1088         // Check response from the tag: should be the same UID as the command we just sent: 
1089         if (cmd1
[1] != Demod
.output
[0]) { 
1090                 Dbprintf("Bad response to SELECT from Tag, aborting: %02x %02x", cmd1
[1], Demod
.output
[0]); 
1095         // Tag is now selected, 
1096         // First get the tag's UID: 
1098         ComputeCrc14443(CRC_14443_B
, cmd1
, 1 , &cmd1
[1], &cmd1
[2]); 
1099         CodeAndTransmit14443bAsReader(cmd1
, 3); // Only first three bytes for this one 
1100         GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, TRUE
); 
1101         if (Demod
.len 
!= 10) { 
1102                 Dbprintf("Expected 10 bytes from tag, got %d", Demod
.len
); 
1106         // The check the CRC of the answer (use cmd1 as temporary variable): 
1107         ComputeCrc14443(CRC_14443_B
, Demod
.output
, 8, &cmd1
[2], &cmd1
[3]); 
1108         if(cmd1
[2] != Demod
.output
[8] || cmd1
[3] != Demod
.output
[9]) { 
1109                 Dbprintf("CRC Error reading block! Expected: %04x got: %04x", 
1110                                 (cmd1
[2]<<8)+cmd1
[3], (Demod
.output
[8]<<8)+Demod
.output
[9]); 
1111         // Do not return;, let's go on... (we should retry, maybe ?) 
1113         Dbprintf("Tag UID (64 bits): %08x %08x", 
1114                         (Demod
.output
[7]<<24) + (Demod
.output
[6]<<16) + (Demod
.output
[5]<<8) + Demod
.output
[4], 
1115                         (Demod
.output
[3]<<24) + (Demod
.output
[2]<<16) + (Demod
.output
[1]<<8) + Demod
.output
[0]); 
1117         // Now loop to read all 16 blocks, address from 0 to last block 
1118         Dbprintf("Tag memory dump, block 0 to %d", dwLast
); 
1124                         DbpString("System area block (0xff):"); 
1128                 ComputeCrc14443(CRC_14443_B
, cmd1
, 2, &cmd1
[2], &cmd1
[3]); 
1129                 CodeAndTransmit14443bAsReader(cmd1
, sizeof(cmd1
)); 
1130                 GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, TRUE
); 
1131                 if (Demod
.len 
!= 6) { // Check if we got an answer from the tag 
1132                 DbpString("Expected 6 bytes from tag, got less..."); 
1135                 // The check the CRC of the answer (use cmd1 as temporary variable): 
1136                 ComputeCrc14443(CRC_14443_B
, Demod
.output
, 4, &cmd1
[2], &cmd1
[3]); 
1137                         if(cmd1
[2] != Demod
.output
[4] || cmd1
[3] != Demod
.output
[5]) { 
1138                         Dbprintf("CRC Error reading block! Expected: %04x got: %04x", 
1139                                         (cmd1
[2]<<8)+cmd1
[3], (Demod
.output
[4]<<8)+Demod
.output
[5]); 
1140                 // Do not return;, let's go on... (we should retry, maybe ?) 
1142                 // Now print out the memory location: 
1143                 Dbprintf("Address=%02x, Contents=%08x, CRC=%04x", i
, 
1144                                 (Demod
.output
[3]<<24) + (Demod
.output
[2]<<16) + (Demod
.output
[1]<<8) + Demod
.output
[0], 
1145                                 (Demod
.output
[4]<<8)+Demod
.output
[5]); 
1156 //============================================================================= 
1157 // Finally, the `sniffer' combines elements from both the reader and 
1158 // simulated tag, to show both sides of the conversation. 
1159 //============================================================================= 
1161 //----------------------------------------------------------------------------- 
1162 // Record the sequence of commands sent by the reader to the tag, with 
1163 // triggering so that we start recording at the point that the tag is moved 
1165 //----------------------------------------------------------------------------- 
1167  * Memory usage for this function, (within BigBuf) 
1168  * Last Received command (reader->tag) - MAX_FRAME_SIZE 
1169  * Last Received command (tag->reader) - MAX_FRAME_SIZE 
1170  * DMA Buffer - ISO14443B_DMA_BUFFER_SIZE 
1171  * Demodulated samples received - all the rest 
1173 void RAMFUNC 
SnoopIso14443b(void) 
1175         // We won't start recording the frames that we acquire until we trigger; 
1176         // a good trigger condition to get started is probably when we see a 
1177         // response from the tag. 
1178         int triggered 
= TRUE
;                   // TODO: set and evaluate trigger condition 
1180         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1186         // The DMA buffer, used to stream samples from the FPGA 
1187         int8_t *dmaBuf 
= (int8_t*) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE
); 
1191         int maxBehindBy 
= 0; 
1193         // Count of samples received so far, so that we can include timing 
1194         // information in the trace buffer. 
1197         DemodInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
1198         UartInit(BigBuf_malloc(MAX_FRAME_SIZE
)); 
1200         // Print some debug information about the buffer sizes 
1201         Dbprintf("Snooping buffers initialized:"); 
1202         Dbprintf("  Trace: %i bytes", BigBuf_max_traceLen()); 
1203         Dbprintf("  Reader -> tag: %i bytes", MAX_FRAME_SIZE
); 
1204         Dbprintf("  tag -> Reader: %i bytes", MAX_FRAME_SIZE
); 
1205         Dbprintf("  DMA: %i bytes", ISO14443B_DMA_BUFFER_SIZE
); 
1207         // Signal field is off, no reader signal, no tag signal 
1210         // And put the FPGA in the appropriate mode 
1211         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| FPGA_HF_READER_RX_XCORR_SNOOP
); 
1212         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1214         // Setup for the DMA. 
1217         lastRxCounter 
= ISO14443B_DMA_BUFFER_SIZE
; 
1218         FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO14443B_DMA_BUFFER_SIZE
); 
1219         uint8_t parity
[MAX_PARITY_SIZE
]; 
1221         bool TagIsActive 
= FALSE
; 
1222         bool ReaderIsActive 
= FALSE
; 
1224         // And now we loop, receiving samples. 
1226                 int behindBy 
= (lastRxCounter 
- AT91C_BASE_PDC_SSC
->PDC_RCR
) & 
1227                                                                 (ISO14443B_DMA_BUFFER_SIZE
-1); 
1228                 if(behindBy 
> maxBehindBy
) { 
1229                         maxBehindBy 
= behindBy
; 
1232                 if(behindBy 
< 2) continue; 
1238                 if(upTo 
>= dmaBuf 
+ ISO14443B_DMA_BUFFER_SIZE
) { 
1240                         lastRxCounter 
+= ISO14443B_DMA_BUFFER_SIZE
; 
1241                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
; 
1242                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO14443B_DMA_BUFFER_SIZE
; 
1244                         if(behindBy 
> (9*ISO14443B_DMA_BUFFER_SIZE
/10)) { // TODO: understand whether we can increase/decrease as we want or not? 
1245                                 Dbprintf("blew circular buffer! behindBy=%d", behindBy
); 
1249                                 DbpString("Reached trace limit"); 
1252                         if(BUTTON_PRESS()) { 
1253                                 DbpString("cancelled"); 
1260                 if (!TagIsActive
) {                                                     // no need to try decoding reader data if the tag is sending 
1261                         if(Handle14443bUartBit(ci 
& 0x01)) { 
1262                         if(triggered 
&& tracing
) { 
1263                                         LogTrace(Uart
.output
, Uart
.byteCnt
, samples
, samples
, parity
, TRUE
); 
1265                         /* And ready to receive another command. */ 
1267                         /* And also reset the demod code, which might have been */ 
1268                         /* false-triggered by the commands from the reader. */ 
1271                         if(Handle14443bUartBit(cq 
& 0x01)) { 
1272                         if(triggered 
&& tracing
) { 
1273                                         LogTrace(Uart
.output
, Uart
.byteCnt
, samples
, samples
, parity
, TRUE
); 
1275                         /* And ready to receive another command. */ 
1277                         /* And also reset the demod code, which might have been */ 
1278                         /* false-triggered by the commands from the reader. */ 
1281                         ReaderIsActive 
= (Uart
.state 
> STATE_GOT_FALLING_EDGE_OF_SOF
); 
1284                 if(!ReaderIsActive
) {                                           // no need to try decoding tag data if the reader is sending - and we cannot afford the time 
1285                         // is this | 0x01 the error?   & 0xfe  in https://github.com/Proxmark/proxmark3/issues/103 
1286                         if(Handle14443bSamplesDemod(ci 
& 0xfe, cq 
& 0xfe)) { 
1288                         //Use samples as a time measurement 
1291                                 //uint8_t parity[MAX_PARITY_SIZE]; 
1292                                 LogTrace(Demod
.output
, Demod
.len
, samples
, samples
, parity
, FALSE
); 
1296                         // And ready to receive another response. 
1299                         TagIsActive 
= (Demod
.state 
> DEMOD_GOT_FALLING_EDGE_OF_SOF
); 
1303         FpgaDisableSscDma(); 
1307         AT91C_BASE_PDC_SSC
->PDC_PTCR 
= AT91C_PDC_RXTDIS
; 
1308         DbpString("Snoop statistics:"); 
1309         Dbprintf("  Max behind by: %i", maxBehindBy
); 
1310         Dbprintf("  Uart State: %x", Uart
.state
); 
1311         Dbprintf("  Uart ByteCnt: %i", Uart
.byteCnt
); 
1312         Dbprintf("  Uart ByteCntMax: %i", Uart
.byteCntMax
); 
1313         Dbprintf("  Trace length: %i", BigBuf_get_traceLen()); 
1318  * Send raw command to tag ISO14443B 
1320  * datalen     len of buffer data 
1321  * recv        bool when true wait for data from tag and send to client 
1322  * powerfield  bool leave the field on when true 
1323  * data        buffer with byte to send 
1329 void SendRawCommand14443B(uint32_t datalen
, uint32_t recv
, uint8_t powerfield
, uint8_t data
[]) 
1333         if ( datalen 
== 0 && recv 
== 0 && powerfield 
== 0){ 
1337                 CodeAndTransmit14443bAsReader(data
, datalen
); 
1341                 GetSamplesFor14443bDemod(RECEIVE_SAMPLES_TIMEOUT
, FALSE
); 
1342                 uint16_t iLen 
= MIN(Demod
.len
, USB_CMD_DATA_SIZE
); 
1343                 cmd_send(CMD_ACK
, iLen
, 0, 0, Demod
.output
, iLen
); 
1347                 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1348                 FpgaDisableSscDma();