姜冬梅,何欣霖,李 軍
(成都三零嘉微電子有限公司,四川 成都 610041)
隨著云計算、大數據、5G以及高清視頻業(yè)務等領域網絡信息技術的快速發(fā)展,通信設備對密碼處理單元的加解密性能提出了更高的要求。為了滿足網絡匯聚層、核心服務器對海量密碼業(yè)務處理能力的需求,需要研究具有高性能的密碼芯片。
在基于對稱算法的密碼業(yè)務中,需要解決密鑰和IV的管理(初始化、存儲、訪問、更新與注銷)。密碼服務涉及的密鑰來源有以下兩種:一是一包一密,隨包下發(fā),不需要維護;二是密鑰需要由主機下發(fā)到加解密芯片并保存在加解密芯片內部,初始化完成后,由主機和加解密芯片共同完成密鑰的維護。本文主要研究第二種。密碼服務涉及的IV來源也有兩種:一是一包一初始向量(Intial Vector,IV),隨包下發(fā),故無須考慮IV維護;二是對較大數據進行級聯(lián)加解密處理,此時的IV生命周期為這個級聯(lián)處理數據的整個處理周期,對于上層應用軟件則是維護一個加密隧道的線程周期。本文主要研究第二種。IV的初始化、更新和銷毀,需要加解密芯片協(xié)同主機下發(fā)的初始化包(initial package)、更新包(update package)和結束包(final package)共同實現,如圖1所示。
圖1 級聯(lián)加解密過程
一個級聯(lián)加解密過程可分為初始階段、更新階段和結束階段3個階段,更新階段可以處理多個數據包。包序號和IV一對一綁定,密鑰索引和密鑰一對一綁定,下文將整個級聯(lián)加密過程中的數據包統(tǒng)稱為級聯(lián)包。
初始階段:首先主機創(chuàng)建一個加密隧道線程,完成密鑰初始化,實現密鑰和密鑰索引的綁定,將包序號、IV、密鑰索引及數據下發(fā)到密碼芯片;其次密碼芯片根據密鑰索引查找密鑰,并將密鑰、IV和數據送入加解密模塊進行運算;最后運算結果返回主機,并將運算結果的最后一個級聯(lián)分組寫入IV存儲空間,完成IV的更新。
更新階段:首先主機下發(fā)包序號、密鑰索引和數據;其次密碼芯片根據包序號和密鑰索引從本地緩存獲取IV和密鑰,連同數據送入加解密模塊進行運算;最后運算結果包返回主機,并將運算結果的最后一個級聯(lián)分組寫入IV存儲空間,完成IV的更新。
結束階段:首先主機下發(fā)包序號、密鑰索引和數據;其次密碼芯片根據包序號和密鑰索引從本地緩存獲取IV和密鑰,連同數據送入加解密模塊進行運算,運算結果包返回主機;最后主機釋放包序號,加密隧道現場注銷。
可見,在加解密過程中需要解決密鑰和IV的存儲和訪問。在安全服務器應用領域,加解密業(yè)務通常需要支持百萬級用戶,密鑰和IV的存儲需求高達幾百兆字節(jié),片上靜態(tài)隨機存取存儲器(Static Random Access Memory,SRAM)已不能滿足應用的需求。DDR較SRAM具有容量大、成本低等特點[1],因此DDR取代片上SRAM成為密鑰和IV的存儲器。通常,一個密鑰或一個IV只有幾十個字節(jié),當多用戶多線程加解密業(yè)務同時進行時,需要維護很多密鑰和IV,就會對DDR產生大量的離散數據讀寫訪問。而芯動的DDR控制器和鎂光的DDR顆粒、Cadence的DDR控制器和鎂光的DDR顆粒的訪問延遲均在幾十個周期,這是由于對于DDR的離散數據訪問的延遲較大,因此存在訪問性能低的問題。
針對DDR訪問的延遲較大的問題,本文提出預讀機制,提前發(fā)起讀操作,讀回的數據緩存到高速緩沖存儲器(cache)中,當加解密模塊發(fā)起讀寫IV和密鑰操作時,可直接從cache中讀寫數據,訪問延遲小。當多包級聯(lián)時,IV和密鑰數據具有時間局部性[2],而當包序號連續(xù)時,IV數據具有空間局部性[2],因此在加解密模塊與DDR之間引入一級cache,cache命中率較高,從而減少了DDR的訪問次數。
在密碼芯片中,高速加解密業(yè)務由高速接口、直接存儲器訪問(Direct Memory Access,DMA)、數據整形和加解密模塊共同完成,如圖2所示。高速接口是主機和密碼芯片的通信接口;DMA模塊將下行包從高速接口搬往加解密模塊,將上行包從加解密模塊搬往高速接口;數據整形模塊將下行包數據進行整形并分發(fā)到加解密陣列中的各個加解密單元,當完成加解密后,將數據匯聚整理后組成上行包,送入DMA模塊。加解密模塊通常由多個加解密單元組成,完成加解密業(yè)務。
圖2 DDR硬件加速器在密碼芯片中的位置
如圖2所示,DDR硬件加速器包含預讀檢測和cache加速模塊。預讀檢測模塊用于檢測來自主機的高速接口的輸入數據,當檢測到初始包的密鑰索引時,向DDR發(fā)起讀密鑰請求,cache加速模塊在收到讀請求后,從DDR中讀取密鑰,并將其存儲在cache中。當數據流經過DMA和數據整形模塊后,到達加解密模塊,加解密模塊根據包序號和密鑰索引向DDR發(fā)起訪問讀寫密鑰和IV請求,此時密鑰和IV已經存在cache中,可以較快地完成密鑰和IV的讀寫操作。
密碼業(yè)務通常采用包傳輸模式,密鑰索引字段位于包頭信息中。預讀檢測模塊根據包格式,找出初始包的密鑰索引字段,根據密鑰的索引規(guī)則,計算密鑰在DDR中的存儲地址,發(fā)起一筆長度為1、首地址為該DDR地址的讀操作。cache加速模塊在收到來自預讀模塊的讀請求后,向DDR模塊發(fā)起讀請求,并讀回一筆長度為緩存行(cache line)大小的數據包存放到cache中,以便后續(xù)的加解密模塊可以從cache中讀取密鑰。
常見的cache組織方式包含全關聯(lián)、直接映射和路組關聯(lián)[3-5]。為了提高cache的命中率,本設計采用全關聯(lián)方式。加速器的設計如圖3所示,下面分別就各個子功能進行詳細描述。
圖3 cache加速模塊
AXI_GS模塊將AXI總線接口轉化成內部自定義總線接口,并將讀寫命令、地址和數據送往內容可尋址存儲器(Content Addressable Memory,CAM)search。該模塊內設有深度為8的輸入緩存和輸出緩存,用于消除瞬時帶寬不匹配對系統(tǒng)性能造成的影響。
CAM search模塊用于檢測地址是否命中,它將burst首地址送給CAM模塊,從CAM模塊獲取命中信息,同時將讀寫命令、地址和數據送往Write and read process模塊。
Address FIFO用于存放未完成的且需要從DDR顆粒讀取數據的讀寫操作的burst首地址和burst ID。在Write and read process模塊中,對于地址未命中讀操作和地址未命中且需要從DDR讀數據回填cache line 的寫操作,burst首地址和burst ID寫入Address FIFO;在Write and read process模塊中,命中的寫操作需要檢查地址是否與Address FIFO中的地址相同,若相同,則當前操作與之前操作可能存在數據相關性[4],需要等到之前操作完成后,才開始當前操作。在Write and read process模塊中,地址命中的讀操作,需要檢查當前讀地址是否與Address FIFO中的地址相同,若相同,則當前操作與之前操作可能存在數據相關性,需要等到之前操作完成后才開始當前讀操作,此外還需要檢查當前讀ID是否跟Address FIFO的讀ID相同。根據AXI總線相同ID順序執(zhí)行的要求,則應該等到該ID的之前操作完成后,才開始當前讀操作。
Write and read process模塊根據地址是否命中,對讀寫burst進行分別處理。
為了減少對DDR的訪問,讀操作采用lookthrough機制[3,4,6]。對于地址命中的讀burst,讀命令和地址被送往Match read process模塊處理;對于地址未命中的讀burst,向AXI_GM_RD模塊發(fā)起AXI讀請求,將該筆讀響應的參數寫入PFIFO,同時將首地址寫入Address FIFO。
為了盡快向加解密模塊返回寫響應信號,寫操作采用write-back機制[3,4,6]。對于地址命中的寫burst,寫地址、寫數據、寫命令送往SRAM write interface模塊處理;對于地址未命中的寫B(tài)urst,寫地址、寫數據、寫命令送往SRAM write interface模塊,若burst長度小于cache line大小,為了保持cache數據和DDR數據一致,則需要從DDR讀數據回填當前cache line,因此會向AXI_GM_RD模塊發(fā)起AXI讀請求,將該筆讀響應的參數寫入PFIFO,同時將首地址寫入Address FIFO。每次操作,會更新CAM和LRU。
SRAM write interface用于處理寫burst,它先將寫數據寫入SRAM,然后將response寫回AXI_GS響應通道。
GM read response process模塊根據PFIFO中的參數,處理從AXI_GM_RD模塊讀回的DDR數據。若是地址未命中寫,則將從DDR讀回的數據寫入SRAM中;若是地址未命中讀,則將從DDR讀回的數據寫入AXI_GS響應通道,同時將數據寫入SRAM。
數據回收模塊采用最近最少使用(Least Recently Used,LRU)替換算法[7-9]實現對cache line的更新。為了避免cache滿時,沒有可用的cache空間,導致流水線被阻塞,本設計在cache將滿未滿時,把最久沒有訪問過的cache line狀態(tài)清零,更新LRU矩陣和CAM狀態(tài),若該cache line 中的數據比DDR中的數據新,則讀出cache line的數據并寫入DDR中。當接收到Flush命令時,將整個CAM的狀態(tài)復位,當cache line的數據比DDR數據新時,則讀出cache line的數據并寫入DDR中 。
CAM[10]模塊用于查詢地址是否命中。當地址命中時,命中標志生效并返回當前地址所在的cache地址;若地址未命中且cache不滿時,命中標志無效并返回可用的cache地址;若地址未命中且cache已滿時,命中標志無效并返回沒有可用cache地址的標志。
LRU用于查找最久未被使用的cache line。本設計使用LRU矩陣算法[11]。
AXI_GM_RD用于將內部的讀請求總線轉換成AXI讀地址、讀數據通道信號。
AXI_GM_WR用于將內部的寫請求總線轉換成AXI寫地址、寫數據以及寫響應通道信號。
REG_IF模塊為寄存器模塊,用于CPU配置模塊寄存器、讀取模塊狀態(tài)和調試信息。
為了提高性能,采用全流水線設計[10,12]。寫操作處理過程包含4級流水:第1級,AXI_GS將AXI總線轉化為內部總線;第2級,cam search模塊檢查地址是否命中;第3級,SRAM write interface將數據寫到SRAM并向GS response arbiter輸出寫響應;第4級,AXI_GS將內部寫響應轉換成AXI寫響應。
地址命中的讀操作的處理過程包含4級流水:第1級,AXI_GS將AXI總線轉化為內部總線;第2級,cam search模塊檢查地址是否命中;第3級,match read process從SRAM讀回數據,并將其送往GS response arbiter;第4級,AXI_GS將內部讀響應轉換成AXI讀響應。
地址未命中的讀操作的處理過程又分為請求過程和響應過程。請求過程包含4級流水:第1級,AXI_GS將AXI總線轉化為內部總線;第2級,cam search模塊檢查地址是否命中;第3級,write read process通過AXI_GM_RD模塊向DDR控制器發(fā)起讀請求;第4級,AXI_GM_RD將內部的讀請求轉換成AXI讀地址通道信號,送給DDR控制器。響應過程包含3級流水:第1級,AXI_GM_RD將來自DDR控制器的讀數據通道信號轉換成內部讀響應信號;第2級,GM read response process將來自AXI_GM_RD模塊的讀數據寫入SRAM,同時送往GS response arbiter;第3級,AXI_GS將內部讀響應轉換成AXI讀響應。
采用FIFO設計,PFIFO將DDR讀請求和讀數據分開,可以支持Outstanding操作。Address FIFO用于存放未完成的且需要從DDR顆粒讀取數據的burst的首地址和ID,用于解決數據的相關性和AXI總線要求相同ID順序執(zhí)行的問題。
為了簡化設計,所有仲裁均采用固定優(yōu)先級算法[11,13]。
數據回收與數據讀寫相互獨立,并行完成。當正在被回收的對象又被重新訪問時,完成回收后,cam的狀態(tài)不被清除。
如圖2所示,預讀檢測利用DMA和數據整形模塊的延遲(通常幾十個周期),提早發(fā)起對DDR的讀操作,讀回的數據存放于cache中,這樣抵消了DDR訪問延遲對加解密模塊的影響。該模塊易于實現且硬件開銷不大。
當包序號連續(xù)時,由于IV數據的存儲地址是由包序號索引,相鄰的級聯(lián)包的IV數據存儲地址連續(xù),因此IV數據具有空間局部性。當多包級聯(lián)時,由于更新包和結束包與初始包有相同的IV地址和密鑰地址,因此密鑰和IV數據具有時間局部性。由于數據的時間局部性和空間局部性,cache加速器會有較高的命中率,使得大量密鑰和IV的訪問在cache中完成,從而有效減少DDR的訪問次數。
本文用芯動的DDR控制器、鎂光的DDR3仿真模型以及SYNOPSYS的VCS仿真工具,搭建了仿真環(huán)境。本文分別對不同個數的級聯(lián)包,以及包序號是否連續(xù)進行有、無加速器的對比試驗。IV長度為16字節(jié),4個級聯(lián)包包個數分別為1,2,3,4,包序號連續(xù)時,加解密模塊讀寫IV和密鑰所需時間如表1所示,單位為時鐘周期;IV長度為16字節(jié),4個級聯(lián)包包個數分別為1,2,3,4,包序號不連續(xù)時,加解密模塊讀寫IV和密鑰所需時間如表2所示,單位為時鐘周期。
表1 包序號連續(xù)的訪問時間
表2 包序號不連續(xù)的訪問時間
通過對比試驗,由表1、表2可知:加速器對密鑰和IV的訪問性能有較大提高,當包序號連續(xù)時,加速器性能有80%以上的提升,當包序號不連續(xù)時,有50%以上的性能提升。
本文設計并用Verilog硬件描述語言實現了一種預讀與cache結合的DDR硬件加速器。通過對比試驗說明,加速器較大程度上提高了DDR的訪問性能,且適用于安全服務器領域的對稱算法密碼芯片的密鑰和IV存儲管理,有效地解決了片上SRAM存儲容量不夠,片外DDR訪問效率低的問題。