2014年4月30日 星期三

用 PN532 讀取 Mifare 卡

NFC, 近場通信, 一種短距離無線通信, 最早用於門禁卡, 現在則多了購物卡, 以及數位裝置通信
其原理是讀卡機發出小範圍 (即小功率) 的電磁波, 頻率為 13.56 MHz
當卡片靠近時, 卡片藉由線圈電磁感應產生工作用電流, 因此卡片可以不用裝電池
卡片上 IC 會收一部份電磁波當電源, 一部分當 clock, 一部份是資料
數位 IC 大多依賴 clock 來做事情, 連 clock 都從線圈來, 所以也不用振盪器
這些資料和能量都被調變到無線電後從讀卡機天線發出
然後卡片 IC 上各區電路各自解調出自己要的資料使用
這種無線有個規範叫 ISO/IEC 14443/RFID 標準, Atmel 有寫份文件簡單介紹, 可搜尋這 :

Understanding the Requirements of ISO/IEC 14443 for Type B Proximity Contactless Identification Cards

這些資料之所以可以混在一起送出, 又分別被解開, 印象中是各信號都是互相正交的
怎麼個正交法我早忘光了, 以前學通信系統都用背的, 一堆工程數學的頻率域轉換
複數空間積來積去, 念到最後我都不知道在積什麼小朋友了XD
所以很抱歉這部份我沒法做介紹, 我也只看個大概懂, 只能說想出這辦法的人真是天才



這種 RF 的東西很難搞, 所以很明顯的, 如同前篇玩 nRF24L01 的那篇一樣
我拿現成的模組來實驗, 這次選用的是 PN532 這顆晶片
這顆的後繼型號廣泛的用在手機上, 不過難以取得, 資料也都保密
所以我退而求其次, 這顆有公開資料而且模組板特多, 容易取得, 可以玩玩
使用這顆晶片務必下載一份文件標題是 UM0701-02 PN532 User Manual
它會說明如何操作這顆晶片
這文件頁數挺多的...所以要入門可以先從別人的範例碼下手
然後從範例碼回去參考使用手冊, 再逐漸摸通
通信的東西都是一堆協議, 就像網路瀏覽一樣
從最底下實體層的 MAC, 往上是 TCP/IP, 然後才是 HTTP
NFC 也是如此, 只是層數沒這麼多, 上層有五六種
除非工作或學術上需要, 不然一般是不會想全精通的
所以這次我也只玩其中一種, 叫做 Mifare 卡, 也就是門禁卡最常用的協議
最底層就是上面的 ISO14443, 然後基於此, 上面加上 Mifare 協議

Mifare 協議結構很簡單, 傳送給卡片時第一個 byte 是指令, 後面的是參數
從卡片接收資料時第一個 byte 是狀態, 剩下的是資料
這狀態有點像函數傳回值, 通常 0 代表 OK, 若是其他數字就可能是失敗
溝通時要先驗證, 也就是類似輸入密碼, 例如我想讀卡上第一區資料
我要先下指令 0x60, 後面一個 byte 寫 0 代表第一區
然後再接 6 bytes 的驗證碼, 最後 4 bytes 的 UID
如果傳回 0 我們才可以繼續下指令索取第一區的資料
若沒過, 就算下讀取指令也不會有資料回來
所以這種卡是有運算的, 故又稱智慧卡, 它不是像隨身碟那樣只存資料
以我社區的門禁卡來說它就沒有改過驗證碼, 輸入 6 個 0xFF 就通過, 而公司的門禁卡就不行
6 個 byte 就是 48-bit, 從 0 試到 6 個 0xFF 可不是開玩笑的, 所以別做這種傻事XD

有了上層協議, 我們要繼續往下走, 透過 PN532 這個 "實體層" 來把資料發出
PN532 的溝通有點複雜, 它有三種界面可選, UART, I2C, 和 SPI, 三選一
接著依據界面包裝特定格式的資料溝通, 例如我選 I2C


我們需要把資料包裝成 Information COMMAND frame
這種 frame 可以設定 PN532 暫存器, 要求 PN532 切模式, 讓 PN532 傳送資料等
所以如果要發送 Mifare 協議的資料, 就要把 Mifare 資料組成的封包再包進這 frame 中
並且在特定模式下才可將資料發送出去
接收時也是, 我們會收到 Information RESPONSE frame
第一個 byte 是狀態, 若讀到 0 就表示沒資料, 應停止, 要發送 I2C 的 STOP
若有, 狀態是 1, 就開始讀 I2C, 讀取長度要根據資料內容判斷, 蠻機車的XD
和以往走 I2C 讀感測器那種固定長度的讀法不同, 為此我重寫一個 I2C 的 ISR 來應付它

上面的 Information COMMAND frame, ACK frame, NACK frame 是由我們發出
剩下的則是 PN532 發出來的
和 PN532 通信有點像網路, 要先送指令, 然後 PN532 會回 ACK
接著 PN532 讀到資料後會發給我們, 然後我們要回 ACK
這樣的設計是要防止掉資料, 細節請翻使用手冊
以 I2C 來說, 我方回的 ACK 可以偷掉不做, 但 PN532 發出的 ACK 一定會有
所以我們寫一次資料通常要讀兩次, 一次 ACK, 以及一次資料回來
有沒有資料回來可以讀取 IRQ 腳, 當那隻腳拉低時表示有資料
它雖然取作 IRQ 不過並不像一般中斷是一個小脈衝
PN532 的 IRQ 是持續的拉低, 直到資料都讀完才會回高電位
因此我們可以用 loop 去檢查是否該讀資料, 不一定要接到 MCU 的外部中斷
當然, 還是可以接外部中斷, 如果需要反應迅速的話可以這樣做

PN532 的設計是它內部的 MCU 會把各項協議各個環節做成指令
我們就透過指令叫 PN532 的 MCU 進入某個狀態, 然後有資料後再叫它做其他事情
裡面的 MCU 會幫我們操作複雜的 RF 控制
我們只需要要求它進入某狀態, 而不用知道 RF 的細節
以 Mifare 卡來說就是這幾步:

1. 進入卡搜尋狀態, 可設定幾張卡(例:一次只抓一張), 以及什麼卡(例:走iso14443a協議的卡)
   接著等卡出現, 或是等重試次數超過, 這裡我設無上限重試, 也就是等到有卡為止
   所以此時 13.56MHz 電波會不斷發射, 也就是會消耗電流
   當有卡靠近, PN532 拉低 IRQ, 告訴我們有資料回來, 讀取完後應可得知卡的 UID

2. 若是 4-byte UID, 它應該會是一張類似門禁卡的卡或標籤, 這類卡需要認證才能讀資料
   於是設定 PN532 進入資料交換模式, 同時再參數中附上 Mifare 的封包
   也就是開頭指令後面參數那包
   接著等 PN532 和卡片溝通, 完成後 PN532 會把卡回的資料包入 frame 傳回
   解開 frame 檢查狀態, 若是 0 就繼續

3. 我們已經透過認證把指定區塊變成可讀寫, 再設定 PN532 進入資料交換模式
   參數一樣附上 Mifare 封包, 只是 Mifare 指令換成區塊讀取, 通常一個區塊是 16-byte
   等 PN532 和卡片溝通, 完成後 PN532 會把卡回的資料包入 frame 傳回

以上這些複雜的動作會在約數十個 ms 就做完

接著 demo, 這是我的測試環境
WT-10 這張板, 由於協議複雜, 這裡上的料是 Atmega32L, 線路一樣但是上料不同


藍色短路紅色空接


只接上 Vcc, I2C, IRQ, GND 就可以操控
PN532 (紅色 PCB 那張) 的 VCC 串上一顆 1N5819 的快速兩極體
因為我發現接上後 Vcc 抖動很誇張, 從 2.8V 震盪到 3.8V
導致 Atmega32L 不穩, 動作不正常, 觀察抖動頻率約 13MHz, 懷疑受 RF 影響
所以串一顆快速兩極體, 告訴它電送過去就不准給我回來XD
這不應該需要這樣做的, 不知道是我的 3.3V LDO 對高頻反應不及還是板子佈線有問題
目前沒有任何頭緒可解, RF 就是頭痛 ! 有請高手路過時指教一下
串上快速兩極體後 Vcc 震盪下降至 200mV, 雖然還是很多但它能正常工作了

後來加大 LDO 輸入端電容就好了, 好像只是因為電容裝太少, 偷過頭了XD

附上原始碼供參考
pn532-mifare.zip

上圖那是讀有改過驗證碼的卡, 它會傳回狀態 0x14 表示失敗
接著我讀這模組板附的鎖匙圈用的標籤




這是讀 Mifare Ultralight tag

這種標籤不用驗證, 且讀取一區塊為 32-byte
這個市面上不好買, 我是因為一些因素所以弄到一兩張, 順便測看看

門禁卡會用 UID 來識別, 而 UID 是無法修改的, 加上 48-bit 驗證碼
所以通常門禁卡是無法複製的
不過如果學更多 NFC 相關科技, 其實並不是完全沒辦法
主要需要一張 "比較特別的卡", 然後拿片模組裝成卡去騙一下驗證碼後寫入應該是可以達到目的
不過這種事情最好別做, 這有法律問題, 另外, 卡上資料通常和資料庫連動, 光改卡沒有任何意義
新聞:天才駭客破解悠遊卡 盜刷39元
我想並不是破解不完全, 而是後台資料庫都有紀錄, 比一下就會發現
所以學點技術混口飯吃就好, 不要去作怪

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。