張小領(lǐng),謝 演,馮乃琪
(成都三零嘉微電子有限公司,四川 成都 610041)
2020 年1 月1 日起,《密碼法》的正式施行對我國密碼相關(guān)行業(yè)和技術(shù)的發(fā)展具有里程碑意義,將極大地推進我國密碼技術(shù)的發(fā)展和各行各業(yè)對密碼技術(shù)的應(yīng)用,使得“密碼泛在化”理念深入人心。
《密碼法》在商用密碼部分中定義“商用密碼用于保護不屬于國家秘密的信息。公民、法人和其他組織可以依法使用商用密碼保護網(wǎng)絡(luò)與信息安全”。
目前,商用密碼已經(jīng)應(yīng)用于電力、能源、通信、金融、交通及政務(wù)等領(lǐng)域。在人們的日常生活中,移動支付、電子錢包等技術(shù)就包含對商用密碼技術(shù)的應(yīng)用。通常,對稱密碼算法的應(yīng)用模式分為單段式調(diào)用和三段式調(diào)用。單段式是指只調(diào)用一次密碼算法接口輸入所需指定參數(shù)便可以完成一次少量數(shù)據(jù)的密碼算法功能。三段式是指需要按照指定順序多次調(diào)用密碼算法接口完成一次大量數(shù)據(jù)的密碼算法功能。但是,在商密對稱算法實際應(yīng)用中,當(dāng)主機端多線程、多會話、多任務(wù)等都需要使用密碼算法時,三段式調(diào)用應(yīng)當(dāng)能夠支持被打斷或交叉調(diào)用,表現(xiàn)為當(dāng)一個線程在三段式調(diào)用時另一個線程以任何一種方式調(diào)用算法接口,都不會使前序線程的密碼算法狀態(tài)丟失。
為滿足和支持主機端多線程、多會話、多任務(wù)等對密碼算法交叉調(diào)用的需求,需要對目前的商密算法實現(xiàn)方式進行修改、調(diào)整,使得在采用三段式密碼算法調(diào)用時能夠保持各自獨立的中間狀態(tài),同時應(yīng)用軟件需要配合商密算法的實現(xiàn)而設(shè)計交叉機制進行中間結(jié)果和狀態(tài)緩存,并管理和調(diào)度密碼算法的調(diào)用者——主機的線程、會話、任務(wù)等。
本文中采用的密碼設(shè)備端是以成都三零嘉微電子有限公司的密碼模塊(SSX1721 密碼卡)為主體實現(xiàn)的。此芯片通過國家商用密碼芯片二級認證,支持SM2[1]、SM3[2]、SM4[3]以及ZUC[4]等算法,具備可編程硬件密碼引擎。
為滿足密碼端設(shè)備可以被主機端多線程、多會話、多任務(wù)調(diào)用密碼功能,SSX1721 密碼模塊引擎通過編程邏輯可以使得密碼設(shè)備端中運行的固件可以訪問算法中間結(jié)果和狀態(tài)。密碼設(shè)備端中運行的固件需要能夠根據(jù)算法調(diào)用者編號以及其調(diào)用密碼算法的中間結(jié)果和狀態(tài)進行緩存,最后算法引擎能夠通過輸入算法的中間結(jié)果和緩存狀態(tài)恢復(fù)因交叉調(diào)用而打斷的算法,并能正確進行后續(xù)的運算。
密碼設(shè)備端的硬件密碼引擎包括算法所需要的各類寄存器、內(nèi)存以及算數(shù)邏輯運算單元,能夠通過專用的命令組合實現(xiàn)密碼算法,接收數(shù)據(jù)輸入,輸出所需要的中間結(jié)果、狀態(tài)或最終結(jié)果。
密碼設(shè)備端固件中的業(yè)務(wù)功能層需要實現(xiàn)對調(diào)用者的管理以及其調(diào)用中算法的管理,記錄當(dāng)前算法調(diào)用者的ID、密鑰信息、IV 以及算法模式等重要信息,實施引擎狀態(tài)管理,并能夠提供密碼設(shè)備端的狀態(tài)信息供主機端查詢。
在主機端協(xié)議調(diào)度層中實現(xiàn)對密碼設(shè)備端設(shè)備的設(shè)備占用鎖,當(dāng)進行對密碼設(shè)備端的原子功能進行調(diào)用時采用。譬如,線程A 采用單段式調(diào)用一次計算,或采用三段式的某一步驟,調(diào)用者需要在進行算法功能調(diào)用時,先查詢密碼設(shè)備端的狀態(tài)。只有在密碼設(shè)備端空閑時設(shè)置占用鎖,才能進行密碼功能的調(diào)用。
如圖1 所示,整個框架有主機端和密碼設(shè)備端部分組成。
圖1 總體框架
其中,主機端包含應(yīng)用程序以及與密碼設(shè)備交互的協(xié)議調(diào)度層、驅(qū)動層和硬件層。應(yīng)用程序根據(jù)業(yè)務(wù)需要通過調(diào)用協(xié)議調(diào)度層形成與密碼設(shè)備交互的命令和數(shù)據(jù),接著通過調(diào)用驅(qū)動層的硬件接口發(fā)送命令和數(shù)據(jù)到密碼設(shè)備端。密碼設(shè)備端接收、處理數(shù)據(jù),并將處理后的數(shù)據(jù)反饋到主機端。
密碼設(shè)備端包括協(xié)議調(diào)度層、業(yè)務(wù)功能層、驅(qū)動層以及硬件層4 大部分,如圖2 所示。
圖2 密碼設(shè)備端架構(gòu)
協(xié)議調(diào)度層主要完成和主機之間的數(shù)據(jù)協(xié)議處理。根據(jù)協(xié)議要求進行業(yè)務(wù)調(diào)度和執(zhí)行,是整個軟件的主體控制。
業(yè)務(wù)功能層稱為抽象層,通過調(diào)用SDK 提供的各模塊接口形成指定的業(yè)務(wù)需求功能。此項目需求的功能集中于該層,是項目實施的聚焦點。
驅(qū)動層直接與硬件層進行交互,并提供操作硬件模塊的軟件接口,又稱之為SDK 層。
硬件層是密碼卡底層硬件物理模塊。
密碼算法功能主體為商密算法,包括非對稱算法的加解密、簽名、驗簽、公私密鑰對生成、密鑰協(xié)商、對稱算法[5]的分組以及序列算法的加解密和摘要算法。
算法調(diào)用模式為單段式和三段式調(diào)用。單段式調(diào)用是指只需要一次調(diào)用一個功能接口便可完成一個完整密碼功能的調(diào)用方式,包含對稱算法、摘要、隨機數(shù)生成[5]、公私密鑰對生成[1]、簽名[1]、驗證[1]、非對稱加密和解密以及密碼協(xié)商。三段式調(diào)用是指需要按指定順序調(diào)用3 個功能接口才能完成一個完整的密碼功能,并且允許多次調(diào)用中間功能接口的調(diào)用方式,含摘要和對稱加解密。
如圖3 所示,多調(diào)用交叉管理的核心機制為多調(diào)用會話管理和引擎狀態(tài)管理。多調(diào)用會話管理會記錄當(dāng)前密碼算法調(diào)用者ID、密鑰信息、IV 以及算法模式等重要信息。引擎狀態(tài)管理則直接與會話管理配套使用,隨時記錄或更新三段式調(diào)用過程中屬于每一個密碼算法調(diào)用者ID 的當(dāng)前引擎狀態(tài)或中間結(jié)果。在發(fā)生交叉調(diào)用后,引擎狀態(tài)管理則可以恢復(fù)需要繼續(xù)調(diào)用算法的密碼算法調(diào)用者ID 上一次引擎狀態(tài)和中間結(jié)果,使得該密碼算法調(diào)用者ID 繼續(xù)完成后續(xù)密碼業(yè)務(wù),以此完成對稱算法、摘要(Hash)算法、非對稱算法(簽名、驗簽、加解密、密鑰協(xié)商)的多調(diào)用者單段式和三段式的交叉調(diào)用、三段式與三段式的交叉調(diào)用。
圖3 密碼功能設(shè)計
設(shè)計cipher_sess_st 結(jié)構(gòu)體實現(xiàn)多調(diào)用會話管理和引擎狀態(tài)管理。
結(jié)構(gòu)體原型如下:
該會話結(jié)構(gòu)體可存儲調(diào)用者的當(dāng)前算法信息,并且緩存三段式調(diào)用時中間狀態(tài)臨時緩存,恢復(fù)每個調(diào)用者使用密碼算法的打斷交叉調(diào)用前狀態(tài)。
三段式調(diào)用中,每一段(init、update、final)都需要傳入算法調(diào)用者ID。cipher_sess_st 可以根據(jù)此ID 進行關(guān)系映射,算法引擎以此恢復(fù)此前運行的算法中間結(jié)果和狀態(tài),保證算法后續(xù)的正確運行。
多會話調(diào)用流程如圖4 所示。
圖4 多調(diào)用交叉管理流程
(1)第一段init 調(diào)用時,通過cipher_sess[0]數(shù)組記錄cipher_id0 的密碼信息,cipher_sess[1]數(shù)組記錄cipher_id1 的密碼信息,并將各自status 置位init 狀態(tài)。
(2)第二段update 調(diào)用時,cipher_id0 將第一段中cipher_sess[0]中的密鑰、模式、iv 等信息配置到密碼引擎。
(3)檢查cipher_sess[0]中的status,如果是init,則調(diào)用一次算法運算接口,完成后將cipher_sess[0]中的status 置位update 狀態(tài)。
(4)讀取此時引擎中間狀態(tài)和數(shù)據(jù),將中間狀態(tài)和數(shù)據(jù)記錄或更新在cipher_sess[0]的mid_tmp_data 和iv 中(根據(jù)具體算法)。
(5)隨后cipher_id1 也調(diào)用了一次第二段update 操作,即為一次交叉調(diào)用,此時引擎內(nèi)部狀態(tài)已發(fā)生改變。
(6)cipher_id0 再次執(zhí)行update 時,將cipher_sess[0]的密碼信息配置到引擎。
(7)判斷cipher_sess[0]的status,如果不是init,則表明需要恢復(fù)引擎數(shù)據(jù)。
(8)將cipher_sess[0]上次保存或更新的引擎中間狀態(tài)和數(shù)據(jù)回寫到引擎,再調(diào)用一次算法運算接口。
(9)每次算法運算后都讀取此時引擎中間狀態(tài)和數(shù)據(jù),并更新在cipher_sess[0]的mid_tmp_data和iv 中(根據(jù)具體算法)。
(10)反復(fù)調(diào)用update 后,最后調(diào)用final 結(jié)束三段式調(diào)用,并清除cipher_sess 數(shù)據(jù)。
圖5 展示了對多調(diào)用交叉算法實現(xiàn)測試的代碼片段。整個流程采用國密算法中的分組算法、摘要算法、SM2 算法簽名、驗簽、加密、解密以及密鑰協(xié)商的三段式和單段式交叉調(diào)用。由于圖文限制,展示的流程只為測試的一小部分。
圖5 多調(diào)用交叉展示
測試流程如下:
(1)分組算法SM4 的CBC 模式初始化;
(2)分組算法SM4 的CBC 模式做一次加密運算,并比較計算結(jié)果;
(3)分組算法SM4 的ECB 模式初始化;
(4)分組算法SM4 的ECB 模式做一次加密運算;
(5)SM3(摘要)初始化;
(6)分組算法的SM4 ECB 模式初始化;
(7)SM3(摘要)做一次運算;
(8)SM3(摘要)做final 運算;
(9)SM2 簽名運算;
(10)SM4 ECB 做一次加密運算;
(11)SM2 加密運算。
測試中采用的算法在經(jīng)過上述流程的交叉調(diào)用后,將其輸出的數(shù)據(jù)與事先準(zhǔn)備好的樣本數(shù)據(jù)進行對比,結(jié)果正確。文中提出的算法交叉調(diào)用機制的實現(xiàn)方式被證實是正確可行的,可在實際應(yīng)用中用于滿足主機端多線程、多會話、多任務(wù)等對密碼算法交叉調(diào)用的需求。
本文介紹了一種算法交叉調(diào)用機制的實現(xiàn)方法,核心在于對算法執(zhí)行的中間結(jié)果和狀態(tài)的保存,并對其實現(xiàn)結(jié)果進行測試。測試顯示,此實現(xiàn)方法能夠使得密碼設(shè)備所支持的算法被主機端多線程、多任務(wù)交叉調(diào)用,滿足當(dāng)今愈發(fā)復(fù)雜的應(yīng)用場景。此外,此實現(xiàn)方法采用的資源少,效率高,能夠低成本地移植在同類型的產(chǎn)品上。