Dnes se podíváme na to, jak odemknout váš počítač pomocí NFC karty či tagu pomocí Arduino Leonardo s NFC shieldem od ElecFreaks.
Tento projekt je nejen softwarově, ale i hardwarově nenáročný, jelikož potřebujeme pouze tři věci:
- Arduino Leonardo
- PN532 NFC shield
- 13,56MHz RFID kartu (lze také např. použít i bezkontaktní platební kartu)
Komponenty lze samozřejmě také koupit u bratrů šikmookých, ale ztrácíte tím záruku funkčnosti kódu.
Jak NFC funguje?
Jak tedy Near Field Communication funguje? Je to relativně jednoduché. Pojďme se podívat na obrázek vnitřního schematického zapojení.
Klíčovým komponentem NFC jsou cívky, které prakticky tvoří transformátor se vzdušným jádrem. Na kartě pak můžeme vidět modulační tranzistor a diodu s kondenzátorem. Ty tvoří jednoduchý nestabilizovaný zdroj pro funkci čipu samotného.
Nyní se podíváme na průběh přenášení dat. NFC kontrolér v NFC zařízení, v našem případě Arduino se shieldem, začne vysílat na frekvenci 13,56MHz, což je nosná frekvence pro náš typ NFC. Existují i varianty s nosnou frekvencí 125kHz a dokonce i 960MHz. Cívka na kartě bude na tento elektromagnetický signál reagovat indukcí proudu, kterým se začne čip na kartě napájet. Jakmile je čip napájen, začne produkovat data uložené v EEPROM. Tento proud dat začne souvisle zapínat a vypínat tranzistor, který začne zkratovat sekundární cívku L2. Tyto změny v amplitudě nosné frekvence – AM modulace – se projeví i na druhé cívce (L1) opět vlivem změn elektromagnetického pole, kde je pak NFC přijímač může zpět dekódovat na přijatelnější datový formát a převést např. na rozhraní SPI (Serial Peripheral Interface).
Výběr desky
Tolik k tomu, jak NFC funguje. Další věcí, kterou bych rád odůvodnil, je, proč musím použít Arduino Leonardo a ne oblíbené Uno. Je to z toho důvodu, že mikrokontrolér ATmega32u4, nacházející se na Leonardu, má díky vestavěnému USB můstku také podporu USB HID (Human Interface Device), což znamená, že se může chovat jako klávesnice či myš, čehož zde využíváme.
Zapojení
Nyní se vrhneme do zapojení. Je relativně složité, tak to teda zkusím nějak pochopitelně popsat. Nasaďte shield na Arduino
Software
Tak a teď když máme vše zapojené, je čas vrhnout se na software. Podotýkám, že kód je napsaný pro uživatele Windows 8, ačkoliv pak jak vám vysvětlím princip kódu, tak je možné ho upravit pro jakýkoliv OS. K provozu kódu budeme potřebovat NFC knihovnu od Adafruit a samozřejmě počítač, který chceme uzamknout.
Kód začíná jako obvykle přidáním potřebných knihoven následované vyjádřením globálních proměnných. Proměnná gooduid je UID vaší karty. UID karty lze zjistit pomocí příkladu readMifareClassic z této knihovny. Jakmile známe UID karty, kterou chceme počítač odemykat, tak to UID vložíme do kódu na řádku 11 místo toho UID ve složených závorkách. Dále se ve funkci setup() „zapnou“ knihovny, se kterými budeme pracovat. Nyní nastává „cyklovaná“ funkce loop(). Na začátku máme proměnné, které platí pouze v rámci této funkce, a jejich role jsou popsané v komentářích kódu. Teď nastává samotná logika kódu, která zní asi následovně. Našli-li jsme nějakou kartu v okolí, dáme to najevo proměnou cardFound. Pokud je cardFound pravda (True), tak zkontrolujeme počet UID znaků. Existují totiž dva typy těchto karet co se týče počtu UID znaků – 4 znaky nebo 7, ale 4 jsou nejčastější. Čili je-li nablízku karta, která má UID dlouhé 4 znaky, tak pomocí for cyklu zkontrolujeme shodnost znak po znaku. Narazíme-li ale na znak neshodný, nastavíme proměnou pass na nepravdu (False). V posledním kroku jednoduše zkontrolujeme pravdu této proměnné a v závislosti na tom pak využijeme vlastnost Arduino Leonarda USB HID a spustíme sekvenci kláves pro zadání hesla a tím pádem simulování zadávání hesla uživatelem počítače. Funkce z knihovny Keyboard.h jsou určeny pro klávesnici pro americké rozložení kláves, a proto musíme držet klávesu Shift při zadávání čísel (knihovna emuluje číslicové klávesy nacházející se nad písmenkovými klávesami). Také je důležité dbát na prohození kláves y/z, pokud máte heslo obsahující tato písmena. Kód zakončuje funkce delay() s hodnotou 1000ms.
#include <Wire.h> #include <SPI.h> #include <Adafruit_PN532.h> //zahrneme knihovny, které budeme používat #include <Keyboard.h> Adafruit_PN532 nfc(13, 12, 11, 10); //definujeme piny, které budeme používat pro komunikaci const uint8_t gooduid[] = { 0x77, 0xAF, 0xFF, 0xD6 }; //Zde bude UID karty, kterou chcete počítač odemykat bool pass = 0; //proměná pro uložení správnosti UID void setup() { nfc.begin(); Keyboard.begin(); //Nastartujeme knihovny nfc.SAMConfig(); } void loop() { bool cardFound; //proměná pro uložení, jestli byla jakákoliv karta přiložena uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; //proměná pro uložení UID přiložené karty uint8_t uidLength; //proměná pro uložení délky proměné "uid" cardFound = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength); if (cardFound) { //našla-li se karta... if (uidLength > 4) { break; //...a má UID o čtyřech znacích... } else { for (uint8_t i = 0; i < uidLength; i++) { if (gooduid[i] == uid[i]) { pass = 1; //...tak zkontroluj, zda-li se všechny UID znaky shodují. } else { pass = 0; //narazil-li jsi na znak neshodující se předlohou, break; //prohlaš přístup za nepovolený a přestaň hledat shody v UID. } } if (pass) { //byl-li přístup povolen... Keyboard.press(KEY_LEFT_SHIFT); Keyboard.print("1234"); //napiš klávesnicí heslo... Keyboard.releaseAll(); } } } delay(1000); //počkej jednu sekundu }
Tak, a to už je vše! Doufám, že byl článek aspoň do nějaké míry užitečný a edukativní. Byl bych také rád za nějakou tu zpětnou vazbu. Přeji všem úspěšné bastlení – nebo jak říkám já, tinkerování!