姬 進,翟正軍
(西北工業(yè)大學 計算機學院,陜西 西安 710072)
在數(shù)據(jù)加卸載系統(tǒng)上,對數(shù)據(jù)卡的安全性主要有以下幾個方面的要求:
1)因為數(shù)據(jù)的重要性,出于保密的考慮,不希望數(shù)據(jù)卡上的內(nèi)容被隨意查看;
2)為了防止重要數(shù)據(jù)被誤操作,希望數(shù)據(jù)卡只有在內(nèi)部管理軟件下才可以進行讀寫操作;
基于上面兩點的安全性考慮,本數(shù)據(jù)卡采用加密密鑰來實現(xiàn)數(shù)據(jù)卡的安全加卸載?;舅悸肥钱敂?shù)據(jù)卡連接到主機后,數(shù)據(jù)卡與數(shù)據(jù)加卸載管理軟件實現(xiàn)交互,管理軟件向設(shè)備發(fā)送密鑰來取得對數(shù)據(jù)卡的操作權(quán)。
本數(shù)據(jù)卡是基于USB2.0接口的數(shù)據(jù)存儲系統(tǒng),USB主機和設(shè)備之間進行數(shù)據(jù)傳輸主要有4種傳輸方式:控制傳輸、批量傳輸、中斷傳輸和等時傳輸[1]。批量傳輸適合大量突發(fā)性傳輸,所以本數(shù)據(jù)卡主要采用USB批量傳輸協(xié)議(Bulk-Only),下面先對批量傳輸協(xié)議作簡要介紹。
Bulk-Only傳輸協(xié)議僅使用Bulk批量端點來進行命令、數(shù)據(jù)和狀態(tài)的傳輸。命令、數(shù)據(jù)及狀態(tài)的傳輸流程為:
當主機詢查到有設(shè)備插入USB總線后,向設(shè)備首先發(fā)送USB標準請求,通過獲得設(shè)備的描述符得到設(shè)備的信息,進而對設(shè)備進行配置。當主機對設(shè)備枚舉成功后,就可以和設(shè)備通過輸入輸出端口進行通信。
支持Bulk-Only傳輸方式的海量存儲設(shè)備,除了具有默認的控制端口0之外,只需要具有兩個BULK端口(BULK IN,BULK OUT)就可以完成和主機的通信。
主機和設(shè)備之間通過傳送CBW (Command Block Wrapper)指令和 CSW(Command Status Wrapper)狀態(tài)字[2],以及DATA來完成數(shù)據(jù)的存儲和讀取。
CBW命令的結(jié)構(gòu)如下定義:
dCBWSignature是CBW包標記,表明這是一個CBW包;dCBWTag是命令塊標記,設(shè)備會將這個字段填入CSW的dCSWTag字段,以回應(yīng)主機的命令;dCBWDataTransferLength是數(shù)據(jù)傳輸長度,指明在數(shù)據(jù)傳輸階段的傳輸數(shù)據(jù)長度;bmCBWFlags規(guī)定了數(shù)據(jù)的傳輸方向;bCBWLUN指明了命令塊被發(fā)送的邏輯單元號;bCBWCBLength指定了CBWCB的長度;CBWCB指定了設(shè)備執(zhí)行的子命令,USB批量傳輸協(xié)議主要使用的是SCSI命令,由設(shè)備解析,對數(shù)據(jù)卡的讀寫操作主要是SCSI命令的Read10和Write12。CBWCB的第一個字節(jié)是操作碼(OperationCode),程序?qū)⒏鶕?jù)相應(yīng)的操作碼進行SCSI命令的識別,在SCSI中規(guī)定Read10的操作碼是28H,Write12的操作碼是2AH,后面15個字節(jié)不同命令的會有不同的定義,例如Read10和Write12中分別定義了讀的邏輯起始地址和寫的邏輯起始地址。
CSW命令的結(jié)構(gòu)如下:
dCSWSignature是CSW包標記,表明這是一個CSW包;dCSWTag此值與CBW包的dCBWTag相同,表明這是對相應(yīng)CBW的響應(yīng);dCSWDataResidue是實際數(shù)據(jù)傳輸量與CBW包中規(guī)定的數(shù)據(jù)傳輸長度的差值;bCSWStatus表明命令執(zhí)行成功與否。
海量存儲設(shè)備接收到CBW命令字后,分解出CBW命令中包含的信息,并對指令信息進行處理,同時向機返回狀態(tài)字CSW。其過程如圖1所示。
圖1 主機與海量存儲設(shè)備通信流程Fig.1 Communication between host and mass storage device
本數(shù)據(jù)卡的硬件組成如圖2所示,主要有3部分模塊組成:USB接口模塊、控制器和NAND FLASH[3],其中USB接口模塊主要連接主機和控制器,NAND FLASH作為數(shù)據(jù)卡的存儲介質(zhì),控制器則協(xié)調(diào)這兩個模塊,以實現(xiàn)數(shù)據(jù)的存取。
圖2 數(shù)據(jù)卡硬件組成Fig.2 Hardware components of card
USB接口的VCC通過電壓轉(zhuǎn)換芯片向控制器供電,數(shù)據(jù)線D+和D-與控制器對應(yīng)引腳相連,實現(xiàn)數(shù)據(jù)通信。控制器的CLE與NAND FLASH的CLE相連,實現(xiàn)命令鎖存使能;控制器的ALE與NAND FLASH的ALE相連,實現(xiàn)地址鎖存使能;控制器的CE#與NAND FLASH的CE#相連,實現(xiàn)有效片選,該信號低電平有效;控制器的WE#與NAND FLASH的WE#相連,實現(xiàn)有效寫使能,該信號低電平有效;控制器的RE#與NAND FLASH相連,實現(xiàn)有效讀使能,該信號也是低電平有效;R/B#信號與NAND FLASH的R/B#相連,該信號是NAND FLASH輸出信號,反映NAND FLASH的工作狀態(tài),低電平表示器件忙,高電平表示當前器件沒有操作;數(shù)據(jù)線I/O[7:0]實現(xiàn)NAND FLASH與控制器的數(shù)據(jù)交換。
控制器解析USB接口模塊的命令,根據(jù)命令做出相應(yīng)的操作,對于本數(shù)據(jù)卡,控制器要對NAND FLASH進行讀、寫、損耗均衡、壞塊管理等操作,只有通過控制器的協(xié)調(diào)調(diào)度,才可以實現(xiàn)對FLASH上的數(shù)據(jù)的有效管理。因此在對數(shù)據(jù)卡進行安全功能的設(shè)計的時候,也把重點放在了控制器這一部分,在控制器固件程序上實現(xiàn)安全管理功能。
由前面對USB批量傳輸協(xié)議的分析可知一次USB批量傳輸協(xié)議的傳輸過程可以分為3個過程:主機發(fā)送CBW命令、數(shù)據(jù)包的傳輸和設(shè)備向主機發(fā)送CSW命令[4]。
根據(jù)USB批量傳輸協(xié)議和數(shù)據(jù)卡安全功能設(shè)計的考慮,對控制器的固件程序設(shè)計了如圖3所示的狀態(tài)圖。
圖3 程序狀態(tài)機Fig.3 Program state machine
對于一次數(shù)據(jù)傳輸過程,設(shè)備首先處于READ_CBW狀態(tài),在READ_CBW狀態(tài)中,固件程序首先進行一系列的初始化工作。設(shè)備將接受端點設(shè)為接收狀態(tài),表明允許接受主機的CBW命令,設(shè)備設(shè)置CBW的接收緩存,設(shè)置接受的數(shù)據(jù)大小,最后設(shè)置回調(diào)函數(shù),該回調(diào)函數(shù)的功能主要是當數(shù)據(jù)接收完成后通知程序進行下一步工作。
當READ_CBW狀態(tài)執(zhí)行完成后,程序?qū)⑦M入WAIT_CBW狀態(tài),在該狀態(tài)程序主要是等待設(shè)備端點接收CBW,當新的CBW接收后,在READ_CBW設(shè)置的回調(diào)函數(shù)會執(zhí)行,相關(guān)的信號量會增加,程序會轉(zhuǎn)向下一個狀態(tài)PROCESS_CBW,如果在WAIT_CBW狀態(tài)的時候設(shè)備收到控制端點的復(fù)位或者其他錯誤信息的時候,設(shè)備將重新返回到READ_CBW,重新接收新的CBW。
進入PROCESS_CBW狀態(tài)后,設(shè)備將完成與主機的數(shù)據(jù)交互。程序?qū)⒔馕鯟BW的CBWCB字段,根據(jù)該字段的信息做出相應(yīng)的響應(yīng),對于SCSI命令的Read10,程序根據(jù)字段中邏輯地址和數(shù)據(jù)長度會讀取NAND FLASH的數(shù)據(jù),并將數(shù)據(jù)通過端點發(fā)送給主機,對于Write12命令,設(shè)備將接受主機發(fā)送的數(shù)據(jù),并根據(jù)該字段中的邏輯地址將數(shù)據(jù)寫入NAND FLASH中。在進行讀寫操作中,還將涉及對FLASH的損耗均衡和壞塊管理[5]等操作。在該狀態(tài)時如果出現(xiàn)一些錯誤,比如CBW指令解析時出現(xiàn)錯誤,程序?qū)⒅袛噙@次數(shù)據(jù)交互過程,重新回到READ_CBW狀態(tài),等待新的CBW重新到來。
如果PROCESS_CBW狀態(tài)成功執(zhí)行,程序?qū)⑦M入SEND_CSW狀態(tài),程序根據(jù)PROCESS_CBW狀態(tài)執(zhí)行的相關(guān)情況,填寫CSW中的相應(yīng)字段,并且設(shè)置發(fā)送緩存以及回調(diào)函數(shù),該回調(diào)函數(shù)與READ_CBW中的回調(diào)函數(shù)類似,通知程序CSW發(fā)送完成。
SEND_CSW狀態(tài)成功執(zhí)行后,程序進入WAIT_CSW狀態(tài),等待CSW的成功發(fā)送,最后重新返回READ_CBW狀態(tài)。如果在該狀態(tài)執(zhí)行過程中出現(xiàn)復(fù)位或者錯誤,程序也將回到READ_CBW狀態(tài),重新開始下一次傳輸。
數(shù)據(jù)卡的安全功能主要涉及對數(shù)據(jù)卡的讀和寫操作,要防止主機對數(shù)據(jù)卡的直接讀寫操作。
對于本數(shù)據(jù)卡的加載和卸載過程都是在主機管理軟件的管理下嚴格執(zhí)行的,在其他非法情況下,數(shù)據(jù)卡將不對主機提供查看和寫入操作,從而提高數(shù)據(jù)卡的安全性能。
固件程序中定義了CBWCB的標準的SCSI命令和自定義的安全命令以及這些命令對應(yīng)的響應(yīng)函數(shù)。自定義的安全命令是為了實現(xiàn)數(shù)據(jù)卡的安全功能,主要是設(shè)置密鑰命令SETPASSWORD和驗證密鑰VERIFYPASSWORD命令。CBWCB的命令識別主要根據(jù)CBWCB的操作碼來加以區(qū)別,不同的操作碼將對應(yīng)不同的處理流程。自定義命令可以通過操作系統(tǒng)的DeviceIoControl函數(shù)向設(shè)備發(fā)送這些自定義的命令。
自定義CBWCB結(jié)構(gòu)如下:
operationCode標識CBWCB操作碼,keyLength表示密鑰的長度,encodeType標識密鑰的加密方式[6],主機管理軟件將采用encodeType標識的加密方式對密鑰進行加密,數(shù)據(jù)卡將根據(jù)encodeType標識的加密方式對密鑰進行解密。
增加自定義命令后處理過程如圖4所示,狀態(tài)WAIT_CBW將等待新的CBW被正確接收,當接收到新CBW后,根據(jù)CBW的CBWCB的操作碼對其進行處理。
圖4 安全管理處理流程Fig.4 Safety management flow chart
如果CBWCB是自定義命令SETPASSWORD和VERIFYPASSWORD時,程序轉(zhuǎn)入PROCESS_CBW狀態(tài),對于SETPASSWORD命令,在PROCESS_CBW狀態(tài)中將接收指定長度的密鑰,并用encodeType標識的加密算法對密鑰進行解密,最后將解密密文存儲在FLASH內(nèi)的特定區(qū)域上,更新以前舊的密文;如果接收到VERIFYPASSWORD時,狀態(tài)PROCESS_CBW將從FLASH的特定區(qū)域上讀取密文,并且與主機發(fā)送下來的密文對比,如果匹配成功,程序?qū)⒃O(shè)備的驗證狀態(tài)置為驗證通過。
如果CBWCB的操作碼為READ10或Write12時,進一步判斷數(shù)據(jù)卡是否已經(jīng)驗證通過,如果驗證通過,則轉(zhuǎn)入狀態(tài)PROCESS_CBW對READ10或Write12作進一步操作,如果沒有驗證通過,則狀態(tài)轉(zhuǎn)回READ_CBW繼續(xù)等待新的CBW。這樣在沒有通過驗證的設(shè)備上,設(shè)備將不會向主機提供讀和寫的操作,這樣保證了對數(shù)據(jù)卡的安全訪問。
本數(shù)據(jù)卡采用基于USB2.0接口的NAND FLASH作為存儲介質(zhì),設(shè)計了USB批量傳輸?shù)墓碳绦驙顟B(tài)機,并在狀態(tài)機的基礎(chǔ)之上設(shè)計了數(shù)據(jù)卡的安全功能以實現(xiàn)數(shù)據(jù)卡的安全存儲,在和上層管理軟件的配合下,使用良好。通過和其他方法比較,該方法控制簡單、可靠性高。
[1]劉建存,廖峰等.USB接口技術(shù)[M].北京:國防工業(yè)出版社,2004.
[2]Universal Serial Bus.Mass storage class Reversion1.0[EB/OL].(1998-10-22).http://www.usb.org.
[3]王成儒,李英偉.USB2.0原理與工程開發(fā)[M].北京:北京工業(yè)出版社,2004.
[4]邊海龍,賈少華.USB2.0設(shè)備設(shè)計與開發(fā)[M].北京:人民郵電出版社,2004.
[5]Gal E,Toledos.Algorithms and data structures for flash memories[J].ACM Computing Survey,2005,37(2):138-163.
[6]盧開澄.計算機密碼學[M].3版.北京:清華大學出版社,2003.