本文針對NT3H2111晶片DataSheet中有關Authenticate的内容進行整理彙總,用一種比較好了解的方式叙述
DataSheet下載下傳連結:https://www.nxp.com/docs/en/data-sheet/NT3H2111_2211.pdf
NFC技術的一個重要應用場景是,移動支付領域,是以相關的安全技術是必不可少的
對于這種安全認證技術,NXP公司的這款NT3H2111晶片,自然有很多優化的措施,本文介紹NXP這款産品是如何在晶片的層面完成密碼認證的機制的
下圖是NFC角度的NT3H2111晶片的memory組織方式
可以看到,從NFC的角度,晶片的第一層架構為sector,主要的東西都放在第一個sector裡面;第二層架構是page,每一個sector有255個page,;第三層架構是Byte,也就是位元組,一個Page有4個位元組
下面描述一下整個認證的過程:
首先,一開始的時候密碼保護狀态肯定是禁用的,這個時候請關注一下AUTH0這個位置,其實本質上AUTH0就是一個位于Sector0并且Page位址在E3h的第4個Byte(從0開始數是第4個)的那個Byte
AUTH0的作用是,指定在SECTOR0中,被保護的區域是從哪裡開始的,也就是被保護區域的起始位址。當然若AUTH0裡的值大于EBh,則密碼保護會被禁用
關于AUTH0,有一句話我還沒看明白,先挖個坑
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CN5YzNxUjYzEDN1QDNxE2NxYzXzUDOwETM4IzLcBTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
從NFC的視角來看,有一塊區域是專門用于實作這個密碼認證的,如圖所示,從E3H到E7H
如果從I2C的角度來看,是block從38H到39H
當然這款區域是在EEPROM裡的(SRAM相當于記憶體,掉電就沒了,顯然這些重要的東西不應該放在SRAM裡面)
我們已經知道,這款NFC晶片的memory(不知道應該怎麼翻譯)根據存儲體性質的不同,可以分為2大塊,即EEPROM和SRAM,那麼,從某種意義上,我們可以把這個晶片作如下劃分:
SRAM
受保護的EEPROM(就是上面提到的)
不受保護的EEPROM
當然受保護的EEPROM容量會小一些,不受保護的EEPROM容量大一些
下面就開始說存放密碼的區域了,也就是PWD區域
PWD,用于存放32位的密碼
PACK,用于存放16位的Ack
顯然這兩個區域你是不可能通過手機去讀的,DataSheet裡面也寫的很清楚
就是說你要是去讀取這兩個區域,讀取的結果隻能是傳回全0。當然寫是可以的,也就是剛剛上面提到的
這其實是一個Byte的簡稱,也就是那個位于SECTOR0的Page位址為E7H的第0個Byte,我們給他取名字叫做PT_I2C
PT_I2C裡面的8位是這樣的
這裡主要關注一下SRAM_PORT這一位(如果我們要給某一bit取一個别名,就在名字後面加上_PORT這樣,顯然,SRAM_PORT就是和SRAM的控制相關的一個bit)
0 不需要pass through模式的密碼認證
1 需要pass through模式的密碼認證
當然了,從I2C角度來說,我們始終有這樣的權限去讀寫:
會話寄存器
包括PWD配置區域的配置頁
假設你現在手上有一個帶有NFC功能的手機,接下來是如何實作認證的呢?
這裡需要介紹一條非常重要的指令,也就是PWD_AUTH,如圖所示
這條指令帶一個參數,也就是你的輸入密碼
這樣看太抽象了,我們不如看一下源代碼,這是在發送指令
有意思的是,這個函數在整個Project中隻用了一次,就是用在這個地方
authenticatePlus這個函數相當于在pwdAuth的基礎上再封裝了一層
那麼哪些地方用到了authenticatePlus呢
很有意思的事情,我要去認證,我當然要先判斷我自己現在的權限狀态,那麼如何去看自己的狀态呢,居然是用一個static的變量,是以我對這個變量能否及時更新有所質疑
Android用戶端中所有對于mAuthStatus的更新,都是通過這個函數獲得的。mAuthStatus我個人認為你應該将他了解成為NXP晶片中的某個變量的影射,而不是一個Android用戶端中的一個static變量!
顯然這個的具體實作就是這個了,先挖坑,以後再說
當然,為了防止暴力破解,用AuthLIM來表示最多可以嘗試的次數,當開啟後,他會自動記錄下你的輸入錯誤密碼的次數,這個很簡單,不多說了