李 莉,史國振,李雪梅
(1.北京電子科技學院 電子與通信工程系,北京 100070; 2.北京電子科技學院 信息安全研究所,北京 100070)
高速發展的數字經濟和網絡業務面臨著越來越多安全問題,密碼服務作為保證數據傳輸安全的最基本的服務,也成了保障網絡安全的不可或缺的環節,密碼服務設備也成了安全網絡的基本配置。面向越來越多的業務安全需求,密碼設備必須提供不同的密碼運算服務,且要求具有快速的數據處理能力。密碼運算作為計算密集型應用,為了提高其處理速率,通常采用多密碼算法核并行處理、單密碼算法流水線處理的硬件實現架構,通過多核并行處理提高多業務處理的能力,以及單核流水線實現高的數據吞吐率。
考慮到經過網絡傳輸的多密碼業務流存在業務間的相互交叉,如何最大性能地發揮并行流水處理的有效性是必須考慮的問題。本文以多業務交叉的密碼業務流為研究對象,考慮不同密碼工作模式特點,提出了一種關聯業務數據遷移的硬件架構,從而更好地發揮密碼設備多密碼算法核并行流水處理性能。
如圖1所示,在高并發、多對多通信的場合下,請求密碼服務的數據可能來自不同的應用服務器,即不同的數據鏈接,也可能來自同一數據鏈接下的不同業務,為實現密碼服務的快速正確響應,密碼服務器必須有快速的異步并發數據處理能力。
文獻[1]研究了密碼算法在GPU上的并行化處理技術,評估了在CUDA上對AES算法采用不同并行設計實現后的性能。文獻[2-5]研究了ECC算法的特點,通過對點乘、模乘運算的并行處理,提高了橢圓曲線的運算性能。戴紫彬等、L. Bossuet等研究了密碼算法的流水線、串行化實現技術,以達到多核并行和高吞吐率目的[6,7]。
多密碼算法IP核的并行處理涉及兩方面的問題:并行處理架構以及算法IP的調度。文獻[8]通過并行層疊執行結構,實現ECC算法在數據級、線程級和任務級上的并行計算。文獻[9]針對密碼處理器運算過程中,數據訪存時間開銷大的問題,提出了一種層次化-分布-分體式流存儲結構,改善了數據訪存開銷。文獻[10]提出了一種減少核間通信開銷的設計方法。文獻[11]提出了一種面向分組密碼的可重構異構多核并行處理架構RAMCA,具有獨立的指令傳輸通路、數據輸入通路和數據輸出通路,但未涉及交叉業務數據處理的問題。
考慮密碼運算的特點,密碼運算通常是以固定大小的分組數據為單位進行的,且根據采用的密碼工作模式的不同,同一業務的不同分組間的關系也不同。以ECB、CTR工作模式為例,不同分組間的運算相互獨立,可以進行并行運算;但是CBC、CFB等工作模式,后一分組數據的運算要用到前一分組數據的運算結果,即不同分組間存在關聯性,不能進行并行運算。且數據流作業包間存在如圖2所示的分布情況。
在此,對分組間存在關聯性的業務稱為關聯業務,關聯業務的存在,勢必影響多核密碼運算的并行流水處理,從而降低業務的處理速率。
文獻[12,13]提出了一種支持多種密碼算法運算隨機交叉運算的多核流數據處理模型,通過基于業務標識的分層硬件調度實現業務流的并行處理。文獻[14]提出了一種本地存儲異構多核并行架構,將數據的處理分為分轉、預處理、運算及同步重組4個階段,通過基于數據標識的分級處理機制實現作業包與算法IP核間的映射與數據處理,增設密鑰及狀態存儲器(KSM)和KSM存取控制邏輯用于交叉訪問下關聯作業包中間狀態的存取,保證并行及串行工作模式下數據處理的正確性。考慮到數據存取速率的限制,以及架構并沒有對算法核輸入端的關聯數據做額外的管理,仍會造成交叉數據在一定程度上的等待,從而影響數據吞吐率。本文在文獻[14]的基礎上,提出一種關聯業務數據遷移的硬件架構,刪除KSM,在算法核前端增設關聯CAM,算法核后端增設關聯FIFO的方式,進行關聯作業包的管理,實現交叉數據流的不間斷高速處理。通常查找功能在硬件上的實現是在時鐘驅動下,對搜索空間的依次對照實現的,最壞情況下存儲容量為n的查找操作需要消耗n個時鐘周期,即查找時間復雜度為O(n), 本文采用關聯CAM,實現查找時間復雜度由O(n) 減少為O(1), 使得后序關聯作業包的查找可以實現快速定位,加速數據流的處理。后端采用關聯FIFO的設計,使得先運算完的關聯作業包的后序作業包可以及時得到處理,減少對前段關聯CAM的占用,從而減少系統對存儲空間的需求。
本文提出的關聯業務數據遷移的處理模型如圖3所示,通過將業務流中的關聯作業包遷移至關聯CAM,在其前序作業包運算完成時,將其送至算法核的處理方式,提高業務流的整體處理速率。
其中接口模塊用于接收網絡發送過來的數據流,為保證數據流的處理速率,采用PCIE接口的DMA方式進行數據的接收;算法分轉模塊用于將數據流中的不同業務數據包發送至對應的算法核進行處理;Pre_FIFO模塊用于接收獨立作業包和關聯作業的首包數據,進行排隊暫存;關聯CAM用于存儲前序作業包尚未運算完成,因而不能進行處理的后序關聯作業包;選擇模塊用于將關聯CAM或Pre_FIFO中的數據送至算法核輸入隊列進行排隊等待運算。在關聯FIFO有運算完成的關聯作業包數據時,優先處理關聯CAM中的數據。算法核模塊為不同的密碼算法IP核;輸出FIFO用于接收運算完成的作業包;關聯FIFO用于存儲運算完成的關聯作業包,其中尾包由于沒有后序作業包,所以不進入關聯FIFO,關聯FIFO中的數據用于生成后序作業包運算的輸入數據;輸出反饋模塊用于接收各算法核運算完成的數據,并發送回數據應用程序。
為便于業務流的處理,構造如下的數據包格式: {Header,load}, Header={IDPROCESS,IDIV,head,tail,SEQ,CMD,l}。
IDPROCESS:進程號,API接口的算法數據發送處理進程為每個鏈接分配獨立的進程號,與應用進程對應,用于區分不同的數據鏈接。
IDIV:業務號,每個業務有一個全局唯一的IDIV。
SEQ:同一業務流中的作業包序號,用于作業包重組。
Head:業務的首個作業包(首包)標識。
tail:業務的最后一個作業包(尾包)標識。
CMD:命令字,用于標識業務處理類型, CMD={CYPID,OPTMODE}。
(1)CYPID字段標識算法類型和算法IP的ID號。算法類型如SM2、SM3、SM4,每一類算法可以采用多個模塊實現,此字段的位數在FPGA內部邏輯資源充足的條件下決定了可以線性擴展的算法模塊的個數。若此字段位數為n,則最多可擴展2n個密碼算法模塊。為加強數據處理的并行性,算法類型和算法ID號采用統一編碼的方式,由加密終端CPU按照隨機調度的方式一次完成填寫,與算法模塊一一對應的同時,保證算法IP核間的均衡性。
(2)OPTMODE字段表示算法的具體操作,例如加密、解密、簽名、驗簽以及不同的加/解密模式(ECB、CBC、OFB)等。
l:數據長度,用于指出本作業包內運算數據的長度,一般為一次算法運算所需最小分組長度的整數倍。
load={IV,KEY,Data(l)} 為可變長度的數據區。其中IV表示初始向量或中間變量字段,KEY為密鑰字段,當SEQ=1時,IV和KEY字段存在。Data(l) 為長度l的運算數據。在進行業務數據的分割打包時,若最后一組數據不夠一次業務處理數據最小分組長度時,進行補足。
上述并行數據處理架構的FPGA實現如圖4所示,數據的處理分為3個階段,分別由分轉pd_se_ctrl、預處理IPx_CTRL及運算IPx這3個模塊完成,模塊間采用FIFO進行數據流的緩沖。虛線框內的部分可以根據各算法模塊進行線性擴展,算法模塊的具體實現個數可以不同。
FPGA與應用程序之間采用PCIE接口,以DMA的方式進行業務數據的傳遞。應用程序將業務數據拆分并封裝為通信作業包,以阻塞的方式寫入算法應用進程對應的下行數據存儲區DOWN_FIFO中。算法數據的下行和上行讀寫操作分別由pd_tlp_ctrl和pu_tlp_ctrl完成。算法分轉模塊pd_se_ctrl完成對作業包頭命令CMD的解析,把數據分轉到相應的IPx_DOWN FIFO或Related CAM中。
下行預處理模塊IPx_CTRL負責對命令的解析,并由此構造算法模塊需要的處理子命令,以及獲取處理本作業包所需要的中間狀態數據,并將作業包頭Header作為一個數據項放入本算法模塊對應的作業包同步隊列IPx_SYN FIFO,將分組后的數據、處理子命令、算法狀態,及獲取的基礎數據作為一個數據項放入本算法模塊對應的算法運算隊列OPRTxFIFO。
上行控制模塊UP_IPx_CTRL將作業包同步隊列中提取的作業包頭與處理后數據隊列中提取的數據合并為一個帶有鏈路數據標識的完整數據項,送入上行IPx_UP FIFO中,供pu_tlp_ctrl根據鏈路數據標識將運算結果返回給相應的上行數據存儲區。
隨機交叉的數據流以及異構IP核,不能保證關聯作業包進入處理系統時,其前序作業包已處理完,因此,該系統在架構中增加關聯CAM和關聯FIFO。其中關聯CAM用來存儲尚不能進入算法核進行處理,處于等待前序關聯作業包運算結果的關聯作業包;關聯FIFO用于保存關聯業務中間狀態,即關聯作業包(非尾包)的運算結果,以供對應業務的后序作業包使用。
由于每個算法IP核都有自己獨立的上行隊列和下行隊列,所以增加算法IP核不會對其它的操作造成影響。
數據的處理采用兩級命令解析的方式進行,系統按照通信數據包中包含的屬性信息對數據進行解析和分流,主要取決于CMD={CYPID,OPTMODE}。 第一級解析在分轉模塊pd_se_ctrl中完成,根據算法類型CYPID字段,進行數據的分流,將不同密碼算法需求的作業包分轉至對應的下行數據IPx_DOWN FIFO或Related CAM中,排隊等待;第二級解析在下行預處理模塊IPx_CTRL中完成,根據運算模式OPTMODE,生成對應的子命令,并將命令和相應的數據傳送給IP核接口OPRTxFIFO中。完整的數據處理過程包含6個狀態,見表1。
數據處理狀態轉換如圖5所示。
內容可尋址存儲器(CAM)具有高速、并行、易擴展的特點,常用于路由器中,實現地址的快速查找。這里用于實現根據任務ID和作業包序號快速查找同一任務后序作業包。關聯CAM模塊如圖6所示,內部包含任務ID和作業包序號存儲列表id_seq_list、列表狀態寄存器status_reg、作業包數據存儲雙端口DPRAM、數據拆分寫控制模塊write_ctrl,以及一個查詢條件比較模塊compare。

表1 數據處理狀態
關聯CAM模塊的讀和寫相互獨立,可并行執行,通過列表狀態寄存器status_reg保證并行執行時讀寫操作的不沖突。
關聯CAM的寫操作由分轉模塊pd_se_ctrl啟動,當分轉模塊判斷作業包為關聯作業包,且非首包,則將此數據通過din_wr送CAM保存,算法如下:
if OPTMODE=={CBC|OFB|CFB}
if head!=1
begin
wr_en<=1;
din_wr<=作業包;
end
write_ctrl模塊將數據拆分為兩部分:任務ID和作業包序號{IDIV,SEQ}、 作業包數據data,其中{IDIV,SEQ} 存儲在列表中,Data存儲在DPRAM中,且保持地址聯動。
關聯CAM的讀操作由Related FIFO的非空狀態啟動,給出rd_en信號,由Related FIFO給出的前序作業包的運算結果din_rd作為查詢輸入信號,查詢條件為同一任務ID和后序作業包序號,即IDIV&& (SEQ+1)。 根據查詢條件對id_seq_list單元進行并行搜索,給出滿足條件的作業包數據所在的地址rd_addr,以此為地址從雙口DPRAM中將數據取出,送對應IP核的輸入FIFO。
其中ram_full和infifo_almostfull為流控信號,保證作業包的不丟失。
在這種設計方式下,若前序作業包存在,則從查詢數據(din_rd,ren)給出到找到結果(dout),只需要4個時鐘周期,其中匹配成功(find)只需兩個時鐘周期,如圖7所示。
考慮到及時處理運算完成的關聯作業包,以便移除其對關聯CAM的占用,降低對CAM存儲容量的需求,增加利用率,輸出關聯作業包的存儲采用FIFO的形式,下行預處理模塊IPx_CTRL按作業包完成順序接收其后序作業包。
作業包在算法IP核中運算完成后,上行控制模塊UP_IPx_CTRL判斷運算結果是否為關聯業務作業包輸出,若為非關聯作業包或關聯作業包的尾包數據,則將其送至輸出FIFO;若為關聯作業包(尾包除外)輸出,則在將其送至輸出FIFO的同時,將其送至關聯FIFO。
if (OPTMODE=={CBC|OFB|CFB} && tail==0)
begin
UP_FIFO_data<=作業包;
UP_FIFO_wr<=1;
if (Related_FIFO_almostfull==0)
begin
Related_FIFO_full_flag<=0;//流控信號
Related_FIFO_wr<=1;
Related_FIFO_data<=作業包
end
end
考慮到交叉數據流的復雜性,極端情況下,可能在其前序作業包處理完成時,其后序作業包尚未進入關聯CAM,為避免對其它任務作業包的阻塞,在經過一定的時鐘周期,仍沒有匹配作業包的情況下(find==0),將關聯FIFO的此輸出數據重新轉存至關聯FIFO,從而越過此作業包,進行下一個作業包的處理,如圖8所示。
數據間的同步通過同步IPx_SYN FIFO和下行預處理模塊IPx_CTRL、數據重組模塊UP_IPx_CTRL完成。下行預處理模塊IPx_CTRL將作業包的包頭取出,送入同步IPx_SYN FIFO,數據重組模塊UP_IPx_CTRL在作業包運算完成后,再將運算完成的數據與同步IPx_SYN FIFO中存儲的包頭數據組合為一個完整的作業包輸出。由于作業包包頭同步信息的存儲單元和算法處理IP核的接口單元均為FIFO,保證了UP_IPx_CTRL進行封裝時包頭和處理數據運算結果間的一致性。
將此硬件實現方案在FPGA上進行實現,并在modelsim下仿真,觀察不同作業包和不同關聯業務作業包數量下的數據流執行時間。
以最多需要3種IP進行處理的5個業務共20個作業包隨機交叉的數據流為例,仿真結果如圖9所示,為便于觀察,只取數據流上下行中存儲模塊的讀信號,其中find1、find2、find3為3個IP核對應的關聯CAM匹配輸出,可以看出關聯CAM2沒有信號,表示數據流中沒有需要IP2處理的關聯業務,因此IP2的關聯FIFO也無數據,ip2_out_dependfifo_rd始終為0,IP2輸入FIFO上infifo2_rd信號的存在是由于數據流中存在需要IP2處理的非關聯業務。
關聯CAM的存儲深度為48,若任務id和作業包序號分別為32 bit和16 bit,分組運算數據的大小為256 bit,則需要的存儲空間為: 48×(32+16)+48×256≤16K。
當數據流總量為100個作業包,隨機屬于10個不同的業務,其中4個業務為關聯業務,且關聯作業包的總數為40個,即關聯業務量占總業務量的40%。Modelsim的仿真結果如圖10所示,其中橫軸表示數據流中作業包的分布,白色塊表示獨立作業包,其它色塊表示關聯作業包,且相同顏色的色塊屬于同一關聯業務。縱軸表示數據流的執行時間。
當數據流總量為100個作業包,且分別屬于10個不同的業務,其中6個業務為關聯業務,關聯作業包的總數為60個,即關聯業務量占總業務量的60%。Modelsim的仿真結果如圖11所示。
可見,相同大小的數據流,且數據流中的關聯業務和關聯作業包的數量相同時,數據流的執行時間與不同關聯業務作業包的數量及其在數據流中的位置有關。
若數據流中有n個關聯業務,每個關聯業務的作業包數分別為a1,a2,…,an個,有m個非關聯業務,每個非關聯業務的作業包數分別為b1,b2,…,bn個。若能將非關聯作業包穿插在關聯作業包之間,在∑aiTi≥∑bi的情況下,則在IP核流水線處理業務的情況下,可以使得非關聯作業包得到盡快的處理,而數據流的整體處理時間取決于關聯作業包的串行執行時間。
隨機選取6組數據流,每組數據流的作業包數均為100,且分別屬于10個不同的業務,其中6個業務為關聯業務,關聯作業包的總數為60個。將關聯CAM改為關聯FIFO,對這6組數據流的執行時間進行測試,仿真結果如圖12所示。
可見,采用關聯CAM對關聯作業包進行遷移的設計方式有利于提升交叉業務數據流的處理速度。由于IP核采用流水線的數據處理方式,所以在系統設計中,對于同一功能的IP進行數量的擴展,其對數據流處理速度的提升貢獻不大,省出的邏輯空間可以用于擴展關聯CAM和關聯FIFO。
本文提出并在FPGA上實現了一種關聯業務數據遷移的流數據并行處理系統。仿真結果驗證,在多種不同的應用同時請求密碼運算服務的場景下,該系統可以實現對交叉業務數據的正確處理,避免輸入數據流阻塞現象的發生,實現業務數據的不間斷處理。該系統的不足在于隨著交叉程度的增加,所需關聯FIFO和關聯CAM的空間也要適當增加,否則不能保證非關聯數據的及時處理。