姬 进,翟正军
(西北工业大学 计算机学院,陕西 西安 710072)
在数据加卸载系统上,对数据卡的安全性主要有以下几个方面的要求:
1)因为数据的重要性,出于保密的考虑,不希望数据卡上的内容被随意查看;
2)为了防止重要数据被误操作,希望数据卡只有在内部管理软件下才可以进行读写操作;
基于上面两点的安全性考虑,本数据卡采用加密密钥来实现数据卡的安全加卸载。基本思路是当数据卡连接到主机后,数据卡与数据加卸载管理软件实现交互,管理软件向设备发送密钥来取得对数据卡的操作权。
本数据卡是基于USB2.0接口的数据存储系统,USB主机和设备之间进行数据传输主要有4种传输方式:控制传输、批量传输、中断传输和等时传输[1]。批量传输适合大量突发性传输,所以本数据卡主要采用USB批量传输协议(Bulk-Only),下面先对批量传输协议作简要介绍。
Bulk-Only传输协议仅使用Bulk批量端点来进行命令、数据和状态的传输。命令、数据及状态的传输流程为:
当主机询查到有设备插入USB总线后,向设备首先发送USB标准请求,通过获得设备的描述符得到设备的信息,进而对设备进行配置。当主机对设备枚举成功后,就可以和设备通过输入输出端口进行通信。
支持Bulk-Only传输方式的海量存储设备,除了具有默认的控制端口0之外,只需要具有两个BULK端口(BULK IN,BULK OUT)就可以完成和主机的通信。
主机和设备之间通过传送CBW (Command Block Wrapper)指令和 CSW(Command Status Wrapper)状态字[2],以及DATA来完成数据的存储和读取。
CBW命令的结构如下定义:
dCBWSignature是CBW包标记,表明这是一个CBW包;dCBWTag是命令块标记,设备会将这个字段填入CSW的dCSWTag字段,以回应主机的命令;dCBWDataTransferLength是数据传输长度,指明在数据传输阶段的传输数据长度;bmCBWFlags规定了数据的传输方向;bCBWLUN指明了命令块被发送的逻辑单元号;bCBWCBLength指定了CBWCB的长度;CBWCB指定了设备执行的子命令,USB批量传输协议主要使用的是SCSI命令,由设备解析,对数据卡的读写操作主要是SCSI命令的Read10和Write12。CBWCB的第一个字节是操作码(OperationCode),程序将根据相应的操作码进行SCSI命令的识别,在SCSI中规定Read10的操作码是28H,Write12的操作码是2AH,后面15个字节不同命令的会有不同的定义,例如Read10和Write12中分别定义了读的逻辑起始地址和写的逻辑起始地址。
CSW命令的结构如下:
dCSWSignature是CSW包标记,表明这是一个CSW包;dCSWTag此值与CBW包的dCBWTag相同,表明这是对相应CBW的响应;dCSWDataResidue是实际数据传输量与CBW包中规定的数据传输长度的差值;bCSWStatus表明命令执行成功与否。
海量存储设备接收到CBW命令字后,分解出CBW命令中包含的信息,并对指令信息进行处理,同时向机返回状态字CSW。其过程如图1所示。
图1 主机与海量存储设备通信流程Fig.1 Communication between host and mass storage device
本数据卡的硬件组成如图2所示,主要有3部分模块组成:USB接口模块、控制器和NAND FLASH[3],其中USB接口模块主要连接主机和控制器,NAND FLASH作为数据卡的存储介质,控制器则协调这两个模块,以实现数据的存取。
图2 数据卡硬件组成Fig.2 Hardware components of card
USB接口的VCC通过电压转换芯片向控制器供电,数据线D+和D-与控制器对应引脚相连,实现数据通信。控制器的CLE与NAND FLASH的CLE相连,实现命令锁存使能;控制器的ALE与NAND FLASH的ALE相连,实现地址锁存使能;控制器的CE#与NAND FLASH的CE#相连,实现有效片选,该信号低电平有效;控制器的WE#与NAND FLASH的WE#相连,实现有效写使能,该信号低电平有效;控制器的RE#与NAND FLASH相连,实现有效读使能,该信号也是低电平有效;R/B#信号与NAND FLASH的R/B#相连,该信号是NAND FLASH输出信号,反映NAND FLASH的工作状态,低电平表示器件忙,高电平表示当前器件没有操作;数据线I/O[7:0]实现NAND FLASH与控制器的数据交换。
控制器解析USB接口模块的命令,根据命令做出相应的操作,对于本数据卡,控制器要对NAND FLASH进行读、写、损耗均衡、坏块管理等操作,只有通过控制器的协调调度,才可以实现对FLASH上的数据的有效管理。因此在对数据卡进行安全功能的设计的时候,也把重点放在了控制器这一部分,在控制器固件程序上实现安全管理功能。
由前面对USB批量传输协议的分析可知一次USB批量传输协议的传输过程可以分为3个过程:主机发送CBW命令、数据包的传输和设备向主机发送CSW命令[4]。
根据USB批量传输协议和数据卡安全功能设计的考虑,对控制器的固件程序设计了如图3所示的状态图。
图3 程序状态机Fig.3 Program state machine
对于一次数据传输过程,设备首先处于READ_CBW状态,在READ_CBW状态中,固件程序首先进行一系列的初始化工作。设备将接受端点设为接收状态,表明允许接受主机的CBW命令,设备设置CBW的接收缓存,设置接受的数据大小,最后设置回调函数,该回调函数的功能主要是当数据接收完成后通知程序进行下一步工作。
当READ_CBW状态执行完成后,程序将进入WAIT_CBW状态,在该状态程序主要是等待设备端点接收CBW,当新的CBW接收后,在READ_CBW设置的回调函数会执行,相关的信号量会增加,程序会转向下一个状态PROCESS_CBW,如果在WAIT_CBW状态的时候设备收到控制端点的复位或者其他错误信息的时候,设备将重新返回到READ_CBW,重新接收新的CBW。
进入PROCESS_CBW状态后,设备将完成与主机的数据交互。程序将解析CBW的CBWCB字段,根据该字段的信息做出相应的响应,对于SCSI命令的Read10,程序根据字段中逻辑地址和数据长度会读取NAND FLASH的数据,并将数据通过端点发送给主机,对于Write12命令,设备将接受主机发送的数据,并根据该字段中的逻辑地址将数据写入NAND FLASH中。在进行读写操作中,还将涉及对FLASH的损耗均衡和坏块管理[5]等操作。在该状态时如果出现一些错误,比如CBW指令解析时出现错误,程序将中断这次数据交互过程,重新回到READ_CBW状态,等待新的CBW重新到来。
如果PROCESS_CBW状态成功执行,程序将进入SEND_CSW状态,程序根据PROCESS_CBW状态执行的相关情况,填写CSW中的相应字段,并且设置发送缓存以及回调函数,该回调函数与READ_CBW中的回调函数类似,通知程序CSW发送完成。
SEND_CSW状态成功执行后,程序进入WAIT_CSW状态,等待CSW的成功发送,最后重新返回READ_CBW状态。如果在该状态执行过程中出现复位或者错误,程序也将回到READ_CBW状态,重新开始下一次传输。
数据卡的安全功能主要涉及对数据卡的读和写操作,要防止主机对数据卡的直接读写操作。
对于本数据卡的加载和卸载过程都是在主机管理软件的管理下严格执行的,在其他非法情况下,数据卡将不对主机提供查看和写入操作,从而提高数据卡的安全性能。
固件程序中定义了CBWCB的标准的SCSI命令和自定义的安全命令以及这些命令对应的响应函数。自定义的安全命令是为了实现数据卡的安全功能,主要是设置密钥命令SETPASSWORD和验证密钥VERIFYPASSWORD命令。CBWCB的命令识别主要根据CBWCB的操作码来加以区别,不同的操作码将对应不同的处理流程。自定义命令可以通过操作系统的DeviceIoControl函数向设备发送这些自定义的命令。
自定义CBWCB结构如下:
operationCode标识CBWCB操作码,keyLength表示密钥的长度,encodeType标识密钥的加密方式[6],主机管理软件将采用encodeType标识的加密方式对密钥进行加密,数据卡将根据encodeType标识的加密方式对密钥进行解密。
增加自定义命令后处理过程如图4所示,状态WAIT_CBW将等待新的CBW被正确接收,当接收到新CBW后,根据CBW的CBWCB的操作码对其进行处理。
图4 安全管理处理流程Fig.4 Safety management flow chart
如果CBWCB是自定义命令SETPASSWORD和VERIFYPASSWORD时,程序转入PROCESS_CBW状态,对于SETPASSWORD命令,在PROCESS_CBW状态中将接收指定长度的密钥,并用encodeType标识的加密算法对密钥进行解密,最后将解密密文存储在FLASH内的特定区域上,更新以前旧的密文;如果接收到VERIFYPASSWORD时,状态PROCESS_CBW将从FLASH的特定区域上读取密文,并且与主机发送下来的密文对比,如果匹配成功,程序将设备的验证状态置为验证通过。
如果CBWCB的操作码为READ10或Write12时,进一步判断数据卡是否已经验证通过,如果验证通过,则转入状态PROCESS_CBW对READ10或Write12作进一步操作,如果没有验证通过,则状态转回READ_CBW继续等待新的CBW。这样在没有通过验证的设备上,设备将不会向主机提供读和写的操作,这样保证了对数据卡的安全访问。
本数据卡采用基于USB2.0接口的NAND FLASH作为存储介质,设计了USB批量传输的固件程序状态机,并在状态机的基础之上设计了数据卡的安全功能以实现数据卡的安全存储,在和上层管理软件的配合下,使用良好。通过和其他方法比较,该方法控制简单、可靠性高。
[1]刘建存,廖峰等.USB接口技术[M].北京:国防工业出版社,2004.
[2]Universal Serial Bus.Mass storage class Reversion1.0[EB/OL].(1998-10-22).http://www.usb.org.
[3]王成儒,李英伟.USB2.0原理与工程开发[M].北京:北京工业出版社,2004.
[4]边海龙,贾少华.USB2.0设备设计与开发[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.