天天看點

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

本文針對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,有一句話我還沒看明白,先挖個坑

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

從NFC的視角來看,有一塊區域是專門用于實作這個密碼認證的,如圖所示,從E3H到E7H

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

如果從I2C的角度來看,是block從38H到39H

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

當然這款區域是在EEPROM裡的(SRAM相當于記憶體,掉電就沒了,顯然這些重要的東西不應該放在SRAM裡面)

我們已經知道,這款NFC晶片的memory(不知道應該怎麼翻譯)根據存儲體性質的不同,可以分為2大塊,即EEPROM和SRAM,那麼,從某種意義上,我們可以把這個晶片作如下劃分:

SRAM

受保護的EEPROM(就是上面提到的)

不受保護的EEPROM

當然受保護的EEPROM容量會小一些,不受保護的EEPROM容量大一些

 下面就開始說存放密碼的區域了,也就是PWD區域

PWD,用于存放32位的密碼

PACK,用于存放16位的Ack

顯然這兩個區域你是不可能通過手機去讀的,DataSheet裡面也寫的很清楚

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

就是說你要是去讀取這兩個區域,讀取的結果隻能是傳回全0。當然寫是可以的,也就是剛剛上面提到的

這其實是一個Byte的簡稱,也就是那個位于SECTOR0的Page位址為E7H的第0個Byte,我們給他取名字叫做PT_I2C

PT_I2C裡面的8位是這樣的

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

這裡主要關注一下SRAM_PORT這一位(如果我們要給某一bit取一個别名,就在名字後面加上_PORT這樣,顯然,SRAM_PORT就是和SRAM的控制相關的一個bit)

0     不需要pass through模式的密碼認證

1     需要pass through模式的密碼認證

當然了,從I2C角度來說,我們始終有這樣的權限去讀寫:

會話寄存器

包括PWD配置區域的配置頁

假設你現在手上有一個帶有NFC功能的手機,接下來是如何實作認證的呢?

這裡需要介紹一條非常重要的指令,也就是PWD_AUTH,如圖所示

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)
Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)
Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

這條指令帶一個參數,也就是你的輸入密碼

這樣看太抽象了,我們不如看一下源代碼,這是在發送指令

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

有意思的是,這個函數在整個Project中隻用了一次,就是用在這個地方

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

authenticatePlus這個函數相當于在pwdAuth的基礎上再封裝了一層

那麼哪些地方用到了authenticatePlus呢

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)
Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

很有意思的事情,我要去認證,我當然要先判斷我自己現在的權限狀态,那麼如何去看自己的狀态呢,居然是用一個static的變量,是以我對這個變量能否及時更新有所質疑

Android用戶端中所有對于mAuthStatus的更新,都是通過這個函數獲得的。mAuthStatus我個人認為你應該将他了解成為NXP晶片中的某個變量的影射,而不是一個Android用戶端中的一個static變量!

Android程式運作分析——中等複雜程度的NTAG I2C Demo為例(六)

顯然這個的具體實作就是這個了,先挖坑,以後再說

當然,為了防止暴力破解,用AuthLIM來表示最多可以嘗試的次數,當開啟後,他會自動記錄下你的輸入錯誤密碼的次數,這個很簡單,不多說了

繼續閱讀