樊 凯, 陈 浩, 白 丹
(1.中国兵器装备集团自动化研究所有限公司, 四川绵阳 621000; 2.海军装备部, 四川绵阳 621900)
BIOS(basic input and output system)是固化到计算机主板ROM 芯片上的程序[1],负责硬件检测和引导操作系统启动。 传统BIOS 固件基于汇编语言开发,维护困难,可扩展性差。 Intel 主导发布的统一可扩展固件接口UEFI (Unified Extensible Firmware Interface)逐渐取代了传统BIOS[2]。UEFI 中引入了UEFI 驱动程序模型的概念,采用了驱动/协议的架构,具有很强的扩展性,从而使得UEFI 平台下添加新的驱动和应用变得简单[3]。
UEFI 在实际工程应用中存在以下两个问题, 第一,在开发调试时,开发人员需要经常利用U 盘等工具将编译好的固件文件拷贝到目标设备中进行调试,操作不便而且效率不高[4]。 第二、UEFI 固件发布后,由于软件漏洞或新的需求,进行固件更新和维护在所难免,而在一些军工行业的特定场合下, 目标设备通常禁止插入任何外带存储设备,这导致UEFI 固件的更新维护比较困难。UEFI Shell 提供了TFTP(文件传输协议)工具,但TFTP 协议是明文传输[5],在通信过程中,信息容易被抓包窃取,不能保证传输过程的数据安全。
UEFI 框架中提供了对IPv4 网络的支持, 本文基于TCP 协议与AES(Advanced Encryption Standard)对称加密算法,实现了一种网络加密传输工具,在局域网内通过网络传输数据文件,支持调试与加密两种工作模式,可以有效解决UEFI 应用中的痛点问题。
UEFI 对IPv4 提供了支持,而且网络接口协议也在不断丰富和拓展,UEFI 网络协议栈见图1,包括链路层、网络层、传输层和应用层的多种协议。 局域网中UEFI 网络应用主要使用TCP、UDP 等传输层协议,应用程序与传输层、网络层、链路层以及网卡驱动进行数据交互,实现与外界设备通信[6]。
图1 UEFI 网络协议栈
UEFI 网络协议栈传输层中常用的协议为TCP 协议和UDP 协议。 TCP 协议是面向连接的、可靠的数据传输网络协议,可保证数据到达目的地。UDP 协议数据传输延迟小、传输效率高,但提供的是无连接的、面向事务的不可靠信息传送服务。 本文采用了TCP 协议,UEFI 中TCP协议开发流程如下:
(1)创建Socket 对象:开发人员自定义一个Socket 结构体, 包含 EFI_TCP4_PROTOCOL、EFI_TCP4_CONFIG_DATA 和EFI_TCP4_RECEIVE_DATA 等协议对象的指针, 创建Socket 对象最重要的步骤就是实例化EFI_TCP4_PROTOCOL 对象,该协议提供了配置、连接、发送、接收和关闭接口,协议结构体定义如下:
实例化EFI_TCP4_PROTOCOL 对象并不能使用LocateProtocol、HandleProtocol 以及OpenPortocol 等常规协议接口从系统中获得,而必须利用EFI_SERVICE_BINDING_PROTOCOL 创建和销毁[7]。 协议结构体定义如下:
实例化EFI_TCP4_PROTOCOL 对象流程如下: 首先调用LocateProtocol 函数, 通过全局唯一标识符gEfiTCP4ServiceBindingProtocolGuid 在系统中找到EFI_SERVICE_BINDING_PROTOCOL 的实例对象,然后通过其成员函数CreateChild 创建子设备句柄, 并调用OpenProtocol 函数, 使用gEfiTCP4ProtocolGuid 在创建的子设备上安装EFI_TCP4_PROTOCOL。 安装成功后,就可以使用EFI_TCP4_PROTOCOL 对象的成员函数进行配置、连接、发送以及接收操作,使用完成后,再通过DestroyChild 函数来销毁创建的EFI_TCP4_PROTOCOL 实例对象。
(2)配置本地端口和远端服务器IP、端口。
(3)建立与远端服务器的连接。
(4)发送、接收数据。
(5)Socket 使用完成后,关闭并销毁Socket 对象。
高级加密标准AES (Advanced Encryption Standard)为最常见的对称加密算法, 对称加密算法是指加密和解密用相同的密钥。 AES 算法根据秘钥长度不同可以进行多轮处理,每一轮加密包括字节替代、行移位、列混淆和轮密钥加四个步骤, 解密流程正好相反。 AES 为分组密码,包括五种工作模式:电码本模式ECB、密码分组链接模式CBC、计算器模式CTR、密码反馈模式CFB、输出反馈模式OFB[8]。ECB 模式结构简单,可以分组独立加密,是比较常用的模式,本文采用ECB 模式。
AES 加密算法应用成熟, 也有C 语言实现的开源代码, 可以方便地移植到UEFI框架中,其使用流程见图2。
图2 AES 使用流程
设备1 中明文P 是原始明文数据,密钥K 是用来加密明文的密码,在对称加密算法中, 加密与解密的密钥相同。加密函数为E,经加密后的密文C=E(K,P)。 密文C 经网络传输到达设备2,解密函数D,经解密后的明文P=D(K,C)。
AES 秘钥可以使用128 位、192 位或256 位, 密钥越长,解密越难,但秘钥并不是越长越好,需要综合考虑处理器处理能力和实际应用环境,本文采用128 位秘钥。在AES 标准规范中,分组长度只能采用128 位(16 个字节,不满的部分需要填充数据)[9],因此,在网络加密文件传输工具设计时, 需要将数据包长度统一为16 字节的整倍数,不足的部分需要在信息段填充空白数据,在数据包解密后,需要根据数据长度,剔除无用信息。
网络加密文件传输工具包含两部分软件, 第一部分是目标设备Target 上的UEFI Shell 应用软件, 做TCP 客户端,第二部分是主机Host 上的软件,做TCP 服务器。目标设备做客户端可以自主控制与指定IP、 端口号服务器的连接和数据传输流程, 避免做服务器时被网络内未知客户端恶意连接,传输病毒文件,保证目标设备的安全。网络加密文件传输工具有调试(debug)和加密(release)两种工作模式,固件发布前,使用调试模式,固件发布时,在客户端代码中限制,发布后必须使用加密模式。
文件传输时,服务器与客户端处于同一局域网内,为有效控制数据传输流程,需要设计传输通信协议,通信协议支持调试模式和加密模式。
通信协议格式见表1,一帧数据包由帧头、指令码、长度、信息段、CRC(指令码、长度和信息段的循环冗余校验码)[10]和帧尾组成。 加密模式下,因为AES 加密算法要求分组数据必须是128 位, 所以将数据包分为标准帧和扩展帧两种,标准帧长度16 字节,用于传输少量数据,比如文件长度和文件校验码,扩展帧长度4096 字节,用于传输文件内容数据。指令码01,客户端发起传输请求;指令码02,服务器应答传输请求, 信息段内容为4 字节文件长度;指令码03,服务器传输文件数据,信息段包含4字节帧序号和文件数据; 指令码06, 服务器传输完成,信息段内容为2 字节文件校验码;指令码04 和05,客户端回复服务器接收状态,信息段为填充的空白数据。
表1 通信协议
调试模式下无需遵循AES 规范,无需区分标准帧和扩展帧,长度指定为信息实际长度,信息段无需填充空白数据。
客户端和服务器软件调试模式下工作流程如下:
(1)启动服务器,指定需要监听的IP、端口号和工作模式,等待客户端连接。
(2)启动客户端,指定服务器IP、端口号和工作模式,建立与服务器的网络连接。
(3)客户端发起传输请求。
(4)服务器应答传输请求,同时传输文件长度。
(5)客户端获取文件长度,应答成功,准备接收文件数据。
(6)服务器分包发送文件数据。
(7)客户端接收文件数据,应答成功。
(8)服务器传输完成,同时传输文件校验码。
(9)客户端获取文件校验码,比对接收的文件数据和文件校验码,成功后生成固件文件,传输过程完成。
在传输过程中,客户端会校验每一帧数据,校验成功则应答成功,校验失败或接收超时,均应答错误,服务器接收到应答成功则传输下一包数据, 接收到应答错误则重新传输上一包数据。
加密模式下,客户端每次启动时会动态生成秘钥,服务端需输入相同的秘钥,建立连接后,客户端和服务器的每一包通信数据都要经过加密和解密过程, 工作流程见图3。
图3 传输工具工作流程
本次试验的目标设备为飞腾FT-2000/4 平台, 预装麒麟操作系统,主机为Intel(R) Xeon(E3)平台,预装Wondows7 旗舰版系统,目标设备第一次运行客户端软件FileTransfer.efi 时,需要先将其拷贝至硬盘,再将两台设备通过网线连接在同一局域网内。
在主机上准备好服务器软件和固件文件, 先启动服务器软件,再启动目标设备,通过BIOS 设置,进入UEFI Shell 中。 启动客户端软件时,需要输入服务器IP、端口号和工作模式三个参数。 其中, 第三个参数为 “debug”或“release”,调试模式下传输速率更快,方便快速调试与测试。固件正式发布时,将客户端软件代码中的预定模式参数指定为release,固件发布后,输入参数必须为release,在代码内部会检查输入参数与预设参数一致性, 检查通过后,生成16 字节动态秘钥,将该秘钥输入到服务器软件中,加密模式下,通过网络发送接收的任何数据包都采用生成的动态秘钥进行加密解密。 每次启动客户端软件, 会重新生成秘钥,充分保证数据的安全性。
在两种工作模式下分别测试传输编译后的固件文件,客户端软件调试模式传输试验见图4,加密模式传输试验见图5。
图4 调试模式传输试验
图5 加密模式传输试验
针对UEFI 调试维护时拷贝文件效率低下以及特定场合的设备禁止插入存储设备带来的升级维护困难问题,本文在TCP 协议和AES加密算法基础上设计实现了网络加密文件传输工具,在调试模式和加密模式下可以方便、安全地传输固件文件,适合应用在实际工程中。目前,该传输工具需要将动态秘钥手动输入服务器软件,后续可进一步研究客户端与服务器自协商生成动态秘钥,提高使用便捷性。