Development v12

Warning - Product Update

All the resources present on this section belong to Waspmote v12, Waspmote Plug & Sense! v12 and Meshlium v3.8.

If you have a Waspmote v15, Waspmote Plug & Sense! v15 or Meshlium v4.0 please go to the new Development Section.

Check what is your version and what are the differences between the old and the new one in this document.

» RFID1356 05: Password Simple

This sketch changes the keys and access conditions in a block and checks the block can be accessed with the new conditions. Then changes the keys and access conditions to the original values and checks again.

Required Materials

1 x Waspmote
1 x Battery
1 x Coin cell
1 x RFID 13.56MHz board
1 x RFID 13.56MHz antenna
1 x RFID Tag

Notes

- Remember to connect the battery to Waspmote for proper operation.
- Don't write address 0, 3, 7, 11, 15, ... if you are not an advanced user. You could leave your tag unaccessible.
- Address 0 contains the IC manufacturer data. This block has read-only access.
- Address 3, 7, 11 contains the secret keys A and B. Writing in them will change access keys and conditions.
- This example can be executed in Waspmote v12 and Waspmote v15

Code

/*   
 *  ------[RFID1356_05] Password Simple -------- 
 *   
 *  Explanation: This sketch changes the keys and access conditions in a 
 *  block and checks the block can be accessed with the new conditions. 
 *  Then changes the keys and access conditions to the original values and 
 *  checks again. 
 *   
 *  Copyright (C) 2015 Libelium Comunicaciones Distribuidas S.L. 
 *  http://www.libelium.com 
 * 
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 * 
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
 *  GNU General Public License for more details. 
 * 
 *  You should have received a copy of the GNU General Public License 
 *  along with this program. If not, see <http://www.gnu.org/licenses/>.
 * 
 *  Version:                0.3 
 *  Design:                 David Gascon 
 *  Implementation:         Javier Solobera, Ahmad Saad 
 */

#include <WaspRFID13.h>

// stores the status of the executed command: 
short state; 

// data buffer: 
blockData data; 

// little buffer for the ATQ-A (answer to request):
ATQ ans;

// stores the UID (unique identifier) of a card: 
UIdentifier UID;

// stores the key or password: 
KeyAccess keyOld= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 
KeyAccess keyA  = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1}; 
KeyAccess keyB  = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 

// only edit if strong knowledge about the RFID/NFC module 
unsigned char config[] = { 0xFF, 0x07, 0x80, 0x69};  

// define SECTOR TRAILER address
// Possibilities are: 3/7/11/15/19/23...
///////////////////////////////////
int address = 19; 
///////////////////////////////////

void setup() 
{ 
  USB.ON(); 
  USB.println(F("RFID_05 Example")); 

  USB.println(F("************************************************"));
  USB.println(F("|                  --WARNING--                 |"));
  USB.println(F("|Do not remove card during key changing process|"));
  USB.println(F("************************************************"));

  ////////////////////////////////////////////////////////////////////
  // switchs on the RFID/NFC @ 13.56 MHZ module, and asigns the socket 
  ////////////////////////////////////////////////////////////////////
  RFID13.ON(SOCKET0); 
  USB.println(F("RFID/NFC @ 13.56 MHz module started")); 
} 



void loop() 
{ 
  USB.println(F("\r\n++++++++++++++++++++++++++++++++++++")); 

  //////////////////////////
  // 1. Init the RFID reader 
  //////////////////////////
  state = RFID13.init(UID, ans); 
  
  // if so, there is no card on the EM field 
  if (state == 1) 
  { 
    USB.print(F("\r\nRequest error - no card found")); 
  } 
  else // a card was found 
  { 
    USB.println(F("A card was found"));
    USB.print(F("Request | Answer: ")); 
    RFID13.print(ans, 2);  // show the ATQ  
    
    // show the UID (Unique IDentifier) of the read card (4 bytes) 
    USB.print(F("UID: ")); 
    RFID13.print(UID, 4);  
    
    // show the address to be 
    USB.print(F("Trailer block address: ")); 
    USB.println(address);   
    USB.println();   
    
    //////////////////   
    // 2. Set new keyA 
    //////////////////
    state = RFID13.setKeys(UID, keyOld, keyA, keyB, config, data, address); 
    
    USB.print(F("1) Write new key, state: ")); 
    USB.printHex(state); 
    
    // check state
    if (state == 0) 
    { 
      USB.println(F(" --> correct key change ")); 
    } 
    else 
    { 
      USB.println(F(" --> ** ERROR: keys not changed ** ")); 
    } 
  
    /////////////////////////////////////  
    // 3.  Authenticate with the new keyA
    /////////////////////////////////////   
    state = RFID13.authenticate(UID, address , keyA); 
    USB.print(F("2) Authentication block: ")); 
    USB.printHex(state); 

    // check state
    if (state == 0) 
    { 
      USB.println(F(" --> correct authentication ")); 
    } 
    else 
    { 
      USB.println(F(" --> ** ERROR: bad authentication ** ")); 
    } 
    
    /////////////////////////////////////////////////////////////////////////
    // 4. Read the content of the new control block ('keyA' always returns 0)
    ///////////////////////////////////////////////////////////////////////// 
    state = RFID13.read(address ,data); 
    USB.print(F("3) Read trailer block:   ")); 
    USB.printHex(state); 
    USB.print(F(" | Answer: ")); 
    RFID13.print(data, 16); 
    
    /////////////////////////////////////////////////////////      
    // 5. Authenticate again with keyA and read another block
    /////////////////////////////////////////////////////////  
   
    // authenticate again, now with the new key A 
    state = RFID13.authenticate(UID,address-1, keyA); 
    USB.print(F("4.1) Authentication block: ")); 
    USB.printHex(state);
    USB.println(); 
    
    // read previous block 
    state = RFID13.read(address-1 , data); 
    USB.print(F("4.2) Read previous block, state:  ")); 
    USB.printHex(state); 
    USB.print(F(" | Answer: ")); 
    if (state == 0) 
    { 
      RFID13.print(data, 16); 
    } 
    
    //////////////////////////////////////////     
    // 6. Set old original key instead of keyA
    ////////////////////////////////////////// 
    state = RFID13.setKeys(UID, keyA, keyOld, keyB, config, data, address); 
    USB.print(F("5) Write new key, state: ")); 
    USB.printHex(state); 
    
    // check state
    if (state == 0) 
    { 
      USB.println(F(" --> correct key change to the original")); 
    } 
    else 
    { 
      USB.println(F(" --> ** ERROR: keys not changed ** ")); 
    } 

    //////////////////////////////////////////     
    // 7. Authenticate with the original key A 
    //////////////////////////////////////////     
    state = RFID13.authenticate(UID, address , keyOld); 
    USB.print(F("6) Authentication mem block  : ")); 
    USB.printHex(state);
   
    // check state 
    if (state == 0) 
    { 
      USB.print(F(" --> success to authenticate with original key. All changes undone.")); 
    } 
    else 
    { 
      USB.print(F(" --> ** ERROR: bad authentication ** ")); 
    } 
  } 
  USB.println(F("\r\n++++++++++++++++++++++++++++++++++++")); 
  delay(3000); // wait some time in each loop 
}

Output

Request | Answer: 0 4

AnticollSelect: 0 | Answer: 2E F6 6F 4A

**write new key, state: 0 --> correct key change
**Authentication block: 0 --> correct authentication
**Read trailer block: 0 | Answer: 0 0 0 0 0 0 FF 7 80 69 FF FF FF FF FF FF

**Authentication block: 0
**Read mem block, state: 0 | Answer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

**write new key, state: 0 --> correct key change to the original
**Authentication mem block : 0 --> success to authenticate with original key. All changes undone.

Quick Publish: