樊 凱, 陳 浩, 白 丹
(1.中國(guó)兵器裝備集團(tuán)自動(dòng)化研究所有限公司, 四川綿陽(yáng) 621000; 2.海軍裝備部, 四川綿陽(yáng) 621900)
BIOS(basic input and output system)是固化到計(jì)算機(jī)主板ROM 芯片上的程序[1],負(fù)責(zé)硬件檢測(cè)和引導(dǎo)操作系統(tǒng)啟動(dòng)。 傳統(tǒng)BIOS 固件基于匯編語(yǔ)言開(kāi)發(fā),維護(hù)困難,可擴(kuò)展性差。 Intel 主導(dǎo)發(fā)布的統(tǒng)一可擴(kuò)展固件接口UEFI (Unified Extensible Firmware Interface)逐漸取代了傳統(tǒng)BIOS[2]。UEFI 中引入了UEFI 驅(qū)動(dòng)程序模型的概念,采用了驅(qū)動(dòng)/協(xié)議的架構(gòu),具有很強(qiáng)的擴(kuò)展性,從而使得UEFI 平臺(tái)下添加新的驅(qū)動(dòng)和應(yīng)用變得簡(jiǎn)單[3]。
UEFI 在實(shí)際工程應(yīng)用中存在以下兩個(gè)問(wèn)題, 第一,在開(kāi)發(fā)調(diào)試時(shí),開(kāi)發(fā)人員需要經(jīng)常利用U 盤等工具將編譯好的固件文件拷貝到目標(biāo)設(shè)備中進(jìn)行調(diào)試,操作不便而且效率不高[4]。 第二、UEFI 固件發(fā)布后,由于軟件漏洞或新的需求,進(jìn)行固件更新和維護(hù)在所難免,而在一些軍工行業(yè)的特定場(chǎng)合下, 目標(biāo)設(shè)備通常禁止插入任何外帶存儲(chǔ)設(shè)備,這導(dǎo)致UEFI 固件的更新維護(hù)比較困難。UEFI Shell 提供了TFTP(文件傳輸協(xié)議)工具,但TFTP 協(xié)議是明文傳輸[5],在通信過(guò)程中,信息容易被抓包竊取,不能保證傳輸過(guò)程的數(shù)據(jù)安全。
UEFI 框架中提供了對(duì)IPv4 網(wǎng)絡(luò)的支持, 本文基于TCP 協(xié)議與AES(Advanced Encryption Standard)對(duì)稱加密算法,實(shí)現(xiàn)了一種網(wǎng)絡(luò)加密傳輸工具,在局域網(wǎng)內(nèi)通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)文件,支持調(diào)試與加密兩種工作模式,可以有效解決UEFI 應(yīng)用中的痛點(diǎn)問(wèn)題。
UEFI 對(duì)IPv4 提供了支持,而且網(wǎng)絡(luò)接口協(xié)議也在不斷豐富和拓展,UEFI 網(wǎng)絡(luò)協(xié)議棧見(jiàn)圖1,包括鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層的多種協(xié)議。 局域網(wǎng)中UEFI 網(wǎng)絡(luò)應(yīng)用主要使用TCP、UDP 等傳輸層協(xié)議,應(yīng)用程序與傳輸層、網(wǎng)絡(luò)層、鏈路層以及網(wǎng)卡驅(qū)動(dòng)進(jìn)行數(shù)據(jù)交互,實(shí)現(xiàn)與外界設(shè)備通信[6]。
圖1 UEFI 網(wǎng)絡(luò)協(xié)議棧
UEFI 網(wǎng)絡(luò)協(xié)議棧傳輸層中常用的協(xié)議為TCP 協(xié)議和UDP 協(xié)議。 TCP 協(xié)議是面向連接的、可靠的數(shù)據(jù)傳輸網(wǎng)絡(luò)協(xié)議,可保證數(shù)據(jù)到達(dá)目的地。UDP 協(xié)議數(shù)據(jù)傳輸延遲小、傳輸效率高,但提供的是無(wú)連接的、面向事務(wù)的不可靠信息傳送服務(wù)。 本文采用了TCP 協(xié)議,UEFI 中TCP協(xié)議開(kāi)發(fā)流程如下:
(1)創(chuàng)建Socket 對(duì)象:開(kāi)發(fā)人員自定義一個(gè)Socket 結(jié)構(gòu)體, 包含 EFI_TCP4_PROTOCOL、EFI_TCP4_CONFIG_DATA 和EFI_TCP4_RECEIVE_DATA 等協(xié)議對(duì)象的指針, 創(chuàng)建Socket 對(duì)象最重要的步驟就是實(shí)例化EFI_TCP4_PROTOCOL 對(duì)象,該協(xié)議提供了配置、連接、發(fā)送、接收和關(guān)閉接口,協(xié)議結(jié)構(gòu)體定義如下:
實(shí)例化EFI_TCP4_PROTOCOL 對(duì)象并不能使用LocateProtocol、HandleProtocol 以及OpenPortocol 等常規(guī)協(xié)議接口從系統(tǒng)中獲得,而必須利用EFI_SERVICE_BINDING_PROTOCOL 創(chuàng)建和銷毀[7]。 協(xié)議結(jié)構(gòu)體定義如下:
實(shí)例化EFI_TCP4_PROTOCOL 對(duì)象流程如下: 首先調(diào)用LocateProtocol 函數(shù), 通過(guò)全局唯一標(biāo)識(shí)符gEfiTCP4ServiceBindingProtocolGuid 在系統(tǒng)中找到EFI_SERVICE_BINDING_PROTOCOL 的實(shí)例對(duì)象,然后通過(guò)其成員函數(shù)CreateChild 創(chuàng)建子設(shè)備句柄, 并調(diào)用OpenProtocol 函數(shù), 使用gEfiTCP4ProtocolGuid 在創(chuàng)建的子設(shè)備上安裝EFI_TCP4_PROTOCOL。 安裝成功后,就可以使用EFI_TCP4_PROTOCOL 對(duì)象的成員函數(shù)進(jìn)行配置、連接、發(fā)送以及接收操作,使用完成后,再通過(guò)DestroyChild 函數(shù)來(lái)銷毀創(chuàng)建的EFI_TCP4_PROTOCOL 實(shí)例對(duì)象。
(2)配置本地端口和遠(yuǎn)端服務(wù)器IP、端口。
(3)建立與遠(yuǎn)端服務(wù)器的連接。
(4)發(fā)送、接收數(shù)據(jù)。
(5)Socket 使用完成后,關(guān)閉并銷毀Socket 對(duì)象。
高級(jí)加密標(biāo)準(zhǔn)AES (Advanced Encryption Standard)為最常見(jiàn)的對(duì)稱加密算法, 對(duì)稱加密算法是指加密和解密用相同的密鑰。 AES 算法根據(jù)秘鑰長(zhǎng)度不同可以進(jìn)行多輪處理,每一輪加密包括字節(jié)替代、行移位、列混淆和輪密鑰加四個(gè)步驟, 解密流程正好相反。 AES 為分組密碼,包括五種工作模式:電碼本模式ECB、密碼分組鏈接模式CBC、計(jì)算器模式CTR、密碼反饋模式CFB、輸出反饋模式OFB[8]。ECB 模式結(jié)構(gòu)簡(jiǎn)單,可以分組獨(dú)立加密,是比較常用的模式,本文采用ECB 模式。
AES 加密算法應(yīng)用成熟, 也有C 語(yǔ)言實(shí)現(xiàn)的開(kāi)源代碼, 可以方便地移植到UEFI框架中,其使用流程見(jiàn)圖2。
圖2 AES 使用流程
設(shè)備1 中明文P 是原始明文數(shù)據(jù),密鑰K 是用來(lái)加密明文的密碼,在對(duì)稱加密算法中, 加密與解密的密鑰相同。加密函數(shù)為E,經(jīng)加密后的密文C=E(K,P)。 密文C 經(jīng)網(wǎng)絡(luò)傳輸?shù)竭_(dá)設(shè)備2,解密函數(shù)D,經(jīng)解密后的明文P=D(K,C)。
AES 秘鑰可以使用128 位、192 位或256 位, 密鑰越長(zhǎng),解密越難,但秘鑰并不是越長(zhǎng)越好,需要綜合考慮處理器處理能力和實(shí)際應(yīng)用環(huán)境,本文采用128 位秘鑰。在AES 標(biāo)準(zhǔn)規(guī)范中,分組長(zhǎng)度只能采用128 位(16 個(gè)字節(jié),不滿的部分需要填充數(shù)據(jù))[9],因此,在網(wǎng)絡(luò)加密文件傳輸工具設(shè)計(jì)時(shí), 需要將數(shù)據(jù)包長(zhǎng)度統(tǒng)一為16 字節(jié)的整倍數(shù),不足的部分需要在信息段填充空白數(shù)據(jù),在數(shù)據(jù)包解密后,需要根據(jù)數(shù)據(jù)長(zhǎng)度,剔除無(wú)用信息。
網(wǎng)絡(luò)加密文件傳輸工具包含兩部分軟件, 第一部分是目標(biāo)設(shè)備Target 上的UEFI Shell 應(yīng)用軟件, 做TCP 客戶端,第二部分是主機(jī)Host 上的軟件,做TCP 服務(wù)器。目標(biāo)設(shè)備做客戶端可以自主控制與指定IP、 端口號(hào)服務(wù)器的連接和數(shù)據(jù)傳輸流程, 避免做服務(wù)器時(shí)被網(wǎng)絡(luò)內(nèi)未知客戶端惡意連接,傳輸病毒文件,保證目標(biāo)設(shè)備的安全。網(wǎng)絡(luò)加密文件傳輸工具有調(diào)試(debug)和加密(release)兩種工作模式,固件發(fā)布前,使用調(diào)試模式,固件發(fā)布時(shí),在客戶端代碼中限制,發(fā)布后必須使用加密模式。
文件傳輸時(shí),服務(wù)器與客戶端處于同一局域網(wǎng)內(nèi),為有效控制數(shù)據(jù)傳輸流程,需要設(shè)計(jì)傳輸通信協(xié)議,通信協(xié)議支持調(diào)試模式和加密模式。
通信協(xié)議格式見(jiàn)表1,一幀數(shù)據(jù)包由幀頭、指令碼、長(zhǎng)度、信息段、CRC(指令碼、長(zhǎng)度和信息段的循環(huán)冗余校驗(yàn)碼)[10]和幀尾組成。 加密模式下,因?yàn)锳ES 加密算法要求分組數(shù)據(jù)必須是128 位, 所以將數(shù)據(jù)包分為標(biāo)準(zhǔn)幀和擴(kuò)展幀兩種,標(biāo)準(zhǔn)幀長(zhǎng)度16 字節(jié),用于傳輸少量數(shù)據(jù),比如文件長(zhǎng)度和文件校驗(yàn)碼,擴(kuò)展幀長(zhǎng)度4096 字節(jié),用于傳輸文件內(nèi)容數(shù)據(jù)。指令碼01,客戶端發(fā)起傳輸請(qǐng)求;指令碼02,服務(wù)器應(yīng)答傳輸請(qǐng)求, 信息段內(nèi)容為4 字節(jié)文件長(zhǎng)度;指令碼03,服務(wù)器傳輸文件數(shù)據(jù),信息段包含4字節(jié)幀序號(hào)和文件數(shù)據(jù); 指令碼06, 服務(wù)器傳輸完成,信息段內(nèi)容為2 字節(jié)文件校驗(yàn)碼;指令碼04 和05,客戶端回復(fù)服務(wù)器接收狀態(tài),信息段為填充的空白數(shù)據(jù)。
表1 通信協(xié)議
調(diào)試模式下無(wú)需遵循AES 規(guī)范,無(wú)需區(qū)分標(biāo)準(zhǔn)幀和擴(kuò)展幀,長(zhǎng)度指定為信息實(shí)際長(zhǎng)度,信息段無(wú)需填充空白數(shù)據(jù)。
客戶端和服務(wù)器軟件調(diào)試模式下工作流程如下:
(1)啟動(dòng)服務(wù)器,指定需要監(jiān)聽(tīng)的IP、端口號(hào)和工作模式,等待客戶端連接。
(2)啟動(dòng)客戶端,指定服務(wù)器IP、端口號(hào)和工作模式,建立與服務(wù)器的網(wǎng)絡(luò)連接。
(3)客戶端發(fā)起傳輸請(qǐng)求。
(4)服務(wù)器應(yīng)答傳輸請(qǐng)求,同時(shí)傳輸文件長(zhǎng)度。
(5)客戶端獲取文件長(zhǎng)度,應(yīng)答成功,準(zhǔn)備接收文件數(shù)據(jù)。
(6)服務(wù)器分包發(fā)送文件數(shù)據(jù)。
(7)客戶端接收文件數(shù)據(jù),應(yīng)答成功。
(8)服務(wù)器傳輸完成,同時(shí)傳輸文件校驗(yàn)碼。
(9)客戶端獲取文件校驗(yàn)碼,比對(duì)接收的文件數(shù)據(jù)和文件校驗(yàn)碼,成功后生成固件文件,傳輸過(guò)程完成。
在傳輸過(guò)程中,客戶端會(huì)校驗(yàn)每一幀數(shù)據(jù),校驗(yàn)成功則應(yīng)答成功,校驗(yàn)失敗或接收超時(shí),均應(yīng)答錯(cuò)誤,服務(wù)器接收到應(yīng)答成功則傳輸下一包數(shù)據(jù), 接收到應(yīng)答錯(cuò)誤則重新傳輸上一包數(shù)據(jù)。
加密模式下,客戶端每次啟動(dòng)時(shí)會(huì)動(dòng)態(tài)生成秘鑰,服務(wù)端需輸入相同的秘鑰,建立連接后,客戶端和服務(wù)器的每一包通信數(shù)據(jù)都要經(jīng)過(guò)加密和解密過(guò)程, 工作流程見(jiàn)圖3。
圖3 傳輸工具工作流程
本次試驗(yàn)的目標(biāo)設(shè)備為飛騰FT-2000/4 平臺(tái), 預(yù)裝麒麟操作系統(tǒng),主機(jī)為Intel(R) Xeon(E3)平臺(tái),預(yù)裝Wondows7 旗艦版系統(tǒng),目標(biāo)設(shè)備第一次運(yùn)行客戶端軟件FileTransfer.efi 時(shí),需要先將其拷貝至硬盤,再將兩臺(tái)設(shè)備通過(guò)網(wǎng)線連接在同一局域網(wǎng)內(nèi)。
在主機(jī)上準(zhǔn)備好服務(wù)器軟件和固件文件, 先啟動(dòng)服務(wù)器軟件,再啟動(dòng)目標(biāo)設(shè)備,通過(guò)BIOS 設(shè)置,進(jìn)入U(xiǎn)EFI Shell 中。 啟動(dòng)客戶端軟件時(shí),需要輸入服務(wù)器IP、端口號(hào)和工作模式三個(gè)參數(shù)。 其中, 第三個(gè)參數(shù)為 “debug”或“release”,調(diào)試模式下傳輸速率更快,方便快速調(diào)試與測(cè)試。固件正式發(fā)布時(shí),將客戶端軟件代碼中的預(yù)定模式參數(shù)指定為release,固件發(fā)布后,輸入?yún)?shù)必須為release,在代碼內(nèi)部會(huì)檢查輸入?yún)?shù)與預(yù)設(shè)參數(shù)一致性, 檢查通過(guò)后,生成16 字節(jié)動(dòng)態(tài)秘鑰,將該秘鑰輸入到服務(wù)器軟件中,加密模式下,通過(guò)網(wǎng)絡(luò)發(fā)送接收的任何數(shù)據(jù)包都采用生成的動(dòng)態(tài)秘鑰進(jìn)行加密解密。 每次啟動(dòng)客戶端軟件, 會(huì)重新生成秘鑰,充分保證數(shù)據(jù)的安全性。
在兩種工作模式下分別測(cè)試傳輸編譯后的固件文件,客戶端軟件調(diào)試模式傳輸試驗(yàn)見(jiàn)圖4,加密模式傳輸試驗(yàn)見(jiàn)圖5。
圖4 調(diào)試模式傳輸試驗(yàn)
圖5 加密模式傳輸試驗(yàn)
針對(duì)UEFI 調(diào)試維護(hù)時(shí)拷貝文件效率低下以及特定場(chǎng)合的設(shè)備禁止插入存儲(chǔ)設(shè)備帶來(lái)的升級(jí)維護(hù)困難問(wèn)題,本文在TCP 協(xié)議和AES加密算法基礎(chǔ)上設(shè)計(jì)實(shí)現(xiàn)了網(wǎng)絡(luò)加密文件傳輸工具,在調(diào)試模式和加密模式下可以方便、安全地傳輸固件文件,適合應(yīng)用在實(shí)際工程中。目前,該傳輸工具需要將動(dòng)態(tài)秘鑰手動(dòng)輸入服務(wù)器軟件,后續(xù)可進(jìn)一步研究客戶端與服務(wù)器自協(xié)商生成動(dòng)態(tài)秘鑰,提高使用便捷性。