專利名稱:一種適用于嵌入式處理器的數(shù)據(jù)完整性驗證方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)字集成電路領(lǐng)域,具體涉及一種適用于嵌入式處理器的數(shù)據(jù)完整性 驗證方法,該方法的核心是多粒度存儲器散列計算,是一種具有高性能,少相關(guān)訪問,低初 始化時間的數(shù)據(jù)完整性校驗方法。由于在設(shè)計時就考慮了性能與開銷等因素,該方法完全 適用于嵌入式系統(tǒng),也適用于計算機系統(tǒng),能夠為其提供可靠的數(shù)據(jù)完整性驗證。
背景技術(shù):
數(shù)據(jù)完整性驗證是解決篡改攻擊的有效手段。基于這一點,出現(xiàn)了散列函數(shù), 消息認(rèn)證碼(MAC :Memory Authentication Code)禾口 AREA(AddedRedundancy Explicit Authentication)等方法。其中,散列函數(shù)(即Hash函數(shù))是現(xiàn)代密碼技術(shù)與應(yīng)用的一個重要基礎(chǔ)。在本文 中,散列函數(shù)對于數(shù)據(jù)機密性保護和完整性校驗而言,是基礎(chǔ)性的密碼類運算。散列函數(shù)計 算一個任意長度的輸入而得到一個定長的輸出,該輸出稱為原始輸入的散列值,或簡稱散 列值。散列函數(shù)之所以在密碼學(xué)中扮演重要的角色,在于其具有如下的特性單向性已知散列函數(shù)的輸出,欲求其輸入是困難的,即已知c = Hash(m),求m是 困難的。m代表原始輸入數(shù)據(jù),c為該輸出的散列值,Hash ()表示散列函數(shù)。Hash(m)表示 對原始數(shù)據(jù)m進行散列計算??焖傩砸阎猰,計算Hash (m)是容易的。Hash函數(shù)不屬于強計算密集型算法??古鲎残砸阎猚l = Hash (ml),知道cl的值,而ml (原始輸入數(shù)據(jù))的值不知。 構(gòu)造一個輸入數(shù)據(jù)m2使cl = Hash(m2)是困難的(指計算不可行)。雪崩性若c = Hash (m),那么c的每一比特都與m的每一比特有關(guān),并有高度敏 感性即每改變的一比特,都將對c產(chǎn)生明顯影響(比如導(dǎo)致c中一半以上的位發(fā)生變化)。接受的輸入數(shù)據(jù)m沒有長度限制,對輸入任何長度的數(shù)據(jù)都能夠生成固定長度的 輸出。有統(tǒng)計計算表明,如Hash (m)的長度為128位時,則任意兩個分別為ml和m2的輸 入數(shù)據(jù)具有完全相同Hash (m)的概率為10_24即接近于零的重復(fù)概率。若Hash (m)為512位 乃至1024位,則更是不大可能重復(fù)了。因此,散列函數(shù)可以用于數(shù)據(jù)完整性驗證、數(shù)字簽名、生成隨機數(shù)等多種目的。目 前,常用的散列函數(shù)主要是MD5,SHA-1, SHA-2等?,F(xiàn)存的數(shù)據(jù)完整性驗證方法依賴于散列樹結(jié)構(gòu),如Merkle樹, PAT (Parallelizable Authentication Tree)禾口 TEC-Tree (Tamper-Evident CounterTree)。其中,PAT與TEC-tree是基于Merkle樹的兩種改進型。Merkle 散列樹驗證思想在文獻(Jose L. Munoz, Jordi Forne, OscarEsparza, Man el Rey. Efficient Certificate Revocation System Implementation:Huffman Merkle Hash Tree. Trust, Privacy and Security in Digital Business. Berlin Springer-Verlag, 2005, 3592 :119-127)中被詳細(xì)闡述,給定一組數(shù)據(jù) Y = Yl,Y2.......Yn,現(xiàn)在需要對這組數(shù)據(jù)進行完整性驗證證。為了驗證Yi (l^i^ n),一棵二叉
樹被構(gòu)造,該二叉樹被稱之為Merkle散列樹。如圖1所示,節(jié)點8,9,10,11,12,13,14屬于 同一層,即葉節(jié)點層,也就是最低層。節(jié)點4,5,6,7屬于同一層,節(jié)點2,3屬于同一層。節(jié) 點1,即根節(jié)點,單獨屬于一層。二叉樹中的每個節(jié)點從根節(jié)點開始以層遍歷的方式被編號, 即同一層被編號完才對下一層進行編號,根節(jié)點為節(jié)點1,任何中間節(jié)點i的子節(jié)點為節(jié)點 2i和節(jié)點2i+l。同時,節(jié)點i稱為節(jié)點2i和節(jié)點2i+l的父節(jié)點。同一層中具有同一個父 節(jié)點的節(jié)點稱為彼此的兄弟節(jié)點,如節(jié)點8是節(jié)點9的兄弟節(jié)點,節(jié)點9也稱為節(jié)點8的兄 弟節(jié)點。二叉樹中的每個節(jié)點都有一個散列函數(shù)值與之對應(yīng),葉節(jié)點的散列函數(shù)值是對需 要認(rèn)證的數(shù)據(jù)進行散列運算得到的,而中間節(jié)點的散列函數(shù)值由其子節(jié)點的散列函數(shù)值聯(lián) 合進行散列運算得到。二叉樹構(gòu)造過程如下首先計算葉節(jié)點的值。葉節(jié)點的值由Yi的值得到。如圖1所示,c8 = Hash (Y1), c9 = Hash (Y2)等。然后計算中間節(jié)點及根節(jié)點i的值由節(jié)點2i和節(jié)點2i+l的值得到。如,c4 = Hash(c8,c9), (c8,c9)表示把數(shù)據(jù)c9放在c8的后面,兩者連接成一個數(shù)據(jù)。c5 = Hash(c 10,c 11),c 1 = Hash(c2, c3)。由二叉樹節(jié)點對應(yīng)的值的構(gòu)造過程可知,節(jié)點1的值與整棵二叉樹的每個葉子節(jié) 點的值都是相關(guān)聯(lián)的。中間節(jié)點i的值與以節(jié)點i為根的子樹的所有葉節(jié)點對應(yīng)的值有關(guān)。 如節(jié)點2的值與節(jié)點4,5,8,9,10,11對應(yīng)的值有關(guān)。這種方法能夠提高處理器的安全性。但是這種方法產(chǎn)生的散列樹層數(shù)、節(jié)點較 多,缺失代價大,驗證時資源開銷也較大,因此不能夠滿足嵌入式系統(tǒng)應(yīng)用的要求。PAT與 TEC-tree是對Merkle樹的節(jié)點值進行了改進,但是沒有對Merkle樹本身進行改進,因此兩 者產(chǎn)生的節(jié)點也較多,同樣有缺失代價、驗證時資源開銷大的缺點。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種適用于嵌入式處理器的數(shù)據(jù)完整性驗證方法,該方法 與現(xiàn)有技術(shù)相比具有更小的硬件開銷,卻能達到更優(yōu)的性能,能夠真正應(yīng)用于對設(shè)計要求 較高的嵌入式系統(tǒng)中。本發(fā)明提供的一種適用于嵌入式處理器的數(shù)據(jù)完整性驗證方法,包括初始化操作 過程中的數(shù)據(jù)完整性驗證及讀、寫操作過程中的數(shù)據(jù)完整性驗證;其特征在于,初始化操作過程中的數(shù)據(jù)完整性驗證包括下述步驟(A1)計算待建立的多粒度散列樹的層數(shù);(A2)對物理內(nèi)存中數(shù)據(jù)塊進行散列計算,按照步驟(A1)中計算的層數(shù)建立多粒 度散列樹,并將多粒度散列樹存儲在散列緩存中;(A3)從可信存儲區(qū)讀取安全信息,并與多粒度散列樹的根節(jié)點的值進行比較,如 果兩者相等,說明內(nèi)存中的數(shù)據(jù)未遭篡改,則將驗證標(biāo)志位置為1 ;兩者不等,則置標(biāo)志位 為0,表示內(nèi)存中的數(shù)據(jù)已遭篡改;讀操作過程的數(shù)據(jù)完整性驗證過程為(B1)計算物理內(nèi)存中兩個相鄰數(shù)據(jù)塊的散列值;(B2)在散列緩存中查找是否有與步驟(B1)所述的兩個相鄰數(shù)據(jù)塊的相應(yīng)葉節(jié)點的值,如果有,進入步驟(B3),否則,該相應(yīng)葉節(jié)點缺失,稱之為當(dāng)前缺失節(jié)點,用步驟(B1) 中計算出的散列值代替當(dāng)前缺失節(jié)點值,然后轉(zhuǎn)入步驟(B4);(B3)讀散列緩存中相應(yīng)葉節(jié)點的值,并與步驟(B1)中計算出的散列值進行比較, 若兩值相等,說明數(shù)據(jù)塊是完整的,則將驗證標(biāo)志位置為1,否則,將驗證標(biāo)志位置為0,表 示數(shù)據(jù)塊不是完整的;最后均進入步驟(B9);(B4)對當(dāng)前缺失節(jié)點按照下面過程進行處理(B41)在散列緩存中查找當(dāng)前缺失節(jié)點的兄弟節(jié)點,如果兄弟節(jié)點的值缺失,稱該 兄弟節(jié)點為當(dāng)前缺失節(jié)點,進入步驟(B42),否則,進入步驟(B5);(B42)處理步驟如下(B421)判斷當(dāng)前缺失節(jié)點是否為葉節(jié)點,如果是,則由缺失節(jié)點對應(yīng)的物理內(nèi)存 中數(shù)據(jù)塊計算出散列值,用計算出的散列值代替當(dāng)前缺失節(jié)點值,然后進入步驟(B422); 如果不是,直接轉(zhuǎn)入步驟(B422);(B422)計算當(dāng)前缺失節(jié)點的子節(jié)點的地址;(B423)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的子節(jié)點的值,若所有子節(jié)點都 不缺失,則由子節(jié)點的值計算出散列值,并用該散列值代替缺失節(jié)點的值,然后進入步驟 (B5);若有子節(jié)點缺失,則稱缺失的子節(jié)點為當(dāng)前缺失節(jié)點,然后轉(zhuǎn)入步驟(B42);(B5)判斷是否所有的兄弟節(jié)點都被查找到了,如果是,則進入步驟(B6),否則跳 到步驟(B41);(B6)讀出步驟(B4)中當(dāng)前缺失節(jié)點的兄弟節(jié)點的散列值并計算父節(jié)點的散列 值;(B7)在散列緩存中查找是否有父節(jié)點的值;如果父節(jié)點的值缺失,則稱該父節(jié)點 為當(dāng)前缺失節(jié)點,轉(zhuǎn)入步驟(B8);否則,讀出父節(jié)點的值,并跳到(B9);(B8)判斷步驟(B6)中的當(dāng)前缺失節(jié)點是否為根節(jié)點;如果不是,用步驟(B6)中 計算出的散列值代替當(dāng)前缺失節(jié)點值,然后轉(zhuǎn)入步驟(B4);如果是,則從可信存儲區(qū)中讀 出根節(jié)點的值,用之代替父節(jié)點的值,然后進入步驟(B9);(B9)比較讀出的父節(jié)點值和步驟(B6)中計算出的父節(jié)點值;若兩值相等,說明 數(shù)據(jù)塊是完整的,則將驗證標(biāo)志位置為1 ;否則,將驗證標(biāo)志位置為0,表示數(shù)據(jù)塊不是完整 的;(B10)讀操作驗證過程結(jié)束;寫操作過程的數(shù)據(jù)完整性驗證過程為(C1)計算待改寫數(shù)據(jù)塊對應(yīng)的散列節(jié)點的地址,該散列節(jié)點稱之為當(dāng)前缺失節(jié)點。(C2)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的值;如果有,則轉(zhuǎn)入步驟(C3);如 果沒有,則計算待改寫的數(shù)據(jù)塊的散列值,并用該散列值代替當(dāng)前節(jié)點值,然后進入步驟 (C3);(C3)查找該當(dāng)前缺失節(jié)點兄弟節(jié)點;如果兄弟節(jié)點缺失,則稱缺失的兄弟節(jié)點為 當(dāng)前缺失節(jié)點,進入步驟(C4);如果不缺失,則進入步驟(C5);(C4)處理步驟如下(C41)判斷當(dāng)前缺失節(jié)點是否為葉節(jié)點,如果不是,轉(zhuǎn)入步驟(C42);如果是,則由缺失節(jié)點對應(yīng)的物理內(nèi)存中數(shù)據(jù)塊計算出散列值,并用計算出的散列值代替當(dāng)前缺失節(jié)點 值,然后進入步驟(C5);(C42)計算當(dāng)前缺失節(jié)點的子節(jié)點的地址;(C43)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的子節(jié)點的值,若所有子節(jié)點都 不缺失,則由子節(jié)點的值計算出散列值,并用該散列值代替缺失節(jié)點的值,然后進入步驟 (C5);若有子節(jié)點缺失,則稱缺失的子節(jié)點為當(dāng)前缺失節(jié)點,然后轉(zhuǎn)入步驟(C4);(C5)判斷是否步驟(C3)所有的兄弟節(jié)點都被查找到了,如果是,則進入步驟 (C6),否則跳到步驟(C3);(C6)讀步驟(C3)中第一個當(dāng)前缺失節(jié)點及其兄弟節(jié)點的散列值并計算它們的父 節(jié)點的散列值;(C7)在散列緩存中查找是否有父節(jié)點的值;如果父節(jié)點的值缺失,則稱該節(jié)點為 當(dāng)前缺失節(jié)點,轉(zhuǎn)入步驟(C8);否則,讀出父節(jié)點的值,并跳到(C9);(C8)判斷步驟(C7)中的當(dāng)前缺失節(jié)點是否為根節(jié)點;如果不是,用步驟(C6)中 計算出的散列值代替當(dāng)前缺失節(jié)點的值,然后轉(zhuǎn)入步驟(C3);如果是,則從可信存儲區(qū)中 讀出根節(jié)點的值,用之代替父節(jié)點的值,然后進入步驟(C9);(C9)比較讀出的父節(jié)點值和步驟(C6)中計算出的父節(jié)點值;若兩值相等,說明數(shù) 據(jù)塊是完整的,則將驗證標(biāo)志位置為1,然后轉(zhuǎn)入步驟(C10);否則,將驗證標(biāo)志位置為0,表 示數(shù)據(jù)塊不是完整的,跳到(C11);(C10)更新當(dāng)前節(jié)點和它的父節(jié)點值;(C11)寫操作驗證過程結(jié)束。本發(fā)明提供了一種適用于嵌入式處理器的數(shù)據(jù)完整性驗證方法,它包括多粒度散 列計算和散列訪問控制,其中散列訪問控制包括地址的轉(zhuǎn)換,散列節(jié)點的訪問。多粒度散列 計算用于產(chǎn)生多粒度Merkle樹,該樹緩存在散列cache中,同時在樹的節(jié)點缺失時,此算法 負(fù)責(zé)計算內(nèi)存中數(shù)據(jù)塊的散列值。地址轉(zhuǎn)換為每個節(jié)點提供了一個唯一對應(yīng)的地址。散列 節(jié)點訪問主要負(fù)責(zé)訪問各個散列樹的節(jié)點,特別是在讀缺失和寫操作時采取不同的對策。 讀缺失時,首先訪問子節(jié)點,計算出當(dāng)前節(jié)點,再遞歸地追蹤父節(jié)點。在執(zhí)行寫操作時,先驗 證當(dāng)前節(jié)點的安全性。再更新當(dāng)前節(jié)點和父節(jié)點。由于采用多粒度散列算法,本發(fā)明產(chǎn)生 的散列樹節(jié)點少,層數(shù)少,因而減少了存儲空間,硬件面積開銷和初始化時間,提高了性能。本發(fā)明針對自然Merkle樹的缺點,采用了多粒度算法,即對不同層的節(jié)點采用不 同的粒度(用來進行散列運算的數(shù)據(jù)塊的數(shù)目稱為粒度)進行散列計算。對于Merkle樹 來說,低層節(jié)點特別是葉節(jié)點,訪問得最頻繁。所以,我們對這些節(jié)點使用較少數(shù)目的數(shù)據(jù) 塊(即較小的粒度)進行散列計算,我們稱之為細(xì)粒度散列算法。與此同時,對于擁有大缺 失代價的高層節(jié)點,我們使用較多數(shù)據(jù)塊來進行散列計算,我們稱之為粗粒度散列算法。細(xì) 粒度散列算法通過使散列開銷最小化來提高存儲器校驗的性能,而粗粒度散列算法通過一 次對多個節(jié)點進行散列計算來節(jié)省存儲空間,增大了高層節(jié)點的命中率。
圖1為Merkle散列樹的示意圖;圖2為本發(fā)明提供的數(shù)據(jù)完整性校驗方法的結(jié)構(gòu)模型示意圖3為本發(fā)明提供的方法的內(nèi)部結(jié)構(gòu)及數(shù)據(jù)流向示意圖;圖4為本發(fā)明的多粒度Merkle樹結(jié)構(gòu)示意圖,其中,(a)為自然Merkle樹,(b)為 多粒度Merkle樹;圖5為本發(fā)明的節(jié)點地址轉(zhuǎn)換算法示意圖;圖6為本發(fā)明的粒度索引示意圖;圖7為本發(fā)明的初始化操作流程;圖8為本發(fā)明的多粒度Merkle節(jié)點計算示意圖;圖9為本發(fā)明的讀操作驗證流程;圖10為本發(fā)明的寫操作驗證流程;
具體實施例方式下面結(jié)合附圖和實例對本發(fā)明作進一步詳細(xì)的說明。圖2為本發(fā)明提供的數(shù)據(jù)完整性校驗方法在處理器整體架構(gòu)中位置的示意圖,即 實現(xiàn)此方法需要在現(xiàn)有的處理器中額外增加一個完整性驗證模塊。圖2中非可信存儲區(qū)是 指處理器芯片外部的存儲器,可信存儲區(qū)是指處理器芯片內(nèi)部的存儲器。如圖3所示,完整性驗證模塊中引入了一個高速緩沖存儲器,用于存儲散列樹的 節(jié)點值,下稱散列緩存。此外,完整性驗證模塊還包括兩大部分,分別為多粒度散列計算模 塊和散列訪問控制模塊。多粒度散列計算模塊,是實現(xiàn)散列函數(shù)的電路模塊,主要功能是對 不同粒度的(即不同個數(shù)的)數(shù)據(jù)塊進行散列計算,得到一個具有固定位數(shù)的散列值。對 于寫操作(即把第二級高速緩沖存儲器中的數(shù)據(jù)寫入非可信存儲區(qū)),在執(zhí)行這一操作之 前,待寫的數(shù)據(jù)要先流入散列計算模塊,得到散列值,然后用此值更新散列cache中相應(yīng)的 節(jié)點散列值。對于讀操作,非可信區(qū)的數(shù)據(jù)在讀入第二級高速緩沖存儲器之前,待寫的數(shù)據(jù) 先要流入散列計算模塊,計算出的散列值與從散列cache中取出的值進行比較,兩值相等 則非可信區(qū)的數(shù)據(jù)可以讀入第二級高速緩沖存儲器,不相等則說明數(shù)據(jù)已遭篡改,不可以 讀入第二級高速緩沖存儲器。圖4表示的是一個2元(2-ary)的多粒度散列樹和一個自然Merkle樹的對比。 第三層是多粒度Merkle樹的葉節(jié)點。它的粒度固定為2。第二層定義為多粒度Merkle樹 的基本層。它的粒度可以被配置為2,那么這時候它就是2-ary的多粒度Merkle樹。多粒 度Merkle樹的粒度從這層開始變化。上一層的粒度由下層的粒度乘二得到。所以第1層 的散列粒度為4,第零層的粒度為8。采用這樣的方式,對于一個總層數(shù)為j的Merkle樹, 第i層的粒度為A” A, = Abasi。X2j-H (Abasic為基本層的粒度)。多粒度Merkle樹的上層節(jié) 點擁有粗散列粒度,這使得一個上層節(jié)點能夠驗證更多的下層節(jié)點。這不僅節(jié)省了散列樹 的存儲空間,還減少了加載程序時的初始化延遲。如圖5所示,對于葉層的節(jié)點,層數(shù)為i,它的地址是將相應(yīng)的存儲器地址右移 logA位隊是第i層的粒度),最左端位空位用0補足。同樣地,將節(jié)點地址右移 Io^Ah位能夠得到它在第i_l層的父節(jié)點地址。通過這種移位操作,散列訪問控制模塊能 夠快速地計算出從i層到0層(散列樹的最高層)的散列節(jié)點的地址。每個散列樹的節(jié)點 對應(yīng)唯——個地址。如圖6所示,該結(jié)構(gòu)使得散列cache可以通過索引一個節(jié)點的層數(shù),快速取得該節(jié)點的粒度。此外,為了利用cache結(jié)構(gòu),被訪問節(jié)點的地址映射成三個字段標(biāo)簽,cache地 址,字節(jié)偏移量。這簡化了訪問節(jié)點的搜索。本發(fā)明方法包括散列樹初始化操作過程中的數(shù)據(jù)完整性驗證及讀寫操作過程中 的數(shù)據(jù)完整性驗證。下面分別予以具體說明。為了使強制缺失最小化,必須在驗證數(shù)據(jù)完整性之前初始化Merkle樹。由于數(shù)據(jù) 是從片外存儲器上載入的,所以多粒度散列計算模塊計算每兩個數(shù)據(jù)塊的散列值,這些散 列值稱為葉節(jié)點,以這些葉節(jié)點值按照不同的粒度算出上層節(jié)點的散列值,重復(fù)計算上層 節(jié)點的散列值,最終算出根節(jié)點的散列值,至此,構(gòu)造散列樹的工作就結(jié)束了。散列計算的 最終結(jié)果被稱作根節(jié)點,需要與安全信息進行比較,該安全信息在初始化操作前已經(jīng)存入 可信區(qū)。如果根節(jié)點與安全信息一致,說明被訪問的數(shù)據(jù)是安全的,沒有被篡改。否則,就 意味著非可信存儲區(qū)遭到篡改攻擊,數(shù)據(jù)的完整性被破壞。初始化完成后,部分散列樹節(jié)點 存儲在散列緩存中,供運行期間的讀寫非可信存儲區(qū)驗證使用。如圖7所示,初始化操作過程中的數(shù)據(jù)完整性驗證包括下述步驟(A1)計算多粒度散列樹的層數(shù)。設(shè)i表示層的序號,j表示總層數(shù),i的取值范圍為0至j_l,其中,第0層表示 根節(jié)點層,Abasic表示預(yù)先設(shè)定的基本層的粒度(通常取值為2和4),根據(jù)粒度關(guān)系A(chǔ)i =
以及待散列計算的數(shù)據(jù)塊的塊數(shù),計算出多粒度散列樹的層數(shù)j。如圖4,有 128塊數(shù)據(jù),葉節(jié)點層和基本層的粒度為2,往上的層的粒度分別為4、8、16,32等等,用128 分別除以這些粒度,結(jié)果為1時即結(jié)束,此時所作的除法的次數(shù)就是層數(shù)。對于128塊數(shù) 據(jù),128 + 2 + 2 + 4 + 8 = 1,即總層數(shù)為4。對于129塊數(shù)據(jù),129 + 2 + 2 + 4 + 8 = 1余1,則 總層數(shù)為5,即對于無法整除的數(shù),總層數(shù)為所作除法次數(shù)加1。(A2)對物理內(nèi)存(即圖2中的非可信存儲區(qū))中數(shù)據(jù)塊進行散列計算,建立散列 樹,并將散列樹存儲在散列緩存中。如圖8所示,假設(shè)物理內(nèi)存中的數(shù)據(jù)為Y1,Y2,......Y16,節(jié)點6,7,8,9......,13
為葉節(jié)點,具體計算步驟如下(A21)以2為粒度,計算葉節(jié)點的散列值。如圖8所示,葉節(jié)點6的值為c6 = Hash(Yl,Y2),cn表示節(jié)點n的散列值,n為一 個大于1的整數(shù),則c6表示節(jié)點6的散列值。HashO表示采用一種散列函數(shù)對括號內(nèi)的數(shù) 進行散列計算,在本方法中,任取現(xiàn)有的一種散列函數(shù)即可。(P,q)表示把數(shù)P與數(shù)q首尾 相連成一個數(shù),若 P = 10001,q = 0011,則(p,q) = 100010011,則 c6 = Hash (100010011)。 同樣,c7 = Hash (Y3, Y4),c8 = Hash (Y5, Y6),c9 = Hash (Y7, Y8),以此類推。每計算出一 個散列值,就存儲在散列緩存中,以供計算上一層節(jié)點的散列值使用,在步驟(A22),(A23) 中,這點同樣適用;(A22)同樣以2為粒度(也可以取4或8為粒度,這可以人為地確定,但根據(jù)作者 的研究發(fā)現(xiàn),取2或4的時候性能會更好),計算基本層節(jié)點的散列值;如圖8所示,計算基本層節(jié)點2,3,4,5的散列值,c2 = Hash(c6, c7), c3 = Hash(c8, c9),c4 = Hash(cl0, ell),c5 = Hash(c12, cl3);(A23)從基本層開始,以下一層節(jié)點的粒度,乘2得出上一層節(jié)點的粒度,并以計 算出的粒度,計算上一層節(jié)點的散列值,重復(fù)這一操作,直至計算出最高層中根節(jié)點的散列值;如圖8所示,基本層的上一層為層0,則用基本層粒度乘以2得出層0的粒度為4, 因此,節(jié)點值 cl = Hash(c2,c3,c4,c5)。(c2,c3,c4,c5)表示把 c2,c3,c4,c5 四個數(shù)首 尾相連。在這一例子中,到這里散列樹就已經(jīng)建立完成了,節(jié)點1就是根節(jié)點。對于那些數(shù) 據(jù)塊多于16的,在這一步?jīng)]有到達最后一層,重復(fù)乘2算上一層粒度,計算散列值這一步 驟,直至到達最后一層;(A3)讀取安全信息,并與根節(jié)點進行比較。從處理器內(nèi)的可信存儲區(qū)中讀出安全信息,并將之與上一步驟計算出的根節(jié)點散 列值cl進行比較。若兩者相等,說明內(nèi)存中的數(shù)據(jù)未遭篡改,則將驗證標(biāo)志位置為1 ;若兩 者不等,則置標(biāo)志位為0,表示內(nèi)存中的數(shù)據(jù)已遭篡改。如圖9所示,讀操作過程的數(shù)據(jù)完整性驗證過程包括下列步驟(B1)計算物理內(nèi)存中兩個相鄰數(shù)據(jù)塊的散列值;散列值由多粒度散列計算模塊計算而得,散列值為c = Hash(Yi,Yi+1)。Yi,Yi+1表 示物理內(nèi)存中兩個相鄰的數(shù)據(jù)塊。(B2)在散列緩存中查找是否有與步驟(B1)所述的兩個相鄰數(shù)據(jù)塊的相應(yīng)葉節(jié)點 的值,如果有,進入步驟(B3),否則,該相應(yīng)葉節(jié)點缺失,稱之為當(dāng)前缺失節(jié)點,用步驟(B1) 中計算出的散列值代替當(dāng)前缺失節(jié)點值,然后轉(zhuǎn)入步驟(B4);查找過程為設(shè)兩個相鄰數(shù)據(jù)塊中的任意一個數(shù)據(jù)塊的編號為s,該數(shù)據(jù)塊為Ys, 其地址為adds,則相應(yīng)葉節(jié)點的地址Addk由adds右移log2Ni位得到,Ni是層i的粒度, 移位后,最左端的log2Ni位空位由0來補足,k為葉節(jié)點的編號,根據(jù)葉節(jié)點的地址Addk, 查找散列緩存相應(yīng)葉節(jié)點的值。用步驟(B1)中計算出的散列值代替當(dāng)前缺失節(jié)點值,是指將上一步驟計算出的c 寫入散列緩存的地址Addk中。(B3)讀散列緩存中相應(yīng)葉節(jié)點的值,并與步驟(B1)中計算出的散列值進行比較, 若兩值相等,說明數(shù)據(jù)塊是完整的,則將驗證標(biāo)志位置為1,否則,將驗證標(biāo)志位置為0,表 示數(shù)據(jù)塊不是完整的;最后均進入步驟(B9);(B4)對當(dāng)前缺失節(jié)點按照下面過程進行處理(B41)查找當(dāng)前缺失節(jié)點的兄弟節(jié)點,如果兄弟節(jié)點的值缺失,稱該兄弟節(jié)點為當(dāng) 前缺失節(jié)點,進入步驟(B42),否則,進入步驟(B5);查找過程為設(shè)當(dāng)前缺失節(jié)點的地址為adds,則當(dāng)前缺失節(jié)點的基本地址Adds由 adds右移log2Ni位,然后再左移log2Ni位得到,Ni是當(dāng)前缺失節(jié)點所在層i_l的上一層i 的粒度,移位后,最右端的log2Ni位空位由0來補足。Adds,Adds+l,……,Adds+(Ni-l)中 包括當(dāng)前缺失節(jié)點地址,去掉該地址,剩余的Ni-2個地址即為缺失節(jié)點的兄弟節(jié)點地址。 根據(jù)兄弟節(jié)點的地址,查找散列緩存中相應(yīng)兄弟節(jié)點的值。(B42)處理步驟如下(B421)判斷當(dāng)前缺失節(jié)點是否為葉節(jié)點,如果是,則由缺失節(jié)點對應(yīng)的物理內(nèi)存 中數(shù)據(jù)塊計算出散列值,用計算出的散列值代替當(dāng)前缺失節(jié)點值,轉(zhuǎn)入步驟(B5)。如果不 是,轉(zhuǎn)入步驟(B422);初始化過程中,已經(jīng)計算出了總層數(shù)j,如果當(dāng)前缺失節(jié)點所在的層數(shù)i等于j_l,則缺失節(jié)點是葉節(jié)點。否則,當(dāng)前缺失節(jié)點不是葉節(jié)點。如果當(dāng)前缺失節(jié)點為葉節(jié)點,且地址為add,則缺失節(jié)點對應(yīng)的物理內(nèi)存中數(shù)據(jù)塊 的基本地址為Addb,Addb由add左移lo&2位得到,最右端的lo&2位空位用0補足,Addb, Addb+1是缺失節(jié)點對應(yīng)的物理內(nèi)存中的兩個數(shù)據(jù)塊的地址。假設(shè)讀出地址Addb,Addb+1 中的數(shù)據(jù)為Yi,Yi+1,則計算出的散列值為c = Hash(t,Yi+1),然后將c寫入散列緩存的地址 add 中。(B422)計算當(dāng)前缺失節(jié)點的子節(jié)點的地址;
設(shè)缺失節(jié)點的地址為Add,則子節(jié)點的基本地址Addb由Add左移log2Ni位 (Ni是當(dāng)前節(jié)點層的粒度),移動后,最右端的log2Ni位空位用0補足。Add,Add+1, Add+2,......Add+(Ni-l),就是所有子節(jié)點的地址;(B423)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的子節(jié)點的值,若所有子節(jié)點都 不缺失,則由子節(jié)點的值計算出散列值,并用該散列值代替缺失節(jié)點的值,然后進入步驟 (B5)。若有子節(jié)點缺失,則稱缺失的子節(jié)點為當(dāng)前缺失節(jié)點,然后轉(zhuǎn)入步驟(B42);按照步驟(B422)計算出的地址去散列緩存中查找相應(yīng)的子節(jié)點散列值。如果 所有子節(jié)點都不缺失,則按照步驟(B422)計算出的子節(jié)點地址讀出所有子節(jié)點的散列 值,假設(shè)讀出的子節(jié)點散列值為,cl,c2, c3……,cNi,則由子節(jié)點的值計算出散列值c = Hash(cl, c2, c3……,cNi),然后將計算出的散列值寫到散列緩存的地址Add中。(B5)判斷是否所有的兄弟節(jié)點都被查找過了,如果是,則進入步驟(B6),否則跳 到步驟(B41);設(shè)置一個計數(shù)器,每進入步驟(B41) —次,計數(shù)器加一,若計數(shù)器的結(jié)果counter 等于步驟(B41)中的Ni減一,則說明所有的兄弟節(jié)點都被查找過了。若不相等,則說明還 有兄弟節(jié)點未查找過。(B6)讀出步驟(B4)中當(dāng)前缺失節(jié)點及其兄弟節(jié)點的散列值并計算父節(jié)點的散列 值;設(shè)讀出的當(dāng)前缺失節(jié)點及其兄弟節(jié)點的散列值分別為cl,c2,c3,c4……,ci,則計 算父節(jié)點的散列值為:Hash(cl, c2, c3, c4……,ci)。(B7)在散列緩存中查找是否有父節(jié)點的值。如果父節(jié)點的值缺失,則稱該父節(jié)點 為當(dāng)前缺失節(jié)點,轉(zhuǎn)入步驟(B8);否則,讀出父節(jié)點的值,并跳到(B9);查找過程設(shè)當(dāng)前缺失節(jié)點的地址為Add,則父節(jié)點的地址Addf由Add右移lo&Ni 位(Ni是父節(jié)點所在層的粒度)得到,最左端log2Ni位用0補足。根據(jù)父節(jié)點的地址,查 找散列緩存父節(jié)點的值。(B8)判斷步驟(B7)中的當(dāng)前缺失節(jié)點是否為根節(jié)點。如果不是,用步驟(B6)中 計算出的散列值代替當(dāng)前缺失節(jié)點值,然后轉(zhuǎn)入步驟(B4);如果是,則從可信存儲區(qū)中讀 出根節(jié)點的值,用之代替父節(jié)點的值;如果當(dāng)前缺失節(jié)點所在的層數(shù)i等于0,則缺失節(jié)點是根節(jié)點。否則,當(dāng)前缺失節(jié) 點不是根節(jié)點。(B9)比較讀出的父節(jié)點值和步驟(B6)中計算出的父節(jié)點值。若兩值相等,說明 數(shù)據(jù)塊是完整的,則將驗證標(biāo)志位置為1。否則,將驗證標(biāo)志位置為0,表示數(shù)據(jù)塊不是完整 的;
11
這里的讀出的父節(jié)點值,可能是步驟(B7)中讀出的父節(jié)點值,也可能是步驟(B8) 中從可信存儲區(qū)中讀出的根節(jié)點值。(B10)讀操作驗證過程結(jié)束;如圖10所示,寫操作過程的數(shù)據(jù)完整性驗證過程包括下列步驟(C1)計算待改寫數(shù)據(jù)塊對應(yīng)的散列節(jié)點(稱之為當(dāng)前缺失節(jié)點)的地址;設(shè)待改寫數(shù)據(jù)塊的地址為adds,則當(dāng)前缺失節(jié)點的地址Add由adds右移log2Ni 位得到,Ni是層i的粒度,移位后,最左端的log2Ni位空位由0來補足。(C2)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的值。如果有,則直接轉(zhuǎn)入步驟 (C3);如果沒有,先計算待改寫的數(shù)據(jù)塊的散列值,再用該散列值代替當(dāng)前節(jié)點值,然后進 入步驟(C3);根據(jù)步驟(C1)計算出的當(dāng)前缺失節(jié)點的地址Addk,查找散列緩存中當(dāng)前缺失節(jié) 點的值。如果散列緩存中沒有當(dāng)前缺失節(jié)點的值,則由步驟(C1)中數(shù)據(jù)塊地址adds右移 一位,再向左移一位,最右端一位用0補足,得到數(shù)據(jù)塊的基本地址addb,讀取物理內(nèi)存地 址addb,addb+l中的值Yi,Yi+1計算散列值c = Hash Yi+1),將c寫入散列緩存地址Addk 中。(C3)查找該當(dāng)前缺失節(jié)點兄弟節(jié)點。如果兄弟節(jié)點缺失,則稱缺失的兄弟節(jié)點為 當(dāng)前缺失節(jié)點,進入步驟(C4);如果不缺失,則進入步驟(C5);查找過程為設(shè)當(dāng)前缺失節(jié)點的地址為adds,則當(dāng)前缺失節(jié)點的基本地址Adds由 adds右移log2Ni位,然后再左移log2Ni位得到,Ni是當(dāng)前缺失節(jié)點所在層i_l的上一層i 的粒度,移位后,最右端的log2Ni位空位由0來補足。Adds,Adds+l,……,Adds+(Ni-l)中 包括當(dāng)前缺失節(jié)點地址,去掉該地址,剩余的Ni-2個地址即為缺失節(jié)點的兄弟節(jié)點地址。 根據(jù)兄弟節(jié)點的地址,查找散列緩存相應(yīng)兄弟節(jié)點的值。(C4)處理步驟如下(C41)判斷當(dāng)前缺失節(jié)點是否為葉節(jié)點,如果不是,轉(zhuǎn)入步驟(C42);如果是,則由 缺失節(jié)點對應(yīng)的物理內(nèi)存中數(shù)據(jù)塊計算出散列值,并用計算出的散列值代替當(dāng)前缺失節(jié)點 值,然后進入步驟(C5);初始化過程中,已經(jīng)計算出了總層數(shù)j,如果當(dāng)前缺失節(jié)點所在的層數(shù)i等于j_l, 則缺失節(jié)點是葉節(jié)點。否則,當(dāng)前缺失節(jié)點不是葉節(jié)點。如果當(dāng)前缺失節(jié)點為葉節(jié)點,且地址為add,則缺失節(jié)點對應(yīng)的物理內(nèi)存中數(shù)據(jù)塊 的基本地址為Addb,Addb由add左移lo&2位得到,最右端的lo&2位空位用0補足,Addb, Addb+1是缺失節(jié)點對應(yīng)的物理內(nèi)存中的兩個數(shù)據(jù)塊的地址。假設(shè)讀出地址Addb,Addb+1 中的數(shù)據(jù)為Yi,Yi+1,則計算出的散列值為c = Hash(t,Yi+1),然后將c寫入散列緩存的地址 add 中。(C42)計算當(dāng)前缺失節(jié)點的子節(jié)點的地址;設(shè)缺失節(jié)點的地址為Add,則子節(jié)點的基本地址Addb由Add左移log2Ni 位(Ni是當(dāng)前節(jié)點層的粒度),移動后,最的低位log2Ni用0補足。Add,Add+1, Add+2,......Add+(Ni-l),就是所有子節(jié)點的地址;(C43)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的子節(jié)點的值,若所有子節(jié)點都不缺失,則由子節(jié)點的值計算出散列值,并用該散列值代替缺失節(jié)點的值。若有子節(jié)點缺失, 則稱缺失的子節(jié)點為當(dāng)前缺失節(jié)點,然后轉(zhuǎn)入步驟(C4);按照步驟(C42)計算出的地址去散列緩存中查找相應(yīng)的子節(jié)點散列值。如果所有 子節(jié)點都不缺失,則按照步驟(C42)計算出的子節(jié)點地址讀出所有子節(jié)點的散列值,假設(shè) 讀出的子節(jié)點散列值為,cl,c2, c3……,cNi,則由子節(jié)點的值計算出散列值c = Hash(cl, c2,c3……,cNi),然后將計算出的散列值寫到步驟(B422)中當(dāng)前缺失節(jié)點的地址Add中。(C5)判斷是否步驟(C3)所有的兄弟節(jié)點都被查找到了,如果是,則進入步驟 (C6),否則跳到步驟(C3);設(shè)置一個計數(shù)器,每進入步驟(C3) —次,計數(shù)器加一,若計數(shù)器的結(jié)果counter, 等于步驟(C3)中的Ni減一,則說明所有的兄弟節(jié)點都被查找過了。若不相等,則說明還有 兄弟節(jié)點未被查找過。(C6)讀步驟(C3)中第一個當(dāng)前缺失節(jié)點的及其兄弟節(jié)點的散列值并計算它們的 父節(jié)點的散列值;設(shè)讀出的當(dāng)前缺失節(jié)點及其兄弟節(jié)點的值分別為cl,c2,c3,c4……,ci,則計算父 節(jié)點的散列值為:Hash(cl, c2,c3,c4……,ci)。(C7)在散列緩存中查找是否有父節(jié)點的值。如果父節(jié)點的值缺失,則稱該節(jié)點為 當(dāng)前缺失節(jié)點,轉(zhuǎn)入步驟(C8);否則,讀出父節(jié)點的值,并跳到(C9);查找過程設(shè)當(dāng)前缺失節(jié)點的地址為Add,則父節(jié)點的地址Addf由Add右移lo&Ni 位(Ni是父節(jié)點所在層的粒度)得到,最左端log2Ni位用0補足。根據(jù)父節(jié)點的地址,查 找散列緩存父節(jié)點的值。(C8)判斷步驟(C7)中的當(dāng)前缺失節(jié)點是否為根節(jié)點。如果不是,用步驟(C6)中 計算出的散列值代替當(dāng)前缺失節(jié)點的值,然后轉(zhuǎn)入步驟(C3);如果是,則從可信存儲區(qū)中 讀出根節(jié)點的值,用之代替父節(jié)點的值;如果當(dāng)前缺失節(jié)點所在的層數(shù)i等于0,則缺失節(jié)點是根節(jié)點。否則,當(dāng)前缺失節(jié) 點不是根節(jié)點。(C9)比較讀出的父節(jié)點值和步驟(C6)中計算出的父節(jié)點值。若兩值相等,說明數(shù) 據(jù)塊是完整的,則將驗證標(biāo)志位置為1,然后轉(zhuǎn)入步驟(C10)。否則,將驗證標(biāo)志位置為0,表 示數(shù)據(jù)塊不是完整的,跳到(C11);這里的讀出的父節(jié)點值,可能是步驟(C7)中讀出的父節(jié)點值,也可能是步驟(C8) 中從可信存儲區(qū)中讀出的根節(jié)點值。(C10)更新當(dāng)前節(jié)點和它的父節(jié)點值;更新當(dāng)前節(jié)點,即是由即將寫入非可信存儲區(qū)中的數(shù)據(jù)計算出散列值,然后將該 散列值寫入步驟(C1)中計算出的地址中。更新父節(jié)點,即是由更新的當(dāng)前節(jié)點及其兄弟節(jié) 點計算出他們的父節(jié)點的散列值,然后將新父節(jié)點散列值寫入散列緩存中。(C11)寫操作驗證過程結(jié)束;使用這種驗證算法,能夠有效的發(fā)現(xiàn)被篡改的數(shù)據(jù)并發(fā)現(xiàn)被破壞的程序。此外,用 來檢查根節(jié)點的關(guān)鍵安全信息存儲在片內(nèi)存儲器中的。節(jié)點的散列值只有初始化或是散列 節(jié)點缺失時才被緩存和計算。所以,多粒度Merkle樹不需要額外的存儲空間來保存散列 值。這不僅減少了硬件開銷,還改善了嵌入式處理器的安全性。
此外,本方法使處理器能夠把散列計算的時間隱藏在內(nèi)存的訪問過程中。這就有 效地減少了多粒度Merkle樹安全計算的性能開銷。對本發(fā)明采用Mibench進行性能測試,由實驗結(jié)果可以看到,本發(fā)明所提出的多 粒度Merkle樹相比自然Merkle樹具有性能上的優(yōu)越性,更適用于嵌入式系統(tǒng)。本發(fā)明不應(yīng)該局限于附圖所公開的內(nèi)容。所以凡是不脫離本發(fā)明所公開的精神下 完成的等效或修改,都落入本發(fā)明保護的范圍。
權(quán)利要求
一種適用于嵌入式處理器的數(shù)據(jù)完整性驗證方法,包括初始化操作過程中的數(shù)據(jù)完整性驗證及讀、寫操作過程中的數(shù)據(jù)完整性驗證;其特征在于,初始化操作過程中的數(shù)據(jù)完整性驗證包括下述步驟(A1)計算待建立的多粒度散列樹的層數(shù);(A2)對物理內(nèi)存中數(shù)據(jù)塊進行散列計算,按照步驟(A1)中計算的層數(shù)建立多粒度散列樹,并將多粒度散列樹存儲在散列緩存中;(A3)從可信存儲區(qū)讀取安全信息,并與多粒度散列樹的根節(jié)點的值進行比較,如果兩者相等,說明內(nèi)存中的數(shù)據(jù)未遭篡改,則將驗證標(biāo)志位置為1;兩者不等,則置標(biāo)志位為0,表示內(nèi)存中的數(shù)據(jù)已遭篡改;讀操作過程的數(shù)據(jù)完整性驗證過程為(B1)計算物理內(nèi)存中兩個相鄰數(shù)據(jù)塊的散列值;(B2)在散列緩存中查找是否有與步驟(B1)所述的兩個相鄰數(shù)據(jù)塊的相應(yīng)葉節(jié)點的值,如果有,進入步驟(B3),否則,該相應(yīng)葉節(jié)點缺失,稱之為當(dāng)前缺失節(jié)點,用步驟(B1)中計算出的散列值代替當(dāng)前缺失節(jié)點值,然后轉(zhuǎn)入步驟(B4);(B3)讀散列緩存中相應(yīng)葉節(jié)點的值,并與步驟(B1)中計算出的散列值進行比較,若兩值相等,說明數(shù)據(jù)塊是完整的,則將驗證標(biāo)志位置為1,否則,將驗證標(biāo)志位置為0,表示數(shù)據(jù)塊不是完整的;最后均進入步驟(B9);(B4)對當(dāng)前缺失節(jié)點按照下面過程進行處理(B41)在散列緩存中查找當(dāng)前缺失節(jié)點的兄弟節(jié)點,如果兄弟節(jié)點的值缺失,稱該兄弟節(jié)點為當(dāng)前缺失節(jié)點,進入步驟(B42),否則,進入步驟(B5);(B42)處理步驟如下(B421)判斷當(dāng)前缺失節(jié)點是否為葉節(jié)點,如果是,則由缺失節(jié)點對應(yīng)的物理內(nèi)存中數(shù)據(jù)塊計算出散列值,用計算出的散列值代替當(dāng)前缺失節(jié)點值,然后進入步驟(B422);如果不是,直接轉(zhuǎn)入步驟(B422);(B422)計算當(dāng)前缺失節(jié)點的子節(jié)點的地址;(B423)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的子節(jié)點的值,若所有子節(jié)點都不缺失,則由子節(jié)點的值計算出散列值,并用該散列值代替缺失節(jié)點的值,然后進入步驟(B5);若有子節(jié)點缺失,則稱缺失的子節(jié)點為當(dāng)前缺失節(jié)點,然后轉(zhuǎn)入步驟(B42);(B5)判斷是否所有的兄弟節(jié)點都被查找到了,如果是,則進入步驟(B6),否則跳到步驟(B41);(B6)讀出步驟(B4)中當(dāng)前缺失節(jié)點的兄弟節(jié)點的散列值并計算父節(jié)點的散列值;(B7)在散列緩存中查找是否有父節(jié)點的值;如果父節(jié)點的值缺失,則稱該父節(jié)點為當(dāng)前缺失節(jié)點,轉(zhuǎn)入步驟(B8);否則,讀出父節(jié)點的值,并跳到(B9);(B8)判斷步驟(B6)中的當(dāng)前缺失節(jié)點是否為根節(jié)點;如果不是,用步驟(B6)中計算出的散列值代替當(dāng)前缺失節(jié)點值,然后轉(zhuǎn)入步驟(B4);如果是,則從可信存儲區(qū)中讀出根節(jié)點的值,用之代替父節(jié)點的值,然后進入步驟(B9);(B9)比較讀出的父節(jié)點值和步驟(B6)中計算出的父節(jié)點值;若兩值相等,說明數(shù)據(jù)塊是完整的,則將驗證標(biāo)志位置為1;否則,將驗證標(biāo)志位置為0,表示數(shù)據(jù)塊不是完整的;(B10)讀操作驗證過程結(jié)束;寫操作過程的數(shù)據(jù)完整性驗證過程為(C1)計算待改寫數(shù)據(jù)塊對應(yīng)的散列節(jié)點的地址,該散列節(jié)點稱之為當(dāng)前缺失節(jié)點;(C2)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的值;如果有,則轉(zhuǎn)入步驟(C3);如果沒有,則計算待改寫的數(shù)據(jù)塊的散列值,并用該散列值代替當(dāng)前節(jié)點值,然后進入步驟(C3);(C3)查找該當(dāng)前缺失節(jié)點兄弟節(jié)點;如果兄弟節(jié)點缺失,則稱缺失的兄弟節(jié)點為當(dāng)前缺失節(jié)點,進入步驟(C4);如果不缺失,則進入步驟(C5);(C4)處理步驟如下(C41)判斷當(dāng)前缺失節(jié)點是否為葉節(jié)點,如果不是,轉(zhuǎn)入步驟(C42);如果是,則由缺失節(jié)點對應(yīng)的物理內(nèi)存中數(shù)據(jù)塊計算出散列值,并用計算出的散列值代替當(dāng)前缺失節(jié)點值,然后進入步驟(C5);(C42)計算當(dāng)前缺失節(jié)點的子節(jié)點的地址;(C43)在散列緩存中查找是否有當(dāng)前缺失節(jié)點的子節(jié)點的值,若所有子節(jié)點都不缺失,則由子節(jié)點的值計算出散列值,并用該散列值代替缺失節(jié)點的值,然后進入步驟(C5);若有子節(jié)點缺失,則稱缺失的子節(jié)點為當(dāng)前缺失節(jié)點,然后轉(zhuǎn)入步驟(C4);(C5)判斷是否步驟(C3)所有的兄弟節(jié)點都被查找到了,如果是,則進入步驟(C6),否則跳到步驟(C3);(C6)讀步驟(C3)中第一個當(dāng)前缺失節(jié)點及其兄弟節(jié)點的散列值并計算它們的父節(jié)點的散列值;(C7)在散列緩存中查找是否有父節(jié)點的值;如果父節(jié)點的值缺失,則稱該節(jié)點為當(dāng)前缺失節(jié)點,轉(zhuǎn)入步驟(C8);否則,讀出父節(jié)點的值,并跳到(C9);(C8)判斷步驟(C7)中的當(dāng)前缺失節(jié)點是否為根節(jié)點;如果不是,用步驟(C6)中計算出的散列值代替當(dāng)前缺失節(jié)點的值,然后轉(zhuǎn)入步驟(C3);如果是,則從可信存儲區(qū)中讀出根節(jié)點的值,用之代替父節(jié)點的值,然后進入步驟(C9);(C9)比較讀出的父節(jié)點值和步驟(C6)中計算出的父節(jié)點值;若兩值相等,說明數(shù)據(jù)塊是完整的,則將驗證標(biāo)志位置為1,然后轉(zhuǎn)入步驟(C10);否則,將驗證標(biāo)志位置為0,表示數(shù)據(jù)塊不是完整的,跳到(C11);(C10)更新當(dāng)前節(jié)點和它的父節(jié)點值;(C11)寫操作驗證過程結(jié)束。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟(A2)中,建立多粒度散列樹的過程 為首先以2為粒度,計算葉節(jié)點的散列值,然后同樣以2為粒度,計算基本層節(jié)點的散列 值,從基本層開始,以下一層節(jié)點的粒度,乘2得出上一層節(jié)點的粒度,并以計算出的粒度, 計算上一層節(jié)點的散列值,重復(fù)這一操作,直至計算出根節(jié)點的值。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟(B2)中,查找過程為設(shè)二個相鄰數(shù) 據(jù)塊中的一個數(shù)據(jù)塊的編號為s,該數(shù)據(jù)塊為Ys,其地址為adds,則相應(yīng)葉節(jié)點的地址Addk 由adds右移log2Ni位得到,Ni是層i的粒度,移位后,最左端的空位由0來補足,k為葉節(jié) 點的編號,根據(jù)葉節(jié)點的地址Addk,查找散列緩存相應(yīng)葉節(jié)點的值。
全文摘要
本發(fā)明公開了一種適用于嵌入式處理器的數(shù)據(jù)完整性驗證方法,它包括多粒度散列計算方法,地址轉(zhuǎn)換方法以及散列節(jié)點訪問控制方法。多粒度散列計算方法用于產(chǎn)生多粒度Merkle樹,該樹緩存在散列cache中,同時在樹的節(jié)點缺失時,此算法負(fù)責(zé)計算內(nèi)存中數(shù)據(jù)塊的散列值。地址轉(zhuǎn)換方法為每個節(jié)點提供了一個唯一對應(yīng)的地址。散列節(jié)點訪問控制方法主要負(fù)責(zé)訪問各個散列樹的節(jié)點,特別是在讀缺失和寫操作時采取不同的對策。由于采用多粒度散列算法,本發(fā)明產(chǎn)生的散列樹節(jié)點少,層數(shù)少,因而減少了存儲空間,硬件面積開銷和初始化時間,提高了性能。
文檔編號G06F11/00GK101853190SQ20101019155
公開日2010年10月6日 申請日期2010年6月4日 優(yōu)先權(quán)日2010年6月4日
發(fā)明者劉政林, 郭超, 陳天山, 霍文捷 申請人:華中科技大學(xué)