劉麗麗 張雪
摘要摘要:設計一種基于SD控制器S281的固件,具有外部認證、分區加密功能。利用控制器中內置3DES和AES加密算法,可以實現對數據的硬件加密,具有更高的安全性。介紹控制器的內部結構及固件實現分區加密的原理,并在固件上實現閃存的均衡算法以及壞塊管理,保證閃存的合理使用。經過實驗測試,該分區加密SD卡在可靠性測試、讀寫速率測試和功能實現測試上均滿足要求。
關鍵詞關鍵詞:SD控制器;分區加密;SD固件設計;NAND Flash
DOIDOI:10.11907/rjdk.171096
中圖分類號:TP309.7
文獻標識碼:A文章編號文章編號:16727800(2017)005016803
0引言
SD卡主要由控制器和閃存芯片組成,其具有體積小、數據傳輸速率快、可熱插拔等優良特性,被廣泛應用于便攜式設備如電子詞典、移動電話、數碼相機、汽車導航系統[1]。計算機技術的快速發展使得信息的傳遞越來越迅速、便捷,同時人們對信息存儲介質的安全性要求也越來越高,普通SD卡已不能滿足人們對于安全存儲的需求。本文設計的SD卡創新性地將SD的存儲空間劃分為兩個分區,分別為普通區和保密區,同一時間只顯示一個分區。上電完成后默認顯示普通區,若需要切換至保密區則需要通過專用上層軟件輸入密碼完成外部認證。外部認證采用3DES加密算法,數據存儲采用目前公認的AES256加密算法[2]。這樣不僅滿足了普通數據存儲的需求,同時滿足機密數據保護需求。
1硬件架構
1.1總體框架
SD卡主要由存儲單元和控制單元組成。本文存儲介質采用Micron 4GB NAND Flash存儲芯片MT29F32G08CBACA,主控采用華瀾微自主研發的符合SD2.0標準的設備控制器S281。本設計總體硬件架構圖如圖1所示。
1.2控制器芯片S281簡介
S281固件設計具有一定復雜度,深入理解控制器的內部結構有助于設計出更好的固件。S281擁有一個32bit的嵌入式精簡CPU執行算術及邏輯運算,它從ROM和SRAM中獲取指令,解碼并執行,同時管理CPU及閃存接口的控制和狀態信號。CPU控制SD接口、NAND Flash接口、FIFO的總線操作,不同模塊間通過不同總線實現數據路由。同時S281控制器內置隨機數發生器和硬件加密模塊,為后續固件設計提供便利。
2固件設計
SD卡的固件主要是輔助或控制硬件完成上電初始化及數據傳輸[3],而分區加密的SD卡還要在固件上實現分區切換以及全盤數據加密。由于Flash在使用過程中易產生壞塊,難以管理,且有擦除次數的限制。本文在固件設計中通過邏輯表動態建立壞塊表,完成Flash的壞塊管理,根據物理擦除次數選擇空塊實現Flash的均衡算法,延長閃存的使用周期,實現閃存的合理化使用。
2.1讀操作固件設計
SD協議中讀命令包括CMD17和CMD18[4],CMD17讀取單個數據塊到SD接口,而CMD18在指控制器未接收到CMD12(停止命令)前讀取多個數據塊。當S281接收到CMD17時,首先調用地址解析函數將命令參數中的地址轉換成邏輯地址,分別用cluster.logic、block.logic、page.logic代表邏輯簇地址、邏輯塊地址和邏輯頁地址。再調用地址轉換函數建立映射表,通過查找映射表將邏輯地址轉換成物理地址,其中映射表包括簇映射表、塊映射表和頁映射表。根據頁映射表中邏輯頁所對應的物理頁flag(標志位)判斷頁中是否含有有效數據,即物理頁有沒有被寫過。若頁中不存在數據,根據NAND Flash的特性,即頁內數據全部為0xFF,則在FIFO中需要將數據傳送到SD接口的內存空間,全部用0xFF填充。如flag表明此頁已被編輯過,即頁中存在有效數據則發送Flash的讀命令(00~30h)讀取頁中的數據,并通過DMA總線將數據傳送到FIFO中,此時數據為采用AES256加密的密文,需要調用加解密函數解密FIFO中的數據。最后將FIFO中的數據通過主機數據總線發到SD接口完成單塊讀操作。
當S281接收到CMD18命令后,其操作與CMD17基本一致,只是在沒有收到CMD12之前,CMD18固件內部頁內邏輯地址會自動增加,并傳送數據到SD接口。若頁內邏輯地址增加導致需要切換邏輯塊或邏輯簇,則需要重新調用地址轉換函數建立映射表。
2.2寫操作固件設計
由于Flash的物理頁只能編程一次,不能對物理頁多次編寫[5],即寫入的數據必須是物理頁大小的整數倍,所以寫操作的固件設計更加復雜。當邏輯頁中的數據有部分更新時就需要將新舊數據一起寫入物理頁中,這就需要在固件上實現Flash的PreCopy和PostCopy兩個操作。當寫命令的起始邏輯地址不為0,而是頁的中間地址時,PreCopy在寫操作過程中,固件需要將物理頁前面的數據從Flash中讀取到FIFO,與新數據組合成一頁寫入一個新的物理頁中。而PostCopy就是當終止的邏輯地址沒有到頁的最后512字節時,就需要將物理頁后面的數據從Flash中讀取到FIFO,與新數據組合成一頁寫入到一個新的物理頁中,PreCopy和PostCopy可能同時發生。
SD協議中寫命令包括CMD24和CMD25,分別為單個數據塊寫和多個數據塊寫。當S281接收到CMD24時,硬件會自動接收第一個512字節的數據塊,并存放到FIFO中。同讀命令一樣,首先調用地址解析函數將命令參數中的地址轉換成邏輯地址,再調用數據加解密函數使用存儲在Flash中的密碼將接收到的數據塊采用AES256加密算法加密,最后調用地址轉換函數建立映射表,通過映射表實現地址轉換。根據頁映射表中邏輯頁所對應物理頁的flag判斷頁中是否含有有效數據。若物理頁已被寫過,則根據邏輯頁內地址判斷是否需要進行PreCopy操作,若需要進行PreCopy操作則將物理頁內地址前面的數據讀取到FIFO的相應存儲空間中。若頁內為空,則PreCopy操作中的數據全部用0xFF填充,并將填充的數據采用AES256算法加密。由于硬件已自動接收512字節的數據到FIFO中,此時需要將邏輯頁內地址自增一個數據塊的大小,即512字節。根據此時邏輯頁內地址判斷是否需要進行PostCopy操作,其操作方式和PreCopy相同。最后將FIFO中的一整頁數據通過DMA操作寫入到一個無數據的空頁中。完成寫命令后更新頁映射表,將此邏輯頁對應的物理頁更新為最新操作的物理頁。由于每個簇中都需要預留幾個空塊以備后續使用,所以完成寫操作后還需要根據簇映射表判斷簇中所含空塊數量是否滿足要求,若不滿足則需要采用merge操作,擦除某些塊中的數據,并在塊映射表中將此塊標記為空塊。由于一個邏輯塊可能對應兩個或者多個物理塊,分別為source.block和target.block,target.block中存儲的數據是最新的,source.block中存儲的數據是過時的。Merge操作就是將source.block和target.block中的有效數據合并到一個新的物理塊中,并將source.block和target.block中的數據擦除,這樣就可以騰出一個空的物理塊。寫操作在選擇空塊寫入數據時,會根據空塊的flag選擇擦除次數較少的空塊作為目標空塊,實現均衡算法,保證Flash的合理使用。寫操作簡化框架如圖2所示。
CMD25的基本流程和CMD24一樣,只是在沒有收到CMD12前,S281一直執行寫數據塊的操作,邏輯頁內地址也會一直遞增。當邏輯地址增加后需要切換邏輯塊或邏輯簇時,就需要重新調用地址轉換函數建立映射表。
2.3分區切換固件設計
分區加密SD卡的固件設計主要集中在兩個方面:一是對用戶的訪問限制即外部認證,防止非法用戶;二是對SD卡中的數據加密,防止SD存儲卡被暴力破解讀取數據[6]。同時由于對不同數據安全的要求不同,將SD存儲卡的存儲空間分為兩個分區,分別為普通區和保密區,普通區可見,保密區隱藏。由于本設計中保密區和普通區分別為2G,同一時間只有一個分區可見,固件上采用相對地址跳轉的方式實現分區。用戶通過上層軟件輸入密碼并發出外部認證命令,控制器S281接收到命令后驅動內置的隨機數發生器產生隨機數,上層軟件獲取來自S281的隨機數,并采用3DES加密[7]。與此同時,S281采用NAND Flash中存儲的密碼對隨機數采用同樣的加密算法加密,S281比對兩次加密的結果,相同則說明用戶密碼正確,用戶獲取切換分區的權限,否則認證失敗。外部認證成功后,用戶可以通過上層軟件發出切換至保密區的命令,S281接收到切換命令后,將邏輯地址跳轉至保密區的地址,保密區的數據對用戶可見,用戶便可以對保密區進行讀寫操作。SD卡全盤數據均采用AES256加密算法加密[8],用戶讀寫SD卡時,固件自動加解密數據,下電或切換至普通區后需要重新認證才能切換至保密區[9]。具體流程如圖3所示。
為實現外部認證和分區切換,采用動態接口文件的方式,即CPU通過特殊的標識碼過濾命令包。用戶通過上層軟件發送外部認證或分區切換命令時,實際上是通過寫命令CMD24向FIFO中傳入帶有特殊標識碼的512字節
數據包,特殊標識碼由標識碼和命令字組成。標識碼代表發送的命令為特殊的命令標識,命令字代表特殊命令的類型如外部認證、切換分區等。上層軟件發送帶有標識碼和命令字的數據包到FIFO后,S281識別FIFO中的數據包為特殊的命令包后,根據命令字判斷需要執行的操作,根據命令字固件上實現外部認證或分區切換的操作。并將操作后的響應存儲在FIFO中,上層軟件通過發送CMD17讀取FIFO中的響應,判斷操作是否成功完成,并反饋到用戶。
3結語
本文介紹了一種SD卡的固件設計,此固件基于國內自主研發的SD控制器S281。相較于一般的SD卡,此固件采用S281內置的3DES和AES256加密算法以實現存儲盤外部認證和分區加密,并通過實驗測試驗證了固件可以正確無誤運行。同時此設計方案采用動態接口文件的方式,具有很好的可擴展性和可移植性,后續可以增加其他功能,如修改加解密密碼、加密數據流等。經過多次實驗驗證,此固件可以正確穩定工作,具有很好的應用價值和發展前景。
參考文獻參考文獻:
[1]王超.基于FPGA的Micro SD卡控制器研究[D].哈爾濱:哈爾濱工業大學,2014:12.
[2]趙雪梅.AES加密算法的實現及應用[J].常熟理工學院學報,2010(2):105110.
[3]張聰,張濤.基于USB3.0設備控制器的固件設計[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盤的設計與實現[J].成都電子機械高等專科學校學報,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.
責任編輯(責任編輯:陳福時)