專利名稱:數(shù)字權(quán)利管理的方法
本申請(qǐng)要求了于2005年10月18日提交的美國(guó)臨時(shí)申請(qǐng)?zhí)?0/728,089、于2006年2月9日提交的美國(guó)臨時(shí)申請(qǐng)?zhí)?0/772,024、于2006年4月10日提交的美國(guó)臨時(shí)申請(qǐng)?zhí)?0/744,574、于2006年4月10日提交的美國(guó)臨時(shí)申請(qǐng)?zhí)?0/791,179、于2006年5月8日提交的美國(guó)臨時(shí)申請(qǐng)?zhí)?0/746,712、于2006年5月8日提交的美國(guó)臨時(shí)申請(qǐng)?zhí)?0/798,925和于2006年8月1日提交的美國(guó)臨時(shí)申請(qǐng)?zhí)?0/835,061的優(yōu)先權(quán)益。這里將美國(guó)臨時(shí)申請(qǐng)?zhí)?0/728,089、60/772,024、60/744,574、60/791,179、60/746,712、60/798,925和60/835,061全部引用以用于任何目的。
版權(quán)許可
本專利文檔的公開內(nèi)容的部分包含受版權(quán)保護(hù)的材料。版權(quán)所有者不反對(duì)任何人對(duì)本專利文獻(xiàn)或?qū)@_內(nèi)容的影印復(fù)制,由于它已經(jīng)出現(xiàn)在美國(guó)專利商標(biāo)局的專利文檔或記錄中,但是在其它方面卻無論如何都保留所有版權(quán)。
技術(shù)背景或相關(guān)信息 在現(xiàn)代計(jì)算系統(tǒng)中,人們常常希望限制對(duì)電子內(nèi)容、服務(wù)和/或處理資源的訪問和/或只允許某些實(shí)體執(zhí)行某些動(dòng)作。已經(jīng)開發(fā)或提出各種技術(shù)來實(shí)現(xiàn)這種控制。這些技術(shù)常常被稱為數(shù)字權(quán)利管理(digital rightsmanagement DRM)技術(shù),這是因?yàn)橐话愕卣f,它們的目標(biāo)在于在數(shù)字或其它電子內(nèi)容、服務(wù)或資源方面管理各實(shí)體的權(quán)利。許多現(xiàn)有技術(shù)的問題在于它們過于復(fù)雜、受限制、相對(duì)不那么靈活,不能實(shí)現(xiàn)某些自然類型的關(guān)系和處理,和/或不能與其它DRM系統(tǒng)共同使用。
這里描述了與改進(jìn)的DRM技術(shù)相關(guān)的系統(tǒng)和方法,所述系統(tǒng)和方法可以用來改進(jìn)這些問題中的一些或全部。應(yīng)當(dāng)理解,目前描述的所發(fā)明工作體的實(shí)施例可以依照多種方式來實(shí)現(xiàn),包括作為程序、設(shè)備、系統(tǒng)、裝置、方法、計(jì)算機(jī)可讀介質(zhì)和/或其組合來實(shí)現(xiàn)。
用于控制對(duì)內(nèi)容訪問的現(xiàn)有系統(tǒng)包括用于結(jié)合對(duì)電子內(nèi)容訪問的授權(quán)來訪問許可的組件。然而,這種組件通常對(duì)與許可相關(guān)聯(lián)的權(quán)利管理信息的鏈或圖、鏈路或節(jié)點(diǎn)執(zhí)行不太靈活的評(píng)估。它們常常不能適于完全不同的授權(quán)方案和/或常常不能與某些DRM系統(tǒng)一起操作來授權(quán)對(duì)內(nèi)容的訪問。本發(fā)明的實(shí)施例通過與許可相關(guān)聯(lián)地存儲(chǔ)、利用和/或執(zhí)行附加例程或控制程序來克服這種缺點(diǎn),其可以提供動(dòng)態(tài)授權(quán)特征,啟用分布式授權(quán)資源和/或另外使訪問功能流水線化。
此外,許多現(xiàn)有系統(tǒng)只針對(duì)其中維持簡(jiǎn)單的與授權(quán)/狀態(tài)相關(guān)的數(shù)據(jù)的情況。這些系統(tǒng)沒能解決其中訪問授權(quán)可能要求關(guān)于多個(gè)數(shù)據(jù)層的相關(guān)性的情況,諸如根據(jù)先前導(dǎo)出的與其它節(jié)點(diǎn)相關(guān)聯(lián)的數(shù)據(jù)來確定條件。本發(fā)明的實(shí)施例通過結(jié)合DRM控制程序?qū)崿F(xiàn)狀態(tài)數(shù)據(jù)庫來提供狀態(tài)存儲(chǔ)特征以克服這些缺點(diǎn),所述狀態(tài)存儲(chǔ)特征是安全的,提供從調(diào)用到調(diào)用的持久狀態(tài)信息,或另外啟用狀態(tài)讀取和寫入功能,所述狀態(tài)讀取和寫入功能改進(jìn)了控制程序的執(zhí)行和/或執(zhí)行更高效的訪問授權(quán)。
另外的現(xiàn)有系統(tǒng)可以實(shí)現(xiàn)DRM許可或結(jié)構(gòu),其包括涉及使用公鑰來保護(hù)許可組件的組件。然而,與這些系統(tǒng)相關(guān)的缺點(diǎn)包括這樣的可能性黑客可以偽造訪問或?qū)嵤┰S可或另外利用存在于DRM許可結(jié)構(gòu)中相關(guān)聯(lián)的相互關(guān)系所要求的數(shù)字簽名。本發(fā)明的一個(gè)或多個(gè)實(shí)施例通過實(shí)施許可對(duì)象的數(shù)字和/或聯(lián)鎖簽名來克服這種缺點(diǎn),包括使用特定的受保護(hù)的密鑰。這些實(shí)施例的優(yōu)點(diǎn)包括通過公鑰以及從許可元項(xiàng)的相互關(guān)系導(dǎo)出的關(guān)聯(lián)特征來防止未授權(quán)的訪問。
其它現(xiàn)有系統(tǒng)可以包括用于在第一實(shí)體和第二實(shí)體之間諸如在兩個(gè)權(quán)利管理實(shí)體之間進(jìn)行鄰近度(proximity)確定的組件。這種系統(tǒng)可以強(qiáng)制執(zhí)行規(guī)則,該規(guī)則表明例如通過執(zhí)行麻煩的鄰近度檢查過程,而使受保護(hù)的內(nèi)容無法被拷貝到某一環(huán)境之外。然而,這些系統(tǒng)的缺點(diǎn)在于它們還不能在不過于妨礙執(zhí)行鄰近度檢查本身的情況下向受保護(hù)的內(nèi)容提供安全性保護(hù)。本發(fā)明的實(shí)施例通過提供經(jīng)由與傳輸隨機(jī)數(shù)和/或秘密種子相關(guān)的特征來實(shí)現(xiàn)可靠的簡(jiǎn)潔的鄰近度檢測(cè)協(xié)議來克服這些及其它缺點(diǎn)。一個(gè)或多個(gè)實(shí)施例的相關(guān)聯(lián)優(yōu)點(diǎn)包括攻擊者在密碼上不可能確定正確的響應(yīng),即便已經(jīng)攔截了請(qǐng)求也是如此。
總之,需要一種可以不依靠過于復(fù)雜的、受限制的和/或相對(duì)不靈活的技術(shù)來充分授權(quán)對(duì)電子內(nèi)容的訪問的系統(tǒng),能夠啟用某些自然類型的關(guān)系和過程的系統(tǒng),和/或可與其它DRM系統(tǒng)一起操作的系統(tǒng)。
發(fā)明內(nèi)容
按照本發(fā)明的系統(tǒng)、方法和制造產(chǎn)品針對(duì)電子內(nèi)容的授權(quán)訪問以及與所述電子內(nèi)容相關(guān)聯(lián)的數(shù)據(jù)處理。
在一個(gè)示例性實(shí)施例中,提供了一種用于授權(quán)訪問在存儲(chǔ)器中所存儲(chǔ)的電子內(nèi)容的方法。此示例性實(shí)施例的方法可以包括接收用于訪問電子內(nèi)容的請(qǐng)求,獲取(retrieve)與所述電子內(nèi)容相關(guān)聯(lián)的許可,并且使用數(shù)字權(quán)利管理引擎來執(zhí)行第一控制程序以便確定所述請(qǐng)求是否可以被準(zhǔn)許。其它示例性實(shí)施例可以包括評(píng)估在存儲(chǔ)器中所存儲(chǔ)的一個(gè)或多個(gè)鏈路對(duì)象并且執(zhí)行第二控制程序以便確定所述鏈路是否有效和/或一個(gè)或多個(gè)條件是否被滿足。
應(yīng)當(dāng)理解,以上一般描述以及以下詳細(xì)描述只是示例性的和解釋性的,而并非是限制所描述的本發(fā)明。除這里所闡明的那些特征和/或變化之外,還可以提供進(jìn)一步的特征和/或變化。例如,本發(fā)明可以針對(duì)所公開特征的各種組合和子組合和/或下面在詳細(xì)描述中所公開的幾個(gè)進(jìn)一步特征的組合和子組合。
結(jié)合附圖參照以下詳細(xì)描述可以容易地理解本發(fā)明的發(fā)明主體,其中 圖1示出了用于管理電子內(nèi)容的使用的說明性系統(tǒng)。
圖2示出了可以用來實(shí)施所發(fā)明工作主體的實(shí)施例的系統(tǒng)的更詳細(xì)例子。
圖3示出了說明性的數(shù)字權(quán)利管理(DRM)引擎在使用DRM的網(wǎng)絡(luò)中可以怎樣起作用。
圖4示出了用于對(duì)DRM系統(tǒng)中的關(guān)系進(jìn)行建模的節(jié)點(diǎn)和鏈路的集合。
圖5是用于圖示DRM引擎的實(shí)施例可以怎樣確定所請(qǐng)求的動(dòng)作是否被授權(quán)的流程圖。
圖6依照所發(fā)明的工作主體的一個(gè)實(shí)施例示出了DRM許可的例子。
圖7A和7B圖示了在一個(gè)實(shí)施例中代理的使用。
圖8示出了DRM許可的例子。
圖9是DRM引擎可以怎樣確定所請(qǐng)求的動(dòng)作是否被授權(quán)的更詳細(xì)的例子。
圖10是DRM引擎怎樣在一個(gè)實(shí)施例對(duì)象中執(zhí)行控制程序的更詳細(xì)的例子。
圖11示出了在設(shè)備上運(yùn)行的DRM引擎的說明性實(shí)施例。
圖12是用于圖示在一個(gè)實(shí)施例中執(zhí)行控制程序中所涉及的步驟的流程圖。
圖13示出了在一個(gè)實(shí)施例中構(gòu)成內(nèi)容消費(fèi)客戶端應(yīng)用的元項(xiàng)。
圖14示出了在一個(gè)實(shí)施例中構(gòu)成內(nèi)容封裝(packaging)應(yīng)用的元項(xiàng)。
圖15示出了依照一個(gè)實(shí)施例的密鑰推導(dǎo)機(jī)制。
圖16示出了DRM系統(tǒng)的例子。
圖17示出了用于規(guī)定臨時(shí)登錄的DRM系統(tǒng)的例子。
圖18示出了用于管理企業(yè)文檔的說明性系統(tǒng)的高級(jí)體系結(jié)構(gòu)。
圖19示出了諸如在圖18中所示出的系統(tǒng)可以怎樣用來管理對(duì)文檔的訪問或其它使用的例子。
圖20示出了諸如在圖18中所示出的系統(tǒng)可以怎樣用來管理對(duì)文檔的訪問或其它使用的附加例子。
圖21示出了在圖20中所示出的例子的附加特征。
圖22示出了用于管理企業(yè)內(nèi)的電子內(nèi)容的另一說明性系統(tǒng)。
圖23圖示了可以怎樣應(yīng)用這里所描述的系統(tǒng)和方法來管理保健記錄。
圖24是在電子預(yù)訂服務(wù)的情境中可以怎樣使用這里所給出的系統(tǒng)和方法的圖解。
圖25是在家庭網(wǎng)絡(luò)域的情境中可以怎樣使用這里所描述的系統(tǒng)和方法的圖解。
圖26圖示了在一個(gè)示例性實(shí)施例中在主機(jī)應(yīng)用和DRM客戶端引擎之間發(fā)生的交互。
圖27圖示了在一個(gè)說明性實(shí)施例中在主機(jī)應(yīng)用和封裝引擎之間發(fā)生的交互。
圖28A是依照一個(gè)實(shí)施例的許可的更詳細(xì)的圖解。
圖28B圖示了在一個(gè)示例性實(shí)施例中在鏈路和節(jié)點(diǎn)之間的關(guān)系。
圖29圖示了虛擬機(jī)的說明性實(shí)現(xiàn)的運(yùn)行環(huán)境。
圖30圖示了依照一個(gè)實(shí)施例的擴(kuò)展?fàn)顟B(tài)塊數(shù)據(jù)結(jié)構(gòu)。
圖31A示出了在一個(gè)實(shí)施例中的數(shù)據(jù)段的存儲(chǔ)器映像。
圖31B示出了在一個(gè)實(shí)施例中的代碼段的存儲(chǔ)器映像的例子。
圖31C示出了在一個(gè)實(shí)施例中的輸出入口存儲(chǔ)器映像的例子。
圖31D示出了在一個(gè)實(shí)施例中的輸出表入口的通用例子。
圖31E示出了用于示例性入口點(diǎn)(entry point)的輸出表入口的例子。
圖32示出了許可轉(zhuǎn)送協(xié)議的例子。
圖33示出了依照一個(gè)實(shí)施例的許可轉(zhuǎn)送協(xié)議的另一例子。
圖34示出了用于在一個(gè)實(shí)施例中保護(hù)許可對(duì)象的完整性的機(jī)制。
圖35示出了用于在另一實(shí)施例中保護(hù)許可對(duì)象的完整性的機(jī)制。
圖36圖示了依照一個(gè)實(shí)施例的鄰近度檢查協(xié)議。
圖37圖示了依照一個(gè)實(shí)施例的鄰近度檢查協(xié)議的使用。
圖38圖示了在一個(gè)實(shí)施例中在客戶端和許可服務(wù)器之間的交互。
圖39是在一個(gè)實(shí)施例中在客戶端和許可服務(wù)器之間交互的更詳細(xì)圖解。
圖40示出了具有多個(gè)角色的實(shí)體的例子。
圖41圖示了依照一個(gè)實(shí)施例的引導(dǎo)(bootstrap)協(xié)議。
圖42示出了在一個(gè)實(shí)施例中在c14n-ex和說明性XML規(guī)范化之間的關(guān)系。
具體實(shí)施例方式 下面提供了所發(fā)明工作主體的詳細(xì)描述。雖然描述了幾個(gè)實(shí)施例,然而應(yīng)當(dāng)理解,所發(fā)明的工作主體不限于任何一個(gè)實(shí)施例,而是作為替代包含很多替換、修改和等效方式。另外,雖然在下面描述中闡明了很多具體細(xì)節(jié)以便提供對(duì)所發(fā)明工作主體的徹底理解,不過可以在沒有這些細(xì)節(jié)中的一些或全部的情況下實(shí)現(xiàn)一些實(shí)施例。此外,為了清楚目的,并未詳細(xì)描述在相關(guān)技術(shù)中已知的某些技術(shù)材料,以免不必要地模糊所發(fā)明的工作主體。
共同受讓的美國(guó)專利申請(qǐng)?zhí)?0/863,551、公開號(hào)2005/0027871 A1(“‘551申請(qǐng)”)描述了數(shù)字權(quán)利管理(DRM)體系結(jié)構(gòu)和新穎DRM引擎的實(shí)施例,其克服了許多先前DRM實(shí)現(xiàn)方式所體現(xiàn)的一些弱點(diǎn),在此通過引用加以結(jié)合以供參考。本申請(qǐng)描述了對(duì)在‘551申請(qǐng)中所描述的體系結(jié)構(gòu)和DRM引擎的增強(qiáng)、擴(kuò)充和修改以及可替換實(shí)施例,并且還描述了新的組件、體系結(jié)構(gòu)和實(shí)施例。從而應(yīng)當(dāng)理解,可以在諸如‘551申請(qǐng)中所描述的體系結(jié)構(gòu)和/或DRM引擎的情境內(nèi)以及在其它情境內(nèi)使用這里所描述的材料。
1.示例性DRM系統(tǒng) 圖1示出了用于管理電子內(nèi)容的說明性系統(tǒng)100。如圖1所示,用于保持電子內(nèi)容103中權(quán)利的實(shí)體102封裝內(nèi)容以供分發(fā)和最終用戶108a-e消費(fèi)(被一起稱作“最終用戶108”,其中附圖標(biāo)記108可交換地指代最終用戶或最終用戶的計(jì)算系統(tǒng),這在本文情境下將是清楚的)。例如,實(shí)體102可以包括內(nèi)容所有者、創(chuàng)建者或供應(yīng)者,諸如音樂家、電影工作室、出版社、軟件公司、作者、移動(dòng)服務(wù)供應(yīng)者、因特網(wǎng)內(nèi)容下載或預(yù)訂服務(wù)、電纜或衛(wèi)星電視供應(yīng)者、公司雇員等或者代表其活動(dòng)的實(shí)體,并且內(nèi)容103可以包括任何電子內(nèi)容,諸如數(shù)字視頻、音頻或文本內(nèi)容,電影、歌曲、視頻游戲、軟件、電子郵件消息、文本消息、字處理文檔、報(bào)道或任何其它娛樂、企業(yè)或其它內(nèi)容。
在圖1所示出的例子中,實(shí)體102使用封裝引擎109來使許可106與所封裝的內(nèi)容104相關(guān)聯(lián)。許可106是基于實(shí)體102的策略105或其它意愿的,并且指定允許和/或禁止使用內(nèi)容和/或一個(gè)或多個(gè)條件,為了利用內(nèi)容,所述一個(gè)或多個(gè)條件必須被滿足,或者所述一個(gè)或多個(gè)條件作為使用條件或結(jié)果必須被滿足。所述內(nèi)容還可以由諸如加密或數(shù)字簽名技術(shù)之類的一個(gè)或多個(gè)密碼機(jī)制來保證安全,為此可以使用信任權(quán)威機(jī)構(gòu)110來獲得適當(dāng)?shù)拿艽a密鑰、證書等。
如圖1所示,可以借助任何適當(dāng)?shù)氖侄蝸硐蜃罱K用戶108提供封裝的內(nèi)容104和許可106,諸如經(jīng)由像因特網(wǎng)的網(wǎng)絡(luò)112、局域網(wǎng)103、無線網(wǎng)絡(luò)、虛擬專用網(wǎng)絡(luò)107、廣域網(wǎng)等,經(jīng)由電纜、衛(wèi)星、廣播或蜂窩式通信114,和/或經(jīng)由諸如壓縮光盤(CD)、數(shù)字多功能盤(DVD)、快閃存儲(chǔ)卡(例如,安全數(shù)字(SD)卡)之類的可記錄介質(zhì)116等。封裝的內(nèi)容104可以連同許可106一起以單個(gè)封包或傳輸113中或以從相同或不同源所接收的獨(dú)立封包或傳輸中被遞送給用戶。
最終用戶的系統(tǒng)(例如,個(gè)人計(jì)算機(jī)108e,移動(dòng)電話108a,電視和/或電視機(jī)頂盒108c,便攜式音頻和/或視頻播放器,電子書閱讀器等)包含應(yīng)用軟件116、硬件和/或?qū)S眠壿媶卧?,專用邏輯單元可操作來獲取并再現(xiàn)所述內(nèi)容。用戶的系統(tǒng)還包括這里被稱作為數(shù)字權(quán)利管理引擎118的軟件和/或硬件,用于評(píng)估與所封裝的內(nèi)容104相關(guān)聯(lián)的許可106并且強(qiáng)制執(zhí)行它的條款(和/或使應(yīng)用116能夠強(qiáng)制執(zhí)行這種條款),諸如通過有選擇地準(zhǔn)許用戶只有當(dāng)被許可106允許時(shí)才能訪問所述內(nèi)容來實(shí)現(xiàn)。數(shù)字權(quán)利管理引擎118可以在結(jié)構(gòu)上或功能上與應(yīng)用116集成,或者可以包括獨(dú)立的軟件和/或硬件。作為選擇或另外,諸如系統(tǒng)108c之類的用戶的系統(tǒng)可以與諸如系統(tǒng)108b之類的遠(yuǎn)程系統(tǒng)(例如,服務(wù)器,用戶設(shè)備網(wǎng)絡(luò)中的另一設(shè)備,諸如個(gè)人計(jì)算機(jī)或電視機(jī)頂盒等)通信,所述遠(yuǎn)程系統(tǒng)使用數(shù)字權(quán)利管理引擎來確定120是否準(zhǔn)許用戶訪問該用戶先前所獲得或請(qǐng)求的內(nèi)容。
數(shù)字權(quán)利管理引擎和/或用戶系統(tǒng)上或與其遠(yuǎn)程通信的其它軟件還可以記錄關(guān)于用戶對(duì)受保護(hù)內(nèi)容的訪問或其它使用的信息。在一些實(shí)施例中,此信息中的一些或全部可以被傳送到遠(yuǎn)程方(例如,交換所(clearinghouse)122,內(nèi)容創(chuàng)建者,所有者或供應(yīng)者102,用戶管理者,代表其活動(dòng)的實(shí)體等),例如以用于分配收益(諸如使用費(fèi),基于廣告的收益等)、確定用戶偏好、強(qiáng)制系統(tǒng)策略(例如,監(jiān)視怎樣以及何時(shí)使用機(jī)密信息)等。應(yīng)當(dāng)理解,雖然圖1示出了說明性的DRM體系結(jié)構(gòu)和一組說明性關(guān)系,但是可以在任何適當(dāng)?shù)那榫持袑?shí)施這里所描述的系統(tǒng)和方法,并且從而應(yīng)當(dāng)理解,圖1是用于圖示和解釋目的而不是限制目的。
圖2示出了可以用來實(shí)施本發(fā)明工作主體的實(shí)施例的系統(tǒng)200的更詳細(xì)的例子。例如,系統(tǒng)200可以包括最終用戶的設(shè)備108、內(nèi)容供應(yīng)者的設(shè)備109等的實(shí)施例。例如,系統(tǒng)200可以包括諸如個(gè)人計(jì)算機(jī)108e或網(wǎng)絡(luò)服務(wù)器105之類的通用計(jì)算設(shè)備或諸如蜂窩式電話108a、個(gè)人數(shù)字助理、便攜式音頻或視頻播放器、電視機(jī)頂盒、信息亭、游戲系統(tǒng)等專門計(jì)算設(shè)備。系統(tǒng)200一般包括處理器202、存儲(chǔ)器204、用戶接口206、用于接受可拆卸存儲(chǔ)器208的端口207、網(wǎng)絡(luò)接口210和用于連接上述元件的一個(gè)或多個(gè)總線212。系統(tǒng)200的操作一般由在存儲(chǔ)器204中所存儲(chǔ)的程序指導(dǎo)下操作的處理器202來控制。存儲(chǔ)器204通常包括高速隨機(jī)存取存儲(chǔ)器(RAM)和非易失性存儲(chǔ)器,諸如磁盤和/或閃速EEPROM。存儲(chǔ)器204的某些部分可以被限制,以致它們無法被系統(tǒng)200的其它組件讀取或?qū)懭?。端?07可以包括用于接受計(jì)算機(jī)可讀介質(zhì)208的盤驅(qū)動(dòng)器或存儲(chǔ)器插槽,所述計(jì)算機(jī)可讀介質(zhì)208諸如軟盤、CD-ROM、DVD、存儲(chǔ)卡、SD卡、其它磁或光介質(zhì)等。網(wǎng)絡(luò)接口210一般可操作來經(jīng)由諸如因特網(wǎng)或內(nèi)部網(wǎng)(例如,LAN,WAN,VPN等)之類的網(wǎng)絡(luò)220來在系統(tǒng)200及其它計(jì)算設(shè)備(和/或計(jì)算設(shè)備網(wǎng)絡(luò))之間提供連接,并且可以使用一種或多種通信技術(shù)來在物理上進(jìn)行這種連接(例如,無線,以太網(wǎng)等)。在一些實(shí)施例中,系統(tǒng)200還可以包括處理單元203,所述處理單元203受到保護(hù)以避免被系統(tǒng)200的用戶或其它實(shí)體篡改。這種安全的處理單元可以幫助增強(qiáng)諸如密鑰管理、簽名驗(yàn)證之類的敏感操作以及數(shù)字權(quán)利管理過程的其它方面的安全性。
如圖2所示,計(jì)算設(shè)備200的存儲(chǔ)器204可以包括用于控制計(jì)算設(shè)備200操作的各種程序或模塊。例如,存儲(chǔ)器204一般包括用于管理應(yīng)用、外圍裝置等執(zhí)行的操作系統(tǒng)220;用于再現(xiàn)受保護(hù)的電子內(nèi)容的主機(jī)應(yīng)用230;和用于執(zhí)行這里所描述權(quán)利管理功能中的一些或全部的DRM引擎232。如在此的其它地方所描述,DRM引擎232可以包括、與之相互操作和/或控制各種其它模塊,諸如用于執(zhí)行控制程序的虛擬機(jī)222,和用于存儲(chǔ)狀態(tài)信息以供虛擬機(jī)222使用的狀態(tài)數(shù)據(jù)庫224,和/或用于執(zhí)行密碼運(yùn)算(諸如加密和/或解密內(nèi)容、計(jì)算散列函數(shù)和消息認(rèn)證代碼、評(píng)估數(shù)字簽名等)的一個(gè)或多個(gè)密碼模塊226。存儲(chǔ)器204一般還包括受保護(hù)的內(nèi)容228和相關(guān)聯(lián)的許可229以及密碼密鑰、證書等(未示出)。
一個(gè)本領(lǐng)域普通技術(shù)人員應(yīng)當(dāng)理解,這里所描述的系統(tǒng)和方法可以利用與圖2中所圖示的類似或完全相同的計(jì)算設(shè)備或?qū)嶋H上任何其它適當(dāng)?shù)挠?jì)算設(shè)備來實(shí)施,包括不擁有在圖2中所示出的一些組件的計(jì)算設(shè)備和/或擁有未示出的其它組件的計(jì)算設(shè)備。從而應(yīng)當(dāng)理解,圖2只用于圖示而并非是限制目的。
這里描述了數(shù)字權(quán)利管理引擎和相關(guān)的系統(tǒng)和方法,其可以用來提供在圖1和2中所示出的那些系統(tǒng)或其它類型系統(tǒng)中的權(quán)利管理功能中的一些或全部。另外,下面將描述各種其它系統(tǒng)和方法,其可以用在圖1和2中所示出的那些系統(tǒng)情境中以及其它情境中,包括與數(shù)字權(quán)利管理無關(guān)的環(huán)境。
2.DRM引擎體系結(jié)構(gòu) 在一個(gè)實(shí)施例中,使用相對(duì)簡(jiǎn)單、開放和靈活的數(shù)字權(quán)利管理(DRM)引擎來執(zhí)行核心DRM功能。在優(yōu)選實(shí)施例中,此DRM引擎被設(shè)計(jì)成用于相對(duì)容易地集成到諸如在‘551申請(qǐng)中所描述的web網(wǎng)絡(luò)服務(wù)環(huán)境中,以及集成到可能的任何主機(jī)環(huán)境或軟件體系結(jié)構(gòu)中。在優(yōu)選實(shí)施例中,DRM引擎與特定的媒體格式和密碼協(xié)議無關(guān),允許設(shè)計(jì)者按照特定情況的要求來靈活地使用標(biāo)準(zhǔn)化或?qū)S屑夹g(shù)。由DRM引擎的優(yōu)選實(shí)施例所使用的管理支配(governance)模型是簡(jiǎn)單的,但是該模型可以用來表達(dá)良好的關(guān)系和業(yè)務(wù)模型。
下述DRM引擎的一些說明性實(shí)施例涉及被稱為“章魚(Octopus)”的示例性實(shí)現(xiàn)方式;然而應(yīng)當(dāng)理解,本發(fā)明并不限于章魚例子的具體細(xì)節(jié),并且僅用于說明而并非限制性目的。
1.1.概述 圖3示出了說明性的DRM引擎303a在使用DRM的系統(tǒng)302中可以怎樣來起作用。如圖3所示,在一個(gè)實(shí)施例中,DRM引擎303a被嵌入或集成到主機(jī)應(yīng)用304a(例如,諸如音頻和/或視頻播放器之類的內(nèi)容再現(xiàn)應(yīng)用,諸如電子郵件程序、文字處理器、電子書讀取器或文件閱讀器等文本再現(xiàn)應(yīng)用)內(nèi)或與之通信。在一個(gè)實(shí)施例中,DRM引擎303a執(zhí)行DRM功能并且對(duì)于諸如加密、解密、文件管理之類的服務(wù)依賴主機(jī)應(yīng)用304a,和/或可以由主機(jī)來更有效地提供其它功能。例如,在優(yōu)選實(shí)施例中,DRM引擎303a可操作來操縱DRM對(duì)象305,所述DRM對(duì)象305包括受保護(hù)內(nèi)容308的許可306。在一些實(shí)施例中,DRM引擎303a還可以向主機(jī)應(yīng)用304a遞送密鑰。如圖3所示,DRM引擎303a和主機(jī)應(yīng)用304a中的一個(gè)或兩個(gè)可以利用要處理的web網(wǎng)絡(luò)服務(wù)305a和/或主機(jī)服務(wù)306a和/或?yàn)橥瓿伤鼈兏髯缘娜蝿?wù)所需要的信息。‘551申請(qǐng)?zhí)峁┝诉@種服務(wù)的例子以及其中DRM引擎303a和主機(jī)應(yīng)用304a可以相互操作的方式。
在圖3所示出的例子中,DRM引擎303a、主機(jī)應(yīng)用304a、主機(jī)服務(wù)306a和web網(wǎng)絡(luò)服務(wù)接口305a被加載到諸如最終用戶的個(gè)人計(jì)算機(jī)(PC)之類的設(shè)備300a上。設(shè)備300a可通信地耦合到服務(wù)器300b以及便攜式設(shè)備300d,其中從所述服務(wù)器300b獲得內(nèi)容308和許可306,并且設(shè)備300a可以向便攜式設(shè)備300d轉(zhuǎn)發(fā)內(nèi)容308和/或許可306。這些其它設(shè)備中的每個(gè)可以包括與DRM引擎300a類似或完全相同的DRM引擎303,其可以與所述設(shè)備的特定主機(jī)應(yīng)用和主機(jī)環(huán)境相集成。例如,服務(wù)器300b可以包括主機(jī)應(yīng)用304b,用于執(zhí)行成批封裝內(nèi)容和/或許可,并且利用DRM引擎300a來評(píng)估與正被封裝的內(nèi)容相關(guān)聯(lián)的控制,以便與任何重新分發(fā)的限制相一致。類似地,設(shè)備300c可以包括能夠再現(xiàn)并封裝內(nèi)容的主機(jī)應(yīng)用304c,而設(shè)備300a可以包括只能再現(xiàn)內(nèi)容的主機(jī)應(yīng)用。作為潛在的主機(jī)環(huán)境多樣性的又一例子,設(shè)備300d可以不包括web網(wǎng)絡(luò)服務(wù)接口,但是作為替代可以依賴于與設(shè)備300a的通信和web網(wǎng)絡(luò)服務(wù)接口305a,以達(dá)到這樣的程度主機(jī)應(yīng)用304d和/或DRM引擎303d需要使用任何web網(wǎng)絡(luò)服務(wù)。圖3只是其中可以使用DRM引擎的系統(tǒng)的一個(gè)例子;應(yīng)當(dāng)理解,這里所描述的DRM引擎的實(shí)施例可以依照許多不同的方式執(zhí)行并且與應(yīng)用和系統(tǒng)集成,并且不限于在圖3中所示出的說明性例子。
1.2.對(duì)象 在優(yōu)選實(shí)施例中,內(nèi)容保護(hù)和管理支配對(duì)象用來表示系統(tǒng)中的實(shí)體、保護(hù)內(nèi)容、使使用規(guī)則與內(nèi)容相關(guān)聯(lián)并且確定當(dāng)請(qǐng)求時(shí)訪問是否被準(zhǔn)許。
如下面所更詳細(xì)地描述,在一個(gè)實(shí)施例中使用以下對(duì)象
1.2.1.節(jié)點(diǎn)對(duì)象 節(jié)點(diǎn)對(duì)象用來表示系統(tǒng)中的實(shí)體。在實(shí)踐中,節(jié)點(diǎn)通常表示用戶、設(shè)備或組。節(jié)點(diǎn)對(duì)象一般還具有相關(guān)聯(lián)的屬性,所述相關(guān)聯(lián)的屬性表示與節(jié)點(diǎn)相關(guān)聯(lián)的實(shí)體的某些特性。
例如,圖4示出了兩個(gè)用戶(Xan 400和Knox 402)、兩個(gè)設(shè)備(PC404和便攜式設(shè)備406)和用于表示組(例如,凱里家庭的成員408、公共圖書館的成員410、特定音樂服務(wù)的訂戶412、RIAA批準(zhǔn)的設(shè)備414以及特定公司所制造的設(shè)備416)的幾個(gè)實(shí)體,每一個(gè)都具有相關(guān)聯(lián)的節(jié)點(diǎn)對(duì)象。
在一個(gè)實(shí)施例中,節(jié)點(diǎn)對(duì)象包括用于定義該節(jié)點(diǎn)用來表示什么的屬性。屬性的一個(gè)例子是節(jié)點(diǎn)類型。除表示用戶、組或設(shè)備之外,節(jié)點(diǎn)類型屬性可以用來表示其它實(shí)體。在一些實(shí)施例中,節(jié)點(diǎn)對(duì)象還可以包括密碼密鑰信息,諸如當(dāng)使用別處描述的密鑰推導(dǎo)和分發(fā)技術(shù)的實(shí)施例時(shí)的密碼密鑰信息。
在一些實(shí)施例中,節(jié)點(diǎn)對(duì)象還包括保密性的非對(duì)稱密鑰對(duì),用于把機(jī)密信息目標(biāo)定為有權(quán)訪問所述節(jié)點(diǎn)對(duì)象的機(jī)密部分的子系統(tǒng)。這可以是節(jié)點(diǎn)所表示的實(shí)體(例如,音樂服務(wù)412)或負(fù)責(zé)管理所述節(jié)點(diǎn)的某個(gè)實(shí)體(例如,最終用戶(例如,Knox 402)可以負(fù)責(zé)管理他或她的便攜式設(shè)備406)。
1.2.2.鏈路對(duì)象 在優(yōu)選實(shí)施例中,鏈路對(duì)象是用于示出在兩個(gè)節(jié)點(diǎn)之間關(guān)系的簽名的(signed)的對(duì)象。例如,在圖4中,從PC節(jié)點(diǎn)404到Knox 402的鏈路418示出了所有權(quán)。從Knox 402到凱里家庭節(jié)點(diǎn)408的鏈路示出了成員資格,從所述Carey家庭節(jié)點(diǎn)408到音樂服務(wù)訂戶節(jié)點(diǎn)412的鏈路也是這樣。在一個(gè)實(shí)施例中,鏈路對(duì)象表達(dá)在兩個(gè)節(jié)點(diǎn)之間的關(guān)系,從而在圖4中所示出的關(guān)系可以使用十個(gè)鏈路來表示。
如圖4所示,圖420可以用來表達(dá)在節(jié)點(diǎn)之間的關(guān)系,其中鏈路對(duì)象是在節(jié)點(diǎn)之間的有向邊。例如在圖4中,在凱里家庭節(jié)點(diǎn)408和音樂服務(wù)節(jié)點(diǎn)412之間的關(guān)系斷言在該圖中存在其頂點(diǎn)為凱里家庭節(jié)點(diǎn)408和音樂服務(wù)節(jié)點(diǎn)412的有向邊422。Knox 402和Xan 400是凱里家庭408的成員。因?yàn)镵nox 402被鏈接到凱里家庭408并且所述凱里家庭408被鏈接到音樂服務(wù)412,所以認(rèn)為在Knox 402和音樂服務(wù)412之間存在路徑。當(dāng)存在從一個(gè)節(jié)點(diǎn)到其它節(jié)點(diǎn)的路徑時(shí),DRM引擎認(rèn)為該節(jié)點(diǎn)可從另一節(jié)點(diǎn)到達(dá)。這允許寫入控制,用于允許根據(jù)節(jié)點(diǎn)可從其中正執(zhí)行用于請(qǐng)求訪問受保護(hù)內(nèi)容的應(yīng)用的設(shè)備到達(dá)的條件來許可訪問受保護(hù)的內(nèi)容。
如下面所更詳細(xì)地描述,鏈路對(duì)象選擇性地還可以包含用于允許推導(dǎo)內(nèi)容密鑰的一些密碼數(shù)據(jù)。鏈路對(duì)象還可以包含用于定義所述鏈路可以被認(rèn)為有效的條件的控制程序。這種控制程序可以被DRM引擎的虛擬機(jī)執(zhí)行或解釋(這里這些術(shù)語可交換地使用)以便評(píng)估鏈路的有效性(例如,以便確定所述鏈路是否可以用來到達(dá)授權(quán)圖中的給定節(jié)點(diǎn))。
在一個(gè)實(shí)施例中,鏈路被簽名??梢允褂萌魏芜m當(dāng)?shù)臄?shù)字簽名機(jī)制,并且在一個(gè)實(shí)施例中DRM引擎沒有定義鏈路對(duì)象怎樣被簽名并且沒有評(píng)估任何相關(guān)聯(lián)的證書,作為替代它依賴主機(jī)系統(tǒng)來驗(yàn)證任何這種簽名和/或證書。這允許系統(tǒng)設(shè)計(jì)者或管理員定義鏈路對(duì)象的使用期、撤消它等(例如,通過使用期滿密鑰或證書、撤銷等),從而在特定的受保護(hù)內(nèi)容和/鏈路的情境下在通過DRM引擎評(píng)估控制程序和DRM對(duì)象所提供的策略管理和安全性之上提供了附加的策略管理和安全性層(例如,鏈路期滿作為選擇或另外可以通過在鏈路對(duì)象本身中包括適當(dāng)?shù)目刂瞥绦騺韺?shí)現(xiàn),所述控制程序當(dāng)執(zhí)行時(shí)會(huì)強(qiáng)制實(shí)施期滿日期或其它有效期)。在一個(gè)實(shí)施例中,DRM引擎是通用的,并且與任何適當(dāng)?shù)募用?、?shù)字簽名、撤銷和/或由主機(jī)應(yīng)用和/或環(huán)境所使用的其它安全機(jī)制一起工作。從而,例如如果DRM引擎需要確定特定鏈路是否已經(jīng)被適當(dāng)?shù)暮灻敲此梢院?jiǎn)單地調(diào)用主機(jī)應(yīng)用(和/或主機(jī)或系統(tǒng)密碼服務(wù))以便依照由系統(tǒng)設(shè)計(jì)者所選擇的特定簽名方案來驗(yàn)證所述簽名,DRM引擎本身可以不知道所述方案的細(xì)節(jié)。在其它實(shí)施例中,DRM引擎本身依賴主機(jī)簡(jiǎn)單地表明所使用的適當(dāng)簽名算法,來執(zhí)行實(shí)際的簽名評(píng)估。
1.2.3.內(nèi)容保護(hù)和管理支配 再次參照?qǐng)D3,在典型的方案中,內(nèi)容供應(yīng)者300b使用應(yīng)用304b,所述應(yīng)用304b包括用于加密或用密碼來保護(hù)電子內(nèi)容308的封裝引擎,并且所述內(nèi)容供應(yīng)者300b創(chuàng)建用于管理支配對(duì)該內(nèi)容的訪問或其它使用的許可306。在一個(gè)實(shí)施例中,許可308包括用于指定可以怎樣使用內(nèi)容308的一組對(duì)象305,并且還包括內(nèi)容的加密密鑰和/或?yàn)楂@得它們所需要的信息。在一個(gè)實(shí)施例中,內(nèi)容308和許可306在邏輯上是獨(dú)立的,但是通過內(nèi)部引用(例如,使用對(duì)象ID310)被綁定在一起。在許多情況中,把內(nèi)容和許可一起存儲(chǔ)和/或一起遞送可能是方便的;然而在優(yōu)選實(shí)施例中并不要求這樣。在一個(gè)實(shí)施例中,許可可以應(yīng)用于一個(gè)以上的內(nèi)容項(xiàng),并且一個(gè)以上許可可以應(yīng)用于任何單個(gè)的內(nèi)容項(xiàng)。
如圖3所示,當(dāng)在客戶端設(shè)備300a上運(yùn)行的主機(jī)應(yīng)用304a想要對(duì)特定的內(nèi)容308執(zhí)行動(dòng)作時(shí),它請(qǐng)求DRM引擎303a檢查它旨在執(zhí)行的動(dòng)作(例如“播放”)是否被允許。在一個(gè)實(shí)施例中,DRM引擎303a從在包括內(nèi)容許可306的對(duì)象305中所包含的信息中加載并執(zhí)行與內(nèi)容308相關(guān)聯(lián)的控制程序,并且根據(jù)所述控制程序所返回的結(jié)果來準(zhǔn)許或拒絕用于執(zhí)行該動(dòng)作的權(quán)限。權(quán)限一般要求滿足一些條件,諸如節(jié)點(diǎn)可從用于表示請(qǐng)求實(shí)體/設(shè)備300a的節(jié)點(diǎn)到達(dá)的條件。
圖5是用于圖示DRM引擎的實(shí)施例可以怎樣確定所請(qǐng)求的動(dòng)作(例如,觀看內(nèi)容)是否被授權(quán)的流程圖。如圖5所示,接收用于評(píng)估對(duì)給定動(dòng)作的許可的請(qǐng)求(500)。例如,在主機(jī)從用戶接收用于執(zhí)行所指定動(dòng)作的請(qǐng)求之后,可以從主機(jī)應(yīng)用接收此請(qǐng)求。如圖5所示,DRM引擎評(píng)估所指定的許可(502),并且確定所請(qǐng)求的動(dòng)作是否被授權(quán)(504)。例如,所述許可可以包含DRM引擎執(zhí)行的控制程序,其輸出用來進(jìn)行授權(quán)判定。如果許可授權(quán)所請(qǐng)求的動(dòng)作(即,從塊504“是”退出),那么DRM引擎向主機(jī)應(yīng)用表明所述請(qǐng)求被準(zhǔn)許(506)。否則,DRM引擎向主機(jī)應(yīng)用表明所述請(qǐng)求被拒絕(508)。在一些實(shí)施例中,DRM引擎還可以向主機(jī)應(yīng)用返回各種元數(shù)據(jù),所述元數(shù)據(jù)例如用于把條件與準(zhǔn)許授權(quán)相關(guān)聯(lián)(例如,義務(wù)(obligation)和/或回調(diào)(callback)),或者提供關(guān)于拒絕授權(quán)原因的附加信息。例如,DRM引擎可以表明只有主機(jī)應(yīng)用記錄關(guān)于所請(qǐng)求動(dòng)作執(zhí)行的某些信息才允許所請(qǐng)求的動(dòng)作,或者只要所述主機(jī)應(yīng)用以預(yù)定義的時(shí)間間隔回調(diào)DRM引擎以便例如重新評(píng)估許可,才允許所請(qǐng)求的動(dòng)作。下面提供了由DRM引擎所返回的關(guān)于這種義務(wù)、回調(diào)的附加信息及其它元數(shù)據(jù)。如果所請(qǐng)求的動(dòng)作被授權(quán),那么內(nèi)容密鑰將被(例如,從許可的內(nèi)容密鑰對(duì)象中)獲取,并且用來就所請(qǐng)求的使用而發(fā)布所述內(nèi)容。
1.2.4.許可DRM對(duì)象 如圖6所示,在優(yōu)選實(shí)施例中,許可600是對(duì)象集合。在圖6所示出的例子中,許可600包括內(nèi)容密鑰對(duì)象602、保護(hù)器對(duì)象604、控制器對(duì)象606和控制對(duì)象608。如圖6所示,內(nèi)容密鑰對(duì)象602包括加密的密鑰數(shù)據(jù)610(例如,為解密所加密的內(nèi)容項(xiàng)612所需要的密鑰的加密版本)和關(guān)于用于加密所述密鑰數(shù)據(jù)的密碼系統(tǒng)的信息。保護(hù)器對(duì)象604把內(nèi)容密鑰對(duì)象602綁定到一個(gè)或多個(gè)內(nèi)容對(duì)象614。如圖6所示,控制對(duì)象608包括并保護(hù)用于指定怎樣管理支配內(nèi)容對(duì)象614的控制程序616。在優(yōu)選實(shí)施例中,控制程序616是在由DRM引擎所操作的虛擬機(jī)上運(yùn)行的可執(zhí)行字節(jié)代碼??刂瞥绦蛲ㄟ^檢查是否滿足在所述控制程序中所指定的條件來管理支配是否可以對(duì)所述內(nèi)容執(zhí)行某些動(dòng)作,所述條件諸如某些節(jié)點(diǎn)是否可使用有效鏈路對(duì)象到達(dá),某些狀態(tài)對(duì)象是否已經(jīng)被存儲(chǔ),主機(jī)環(huán)境是否具有某些特征等。再次參照?qǐng)D6,控制器對(duì)象606用來把一個(gè)或多個(gè)內(nèi)容密鑰對(duì)象602綁定到控制對(duì)象608。
許可600還可以包括另外的對(duì)象,諸如用于提供所述許可所要求的內(nèi)容訪問條件的機(jī)器或人類可讀描述的元數(shù)據(jù)。作為選擇或另外,可以包括這種元數(shù)據(jù)作為一個(gè)其它對(duì)象(例如,控制對(duì)象608)的資源擴(kuò)展。在圖6所示出的實(shí)施例中,控制對(duì)象608和控制器對(duì)象606都被簽名,使得該系統(tǒng)可以在使用控制信息來進(jìn)行內(nèi)容訪問判定之前來驗(yàn)證所述控制信息是否來自信任源。在一個(gè)實(shí)施例中,還可以通過驗(yàn)證在控制器對(duì)象606中所包括的安全散列來檢查控制對(duì)象608的有效性??刂破鲗?duì)象606還可以包含在它引用的內(nèi)容密鑰對(duì)象602中包含的每個(gè)密鑰或其它密鑰數(shù)據(jù)的散列值,由此使攻擊者篡改在密鑰數(shù)據(jù)和內(nèi)容密鑰對(duì)象之間的綁定變得相對(duì)困難。
如圖6所示,在一個(gè)實(shí)施例中,內(nèi)容612被加密并且包括在內(nèi)容對(duì)象614中。所使用的解密密鑰被包括在內(nèi)容密鑰對(duì)象602內(nèi)(或由其引用),并且在這兩者之間的綁定由保護(hù)器對(duì)象604來表示。如圖6所示,唯一的ID用來使在內(nèi)容對(duì)象614和內(nèi)容密鑰對(duì)象602之間的綁定便于進(jìn)行。用于管理支配使用密鑰610來解密內(nèi)容612的規(guī)則包括在控制對(duì)象608內(nèi),并且在控制對(duì)象608和內(nèi)容密鑰602之間的綁定由控制器對(duì)象606再次使用唯一的ID來表示。
應(yīng)當(dāng)理解,雖然圖6示出了在一個(gè)優(yōu)選實(shí)施例中包括許可的對(duì)象,不過這里所描述的DRM系統(tǒng)和方法不限于此許可結(jié)構(gòu)的使用。例如而并非限制,可以使用許可,其中在圖6中所示出的各個(gè)對(duì)象的功能依照不同的方式可以被組合到少量對(duì)象中,或傳播到另外的對(duì)象上,或者在對(duì)象之間分散。作為選擇或另外,可以利用許可來實(shí)施這里所描述的系統(tǒng)和方法的實(shí)施例,所述許可缺乏由在圖6中所示出的許可結(jié)構(gòu)具有的一些功能,和/或提供另外的功能。從而應(yīng)當(dāng)理解,依照這里所描述的原理可以使用用于使許可與內(nèi)容相關(guān)聯(lián)的任何適當(dāng)機(jī)制,不過在優(yōu)選實(shí)施例中使用在圖6中所示出的有益結(jié)構(gòu)。
1.3.狀態(tài)數(shù)據(jù)庫 在一個(gè)實(shí)施例中,DRM引擎包括或有權(quán)訪問可以用來提供安全狀態(tài)存儲(chǔ)機(jī)制的安全持久的對(duì)象存儲(chǔ)裝置。這種機(jī)構(gòu)對(duì)于使控制程序能夠讀取和寫入從調(diào)用到調(diào)用是持久的狀態(tài)信息來說是有用的。這種狀態(tài)數(shù)據(jù)庫可以用來存儲(chǔ)狀態(tài)對(duì)象以及會(huì)員資格狀態(tài)和/或任何其它適當(dāng)?shù)臄?shù)據(jù),所述狀態(tài)對(duì)象諸如播放計(jì)數(shù)、首次使用日期、累積的再現(xiàn)時(shí)間等。在一些實(shí)施例中,在第一系統(tǒng)上執(zhí)行的DRM引擎可能不具有訪問本地狀態(tài)數(shù)據(jù)庫的權(quán)利,并且可操作來例如使用web網(wǎng)絡(luò)和/或主機(jī)服務(wù)來訪問遠(yuǎn)程狀態(tài)數(shù)據(jù)庫。在一些情況中,在第一系統(tǒng)上執(zhí)行的DRM引擎可能必須訪問在遠(yuǎn)程系統(tǒng)上的數(shù)據(jù)庫中所存儲(chǔ)的狀態(tài)信息。例如,第一系統(tǒng)可能不包括狀態(tài)數(shù)據(jù)庫,或者可能在其自己的狀態(tài)數(shù)據(jù)庫中沒有它所需要的信息。在一些實(shí)施例中,當(dāng)DRM引擎面臨這種情況時(shí),它可以經(jīng)由服務(wù)接口和/或通過使用代理程序來訪問遠(yuǎn)程狀態(tài)數(shù)據(jù)庫,如下面所更詳細(xì)地描述。
1.4.關(guān)于控制程序 這里所描述的系統(tǒng)和方法在各種情境中利用控制程序。例如,在控制對(duì)象中所包含的控制程序可以用來表達(dá)用于管理支配使用受保護(hù)內(nèi)容的規(guī)則和條件。另外,鏈路對(duì)象中的控制程序可以用來表達(dá)用于確定對(duì)于給定目的(例如,節(jié)點(diǎn)可達(dá)性分析)所述鏈路是否有效的規(guī)則和條件。這種控制程序有時(shí)這里被稱作為鏈路約束(link constraints)。其中可以使用控制程序的又一情境是在代理或委托對(duì)象中,其中控制代碼用來代表另一實(shí)體(在代理控制程序的情況下)或代表另一控制(在委托控制程序的情況下)執(zhí)行動(dòng)作。
在一個(gè)實(shí)施例中,和直接由物理處理器執(zhí)行相反,控制程序由為DRM引擎主控的虛擬機(jī)來執(zhí)行或解釋。然而應(yīng)當(dāng)理解,可以容易地構(gòu)造物理處理器或其它硬件邏輯單元來執(zhí)行控制程序。在一個(gè)實(shí)施例中,控制程序采用字節(jié)代碼格式,其使跨平臺(tái)進(jìn)行的相互操作便于進(jìn)行。
在優(yōu)選實(shí)施例中,控制程序用匯編語言編寫并且被匯編程序轉(zhuǎn)換為字節(jié)代碼。在其它實(shí)施例中,模板和/或高級(jí)權(quán)利表達(dá)式語言可以用來提供權(quán)利、規(guī)則和/或條件的初始表達(dá)式,并且可以使用編譯器來把所述高級(jí)表達(dá)式轉(zhuǎn)換為字節(jié)代碼以供這里所描述DRM引擎的實(shí)施例執(zhí)行。例如,用專有DRM格式編寫的權(quán)利表達(dá)式可以利用適當(dāng)?shù)木幾g器被轉(zhuǎn)換或翻譯為在功能上等效的字節(jié)代碼表達(dá)式以供在這里所描述的DRM引擎實(shí)施例上執(zhí)行,從而使受保護(hù)的內(nèi)容能夠依照由內(nèi)容供應(yīng)者所指定的條件在理解所述專有DRM格式的系統(tǒng)上以及在包括諸如這里所描述的DRM引擎的系統(tǒng)上使用。還應(yīng)當(dāng)理解,這里所描述的數(shù)字權(quán)利管理引擎系統(tǒng)和方法不限于使用由虛擬機(jī)所解釋的字節(jié)代碼權(quán)利表達(dá)式。作為替代在一些實(shí)施例中,可以依照任何適當(dāng)?shù)姆绞?例如,使用高級(jí)權(quán)利表達(dá)式語言(rights expression language REL)、模板等)來表示權(quán)利,并且這里所描述的授權(quán)圖和/或其它技術(shù)使用被設(shè)計(jì)成用于識(shí)別并評(píng)估這種權(quán)利表達(dá)式的應(yīng)用程序來執(zhí)行。
1.4.1.條件 如先前所表明,控制程序一般表達(dá)為了對(duì)內(nèi)容的使用請(qǐng)求被準(zhǔn)許、為了鏈路被確認(rèn)為有效等所必須滿足的一個(gè)或多個(gè)條件。取決于內(nèi)容供應(yīng)者或系統(tǒng)設(shè)計(jì)者的要求和/或所述系統(tǒng)所提供的功能,可以使用任何適當(dāng)?shù)臈l件。
在優(yōu)選實(shí)施例中,由DRM引擎所使用的虛擬機(jī)支持任意復(fù)雜的程序,所述程序能夠測(cè)試諸如以下一些或全部的條件 ●基于時(shí)間的條件把客戶端時(shí)間值與在控制程序中所指定的一個(gè)或多個(gè)值相比較。
●以特定節(jié)點(diǎn)為目標(biāo)檢查某個(gè)節(jié)點(diǎn)是否可從另一節(jié)點(diǎn)到達(dá)。此原理提供了對(duì)如域、預(yù)訂、成員資格等這種模型的支持。
●測(cè)試某些節(jié)點(diǎn)屬性是否匹配所指定的值檢查節(jié)點(diǎn)的任何屬性,諸如與節(jié)點(diǎn)相關(guān)聯(lián)的設(shè)備的再現(xiàn)能力是否滿足保真度要求。
●測(cè)試在客戶端與安全相關(guān)的元數(shù)據(jù)是否是最新的例如檢查客戶端是否具有可接受版本的客戶端軟件以及準(zhǔn)確的時(shí)間量度。在一些實(shí)施例中,這種檢查例如可以依賴于來自數(shù)據(jù)證明服務(wù)的一個(gè)或多個(gè)證書中的聲明。
●基于狀態(tài)的條件檢查狀態(tài)數(shù)據(jù)庫中的信息。例如,狀態(tài)數(shù)據(jù)庫可以包含作為控制程序先前執(zhí)行的結(jié)果所產(chǎn)生的信息和/或令牌,及關(guān)于所記錄事件和條件的其它信息,所述令牌用于證明預(yù)訂的所有權(quán)、成員資格等,由此使得可以評(píng)估涉及計(jì)數(shù)器的條件(例如,播放次數(shù)、輸出次數(shù)、所過去的時(shí)間限制等)。
●環(huán)境特性例如,檢查主機(jī)環(huán)境中的硬件和/或軟件是否具有某些特征,諸如識(shí)別并強(qiáng)制義務(wù)的能力;檢查諸如安全輸出信道之類的某些軟件或硬件組件的存在或不存在;檢查鄰近度信息,諸如請(qǐng)求設(shè)備與另一設(shè)備或應(yīng)用的鄰近度;使用網(wǎng)絡(luò)服務(wù)和/或代理來檢查遠(yuǎn)程系統(tǒng)和/或在其上所存儲(chǔ)數(shù)據(jù)的特征;等。
使用這些或任何其它適當(dāng)?shù)臈l件,控制對(duì)象可以表達(dá)用于管理支配可以怎樣再現(xiàn)、轉(zhuǎn)送、輸出等內(nèi)容的規(guī)則。應(yīng)當(dāng)理解,以上條件列表實(shí)際上是說明性的,而且可以通過例如執(zhí)行用于測(cè)試所想要條件的系統(tǒng)調(diào)用來定義并使用任何適當(dāng)?shù)臈l件。例如而并非限制,如果希望要求設(shè)備位于特定的子網(wǎng)絡(luò)上,那么可以定義可操作來返回主機(jī)設(shè)備的IPConfig信息(或遠(yuǎn)程設(shè)備的IPConfig信息,如果使用代理在遠(yuǎn)程設(shè)備上運(yùn)行系統(tǒng)調(diào)用的話)的系統(tǒng)調(diào)用(例如,GetIPConfig),其可以由控制程序用來測(cè)試所述設(shè)備是否位于所規(guī)定的子網(wǎng)絡(luò)上。
1.4.2.代理 這里所描述的DRM引擎相關(guān)的系統(tǒng)和方法的優(yōu)選實(shí)施例提供了對(duì)攜帶控制程序的獨(dú)立對(duì)象的支持。這種“代理”可以被分發(fā)給在遠(yuǎn)程系統(tǒng)上運(yùn)行的DRM引擎以便實(shí)現(xiàn)所指定的功能,諸如寫入到遠(yuǎn)程DRM引擎的安全狀態(tài)存儲(chǔ)中。例如,可以作為聯(lián)系遠(yuǎn)程服務(wù)或執(zhí)行遠(yuǎn)程控制程序的結(jié)果來發(fā)送代理。還可以使用代理來實(shí)現(xiàn)內(nèi)容移動(dòng)操作、初始化計(jì)數(shù)器、撤銷節(jié)點(diǎn)的注冊(cè)等。作為又一例子,可以使用代理來執(zhí)行從遠(yuǎn)程節(jié)點(diǎn)到另一節(jié)點(diǎn)的可達(dá)性分析。這種代理例如在強(qiáng)制實(shí)施用于禁止被注冊(cè)給第一用戶的設(shè)備再被注冊(cè)給第二用戶的策略方面是有用的。如果第二用戶請(qǐng)求注冊(cè),那么代理可以被第二用戶或者代表他或她活動(dòng)的注冊(cè)服務(wù)發(fā)送到該設(shè)備,,以便確定所述設(shè)備是否已經(jīng)被注冊(cè)到第一用戶,在這種情況下第二用戶的注冊(cè)請(qǐng)求可能會(huì)被拒絕。
圖7A和7B圖示了在一個(gè)實(shí)施例中代理的使用。如圖7A所示,假定兩個(gè)實(shí)體——系統(tǒng)A 700和系統(tǒng)B 702——想要彼此經(jīng)由計(jì)算機(jī)網(wǎng)絡(luò)703通信,并且DRM系統(tǒng)正被使用且能夠描述并強(qiáng)制實(shí)施用于某些操作的規(guī)則,諸如訪問受保護(hù)的內(nèi)容或創(chuàng)建可以用來表示成員資格、注冊(cè)狀態(tài)等的DRM對(duì)象。在一些情況下,規(guī)則會(huì)在系統(tǒng)A 700上被評(píng)估,但是規(guī)則要求取決于系統(tǒng)B 702的狀態(tài)的信息。該信息需要被DRM系統(tǒng)704信任,所述DRM系統(tǒng)704在系統(tǒng)A 700上強(qiáng)制實(shí)施所述規(guī)則。
例如,系統(tǒng)A 700上的DRM系統(tǒng)704可以評(píng)估/強(qiáng)制實(shí)施用于執(zhí)行內(nèi)容從系統(tǒng)A 700到系統(tǒng)B 702的遠(yuǎn)程再現(xiàn)的規(guī)則,并且所述規(guī)則可以表明只有當(dāng)系統(tǒng)B 702是確定設(shè)備組的一部分時(shí)才允許這種操作,其中借助可在系統(tǒng)B 702上訪問的安全狀態(tài)數(shù)據(jù)庫716中的狀態(tài)對(duì)象711的存在來聲明該組中的成員資格。
在優(yōu)選實(shí)施例中用來處理這種情況的方法利用代理。例如,如果系統(tǒng)A 700需要來自系統(tǒng)B 702的信息,那么系統(tǒng)A 700準(zhǔn)備代理705,所述代理705在一個(gè)實(shí)施例中是從系統(tǒng)A 700向系統(tǒng)B 702發(fā)送的控制程序(例如,可以由DRM引擎執(zhí)行的指令序列)。在一個(gè)實(shí)施例中,系統(tǒng)A 700經(jīng)由認(rèn)證的通信信道720向系統(tǒng)B 702發(fā)送代理代碼705,使得系統(tǒng)A 700可以確信代理705的確是運(yùn)行在系統(tǒng)B 702上。在一些實(shí)施例中,連同代理代碼705一起,系統(tǒng)A 700還可以向系統(tǒng)B 702傳送可以由代理代碼705用來執(zhí)行其工作的一個(gè)或多個(gè)參數(shù)。
如圖7B所示,系統(tǒng)B 702接收代理705和任何相關(guān)聯(lián)的代理參數(shù),并且運(yùn)行代理代碼705。當(dāng)代理705在系統(tǒng)B 702上運(yùn)行時(shí),它訪問系統(tǒng)B的狀態(tài)數(shù)據(jù)庫716,獲取狀態(tài)信息711和/或用其執(zhí)行一個(gè)或多個(gè)計(jì)算,并且把結(jié)果713發(fā)送回到系統(tǒng)A 700,優(yōu)選經(jīng)由認(rèn)證的通信信道710。在這一點(diǎn)上,系統(tǒng)A 700具有需要用來繼續(xù)進(jìn)行其評(píng)估的信息。
1.4.3.鏈路約束 在一個(gè)實(shí)施例中,用于表示用來管理支配對(duì)內(nèi)容項(xiàng)執(zhí)行某個(gè)操作(諸如“播放”)的規(guī)則的例程集被稱作“動(dòng)作控制”。用于表示關(guān)于鏈路對(duì)象的有效性約束的例程集被稱作“鏈路約束”。像動(dòng)作控制一樣,在優(yōu)選實(shí)施例中,鏈路約束可以表達(dá)任何適當(dāng)?shù)臈l件組合。還像動(dòng)作控制一樣,鏈路約束可以被本地評(píng)估和/或使用服務(wù)接口或代理來遠(yuǎn)程評(píng)估。
1.4.4.義務(wù)和回調(diào) 在一個(gè)實(shí)施例中,某些動(dòng)作當(dāng)被準(zhǔn)許時(shí)要求來自主機(jī)應(yīng)用的進(jìn)一步參與。義務(wù)表示當(dāng)使用主機(jī)應(yīng)用請(qǐng)求的內(nèi)容密鑰時(shí)或在此之后需要由所述主機(jī)應(yīng)用執(zhí)行的操作?;卣{(diào)表示對(duì)一個(gè)或多個(gè)控制程序例程的調(diào)用,所述控制程序例程當(dāng)使用主機(jī)應(yīng)用請(qǐng)求的內(nèi)容密鑰時(shí)或在此之后需要被主機(jī)應(yīng)用執(zhí)行。義務(wù)的例子包括但不限于當(dāng)內(nèi)容正被再現(xiàn)時(shí)關(guān)閉某些輸出和/或控制的要求(例如,以便防止把所述內(nèi)容寫入到不受保護(hù)的輸出或防止快速轉(zhuǎn)發(fā)通過某些重要的內(nèi)容段);關(guān)于內(nèi)容使用的信息被記錄(例如,計(jì)量或?qū)徲?jì)信息)和/或被發(fā)送到遠(yuǎn)程站點(diǎn)(例如,交換所,服務(wù)供應(yīng)商等)的要求;本地或遠(yuǎn)程執(zhí)行代理程序的要求;等。回調(diào)的例子包括但不限于在某個(gè)絕對(duì)時(shí)間主機(jī)向回調(diào)用控制程序的要求,在某個(gè)消逝的時(shí)間(例如,使用內(nèi)容所消逝的時(shí)間)之后,在發(fā)生某個(gè)事件(例如,完成試用內(nèi)容再現(xiàn)時(shí)段)之后,當(dāng)已經(jīng)停止使用內(nèi)容時(shí)等。例如,在某個(gè)過去時(shí)間之后的回調(diào)可以用來增加或減少預(yù)算、播放計(jì)數(shù)等(例如,只是在用戶使用一段內(nèi)容至少達(dá)一定量時(shí)間才把用戶預(yù)算記入帳),從而保護(hù)用戶免得在他或她偶然按壓播放按鈕但是立即按下停止時(shí)就從他或她的帳戶中記帳。
在一個(gè)實(shí)施例中,存在不同類型的義務(wù)和回調(diào),并且如果應(yīng)用遇到它不支持或者不理解的任何關(guān)鍵的義務(wù)或回調(diào)(例如因?yàn)樗隽x務(wù)類型可能在執(zhí)行應(yīng)用之后才定義),那么就需要所述應(yīng)用拒絕繼續(xù)要為其返回此義務(wù)或回調(diào)參數(shù)的動(dòng)作。
1.4.5.例子 圖8-12示出了DRM引擎的說明性實(shí)施例可以怎樣控制使用內(nèi)容的例子。參照?qǐng)D8,假定DRM引擎已經(jīng)接收用于播放內(nèi)容項(xiàng)802、804的組800的請(qǐng)求。例如,內(nèi)容項(xiàng)802、804可以包括從預(yù)訂服務(wù)、電子郵件附件等中獲得的不同的內(nèi)容段、多媒體展示的不同子部分和曲集的不同曲目。所述請(qǐng)求可以由DRM引擎從主機(jī)應(yīng)用接收,所述主機(jī)應(yīng)用隨后接收來自計(jì)算設(shè)備的用戶的請(qǐng)求,所述主機(jī)應(yīng)用運(yùn)行在所述計(jì)算設(shè)備上。來自主機(jī)應(yīng)用的請(qǐng)求一般標(biāo)識(shí)所請(qǐng)求的動(dòng)作、要對(duì)其采取動(dòng)作的一個(gè)或多個(gè)內(nèi)容以及管理支配所述內(nèi)容的許可。DRM引擎按照在圖5中所圖示的過程來確定是否應(yīng)當(dāng)準(zhǔn)許請(qǐng)求。
圖8和9提供了在圖5中所示出的過程的更詳細(xì)的非限制性例子。參照?qǐng)D9,當(dāng)接收對(duì)訪問內(nèi)容項(xiàng)802和804的請(qǐng)求時(shí)(塊900),DRM引擎檢查在所述請(qǐng)求中所標(biāo)識(shí)的或其擁有的許可來看看是否存在有效許可。例如,DRM引擎可以首先標(biāo)識(shí)保護(hù)器對(duì)象806和808,其包含內(nèi)容項(xiàng)802和804的唯一標(biāo)識(shí)符(即分別為NS007和NS008)(圖9中的塊902)。接下來,DRM引擎定位在保護(hù)器對(duì)象806和808中所標(biāo)識(shí)的內(nèi)容密鑰對(duì)象810和812(圖9中的塊904),所述保護(hù)器對(duì)象806和808隨后使所述DRM引擎能夠標(biāo)識(shí)引用內(nèi)容密鑰對(duì)象810和812的控制器814(圖9中的塊906)。在優(yōu)選實(shí)施例中,控制器814被簽名,并且DRM引擎驗(yàn)證其簽名(或請(qǐng)求主機(jī)服務(wù)來驗(yàn)證它)。DRM引擎使用控制器814來標(biāo)識(shí)用于管理支配對(duì)內(nèi)容密鑰對(duì)象810和812(從而內(nèi)容項(xiàng)802和804)的使用的控制對(duì)象816(圖9中的塊908)。在優(yōu)選實(shí)施例中,DRM引擎驗(yàn)證控制對(duì)象816的完整性(例如,通過計(jì)算控制對(duì)象816的摘要(digest)并且把它與在控制器814中所包含的摘要相比較)。如果完整性驗(yàn)證取得成功,那么DRM引擎執(zhí)行在控制對(duì)象816中所包含的控制代碼(塊910),并且把結(jié)果返回到主機(jī)應(yīng)用(塊912),所述主機(jī)應(yīng)用使用它來準(zhǔn)許或拒絕用戶對(duì)訪問內(nèi)容的請(qǐng)求??刂拼a的結(jié)果還可以選擇性地指定主機(jī)應(yīng)用將需要滿足的一個(gè)或多個(gè)義務(wù)或回調(diào)。
圖10是DRM引擎可以怎樣執(zhí)行在圖9的塊910和912中所指定的動(dòng)作的更詳細(xì)例子(即,執(zhí)行控制程序并且返回結(jié)果)。如圖10所示,當(dāng)標(biāo)識(shí)相關(guān)的控制對(duì)象時(shí),DRM引擎把在控制對(duì)象中所包含的字節(jié)代碼加載到優(yōu)選由所述DRM引擎主控的虛擬機(jī)中(塊1000)。DRM引擎和/或虛擬機(jī)典型情況下還初始化虛擬機(jī)的運(yùn)行時(shí)環(huán)境(塊1002)。例如,虛擬機(jī)可以分配為執(zhí)行控制程序所需要的存儲(chǔ)器、初始化寄存器及其它環(huán)境變量,和/或(例如,如下所述通過進(jìn)行System.Host.GetObject調(diào)用)獲得關(guān)于虛擬機(jī)操作的主機(jī)環(huán)境的信息。應(yīng)當(dāng)理解,在一些實(shí)施例中,塊1000和1002可以被有效地組合或交織,和/或次序顛倒。如圖10所示,虛擬機(jī)接下來執(zhí)行控制程序的字節(jié)代碼(塊1004)。這里如其它地方所描述,這可以涉及調(diào)用其它虛擬機(jī)代碼、從安全存儲(chǔ)裝置獲取狀態(tài)信息等。當(dāng)控制程序已經(jīng)完成執(zhí)行時(shí),它提供輸出(例如在優(yōu)選實(shí)施例中為ExtendedStatusBlock),其例如可以由調(diào)用應(yīng)用用來確定請(qǐng)求是否已經(jīng)被準(zhǔn)許,并且如果是的話,確定任何義務(wù)或回調(diào)是否與其相關(guān)聯(lián);請(qǐng)求是否已經(jīng)被拒絕,并且如果是的話,確定拒絕的原因;或者確定在執(zhí)行期間是否出現(xiàn)任何錯(cuò)誤(塊1006)。
如先前所表明,在控制對(duì)象816中所包含的控制代碼指定為了對(duì)內(nèi)容項(xiàng)802和804進(jìn)行所請(qǐng)求的使用而必須滿足的條件或其它要求。這里所描述的系統(tǒng)和方法能夠說明任意復(fù)雜的條件組;然而為了此例子目的,假定控制程序被設(shè)計(jì)成要求為了播放內(nèi)容項(xiàng)802和804,(a)給定用戶的節(jié)點(diǎn)必須可從對(duì)其作出播放內(nèi)容請(qǐng)求的設(shè)備到達(dá),和(b)當(dāng)前日期必須在所規(guī)定日期之后。
圖11示出了在設(shè)備1102上運(yùn)行的DRM引擎1100的說明性實(shí)施例可以怎樣執(zhí)行上述示例性控制程序,并且圖12是在執(zhí)行過程中所涉及的步驟的流程圖。如圖11所示,DRM引擎1100(例如,通過調(diào)用System.Host.SpawnVm)創(chuàng)建虛擬機(jī)執(zhí)行環(huán)境1104并且加載控制程序。虛擬機(jī)1104在由DRM引擎1100所指定的入口點(diǎn)(例如,在Control.Actions.Play.perform例程的位置)開始執(zhí)行控制程序。在此例子中,控制程序需要確定給定節(jié)點(diǎn)是否可從其上運(yùn)行DRM引擎1100的設(shè)備1102的個(gè)性(personality)節(jié)點(diǎn)到達(dá)。為了進(jìn)行此確定,控制程序向DRM引擎1100所提供的鏈路管理器服務(wù)1106作出調(diào)用1105,指定要求鏈接到的節(jié)點(diǎn)(圖12中的塊1200)。鏈路管理器1106負(fù)責(zé)評(píng)估鏈路對(duì)象來確定一個(gè)節(jié)點(diǎn)是否可從另一節(jié)點(diǎn)到達(dá)。為了有效地完成這點(diǎn),鏈路管理器1106可以預(yù)先計(jì)算從設(shè)備1102的個(gè)性節(jié)點(diǎn)1110到在該設(shè)備1102所擁有的任何鏈路對(duì)象中所指定的各個(gè)節(jié)點(diǎn)1114是否存在路徑。即,鏈路管理器1106可以通過檢查它有權(quán)訪問的鏈路的“去往”和“來自”字段來簡(jiǎn)單地確定哪些節(jié)點(diǎn)潛在地可從設(shè)備1102的個(gè)性節(jié)點(diǎn)1110到達(dá)。當(dāng)鏈路管理器1106接收來自虛擬機(jī)1104的調(diào)用1105時(shí),它通過首先確定從個(gè)性節(jié)點(diǎn)1110到所指定的節(jié)點(diǎn)1112是否存在路徑(例如,通過檢查在它先前確定在理論上可到達(dá)的節(jié)點(diǎn)的列表中的節(jié)點(diǎn)ID)來確定所指定的節(jié)點(diǎn)1112是否是可到達(dá)的(圖12中的塊1202)。如果存在路徑,那么鏈路管理器1106評(píng)估在鏈路中所包含的任何控制程序來看看所述鏈路是否有效(圖12中的塊1204-1210)。為了評(píng)估鏈路對(duì)象中的控制程序(圖12中的塊1206),鏈路管理器1106可以使用其自己的虛擬機(jī)1108,所述鏈路管理器1106在其上執(zhí)行在所述鏈路對(duì)象中所包括的控制程序。鏈路管理器1106將其確定結(jié)果(即,給定節(jié)點(diǎn)是否是可到達(dá)的)返回到在虛擬機(jī)1104中執(zhí)行的控制程序,其中它被用于全面評(píng)估播放內(nèi)容的請(qǐng)求是否將被準(zhǔn)許。當(dāng)確定所指定的節(jié)點(diǎn)1112可從設(shè)備1102的個(gè)性節(jié)點(diǎn)1110到達(dá)時(shí),在虛擬機(jī)1104上執(zhí)行的控制程序接下來確定是否滿足所指定的日期限制(圖12中的塊1212)。如果已經(jīng)滿足日期限制(即,從塊1212以“是”退出),那么控制程序返回用于表明已經(jīng)滿足所指定條件的結(jié)果(圖12中的塊1214);否則,控制程序返回用于表明不滿足所指定條件的結(jié)果(圖12中的塊1216)。
下面示出了諸如上述控制程序的例子 ;樣本控制 ; ;此控制檢查用戶節(jié)點(diǎn)是否是可到達(dá)的 ;以及日期是否在特定開始日期之后 ;以及在特定結(jié)束日期之前 ;從控制中的屬性獲取值 ;========================= ;常量 ;========================= .equ DEBUG_PRINT_SYSCALL, 1 .equ FIND_SYSCALL_BY_NAME, 2 .equ SYSTEM_HOST_GET_OBJECT_SYSCALL, 3 .equ SUCCESS, 0 .equ FAILURE, -1 ;========================= ;數(shù)據(jù) ;========================= .data ControlTargetNodeIdAttributePath: .string"Octopus/Control/Attributes/TargetNodeId" ControlStartDateAttributePath: .string"Octopus/Control/Attributes/StartDate" ControlEndDateAttributePath: .string"Octopus/Control/Attributes/EndDate" TargetNodeId: .zeros 256 StartDate:.long 0 EndDate: .long-1 IsNodeR eachableFunctionName: .string"Octopus.Links.IsNodeReachable" IsNodeReachableFunctionNumber: .long 0 GetTimeStampFunctionName: .string"System.Host.GetLocalTime" GetTimeStampFunctionNumber: .long 0 ;========================= ;代碼 ;========================= .code Global.OnLoad: ;加載全局函數(shù) ;獲取用于Octopus.Links.IsNodeReachable的syscall數(shù)目 PUSH@IsNodeReachableFunctionName PUSH FIND_SYSCALL_BY_NAME CALL DUP PUSH@IsNodeReachableFunctionNumber POKE BRN OnLoad_Fail ;獲取用于System.Host.GetTimeStamp的syscall數(shù)目 PUSH@GetTime StampFunctionName PUSH FIND_SYSCALL_BY_NAME CALL DUP PUSH@GetTimeStampFunctionNumber POKE BRNOnLoad_Fail ;好 PUSH 0 RET OnLoad_Fail: PUSH FAILURE RET Control.Actions.Play.Init: ;從屬性中獲取值 ;獲取目標(biāo)節(jié)點(diǎn)(保證在那) PUSH 256;返回緩沖區(qū)大小(256個(gè)字節(jié)) PUSH@TargetNodeId;返回值 PUSH@ControlTargetNodeIdAttributePath;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;獲取開始日期 PUSH 4;返回緩沖區(qū)大小(4個(gè)字節(jié)) PUSH@StartDate;返回值 PUSH@ControlStartDateAttributePath;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;獲取結(jié)束日期 PUSH 4;返回緩沖區(qū)大小(4個(gè)字節(jié)) PUSH@EndDate;返回值 PUSH@ControlEndDateAttributePath;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;成功 PUSH 0 PUSH SUCCESS STOP Control.Actions.Play.Perform: Control.Actions.Play.Check: ;檢查目標(biāo)節(jié)點(diǎn)是否是可到達(dá)的 PUSH@TargetNodeId PUSH@IsNodeReachableFunctionNumber PEEK CALL BRN Play_Fail ;把當(dāng)前時(shí)間放入堆棧 PUSH@GetTimeStampFunctionNumber PEEK CALL ;檢查日期是否在結(jié)束日期之前 DUP;當(dāng)前時(shí)間 PUSH@EndDate PEEK SWAP CMP BRN Play_Fail ;檢查日期是否在所述開始日期之后;當(dāng)前時(shí)間處于堆棧上PUSH@StartDatePEEKCMPBRN Play_Fail;成功PUSH 0PUSH SUCCESSSTOP Play_Fail:PUSH 0PUSH FAILURESTOP .export Global.OnLoad .export Control.Actions.Play.Init .export Control.Actions.Play.Check .export Control.Actions.Play.Perform 在附錄E中包括了控制程序的附加例子。
3.內(nèi)容消費(fèi)和封裝應(yīng)用 以下是消費(fèi)DRM保護(hù)的內(nèi)容的應(yīng)用(例如,媒體播放器、文字處理器、電子郵件客戶端等,諸如圖3中的應(yīng)用303a、303c和303d)以及諸如應(yīng)用303b之類的封裝應(yīng)用的更詳細(xì)的說明性實(shí)施例,所述封裝應(yīng)用用于封裝其目標(biāo)為消費(fèi)應(yīng)用的內(nèi)容。
1.5.內(nèi)容消費(fèi)應(yīng)用體系結(jié)構(gòu) 內(nèi)容消費(fèi)應(yīng)用典型情況下集中于訪問受保護(hù)的內(nèi)容,或者可以是通用應(yīng)用的一部分,所述通用應(yīng)用還執(zhí)行諸如封裝內(nèi)容之類的其它功能。在各個(gè)實(shí)施例中,內(nèi)容消費(fèi)應(yīng)用可以執(zhí)行以下一些或全部 ●提供用戶可以用來請(qǐng)求訪問受保護(hù)的內(nèi)容對(duì)象并且接收關(guān)于所述內(nèi)容的信息或錯(cuò)誤信息的接口; ●管理與文件系統(tǒng)的交互; ●識(shí)別受保護(hù)內(nèi)容對(duì)象的格式; ●請(qǐng)求DRM引擎評(píng)估對(duì)內(nèi)容的許可以查看訪問所述內(nèi)容的權(quán)限是否可以準(zhǔn)許; ●驗(yàn)證數(shù)字簽名并且處理DRM引擎需要執(zhí)行的其它通用密碼功能; ●請(qǐng)求DRM引擎提供為解密受保護(hù)內(nèi)容所需要的密鑰;和/或 ●解密受保護(hù)內(nèi)容并且與媒體再現(xiàn)服務(wù)相交互以便再現(xiàn)所述內(nèi)容。
在一個(gè)實(shí)施例中,DRM客戶端引擎評(píng)估與內(nèi)容相關(guān)聯(lián)的許可,確認(rèn)或拒絕用于使用內(nèi)容的權(quán)限,并且向內(nèi)容消費(fèi)應(yīng)用提供解密密鑰。DRM客戶端引擎還可以向內(nèi)容消費(fèi)應(yīng)用發(fā)布一個(gè)或多個(gè)義務(wù)和/或回調(diào),要求該應(yīng)用執(zhí)行某些動(dòng)作,原因在于已經(jīng)被給與了訪問內(nèi)容的權(quán)利。
圖13示出了在一個(gè)實(shí)施例中構(gòu)成內(nèi)容消費(fèi)客戶端應(yīng)用1300的元項(xiàng)。如圖13所示,主機(jī)應(yīng)用1302是客戶端的邏輯中心點(diǎn)。它負(fù)責(zé)驅(qū)動(dòng)在其它模塊之間的交互模式以及通過用戶接口1304與用戶的交互。主機(jī)應(yīng)用1302經(jīng)由主機(jī)服務(wù)接口1308向DRM引擎1306提供一組服務(wù)。主機(jī)服務(wù)接口1308允許DRM引擎1306訪問由主機(jī)應(yīng)用1302所管理的數(shù)據(jù),以及由所述主機(jī)應(yīng)用1302執(zhí)行的某些庫函數(shù)。在一個(gè)實(shí)施例中,主機(jī)服務(wù)接口1308是DRM引擎1306唯一的出站接口。
在一個(gè)實(shí)施例中,DRM引擎1306并不與由主機(jī)應(yīng)用1302所管理的多媒體內(nèi)容直接交互。主機(jī)應(yīng)用1302在邏輯上與用于訪問多媒體內(nèi)容的內(nèi)容服務(wù)1310相交互,并且只向DRM引擎1306傳遞必須由其處理的數(shù)據(jù)部分。由媒體再現(xiàn)引擎1312來執(zhí)行與內(nèi)容的其它交互。例如,在一個(gè)實(shí)施例中,內(nèi)容服務(wù)1310負(fù)責(zé)從媒體服務(wù)器獲取內(nèi)容,存儲(chǔ)并管理客戶端的持久性存儲(chǔ)裝置上的內(nèi)容,而媒體再現(xiàn)引擎1312是負(fù)責(zé)訪問多媒體內(nèi)容并且(例如在視頻和/或音頻輸出上)再現(xiàn)它的子系統(tǒng)。在一個(gè)實(shí)施例中,媒體再現(xiàn)引擎1312從DRM引擎1306接收一些信息(諸如內(nèi)容解密密鑰),但是在一個(gè)實(shí)施例中,所述DRM引擎1306并不直接與媒體再現(xiàn)引擎1312相交互,而是通過主機(jī)應(yīng)用1302與之交互。
DRM引擎1306所需要的一些信息可在多媒體內(nèi)容帶內(nèi)獲得,并且可以通過內(nèi)容服務(wù)1310來獲取和管理,但是該信息的一些可能需要經(jīng)由諸如個(gè)性化服務(wù)或成員資格服務(wù)之類的其它服務(wù)手段(未示出)來獲得。
在圖13所示出的實(shí)施例中,由密碼服務(wù)塊1314來處理密碼運(yùn)算(例如,加密,簽名驗(yàn)證等)。在一個(gè)實(shí)施例中,DRM引擎1306并不與密碼服務(wù)塊1314直接相交互,而是作為替代經(jīng)由主機(jī)1302(使用主機(jī)服務(wù)接口1308)間接地交互,主機(jī)1302轉(zhuǎn)發(fā)它的請(qǐng)求。密碼服務(wù)1314還可以例如由媒體再現(xiàn)引擎1312用來執(zhí)行內(nèi)容解密。
應(yīng)當(dāng)理解,提供了圖13是為了說明而已,并且在其它實(shí)施例中在圖13中所示出的各個(gè)組件可以被重新排列、合并、分離、消除,和/或可以增加新的組件。例如但不限于,在圖13中的DRM引擎和主機(jī)應(yīng)用之間的邏輯功能劃分只是說明一種可能實(shí)施例,并且在實(shí)際的實(shí)現(xiàn)方式中可以作出變化。例如,可以把DRM引擎與主機(jī)應(yīng)用整個(gè)地或部分地集成。從而應(yīng)當(dāng)理解,可以在主機(jī)應(yīng)用和DRM引擎之間使用任何適當(dāng)?shù)墓δ軇澐帧?br>
1.6.封裝器體系結(jié)構(gòu) 下面提供了封裝引擎可以為用于封裝電子內(nèi)容的主機(jī)應(yīng)用所執(zhí)行的功能的例子。在實(shí)踐中,封裝應(yīng)用可以特別地集中于封裝,或者可以是在用戶系統(tǒng)操作的通用應(yīng)用的一部分,所述用戶系統(tǒng)也訪問受保護(hù)的內(nèi)容(在本地或者例如在網(wǎng)絡(luò)上的其它地方封裝的)。
在各個(gè)實(shí)施例中,封裝主機(jī)應(yīng)用可以執(zhí)行以下一些或全部 ●提供可以通過其指定內(nèi)容和許可信息的用戶接口; ●加密內(nèi)容; ●創(chuàng)建構(gòu)成許可的DRM對(duì)象;和/或 ●創(chuàng)建內(nèi)容對(duì)象,所述內(nèi)容對(duì)象包含或引用所述內(nèi)容并且包含或引用許可 圖14示出了在一個(gè)實(shí)施例中構(gòu)成內(nèi)容封裝應(yīng)用1400的元項(xiàng)。DRM封裝引擎1416負(fù)責(zé)封裝諸如這里所描述的那些許可(例如,包括諸如控制、控制器、保護(hù)器等DRM對(duì)象的許可)。在一些實(shí)施例中,DRM封裝引擎1416還可以使元數(shù)據(jù)與許可相關(guān)聯(lián)以便依照人類可讀形式來解釋所述許可作什么。
在一個(gè)實(shí)施例中,主機(jī)應(yīng)用1402提供了用戶接口1404并且負(fù)責(zé)獲得諸如內(nèi)容引用和用戶(典型情況下為內(nèi)容所有者或供應(yīng)者)所想要執(zhí)行的動(dòng)作(例如,把內(nèi)容綁定給誰,在許可中包括什么內(nèi)容使用條件等)之類的信息。用戶接口1404還可以顯示關(guān)于封裝過程的信息,諸如所發(fā)出的許可的文本,以及如果發(fā)生失敗,那么所述失敗的原因。在一些實(shí)施例中,主機(jī)應(yīng)用1402所需要的一些信息可以通過服務(wù)訪問點(diǎn)(Service Access Point SAP)要求使用其它服務(wù),諸如認(rèn)證或授權(quán)服務(wù)和/或成員資格。從而在一些實(shí)施例中,封裝應(yīng)用1400和/或主機(jī)應(yīng)用1402可能需要執(zhí)行以下一些或全部 ●媒體格式服務(wù)1406在一個(gè)實(shí)施例中,此元項(xiàng)負(fù)責(zé)管理諸如代碼轉(zhuǎn)換和封裝之類的媒體格式操作。它還負(fù)責(zé)內(nèi)容加密,內(nèi)容加密經(jīng)由內(nèi)容加密服務(wù)模塊1408來實(shí)現(xiàn)。
●通用密碼服務(wù)1410在一個(gè)實(shí)施例中,此元項(xiàng)負(fù)責(zé)發(fā)出/驗(yàn)證簽名以及加密/解密一些數(shù)據(jù)。對(duì)這種操作的請(qǐng)求可以由服務(wù)訪問點(diǎn)1414或DRM封裝引擎1416經(jīng)由主機(jī)服務(wù)接口1412來發(fā)出。
●內(nèi)容加密服務(wù)1408在一個(gè)實(shí)施例中,此模塊在邏輯上與通用密碼服務(wù)1410相分離,這是因?yàn)樗⒉恢浪鰬?yīng)用。它由媒體格式服務(wù)在內(nèi)容封裝時(shí)利用由DRM封裝引擎1416先前發(fā)出的一組密鑰來驅(qū)動(dòng)。
4.密鑰推導(dǎo) 下面描述了密鑰推導(dǎo)系統(tǒng),所述密鑰推導(dǎo)系統(tǒng)自然地配有這里所描述的DRM引擎和系統(tǒng)體系結(jié)構(gòu)的優(yōu)選實(shí)施例,和/或可以在其它情境中使用。在下面部分中的一些例子取自被稱為“Scuba(水肺)”的密鑰推導(dǎo)系統(tǒng)的優(yōu)選實(shí)施例的參考實(shí)現(xiàn)方式。在‘551申請(qǐng)中描述了另外的實(shí)施例。
如圖15所示,在一些實(shí)施例中,鏈路對(duì)象1530a、1530b除了它們?cè)诠?jié)點(diǎn)1500a、1500b、1500c之間建立關(guān)系的主要目的之外還用來分發(fā)密鑰。如上所述,控制對(duì)象可以包含控制程序,所述控制程序可以用來判定用于執(zhí)行動(dòng)作的請(qǐng)求是否應(yīng)當(dāng)被準(zhǔn)許。為了完成這點(diǎn),控制程序可以檢查特定節(jié)點(diǎn)是否可經(jīng)由一鏈路鏈到達(dá)。這里所描述的密鑰推導(dǎo)技術(shù)利用此鏈路鏈的存在來使密鑰分發(fā)便于進(jìn)行,以致可以使所述密鑰可用于正在執(zhí)行控制程序的DRM引擎。
在一個(gè)說明性實(shí)施例中,在使用可選密鑰分發(fā)系統(tǒng)的給定部署中的每個(gè)節(jié)點(diǎn)對(duì)象1500a、1500b、1500c具有用于加密內(nèi)容密鑰及其它節(jié)點(diǎn)密鑰的一組密鑰。被創(chuàng)建來用于相同部署中的鏈路對(duì)象1530a、1530b包含一些密碼數(shù)據(jù)作為有效載荷,所述密碼數(shù)據(jù)使得當(dāng)DRM引擎處理鏈路鏈時(shí)能夠?qū)С雒荑€信息。
節(jié)點(diǎn)和鏈路依照這種方式攜帶密鑰,假定從節(jié)點(diǎn)A 1500a到節(jié)點(diǎn)C1500c的鏈路鏈1530a、1530b,有權(quán)訪問節(jié)點(diǎn)A 1515a、1525a的秘密共享密鑰的實(shí)體(例如,客戶端主機(jī)應(yīng)用的DRM引擎)也有權(quán)訪問節(jié)點(diǎn)C 1515c、1525c的秘密共享密鑰。有權(quán)訪問節(jié)點(diǎn)C的秘密共享密鑰允許該實(shí)體訪問利用那些密鑰加密的任何內(nèi)容密鑰。
1.7.節(jié)點(diǎn)、實(shí)體和密鑰 1.7.1.實(shí)體 在DRM系統(tǒng)的一個(gè)實(shí)施例中,節(jié)點(diǎn)是數(shù)據(jù)對(duì)象,而不是系統(tǒng)中的活動(dòng)參與者。在此情境下,活動(dòng)參與者被稱作實(shí)體。實(shí)體的例子是媒體播放器、設(shè)備、預(yù)訂服務(wù)、內(nèi)容封裝器等。實(shí)體一般使得節(jié)點(diǎn)與它們相關(guān)聯(lián)。消費(fèi)內(nèi)容的實(shí)體使用DRM引擎并且管理構(gòu)成其個(gè)性(personality)的至少一個(gè)節(jié)點(diǎn)對(duì)象。在一個(gè)實(shí)施例中,實(shí)體被假定有權(quán)訪問它所管理的節(jié)點(diǎn)對(duì)象的所有數(shù)據(jù),包括那些對(duì)象的所有私有信息。
1.7.2.節(jié)點(diǎn) 參與密鑰推導(dǎo)系統(tǒng)的說明性實(shí)施例中的節(jié)點(diǎn)對(duì)象包含密鑰,作為它們數(shù)據(jù)的一部分。在一個(gè)實(shí)施例中,節(jié)點(diǎn)可以包含兩種一般類型的密鑰共享密鑰和機(jī)密密鑰。以下部分列出了可以在各個(gè)實(shí)施例中使用的不同密鑰類型。然而應(yīng)當(dāng)理解,具體部署可以只使用這些密鑰的一個(gè)子集。例如,系統(tǒng)可以被配置為只利用密鑰對(duì)工作,省略使用秘密對(duì)稱密鑰?;蛘撸到y(tǒng)如果它只需要使用共享密鑰的話可以在不向節(jié)點(diǎn)提供機(jī)密密鑰的情況下來加以部署。
1.7.2.1.共享密鑰 共享密鑰是公鑰/私鑰對(duì)和/或由節(jié)點(diǎn)N和所有節(jié)點(diǎn)Px共享的對(duì)稱密鑰,為此從Px到N存在包含密鑰推導(dǎo)擴(kuò)展的鏈路。
共享公鑰Kpub-share[N]。這是公鑰密碼的公鑰/私鑰對(duì)的公共部分。此密鑰一般與證書一起供給,使得其憑證可以由想要把機(jī)密信息用密碼綁定到它的實(shí)體來驗(yàn)證。
共享私鑰Kpriv-share[N]。這是公鑰/私鑰對(duì)的私有部分。管理節(jié)點(diǎn)的實(shí)體負(fù)責(zé)確保此私鑰是保密的。由于這個(gè)原因,此私鑰通常被獨(dú)立于其余的節(jié)點(diǎn)信息來存儲(chǔ)或傳輸。此私鑰可以通過鏈路的密鑰推導(dǎo)擴(kuò)展與下游(downstream)的其它節(jié)點(diǎn)共享。
共享對(duì)稱密鑰Ks-share[N]。這是以對(duì)稱密碼方式使用的密鑰。就像私鑰一樣,此密鑰是機(jī)密的,并且管理節(jié)點(diǎn)的實(shí)體負(fù)責(zé)保持它是秘密的。此秘密密鑰可以通過鏈路的密鑰推導(dǎo)擴(kuò)展與其它節(jié)點(diǎn)下游地共享。
1.7.2.2.機(jī)密密鑰 機(jī)密密鑰是密鑰對(duì)和/或?qū)ΨQ密鑰,只為管理它們所屬節(jié)點(diǎn)的實(shí)體所知。在上述這些密鑰和共享密鑰之間的差異在于它們并不通過鏈路中的密鑰推導(dǎo)擴(kuò)展而與其它節(jié)點(diǎn)共享。
機(jī)密公鑰Kpub-conf[N]。這是公鑰密碼的公鑰/私鑰對(duì)的公共部分。此密鑰一般與證書一起供給,使得其憑證可以由想要把機(jī)密信息用密碼綁定到它的實(shí)體來驗(yàn)證。
機(jī)密私鑰Kpriv-conf[N]。這是公鑰/私鑰對(duì)的私有部分。管理節(jié)點(diǎn)的實(shí)體負(fù)責(zé)確保此私鑰是保密的。由于這個(gè)原因,此私鑰通常被獨(dú)立于其余的節(jié)點(diǎn)信息來存儲(chǔ)或傳輸。
機(jī)密對(duì)稱密鑰Ks-conf[N]。這是以對(duì)稱密碼方式使用的密鑰。就像機(jī)密私鑰一樣,此密鑰是被保密的。
1.8.密碼元項(xiàng) 這里所描述的密鑰推導(dǎo)和分發(fā)系統(tǒng)的優(yōu)選實(shí)施例可以使用各種不同的密碼算法來實(shí)現(xiàn),并且不局限于對(duì)密碼算法的任何特定選擇。盡管如此,對(duì)于給定部署或簡(jiǎn)檔來說,所有參與實(shí)體通常需要一致同意一組支持的算法(其中術(shù)語簡(jiǎn)檔通常指的是在特定實(shí)現(xiàn)方式中所使用的一組實(shí)際技術(shù)的規(guī)范(例如,用于密鑰推導(dǎo)的RSA;用于編碼對(duì)象的XML;用于文件格式的MP4等)和/或當(dāng)在實(shí)際的部署中定義對(duì)象時(shí)存在的語義上下文的其它表示)。
在一個(gè)實(shí)施例中,部署包括對(duì)至少一個(gè)公鑰密碼(諸如RSA)和一個(gè)對(duì)稱密鑰密碼(諸如AES)進(jìn)行支持。
當(dāng)涉及密碼功能時(shí)使用以下符號(hào) ■Ep(Kpub[N],M)意指“消息M使用公鑰密碼利用節(jié)點(diǎn)N的公鑰Kpub來加密” ■Dp(Kpriv[N],M)意指“消息M使用公鑰密碼利用節(jié)點(diǎn)N的私鑰Kpriv來解密” ■Es(Ks[N],M)意指“消息M使用對(duì)稱密鑰密碼利用節(jié)點(diǎn)N的對(duì)稱密鑰Ks來加密” ■Ds(Ks[N],M)意指“消息M使用對(duì)稱密鑰密碼利用節(jié)點(diǎn)N的對(duì)稱密鑰Ks來解密” 1.9.內(nèi)容密鑰的目標(biāo) 在優(yōu)選實(shí)施例中,使用兩種類型的密碼目標(biāo)。把內(nèi)容密鑰的目標(biāo)定為目標(biāo)節(jié)點(diǎn)的共享密鑰意味著使該密鑰可用于共享該目標(biāo)節(jié)點(diǎn)的秘密共享密鑰的所有實(shí)體。把內(nèi)容密鑰的目標(biāo)定為節(jié)點(diǎn)的機(jī)密密鑰意味著使該密鑰只可用于管理該節(jié)點(diǎn)的實(shí)體。通過使用以下方法中的一個(gè)或兩個(gè)加密在內(nèi)容密鑰對(duì)象中所攜帶的內(nèi)容密鑰CK來完成內(nèi)容密鑰的定目標(biāo) ●公共綁定創(chuàng)建包含Ep(Kpub[N],CK)的內(nèi)容密鑰對(duì)象 ●對(duì)稱綁定創(chuàng)建包含Es(Ks[N],CK)的內(nèi)容密鑰對(duì)象 在優(yōu)選實(shí)施例中,在可能的情況下使用對(duì)稱綁定,這是因?yàn)樗簧婕拜^小的計(jì)算強(qiáng)度算法,由此使得對(duì)接收實(shí)體來說不那么繁重。然而,創(chuàng)建內(nèi)容密鑰對(duì)象的實(shí)體(典型情況下為內(nèi)容封裝器)可能不總是有權(quán)訪問Ks[N]。如果封裝器沒有Ks[N],那么它可以使用公共綁定,這是由于Kpub[N]并不是機(jī)密信息由此可用于需要進(jìn)行公共綁定的實(shí)體。通常使Kpub[N]可用于需要為附有證書的內(nèi)容密鑰定目標(biāo)的實(shí)體,所述證書可以由所述實(shí)體檢查以便依照某個(gè)商定策略來判定Kpub[N]是否確實(shí)是可以信任其處理內(nèi)容密鑰的節(jié)點(diǎn)的密鑰(例如,所述節(jié)點(diǎn)對(duì)應(yīng)于運(yùn)行DRM引擎和主機(jī)應(yīng)用的實(shí)體,所述DRM引擎和主機(jī)應(yīng)用符合系統(tǒng)的功能、操作和安全策略)。
1.10.使用鏈路的密鑰推導(dǎo) 為了允許實(shí)體有權(quán)訪問可從其個(gè)性節(jié)點(diǎn)到達(dá)的所有節(jié)點(diǎn)的共享密鑰,在一個(gè)實(shí)施例中,鏈路對(duì)象包含可選的密鑰擴(kuò)展有效載荷。此密鑰擴(kuò)展有效載荷允許有權(quán)訪問鏈路來源節(jié)點(diǎn)的私有/秘密密鑰的實(shí)體也有權(quán)訪問鏈路去往節(jié)點(diǎn)的私有/秘密共享密鑰。依照這種方式,實(shí)體可以解密其目標(biāo)為可從其個(gè)性節(jié)點(diǎn)到達(dá)的節(jié)點(diǎn)的任何內(nèi)容密鑰(如果使用目標(biāo)節(jié)點(diǎn)的共享密鑰來定目標(biāo)的話)。
在一個(gè)實(shí)施例中,當(dāng)DRM引擎處理鏈路對(duì)象時(shí),它處理每個(gè)鏈路的密鑰擴(kuò)展有效載荷以便更新它有權(quán)訪問的內(nèi)部密鑰鏈。在一個(gè)實(shí)施例中,從節(jié)點(diǎn)F到節(jié)點(diǎn)T的鏈路L的密鑰擴(kuò)展有效載荷包括 ●公共推導(dǎo)信息Ep(Kpub-share[F],{Ks-share[T],Kpriv-share[T]}或 ●對(duì)稱推導(dǎo)信息Es(Ks-share[F],{Ks-share[T],Kpriv-share[T]} 其中{Ks-share[T]和Kpriv-share[T]}是包含Ks-share[T]和Kpriv-share[T]的數(shù)據(jù)結(jié)構(gòu)。
公共推導(dǎo)信息用來向有權(quán)訪問節(jié)點(diǎn)F的私有共享密鑰Kpriv-share[F]傳達(dá)節(jié)點(diǎn)T的秘密共享密鑰Ks-share[T]和Kpriv-share[T]。
對(duì)稱推導(dǎo)信息用來向有權(quán)訪問節(jié)點(diǎn)F的對(duì)稱共享密鑰Ks-share[F]傳達(dá)節(jié)點(diǎn)T的秘密共享密鑰Ks-share[T]和Kpriv-share[T]。
對(duì)于把內(nèi)容密鑰的目標(biāo)定到節(jié)點(diǎn)來說,在鏈路中包括的優(yōu)選有效載荷為對(duì)稱推導(dǎo)信息。這在鏈路創(chuàng)建者有權(quán)訪問Ks-share[F]時(shí)是可能的。如果不可能的話,那么所述鏈路創(chuàng)建者會(huì)回退到包括公共推導(dǎo)信息來作為鏈路的有效載荷。
假定處理鏈路的DRM引擎已經(jīng)在其內(nèi)部密鑰鏈中具有Ks-share[F]和Kpriv-share[F],那么在處理所述鏈路之后,L[F→T],它還將具有Ks-share[T]和Kpriv-share[T]。
由于在一個(gè)實(shí)施例中可以依照任何次序來處理鏈路,所以在處理給定鏈路L時(shí),DRM引擎可能無法進(jìn)行密鑰推導(dǎo)計(jì)算。這可能是由于以下事實(shí),在那時(shí)DRM引擎的密鑰鏈可能仍不包含該鏈路的“來自”節(jié)點(diǎn)的密鑰。在這種情況下,所述鏈路被記錄,并且當(dāng)新的信息可用于DRM引擎時(shí)—諸如在處理新的鏈路P之后,再次被處理。如果鏈路P的“去往”節(jié)點(diǎn)與鏈路L的“來自”節(jié)點(diǎn)相同,并且鏈路P的“來自”節(jié)點(diǎn)是可到達(dá)節(jié)點(diǎn),那么鏈路L的“來自”節(jié)點(diǎn)也是可到達(dá)的,并且密鑰推導(dǎo)步驟把鏈路L的“來自”節(jié)點(diǎn)的私有共享密鑰添加到該密鑰鏈。
5.實(shí)現(xiàn)方式例子 下面提供了幾個(gè)例子來用于圖示在實(shí)踐中可以怎樣應(yīng)用這里所描述的系統(tǒng)和方法的各個(gè)實(shí)施例。這里所描述的系統(tǒng)和方法可以實(shí)現(xiàn)大范圍的權(quán)利管理及其它功能,從而應(yīng)當(dāng)理解,這里所給出的具體例子并不旨在窮舉,而是說明所發(fā)明工作主體的范圍。
1.11.例子用戶、PC和設(shè)備 假定你想要實(shí)現(xiàn)把播放內(nèi)容的權(quán)利與特定用戶聯(lián)系在一起的DRM系統(tǒng),并且你想要使用戶在他或她所擁有的所有播放設(shè)備上播放內(nèi)容都很容易。假定你決定將向用戶提供用于使他們能夠按照需要來增加播放設(shè)備(例如,移動(dòng)播放器)的軟件。然而,還假定你想要設(shè)置某個(gè)策略來限制用戶可以向其轉(zhuǎn)送內(nèi)容的通用設(shè)備的數(shù)目,使得所述用戶沒有充當(dāng)分發(fā)代理的能力。
根據(jù)這些系統(tǒng)需求,例如把你創(chuàng)建的許可聯(lián)系到用戶并且在用戶和他們所使用的設(shè)備之間建立關(guān)系可能是有意義的。從而在此例子中,你可以首先決定你需要什么類型的節(jié)點(diǎn)來建立你要求的關(guān)系種類。例如,你可以定義以下類型的節(jié)點(diǎn) ●用戶(例如,擁有使用內(nèi)容權(quán)利的個(gè)人) ●PC(例如,在個(gè)人計(jì)算機(jī)上運(yùn)行的軟件應(yīng)用,可以播放內(nèi)容并且指定另外的播放設(shè)備) ●設(shè)備(例如,便攜式內(nèi)容再現(xiàn)設(shè)備) 每個(gè)節(jié)點(diǎn)對(duì)象可以包括類型屬性,用于表明對(duì)象是表示用戶、PC還是設(shè)備。
比如說例如你決定把在特定時(shí)間可以附著到任何一個(gè)用戶的PC節(jié)點(diǎn)對(duì)象的最大數(shù)目限制為四個(gè)(4)。你決定只要你提供對(duì)PC數(shù)目的限制就不必限制被附著到用戶的設(shè)備數(shù)目。據(jù)此,控制程序可以被設(shè)置為如果能夠在用戶節(jié)點(diǎn)和請(qǐng)求訪問的節(jié)點(diǎn)之間建立關(guān)系那么允許訪問。于是該節(jié)點(diǎn)可以是PC或設(shè)備。
圖16示出了被設(shè)計(jì)用來滿足上述要求的系統(tǒng)。服務(wù)器1600向每個(gè)新用戶1604a、1604b分配用戶節(jié)點(diǎn)對(duì)象1602a、1602b,并且管理用戶1604a、1604b為了訪問受保護(hù)內(nèi)容的目的而把設(shè)備1606、1608和PC1610、1612與之相關(guān)聯(lián)的能力。當(dāng)用戶1604a想要把新的設(shè)備1606與他或她的用戶節(jié)點(diǎn)1602a相關(guān)聯(lián)時(shí),服務(wù)器1600確定所述設(shè)備1606是否已經(jīng)包含個(gè)性化信息1614,這也許與所述設(shè)備1606在制造時(shí)就被個(gè)性化的情況一樣。如果該設(shè)備的確包含個(gè)性化信息1614,那么服務(wù)器1600使用該個(gè)性化信息1614來創(chuàng)建從設(shè)備1606到用戶節(jié)點(diǎn)1602a的鏈路1616,并且向用戶設(shè)備1606發(fā)送鏈路1616。當(dāng)用戶1604a獲得受保護(hù)的內(nèi)容1618時(shí)(例如,從服務(wù)器1600或從其它內(nèi)容供應(yīng)者),該內(nèi)容1618其目標(biāo)在于用戶節(jié)點(diǎn)1602a(例如,通過利用與用戶節(jié)點(diǎn)1602a相關(guān)聯(lián)的一個(gè)秘密共享密鑰來加密內(nèi)容的解密密鑰)并且使許可1619與其相關(guān)聯(lián),指定能夠訪問內(nèi)容的條件。當(dāng)用戶1604a試圖在設(shè)備1606上播放內(nèi)容1618時(shí),在設(shè)備1606上運(yùn)行的DRM引擎1620評(píng)估許可1619,所述許可1619表明只要用戶節(jié)點(diǎn)1602a是可到達(dá)的那么就可以播放所述內(nèi)容1618。DRM引擎1620評(píng)估鏈路1616(所述鏈路1616示出了用戶節(jié)點(diǎn)1602a可從設(shè)備1606到達(dá)),并且例如通過授權(quán)解密在許可1619內(nèi)所包含的內(nèi)容解密密鑰,來準(zhǔn)許用戶1604a對(duì)訪問內(nèi)容1618的請(qǐng)求,。
由于在此例子中,使用與用戶節(jié)點(diǎn)1602a相關(guān)聯(lián)的秘密密鑰來加密內(nèi)容解密密鑰,所以需要獲得此秘密密鑰以便解密所述內(nèi)容解密密鑰。如果已經(jīng)使用在此的其它地方所描述的可選密鑰推導(dǎo)技術(shù),那么可以通過使用設(shè)備1606的秘密密鑰之一解密在鏈路1616中所包含的密鑰推導(dǎo)信息來簡(jiǎn)單地獲得用戶節(jié)點(diǎn)密鑰。所解密的密鑰推導(dǎo)信息包含用于解密在許可1619中所包含的內(nèi)容解密密鑰所需要的密鑰(或者能夠從其導(dǎo)出或獲得密鑰的信息)。
再次參照?qǐng)D16,假定用戶1604a想要使新的PC 1610與他或她的用戶節(jié)點(diǎn)1602a相關(guān)聯(lián)。服務(wù)器1600驗(yàn)證尚沒有把最大數(shù)目的PC與用戶節(jié)點(diǎn)1602a相關(guān)聯(lián),并且授權(quán)PC 1610與用戶節(jié)點(diǎn)1602a相關(guān)聯(lián)。然而為了執(zhí)行所述關(guān)聯(lián),服務(wù)器1600需要從PC 1610獲得個(gè)性化信息(例如,密碼密鑰、唯一標(biāo)識(shí)符等)。然而如果PC 1610先前尚未被個(gè)性化(這可能與用戶只是下載PC軟件拷貝的情況相同),那么服務(wù)器1600會(huì)執(zhí)行個(gè)性化過程(例如,通過使用在此的其它地方所描述的引導(dǎo)協(xié)議來創(chuàng)建PC節(jié)點(diǎn)對(duì)象)或者把用戶引向可以執(zhí)行個(gè)性化過程的服務(wù)供應(yīng)商。當(dāng)完成個(gè)性化過程時(shí),服務(wù)器1600可以創(chuàng)建從PC 1610到用戶節(jié)點(diǎn)1602a的鏈路1624并且向PC 1610發(fā)送所述鏈路,只要該鏈路保持有效,那么所述PC 1610可以繼續(xù)使用該鏈路。
用戶稍后可以請(qǐng)求增加另外的PC,并且服務(wù)器可能會(huì)強(qiáng)制實(shí)施用于把每個(gè)用戶的PC節(jié)點(diǎn)對(duì)象的數(shù)目限制為4的策略(典型情況下,它可能還會(huì)向用戶提供按照需要從其活動(dòng)列表中移除PC的能力)。
作為又一例子,現(xiàn)在假定服務(wù)供應(yīng)商已經(jīng)決定用戶應(yīng)當(dāng)能夠在他們擁有的任何設(shè)備上播放他們擁有的任何內(nèi)容。服務(wù)供應(yīng)商還可能想要允許用戶的PC軟件創(chuàng)建到他或她每個(gè)設(shè)備的鏈路,而并不要求所述用戶聯(lián)系服務(wù)器1600。在這種實(shí)施例中,當(dāng)用戶想要在新的設(shè)備上播放內(nèi)容時(shí),用戶的PC軟件可能會(huì)訪問新的設(shè)備機(jī)密個(gè)性化信息并且使用它來創(chuàng)建用于該設(shè)備的新鏈路(例如,從所述新的設(shè)備到用戶節(jié)點(diǎn)1602a的鏈路)。如果所述設(shè)備未被個(gè)性化,那么PC軟件有權(quán)訪問遠(yuǎn)程服務(wù),或者指示設(shè)備訪問所述遠(yuǎn)程服務(wù)來執(zhí)行個(gè)性化過程。然后PC軟件會(huì)向新設(shè)備發(fā)送鏈路,在該點(diǎn),只要內(nèi)容保持有效,那么新設(shè)備就能播放所述內(nèi)容,這是由于在一個(gè)實(shí)施例中一旦鏈路對(duì)象存在,就不必在創(chuàng)建另一個(gè),除非所述鏈路對(duì)象期滿或被無效。
在上面所示出的例子中,內(nèi)容的目標(biāo)在于用戶。為此,封裝器應(yīng)用為內(nèi)容選擇新的ID,或者使用現(xiàn)有的,創(chuàng)建加密密鑰和相關(guān)聯(lián)的內(nèi)容密鑰對(duì)象,以及用于綁定內(nèi)容對(duì)象和內(nèi)容密鑰對(duì)象的保護(hù)器對(duì)象。然后封裝器利用控制程序(例如,用DRM引擎的虛擬機(jī)可執(zhí)行的字節(jié)代碼編譯的)來創(chuàng)建控制對(duì)象,用于當(dāng)且僅當(dāng)用戶節(jié)點(diǎn)可從請(qǐng)求“播放”動(dòng)作的PC或設(shè)備節(jié)點(diǎn)到達(dá)時(shí)才允許進(jìn)行所述“播放”動(dòng)作。典型情況下,如果適當(dāng)?shù)脑挘刂?、控制器、保護(hù)器和內(nèi)容密鑰對(duì)象被嵌入到封裝的內(nèi)容中,使得PC和設(shè)備不必分別獲得它們。
在一個(gè)實(shí)施例中,當(dāng)設(shè)備或PC想要播放內(nèi)容時(shí),它遵循諸如先前結(jié)合圖9所描述的過程。即,DRM引擎找到用于所述內(nèi)容的內(nèi)容ID的保護(hù)器對(duì)象,然后是由保護(hù)器所引用的內(nèi)容密鑰對(duì)象,然后是引用該內(nèi)容密鑰對(duì)象的控制器對(duì)象,并且最后是由該控制器引用的控制對(duì)象。DRM引擎執(zhí)行控制對(duì)象的控制程序,所述控制程序檢查所述用戶節(jié)點(diǎn)是否是可到達(dá)的。如果設(shè)備或PC節(jié)點(diǎn)具有必要的鏈路對(duì)象來驗(yàn)證在其節(jié)點(diǎn)和用戶節(jié)點(diǎn)之間存在路徑,那么滿足條件并且控制程序允許使用在內(nèi)容密鑰對(duì)象中所表示的密鑰。然后設(shè)備或PC的媒體再現(xiàn)引擎可以解密并播放內(nèi)容。
1.12.例子臨時(shí)登錄 圖17是這里所描述的DRM系統(tǒng)和方法的潛在應(yīng)用的另一例子。此例子類似于在先前部分中的例子,除了這里用于管理支配在PC節(jié)點(diǎn)對(duì)象和用戶節(jié)點(diǎn)對(duì)象之間創(chuàng)建鏈路對(duì)象的策略允許只是12小時(shí)的臨時(shí)登錄,只要用戶尚未在另一PC上臨時(shí)登錄的話。此特征會(huì)允許用戶1700把他的內(nèi)容1702帶到朋友的PC 1704,登錄該P(yáng)C 1704一段時(shí)間,并且在朋友的PC 1704上播放所述內(nèi)容1702。
為了實(shí)現(xiàn)這點(diǎn),可能在有限有效期的情況下創(chuàng)建鏈路對(duì)象1710。在一個(gè)實(shí)施例中,這可以如下進(jìn)行 為了便于解釋,假定用于播放DRM保護(hù)的內(nèi)容1702所要求的具有DRM功能的消費(fèi)軟件1714已經(jīng)存在于朋友的PC 1704上。包含內(nèi)容1702和許可1708的文件被轉(zhuǎn)送到朋友的PC 1704。當(dāng)用戶試圖播放內(nèi)容1702時(shí),軟件1714認(rèn)識(shí)到并不存在用于把本地PC節(jié)點(diǎn)與擁有所述內(nèi)容的用戶節(jié)點(diǎn)相鏈接的有效鏈路對(duì)象。軟件1714提示用戶需要他的憑證1712(這可以經(jīng)由用戶名/密碼、移動(dòng)電話認(rèn)證協(xié)議、智能卡或在系統(tǒng)策略下所允許的任何認(rèn)證系統(tǒng)來提供)并且與后端系統(tǒng)1706通信。后端系統(tǒng)1706檢查所請(qǐng)求鏈路的用戶節(jié)點(diǎn)對(duì)象和PC節(jié)點(diǎn)對(duì)象的屬性,并且檢查到并不存在仍然有效的活動(dòng)臨時(shí)登錄鏈路對(duì)象。如果滿足那些條件,那么后端服務(wù)1706創(chuàng)建用于鏈接朋友的PC節(jié)點(diǎn)對(duì)象和用戶節(jié)點(diǎn)的鏈路對(duì)象1710,其有效期限于所請(qǐng)求的登錄持續(xù)時(shí)間(例如小于12小時(shí),以便符合此例子中的策略)?,F(xiàn)在具有鏈路對(duì)象1710使朋友的PC 1704能夠播放用戶的內(nèi)容1702直到鏈路1710期滿。
1.13.例子企業(yè)內(nèi)容管理 圖18示出了用于管理企業(yè)文檔(例如,電子郵件、字處理文檔、展示幻燈片、即時(shí)消息發(fā)送文本等)的說明性系統(tǒng)1800的高級(jí)體系結(jié)構(gòu)。在圖18所示出的例子中,文檔編輯應(yīng)用(例如文字處理器)1802、電子郵件客戶端1804和目錄服務(wù)器(例如,活動(dòng)目錄服務(wù)器)1806利用數(shù)字權(quán)利管理(DRM)插件1808、網(wǎng)絡(luò)服務(wù)組織層1810、注冊(cè)服務(wù)1812和策略服務(wù)1816來便于依照策略管理文檔、電子郵件消息等。在優(yōu)選實(shí)施例中,使用在此的其它地方以及‘551申請(qǐng)中所描述的DRM引擎和服務(wù)組織技術(shù)來實(shí)現(xiàn)DRM插件1808、網(wǎng)絡(luò)服務(wù)組織層1810、策略服務(wù)1816和注冊(cè)服務(wù)1812。例如在一個(gè)實(shí)施例中,DRM插件1808可以包括上述DRM引擎的實(shí)施例。應(yīng)當(dāng)理解,雖然圖18示出了其中經(jīng)由應(yīng)用可以調(diào)用的插件來把諸如文字處理器1802和電子郵件客戶端1804之類的現(xiàn)有應(yīng)用與DRM引擎集成的實(shí)施例,但是在其它實(shí)施例中所述DRM引擎可以作為應(yīng)用本身任意或者兩者的組成部分來包括。還應(yīng)當(dāng)理解在圖18中所示出的說明性系統(tǒng)可以在單個(gè)企業(yè)內(nèi)實(shí)現(xiàn)或者可以跨越多個(gè)企業(yè)實(shí)現(xiàn)。
在圖18所示出的圖解中,目錄服務(wù)器1806例如可以包含用戶簡(jiǎn)檔和組定義。例如,被稱作“特別工程隊(duì)(special project team)”的組可以被公司系統(tǒng)管理員設(shè)置來標(biāo)識(shí)公司特別工程隊(duì)的成員。
在一個(gè)實(shí)施例中,目錄服務(wù)器1806可以包括用于運(yùn)行諸如在‘551申請(qǐng)中所描述(并且例如利用在
平臺(tái)上基于標(biāo)準(zhǔn)IIS技術(shù)實(shí)現(xiàn))的那些web網(wǎng)絡(luò)服務(wù)的活動(dòng)目錄服務(wù)器,所述網(wǎng)絡(luò)服務(wù)根據(jù)所訪問的內(nèi)容向特別工程隊(duì)組中的人們發(fā)出節(jié)點(diǎn)、鏈路和許可。如果在組中成員資格改變,那么可以發(fā)出新的令牌。對(duì)于權(quán)利撤銷來說,目錄服務(wù)器1806可以根據(jù)諸如在‘551申請(qǐng)中所描述的技術(shù)(這里有時(shí)被稱作為“NEMO”技術(shù))來運(yùn)行安全元數(shù)據(jù)服務(wù)。在一些實(shí)施例中,可以要求客戶端具有到期時(shí)間值或時(shí)間概念(根據(jù)公司選擇定義的任何新鮮值(例如,1周、1天、1小時(shí)、每5分鐘等))以便使用DRM許可。例如,安全元數(shù)據(jù)服務(wù)提供的令牌可以包括信任和認(rèn)證的時(shí)間值。在一些實(shí)施例中,客戶端可以在安全元數(shù)據(jù)服務(wù)交互中標(biāo)識(shí)用戶節(jié)點(diǎn)ID??梢栽谠S可控制情境中直接評(píng)估安全元數(shù)據(jù)以便確定用戶是否仍然具有給定的成員資格。安全元數(shù)據(jù)還可以返回代理,所述代理可以確定諸如作為特別工程隊(duì)中成員的關(guān)系是否有效。從而在一些實(shí)施例中,可以利用只是添加幾個(gè)明確定義的網(wǎng)絡(luò)服務(wù)來平衡公司現(xiàn)有的授權(quán)和認(rèn)證基礎(chǔ)結(jié)構(gòu)(例如,公司的活動(dòng)目錄服務(wù)器)。
圖19示出了諸如在圖18中所示出的系統(tǒng)可以怎樣用來管理對(duì)文檔的訪問或其它使用的例子。在此例子中,特定的雇員(約翰)可能頻繁致力于高度機(jī)密的戰(zhàn)略工程,并且可能已經(jīng)安裝了DRM插件1908來用于其應(yīng)用(例如,字處理程序1902、電子郵件程序1904、日程表程序、集成這種程序的程序或程序套件等)。在創(chuàng)建他文檔期間的某個(gè)時(shí)間點(diǎn),約翰訪問已經(jīng)被添加到其應(yīng)用工具條的“權(quán)限”下拉菜單項(xiàng)(動(dòng)作1913)。出現(xiàn)權(quán)限對(duì)話框,用于聯(lián)系他公司的活動(dòng)目錄服務(wù)器1906以便查找已經(jīng)在系統(tǒng)上設(shè)置的個(gè)人和組的目錄。他從列表中選擇“特別工程隊(duì)”,并且選擇向隊(duì)中的每個(gè)人給予查看、編輯和打印文檔的權(quán)限。使用在‘551申請(qǐng)中所描述的NEMO服務(wù)組織技術(shù),DRM插件1908把具有NEMO功能的策略服務(wù)擴(kuò)展1916聯(lián)系到活動(dòng)目錄1906并且請(qǐng)求要用來保護(hù)特別工程隊(duì)的文件的策略的拷貝(動(dòng)作1914)。當(dāng)約翰保存文檔時(shí),DRM插件自動(dòng)加密文件1912,并且創(chuàng)建許可對(duì)象1910,其目標(biāo)在于并且綁定到被稱為“特別工程隊(duì)”的組。許可1910允許任何設(shè)備訪問(例如,查看、編輯、打印等)文件1912,其中所述設(shè)備可以生成從其設(shè)備節(jié)點(diǎn)到特別工程隊(duì)組節(jié)點(diǎn)的有效鏈路鏈。
約翰有權(quán)訪問文檔1912,這是因?yàn)樗脑O(shè)備具有到約翰用戶節(jié)點(diǎn)的鏈路,并且它還具有從約翰的用戶節(jié)點(diǎn)到“特別工程隊(duì)”組節(jié)點(diǎn)的鏈路。同樣,如果他把此文檔轉(zhuǎn)發(fā)給其它人,那么只有在他們能夠生成到“特別工程隊(duì)”組節(jié)點(diǎn)的有效鏈路鏈才能訪問它(例如,通過要求特別工程隊(duì)節(jié)點(diǎn)可由該設(shè)備到達(dá))。
約翰可以把(已經(jīng)受保護(hù)的)文件保存在他的計(jì)算機(jī)上,并且稍后把它附到電子郵件消息上(動(dòng)作1920)。例如,他可以打開給他老板(喬治)的舊電子郵件,像通常那樣附加文件,并且發(fā)送消息。如圖20所示,喬治還在他的計(jì)算機(jī)2014上安裝有DRM插件2000。當(dāng)他登錄到他的計(jì)算機(jī)2014時(shí),插件2000有機(jī)會(huì)檢查他已經(jīng)添加的所有組(動(dòng)作2006),并且下載新組,刷新已經(jīng)期滿的任何鏈路(動(dòng)作2012)。如果他自其上次登錄而已經(jīng)被添加到“特別工程隊(duì)”,那么他的插件2000能會(huì)下載用于把他的用戶節(jié)點(diǎn)鏈接到“特別工程隊(duì)”組節(jié)點(diǎn)的鏈路對(duì)象2008。此鏈路2008意味著用戶節(jié)點(diǎn)“喬治”是組節(jié)點(diǎn)“特別工程隊(duì)”的成員。在此例子中,假定鏈路對(duì)象2008具有截止日期(例如3天),在此之后該鏈路對(duì)象2008不再有效。
如圖21所示,當(dāng)喬治試圖打開文檔時(shí)(動(dòng)作2130,2132),DRM插件2108檢查所嵌入的(或附加的)許可,并且得知“特別工程隊(duì)”節(jié)點(diǎn)必須是可到達(dá)的。他的插件2108構(gòu)造(并驗(yàn)證)從他計(jì)算機(jī)設(shè)備節(jié)點(diǎn)到用戶節(jié)點(diǎn)“喬治”以及從用戶節(jié)點(diǎn)“喬治”到組節(jié)點(diǎn)“特別工程隊(duì)”的鏈路鏈2120、2122(動(dòng)作2134)。由于設(shè)備具有有效的鏈路鏈2120、2122,所以他的插件2108允許訪問文件。
如在此的其它地方所描述,在一些實(shí)施例中,鏈路還可以攜帶安全的密鑰鏈。從而在一些實(shí)施例中,通過生成到特別工程隊(duì)節(jié)點(diǎn)的鏈路鏈,插件不僅可以證明它被允許訪問內(nèi)容,而且還能夠解密密鑰鏈,所述密鑰鏈?zhǔn)蛊淠軌蚪饷芩鰞?nèi)容。
例如如果另一雇員(“卡羅爾”)意外地接收約翰的電子郵件,并且試圖打開文檔,那么她的DRM插件會(huì)獲取與所述文件綁定的許可并且評(píng)估所述許可的條款。她的PC具有到她用戶節(jié)點(diǎn)“卡羅爾”的鏈路;但是由于她不是該團(tuán)隊(duì)的成員,所以不存在從“卡羅爾”到“特別工程隊(duì)”組節(jié)點(diǎn)的鏈路。由于“特別工程隊(duì)”是不可到達(dá)的,所以不允許她訪問文件。
如果卡羅爾最終被添加到組“特別工程隊(duì)”。在下次她的DRM插件刷新她的成員資格時(shí),會(huì)檢測(cè)此新組,并且下載用于把她的用戶節(jié)點(diǎn)鏈接到特別工程隊(duì)節(jié)點(diǎn)的鏈路對(duì)象?,F(xiàn)在她的插件具有需要用來構(gòu)造從她的設(shè)備節(jié)點(diǎn)到她的用戶節(jié)點(diǎn)再到特別工程隊(duì)節(jié)點(diǎn)的鏈所需要的所有鏈路。現(xiàn)在特別工程隊(duì)節(jié)點(diǎn)“是可到達(dá)的”并且她可以打開目標(biāo)為特別工程隊(duì)的任何文檔或電子郵件——即便是在她加入該團(tuán)隊(duì)之前所創(chuàng)建的那些文檔或電子郵件。
假定一個(gè)月后,喬治轉(zhuǎn)換為新角色并且被從活動(dòng)目錄中的特別工程隊(duì)組中移除。下次喬治登錄時(shí),他的插件不接收新的、刷新的鏈路對(duì)象,其中所述鏈路對(duì)象把他的用戶節(jié)點(diǎn)“喬治”關(guān)聯(lián)到“特別工程隊(duì)”。當(dāng)數(shù)周以后他再試圖打開約翰的文件時(shí),他的插件試圖構(gòu)造到特別工程隊(duì)的鏈路鏈。他的PC仍然具有到用戶節(jié)點(diǎn)“喬治”的鏈路(喬治的PC仍然屬于他);但是從“喬治”到“特別工程隊(duì)”的鏈路已經(jīng)期滿。由于“特別工程隊(duì)”是不可到達(dá)的,所以不允許他訪問文件。
假定公司具有這樣的策略,所述策略要求對(duì)所有的機(jī)密信息的訪問被記錄為日志。在一個(gè)這種實(shí)施例中,用于特別工程隊(duì)的策略指示為此組所創(chuàng)建的所有許可也需要要求收集使用信息并把它報(bào)告給例如中央儲(chǔ)存庫。從而在此例子中,當(dāng)評(píng)估(例如,執(zhí)行)許可中的控制程序時(shí),插件執(zhí)行把訪問記錄為日志的要求并且記錄所述訪問為日志。例如,結(jié)果活動(dòng)可以被記錄在諸如這里所描述的本地保護(hù)的狀態(tài)數(shù)據(jù)庫中作為日志,并且當(dāng)重新建立網(wǎng)絡(luò)連接時(shí),可以經(jīng)由先前描述的服務(wù)來報(bào)告相關(guān)內(nèi)容。
圖22示出了用于管理企業(yè)內(nèi)的電子內(nèi)容的另一說明性系統(tǒng)2200。在圖22所示出的例子中,LDAP服務(wù)器2206用來管理用戶簡(jiǎn)檔、組定義和角色分配,并且包含被稱作“特別工程隊(duì)”的組定義以及“代理人”的角色定義。
假定約翰是代理人并且想要向特別工程隊(duì)的其它成員發(fā)送具有附件的電子郵件。當(dāng)約翰安裝用于他應(yīng)用的DRM插件程序2208時(shí),它還把項(xiàng)目安裝到他的電子郵件工具條。在他創(chuàng)作電子郵件消息期間的某個(gè)點(diǎn),約翰從下拉菜單訪問已被添加到他工具條的“設(shè)置權(quán)限”。DRM插件程序2208聯(lián)系策略服務(wù)2216并且顯示要從中進(jìn)行選擇的公司消息發(fā)送策略列表。約翰選擇“特別工程DRM模版”并且DRM插件程序2208使用NEMO協(xié)議來請(qǐng)求并確保它接收的策略對(duì)象的可靠性、完整性和機(jī)密性。所述策略描述了應(yīng)當(dāng)怎樣創(chuàng)建使用此模板的許可,包括怎樣對(duì)它們定目標(biāo)和綁定。
當(dāng)約翰擊中“發(fā)送”時(shí),DRM插件2208加密消息和附件,并且產(chǎn)生相關(guān)聯(lián)的許可。該許可要求為了訪問電子郵件或附件,特別工程隊(duì)組節(jié)點(diǎn)或“代理人”組節(jié)點(diǎn)必須是可到達(dá)的。
把許可與加密的消息有效載荷和加密的附件相綁定。隨后使用標(biāo)準(zhǔn)的電子郵件功能來向接收者列表發(fā)送所述消息。由于許可規(guī)則和加密不取決于電子郵件的尋址,所以可能錯(cuò)誤地包括不正確的電子郵件接收者的事實(shí)不會(huì)使電子郵件或附件的內(nèi)容置于風(fēng)險(xiǎn)之中。
由于這種無意的接收者沒有用于把他的用戶節(jié)點(diǎn)鏈接到特別工程隊(duì)的有效鏈路對(duì)象,所以如果或者當(dāng)他試圖訪問內(nèi)容時(shí)不允許他這樣做。此外,由于他的設(shè)備沒有必要的鏈路鏈(以及它們包含的密鑰),所以他的設(shè)備也不具有解密所述內(nèi)容的能力。
然而,如果無意的接收者隨后使用標(biāo)準(zhǔn)的電子郵件功能把相同的、未經(jīng)修改的電子郵件轉(zhuǎn)送到特別工程隊(duì)的成員。該成員具有用于把他的用戶節(jié)點(diǎn)鏈接到“特別工程隊(duì)”組節(jié)點(diǎn)的鏈路對(duì)象,并且能夠訪問電子郵件的內(nèi)容。
假定公司的另一代理人(“比爾”)也接收到用于把他與“特別工程隊(duì)”組節(jié)點(diǎn)相關(guān)聯(lián)的鏈路對(duì)象。比爾還可以查看所述文件。如果他把消息轉(zhuǎn)送給律師助手(“特倫特”),他既不是代理人也不與特別工程隊(duì)相關(guān)聯(lián),那么特倫特沒有用于把他與“特別工程隊(duì)”組節(jié)點(diǎn)連接的鏈路對(duì)象,并且他不能訪問所述文檔。
如果特倫特隨后被添加到LDAP目錄2206中的特別工程隊(duì)組中,那么他會(huì)被給予必要的鏈路對(duì)象并且將能訪問先前轉(zhuǎn)發(fā)的電子郵件。
如果如先前所論述,公司具有用于表明在所有許可中包括報(bào)告要求的策略,那么在一個(gè)實(shí)施例中,每當(dāng)執(zhí)行這些許可之一內(nèi)的控制程序時(shí)(例如當(dāng)某人試圖訪問所述文件時(shí)),可以觸發(fā)報(bào)告事件。報(bào)告步驟另外可以包括關(guān)于訪問是被準(zhǔn)許還是拒絕的指示符——這是實(shí)現(xiàn)方式選擇的問題。如果使用這種指示符,那么可以維護(hù)嘗試訪問特定文檔的次數(shù)以及每次的狀態(tài)和其它信息(例如,成功、失敗等)的日志。
作為又一例子,假定特別工程隊(duì)的成員之一(“斯蒂芬”)出差到另一公司來致力于該特別工程。在前往該另一公司公司之前,斯蒂芬的電子郵件客戶端把所有電子郵件的本地拷貝下載到他的收件箱中。被附著到這些電子郵件之一的受保護(hù)報(bào)告也包括嵌入式(或附加)的許可。此許可對(duì)象包括用于訪問內(nèi)容以及訪問加密的內(nèi)容密鑰的規(guī)則。訪問內(nèi)容所要求的唯一“缺少的鏈路”是用于到達(dá)“特別工程隊(duì)”組節(jié)點(diǎn)所必要的鏈路對(duì)象。
由于在此例子中公司策略在于允許鏈路對(duì)象保持有效達(dá)3天,所以用于把斯蒂芬的用戶節(jié)點(diǎn)鏈接到特別工程隊(duì)節(jié)點(diǎn)的鏈路對(duì)象將在他出差和斷開連接時(shí)保持有效。如果他試圖在離線時(shí)訪問文件,那么特別工程隊(duì)組節(jié)點(diǎn)仍然是可到達(dá)的,并且允許他訪問所述文件。
然而如果斯蒂芬保持離線達(dá)三天以上,那么用于把他鏈接到特別工程隊(duì)的鏈路對(duì)象會(huì)期滿。特別工程隊(duì)組節(jié)點(diǎn)于是不再可到達(dá),并且不允許他訪問所述文件。
如果斯蒂芬最終出差到他可以(例如經(jīng)由VPN)連接到公司系統(tǒng)的位置,那么他的DRM插件會(huì)向他所屬的每個(gè)組請(qǐng)求所刷新的鏈路對(duì)象拷貝。由于他仍然是“特別工程隊(duì)”組的一部分,所以他接收從他的用戶節(jié)點(diǎn)到特別工程隊(duì)組節(jié)點(diǎn)的新鏈路對(duì)象。此鏈路替換已經(jīng)期滿并不再有效的“舊”鏈路。
由于“特別工程隊(duì)”節(jié)點(diǎn)現(xiàn)在可使用此新刷新的鏈路到達(dá),所以他能夠再次訪問受保護(hù)的報(bào)告。新的鏈路對(duì)象在3天時(shí)間內(nèi)是有效的,在此之后所述鏈路對(duì)象也期滿。
作為又一例子,假定特別工程隊(duì)的成員“薩莉”想要經(jīng)由即時(shí)信使與另一隊(duì)員通信,保存通信拷貝,并且把它給予團(tuán)隊(duì)的另一成員(例如,經(jīng)由電子郵件附件、盤片、軟件狗(dongle)等)。在此例子中,即時(shí)信使客戶端(以及可能還有公司向其雇員所提供的任何其它消息發(fā)送和通信產(chǎn)品)被鏈接到DRM插件,和在先前例子中一樣,所述DRM插件訪問策略“特別工程DRM模板”,所述策略“特別工程DRM模板”規(guī)定將怎樣為許可定目標(biāo)及綁定。當(dāng)薩莉試圖保存她的即時(shí)消息發(fā)送會(huì)話時(shí)(例如,通過選擇“另存為”),該插件選擇加密密鑰(例如,隨機(jī)地)并且封裝(加密)會(huì)話的文本。依照公司策略,然后DRM插件產(chǎn)生其目標(biāo)在于并且被綁定到特別工程隊(duì)組節(jié)點(diǎn)的許可對(duì)象。
把包含受保護(hù)IM副本(transcript)的文件與所述許可綁定以便訪問副本內(nèi)容。和在先前的例子中一樣,許可包含用于管理支配對(duì)內(nèi)容以及所加密的內(nèi)容密鑰拷貝進(jìn)行訪問的規(guī)則。薩莉可以使用標(biāo)準(zhǔn)的‘拖放’過程來把此綁定的文件轉(zhuǎn)送到電子郵件、USB軟件狗、盤片等,并且把它發(fā)送給其他人。如果接收方設(shè)備可以生成到特別工程組節(jié)點(diǎn)的有效鏈路,那么允許并且可以訪問內(nèi)容。
假定薩莉把文件給了約翰,約翰也是特別工程隊(duì)的成員。如果約翰具有最近刷新的鏈路對(duì)象,所述鏈路對(duì)象把他標(biāo)識(shí)為特別工程隊(duì)的成員,那么他能夠訪問所述文件。按照公司策略,此鏈路對(duì)象包含會(huì)導(dǎo)致它在三天后期滿的截止日期。因此,即便約翰保持?jǐn)嚅_連接,只要該鏈路保持有效他仍然有權(quán)訪問。
如果在以后的某一時(shí)間約翰離開特別工程隊(duì)而從事另一分配的工作,并且在他的袋子中發(fā)現(xiàn)來自薩莉的USB軟件狗并且試圖使用他的臺(tái)式計(jì)算機(jī)打開文件,那么用于把他的用戶節(jié)點(diǎn)關(guān)聯(lián)到特別工程隊(duì)的鏈路對(duì)象將已經(jīng)期滿。由于他不再是團(tuán)隊(duì)的一部分,所以他設(shè)備上的DRM插件不再可以獲取新的、刷新的鏈路。由于“特別工程隊(duì)”組節(jié)點(diǎn)不再可通過他的設(shè)備到達(dá),所以不允許訪問。
假定自他改變了工作以來他的膝上計(jì)算機(jī)一直沒有被連接到網(wǎng)絡(luò),他還試圖利用該設(shè)備打開所述文件。由于最大分配的時(shí)間已經(jīng)過去,所以該鏈路也不再有效。在一些實(shí)施例中,每當(dāng)他試圖訪問所述文件時(shí),可以產(chǎn)生報(bào)告并對(duì)其排隊(duì)以發(fā)送到中央儲(chǔ)存庫。
中央儲(chǔ)存庫經(jīng)由電子郵件接收多次試圖訪問文件未成功的報(bào)告并且標(biāo)記管理器。管理器提醒約翰不再允許他訪問機(jī)密材料并且請(qǐng)求毀掉所有文件(即便系統(tǒng)表明該訪問尚未被準(zhǔn)許也是如此)。
作為又一例子,假定政府機(jī)構(gòu)或外部審計(jì)員想要調(diào)查或?qū)徲?jì)特別工程隊(duì)對(duì)機(jī)密信息的處理。為了支持調(diào)查,公司想要表明審計(jì)記錄以供訪問與特別工程相關(guān)的敏感信息。
為此,公司首先掃描用于與特別工程相關(guān)的任何消息的所有明文消息存檔。使他們欣慰的是,他們發(fā)現(xiàn)在堅(jiān)持公司策略的情況下,在沒有適當(dāng)DRM保護(hù)的情況下,沒有雇員發(fā)送論述特別工程的消息(例如向系統(tǒng)之外發(fā)送消息)。
然后公司使用DRM訪問記錄來生成詳細(xì)描述向誰以及何時(shí)給予對(duì)受保護(hù)信息的訪問權(quán)的審計(jì)跟蹤細(xì)節(jié)。
按照公司規(guī)程,當(dāng)建立特別工程隊(duì)組時(shí),默認(rèn)時(shí)它還包括首席服從官(Chief Compliance Officer CCO)。用于首席服從官的鏈路對(duì)象被創(chuàng)建并保存到存檔服務(wù)器,所述存檔服務(wù)器允許他或她如果將來需要的話回顧所有消息的內(nèi)容。
在此例子中,為特別工程隊(duì)所定義的策略表明該團(tuán)隊(duì)所產(chǎn)生的所有許可必須包括用于報(bào)告任何試圖對(duì)所述文件進(jìn)行訪問的要求,包括日期和時(shí)間、用戶節(jié)點(diǎn)以及訪問是否被準(zhǔn)許。這些報(bào)告被保存在中央儲(chǔ)存庫上的訪問日志中。
CCO檢查在已經(jīng)出現(xiàn)可疑的任何泄漏或舞弊的日期之前與特別工程隊(duì)相關(guān)聯(lián)的所有訪問的訪問日志。CCO還搜索電子郵件、IM和網(wǎng)絡(luò)備份存檔以查找在該日期或之前的所有消息通信業(yè)務(wù)和系統(tǒng)文件。由于每個(gè)文件具有附加的許可(具有內(nèi)容密鑰),并且CCO具有必要的鏈路對(duì)象來滿足所述許可的要求,所以允許他或她訪問在所關(guān)注時(shí)間之前所訪問的每一個(gè)消息的內(nèi)容。
使訪問日志和未加密的消息內(nèi)容完全可用于代理機(jī)構(gòu)/審計(jì)員作為調(diào)查的一部分。
在一些實(shí)施例中,特別工程隊(duì)的策略還可以包括用于為與特別工程相關(guān)的所有許可設(shè)置截止日期的要求。例如,如果只是法定要求公司保持此天然記錄達(dá)1年,那么它們可以在策略中表明許可在發(fā)出日之后一年期滿。在該情況下,公司可以只是按照法律的要求來保持記錄。在該時(shí)間之后,即便CCO也無訪問權(quán)。
在上面論述中,偶爾會(huì)引用“定目標(biāo)”和“綁定”。在優(yōu)選實(shí)施例中,定目標(biāo)和綁定表示兩種不同的、卻緊密相關(guān)的過程。在優(yōu)選實(shí)施例中,“綁定”主要是密碼過程,涉及保護(hù)用于加密內(nèi)容的密鑰。當(dāng)許可被‘綁定’到節(jié)點(diǎn)(例如“特別工程隊(duì)”節(jié)點(diǎn))時(shí),例如它可以意指利用與該節(jié)點(diǎn)相關(guān)聯(lián)的公鑰來加密內(nèi)容密鑰。從而,只有有權(quán)訪問節(jié)點(diǎn)私鑰的設(shè)備具有必要的密鑰來解密該內(nèi)容(并且在優(yōu)選實(shí)施例中,獲得訪問節(jié)點(diǎn)私鑰權(quán)利的唯一方式是解密到該節(jié)點(diǎn)的鏈路鏈);然而,簡(jiǎn)單地具有正確私鑰只表明所述設(shè)備如果被允許這樣做的話具有解密該內(nèi)容的能力。
在優(yōu)選實(shí)施例中,由許可內(nèi)的控制程序來確定是否允許設(shè)備訪問內(nèi)容,并且特別地是,確定怎樣來給它定目標(biāo)?!岸繕?biāo)”指的是在控制程序中增加用于指定特定節(jié)點(diǎn)(或多個(gè)節(jié)點(diǎn))“是可到達(dá)的”以便使用內(nèi)容的要求。在上面所示出的例子中,控制程序典型情況下指定特定的節(jié)點(diǎn)“特別工程隊(duì)”可由消費(fèi)設(shè)備到達(dá)。
在一些情況下,可能希望使許可目標(biāo)為一個(gè)以上節(jié)點(diǎn),諸如在公司的新產(chǎn)品開發(fā)團(tuán)隊(duì)(“公司”),其與多個(gè)供應(yīng)商合作來投標(biāo)用于新絕密產(chǎn)品的組件。假定在工程早期階段期間,供應(yīng)商A和供應(yīng)商B(競(jìng)爭(zhēng)者)都具有到“SecretProjectX”的鏈路。供應(yīng)商A想要與SecretProjectX的所有成員共享其思想,但是不希望他們把它無意間泄漏給供應(yīng)商B。供應(yīng)商A可以為這些許可定目標(biāo)以致(“SecretProjectX是可到達(dá)的”)并且(“供應(yīng)商A是可到達(dá)的”或者“公司是可到達(dá)的”)。如果公司無意間把此信息共享給秘密工程X中的每個(gè)人(包括供應(yīng)商B),那么不允許在供應(yīng)商B的那些人查看它,限制對(duì)公司的任何非公開的風(fēng)險(xiǎn)并且消除供應(yīng)商A丟失其商業(yè)秘密的可能。
1.14.例子保健記錄 圖23圖示了可以怎樣應(yīng)用這里所描述的系統(tǒng)和方法來管理保健記錄。假定醫(yī)療記錄具有不同的機(jī)密級(jí)別,而且希望對(duì)系統(tǒng)中不同的實(shí)體(例如,病人、醫(yī)生、保險(xiǎn)公司等)準(zhǔn)許不同的訪問權(quán)利。例如,可能希望只允許某些記錄被病人查看,只允許某些記錄被病人的醫(yī)生查看,允許某些記錄可被病人查看但是只可由病人的醫(yī)生編輯,允許某些記錄可被所有醫(yī)生查看,允許某些記錄被所有保險(xiǎn)公司查看,允許某些記錄只可被病人的保險(xiǎn)公司查看等。
如圖23所示,可以使用像諸如在此的其它地方所描述的那些節(jié)點(diǎn)和鏈路式的DRM對(duì)象來建模此保健生態(tài)系統(tǒng)2300。例如,可以把節(jié)點(diǎn)分配給病人2302、病人的醫(yī)生2304、病人的保險(xiǎn)公司2306、病人的設(shè)備(2308,2310)、病人的一個(gè)特定醫(yī)生2312、醫(yī)生的計(jì)算設(shè)備2314、2316、所有醫(yī)生組2318、某個(gè)專業(yè)的醫(yī)生組2320、醫(yī)療機(jī)構(gòu)2322、保險(xiǎn)公司2324、由保險(xiǎn)公司所使用的計(jì)算設(shè)備2326、所有保險(xiǎn)公司組2328等。
假定病人的醫(yī)生使用他或她的PC來創(chuàng)建關(guān)于病人的醫(yī)療記錄。例如,醫(yī)療記錄可以包括具有用于他或她的附注、診斷、處方指令、所述病人的指令等的多個(gè)字段的文檔模板。所述模板還可以允許醫(yī)生選擇用于管理支配文檔和/或其個(gè)人字段的安全策略。例如,醫(yī)生的應(yīng)用可以給出一組標(biāo)準(zhǔn)的安全策略選擇,并且當(dāng)獲得醫(yī)生的選擇時(shí),可以根據(jù)那些選擇來自動(dòng)地產(chǎn)生許可并且與醫(yī)療記錄受保護(hù)的(例如,加密的)內(nèi)容相關(guān)聯(lián)。
為了此例子的目的,假定許可準(zhǔn)許查看對(duì)病人、對(duì)治療所述病人的所有保健提供者以及對(duì)向所述病人提供保險(xiǎn)的所有保險(xiǎn)公司的訪問。進(jìn)一步假定,為了圖示說明,所述許可只向醫(yī)療機(jī)構(gòu)x的心臟病專家準(zhǔn)許編輯權(quán)利。
封裝應(yīng)用接受醫(yī)生的策略規(guī)范輸入(其可以簡(jiǎn)單地包括標(biāo)準(zhǔn)模板上的鼠標(biāo)點(diǎn)擊)并且產(chǎn)生許可,所述許可包括諸如下面所示出的控制程序 Action.Edit.Perform(){ if(IsNodeReachable(“MedicalFoundationX”)&&IsNodeReachable(“Cardiologist”)){return new ESB(ACTION_GRANTED); }else{ returnnew ESB(ACTION_DENIED); } } Action.View.Perform(){ if(IsNodeReachable(“PatientY”)‖IsNodeReachable(“HCPsPatientY”)‖IsNodeReachable(“ICsPatientY”){return new ESB(ACTION_GRANTED); }else if(EmergencyException==TRUE){ return new ESB(ACTION_GRANTED,new NotificationObligation());} else{ return new ESB(ACTION_DENIED); } } 然后可以把醫(yī)療記錄及其相關(guān)聯(lián)的許可存儲(chǔ)在醫(yī)療記錄的中央數(shù)據(jù)庫、由特定醫(yī)學(xué)基金會(huì)所操作的數(shù)據(jù)庫等中。如果病人Y隨后拜訪另一保健提供者,并且授權(quán)保健提供者作為他認(rèn)可的保健提供者之一(例如通過簽名授權(quán)表單),該保健提供者會(huì)獲得到病人y認(rèn)可的保健提供者節(jié)點(diǎn)的鏈路,所述保健提供者可能會(huì)把它存儲(chǔ)在他的計(jì)算機(jī)系統(tǒng)上。如果該保健提供者然后獲得由醫(yī)生x所創(chuàng)建的醫(yī)療記錄,那么他能夠獲得對(duì)該醫(yī)療記錄的查看訪問權(quán),這是由于病人y認(rèn)可的保健提供者節(jié)點(diǎn)可從新的保健提供者計(jì)算機(jī)系統(tǒng)到達(dá)。如果另一方面未經(jīng)認(rèn)可的保健提供者獲得(加密的)醫(yī)療記錄的拷貝,那么他可能不能訪問它,這是因?yàn)闆]有任何一個(gè)所要求的節(jié)點(diǎn)(即,病人y的節(jié)點(diǎn)、所有病人y認(rèn)可的保健提供者的節(jié)點(diǎn)以及所有病人y認(rèn)可的保險(xiǎn)公司的節(jié)點(diǎn))可從其計(jì)算系統(tǒng)到達(dá)。
然而注意,上面所示出的示例性控制程序包括重載特征,所述重載特征例如在緊急情況下可以被調(diào)用,例如如果保健提供者需要訪問受保護(hù)的醫(yī)療記錄,但是不能滿足控制程序的條件(例如,因?yàn)樵噲D緊急訪問醫(yī)療記錄的保健提供者先前尚未被注冊(cè)為病人Y的保健提供者)。然而還要注意,緊急訪問異常的調(diào)用會(huì)導(dǎo)致關(guān)于調(diào)用和/或其它環(huán)境的信息被自動(dòng)記錄,并且在此例子中還導(dǎo)致發(fā)送通知(例如,向病人優(yōu)選的保健提供者——即,由病人明確授權(quán)的實(shí)體—和/或病人自己)。這種義務(wù)與緊急異常的關(guān)聯(lián)可以阻止對(duì)異常的濫用,這是因?yàn)榭赡軙?huì)存在濫用的記錄。
應(yīng)當(dāng)理解,已經(jīng)提供此示例性程序以便于解釋這里所描述的系統(tǒng)和方法的某些實(shí)施例。例如,系統(tǒng)是否包括對(duì)緊急異常的支持一般取決于系統(tǒng)設(shè)計(jì)者的要求和愿望。從而例如一些實(shí)施例可以不支持緊急異常,其它實(shí)施例可以支持緊急異常,但是把可以調(diào)用這種異常的實(shí)體類限制為‘所有醫(yī)生’類(例如,通過要求EmergencyException標(biāo)志被設(shè)置為“真”并且所有醫(yī)生節(jié)點(diǎn)都是可到達(dá)的),并且其它實(shí)施例仍然可以支持緊急異常,但是不把強(qiáng)制性義務(wù)與之相關(guān)聯(lián)(由于不能符合所述義務(wù)在優(yōu)選實(shí)施例中可能會(huì)使內(nèi)容不可訪問),作為替代依賴于用于實(shí)施的非技術(shù)性的、法律或制度手段(例如,通過信任保健提供者不會(huì)濫用調(diào)用異常的能力,和/或依賴工業(yè)證明和法律體系來防止濫用)。
可以對(duì)上面所提供的例子進(jìn)行的又一變化可能要求更有力的證明,即醫(yī)生或具體姓名的醫(yī)生實(shí)際上是訪問醫(yī)療記錄的人,而不是坐在醫(yī)生用來訪問記錄的計(jì)算機(jī)(并且從而潛在地包含為滿足可達(dá)性分析所必須的鏈路的計(jì)算機(jī))邊上的其他人??梢砸勒杖魏芜m當(dāng)?shù)姆绞絹韽?qiáng)制實(shí)施這種更有力的認(rèn)證形式。例如,通過使用口令、軟件狗、生物測(cè)定標(biāo)識(shí)機(jī)制等來保護(hù)用于訪問醫(yī)療記錄的醫(yī)生的計(jì)算機(jī)和/或軟件,可以在應(yīng)用或系統(tǒng)級(jí)整個(gè)地或部分地強(qiáng)制實(shí)施這點(diǎn)。作為選擇或另外,與某些醫(yī)療記錄相關(guān)聯(lián)的控制程序本身可以包括要求這種更有力標(biāo)識(shí)的義務(wù)或條件,諸如檢查軟件狗的存在,要求主機(jī)去獲得口令等。
1.15.例子預(yù)訂 圖24是在電子預(yù)訂服務(wù)的情境中可以怎樣使用這里所給出的系統(tǒng)和方法的圖解。例如假定用戶(愛麗絲)想要從因特網(wǎng)服務(wù)供應(yīng)商(XYZ ISP)獲得對(duì)爵士音樂的預(yù)訂。因特網(wǎng)服務(wù)供應(yīng)商可以提供各種不同的預(yù)訂選項(xiàng),包括免費(fèi)的試訂,但是只可以用來在期滿之前播放預(yù)訂內(nèi)容五次(例如,通過播放一首歌曲五次,通過播放五首不同的歌曲各一次等)。試訂還使內(nèi)容只可用于略微變差的形式(例如,下降的保真度或分辨率)。愛麗絲使用她的個(gè)人計(jì)算機(jī)來訪問服務(wù)供應(yīng)商的因特網(wǎng)網(wǎng)點(diǎn),并且選擇試訂。然后服務(wù)供應(yīng)商發(fā)出鏈路對(duì)象2400和代理2401并且把它們發(fā)送到愛麗絲的個(gè)人計(jì)算機(jī)2406。代理2401可操作來初始化愛麗絲安全狀態(tài)數(shù)據(jù)庫中的狀態(tài),所述狀態(tài)將用來跟蹤愛麗絲已經(jīng)使用試用內(nèi)容的次數(shù)。鏈路2400是從愛麗絲的帳戶節(jié)點(diǎn)(Alice@XYZ_ISP)2402到預(yù)訂節(jié)點(diǎn)2404并且包括控制程序,當(dāng)愛麗絲請(qǐng)求播放內(nèi)容時(shí),所述控制程序檢查由代理2401所設(shè)置的狀態(tài)變量的當(dāng)前值以便看看是否允許額外的播放。
當(dāng)愛麗絲把內(nèi)容下載到她的PC并且試圖播放它時(shí),她的PC上的DRM引擎評(píng)估與所述內(nèi)容相關(guān)聯(lián)的許可,其表明為播放所述內(nèi)容,預(yù)訂節(jié)點(diǎn)2404必須是可到達(dá)的。愛麗絲先前已經(jīng)向她的ISP注冊(cè)了她的PC,此時(shí)她接收了從她的PC節(jié)點(diǎn)2406到她的帳戶節(jié)點(diǎn)2402的鏈路2405。從而DRM引擎擁有用于把PC節(jié)點(diǎn)2406連接到預(yù)訂節(jié)點(diǎn)2404的鏈路對(duì)象2405、2400;然而在準(zhǔn)許愛麗絲播放內(nèi)容的請(qǐng)求之前,DRM引擎首先通過執(zhí)行所述鏈路包含的任何控制程序來確定所述鏈路是否有效。當(dāng)執(zhí)行鏈路2400中的控制程序時(shí),DRM引擎檢查狀態(tài)數(shù)據(jù)庫條目以便確定是否已經(jīng)進(jìn)行了5次播放,并且如果尚未到達(dá)5次,那么準(zhǔn)許她播放所述內(nèi)容的請(qǐng)求,并且還向主機(jī)應(yīng)用發(fā)出義務(wù)。所述義務(wù)要求主機(jī)在再現(xiàn)之前使內(nèi)容降級(jí)。主機(jī)應(yīng)用確定它能夠滿足此義務(wù),并且繼續(xù)再現(xiàn)內(nèi)容。為了使愛麗絲能夠在相對(duì)于她五次免費(fèi)試用播放來計(jì)數(shù)該內(nèi)容之前預(yù)覽內(nèi)容,控制程序還可以包括回調(diào),所述回調(diào)例如在已經(jīng)準(zhǔn)許用于播放內(nèi)容的請(qǐng)求之后檢查20秒以便看看所述內(nèi)容是否仍然在播放。如果所述內(nèi)容仍然被播放,那么減少播放計(jì)數(shù),否則不減少。從而,愛麗絲可以從由預(yù)定服務(wù)所提供的任何內(nèi)容項(xiàng)中選擇,并且在她試訂期滿之前播放它們中的五個(gè)。
一旦愛麗絲試訂期滿,愛麗絲就決定購買完全的按月預(yù)訂,這使她能夠播放與她希望按月付費(fèi)一樣多的內(nèi)容項(xiàng)。愛麗絲使用她的PC來對(duì)預(yù)訂簽名,并且接收從她的帳戶節(jié)點(diǎn)2402到預(yù)訂節(jié)點(diǎn)2404的鏈路2410。所述鏈路包括用于表明所述鏈路只有效一個(gè)月的控制程序(例如,所述控制程序檢查狀態(tài)數(shù)據(jù)庫中的條目以便看看自從發(fā)出鏈路以來是否已經(jīng)過去一個(gè)月)。此鏈路2410被連同代理程序一起發(fā)送到愛麗絲的PC,所述代理程序可操作來初始化PC的DRM引擎的狀態(tài)數(shù)據(jù)庫中的適當(dāng)條目,所述條目表明發(fā)出鏈路的日期。當(dāng)愛麗絲從預(yù)訂服務(wù)下載內(nèi)容并且試圖播放它時(shí),她PC的DRM引擎確定到預(yù)訂節(jié)點(diǎn)的路徑由鏈路2405、2410組成。DRM引擎執(zhí)行在鏈路2405、2410中所包含的任何控制程序來確定鏈路是否有效。如果自從發(fā)出鏈路2410以來還沒有過去一個(gè)月,那么鏈路2410中的控制程序返回用于表明鏈路2410仍然有效的結(jié)果以及愛麗絲播放所述內(nèi)容的請(qǐng)求。如果愛麗絲試圖播放她先前在她免費(fèi)試用期間所獲得的內(nèi)容,那么她PC上的DRM引擎將執(zhí)行相同的分析并且準(zhǔn)許她的請(qǐng)求。由于與在試用期間所獲得的內(nèi)容相關(guān)聯(lián)的許可表明如果安全數(shù)據(jù)庫中的TrialState變量未被設(shè)置,所以唯一條件在于預(yù)訂節(jié)點(diǎn)必須是可到達(dá)的,現(xiàn)在愛麗絲可以再次訪問該內(nèi)容,這是因?yàn)樗鲱A(yù)訂節(jié)點(diǎn)此時(shí)可經(jīng)由鏈路2410而不是不再有效的鏈路2400來從愛麗絲的PC再次到達(dá)。從而,愛麗絲不必獲得內(nèi)容項(xiàng)的第二拷貝來替換她在免費(fèi)試用提供期間所獲得的拷貝。類似地,如果愛麗絲從她的朋友鮑勃獲得預(yù)訂內(nèi)容,所述鮑勃也是相同服務(wù)的訂戶,那么在此例子中愛麗絲也能夠播放該內(nèi)容,這是因?yàn)閮?nèi)容許可只是要求預(yù)訂節(jié)點(diǎn)是可到達(dá)的,而并不要求它可經(jīng)由鮑勃的PC或帳戶到達(dá)。
應(yīng)當(dāng)理解,以上例子只是旨在圖示可以由這里所描述的系統(tǒng)和方法啟用的一些功能,并且并不旨在建議必須依照上述精確的方式來實(shí)現(xiàn)所述預(yù)定。例如在其它實(shí)施例中,與預(yù)訂內(nèi)容相關(guān)聯(lián)的許可可以被綁定到用戶節(jié)點(diǎn)而不是預(yù)訂節(jié)點(diǎn),從而防止兩個(gè)訂戶共享內(nèi)容,像在上述例子中鮑勃和愛麗絲那樣。應(yīng)當(dāng)理解,可以對(duì)以上例子進(jìn)行許多其它變化。
下表提供了用于上述例子中的代理、鏈路和許可控制程序的一些說明性偽碼
再次參照?qǐng)D24,愛麗絲在她的移動(dòng)服務(wù)供應(yīng)商下還具有帳戶2420,只要她保持連接到網(wǎng)絡(luò),所述移動(dòng)服務(wù)供應(yīng)商就保持有效。不要求愛麗絲對(duì)預(yù)訂進(jìn)行特別付款,以換取她獲取發(fā)送鏈路;作為替代當(dāng)她連接到網(wǎng)絡(luò)時(shí)更新鏈路2424被自動(dòng)地發(fā)送到她的電話。這些鏈路使她能夠訪問由移動(dòng)服務(wù)供應(yīng)商所提供的任何內(nèi)容項(xiàng)或服務(wù),所述內(nèi)容項(xiàng)或服務(wù)具有只要求預(yù)訂節(jié)點(diǎn)2422是可到達(dá)的許可。如果愛麗絲改變移動(dòng)服務(wù)供應(yīng)商,那么一旦她的鏈路2424期滿,她就不能訪問先前獲取的內(nèi)容。
圖25示出了服務(wù)供應(yīng)商可以怎樣與家庭網(wǎng)絡(luò)域2500相交互的例子。在此例子中,設(shè)備被注冊(cè)到家庭網(wǎng)絡(luò)域,所述家庭網(wǎng)絡(luò)域強(qiáng)制實(shí)施允許多達(dá)5個(gè)設(shè)備在任一時(shí)刻屬于該域的策略。盡管史密斯家庭的電纜服務(wù)供應(yīng)商沒有提供用于設(shè)置家庭網(wǎng)絡(luò)域2500的域管理器軟件,不過電纜服務(wù)供應(yīng)商知道域管理器已經(jīng)由所證實(shí)的家庭網(wǎng)絡(luò)域管理器軟件的提供者實(shí)現(xiàn),從而信任域管理器軟件來按照打算那樣操作。如圖25所示,史密斯家庭把愛麗絲的電話和PC、卡羅爾的PVR和喬的PSP連接到域2500,導(dǎo)致從這些設(shè)備中的每個(gè)向域節(jié)點(diǎn)2500發(fā)出鏈路。當(dāng)例如在PVR接收新的內(nèi)容時(shí),諸如在‘551申請(qǐng)中所描述的那些發(fā)現(xiàn)服務(wù)使域中的其它設(shè)備能夠自動(dòng)地獲得內(nèi)容和任何必要的鏈路。從域節(jié)點(diǎn)2500向服務(wù)供應(yīng)商帳戶節(jié)點(diǎn)2502發(fā)出鏈路。一些電纜服務(wù)供應(yīng)商的內(nèi)容具有許可,所述許可的義務(wù)是必須禁止快進(jìn)和回倒使得廣告將被觀看。卡羅爾的PVR和PC、愛麗絲的PC能夠強(qiáng)制實(shí)施所述義務(wù),從而可以播放內(nèi)容。愛麗絲的移動(dòng)電話不能強(qiáng)制實(shí)施所述義務(wù)并且從而拒絕對(duì)內(nèi)容進(jìn)行訪問。
1.16.附加例子內(nèi)容和權(quán)利共享 如先前例子所圖示,這里所給出的系統(tǒng)和方法的實(shí)施例使得能夠依照自然方式來共享電子內(nèi)容。例如,這里所描述的系統(tǒng)和方法可以用來使消費(fèi)者能夠與他們的朋友和家庭成員共享娛樂內(nèi)容,和/或在所有他們的家庭設(shè)備上欣賞它,同時(shí)防止過寬的、未經(jīng)授權(quán)的分發(fā)。例如,可以使用自動(dòng)化對(duì)等發(fā)現(xiàn)和通知服務(wù),以致當(dāng)一個(gè)設(shè)備獲得內(nèi)容或相關(guān)聯(lián)權(quán)利時(shí),其它設(shè)備可以自動(dòng)地知道該內(nèi)容,由此提供可以自動(dòng)更新的虛擬分布式庫。例如在一個(gè)實(shí)施例中,如果一個(gè)用戶在一個(gè)位置在便攜式設(shè)備上獲得內(nèi)容或權(quán)利,然后回家,那么用戶的家庭設(shè)備可以自動(dòng)地發(fā)現(xiàn)并利用那些權(quán)利。相反地,如果用戶在他或她的家庭網(wǎng)絡(luò)的設(shè)備上獲得權(quán)利,那么他或她的便攜式設(shè)備可以發(fā)現(xiàn)并帶走該內(nèi)容以便在其它地方使用。這里所描述的系統(tǒng)和方法的優(yōu)選實(shí)施例可以用來創(chuàng)建服務(wù)和權(quán)利對(duì)象,所述服務(wù)和權(quán)利對(duì)象允許例如使用在‘551申請(qǐng)中所描述的服務(wù)發(fā)現(xiàn)和檢查技術(shù)來使上述方案完全地自動(dòng)化。例如,被注冊(cè)到特定域的設(shè)備可以彼此提供服務(wù)(例如,權(quán)利和內(nèi)容的共享),和/或可以調(diào)用遠(yuǎn)程服務(wù)以便于本地內(nèi)容共享。所描述的系統(tǒng)和方法能夠創(chuàng)建這樣的DRM架構(gòu),所述DRM架構(gòu)不集中在防止創(chuàng)建拷貝本身,而是被設(shè)計(jì)成用于利用網(wǎng)絡(luò)技術(shù)協(xié)調(diào)地工作以便允許共享內(nèi)容,同時(shí)防止消費(fèi)者變?yōu)閮?nèi)容的非法分發(fā)者。
這里所描述的DRM系統(tǒng)和方法的優(yōu)選實(shí)施例還能夠在沒有其它DRM系統(tǒng)的冗長(zhǎng)類型的權(quán)利表達(dá)特征的情況下確定權(quán)利。作為替代,優(yōu)選實(shí)施例使用可以上下文交互的一組精巧的(crafted)權(quán)利對(duì)象。這些對(duì)象描述了在諸如用戶、設(shè)備、內(nèi)容及其組之類的實(shí)體之間的關(guān)系和控制。例如,這種上下文交互可以允許設(shè)備確定可以播放給定內(nèi)容,這是因?yàn)?a)內(nèi)容從用戶目前預(yù)訂的合法內(nèi)容服務(wù)獲得,(b)所述用戶是特定家庭組的一部分,并且(c)所述設(shè)備與此特定家庭組相關(guān)聯(lián)。存在諸如在此例子中所描述的那些多種類型的關(guān)系,用戶可以直觀地理解所述關(guān)系,并且這里所描述的系統(tǒng)和方法的優(yōu)選實(shí)施例能夠創(chuàng)建自然理解這種關(guān)系的系統(tǒng)。在實(shí)體之間的關(guān)系可以隨時(shí)間創(chuàng)建、銷毀和改變,并且優(yōu)選實(shí)施例提供了用于在動(dòng)態(tài)聯(lián)網(wǎng)環(huán)境中——消費(fèi)者可以自然理解的環(huán)境——確定權(quán)利的自然方式。盡管如此,如果內(nèi)容部署者想要使用更傳統(tǒng)的權(quán)利表達(dá)方式,那么優(yōu)選實(shí)施例也可以適應(yīng)該方式。例如,可以使用工具來把傳統(tǒng)的權(quán)利表達(dá)轉(zhuǎn)換為諸如上述的那些對(duì)象組,和/或可以實(shí)現(xiàn)用于直接對(duì)這種權(quán)利表達(dá)操作的DRM引擎。作為選擇,在一些實(shí)施例中,設(shè)備不必理解這種傳統(tǒng)的權(quán)利表達(dá),并且不受它們的局限性的約束。
這里所描述系統(tǒng)和方法的優(yōu)選實(shí)施例還具有媒體服務(wù)的十分一般的概念。廣播服務(wù)和因特網(wǎng)下載或預(yù)訂服務(wù)是媒體服務(wù)的例子。與這些服務(wù)相關(guān)聯(lián)的限制可以使內(nèi)容難于共享。利用這里所描述的系統(tǒng)和方法的優(yōu)選實(shí)施例,內(nèi)容可以在廣播、寬帶和移動(dòng)服務(wù)上獲得,并且在包括便攜式設(shè)備的家里的一組網(wǎng)絡(luò)設(shè)備上共享。作為選擇或另外,可以由單個(gè)設(shè)備經(jīng)由無線連接依照對(duì)等方式來提供服務(wù)。例如,具有新一代WiFi功能的手機(jī)可以向其它設(shè)備提供內(nèi)容范疇服務(wù)。這種服務(wù)允許其它設(shè)備‘看看’什么內(nèi)容可用來與所述設(shè)備共享。所述服務(wù)提供了能夠用來確定權(quán)利以使得可以接受或容易地消除任何限制的信息。
這里所描述的系統(tǒng)和方法的優(yōu)選實(shí)施例不限于一個(gè)服務(wù)或一個(gè)平臺(tái)。如上所述,優(yōu)選實(shí)施例能夠與包括‘個(gè)人服務(wù)’的很多服務(wù)一起工作。隨著家庭和個(gè)人網(wǎng)絡(luò)變得更加普遍,這變得越來越重要。例如,數(shù)字照相機(jī)現(xiàn)在可與WiFi連接一起使用,使得經(jīng)由網(wǎng)絡(luò)共享照片非常方便。能夠使照片共享自動(dòng)化很好,但是照相機(jī)因?yàn)楸凰奶帞y帶而遇到許多不同的網(wǎng)絡(luò)。自動(dòng)化共享是便利的,但是個(gè)人照片當(dāng)然是個(gè)人的。這里所描述的系統(tǒng)和方法的實(shí)施例使得在家庭內(nèi)在家庭設(shè)備上共享照片很容易,而不與碰巧在網(wǎng)絡(luò)上遇到所述照相機(jī)的任意設(shè)備共享。通常,隨著更多設(shè)備變得可聯(lián)網(wǎng),管理在那些設(shè)備上的所有內(nèi)容的權(quán)利變得越來越重要。盡管聯(lián)網(wǎng)目的在于允許聯(lián)網(wǎng)的設(shè)備上的信息被共享,不過網(wǎng)絡(luò)會(huì)彼此重疊和合并。網(wǎng)絡(luò)使內(nèi)容能夠容易地被共享,但是該內(nèi)容不應(yīng)當(dāng)被任意地共享。從而,希望具有這樣的DRM系統(tǒng),其能夠覺察到網(wǎng)絡(luò)并且可以使用由內(nèi)容、用戶、網(wǎng)絡(luò)和設(shè)備特征所提供的上下文來確定是否應(yīng)當(dāng)共享并且怎樣來共享內(nèi)容。這里所描述的系統(tǒng)和方法的優(yōu)選實(shí)施例能夠?qū)崿F(xiàn)這種方法。
6.用于內(nèi)容消費(fèi)和封裝的參考體系結(jié)構(gòu) 下面描述了用于消費(fèi)受DRM保護(hù)的內(nèi)容的消費(fèi)應(yīng)用(例如,媒體播放器)和用于封裝目標(biāo)為消費(fèi)應(yīng)用的內(nèi)容的封裝應(yīng)用(例如,位于服務(wù)器上的應(yīng)用)的參考體系結(jié)構(gòu)。
1.17.客戶端體系結(jié)構(gòu) 下面提供了DRM引擎的說明性實(shí)施例可以為用于消費(fèi)內(nèi)容的主機(jī)應(yīng)用而執(zhí)行的功能的例子。
1.17.1.主機(jī)應(yīng)用到DRM引擎的接口 盡管在優(yōu)選實(shí)施例中DRM引擎并不要求API,不過下面是在一個(gè)說明性實(shí)施例中由說明性DRM引擎(被稱為‘章魚’DRM引擎)向主機(jī)應(yīng)用所提供的接口類型的高級(jí)描述 Octopus::CreateSession(hostContextObj ect)→Session—給定主機(jī)應(yīng)用上下文,來創(chuàng)建會(huì)話。上下文對(duì)象由章魚DRM引擎用來向應(yīng)用進(jìn)行回調(diào)。
Session::ProcessObj ect(drmObject)—此函數(shù)當(dāng)主機(jī)應(yīng)用遇到媒體文件中的某些類型的對(duì)象時(shí)應(yīng)當(dāng)被主機(jī)應(yīng)用調(diào)用,所述媒體文件可以被標(biāo)識(shí)為屬于DRM子系統(tǒng)。這種對(duì)象包括內(nèi)容控制程序、成員資格令牌等。那些對(duì)象的語法和語義對(duì)主機(jī)應(yīng)用來說是不透明的。
Session::OpenContent(contentReference)→Content——主機(jī)應(yīng)用當(dāng)需要與多媒體內(nèi)容文件相交互時(shí)調(diào)用此函數(shù)。DRM引擎返回內(nèi)容對(duì)象,所述內(nèi)容對(duì)象隨后可以用來獲取關(guān)于所述內(nèi)容的DRM信息并且與之相交互。
Content::GetDrmInfo()—返回關(guān)于內(nèi)容的DRM元數(shù)據(jù),所述DRM元數(shù)據(jù)另外在所述文件的常規(guī)元數(shù)據(jù)中是不可得的。Content::CreateAction(actionInfo)→Action—主機(jī)應(yīng)用當(dāng)想要與內(nèi)容對(duì)象相交互時(shí)調(diào)用此函數(shù)。actionInfo參數(shù)指定應(yīng)用需要執(zhí)行什么類型的動(dòng)作(例如,播放)以及如果必要的話(任何相關(guān)聯(lián)的參數(shù))。所述函數(shù)返回動(dòng)作對(duì)象,所述動(dòng)作對(duì)象然后可以用來執(zhí)行所述動(dòng)作并且獲取內(nèi)容密鑰。
Action::GetKeyInfo()—返回為解密子系統(tǒng)解密所述內(nèi)容所必須的信息。
Action::Check()—檢查DRM子系統(tǒng)是否授權(quán)執(zhí)行此動(dòng)作(即Action::Perform()是否會(huì)成功)。
Action::Perform()—執(zhí)行所述動(dòng)作,并且按照管理支配此動(dòng)作的規(guī)則所指定來執(zhí)行任何結(jié)果(具有它們的副作用)。
1.17.2.DRM引擎到主機(jī)服務(wù)的接口 下面是由DRM引擎的說明性實(shí)施例從主機(jī)應(yīng)用的說明性實(shí)施例所需要的主機(jī)服務(wù)接口類型的例子。
HostContext::GetFileSystem(type)→FileSystem—返回DRM子系統(tǒng)具有獨(dú)占訪問權(quán)的虛擬FileSystem(文件系統(tǒng))對(duì)象。此虛擬FileSystem用來存儲(chǔ)DRM狀態(tài)信息。此FileSystem內(nèi)的數(shù)據(jù)應(yīng)當(dāng)只能由DRM子系統(tǒng)讀取和寫入。
HostContext::GetCurrentTime()—返回由主機(jī)系統(tǒng)維護(hù)的當(dāng)前日期/時(shí)間。
HostContext::GetIdentity()—返回此主機(jī)的唯一ID。
HostContext::ProcessObject(dataObject)—向主機(jī)服務(wù)返回?cái)?shù)據(jù)對(duì)象,所述數(shù)據(jù)對(duì)象可能已經(jīng)被嵌入在DRM對(duì)象內(nèi),但是DRM子系統(tǒng)已經(jīng)被標(biāo)識(shí)為由主機(jī)(例如,證書)管理。
HostContext::VerifySignature(signatureInfo)—檢查數(shù)據(jù)對(duì)象上的數(shù)字簽名的有效性。在一個(gè)實(shí)施例中,signatureInfo對(duì)象包含等效于在XMLSig元項(xiàng)中所找到信息的信息。主機(jī)服務(wù)負(fù)責(zé)管理為驗(yàn)證所述簽名所必需的密鑰和密鑰證書。
HostContext::CreateCipher(cipherType,keyInfo)→Cipher—?jiǎng)?chuàng)建DRM子系統(tǒng)可以用來加密并解密數(shù)據(jù)的密碼對(duì)象。最小的一組密碼類型將被定義,并且每種類型定義有用于描述由密碼實(shí)現(xiàn)方式所要求的密鑰信息的格式。
Cipher::Encrypt(data) Cipher::Decrypt(data) HostContext::CreateDigester(digesterType)→Digester—?jiǎng)?chuàng)建所述DRM子系統(tǒng)可以用來對(duì)一些數(shù)據(jù)計(jì)算安全散列的摘要對(duì)象。在一個(gè)實(shí)施例中,可以定義最小的一組摘要類型。
Digester::Update(data) Digester::GetDigest() 1.17.3.UML順序圖 圖26圖示了在先前部分中所闡明的說明性API的使用以及在示例性實(shí)施例中在主機(jī)應(yīng)用和DRM客戶端引擎之間進(jìn)行的交互。
1.18.封裝器參考體系結(jié)構(gòu) 下面提供了封裝引擎可以為用于封裝的內(nèi)容的主機(jī)應(yīng)用所執(zhí)行的功能的例子。在實(shí)踐中,封裝應(yīng)用可以特別集中于封裝,或者可以是在用戶系統(tǒng)操作的通用應(yīng)用的一部分,所述通用應(yīng)用也訪問受保護(hù)的內(nèi)容(在本地或者例如在網(wǎng)絡(luò)上的其它地方封裝的)。
1.18.1.主機(jī)應(yīng)用到封裝引擎的接口 本部分提供了在主機(jī)應(yīng)用和結(jié)合被稱為“章魚”的參考DRM引擎所使用的封裝引擎之間的說明性API的高級(jí)描述。
Octopus::CreateSession(hostContextObject)→Session。給定主機(jī)應(yīng)用上下文來創(chuàng)建會(huì)話。由此函數(shù)所返回的上下文對(duì)象由封裝引擎用來向應(yīng)用進(jìn)行回調(diào)。
Session::CreateContent(contentReferences[])→Content。主機(jī)應(yīng)用調(diào)用此函數(shù)以便創(chuàng)建將在隨后的步驟中與許可對(duì)象相關(guān)聯(lián)的內(nèi)容對(duì)象。在contentReferences(內(nèi)容引用)數(shù)組中具有一個(gè)以上內(nèi)容引用意味著這些在一捆中被綁定在一起(例如,一個(gè)音頻和一個(gè)視頻曲目)而且所發(fā)出的許可應(yīng)當(dāng)目標(biāo)在于這些引用,作為一個(gè)不可分的組。
Content::SetDrmInfo(drmInfo)。drmInfo參數(shù)指定將發(fā)出的許可的元數(shù)據(jù)。drmInfo充當(dāng)用于把許可轉(zhuǎn)換為用于虛擬機(jī)的字節(jié)碼的指南。
Content::GetDRMObjects(format)→drmObjects。當(dāng)主機(jī)應(yīng)用準(zhǔn)備獲取封裝器引擎所創(chuàng)建的drmObjects時(shí),此函數(shù)被調(diào)用。格式參數(shù)表明這些對(duì)象所希望的格式(例如,XML或二進(jìn)制原子)。Content::GetKeys()→keys[]。此函數(shù)當(dāng)主機(jī)封裝應(yīng)用需要用于加密內(nèi)容的密鑰時(shí)被主機(jī)封裝應(yīng)用調(diào)用。在一個(gè)實(shí)施例中,每個(gè)內(nèi)容引用存在一個(gè)密鑰。
1.18.2.封裝引擎到主機(jī)服務(wù)的接口 下面是在一個(gè)實(shí)施例中說明性封裝引擎需要主機(jī)應(yīng)用提供的接口類型的例子。
HostContext::GetFileSystem(type)→FileSystem。返回DRM子系統(tǒng)具有獨(dú)占訪問權(quán)的虛擬FileSystem對(duì)象。此虛擬FileSystem可以用來存儲(chǔ)DRM狀態(tài)信息。此FileSystem內(nèi)的數(shù)據(jù)應(yīng)當(dāng)只能由DRM子系統(tǒng)讀取和寫入。
HostContext::GetCurrentTime()→Time。返回由主機(jī)系統(tǒng)維護(hù)的當(dāng)前日期/時(shí)間。
HostContext::GetIdentity()→ID。返回此主機(jī)的唯一ID。
HostContext::PerformSignature(signatureInfo,data)。由封裝引擎所創(chuàng)建的一些DRM對(duì)象必須被信任。由主機(jī)所提供的此服務(wù)用來為所指定的對(duì)象簽名。
HostContext::CreateCipher(cipherType,keyInfo)→Cipher。創(chuàng)建封裝引擎可以用來加密和解密數(shù)據(jù)的密碼對(duì)象(能夠加密和解密數(shù)據(jù)的對(duì)象)。在一個(gè)實(shí)施例中,密碼對(duì)象用來加密在內(nèi)容密鑰對(duì)象中的內(nèi)容密鑰數(shù)據(jù)。
Cipher::Encrypt(data)。加密數(shù)據(jù)。
Cipher::Decrypt(data)。解密數(shù)據(jù)。
HostContext::CreateDigester(digesterType)→Digester。創(chuàng)建可以由封裝引擎用來對(duì)一些數(shù)據(jù)計(jì)算散列的摘要對(duì)象。
Digester::Update(data)。把數(shù)據(jù)饋送到摘要對(duì)象。
Digester::GetDigest()。計(jì)算摘要。
HostContext::GenerateRandomNumber()。產(chǎn)生可以用于產(chǎn)生密鑰的隨機(jī)數(shù)。
圖27是用于示出上面所闡明的說明性API的使用以及在一個(gè)說明性實(shí)施例中在主機(jī)應(yīng)用和封裝引擎之間進(jìn)行的交互的例子的UML圖。
7.對(duì)象 此部分提供了關(guān)于DRM對(duì)象的更多信息,所述DRM對(duì)象充當(dāng)DRM引擎的說明性實(shí)現(xiàn)方式的構(gòu)建塊。首先,給出了由DRM引擎用于內(nèi)容保護(hù)和管理支配的對(duì)象類型的相對(duì)高級(jí)的概觀。接下來,它們表達(dá)的這些對(duì)象和信息的更詳細(xì)描述連同在一個(gè)說明性實(shí)施例中所使用的一些示例性數(shù)據(jù)結(jié)構(gòu)一起被提供了。
1.19.內(nèi)容保護(hù)和管理支配DRM對(duì)象 如先前結(jié)合圖6所描述,內(nèi)容管理支配對(duì)象(有時(shí)與節(jié)點(diǎn)和鏈路對(duì)象一起被稱作為‘DRM對(duì)象’)用來把使用規(guī)則和條件與受保護(hù)的內(nèi)容相關(guān)聯(lián)。這些對(duì)象一起形成了許可。
如圖6所示,使用密鑰來加密由內(nèi)容對(duì)象614所表示的數(shù)據(jù)。解密所述內(nèi)容所需要的該密鑰由內(nèi)容密鑰對(duì)象602表示,并且在所述內(nèi)容和用于加密該內(nèi)容的密鑰之間的綁定由保護(hù)器對(duì)象604來表示。用于管理支配對(duì)解密密鑰的使用的規(guī)則由控制對(duì)象608來表示,并且在內(nèi)容密鑰602和控制對(duì)象608之間的綁定由控制器對(duì)象606來表示。在一個(gè)實(shí)施例中,受信系統(tǒng)只在由控制對(duì)象608中的字節(jié)代碼所表達(dá)的規(guī)則的管理支配下利用內(nèi)容解密密鑰。圖28A是諸如在圖6中所示出的該許可的更詳細(xì)圖解,并且圖示了在一個(gè)實(shí)施例中所使用的簽名方案。
1.19.1.公用元項(xiàng) 在一個(gè)實(shí)施例中,對(duì)象共享通用的基本特性它們都可以具有ID、屬性列表和擴(kuò)展列表。
1.19.1.1.ID 由其它對(duì)象所引用的對(duì)象具有唯一的ID。在一個(gè)實(shí)施例中,ID簡(jiǎn)單地是URI,并且按照慣例,那些URI為URN。
1.19.1.2.屬性 屬性是有類型的值。屬性可以是有名或無名的。有名屬性的名稱是簡(jiǎn)單的字符串或URI。屬性值具有簡(jiǎn)單類型(字符串,整數(shù)或字節(jié)數(shù)組)或復(fù)合類型(列表和數(shù)組)。類型‘列表’的屬性包含有名屬性的無序列表。類型‘?dāng)?shù)組’的屬性包含無名屬性的有序數(shù)組。
對(duì)象的‘屬性’字段是有名屬性的無序集合(可能是空的)。
1.19.1.3.擴(kuò)展 擴(kuò)展是可以被添加到對(duì)象以便攜帶可選的或強(qiáng)制性的額外數(shù)據(jù)的元項(xiàng)。擴(kuò)展是有類型的,并且也具有唯一的ID。擴(kuò)展可以是內(nèi)部或外部的。
1.19.1.3.1.內(nèi)部擴(kuò)展 內(nèi)部擴(kuò)展包含在它們擴(kuò)展的對(duì)象中。它們具有‘關(guān)鍵’標(biāo)志,用于表明是否要求所述擴(kuò)展的特定擴(kuò)展數(shù)據(jù)類型為使用對(duì)象的實(shí)現(xiàn)方式所知。在一個(gè)實(shí)施例中,如果實(shí)現(xiàn)方式遇到具有關(guān)鍵擴(kuò)展的對(duì)象,其中所述關(guān)鍵擴(kuò)展具有它并不理解的數(shù)據(jù)類型,那么所述實(shí)現(xiàn)方式必須拒絕整個(gè)對(duì)象。
在一個(gè)實(shí)施例中,內(nèi)部擴(kuò)展的ID需要是本地唯一的對(duì)象無法包含具有相同ID的兩個(gè)擴(kuò)展,但是兩個(gè)不同的對(duì)象都可以包含具有與另一對(duì)象的擴(kuò)展相同的ID的擴(kuò)展。
對(duì)象的‘?dāng)U展’字段是有內(nèi)部擴(kuò)展的無序集合(可能是空的)。
1.19.1.3.2.外部擴(kuò)展 外部擴(kuò)展并不包含在它們擴(kuò)展的對(duì)象中。它們獨(dú)立于對(duì)象出現(xiàn),并且具有‘主題’字段,所述‘主題’字段包含它們擴(kuò)展的對(duì)象的ID。在一個(gè)實(shí)施例中,需要外部擴(kuò)展的ID是全局唯一的。
1.19.2.內(nèi)容 在一個(gè)實(shí)施例中,內(nèi)容對(duì)象是‘外部’對(duì)象。其格式和存儲(chǔ)不受DRM引擎的控制,但是受主機(jī)應(yīng)用的內(nèi)容管理子系統(tǒng)的控制(例如,所述內(nèi)容可以是MP4電影文件、MP3音樂曲目等)。在一個(gè)實(shí)施例中,內(nèi)容的格式需要向把ID與內(nèi)容有效載荷數(shù)據(jù)相關(guān)聯(lián)提供支持。依照格式相關(guān)的方式來加密內(nèi)容有效載荷(一般利用對(duì)稱密碼,諸如AES)。
1.19.3.內(nèi)容密鑰 內(nèi)容密鑰對(duì)象表示唯一的加密密鑰,并且把ID與之相關(guān)聯(lián)。ID的目的在于使保護(hù)器對(duì)象和控制器對(duì)象能夠引用內(nèi)容密鑰對(duì)象。在內(nèi)容密鑰對(duì)象中所封裝的實(shí)際密鑰數(shù)據(jù)自身被加密,使得它只可以由被授權(quán)來解密所述內(nèi)容的接收者讀取。內(nèi)容密鑰對(duì)象指定使用哪個(gè)密碼系統(tǒng)來加密密鑰數(shù)據(jù)。用于保護(hù)內(nèi)容密鑰數(shù)據(jù)的密碼系統(tǒng)被稱作密鑰分發(fā)系統(tǒng)。可以使用不同的密鑰分發(fā)系統(tǒng)。密鑰分發(fā)系統(tǒng)的例子是上述Scuba密鑰分發(fā)系統(tǒng)。
1.19.4.保護(hù)器 保護(hù)器對(duì)象包含可以找出使用哪個(gè)密鑰來加密內(nèi)容對(duì)象的數(shù)據(jù)的信息。它還包含關(guān)于使用哪個(gè)加密算法來加密該數(shù)據(jù)的信息。在一個(gè)實(shí)施例中,保護(hù)器對(duì)象包含作為內(nèi)容對(duì)象引用的一個(gè)或多個(gè)ID以及正好包含表示用于加密數(shù)據(jù)的密鑰的內(nèi)容密鑰對(duì)象引用的一個(gè)ID。如果保護(hù)器指向一個(gè)以上的內(nèi)容對(duì)象,那么所有那些內(nèi)容對(duì)象表示已經(jīng)使用相同的加密算法和相同的密鑰而加密的數(shù)據(jù)。在一個(gè)實(shí)施例中,除非所使用的密碼系統(tǒng)允許一種對(duì)不同的數(shù)據(jù)項(xiàng)使用相同密鑰的安全方式,否則并不建議保護(hù)器對(duì)象指向一個(gè)以上的內(nèi)容對(duì)象。
1.19.5.控制 控制對(duì)象包含用于允許DRM引擎判定當(dāng)對(duì)內(nèi)容的某些動(dòng)作被主機(jī)應(yīng)用請(qǐng)求時(shí)所述動(dòng)作是否應(yīng)當(dāng)被允許的信息。在一個(gè)實(shí)施例中,用于管理支配對(duì)內(nèi)容密鑰使用的規(guī)則在控制對(duì)象中被編碼為供虛擬機(jī)執(zhí)行的字節(jié)代碼??刂茖?duì)象還具有唯一的ID使得它可以由控制器對(duì)象引用。在一個(gè)實(shí)施例中,控制對(duì)象被簽名,使得DRM引擎可以驗(yàn)證所述控制字節(jié)代碼在用來判定之前是有效的并被信任。選擇性地,還可以通過驗(yàn)證在控制器對(duì)象中所包括的安全散列來導(dǎo)出控制對(duì)象的有效性。
1.19.6.控制器 控制器對(duì)象包含用于允許DRM引擎找出哪個(gè)控制來管理支配對(duì)由內(nèi)容密鑰對(duì)象所表示的一個(gè)或多個(gè)密鑰的使用的信息??刂破鲗?duì)象包含用于把它綁定到它引用的控制對(duì)象和內(nèi)容密鑰對(duì)象的信息。在一個(gè)實(shí)施例中,控制器對(duì)象被簽名(例如,被具有用于允許它簽名控制器對(duì)象的證書的封裝應(yīng)用簽名),使得可以確立在內(nèi)容密鑰和管理支配它的控制對(duì)象之間的綁定的有效性以及在內(nèi)容密鑰ID和實(shí)際密鑰數(shù)據(jù)之間的綁定的有效性??刂破鲗?duì)象的簽名可以是公鑰簽名或?qū)ΨQ密鑰簽名或兩者的結(jié)合。當(dāng)在控制器對(duì)象中包括由控制器對(duì)象所引用的控制對(duì)象摘要時(shí),還可以在不必獨(dú)立地驗(yàn)證控制對(duì)象的簽名的情況下推導(dǎo)控制對(duì)象的有效性。
1.19.6.1.對(duì)稱密鑰簽名 在一個(gè)實(shí)施例中,這是控制器對(duì)象的優(yōu)選類型簽名,并且通過計(jì)算控制器對(duì)象的消息認(rèn)證代碼(Message Authentication Code MAC)來實(shí)現(xiàn),利用與由相應(yīng)的內(nèi)容密鑰對(duì)象所表示的密鑰相同的密鑰來加密鑰。在一個(gè)實(shí)施例中,用于此MAC的規(guī)范方法是利用與為在相同部署中所使用的PKI簽名算法所選擇的相同散列算法來使用HMAC。
1.19.6.2.公鑰簽名 當(dāng)需要知道控制器對(duì)象的簽名人身份時(shí)使用此類簽名。此類簽名利用公鑰簽名算法來實(shí)現(xiàn),利用斷言此對(duì)象有效性的委托人(principal)的私鑰來簽名。在一個(gè)實(shí)施例中,當(dāng)使用此類簽名時(shí),對(duì)稱密鑰簽名也存在,并且對(duì)控制器對(duì)象以及公鑰簽名進(jìn)行簽名,使得可以保證利用其私鑰簽名的委托人也知道在內(nèi)容密鑰對(duì)象中所攜帶的內(nèi)容密鑰的實(shí)際值。
1.20.身份和密鑰管理DRM對(duì)象 如前所述,節(jié)點(diǎn)對(duì)象表示DRM簡(jiǎn)檔中的實(shí)體,并且不使用隱式的或顯式的語義來定義節(jié)點(diǎn)對(duì)象表示什么。系統(tǒng)的給定部署(DRM簡(jiǎn)檔)定義了存在什么類型的委托人,并且不同的節(jié)點(diǎn)對(duì)象表示什么角色和身份。典型情況下使用節(jié)點(diǎn)對(duì)象的屬性來表達(dá)該語義信息。
鏈路對(duì)象表示在節(jié)點(diǎn)之間的關(guān)系。選擇性地,鏈路對(duì)象還可以包含一些密碼數(shù)據(jù),所述密碼數(shù)據(jù)允許所述鏈路用于內(nèi)容密鑰推導(dǎo)。僅僅對(duì)于節(jié)點(diǎn)來說,在一個(gè)實(shí)施例中,不使用隱式的或顯式的語義來定義鏈路關(guān)系意指什么。取決于鏈路的來自和去往節(jié)點(diǎn)在給定DRM簡(jiǎn)檔中表示什么,鏈路關(guān)系的意義可以表達(dá)成員資格、所有權(quán)、關(guān)聯(lián)性和/或許多其它類型的關(guān)系。在典型的DRM簡(jiǎn)檔中,一些節(jié)點(diǎn)對(duì)象可以表示用戶,其它節(jié)點(diǎn)可以表示設(shè)備,并且其它節(jié)點(diǎn)可以表示用戶組或授權(quán)域(authorized domains AD)。在這種情境中,在設(shè)備和用戶之間的鏈路可以表示所有權(quán)關(guān)系,并且在用戶和用戶組或授權(quán)域之間的鏈路可以表示成員資格關(guān)系。圖28B圖示了在一個(gè)示例性實(shí)施例中在節(jié)點(diǎn)和鏈路之間的結(jié)構(gòu)和相互關(guān)系。
1.20.1.節(jié)點(diǎn) 節(jié)點(diǎn)對(duì)象表示系統(tǒng)中的實(shí)體。節(jié)點(diǎn)對(duì)象的屬性定義了節(jié)點(diǎn)對(duì)象所表示的某些方面,諸如在DRM簡(jiǎn)檔情境中由節(jié)點(diǎn)對(duì)象所表示的角色或身份。節(jié)點(diǎn)對(duì)象還可以具有用于把機(jī)密信息的目標(biāo)定為子系統(tǒng)的機(jī)密非對(duì)稱密鑰對(duì),所述子系統(tǒng)有權(quán)訪問所述節(jié)點(diǎn)對(duì)象的機(jī)密部分(典型情況下,由節(jié)點(diǎn)所表示的實(shí)體或負(fù)責(zé)管理該節(jié)點(diǎn)的某個(gè)實(shí)體)??梢岳霉?jié)點(diǎn)的機(jī)密公鑰來加密目標(biāo)在該節(jié)點(diǎn)的機(jī)密信息。節(jié)點(diǎn)對(duì)象還可以具有共享非對(duì)稱密鑰對(duì),并且共享對(duì)稱密鑰當(dāng)系統(tǒng)使用內(nèi)容密鑰推導(dǎo)系統(tǒng)來用于內(nèi)容密鑰分發(fā)時(shí)能夠被結(jié)合鏈路對(duì)象使用,所述內(nèi)容密鑰推導(dǎo)系統(tǒng)諸如在此的其它地方所描述。在優(yōu)選實(shí)施例中,只有需要被鏈路或控制對(duì)象引用或者接收密碼目標(biāo)的信息的實(shí)體需要具有相應(yīng)的節(jié)點(diǎn)對(duì)象。
1.20.2.鏈路 鏈路對(duì)象是簽名的聲明,在其頂點(diǎn)為節(jié)點(diǎn)對(duì)象的圖中存在有向邊。對(duì)于一組給定節(jié)點(diǎn)和鏈路來說,我們認(rèn)為如果在圖中的節(jié)點(diǎn)X頂點(diǎn)和節(jié)點(diǎn)Y頂點(diǎn)之間存在有向路徑,那么在節(jié)點(diǎn)X和節(jié)點(diǎn)Y之間存在路徑。當(dāng)在節(jié)點(diǎn)X和節(jié)點(diǎn)Y之間存在路徑時(shí),我們認(rèn)為節(jié)點(diǎn)Y可從節(jié)點(diǎn)X到達(dá)。使用由鏈路對(duì)象所表示的聲明來表達(dá)哪些節(jié)點(diǎn)可從其它節(jié)點(diǎn)到達(dá)。用于管理支配內(nèi)容對(duì)象的控制可以在它們?cè)试S執(zhí)行動(dòng)作之前檢查某些節(jié)點(diǎn)可從與用于執(zhí)行所述動(dòng)作的實(shí)體相關(guān)聯(lián)的節(jié)點(diǎn)到達(dá)。例如,如果節(jié)點(diǎn)D表示想要對(duì)內(nèi)容對(duì)象執(zhí)行‘播放’動(dòng)作的設(shè)備,那么用于管理支配所述內(nèi)容對(duì)象的控制可以測(cè)試用于表示某一用戶的某一節(jié)點(diǎn)U是否可從節(jié)點(diǎn)D到達(dá)。為了確定節(jié)點(diǎn)U是否是可到達(dá)的,DRM引擎可以檢查是否存在可以在節(jié)點(diǎn)D和節(jié)點(diǎn)U之間建立路徑的一組鏈路對(duì)象。
在一個(gè)實(shí)施例中,DRM引擎在它使用鏈路對(duì)象來判定在節(jié)點(diǎn)圖中存在路徑之前驗(yàn)證所述鏈路對(duì)象。取決于用于對(duì)鏈路對(duì)象進(jìn)行簽名的證書系統(tǒng)(例如,x509v3)的特定特征,鏈路對(duì)象可以被給予有限的使用期、被撤銷等。在一個(gè)實(shí)施例中,用于管理支配哪些密鑰可以對(duì)鏈路對(duì)象簽名、可以創(chuàng)建哪些鏈路對(duì)象以及鏈路對(duì)象的使用期的策略并不直接由DRM引擎來處理。作為替代,那些策略平衡節(jié)點(diǎn)的屬性信息。為了使強(qiáng)制實(shí)施某些策略的任務(wù)便于進(jìn)行,在一個(gè)實(shí)施例中,提供了一種用于利用附加約束檢查來擴(kuò)展標(biāo)準(zhǔn)的證書格式的方式。這些擴(kuò)展使得可以表達(dá)對(duì)用于為鏈路簽名的密鑰的證書的有效性約束,以致可以在鏈路被認(rèn)為有效之前檢查諸如所述鏈路連接什么類型節(jié)點(diǎn)的約束以及其它屬性。
在一個(gè)實(shí)施例中,鏈路對(duì)象可以包含用來約束鏈路有效性的控制對(duì)象。另外,在一個(gè)實(shí)施例中,鏈路對(duì)象可以包含密碼密鑰推導(dǎo)數(shù)據(jù),密碼密鑰推導(dǎo)數(shù)據(jù)用于向用戶提供用于密鑰分發(fā)的共享密鑰。該密碼數(shù)據(jù)除元數(shù)據(jù)之外包含“來自”節(jié)點(diǎn)的私有和/或?qū)ΨQ共享密鑰,其利用“去往”節(jié)點(diǎn)的共享公鑰和/或共享對(duì)稱密鑰來加密。
1.21.數(shù)據(jù)結(jié)構(gòu) 以下段落更詳細(xì)地描述了上述對(duì)象的說明性對(duì)象模型,用于定義在一個(gè)說明性實(shí)施例中每種對(duì)象所具有的字段。使用相對(duì)簡(jiǎn)單的對(duì)象描述語法來描述數(shù)據(jù)結(jié)構(gòu)。每種對(duì)象類型由可以擴(kuò)展父的類來定義類(這是“是-(is-a)”關(guān)系)。類描述是采用簡(jiǎn)單的抽象類型‘string’(字符串)、‘int’(整數(shù)值)、‘byte’(8位值)和‘boolean’(真或假)的術(shù)語,但是對(duì)于那些數(shù)據(jù)類型或者包含那些類型的復(fù)合結(jié)構(gòu)不定義任何特定編碼。編碼或表示對(duì)象的方式可以根據(jù)引擎的實(shí)現(xiàn)方式改變。在實(shí)踐中,DRM引擎的使用的給定簡(jiǎn)檔可以指定怎樣表示字段(例如,使用XML模式)。
在一個(gè)說明性實(shí)施例中,使用以下符號(hào)
1.21.1.公用結(jié)構(gòu) 在一個(gè)說明性實(shí)施例中,使用以下公用結(jié)構(gòu) abstract class Octobject{{string id;}Attribute[]attributes;InternalExtension[]extensions; } class Transform{ string algorithm; } class Digest{ Transform[]transforms; string algorithm; byte[]value; } class Reference{ string id; {Digest digest;} } 1.21.1.1.屬性 在一個(gè)實(shí)施例中,存在四種屬性IntegerAttribute、StringAttribute、ByteArrayAttribute和ListAttribute,每種屬性具有名字和類型。
1.21.1.2.擴(kuò)展 在所討論的說明性實(shí)施例中,存在兩種類型的擴(kuò)展在Octobject內(nèi)攜帶的內(nèi)部擴(kuò)展和在Octobject外攜帶的外部擴(kuò)展。
在一些實(shí)施例中,即便給定實(shí)現(xiàn)方式并不理解特定類型的ExtensionData,也能夠驗(yàn)證對(duì)象的簽名,這將是重要的。從而在一個(gè)實(shí)施例中,添加與dataDigest字段的間接級(jí)別。如果ExtensionData的規(guī)范要求所述數(shù)據(jù)是特定對(duì)象的上下文內(nèi)簽名的一部分,那么dataDigest字段將存在。然后,理解此ExtensionData并且因此能夠計(jì)算其規(guī)范表示的實(shí)現(xiàn)方式可以驗(yàn)證所述摘要。如果在這種實(shí)施例中此ExtensionData的規(guī)范要求所述數(shù)據(jù)不是簽名的一部分,那么dataDigest字段將不存在。
1.21.2.節(jié)點(diǎn)對(duì)象
1.21.3.鏈路對(duì)象
1.21.4.控制對(duì)象
1.21.5.內(nèi)容密鑰對(duì)象
在一個(gè)實(shí)施例中,每個(gè)密鑰具有唯一的id、格式、使用(可以為空)和數(shù)據(jù)?!褂谩侄稳绻粸榭盏脑?,那么指定所述密鑰可以用于做什么。對(duì)于正常內(nèi)容密鑰來說,此字段為空。在使用諸如上述的密鑰分發(fā)方案的實(shí)施例中,此字段可以指定這是共享密鑰還是機(jī)密密鑰?!袷健侄沃付ā?dāng)?shù)據(jù)’字段的格式(諸如對(duì)于對(duì)稱密鑰來說為‘RAW’,或者對(duì)于RSA私鑰來說為‘PKCS#8’等)?!?dāng)?shù)據(jù)’字段包含依照‘格式’字段格式化的實(shí)際密鑰數(shù)據(jù)。
對(duì)于作為密鑰對(duì)一部分的密鑰(諸如RSA密鑰)來說,額外的字段‘pairId’給出了用于該對(duì)的唯一標(biāo)識(shí)符,使得可以從其它數(shù)據(jù)結(jié)構(gòu)引用該對(duì)。
在一個(gè)實(shí)施例中,密鑰對(duì)象中的數(shù)據(jù)字段是實(shí)際密鑰的明文值(即,它是將被散列的密鑰的明文值),即便該對(duì)象的實(shí)際表示包含該密鑰的加密拷貝也是如此。
1.21.6.控制器對(duì)象
8.虛擬機(jī) 這里所描述DRM引擎的優(yōu)選實(shí)施例使用虛擬機(jī)(這里有時(shí)被稱作為“控制虛擬機(jī)”、“控制VM”或簡(jiǎn)單地為“VM”)來執(zhí)行用于管理支配對(duì)內(nèi)容進(jìn)行訪問的控制程序。下面描述這種虛擬機(jī)的說明性實(shí)施例,可以對(duì)此說明性實(shí)施例進(jìn)行各種修改和設(shè)計(jì)考慮。還描述了把虛擬機(jī)(被稱為“Plankton(浮游生物)”虛擬機(jī))的說明性實(shí)施例與DRM引擎(被稱為“章魚”)的說明性實(shí)施例相集成。然而應(yīng)當(dāng)理解,這里所描述的數(shù)字權(quán)利管理引擎、體系結(jié)構(gòu)及其它系統(tǒng)和方法的實(shí)施例可以以任何適當(dāng)?shù)奶摂M機(jī)的方式來使用,或者在一些實(shí)施例中,根本沒有虛擬機(jī),從而應(yīng)當(dāng)理解,下面所提供的關(guān)于虛擬機(jī)示例性實(shí)施例的細(xì)節(jié)只是為了說明而并非是限制。
在優(yōu)選實(shí)施例中,控制VM是傳統(tǒng)的虛擬機(jī),被設(shè)計(jì)成用于易于使用具有很小代碼腳印(footprint)的各種編程語言來實(shí)現(xiàn)。它是基于簡(jiǎn)單的、面向堆棧的指令集,其被設(shè)計(jì)成是最低限度的,而不會(huì)過度考慮執(zhí)行速度或代碼密度。在要求簡(jiǎn)潔代碼的情況下,可以使用數(shù)據(jù)壓縮技術(shù)來壓縮虛擬機(jī)的字節(jié)代碼。
在優(yōu)選實(shí)施例中,控制虛擬機(jī)被設(shè)計(jì)成用于適于作為用于低或高級(jí)程序設(shè)計(jì)語言的目標(biāo),并且支持匯編語言,C和FORTH。另外應(yīng)當(dāng)理解,可以依照相對(duì)簡(jiǎn)單的方式創(chuàng)建用于諸如Java或客戶語言之類的其它語言的編譯器來把代碼編譯為由虛擬機(jī)所使用的格式(例如,字節(jié)代碼)。在一個(gè)實(shí)施例中,控制虛擬機(jī)被設(shè)計(jì)成用于在主機(jī)環(huán)境內(nèi)被主控,而不是在處理器或硅中直接運(yùn)行。在優(yōu)選實(shí)施例中,用于虛擬機(jī)的自然主機(jī)環(huán)境是DRM引擎,不過應(yīng)當(dāng)理解,這里所描述的虛擬機(jī)體系結(jié)構(gòu)作為選擇或另外可以在其它情境中使用。
圖29圖示了控制虛擬機(jī)2902的說明性實(shí)現(xiàn)方式的操作環(huán)境。如圖29所示,在一個(gè)實(shí)施例中,虛擬機(jī)2902在其主機(jī)環(huán)境2904的情境下運(yùn)行,當(dāng)虛擬機(jī)執(zhí)行程序2906時(shí)所述主機(jī)環(huán)境2904實(shí)現(xiàn)了所述虛擬機(jī)所需要的一些功能。典型情況下,控制VM在DRM引擎2908內(nèi)運(yùn)行,所述DRM引擎2908實(shí)現(xiàn)其主機(jī)環(huán)境。如圖29所示,在優(yōu)選的數(shù)據(jù)庫中,虛擬機(jī)2902和DRM引擎2908有權(quán)訪問安全數(shù)據(jù)庫2910以便持久地存儲(chǔ)狀態(tài)信息。
1.22.體系結(jié)構(gòu) 1.22.1.執(zhí)行模型 在優(yōu)選實(shí)施例中,VM通過執(zhí)行在代碼模塊中用字節(jié)代碼所存儲(chǔ)的指令來運(yùn)行程序。一些指令可以通過進(jìn)行系統(tǒng)調(diào)用來調(diào)用在程序本身之外實(shí)現(xiàn)的功能。系統(tǒng)調(diào)用可以由VM本身來實(shí)現(xiàn)或被委托給主機(jī)環(huán)境來實(shí)現(xiàn)。
在一個(gè)實(shí)施例中,VM執(zhí)行在代碼模塊中所存儲(chǔ)的指令,所述指令作為被加載到存儲(chǔ)器中的字節(jié)代碼流。VM維持被稱作程序計(jì)數(shù)器(Program Counter PC)的虛擬寄存器,當(dāng)執(zhí)行指令時(shí)使所述程序計(jì)數(shù)器增加。VM順次地執(zhí)行每個(gè)指令,直到遇到OP_STOP指令,在空調(diào)用棧的情況下遇到OP_RET指令,或者出現(xiàn)運(yùn)行時(shí)異常。跳轉(zhuǎn)被指定為相對(duì)跳轉(zhuǎn)(被指定為從當(dāng)前的PC值偏移的字節(jié))或指定為絕對(duì)地址。
1.22.2.存儲(chǔ)器模型 在一個(gè)實(shí)施例中,VM使用相對(duì)簡(jiǎn)單的存儲(chǔ)器模型,其中存儲(chǔ)器被分成數(shù)據(jù)存儲(chǔ)器和代碼存儲(chǔ)器。例如,數(shù)據(jù)存儲(chǔ)器可以被實(shí)現(xiàn)為起始于地址0的單個(gè)、平面、連續(xù)的存儲(chǔ)空間,并且可以被實(shí)現(xiàn)為在主機(jī)應(yīng)用或主機(jī)環(huán)境的堆存儲(chǔ)器內(nèi)分配的字節(jié)數(shù)組。在一個(gè)實(shí)施例中,試圖訪問在所分配空間之外的存儲(chǔ)器導(dǎo)致運(yùn)行時(shí)異常,所述運(yùn)行時(shí)異常會(huì)導(dǎo)致程序執(zhí)行終止。
在由虛擬機(jī)并發(fā)加載的幾個(gè)代碼模塊之間潛在地共享數(shù)據(jù)存儲(chǔ)器。數(shù)據(jù)存儲(chǔ)器中的數(shù)據(jù)可以由存儲(chǔ)器訪問指令訪問,所述存儲(chǔ)器訪問指令在一個(gè)實(shí)施例中可以為32比特或8比特訪問。使用大端(big-endian)字節(jié)次序來執(zhí)行32比特存儲(chǔ)器訪問。在優(yōu)選實(shí)施例中,關(guān)于在虛擬機(jī)可見的存儲(chǔ)器和主機(jī)管理的存儲(chǔ)器(即,主機(jī)CPU虛擬或物理存儲(chǔ)器)之間的對(duì)準(zhǔn)并不做任何假定。
在一個(gè)實(shí)施例中,代碼存儲(chǔ)器是起始于地址0的單個(gè)、連續(xù)的存儲(chǔ)空間,并且可以被實(shí)現(xiàn)為在主機(jī)應(yīng)用或主機(jī)環(huán)境的堆存儲(chǔ)器內(nèi)分配的字節(jié)數(shù)組。
VM可以支持加載一個(gè)以上代碼模塊。如果VM加載幾個(gè)代碼模塊,那么在一個(gè)實(shí)施例中,所有代碼模塊共享相同的數(shù)據(jù)存儲(chǔ)器(不過優(yōu)選地,每個(gè)模塊的數(shù)據(jù)被加載在不同的地址),但是每個(gè)代碼模塊具有其自己的代碼存儲(chǔ)器,從而防止一個(gè)代碼模塊中的跳轉(zhuǎn)指令導(dǎo)致跳轉(zhuǎn)到另一代碼模塊中的代碼。
1.22.3.數(shù)據(jù)堆棧 在一個(gè)實(shí)施例中,VM具有數(shù)據(jù)堆棧的概念,表示在數(shù)據(jù)存儲(chǔ)器中所存儲(chǔ)的32比特?cái)?shù)據(jù)單元。VM維持被稱作堆棧指針(Stack Pointer SP)的虛擬寄存器。在復(fù)位之后,SP指向數(shù)據(jù)存儲(chǔ)器末尾,并且堆棧向下發(fā)展(當(dāng)把數(shù)據(jù)壓到數(shù)據(jù)堆棧上時(shí),使SP寄存器減少)。堆棧上的32比特?cái)?shù)據(jù)單元根據(jù)引用堆棧數(shù)據(jù)的指令而被解釋為32比特地址或32比特整數(shù)。地址是無符號(hào)整數(shù)。在一個(gè)實(shí)施例中,數(shù)據(jù)堆棧上的所有其它32比特整數(shù)值除非另作說明否則被解釋為帶符號(hào)整數(shù)。
1.22.4.調(diào)用堆棧 在一個(gè)實(shí)施例中,VM管理用于進(jìn)行子例程調(diào)用的調(diào)用堆棧。在一個(gè)實(shí)施例中,被壓到此堆棧上的值無法被存儲(chǔ)器訪問指令直接讀取或?qū)懭?。?dāng)執(zhí)行OP_JSR、OP_JSRR和OP_RET指令時(shí),此堆棧由VM內(nèi)部使用。對(duì)于給定的VM實(shí)現(xiàn)方式來說,此返回地址堆棧的大小可以被固定為最大,這只允許一定數(shù)目的嵌套調(diào)用。
1.22.5.偽寄存器 在一個(gè)實(shí)施例中,VM在數(shù)據(jù)存儲(chǔ)器開始時(shí)保留小地址空間以便映射偽寄存器。在一個(gè)實(shí)施例中,這些偽寄存器的地址是固定的。例如,可以定義以下寄存器
1.22.6.存儲(chǔ)器映象 下面在說明性實(shí)施例中示出了數(shù)據(jù)存儲(chǔ)器和代碼存儲(chǔ)器的布局?jǐn)?shù)據(jù)存儲(chǔ)器
代碼存儲(chǔ)器
1.22.7.執(zhí)行例程 在執(zhí)行代碼例程之前,在一個(gè)實(shí)施例中,虛擬機(jī)實(shí)現(xiàn)方式復(fù)位數(shù)據(jù)堆棧指針以便指向初始化數(shù)據(jù)堆棧的頂部。初始化的數(shù)據(jù)堆棧包含例程的輸入數(shù)據(jù),并且擴(kuò)展到數(shù)據(jù)存儲(chǔ)器的末尾。初始化的數(shù)據(jù)堆??梢员挥脼橄蚶虃鬟f輸入自變量的方式。當(dāng)不存在初始化的數(shù)據(jù)堆棧時(shí),數(shù)據(jù)堆棧指針指向數(shù)據(jù)存儲(chǔ)器的末尾。在一個(gè)實(shí)施例中,初始調(diào)用堆棧是空的或者包含指向OP_STOP指令的單端返回地址,這在利用OP_RET指令完成例程的情況下,將強(qiáng)制執(zhí)行例程以結(jié)束于OP_STOP指令。
當(dāng)因?yàn)橐呀?jīng)執(zhí)行具有空調(diào)用堆棧的最終OP_RET指令或已經(jīng)執(zhí)行最終OP_STOP指令所以執(zhí)行停止時(shí),留在數(shù)據(jù)堆棧上的任何數(shù)據(jù)被認(rèn)為是例程的輸出。
1.22.8.運(yùn)行時(shí)異常 在一個(gè)實(shí)施例中,任何以下條件被認(rèn)為是造成執(zhí)行立即停止的運(yùn)行時(shí)異常 ●試圖訪問在當(dāng)前數(shù)據(jù)存儲(chǔ)器地址空間之外的數(shù)據(jù)存儲(chǔ)器。
●試圖把PC設(shè)置為或使所述PC到達(dá)在當(dāng)前代碼存儲(chǔ)器的地址空間之外的代碼地址。
●試圖執(zhí)行未定義的字節(jié)代碼。
●試圖執(zhí)行具有等于0的棧頂操作數(shù)的OP_DIV指令。
●試圖執(zhí)行具有等于0的棧頂操作數(shù)的OP_MOD指令。
●調(diào)用堆棧的上溢或下溢。
1.23.指令集 在一個(gè)實(shí)施例中,控制VM使用相對(duì)簡(jiǎn)單的指令集。盡管是有限的,不過指令數(shù)目足以表達(dá)任意復(fù)雜的程序。指令及其操作數(shù)由字節(jié)代碼流來表示。在一個(gè)實(shí)施例中,指令集是基于堆棧的,并且除OP_PUSH指令之外,沒有一個(gè)指令具有直接操作數(shù)。從數(shù)據(jù)堆棧中讀取操作數(shù),并且把結(jié)果壓到數(shù)據(jù)堆棧上。在一個(gè)實(shí)施例中,VM是32比特VM所有指令對(duì)用于表示存儲(chǔ)器地址或帶符號(hào)整數(shù)的32比特堆棧操作數(shù)進(jìn)行操作。利用2的補(bǔ)碼二進(jìn)制編碼來表示帶符號(hào)整數(shù)。在以下表中示出了供控制VM使用的指令集的說明性實(shí)施例。在該表中,用于具有兩個(gè)操作數(shù)的指令的堆棧操作數(shù)被列為“A,B”,其中在堆棧頂部的操作數(shù)被列在最后(即,“B”)。除非另作說明,否則在一個(gè)說明性實(shí)施例的下面描述中所使用的術(shù)語‘壓入’指的是把32比特的值壓入到數(shù)據(jù)堆棧的頂部上。
1.24.代碼模塊 在優(yōu)選實(shí)施例中,依照與用于MPEG-4文件格式類似或完全相同的基于原子格式來存儲(chǔ)代碼模塊,其中原子包含32比特大小(例如由依照大端字節(jié)次序的4字節(jié)表示),后面是4字節(jié)類型(例如,對(duì)應(yīng)于字母表字母的ASCII值的字節(jié)),后面是有效載荷(例如,8字節(jié))。
圖30示出了說明性代碼模塊3000的格式。參照?qǐng)D30,pkCM原子3002是最高級(jí)的代碼模塊原子。它包含子原子的序列。在一個(gè)實(shí)施例中,pkCM原子3002包含一個(gè)pkDS原子3004、一個(gè)pkCS原子3006、一個(gè)pkEX原子3008以及可能還包含一個(gè)pkRQ原子3010。pkCM原子3002還可以包含任意數(shù)目的其它原子,在一個(gè)實(shí)施例中所述其它原子如果存在的話那么被忽略。在一個(gè)實(shí)施例中,子原子的次序未被指定,因此實(shí)現(xiàn)方式不應(yīng)當(dāng)假定特定次序。
1.24.1.pkDS原子 如圖30所示,pkDS原子3004包含可以被加載到數(shù)據(jù)存儲(chǔ)器中的數(shù)據(jù)段的存儲(chǔ)器映像3005。如圖31A所示,在一個(gè)實(shí)施例中,存儲(chǔ)器映像3005由字節(jié)3112的序列來表示,由一個(gè)首部字節(jié)3114后面是零或更多數(shù)據(jù)字節(jié)3116組成。首部字節(jié)3114編碼用于標(biāo)識(shí)隨后字節(jié)3116的格式的版本號(hào)。
在一個(gè)實(shí)施例中,只定義了一個(gè)版本號(hào)(即,DataSegmentFormatVersion=0),并且依照此格式,存儲(chǔ)器映像的數(shù)據(jù)字節(jié)表示要被加載到存儲(chǔ)器中的原始映像。虛擬機(jī)加載器只加載存儲(chǔ)器映像3105的數(shù)據(jù)字節(jié)3116,不包括首部字節(jié)3114。在一個(gè)實(shí)施例中,虛擬機(jī)加載器可操作來拒絕加載采用任何其它格式的映像。
1.24.2.pkCS原子 如圖30所示,pkCS原子3006包含可以被加載到代碼存儲(chǔ)器中的代碼段的存儲(chǔ)器映像3007。如圖31B所示,在一個(gè)實(shí)施例中,存儲(chǔ)器映像3007由字節(jié)3120的序列來表示,其由一個(gè)首部字節(jié)3122后面是零或更多數(shù)據(jù)字節(jié)3124組成。首部字節(jié)3122編碼用于標(biāo)識(shí)隨后字節(jié)3124的格式的版本號(hào)。
在一個(gè)實(shí)施例中,只定義了一個(gè)版本號(hào)(即,CodeSegmentFormatVersion=0),并且如圖31C所示,在此版本中,在首部字節(jié)3122之后的字節(jié)包含另一首部字節(jié)3130,所述另一首部字節(jié)3130包含用于標(biāo)識(shí)隨后字節(jié)3132的字節(jié)代碼編碼的版本號(hào)。在圖31C所示出的例子中,首部字節(jié)3130標(biāo)識(shí)ByteCodeVersion=0,用于指定數(shù)據(jù)字節(jié)3132包含原始字節(jié)序列,所述原始字節(jié)序列具有諸如在上述示例性指令集中所定義的那些字節(jié)代碼值。在優(yōu)選實(shí)施例中,虛擬機(jī)加載器只加載數(shù)據(jù)字節(jié)的字節(jié)代碼部分3132,而不加載兩個(gè)首部字節(jié)3122、3130。
1.24.3.pkEX原子 再次參照?qǐng)D30,pkEX原子3008包含一列輸出入口。在圖30所示出的例子中,pkEX原子3008的第一組四個(gè)字節(jié)3009依照等于隨后入口的數(shù)目的大端字節(jié)次序來編碼32比特?zé)o符號(hào)整數(shù)。如圖31D所示,每個(gè)隨后的輸出入口3160包括名稱,其被編碼為包含名稱大小S的一個(gè)字節(jié)3162,后面是包含該名稱的ASCII字符的S字節(jié)3164,包括終結(jié)零3166,后面是依照大端字節(jié)次序的32比特?zé)o符號(hào)整數(shù)3168,用于表示命名入口點(diǎn)的字節(jié)偏移,其從在31CS原子中所存儲(chǔ)的字節(jié)代碼數(shù)據(jù)開始測(cè)量。圖31E示出了用于在偏移64的入口點(diǎn)MAIN的輸出表入口3170的例子,其中第一字節(jié)3172指示名稱(即“MAIN”)的大小加上末尾的零一共是五個(gè)字節(jié),并且其中最后四個(gè)字節(jié)3174表明字節(jié)偏移是64。
1.24.4.pkRQ原子 如圖30所示,pkRQ原子3010包含為了執(zhí)行代碼模塊中的代碼,由虛擬機(jī)實(shí)現(xiàn)方式所需要滿足的要求。在一個(gè)實(shí)施例中,此原子是可選的,并且如果不存在的話,那么虛擬機(jī)使用默認(rèn)實(shí)現(xiàn)方式設(shè)置,諸如可以由實(shí)現(xiàn)方式簡(jiǎn)檔來定義。
在一個(gè)實(shí)施例中,pkRQ原子由32比特?zé)o符號(hào)整數(shù)值的數(shù)組組成,每個(gè)字段一個(gè)值
1.24.5.模塊加載器 虛擬機(jī)負(fù)責(zé)加載代碼模塊。當(dāng)加載代碼模塊時(shí),在pkDS原子中所編碼的數(shù)據(jù)段存儲(chǔ)器映像被加載到在數(shù)據(jù)存儲(chǔ)器中的存儲(chǔ)器地址。該地址由VM加載器選擇,并且當(dāng)代碼執(zhí)行時(shí)被存儲(chǔ)在DS偽寄存器中。
在pkCS原子中所編碼的代碼段存儲(chǔ)器映像被加載到代碼存儲(chǔ)器中的存儲(chǔ)器地址。該地址由VM加載器選擇,并且當(dāng)代碼執(zhí)行時(shí)被存儲(chǔ)在CS偽寄存器中。
當(dāng)加載代碼模塊時(shí),如果在輸出表的入口中找到名稱為“Global.OnLoad”的特定例程,那么執(zhí)行此例程。此例程不獲取堆棧上的自變量,并且當(dāng)返回時(shí)返回整數(shù)狀態(tài),0表示成功,并且負(fù)錯(cuò)誤代碼表示錯(cuò)誤條件。
當(dāng)卸載代碼模塊時(shí)(或當(dāng)去掉已經(jīng)加載模塊的虛擬機(jī)時(shí)),如果在輸出表中找到名稱為“Global.OnUnload”的特定例程,那么執(zhí)行該例程。此例程不獲取堆棧上的自變量,并且當(dāng)返回時(shí)返回整數(shù)狀態(tài),0表示成功,并且負(fù)錯(cuò)誤代碼表示錯(cuò)誤條件。
1.25.系統(tǒng)調(diào)用 虛擬機(jī)的程序可以調(diào)用在它們的代碼模塊的代碼段之外實(shí)現(xiàn)的函數(shù)。這通過使用OP_CALL指令來完成,所述OP_CALL指令獲取用于指定系統(tǒng)調(diào)用號(hào)的整數(shù)堆棧操作數(shù)來調(diào)用。根據(jù)系統(tǒng)調(diào)用,實(shí)現(xiàn)方式可以是在不同的代碼模塊(例如,實(shí)用函數(shù)庫)中由VM依照VM本機(jī)實(shí)現(xiàn)格式來直接執(zhí)行或者被委托給外部軟件模塊(諸如VM的主機(jī)環(huán)境)來執(zhí)行的字節(jié)代碼例程。
在一個(gè)實(shí)施例中,如果利用包含并不對(duì)應(yīng)于任何系統(tǒng)調(diào)用的號(hào)的操作數(shù)來執(zhí)行OP_CALL指令,那么VM就好像SYS_NOP系統(tǒng)調(diào)用被調(diào)用一樣來工作。
1.25.1.系統(tǒng)調(diào)用號(hào)分配 在所討論的說明性實(shí)施例中,系統(tǒng)調(diào)用號(hào)0到1023被保留給固定系統(tǒng)調(diào)用(這些系統(tǒng)調(diào)用在所有VM實(shí)現(xiàn)方式上具有相同的號(hào))。系統(tǒng)調(diào)用號(hào)1024到16383可用于VM動(dòng)態(tài)分配(例如,由System.FindSystemCallByName所返回的系統(tǒng)調(diào)用號(hào)可以由VM動(dòng)態(tài)地分配,并且不必在所有VM實(shí)現(xiàn)方式上是相同的號(hào))。
在一個(gè)示例性實(shí)施例中,指定以下固定的系統(tǒng)調(diào)用號(hào)
1.25.2.標(biāo)準(zhǔn)系統(tǒng)調(diào)用 在一個(gè)實(shí)施例中,支持可用于寫入控制程序的幾個(gè)標(biāo)準(zhǔn)系統(tǒng)調(diào)用。這些調(diào)用包括在上面表中所列出的固定號(hào)的系統(tǒng)調(diào)用,以及具有動(dòng)態(tài)確定的號(hào)的系統(tǒng)調(diào)用(即通過調(diào)用System.FindSystemCallByName系統(tǒng)調(diào)用來獲取它們的系統(tǒng)調(diào)用號(hào),它們的名稱作為自變量來傳遞)。
在一個(gè)實(shí)施例中,在可能返回負(fù)錯(cuò)誤代碼的此節(jié)中所指定的系統(tǒng)調(diào)用可以返回具有任何負(fù)值的錯(cuò)誤代碼。節(jié)8.4.4定義了特定的說明性值。在一個(gè)實(shí)施例中,如果返回未被預(yù)定義的負(fù)錯(cuò)誤代碼值,那么就像它們是通用的錯(cuò)誤代碼值FAILURE那樣來解釋。
System.NoOperation。此調(diào)用沒有輸入并且不返回輸出,并且簡(jiǎn)單地返回而不作任何事情。它主要用于測(cè)試VM。
System.DebugPrint。此調(diào)用從堆棧頂部獲取包含空結(jié)束字符串的存儲(chǔ)單元地址作為其輸入,并且不返回輸出。對(duì)此函數(shù)的調(diào)用使文本字符串被打印到調(diào)試輸出,其在調(diào)試方面可能是有用的。如果VM實(shí)現(xiàn)方式不包括用于輸出調(diào)試文本的手段(諸如可能是在非開發(fā)環(huán)境中的情況),那么VM可以忽略調(diào)用并且就好像已經(jīng)調(diào)用System.NoOperation那樣來處理它。
System.FindSystemCallByName。給定系統(tǒng)調(diào)用的名稱,此調(diào)用尋找它的編號(hào)。所述調(diào)用(從堆棧的頂部)把包含要查找的系統(tǒng)調(diào)用名稱的空結(jié)束ASCII字符串的地址作為其輸入,并且如果執(zhí)行具有所指定名稱的系統(tǒng)調(diào)用,那么(向所述堆棧的頂部)返回系統(tǒng)調(diào)用號(hào),如果沒有執(zhí)行該系統(tǒng)調(diào)用,那么返回ERROR_NO_SUCH_ITEM,并且如果出現(xiàn)錯(cuò)誤,那么返回負(fù)錯(cuò)誤代碼。
System.Host.GetLocalTime。此調(diào)用沒有輸入并且向堆棧的頂部返回主機(jī)的當(dāng)前本地時(shí)間值或負(fù)錯(cuò)誤代碼,所述當(dāng)前本地時(shí)間值在一個(gè)實(shí)施例中被表示為等于自從1970 1月1日00:00:00以來過去的分鐘數(shù)的32比特帶符號(hào)整數(shù)。
System.Host.GetLocalTimeOffset。這調(diào)用沒有輸入,并且向堆棧的頂部返回主機(jī)的當(dāng)前時(shí)間偏移(從UTC時(shí)間開始),所述當(dāng)前時(shí)間偏移在一個(gè)實(shí)施例中被表示為其數(shù)目等于在本地時(shí)間和UTC(即LocalTime-UTC)時(shí)間之間分鐘差的32比特帶符號(hào)整數(shù)。
System.Host.GetTrustedTime。此調(diào)用沒有輸入,并且向堆棧頂部返回TrustedTime(信任時(shí)間)和一個(gè)或多個(gè)標(biāo)志值。在一個(gè)實(shí)施例中,信任時(shí)間是信任計(jì)時(shí)時(shí)鐘的當(dāng)前值(如果系統(tǒng)包括這種信任時(shí)鐘),或者如果信任時(shí)間不可用那么返回負(fù)錯(cuò)誤代碼。在一個(gè)實(shí)施例中,信任時(shí)間值被表示為其數(shù)目等于自從1970年1月1日00:00:00UTC以來過去的分鐘的32比特帶符號(hào)整數(shù),或者為負(fù)錯(cuò)誤代碼。在一個(gè)實(shí)施例中,所述標(biāo)志是用于進(jìn)一步定義信任時(shí)鐘的當(dāng)前狀態(tài)的標(biāo)志比特組。在一個(gè)實(shí)施例中,如果已經(jīng)出現(xiàn)錯(cuò)誤(例如,TrustedTime值為負(fù)錯(cuò)誤代碼),那么對(duì)該標(biāo)志所返回的值為0。
在一個(gè)實(shí)施例中,定義以下標(biāo)志
此系統(tǒng)調(diào)用與用于執(zhí)行信任時(shí)鐘的系統(tǒng)相關(guān),所述信任時(shí)鐘可以與信任時(shí)間源同步并且維持單調(diào)的時(shí)間計(jì)數(shù)器。并不保證信任時(shí)間值始終是準(zhǔn)確的,但是在一個(gè)實(shí)施例中要求以下特性為真 ●信任時(shí)間值被表示為UTC時(shí)間值(信任時(shí)間并不處于本地時(shí)區(qū)中,這是因?yàn)橥ǔo法安全地確定當(dāng)前的位置)。
●信任時(shí)間永遠(yuǎn)不會(huì)回退。
●信任時(shí)鐘不比實(shí)際時(shí)間走得更快。
因此,在此示例性實(shí)施例中,TrustedTime值在最后同步的時(shí)間值(與信任時(shí)間源同步)和當(dāng)前實(shí)際時(shí)間值之間。如果系統(tǒng)能夠確定自從最后與信任時(shí)間源同步以來其信任時(shí)鐘已經(jīng)連續(xù)地并且通常不中斷地操作并更新,那么它可以確定TrustedTime值并不是估計(jì)值而是準(zhǔn)確值,并且把TIME_IS_ESTIMATE標(biāo)志設(shè)置為0。
在一個(gè)實(shí)施例中,如果信任時(shí)鐘檢測(cè)到已經(jīng)出現(xiàn)硬件或軟件故障條件,并且它甚至不能返回信任時(shí)間的估計(jì)值,那么返回錯(cuò)誤代碼,并且把所返回標(biāo)志的值設(shè)置為0。
System.Host.GetObject此系統(tǒng)調(diào)用是用于允許程序訪問由虛擬機(jī)的主機(jī)所提供的對(duì)象的通用接口。System.Host.GetObject調(diào)用獲取以下輸入(從堆棧頂部向下列出)Parent(親代),Name(名稱),ReturnBuffer(返回緩沖器)和ReturnBufferSize(返回緩沖器大小)。其中“Parent”是親代容器(parent container)的32比特句柄;“Name”是包含通向所請(qǐng)求對(duì)象的路徑的空結(jié)束字符串相對(duì)于所述親代容器的地址;“ReturnBuffer”是存儲(chǔ)器緩沖器中將要存儲(chǔ)所述對(duì)象值的的地址;并且“ReturnBufferSize”是用于表明其中將存儲(chǔ)對(duì)象值的存儲(chǔ)器緩沖器的字節(jié)大小的32比特整數(shù)。
System.Host.GetObject調(diào)用生成以下輸出(從堆棧頂部向下列出)TypeID(類型ID),Size(大小)。其中“TypeId”是對(duì)象類型id,或者如果調(diào)用失敗,那么是負(fù)錯(cuò)誤代碼。如果所請(qǐng)求的對(duì)象并不存在,那么所返回的錯(cuò)誤為ERROR_NO_SUCH_ITEM。如果向返回值所提供的緩沖器太小,那么所返回的錯(cuò)誤為ERROR_INSUFFICIENT_SPACE。如果正訪問的對(duì)象樹的一部分是被訪問控制的,并且調(diào)用程序沒有訪問該對(duì)象的權(quán)限,那么返回ERROR_PERMISSION_DENIED??梢苑祷仄渌e(cuò)誤代碼?!癝ize”是32比特整數(shù),用于表明在由調(diào)用方所提供緩沖器中所返回的數(shù)據(jù)字節(jié)大小或者如果調(diào)用方提供了太小的緩沖器,那么它表明所要求的大小。
在一個(gè)實(shí)施例中,存在四種類型的主機(jī)對(duì)象字符串,整數(shù),字節(jié)數(shù)組和容器。
在一個(gè)實(shí)施例中,字節(jié)數(shù)組對(duì)象值是8比特字節(jié)數(shù)組,字符串對(duì)象值是依照UTF-8編碼(incoded)的空結(jié)束字符串,并且整數(shù)對(duì)象值是32比特帶符號(hào)整數(shù)值。容器是包含任何類型組合的任意數(shù)目對(duì)象序列的通用容器。在容器中所包含的對(duì)象被稱作該容器的孩子。容器值是在給定VM實(shí)例內(nèi)唯一的32比特的容器句柄。在一個(gè)實(shí)施例中,根容器‘/’具有固定句柄值0。
在一個(gè)實(shí)施例中,用于主機(jī)對(duì)象的名稱空間(namespace)是分級(jí)的,其中通過向親代容器的名稱追加孩子的名稱來構(gòu)造容器的孩子對(duì)象的名稱,名稱之間由‘/’符號(hào)來分隔。字符串和整數(shù)對(duì)象沒有孩子。例如,如果容器被命名為‘/Node/Attributes’(/節(jié)點(diǎn)/屬性),并且具有名稱為‘Type(類型)’的字符串孩子,那么‘/Node/Attributes/Type(/節(jié)點(diǎn)/屬性/類型)’指的是孩子字符串。
名稱空間的根為‘/’。所有絕對(duì)名稱以‘/’開始。并非以‘/’開始的名稱都為相對(duì)名稱。相對(duì)名稱是相對(duì)于親代容器的。例如,相對(duì)于親代‘/Node(節(jié)點(diǎn))’的名稱‘Attributes/Type(屬性/類型)’是具有絕對(duì)名稱‘/Node/Attributes/Type’的對(duì)象。
在一個(gè)實(shí)施例中,容器對(duì)象還可以具有通過使用虛擬名稱來訪問的真正和虛擬的孩子對(duì)象。虛擬名稱是并未被附著到主機(jī)對(duì)象的名稱,但是慣例是標(biāo)識(shí)未命名的孩子對(duì)象、具有不同名稱的孩子對(duì)象或者虛擬孩子對(duì)象(并非是容器的真正孩子但是當(dāng)請(qǐng)求時(shí)動(dòng)態(tài)創(chuàng)建的孩子對(duì)象)。
在一個(gè)實(shí)施例中,對(duì)于對(duì)象來說,以下虛擬名稱被定義為虛擬孩子對(duì)象名稱 對(duì)于容器來說,在一個(gè)實(shí)施例中,以下虛擬名稱被定義為虛擬孩子對(duì)象名稱
例子 以下表示出了主機(jī)對(duì)象體系的例子
在此例子中,調(diào)用System.Host.GetObject(parent=0,name=”Node”返回類型ID 0(即,容器)),并且使句柄值1被寫入到由調(diào)用方所提供的緩沖器中。值的大小為4字節(jié)。
調(diào)用System.Host.GetObject(parent=0,name=”Node/Attributes/Domain”)返回類型ID 2(即,字符串),并且使字符串“TopLevel”被寫入到由調(diào)用方所提供的緩沖器中。值的大小為9字節(jié)。
調(diào)用System.Host.GetObject(parent=1,name=”Attributes/@1”)返回類型ID1(即,整數(shù)),并且使整數(shù)78被寫入到由被調(diào)用方所提供的緩沖器中。值的大小為4字節(jié)。
調(diào)用System.Host.GetObj ect(parent=0,name=”DoesNotExist”)返回錯(cuò)誤代碼ERROR_NO_SUCH_ITEM。
System.Host.SetObject。此系統(tǒng)調(diào)用是用于允許程序創(chuàng)建、寫入并銷毀由虛擬機(jī)的主機(jī)所提供對(duì)象的通用接口。對(duì)象名稱和類型的描述與上述System.Host.GetObject調(diào)用的描述相同。并非所有主機(jī)對(duì)象支持被寫入或銷毀,并且并非所有容器支持創(chuàng)建孩子對(duì)象。當(dāng)對(duì)不支持該操作的對(duì)象進(jìn)行SetObject調(diào)用時(shí),返回ERROR_PERMISSION_DENIED。
System.Host.SetObject系統(tǒng)調(diào)用獲取從堆棧頂部向下列出的以下參數(shù)作為輸入 堆棧頂部
Parent(親代)親代容器的32比特句柄。
Name(名稱)包含通向?qū)ο蟮穆窂降目战Y(jié)束字符串相對(duì)于親代容器的地址。
ObjectAddress(對(duì)象地址)存儲(chǔ)器緩沖器中存儲(chǔ)對(duì)象值的地址。如果地址為0,那么調(diào)用被解釋為銷毀對(duì)象的請(qǐng)求。在該地址的數(shù)據(jù)取決于對(duì)象的類型。
ObjectType(對(duì)象類型)對(duì)象的類型ID。
ObjectSize(對(duì)象大小)用于表明其中存儲(chǔ)對(duì)象值的存儲(chǔ)器緩沖器的字節(jié)大小的32比特整數(shù)。在所討論的說明性實(shí)施例中,所述大小對(duì)于整數(shù)對(duì)象來說被設(shè)置為4,并且對(duì)于字符串對(duì)象來說被設(shè)置為存儲(chǔ)器緩沖器的大小,包括空終結(jié)符。對(duì)于字節(jié)數(shù)組對(duì)象來說,大小為數(shù)組中字節(jié)的數(shù)目。
System.Host.SetObject系統(tǒng)調(diào)用向堆棧頂部返回ResultCode作為輸出。如果調(diào)用成功,那么ResultCode為0,并且如果調(diào)用失敗,那么ResultCode為負(fù)錯(cuò)誤代碼。如果調(diào)用是用于銷毀對(duì)象的請(qǐng)求并且所請(qǐng)求的對(duì)象不存在,或者所述調(diào)用是用于創(chuàng)建或?qū)懭雽?duì)象的請(qǐng)求并且所述對(duì)象的親代不存在,那么所返回的錯(cuò)誤代碼為ERROR_NO_SUCH_ITEM。如果正訪問的對(duì)象樹的一部分是受訪問控制的,并且調(diào)用程序沒有訪問對(duì)象的權(quán)限,那么返回ERROR_PERMISSION_DENIED。還可以返回其它錯(cuò)誤代碼。
當(dāng)對(duì)象指的是容器并且ObjectAddress不是0時(shí)存在一個(gè)特定情況。在這種情況下,ObjectSize參數(shù)被設(shè)置為0并且ObjectAddress值被忽略。如果容器已經(jīng)存在,那么不作任何事情,并且返回SUCCESSResultCode。如果容器不存在,并且容器的親代是可寫的,那么創(chuàng)建空容器。
Octopus.Links.IsNodeReachable。此系統(tǒng)調(diào)用由控制程序用來檢查給定節(jié)點(diǎn)是否可從與主控虛擬機(jī)的此實(shí)例的實(shí)體相關(guān)聯(lián)的節(jié)點(diǎn)到達(dá)。調(diào)用從堆棧頂部獲取NodeId作為其輸入,其中NodeId是包含要測(cè)試可到達(dá)性的目標(biāo)節(jié)點(diǎn)的ID的空結(jié)束字符串。作為輸出,該調(diào)用向堆棧頂部返回ResultCode和StatusBlockPointer。ResultCode是一個(gè)整數(shù)值,如果該節(jié)點(diǎn)是可到達(dá)的,那么所述整數(shù)值為0,或者如果所述節(jié)點(diǎn)是不可到達(dá)的,那么所述整數(shù)值為負(fù)錯(cuò)誤代碼。StatusBlockPointer是標(biāo)準(zhǔn)ExtendedStatusBlock的地址,或者如果沒有返回狀態(tài)塊,那么為0。
System.Host.SpawnVm。此系統(tǒng)調(diào)用由控制程序用來請(qǐng)求創(chuàng)建虛擬機(jī)的新實(shí)例并且加載新的代碼模塊。在一個(gè)實(shí)施例中,新創(chuàng)建的虛擬機(jī)的主機(jī)暴露與被暴露于調(diào)用方相同的主機(jī)對(duì)象,除主機(jī)對(duì)象“/Octopus/Runtime/Parent/Id”被設(shè)置為調(diào)用方的身份之外。在一個(gè)實(shí)施例中,此主機(jī)對(duì)象是容器。此容器的孩子是類型字符串的對(duì)象,均具有用于表示名稱的值。在一個(gè)實(shí)施例中,那些名稱的語義和具體細(xì)節(jié)由虛擬機(jī)主機(jī)的規(guī)范指定。
在一個(gè)實(shí)施例中,當(dāng)運(yùn)行用于調(diào)用方的代碼的虛擬機(jī)終止時(shí),尚未通過調(diào)用System.Host.ReleaseVm顯式發(fā)布的任何產(chǎn)生的虛擬機(jī)由系統(tǒng)來自動(dòng)發(fā)布,就好像已經(jīng)調(diào)用System.Host.ReleaseVm一樣。
System.Host.SpawnVm調(diào)用從堆棧頂部獲取ModuleId(模塊ID)作為其輸入。ModuleId標(biāo)識(shí)要被加載到新的虛擬機(jī)實(shí)例中的代碼模塊。在一個(gè)實(shí)施例中,虛擬機(jī)的主機(jī)的規(guī)范描述了用于定位對(duì)應(yīng)于此模塊ID的實(shí)際代碼模塊的機(jī)制。
System.Host.SpawnVm調(diào)用向堆棧頂部返回ResultCode和VmHandle。ResultCode是一個(gè)整數(shù)值,如果調(diào)用是成功的,那么所述整數(shù)值為0,并且如果所述調(diào)用失敗,那么所述整數(shù)值為負(fù)錯(cuò)誤代碼。VmHandle是用于標(biāo)識(shí)已經(jīng)創(chuàng)建的虛擬機(jī)的實(shí)例的整數(shù)值。如果調(diào)用失敗,那么此句柄被設(shè)置為0。在一個(gè)實(shí)施例中,只保證這句柄在其中做出此調(diào)用的虛擬機(jī)內(nèi)是唯一的。
System.Host.CallVm。此系統(tǒng)調(diào)用由控制程序用來調(diào)用在代碼模塊中實(shí)現(xiàn)的例程,所述代碼模塊被加載到使用System.Host.SpawnVm系統(tǒng)調(diào)用創(chuàng)建的虛擬機(jī)實(shí)例中。此系統(tǒng)調(diào)用從堆棧頂部采取以下輸入 堆棧頂部
VmHandle用于表示通過調(diào)用System.Host.SpawnVm而創(chuàng)建的虛擬機(jī)的句柄的整數(shù)值。
EntryPoint用于指定到調(diào)用的入口點(diǎn)名稱的空結(jié)束字符串的地址。此名稱需要匹配代碼模塊的輸出表中的入口點(diǎn)之一,所述代碼模塊被加載到對(duì)應(yīng)于VmHandle參數(shù)的虛擬機(jī)實(shí)例中。
ParameterBlockAddress包含要被傳遞到被調(diào)用方的數(shù)據(jù)的存儲(chǔ)塊的地址。如果沒有向被調(diào)用方傳遞參數(shù),那么此地址被設(shè)置為0。
ParameterBlockSize在地址ParameterBlockAddress的存儲(chǔ)塊的字節(jié)大小,或者如果ParameterBlockAddress為0,那么為0。
ReturnBufferAddress其中調(diào)用方可以從被調(diào)用方接收數(shù)據(jù)的存儲(chǔ)器緩沖器的地址。如果調(diào)用方并不期望從被調(diào)用方返回任何數(shù)據(jù),那么此地址被設(shè)置為0。
ReturnBufferSize在地址ReturnBufferAddress的存儲(chǔ)器緩沖器的字節(jié)大小,或者如果ReturnBufferAddress為0,那么為0。
System.Host.CallVm調(diào)用向堆棧頂部返回以下輸出 堆棧頂部
SystemResultCode整數(shù)值,如果調(diào)用成功,那么所述整數(shù)值為0,并且如果所述調(diào)用失敗,那么所述整數(shù)值為負(fù)錯(cuò)誤代碼。此值由系統(tǒng)而不是由被調(diào)用方來確定。成功只是表明系統(tǒng)能夠成功地找到要調(diào)用的例程,執(zhí)行所述例程并且從所述例程獲取返回值。在CalleeResultCode值中返回來自該例程本身的返回值。
CalleeResultCode由被調(diào)用方所返回的整數(shù)值。
ReturnBlockSize在由調(diào)用方所提供緩沖器中返回的數(shù)據(jù)字節(jié)大小,或者如果調(diào)用方提供了太小的緩沖器,那么它表明所要求的大小。如果被調(diào)用方?jīng)]有返回?cái)?shù)據(jù),那么該值為0。
在所討論的說明性實(shí)施例中,被調(diào)用例程符合以下接口慣例當(dāng)調(diào)用所述例程時(shí),堆棧頂部包含由調(diào)用方所提供的值ParameterBlockSize,后面是數(shù)據(jù)的ParameterBlockSize字節(jié),所述值ParameterBlockSize表明參數(shù)塊的大小。如果所述大小不是4的倍數(shù),那么用零來填充堆棧上的數(shù)據(jù)以便確保堆棧指針保持為4的倍數(shù)。當(dāng)返回時(shí),被調(diào)用的例程在堆棧上提供了以下返回值 堆棧頂部
ReturnBlockAddress包含要被返回到調(diào)用方的數(shù)據(jù)的存儲(chǔ)塊的地址。如果沒有返回?cái)?shù)據(jù),那么此地址被設(shè)置為0。
ReturnBlockSize在地址ParameterBlockAddress的存儲(chǔ)塊的字節(jié)大小,或者如果ReturnBlockAddress為0,那么為0。
System.Host.ReleaseVm。此系統(tǒng)調(diào)用由控制程序用來發(fā)布由對(duì)System.Host.SpawnVm的先前調(diào)用所產(chǎn)生的虛擬機(jī)。遞歸地發(fā)布由所發(fā)布的虛擬機(jī)產(chǎn)生的任何虛擬機(jī)等。System.Host.ReleaseVm調(diào)用從堆棧頂部獲取VmHandle作為其輸入,VmHandle表示通過調(diào)用System.Host.SpawnVm所創(chuàng)建的虛擬機(jī)的句柄。System.Host.ReleaseVm調(diào)用向堆棧頂部返回ResultCode作為輸出。ResultCode是個(gè)整數(shù)值,如果調(diào)用是成功的,那么所述整數(shù)值為0,或者如果所述調(diào)用失敗,那么所述整數(shù)值為負(fù)錯(cuò)誤代碼。
1.25.3.標(biāo)準(zhǔn)的數(shù)據(jù)結(jié)構(gòu) 下面是由一些標(biāo)準(zhǔn)的系統(tǒng)調(diào)用所使用的標(biāo)準(zhǔn)數(shù)據(jù)結(jié)構(gòu)。
1.25.3.1.標(biāo)準(zhǔn)參數(shù) ParameterBlock Name參數(shù)的名稱。
Value參數(shù)的值 ExtendedParameterBlock Flags布爾標(biāo)志的向量。
Parameter包含名稱和值的參數(shù)塊。
NameBlock Size32比特?zé)o符號(hào)整數(shù)等于隨后的“字符”字段的字節(jié)大小。如果此值為0,那么字符字段為空(即,后面什么都沒有)。
Characters空結(jié)束UTF-8字符串。
ValueBlock Type32比特類型標(biāo)識(shí)符。在一個(gè)實(shí)施例中,定義以下類型
Size32比特?zé)o符號(hào)整數(shù)等于隨后的“數(shù)據(jù)”字段的字節(jié)大小。如果此值為0,那么數(shù)據(jù)字段為空(即,在ValueBlock中的大小字段后面什么都沒有)。
Data用于表示值的8比特字節(jié)的數(shù)組。實(shí)際字節(jié)取決于由類型字段所指定的數(shù)據(jù)編碼。
ValueListBlock ValueCount等于隨后的ValueBlock結(jié)構(gòu)數(shù)目的32比特?zé)o符號(hào)整數(shù)。如果此值為0,那么后面沒有ValueBlocks。
Value0,Value1,...零或更多ValueBlock結(jié)構(gòu)的序列。
1.25.3.2.標(biāo)準(zhǔn)的ExtendedStatus 標(biāo)準(zhǔn)的ExtendedStatusBlock是一般用于把擴(kuò)展信息作為返回狀態(tài)從調(diào)用傳達(dá)到例程或系統(tǒng)調(diào)用的數(shù)據(jù)結(jié)構(gòu)。它是可以在各種情境中使用的通用數(shù)據(jù)結(jié)構(gòu),對(duì)于其字段來說具有不同可能值的范圍。在一個(gè)實(shí)施例中,如下定義ExtendedStatusBlock ExtendedStatusBlock GlobalFlags不管類別字段如何其語義都是相同的布爾標(biāo)志。標(biāo)志的位置和意義由使用標(biāo)準(zhǔn)ExtendedStatusBlock數(shù)據(jù)結(jié)構(gòu)的簡(jiǎn)檔來定義。
Category此狀態(tài)所屬的類別的唯一整數(shù)標(biāo)識(shí)符。類別標(biāo)識(shí)符值由使用標(biāo)準(zhǔn)ExtendedStatusBlock數(shù)據(jù)結(jié)構(gòu)的簡(jiǎn)檔來定義。
SubCategory用于進(jìn)一步分類由此塊所描述的狀態(tài)類型的子類別的整數(shù)標(biāo)識(shí)符(在所述類別內(nèi)是唯一的)。
LocalFlags其語義局限于此狀態(tài)塊的類別和子類別局部的布爾標(biāo)志。標(biāo)志的位置和意義由用于定義并使用類別語義的簡(jiǎn)檔來定義。
CacheDuration表明此狀態(tài)可以被高速緩存(即保持有效)的持續(xù)時(shí)間。對(duì)于怎樣來定義實(shí)際的持續(xù)時(shí)間值,參見下面CacheDurationBlock類型的定義。
Parameter零或更多ValueBlocks的列表。每個(gè)ValueBlock包含被編碼為類型參數(shù)或ExtendedParameter值的參數(shù)。每個(gè)參數(shù)把名稱綁定到類型值,并且用來編碼靈活的變量數(shù)據(jù),所述變量數(shù)據(jù)用于依照比只是類別、子類別、高速緩存持續(xù)時(shí)間和標(biāo)志更詳細(xì)的細(xì)節(jié)來描述狀態(tài)塊。
CacheDurationBlock Type用于值類型的整數(shù)標(biāo)識(shí)符。在一個(gè)實(shí)施例中,定義以下類型 Value32比特整數(shù),其意義取決于類型字段。
1.25.4.標(biāo)準(zhǔn)的結(jié)果代碼 在各個(gè)API中使用標(biāo)準(zhǔn)的結(jié)果代碼??梢远x其它結(jié)果代碼以供在更特定的API中使用。
1.26.匯編器語法 此節(jié)描述了用于把程序編譯為在此的其它地方所描述的字節(jié)碼格式的示例性語法。應(yīng)當(dāng)理解,這只是一個(gè)可能語法的一個(gè)例子,并且可以使用任何適當(dāng)?shù)恼Z法。如先前所表明,還應(yīng)當(dāng)理解,這里所給出的字節(jié)碼格式也只是一個(gè)例子,并且這里所描述的系統(tǒng)和方法可以被以任何其它適當(dāng)?shù)淖止?jié)代碼格式或其它代碼格式的方式使用。
匯編器讀取包含代碼、數(shù)據(jù)和處理指令的源文件,并且生成可以由控制虛擬機(jī)所加載的二進(jìn)制代碼模塊。在一個(gè)說明性實(shí)施例中,匯編器逐行順序地處理源文件。行可以是零或更多符號(hào),后面是換行符。每行可以是以下之一空行(只是空白的)、段命令、數(shù)據(jù)命令、匯編器命令、代碼指令、標(biāo)記或輸出命令。另外,每行可以以注解結(jié)束,其以‘;’符號(hào)開始并且繼續(xù)直到該行的末尾。
從源文件所讀取的數(shù)據(jù)和指令具有隱式的目的地段(即,其中當(dāng)它們被VM加載時(shí)結(jié)束)。在解析過程期間的任何一點(diǎn),匯編器具有“當(dāng)前”段,其是用于數(shù)據(jù)和指令的隱式目的地段??梢允褂枚沃噶顏砀淖儺?dāng)前段。
1.26.1.段命令 段命令改變解析器的當(dāng)前段。在一個(gè)實(shí)施例中,所支持的段命令是.code和.data。.code段保持字節(jié)代碼指令,并且.data段保持全局變量。
1.26.2.數(shù)據(jù)命令 數(shù)據(jù)命令指定將被加載到虛擬機(jī)的數(shù)據(jù)段中的數(shù)據(jù)(例如,整數(shù)和字符串)。在一個(gè)實(shí)施例中,所支持的數(shù)據(jù)命令是 ●.string“<some chars>”——指定一串符號(hào)。在一個(gè)實(shí)施例中,匯編器在字符串末尾添加值為0的八位字節(jié)。
●.byte<value>——指定8比特值。<value>可以被表示為十進(jìn)制數(shù)或十六進(jìn)制數(shù)(前綴為0x)。
●.long<value>——指定32比特值。<value>可以被表示為十進(jìn)制數(shù)或十六進(jìn)制數(shù)(前綴為0x)。
1.26.3.匯編器命令 在一個(gè)實(shí)施例中,所支持的匯編器命令是.equ<symbol>、<value>,用于把符號(hào)<symbol>設(shè)置為等于值<value>。符號(hào)一般被用為操作數(shù)或代碼指令。
1.26.4.標(biāo)簽 標(biāo)簽是指向段內(nèi)位置的符號(hào)。指向代碼段中指令的標(biāo)簽一般用于跳轉(zhuǎn)/分支指令。指向數(shù)據(jù)段中數(shù)據(jù)的標(biāo)簽一般用于參照變量。在一個(gè)實(shí)施例中,用于標(biāo)簽的語法是<LABEL> 注意,除可選注解之外,在“:”之后什么都沒有。標(biāo)簽指向下一數(shù)據(jù)或指令的位置。在一個(gè)實(shí)施例中,可以具有指向相同地址的一個(gè)以上標(biāo)簽。
1.26.5.輸出命令 輸出命令用來在由匯編器所生成的代碼模塊的“輸出”節(jié)中創(chuàng)建入口。輸出節(jié)中的每個(gè)入口是(名稱,地址)對(duì)。在所討論的說明性實(shí)施例中,僅有代碼段內(nèi)的地址能夠被在輸出節(jié)中指定。
輸出命令的語法是.export<label>,用于輸出由<label>指向的地址,其名稱為“<label>”。
1.26.6.代碼指令 當(dāng)編譯前往代碼段的數(shù)據(jù)時(shí),匯編器讀取用于直接或間接映射成字節(jié)代碼的指令。在上面所示出的示例性指令集中,大部分虛擬機(jī)字節(jié)代碼沒有直接的操作數(shù),并且在一行上以簡(jiǎn)單的助記符形式出現(xiàn)。為了使匯編器語法更加可讀,一些指令接受偽操作數(shù),所述偽操作數(shù)看起來好像它們是字節(jié)代碼操作數(shù),但是實(shí)際上并不是;在這種情況下,匯編器產(chǎn)生一個(gè)或多個(gè)字節(jié)代碼指令以便產(chǎn)生就像所述指令的確具有直接操作數(shù)那樣相同的效果。例如,分支指令使用偽操作數(shù)。
1.26.6.1.分支操作數(shù) 分支指令可以被逐字指定(沒有任何操作數(shù)),或者被用被匯編器轉(zhuǎn)換為相應(yīng)的字節(jié)代碼序列的可選操作數(shù)指定。可選操作數(shù)是整數(shù)常數(shù)或符號(hào)。當(dāng)操作數(shù)是符號(hào)時(shí),匯編器計(jì)算正確的整數(shù)相對(duì)偏移,使得分支結(jié)束于對(duì)應(yīng)于所述符號(hào)的地址。
1.26.6.2.操作數(shù)入棧 在一個(gè)實(shí)施例中,PUSH指令始終獲取一個(gè)操作數(shù)。該操作數(shù)可以是整數(shù)常數(shù)、符號(hào)或前綴“@”后面直接是標(biāo)簽名稱之一。當(dāng)該操作數(shù)是符號(hào)時(shí),進(jìn)棧的值是該符號(hào)的直接值,而不管所述符號(hào)是標(biāo)簽還是.equ符號(hào)(并不按照段偏移增加該值)。當(dāng)該操作數(shù)是具有前綴“@”的標(biāo)簽名稱時(shí),進(jìn)棧的值取決于標(biāo)簽指向什么。被壓進(jìn)堆棧的值是由標(biāo)簽所表示的絕對(duì)地址(即,被添加到段偏移的本地標(biāo)簽值)。
1.26.7.例子 ;常數(shù) .equ SOMECONST,7 ;下面進(jìn)入到數(shù)據(jù)段中 .data VAR1: .byte8 VAR2: .string“hello\0” VAR3: .long0xFFFCDA07 VAR4: .long0 ;下面進(jìn)入到代碼段中 .code FOO: PUSH1 ADD RET BAR: PUSH2 PUSH@FOO ;進(jìn)棧標(biāo)簽FOO的地址 JSR ;跳轉(zhuǎn)到標(biāo)簽FOO處的代碼 PUSHSOMECONST ;進(jìn)棧值7 PUSH@VAR1 ;進(jìn)棧VAR1的地址 PUSH VAR1 ;進(jìn)棧數(shù)據(jù)段內(nèi)VAR1的偏移 PUSH@VAR3 ;進(jìn)棧VAR3的地址 PEEK ;進(jìn)棧VAR3的值 PUSH@VAR4 ;進(jìn)棧VAR4的地址 POKE ;把堆棧頂部上的值存儲(chǔ)到VAR4中 PUSH@VAR2 ;進(jìn)棧字符串“hello”的地址 1.26.8.命令行語法 在一個(gè)實(shí)施例中,匯編器是可以利用以下語法調(diào)用的命令行工具“PktAssembler[options]<input_file_path><output_file_path>”,其中[options]可以是-cs int,-ds int,-xmlid或-h,其中“-cs int”是代碼段地址值(默認(rèn)=8),“-ds int”是數(shù)據(jù)段地址值(默認(rèn)=4),“-xml id”用來輸出控制對(duì)象作為具有所指定ID的XML文件,并且“-h”用來顯示幫助信息。
9.控制 此節(jié)描述了控制對(duì)象的說明性實(shí)施例??刂茖?duì)象可以用來表示用于通過準(zhǔn)許或拒絕使用它們所控制的內(nèi)容密鑰對(duì)象來管理支配對(duì)內(nèi)容進(jìn)行訪問的規(guī)則。它們還可以用來表示對(duì)它們被嵌入到的鏈路對(duì)象的有效性的約束。它們還可以被用為獨(dú)立程序容器,代表諸如代理或委托之類的另一實(shí)體來運(yùn)行所述獨(dú)立程序容器。在一個(gè)實(shí)施例中,控制包含元數(shù)據(jù)和字節(jié)代碼程序,用于執(zhí)行特定的交互協(xié)議??刂茀f(xié)議的目的在于經(jīng)由DRM引擎來指定在DRM引擎和控制程序之間或在主機(jī)應(yīng)用和控制程序之間的交互。此節(jié)還描述了應(yīng)用可以對(duì)內(nèi)容執(zhí)行的說明性動(dòng)作,所述動(dòng)作的參數(shù)應(yīng)當(dāng)被提供給控制程序,并且還描述所述控制程序怎樣編碼用于表明可以或不可以執(zhí)行所請(qǐng)求動(dòng)作的返回狀態(tài)以及可以進(jìn)一步描述所述返回狀態(tài)的參數(shù)。
在此節(jié)中,使用以下縮寫和字母縮略詞( ●ESB擴(kuò)展?fàn)顟B(tài)塊 ●LSB最低有效位 ●字節(jié)8比特值或八位字節(jié) ●字節(jié)代碼用于編碼可執(zhí)行指令及其操作數(shù)的字節(jié)流 1.27.控制程序 在一個(gè)實(shí)施例中,控制對(duì)象包含控制程序??刂瞥绦虬ùa模塊,所述代碼模塊包含可由虛擬機(jī)執(zhí)行的字節(jié)代碼,以及命名例程列表(例如,輸出表中的入口)。
在一個(gè)實(shí)施例中,用于表示用來管理支配對(duì)內(nèi)容項(xiàng)執(zhí)行某個(gè)操作(諸如“播放”)的規(guī)則的例程集被稱作‘動(dòng)作控制’。用于表示對(duì)鏈路對(duì)象的有效性約束的例程集被稱作“鏈路約束”。旨在代表遠(yuǎn)程實(shí)體執(zhí)行的例程集(諸如在不同主機(jī)上運(yùn)行的DRM引擎的情況下在協(xié)議會(huì)話期間)被稱作“代理”。旨在代表另一控制執(zhí)行的例程集(諸如當(dāng)控制程序使用System.Host.CallVm系統(tǒng)調(diào)用時(shí))被稱作“委托”。
1.27.1.通向控制程序的接口 在一個(gè)實(shí)施例中,由在主機(jī)環(huán)境中運(yùn)行的虛擬機(jī)來執(zhí)行控制程序。可以依照任何適當(dāng)?shù)姆绞絹韴?zhí)行主機(jī)環(huán)境;然而,為了便于解釋以及為了圖示,在下面論述中假定虛擬機(jī)主機(jī)環(huán)境的實(shí)現(xiàn)方式在邏輯上可以被分成兩個(gè)部分主機(jī)應(yīng)用和DRM引擎。然而應(yīng)當(dāng)理解,其它實(shí)施例可以具有不同的邏輯功能劃分,其可以等價(jià)于上述邏輯結(jié)構(gòu)。
如在圖29中所示出,在優(yōu)選實(shí)施例中,DRM引擎2908是在主機(jī)應(yīng)用2900和控制程序2906之間的邏輯接口。主機(jī)應(yīng)用2900向引擎2908做出邏輯請(qǐng)求,諸如為了某個(gè)目的(例如,播放或再現(xiàn)內(nèi)容流)而請(qǐng)求訪問內(nèi)容密鑰。在一個(gè)實(shí)施例中,引擎2908確保正確地實(shí)現(xiàn)下述交互協(xié)議,諸如通過確保關(guān)于控制程序的初始化、調(diào)用序列及其它交互細(xì)節(jié)的任何保證被滿足來正確地實(shí)現(xiàn)。
當(dāng)主機(jī)應(yīng)用2900請(qǐng)求使用用于一組內(nèi)容ID的內(nèi)容密鑰時(shí),DRM引擎2908確定使用哪個(gè)控制對(duì)象。保護(hù)器對(duì)象允許引擎分析對(duì)于所請(qǐng)求的內(nèi)容ID來說哪些內(nèi)容密鑰對(duì)象需要被訪問。然后所述引擎尋找引用那些內(nèi)容密鑰對(duì)象的控制器對(duì)象。在一個(gè)實(shí)施例中,控制器對(duì)象可以引用一個(gè)以上內(nèi)容密鑰對(duì)象。這允許多個(gè)內(nèi)容密鑰對(duì)象由相同的控制對(duì)象來管理支配。當(dāng)主機(jī)應(yīng)用通過調(diào)用動(dòng)作來請(qǐng)求訪問內(nèi)容密鑰時(shí),它可以請(qǐng)求作為一組的內(nèi)容ID,在這個(gè)意義上對(duì)應(yīng)于它們的內(nèi)容密鑰對(duì)象由相同的控制器對(duì)象來引用。在一個(gè)實(shí)施例中,不允許對(duì)訪問由一個(gè)以上控制器對(duì)象引用的一組內(nèi)容密鑰的請(qǐng)求。
在一個(gè)實(shí)施例中,DRM引擎遵循用于把動(dòng)作映射到例程名稱的約定。例如在一個(gè)實(shí)施例中,對(duì)于下述每個(gè)例程來說,在代碼模塊的輸出表入口中出現(xiàn)的名稱是下面在節(jié)9.1.4-9.1.7中所示出的各自字符串。
1.27.1.1.控制加載 在一個(gè)實(shí)施例中,在引擎可以進(jìn)行調(diào)用以便控制例程之前,它需要把控制的代碼模塊加載到虛擬機(jī)中。在一個(gè)實(shí)施例中,每個(gè)VM只加載一個(gè)代碼模塊。
1.27.1.2.原子性(Atomicity) 在一個(gè)實(shí)施例中,該引擎確保對(duì)控制程序內(nèi)例程的調(diào)用相對(duì)于它使所述例程可用的資源來說是原子的,所述資源諸如對(duì)象(或“狀態(tài)”)數(shù)據(jù)庫。從而,在這種實(shí)施例中,所述引擎需要確保在執(zhí)行它所調(diào)用的任何例程期間那些資源保持不被修改。這可以通過在例程調(diào)用期間有效地鎖定那些資源或者通過防止多個(gè)VM并發(fā)地運(yùn)行來完成。然而,所述引擎不必保證那些資源在連續(xù)的例程調(diào)用之間都不被修改。
1.27.2.控制協(xié)議 在一個(gè)實(shí)施例中,例程命名、輸入/輸出接口和用于代碼模塊中每個(gè)例程的數(shù)據(jù)結(jié)構(gòu)一起構(gòu)成控制協(xié)議。在控制對(duì)象的“協(xié)議”字段中表示由代碼模塊實(shí)現(xiàn)的協(xié)議。下述說明性控制協(xié)議被稱作標(biāo)準(zhǔn)控制協(xié)議,并且其標(biāo)識(shí)符(‘協(xié)議’字段值)是“http://www.octopus-drm.com/specs/scp-1_0”。
在一個(gè)實(shí)施例中,在DRM引擎加載代碼模塊并且調(diào)用控制程序中的例程之前,它需要保證與控制程序的交互要符合在協(xié)議字段中表示的特定協(xié)議id的規(guī)范。這包括關(guān)于需要實(shí)現(xiàn)的虛擬機(jī)特征的任何保證、關(guān)于可用于控制程序的地址空間大小的保證等。
對(duì)于諸如標(biāo)準(zhǔn)控制協(xié)議之類的控制協(xié)議來說,可以在不必創(chuàng)建新的協(xié)議規(guī)范的情況下隨時(shí)間推移而演進(jìn)。只要對(duì)協(xié)議所作出的改變符合規(guī)范的先前修訂版,并且只要DRM引擎的現(xiàn)有實(shí)現(xiàn)方式以及符合該協(xié)議的現(xiàn)有控制程序繼續(xù)依照所述規(guī)范來執(zhí)行,那么所述改變就被認(rèn)為是兼容的。這種改變例如可以包括新的動(dòng)作類型。
1.27.3.字節(jié)代碼類型 在上述涉及標(biāo)準(zhǔn)控制協(xié)議的說明性實(shí)施例中,字節(jié)代碼模塊的類型是“Plankton字節(jié)代碼模塊版本1.0”。在此示例性實(shí)施例中,控制對(duì)象的“類型”字段值是“http://www.octopus-drm.com/specs/pkcm-1_0”。
1.27.4.通用控制例程 通用例程是適用所述控制作為總體的例程,并且對(duì)于給定的動(dòng)作或鏈路約束并不是專門的。在一個(gè)說明性實(shí)施例中使用以下通用控制例程 1.27.4.1.Control.Init 此例程是可選的(即,在所有控制中都不要求此例程)。如果使用此例程,那么在任何其它控制例程被調(diào)用之前,該引擎調(diào)用此例程一次。所述例程沒有輸入,并且向堆棧頂部返回ResultCode(結(jié)果代碼)作為輸出。ResultCode在成功時(shí)為0,或者在失敗時(shí)為負(fù)錯(cuò)誤代碼。在一個(gè)實(shí)施例中,如果ResultCode不是0,那么該引擎中止當(dāng)前的控制操作并且不對(duì)用于此控制的例程進(jìn)行任何進(jìn)一步的調(diào)用。
1.27.4.2.Control.Describe 此例程是可選的。通常,當(dāng)應(yīng)用請(qǐng)求由控制程序(即并非是針對(duì)具體動(dòng)作)表示的規(guī)則的意義描述時(shí)調(diào)用該例程。所述例程沒有輸入,并且向堆棧頂部返回ResultCode和StatusBlockPointer(狀態(tài)塊指針)作為輸出,其中ResultCode是整數(shù)值(如果例程成功完成那么為0,否則為負(fù)錯(cuò)誤代碼),并且其中StatusBlockPointer是標(biāo)準(zhǔn)ExtendedStatusBlock(擴(kuò)展?fàn)顟B(tài)塊)的地址。ExtendedStatusBlock包含這樣的信息,應(yīng)用可以解釋該信息并使用它來向用戶提供關(guān)于由控制程序所表示規(guī)則的意義的信息。
1.27.4.3.Control.Release 此例程是可選的。如果此例程存在,那么DRM引擎在它不再需要調(diào)用用于控制的任何其它例程之后調(diào)用所述例程一次。對(duì)于控制來說將不調(diào)用其它例程,除非啟動(dòng)了該控制的新使用(在這種情況下,Control.Init例程被再次調(diào)用)。所述例程沒有輸入,并且向堆棧頂部返回ResultCode作為輸出。ResultCode在成功時(shí)為0,或者在失敗時(shí)為負(fù)錯(cuò)誤代碼。
1.27.5.動(dòng)作例程 每個(gè)可能的動(dòng)作具有名稱(例如,播放,轉(zhuǎn)送,輸出等)。在一個(gè)說明性實(shí)施例中,對(duì)于給定動(dòng)作<Action>來說,以下例程名稱被定義(其中“<Action>”標(biāo)示動(dòng)作的實(shí)際名稱(例如,“播放”,“轉(zhuǎn)送”,“輸出”等)) 1.27.5.1.Control.Actions.<Action>.Init 此例程是可選的。如果此例程存在,那么在為此動(dòng)作調(diào)用任何其它例程之前,引擎調(diào)用此例程一次。所述例程沒有輸入,并且向堆棧頂部返回ResultCode作為輸出。ResultCode在成功時(shí)為0,或者在失敗時(shí)為負(fù)錯(cuò)誤代碼。在一個(gè)實(shí)施例中,如果ResultCode不是0,那么該引擎中止當(dāng)前動(dòng)作并且不對(duì)用于此控制中此動(dòng)作的例程做出任何進(jìn)一步的調(diào)用。
1.27.5.2.Control.Actions.<Action>.Check 在所論述的說明性實(shí)施例中,此例程被要求,并且被調(diào)用來在實(shí)際上沒有執(zhí)行給定動(dòng)作的情況下檢查如果將為該動(dòng)作而調(diào)用執(zhí)行例程那么返回狀態(tài)會(huì)是什么。對(duì)于此例程來說重要的是沒有任何副作用。注意,如果執(zhí)行例程也沒有副作用,那么控制的入口表中的檢查和執(zhí)行入口可以指向相同的例程。此例程具有與下述執(zhí)行例程相同的輸入和輸出。
1.27.5.3.Control.Actions.<Action>.Perform 在一個(gè)實(shí)施例中,此例程被要求,并且當(dāng)應(yīng)用即將執(zhí)行動(dòng)作時(shí)被調(diào)用。所述例程沒有輸入,并且向堆棧頂部返回ResultCode和StatusBlockPointer作為輸出,其中ResultCode是整數(shù)值(如果例程成功完成那么為0,否則為負(fù)錯(cuò)誤代碼),并且其中StatusBlockPointer是標(biāo)準(zhǔn)ExtendedStatusBlock的地址。注意,在一個(gè)實(shí)施例中,成功ResultCode(即,0)并不意味著所述請(qǐng)求被準(zhǔn)許了。它只意味著所述例程能夠沒有錯(cuò)誤地運(yùn)行。是ExtendedStatusBlock表明所述請(qǐng)求是被準(zhǔn)許了還是拒絕了。然而,如果ResultCode表明失敗的話,那么主機(jī)應(yīng)用就好像所述請(qǐng)求被拒絕一樣進(jìn)行。例如在一個(gè)實(shí)施例中,StatusBlock的類別應(yīng)當(dāng)為ACTION_DENIED,或者所返回的ExtendedStatusBlock被決絕,因而主機(jī)應(yīng)用中止該動(dòng)作。
當(dāng)執(zhí)行動(dòng)作時(shí),只有執(zhí)行例程需要被調(diào)用。所述引擎不必事先調(diào)用檢查例程。執(zhí)行例程的實(shí)現(xiàn)可以內(nèi)部調(diào)用檢查例程(如果它選擇這樣作的話),但是不應(yīng)當(dāng)假定所述系統(tǒng)將已經(jīng)事先調(diào)用了所述檢查例程。
1.27.5.4.Control.Actions.<Action>.Describe 此例程是可選的,并且當(dāng)應(yīng)用請(qǐng)求由控制程序?yàn)榻o定動(dòng)作所表示的規(guī)則和條件的意義描述時(shí)被調(diào)用。所述例程沒有輸入,并且向堆棧頂部返回ResultCode和StatusBlockPointer作為輸出,其中ResultCode是整數(shù)值(如果例程成功完成那么為0,否則為負(fù)錯(cuò)誤代碼),并且其中StatusBlockPointer是標(biāo)準(zhǔn)ExtendedStatusBlock的地址。
1.27.5.5.Control.Actions.<Action>.Release 此例程是可選的。如果此例程存在,那么在DRM引擎不再需要調(diào)用用于給定動(dòng)作的任何其它例程之后所述例程被調(diào)用一次。對(duì)于給定動(dòng)作來說不調(diào)用其它例程,除非啟動(dòng)所述動(dòng)作的新使用(在這種情況下,Init例程被再次調(diào)用)。所述例程沒有輸入,并且向堆棧頂部返回ResultCode作為輸出。ResultCode在成功時(shí)為0,并且在失敗時(shí)為負(fù)錯(cuò)誤代碼。如果ResultCode不為0,那么所述引擎不對(duì)用于給定動(dòng)作的例程進(jìn)行任何進(jìn)一步的調(diào)用。
1.27.6.鏈路約束例程 在一個(gè)實(shí)施例中,當(dāng)鏈路對(duì)象具有嵌入的控制時(shí),DRM引擎在該控制中調(diào)用鏈路約束例程以便驗(yàn)證所述鏈路對(duì)象的有效性。在一個(gè)說明性實(shí)施例中使用以下鏈路約束例程 1.27.6.1.Control.Link.Constraint.Init 此例程是可選的,并且如果它存在的話,那么在為給定鏈路約束調(diào)用任何其它例程之前此例程被調(diào)用恰好一次。所述例程沒有輸入,并且向堆棧頂部返回ResultCode作為輸出。ResultCode在成功時(shí)為0并且在失敗時(shí)為負(fù)錯(cuò)誤代碼。如果ResultCode不為0,那么該引擎認(rèn)為對(duì)鏈路對(duì)象的有效性約束未被滿足,并且避免對(duì)用于所述鏈路控制的例程進(jìn)行進(jìn)一步調(diào)用。
1.27.6.2.Control.Link.Constraint.Check 在所論述的說明性實(shí)施例中,此例程被要求,并且被調(diào)用來檢查是否滿足對(duì)給定鏈路的有效性約束。所述例程沒有輸入,并且向堆棧頂部返回ResultCode和StatusBlockPointer作為輸出,其中ResultCode是整數(shù)值(如果例程成功完成那么為0,否則為負(fù)錯(cuò)誤代碼),并且其中StatusBlockPointer是標(biāo)準(zhǔn)ExtendedStatusBlock的地址。如果ResultCode不為0,那么引擎認(rèn)為對(duì)鏈路對(duì)象的有效性約束未被滿足,并且避免對(duì)用于所述鏈路控制的例程做出進(jìn)一步調(diào)用。即便ResultCode為0(成功),這也不意味著所述約束已經(jīng)滿足;它只意味著所述例程能夠沒有錯(cuò)誤地運(yùn)行。是StatusBlock表明是否滿足所述約束。
1.27.6.3.Control.Link.Constraint.Describe 此例程是可選的,并且當(dāng)應(yīng)用請(qǐng)求由控制程序?yàn)榻o定鏈路所表示的約束意義的描述時(shí)被調(diào)用。所述例程沒有輸入,并且向堆棧頂部返回ResultCode和StatusBlockPointer作為輸出,其中ResultCode是整數(shù)值(如果例程成功完成那么為0,否則為負(fù)錯(cuò)誤代碼),并且其中StatusBlockPointer是標(biāo)準(zhǔn)ExtendedStatusBlock的地址。
1.27.6.4.Control.Link.Constraint.Release 此例程是可選的,并且如果它存在的話,那么在引擎不再需要為給定約束調(diào)用任何其它例程之后由所述引擎調(diào)用一次。所述例程沒有輸入,并且向堆棧頂部返回ResultCode作為輸出。ResultCode在成功時(shí)為0并且在失敗時(shí)為負(fù)錯(cuò)誤代碼。在所論述的實(shí)施例中,在調(diào)用此例程之后,除非開始新的循環(huán)(在這種情況下,再次調(diào)用Init例程),否則可以不為給定約束調(diào)用任何其它例程。類似地,如果ResultCode不是0,那么引擎不對(duì)用于所述給定鏈路約束的例程進(jìn)行進(jìn)一步的調(diào)用。
1.27.7.代理例程 在一個(gè)實(shí)施例中,代理是被設(shè)計(jì)成用于代表實(shí)體運(yùn)行的控制對(duì)象。一般在兩個(gè)端點(diǎn)之間的服務(wù)交互的情境下使用代理,其中一個(gè)端點(diǎn)需要在第二端點(diǎn)的情境內(nèi)執(zhí)行某個(gè)虛擬機(jī)代碼,并且可能獲得該執(zhí)行的結(jié)果。在一個(gè)實(shí)施例中,控制可以包含多個(gè)代理,并且每個(gè)代理可以包含能被執(zhí)行的任意數(shù)目的例程;然而在實(shí)踐中代理一般具有單個(gè)例程。
在一個(gè)說明性實(shí)施例中,為代理定義以下入口點(diǎn),其中<Agent>是指代代理的實(shí)際名稱的名稱字符串。
1.27.7.1.Control.Agents.<Agent>.Init 此例程是可選的,并且如果它存在的話,那么在為給定代理調(diào)用任何其它例程之前所述引擎調(diào)用此例程一次。所述例程沒有輸入,并且向堆棧頂部返回ResultCode作為輸出。ResultCode在成功時(shí)為0并且在失敗時(shí)為負(fù)錯(cuò)誤代碼。
1.27.7.2.Control.Agents.<Agent>.Run 在所討論的說明性實(shí)施例中,此例程被要求并且是代理的主例程。所述例程沒有輸入,并且向堆棧頂部返回ResultCode、ReturnBlockAddress(返回塊地址)和ReturnBlockSize(返回塊大小)作為輸出。ResultCode是整數(shù)值(如果例程成功完成那么為0,否則為負(fù)錯(cuò)誤代碼),ReturnBlockAddress是包含代理代碼被預(yù)期返回給調(diào)用方的數(shù)據(jù)的存儲(chǔ)器塊的地址,(如果例程不必返回任何東西,那么該地址為0),并且ReturnBlockSize是在ReturnBlockAddress的存儲(chǔ)塊器塊的字節(jié)大小。在一個(gè)實(shí)施例中,如果ReturnBlockAddress是0,那么ReturnBlockSize值也是0。
1.27.7.3.Control.Agents.<Agent>.Describe 此例程是可選的,并且當(dāng)應(yīng)用請(qǐng)求給定代理的描述時(shí)被調(diào)用。所述例程沒有輸入,并且向堆棧頂部返回ResultCode和StatusBlockPointer作為輸出,其中ResultCode是整數(shù)值(如果例程成功完成那么為0,否則為負(fù)錯(cuò)誤代碼),并且其中StatusBlockPointer是標(biāo)準(zhǔn)ExtendedStatusBlock的地址。
1.27.7.4.Control.Agents.<Agent>.Release 此例程是可選的,并且如果它存在的話,那么在引擎不再需要為此代理調(diào)用任何其它例程之后,所述引擎調(diào)用此例程一次。對(duì)于此代理來說不調(diào)用其它例程,除非開始新的循環(huán)(在這種情況下,Init例程被再次調(diào)用)。所述例程沒有輸入,并且向堆棧頂部返回ResultCode作為輸出。ResultCode在成功時(shí)為0并且在失敗時(shí)為負(fù)錯(cuò)誤代碼。
1.28.擴(kuò)展的狀態(tài)塊 以下示例性定義適用于由上述幾個(gè)例程的說明性實(shí)施例所返回的ExtendedStatusBlock(擴(kuò)展?fàn)顟B(tài)塊)數(shù)據(jù)結(jié)構(gòu)。結(jié)合描述虛擬機(jī)來描述ExtendedStatusBlock數(shù)據(jù)結(jié)構(gòu)的例子。
在一個(gè)實(shí)施例中,不存在全局ExtendedStatusBlock標(biāo)志。在此實(shí)施例中,控制程序把ExtendedStatuBlock的GlobalFlag(全局標(biāo)志)字段設(shè)置為0。
1.28.1.類別 依照一個(gè)實(shí)施例以下段落定義了用于ExtendedStatusBlocks的類別字段的值。在一個(gè)實(shí)施例中,這些類別都沒有子類別,從而ExtendedStatusBlocks的子類別字段的值被設(shè)置為0。
在一個(gè)實(shí)施例中,定義以下類別代碼 1.28.1.1.動(dòng)作檢查和執(zhí)行例程
在一個(gè)實(shí)施例中,在由動(dòng)作例程所返回的ExtendedStatusBlock參數(shù)的情境中,約束意指為了讓例程的結(jié)果返回具有類別ACTION_GRANTED的ExtendedStatusBlock而需要滿足的準(zhǔn)則或者要求為真的條件。
在一個(gè)實(shí)施例中,通用于上述兩個(gè)類別的LocalFlags(局部標(biāo)志)字段的值包括
在上面所示出的表中,所涉及的參數(shù)列表是ExtendedStatusBlock數(shù)據(jù)結(jié)構(gòu)的“參數(shù)”字段。
1.28.1.2.描述例程類別代碼 在一個(gè)實(shí)施例中,對(duì)于描述例程來說沒有定義類別代碼。在一個(gè)實(shí)施例中,與為動(dòng)作例程所定義的局部標(biāo)志相同的局部標(biāo)志適用于描述例程,并且描述例程應(yīng)當(dāng)在它們返回的ExtendedStatusBlock中包括名稱為如下面所指定的‘描述’的參數(shù)。在一個(gè)實(shí)施例中,描述例程在它們返回的ExtendedStatusBlock中不包含任何義務(wù)或回調(diào)參數(shù);然而描述例程應(yīng)當(dāng)在它們返回的ExtendedStatusBlock中包含用于描述適用于相應(yīng)動(dòng)作或鏈路約束的一些或所有約束的參數(shù)。
1.28.1.3.鏈路約束例程類別代碼
在一個(gè)實(shí)施例中,與為動(dòng)作例程所定義的局部標(biāo)志相同的局部標(biāo)志適用于這些類別中的每個(gè)。
在一個(gè)實(shí)施例中,在由鏈路約束例程所返回的ExtendedStatusBlock參數(shù)的情境中,約束意指為了讓例程的結(jié)果返回具有類別LINK_VALID的ExtendedStatusBlock而要求滿足的準(zhǔn)則或要求為真的條件。
1.28.2.高速緩存持續(xù)時(shí)間 ExtendedStatusBlock的CacheDuration(高速緩存持續(xù)時(shí)間)字段是在ExtendedStatusBlock中所編碼信息的有效時(shí)段的指示。當(dāng)ExtendedStatusBlock具有非零的有效時(shí)段時(shí),這意味著ExtendedStatusBlock可以被存儲(chǔ)在高速緩存器中,而且在該時(shí)段期間,對(duì)利用相同參數(shù)調(diào)用的確切相同的例程的調(diào)用會(huì)返回相同的ExtendedStatusBlock,因此高速緩存的值可以被返回到主機(jī)應(yīng)用而不是調(diào)用例程。
1.28.3.參數(shù) 一些參數(shù)用來傳達(dá)關(guān)于返回狀態(tài)以及用于模板處理的變量綁定的詳細(xì)信息,(參見節(jié)9.4)。
在一個(gè)實(shí)施例中,除義務(wù)和回調(diào)之外,這里所描述的所有約束嚴(yán)格地用于幫助主機(jī)應(yīng)用分類和顯示的目的,而并非用于強(qiáng)制實(shí)施使用規(guī)則。強(qiáng)制實(shí)施所述規(guī)則是控制程序的職責(zé)。
在一個(gè)實(shí)施例中,在下面節(jié)中所定義的參數(shù)被編碼為ParameterBlock(如果沒有參數(shù)標(biāo)志適用的話),或者被編碼為ExtendedParameterBlock(如果一個(gè)或多個(gè)標(biāo)志適用的話)。下面將描述代表性的標(biāo)志 1.28.3.1.描述 參數(shù)名Description(描述) 參數(shù)類型ValueList(值列表) 描述描述參數(shù)的列表。列表中的每個(gè)值是類型參數(shù)或擴(kuò)展參數(shù)。在一個(gè)實(shí)施例中,定義以下參數(shù)默認(rèn)、短和長(zhǎng)。它們中的每個(gè)如果存在的話.那么具有控制資源之一的ID值。該資源應(yīng)當(dāng)包含文本有效載荷或模板有效載荷。如果資源是模板,那么它被處理以便獲得結(jié)果的文本描述(整個(gè)控制程序或特定動(dòng)作的描述)。使用其中出現(xiàn)‘描述’參數(shù)的列表中的其它參數(shù)作為變量綁定來處理模板。
在一個(gè)實(shí)施例中,如果還包括‘默認(rèn)’描述,那么可以只包括‘短’和‘長(zhǎng)’描述。
1.28.3.2.約束 在一個(gè)實(shí)施例中,在包含類似類型的約束的列表中把約束參數(shù)編組。在一個(gè)實(shí)施例中,為一些類型定義標(biāo)準(zhǔn)的約束。在一個(gè)實(shí)施例中,如果約束參數(shù)的名稱在保證該名稱唯一性的名稱空間中為URN,那么控制可以返回未包括在標(biāo)準(zhǔn)約束組內(nèi)的約束參數(shù)。這可以包括銷售商專用的約束或在其它規(guī)范中所定義的約束。
1.28.3.2.1.通用約束 參數(shù)名GenericConstraints(通用約束) 參數(shù)類型ValueList(值列表) 描述可以適用的通用約束的列表。列表中的每個(gè)值屬于類型參數(shù)或擴(kuò)展參數(shù)。
在一個(gè)實(shí)施例中,通用約束是不屬于在此節(jié)中所定義的任何其它約束類型的約束。在一個(gè)實(shí)施例中,沒有定義通用約束參數(shù)。
1.28.3.2.2.時(shí)間約束 參數(shù)名TemporalConstraints(時(shí)間約束) 參數(shù)類型ValueList(值列表) 描述可以適用的時(shí)間約束的列表。列表中的每個(gè)值是類型參數(shù)或擴(kuò)展參數(shù)。時(shí)間約束是與時(shí)間、日期、持續(xù)時(shí)間等相關(guān)的約束。在一個(gè)實(shí)施例中,定義以下時(shí)間約束參數(shù)
1.28.3.2.3.空間約束 參數(shù)名SpatialConstraints(空間約束) 參數(shù)類型ValueList(值列表) 描述可以適用的空間約束的列表。在一個(gè)實(shí)施例中,列表中的每個(gè)值屬于類型參數(shù)或擴(kuò)展參數(shù)??臻g約束是與物理位置相關(guān)的約束。在一個(gè)實(shí)施例中,沒有定義標(biāo)準(zhǔn)的空間約束。
1.28.3.2.4.組約束 參數(shù)名GroupConstraints(組約束) 參數(shù)類型ValueList(值列表) 描述可以適用的組約束的列表。列表中的每個(gè)值是類型參數(shù)或擴(kuò)展參數(shù)。組約束是與組、組成員資格、身份組等相關(guān)的約束。在一個(gè)實(shí)施例中,定義以下參數(shù)
1.28.3.2.5.設(shè)備約束 參數(shù)名DeviceConstraints(設(shè)備約束) 參數(shù)類型ValueList(值列表) 描述可以適用的設(shè)備約束的列表。列表中的每個(gè)值屬于類型參數(shù)或擴(kuò)展參數(shù)。設(shè)備約束是與設(shè)備的特性相關(guān)的約束,所述特性諸如特征、屬性、名稱、標(biāo)識(shí)符等。在一個(gè)實(shí)施例中,定義以下參數(shù)
1.28.3.2.6.計(jì)數(shù)器約束 參數(shù)名CounterConstraints(計(jì)數(shù)器約束) 參數(shù)類型ValueList(值列表) 描述可以適用的計(jì)數(shù)約束的列表。列表中的每個(gè)值屬于類型參數(shù)或擴(kuò)展參數(shù)。計(jì)數(shù)約束是與計(jì)數(shù)值相關(guān)的約束,諸如播放計(jì)數(shù)、累積計(jì)數(shù)等。在一個(gè)實(shí)施例中,沒有定義標(biāo)準(zhǔn)的計(jì)數(shù)約束。
1.28.3.3.參數(shù)標(biāo)志 在一個(gè)實(shí)施例中,以下標(biāo)志當(dāng)被編碼為ExtendedStatusBlock時(shí)可以用于在節(jié)9.2.3中所描述的所有參數(shù) 1.29.義務(wù)和回調(diào) 在一個(gè)實(shí)施例中,某些動(dòng)作當(dāng)被準(zhǔn)許時(shí)要求來自主機(jī)應(yīng)用的進(jìn)一步參與。義務(wù)表示當(dāng)使用主機(jī)應(yīng)用請(qǐng)求的內(nèi)容密鑰時(shí)或在此之后需要由所述主機(jī)應(yīng)用執(zhí)行的操作?;卣{(diào)表示對(duì)一個(gè)或多個(gè)控制程序例程的調(diào)用,所述控制程序例程當(dāng)使用所請(qǐng)求的內(nèi)容密鑰時(shí)或在此之后需要被主機(jī)應(yīng)用執(zhí)行。
在一個(gè)實(shí)施例中,如果應(yīng)用遇到它不支持或者不理解的任何關(guān)鍵的義務(wù)或回調(diào)(例如因?yàn)樗隽x務(wù)類型可能在執(zhí)行應(yīng)用之后才定義),那么它必須拒絕繼續(xù)執(zhí)行為其返回此義務(wù)或回調(diào)參數(shù)的動(dòng)作。在一個(gè)實(shí)施例中,通過為用于描述關(guān)鍵的義務(wù)或回調(diào)的參數(shù)設(shè)置CRITICAL參數(shù)來表明所述關(guān)鍵的義務(wù)或回調(diào)。
如果控制具有副作用(諸如減小播放計(jì)數(shù)),那么它應(yīng)當(dāng)使用OnAccept回調(diào)來要求主機(jī)應(yīng)用調(diào)用某一例程(如果它能夠理解并符合所有關(guān)鍵的義務(wù)和回調(diào)的話)。所述副作用應(yīng)當(dāng)發(fā)生在回調(diào)例程中。在一個(gè)示例性實(shí)施例中,實(shí)現(xiàn)方式被要求來理解并實(shí)現(xiàn)OnAccept回調(diào),這是因?yàn)樗梢杂糜诜乐垢弊饔?例如對(duì)狀態(tài)數(shù)據(jù)庫的更新)提前出現(xiàn)(例如在主機(jī)應(yīng)用確定它不能符合給定的關(guān)鍵義務(wù)或回調(diào)并且需要終止動(dòng)作執(zhí)行之前),從而提供事務(wù)原子性的量度。
1.29.1.參數(shù) 以下參數(shù)定義了可以在ExtendedStatusBlock數(shù)據(jù)結(jié)構(gòu)中返回的幾種類型的義務(wù)和回調(diào)。
1.29.1.1.義務(wù) 參數(shù)名Obligations 參數(shù)類型ValueList 描述義務(wù)參數(shù)的列表。列表中的每個(gè)值屬于類型參數(shù)或擴(kuò)展參數(shù)。在一個(gè)實(shí)施例中,定義以下義務(wù)參數(shù)
1.29.1.2.回調(diào) 參數(shù)名Callbacks(回調(diào)) 參數(shù)類型ValueList 描述回調(diào)參數(shù)的列表。列表中的每個(gè)值屬于類型參數(shù)或擴(kuò)展參數(shù)。在一個(gè)實(shí)施例中,定義以下回調(diào)參數(shù)
在一個(gè)實(shí)施例中,在上表中所提及的‘回調(diào)’類型是具有三個(gè)ValueBlock(值塊)元項(xiàng)的ValueListBlock(值列表塊)
1.29.1.3.參數(shù)標(biāo)志 在一個(gè)實(shí)施例中,使用與在先前節(jié)中所定義的相同的參數(shù)標(biāo)志。在一個(gè)實(shí)施例中,要求調(diào)用方實(shí)現(xiàn)的回調(diào)和義務(wù)被標(biāo)記為CRITICAL,以避免向主機(jī)應(yīng)用給予忽略這些參數(shù)的選擇。
1.29.2.事件 在一個(gè)實(shí)施例中,由名稱來指定事件。取決于事件類型,可以定義用于進(jìn)一步指定所述事件的一組標(biāo)志。在一個(gè)實(shí)施例中,如果沒有為具體事件定義標(biāo)志,那么標(biāo)志字段值被設(shè)置為0。一些事件還可以指定當(dāng)出現(xiàn)所述事件時(shí)向回調(diào)例程提供一些信息。在一個(gè)實(shí)施例中,如果并不從所述主機(jī)應(yīng)用要求任何特殊信息,那么所述主機(jī)應(yīng)用必須利用空ArgumentsBlock(自變量塊)來調(diào)用(參見下面節(jié)3.3中回調(diào)例程接口的描述)。
在一個(gè)實(shí)施例中,如果主機(jī)應(yīng)用不理解或不支持在被標(biāo)記為CRITICAL的回調(diào)參數(shù)中的事件名稱,那么所述主機(jī)應(yīng)用必須把此參數(shù)認(rèn)為是不理解的CRITICAL參數(shù)(并且不能執(zhí)行對(duì)其請(qǐng)求權(quán)限的動(dòng)作)。
在一個(gè)實(shí)施例中,定義以下事件名
1.29.3.回調(diào)例程 在一個(gè)實(shí)施例中,回調(diào)例程獲取相同的輸入 Input堆棧頂部
Cookie在回調(diào)參數(shù)中所指定的Cookie字段的值。
ArgumentsBlockSize在此參數(shù)下在堆棧上所傳遞的數(shù)據(jù)字節(jié)數(shù)目。當(dāng)調(diào)用例程時(shí),所述堆棧包含由調(diào)用方所提供的值A(chǔ)rgumentsBlockSize(自變量塊大小),后面是數(shù)據(jù)字節(jié)ArgumentsBlockSize,所述ArgumentsBlockSize表明在頂部的自變量塊大小。在一個(gè)實(shí)施例中,如果所述大小不是4的倍數(shù),那么堆棧上的數(shù)據(jù)用0值字節(jié)來填充以便確保堆棧指針保持為4的倍數(shù)。
1.29.3.1.繼續(xù)回調(diào) 在一個(gè)實(shí)施例中,具有類型CONTINUE(繼續(xù))(類型ID=0)的回調(diào)具有以下輸出 Output堆棧頂部
ResultCode整數(shù)值。如果例程能夠執(zhí)行那么結(jié)果值為0,或者如果出現(xiàn)錯(cuò)誤那么結(jié)果值為負(fù)錯(cuò)誤代碼。
Description如果ResultCode表明回調(diào)例程能夠運(yùn)行(即所述值為0),那么主機(jī)應(yīng)用可以繼續(xù)當(dāng)前操作。如果ResultCode表明出現(xiàn)錯(cuò)誤,那么主機(jī)應(yīng)用中止當(dāng)前操作并且取消所有待決的回調(diào)和義務(wù)。
1.29.3.2.RESET(復(fù)位)回調(diào) 當(dāng)控制例程已經(jīng)在從例程所返回的ESB中指定了一個(gè)或多個(gè)類型為RESET的回調(diào)時(shí),當(dāng)滿足用于該回調(diào)的條件時(shí)主機(jī)應(yīng)用會(huì)調(diào)用任何指定的回調(diào)例程。在一個(gè)實(shí)施例中,一旦滿足任何回調(diào)的條件,主機(jī)應(yīng)用就需要 ●取消所有其它待決的回調(diào) ●取消所有當(dāng)前義務(wù) ●向該回調(diào)提供所要求的參數(shù)(如果存在任何的話) ●調(diào)用所指定的回調(diào)例程。
來自例程的返回狀態(tài)向主機(jī)應(yīng)用表明它是否可以繼續(xù)執(zhí)行當(dāng)前操作。在一個(gè)實(shí)施例中,如果權(quán)限被拒絕或者例程沒能成功地執(zhí)行,那么主機(jī)應(yīng)用必須中止當(dāng)前操作的執(zhí)行。類似地,如果權(quán)限被準(zhǔn)許,那么主機(jī)應(yīng)用必須遵守可能在ESB中返回的任何義務(wù)或回調(diào),就像它已經(jīng)調(diào)用原始的Control.Actions.<Action>.Perform routine一樣。先前的義務(wù)或回調(diào)規(guī)范不再有效。
在一個(gè)實(shí)施例中,被指定為用于此類回調(diào)的回調(diào)入口點(diǎn)的所有例程具有以下輸出 Output堆棧頂部 ResultCode整數(shù)值。如果例程能夠執(zhí)行那么結(jié)果值為0,或者如果出現(xiàn)錯(cuò)誤那么結(jié)果值為負(fù)錯(cuò)誤代碼。
StatusBlockPointer標(biāo)準(zhǔn)的擴(kuò)展?fàn)顟B(tài)塊的地址。
描述此例程的返回語義等價(jià)于對(duì)Control.Actions.<Action>.Perform例程所描述的語義。
1.30.元數(shù)據(jù)資源 在一個(gè)實(shí)施例中,控制對(duì)象可以包含元數(shù)據(jù)資源,其可以從在ExtendedStatusBlock數(shù)據(jù)結(jié)構(gòu)中所返回的參數(shù)來引用。資源可以是簡(jiǎn)單的文本、文本模板或其它數(shù)據(jù)類型。每個(gè)資源由資源ID標(biāo)識(shí),并且可以包含一個(gè)或多個(gè)文本串或編碼數(shù)據(jù),不同語言的每種版本一個(gè)。不要求為所有語言都提供資源。由主機(jī)應(yīng)用選擇哪種語言版本是最適于其需要。
資源通過作為擴(kuò)展包括在控制對(duì)象中而伴隨控制程序。資源Id映射到控制對(duì)象的內(nèi)部擴(kuò)展的Id,所述控制對(duì)象的內(nèi)部擴(kuò)展包含具有目前運(yùn)行的例程的代碼模塊。
為了計(jì)算資源對(duì)象的規(guī)范字節(jié)序列,在一個(gè)實(shí)施例中數(shù)據(jù)結(jié)構(gòu)描述如下
1.30.1.簡(jiǎn)單文本 簡(jiǎn)單文本被指定為MIME類型‘文本’ 1.30.2.文本模板 除標(biāo)準(zhǔn)的文本資源之外,在一個(gè)實(shí)施例中,定義了文本模板類型。用于此文本模板類型的MIME類型是‘text/vnd.intertrust.octopus-text-template’。
在一個(gè)實(shí)施例中,文本模板包含依照UTF-8編碼的文本符號(hào)以及命名占位符(placeholder),所述占位符將由從在參數(shù)列表中所返回的參數(shù)所獲得的文本值來代替,諸如ExtendedStatusBlock的。用于占位符的語法是‘\PLACEHOLDER\’,其中PLACEHOLDER指定參數(shù)塊和可選格式化提示的名稱。在一個(gè)實(shí)施例中,模板處理器必須利用該參數(shù)塊的值字段的格式化表示來替換整個(gè)令牌‘\PLACEHOLDER\’,并且下面在節(jié)4.2.1指定了對(duì)值數(shù)據(jù)的格式化。
在一個(gè)實(shí)施例中,如果符號(hào)‘\’出現(xiàn)在占位符之外的文本中,那么它必須被編碼為‘\\’,并且在文本中所有出現(xiàn)的‘\\’會(huì)被模板處理器恢復(fù)為‘\’。
用于占位符的語法為FORMAT|NAME,其中NAME是參數(shù)塊的名稱,并且FORMAT是用于把參數(shù)數(shù)據(jù)轉(zhuǎn)換為文本的格式化提示。如果用于參數(shù)值數(shù)據(jù)類型的默認(rèn)格式化規(guī)則就足夠了,那么可以省略格式化提示,并且占位符簡(jiǎn)單地為NAME。
1.30.2.1.格式化 1.30.2.1.1.默認(rèn)格式化 在一個(gè)實(shí)施例中,用于不同數(shù)值類型的默認(rèn)格式化規(guī)則為 1.30.2.1.2.顯式格式化 顯式格式名稱可以被用為占位符標(biāo)簽的FORMAT部分。如果遇到未知的FORMAT名稱,那么模板處理引擎使用默認(rèn)格式化規(guī)則。
1.31.上下文對(duì)象 在一個(gè)實(shí)施例中,當(dāng)執(zhí)行控制例程時(shí),它有權(quán)通過使用System.Host.GetObject系統(tǒng)調(diào)用來訪問多個(gè)上下文對(duì)象。
1.31.1.通用上下文 在一個(gè)實(shí)施例中,給出以下上下文情境以用于運(yùn)行控制。
1.31.2.運(yùn)行時(shí)上下文 在一個(gè)實(shí)施例中,對(duì)于在VM中運(yùn)行的所有控制給出以下上下文情境,其中已經(jīng)使用System.Host.SpawnVm系統(tǒng)調(diào)用創(chuàng)建了所述VM。在一個(gè)實(shí)施例中,此上下文情境必須是不存在的或者是用于控制的空容器,所述控制在不是使用System.Host.SpawnVm創(chuàng)建的VM中運(yùn)行。
1.31.3.控制上下文 在一個(gè)實(shí)施例中,每當(dāng)運(yùn)行控制的例程時(shí)給出以下上下文情境
1.31.4.控制器上下文 在一個(gè)實(shí)施例中,每當(dāng)控制的例程正在運(yùn)行并且由控制器對(duì)象指向所述控制時(shí)(例如,當(dāng)訪問內(nèi)容密鑰對(duì)象以便消費(fèi)受保護(hù)的內(nèi)容時(shí)),給出以下上下文情境。
在其中允許主機(jī)應(yīng)用只編組由單個(gè)控制器對(duì)象所控制的內(nèi)容密鑰的實(shí)施例中,對(duì)于給定動(dòng)作,只存在一個(gè)適用的控制器對(duì)象。
1.31.5.動(dòng)作上下文 在一個(gè)實(shí)施例中,每當(dāng)為了控制動(dòng)作目的調(diào)用控制時(shí)給出以下下上下文情境。
1.31.6.鏈路上下文 在一個(gè)實(shí)施例中,每當(dāng)為了限制鏈路對(duì)象的有效性而調(diào)用控制時(shí)(例如被嵌入到鏈路對(duì)象中的控制對(duì)象),給出以下上下文情境
1.31.7.代理上下文 在一個(gè)實(shí)施例中,每當(dāng)運(yùn)行控制的代理例程時(shí)給出以下下上下文情境
參數(shù)和會(huì)話容器通常用于允許這樣的協(xié)議,所述協(xié)議要求一個(gè)實(shí)體發(fā)送并運(yùn)行另一實(shí)體上的代理以便指定哪些輸入?yún)?shù)傳遞到所述代理,以及在某些條件下主機(jī)需要設(shè)置哪些會(huì)話上下文對(duì)象。某些會(huì)話上下文對(duì)象的存在或不存在可以使代理代碼能夠判定它是否作為它被設(shè)計(jì)成所支持的協(xié)議的一部分運(yùn)行,或者它是否在上下文之外運(yùn)行,在這種情況下它可以拒絕運(yùn)行。例如,其目的在于在它運(yùn)行的主機(jī)上創(chuàng)建狀態(tài)對(duì)象的代理可以拒絕運(yùn)行,除非它在特定的協(xié)議交互期間被執(zhí)行。
1.32.動(dòng)作 在一個(gè)實(shí)施例中,每個(gè)動(dòng)作具有了名字和參數(shù)列表。在一個(gè)實(shí)施例中,需要一些參數(shù)—應(yīng)用當(dāng)執(zhí)行此動(dòng)作時(shí)必須提供它們—并且一些是可選的—應(yīng)用可以提供它們或者可以省略它們。
在一個(gè)實(shí)施例中,定義以下標(biāo)準(zhǔn)動(dòng)作 1.32.1.播放 描述多媒體內(nèi)容的正常實(shí)時(shí)播放。
1.32.2.轉(zhuǎn)送 描述轉(zhuǎn)送到兼容的目標(biāo)系統(tǒng)。
當(dāng)必須使內(nèi)容可用于具有相同DRM技術(shù)的系統(tǒng)時(shí),使用轉(zhuǎn)送到兼容的目標(biāo)系統(tǒng),以致所述目標(biāo)系統(tǒng)可以使用與包含此控制相同的許可,但是在源、信宿(sink)或它們二者上可能需要改變狀態(tài)信息。從其進(jìn)行轉(zhuǎn)送的系統(tǒng)被稱為源。向其進(jìn)行轉(zhuǎn)送的目標(biāo)系統(tǒng)被稱為信宿。
此動(dòng)作旨在結(jié)合服務(wù)協(xié)議來使用,所述服務(wù)協(xié)議使代理能夠被從源轉(zhuǎn)送到信宿以便在源和信宿持久狀態(tài)(例如,這里所描述的狀態(tài)數(shù)據(jù)庫中的對(duì)象)中進(jìn)行必要的更新。在一個(gè)實(shí)施例中,為了該目的,控制使用RunAgentOnPeer義務(wù)。下面結(jié)合論述狀態(tài)數(shù)據(jù)庫來提供關(guān)于此服務(wù)協(xié)議的說明性實(shí)施例的附加信息。
參數(shù)
1.32.3.輸出 描述到外部目標(biāo)系統(tǒng)的輸出。
輸出到外部目標(biāo)系統(tǒng)是當(dāng)必須把內(nèi)容輸出到其中無法使用原始的內(nèi)容許可的系統(tǒng)時(shí)所使用的動(dòng)作。這可以是具有不同DRM技術(shù)的系統(tǒng)、沒有DRM技術(shù)的系統(tǒng)或具有相同的技術(shù)但是處于要求不同于原始許可的許可的情況下的系統(tǒng)。從中進(jìn)行轉(zhuǎn)送的系統(tǒng)被稱為源。向其進(jìn)行轉(zhuǎn)送的目標(biāo)系統(tǒng)被稱為信宿。
在一個(gè)實(shí)施例中,在用于此動(dòng)作的描述、檢查和執(zhí)行方法的擴(kuò)展?fàn)顟B(tài)結(jié)果中,應(yīng)當(dāng)設(shè)置以下參數(shù)
參數(shù)
特定任務(wù)系統(tǒng)可以要求其它輸入?yún)?shù)。
1.32.3.1.標(biāo)準(zhǔn)的目標(biāo)系統(tǒng) 1.32.3.1.1.音頻CD或DVD 在一個(gè)實(shí)施例中,當(dāng)目標(biāo)系統(tǒng)是其上寫有未壓縮PCM音頻的未加密介質(zhì)(諸如可寫音頻CD或DVD)時(shí),使用標(biāo)準(zhǔn)的TargetSystem ID‘CleartextPcmAudio’。對(duì)于此目標(biāo)系統(tǒng)來說,ExportInfo參數(shù)是用于表示版權(quán)標(biāo)志的單整數(shù)參數(shù)。用整數(shù)值的最低有效位來表明此標(biāo)志。
10.狀態(tài)數(shù)據(jù)庫 下面將描述安全對(duì)象存儲(chǔ)裝置,其可以由DRM引擎的優(yōu)選實(shí)施例用來提供安全狀態(tài)存儲(chǔ)機(jī)制。這種機(jī)構(gòu)對(duì)于使控制程序能夠在從調(diào)用到調(diào)用保持不變的受保護(hù)的狀態(tài)數(shù)據(jù)庫中進(jìn)行讀取和寫入來說是有用的。這種狀態(tài)數(shù)據(jù)庫可以用來存儲(chǔ)狀態(tài)對(duì)象,諸如播放計(jì)數(shù)、首次使用日期、累積的再現(xiàn)時(shí)間等。在優(yōu)選實(shí)施例中,在非易失性存儲(chǔ)器中實(shí)現(xiàn)安全數(shù)據(jù)庫,所述非易失性存儲(chǔ)器諸如便攜式設(shè)備上的閃速存儲(chǔ)器或PC上的硬盤驅(qū)動(dòng)器的加密區(qū)域。然而應(yīng)當(dāng)理解,可以在任何適當(dāng)?shù)慕橘|(zhì)上實(shí)現(xiàn)安全數(shù)據(jù)庫。
如在此節(jié)中所使用的術(shù)語“對(duì)象”通常指的是在安全對(duì)象存儲(chǔ)裝置內(nèi)所包含的數(shù)據(jù)對(duì)象,而不是在此的其它地方所論述的對(duì)象(例如控制、控制器、鏈路等);如果必須區(qū)分這兩種類別的對(duì)象,那么術(shù)語“DRM對(duì)象”將用來指的是在此的其它地方所描述的對(duì)象(即,控制、控制器、保護(hù)器、內(nèi)容密鑰、鏈路、節(jié)點(diǎn)等),而術(shù)語“狀態(tài)對(duì)象”用來指的是在狀態(tài)數(shù)據(jù)庫內(nèi)所存儲(chǔ)的對(duì)象。在下面論述中,有時(shí)參考被稱作“Seashell(海貝)”的狀態(tài)數(shù)據(jù)庫的說明性實(shí)現(xiàn)方式,其結(jié)合在此的其它地方所描述的章魚DRM引擎實(shí)施例來使用。然而應(yīng)當(dāng)理解;這里所描述的系統(tǒng)和方法的實(shí)施例可以在沒有此說明性實(shí)現(xiàn)方式的一些或所有特征的情況下實(shí)施。
1.33.數(shù)據(jù)庫對(duì)象 對(duì)象存儲(chǔ)裝置(例如數(shù)據(jù)庫)包含數(shù)據(jù)對(duì)象。在一個(gè)實(shí)施例中,對(duì)象被布置在邏輯分層體系中,其中容器對(duì)象是它們所包含的孩子對(duì)象的親代。在一個(gè)實(shí)施例中,存在四種類型的對(duì)象字符串,整數(shù),字節(jié)數(shù)組和容器。每個(gè)對(duì)象具有相關(guān)聯(lián)的元數(shù)據(jù)和類型。取決于其類型,對(duì)象還可以具有值。
在一個(gè)實(shí)施例中,可以使用System.Host.GetObject和System.Host.SetObject系統(tǒng)調(diào)用從虛擬機(jī)程序中訪問狀態(tài)對(duì)象,并且如下面所更詳細(xì)地描述,可以使用虛擬名稱來訪問對(duì)象元數(shù)據(jù)。在一個(gè)實(shí)施例中,一些元數(shù)據(jù)字段可以由數(shù)據(jù)庫的客戶端改變(即,它們是可讀寫(RW)訪問的),而其它元數(shù)據(jù)字段是只讀的(RO)。
在一個(gè)實(shí)施例中,定義了在以下表中所示出的元數(shù)據(jù)字段
在一個(gè)實(shí)施例中,定義了在以下表中所示出的元數(shù)據(jù)標(biāo)志
如先前所表明,在一個(gè)實(shí)施例中存在四種類型的狀態(tài)對(duì)象字符串、整數(shù)、字節(jié)數(shù)組和容器。在此實(shí)施例中,字符串對(duì)象值是UTF-8編碼的字符串,整數(shù)對(duì)象值是32比特整數(shù)值,并且字節(jié)數(shù)組對(duì)象值是字節(jié)數(shù)組。在此實(shí)施例中,容器對(duì)象包含零或更多個(gè)對(duì)象。容器對(duì)象被認(rèn)為是它所包含對(duì)象的親代。所包含的對(duì)象被認(rèn)為是所述容器的孩子。構(gòu)成對(duì)象親代、親代的親代等鏈的所有容器對(duì)象被稱作對(duì)象的祖先。如果對(duì)象具有另一對(duì)象作為它的祖先,那么該對(duì)象被稱作祖先對(duì)象的后裔。
1.34.對(duì)象生存期 在一個(gè)實(shí)施例中,狀態(tài)數(shù)據(jù)庫中對(duì)象的生存期遵循多個(gè)規(guī)則。對(duì)象可以被顯式地銷毀或隱式地銷毀。對(duì)象還可能由于數(shù)據(jù)庫無用單元的收集而被銷毀。不管怎樣銷毀對(duì)象,在一個(gè)實(shí)施例中應(yīng)用以下規(guī)則 ●用于該對(duì)象的親代容器的ModificationDate被設(shè)置為當(dāng)前本地時(shí)間。
●如果對(duì)象是容器,那么當(dāng)所述對(duì)象被銷毀時(shí)其所有孩子被銷毀。
1.34.1.顯式對(duì)象銷毀 當(dāng)數(shù)據(jù)庫的客戶端請(qǐng)求移除對(duì)象時(shí)(參見對(duì)象訪問來更詳細(xì)地了解這可以怎樣使用Host.SetObject系統(tǒng)調(diào)用來進(jìn)行),發(fā)生顯式對(duì)象銷毀。
1.34.2.隱式對(duì)象銷毀 當(dāng)對(duì)象由于其祖先中的一個(gè)對(duì)象被銷毀而被銷毀時(shí)發(fā)生隱式的對(duì)象銷毀。
1.34.3.無用單元收集 在一個(gè)實(shí)施例中,狀態(tài)數(shù)據(jù)庫銷毀已經(jīng)期滿的任何對(duì)象。當(dāng)在實(shí)現(xiàn)數(shù)據(jù)庫的系統(tǒng)上的本地時(shí)間遲于對(duì)象元數(shù)據(jù)的ExpirationDate字段時(shí),所述對(duì)象被認(rèn)為是已經(jīng)期滿。實(shí)現(xiàn)方式可以定期地掃描數(shù)據(jù)庫來尋找期滿的對(duì)象并銷毀它們,或者它可以等待直到對(duì)象被訪問以檢查其期滿日期。在一個(gè)實(shí)施例中,實(shí)現(xiàn)方式不能向客戶端返回期滿的對(duì)象。在一個(gè)實(shí)施例中,當(dāng)容器對(duì)象被銷毀時(shí)(例如,因?yàn)樗呀?jīng)期滿),其孩子對(duì)象也被銷毀(遞歸地,它們所有的后裔也被銷毀),即便它們尚未期滿也是如此。
1.35.對(duì)象訪問 在一個(gè)實(shí)施例中,可以經(jīng)由以下一對(duì)系統(tǒng)調(diào)用來從虛擬機(jī)程序中訪問狀態(tài)數(shù)據(jù)庫中的對(duì)象用于讀取對(duì)象值的System.Host.GetObject和用于創(chuàng)建、銷毀或設(shè)置對(duì)象值的System.Host.SetObject。
在一個(gè)實(shí)施例中,為了作為主機(jī)對(duì)象樹被可見,狀態(tài)數(shù)據(jù)庫被“安裝”在主機(jī)對(duì)象樹中某個(gè)名稱之下。這樣,數(shù)據(jù)庫作為主機(jī)對(duì)象的更通用樹中的子樹是可見的。為了實(shí)現(xiàn)這點(diǎn),在一個(gè)實(shí)施例中,狀態(tài)數(shù)據(jù)庫包含始終存在的頂層級(jí)的、內(nèi)置的根容器對(duì)象。此根容器實(shí)質(zhì)上是數(shù)據(jù)庫的名稱。數(shù)據(jù)庫中的所有其它對(duì)象是根容器的后裔。多個(gè)狀態(tài)數(shù)據(jù)庫可以被安裝在主機(jī)對(duì)象樹中的不同位置(對(duì)于將被安裝在相同主機(jī)容器下的兩個(gè)數(shù)據(jù)庫來說,它們需要具有不同的名稱來用于它們的根容器)。例如,如果其根容器名稱為Database1的狀態(tài)數(shù)據(jù)庫包含名稱為Child1的單整數(shù)孩子對(duì)象,那么該數(shù)據(jù)庫可以被安裝在主機(jī)對(duì)象容器“/SeaShell”下,在這種情況下,Child1對(duì)象會(huì)做為“/SeaShell/Database1/Child1”而可見。在一個(gè)實(shí)施例中,按照訪問策略來管理支配對(duì)狀態(tài)數(shù)據(jù)庫中對(duì)象的訪問。
1.35.1.讀取對(duì)象 可以通過使用系統(tǒng)調(diào)用System.Host.GetObject來讀取對(duì)象值。在狀態(tài)數(shù)據(jù)庫的一個(gè)實(shí)施例中,可以存在于數(shù)據(jù)庫中的四個(gè)對(duì)象類型(整數(shù),字符串,字節(jié)數(shù)組和容器)直接映射到它們虛擬機(jī)中的對(duì)應(yīng)物上??梢圆捎谜7绞絹碓L問對(duì)象值,并且可以實(shí)現(xiàn)標(biāo)準(zhǔn)的虛擬名稱。
1.35.2.創(chuàng)建對(duì)象 對(duì)于已經(jīng)不存在的對(duì)象名稱可以調(diào)用System.Host.SetObject來創(chuàng)建對(duì)象。依照系統(tǒng)調(diào)用規(guī)范來進(jìn)行對(duì)象創(chuàng)建。在一個(gè)實(shí)施例中,當(dāng)創(chuàng)建對(duì)象時(shí),狀態(tài)數(shù)據(jù)庫進(jìn)行以下操作 ●把對(duì)象元數(shù)據(jù)的“所有者”字段設(shè)置為親代容器對(duì)象的元數(shù)據(jù)的“所有者”字段的值。
●把元數(shù)據(jù)的CreationDate字段設(shè)置為當(dāng)前的本地時(shí)間。
●把元數(shù)據(jù)的ModificationDate字段設(shè)置為當(dāng)前的本地時(shí)間。
●把元數(shù)據(jù)的ExpirationDate字段設(shè)置為0(沒有期滿)。
●把元數(shù)據(jù)的標(biāo)志字段設(shè)置為0。
●把親代容器的ModificationDate設(shè)置為當(dāng)前的本地時(shí)間。
當(dāng)在比現(xiàn)有容器分層體系更深的路徑下創(chuàng)建對(duì)象時(shí),在一個(gè)實(shí)施例中,狀態(tài)數(shù)據(jù)庫隱式地創(chuàng)建容器對(duì)象,所述容器對(duì)象需要存在以便創(chuàng)建通向被創(chuàng)建對(duì)象的路徑。在一個(gè)實(shí)施例中,隱式的容器對(duì)象創(chuàng)建遵循與顯式創(chuàng)建相同的規(guī)則。例如,如果存在沒有孩子的容器“A”,那么在創(chuàng)建“A/B/C/SomeObject”之前用于設(shè)置“A/B/C/SomeObject”的請(qǐng)求會(huì)隱式地創(chuàng)建容器“A/B”和“A/B/C”。
1.35.3.寫入對(duì)象 對(duì)于已經(jīng)存在的對(duì)象名稱可以通過調(diào)用System.Host.SetObject來改變對(duì)象值。如果所指定的ObjectType不匹配現(xiàn)有對(duì)象的類型ID,那么返回ERROR_INVALID_PARAMETER。在一個(gè)實(shí)施例中,如果類型ID為OBJECT_TYPE_CONTAINER,那么不需要指定值(ObjectAddress必須是非零的,但是其值會(huì)被忽略)。當(dāng)設(shè)置現(xiàn)有對(duì)象時(shí),狀態(tài)數(shù)據(jù)庫把對(duì)象的ModificationDate設(shè)置為當(dāng)前的本地時(shí)間。
1.35.4.銷毀對(duì)象 對(duì)已經(jīng)存在的對(duì)象,可以通過利用ObjectAddress值0來調(diào)用System.Host.SetObject來顯式地銷毀對(duì)象。當(dāng)對(duì)象被銷毀時(shí),狀態(tài)數(shù)據(jù)庫優(yōu)選 ●把親代容器的ModificationDate設(shè)置為當(dāng)前的本地時(shí)間。
●如果所銷毀的對(duì)象是容器,那么銷毀所有其孩子對(duì)象。
1.35.5.對(duì)象元數(shù)據(jù) 在一個(gè)實(shí)施例中,通過利用虛擬名稱使用System.Host.GetObject和System.Host.SetObject系統(tǒng)調(diào)用來訪問狀態(tài)數(shù)據(jù)庫對(duì)象的元數(shù)據(jù)。下表列出了在狀態(tài)數(shù)據(jù)庫的一個(gè)實(shí)施例中可用于對(duì)象的標(biāo)準(zhǔn)和擴(kuò)展虛擬名稱,并且列出了它們?cè)鯓佑成涞皆獢?shù)據(jù)字段。
在一個(gè)實(shí)施例中,如果一個(gè)或多個(gè)未定義的標(biāo)志被設(shè)置為1,那么實(shí)現(xiàn)方式必須拒絕設(shè)置標(biāo)志元數(shù)據(jù)字段的請(qǐng)求。在這種情況下,對(duì)System.Host.SetObj ect的返回值為ERROR_INVALID_PARAMETER。在一個(gè)實(shí)施例中,當(dāng)讀取標(biāo)志元數(shù)據(jù)字段時(shí),客戶端必須忽略未被預(yù)定義的任何標(biāo)志,并且當(dāng)設(shè)置對(duì)象的標(biāo)志字段時(shí),客戶端必須首先讀取其現(xiàn)有值并且保留未被預(yù)定義的任何標(biāo)志的值(例如,依照系統(tǒng)規(guī)范)。
1.36.對(duì)象所有權(quán)和訪問控制 在一個(gè)實(shí)施例中,每當(dāng)進(jìn)行讀取、寫入、創(chuàng)建或銷毀對(duì)象的請(qǐng)求時(shí),狀態(tài)數(shù)據(jù)庫實(shí)現(xiàn)方式首先檢查調(diào)用方是否有權(quán)限來執(zhí)行所述請(qǐng)求。用于管理支配對(duì)對(duì)象進(jìn)行訪問的策略是基于委托人身份和委托的原理。為了要實(shí)現(xiàn)的該策略,實(shí)現(xiàn)方式操作時(shí)所處于的信任模型需要支持認(rèn)證的控制程序的概念。這一般通過具有虛擬機(jī)代碼模塊并且具有用于使委托人名稱與簽名密鑰相關(guān)聯(lián)的名稱證書來完成,所述虛擬機(jī)代碼模塊包含利用PKI密鑰對(duì)的私鑰來(直接或經(jīng)由安全引用間接地)數(shù)字簽名的程序;然而應(yīng)當(dāng)理解,用于確定控制程序身份的不同方式是可以的,可以使用其中的任何合適的一個(gè)。
在一個(gè)實(shí)施例中,用于狀態(tài)數(shù)據(jù)庫中對(duì)象的訪問策略由幾個(gè)簡(jiǎn)單規(guī)則組成 ●如果調(diào)用方身份與對(duì)象的所有者相同或者如果在對(duì)象的標(biāo)志元數(shù)據(jù)字段中設(shè)置有PUBLIC_READ標(biāo)志,那么準(zhǔn)許對(duì)對(duì)象值的讀取訪問。
●如果調(diào)用方有權(quán)對(duì)對(duì)象的親代容器進(jìn)行讀取訪問,那么準(zhǔn)許對(duì)對(duì)象值進(jìn)行讀取訪問。
●如果調(diào)用方的身份與對(duì)象的所有者相同,那么準(zhǔn)許對(duì)對(duì)象值進(jìn)行寫入訪問。
●如果調(diào)用方有權(quán)對(duì)對(duì)象的親代容器進(jìn)行寫入訪問,那么準(zhǔn)許對(duì)對(duì)象值進(jìn)行寫入訪問。
●如果調(diào)用方有權(quán)對(duì)對(duì)象的親代容器進(jìn)行寫入訪問,那么準(zhǔn)許創(chuàng)建或銷毀對(duì)對(duì)象的訪問。
●(使用虛擬名稱)對(duì)對(duì)象的元數(shù)據(jù)進(jìn)行讀取和寫入訪問遵循與對(duì)對(duì)象值進(jìn)行讀取和寫入訪問相同的策略,只是另外限制不能寫入只讀字段。
在一個(gè)實(shí)施例中,當(dāng)訪問策略拒絕客戶端請(qǐng)求時(shí),對(duì)該請(qǐng)求的系統(tǒng)調(diào)用的返回值是ERROR_PERMISSION_DENIED。
優(yōu)選,當(dāng)創(chuàng)建數(shù)據(jù)庫時(shí),狀態(tài)數(shù)據(jù)庫的根容器是固定的。當(dāng)創(chuàng)建對(duì)象時(shí),其所有者元數(shù)據(jù)字段的值被設(shè)置為與其親代容器所有者元數(shù)據(jù)字段的值相同的值。對(duì)象的所有權(quán)可以改變。為了改變對(duì)象的所有權(quán),可以通過調(diào)用該對(duì)象的‘@Owner’虛擬名稱的Sytem.Host.SetObject系統(tǒng)調(diào)用來設(shè)置所有者元數(shù)據(jù)字段的值(如果在訪問控制規(guī)則下允許的話)。
在控制程序不可以訪問那些對(duì)象(所述對(duì)象并不由與控制程序正在其身份下運(yùn)行的委托人是相同的委托人所擁有)的實(shí)施例中,控制程序需要把對(duì)“外部”對(duì)象的訪問委托給從下述代碼模塊所加載的程序,所述代碼模塊具有在“外部”對(duì)象的所有者身份下運(yùn)行的能力。為此,控制程序可以在控制虛擬機(jī)中使用System.Host.SpawnVm、System.Host.CallVm和System.Host.ReleaseVm系統(tǒng)調(diào)用。
1.37.許可轉(zhuǎn)送協(xié)議 把狀態(tài)信息存儲(chǔ)在諸如上述的數(shù)據(jù)庫中使權(quán)利能夠在設(shè)備之間移動(dòng)或者從域中輸出(例如,通過把狀態(tài)信息轉(zhuǎn)送到另一設(shè)備)。以下章節(jié)描述了協(xié)議的實(shí)施例,借此可以把數(shù)據(jù)庫的狀態(tài)從源轉(zhuǎn)送到信宿。注意,盡管此過程被認(rèn)為是許可轉(zhuǎn)送協(xié)議,轉(zhuǎn)送的是狀態(tài)數(shù)據(jù)庫的狀態(tài),這與純粹的實(shí)際許可(例如控制對(duì)象等)的轉(zhuǎn)送不同。所述協(xié)議被認(rèn)為是許可轉(zhuǎn)送協(xié)議,這是因?yàn)樵谝粋€(gè)實(shí)施例中,所述轉(zhuǎn)送通過在控制程序中執(zhí)行轉(zhuǎn)送動(dòng)作發(fā)起的,并且因?yàn)檗D(zhuǎn)送所述狀態(tài)信息使信宿能夠成功地執(zhí)行與內(nèi)容相關(guān)的許可。
圖32示出了由三個(gè)消息3202、3204、3206組成的許可轉(zhuǎn)送3200的例子。在圖32所示出的例子中,由信宿3210通過向源3212發(fā)送請(qǐng)求3202來啟動(dòng)該協(xié)議。在一個(gè)實(shí)施例中,請(qǐng)求3202保持要轉(zhuǎn)送的內(nèi)容的ID。源3212向信宿3210發(fā)送響應(yīng)3204,包含(i)將在信宿3210的狀態(tài)數(shù)據(jù)庫中設(shè)置狀態(tài)的代理,以及(ii)目標(biāo)為信宿3210的內(nèi)容密鑰對(duì)象。如圖32所示,信宿3210向源3212發(fā)送用于表示代理已經(jīng)運(yùn)行的確認(rèn)3206。當(dāng)接收到內(nèi)容密鑰和/或內(nèi)容時(shí),信宿然后可以依照其相關(guān)聯(lián)的控制來使用所述內(nèi)容(例如,通過揚(yáng)聲器播放它,在視頻屏幕上顯示它和/或依照其它方式再現(xiàn)它)。
雖然在一些實(shí)施例中可以使用在圖32中所示出的方法,但是一些潛在的問題包括 沒有辦法主動(dòng)告訴源再現(xiàn)已經(jīng)結(jié)束了。在一個(gè)實(shí)施例中,在圖32中所示出的協(xié)議支持兩個(gè)模式,其中這是一個(gè)問題(i)再現(xiàn)(沒有停止再現(xiàn)),和(ii)簽出(沒有簽入(checkin))。由于此問題,可能導(dǎo)致控制發(fā)出方發(fā)出關(guān)于所轉(zhuǎn)送的狀態(tài)的超時(shí)。然而,這可能使消費(fèi)者感覺很糟,例如當(dāng)用戶想要在一個(gè)設(shè)備上再現(xiàn)內(nèi)容但是判定她實(shí)際上想要在另一個(gè)設(shè)備上再現(xiàn)此內(nèi)容利用當(dāng)前的設(shè)計(jì),很可能在她能夠在另一個(gè)設(shè)備上再現(xiàn)內(nèi)容之前必須等待在第一設(shè)備上再現(xiàn)整個(gè)內(nèi)容。如果所述內(nèi)容相對(duì)較長(zhǎng)(例如電影),那么這可能會(huì)令人不快。
可能很難分析與請(qǐng)求中的內(nèi)容ID相關(guān)聯(lián)的許可。在一個(gè)實(shí)施例中,所述請(qǐng)求只包含內(nèi)容ID,并且源從其許可數(shù)據(jù)庫中獲取與所述內(nèi)容ID相關(guān)聯(lián)的許可。然而,此過程可能易于出錯(cuò),這是由于許可可以被存儲(chǔ)在可拆卸介質(zhì)上,并且在約定協(xié)議時(shí),如果所述介質(zhì)已經(jīng)被拆卸,那么特定的許可可能就是不可用的。此外,即便該許可是可用的,那么在許可存儲(chǔ)裝置中查找所述許可也可能是麻煩的。還因?yàn)榭赡艽嬖谂c一組內(nèi)容ID相關(guān)聯(lián)的多個(gè)許可,所以可能難于確定所分析的許可是否與在請(qǐng)求中所想要的許可相同。
控制程序沒有辦法主動(dòng)請(qǐng)求鄰近度檢查(proximity check)。在一個(gè)實(shí)施例中,該組系統(tǒng)調(diào)用/回調(diào)/義務(wù)不支持控制用來請(qǐng)求鄰近度檢查對(duì)等體的方式。作為替代,控制可以只讀取主機(jī)對(duì)象Octopus/Action/Parameters/Sink/Proximity/LastProbe的值,該值由應(yīng)用在轉(zhuǎn)送期間利用它從先前的鄰近度檢查協(xié)議執(zhí)行中所獲得的值來填充。在如果不需要這種鄰近度檢查那么可能希望避免鄰近度檢查的情況下(例如,如果已知信宿在某一域內(nèi)),這可能是一個(gè)問題。
對(duì)于該協(xié)議來說只存在三個(gè)回合。在圖32所示出的實(shí)施例中,所述協(xié)議被限制為三個(gè)回合。這可能是一個(gè)嚴(yán)重的限制,這是由于所述協(xié)議不能處理OnAgentCompletion回調(diào)返回具有另一RunAgentOnPeer義務(wù)的擴(kuò)展?fàn)顟B(tài)塊的情況。此外,在完成協(xié)議之后,信宿實(shí)際上不知道所述協(xié)議是否已經(jīng)成功。另外,鄰近度檢查需要發(fā)生在發(fā)送響應(yīng)之前(參見先前問題),但是在源和信宿處于相同域的情況下不必如此。另外,在圖32所示出的協(xié)議中,源在不知道內(nèi)容密鑰將是否被使用的情況下向信宿給出此內(nèi)容密鑰。
在ESB中沒有辦法暗示需要許可轉(zhuǎn)送。在圖32所示出的實(shí)施例中,當(dāng)DRM客戶端評(píng)估許可(例如Control.Actions.Play.Check)時(shí),為了獲得能夠成功評(píng)估所述控制的狀態(tài),控制寫入方?jīng)]有容易的方式來暗示需要許可轉(zhuǎn)送。
源無法發(fā)起轉(zhuǎn)送。在圖32所示出的協(xié)議中,許可轉(zhuǎn)送由信宿發(fā)起。可能希望源也能夠發(fā)起轉(zhuǎn)送。
改進(jìn)的實(shí)施例 下述實(shí)施例可以解決或改良上述一些或全部問題。
釋放問題的解決方案。在一個(gè)實(shí)施例中,引入新的釋放操作。當(dāng)在請(qǐng)求中指定此操作時(shí),轉(zhuǎn)送模式ID被設(shè)置為釋放。按照順序,為了讓客戶端在再現(xiàn)/簽出和釋放操作之間相關(guān),把可選元項(xiàng)SessionId(會(huì)話ID)添加到請(qǐng)求(參見下面章節(jié))。在一個(gè)實(shí)施例中,當(dāng)此元項(xiàng)存在時(shí),它被反映在SessionId下的轉(zhuǎn)送動(dòng)作上下文情境的主機(jī)對(duì)象樹中。
信宿知道如果它將在拆卸消息(參見下文)中獲得的擴(kuò)展?fàn)顟B(tài)塊包含參數(shù),那么它必須在釋放請(qǐng)求中發(fā)送此SessionId 參數(shù)名SessionId 參數(shù)類型字符串 此參數(shù)的標(biāo)志被設(shè)置為CRITICAL。
許可解析問題的解決方案(重制(refactoring)請(qǐng)求)。在一個(gè)實(shí)施例中,所述解決方案包括使信宿設(shè)備把許可捆束(一個(gè)或者多個(gè))放入請(qǐng)求中使得實(shí)質(zhì)上保證所述信宿和源執(zhí)行相同的許可。在圖32所示出的實(shí)施例中,用于請(qǐng)求的XML模式如下
在ContentIdList(內(nèi)容ID列表)包含標(biāo)識(shí)內(nèi)容的內(nèi)容ID的列表的情況下(每個(gè)曲目/流一個(gè)),操作包含許可轉(zhuǎn)送操作類型,并且捆束包含請(qǐng)求者的個(gè)性節(jié)點(diǎn)和相關(guān)聯(lián)的簽名。
為了避免上述許可解析問題,例如可以通過如下修正模式來把許可捆束包括在請(qǐng)求中
在此模式中,ContentIdList(內(nèi)容ID列表)元項(xiàng)由許可元項(xiàng)來代替。此元項(xiàng)攜帶一組LicensePart元項(xiàng)。LicensePart元項(xiàng)攜帶oct:Bundle元項(xiàng),所述oct:Bundle元項(xiàng)包含許可對(duì)象以及用于表明所述許可對(duì)象被應(yīng)用于此特定ContentId(內(nèi)容ID)的可選ContentId屬性。沒有ContentId屬性的LicensePart元項(xiàng)意味著在基礎(chǔ)捆束中所包含的對(duì)象被應(yīng)用于所有內(nèi)容ID(通常為控制器和控制對(duì)象)。
在一個(gè)實(shí)施例中,SessionId可選元項(xiàng)不能存在,除非如果所述操作為urn:marlin:core:1-2:service:license-transfer:release,在這種情況下如果在相應(yīng)的再現(xiàn)或簽出動(dòng)作的擴(kuò)展?fàn)顟B(tài)塊中接收了SessionId參數(shù)那么它可以存在(參見上面)。
在一個(gè)實(shí)施例中,如果信宿知道它已經(jīng)能夠解密內(nèi)容密鑰,那么NeedsContentKeys(需要內(nèi)容密鑰)可選元項(xiàng)應(yīng)當(dāng)以假值存在。此元項(xiàng)不存在意味著在協(xié)議成功的情況下源必須重新加密信宿的內(nèi)容密鑰。
在一個(gè)實(shí)施例中,當(dāng)接收這種請(qǐng)求時(shí),如下處理許可元項(xiàng) (1)收集在LicensePart元項(xiàng)中所找到的所有ContentId屬性。
(2)處理在LicensePart元項(xiàng)中所找到的所有捆束屬性。
(3)打開上面所收集的該組內(nèi)容ID。
(4)對(duì)相關(guān)對(duì)象驗(yàn)證適當(dāng)簽名。
(5)對(duì)所處理的控制對(duì)象選擇性地調(diào)用Control.Actions.Transfer.Check方法。
(6)對(duì)所處理的控制對(duì)象調(diào)用Control.Actions.Transfer.Perform。
允許控制程序主動(dòng)請(qǐng)求信宿的鄰近度檢查。為了允許控制程序這樣作,可以定義一對(duì)新的義務(wù)/回調(diào)。特別地是,控制可以把“ProximityCheckSink(鄰近度檢查信宿)”義務(wù)放入其擴(kuò)展?fàn)顟B(tài)塊中。這向應(yīng)用表明必須檢查與信宿的鄰近度。當(dāng)完成鄰近度檢查時(shí),應(yīng)用會(huì)使用“OnSinkProximityChecked”回調(diào)來回調(diào)所述控制。
在一個(gè)實(shí)施例中,定義了只在許可轉(zhuǎn)送的上下文情境內(nèi)適用的ProximityCheck(鄰近度檢查)義務(wù)。在此實(shí)施例中,每個(gè)擴(kuò)展?fàn)顟B(tài)塊需要零或一個(gè)這種義務(wù),并且如果存在的話,那么還需要存在OnSinkProximityChecked回調(diào)。
OnS inkProximityChecked回調(diào)
在協(xié)議中允許多個(gè)往返行程。圖33概述了會(huì)允許多個(gè)往返行程的協(xié)議的修改形式。在圖33所示出的實(shí)施例中,設(shè)置消息3302例如可以與上面結(jié)合許可解析問題/解決方案描述的改進(jìn)的許可轉(zhuǎn)送請(qǐng)求消息相同。
如圖33所示,在設(shè)置3302之后,應(yīng)用運(yùn)行如上所述的控制并且獲取擴(kuò)展?fàn)顟B(tài)塊(ESB)。此ESB可以包含RunAgentOnPeer義務(wù)/OnAgentCompletion回調(diào)。在一個(gè)實(shí)施例中,RunAgentOnPeer義務(wù)包含源3312應(yīng)用需要用來構(gòu)建RunAgent消息3304的所有參數(shù)。注意,在一個(gè)實(shí)施例中,如果應(yīng)用在OnAgentCompletion回調(diào)的擴(kuò)展?fàn)顟B(tài)塊中遇到另一RunAgentOnPeer/OnAgentCompletion回調(diào)/義務(wù)對(duì)(在一個(gè)或多個(gè)RunAgent/AgentResult消息交換之后),那么還將發(fā)送RunAgent消息3304。
在一個(gè)實(shí)施例中,如果ESB沒有包含RunAgentOnPeer義務(wù)/OnAgentCompletion回調(diào),那么這意味著需要發(fā)送拆卸消息(參見下文)。注意,此ESB可以包含ProximityCheck義務(wù)/OnSinkProximityChecked回調(diào),在這種情況下將執(zhí)行鄰近度檢查協(xié)議并且在發(fā)送拆卸消息之前從OnSinkProximityChecked回調(diào)的ESB中讀取結(jié)果。
在一個(gè)實(shí)施例中,除并不攜帶ContentKeyList(內(nèi)容密鑰列表)之外,RunAgent消息3304的有效載荷與先前設(shè)計(jì)的響應(yīng)消息完全相同。
如圖33所示,在信宿3310已經(jīng)運(yùn)行由源在RunAgent消息3304中發(fā)送的代理之后,所述信宿3310向源3312發(fā)送AgentResult(代理結(jié)果)消息3306。在一個(gè)實(shí)施例中,消息有效載荷與結(jié)合圖32所描述的確認(rèn)消息相同。
如圖33所示,當(dāng)OnAgentCompletion的擴(kuò)展?fàn)顟B(tài)塊沒有攜帶任何RunAgentOnPeer/OnAgentCompletion回調(diào)/義務(wù)對(duì)時(shí)(這意味著協(xié)議已經(jīng)結(jié)束),由源應(yīng)用3312發(fā)送拆卸消息3308。在一個(gè)實(shí)施例中,拆卸消息3308攜帶兩個(gè)信息(i)協(xié)議結(jié)果的描述,使得信宿3310知道所述協(xié)議已經(jīng)成功還是沒有成功,它為什么失敗的指示(參見下文來獲得更多細(xì)節(jié)),和(ii)在協(xié)議成功的情況下,所更新的內(nèi)容密鑰對(duì)象(先前消息中響應(yīng)的ContentKeyList(內(nèi)容對(duì)象列表)),設(shè)置消息的NeedsContentKey元項(xiàng)被設(shè)置為真還是不存在。
在一個(gè)實(shí)施例中,協(xié)議結(jié)果的描述實(shí)際上是最后調(diào)用沒有攜帶與代理相關(guān)的義務(wù)/回調(diào)對(duì)的控制的擴(kuò)展?fàn)顟B(tài)塊(ESB)。
在失敗的情況下,ESB的參數(shù)可以指向資源。在一個(gè)實(shí)施例中,這些資源位于在設(shè)置消息中所發(fā)送的控制的ResourceList(資源列表)擴(kuò)展中。
在成功的情況下,在一個(gè)實(shí)施例中,高速緩存持續(xù)時(shí)間表明在沒有再次請(qǐng)求控制的情況下可以使用內(nèi)容密鑰多少時(shí)間。
下面示出了這種ESB XML表示的例子,并且其可以被添加到虛擬機(jī)模式
下面是依照上述改進(jìn)的許可轉(zhuǎn)送機(jī)制的一個(gè)實(shí)施例的再現(xiàn)使用情況的例子。在此例子中,廣播輸入功能導(dǎo)入具有以下許可的內(nèi)容 -播放如果本地狀態(tài)存在,那么OK -轉(zhuǎn)送 -如果信宿處于域X中或者如果信宿在鄰近,那么再現(xiàn)OK。一次只可以再現(xiàn)一個(gè)并行流。
假定核心DRMClient1請(qǐng)求再現(xiàn)內(nèi)容流的權(quán)限。包含以下參數(shù)的設(shè)置請(qǐng)求被從信宿(核心DRMClient1)發(fā)送到源(BC導(dǎo)入功能) -許可與信宿想要再現(xiàn)的內(nèi)容相關(guān)聯(lián)的許可 -操作=urn:marlin:core:1-0:service:license-transfer:render -捆束=信宿的個(gè)性節(jié)點(diǎn) 當(dāng)接收請(qǐng)求時(shí),源應(yīng)用填充相關(guān)的主機(jī)對(duì)象并且調(diào)用Control.Actions.Transfer.Perform方法。下面示出了用于管理支配再現(xiàn)轉(zhuǎn)送的方法的說明性偽碼 /*管理支配方法的偽碼 再現(xiàn)轉(zhuǎn)送*/ ESB* TransferRenderPerform(HostObjectTree* t){ //檢查鎖定 if(t->GetObject(“SeaShell/.../lock”)!=NULL){ return new ESB(ACTION_DENIED); }else{//時(shí)間限制鎖定,在失敗的情況下我們解鎖t->SetObject(“SeaShell/.../lock”,1);t->SetObject(“SeaShell/.../lock@ExpirationTime, Time.GetCurrent()+180);//返回包含RunAgentOnPeer的ESB//義務(wù)和OnAgentCompleted回調(diào) return new ESB(ACTION_GRANTED, new Obligation(RUN_AGENT_ON_PEER,CheckDomainAgent), new Callback(ON_AGENT_COMPLETED, RenderAgentCompleted)); } } 假定再現(xiàn)未被鎖定,那么執(zhí)行RunAgentOnPeer義務(wù)。利用包含CheckDomainAgent方法的控制來發(fā)送RunAgent消息。當(dāng)接收此消息時(shí),信宿將填充相關(guān)的主機(jī)對(duì)象并且調(diào)用CheckDomainAgent方法。下面示出了CheckDomainAgent的說明性偽碼 /*CheckDomainAgent的偽碼*/ AgentResult* CheckDomainAgent(HostObjectTree* t){ //檢查域節(jié)點(diǎn)是否是可到達(dá)的 if(IsNodeReachable(“urn:marlin:...:domain2042x”)){ returnnew AgentResult(SUCCESS); }else{ returnnew AgentResult(FAILURE); } 為了此說明目的,假定信宿的確在該域中。然后,信宿發(fā)送包含此代理結(jié)果的AgentResult消息。當(dāng)接收AgentResult時(shí),源將調(diào)用回調(diào)方法。下面示出了RenderAgentCompleted的說明性偽碼 /*RenderAgentCompleted的偽碼*/ ESB* RenderAgentCompleted(HostObjectTree* t, AgentResult* ar) { if(ar->IsSuccess()){//給出沒有義務(wù)/回調(diào)的ESB //和高速緩存持續(xù)時(shí)間 return new ESB(ACTION_GRANTED,new CacheDuration(0)); }else{//試圖進(jìn)行鄰近度檢查return new ESB(ACTION_GRANTED,new Obligation(CHECK_PROXIMITY,t->GetObject(“.../Sink/Id”),new Callback(ON_SINK_PROXIMITY_CHECKED, ProximityCheckCompleted)); } } 我們已經(jīng)假定代理成功地檢查了信宿上的域成員資格。發(fā)送拆卸消息,所述拆卸消息具有(i)(使用在設(shè)置請(qǐng)求中向信宿節(jié)點(diǎn)提供的密鑰)為信宿重新加密的內(nèi)容密鑰,和(ii)攜帶上面所指定的高速緩存持續(xù)時(shí)間的ESB(在這種情況下為0,意味著所述信宿下次想要訪問內(nèi)容時(shí)必須重新請(qǐng)求)。當(dāng)信宿接收此消息時(shí),它知道被允許再現(xiàn)內(nèi)容并且具有所需要的內(nèi)容密鑰。
現(xiàn)在假定用戶想要在他的其它設(shè)備DRMClient2上再現(xiàn)內(nèi)容。問題在于所述內(nèi)容在該源上被鎖定了180分鐘。幸運(yùn)地是,當(dāng)用戶在DRMClient1上按下STOP時(shí),DRMClient1利用操作—釋放—來發(fā)起新的許可轉(zhuǎn)送協(xié)議。當(dāng)接收請(qǐng)求時(shí),源應(yīng)用將填充相關(guān)的主機(jī)對(duì)象并且調(diào)用Control.Actions.Transfer.Perform方法。下面示出了用于管理支配轉(zhuǎn)送釋放的方法的說明性偽碼 /*管理支配方法的偽碼 轉(zhuǎn)送釋放*/ ESB* TransferReleasePerform(HostObj ectTree* t){ //檢查鎖定 if(t->GetObject(“SeaShell/.../lock”)?。絅ULL){ t->SetObject(“SeaShell/.../lock,NULL);//刪除 return new ESB(ACTION_GRANTED); }else{ return new ESB(ACTION_DENIED); } } 由于在ESB中沒有找到義務(wù)/回調(diào),所以這意味著利用此ESB向回發(fā)送拆卸消息。
從而此再現(xiàn)使用情況舉例說明了在某些實(shí)施例中,再現(xiàn)操作的請(qǐng)求DRMClient不需要本地重新評(píng)估控制,狀態(tài)不必從源轉(zhuǎn)送到信宿,控制可以主動(dòng)請(qǐng)求鄰近度檢查,并且當(dāng)再現(xiàn)器利用內(nèi)容時(shí)可以釋放所述內(nèi)容。
11.證書 在一個(gè)實(shí)施例中,證書用來在根據(jù)利用那些密鑰創(chuàng)建的數(shù)字簽名進(jìn)行判定之前檢查與密碼密鑰相關(guān)聯(lián)的憑證。
在一些實(shí)施例中,DRM引擎被設(shè)計(jì)成用于與標(biāo)準(zhǔn)的證書技術(shù)兼容,并且可以平衡在這種證書的元項(xiàng)中所找到的信息,諸如有效時(shí)段、名稱等。除那些基本約束之外,在一些實(shí)施例中,可以定義關(guān)于所證實(shí)的密鑰能夠用于和不能用于作什么的附加約束。這可以通過例如使用可用為證書的標(biāo)準(zhǔn)編碼一部分的密鑰使用擴(kuò)展來實(shí)現(xiàn)。在這種擴(kuò)展中所編碼的信息使DRM引擎能夠檢查已經(jīng)簽名特定對(duì)象的密鑰是否被授權(quán)以用于該目的。例如,某個(gè)密鑰可能具有這樣的證書,只有鏈路是從特定屬性的節(jié)點(diǎn)到具有另一特定屬性的節(jié)點(diǎn)而不是其它鏈路,所述證書才允許所述密鑰對(duì)鏈路對(duì)象進(jìn)行簽名。由于用于表達(dá)證書的通用技術(shù)的語義通常不能夠表達(dá)這種約束,這是因?yàn)闆]辦法表達(dá)與諸如鏈路和節(jié)點(diǎn)之類DRM引擎專用的元項(xiàng)相關(guān)的條件,所以在一個(gè)實(shí)施例中這種DRM引擎專用的約束被作為基本證書的密鑰使用擴(kuò)展來傳達(dá),其由已經(jīng)被配置為使用所述DRM引擎的應(yīng)用來處理。
在一個(gè)實(shí)施例中,密鑰使用擴(kuò)展中的約束由使用類別和VM約束程序來表達(dá)。使用類別指定了向密鑰授權(quán)簽名什么類型的對(duì)象。約束程序可以根據(jù)上下文情境來表達(dá)動(dòng)態(tài)條件。在一個(gè)實(shí)施例中,被請(qǐng)求驗(yàn)證這種證書有效性的任何驗(yàn)證器被要求要理解DRM引擎語義,并且把對(duì)密鑰使用擴(kuò)展表示的評(píng)估委托給DRM引擎,所述DRM引擎使用虛擬機(jī)的實(shí)例來執(zhí)行該程序。如果該程序執(zhí)行的結(jié)果成功,那么該證書被認(rèn)為是有效的。
在一個(gè)實(shí)施例中,約束程序的任務(wù)是返回布爾值?!罢妗币馕吨鴿M足約束條件,并且“假”意味著不滿足約束條件。在一個(gè)實(shí)施例中,控制程序有權(quán)訪問一些上下文信息,所述上下文信息可以用來作出決定,諸如經(jīng)由虛擬機(jī)的主機(jī)對(duì)象接口可用于程序的信息。可被用為上下文的信息取決于當(dāng)DRM引擎請(qǐng)求驗(yàn)證證書時(shí)試圖做出什么類型的決定。例如,在使用鏈路對(duì)象中的信息之前,在一個(gè)實(shí)施例中DRM引擎需要驗(yàn)證用于簽名所述對(duì)象的密鑰的證書允許該密鑰用于該目的。當(dāng)執(zhí)行約束程序時(shí),利用關(guān)于鏈路屬性以及由所述鏈路所引用的節(jié)點(diǎn)屬性的信息來填充虛擬機(jī)的環(huán)境。
在一個(gè)實(shí)施例中,被嵌入到密鑰使用擴(kuò)展中的約束程序被編碼為虛擬機(jī)代碼模塊,虛擬機(jī)代碼模塊用于輸出名稱為“Octopus.Certificate.<Category>.Check”的至少一個(gè)入口點(diǎn),其中“類別”名稱用于表明需要檢查哪種類別的證書。在調(diào)用入口點(diǎn)之前,用于驗(yàn)證程序的參數(shù)被壓入堆棧。傳遞到堆棧上參數(shù)的數(shù)目和類型通常取決于所評(píng)估的證書擴(kuò)展的類別。
12.數(shù)字簽名 在優(yōu)選實(shí)施例中,對(duì)由DRM引擎所使用的一些或全部對(duì)象進(jìn)行簽名。下面描述了在一個(gè)實(shí)施例中怎樣使用XML數(shù)字簽名規(guī)范(http://www.w3.org/TR/xmldsig-core)(“XMLDSig”)來對(duì)對(duì)象進(jìn)行數(shù)字簽名。另外,還描述了與XML專用規(guī)范(http://www.w3.org/TR/xml-exc-c14n/)(“c14n-ex”)兼容的XML的規(guī)范方法,其輸出可以由非XML名稱空間察覺(non-XML-namespace-aware)的解析器來處理。附錄D提供了關(guān)于示例性對(duì)象串行化的更多信息,包括用于依照與編碼無關(guān)的方式來為對(duì)象計(jì)算規(guī)范字節(jié)序列的說明性方式。
如圖28、34和35所示,在優(yōu)選實(shí)施例中對(duì)DRM許可中的某些元項(xiàng)進(jìn)行簽名。諸如在圖28、34和35中所示出的那些技術(shù)在防止或阻止篡改或替換許可組件上是很有用的。如圖34所示,在優(yōu)選實(shí)施例中,控制器對(duì)象3402分別包括內(nèi)容密鑰對(duì)象3404和控制對(duì)象3406的密碼摘要或散列(或其它適當(dāng)?shù)慕壎?3405、3407??刂破?402本身被利用MAC(或優(yōu)選為利用內(nèi)容密鑰的HMAC)和公鑰簽名(一般為內(nèi)容或許可提供者的公鑰簽名)3412而簽名。在優(yōu)選實(shí)施例中,控制器的公鑰簽名3412本身是使用內(nèi)容密鑰來利用HMAC 3410而被簽名的。應(yīng)當(dāng)理解,在其它實(shí)施例中,取決于所想要的安全等級(jí)和/或其它系統(tǒng)需求,可以使用其它簽名方案。例如,不同的簽名方案可以用于控制器和/或控制的簽名,諸如PKI、標(biāo)準(zhǔn)MAC等。作為另一例子,可以為控制和控制器這二者計(jì)算獨(dú)立的MAC簽名,而不是在控制器中包括所述控制的摘要并計(jì)算所述控制器的單個(gè)MAC簽名。在又一例子中,可以利用MAC和公鑰簽名來簽名控制器。作為選擇或另外,可以使用與上述那些不同的密鑰來產(chǎn)生各個(gè)簽名。從而雖然圖28、34和35依照一些實(shí)施例圖示了幾種有益的簽名技術(shù),然而應(yīng)當(dāng)理解,這些技術(shù)是說明性并且不是限制性的。圖35圖示了其中控制器引用多個(gè)內(nèi)容密鑰的實(shí)施例。如圖35所示,在一個(gè)實(shí)施例中,每個(gè)內(nèi)容密鑰用來產(chǎn)生控制器的HMAC和PKI簽名。
在一個(gè)實(shí)施例中,除移除名稱空間前綴(使用默認(rèn)的名稱空間機(jī)制來表明名稱空間)以及不支持外部實(shí)體只支持字符實(shí)體之外,用于XML規(guī)范的數(shù)據(jù)模式、處理、輸入?yún)?shù)和輸出數(shù)據(jù)與專用規(guī)范XML(c14n-ex)相同。第一限制意味著屬性及其元項(xiàng)需要處于相同的名稱空間中。
圖42示出了在一個(gè)實(shí)施例中在c14n-ex和說明性XML規(guī)范化之間的關(guān)系,其中<xml>是任何有效的XML,并且其中只有在<xml>沒有外部實(shí)體并且沒有名稱空間前綴時(shí)<xml>’=<xml>”。
下面提供了簡(jiǎn)化簽名方案的簡(jiǎn)單例子然而,在優(yōu)選實(shí)施例中,使用標(biāo)準(zhǔn)的XML規(guī)范。
在此節(jié)中所論述的簽名元項(xiàng)屬于XMLDSig名稱空間(xmlns=http://www.w3.org/2000/09/xmldsig#)并且在XMLDSig規(guī)范中所定義的XML模式中定義。在一個(gè)實(shí)施例中,DRM對(duì)象的XML表示的容器元項(xiàng)是<Bundle(捆束)>元項(xiàng)。
在一個(gè)實(shí)施例中,需要簽名以下對(duì)象 ■節(jié)點(diǎn) ■鏈路 ■控制器 ■控制(可選) ■擴(kuò)展(取決于它們所攜帶的數(shù)據(jù)) 在一個(gè)實(shí)施例中,簽名需要被分離并且<Signature>元項(xiàng)需要存在于<Bundle>對(duì)象中,所述<Bundle>對(duì)象包含需要被簽名的對(duì)象的XML表示。
在一個(gè)實(shí)施例中,<Signature(簽名)>塊包含 ■<SignedInfo>元項(xiàng) ■<S ignatureValue>元項(xiàng) ■<KeyInfo>元項(xiàng) 在一個(gè)實(shí)施例中,<SignedInfo>嵌入以下元項(xiàng)<CanonicalizationMethod>—在一個(gè)實(shí)施例中,<CanonicalizationMethod>元項(xiàng)是空的并且其算法屬性具有以下值http://www.w3.org/2001/10/xml-exc-c14n# <SignatureMethod>—在一個(gè)實(shí)施例中,<SignatureMethod>元項(xiàng)是空的并且其算法屬性可以具有以下值 ■http://www.w3.org/2000/09/xmldsig#hmac-sha1(HMAC簽名) ■http://www.w3.org/2000/09/xmldsig#rsa-sha1(公鑰簽名) <Reference>—在一個(gè)實(shí)施例中,如果一個(gè)以上對(duì)象需要由相同的密鑰來簽名(例如,對(duì)于控制和控制器對(duì)象,這可能就是這種情況),那么在<SignedInfo>塊內(nèi)就可以存在一個(gè)或多個(gè)<Reference(引用)>元項(xiàng)。
在一個(gè)實(shí)施例中,當(dāng)對(duì)對(duì)象簽名時(shí),<Reference>元項(xiàng)的‘URI’屬性值為引用對(duì)象的ID。當(dāng)對(duì)本地XML元項(xiàng)簽名時(shí)(例如在用于控制器對(duì)象的公共簽名方法的多個(gè)簽名情況中),URI值為所引用的元項(xiàng)的‘Id’屬性的值。
在一個(gè)實(shí)施例中,當(dāng)引用指向?qū)ο髸r(shí),在所述引用中所作的摘要不是對(duì)象的XML表示而是其規(guī)范的字節(jié)序列。借助于<Tranforms(變換)>塊在XMLDSig中表明此對(duì)象變換。因此在一個(gè)實(shí)施例中,<Reference>元項(xiàng)嵌入此塊
附錄D提供了附加信息。在一個(gè)實(shí)施例中,對(duì)于對(duì)象引用來說不允許其它<Tranform>。
在一個(gè)實(shí)施例中,<DigestMethod>元項(xiàng)是空的并且其算法屬性具有以下值http://www.w3.org/2000/09/xmldsig#sha1 <DigestValue(摘要值)>元項(xiàng)包含摘要的base64編碼值。
<SignatureValue(簽名值)>——在一個(gè)實(shí)施例中,簽名值是利用在<KeyInfo>元項(xiàng)中所描述的密鑰來base64編碼的規(guī)范化(ex-c14n)<SignedInfo>元項(xiàng)的簽名值。
<KeyInfo> ■用于控制器對(duì)象簽名的HMAC-SHA1情況 在一個(gè)實(shí)施例中,在這種情況下<KeyInfo>只有一個(gè)孩子<KeyName>,用于表明已經(jīng)為HMAC簽名使用的密鑰ID。
例子
■RSA-SHA1情況 在一個(gè)實(shí)施例中,在這種情況下,在X.509v3證書中攜帶用于驗(yàn)證簽名的公鑰并且所述公鑰可以由其它證書附帶,所述其它證書對(duì)完成通向CA根的證書路徑來說是可能是必要的。
這些證書被依照base64編碼并攜帶在<X509Certificate>元項(xiàng)中。這些<X509Certificate>元項(xiàng)被嵌入到<KeyInfo>元項(xiàng)的<X509Data>元項(xiàng)孩子中,并且依照順序次序出現(xiàn),從簽名密鑰的證書開始。通常省略根的證書。
例子(為了簡(jiǎn)潔起見,尚未再生整個(gè)示例性證書的值;已經(jīng)被刪除的材料由省略符號(hào)來表明) <KeyInfo> <X509Data> <!—簽名的公鑰的證書--> <X509Certificate>MIICh...</X509Certificate> <!—到信任根的中間證書--> <X509Certificate>MIICo...</X509Certificate> </X509Data> </KeyInfo> 在一個(gè)實(shí)施例中,控制器對(duì)象對(duì)于在它們的受控目標(biāo)列表中所引用的每個(gè)內(nèi)容密鑰來說需要具有至少一個(gè)HMAC簽名。用于那些簽名中每個(gè)的密鑰是在所引用的內(nèi)容密鑰對(duì)象中所包含的內(nèi)容密鑰值。
控制器還可以具有RSA簽名。在一個(gè)實(shí)施例中,如果這種簽名存在,那么此簽名還作為<Reference>在用于所述對(duì)象的每個(gè)HMAC簽名中出現(xiàn)。為了實(shí)現(xiàn)這點(diǎn),在一個(gè)實(shí)施例中,用于RSA簽名的<Signature>元項(xiàng)必須在封入的XML文檔內(nèi)具有唯一的‘Id’屬性,其在每個(gè)HMAC簽名的<Reference>元項(xiàng)之一中被用為‘URI’屬性。在一個(gè)實(shí)施例中,驗(yàn)證器必須拒絕未被HMAC簽名確證的RSA簽名。
例子 <Signature Id="Signature.0"xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo><CanonicalizationMethodAlgorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethodAlgorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha 1"/><Reference URI="urn:x-octopus.intertrust.com:controller:37A50262EE3389A14ABC0BC7BE5D 43E5"> <Transforms> <TransformAlgorithm="http://www.intertrust.com/Octopus/xmldsig#cbs-1_0"/> </Transforms> <DigestMethodAlgorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/> <DigestValue>G1zXF9Sz/zCwH6MaFm0ObOQcxuk=</DigestValue> </Reference></SignedInfo> <SignatureValue>mjoyW+w2S9iZDG/ha4eWYD1RmhQuqRuuSN977NODpzwUD02 FdsAICVjAcw7f4nFWuvtawW/c1FzYP/pjFebESCvurHUsEaR1/LYLDkpWWxh/L1Ep4 r3yR9kUs0AU5a4BDxDxQE7nUdqU9YMpnjAZEGpuxdPeZJM1vyKqNDpTk94=</Si gnatureValue> <KeyInfo> <X509Data><X509Certificate>MIICh...</X509Certificate></X509Data> </KeyInfo> </Signature> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha 1"/> <Reference URI="#Signature.0"> <DigestMethodAlgorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/> <DigestValue>AqPV0nvNj/vc51IcMyKJngGNKtM=</DigestValue> </Reference> <Reference URI="urn:x-octopus.intertrust.com:controller:1357"> <Transforms> <Transform Algorithm="http://www.intertrust.com/Octopus/xmldsig#cbs-1_0"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/> <DigestValue>G1zXF9Sz/zCwH6MaFm0ObOQcxuk=</DigestValue></Reference> </SignedInfo> <SignatureValue>TcKBsZZy+Yp3doOkZ62LTfY+ntQ=</SignatureValue> <KeyInfo><KeyName>urn:x-octopus.intertrust.com:secret-key:2001</KeyName> </KeyInfo></Signature> 13.鄰近度檢查協(xié)議 在一些實(shí)施例中,可能希望根據(jù)請(qǐng)求實(shí)體的物理鄰近度來限制對(duì)內(nèi)容、服務(wù)和/或其它系統(tǒng)資源的訪問(例如,幫助強(qiáng)制實(shí)施用于表明受保護(hù)的內(nèi)容無法被拷貝到用戶家庭網(wǎng)絡(luò)、辦公室建筑物等之外的規(guī)則)。下面將描述鄰近度檢查協(xié)議的實(shí)施例,所述實(shí)施例在不過于妨礙執(zhí)行鄰近度檢查本身的情況下提供安全性。鄰近度檢查協(xié)議有助于在各式各樣的寬的上下文情境中應(yīng)用,如上所指出其中之一是在數(shù)字權(quán)利管理控制的上下文情境中;然而應(yīng)當(dāng)理解,下述鄰近度檢查系統(tǒng)和方法并不限制應(yīng)用于數(shù)字權(quán)利管理上下文情境。例如而并非限制,這里所給出的鄰近度檢查技術(shù)還可以在網(wǎng)絡(luò)服務(wù)組織系統(tǒng)上下文情境中使用,諸如在‘551申請(qǐng)描述的上下文情境中和/或任何其它適當(dāng)?shù)纳舷挛那榫持小?br>
在一個(gè)實(shí)施例中,通過測(cè)量第一計(jì)算節(jié)點(diǎn)從第二計(jì)算節(jié)點(diǎn)接收對(duì)所述第一計(jì)算節(jié)點(diǎn)請(qǐng)求的響應(yīng)所花費(fèi)的時(shí)間量來執(zhí)行鄰近度檢查。如果所述時(shí)間量小于預(yù)定義閾值(通常表明第二計(jì)算節(jié)點(diǎn)在第一計(jì)算節(jié)點(diǎn)的某一物理距離內(nèi)),那么鄰近度檢查被認(rèn)為是成功的。
應(yīng)當(dāng)理解,由于存在各種可以用來發(fā)送請(qǐng)求和/或響應(yīng)的不同網(wǎng)絡(luò)連接的緣故,所以給定時(shí)間量可以對(duì)應(yīng)于可能的距離范圍。在一些實(shí)施例中,此變化被簡(jiǎn)單地忽略,并且如果請(qǐng)求/響應(yīng)交換的往返時(shí)間小于預(yù)定義的閾值(例如,8毫秒或任何其它適當(dāng)?shù)臅r(shí)間量),而不管例如是否正在使用快速網(wǎng)絡(luò)連接,這可能意味著請(qǐng)求和響應(yīng)節(jié)點(diǎn)實(shí)際上彼此相對(duì)較遠(yuǎn),那么鄰近度檢查被認(rèn)為是成功的。在其它實(shí)施例中,可以確定所使用的網(wǎng)絡(luò)連接類型,并且不同的往返時(shí)間要求可以被應(yīng)用于每個(gè)不同的網(wǎng)絡(luò)連接。
在優(yōu)選實(shí)施例中,鄰近度檢查允許錨(例如,客戶端)檢查目標(biāo)(例如,服務(wù))的鄰近度。在一個(gè)實(shí)施例中,協(xié)議是不對(duì)稱的,這是由于錨產(chǎn)生了秘密種子,所述種子被使用并且是利用安全計(jì)時(shí)器的唯一一個(gè)。此外,目標(biāo)不必信任所述錨。鄰近度檢查的優(yōu)選實(shí)施例還是密碼高效的在一個(gè)實(shí)施例中只利用兩個(gè)公鑰操作。
從種子S產(chǎn)生對(duì)Q的組R 在一個(gè)實(shí)施例中,依照以下公式從種子S獲得組RRi=H2Q-i(S)。其中H(M)是對(duì)消息M的散列函數(shù)H的摘要值,并且對(duì)于n>=1并且H0(M)=M來說,Hn(M)=H(Hn-1(M))。應(yīng)當(dāng)理解,這只是用于產(chǎn)生共享秘密的一個(gè)說明性技術(shù),并且在不脫離其原理的情況下在其它實(shí)施例中可以使用其它技術(shù)。
在一個(gè)實(shí)施例中,用于散列函數(shù)H的算法是SHA1(例如參見FIPSPUB 180-1。安全散列標(biāo)準(zhǔn)。美國(guó)標(biāo)準(zhǔn)和技術(shù)的商業(yè)/國(guó)家協(xié)會(huì)部(U.S.Department of Commerce/National Institute of Standards andTechnology)),不過應(yīng)當(dāng)理解,在其它實(shí)施例中,可以使用其它散列、消息摘要或函數(shù)。
在一個(gè)實(shí)施例中,按如下執(zhí)行鄰近度檢查,其中“A”是錨(例如,客戶端)并且“B”是目標(biāo)(例如,服務(wù)) (a)如上所示,A產(chǎn)生Q對(duì)隨機(jī)數(shù)的組R{R0,R1},{R2,R3}...{R2Q-2,R2Q-1}。
(b)A向B發(fā)送E(PubB,{Q,S}),其中E(Y,X)標(biāo)示了利用密鑰Y加密X,并且PubB標(biāo)示了B在公鑰/私鑰對(duì)中的公鑰。
(c)如上所示,B解密{Q,S}并且預(yù)先計(jì)算R。
(d)B向A發(fā)送確認(rèn)以便表明它準(zhǔn)備繼續(xù)。
(e)A把循環(huán)計(jì)數(shù)器k設(shè)置為零。
(f)A測(cè)量T0=當(dāng)前時(shí)間。
(g)A向B發(fā)送{k,R2*k}。
(h)如果R2*k值是正確的,那么B用R2*k+1作出響應(yīng)。
(i)A測(cè)量D=新的當(dāng)前時(shí)間-T0。
(j)對(duì)于R2*k+1來說,如果B利用正確值向A作出響應(yīng),并且D小于預(yù)定義的閾值,那么鄰近度檢查被認(rèn)為是成功的。
如果k+1<Q,那么A可以通過增加k并且轉(zhuǎn)到步驟(f)來重新嘗試新的測(cè)量。如果需要執(zhí)行Q次以上的測(cè)量,那么A可以以新的組R從步驟(a)開始。例如在一些實(shí)施例中,可以重復(fù)地(或預(yù)定義次數(shù)地)執(zhí)行鄰近度檢查,直到在預(yù)定義的閾值內(nèi)接收正確的響應(yīng)(或者如果在大于質(zhì)詢/響應(yīng)序列的預(yù)定義百分比的預(yù)定義閾值內(nèi)接收了正確的響應(yīng)),這是因?yàn)榧幢銉蓚€(gè)計(jì)算節(jié)點(diǎn)彼此在所要求的鄰近度內(nèi),異常緩慢的網(wǎng)絡(luò)連接、大通信量、噪聲等也可能導(dǎo)致B的響應(yīng)延遲。
圖36圖示了上述協(xié)議的實(shí)施例,其中錨(A)確定目標(biāo)(B)是否在可接受的錨(A)的鄰近度內(nèi)。例如如圖36所示,A可以包括計(jì)算節(jié)點(diǎn)3602,所述計(jì)算節(jié)點(diǎn)3602包含受保護(hù)的內(nèi)容(例如,音樂、視頻、文本、軟件等)和/或遠(yuǎn)程計(jì)算節(jié)點(diǎn)(B)3606訪問受保護(hù)的內(nèi)容所需要的內(nèi)容訪問材料(例如,鏈路、密鑰等),所述受保護(hù)的內(nèi)容存儲(chǔ)在計(jì)算節(jié)點(diǎn)B 3606或可由其訪問。與內(nèi)容或內(nèi)容訪問材料相關(guān)聯(lián)的控制可以表明它只可以與節(jié)點(diǎn)A3602某一鄰近度內(nèi)的設(shè)備共享(例如,把內(nèi)容分發(fā)近似地限制在家庭網(wǎng)絡(luò))。作為選擇或另外,可以在計(jì)算節(jié)點(diǎn)A3602的系統(tǒng)級(jí)強(qiáng)制實(shí)施這種策略(所述計(jì)算節(jié)點(diǎn)A 3602例如可以包括家庭或企業(yè)網(wǎng)的域管理器)。即,鄰近度檢查不必是由虛擬機(jī)所執(zhí)行的控制程序中的條件;作為替代它可以只是計(jì)算節(jié)點(diǎn)A 3602在向計(jì)算節(jié)點(diǎn)B 3606發(fā)送內(nèi)容或內(nèi)容訪問材料之前作為操作策略所要求的一些東西。為了強(qiáng)制實(shí)施這種控制和/或策略,每當(dāng)請(qǐng)求向計(jì)算節(jié)點(diǎn)B 3606分發(fā)受保護(hù)的內(nèi)容或內(nèi)容訪問材料時(shí),在計(jì)算節(jié)點(diǎn)A 3602上運(yùn)行的軟件和/或硬件可以執(zhí)行上述鄰近度檢查協(xié)議。作為選擇或另外,可以以預(yù)定義間隔執(zhí)行鄰近度檢查(例如,一天一次)以便確定節(jié)點(diǎn)B是否在所要求的鄰近度內(nèi),以及所述鄰近度檢查是否成功,對(duì)于預(yù)定義周期來說節(jié)點(diǎn)B 3606可以被視為在所要求的鄰近度內(nèi)(例如,直到執(zhí)行下一次檢查,直到預(yù)定義的時(shí)間量過去等)。
如圖36所示,一旦A和B完成任何初始設(shè)置步驟(例如,上面的步驟(a)到(e))3604、3608,A和B就從事安全、計(jì)時(shí)的質(zhì)詢-響應(yīng)交換(例如,上面的步驟(f)到(i))3610,所述交換使A能夠確定B是否在可接受的鄰近度內(nèi)。
如圖36所示,在一個(gè)實(shí)施例中A 3602向B 3606發(fā)送設(shè)置請(qǐng)求3604,所述設(shè)置請(qǐng)求3604包括E(PubB,{Q,S})——即,對(duì)Q的數(shù)目,以及利用B的公開加密密鑰(例如,由B在服務(wù)組織上下文情境內(nèi)使用的密鑰)加密的秘密對(duì)種子S。在一個(gè)實(shí)施例中,{Q,S}是依照網(wǎng)絡(luò)字節(jié)次序的Q(1字節(jié))和S(16字節(jié))的字節(jié)流拼接。在一個(gè)實(shí)施例中,使用RSA公鑰加密(例如在B.Kaliski、J.Staddon,PKCS#1的RSA Cryptography Specifications Version 2.0中所描述,IETFRFC2437,1998年10月)來執(zhí)行加密。在優(yōu)選實(shí)施例中,PubB將事先已經(jīng)由A通過審查訪問了,并且其證書將已經(jīng)被驗(yàn)證。盡管在圖36中示出了從B 3606到A 3602的設(shè)置響應(yīng)3608,不過在其它實(shí)施例中,不使用設(shè)置響應(yīng)3608。如先前所表明,在接收設(shè)置請(qǐng)求3604之后,B3606優(yōu)選預(yù)先計(jì)算組R,以便對(duì)來自A 3602的隨后質(zhì)詢進(jìn)行快速響應(yīng)。
如圖36所示,A 36-2向B發(fā)送質(zhì)詢請(qǐng)求3612,所述質(zhì)詢請(qǐng)求3612包括[k,R2*k]——即,索引k和根據(jù)種子所計(jì)算的相應(yīng)秘密。在一個(gè)實(shí)施例中,[k,R2*k]是用base64編碼的、依照網(wǎng)絡(luò)字節(jié)次序的k(1字節(jié))和R2*k(20字節(jié))的字節(jié)流拼接以供傳輸。如圖36所示,在一個(gè)實(shí)施例中,B 3606可操作來向A 3602發(fā)送質(zhì)詢響應(yīng)3614,所述質(zhì)詢響應(yīng)3614由R2*k+1組成——即,來自質(zhì)詢請(qǐng)求3612的相應(yīng)秘密。在一個(gè)實(shí)施例中,R2*k+1是用base64編碼的、依照網(wǎng)絡(luò)字節(jié)次序的R2*k+1(20字節(jié))的字節(jié)流以供傳輸。
圖37示出了可以怎樣使用上述鄰近度檢查協(xié)議的實(shí)施例來控制對(duì)受保護(hù)內(nèi)容訪問的例子。參照?qǐng)D37,假定電纜或衛(wèi)星內(nèi)容供應(yīng)者具有用于允許用戶個(gè)人錄像機(jī)(PVR)3702的預(yù)定義鄰近度3708內(nèi)的所有設(shè)備經(jīng)由所述PVR訪問內(nèi)容的策略。從而例如在PVR 3702上運(yùn)行的域管理器軟件可以對(duì)用于請(qǐng)求經(jīng)由PVR 3702對(duì)內(nèi)容進(jìn)行訪問的設(shè)備3704和3706執(zhí)行鄰近度檢查。在圖37中所示出的例子中,設(shè)備3706不在由服務(wù)供應(yīng)者策略所定義的鄰近度3708內(nèi),并且會(huì)被PVR 3702拒絕訪問。相比之下,設(shè)備3704在所述鄰近度內(nèi),并且會(huì)被提供有訪問(例如,通過連同從設(shè)備3704到PVR 3702的期滿鏈路一起接收內(nèi)容)。作為選擇或另外,所述鏈路可以包含控制程序,所述控制程序本身可操作來利用PVR 3702發(fā)起鄰近度檢查,并且如果設(shè)備3704移出PVR3702的預(yù)定義鄰近度3708之外,那么拒絕設(shè)備3704進(jìn)一步對(duì)內(nèi)容進(jìn)行訪問。
安全性考慮 在優(yōu)選實(shí)施例中,應(yīng)當(dāng)注意堅(jiān)持以下一些或全部 ●對(duì)于任何組R來說,并不利用相同的值k來重復(fù)包括步驟(f)到(i)的循環(huán)。
●如果任何一方接收了意料之外的消息,那么中止協(xié)議,所述意料之外包括 ○如果在步驟(g)中對(duì)于R2*k來說B接收了不正確的值 ○如果在步驟(a)中Q不在所指定的距離內(nèi) ○如果在循環(huán)中重復(fù)k ○如果k超過Q 作為選擇或另外如果在步驟(h)A接收了不正確的值R2*k+1,那么中止協(xié)議。在其它實(shí)施例中,可以容許某些來自B的不正確響應(yīng)。
應(yīng)當(dāng)理解,Q的最優(yōu)值和預(yù)定義的時(shí)間閾值一般取決于手邊的應(yīng)用的唯一環(huán)境(例如,網(wǎng)絡(luò)速度、確保相對(duì)緊密鄰近度的重要性等)。因此,實(shí)現(xiàn)方式優(yōu)選應(yīng)當(dāng)在配置這些值中提供靈活性。在一個(gè)實(shí)施例中,假定實(shí)現(xiàn)方式對(duì)于Q來說支持最小值64并且對(duì)于閾值來說支持值8ms(其中以今天的某個(gè)網(wǎng)絡(luò)速度,8ms可對(duì)應(yīng)于幾英里的鄰近度)。
協(xié)議安全策略 在優(yōu)選實(shí)施例中,對(duì)于交換請(qǐng)求和響應(yīng)來說不需要附加的安全性。由于所交換消息的大小(例如,20字節(jié))以及它們有效隨機(jī)性的原因(通過使用SHA1散列算法或其它方法),即便攻擊者設(shè)法攔截所述請(qǐng)求,那么所述攻擊者要確定正確的響應(yīng)在密碼上也是不可行的。
應(yīng)當(dāng)理解,上述實(shí)施例是說明性的,并且在不脫離這里所給出發(fā)明原理的情況下可以進(jìn)行許多修改。例如,雖然上面描述了遞歸散列的秘密種子,不過任何適當(dāng)?shù)墓蚕砻孛芸梢杂糜谫|(zhì)詢/響應(yīng)。在一個(gè)實(shí)施例中,共享秘密可以只是包括從A到B發(fā)送的加密的數(shù)目/消息,并且質(zhì)詢/響應(yīng)可以只是包括數(shù)目/消息的A和B交換部分(例如,A向B發(fā)送消息的第一字符,并且B向A發(fā)送所述消息的第二字符等)。盡管這種技術(shù)可能缺乏結(jié)合圖36所描述的實(shí)施例的安全性(由于消息中的字符會(huì)比20字節(jié)散列更易于猜測(cè)),不過在一些實(shí)施例中,這種安全等級(jí)可能是足夠的(特別是例如在網(wǎng)絡(luò)延遲可變性使鄰近度檢查機(jī)制相當(dāng)粗略地控制實(shí)際鄰近度的情況下),并且在其它實(shí)施例中,可以通過多次執(zhí)行鄰近度檢查來增強(qiáng)安全性,其中盡管任何特定的數(shù)字或比特可能相對(duì)易于猜測(cè),不過攻擊者能夠正確猜測(cè)給定數(shù)字或比特序列的可能性隨著序列長(zhǎng)度增加而迅速減小。在這種實(shí)施例中,只有當(dāng)B能夠提供預(yù)定義數(shù)目以上個(gè)連續(xù)的正確響應(yīng)(或正確響應(yīng)的預(yù)定義百分比以上)時(shí),鄰近度檢查才可以被認(rèn)為是成功的。
為了說明和解釋,下面提供了鄰近度檢查協(xié)議的補(bǔ)充說明性例子。在此例子中,第一設(shè)備SRC經(jīng)由通信信道(例如計(jì)算機(jī)網(wǎng)絡(luò))與第二設(shè)備SNK通信。我們想要能夠安全地確定SRC和SNK是否彼此在鄰近度(按照SNK對(duì)來自SRC的通信請(qǐng)求作出響應(yīng)所花費(fèi)的時(shí)間來測(cè)量)以內(nèi)。從SRC向SNK發(fā)送質(zhì)詢或探測(cè)消息,并且SNK利用響應(yīng)消息來應(yīng)答。在發(fā)出質(zhì)詢和接收響應(yīng)之間的時(shí)段被稱作往返時(shí)間或RTT。為了避免在SNK計(jì)算并送回對(duì)質(zhì)詢的響應(yīng)所花費(fèi)的時(shí)間中引入不必要的開銷,通常希望實(shí)際上盡可能少量地進(jìn)行質(zhì)詢/響應(yīng)通信。特別地是,一般希望避免要求SRC或SNK在發(fā)出質(zhì)詢和接收響應(yīng)之間進(jìn)行密碼運(yùn)算。
為了確保只有SNK能夠?qū)碜許RC的質(zhì)詢生成有效響應(yīng)(例如,為了避免中間人的攻擊,其中第三方可以攔截來自SRC的質(zhì)詢并且向回發(fā)送響應(yīng),就好像SNK已經(jīng)響應(yīng)一樣),所述協(xié)議還可以按如下繼續(xù) (1)SRC創(chuàng)建秘密。此秘密由一對(duì)或多對(duì)隨機(jī)或偽隨機(jī)數(shù)組成。
(2)SRC向SNK發(fā)送秘密。協(xié)議的此部分不是對(duì)時(shí)間敏感的。所述秘密由SRC和SNK來保持機(jī)密。還依照確保只有SNK知道所述秘密的方式來發(fā)送所述秘密。這一般涉及經(jīng)由在SRC和SNK之間的安全認(rèn)證信道來發(fā)送秘密(例如,SRC可以利用它知道只有SNK具有相應(yīng)私鑰的公鑰來加密秘密數(shù)據(jù))。秘密數(shù)據(jù)不必是上述的隨機(jī)或偽隨機(jī)數(shù)對(duì)。即便在使用這種對(duì)的實(shí)施例中,在此步驟中所發(fā)送的秘密數(shù)據(jù)只需要是使SNK足以計(jì)算或推算數(shù)目對(duì)值的信息。例如,秘密數(shù)據(jù)可以是隨機(jī)種子數(shù)目,據(jù)此可以使用種子偽隨機(jī)數(shù)發(fā)生器來產(chǎn)生一對(duì)或多對(duì)偽隨機(jī)數(shù)。
(3)一旦SRC知道SNK準(zhǔn)備接收質(zhì)詢(例如,SNK可以在接收和處理秘密數(shù)據(jù)之后發(fā)送READY消息),SRC就創(chuàng)建質(zhì)詢消息。為了創(chuàng)建質(zhì)詢消息。例如在優(yōu)選實(shí)施例中,SRC選擇隨機(jī)數(shù)對(duì)之一。如果使用一對(duì)以上,那么質(zhì)詢消息數(shù)據(jù)包含用于表明選擇哪對(duì)以及在該對(duì)中兩個(gè)數(shù)目之一的信息。
(4)SRC測(cè)量當(dāng)前時(shí)間值T0。在此之后,SRC立即向SNK發(fā)送質(zhì)詢消息(不需要加密或數(shù)字簽名)并且等待響應(yīng)。作為選擇,SRC可以在發(fā)送質(zhì)詢消息之前(不過優(yōu)選在已經(jīng)執(zhí)行任何伴隨的密碼運(yùn)算(例如,加密、簽名等)之后)立即測(cè)量當(dāng)前時(shí)間T0。
(5)SNK接收質(zhì)詢,據(jù)此它可以標(biāo)識(shí)它先前已經(jīng)接收的對(duì)之一。SNK檢查質(zhì)詢中的隨機(jī)數(shù)是所述對(duì)的一部分,并且構(gòu)造響應(yīng)消息,所述響應(yīng)消息包含了該對(duì)的另一隨機(jī)數(shù)的值。
(6)SNK向SRC發(fā)送響應(yīng)消息(不需要加密或數(shù)字簽名)。
(7)SRC接收響應(yīng)消息,并且測(cè)量當(dāng)前時(shí)間T1的值。往返時(shí)間RTT等于T1-T0。
(8)SRC驗(yàn)證在響應(yīng)中所接收的數(shù)目等于為質(zhì)詢所選擇的對(duì)中的另一值。如果所述數(shù)目匹配,那么質(zhì)詢響應(yīng)成功,并且SRC可以確信SNK在由往返時(shí)間所表明的鄰近度內(nèi)。如果所述數(shù)目不匹配,那么SRC可以中止協(xié)議,或者如果共享一個(gè)以上的對(duì),并且存在尚未使用的至少一對(duì),那么返回到步驟(3)并且使用不同的對(duì)。
應(yīng)當(dāng)理解,在不脫離其原理的情況下可以對(duì)上述說明性鄰近度檢查協(xié)議進(jìn)行許多改變。例如而并非限制,可以使用不同的密碼算法,可以使用不同的共享秘密等。
14.安全性 在實(shí)際應(yīng)用這里所描述的系統(tǒng)和方法中,可以以各種不同的級(jí)別并且使用各種不同的技術(shù)來提供安全性。這里的論述主要集中于DRM引擎和相關(guān)主機(jī)應(yīng)用的設(shè)計(jì)和操作以用于有效地調(diào)整可能復(fù)雜的業(yè)務(wù)關(guān)系。當(dāng)DRM引擎和主機(jī)應(yīng)用按照預(yù)計(jì)的那樣操作時(shí),通過強(qiáng)制實(shí)施與內(nèi)容相關(guān)聯(lián)的許可條款來保護(hù)所述內(nèi)容免受未經(jīng)授權(quán)的訪問或其它使用。
保護(hù)DRM引擎和/或所述DRM引擎運(yùn)行的環(huán)境(例如,應(yīng)用和其與之交互的硬件)免受惡意篡改或修改可以使用任何適當(dāng)?shù)陌踩约夹g(shù)組合來進(jìn)行。例如,可以使用諸如加密、數(shù)字簽名、數(shù)字證書、消息認(rèn)證代碼等密碼機(jī)制,例如在此的其它地方所描述,以保護(hù)DRM引擎、主機(jī)應(yīng)用和/或其它系統(tǒng)軟件或硬件免受篡改和/或其它攻擊,也可以是結(jié)構(gòu)和/或策略上的安全措施,諸如軟件模糊化、自檢、定制、水印、反調(diào)試和/或其它機(jī)制。例如可以在美國(guó)專利號(hào)6,668,325 B1的Obfuscation Techniques for Enhancing Software Security中以及在共同受讓的美國(guó)專利申請(qǐng)?zhí)?1/102,306,作為US-2005-0183072-A1公開;美國(guó)專利申請(qǐng)?zhí)?9/629,807;美國(guó)專利申請(qǐng)?zhí)?0/172,682,作為US-2003-0023856-A1公開;美國(guó)專利申請(qǐng)?zhí)?1/338,187,作為US-2006-0123249-A1公開;以及美國(guó)專利號(hào)7,124,170B1的SecureProcessing Unit Systems and Methods中找到這種技術(shù)的代表性例子,這里在此通過全部引用加以結(jié)合以供參考。作為選擇或另外,可以使用物理安全技術(shù)(例如,使用相對(duì)難于訪問的存儲(chǔ)器、安全處理器、安全存儲(chǔ)器管理單元、硬件保護(hù)的操作系統(tǒng)模式等)來進(jìn)一步增強(qiáng)安全性。這種安全性技術(shù)為本領(lǐng)域普通技術(shù)人員之一所知,并且應(yīng)當(dāng)理解,根據(jù)所想要的保護(hù)級(jí)別和/或手頭特定應(yīng)用的細(xì)節(jié)可以使用一些或所有這些技術(shù)的任何適當(dāng)?shù)慕M合,或者不使用這些技術(shù)。從而應(yīng)當(dāng)理解,雖然這里結(jié)合某些實(shí)施例描述了某些安全機(jī)制(例如,密鑰推導(dǎo)技術(shù)、數(shù)字簽名技術(shù)、加密技術(shù)等),但是在所有實(shí)施例中并不要求使用這些技術(shù)。
可以借助系統(tǒng)的規(guī)定設(shè)計(jì)和操作以及其中參與者的法律和社會(huì)規(guī)章來提供又一形式的安全性。例如,為了獲得個(gè)性節(jié)點(diǎn)、密鑰材料、受保護(hù)內(nèi)容等,可以要求設(shè)備或?qū)嶓w在契約上同意遵循系統(tǒng)規(guī)范和要求,可以需要服從證明(certification)過程等,其中在所述證明過程期間可以驗(yàn)證實(shí)體與系統(tǒng)要求的順應(yīng)性。例如,可以要求設(shè)備或應(yīng)用依照與環(huán)境中的其它實(shí)現(xiàn)方式兼容的方式來實(shí)現(xiàn)DRM引擎,和/或要求所述設(shè)備或應(yīng)用提供某種類型或級(jí)別的抗竄改或其它安全性。可以發(fā)出用于證明設(shè)備或其它實(shí)體與這種要求順應(yīng)性的數(shù)字證書,并且可以在允許所述設(shè)備或?qū)嶓w參與系統(tǒng)之前或作為允許繼續(xù)訪問的條件來驗(yàn)證這些證書。
下面提供了關(guān)于安全性技術(shù)的另外的非限制性信息,其可以結(jié)合所發(fā)明的工作主體使用。
系統(tǒng)安全性 在一些實(shí)施例中,系統(tǒng)設(shè)計(jì)員可以選擇使用更新、拒絕和/或補(bǔ)救技術(shù)的組合來管理風(fēng)險(xiǎn)并緩和威脅,所述威脅可能起因于對(duì)設(shè)備、應(yīng)用和服務(wù)的攻擊和危害。下面給出了可以用來緩和威脅的各種技術(shù)機(jī)制的例子。
可以使用更新機(jī)制來服務(wù)至少兩個(gè)不同目的。首先,它們可以用來向信任的系統(tǒng)實(shí)體傳達(dá)最新信息,所述系統(tǒng)實(shí)體允許它們拒絕訪問或服務(wù)于不信任的系統(tǒng)實(shí)體。第二,更新機(jī)制使不信任的實(shí)體能夠通過更新任何有危害的組件來返回到信任狀態(tài)。拒絕對(duì)策可以進(jìn)一步被表征為表現(xiàn)為以下一個(gè)或多個(gè)行為 ●撤銷或廢除憑證(一般通過把一些實(shí)體放入黑名單) ●通過應(yīng)用密碼或策略強(qiáng)制機(jī)制來排除或拒絕訪問 ●根據(jù)被綁定到憑證的身份或其它屬性來回避或拒絕訪問或服務(wù) ●根據(jù)時(shí)間事件來截止或廢除憑證或特權(quán)。
例如,可以使用拒絕機(jī)制來對(duì)諸如設(shè)備克隆、假冒攻擊、協(xié)議失敗、策略實(shí)施失敗、應(yīng)用安全性失敗和失效或可疑信息之類的威脅進(jìn)行計(jì)數(shù)。
下表提供了潛在威脅、它們?cè)斐傻囊恍╋L(fēng)險(xiǎn)和用于補(bǔ)救所述威脅并且更新系統(tǒng)安全的機(jī)制的例子。
撤銷 撤銷可以被視為依賴把實(shí)體列入黑名單的補(bǔ)救機(jī)制。典型情況下,所撤消的是諸如公鑰證書之類的憑證。當(dāng)撤消憑證時(shí),需要更新黑名單并且使用更新機(jī)制來傳達(dá)所述更新使得依賴方可以從中獲益。
從而在向設(shè)備、用戶和/或其它實(shí)體給予用于消費(fèi)內(nèi)容或服務(wù)所必須的信息之前,例如可以要求它們給出身份證書、其它憑證和各種安全數(shù)據(jù)。類似地,為了使客戶端信任服務(wù),所述服務(wù)可能需要向所述客戶端提供其憑證。
實(shí)體可以有效地使為訪問服務(wù)所必須的信息無效的方式的例子包括 ●證書撤銷列表(CRL) ●憑證和數(shù)據(jù)有效性服務(wù),諸如在線證書狀態(tài)協(xié)議(OnlineCertificate Status Protocol OCSP)應(yīng)答者 ●用于自毀憑證和數(shù)據(jù)的命令 證書撤銷列表(CRL) 撤銷列表可以由不同的實(shí)體用來撤消身份證書、許可、鏈路及其它安全聲明。此機(jī)制對(duì)于補(bǔ)救源于服務(wù)受到危害的情況來說是最有效的??梢允褂枚喾N技術(shù)來分發(fā)CRL。例如,一些系統(tǒng)可以使用間接CRL,使得存在用于管理整個(gè)生態(tài)系統(tǒng)(escosystem)的單個(gè)CRL。另外,實(shí)體可以通告(或公開)它們擁有的CRL和/或預(yù)訂更新服務(wù)??梢砸勒詹《疽鸬姆绞絹韺?duì)等地分發(fā)CRL,和/或便攜式設(shè)備當(dāng)被束縛時(shí)可以接收公開的CRL。在‘551申請(qǐng)中所描述的服務(wù)組織技術(shù)也可以用于此目的。
有效性服務(wù) 可以使用有效性服務(wù)來提供關(guān)于憑證及其它安全相關(guān)數(shù)據(jù)狀態(tài)的最新信息。有效性服務(wù)可以執(zhí)行代表依賴方來執(zhí)行活動(dòng)的證實(shí)操作,或者它們可以用來代表依賴方管理安全信息?;顒?dòng)有效性服務(wù)的例子是可以檢查憑證或?qū)傩杂行缘姆?wù)。用于管理安全信息的有效性服務(wù)的例子是傳播CRL或安全策略更新或提供安全時(shí)間服務(wù)的那些服務(wù)。使用有效性服務(wù)可以幫助確保依賴方具有用于通知管理決定的當(dāng)前數(shù)據(jù)。
典型情況下,并非所有系統(tǒng)實(shí)體需要關(guān)于憑證和安全數(shù)據(jù)有效性的最新信息。例如,每當(dāng)使用許可或獲得新的許可時(shí),并非所有消費(fèi)者設(shè)備將使用在線證書狀態(tài)協(xié)議(Online Certificate Status ProtocolOCSP)服務(wù)來證實(shí)許可服務(wù)器的證書鏈。然而,許可服務(wù)器可以一定頻率地使用OCSP服務(wù)來檢查訂戶憑證的有效性。策略(其可以被容易地更新)可以確定必須何時(shí)使用服務(wù)以及使用什么服務(wù)。通過提供動(dòng)態(tài)地更新策略的機(jī)會(huì),許可服務(wù)器可以適于操作上的改變。從而,安全策略可以根據(jù)經(jīng)驗(yàn)、技術(shù)進(jìn)展和市場(chǎng)因素來發(fā)展。
安全對(duì)象的有向自毀 當(dāng)實(shí)體的安全處理的完整性并非是不可信的時(shí),由實(shí)體自毀憑證和數(shù)據(jù)是適當(dāng)?shù)?。?dāng)此選項(xiàng)是可用的時(shí),它常常是最直接的、迅速的和高效的撤銷方法。在幾乎不懷疑完整性被破壞時(shí)它是特別有用的,并且雙向通信支持用于允許銷毀以及銷毀已經(jīng)完成的驗(yàn)證的具體方向的協(xié)議。
存在常常對(duì)已經(jīng)銷毀或禁止來說是有用的多個(gè)安全對(duì)象。例如,當(dāng)設(shè)備離開域或者內(nèi)容許可超時(shí)時(shí),相關(guān)聯(lián)的對(duì)象包含密鑰并且可以用來訪問要被銷毀的內(nèi)容是有用的。在此的其它地方更詳細(xì)描述的代理控制程序?qū)τ谧詺C(jī)制的實(shí)現(xiàn)來說是很合適的。代理可以被設(shè)計(jì)來銷毀安全存儲(chǔ)裝置(例如,狀態(tài)數(shù)據(jù)庫)中的狀態(tài)以便影響域成員資格中的變化或者移除不再可用的密鑰(例如,由于成員資格或策略的改變)。
排除 排除是用于阻擋危險(xiǎn)分子(或危險(xiǎn)分子組)參與將來消費(fèi)商品及服務(wù)的補(bǔ)救機(jī)制。由于排除所強(qiáng)加的嚴(yán)重結(jié)果,所以它一般只是被用為當(dāng)環(huán)境批準(zhǔn)時(shí)的最后手段。排除依賴于用于把危險(xiǎn)分子有效地列入黑名單由此禁止它們消費(fèi)媒體和媒體相關(guān)服務(wù)的機(jī)制。黑名單的傳播依賴于用于啟用此補(bǔ)救的更新機(jī)制。然而,排除不必提供用于把危險(xiǎn)分子恢復(fù)為信任狀態(tài)的更新機(jī)制。
密鑰排除 密鑰排除是用于采用在任何給定時(shí)間可以判定在邏輯上把一些接收器子集從解密將來內(nèi)容的能力中排除在外的方式來向一組接收器廣播密鑰信息。這通過使用高效技術(shù)構(gòu)造廣播密鑰塊(Broadcast KeyBlock BKB)來激活,所述廣播密鑰塊包括為巨大的接收器組的每個(gè)成員解密內(nèi)容所必須的信息。BKB采用可以被容易更新的方式來構(gòu)造,把該組的一個(gè)或多個(gè)成員從解密所述內(nèi)容的能力中排除。換句話說,BKB的設(shè)計(jì)允許權(quán)威機(jī)構(gòu)利用新的BKB來更新系統(tǒng),使得內(nèi)容供應(yīng)者可以特別地排除目標(biāo)設(shè)備組利用所述BKB,即便她/他可能有權(quán)訪問它也是如此。
此機(jī)制對(duì)克隆攻擊來說是特別有效的,其中盜版者對(duì)合法設(shè)備進(jìn)行反向工程,提取其密鑰,繼而把那些密鑰的拷貝散布到克隆設(shè)備??寺〕瞬灰欢ㄗ裱芾砟P椭?,表面像原始那樣做動(dòng)作。一旦發(fā)現(xiàn)受到危害,就可以部署更新的BKB,所述BKB排除受到危害的設(shè)備以及其所有的克隆。然而,密鑰排除承擔(dān)一些存儲(chǔ)、傳輸和計(jì)算開銷,在一些情況中這使與其它方法相比沒那么高效。當(dāng)沒有廣播內(nèi)容時(shí)或當(dāng)存在暗道時(shí)特別如此。
回避(shunning) 回避是與排除行為非常類似的補(bǔ)救機(jī)制,但是沒有那么嚴(yán)重的影響。實(shí)質(zhì)上,它是用于由于運(yùn)行時(shí)策略判定而拒絕服務(wù)的手段。代替通過有向自毀或經(jīng)由密鑰排除訪問拒絕來禁止設(shè)備能力的更苛刻的方法,回避通過使服務(wù)供應(yīng)者拒絕向其提供服務(wù)來提供更簡(jiǎn)單的禁止設(shè)備的方法。在當(dāng)前趨向于通過使用外部提供的服務(wù)來擴(kuò)展設(shè)備的價(jià)值的情況下,回避變?yōu)楦佑行У陌踩珯C(jī)制。
設(shè)備回避由策略來驅(qū)動(dòng)并且可以用來排斥沒有生成策略所要求的所有適當(dāng)憑證的實(shí)體(例如,客戶端、服務(wù)器和特定任務(wù)播放器)。策略例如可以要求實(shí)體證明它已經(jīng)執(zhí)行了最新的安全更新。因此回避可以是撤銷的結(jié)果或無法采取某個(gè)特定動(dòng)作??梢允褂脤彶榉?wù)和諸如在‘551申請(qǐng)中所描述的那些服務(wù)依照對(duì)等方式來使回避便于進(jìn)行。數(shù)據(jù)證明服務(wù)(例如,有效性服務(wù)的實(shí)例)還可以在策略強(qiáng)制實(shí)施時(shí)執(zhí)行回避。在系統(tǒng)實(shí)體已經(jīng)被回避之后,可以向它通知沒能符合服務(wù)策略的具體憑證或?qū)ο?。這可以觸發(fā)所回避的實(shí)體通過適當(dāng)?shù)姆?wù)接口來更新對(duì)象。
期滿 期滿是依賴于一些時(shí)間事件來使憑證或?qū)ο鬅o效的補(bǔ)救機(jī)制。期滿在允許對(duì)媒體或媒體服務(wù)進(jìn)行臨時(shí)訪問時(shí)是有效的;一旦這些已經(jīng)期滿,那么管理模型確保不再允許訪問。有效的使用期滿可以要求更新機(jī)制,借此可以刷新憑證或?qū)ο笠员隳軌蚶^續(xù)訪問媒體或媒體服務(wù)。
憑證的期滿 證實(shí)的密鑰可以具有被分配來用于保護(hù)依賴方的各種期滿屬性。憑證的期滿可以用來確保其證書已經(jīng)期滿的實(shí)體被拒絕服務(wù)并且結(jié)合密鑰翻滾(rollover)和密鑰更新過程來使用。當(dāng)預(yù)計(jì)實(shí)體頻繁地連接到廣域網(wǎng)時(shí),最佳實(shí)施方式指示定期地更新憑證及其它安全數(shù)據(jù)。另一最佳實(shí)施方式在于保持這些對(duì)象的有效時(shí)段盡量合理地短。在有效性檢查策略中諸如重疊有效時(shí)段和寬限時(shí)段之類的各種技術(shù)可以用來確保在轉(zhuǎn)變期間的平滑操作。短的有效時(shí)段還有助于減小CRL的大小。
鏈路的期滿 如前所述,可以向鏈路對(duì)象分配有效時(shí)段。當(dāng)期滿時(shí),鏈路被認(rèn)為是無效的并且DRM引擎在構(gòu)成它的圖時(shí)不考慮該鏈路。此機(jī)制可以用來允許對(duì)商品及服務(wù)進(jìn)行臨時(shí)訪問。鏈路可以被更新,使得只要策略允許就可以準(zhǔn)許對(duì)媒體繼續(xù)訪問。因?yàn)樵谝粋€(gè)實(shí)施例中鏈路是相對(duì)輕便的自保護(hù)對(duì)象,所以它們可以經(jīng)由對(duì)等協(xié)議被容易地分發(fā)。
可更新機(jī)制應(yīng)用和策略可更新性 高效的可更新性一般需要對(duì)協(xié)議失敗迅速展開補(bǔ)救,所述協(xié)議失敗常常是在安全應(yīng)用中(包括在DRM系統(tǒng)中)所常見的主要安全問題。然后可以使用軟件更新來更新企業(yè)邏輯和安全協(xié)議。當(dāng)應(yīng)用被設(shè)計(jì)成用于把安全策略和信任策略與應(yīng)用邏輯相分離時(shí),可以使用獨(dú)立的機(jī)制來更新策略;這是不那么有風(fēng)險(xiǎn)的方法。實(shí)際上,可以使用對(duì)等公開機(jī)制來迅速地更新策略。否則,可以使用應(yīng)用部署者的軟件更新方法更新安全和信任策略。
為權(quán)利作業(yè)使用權(quán)利工具 通常當(dāng)可能時(shí)希望使用相對(duì)輕便的工具。使用具有有限有效時(shí)段的憑證和檢查有效日期的策略可以幫助把實(shí)體的整個(gè)群體保持為可管理的大小并且不必太過迅速地發(fā)展CRL。避免實(shí)體而不是把它從對(duì)密鑰的訪問中排除可以擴(kuò)展BKB的使用期;此外,它還有允許細(xì)粒度策略的優(yōu)點(diǎn),所述策略可以是臨時(shí)的并且隨環(huán)境而改變??梢允褂貌煌腃RL而不是BKB,其中所述CRL跟蹤不同任務(wù)播放器感興趣的特定類型的憑證,所述BKB可以被部署在它們最有效的地方(諸如處理克隆接收者)。當(dāng)可以預(yù)期在線有效性服務(wù)對(duì)時(shí)間和精力投資能提供合理回報(bào)時(shí),策略可以引導(dǎo)使用那些服務(wù),其中未用過的憑證是非常重要的,并且其中較慢的撤銷機(jī)制是不夠的。當(dāng)節(jié)點(diǎn)可能具有完整性并且可以被預(yù)計(jì)為做正確的事時(shí),并且當(dāng)需要撤消許可或安全對(duì)象(諸如用于預(yù)訂的鏈路或域鏈路)時(shí),那么合理的方法一般是告訴節(jié)點(diǎn)銷毀所述對(duì)象。在這種情況下,不必公開宣布許可是無效的并且不必部署B(yǎng)KB或?yàn)橛蛑匦略O(shè)定密鑰。由本地策略或權(quán)威命令驅(qū)動(dòng)的自毀是用于撤銷的最有效的方法之一。
應(yīng)當(dāng)理解,雖然已經(jīng)描述了各種撤銷、更新、補(bǔ)救及其它技術(shù)和實(shí)施方式,然而應(yīng)當(dāng)理解,不同的情況要求不同的工具,而且可以使用這些技術(shù)中的任何適當(dāng)組合或不使用這些技術(shù)來實(shí)施這里所描述系統(tǒng)和方法的優(yōu)選實(shí)施例。
網(wǎng)絡(luò)服務(wù)安全 以下論述舉例說明了一些可能與以下實(shí)施例有關(guān)的安全性考慮和技術(shù),在所述實(shí)施例中結(jié)合諸如在‘551申請(qǐng)中所描述的那些聯(lián)網(wǎng)的服務(wù)組織系統(tǒng)和方法使用上述DRM引擎和應(yīng)用。
用于使用諸如這里所公開的那些DRM引擎和體系結(jié)構(gòu)的DRM系統(tǒng)的實(shí)際實(shí)現(xiàn)方式常常執(zhí)行聯(lián)網(wǎng)事務(wù)來訪問內(nèi)容和DRM對(duì)象。在這樣的上下文情境中,在‘551申請(qǐng)中所描述的系統(tǒng)和方法尤其可以用來使消息層安全標(biāo)準(zhǔn)化,包括實(shí)體認(rèn)證和授權(quán)屬性(角色)的格式。
為了論述,在DRM系統(tǒng)中出現(xiàn)的事務(wù)可以根據(jù)所訪問、獲取或操縱的信息類型被分成至少兩個(gè)一般類別 內(nèi)容訪問事務(wù)涉及直接訪問或操縱受DRM系統(tǒng)保護(hù)的媒體或企業(yè)內(nèi)容或其它敏感信息。內(nèi)容訪問事務(wù)的例子包括再現(xiàn)受保護(hù)的視頻剪輯,把受保護(hù)音頻曲目的拷貝燒錄到緊湊盤上,把被保護(hù)文件移動(dòng)到便攜式設(shè)備,電子郵件發(fā)送機(jī)密文檔等。內(nèi)容訪問事務(wù)一般涉及直接訪問內(nèi)容保護(hù)密鑰并且在用戶指導(dǎo)下在消費(fèi)點(diǎn)執(zhí)行。
對(duì)象事務(wù)是其中用戶或系統(tǒng)獲取由DRM系統(tǒng)所定義的對(duì)象或與之相交互的事務(wù),所述對(duì)象采用某種方式來管理對(duì)受保護(hù)內(nèi)容的訪問。這種對(duì)象包括DRM許可、成員資格令牌、撤銷列表等。通常在為執(zhí)行內(nèi)容訪問事務(wù)所必須的所有擔(dān)保都是可用的之前,要求一個(gè)或多個(gè)對(duì)象事務(wù)。對(duì)象事務(wù)一般其特征在于使用某種類型的通信網(wǎng)絡(luò)來在消費(fèi)點(diǎn)匯編DRM對(duì)象。
這兩種類型的事務(wù)定義了通常與大部分DRM系統(tǒng)有關(guān)的兩個(gè)管理點(diǎn)。圖38示出了一對(duì)典型的交互,其中具有DRM功能的客戶端3800從適當(dāng)?shù)腄RM許可服務(wù)3804中請(qǐng)求DRM許可3802。在圖38所示出的例子中,DRM許可3802從DRM許可服務(wù)3804被發(fā)送到客戶端3800,在那里它被評(píng)估以便提供對(duì)內(nèi)容3806的訪問。
DRM系統(tǒng)一般要求依照防止對(duì)內(nèi)容未經(jīng)授權(quán)的訪問以及創(chuàng)建保護(hù)所述內(nèi)容的對(duì)象的方式來執(zhí)行內(nèi)容訪問和對(duì)象事務(wù)。然而,用于兩種類型事務(wù)的安全問題自然是不同的。例如 內(nèi)容訪問事務(wù)可以要求認(rèn)證人類委托人,檢查安全再現(xiàn)計(jì)數(shù),評(píng)估DRM許可以便導(dǎo)出內(nèi)容保護(hù)密鑰等。對(duì)合法執(zhí)行內(nèi)容訪問事務(wù)的主要威脅是破壞了用于保護(hù)對(duì)象和其中數(shù)據(jù)的抗篡改界限。
對(duì)象事務(wù)通常涉及在要求DRM對(duì)象的實(shí)體和可以提供它的實(shí)體之間的通信信道。因而,對(duì)象事務(wù)面臨基于通信的威脅,諸如中間人攻擊、重播攻擊、拒絕服務(wù)攻擊和其中未經(jīng)授權(quán)的實(shí)體獲取它們不應(yīng)當(dāng)合法擁有的DRM對(duì)象的攻擊。
通常,對(duì)象事務(wù)涉及兩個(gè)相交互實(shí)體的認(rèn)證,在它們之間傳遞的消息的保護(hù)以及所述事務(wù)的授權(quán)。這種事務(wù)的主要目的在于從合法源中采集完整保護(hù)的DRM對(duì)象使得可以執(zhí)行內(nèi)容訪問事務(wù)。從內(nèi)容訪問事務(wù)的視角看,用于獲得合法DRM對(duì)象的機(jī)制以及在獲得它們過程中所使用的擔(dān)保信息在本質(zhì)上是無關(guān)的;這些機(jī)制可以(并且優(yōu)選應(yīng)當(dāng))對(duì)于內(nèi)容訪問本身來說是不可見的。此問題的自然分離在優(yōu)選實(shí)施例中導(dǎo)致了分層通信模型,分層通信模型用于把信任通信框架與在其之上所構(gòu)建的應(yīng)用區(qū)分開來。
在圖38中所示出的簡(jiǎn)化的許可獲取和消費(fèi)例子模糊了通常在實(shí)際應(yīng)用中是重要的一些細(xì)節(jié)。例如,沒有示出DRM許可服務(wù)怎樣驗(yàn)證請(qǐng)求DRM許可的實(shí)體實(shí)際上是合法的DRM客戶端而不是惡意的實(shí)體,所述惡意的實(shí)體試圖獲得未經(jīng)授權(quán)的許可或通過消耗網(wǎng)絡(luò)帶寬和處理能力來拒絕對(duì)合法客戶端服務(wù)。也沒有示出當(dāng)敏感信息通過連接客戶端和服務(wù)的通信信道移動(dòng)時(shí)怎樣保護(hù)所述敏感信息的機(jī)密性和完整性。
在圖39中示出了此示例性事務(wù)的更詳細(xì)的視圖。參照?qǐng)D39,從應(yīng)用層內(nèi)容再現(xiàn)客戶端3800和DRM許可服務(wù)器3804的觀點(diǎn)來,虛線表示邏輯事務(wù)。下面的堆棧3900表示用于確保在兩個(gè)端點(diǎn)之間的受信任和受保護(hù)遞送的處理層。
在圖39中,再現(xiàn)客戶端3800從DRM許可服務(wù)器3804請(qǐng)求許可3802。圖中的虛線表明信息原始的源和最終消費(fèi)者是內(nèi)容再現(xiàn)客戶端3800和DRM許可服務(wù)器3804。然而,在實(shí)踐中消息有效載荷實(shí)際上可以由在應(yīng)用層邏輯和連接兩個(gè)端點(diǎn)的不安全通信信道3902之間插入的幾個(gè)處理層來處理。
用于把應(yīng)用層組件與不安全的通信信道相分離的處理層一塊被認(rèn)為是安全堆棧。安全堆??梢员徽J(rèn)為是用于確保在信任端點(diǎn)之間對(duì)消息進(jìn)行完整性保護(hù)、機(jī)密遞送的安全消息發(fā)送架構(gòu)。分層堆棧模型提供了以下優(yōu)點(diǎn),諸如 (1)應(yīng)用層邏輯的設(shè)計(jì)者不必花費(fèi)精力來開發(fā)用于連接端點(diǎn)的基礎(chǔ)安全通信機(jī)制。信任的消息發(fā)送基礎(chǔ)結(jié)構(gòu)是共用的設(shè)計(jì)模式,其一旦被設(shè)計(jì)就可以部署在許多不同的情形下,而不管它們所支持的應(yīng)用層邏輯如何。
(2)消息發(fā)送架構(gòu)本身可以保持不知道它正傳達(dá)消息的精確語義,并且把它的精力集中在防止與通信相關(guān)的攻擊和對(duì)消息發(fā)送端點(diǎn)可靠性的攻擊。
在一個(gè)實(shí)施例中,安全堆棧由幾個(gè)不同的處理層組成,如下所述。在一個(gè)實(shí)施例中,在‘551申請(qǐng)中所描述的服務(wù)組織系統(tǒng)和方法可以用來提供安全堆棧的一些或全部操作。
認(rèn)證 在一個(gè)實(shí)施例中,可以認(rèn)證消息發(fā)送端點(diǎn)。認(rèn)證是給定端點(diǎn)用來向另一個(gè)端點(diǎn)證明由為此目的所信任的權(quán)威機(jī)構(gòu)已經(jīng)向該端點(diǎn)給予有效名稱的過程。命名權(quán)威機(jī)構(gòu)應(yīng)當(dāng)被事務(wù)中的依賴端點(diǎn)所信任;一般由用于部署信任技術(shù)的組織來承擔(dān)建立這種權(quán)威機(jī)構(gòu)。
用于表明有效名占有情況的通用機(jī)制使用公鑰密碼和數(shù)字簽名。使用此方法,向?qū)嶓w提供三個(gè)信息 (1)用于向?qū)嶓w提供標(biāo)識(shí)符的可區(qū)別名稱; (2)由公鑰和秘密私鑰組成的非對(duì)稱密鑰對(duì);和 (3)用于斷言私鑰的持有者具有給定的可識(shí)別名稱的數(shù)字簽名證書。
所述證書把可區(qū)別名稱和私鑰綁定在一起。使用私鑰來簽名信息的實(shí)體被信任為具有給定可區(qū)別名稱??梢灾皇褂霉€來驗(yàn)證簽名。例如,認(rèn)證可以是基于X.509v3標(biāo)準(zhǔn)的。
由于在一個(gè)實(shí)施例中,可以證明擁有所證實(shí)私鑰的實(shí)體被信任為具有在證書中所表明的可區(qū)別名稱,所以保護(hù)用于簽名信息的私鑰變?yōu)橹匾目紤]事項(xiàng)。實(shí)際上,使用私有簽名密鑰的能力定義了由可區(qū)別名稱所標(biāo)識(shí)的實(shí)體界限。在應(yīng)用層,發(fā)送方和接收方必須知道消息來源于信任的對(duì)方。因而在一個(gè)實(shí)施例中,重要的是應(yīng)用層邏輯本身是被認(rèn)證的實(shí)體的一部分。為此,在一個(gè)實(shí)施例中安全堆棧和依賴于它的應(yīng)用層優(yōu)選被封閉在信任界限內(nèi),以致在信任界限內(nèi)所包含的子系統(tǒng)被認(rèn)為共享對(duì)實(shí)體的私有消息簽名密鑰的訪問。
授權(quán) 上述認(rèn)證機(jī)制向分布式消息發(fā)送端點(diǎn)證明它們的通信方的身份是值得信任的。在許多應(yīng)用中,此信息太過粗略—做出關(guān)于某些事務(wù)的策略判定,可能需要關(guān)于端點(diǎn)能力和特性的更詳細(xì)的信息。例如在圖38的上下文情境中,內(nèi)容再現(xiàn)客戶端可能不僅需要知道它正與被認(rèn)證的端點(diǎn)通信,而且需要知道它是否與已經(jīng)被認(rèn)為有能力提供有效DRM許可對(duì)象的服務(wù)通信。
安全堆棧的實(shí)施例經(jīng)由授權(quán)機(jī)制提供了用于聲明、傳達(dá)和應(yīng)用策略的機(jī)制,所述策略是基于關(guān)于被認(rèn)證的實(shí)體的更細(xì)粒度的屬性的。使用此機(jī)制,已經(jīng)擁有認(rèn)證憑證的實(shí)體被分配有角色聲明,所述角色聲明用于使一組命名的能力與所述實(shí)體的可區(qū)別名稱相關(guān)聯(lián)。例如,可以為DRM客戶端和DRM許可服務(wù)器定義角色名稱。
命名的角色旨在傳達(dá)由實(shí)體所保持的特定能力。在實(shí)踐中,可以通過聲明在實(shí)體的可區(qū)別名稱和角色名稱之間的關(guān)聯(lián)來把角色附著到實(shí)體。就像用于使密鑰與可區(qū)別名稱相關(guān)聯(lián)的認(rèn)證證書一樣,在一個(gè)實(shí)施例中用于授權(quán)的角色聲明由可以不同于名稱發(fā)行者的信任角色權(quán)威機(jī)構(gòu)來簽名。在實(shí)體內(nèi),角色聲明連同認(rèn)證憑證一起被驗(yàn)證,作為用于準(zhǔn)許對(duì)消息發(fā)送端點(diǎn)的應(yīng)用層進(jìn)行訪問的條件。
實(shí)體可以保持所構(gòu)建的應(yīng)用要求的那么多的角色屬性。圖40中的例子示出了具有多種角色的實(shí)體用于表明作為DRM客戶端起作用的能力的一個(gè)角色和兩個(gè)服務(wù)角色。例如,一個(gè)實(shí)體同時(shí)可以是DRM客戶端、DRM對(duì)象供應(yīng)者和安全數(shù)據(jù)供應(yīng)者。在一個(gè)實(shí)施例中,SAML1.1用于關(guān)于實(shí)體屬性的聲明。
消息安全性 安全堆棧的底層是消息安全層,用于向消息提供完整性、機(jī)密性和新鮮(freshness)保護(hù),并且緩和對(duì)通信信道的攻擊的風(fēng)險(xiǎn),諸如重播攻擊。在消息安全層中 ●使用實(shí)體的私有消息簽名密鑰來簽名在應(yīng)用層處理之間的消息,提供了完整性保護(hù)以及對(duì)中間人攻擊的抵抗。
●使用由目的地實(shí)體所保持的公鑰來加密消息。這保證無意的接收者無法讀取在運(yùn)輸中攔截的消息。
●把特殊時(shí)間和時(shí)間戳添加到消息,提供了對(duì)重播攻擊的免疫性并且便于證明在消息發(fā)送端點(diǎn)之間的實(shí)況性。
●使用服務(wù)器時(shí)間戳來更新DRM引擎的信任時(shí)間 在一個(gè)說明性實(shí)施例中,提供了對(duì)AES對(duì)稱加密、RSA公鑰密碼、SHA-256簽名摘要和用于在消息中發(fā)信號(hào)表示其它算法的機(jī)制的支持。
15.引導(dǎo)協(xié)議 在一些實(shí)施例中,使用引導(dǎo)(bootsrap)協(xié)議來向諸如設(shè)備和軟件客戶端之類的實(shí)體遞送初始機(jī)密的配置數(shù)據(jù)。例如,當(dāng)實(shí)體想要加入更大網(wǎng)絡(luò)或系統(tǒng)并且使用密碼協(xié)議與其它實(shí)體通信時(shí),它可能需要利用包括一組(共享、秘密和公共)密鑰而被配置。當(dāng)利用個(gè)性化數(shù)據(jù)來預(yù)先配置實(shí)體是不可能的或不切實(shí)際的時(shí),它需要使用密碼協(xié)議來“引導(dǎo)”本身。
下述示例性協(xié)議使用共享秘密作為用于利用一組密鑰和其它配置數(shù)據(jù)來引導(dǎo)實(shí)體的基礎(chǔ)。在下面章節(jié)里,使用以下符號(hào) ■E(K,D)是利用密鑰K來加密某個(gè)數(shù)據(jù)D。
■D(K,D)是利用密鑰K來解密某個(gè)加密的數(shù)據(jù)D。
■S(K,D)是利用密鑰K來簽名某個(gè)數(shù)據(jù)D。這可以是公鑰簽名或MAC。
■H(D)是數(shù)據(jù)D的消息摘要。
■V(K,D)是利用密鑰K來驗(yàn)證某個(gè)數(shù)據(jù)D上的簽名。它可以是公鑰簽名或MAC的驗(yàn)證。
■CertChain(k)是與公鑰K相關(guān)聯(lián)的證書鏈。K值被包括在鏈中的第一證書中。
■CertVerify(RootCert,CertChain)是驗(yàn)證證書鏈CertChain(包括在鏈的第一證書中找到的公鑰)在根證書RootCert下是有效的 ■A|B|C|...是通過拼接單個(gè)字節(jié)序列A、B、C、...所獲得的字節(jié)序列 ■CN(A)是A的規(guī)范的字節(jié)序列 ■CN(A,B,C,...)是復(fù)合字段A,B,C...的規(guī)范字節(jié)序列 1.38.初始狀態(tài) 1.38.1.客戶端 在一個(gè)實(shí)施例中,客戶端具有以下引導(dǎo)令牌組(在制造時(shí)間預(yù)先加載和/或被加載到固件/軟件中) ■一個(gè)或多個(gè)只讀證書,其是引導(dǎo)過程的信任根BootRootCertificate ■一個(gè)或多個(gè)秘密引導(dǎo)認(rèn)證密鑰BAK(共享) ■可選的秘密引導(dǎo)種子產(chǎn)生密鑰(對(duì)每個(gè)客戶端來說是唯一的)BSGK。如果客戶端具有良好的隨機(jī)數(shù)據(jù)源,那么不需要此種子。
■一些信息ClientInformation,客戶端需要向引導(dǎo)服務(wù)給予該信息以便獲取其機(jī)密密鑰(例如,ClientInformation可以包括設(shè)備的序列號(hào)、制造商名稱等)。此信息由一列屬性組成。每個(gè)屬性是(名稱,值)對(duì)。
客戶端可以利用多個(gè)BootRootCertificate證書和BAK認(rèn)證密鑰來配置,以便能夠利用可以要求不同信任域的不同引導(dǎo)服務(wù)器參與引導(dǎo)協(xié)議。
1.38.2.服務(wù)器 在一個(gè)實(shí)施例中,服務(wù)器具有以下令牌 ■至少一個(gè)客戶端引導(dǎo)認(rèn)證密鑰BAK(共享秘密) ■用于簽名的公鑰/私鑰對(duì)(Es,Ds) ■證書鏈ServerCertificateChain=CertChain(Es),其在根證書之一(BootRootCertificate)下是有效的 ■用于加密的公鑰/私鑰對(duì)(Ee,De) 1.39.協(xié)議描述 下面在圖41中示出了并且描述了引導(dǎo)協(xié)議的說明性實(shí)施例。在該過程期間(例如當(dāng)驗(yàn)證簽名或證書鏈時(shí))的失敗會(huì)導(dǎo)致錯(cuò)誤并且停止協(xié)議進(jìn)展。
BootstrapRequestMessage(引導(dǎo)請(qǐng)求消息) 客戶端向服務(wù)器發(fā)送請(qǐng)求,用于表明它想要發(fā)起引導(dǎo)會(huì)話并且提供一些初始參數(shù)(例如,協(xié)議版本、簡(jiǎn)檔等),以及會(huì)話ID(用于防止重播攻擊)和它可以參與到其中的信任域列表。下表示出了BootStrapRequestMessage的說明性格式
協(xié)議和版本消息屬性指定了客戶端使用哪個(gè)協(xié)議規(guī)范,并且簡(jiǎn)檔字段標(biāo)識(shí)了一組預(yù)定義的密碼協(xié)議和用于交換消息和數(shù)據(jù)的編碼格式。
客戶端選擇SessionId(會(huì)話ID),所述SessionId應(yīng)當(dāng)對(duì)該客戶端來說是唯一的并且不被重新使用。例如,該客戶端的唯一ID和增加的計(jì)數(shù)器值可以被用為產(chǎn)生唯一會(huì)話ID的方式。
在一個(gè)實(shí)施例中,客戶端還發(fā)送它已經(jīng)被配置的所有信任域的列表。
在一個(gè)實(shí)施例中,服務(wù)器接收BootstrapRequestMessage并且執(zhí)行以下步驟 ■檢查它支持由客戶端所請(qǐng)求的指定協(xié)議、版本和簡(jiǎn)檔。
■產(chǎn)生特殊時(shí)間(Nonce)(有力的隨機(jī)數(shù))。
■選擇性地產(chǎn)生Cookie以便攜帶諸如時(shí)間戳、會(huì)話令牌之類的信息或遍及會(huì)話期間保持不變的任何其它服務(wù)器端信息。cookie值只對(duì)服務(wù)器有意義,并且被客戶端認(rèn)為是不透明的數(shù)據(jù)塊。
■從BootstrapRequestMessage提取SessionId值。
■產(chǎn)生質(zhì)詢(Challenge):Challenge=[Nonce,Ee,Cookie,SessionId]。
■計(jì)算S(Ds,Challenge)以便利用Ds來簽名所述質(zhì)詢。
■構(gòu)造ChallengeRequestMessage并且作為響應(yīng)把它發(fā)送回到客戶端。
ChallengeRequestMessage(質(zhì)詢請(qǐng)求消息) 下表示出了用于ChallengeRequestMessage的說明性格式
在一個(gè)實(shí)施例中,在接收ChallengeRequestMessage之后,客戶端執(zhí)行以下步驟 ■驗(yàn)證證書鏈ServerCertificateChain在根證書BootRootCertificate下有效CertVerif(BootRootCertificate,ServerCertificateChain)。
■從S erverCertificateChain提取公鑰Es。
■驗(yàn)證質(zhì)詢的簽名V(Es,Challenge)。
■當(dāng)發(fā)送了BootRequestMessage時(shí)檢查SessionId匹配為所述會(huì)話選擇的一個(gè)ID。
■構(gòu)造ChallengeRequestMessage并且把它發(fā)送到服務(wù)器。
ChallengeResponseMessage 為了產(chǎn)生ChallengeResponseMessage,客戶端執(zhí)行以下步驟 ■使用兩個(gè)以下方法之一來產(chǎn)生會(huì)話密鑰SK ○直接使用安全隨機(jī)密鑰發(fā)生器 ○間接地使用Nonce和BSGK計(jì)算HSK=H(BSGK|Nonce),并且設(shè)置SK=HSK的最初N個(gè)字節(jié) ■產(chǎn)生包含[Challenge,ClientInformation,SessionKey]的ChallengeRepsonse對(duì)象。這里,質(zhì)詢是來自先前接收的ChallengeRequestMessage的一個(gè),ServerEncryptionKey被省略了。
■計(jì)算S(BAK,ChallengeResponse)以便利用BAK來簽名響應(yīng)。
■利用SK加密所簽名的ChallengeReponse:E(SK,[ChallengeResponse,S(BAK,ChallengeResponse)] ■利用服務(wù)器的公鑰Ee來加密SessionKey 構(gòu)造ChallengeRequestMessage并且把它發(fā)送到服務(wù)器
服務(wù)器接收BootstrapChallengeResponse并且執(zhí)行以下步驟 ○使用其私鑰De來解密會(huì)話密鑰SK:D(De,SessionKey) ○利用來自先前步驟的會(huì)話密鑰SK解密ChallengeResponse:D(SK,Challenge) ○驗(yàn)證質(zhì)詢的簽名V(BAK,ChallengeResponse)。
○檢查會(huì)話密鑰SK匹配用于解密的密鑰 ○如果需要那么檢查Cookie和Nonce值(例如時(shí)間戳) ○當(dāng)發(fā)送了BootRequestMessage時(shí)檢查SessionId匹配為所述會(huì)話選擇的一個(gè)ID。
○構(gòu)造BootstrapResponseMessage并且把它發(fā)送到服務(wù)器。
BootstrapResponseMessage 為了產(chǎn)生BootstrapResponseMessage,服務(wù)器執(zhí)行以下步驟 ○解析在ChallengeResponseMessage中所接收的ClientInformation并且查找或產(chǎn)生客戶端配置數(shù)據(jù),其中為了此引導(dǎo)請(qǐng)求需要發(fā)送所述客戶端配置數(shù)據(jù)(對(duì)于表示客戶端的節(jié)點(diǎn),這可以包括機(jī)密密鑰(Ec/Dc))。服務(wù)器一般使用Nonce和Cookie值來幫助獲取客戶端的正確信息。
○利用SessionId和配置數(shù)據(jù)來創(chuàng)建BootstrapResponse ○計(jì)算S(Ds,BootstrapResponse)以便利用Ds來簽名數(shù)據(jù) ○利用會(huì)話密鑰SK加密所簽名的BootstrapResponse:E(SK,[BootstrapResponse,S(Ds,BootstrapResponse)]
1.40.信任域 在一個(gè)實(shí)施例中,每個(gè)信任域包括根證書權(quán)威機(jī)構(gòu)和對(duì)該域來說唯一的名稱。當(dāng)客戶端發(fā)送BootstrapRequest時(shí),它標(biāo)識(shí)它愿意接受的所有信任域(即,哪些證書它認(rèn)為是有效的)。服務(wù)器從由客戶端所發(fā)送的列表中選擇信任域,如果它支持的話。
1.41.簽名 在一個(gè)實(shí)施例中,每當(dāng)在消息有效載荷中使用簽名時(shí),對(duì)在消息的簽名部分中所包含的數(shù)據(jù)字段的規(guī)范字節(jié)序列計(jì)算簽名。根據(jù)字段值而不是根據(jù)字段值的編碼來計(jì)算規(guī)范的字節(jié)序列。每個(gè)簡(jiǎn)檔優(yōu)選定義了用于為每種消息類型計(jì)算字段的規(guī)范字節(jié)序列的算法。
1.42.簡(jiǎn)檔 引導(dǎo)協(xié)議的簡(jiǎn)檔是對(duì)各個(gè)密碼和串行格式的一組選擇。每個(gè)簡(jiǎn)檔優(yōu)選具有唯一的名稱,并且包括選擇 ●公鑰加密算法 ●公鑰簽名算法 ●密秘密鑰加密算法 ●秘密密鑰簽名算法 ●公鑰編碼 ●摘要算法 ●規(guī)范的對(duì)象串行化 ●證書格式 ●最小特殊時(shí)間大小 ●消息編組 附錄A 下面是具有多個(gè)聯(lián)鎖簽名的控制器對(duì)象的例子。
注意在此例子中,內(nèi)容密鑰未被加密。
<Controller xmlns="http://www.intertrust.com/Octopus/1.0" id="urn:x-octopus.intertrust.com:controller:37A50262EE3389A14ABC0BC7BE5D43E5"> <ControlReference><Id>urn:x-octopus.intertrust.com:control:0001</Id> <Digest><DigestMethod xmlns="http://www.w3.org/2000/09/xmldsig#" Algorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/><DigestValue xmlns="http://www.w3.org/2000/09/xmldsig#">1z95n10V7CBiKs/rSQdXvKyZmfA=</DigestValue></Digest></ControlReference> <ControlledTargets> <ContentKeyReference><Id>urn:x-octopus.intertrust.com:content-key:2001</Id></ContentKeyReference> <ContentKeyReference><Id>urn:x-octopus.intertrust.com:content-key:2002</Id></ContentKeyReference> <ContentKeyReference><Id>urn:x-octopus.intertrust.com:content-key:2003</Id></ContentKeyReference></ControlledTargets></Controller> <Signature Id="Signature.0"xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <Reference URI="urn:x-octopus.intertrust.com:controller:37A50262EE3389A14ABC0BC7BE5D43E5"> <Transtorms><Transform Algorithm="http://www.intertrust.com/Octopus/xmldsig#cbs-1_0"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>G1zXF9Sz/zCwH6MaFm0ObOQcxuk=</DigestValue></Reference></SignedInfo><SignatureValue>mjoyW+w2S9iZDG/ha4eWYD1RmhQuqRuuSN977NODpzwUD02FdsAICVjAcw7f4n FWuvtawW/c1FzYP/pjFebESCvurHUsEaR1/LYLDkpWWxh/L1Ep4r3yR9kUs0AU5a4BDxDxQE7nUdqU9 YMpnjAZEGpuxdPeZJM1vyKqNDpTk94=</SignatureValue> <KeyInfo> <X509Data><X509Certificate>MIIC6jCCA1OgAwIBAgIBBjANBgkqhkiG9w0BAQUFADCBszELMAkGA1UEBhM CVVMxEzARBgNVBAgTCkNhbG1mb3JuaWExFDASBgNVBAcTC1NhbnRhIENsYXJhMSAwHgYDVQ QKExdJbnR1cnRydXN0IFR1Y2hub2xvZ2llczEUMBIGA1UECxMLT2N0b3B1cyBEUk0xGDAWBgNVBA MTD09jdG9wdXMgVGVzdCBDQTEnMCUGCSqGSIb3DQEJARYYb2N0b3B1cy10ZXN0LWNhQDhwdX MubmV0MB4XDTA0MDQwODAwNTUyOVoXDTA0MDUwODAwNTUyOVowgcExCzAJBgNVBAYTA 1VTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRQwEgYDVQQHEwtTYW50YSBDbGFyYTEgMB4GA1 UEChMXSW50ZXJ0cnVzdCBUZWNobm9sb2dpZXMxFDASBgNVBAsTC09jdG9wdXMgRFJNMR8wHQ YDVQQDExZPY3RvcHVzIFR1c3QgTm9kZSAwMDAxMS4wLAYJKoZIhvcNAQkBFh9vY3RvcHVzLXR1 c3Qtbm9kZS0wMDAxQDhwdXMubmV0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU8AJ QArJg+VTuwUO2fMv5sCtfmZECyJjA0vbgQc+cPXpfeIdACiCL1nleml/ZLlu7ZaRwQeolyJSeK57bxv+zh W14F1jnqS/IKLG84RGleoMiOT1lhErb2nU3xT0KCgxsEXFAbfwAYnLX7hpy/lho2mTmJbgksWoPrPw3x MPCYwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAHlrHStXcQkFmcYh15zck6twsNIRF+/1HZGuTGK eb6+J2ZLk6sNUWXLO1DloPRMde7X1RiqpDNkbG4xoPoxHiK9VdfBstjv9Q8iUceziMIXVV/q+XJMd7Hf BJq25XqBScS9/RAKKKwuRRkQHEV3uBABvLSCzIRSJH9bFuYzNeVne</X509Certificate></X509Data></KeyInfo></Signature> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha 1"/> <Reference URI="#Signature.0"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/><DigestValue>AqPV0nvNj/vc51IcMyKJngGNKtM=</DigestValue></Reference> <Reference URI="urn:x-octopus.intertrust.com:controller:37A50262EE3389A14ABC0BC7BE5D43E5"> <Transforms><Transform Algorithm="http://www.intertrust.com/Octopus/xmldsig#cbs-1_0"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/><DigestValue>G1zXF9Sz/zCwH6MaFm0ObOQcxuk=</DigestValue></Reference></SignedInfo><SignatureValue>TcKBsZZy+Yp3doOkZ62LTfY+ntQ=</SignatureValue> <KeyInfo><KeyName>urn:x-octopus.intertrust.com:secret-key:2001</KeyName></KeyInfo></Signature> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha 1"/> <Reference URI="#0"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/><DigestValue>AqPV0nvNj/vc51IcMyKJngGNKtM=</DigestValue></Reference> <Reference URI="urn:x-octopus.intertrust.com:controller:37A50262EE3389A14ABC0BC7BE5D43E5"> <Transforms><Transform Algorithm="http://www.intertrust.com/Octopus/xmldsig#cbs-1_0"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/><DigestValue>G1zXF9Sz/zCwH6MaFm0ObOQcxuk=</DigestValue></Reterence></SignedInfo><SignatureValue>qAunQpXC18kl8Veo8UHbcXTqHCA=</SignatureValue> <KeyInfo><KeyName>urn:x-octopus.intertrust.com:secret-key:2002</KeyName></KeyInfo></Signature> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha 1"/> <Reference URI="#0"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/><DigestValue>AqPV0nvNj/vc51IcMyKJngGNKtM=</DigestValue></Reference> <Reference URI="urn:x-octopus.intertrust.com:controller:37A50262EE3389A14ABC0BC7BE5D43E5"> <Transforms><Transform Algorithm="http://www.intertrust.com/Octopus/xmldsig#cbs-1_0"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha 1"/><DigestValue>G1zXF9Sz/zCwH6MaFm0ObOQcxuk=</DigestValue></Reference></SignedInfo><SignatureValue>bRxLSM82d4ktWsYz6uhBxzJfsOo=</SignatureValue> <KeyInfo><KeyName>urn:x-octopus.intertrust.com:secret-key:2003</KeyName></KeyInfo></Signature></Bundle> 附錄B 此附錄B給出了在使用在此的其它地方所描述的示例性章魚DRM引擎的系統(tǒng)的一個(gè)實(shí)施例中對(duì)象的XML編碼。對(duì)于特定應(yīng)用來說,可以通過導(dǎo)入下面示出的XML模式(“章魚XML模式”)并且添加應(yīng)用專用的元項(xiàng)(例如,用于撤銷的擴(kuò)展)來創(chuàng)建應(yīng)用專用的XML模式。在一個(gè)實(shí)施例中,用XML編碼對(duì)象需要能夠相對(duì)于應(yīng)用專用的XML模式來證實(shí)。下面可以找到對(duì)這些XML編碼的附加可能的約束。
在此附錄B所舉例說明的例子中,用于所有DRM對(duì)象的基礎(chǔ)XML模式類型為OctopusObjectType。這意味著所有對(duì)象支持屬性和擴(kuò)展。從此基礎(chǔ)類型來導(dǎo)出每個(gè)章魚對(duì)象元項(xiàng)的類型。這些類型可以集合諸如ContentKeyType(內(nèi)容密鑰類型)的SecretKey(秘密密鑰)元項(xiàng)之類的其它元項(xiàng)。
在此示例性實(shí)施例中,按照擴(kuò)展來描述Scuba密鑰分發(fā)系統(tǒng)密鑰于是ScubaKeys元項(xiàng)是擴(kuò)展元項(xiàng)的孩子。同樣適用于具有Torpedo(魚雷)擴(kuò)展的撤銷密鑰。
如在此的其它地方所描述,存在各種章魚對(duì)象(例如,內(nèi)容密鑰、保護(hù)器、控制器、控制、節(jié)點(diǎn)和鏈路)??梢允褂?lt;Bundle>元項(xiàng)把這些對(duì)象連同擴(kuò)展一起捆綁。在一個(gè)實(shí)施例中,如果在<Bundle>內(nèi)簽名對(duì)象或擴(kuò)展,那么<Bundle>包含如在此的其它地方所描述的<Signature>元項(xiàng)。
章魚XML模式(Octopus.xsd)
說明性的應(yīng)用專用模式
B.1.附加約束 B.1.1.節(jié)點(diǎn) 在一個(gè)實(shí)施例中,定義以下類型的節(jié)點(diǎn) ·章魚個(gè)性節(jié)點(diǎn),它們是給定DRM引擎的根節(jié)點(diǎn)(例如,設(shè)備節(jié)點(diǎn)或PC軟件節(jié)點(diǎn))。
·其它類型的節(jié)點(diǎn),諸如用戶節(jié)點(diǎn)或用戶組的節(jié)點(diǎn),諸如預(yù)訂節(jié)點(diǎn)或成員資格節(jié)點(diǎn)。
在一個(gè)實(shí)施例中,節(jié)點(diǎn)包含密鑰(例如,在諸如ScubaKeys之類的擴(kuò)展中)并且必須能夠分離所述節(jié)點(diǎn)的公共信息(例如,id、屬性和公鑰)及其私有擴(kuò)展(例如其攜帶有秘密密鑰和私鑰)。此外,每個(gè)部分(公共和私有)存在一個(gè)簽名,使得具有其簽名的公共節(jié)點(diǎn)可以被原樣導(dǎo)出(例如作為對(duì)許可服務(wù)的請(qǐng)求的參數(shù))。
在一個(gè)實(shí)施例中,在ExternalExtension中攜帶私有擴(kuò)展并進(jìn)行簽名。公共節(jié)點(diǎn)及其私有擴(kuò)展可以被封裝在相同的<bundle>元項(xiàng)中或者可以獨(dú)立地到達(dá)。下面在附錄B的附件A中給出了所簽名的章魚個(gè)性節(jié)點(diǎn)的例子。
B.1.1.1屬性 在一個(gè)實(shí)施例中,節(jié)點(diǎn)對(duì)象的每個(gè)XML編碼攜帶具有以下<Attribute>的<AttributeList> 對(duì)于章魚個(gè)性來說 <AttributeList xmlns="http://intertrust.com/Octopus/1.0"> <Attribute name="urn:x-marlin.intertrust.com:type">...</Attribute> <Attribute name="urn:x-marlin.intertrust.com:dnk_id">...</Attribute> <Attribute name="urn:x-marlin.intertrust.com:manufacturer">...</Attribute> <Attribute name="urn:x-marlin.intertrust.com:model">...</Attribute> <Attribute name="urn:x-marlin.intertrust.com:version">...</Attribute> </AttributeList> 對(duì)于其它類型的節(jié)點(diǎn)來說 <AttributeList xmlns="http://intertrust.com/Octopus/1.0"> <Attribute name="urn:x-marlin.intertrust.com:type">...</Attribute> </AttributeList> B.1.1.2擴(kuò)展 如附錄B的附件A所示,在一個(gè)實(shí)施例中,章魚個(gè)性節(jié)點(diǎn)攜帶用于ScubaKeys(共享和機(jī)密密鑰)和Torpedo(廣播秘密密鑰)的擴(kuò)展。其它類型的節(jié)點(diǎn)只攜帶Scuba共享密鑰。
所有公鑰被攜帶在<ExtensionList>的<Extension>元項(xiàng)中的<Node>元項(xiàng)內(nèi)。其它密鑰被攜帶在<Node>元項(xiàng)之外的獨(dú)立<Extension>元項(xiàng)中。
在一個(gè)實(shí)施例中,在<Node>中簽名<ScubaKeys>擴(kuò)展。在此實(shí)施例中,在<Node>內(nèi)攜帶<ScubaKeys>的內(nèi)部<Extension>(公鑰)需要包括<ds:DigestMethod>元項(xiàng)以及<ds:DigestValue>元項(xiàng)。在外部<Extension>中攜帶的私鑰需要被簽名并且這通過簽名整個(gè)擴(kuò)展來進(jìn)行。同樣,<Torpedo>擴(kuò)展也被簽名。
B.1.2鏈路 在一個(gè)實(shí)施例中,<Link>元項(xiàng)的<LinkTo>和<LinkFrom>元項(xiàng)只包含<Id>元項(xiàng)并且不包含<Digest>元項(xiàng)。<Control>元項(xiàng)是可選的。附錄B的附件C包含所簽名的鏈路對(duì)象的例子。
B.1.1.1屬性 在一個(gè)實(shí)施例中,鏈路沒有強(qiáng)制屬性。這意味著<AttributeList>不被要求并且將被適應(yīng)的實(shí)現(xiàn)方式忽略。
B.1.1.2擴(kuò)展 在此附錄B所示出的示例性實(shí)施例中,鏈路具有在<Link>內(nèi)所攜帶的<ScubaKeys>內(nèi)部擴(kuò)展,從而<ExtensionList>元項(xiàng)是強(qiáng)制性的。另外,鏈路中的<ScubaKeys>擴(kuò)展未被簽名,從而在<Extension>元項(xiàng)內(nèi)沒有攜帶<ds:DigestMethod>和<ds:DigestValue>元項(xiàng)。此<ScubaKeys>擴(kuò)展包含利用“來自節(jié)點(diǎn)”的公共或秘密Scuba共享密鑰加密的“去往節(jié)點(diǎn)”的公共/秘密Scuba共享密鑰(在<PrivateKey>和<SecretKey>元項(xiàng)中)的版本。使用XML加密語法來發(fā)信號(hào)表示此加密。在此附錄B所圖示的實(shí)施例中,<KeyData>元項(xiàng)、<PrivateKey>和<SecretKey>元項(xiàng)的孩子的“編碼”屬性被設(shè)置為“xmlenc”。此<KeyData>元項(xiàng)的孩子是<xenc:EncryptedData>元項(xiàng)。在<KeyInfo>/<KeyName>元項(xiàng)中通告加密密鑰的名稱。
在一個(gè)實(shí)施例中,如果加密密鑰是公鑰,那么 ■<KeyName>元項(xiàng)是密鑰所屬對(duì)的名稱。
■如果加密數(shù)據(jù)(例如,私鑰)太大而不能直接利用公鑰加密,那么產(chǎn)生中間的128位秘密密鑰。然后例如使用aes-128-cbc利用此中間密鑰來加密數(shù)據(jù),并且(使用<EncryptedKey>元項(xiàng))利用公鑰來加密中間密鑰。
于是XML組塊看起來好像
B.1.3許可對(duì)象 此附錄B的附件C提供了所簽名許可的例子(在已經(jīng)出現(xiàn)第一撤銷之前,下面參見內(nèi)容密鑰節(jié))。
B.1.3.1保護(hù)器 在此附錄B所示出的示例性實(shí)施例中,<ContentKeyReference>元項(xiàng)和<ContentReference>元項(xiàng)(例如在<ProtectedTargets>元項(xiàng)內(nèi))只包含<Id>元項(xiàng)并且不包含<Digest>元項(xiàng)。在此說明性實(shí)施例中,保護(hù)器對(duì)象不包含強(qiáng)制的屬性或擴(kuò)展;<AttributeList>和<ExtensionList>元項(xiàng)是可選的并且被忽略。
B.1.3.2內(nèi)容密鑰 在此附錄B所示出的示例性實(shí)施例中,內(nèi)容密鑰對(duì)象包含非強(qiáng)制的屬性或擴(kuò)展。因此,<AttributeList>和<ExtensionList>元項(xiàng)是可選的并且將被忽略。
在一個(gè)實(shí)施例中,<ContentKey>元項(xiàng)包含<SecretKey>元項(xiàng),用于表示用來解密內(nèi)容的實(shí)際密鑰。加密與<SecretKey>相關(guān)聯(lián)的<KeyData>。在一個(gè)實(shí)施例中,<KeyData>的“編碼”屬性被設(shè)置為 “xmlenc”是強(qiáng)制性的。
在一個(gè)實(shí)施例中,內(nèi)容密鑰對(duì)象存在兩種不同的情況(1)在設(shè)備或PC應(yīng)用的首次撤銷之前在這種情況下,由<SecretKey>元項(xiàng)所表示的內(nèi)容密鑰Kc只被實(shí)體的Scuba密鑰(公共的或秘密的)加密,其中把內(nèi)容綁定到所述實(shí)體(例如用戶)。(2)在首次撤銷之后,其中依照Mangrove廣播加密方案來加密內(nèi)容密鑰。然后利用內(nèi)容被綁定到的實(shí)體的Scuba密鑰(公共的或秘密的)加密。在這種情況下,我們具有超級(jí)加密。
在此的其它地方描述了用于在超級(jí)加密的情況下加密<EncryptedData>元項(xiàng)的說明性方法。下面解釋了怎樣將其應(yīng)用于情況b。
在一個(gè)實(shí)施例中,用于利用Mangrove廣播加密方案來加密內(nèi)容密鑰Kc的xmlenc語法是
■(*)是用于標(biāo)識(shí)Mangrove廣播加密方案的URL,在一個(gè)實(shí)施例中所述Mangrove廣播加密方案還是在應(yīng)用專用的xml模式調(diào)用“kformat.xsd”中<Torpedo>擴(kuò)展的<BroadcastKeyMethod>算法。
■(**)是Mangrove密鑰樹的名稱。在一個(gè)實(shí)施例中,此值必須與在kformat.xsd中所定義的<BroadcastKey>元項(xiàng)的源屬性相同。
■(***)是用于表示依照Mangrove廣播密鑰算法加密內(nèi)容密鑰Kc的ASN.1序列的base64編碼值
在一個(gè)實(shí)施例中,利用許可被綁定到的實(shí)體的scuba共享密鑰(公共的或秘密的)來加密上面所提及的<EncryptedData>的字節(jié)序列。如果使用公鑰,如果<EncryptedData>的字節(jié)序列對(duì)于RSA1024公鑰來說太大,那么與如在下面所描述應(yīng)用相同的約定(例如,參見利用公鑰加密)并且需要中間密鑰??梢栽诖烁戒汢的附件D中找到這種內(nèi)容密鑰對(duì)象的XML編碼的例子。
B.1.3.3控制器 在一個(gè)實(shí)施例中,控制器對(duì)象包含非強(qiáng)制的屬性或擴(kuò)展。因此,<AttributeList>和<ExtensionList>元項(xiàng)是可選的并且將被適應(yīng)的實(shí)現(xiàn)方式忽略。
在一個(gè)實(shí)施例中,<DigestMethod>元項(xiàng)的算法屬性值始終為httD://www.w3.org/2000/09/xmldsig#sha 1。
在一個(gè)實(shí)施例中,<ControlReference>必須具有<Digest>元項(xiàng)。<DigestValue>元項(xiàng)必須包含引用控制的摘要的base64編碼。
在一個(gè)實(shí)施例中,如果控制器上的簽名是PKI簽名(rsa-shal),那么(<ControlledTargets>元項(xiàng)內(nèi)的)<ContentKeyRefence>元項(xiàng)需要包括<Digest>元項(xiàng)并且<DigestValue>元項(xiàng)必須包含被嵌入到內(nèi)容密鑰對(duì)象中的明文內(nèi)容密鑰的摘要。
B.1.3.4控制 在一個(gè)實(shí)施例中,控制對(duì)象包含非強(qiáng)制的屬性或擴(kuò)展。因此,<AttributeList>和<ExtensionList>元項(xiàng)是可選的并且將被適應(yīng)的實(shí)現(xiàn)方式忽略。
在一個(gè)實(shí)施例中,<ControlProgram>元項(xiàng)的類型屬性被設(shè)置為“plankton”,并且<CodeModule>元項(xiàng)的byteCodeType屬性被設(shè)置為“Plankton-1-0”。
附錄B——附件A所簽名章魚個(gè)性節(jié)點(diǎn)的例子
附錄B——附件B所簽名章魚鏈路的例子
附錄B——附件C所簽名章魚許可的例子(在沒有撤銷的情況下)
附錄B——附件D在撤銷情況下內(nèi)容密鑰的例子
15.附錄C 此附錄C示出了供上述引導(dǎo)協(xié)議使用的簡(jiǎn)單簡(jiǎn)檔的例子。還提供了簡(jiǎn)單的規(guī)范串行、示例性XML編組以及用于章魚引導(dǎo)SOAP網(wǎng)絡(luò)服務(wù)的示例性WSDL。
簡(jiǎn)單簡(jiǎn)檔 在一個(gè)實(shí)施例中,使用由以下內(nèi)容組成的簡(jiǎn)單簡(jiǎn)檔 簡(jiǎn)單的規(guī)范串行1.0 在一個(gè)實(shí)施例中,在上述簡(jiǎn)單簡(jiǎn)檔中使用的簡(jiǎn)單的規(guī)范字節(jié)序列包括從消息中對(duì)象的字段值來構(gòu)造字節(jié)序列。每個(gè)消息和每個(gè)對(duì)象由一個(gè)或多個(gè)字段組成。每個(gè)字段是簡(jiǎn)單字段或復(fù)合字段。
簡(jiǎn)單字段可以是以下四種類型之一整數(shù)、字符串、字節(jié)序列或字段數(shù)組。復(fù)合字段由一個(gè)或多個(gè)子字段組成,每個(gè)子字段是簡(jiǎn)單的或復(fù)合的。
在一個(gè)實(shí)施例中,用于構(gòu)造每個(gè)字段類型的規(guī)范字節(jié)序列的規(guī)則如下 復(fù)合字段 規(guī)范的字節(jié)序列是每個(gè)子字段的規(guī)范字節(jié)序列的拼接(可選字段不被跳過,但是依照可選字段的規(guī)則來串行化)。
字段數(shù)組 被依照大端次序編碼為4字節(jié)序列的字段計(jì)數(shù),后面是每個(gè)字段的規(guī)范字節(jié)序列。如果字段計(jì)數(shù)為0,那么在4字節(jié)字段計(jì)數(shù)后面什么都沒有(在這種情況下,所有4個(gè)字節(jié)都具有值0)。
整數(shù) 32比特帶符號(hào)的值,依照大端次序被編碼為4字節(jié)的序列。
字符串 字符串由UTF-8編碼的8比特字節(jié)序列來表示。所編碼的字節(jié)序列的字節(jié)計(jì)數(shù)被依照大端次序編碼為4字節(jié)序列。字節(jié)計(jì)數(shù)后面是UTF-8編碼的字符串的字節(jié)序列。
字節(jié)序列 字節(jié)計(jì)數(shù)被依照大端次序編碼為4字節(jié)序列(如果字節(jié)序列為空,或者已經(jīng)省略相應(yīng)的字段,那么字節(jié)計(jì)數(shù)為0,并且在4字節(jié)的字節(jié)計(jì)數(shù)之后沒有字節(jié)值)。每個(gè)字節(jié)被按原樣編碼。
簡(jiǎn)單的XML編組1.0 模式SimpleBootProtocol.xsd <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"elementFormDefault="qualified"> <xs:element name="BootstrapRequestMessage"> <xs:complexType><xs:sequence> <xs:element ref="BootstrapRequest"/></xs:sequence><xs:attribute name="Protocol"type="xs:string"use="required"/><xs:attribute name="Profile"type="xs:string"use="required"/><xs:attribute name="Version"type="xs:decimal"use="required"/> </xs:complexType> </xs:element> <xs:element name="BootstrapRequest"> <xs:complexType> <xs:sequence><xs:element ref="SessionId"/><xs:elementref="TrustDomain"maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="ChallengeRequestMessage"> <xs:complexType> <xs:sequence><xs:elementref="ChallengeRequest"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="ChallengeRequest"> <xs:complexType> <xs:sequence><xs:element ref="Challenge"/><xs:element ref="Signature"/><xs:element ref="CertificateChain"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="ChallengeResponseMessage"> <xs:complexType> <xs:sequence><xs:element ref="SessionKey"/><xs:element ref="EncryptedChallengeResponse"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="EncryptedChallengeResponse"type="xs:base64Binary"/> <xs:element name="ChallengeResponse"> <xs:complexType> <xs:sequence><xs:element ref="ClientInfo"/><xs:element ref="Challenge"/><xs:element ref="SessionKey"/><xs:element ref="Signature"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Challenge"> <xs:complexType> <xs:sequence><xs:elementref="Cookie"/><xs:element ref="Nonce"/><xs:element ref="SessionId"/><xs:elementref="EncryptionKey"minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="BootstrapResponseMessage"> <xs:complexType> <xs:sequence><xs:element ref="EncryptedBootstrapResponse"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="EncryptedBootstrapResponse"type="xs:base64Binary"/> <xs:element name="BootstrapResponse"> <xs:complexType> <xs:sequence><xs:element ref="SessionId"/><xs:element ref="Data"/><xs:element ref="Signature"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="ErrorResponseMessage"> <xs:complexType> <xs:sequence><xs:element ref="ErrorResponse"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="ErrorResponse"type="xs:string"/> <xs:element name="CertificateChain"> <xs:complexType> <xs:sequence><xs:element ref="Certificate"maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="TrustDomain"type="xs:string"use="required"/> </xs:complexType> </xs:element> <xs:element name="Certificate"type="xs:base64Binary"/> <xs:element name="ClientInfo"> <xs:complexType> <xs:sequence><xs:element ref="Attribute"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Attribute"type="xs:string"/> <xs:element name="Cookie"type="xs:base64Binary"/> <xs:element name="Data"type="xs:base64Binary"/> <xs:element name="EncryptionKey"type="xs:base64Binary"/> <xs:element name="Nonce"type="xs:base64Binary"/> <xs:element name="SessionId"type="xs:string"/> <xs:element name="SessionKey"type="xs:base64Binary"/> <xs:element name="Signature"type="xs:base64Binary"/> <xs:element name="TrustDomain"type="xs:string"/> </xs:schema> 例子 <BootstrapRequestMessage Protocol="OctopusSimpleBoot"Profile="SimpleProfile"Version="1.0"> <BootstrapRequest> <SessionId>some-unique-session-id-0008</SessionId> <TrustDomain>urn:x-octopus.intertrust.com:scuba:boot:trust-domain:test001</TrustDomain> </BootstrapRequest> </BootstrapRequestMessage> <ChallengeRequestMessage> <ChallengeRequest> <Challenge> <Cookie>c29tZS11bmlxdWUtc2Vzc21vbi1pZC0wMDA4</Cookie> <Nonce>Mv5VIv73cxo5b+gisQJP8Q==</Nonce> <SessionId>some-unique-session-id-0008</SessionId> <EncryptionKey> MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpMY4wvgTJvVPTufNVbdIfTUwOi4FZPtzi3ez etY9gx51O6dfRn+LKPq1nJsSXCR5ZIvRUyoNZC0Qc3SLobUhXD6uTsrV5xtRKOSxZTLt5DZ15AtddSrA AfF9baDGMi5KQP9w7qB2Ci/MmYha4Jix1iUltv0zWIKmSpytgHC8i/QIDAQAB </EncryptionKey> </Challenge> <Signature> GsWP3yPT36r3e1jZfulUS7xp5w2ei7iTsAJ/YD13fX+pSJrpeKAtq2BTzHQ1AclOorPJwzWHDanc cui9/rinlg3Drw52bQXLzhZbZLXadIGFP3YP1gTKPuazUCYCLAjYTJbdulW1nTKDtmf34/66H0sz DCCyxQsdFZhSNk6pyQE= </Signature> <CertificateChain TrustDomain="urn:x-octopus.intertrust.com:scuba:boot:trust-domain:test001"><Certificate> MIID...<!—終端實(shí)體證書--></Certificate> MIID...<!—中間人證書--><Certificate> MIIE...<!--中間人證書--> </Certificate> <Certificate> MIID...<!—字節(jié)鏈到信任錨的證書--> </Certificate></CertificateChain> </ChallengeRequest> </ChallengeRequestMessage> <ChallengeResponseMessage> <SessionKey> PtzJcFT2s1sW7oRZ1a+HASdRmZer4pk4QArFZWY1kUWZcIZTN2g2YeCQwORq2J9QXOksU6utKmOmg fEHY151UdcMFake3CwquvVN6w/7mFH0qtDoc+GhuKe9eQXN2RHa3SlhfR5ShF2A/cwZHd4Nknt4w8M WMDDn3SUDd6aS/ZI=</SessionKey><EncryptedChallengeResponse> mQCkPL560D00o...</EncryptedChallengeResponse> </ChallengeResponseMessage> <ChallengeResponse> <ClientInfo> <Attribute Name="SomeAttribute">Bla Bla</Attribute> </ClientInfo> <Challenge> <Cookie>c29tZS11bmlxdWUtc2Vzc21vbilpZC0wMDA4</Cookie> <Nonce>Mv5VIv73cxo5b+gisQJP8Q==</Nonce> <SessionId>some-unique-session-id-0008</SessionId> </Challenge> <SessionKey>bbBG8JsGaApFdNJq6hFrIQ==</SessionKey> <Signature>WYMULPpF41OJ6MiAxdllueN7p/4=</Signature> </ChallengeResponse> <BootstrapResponseMessage> <EncryptedBootstrapResponse> chXTp20+yI7/i1pHLawFOLXdGb... </EncryptedBootstrapResponse> </BootstrapResponseMessage> <BootstrapResponse> <SessionId>some-unique-session-id-0008</SessionId> <Data> PD94bWwgdmVyc... </Data> <Signature> XqCeVRb4YaYAK9Ilj60B5R1hQ03tFpHPw3wMMATbeUfqCpEXfAB7u2/qnjs9jLgWTOOvLDE5C5aVV Mvz1nRnDv0GHL1s6g43HusVx7fpazwHoFrb3M3eKwXMoYsI6xpdYy2BX1bs5QT2xdwBv2C1Bjo7 KzQfmb/3bYEO+xGdg48= </Signature> </BootstrapResponse> <ErrorResponseMessage> <ErrorResponse Code="6">Some Error Info</ErrorResponse> </ErrorResponseMessage> 用于引導(dǎo)SOAP網(wǎng)絡(luò)服務(wù)的WSDL <?xml version="1.0"encoding="UTF-8"?> <!--此wsdl文件描述無狀態(tài)多回合的引導(dǎo)協(xié)議的接口 該協(xié)議這樣工作 1.C->S:BootstrapRequestMessage 2.S->C:ChallengeRequestMessage 3.C->S:ChallengeResponseMessage 4.S->C:BootstrapResponseMessage --> <wsd1:definitions name="OctopusBootstrap" targetNamespace="http://www.intertrust.com/services/OctopusBootstrap" xmlns="http://schemas.xmlsoap.org/wsdl/"xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://www.intertrust.com/services/OctopusBootstrap" xmlns:intf="http://www.intertrust.com/services/OctopusBootstrap" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tnstype="http://www.intertrust.com/services/OctopusBootstrap" xmlns:wsd1="http://schemas.xmlsoap.org/wsd1/"xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsd1/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ob="http://www.intertrust.com/Octopus/Bootstrap/1.0" xmlns:nc="http://www.intertrust.com/core"> <wsd1:types> <schema targetNamespace="http://www.intertrust.com/services/OctopusBootstrap" xmlns="http://www.w3.org/2001/XMLSchema"> <!—導(dǎo)入--> <irmport namespace="http://www.intertrust.com/Octopus/Bootstrap/1.0" schemaLocation="./SimpleBootProtocol.xsd"/> <!—元項(xiàng)--> <element name="requestdata"> <complexType><!—這是多回合無狀態(tài)協(xié)議(歸因于點(diǎn)心文件) 客戶端能夠發(fā)送BootstrapRequestMessage或者 ChallengeReponseMessage--><choice> <element ref="ob:BootstrapRequestMessage"/> <element ref="ob:ChallengeResponseMessage"/> </choice> </complexType> </element> <element name="responsedata"> <complexType><!--這是多回合無狀態(tài)協(xié)議(歸因于點(diǎn)心文件) the server can send back a ChallengeRequestMessage or BootstrapResponseMessage or an ErrorResponseMessage--><choice> <element ref="ob:ChallengeRequestMessage"/> <element ref="ob:BootstrapResponseMessage"/> <element ref="ob:ErrorResponseMessage"/></choice> </complexType> </element> </schema> </wsdl:types> <!—消息聲明--> <wsdl:message name="invokeRequest"> <wsdl:partelement="tnstype:requestdata"name="invokeRequest"/> </wsdl:message> <wsdl:message name="invokeResponse"> <wsdl:partelement="tnstype:responsedata"name="invokeResponse"/> </wsdl:message> <!—端口類型聲明--> <wsdl:portType name="OctopusBootstrap"> <wsdl:operation name="invoke"> <wsdl:input message="impl:invokeRequest"name="invokeRequest"/> <wsdl:output message="impl:invokeResponse"name="invokeResponse"/> </wsdl:operation> </wsdl:portType> <!—綁定聲明--> <wsdl:binding name="OctopusBootstrapSoapBinding"type="impl:OctopusBootstrap"> <wsdlsoap:binding style="document"transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="invoke"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="invokeRequest"> <wsdlsoap:body encodingStyle="" namespace="http://www.intertrust.com/services/OctopusBootstrap"use="literal"/> </wsdl:input> <wsdl:output name="invokeResponse"> <wsdlsoap:body encodingStyle="" namespace="http://www.intertrust.com/services/OctopusBootstrap"use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <!—服務(wù)聲明--> <wsdl:service name="OctopusBootstrapService"> <wsdl:portbinding="impl:OctopusBootstrapSoapBinding"name="OctopusBootstrap"> <wsdlsoap:address location="http://localhost:8080/OctopusBootstrap/services/OctopusBootstrap"/> </wsdl:port> </wsdl:service> </wsdl:definitions> 16.附錄D 下面給出了用于計(jì)算對(duì)象的規(guī)范字節(jié)序列(CBS)的編碼中性方式,并且在優(yōu)選實(shí)施例中用于計(jì)算用來對(duì)對(duì)象進(jìn)行數(shù)字簽名的摘要。此字節(jié)序列與表示或發(fā)送對(duì)象的方式無關(guān),從而使相同的摘要和簽名值能夠遍及系統(tǒng)使用,在所述系統(tǒng)中使用多種編碼格式(例如,XML、ANS1)、編程語言等。
規(guī)范的字節(jié)序列算法 規(guī)范的字節(jié)序列算法包括根據(jù)字段值來構(gòu)造字節(jié)序列。每個(gè)字段具有簡(jiǎn)單類型或復(fù)合類型的值。一些字段可以被指定為可選的(所述字段可以存在或被省略)。
在一個(gè)實(shí)施例中,簡(jiǎn)單類型是整數(shù)、字符串、字節(jié)和布爾。
復(fù)合類型由一個(gè)或多個(gè)子字段組成;每個(gè)子字段具有簡(jiǎn)單或復(fù)合類型的值。復(fù)合類型是異構(gòu)的或同構(gòu)的,這意味著存在一個(gè)或多個(gè)不同類型(即,異構(gòu))的一個(gè)或多個(gè)子字段值(簡(jiǎn)單或復(fù)合),或者存在全部相同類型(同構(gòu))的一個(gè)或多個(gè)子字段值(簡(jiǎn)單或復(fù)合)。
通過當(dāng)字段始終存在時(shí)向字段值應(yīng)用編碼規(guī)則或者當(dāng)所述字段被指定為可選時(shí)應(yīng)用可選字段的編碼規(guī)則來獲得字段的規(guī)范字節(jié)序列。在下面的編碼規(guī)則描述中,術(shù)語字節(jié)意指8比特值(八位字節(jié)) 1.1.可選字段 如果可選字段存在,那么其值被串行化為字節(jié)值1后面是字段值的規(guī)范字節(jié)序列。如果它被省略,那么其值被串行化為字節(jié)值0。
1.2.異構(gòu)的復(fù)合 規(guī)范的字節(jié)序列是每個(gè)子字段值的規(guī)范字節(jié)序列的拼接(可選字段值不被跳過,但是依照可選字段值的規(guī)則來串行化)。
1.3.同構(gòu)的復(fù)合 規(guī)范的字節(jié)序列是子字段計(jì)數(shù),被依照大端次序編碼為4字節(jié)的序列,后面是每個(gè)子字段值的規(guī)范字節(jié)序列的拼接。如果子字段計(jì)數(shù)為0,那么在4字節(jié)字段計(jì)數(shù)后面什么都沒有(在這種情況下,所有4個(gè)字節(jié)都具有值0)。
1.4.整數(shù) 32比特整數(shù)的值,依照大端次序被編碼為4字節(jié)的序列。
1.5.字符串 字符串由UTF-8編碼的字節(jié)序列(不是空結(jié)束的)表示。字符串的規(guī)范字節(jié)序列包括(1)字符串的字節(jié)計(jì)數(shù),被依照大端次序編碼為4字節(jié)的序列,后面是(2)字符串的字節(jié)序列。
1.6.字節(jié) 8比特值 1.7.布爾 8比特值對(duì)于假來說為0,并且對(duì)于真來說為1 2.章魚對(duì)象的應(yīng)用 在一個(gè)實(shí)施例中,章魚對(duì)象的規(guī)范字節(jié)序列是其每個(gè)字段的規(guī)范字節(jié)序列依照它們?cè)趯?duì)象模型中所定義的次序的拼接。
對(duì)于異構(gòu)的復(fù)合類型來說,字段的次序是在類型定義中所指定的次序。對(duì)于同構(gòu)的復(fù)合類型來說,在下面段中指定了元項(xiàng)的次序。
○屬性 對(duì)象的“屬性”字段被當(dāng)做類型“列表”的未命名屬性(它是命名屬性的未分類容器)。在類型“列表”的屬性值中所包含的命名屬性按照它們的“名稱”字段來依照詞典方式分類。在類型“數(shù)組”的值屬性中所包含的未命名屬性未被分類(它們依照它們的數(shù)組次序來串行化)。
○擴(kuò)展 對(duì)象的內(nèi)部擴(kuò)展按照它們的‘id’字段依照詞典方式分類。在一個(gè)實(shí)施例中,對(duì)于內(nèi)部擴(kuò)展來說,在計(jì)算規(guī)范的字節(jié)序列中不使用‘extensionData’字段。對(duì)于這種擴(kuò)展來說,如果為了簽名目的需要把它們包括在摘要計(jì)算中,那么它們包含用于表示在‘extensionData’中攜帶的實(shí)際數(shù)據(jù)摘要的‘摘要’字段。對(duì)于每種類型的擴(kuò)展數(shù)據(jù)來說,給出用于允許計(jì)算其規(guī)范字節(jié)序列的定義。
○控制器 內(nèi)容密鑰引用按照它們的‘id’字段依照詞典方式分類。
3.ScubaKeys ‘publicKeys’、‘privateKeys’和‘secretKeys’字段中的密鑰按照它們的‘id’字段依照詞典方式分類。
4.例子
類B的實(shí)例的規(guī)范字節(jié)序列,其中a[]={7,8,9},s=“Abc”,x={5,4},s2=””,并且optional_x不存在被串行化為 其中Cano(X)為 17.附錄E 下面提供了控制程序的例子。在此例子中,許可表明如果可以在狀態(tài)數(shù)據(jù)庫(在此示例性實(shí)施例中被稱為“Seashell”數(shù)據(jù)庫)中找到成員資格狀態(tài)(在注冊(cè)期間準(zhǔn)備)或許可狀態(tài)(在許可轉(zhuǎn)送期間準(zhǔn)備),那么可以準(zhǔn)許播放動(dòng)作。所述許可還允許對(duì)等體請(qǐng)求許可轉(zhuǎn)送。如果兩個(gè)對(duì)等體處于給定的鄰近度內(nèi),那么準(zhǔn)許此轉(zhuǎn)送。許可包含用于在對(duì)等體上設(shè)置許可狀態(tài)的代理。
在下面的代碼文件中,“MovableDomainBoundLicense.asm”是主控制,“LicenseUtils/*”是所述許可的幫助程序,“GenericUtils/*”是用于執(zhí)行諸如計(jì)算字符串長(zhǎng)度、比較字符串、操縱堆棧等功能的通用幫助程序,并且“ExtendedStatusBlockParameters/*”包含擴(kuò)充狀態(tài)塊參數(shù)的XML描述和相應(yīng)的表示作為根據(jù)XML所編譯的字節(jié)系列。
E.1MovableDomainBound.asm ;********************************************************** ; 文件名稱MovableDomainBoundLicense.asm ; 描述可移動(dòng)許可的例子 ;**********************************************************; ;========================= ;常數(shù) ;========================= .equ DEBUG_PRINT_SYSCALL, 1 .equ FIND_SYSCALL_BY_NAME_SYSCALL, 2 .equ SYSTEM_HOST_GET_OBJECT_SYSCALL, 3 .equ SYSTEM_HOST_SET_OBJECT_SYSCALL, 4 .equ SUCCESS, 0 .equ FAILURE, -1 .equ ERROR_NO_SUCH_ITEM, -6 .equ CONTAINER_IGNORED_ADDRESS,1 ;========================= ;包括 ;========================= .include"StrCmp.asm" .include"PrintInt.asm" .include"MembershipUtils.asm" .include"LicenseStateUtils.asm" ;========================= ;數(shù)據(jù) ;========================= .data GetTrustedTimeFunctionName .string"System.Host.GetTrustedTime" GetTrustedTimeFunctionNumber .long 0 ActionGrantedNoObligationXStatus.long0x00000000;全局標(biāo)志.long0x00000000;類別=ACTION_GRANTED.long0x00000000;子類別.long0x00000000;局部標(biāo)志.long0x00000000;高速緩存持續(xù)時(shí)間類型.long0x00000000;高速緩存持續(xù)時(shí)間值.long0x00000000;值列表大小=0 ActionDeniedXStatus:.long0x00000000;全局標(biāo)志.long0x00000001;類別=ACTION_DENIED.long0x00000000;子類別.long0x00000000;局部標(biāo)志 .long0x00000000;高速緩存持續(xù)時(shí)間類型 .long0x00000000;高速緩存持續(xù)時(shí)間值 .long0x00000000;值列表大小=0 TransferGrantedProximityNotChecked: .long0x00000000;全局標(biāo)志 .long0x00000000;類別=ACTION_GRANTED .long0x00000000;子類別 .long0x00000003;局部標(biāo)志義務(wù)和回調(diào)通知 .long0x00000000;高速緩存持續(xù)時(shí)間類型 .long0x00000000;高速緩存持續(xù)時(shí)間值 .include"TransferXStatusProximityCheckFailed.asm" TransferGrantedProximityChecked: .long0x00000000;全局標(biāo)志 .long0x00000000;類別=ACTION_GRANTED .long0x00000000;子類別 .long0x00000003;局部標(biāo)志義務(wù)和回調(diào)通知 .long0x00000000;高速緩存持續(xù)時(shí)間類型 .long0x00000000;高速緩存持續(xù)時(shí)間值 .include"TransferXStatusProximityCheckSucceed.asm" AgentContextPath: .string"Octopus/Agent/Session/ContextId" AgentContextDesiredValue .string"MoveStateContent0023" AgentContextValue: .zeros 32 SinkProximityLastProbePath: .string"Octopus/Action/Parameters/Sink/Proximity/LastProbe" SinkProximityLastProbeResult: .long-1 AgentProximityCheckedPath: .string"Octopus/Agent/Parameters/ProximityChecked" AgentProximityCheckedValue: .long0 ControllerTimestampAttributePath: .string"Octopus/Controller/Attributes/Import-time" ControllerTimestampAttributeValue: .long 0 ;調(diào)試 .ifdef DEBUG Controller.Timestamp.Query.Debug: .string"---------Entering Controller.Timestamp.Query--------------\n" Control.Actions.Play.Perform.Debug: .string"---------Entering Control.Actions.Play.Perform--------------\n" Control.Agents.SetStateContent0023.Run.Debug: .string"---------Entering Control.Agents.SetStateContent0023.Run--------------\n" Control.Actions.Transfer.Perform.Debug: .string"---------Entering Control.Actions.Transfer.Perform--------------\n" Control.Agents.SetStateContent0023.OnAgentCompletion.Debug: .string"---------Entering Control.Agents.SetStateContent0023.OnAgentCompletion--------------\n" Transfer_OK_Proximity_Not_Checked.Debug: .string"#######Transfer_OK_Proximity_Not_Checked#######\n" Transfer_OK_Proximity_Checked.Debug: .string"#######Transfer_OK_Proximity_Checked#######\n" Agent_Failure.Debug: .string"#######Agent Failure#######\n" Agent_Success.Debug: .string"#######Agent Success#######\n" Action_Granted.Debug: .string"#######Action Granted#######\n" Action_Denied.Debug: .string"#######Action Denied#######\n" .endif ;========================= ;代碼 ;========================= .code ; ;Global.OnLoad ; Global.OnLoad: ;獲取GetTrustedTime functionNumber PUSH@GetTrustedTimeFunctionName PUSH FIND_SYSCALL_BY_NAME_SYSCALL CALL DUP PUSH@GetTrustedTimeFunctionNumber POKE BRN OnLoad Failed ;ok PUSH SUCCESS STOP ;失敗 OnLoad Failed: PUSH FAILURE STOP ; ;Controller.Timestamp.Query ; Controller.Timestamp.Query: .ifdef DEBUG ;調(diào)試 PUSH@Controller.Timestamp.Query.Debug PUSH DEBUG_PRINT_SYSCALL CALL .endif ;獲取控制器對(duì)象中的時(shí)間戳屬性 PUSH4 ;返回緩沖器大小(4字節(jié))PUSH @ControllerTimestampAttributeValue ;返回緩沖器(類型是長(zhǎng)整型) PUSH@ControllerTimestampAttributePath ;名稱 PUSH 0 ;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL RET ; ;Control.Actions.Play.Check Control.Actions.Play.Check: ;Control.Actions.Play.Perform Control.Actions.Play.Perform: ;查詢狀態(tài)路徑 JSR MembershipStatePath.Query BRN Action_Denied JSR LicenseStatePath.Query BRN Action_Denied .ifdef DEBUG;調(diào)試PUSH@Control.Actions.Play.Perform.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif ;如果成員資格狀態(tài)的時(shí)間戳為> ;控制器的時(shí)間戳 JSR MembershipStateValue.Query BRN Action_Denied JSR Controller.Timestamp.Query BRN Action_Denied PUSH@MembershipStateValue PEEK PUSH@ControllerTimestampAttributeValue PEEK SUB BRPAction_Granted;在這種情況下;我們不必檢查許可狀態(tài) ;我們只是檢查狀態(tài)存在 JSR LicenseStateValue.Query BRNAction_Denied Action_Granted: .ifdef DEBUG;調(diào)試PUSH@Action_Granted.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif PUSH@ActionGrantedNoObligationXStatus PUSH SUCCESS STOP Action_Denied: .ifdef DEBUG;調(diào)試PUSH@Action_Denied.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif PUSH@ActionDeniedXStatus PUSH SUCCESS STOP ; ;Control.Actions.Transfer.Check ; Control.Actions.Transfer.Check ; ;Control.Actions.Transfer.Perform ; Control.Actions.Transfer.Perform: ;查詢狀態(tài)路徑 JSR MembershipStatePath.Query BRN Action_Denied JSR LicenseStatePath.Query BRN Action_Denied .ifdef DEBUG;調(diào)試PUSH@Control.Actions.Transfer.Perform.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif ;獲取已經(jīng)檢查鄰近度的最近時(shí)間 PUSH 4;返回緩沖器大小 PUSH@SinkProximityLastProbeResult ;返回緩沖器 PUSH@SinkProximityLastProbePath ;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;如果對(duì)象是不可見的,那么尚未檢查鄰近度。
;所產(chǎn)生的代理(檢查行23上的TransferXStatusProximityCheckFailed.xml文件)。然后代理在設(shè)置狀態(tài)之前確信所述代理是域的一部分。
BRN Transfer_OK_Proximity_Not_Checked ;檢查在最近10分鐘已經(jīng)檢查鄰近度 DROP;我們知道類型id為長(zhǎng)整型 DROP;我們知道大小為4 PUSH@GetTrustedTimeFunctionNumber PEEK CALL SWAP DROP;我們只需要該值 PUSH@SinkProximityLastProbeResult PEEK SUB PUSH 10SWAPSUB;檢查鄰近度的上次時(shí)間是大于10’以前同樣;就好像根本尚未檢查鄰近度一樣(參見上面)BRN Transfer_OK_Proximity_Not_Checked;已經(jīng)成功地檢查鄰近度 .ifdef DEBUG;調(diào)試PUSH@Transfer_OK_Proximity_Checked.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif PUSH@TransferGrantedProximityChecked PUSH SUCCESS STOP Transfer_OK_Proximity_Not_Checked: .ifdef DEBUG ;調(diào)試 PUSH@Transfer_OK_Proximity_Not_Checked.Debug PUSH DEBUG_PRINT_SYSCALL CALL .endif ;返回RunAgentOnPeer義務(wù)(用于表明尚未檢查鄰近度)和OnAgentCompletion回調(diào) PUSH@TransferGrantedProximityNotChecked PUSH SUCCESS STOP ; ;Control.Agents.SetStateContent0023.Run ; Control.Agents.SetStateContent0023.Run: ;查詢狀態(tài)路徑 JSR MembershipStatePath.Query BRN Agent_Run_Failed JSR LicenseStatePath.Query BRN Agent_Run_Failed .ifdef DEBUG;調(diào)試PUSH@Control.Agents.SetStateContent0023.Run.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif ;如果對(duì)等體處于域中,那么我們不必作任何事情 JSR Membership.Check BRZ Agent_Success ;檢查環(huán)境被設(shè)置 PUSH 32;返回緩沖器大小 PUSH@AgentContextValue ;返回緩沖器 PUSH@AgentContextPath ;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;檢查結(jié)果 BRN Agent_Run_Failed DROP;我們知道類型id為字符串 DROP;我們不關(guān)心大小 PUSH@AgentContextValue PUSH@AgentContextDesiredValue JSR streq;確信我們處于良好的環(huán)境中 BRNAgent_Run_Failed ;檢查源是否已經(jīng)成功地鄰近度檢查了信宿 PUSH 4 ;返回緩沖器大小 PUSH@AgentProximityCheckedValue ;返回緩沖器 PUSH@AgentProximityCheckedPath ;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;檢查結(jié)果 BRNAgent_Run_Failed;此當(dāng)接收代理時(shí)此參數(shù)應(yīng)當(dāng)始終被應(yīng)用設(shè)置 DROP;我們知道類型id為長(zhǎng) DROP;我們知道大小為4 PUSH@AgentProximityCheckedValue PEEK NOT BRZ Agent_Set_State Agent_Run_Failed: .ifdef DEBUG;調(diào)試PUSH@Agent_Failure.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endifPUSH 0;返回塊大小PUSH 0;返回塊地址 PUSH FAILURE;結(jié)果代碼 STOP Agent_Set_State: ;設(shè)置狀態(tài) JSR LicenseState.Set BRNAgent_Run_Failed Agent_Success: .ifdef DEBUG;調(diào)試PUSH@Agent_Success.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif;成功PUSH 0;返回塊大小PUSH 0;返回塊地址PUSH SUCCESS;結(jié)果代碼STOP ; ;(類型RESET的)Control.Agents.SetStateContent0023.OnAgentCompletion回調(diào) ; Control.Agents.SetStateContent0023.OnAgentCompletion: .ifdef DEBUG;調(diào)試PUSH@Control.Agents.SetStateContent0023.OnAgentCompletion.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif ;檢查代理結(jié)果代碼為OK ;堆棧為 ;...AgentResultCode CompletionStatusCode ArgumentsBlockSize Cookie DROP ;我們不需要cookie DROP;我們不需要自變量塊大小 BRNAction_Denied;如果代理不能運(yùn)行,那么失敗 BRN Action_Denied;如果代理不能在對(duì)等體上設(shè)置狀態(tài)那么同樣失敗 ;成功 PUSH@ActionGrantedNoObligationXStatus PUSH SUCCESS STOP Agent_Completion_Failed: PUSH FAILURE STOP ;========================= ;導(dǎo)出 ;========================= .export Global.OnLoad .export Control.Actions.Play.Check .export Control.Actions.Play.Perform .export Control.Actions.Transfer.Check .export Control.Actions.Transfer.Perform .export Control.Agents.SetStateContent0023.Run .export Control.Agen_ts.SetStateContent0023.OnAgentCompletion E.2 LicenseUtils E.2.1 LicenseStateUtils.asm ;********************************************************** ;文件名稱LicenseStateUtils.asm ;描述許可狀態(tài)的實(shí)用程序 ;**********************************************************; ;========================= ;數(shù)據(jù) ;========================= .data LicenseStatePathControlAttribute: .string"Octopus/Control/Attributes/LicenseStatePath" LicenseStatePath: .zeros 256 LicenseStateValue: .long 0 ;調(diào)試 LicenseStatePath.Query.Debug: .string"---------Entering LicenseStatePath.Query--------------\n" LicenseStateValue.Query.Debug: .string"---------Entering LicenseStateValue.Query--------------\n" LicenseState.Erase.Debug: .string"---------Entering LicenseState.Erase--------------\n" LicenseState.Set.Debug: .string"---------Entering LicenseState.Set--------------\n" ;========================= ;代碼 ;========================= .code ; ;LicenseStatePath.Query ; LicenseStatePath.Query: ;調(diào)試 PUSH@LicenseStatePath.Query.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH 256;返回緩沖器大小 PUSH@LicenseStatePath;返回緩沖器 PUSH@LicenseStatePathControlAttribute;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL RET ;LicenseStateValue.Query ; LicenseStateValue.Query: ;調(diào)試 PUSH@LicenseStateValue.Query.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH 4;返回緩沖器大小(4字節(jié)) PUSH@LicenseStateValue;返回緩沖器(類型為長(zhǎng)整型) PUSH@LicenseStatePath;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL RET ; ;LicenseState.Erase ; LicenseState.Erase: ;調(diào)試 PUSH@LicenseState.Erase.Debug PUSH DEBUG_PRINT_SYSCALL CALL ;擦除局部狀態(tài) PUSH 0;對(duì)象大小(容器) PUSH 0;對(duì)象類型(容器) PUSH 0;刪除容器PUSH@LicenseStatePath;名稱 PUSH 0;親代=根容器PUSH SYSTEM_HOST_SET_OBJECT_SYSCALL CALL RET ; ;LicenseState.Set ; LicenseState.Set: ;調(diào)試 PUSH@LicenseState.Set.Debug PUSH DEBUG_PRINT_SYSCALL CALL ;設(shè)置狀態(tài) PUSH 0;對(duì)象大小(容器) PUSH 0;對(duì)象類型(容器) PUSH CONTAINER_IGNORED_ADDRESS PUSH@LicenseStatePath;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_SET_OBJECT_SYSCALL CALL RET E.2.2 MembershipUtils.asm ;********************************************************** ;文件名稱MembershipUtils.asm ;描述用于廣播成員資格的實(shí)用程序 ; ;**********************************************************; ;========================= ;數(shù)據(jù) ;========================= .data MembershipStatePathControlAttribute .string"Octopus/Control/Attributes/MembershipStatePath" MembershipStatePath .zeros256 MembershipStateValue: .long0 ;調(diào)試 intStrOutput.string"............." MembershipStatePath.Query.Debug: .string"---------Entering MembershipStatePath.Query-----------\n" MembershipStateValue.QueryDebug: .string"---------Entering MembershipStateValue.Query---------\n" Membership.Check.Debug: .string"---------Entering Membership.Check--------------\n" Membership_Check_Success.Debug: .string"#######Membership Check Success#######\n" Membership_Check_Failure.Debug: .string"#######Membership Check Failure#######\n" MembershipPath.Debug: .string"MembershipState path" MembershipGetObjOutput.Debug: .string"MembershipState get object returns" Membership_Expired.Debug: .string"MembershipState has expired.Check the Value of the Membership SeaShell token againstthe localtime." NewlineString: .string"\n" ;========================= ;代碼 ;========================= .code ;MembershipStatePath.Query MembershipStatePath.Query ;調(diào)試 PUSH@MembershipStatePath.Query.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH 256 ;返回緩沖器大小 PUSH@MembershipStatePath ;返回緩沖器 PUSH@MembershipStatePathControlAttribute;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL RET ; ;MembershipStateValue.Query ; MembershipStateValue.Query: ;調(diào)試 PUSH@MembershipStateValue.Query.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH@MembershipPath.Debug PUSH DEBUG_PR.INT_SYSCALL CALL PUSH@MembershipStatePath PUSH DEBUG_PRINT_SYSCALL CALL PUSH@NewlineString PUSH DEBUG_PRINT_SYSCALL CALL PUSH 4;返回緩沖器大小(4字節(jié)) PUSH@MembershipStateValue ;返回緩沖器(類型是長(zhǎng)整型) PUSH@MembershipStatePath ;名稱 PUSH 0;親代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALLCALL PUSH@MembershipGetObjOutput.Debug PUSH DEBUG_PRINT_SYSCALL CALL ;打印結(jié)果-首先把整型轉(zhuǎn)換成字符串 DUP PUSH@intStrOutput ADD SWAP JSR printInt ;調(diào)用打印結(jié)果 PUSH@intStrOutput PUSH DEBUG_PRINT_SYSCALL CALL PUSH@NewlineString PUSH DEBUG_PRINT_SYSCALL CALL RET ; ;Membership.Check ; Membership.Check: ;調(diào)試 PUSH@Membership.Check.Debug PUSH DEBUG_PRINT_SYSCALL CALL ;查詢成員資格路徑 JSR MembershipStateValue.Query ;看看我們是否成功 BRN Membership_Check_Failed ;檢查時(shí)間<在成員資格狀態(tài)中所獲取的時(shí)間 PUSH@MembershipStateValue;時(shí)間戳 PEEK PUSH@GetTrustedTimeFunctionNumber PEEK CALL SWAP DROP;我們只需要該值(而不是評(píng)估值) SUB BRN Membership_Expired ;成功 ;調(diào)試 PUSH@Membership_Check_Success.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH SUCCESS RET Membership_Expired: ;調(diào)試 PUSH@Membership_Expired.Debug PUSH DEBUG_PRINT_SYSCALL CALL BRA Membership_Check_Failed Membership_Check_Failed: ;調(diào)試 PUSH@Membership_Check_Failure.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH FAILURE RET E.3 GlobalUtils E.3.1 IntUtils.asm ;********************************************************** ;文件名稱IntUtils.asm ;描述用于比較2個(gè)整數(shù)的實(shí)用程序 ;********************************************************** ;========================= ;包括 ;========================= .include"StackUtils.asm" ;========================= ;代碼 ;========================= .code ; ;min ; ;在2個(gè)整數(shù)之間計(jì)算最小值 ; ;輸入...a b ;輸出...a<b?a:b ; min DUP ;...a b b PUSH 2 JSR pick ;...a b b a CMP ;...a b cmp_result BRN Swap_Stack;...a b DROP RET ;a Swap_Stack: SWAP DROP RET ;b ; ;max ; ;在2個(gè)整數(shù)之間計(jì)算最大值 ; ;輸入...a b ;輸出...a>b?a:b ; max DUP ;...a b b PUSH 2 JSR pick ;...a b b a CMP ;...ab cmp_result NEG BRN Swap_Stack DROP RET ;a E.3.2 PrintInt.asm ;********************************************************** ;文件名稱PrintInt.asm ;描述把整數(shù)(有符號(hào)或無符號(hào))轉(zhuǎn)換為字符串 ;********************************************************** ;;注意要求已經(jīng)包括“StackUtils.asm” ;數(shù)據(jù)段 .data ;代碼段 .code ;把整數(shù)轉(zhuǎn)換為字符串表示 ;參數(shù)dest,int printInt: ;復(fù)制dest參數(shù) SWAP DUP PUSH 2 JSR pick ;STACK:origval,startstring,startstring,unsignedval ;現(xiàn)在我們最后以整數(shù)的額外拷貝結(jié)束 ;我們使用這來稍后測(cè)試原始的簽名 printIntLoop: ;獲取單個(gè)數(shù)字 DUP PUSH 10 MOD ;轉(zhuǎn)換成ascii PUSH 48;′0′的ASCII ADD ;獲取輸出緩沖器的地址 PUSH 2 JSR pick POKEB;打印到緩沖器 ;向前移動(dòng)我們的緩沖器指針 SWAP PUSH 1 ADD SWAP ;除以10并且看看我們?cè)谀? PUSH 10 DIV DUP BRP printIntLoop DROP;去除頂部的0 ;STACK=orignum,startofstring,endofstring ;如果原始數(shù)字為負(fù),那么加入負(fù)號(hào) ;以空終止 DUP PUSH 0 SWAP POKEB ;把字符串末尾向上移動(dòng)1,因此不翻轉(zhuǎn)終結(jié)符 PUSH 1 SUB ;我們完成只需要反向字符串 fliploop: ;獲取第二字節(jié) DUP PEEKB ;獲取第一字節(jié) PUSH 2 JSR pick PEEKB ;把第一字節(jié)放到最后地方 PUSH 2 JSR pick POKEB ;把最后字節(jié)放到第一地方 PUSH 2 JSR pick POKEB ;把末尾指針向上移動(dòng)一 PUSH 1 SUB ;把開始指針向下移動(dòng)一 SWAP PUSH 1 ADD SWAP ;看看是否已經(jīng)滿足指針 ;首先必須復(fù)制值 DUP PUSH 2 JSRpick SUB BRPfliploop ;除去堆棧上的一些殘余 DROP DROP DROP RET E.3.3 StackUtils.asm ;********************************************************** ;文件名稱StackUtils.asm ;描述根據(jù)FORTH產(chǎn)生的堆棧實(shí)用程序函數(shù) ; ;********************************************************** .ifndef_STACK_UTILS_ .define_STACK_UTILS_ ;========================= ;代碼 ;========================= .code ; ;結(jié)束 ; ;拷貝堆棧上的第二項(xiàng) ; ;輸入...a b ;輸出...a b a ; over: PUSH 1 JSR pick RET ; ;挑選 ; ;輸入...v3 v2 v1 v0 N ;輸出...v3 v2 v1 v0 vN ; pick: PUSH 1 ADD PUSH 4 MUL PUSHSP ADD PEEK RET .endif;_STACK_UTILS_ E.3.4 StdLib.asm ;用于Plankton的標(biāo)準(zhǔn)庫 .equHEAP_ADDR,16 ;數(shù)據(jù)段 ;代碼段 .code strlen: DUP loop: DUP PEEKB BRZ done PUSH 1 ADD BRAloop done: SWAP SUB RET .exportstrlen E.3.5 StrCmp.asm ;********************************************************** ;文件名稱StrCmp.asm ;描述用于兩個(gè)字符串等同的streq測(cè)試 ;********************************************************** .ifndef_STR_CMP_ .define_STR_CMP_ ;========================= ;包括 ;========================= .include"StackUtils.asm" ;========================= ;代碼 ;========================= .code ; ;streq ; ;用于兩個(gè)字符串等同性的測(cè)試 ; ;輸入...@str1@str2 ;輸出...res(如果字符串相同,那么res=0,否則為-1) ; streq: ;獲取兩個(gè)字符串之間的偏移 JSRover SUB SWAP;...偏移@str1 streqloop: ;獲取str1的cur字符 DUP PEEKB ;...偏移@str1 char1 ;get the cur char of str2 JSR over ;...偏移@str1 char1 @str1 PUSH3 JSR pick ;...off偏移set @str1 char1 @str1偏移 ADD PEEKB ;...偏移@str1 char1 char2 ;現(xiàn)在比較兩個(gè)字符 JSR over SUB;...偏移@str1 char1 char1-char2 ;如果char1?。絚har2,則失敗 NOT BRZstreqfailure ;如果char1為0(char1==char2==0),那么已經(jīng)結(jié)束了 BRZ streqsuccess ;...偏移@str1 ;增加@str1指針并且循環(huán) PUSH1 ADD BRA streqloop streqfailure:;...偏移@str1char1 DROP DROP DROP PUSH-1 RET streqsuccess: ;...偏移@str1 DROP DROP PUSH 0 RET .endif;_STR_CMP_ E.4 ExtendedStatusBlock Parameters E.4.1 TransferXStatusProximityCheckSucceeded.xml
<ValueListBlock>
<ValueBlock type="Parameter">
<ParameterBlock name="Obligations">
<ValueBlock type="ValueList">
<ValueListBlock>
<ValueBlock type="ExtendedParameter">
<ParameterBlock name="RunAgentOnPeer"flags="1">
<ValueBlocktype="ValueList">
<ValueListBlock>-<!--控制ID--> <ValueBlocktype="String">urn:marlin:control:0023</ValueBlock> -<!--代理名稱--> <ValueBlock type="String">SetStateContent0023</ValueBlock> -<!--實(shí)例ID--><ValueBlock type="Integer">240343</ValueBlock> -<!--上下文ID--> <ValueBlocktype="String">MoveStateContent0023</ValueBlock> -<!--附加參數(shù)-->
<ValueBlock type="ValueList">
<ValueListBlock>
<ValueBlocktype="Parameter"> -<!--隨著TransferXStatusProximityCheckFailed.xml變化的僅有的事務(wù) -->
<ParameterBlock name="ProximityChecked"><ValueBlocktype="Integer">1</ValueBlock> </ParameterBlock> </ValueBlock> </ValueListBlock></ValueBlock> </ValueListBlock> </ValueBlock></ParameterBlock> </ValueBlock> </ValueListBlock> </ValueBlock> </ParameterBlock> </ValueBlock>
<ValueBlock type="Parameter">
<ParameterBlock name="Callbacks">
<ValueBlock type="ValueList">
<ValueListBlock>
<ValueBlocktype="ExtendedParameter">
<ParameterBlock name="OnAgentCompletion"flags="1">
<ValueBlock type="ValueList">
<ValueListBlock>-<!--代理實(shí)例ID--> <ValueBlock type="String">240343</ValueBlock>-<!—回調(diào)例程-->
<ValueBlock type="ValueList">
<ValueListBlock> -<!--復(fù)位--> <ValueBlock type="Integer">0</ValueBlock>-<!--名稱--> <ValueBlock type="String">Control.Agents.SetStateContent0023.OnAgentCompletion</ValueBlock> -<!--點(diǎn)心文件--><ValueBlock type="Integer">0</ValueBlock></ValueListBlock> </ValueBlock></ValueListBlock> </ValueBlock> </ParameterBlock></ValueBlock> </ValueListBlock> </ValueBlock></ParameterBlock> </ValueBlock></ValueListBlock> E.4.2 TransferXStatusProximityCheckFailed.xml-<ValueListBlock> -<ValueBlock type="Parameter">-<ParameterBlock name="Obligations"> -<ValueBlocktype="ValueList"> -<ValueListBlock>-<ValueBlock type="ExtendedParameter"> -<ParameterBlock name="RunAgentOnPeer"flags="1"> -<ValueBlocktype="ValeList"> -<ValueListBlock>-<!—控制ID--> <ValueBlock type="String">urn:marlin:control:0023</ValueBlock> -<!--代理名稱--> <ValueBlock type="String">SetStateContent0023</ValueBlock> -<!--實(shí)例ID--> <ValueBlock type="Integer">240343</ValueBlock> -<!--上下文ID--> <ValueBlock type="String">MoveStateContent0023</ValueBlock> -<!--附加參數(shù)--> -<ValueBlock type="ValueList"> -<ValueListBlock>-<ValueBlock type="Parameter"> -<!—隨TransferXStatusProximityCheckSucceed.xml改變的僅有的事務(wù)-->-<ParameterBlock name="ProximityChecked"> <ValueBlock type="Integer">0</ValueBlock> </ParameterBlock> </ValueBlock> </ValueListBlock></ValueBlock> </ValueListBlock> </ValueBlock></ParameterBlock> </ValueBlock></ValueListBlock> </ValueBlock></ParameterBlock> </ValueBlock> -<ValueBlock type="Parameter">-<ParameterBlock name="Callbacks"> -<ValueBlocktype="ValueList">-<ValueListBlock> -<ValueBlock type="ExtendedParameter"> -<ParameterBlock name="OnAgentCompletion"flags="1"> -<ValueBlock type="ValueList"> -<ValueListBlock>-<!--代理實(shí)例ID--><ValueBlock type="String">240343</ValueBlock> -<!—回調(diào)例程--> -<ValueBlock type="ValueList"> -<ValueListBlock>-<!--復(fù)位--><ValueBlock type="Integer">0</ValueBlock>-<!--名稱--> <ValueBlock type="String">Control.Agents.SetStateContent0023.OnAgentCompletion</ValueBlock>-<!--點(diǎn)心文件--> <ValueBlock type="Integer">0</ValueBlock> </ValueListBlock></ValueBlock> </ValueListBlock> </ValueBlock> </ParameterBlock></ValueBlock> </ValueListBlock> </ValueBlock> </ParameterBlock></ValueBlock> </ValueListBlock> E.4.3 TransferXStatusProximityCheckSucceeded.asm 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x20 0x00 0x00 0x00 0x0C 0x4F 0x62 0x6C 0x69 0x67 0x61 0x74 0x69 0x6F 0x6E 0x73 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x0C 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x0F 0x52 0x75 0x6E 0x41 0x67 0x65 0x6E 0x74 0x4F 0x6E 0x50 0x65 0x65 0x72 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x92 0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x18 0x75 0x72 0x6E 0x3A 0x6D 0x61 0x72 0x6C 0x69 0x6E 0x3A 0x63 0x6F 0x6E 0x74 0x72 0x6F 0x6C 0x3A 0x30 0x30 0x32 0x33 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x14 0x53 0x65 0x74 0x53 0x74 0x61 0x74 0x65 0x43 0x6F 0x6E 0x74 0x65 0x6E 0x74 0x30 0x30 0x32 0x33 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x03 0xAA 0xD7 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x15 0x4D 0x6F 0x76 0x65 0x53 0x74 0x61 0x74 0x65 0x43 0x6F 0x6E 0x74 0x65 0x6E 0x74 0x30 0x30 0x32 0x33 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x25 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x1D 0x00 0x00 0x00 0x11 0x50 0x72 0x6F 0x78 0x69 0x6D 0x69 0x74 0x79 0x43 0x68 0x65 0x63 0x6B 0x65 0x64 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x1E 0x00 0x00 0x00 0x0A 0x43 0x61 0x6C 0x6C 0x62 0x61 0x63 0x6B 0x73 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x0C 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x12 0x4F 0x6E 0x41 0x67 0x65 0x6E 0x74 0x43 0x6F 0x6D 0x70 0x6C 0x65 0x74 0x69 0x6F 0x6E 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x6C 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x07 0x32 0x34 0x30 0x33 0x34 0x33 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x55 0x00 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x35 0x43 0x6F 0x6E 0x74 0x72 0x6F 0x6C 0x2E 0x41 0x67 0x65 0x6E 0x74 0x73 0x2E 0x53 0x65 0x74 0x53 0x74 0x61 0x74 0x65 0x43 0x6F 0x6E 0x74 0x65 0x6E 0x74 0x30 0x30 0x32 0x33 0x2E 0x4F 0x6E 0x41 0x67 0x65 0x6E 0x74 0x43 0x6F 0x6D 0x70 0x6C 0x65 0x74 0x69 0x6F 0x6E 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x040x000x00 0x00 0x00 E.4.4 TransferXStatusProximityCheckFailed.asm 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x20 0x00 0x00 0x00 0x0C 0x4F 0x62 0x6C 0x69 0x67 0x61 0x74 0x69 0x6F 0x6E 0x73 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x0C 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x0F 0x52 0x75 0x6E 0x41 0x67 0x65 0x6E 0x74 0x4F 0x6E 0x50 0x65 0x65 0x72 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x92 0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x18 0x75 0x72 0x6E 0x3A 0x6D 0x61 0x72 0x6C 0x69 0x6E 0x3A 0x63 0x6F 0x6E 0x74 0x72 0x6F 0x6C 0x3A 0x30 0x30 0x32 0x33 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x14 0x53 0x65 0x74 0x53 0x74 0x61 0x74 0x65 0x43 0x6F 0x6E 0x74 0x65 0x6E 0x74 0x30 0x30 0x32 0x33 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x03 0xAA 0xD7 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x15 0x4D 0x6F 0x76 0x65 0x53 0x74 0x61 0x74 0x65 0x43 0x6F 0x6E 0x74 0x65 0x6E 0x74 0x30 0x30 0x32 0x33 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x25 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x1D 0x00 0x00 0x00 0x11 0x50 0x72 0x6F 0x78 0x69 0x6D 0x69 0x74 0x79 0x43 0x68 0x65 0x63 0x6B 0x65 0x64 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x1E 0x00 0x00 0x00 0x0A 0x43 0x61 0x6C 0x6C 0x62 0x61 0x63 0x6B 0x73 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x0C 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x12 0x4F 0x6E 0x41 0x67 0x65 0x6E 0x74 0x43 0x6F 0x6D 0x70 0x6C 0x65 0x74 0x69 0x6F 0x6E 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x6C 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x07 0x32 0x34 0x30 0x33 0x34 0x33 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x55 0x00 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x35 0x43 0x6F 0x6E 0x74 0x72 0x6F 0x6C 0x2E 0x41 0x67 0x65 0x6E 0x74 0x73 0x2E 0x53 0x65 0x74 0x53 0x74 0x61 0x74 0x65 0x43 0x6F 0x6E 0x74 0x65 0x6E 0x74 0x30 0x30 0x32 0x33 0x2E 0x4F 0x6E 0x41 0x67 0x65 0x6E 0x74 0x43 0x6F 0x6D 0x70 0x6C 0x65 0x74 0x69 0x6F 0x6E 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x00 盡管為了理解清楚已經(jīng)相當(dāng)詳細(xì)地描述了上述發(fā)明,然而在所附權(quán)利要求的范圍內(nèi)顯然可以進(jìn)行某些改變和修改。應(yīng)當(dāng)注意,存在用于實(shí)現(xiàn)這里所描述過程和設(shè)備的許多候選方式。據(jù)此,本實(shí)施例被認(rèn)為是說明性的而不是限制性的,并且所發(fā)明的工作主體不限于這里所給出的細(xì)節(jié),而是可以在所附權(quán)利要求的范圍和等效方式內(nèi)進(jìn)行修改。
權(quán)利要求
1.一種用于授權(quán)對(duì)在主機(jī)計(jì)算機(jī)系統(tǒng)上的電子內(nèi)容進(jìn)行訪問的方法,所述方法包括
從所述主機(jī)計(jì)算機(jī)系統(tǒng)的用戶接收訪問所述電子內(nèi)容的請(qǐng)求;
獲取與所述電子內(nèi)容相關(guān)聯(lián)的許可,所述許可包括控制對(duì)象、控制器對(duì)象、保護(hù)器對(duì)象和內(nèi)容密鑰對(duì)象;
從所述控制對(duì)象獲取第一控制程序;并且
使用在所述主機(jī)計(jì)算機(jī)系統(tǒng)上運(yùn)行的數(shù)字權(quán)利管理引擎來執(zhí)行所述第一控制程序以確定所述請(qǐng)求是否可以被準(zhǔn)許,其中執(zhí)行所述控制程序包括評(píng)估一個(gè)或多個(gè)鏈路對(duì)象,其中每個(gè)鏈路對(duì)象表示兩個(gè)實(shí)體之間的關(guān)系,其中所述一個(gè)或多個(gè)鏈路對(duì)象中的至少一個(gè)包括第二控制程序,并且其中評(píng)估所述一個(gè)或多個(gè)鏈路對(duì)象包括
使用所述數(shù)字權(quán)利管理引擎來執(zhí)行所述第二控制程序以確定所述鏈路是否有效,所述執(zhí)行包括確定是否滿足由所述控制程序所表達(dá)的一個(gè)或多個(gè)條件。
2.如權(quán)利要求1所述的方法,其中所述控制器對(duì)象可操作來把所述控制對(duì)象與所述內(nèi)容密鑰對(duì)象安全地綁定。
3.如權(quán)利要求1所述的方法,其中所述保護(hù)器對(duì)象可操作來把所述內(nèi)容密鑰對(duì)象與所述電子內(nèi)容安全地綁定。
4.如權(quán)利要求1所述的方法,其中所述一個(gè)或多個(gè)條件中的至少一個(gè)包括當(dāng)前時(shí)間應(yīng)該在預(yù)定義時(shí)間之前的要求。
5.如權(quán)利要求1所述的方法,其中所述一個(gè)或多個(gè)條件中的至少一個(gè)包括當(dāng)前時(shí)間應(yīng)該在一定的時(shí)間之后的要求。
6.如權(quán)利要求1所述的方法,其中所述一個(gè)或多個(gè)條件中的至少一個(gè)包括所述第二控制程序事先不應(yīng)該執(zhí)行超過預(yù)定義數(shù)目的次數(shù)的要求。
7.如權(quán)利要求1所述的方法,其中所述一個(gè)或多個(gè)條件中的至少一個(gè)包括在存儲(chǔ)器中所存儲(chǔ)的計(jì)數(shù)器不應(yīng)超過預(yù)定義值的要求。
8.如權(quán)利要求1所述的方法,其中所述一個(gè)或多個(gè)條件中的至少一個(gè)包括事先不應(yīng)發(fā)生預(yù)定義事件的要求。
9.如權(quán)利要求1所述的方法,其中所述一個(gè)或多個(gè)條件中的至少一個(gè)包括所述主機(jī)計(jì)算機(jī)系統(tǒng)必須具有一個(gè)或多個(gè)預(yù)定義特征的要求。
10.如權(quán)利要求1所述的方法,其中所述一個(gè)或多個(gè)條件中的至少一個(gè)包括在所述主機(jī)計(jì)算機(jī)系統(tǒng)上運(yùn)行的再現(xiàn)所述電子內(nèi)容的軟件應(yīng)該不能向預(yù)定義接口輸出所述電子內(nèi)容的要求。
11.一種用于授權(quán)對(duì)電子內(nèi)容執(zhí)行給定動(dòng)作的方法,所述方法包括
使用在第一數(shù)字權(quán)利管理引擎上運(yùn)行的虛擬機(jī)來執(zhí)行第一控制程序,所述第一控制程序可操作來確定是否能夠?qū)λ鲭娮觾?nèi)容執(zhí)行給定動(dòng)作,其中所述第一控制程序可操作來評(píng)估要使對(duì)給定動(dòng)作的執(zhí)行被授權(quán)而必須滿足的第一組一個(gè)或多個(gè)條件,并且其中所述第一組一個(gè)或多個(gè)條件中的至少一個(gè)包括一個(gè)或多個(gè)鏈路對(duì)象應(yīng)可以用于數(shù)字權(quán)利管理引擎的要求,所述鏈路對(duì)象在邏輯上把表示第一實(shí)體的第一節(jié)點(diǎn)鏈接到表示第二實(shí)體的第二節(jié)點(diǎn);
獲取所述一個(gè)或多個(gè)鏈路對(duì)象,每個(gè)所述鏈路對(duì)象表示兩個(gè)實(shí)體之間的關(guān)系,并且所述鏈路對(duì)象中的至少一個(gè)包括第二控制程序,其中所述第二控制程序可操作來評(píng)估要使至少一個(gè)鏈路對(duì)象被認(rèn)為有效而必須滿足的第二組一個(gè)或多個(gè)條件;并且
使用所述數(shù)字權(quán)利管理引擎來執(zhí)行所述第二控制程序。
12.如權(quán)利要求11所述的方法,其中所述第一組一個(gè)或多個(gè)條件包括基于時(shí)間的條件。
13.如權(quán)利要求11所述的方法,其中所述第二組一個(gè)或多個(gè)條件包括基于時(shí)間的條件。
14.如權(quán)利要求11所述的方法,其中所述第一組條件或第二組條件中的至少一個(gè)包括在存儲(chǔ)器中所存儲(chǔ)的計(jì)數(shù)器不應(yīng)超過預(yù)定義值的要求。
15.一種用于管理對(duì)電子內(nèi)容的訪問或使用的方法,所述方法包括
獲取與所述電子內(nèi)容相關(guān)聯(lián)的控制程序,所述控制程序包括指令,所述指令當(dāng)由數(shù)字權(quán)利管理引擎執(zhí)行時(shí)可操作來評(píng)估第一條件并且當(dāng)確定已經(jīng)滿足所述第一條件時(shí)允許對(duì)所述電子內(nèi)容的第一使用;
在所述數(shù)字權(quán)利管理引擎的控制下把狀態(tài)信息存儲(chǔ)到數(shù)據(jù)庫中,所述狀態(tài)信息與所述電子內(nèi)容的第一使用相關(guān);
第二次執(zhí)行所述控制程序以確定是否授權(quán)對(duì)所述電子內(nèi)容的第二使用,評(píng)估所述第一條件和第二條件,所述第二條件的評(píng)估至少部分地依賴于所述狀態(tài)信息;
當(dāng)確定已經(jīng)滿足所述第二條件時(shí),更新所述狀態(tài)信息并且把所更新的狀態(tài)信息存儲(chǔ)在所述數(shù)據(jù)庫中。
16.如權(quán)利要求15所述的方法,其中在數(shù)據(jù)庫中所存儲(chǔ)的狀態(tài)信息包括對(duì)已經(jīng)訪問過所述電子內(nèi)容的次數(shù)的計(jì)數(shù)。
17.如權(quán)利要求15所述的方法,其中在數(shù)據(jù)庫中所存儲(chǔ)的狀態(tài)信息包括使用所述電子內(nèi)容的持續(xù)時(shí)間的量度。
18.如權(quán)利要求15所述的方法,其中從鏈路對(duì)象獲得所述控制程序,所述鏈路對(duì)象形成從第一節(jié)點(diǎn)到第二節(jié)點(diǎn)的授權(quán)圖的一部分。
19.如權(quán)利要求18所述的方法,其中所述第一條件包括所述鏈路對(duì)象應(yīng)該有效的要求。
20.如權(quán)利要求18所述的方法,其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示所述計(jì)算設(shè)備的用戶。
21.如權(quán)利要求18所述的方法,其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示預(yù)訂服務(wù)。
22.如權(quán)利要求18所述的方法,其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示家庭網(wǎng)絡(luò)域。
23.一種用于管理對(duì)電子內(nèi)容的訪問或使用的系統(tǒng),所述系統(tǒng)包括
用于獲取與所述電子內(nèi)容相關(guān)聯(lián)的控制程序的裝置,所述控制程序包括指令,所述指令當(dāng)由數(shù)字權(quán)利管理引擎執(zhí)行時(shí)可操作來評(píng)估第一條件并且當(dāng)確定已經(jīng)滿足所述第一條件時(shí)允許對(duì)所述電子內(nèi)容的第一使用;
用于在所述數(shù)字權(quán)利管理引擎的控制下把狀態(tài)信息存儲(chǔ)到數(shù)據(jù)庫中的裝置,所述狀態(tài)信息與所述電子內(nèi)容的第一使用相關(guān);
用于第二次執(zhí)行所述控制程序以確定是否授權(quán)對(duì)所述電子內(nèi)容的第二使用,評(píng)估所述第一條件和第二條件的裝置,所述第二條件的評(píng)估至少部分地依賴于所述狀態(tài)信息;和
用于當(dāng)確定已經(jīng)滿足所述第二條件時(shí)更新所述狀態(tài)信息并且把所更新的狀態(tài)信息存儲(chǔ)在所述數(shù)據(jù)庫中的裝置。
24.如權(quán)利要求23所述的系統(tǒng),其中在數(shù)據(jù)庫中所存儲(chǔ)的狀態(tài)信息包括對(duì)已經(jīng)訪問過所述電子內(nèi)容的次數(shù)的計(jì)數(shù)。
25.如權(quán)利要求23所述的系統(tǒng),其中在數(shù)據(jù)庫中所存儲(chǔ)的狀態(tài)信息包括使用所述電子內(nèi)容的持續(xù)時(shí)間的量度。
26.如權(quán)利要求25所述的系統(tǒng),其中從鏈路對(duì)象獲得所述控制程序,所述鏈路對(duì)象形成從第一節(jié)點(diǎn)到第二節(jié)點(diǎn)的授權(quán)圖的一部分。
27.如權(quán)利要求26所述的系統(tǒng),其中所述第一條件包括所述鏈路對(duì)象應(yīng)該有效的要求。
28.如權(quán)利要求26所述的系統(tǒng),其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示所述計(jì)算設(shè)備的用戶。
29.如權(quán)利要求26所述的系統(tǒng),其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示預(yù)訂服務(wù)。
30.如權(quán)利要求26所述的系統(tǒng),其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示家庭網(wǎng)絡(luò)域。
31.一種用于保護(hù)數(shù)字權(quán)利管理許可的方法,所述數(shù)字權(quán)利管理許可包括(a)第一對(duì)象,所述第一對(duì)象包括控制程序,所述控制程序包括一個(gè)或多個(gè)指令,所述一個(gè)或多個(gè)指令可操作來測(cè)試與對(duì)電子內(nèi)容的指定使用相關(guān)聯(lián)的一個(gè)或多個(gè)條件;(b)第二對(duì)象,包括第一密碼密鑰,所述第一密碼密鑰被至少部分地加密,所述第一密碼密鑰可操作來解密所述電子內(nèi)容;(c)第三對(duì)象,包括對(duì)所述第一對(duì)象的引用和對(duì)所述第二對(duì)象的引用;和(d)第四對(duì)象,包括對(duì)所述第二對(duì)象的引用和對(duì)所述電子內(nèi)容的引用,所述方法包括
使用所述第一密碼密鑰來數(shù)字地簽名所述第三對(duì)象。
32.如權(quán)利要求31所述的方法,進(jìn)一步包括
計(jì)算所述第一對(duì)象的消息認(rèn)證代碼,所述消息認(rèn)證代碼利用所述第一密碼密鑰。
33.如權(quán)利要求32所述的方法,進(jìn)一步包括
計(jì)算所述消息認(rèn)證代碼的公鑰簽名。
34.如權(quán)利要求33所述的方法,進(jìn)一步包括
在所述第二對(duì)象中包括所述消息認(rèn)證代碼和公鑰簽名。
35.如權(quán)利要求31所述的方法,其中所述第一對(duì)象包括控制對(duì)象。
36.如權(quán)利要求31所述的方法,其中所述第二對(duì)象包括內(nèi)容密鑰對(duì)象。
37.如權(quán)利要求31所述的方法,其中所述第三對(duì)象包括控制器對(duì)象。
38.如權(quán)利要求31所述的方法,其中所述第四對(duì)象包括保護(hù)器對(duì)象。
39.一種用于驗(yàn)證數(shù)字權(quán)利管理許可的完整性的方法,所述數(shù)字權(quán)利管理許可包括(a)第一對(duì)象,所述第一對(duì)象包括控制程序,所述控制程序包括一個(gè)或多個(gè)指令,所述一個(gè)或多個(gè)指令可操作來測(cè)試與對(duì)電子內(nèi)容的指定使用相關(guān)聯(lián)的一個(gè)或多個(gè)條件;(b)第二對(duì)象,包括第一密碼密鑰,所述第一密碼密鑰被至少部分地加密,所述第一密碼密鑰可操作來解密所述電子內(nèi)容;(c)第三對(duì)象,包括對(duì)所述第一對(duì)象的引用和對(duì)所述第二對(duì)象的引用;和(d)第四對(duì)象,包括對(duì)所述第二對(duì)象的引用和對(duì)所述電子內(nèi)容的引用,所述方法包括
使用所述第一密碼密鑰來驗(yàn)證所述第三對(duì)象的數(shù)字簽名。
40.如權(quán)利要求39所述的方法,進(jìn)一步包括
使用所述第一密碼密鑰來計(jì)算消息認(rèn)證代碼并且把所述消息認(rèn)證代碼與在所述第三對(duì)象中所包含的值相比較。
41.如權(quán)利要求40所述的方法,進(jìn)一步包括
使用公鑰/私鑰對(duì)中的私鑰來驗(yàn)證所述消息認(rèn)證代碼的簽名。
42.如權(quán)利要求39所述的方法,其中所述第一對(duì)象包括控制對(duì)象。
43.如權(quán)利要求39所述的方法,其中所述第二對(duì)象包括內(nèi)容密鑰對(duì)象。
44.如權(quán)利要求39所述的方法,其中所述第三對(duì)象包括控制器對(duì)象。
45.如權(quán)利要求39所述的方法,其中所述第四對(duì)象包括保護(hù)器對(duì)象。
46.一種用于驗(yàn)證數(shù)字權(quán)利管理許可的完整性的系統(tǒng),所述數(shù)字權(quán)利管理許可包括(a)第一對(duì)象,所述第一對(duì)象包括控制程序,所述控制程序包括一個(gè)或多個(gè)指令,所述一個(gè)或多個(gè)指令可操作來測(cè)試與對(duì)電子內(nèi)容的指定使用相關(guān)聯(lián)的一個(gè)或多個(gè)條件;(b)第二對(duì)象,包括第一密碼密鑰,所述第一密碼密鑰被至少部分地加密,所述第一密碼密鑰可操作來解密所述電子內(nèi)容;(c)第三對(duì)象,包括對(duì)所述第一對(duì)象的引用和對(duì)所述第二對(duì)象的引用;和(d)第四對(duì)象,包括對(duì)所述第二對(duì)象的引用和對(duì)所述電子內(nèi)容的引用,所述系統(tǒng)包括
用于使用所述第一密碼密鑰來驗(yàn)證所述第三對(duì)象的數(shù)字簽名的裝置。
47.一種用于確定第一實(shí)體是否處在第二實(shí)體的預(yù)定義鄰近度之內(nèi)的方法,所述方法包括
在所述第一實(shí)體產(chǎn)生一組隨機(jī)數(shù)對(duì);
從所述第一實(shí)體向所述第二實(shí)體發(fā)送加密的信息,所述第二實(shí)體能夠從所述加密的信息導(dǎo)出該組隨機(jī)數(shù)對(duì)
在所述第二實(shí)體解密所述加密的信息;
在所述第二實(shí)體導(dǎo)出該組隨機(jī)數(shù)對(duì);
從所述第二實(shí)體向所述第一實(shí)體發(fā)送確認(rèn);
在所述第一實(shí)體測(cè)量第一時(shí)間值;
從所述第一實(shí)體向所述第二實(shí)體發(fā)送該組隨機(jī)數(shù)對(duì)的第一數(shù);
在所述第二實(shí)體驗(yàn)證所述第一數(shù)來自該組隨機(jī)數(shù)對(duì);
從所述第二實(shí)體向所述第一實(shí)體發(fā)送該組隨機(jī)數(shù)對(duì)的相應(yīng)隨機(jī)數(shù);并且
在所述第一實(shí)體接收所述相應(yīng)隨機(jī)數(shù);并且
在所述第一實(shí)體測(cè)量第二時(shí)間值。
48.如權(quán)利要求47所述的方法,進(jìn)一步包括
計(jì)算在所述第一時(shí)間值和所述第二時(shí)間值之間的差異,并且
把所述差異與閾值相比較。
49.如權(quán)利要求48所述的方法,進(jìn)一步包括
如果所述差異大于所述閾值,那么拒絕所述第二實(shí)體訪問計(jì)算資源。
50.如權(quán)利要求48所述的方法,進(jìn)一步包括
如果所述差異小于所述閾值,那么準(zhǔn)許所述第二實(shí)體訪問計(jì)算資源。
51.一種用于確定第一實(shí)體與第二實(shí)體的鄰近度的方法,所述方法包括
從所述第一實(shí)體向所述第二實(shí)體發(fā)送第一秘密;
從所述第二實(shí)體接收確認(rèn);
在所述第一實(shí)體測(cè)量第一時(shí)間值;
從所述第一實(shí)體向所述第二實(shí)體發(fā)送所述第一秘密的一部分;
從所述第二實(shí)體接收所述第一秘密的相應(yīng)部分;
在所述第一實(shí)體測(cè)量第二時(shí)間值;并且
計(jì)算在所述第一時(shí)間值和第二時(shí)間值之間的差異。
52.如權(quán)利要求51所述的方法,進(jìn)一步包括
把所述差異與閾值相比較。
53.如權(quán)利要求52所述的方法,進(jìn)一步包括
如果所述差異大于所述閾值,那么拒絕所述第二實(shí)體訪問計(jì)算資源。
54.如權(quán)利要求52所述的方法,進(jìn)一步包括
如果所述差異小于所述閾值,那么準(zhǔn)許所述第二實(shí)體訪問計(jì)算資源。
55.一種用于在包括具有虛擬機(jī)的數(shù)字權(quán)利管理引擎的數(shù)字權(quán)利管理系統(tǒng)中授權(quán)對(duì)電子內(nèi)容的訪問或其它使用的方法
接收訪問或其它方式使用所述電子內(nèi)容的請(qǐng)求;
識(shí)別與所述電子內(nèi)容相關(guān)聯(lián)的許可,所述許可包括控制程序和內(nèi)容密鑰;
使用所述虛擬機(jī)來執(zhí)行所述控制程序;
獲得來自所述虛擬機(jī)的輸出,所述輸出表明只要滿足義務(wù),對(duì)所述電子內(nèi)容所請(qǐng)求的訪問或其它使用就被授權(quán);
確定主機(jī)應(yīng)用能夠滿足所述義務(wù);并且
在履行所述義務(wù)時(shí),允許對(duì)所述電子內(nèi)容所請(qǐng)求的訪問或其它使用進(jìn)行,包括使用內(nèi)容密鑰來解密所述電子內(nèi)容。
56.如權(quán)利要求55所述的方法,其中所述義務(wù)包括以降低的質(zhì)量格式來再現(xiàn)所述電子內(nèi)容。
57.如權(quán)利要求55所述的方法,其中所述義務(wù)包括記錄關(guān)于對(duì)所述電子內(nèi)容的訪問或其它使用的審計(jì)信息,并且向遠(yuǎn)程站點(diǎn)報(bào)告所述審計(jì)信息。
58.如權(quán)利要求55所述的方法,其中所述義務(wù)包括應(yīng)該禁止所述數(shù)字權(quán)利管理系統(tǒng)運(yùn)行在的主機(jī)環(huán)境的指定功能的要求。
59.如權(quán)利要求58所述的方法,其中所述電子內(nèi)容包括廣告,并且其中所述指定功能包括在再現(xiàn)所述電子內(nèi)容期間快進(jìn)或回退的能力。
60.如權(quán)利要求58所述的方法,其中所述指定功能包括向一定的技術(shù)輸出所述電子內(nèi)容的能力。
61.一種用于在包括具有虛擬機(jī)的數(shù)字權(quán)利管理引擎的主機(jī)系統(tǒng)中授權(quán)對(duì)電子內(nèi)容的訪問或其它使用的方法
接收訪問或其它方式使用所述電子內(nèi)容的請(qǐng)求;
識(shí)別與所述電子內(nèi)容相關(guān)聯(lián)的許可,所述許可包括控制程序和內(nèi)容密鑰;
使用所述虛擬機(jī)來執(zhí)行所述控制程序;
只要滿足義務(wù),就確定對(duì)所述電子內(nèi)容所請(qǐng)求的訪問或其它使用能夠被授權(quán);
確定所述主機(jī)系統(tǒng)不能滿足所述義務(wù);并且
拒絕對(duì)所述電子內(nèi)容所請(qǐng)求的訪問或其它使用進(jìn)行。
62.一種用于管理對(duì)電子內(nèi)容的訪問或使用的方法,所述方法包括
獲取與所述電子內(nèi)容相關(guān)聯(lián)的控制程序,所述控制程序包括指令,所述指令當(dāng)由數(shù)字權(quán)利管理引擎執(zhí)行時(shí)可操作來評(píng)估第一條件并且當(dāng)確定已經(jīng)滿足所述第一條件時(shí)允許對(duì)所述電子內(nèi)容的第一使用;
從遠(yuǎn)程系統(tǒng)接收代理程序,所述代理程序包括指令,所述指令當(dāng)由數(shù)字權(quán)利管理引擎執(zhí)行時(shí)可操作來把狀態(tài)信息存儲(chǔ)在由所述數(shù)字權(quán)利管理引擎所管理的數(shù)據(jù)庫中;并且
執(zhí)行所述控制程序,包括確定是否已經(jīng)滿足第一條件,所述確定至少部分地基于所述狀態(tài)信息。
63.如權(quán)利要求62所述的方法,其中在數(shù)據(jù)庫中所存儲(chǔ)的狀態(tài)信息包括可以對(duì)所述電子內(nèi)容進(jìn)行第一使用的次數(shù)計(jì)數(shù)的初始值。
64.如權(quán)利要求62所述的方法,進(jìn)一步包括
允許對(duì)所述電子內(nèi)容的第一使用;并且
減少所述計(jì)數(shù)的當(dāng)前值。
65.如權(quán)利要求62所述的方法,其中從鏈路對(duì)象獲得所述控制程序,所述鏈路對(duì)象形成從第一節(jié)點(diǎn)到第二節(jié)點(diǎn)的授權(quán)圖的一部分。
66.如權(quán)利要求65所述的方法,其中所述第一條件包括所述鏈路對(duì)象應(yīng)該有效的要求。
67.如權(quán)利要求65所述的方法,其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示所述計(jì)算設(shè)備的用戶。
68.如權(quán)利要求65所述的方法,其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示預(yù)訂服務(wù)。
69.如權(quán)利要求68所述的方法,其中從所述預(yù)訂服務(wù)的操作者接收所述代理程序。
70.如權(quán)利要求65所述的方法,其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示家庭網(wǎng)絡(luò)域。
71.一種用于管理對(duì)電子內(nèi)容的訪問或使用的系統(tǒng),所述系統(tǒng)包括
用于獲取與所述電子內(nèi)容相關(guān)聯(lián)的控制程序的裝置,所述控制程序包括指令,所述指令當(dāng)由數(shù)字權(quán)利管理引擎執(zhí)行時(shí)可操作來評(píng)估第一條件并且當(dāng)確定已經(jīng)滿足所述第一條件時(shí)允許對(duì)所述電子內(nèi)容段的第一使用;
用于從遠(yuǎn)程系統(tǒng)接收代理程序的裝置,所述代理程序包括指令,所述指令當(dāng)由數(shù)字權(quán)利管理引擎執(zhí)行時(shí)可操作來把狀態(tài)信息存儲(chǔ)在由所述數(shù)字權(quán)利管理引擎所管理的數(shù)據(jù)庫中;和
用于執(zhí)行所述控制程序的裝置,包括確定是否已經(jīng)滿足第一條件,所述確定至少部分地基于所述狀態(tài)信息。
72.如權(quán)利要求71所述的系統(tǒng),其中在數(shù)據(jù)庫中所存儲(chǔ)的狀態(tài)信息包括可以對(duì)所述電子內(nèi)容進(jìn)行第一使用的次數(shù)計(jì)數(shù)的初始值。
73.如權(quán)利要求71所述的系統(tǒng),進(jìn)一步包括
用于允許對(duì)所述電子內(nèi)容段進(jìn)行第一使用的裝置;和
用于減少所述計(jì)數(shù)的當(dāng)前值的裝置。
74.如權(quán)利要求71所述的系統(tǒng),其中從鏈路對(duì)象獲得所述控制程序,所述鏈路對(duì)象形成從第一節(jié)點(diǎn)到第二節(jié)點(diǎn)的授權(quán)圖的一部分。
75.如權(quán)利要求74所述的系統(tǒng),其中所述第一條件包括所述鏈路對(duì)象應(yīng)該有效的要求。
76.如權(quán)利要求74所述的系統(tǒng),其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示所述計(jì)算設(shè)備的用戶。
77.如權(quán)利要求74所述的系統(tǒng),其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示預(yù)訂服務(wù)。
78.如權(quán)利要求77所述的系統(tǒng),其中從所述預(yù)訂服務(wù)的操作者接收所述代理程序。
79.如權(quán)利要求74所述的系統(tǒng),其中所述第一節(jié)點(diǎn)表示計(jì)算設(shè)備并且所述第二節(jié)點(diǎn)表示家庭網(wǎng)絡(luò)域。
80.一種用于管理企業(yè)文檔的方法,所述方法包括
使用第一軟件應(yīng)用來創(chuàng)作電子文檔;
使用數(shù)字權(quán)利管理插件來加密所述文檔并且把許可與之相關(guān)聯(lián),所述許可包括控制程序,為了獲得對(duì)所述文檔的訪問權(quán),所述控制程序需要占有一組一個(gè)或多個(gè)鏈路對(duì)象,所述鏈路對(duì)象在邏輯上把與第一設(shè)備相關(guān)聯(lián)的節(jié)點(diǎn)連接到與第一用戶組相關(guān)聯(lián)的節(jié)點(diǎn),所述許可進(jìn)一步包括可操作來解密所述文檔的第一密鑰的加密版本;
向遠(yuǎn)程計(jì)算機(jī)系統(tǒng)發(fā)送所述文檔;
確定所述遠(yuǎn)程計(jì)算機(jī)系統(tǒng)占有一組一個(gè)或多個(gè)鏈路對(duì)象,所述鏈路對(duì)象在邏輯上把所述遠(yuǎn)程計(jì)算機(jī)系統(tǒng)連接到與所述用戶組相關(guān)聯(lián)的節(jié)點(diǎn),其中所述一個(gè)或多個(gè)鏈路之一包括可操作來解密所述第一密鑰的第二密鑰的加密版本;
當(dāng)完成確定步驟時(shí),使用與所述遠(yuǎn)程計(jì)算機(jī)系統(tǒng)相關(guān)聯(lián)的密鑰來解密所述第二密鑰;
使用所述第二密鑰來解密所述第一密鑰;并且
使用所述第一密鑰來解密所述文檔。
81.如權(quán)利要求80所述的方法,其中使用數(shù)字權(quán)利管理插件的步驟進(jìn)一步包括
從一組一個(gè)或多個(gè)模板中選擇第一模板,所述一個(gè)或多個(gè)模板表達(dá)能夠強(qiáng)加于對(duì)電子文檔的訪問的策略條件;其中所述數(shù)字權(quán)利管理插件可操作來把由所述模板所表達(dá)的策略條件轉(zhuǎn)換為可由數(shù)字權(quán)利管理插件執(zhí)行的控制程序。
82.如權(quán)利要求81所述的方法,其中所述數(shù)字權(quán)利管理插件進(jìn)一步可操作來創(chuàng)建把所述控制程序與所述第一密鑰安全地綁定的控制器對(duì)象。
83.如權(quán)利要求82所述的方法,其中所述控制器對(duì)象包括內(nèi)容密鑰對(duì)象的散列和控制對(duì)象的散列,其中所述內(nèi)容密鑰對(duì)象包括所述第一密鑰的加密版本,并且所述控制對(duì)象包括所述控制程序。
84.如權(quán)利要求83所述的方法,其中使用所述第一密鑰利用HMAC來簽名所述控制器對(duì)象。
85.如權(quán)利要求84所述的方法,其中利用電子文檔的作者的公鑰簽名來簽名所述控制器對(duì)象。
86.如權(quán)利要求85所述的方法,其中使用所述第一密鑰利用HMAC來簽名所述公鑰簽名。
全文摘要
描述了用于執(zhí)行數(shù)字權(quán)利管理的系統(tǒng)和方法。在一個(gè)實(shí)施例中,提供了一種數(shù)字權(quán)利管理引擎,用于評(píng)估與受保護(hù)的內(nèi)容相關(guān)聯(lián)的許可以確定對(duì)所述內(nèi)容所請(qǐng)求的訪問或其它使用是否被授權(quán)。在一些實(shí)施例中,許可包含可由數(shù)字權(quán)利管理引擎執(zhí)行的控制程序。
文檔編號(hào)G06F21/00GK101490686SQ200680047769
公開日2009年7月22日 申請(qǐng)日期2006年10月18日 優(yōu)先權(quán)日2005年10月18日
發(fā)明者G·博康-吉博, J·G·博夫, M·G·梅嫩特, W·B·布拉德利 申請(qǐng)人:英特托拉斯技術(shù)公司