劉麗麗 張雪
摘要摘要:設(shè)計(jì)一種基于SD控制器S281的固件,具有外部認(rèn)證、分區(qū)加密功能。利用控制器中內(nèi)置3DES和AES加密算法,可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的硬件加密,具有更高的安全性。介紹控制器的內(nèi)部結(jié)構(gòu)及固件實(shí)現(xiàn)分區(qū)加密的原理,并在固件上實(shí)現(xiàn)閃存的均衡算法以及壞塊管理,保證閃存的合理使用。經(jīng)過實(shí)驗(yàn)測(cè)試,該分區(qū)加密SD卡在可靠性測(cè)試、讀寫速率測(cè)試和功能實(shí)現(xiàn)測(cè)試上均滿足要求。
關(guān)鍵詞關(guān)鍵詞:SD控制器;分區(qū)加密;SD固件設(shè)計(jì);NAND Flash
DOIDOI:10.11907/rjdk.171096
中圖分類號(hào):TP309.7
文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)文章編號(hào):16727800(2017)005016803
0引言
SD卡主要由控制器和閃存芯片組成,其具有體積小、數(shù)據(jù)傳輸速率快、可熱插拔等優(yōu)良特性,被廣泛應(yīng)用于便攜式設(shè)備如電子詞典、移動(dòng)電話、數(shù)碼相機(jī)、汽車導(dǎo)航系統(tǒng)[1]。計(jì)算機(jī)技術(shù)的快速發(fā)展使得信息的傳遞越來越迅速、便捷,同時(shí)人們對(duì)信息存儲(chǔ)介質(zhì)的安全性要求也越來越高,普通SD卡已不能滿足人們對(duì)于安全存儲(chǔ)的需求。本文設(shè)計(jì)的SD卡創(chuàng)新性地將SD的存儲(chǔ)空間劃分為兩個(gè)分區(qū),分別為普通區(qū)和保密區(qū),同一時(shí)間只顯示一個(gè)分區(qū)。上電完成后默認(rèn)顯示普通區(qū),若需要切換至保密區(qū)則需要通過專用上層軟件輸入密碼完成外部認(rèn)證。外部認(rèn)證采用3DES加密算法,數(shù)據(jù)存儲(chǔ)采用目前公認(rèn)的AES256加密算法[2]。這樣不僅滿足了普通數(shù)據(jù)存儲(chǔ)的需求,同時(shí)滿足機(jī)密數(shù)據(jù)保護(hù)需求。
1硬件架構(gòu)
1.1總體框架
SD卡主要由存儲(chǔ)單元和控制單元組成。本文存儲(chǔ)介質(zhì)采用Micron 4GB NAND Flash存儲(chǔ)芯片MT29F32G08CBACA,主控采用華瀾微自主研發(fā)的符合SD2.0標(biāo)準(zhǔn)的設(shè)備控制器S281。本設(shè)計(jì)總體硬件架構(gòu)圖如圖1所示。
1.2控制器芯片S281簡(jiǎn)介
S281固件設(shè)計(jì)具有一定復(fù)雜度,深入理解控制器的內(nèi)部結(jié)構(gòu)有助于設(shè)計(jì)出更好的固件。S281擁有一個(gè)32bit的嵌入式精簡(jiǎn)CPU執(zhí)行算術(shù)及邏輯運(yùn)算,它從ROM和SRAM中獲取指令,解碼并執(zhí)行,同時(shí)管理CPU及閃存接口的控制和狀態(tài)信號(hào)。CPU控制SD接口、NAND Flash接口、FIFO的總線操作,不同模塊間通過不同總線實(shí)現(xiàn)數(shù)據(jù)路由。同時(shí)S281控制器內(nèi)置隨機(jī)數(shù)發(fā)生器和硬件加密模塊,為后續(xù)固件設(shè)計(jì)提供便利。
2固件設(shè)計(jì)
SD卡的固件主要是輔助或控制硬件完成上電初始化及數(shù)據(jù)傳輸[3],而分區(qū)加密的SD卡還要在固件上實(shí)現(xiàn)分區(qū)切換以及全盤數(shù)據(jù)加密。由于Flash在使用過程中易產(chǎn)生壞塊,難以管理,且有擦除次數(shù)的限制。本文在固件設(shè)計(jì)中通過邏輯表動(dòng)態(tài)建立壞塊表,完成Flash的壞塊管理,根據(jù)物理擦除次數(shù)選擇空塊實(shí)現(xiàn)Flash的均衡算法,延長(zhǎng)閃存的使用周期,實(shí)現(xiàn)閃存的合理化使用。
2.1讀操作固件設(shè)計(jì)
SD協(xié)議中讀命令包括CMD17和CMD18[4],CMD17讀取單個(gè)數(shù)據(jù)塊到SD接口,而CMD18在指控制器未接收到CMD12(停止命令)前讀取多個(gè)數(shù)據(jù)塊。當(dāng)S281接收到CMD17時(shí),首先調(diào)用地址解析函數(shù)將命令參數(shù)中的地址轉(zhuǎn)換成邏輯地址,分別用cluster.logic、block.logic、page.logic代表邏輯簇地址、邏輯塊地址和邏輯頁地址。再調(diào)用地址轉(zhuǎn)換函數(shù)建立映射表,通過查找映射表將邏輯地址轉(zhuǎn)換成物理地址,其中映射表包括簇映射表、塊映射表和頁映射表。根據(jù)頁映射表中邏輯頁所對(duì)應(yīng)的物理頁flag(標(biāo)志位)判斷頁中是否含有有效數(shù)據(jù),即物理頁有沒有被寫過。若頁中不存在數(shù)據(jù),根據(jù)NAND Flash的特性,即頁內(nèi)數(shù)據(jù)全部為0xFF,則在FIFO中需要將數(shù)據(jù)傳送到SD接口的內(nèi)存空間,全部用0xFF填充。如flag表明此頁已被編輯過,即頁中存在有效數(shù)據(jù)則發(fā)送Flash的讀命令(00~30h)讀取頁中的數(shù)據(jù),并通過DMA總線將數(shù)據(jù)傳送到FIFO中,此時(shí)數(shù)據(jù)為采用AES256加密的密文,需要調(diào)用加解密函數(shù)解密FIFO中的數(shù)據(jù)。最后將FIFO中的數(shù)據(jù)通過主機(jī)數(shù)據(jù)總線發(fā)到SD接口完成單塊讀操作。
當(dāng)S281接收到CMD18命令后,其操作與CMD17基本一致,只是在沒有收到CMD12之前,CMD18固件內(nèi)部頁內(nèi)邏輯地址會(huì)自動(dòng)增加,并傳送數(shù)據(jù)到SD接口。若頁內(nèi)邏輯地址增加導(dǎo)致需要切換邏輯塊或邏輯簇,則需要重新調(diào)用地址轉(zhuǎn)換函數(shù)建立映射表。
2.2寫操作固件設(shè)計(jì)
由于Flash的物理頁只能編程一次,不能對(duì)物理頁多次編寫[5],即寫入的數(shù)據(jù)必須是物理頁大小的整數(shù)倍,所以寫操作的固件設(shè)計(jì)更加復(fù)雜。當(dāng)邏輯頁中的數(shù)據(jù)有部分更新時(shí)就需要將新舊數(shù)據(jù)一起寫入物理頁中,這就需要在固件上實(shí)現(xiàn)Flash的PreCopy和PostCopy兩個(gè)操作。當(dāng)寫命令的起始邏輯地址不為0,而是頁的中間地址時(shí),PreCopy在寫操作過程中,固件需要將物理頁前面的數(shù)據(jù)從Flash中讀取到FIFO,與新數(shù)據(jù)組合成一頁寫入一個(gè)新的物理頁中。而PostCopy就是當(dāng)終止的邏輯地址沒有到頁的最后512字節(jié)時(shí),就需要將物理頁后面的數(shù)據(jù)從Flash中讀取到FIFO,與新數(shù)據(jù)組合成一頁寫入到一個(gè)新的物理頁中,PreCopy和PostCopy可能同時(shí)發(fā)生。
SD協(xié)議中寫命令包括CMD24和CMD25,分別為單個(gè)數(shù)據(jù)塊寫和多個(gè)數(shù)據(jù)塊寫。當(dāng)S281接收到CMD24時(shí),硬件會(huì)自動(dòng)接收第一個(gè)512字節(jié)的數(shù)據(jù)塊,并存放到FIFO中。同讀命令一樣,首先調(diào)用地址解析函數(shù)將命令參數(shù)中的地址轉(zhuǎn)換成邏輯地址,再調(diào)用數(shù)據(jù)加解密函數(shù)使用存儲(chǔ)在Flash中的密碼將接收到的數(shù)據(jù)塊采用AES256加密算法加密,最后調(diào)用地址轉(zhuǎn)換函數(shù)建立映射表,通過映射表實(shí)現(xiàn)地址轉(zhuǎn)換。根據(jù)頁映射表中邏輯頁所對(duì)應(yīng)物理頁的flag判斷頁中是否含有有效數(shù)據(jù)。若物理頁已被寫過,則根據(jù)邏輯頁內(nèi)地址判斷是否需要進(jìn)行PreCopy操作,若需要進(jìn)行PreCopy操作則將物理頁內(nèi)地址前面的數(shù)據(jù)讀取到FIFO的相應(yīng)存儲(chǔ)空間中。若頁內(nèi)為空,則PreCopy操作中的數(shù)據(jù)全部用0xFF填充,并將填充的數(shù)據(jù)采用AES256算法加密。由于硬件已自動(dòng)接收512字節(jié)的數(shù)據(jù)到FIFO中,此時(shí)需要將邏輯頁內(nèi)地址自增一個(gè)數(shù)據(jù)塊的大小,即512字節(jié)。根據(jù)此時(shí)邏輯頁內(nèi)地址判斷是否需要進(jìn)行PostCopy操作,其操作方式和PreCopy相同。最后將FIFO中的一整頁數(shù)據(jù)通過DMA操作寫入到一個(gè)無數(shù)據(jù)的空頁中。完成寫命令后更新頁映射表,將此邏輯頁對(duì)應(yīng)的物理頁更新為最新操作的物理頁。由于每個(gè)簇中都需要預(yù)留幾個(gè)空塊以備后續(xù)使用,所以完成寫操作后還需要根據(jù)簇映射表判斷簇中所含空塊數(shù)量是否滿足要求,若不滿足則需要采用merge操作,擦除某些塊中的數(shù)據(jù),并在塊映射表中將此塊標(biāo)記為空塊。由于一個(gè)邏輯塊可能對(duì)應(yīng)兩個(gè)或者多個(gè)物理塊,分別為source.block和target.block,target.block中存儲(chǔ)的數(shù)據(jù)是最新的,source.block中存儲(chǔ)的數(shù)據(jù)是過時(shí)的。Merge操作就是將source.block和target.block中的有效數(shù)據(jù)合并到一個(gè)新的物理塊中,并將source.block和target.block中的數(shù)據(jù)擦除,這樣就可以騰出一個(gè)空的物理塊。寫操作在選擇空塊寫入數(shù)據(jù)時(shí),會(huì)根據(jù)空塊的flag選擇擦除次數(shù)較少的空塊作為目標(biāo)空塊,實(shí)現(xiàn)均衡算法,保證Flash的合理使用。寫操作簡(jiǎn)化框架如圖2所示。
CMD25的基本流程和CMD24一樣,只是在沒有收到CMD12前,S281一直執(zhí)行寫數(shù)據(jù)塊的操作,邏輯頁內(nèi)地址也會(huì)一直遞增。當(dāng)邏輯地址增加后需要切換邏輯塊或邏輯簇時(shí),就需要重新調(diào)用地址轉(zhuǎn)換函數(shù)建立映射表。
2.3分區(qū)切換固件設(shè)計(jì)
分區(qū)加密SD卡的固件設(shè)計(jì)主要集中在兩個(gè)方面:一是對(duì)用戶的訪問限制即外部認(rèn)證,防止非法用戶;二是對(duì)SD卡中的數(shù)據(jù)加密,防止SD存儲(chǔ)卡被暴力破解讀取數(shù)據(jù)[6]。同時(shí)由于對(duì)不同數(shù)據(jù)安全的要求不同,將SD存儲(chǔ)卡的存儲(chǔ)空間分為兩個(gè)分區(qū),分別為普通區(qū)和保密區(qū),普通區(qū)可見,保密區(qū)隱藏。由于本設(shè)計(jì)中保密區(qū)和普通區(qū)分別為2G,同一時(shí)間只有一個(gè)分區(qū)可見,固件上采用相對(duì)地址跳轉(zhuǎn)的方式實(shí)現(xiàn)分區(qū)。用戶通過上層軟件輸入密碼并發(fā)出外部認(rèn)證命令,控制器S281接收到命令后驅(qū)動(dòng)內(nèi)置的隨機(jī)數(shù)發(fā)生器產(chǎn)生隨機(jī)數(shù),上層軟件獲取來自S281的隨機(jī)數(shù),并采用3DES加密[7]。與此同時(shí),S281采用NAND Flash中存儲(chǔ)的密碼對(duì)隨機(jī)數(shù)采用同樣的加密算法加密,S281比對(duì)兩次加密的結(jié)果,相同則說明用戶密碼正確,用戶獲取切換分區(qū)的權(quán)限,否則認(rèn)證失敗。外部認(rèn)證成功后,用戶可以通過上層軟件發(fā)出切換至保密區(qū)的命令,S281接收到切換命令后,將邏輯地址跳轉(zhuǎn)至保密區(qū)的地址,保密區(qū)的數(shù)據(jù)對(duì)用戶可見,用戶便可以對(duì)保密區(qū)進(jìn)行讀寫操作。SD卡全盤數(shù)據(jù)均采用AES256加密算法加密[8],用戶讀寫SD卡時(shí),固件自動(dòng)加解密數(shù)據(jù),下電或切換至普通區(qū)后需要重新認(rèn)證才能切換至保密區(qū)[9]。具體流程如圖3所示。
為實(shí)現(xiàn)外部認(rèn)證和分區(qū)切換,采用動(dòng)態(tài)接口文件的方式,即CPU通過特殊的標(biāo)識(shí)碼過濾命令包。用戶通過上層軟件發(fā)送外部認(rèn)證或分區(qū)切換命令時(shí),實(shí)際上是通過寫命令CMD24向FIFO中傳入帶有特殊標(biāo)識(shí)碼的512字節(jié)
數(shù)據(jù)包,特殊標(biāo)識(shí)碼由標(biāo)識(shí)碼和命令字組成。標(biāo)識(shí)碼代表發(fā)送的命令為特殊的命令標(biāo)識(shí),命令字代表特殊命令的類型如外部認(rèn)證、切換分區(qū)等。上層軟件發(fā)送帶有標(biāo)識(shí)碼和命令字的數(shù)據(jù)包到FIFO后,S281識(shí)別FIFO中的數(shù)據(jù)包為特殊的命令包后,根據(jù)命令字判斷需要執(zhí)行的操作,根據(jù)命令字固件上實(shí)現(xiàn)外部認(rèn)證或分區(qū)切換的操作。并將操作后的響應(yīng)存儲(chǔ)在FIFO中,上層軟件通過發(fā)送CMD17讀取FIFO中的響應(yīng),判斷操作是否成功完成,并反饋到用戶。
3結(jié)語
本文介紹了一種SD卡的固件設(shè)計(jì),此固件基于國(guó)內(nèi)自主研發(fā)的SD控制器S281。相較于一般的SD卡,此固件采用S281內(nèi)置的3DES和AES256加密算法以實(shí)現(xiàn)存儲(chǔ)盤外部認(rèn)證和分區(qū)加密,并通過實(shí)驗(yàn)測(cè)試驗(yàn)證了固件可以正確無誤運(yùn)行。同時(shí)此設(shè)計(jì)方案采用動(dòng)態(tài)接口文件的方式,具有很好的可擴(kuò)展性和可移植性,后續(xù)可以增加其他功能,如修改加解密密碼、加密數(shù)據(jù)流等。經(jīng)過多次實(shí)驗(yàn)驗(yàn)證,此固件可以正確穩(wěn)定工作,具有很好的應(yīng)用價(jià)值和發(fā)展前景。
參考文獻(xiàn)參考文獻(xiàn):
[1]王超.基于FPGA的Micro SD卡控制器研究[D].哈爾濱:哈爾濱工業(yè)大學(xué),2014:12.
[2]趙雪梅.AES加密算法的實(shí)現(xiàn)及應(yīng)用[J].常熟理工學(xué)院學(xué)報(bào),2010(2):105110.
[3]張聰,張濤.基于USB3.0設(shè)備控制器的固件設(shè)計(jì)[J].電子器件,2013(3):383388.
[4] RIJMEN V.SD group:physical layer simplified Specification version 3.00[J].SD Card Association,2009.
[5]MICRON CORPORATION.L74A NAND flash memory data shee Rev.E3/11EN[R].Boise:Micron Corporation,2009.
[6]唐婷.加密U盤的設(shè)計(jì)與實(shí)現(xiàn)[J].成都電子機(jī)械高等??茖W(xué)校學(xué)報(bào),2006(2):1416.
[7]FELDHOFER M,WOLKERSTORFER J.AES implementation on a grain of sand[J].Information Security Iee Proceedings,2005,152(1):1320.
[8]SCIENCE T.Advanced encryption standard (AES)[J].Federal Information Processing Standards Publication,2001,3373(46):162181.
[9]G CANIVET,P MAISTRI R.Glitch and laser fault attacks onto a aecure AES implementation on a SRAMBased FPGA[J].Journal of cryptology:the journal of the International Association for Cryptologic Research,2011,24(2):247268.
責(zé)任編輯(責(zé)任編輯:陳福時(shí))