数字权利管理的方法

文档序号:6570097阅读:963来源:国知局
专利名称:数字权利管理的方法
本申请要求了于2005年10月18日提交的美国临时申请号60/728,089、于2006年2月9日提交的美国临时申请号60/772,024、于2006年4月10日提交的美国临时申请号60/744,574、于2006年4月10日提交的美国临时申请号60/791,179、于2006年5月8日提交的美国临时申请号60/746,712、于2006年5月8日提交的美国临时申请号60/798,925和于2006年8月1日提交的美国临时申请号60/835,061的优先权益。这里将美国临时申请号60/728,089、60/772,024、60/744,574、60/791,179、60/746,712、60/798,925和60/835,061全部引用以用于任何目的。
版权许可
本专利文档的公开内容的部分包含受版权保护的材料。版权所有者不反对任何人对本专利文献或专利公开内容的影印复制,由于它已经出现在美国专利商标局的专利文档或记录中,但是在其它方面却无论如何都保留所有版权。
技术背景或相关信息 在现代计算系统中,人们常常希望限制对电子内容、服务和/或处理资源的访问和/或只允许某些实体执行某些动作。已经开发或提出各种技术来实现这种控制。这些技术常常被称为数字权利管理(digital rightsmanagement DRM)技术,这是因为一般地说,它们的目标在于在数字或其它电子内容、服务或资源方面管理各实体的权利。许多现有技术的问题在于它们过于复杂、受限制、相对不那么灵活,不能实现某些自然类型的关系和处理,和/或不能与其它DRM系统共同使用。
这里描述了与改进的DRM技术相关的系统和方法,所述系统和方法可以用来改进这些问题中的一些或全部。应当理解,目前描述的所发明工作体的实施例可以依照多种方式来实现,包括作为程序、设备、系统、装置、方法、计算机可读介质和/或其组合来实现。
用于控制对内容访问的现有系统包括用于结合对电子内容访问的授权来访问许可的组件。然而,这种组件通常对与许可相关联的权利管理信息的链或图、链路或节点执行不太灵活的评估。它们常常不能适于完全不同的授权方案和/或常常不能与某些DRM系统一起操作来授权对内容的访问。本发明的实施例通过与许可相关联地存储、利用和/或执行附加例程或控制程序来克服这种缺点,其可以提供动态授权特征,启用分布式授权资源和/或另外使访问功能流水线化。
此外,许多现有系统只针对其中维持简单的与授权/状态相关的数据的情况。这些系统没能解决其中访问授权可能要求关于多个数据层的相关性的情况,诸如根据先前导出的与其它节点相关联的数据来确定条件。本发明的实施例通过结合DRM控制程序实现状态数据库来提供状态存储特征以克服这些缺点,所述状态存储特征是安全的,提供从调用到调用的持久状态信息,或另外启用状态读取和写入功能,所述状态读取和写入功能改进了控制程序的执行和/或执行更高效的访问授权。
另外的现有系统可以实现DRM许可或结构,其包括涉及使用公钥来保护许可组件的组件。然而,与这些系统相关的缺点包括这样的可能性黑客可以伪造访问或实施许可或另外利用存在于DRM许可结构中相关联的相互关系所要求的数字签名。本发明的一个或多个实施例通过实施许可对象的数字和/或联锁签名来克服这种缺点,包括使用特定的受保护的密钥。这些实施例的优点包括通过公钥以及从许可元项的相互关系导出的关联特征来防止未授权的访问。
其它现有系统可以包括用于在第一实体和第二实体之间诸如在两个权利管理实体之间进行邻近度(proximity)确定的组件。这种系统可以强制执行规则,该规则表明例如通过执行麻烦的邻近度检查过程,而使受保护的内容无法被拷贝到某一环境之外。然而,这些系统的缺点在于它们还不能在不过于妨碍执行邻近度检查本身的情况下向受保护的内容提供安全性保护。本发明的实施例通过提供经由与传输随机数和/或秘密种子相关的特征来实现可靠的简洁的邻近度检测协议来克服这些及其它缺点。一个或多个实施例的相关联优点包括攻击者在密码上不可能确定正确的响应,即便已经拦截了请求也是如此。
总之,需要一种可以不依靠过于复杂的、受限制的和/或相对不灵活的技术来充分授权对电子内容的访问的系统,能够启用某些自然类型的关系和过程的系统,和/或可与其它DRM系统一起操作的系统。


发明内容
按照本发明的系统、方法和制造产品针对电子内容的授权访问以及与所述电子内容相关联的数据处理。
在一个示例性实施例中,提供了一种用于授权访问在存储器中所存储的电子内容的方法。此示例性实施例的方法可以包括接收用于访问电子内容的请求,获取(retrieve)与所述电子内容相关联的许可,并且使用数字权利管理引擎来执行第一控制程序以便确定所述请求是否可以被准许。其它示例性实施例可以包括评估在存储器中所存储的一个或多个链路对象并且执行第二控制程序以便确定所述链路是否有效和/或一个或多个条件是否被满足。
应当理解,以上一般描述以及以下详细描述只是示例性的和解释性的,而并非是限制所描述的本发明。除这里所阐明的那些特征和/或变化之外,还可以提供进一步的特征和/或变化。例如,本发明可以针对所公开特征的各种组合和子组合和/或下面在详细描述中所公开的几个进一步特征的组合和子组合。



结合附图参照以下详细描述可以容易地理解本发明的发明主体,其中 图1示出了用于管理电子内容的使用的说明性系统。
图2示出了可以用来实施所发明工作主体的实施例的系统的更详细例子。
图3示出了说明性的数字权利管理(DRM)引擎在使用DRM的网络中可以怎样起作用。
图4示出了用于对DRM系统中的关系进行建模的节点和链路的集合。
图5是用于图示DRM引擎的实施例可以怎样确定所请求的动作是否被授权的流程图。
图6依照所发明的工作主体的一个实施例示出了DRM许可的例子。
图7A和7B图示了在一个实施例中代理的使用。
图8示出了DRM许可的例子。
图9是DRM引擎可以怎样确定所请求的动作是否被授权的更详细的例子。
图10是DRM引擎怎样在一个实施例对象中执行控制程序的更详细的例子。
图11示出了在设备上运行的DRM引擎的说明性实施例。
图12是用于图示在一个实施例中执行控制程序中所涉及的步骤的流程图。
图13示出了在一个实施例中构成内容消费客户端应用的元项。
图14示出了在一个实施例中构成内容封装(packaging)应用的元项。
图15示出了依照一个实施例的密钥推导机制。
图16示出了DRM系统的例子。
图17示出了用于规定临时登录的DRM系统的例子。
图18示出了用于管理企业文档的说明性系统的高级体系结构。
图19示出了诸如在图18中所示出的系统可以怎样用来管理对文档的访问或其它使用的例子。
图20示出了诸如在图18中所示出的系统可以怎样用来管理对文档的访问或其它使用的附加例子。
图21示出了在图20中所示出的例子的附加特征。
图22示出了用于管理企业内的电子内容的另一说明性系统。
图23图示了可以怎样应用这里所描述的系统和方法来管理保健记录。
图24是在电子预订服务的情境中可以怎样使用这里所给出的系统和方法的图解。
图25是在家庭网络域的情境中可以怎样使用这里所描述的系统和方法的图解。
图26图示了在一个示例性实施例中在主机应用和DRM客户端引擎之间发生的交互。
图27图示了在一个说明性实施例中在主机应用和封装引擎之间发生的交互。
图28A是依照一个实施例的许可的更详细的图解。
图28B图示了在一个示例性实施例中在链路和节点之间的关系。
图29图示了虚拟机的说明性实现的运行环境。
图30图示了依照一个实施例的扩展状态块数据结构。
图31A示出了在一个实施例中的数据段的存储器映像。
图31B示出了在一个实施例中的代码段的存储器映像的例子。
图31C示出了在一个实施例中的输出入口存储器映像的例子。
图31D示出了在一个实施例中的输出表入口的通用例子。
图31E示出了用于示例性入口点(entry point)的输出表入口的例子。
图32示出了许可转送协议的例子。
图33示出了依照一个实施例的许可转送协议的另一例子。
图34示出了用于在一个实施例中保护许可对象的完整性的机制。
图35示出了用于在另一实施例中保护许可对象的完整性的机制。
图36图示了依照一个实施例的邻近度检查协议。
图37图示了依照一个实施例的邻近度检查协议的使用。
图38图示了在一个实施例中在客户端和许可服务器之间的交互。
图39是在一个实施例中在客户端和许可服务器之间交互的更详细图解。
图40示出了具有多个角色的实体的例子。
图41图示了依照一个实施例的引导(bootstrap)协议。
图42示出了在一个实施例中在c14n-ex和说明性XML规范化之间的关系。

具体实施例方式 下面提供了所发明工作主体的详细描述。虽然描述了几个实施例,然而应当理解,所发明的工作主体不限于任何一个实施例,而是作为替代包含很多替换、修改和等效方式。另外,虽然在下面描述中阐明了很多具体细节以便提供对所发明工作主体的彻底理解,不过可以在没有这些细节中的一些或全部的情况下实现一些实施例。此外,为了清楚目的,并未详细描述在相关技术中已知的某些技术材料,以免不必要地模糊所发明的工作主体。
共同受让的美国专利申请号10/863,551、公开号2005/0027871 A1(“‘551申请”)描述了数字权利管理(DRM)体系结构和新颖DRM引擎的实施例,其克服了许多先前DRM实现方式所体现的一些弱点,在此通过引用加以结合以供参考。本申请描述了对在‘551申请中所描述的体系结构和DRM引擎的增强、扩充和修改以及可替换实施例,并且还描述了新的组件、体系结构和实施例。从而应当理解,可以在诸如‘551申请中所描述的体系结构和/或DRM引擎的情境内以及在其它情境内使用这里所描述的材料。
1.示例性DRM系统 图1示出了用于管理电子内容的说明性系统100。如图1所示,用于保持电子内容103中权利的实体102封装内容以供分发和最终用户108a-e消费(被一起称作“最终用户108”,其中附图标记108可交换地指代最终用户或最终用户的计算系统,这在本文情境下将是清楚的)。例如,实体102可以包括内容所有者、创建者或供应者,诸如音乐家、电影工作室、出版社、软件公司、作者、移动服务供应者、因特网内容下载或预订服务、电缆或卫星电视供应者、公司雇员等或者代表其活动的实体,并且内容103可以包括任何电子内容,诸如数字视频、音频或文本内容,电影、歌曲、视频游戏、软件、电子邮件消息、文本消息、字处理文档、报道或任何其它娱乐、企业或其它内容。
在图1所示出的例子中,实体102使用封装引擎109来使许可106与所封装的内容104相关联。许可106是基于实体102的策略105或其它意愿的,并且指定允许和/或禁止使用内容和/或一个或多个条件,为了利用内容,所述一个或多个条件必须被满足,或者所述一个或多个条件作为使用条件或结果必须被满足。所述内容还可以由诸如加密或数字签名技术之类的一个或多个密码机制来保证安全,为此可以使用信任权威机构110来获得适当的密码密钥、证书等。
如图1所示,可以借助任何适当的手段来向最终用户108提供封装的内容104和许可106,诸如经由像因特网的网络112、局域网103、无线网络、虚拟专用网络107、广域网等,经由电缆、卫星、广播或蜂窝式通信114,和/或经由诸如压缩光盘(CD)、数字多功能盘(DVD)、快闪存储卡(例如,安全数字(SD)卡)之类的可记录介质116等。封装的内容104可以连同许可106一起以单个封包或传输113中或以从相同或不同源所接收的独立封包或传输中被递送给用户。
最终用户的系统(例如,个人计算机108e,移动电话108a,电视和/或电视机顶盒108c,便携式音频和/或视频播放器,电子书阅读器等)包含应用软件116、硬件和/或专用逻辑单元,专用逻辑单元可操作来获取并再现所述内容。用户的系统还包括这里被称作为数字权利管理引擎118的软件和/或硬件,用于评估与所封装的内容104相关联的许可106并且强制执行它的条款(和/或使应用116能够强制执行这种条款),诸如通过有选择地准许用户只有当被许可106允许时才能访问所述内容来实现。数字权利管理引擎118可以在结构上或功能上与应用116集成,或者可以包括独立的软件和/或硬件。作为选择或另外,诸如系统108c之类的用户的系统可以与诸如系统108b之类的远程系统(例如,服务器,用户设备网络中的另一设备,诸如个人计算机或电视机顶盒等)通信,所述远程系统使用数字权利管理引擎来确定120是否准许用户访问该用户先前所获得或请求的内容。
数字权利管理引擎和/或用户系统上或与其远程通信的其它软件还可以记录关于用户对受保护内容的访问或其它使用的信息。在一些实施例中,此信息中的一些或全部可以被传送到远程方(例如,交换所(clearinghouse)122,内容创建者,所有者或供应者102,用户管理者,代表其活动的实体等),例如以用于分配收益(诸如使用费,基于广告的收益等)、确定用户偏好、强制系统策略(例如,监视怎样以及何时使用机密信息)等。应当理解,虽然图1示出了说明性的DRM体系结构和一组说明性关系,但是可以在任何适当的情境中实施这里所描述的系统和方法,并且从而应当理解,图1是用于图示和解释目的而不是限制目的。
图2示出了可以用来实施本发明工作主体的实施例的系统200的更详细的例子。例如,系统200可以包括最终用户的设备108、内容供应者的设备109等的实施例。例如,系统200可以包括诸如个人计算机108e或网络服务器105之类的通用计算设备或诸如蜂窝式电话108a、个人数字助理、便携式音频或视频播放器、电视机顶盒、信息亭、游戏系统等专门计算设备。系统200一般包括处理器202、存储器204、用户接口206、用于接受可拆卸存储器208的端口207、网络接口210和用于连接上述元件的一个或多个总线212。系统200的操作一般由在存储器204中所存储的程序指导下操作的处理器202来控制。存储器204通常包括高速随机存取存储器(RAM)和非易失性存储器,诸如磁盘和/或闪速EEPROM。存储器204的某些部分可以被限制,以致它们无法被系统200的其它组件读取或写入。端口207可以包括用于接受计算机可读介质208的盘驱动器或存储器插槽,所述计算机可读介质208诸如软盘、CD-ROM、DVD、存储卡、SD卡、其它磁或光介质等。网络接口210一般可操作来经由诸如因特网或内部网(例如,LAN,WAN,VPN等)之类的网络220来在系统200及其它计算设备(和/或计算设备网络)之间提供连接,并且可以使用一种或多种通信技术来在物理上进行这种连接(例如,无线,以太网等)。在一些实施例中,系统200还可以包括处理单元203,所述处理单元203受到保护以避免被系统200的用户或其它实体篡改。这种安全的处理单元可以帮助增强诸如密钥管理、签名验证之类的敏感操作以及数字权利管理过程的其它方面的安全性。
如图2所示,计算设备200的存储器204可以包括用于控制计算设备200操作的各种程序或模块。例如,存储器204一般包括用于管理应用、外围装置等执行的操作系统220;用于再现受保护的电子内容的主机应用230;和用于执行这里所描述权利管理功能中的一些或全部的DRM引擎232。如在此的其它地方所描述,DRM引擎232可以包括、与之相互操作和/或控制各种其它模块,诸如用于执行控制程序的虚拟机222,和用于存储状态信息以供虚拟机222使用的状态数据库224,和/或用于执行密码运算(诸如加密和/或解密内容、计算散列函数和消息认证代码、评估数字签名等)的一个或多个密码模块226。存储器204一般还包括受保护的内容228和相关联的许可229以及密码密钥、证书等(未示出)。
一个本领域普通技术人员应当理解,这里所描述的系统和方法可以利用与图2中所图示的类似或完全相同的计算设备或实际上任何其它适当的计算设备来实施,包括不拥有在图2中所示出的一些组件的计算设备和/或拥有未示出的其它组件的计算设备。从而应当理解,图2只用于图示而并非是限制目的。
这里描述了数字权利管理引擎和相关的系统和方法,其可以用来提供在图1和2中所示出的那些系统或其它类型系统中的权利管理功能中的一些或全部。另外,下面将描述各种其它系统和方法,其可以用在图1和2中所示出的那些系统情境中以及其它情境中,包括与数字权利管理无关的环境。
2.DRM引擎体系结构 在一个实施例中,使用相对简单、开放和灵活的数字权利管理(DRM)引擎来执行核心DRM功能。在优选实施例中,此DRM引擎被设计成用于相对容易地集成到诸如在‘551申请中所描述的web网络服务环境中,以及集成到可能的任何主机环境或软件体系结构中。在优选实施例中,DRM引擎与特定的媒体格式和密码协议无关,允许设计者按照特定情况的要求来灵活地使用标准化或专有技术。由DRM引擎的优选实施例所使用的管理支配(governance)模型是简单的,但是该模型可以用来表达良好的关系和业务模型。
下述DRM引擎的一些说明性实施例涉及被称为“章鱼(Octopus)”的示例性实现方式;然而应当理解,本发明并不限于章鱼例子的具体细节,并且仅用于说明而并非限制性目的。
1.1.概述 图3示出了说明性的DRM引擎303a在使用DRM的系统302中可以怎样来起作用。如图3所示,在一个实施例中,DRM引擎303a被嵌入或集成到主机应用304a(例如,诸如音频和/或视频播放器之类的内容再现应用,诸如电子邮件程序、文字处理器、电子书读取器或文件阅读器等文本再现应用)内或与之通信。在一个实施例中,DRM引擎303a执行DRM功能并且对于诸如加密、解密、文件管理之类的服务依赖主机应用304a,和/或可以由主机来更有效地提供其它功能。例如,在优选实施例中,DRM引擎303a可操作来操纵DRM对象305,所述DRM对象305包括受保护内容308的许可306。在一些实施例中,DRM引擎303a还可以向主机应用304a递送密钥。如图3所示,DRM引擎303a和主机应用304a中的一个或两个可以利用要处理的web网络服务305a和/或主机服务306a和/或为完成它们各自的任务所需要的信息。‘551申请提供了这种服务的例子以及其中DRM引擎303a和主机应用304a可以相互操作的方式。
在图3所示出的例子中,DRM引擎303a、主机应用304a、主机服务306a和web网络服务接口305a被加载到诸如最终用户的个人计算机(PC)之类的设备300a上。设备300a可通信地耦合到服务器300b以及便携式设备300d,其中从所述服务器300b获得内容308和许可306,并且设备300a可以向便携式设备300d转发内容308和/或许可306。这些其它设备中的每个可以包括与DRM引擎300a类似或完全相同的DRM引擎303,其可以与所述设备的特定主机应用和主机环境相集成。例如,服务器300b可以包括主机应用304b,用于执行成批封装内容和/或许可,并且利用DRM引擎300a来评估与正被封装的内容相关联的控制,以便与任何重新分发的限制相一致。类似地,设备300c可以包括能够再现并封装内容的主机应用304c,而设备300a可以包括只能再现内容的主机应用。作为潜在的主机环境多样性的又一例子,设备300d可以不包括web网络服务接口,但是作为替代可以依赖于与设备300a的通信和web网络服务接口305a,以达到这样的程度主机应用304d和/或DRM引擎303d需要使用任何web网络服务。图3只是其中可以使用DRM引擎的系统的一个例子;应当理解,这里所描述的DRM引擎的实施例可以依照许多不同的方式执行并且与应用和系统集成,并且不限于在图3中所示出的说明性例子。
1.2.对象 在优选实施例中,内容保护和管理支配对象用来表示系统中的实体、保护内容、使使用规则与内容相关联并且确定当请求时访问是否被准许。
如下面所更详细地描述,在一个实施例中使用以下对象
1.2.1.节点对象 节点对象用来表示系统中的实体。在实践中,节点通常表示用户、设备或组。节点对象一般还具有相关联的属性,所述相关联的属性表示与节点相关联的实体的某些特性。
例如,图4示出了两个用户(Xan 400和Knox 402)、两个设备(PC404和便携式设备406)和用于表示组(例如,凯里家庭的成员408、公共图书馆的成员410、特定音乐服务的订户412、RIAA批准的设备414以及特定公司所制造的设备416)的几个实体,每一个都具有相关联的节点对象。
在一个实施例中,节点对象包括用于定义该节点用来表示什么的属性。属性的一个例子是节点类型。除表示用户、组或设备之外,节点类型属性可以用来表示其它实体。在一些实施例中,节点对象还可以包括密码密钥信息,诸如当使用别处描述的密钥推导和分发技术的实施例时的密码密钥信息。
在一些实施例中,节点对象还包括保密性的非对称密钥对,用于把机密信息目标定为有权访问所述节点对象的机密部分的子系统。这可以是节点所表示的实体(例如,音乐服务412)或负责管理所述节点的某个实体(例如,最终用户(例如,Knox 402)可以负责管理他或她的便携式设备406)。
1.2.2.链路对象 在优选实施例中,链路对象是用于示出在两个节点之间关系的签名的(signed)的对象。例如,在图4中,从PC节点404到Knox 402的链路418示出了所有权。从Knox 402到凯里家庭节点408的链路示出了成员资格,从所述Carey家庭节点408到音乐服务订户节点412的链路也是这样。在一个实施例中,链路对象表达在两个节点之间的关系,从而在图4中所示出的关系可以使用十个链路来表示。
如图4所示,图420可以用来表达在节点之间的关系,其中链路对象是在节点之间的有向边。例如在图4中,在凯里家庭节点408和音乐服务节点412之间的关系断言在该图中存在其顶点为凯里家庭节点408和音乐服务节点412的有向边422。Knox 402和Xan 400是凯里家庭408的成员。因为Knox 402被链接到凯里家庭408并且所述凯里家庭408被链接到音乐服务412,所以认为在Knox 402和音乐服务412之间存在路径。当存在从一个节点到其它节点的路径时,DRM引擎认为该节点可从另一节点到达。这允许写入控制,用于允许根据节点可从其中正执行用于请求访问受保护内容的应用的设备到达的条件来许可访问受保护的内容。
如下面所更详细地描述,链路对象选择性地还可以包含用于允许推导内容密钥的一些密码数据。链路对象还可以包含用于定义所述链路可以被认为有效的条件的控制程序。这种控制程序可以被DRM引擎的虚拟机执行或解释(这里这些术语可交换地使用)以便评估链路的有效性(例如,以便确定所述链路是否可以用来到达授权图中的给定节点)。
在一个实施例中,链路被签名。可以使用任何适当的数字签名机制,并且在一个实施例中DRM引擎没有定义链路对象怎样被签名并且没有评估任何相关联的证书,作为替代它依赖主机系统来验证任何这种签名和/或证书。这允许系统设计者或管理员定义链路对象的使用期、撤消它等(例如,通过使用期满密钥或证书、撤销等),从而在特定的受保护内容和/链路的情境下在通过DRM引擎评估控制程序和DRM对象所提供的策略管理和安全性之上提供了附加的策略管理和安全性层(例如,链路期满作为选择或另外可以通过在链路对象本身中包括适当的控制程序来实现,所述控制程序当执行时会强制实施期满日期或其它有效期)。在一个实施例中,DRM引擎是通用的,并且与任何适当的加密、数字签名、撤销和/或由主机应用和/或环境所使用的其它安全机制一起工作。从而,例如如果DRM引擎需要确定特定链路是否已经被适当的签名,那么它可以简单地调用主机应用(和/或主机或系统密码服务)以便依照由系统设计者所选择的特定签名方案来验证所述签名,DRM引擎本身可以不知道所述方案的细节。在其它实施例中,DRM引擎本身依赖主机简单地表明所使用的适当签名算法,来执行实际的签名评估。
1.2.3.内容保护和管理支配 再次参照图3,在典型的方案中,内容供应者300b使用应用304b,所述应用304b包括用于加密或用密码来保护电子内容308的封装引擎,并且所述内容供应者300b创建用于管理支配对该内容的访问或其它使用的许可306。在一个实施例中,许可308包括用于指定可以怎样使用内容308的一组对象305,并且还包括内容的加密密钥和/或为获得它们所需要的信息。在一个实施例中,内容308和许可306在逻辑上是独立的,但是通过内部引用(例如,使用对象ID310)被绑定在一起。在许多情况中,把内容和许可一起存储和/或一起递送可能是方便的;然而在优选实施例中并不要求这样。在一个实施例中,许可可以应用于一个以上的内容项,并且一个以上许可可以应用于任何单个的内容项。
如图3所示,当在客户端设备300a上运行的主机应用304a想要对特定的内容308执行动作时,它请求DRM引擎303a检查它旨在执行的动作(例如“播放”)是否被允许。在一个实施例中,DRM引擎303a从在包括内容许可306的对象305中所包含的信息中加载并执行与内容308相关联的控制程序,并且根据所述控制程序所返回的结果来准许或拒绝用于执行该动作的权限。权限一般要求满足一些条件,诸如节点可从用于表示请求实体/设备300a的节点到达的条件。
图5是用于图示DRM引擎的实施例可以怎样确定所请求的动作(例如,观看内容)是否被授权的流程图。如图5所示,接收用于评估对给定动作的许可的请求(500)。例如,在主机从用户接收用于执行所指定动作的请求之后,可以从主机应用接收此请求。如图5所示,DRM引擎评估所指定的许可(502),并且确定所请求的动作是否被授权(504)。例如,所述许可可以包含DRM引擎执行的控制程序,其输出用来进行授权判定。如果许可授权所请求的动作(即,从块504“是”退出),那么DRM引擎向主机应用表明所述请求被准许(506)。否则,DRM引擎向主机应用表明所述请求被拒绝(508)。在一些实施例中,DRM引擎还可以向主机应用返回各种元数据,所述元数据例如用于把条件与准许授权相关联(例如,义务(obligation)和/或回调(callback)),或者提供关于拒绝授权原因的附加信息。例如,DRM引擎可以表明只有主机应用记录关于所请求动作执行的某些信息才允许所请求的动作,或者只要所述主机应用以预定义的时间间隔回调DRM引擎以便例如重新评估许可,才允许所请求的动作。下面提供了由DRM引擎所返回的关于这种义务、回调的附加信息及其它元数据。如果所请求的动作被授权,那么内容密钥将被(例如,从许可的内容密钥对象中)获取,并且用来就所请求的使用而发布所述内容。
1.2.4.许可DRM对象 如图6所示,在优选实施例中,许可600是对象集合。在图6所示出的例子中,许可600包括内容密钥对象602、保护器对象604、控制器对象606和控制对象608。如图6所示,内容密钥对象602包括加密的密钥数据610(例如,为解密所加密的内容项612所需要的密钥的加密版本)和关于用于加密所述密钥数据的密码系统的信息。保护器对象604把内容密钥对象602绑定到一个或多个内容对象614。如图6所示,控制对象608包括并保护用于指定怎样管理支配内容对象614的控制程序616。在优选实施例中,控制程序616是在由DRM引擎所操作的虚拟机上运行的可执行字节代码。控制程序通过检查是否满足在所述控制程序中所指定的条件来管理支配是否可以对所述内容执行某些动作,所述条件诸如某些节点是否可使用有效链路对象到达,某些状态对象是否已经被存储,主机环境是否具有某些特征等。再次参照图6,控制器对象606用来把一个或多个内容密钥对象602绑定到控制对象608。
许可600还可以包括另外的对象,诸如用于提供所述许可所要求的内容访问条件的机器或人类可读描述的元数据。作为选择或另外,可以包括这种元数据作为一个其它对象(例如,控制对象608)的资源扩展。在图6所示出的实施例中,控制对象608和控制器对象606都被签名,使得该系统可以在使用控制信息来进行内容访问判定之前来验证所述控制信息是否来自信任源。在一个实施例中,还可以通过验证在控制器对象606中所包括的安全散列来检查控制对象608的有效性。控制器对象606还可以包含在它引用的内容密钥对象602中包含的每个密钥或其它密钥数据的散列值,由此使攻击者篡改在密钥数据和内容密钥对象之间的绑定变得相对困难。
如图6所示,在一个实施例中,内容612被加密并且包括在内容对象614中。所使用的解密密钥被包括在内容密钥对象602内(或由其引用),并且在这两者之间的绑定由保护器对象604来表示。如图6所示,唯一的ID用来使在内容对象614和内容密钥对象602之间的绑定便于进行。用于管理支配使用密钥610来解密内容612的规则包括在控制对象608内,并且在控制对象608和内容密钥602之间的绑定由控制器对象606再次使用唯一的ID来表示。
应当理解,虽然图6示出了在一个优选实施例中包括许可的对象,不过这里所描述的DRM系统和方法不限于此许可结构的使用。例如而并非限制,可以使用许可,其中在图6中所示出的各个对象的功能依照不同的方式可以被组合到少量对象中,或传播到另外的对象上,或者在对象之间分散。作为选择或另外,可以利用许可来实施这里所描述的系统和方法的实施例,所述许可缺乏由在图6中所示出的许可结构具有的一些功能,和/或提供另外的功能。从而应当理解,依照这里所描述的原理可以使用用于使许可与内容相关联的任何适当机制,不过在优选实施例中使用在图6中所示出的有益结构。
1.3.状态数据库 在一个实施例中,DRM引擎包括或有权访问可以用来提供安全状态存储机制的安全持久的对象存储装置。这种机构对于使控制程序能够读取和写入从调用到调用是持久的状态信息来说是有用的。这种状态数据库可以用来存储状态对象以及会员资格状态和/或任何其它适当的数据,所述状态对象诸如播放计数、首次使用日期、累积的再现时间等。在一些实施例中,在第一系统上执行的DRM引擎可能不具有访问本地状态数据库的权利,并且可操作来例如使用web网络和/或主机服务来访问远程状态数据库。在一些情况中,在第一系统上执行的DRM引擎可能必须访问在远程系统上的数据库中所存储的状态信息。例如,第一系统可能不包括状态数据库,或者可能在其自己的状态数据库中没有它所需要的信息。在一些实施例中,当DRM引擎面临这种情况时,它可以经由服务接口和/或通过使用代理程序来访问远程状态数据库,如下面所更详细地描述。
1.4.关于控制程序 这里所描述的系统和方法在各种情境中利用控制程序。例如,在控制对象中所包含的控制程序可以用来表达用于管理支配使用受保护内容的规则和条件。另外,链路对象中的控制程序可以用来表达用于确定对于给定目的(例如,节点可达性分析)所述链路是否有效的规则和条件。这种控制程序有时这里被称作为链路约束(link constraints)。其中可以使用控制程序的又一情境是在代理或委托对象中,其中控制代码用来代表另一实体(在代理控制程序的情况下)或代表另一控制(在委托控制程序的情况下)执行动作。
在一个实施例中,和直接由物理处理器执行相反,控制程序由为DRM引擎主控的虚拟机来执行或解释。然而应当理解,可以容易地构造物理处理器或其它硬件逻辑单元来执行控制程序。在一个实施例中,控制程序采用字节代码格式,其使跨平台进行的相互操作便于进行。
在优选实施例中,控制程序用汇编语言编写并且被汇编程序转换为字节代码。在其它实施例中,模板和/或高级权利表达式语言可以用来提供权利、规则和/或条件的初始表达式,并且可以使用编译器来把所述高级表达式转换为字节代码以供这里所描述DRM引擎的实施例执行。例如,用专有DRM格式编写的权利表达式可以利用适当的编译器被转换或翻译为在功能上等效的字节代码表达式以供在这里所描述的DRM引擎实施例上执行,从而使受保护的内容能够依照由内容供应者所指定的条件在理解所述专有DRM格式的系统上以及在包括诸如这里所描述的DRM引擎的系统上使用。还应当理解,这里所描述的数字权利管理引擎系统和方法不限于使用由虚拟机所解释的字节代码权利表达式。作为替代在一些实施例中,可以依照任何适当的方式(例如,使用高级权利表达式语言(rights expression language REL)、模板等)来表示权利,并且这里所描述的授权图和/或其它技术使用被设计成用于识别并评估这种权利表达式的应用程序来执行。
1.4.1.条件 如先前所表明,控制程序一般表达为了对内容的使用请求被准许、为了链路被确认为有效等所必须满足的一个或多个条件。取决于内容供应者或系统设计者的要求和/或所述系统所提供的功能,可以使用任何适当的条件。
在优选实施例中,由DRM引擎所使用的虚拟机支持任意复杂的程序,所述程序能够测试诸如以下一些或全部的条件 ●基于时间的条件把客户端时间值与在控制程序中所指定的一个或多个值相比较。
●以特定节点为目标检查某个节点是否可从另一节点到达。此原理提供了对如域、预订、成员资格等这种模型的支持。
●测试某些节点属性是否匹配所指定的值检查节点的任何属性,诸如与节点相关联的设备的再现能力是否满足保真度要求。
●测试在客户端与安全相关的元数据是否是最新的例如检查客户端是否具有可接受版本的客户端软件以及准确的时间量度。在一些实施例中,这种检查例如可以依赖于来自数据证明服务的一个或多个证书中的声明。
●基于状态的条件检查状态数据库中的信息。例如,状态数据库可以包含作为控制程序先前执行的结果所产生的信息和/或令牌,及关于所记录事件和条件的其它信息,所述令牌用于证明预订的所有权、成员资格等,由此使得可以评估涉及计数器的条件(例如,播放次数、输出次数、所过去的时间限制等)。
●环境特性例如,检查主机环境中的硬件和/或软件是否具有某些特征,诸如识别并强制义务的能力;检查诸如安全输出信道之类的某些软件或硬件组件的存在或不存在;检查邻近度信息,诸如请求设备与另一设备或应用的邻近度;使用网络服务和/或代理来检查远程系统和/或在其上所存储数据的特征;等。
使用这些或任何其它适当的条件,控制对象可以表达用于管理支配可以怎样再现、转送、输出等内容的规则。应当理解,以上条件列表实际上是说明性的,而且可以通过例如执行用于测试所想要条件的系统调用来定义并使用任何适当的条件。例如而并非限制,如果希望要求设备位于特定的子网络上,那么可以定义可操作来返回主机设备的IPConfig信息(或远程设备的IPConfig信息,如果使用代理在远程设备上运行系统调用的话)的系统调用(例如,GetIPConfig),其可以由控制程序用来测试所述设备是否位于所规定的子网络上。
1.4.2.代理 这里所描述的DRM引擎相关的系统和方法的优选实施例提供了对携带控制程序的独立对象的支持。这种“代理”可以被分发给在远程系统上运行的DRM引擎以便实现所指定的功能,诸如写入到远程DRM引擎的安全状态存储中。例如,可以作为联系远程服务或执行远程控制程序的结果来发送代理。还可以使用代理来实现内容移动操作、初始化计数器、撤销节点的注册等。作为又一例子,可以使用代理来执行从远程节点到另一节点的可达性分析。这种代理例如在强制实施用于禁止被注册给第一用户的设备再被注册给第二用户的策略方面是有用的。如果第二用户请求注册,那么代理可以被第二用户或者代表他或她活动的注册服务发送到该设备,,以便确定所述设备是否已经被注册到第一用户,在这种情况下第二用户的注册请求可能会被拒绝。
图7A和7B图示了在一个实施例中代理的使用。如图7A所示,假定两个实体——系统A 700和系统B 702——想要彼此经由计算机网络703通信,并且DRM系统正被使用且能够描述并强制实施用于某些操作的规则,诸如访问受保护的内容或创建可以用来表示成员资格、注册状态等的DRM对象。在一些情况下,规则会在系统A 700上被评估,但是规则要求取决于系统B 702的状态的信息。该信息需要被DRM系统704信任,所述DRM系统704在系统A 700上强制实施所述规则。
例如,系统A 700上的DRM系统704可以评估/强制实施用于执行内容从系统A 700到系统B 702的远程再现的规则,并且所述规则可以表明只有当系统B 702是确定设备组的一部分时才允许这种操作,其中借助可在系统B 702上访问的安全状态数据库716中的状态对象711的存在来声明该组中的成员资格。
在优选实施例中用来处理这种情况的方法利用代理。例如,如果系统A 700需要来自系统B 702的信息,那么系统A 700准备代理705,所述代理705在一个实施例中是从系统A 700向系统B 702发送的控制程序(例如,可以由DRM引擎执行的指令序列)。在一个实施例中,系统A 700经由认证的通信信道720向系统B 702发送代理代码705,使得系统A 700可以确信代理705的确是运行在系统B 702上。在一些实施例中,连同代理代码705一起,系统A 700还可以向系统B 702传送可以由代理代码705用来执行其工作的一个或多个参数。
如图7B所示,系统B 702接收代理705和任何相关联的代理参数,并且运行代理代码705。当代理705在系统B 702上运行时,它访问系统B的状态数据库716,获取状态信息711和/或用其执行一个或多个计算,并且把结果713发送回到系统A 700,优选经由认证的通信信道710。在这一点上,系统A 700具有需要用来继续进行其评估的信息。
1.4.3.链路约束 在一个实施例中,用于表示用来管理支配对内容项执行某个操作(诸如“播放”)的规则的例程集被称作“动作控制”。用于表示关于链路对象的有效性约束的例程集被称作“链路约束”。像动作控制一样,在优选实施例中,链路约束可以表达任何适当的条件组合。还像动作控制一样,链路约束可以被本地评估和/或使用服务接口或代理来远程评估。
1.4.4.义务和回调 在一个实施例中,某些动作当被准许时要求来自主机应用的进一步参与。义务表示当使用主机应用请求的内容密钥时或在此之后需要由所述主机应用执行的操作。回调表示对一个或多个控制程序例程的调用,所述控制程序例程当使用主机应用请求的内容密钥时或在此之后需要被主机应用执行。义务的例子包括但不限于当内容正被再现时关闭某些输出和/或控制的要求(例如,以便防止把所述内容写入到不受保护的输出或防止快速转发通过某些重要的内容段);关于内容使用的信息被记录(例如,计量或审计信息)和/或被发送到远程站点(例如,交换所,服务供应商等)的要求;本地或远程执行代理程序的要求;等。回调的例子包括但不限于在某个绝对时间主机向回调用控制程序的要求,在某个消逝的时间(例如,使用内容所消逝的时间)之后,在发生某个事件(例如,完成试用内容再现时段)之后,当已经停止使用内容时等。例如,在某个过去时间之后的回调可以用来增加或减少预算、播放计数等(例如,只是在用户使用一段内容至少达一定量时间才把用户预算记入帐),从而保护用户免得在他或她偶然按压播放按钮但是立即按下停止时就从他或她的帐户中记帐。
在一个实施例中,存在不同类型的义务和回调,并且如果应用遇到它不支持或者不理解的任何关键的义务或回调(例如因为所述义务类型可能在执行应用之后才定义),那么就需要所述应用拒绝继续要为其返回此义务或回调参数的动作。
1.4.5.例子 图8-12示出了DRM引擎的说明性实施例可以怎样控制使用内容的例子。参照图8,假定DRM引擎已经接收用于播放内容项802、804的组800的请求。例如,内容项802、804可以包括从预订服务、电子邮件附件等中获得的不同的内容段、多媒体展示的不同子部分和曲集的不同曲目。所述请求可以由DRM引擎从主机应用接收,所述主机应用随后接收来自计算设备的用户的请求,所述主机应用运行在所述计算设备上。来自主机应用的请求一般标识所请求的动作、要对其采取动作的一个或多个内容以及管理支配所述内容的许可。DRM引擎按照在图5中所图示的过程来确定是否应当准许请求。
图8和9提供了在图5中所示出的过程的更详细的非限制性例子。参照图9,当接收对访问内容项802和804的请求时(块900),DRM引擎检查在所述请求中所标识的或其拥有的许可来看看是否存在有效许可。例如,DRM引擎可以首先标识保护器对象806和808,其包含内容项802和804的唯一标识符(即分别为NS007和NS008)(图9中的块902)。接下来,DRM引擎定位在保护器对象806和808中所标识的内容密钥对象810和812(图9中的块904),所述保护器对象806和808随后使所述DRM引擎能够标识引用内容密钥对象810和812的控制器814(图9中的块906)。在优选实施例中,控制器814被签名,并且DRM引擎验证其签名(或请求主机服务来验证它)。DRM引擎使用控制器814来标识用于管理支配对内容密钥对象810和812(从而内容项802和804)的使用的控制对象816(图9中的块908)。在优选实施例中,DRM引擎验证控制对象816的完整性(例如,通过计算控制对象816的摘要(digest)并且把它与在控制器814中所包含的摘要相比较)。如果完整性验证取得成功,那么DRM引擎执行在控制对象816中所包含的控制代码(块910),并且把结果返回到主机应用(块912),所述主机应用使用它来准许或拒绝用户对访问内容的请求。控制代码的结果还可以选择性地指定主机应用将需要满足的一个或多个义务或回调。
图10是DRM引擎可以怎样执行在图9的块910和912中所指定的动作的更详细例子(即,执行控制程序并且返回结果)。如图10所示,当标识相关的控制对象时,DRM引擎把在控制对象中所包含的字节代码加载到优选由所述DRM引擎主控的虚拟机中(块1000)。DRM引擎和/或虚拟机典型情况下还初始化虚拟机的运行时环境(块1002)。例如,虚拟机可以分配为执行控制程序所需要的存储器、初始化寄存器及其它环境变量,和/或(例如,如下所述通过进行System.Host.GetObject调用)获得关于虚拟机操作的主机环境的信息。应当理解,在一些实施例中,块1000和1002可以被有效地组合或交织,和/或次序颠倒。如图10所示,虚拟机接下来执行控制程序的字节代码(块1004)。这里如其它地方所描述,这可以涉及调用其它虚拟机代码、从安全存储装置获取状态信息等。当控制程序已经完成执行时,它提供输出(例如在优选实施例中为ExtendedStatusBlock),其例如可以由调用应用用来确定请求是否已经被准许,并且如果是的话,确定任何义务或回调是否与其相关联;请求是否已经被拒绝,并且如果是的话,确定拒绝的原因;或者确定在执行期间是否出现任何错误(块1006)。
如先前所表明,在控制对象816中所包含的控制代码指定为了对内容项802和804进行所请求的使用而必须满足的条件或其它要求。这里所描述的系统和方法能够说明任意复杂的条件组;然而为了此例子目的,假定控制程序被设计成要求为了播放内容项802和804,(a)给定用户的节点必须可从对其作出播放内容请求的设备到达,和(b)当前日期必须在所规定日期之后。
图11示出了在设备1102上运行的DRM引擎1100的说明性实施例可以怎样执行上述示例性控制程序,并且图12是在执行过程中所涉及的步骤的流程图。如图11所示,DRM引擎1100(例如,通过调用System.Host.SpawnVm)创建虚拟机执行环境1104并且加载控制程序。虚拟机1104在由DRM引擎1100所指定的入口点(例如,在Control.Actions.Play.perform例程的位置)开始执行控制程序。在此例子中,控制程序需要确定给定节点是否可从其上运行DRM引擎1100的设备1102的个性(personality)节点到达。为了进行此确定,控制程序向DRM引擎1100所提供的链路管理器服务1106作出调用1105,指定要求链接到的节点(图12中的块1200)。链路管理器1106负责评估链路对象来确定一个节点是否可从另一节点到达。为了有效地完成这点,链路管理器1106可以预先计算从设备1102的个性节点1110到在该设备1102所拥有的任何链路对象中所指定的各个节点1114是否存在路径。即,链路管理器1106可以通过检查它有权访问的链路的“去往”和“来自”字段来简单地确定哪些节点潜在地可从设备1102的个性节点1110到达。当链路管理器1106接收来自虚拟机1104的调用1105时,它通过首先确定从个性节点1110到所指定的节点1112是否存在路径(例如,通过检查在它先前确定在理论上可到达的节点的列表中的节点ID)来确定所指定的节点1112是否是可到达的(图12中的块1202)。如果存在路径,那么链路管理器1106评估在链路中所包含的任何控制程序来看看所述链路是否有效(图12中的块1204-1210)。为了评估链路对象中的控制程序(图12中的块1206),链路管理器1106可以使用其自己的虚拟机1108,所述链路管理器1106在其上执行在所述链路对象中所包括的控制程序。链路管理器1106将其确定结果(即,给定节点是否是可到达的)返回到在虚拟机1104中执行的控制程序,其中它被用于全面评估播放内容的请求是否将被准许。当确定所指定的节点1112可从设备1102的个性节点1110到达时,在虚拟机1104上执行的控制程序接下来确定是否满足所指定的日期限制(图12中的块1212)。如果已经满足日期限制(即,从块1212以“是”退出),那么控制程序返回用于表明已经满足所指定条件的结果(图12中的块1214);否则,控制程序返回用于表明不满足所指定条件的结果(图12中的块1216)。
下面示出了诸如上述控制程序的例子 ;样本控制 ; ;此控制检查用户节点是否是可到达的 ;以及日期是否在特定开始日期之后 ;以及在特定结束日期之前 ;从控制中的属性获取值 ;========================= ;常量 ;========================= .equ DEBUG_PRINT_SYSCALL, 1 .equ FIND_SYSCALL_BY_NAME, 2 .equ SYSTEM_HOST_GET_OBJECT_SYSCALL, 3 .equ SUCCESS, 0 .equ FAILURE, -1 ;========================= ;数据 ;========================= .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: ;加载全局函数 ;获取用于Octopus.Links.IsNodeReachable的syscall数目 PUSH@IsNodeReachableFunctionName PUSH FIND_SYSCALL_BY_NAME CALL DUP PUSH@IsNodeReachableFunctionNumber POKE BRN OnLoad_Fail ;获取用于System.Host.GetTimeStamp的syscall数目 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: ;从属性中获取值 ;获取目标节点(保证在那) PUSH 256;返回缓冲区大小(256个字节) PUSH@TargetNodeId;返回值 PUSH@ControlTargetNodeIdAttributePath;名称 PUSH 0;亲代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;获取开始日期 PUSH 4;返回缓冲区大小(4个字节) PUSH@StartDate;返回值 PUSH@ControlStartDateAttributePath;名称 PUSH 0;亲代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;获取结束日期 PUSH 4;返回缓冲区大小(4个字节) 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: ;检查目标节点是否是可到达的 PUSH@TargetNodeId PUSH@IsNodeReachableFunctionNumber PEEK CALL BRN Play_Fail ;把当前时间放入堆栈 PUSH@GetTimeStampFunctionNumber PEEK CALL ;检查日期是否在结束日期之前 DUP;当前时间 PUSH@EndDate PEEK SWAP CMP BRN Play_Fail ;检查日期是否在所述开始日期之后;当前时间处于堆栈上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.内容消费和封装应用 以下是消费DRM保护的内容的应用(例如,媒体播放器、文字处理器、电子邮件客户端等,诸如图3中的应用303a、303c和303d)以及诸如应用303b之类的封装应用的更详细的说明性实施例,所述封装应用用于封装其目标为消费应用的内容。
1.5.内容消费应用体系结构 内容消费应用典型情况下集中于访问受保护的内容,或者可以是通用应用的一部分,所述通用应用还执行诸如封装内容之类的其它功能。在各个实施例中,内容消费应用可以执行以下一些或全部 ●提供用户可以用来请求访问受保护的内容对象并且接收关于所述内容的信息或错误信息的接口; ●管理与文件系统的交互; ●识别受保护内容对象的格式; ●请求DRM引擎评估对内容的许可以查看访问所述内容的权限是否可以准许; ●验证数字签名并且处理DRM引擎需要执行的其它通用密码功能; ●请求DRM引擎提供为解密受保护内容所需要的密钥;和/或 ●解密受保护内容并且与媒体再现服务相交互以便再现所述内容。
在一个实施例中,DRM客户端引擎评估与内容相关联的许可,确认或拒绝用于使用内容的权限,并且向内容消费应用提供解密密钥。DRM客户端引擎还可以向内容消费应用发布一个或多个义务和/或回调,要求该应用执行某些动作,原因在于已经被给与了访问内容的权利。
图13示出了在一个实施例中构成内容消费客户端应用1300的元项。如图13所示,主机应用1302是客户端的逻辑中心点。它负责驱动在其它模块之间的交互模式以及通过用户接口1304与用户的交互。主机应用1302经由主机服务接口1308向DRM引擎1306提供一组服务。主机服务接口1308允许DRM引擎1306访问由主机应用1302所管理的数据,以及由所述主机应用1302执行的某些库函数。在一个实施例中,主机服务接口1308是DRM引擎1306唯一的出站接口。
在一个实施例中,DRM引擎1306并不与由主机应用1302所管理的多媒体内容直接交互。主机应用1302在逻辑上与用于访问多媒体内容的内容服务1310相交互,并且只向DRM引擎1306传递必须由其处理的数据部分。由媒体再现引擎1312来执行与内容的其它交互。例如,在一个实施例中,内容服务1310负责从媒体服务器获取内容,存储并管理客户端的持久性存储装置上的内容,而媒体再现引擎1312是负责访问多媒体内容并且(例如在视频和/或音频输出上)再现它的子系统。在一个实施例中,媒体再现引擎1312从DRM引擎1306接收一些信息(诸如内容解密密钥),但是在一个实施例中,所述DRM引擎1306并不直接与媒体再现引擎1312相交互,而是通过主机应用1302与之交互。
DRM引擎1306所需要的一些信息可在多媒体内容带内获得,并且可以通过内容服务1310来获取和管理,但是该信息的一些可能需要经由诸如个性化服务或成员资格服务之类的其它服务手段(未示出)来获得。
在图13所示出的实施例中,由密码服务块1314来处理密码运算(例如,加密,签名验证等)。在一个实施例中,DRM引擎1306并不与密码服务块1314直接相交互,而是作为替代经由主机1302(使用主机服务接口1308)间接地交互,主机1302转发它的请求。密码服务1314还可以例如由媒体再现引擎1312用来执行内容解密。
应当理解,提供了图13是为了说明而已,并且在其它实施例中在图13中所示出的各个组件可以被重新排列、合并、分离、消除,和/或可以增加新的组件。例如但不限于,在图13中的DRM引擎和主机应用之间的逻辑功能划分只是说明一种可能实施例,并且在实际的实现方式中可以作出变化。例如,可以把DRM引擎与主机应用整个地或部分地集成。从而应当理解,可以在主机应用和DRM引擎之间使用任何适当的功能划分。
1.6.封装器体系结构 下面提供了封装引擎可以为用于封装电子内容的主机应用所执行的功能的例子。在实践中,封装应用可以特别地集中于封装,或者可以是在用户系统操作的通用应用的一部分,所述用户系统也访问受保护的内容(在本地或者例如在网络上的其它地方封装的)。
在各个实施例中,封装主机应用可以执行以下一些或全部 ●提供可以通过其指定内容和许可信息的用户接口; ●加密内容; ●创建构成许可的DRM对象;和/或 ●创建内容对象,所述内容对象包含或引用所述内容并且包含或引用许可 图14示出了在一个实施例中构成内容封装应用1400的元项。DRM封装引擎1416负责封装诸如这里所描述的那些许可(例如,包括诸如控制、控制器、保护器等DRM对象的许可)。在一些实施例中,DRM封装引擎1416还可以使元数据与许可相关联以便依照人类可读形式来解释所述许可作什么。
在一个实施例中,主机应用1402提供了用户接口1404并且负责获得诸如内容引用和用户(典型情况下为内容所有者或供应者)所想要执行的动作(例如,把内容绑定给谁,在许可中包括什么内容使用条件等)之类的信息。用户接口1404还可以显示关于封装过程的信息,诸如所发出的许可的文本,以及如果发生失败,那么所述失败的原因。在一些实施例中,主机应用1402所需要的一些信息可以通过服务访问点(Service Access Point SAP)要求使用其它服务,诸如认证或授权服务和/或成员资格。从而在一些实施例中,封装应用1400和/或主机应用1402可能需要执行以下一些或全部 ●媒体格式服务1406在一个实施例中,此元项负责管理诸如代码转换和封装之类的媒体格式操作。它还负责内容加密,内容加密经由内容加密服务模块1408来实现。
●通用密码服务1410在一个实施例中,此元项负责发出/验证签名以及加密/解密一些数据。对这种操作的请求可以由服务访问点1414或DRM封装引擎1416经由主机服务接口1412来发出。
●内容加密服务1408在一个实施例中,此模块在逻辑上与通用密码服务1410相分离,这是因为它并不知道所述应用。它由媒体格式服务在内容封装时利用由DRM封装引擎1416先前发出的一组密钥来驱动。
4.密钥推导 下面描述了密钥推导系统,所述密钥推导系统自然地配有这里所描述的DRM引擎和系统体系结构的优选实施例,和/或可以在其它情境中使用。在下面部分中的一些例子取自被称为“Scuba(水肺)”的密钥推导系统的优选实施例的参考实现方式。在‘551申请中描述了另外的实施例。
如图15所示,在一些实施例中,链路对象1530a、1530b除了它们在节点1500a、1500b、1500c之间建立关系的主要目的之外还用来分发密钥。如上所述,控制对象可以包含控制程序,所述控制程序可以用来判定用于执行动作的请求是否应当被准许。为了完成这点,控制程序可以检查特定节点是否可经由一链路链到达。这里所描述的密钥推导技术利用此链路链的存在来使密钥分发便于进行,以致可以使所述密钥可用于正在执行控制程序的DRM引擎。
在一个说明性实施例中,在使用可选密钥分发系统的给定部署中的每个节点对象1500a、1500b、1500c具有用于加密内容密钥及其它节点密钥的一组密钥。被创建来用于相同部署中的链路对象1530a、1530b包含一些密码数据作为有效载荷,所述密码数据使得当DRM引擎处理链路链时能够导出密钥信息。
节点和链路依照这种方式携带密钥,假定从节点A 1500a到节点C1500c的链路链1530a、1530b,有权访问节点A 1515a、1525a的秘密共享密钥的实体(例如,客户端主机应用的DRM引擎)也有权访问节点C 1515c、1525c的秘密共享密钥。有权访问节点C的秘密共享密钥允许该实体访问利用那些密钥加密的任何内容密钥。
1.7.节点、实体和密钥 1.7.1.实体 在DRM系统的一个实施例中,节点是数据对象,而不是系统中的活动参与者。在此情境下,活动参与者被称作实体。实体的例子是媒体播放器、设备、预订服务、内容封装器等。实体一般使得节点与它们相关联。消费内容的实体使用DRM引擎并且管理构成其个性(personality)的至少一个节点对象。在一个实施例中,实体被假定有权访问它所管理的节点对象的所有数据,包括那些对象的所有私有信息。
1.7.2.节点 参与密钥推导系统的说明性实施例中的节点对象包含密钥,作为它们数据的一部分。在一个实施例中,节点可以包含两种一般类型的密钥共享密钥和机密密钥。以下部分列出了可以在各个实施例中使用的不同密钥类型。然而应当理解,具体部署可以只使用这些密钥的一个子集。例如,系统可以被配置为只利用密钥对工作,省略使用秘密对称密钥。或者,系统如果它只需要使用共享密钥的话可以在不向节点提供机密密钥的情况下来加以部署。
1.7.2.1.共享密钥 共享密钥是公钥/私钥对和/或由节点N和所有节点Px共享的对称密钥,为此从Px到N存在包含密钥推导扩展的链路。
共享公钥Kpub-share[N]。这是公钥密码的公钥/私钥对的公共部分。此密钥一般与证书一起供给,使得其凭证可以由想要把机密信息用密码绑定到它的实体来验证。
共享私钥Kpriv-share[N]。这是公钥/私钥对的私有部分。管理节点的实体负责确保此私钥是保密的。由于这个原因,此私钥通常被独立于其余的节点信息来存储或传输。此私钥可以通过链路的密钥推导扩展与下游(downstream)的其它节点共享。
共享对称密钥Ks-share[N]。这是以对称密码方式使用的密钥。就像私钥一样,此密钥是机密的,并且管理节点的实体负责保持它是秘密的。此秘密密钥可以通过链路的密钥推导扩展与其它节点下游地共享。
1.7.2.2.机密密钥 机密密钥是密钥对和/或对称密钥,只为管理它们所属节点的实体所知。在上述这些密钥和共享密钥之间的差异在于它们并不通过链路中的密钥推导扩展而与其它节点共享。
机密公钥Kpub-conf[N]。这是公钥密码的公钥/私钥对的公共部分。此密钥一般与证书一起供给,使得其凭证可以由想要把机密信息用密码绑定到它的实体来验证。
机密私钥Kpriv-conf[N]。这是公钥/私钥对的私有部分。管理节点的实体负责确保此私钥是保密的。由于这个原因,此私钥通常被独立于其余的节点信息来存储或传输。
机密对称密钥Ks-conf[N]。这是以对称密码方式使用的密钥。就像机密私钥一样,此密钥是被保密的。
1.8.密码元项 这里所描述的密钥推导和分发系统的优选实施例可以使用各种不同的密码算法来实现,并且不局限于对密码算法的任何特定选择。尽管如此,对于给定部署或简档来说,所有参与实体通常需要一致同意一组支持的算法(其中术语简档通常指的是在特定实现方式中所使用的一组实际技术的规范(例如,用于密钥推导的RSA;用于编码对象的XML;用于文件格式的MP4等)和/或当在实际的部署中定义对象时存在的语义上下文的其它表示)。
在一个实施例中,部署包括对至少一个公钥密码(诸如RSA)和一个对称密钥密码(诸如AES)进行支持。
当涉及密码功能时使用以下符号 ■Ep(Kpub[N],M)意指“消息M使用公钥密码利用节点N的公钥Kpub来加密” ■Dp(Kpriv[N],M)意指“消息M使用公钥密码利用节点N的私钥Kpriv来解密” ■Es(Ks[N],M)意指“消息M使用对称密钥密码利用节点N的对称密钥Ks来加密” ■Ds(Ks[N],M)意指“消息M使用对称密钥密码利用节点N的对称密钥Ks来解密” 1.9.内容密钥的目标 在优选实施例中,使用两种类型的密码目标。把内容密钥的目标定为目标节点的共享密钥意味着使该密钥可用于共享该目标节点的秘密共享密钥的所有实体。把内容密钥的目标定为节点的机密密钥意味着使该密钥只可用于管理该节点的实体。通过使用以下方法中的一个或两个加密在内容密钥对象中所携带的内容密钥CK来完成内容密钥的定目标 ●公共绑定创建包含Ep(Kpub[N],CK)的内容密钥对象 ●对称绑定创建包含Es(Ks[N],CK)的内容密钥对象 在优选实施例中,在可能的情况下使用对称绑定,这是因为它只涉及较小的计算强度算法,由此使得对接收实体来说不那么繁重。然而,创建内容密钥对象的实体(典型情况下为内容封装器)可能不总是有权访问Ks[N]。如果封装器没有Ks[N],那么它可以使用公共绑定,这是由于Kpub[N]并不是机密信息由此可用于需要进行公共绑定的实体。通常使Kpub[N]可用于需要为附有证书的内容密钥定目标的实体,所述证书可以由所述实体检查以便依照某个商定策略来判定Kpub[N]是否确实是可以信任其处理内容密钥的节点的密钥(例如,所述节点对应于运行DRM引擎和主机应用的实体,所述DRM引擎和主机应用符合系统的功能、操作和安全策略)。
1.10.使用链路的密钥推导 为了允许实体有权访问可从其个性节点到达的所有节点的共享密钥,在一个实施例中,链路对象包含可选的密钥扩展有效载荷。此密钥扩展有效载荷允许有权访问链路来源节点的私有/秘密密钥的实体也有权访问链路去往节点的私有/秘密共享密钥。依照这种方式,实体可以解密其目标为可从其个性节点到达的节点的任何内容密钥(如果使用目标节点的共享密钥来定目标的话)。
在一个实施例中,当DRM引擎处理链路对象时,它处理每个链路的密钥扩展有效载荷以便更新它有权访问的内部密钥链。在一个实施例中,从节点F到节点T的链路L的密钥扩展有效载荷包括 ●公共推导信息Ep(Kpub-share[F],{Ks-share[T],Kpriv-share[T]}或 ●对称推导信息Es(Ks-share[F],{Ks-share[T],Kpriv-share[T]} 其中{Ks-share[T]和Kpriv-share[T]}是包含Ks-share[T]和Kpriv-share[T]的数据结构。
公共推导信息用来向有权访问节点F的私有共享密钥Kpriv-share[F]传达节点T的秘密共享密钥Ks-share[T]和Kpriv-share[T]。
对称推导信息用来向有权访问节点F的对称共享密钥Ks-share[F]传达节点T的秘密共享密钥Ks-share[T]和Kpriv-share[T]。
对于把内容密钥的目标定到节点来说,在链路中包括的优选有效载荷为对称推导信息。这在链路创建者有权访问Ks-share[F]时是可能的。如果不可能的话,那么所述链路创建者会回退到包括公共推导信息来作为链路的有效载荷。
假定处理链路的DRM引擎已经在其内部密钥链中具有Ks-share[F]和Kpriv-share[F],那么在处理所述链路之后,L[F→T],它还将具有Ks-share[T]和Kpriv-share[T]。
由于在一个实施例中可以依照任何次序来处理链路,所以在处理给定链路L时,DRM引擎可能无法进行密钥推导计算。这可能是由于以下事实,在那时DRM引擎的密钥链可能仍不包含该链路的“来自”节点的密钥。在这种情况下,所述链路被记录,并且当新的信息可用于DRM引擎时—诸如在处理新的链路P之后,再次被处理。如果链路P的“去往”节点与链路L的“来自”节点相同,并且链路P的“来自”节点是可到达节点,那么链路L的“来自”节点也是可到达的,并且密钥推导步骤把链路L的“来自”节点的私有共享密钥添加到该密钥链。
5.实现方式例子 下面提供了几个例子来用于图示在实践中可以怎样应用这里所描述的系统和方法的各个实施例。这里所描述的系统和方法可以实现大范围的权利管理及其它功能,从而应当理解,这里所给出的具体例子并不旨在穷举,而是说明所发明工作主体的范围。
1.11.例子用户、PC和设备 假定你想要实现把播放内容的权利与特定用户联系在一起的DRM系统,并且你想要使用户在他或她所拥有的所有播放设备上播放内容都很容易。假定你决定将向用户提供用于使他们能够按照需要来增加播放设备(例如,移动播放器)的软件。然而,还假定你想要设置某个策略来限制用户可以向其转送内容的通用设备的数目,使得所述用户没有充当分发代理的能力。
根据这些系统需求,例如把你创建的许可联系到用户并且在用户和他们所使用的设备之间建立关系可能是有意义的。从而在此例子中,你可以首先决定你需要什么类型的节点来建立你要求的关系种类。例如,你可以定义以下类型的节点 ●用户(例如,拥有使用内容权利的个人) ●PC(例如,在个人计算机上运行的软件应用,可以播放内容并且指定另外的播放设备) ●设备(例如,便携式内容再现设备) 每个节点对象可以包括类型属性,用于表明对象是表示用户、PC还是设备。
比如说例如你决定把在特定时间可以附着到任何一个用户的PC节点对象的最大数目限制为四个(4)。你决定只要你提供对PC数目的限制就不必限制被附着到用户的设备数目。据此,控制程序可以被设置为如果能够在用户节点和请求访问的节点之间建立关系那么允许访问。于是该节点可以是PC或设备。
图16示出了被设计用来满足上述要求的系统。服务器1600向每个新用户1604a、1604b分配用户节点对象1602a、1602b,并且管理用户1604a、1604b为了访问受保护内容的目的而把设备1606、1608和PC1610、1612与之相关联的能力。当用户1604a想要把新的设备1606与他或她的用户节点1602a相关联时,服务器1600确定所述设备1606是否已经包含个性化信息1614,这也许与所述设备1606在制造时就被个性化的情况一样。如果该设备的确包含个性化信息1614,那么服务器1600使用该个性化信息1614来创建从设备1606到用户节点1602a的链路1616,并且向用户设备1606发送链路1616。当用户1604a获得受保护的内容1618时(例如,从服务器1600或从其它内容供应者),该内容1618其目标在于用户节点1602a(例如,通过利用与用户节点1602a相关联的一个秘密共享密钥来加密内容的解密密钥)并且使许可1619与其相关联,指定能够访问内容的条件。当用户1604a试图在设备1606上播放内容1618时,在设备1606上运行的DRM引擎1620评估许可1619,所述许可1619表明只要用户节点1602a是可到达的那么就可以播放所述内容1618。DRM引擎1620评估链路1616(所述链路1616示出了用户节点1602a可从设备1606到达),并且例如通过授权解密在许可1619内所包含的内容解密密钥,来准许用户1604a对访问内容1618的请求,。
由于在此例子中,使用与用户节点1602a相关联的秘密密钥来加密内容解密密钥,所以需要获得此秘密密钥以便解密所述内容解密密钥。如果已经使用在此的其它地方所描述的可选密钥推导技术,那么可以通过使用设备1606的秘密密钥之一解密在链路1616中所包含的密钥推导信息来简单地获得用户节点密钥。所解密的密钥推导信息包含用于解密在许可1619中所包含的内容解密密钥所需要的密钥(或者能够从其导出或获得密钥的信息)。
再次参照图16,假定用户1604a想要使新的PC 1610与他或她的用户节点1602a相关联。服务器1600验证尚没有把最大数目的PC与用户节点1602a相关联,并且授权PC 1610与用户节点1602a相关联。然而为了执行所述关联,服务器1600需要从PC 1610获得个性化信息(例如,密码密钥、唯一标识符等)。然而如果PC 1610先前尚未被个性化(这可能与用户只是下载PC软件拷贝的情况相同),那么服务器1600会执行个性化过程(例如,通过使用在此的其它地方所描述的引导协议来创建PC节点对象)或者把用户引向可以执行个性化过程的服务供应商。当完成个性化过程时,服务器1600可以创建从PC 1610到用户节点1602a的链路1624并且向PC 1610发送所述链路,只要该链路保持有效,那么所述PC 1610可以继续使用该链路。
用户稍后可以请求增加另外的PC,并且服务器可能会强制实施用于把每个用户的PC节点对象的数目限制为4的策略(典型情况下,它可能还会向用户提供按照需要从其活动列表中移除PC的能力)。
作为又一例子,现在假定服务供应商已经决定用户应当能够在他们拥有的任何设备上播放他们拥有的任何内容。服务供应商还可能想要允许用户的PC软件创建到他或她每个设备的链路,而并不要求所述用户联系服务器1600。在这种实施例中,当用户想要在新的设备上播放内容时,用户的PC软件可能会访问新的设备机密个性化信息并且使用它来创建用于该设备的新链路(例如,从所述新的设备到用户节点1602a的链路)。如果所述设备未被个性化,那么PC软件有权访问远程服务,或者指示设备访问所述远程服务来执行个性化过程。然后PC软件会向新设备发送链路,在该点,只要内容保持有效,那么新设备就能播放所述内容,这是由于在一个实施例中一旦链路对象存在,就不必在创建另一个,除非所述链路对象期满或被无效。
在上面所示出的例子中,内容的目标在于用户。为此,封装器应用为内容选择新的ID,或者使用现有的,创建加密密钥和相关联的内容密钥对象,以及用于绑定内容对象和内容密钥对象的保护器对象。然后封装器利用控制程序(例如,用DRM引擎的虚拟机可执行的字节代码编译的)来创建控制对象,用于当且仅当用户节点可从请求“播放”动作的PC或设备节点到达时才允许进行所述“播放”动作。典型情况下,如果适当的话,控制、控制器、保护器和内容密钥对象被嵌入到封装的内容中,使得PC和设备不必分别获得它们。
在一个实施例中,当设备或PC想要播放内容时,它遵循诸如先前结合图9所描述的过程。即,DRM引擎找到用于所述内容的内容ID的保护器对象,然后是由保护器所引用的内容密钥对象,然后是引用该内容密钥对象的控制器对象,并且最后是由该控制器引用的控制对象。DRM引擎执行控制对象的控制程序,所述控制程序检查所述用户节点是否是可到达的。如果设备或PC节点具有必要的链路对象来验证在其节点和用户节点之间存在路径,那么满足条件并且控制程序允许使用在内容密钥对象中所表示的密钥。然后设备或PC的媒体再现引擎可以解密并播放内容。
1.12.例子临时登录 图17是这里所描述的DRM系统和方法的潜在应用的另一例子。此例子类似于在先前部分中的例子,除了这里用于管理支配在PC节点对象和用户节点对象之间创建链路对象的策略允许只是12小时的临时登录,只要用户尚未在另一PC上临时登录的话。此特征会允许用户1700把他的内容1702带到朋友的PC 1704,登录该PC 1704一段时间,并且在朋友的PC 1704上播放所述内容1702。
为了实现这点,可能在有限有效期的情况下创建链路对象1710。在一个实施例中,这可以如下进行 为了便于解释,假定用于播放DRM保护的内容1702所要求的具有DRM功能的消费软件1714已经存在于朋友的PC 1704上。包含内容1702和许可1708的文件被转送到朋友的PC 1704。当用户试图播放内容1702时,软件1714认识到并不存在用于把本地PC节点与拥有所述内容的用户节点相链接的有效链路对象。软件1714提示用户需要他的凭证1712(这可以经由用户名/密码、移动电话认证协议、智能卡或在系统策略下所允许的任何认证系统来提供)并且与后端系统1706通信。后端系统1706检查所请求链路的用户节点对象和PC节点对象的属性,并且检查到并不存在仍然有效的活动临时登录链路对象。如果满足那些条件,那么后端服务1706创建用于链接朋友的PC节点对象和用户节点的链路对象1710,其有效期限于所请求的登录持续时间(例如小于12小时,以便符合此例子中的策略)。现在具有链路对象1710使朋友的PC 1704能够播放用户的内容1702直到链路1710期满。
1.13.例子企业内容管理 图18示出了用于管理企业文档(例如,电子邮件、字处理文档、展示幻灯片、即时消息发送文本等)的说明性系统1800的高级体系结构。在图18所示出的例子中,文档编辑应用(例如文字处理器)1802、电子邮件客户端1804和目录服务器(例如,活动目录服务器)1806利用数字权利管理(DRM)插件1808、网络服务组织层1810、注册服务1812和策略服务1816来便于依照策略管理文档、电子邮件消息等。在优选实施例中,使用在此的其它地方以及‘551申请中所描述的DRM引擎和服务组织技术来实现DRM插件1808、网络服务组织层1810、策略服务1816和注册服务1812。例如在一个实施例中,DRM插件1808可以包括上述DRM引擎的实施例。应当理解,虽然图18示出了其中经由应用可以调用的插件来把诸如文字处理器1802和电子邮件客户端1804之类的现有应用与DRM引擎集成的实施例,但是在其它实施例中所述DRM引擎可以作为应用本身任意或者两者的组成部分来包括。还应当理解在图18中所示出的说明性系统可以在单个企业内实现或者可以跨越多个企业实现。
在图18所示出的图解中,目录服务器1806例如可以包含用户简档和组定义。例如,被称作“特别工程队(special project team)”的组可以被公司系统管理员设置来标识公司特别工程队的成员。
在一个实施例中,目录服务器1806可以包括用于运行诸如在‘551申请中所描述(并且例如利用在

平台上基于标准IIS技术实现)的那些web网络服务的活动目录服务器,所述网络服务根据所访问的内容向特别工程队组中的人们发出节点、链路和许可。如果在组中成员资格改变,那么可以发出新的令牌。对于权利撤销来说,目录服务器1806可以根据诸如在‘551申请中所描述的技术(这里有时被称作为“NEMO”技术)来运行安全元数据服务。在一些实施例中,可以要求客户端具有到期时间值或时间概念(根据公司选择定义的任何新鲜值(例如,1周、1天、1小时、每5分钟等))以便使用DRM许可。例如,安全元数据服务提供的令牌可以包括信任和认证的时间值。在一些实施例中,客户端可以在安全元数据服务交互中标识用户节点ID。可以在许可控制情境中直接评估安全元数据以便确定用户是否仍然具有给定的成员资格。安全元数据还可以返回代理,所述代理可以确定诸如作为特别工程队中成员的关系是否有效。从而在一些实施例中,可以利用只是添加几个明确定义的网络服务来平衡公司现有的授权和认证基础结构(例如,公司的活动目录服务器)。
图19示出了诸如在图18中所示出的系统可以怎样用来管理对文档的访问或其它使用的例子。在此例子中,特定的雇员(约翰)可能频繁致力于高度机密的战略工程,并且可能已经安装了DRM插件1908来用于其应用(例如,字处理程序1902、电子邮件程序1904、日程表程序、集成这种程序的程序或程序套件等)。在创建他文档期间的某个时间点,约翰访问已经被添加到其应用工具条的“权限”下拉菜单项(动作1913)。出现权限对话框,用于联系他公司的活动目录服务器1906以便查找已经在系统上设置的个人和组的目录。他从列表中选择“特别工程队”,并且选择向队中的每个人给予查看、编辑和打印文档的权限。使用在‘551申请中所描述的NEMO服务组织技术,DRM插件1908把具有NEMO功能的策略服务扩展1916联系到活动目录1906并且请求要用来保护特别工程队的文件的策略的拷贝(动作1914)。当约翰保存文档时,DRM插件自动加密文件1912,并且创建许可对象1910,其目标在于并且绑定到被称为“特别工程队”的组。许可1910允许任何设备访问(例如,查看、编辑、打印等)文件1912,其中所述设备可以生成从其设备节点到特别工程队组节点的有效链路链。
约翰有权访问文档1912,这是因为他的设备具有到约翰用户节点的链路,并且它还具有从约翰的用户节点到“特别工程队”组节点的链路。同样,如果他把此文档转发给其它人,那么只有在他们能够生成到“特别工程队”组节点的有效链路链才能访问它(例如,通过要求特别工程队节点可由该设备到达)。
约翰可以把(已经受保护的)文件保存在他的计算机上,并且稍后把它附到电子邮件消息上(动作1920)。例如,他可以打开给他老板(乔治)的旧电子邮件,像通常那样附加文件,并且发送消息。如图20所示,乔治还在他的计算机2014上安装有DRM插件2000。当他登录到他的计算机2014时,插件2000有机会检查他已经添加的所有组(动作2006),并且下载新组,刷新已经期满的任何链路(动作2012)。如果他自其上次登录而已经被添加到“特别工程队”,那么他的插件2000能会下载用于把他的用户节点链接到“特别工程队”组节点的链路对象2008。此链路2008意味着用户节点“乔治”是组节点“特别工程队”的成员。在此例子中,假定链路对象2008具有截止日期(例如3天),在此之后该链路对象2008不再有效。
如图21所示,当乔治试图打开文档时(动作2130,2132),DRM插件2108检查所嵌入的(或附加的)许可,并且得知“特别工程队”节点必须是可到达的。他的插件2108构造(并验证)从他计算机设备节点到用户节点“乔治”以及从用户节点“乔治”到组节点“特别工程队”的链路链2120、2122(动作2134)。由于设备具有有效的链路链2120、2122,所以他的插件2108允许访问文件。
如在此的其它地方所描述,在一些实施例中,链路还可以携带安全的密钥链。从而在一些实施例中,通过生成到特别工程队节点的链路链,插件不仅可以证明它被允许访问内容,而且还能够解密密钥链,所述密钥链使其能够解密所述内容。
例如如果另一雇员(“卡罗尔”)意外地接收约翰的电子邮件,并且试图打开文档,那么她的DRM插件会获取与所述文件绑定的许可并且评估所述许可的条款。她的PC具有到她用户节点“卡罗尔”的链路;但是由于她不是该团队的成员,所以不存在从“卡罗尔”到“特别工程队”组节点的链路。由于“特别工程队”是不可到达的,所以不允许她访问文件。
如果卡罗尔最终被添加到组“特别工程队”。在下次她的DRM插件刷新她的成员资格时,会检测此新组,并且下载用于把她的用户节点链接到特别工程队节点的链路对象。现在她的插件具有需要用来构造从她的设备节点到她的用户节点再到特别工程队节点的链所需要的所有链路。现在特别工程队节点“是可到达的”并且她可以打开目标为特别工程队的任何文档或电子邮件——即便是在她加入该团队之前所创建的那些文档或电子邮件。
假定一个月后,乔治转换为新角色并且被从活动目录中的特别工程队组中移除。下次乔治登录时,他的插件不接收新的、刷新的链路对象,其中所述链路对象把他的用户节点“乔治”关联到“特别工程队”。当数周以后他再试图打开约翰的文件时,他的插件试图构造到特别工程队的链路链。他的PC仍然具有到用户节点“乔治”的链路(乔治的PC仍然属于他);但是从“乔治”到“特别工程队”的链路已经期满。由于“特别工程队”是不可到达的,所以不允许他访问文件。
假定公司具有这样的策略,所述策略要求对所有的机密信息的访问被记录为日志。在一个这种实施例中,用于特别工程队的策略指示为此组所创建的所有许可也需要要求收集使用信息并把它报告给例如中央储存库。从而在此例子中,当评估(例如,执行)许可中的控制程序时,插件执行把访问记录为日志的要求并且记录所述访问为日志。例如,结果活动可以被记录在诸如这里所描述的本地保护的状态数据库中作为日志,并且当重新建立网络连接时,可以经由先前描述的服务来报告相关内容。
图22示出了用于管理企业内的电子内容的另一说明性系统2200。在图22所示出的例子中,LDAP服务器2206用来管理用户简档、组定义和角色分配,并且包含被称作“特别工程队”的组定义以及“代理人”的角色定义。
假定约翰是代理人并且想要向特别工程队的其它成员发送具有附件的电子邮件。当约翰安装用于他应用的DRM插件程序2208时,它还把项目安装到他的电子邮件工具条。在他创作电子邮件消息期间的某个点,约翰从下拉菜单访问已被添加到他工具条的“设置权限”。DRM插件程序2208联系策略服务2216并且显示要从中进行选择的公司消息发送策略列表。约翰选择“特别工程DRM模版”并且DRM插件程序2208使用NEMO协议来请求并确保它接收的策略对象的可靠性、完整性和机密性。所述策略描述了应当怎样创建使用此模板的许可,包括怎样对它们定目标和绑定。
当约翰击中“发送”时,DRM插件2208加密消息和附件,并且产生相关联的许可。该许可要求为了访问电子邮件或附件,特别工程队组节点或“代理人”组节点必须是可到达的。
把许可与加密的消息有效载荷和加密的附件相绑定。随后使用标准的电子邮件功能来向接收者列表发送所述消息。由于许可规则和加密不取决于电子邮件的寻址,所以可能错误地包括不正确的电子邮件接收者的事实不会使电子邮件或附件的内容置于风险之中。
由于这种无意的接收者没有用于把他的用户节点链接到特别工程队的有效链路对象,所以如果或者当他试图访问内容时不允许他这样做。此外,由于他的设备没有必要的链路链(以及它们包含的密钥),所以他的设备也不具有解密所述内容的能力。
然而,如果无意的接收者随后使用标准的电子邮件功能把相同的、未经修改的电子邮件转送到特别工程队的成员。该成员具有用于把他的用户节点链接到“特别工程队”组节点的链路对象,并且能够访问电子邮件的内容。
假定公司的另一代理人(“比尔”)也接收到用于把他与“特别工程队”组节点相关联的链路对象。比尔还可以查看所述文件。如果他把消息转送给律师助手(“特伦特”),他既不是代理人也不与特别工程队相关联,那么特伦特没有用于把他与“特别工程队”组节点连接的链路对象,并且他不能访问所述文档。
如果特伦特随后被添加到LDAP目录2206中的特别工程队组中,那么他会被给予必要的链路对象并且将能访问先前转发的电子邮件。
如果如先前所论述,公司具有用于表明在所有许可中包括报告要求的策略,那么在一个实施例中,每当执行这些许可之一内的控制程序时(例如当某人试图访问所述文件时),可以触发报告事件。报告步骤另外可以包括关于访问是被准许还是拒绝的指示符——这是实现方式选择的问题。如果使用这种指示符,那么可以维护尝试访问特定文档的次数以及每次的状态和其它信息(例如,成功、失败等)的日志。
作为又一例子,假定特别工程队的成员之一(“斯蒂芬”)出差到另一公司来致力于该特别工程。在前往该另一公司公司之前,斯蒂芬的电子邮件客户端把所有电子邮件的本地拷贝下载到他的收件箱中。被附着到这些电子邮件之一的受保护报告也包括嵌入式(或附加)的许可。此许可对象包括用于访问内容以及访问加密的内容密钥的规则。访问内容所要求的唯一“缺少的链路”是用于到达“特别工程队”组节点所必要的链路对象。
由于在此例子中公司策略在于允许链路对象保持有效达3天,所以用于把斯蒂芬的用户节点链接到特别工程队节点的链路对象将在他出差和断开连接时保持有效。如果他试图在离线时访问文件,那么特别工程队组节点仍然是可到达的,并且允许他访问所述文件。
然而如果斯蒂芬保持离线达三天以上,那么用于把他链接到特别工程队的链路对象会期满。特别工程队组节点于是不再可到达,并且不允许他访问所述文件。
如果斯蒂芬最终出差到他可以(例如经由VPN)连接到公司系统的位置,那么他的DRM插件会向他所属的每个组请求所刷新的链路对象拷贝。由于他仍然是“特别工程队”组的一部分,所以他接收从他的用户节点到特别工程队组节点的新链路对象。此链路替换已经期满并不再有效的“旧”链路。
由于“特别工程队”节点现在可使用此新刷新的链路到达,所以他能够再次访问受保护的报告。新的链路对象在3天时间内是有效的,在此之后所述链路对象也期满。
作为又一例子,假定特别工程队的成员“萨莉”想要经由即时信使与另一队员通信,保存通信拷贝,并且把它给予团队的另一成员(例如,经由电子邮件附件、盘片、软件狗(dongle)等)。在此例子中,即时信使客户端(以及可能还有公司向其雇员所提供的任何其它消息发送和通信产品)被链接到DRM插件,和在先前例子中一样,所述DRM插件访问策略“特别工程DRM模板”,所述策略“特别工程DRM模板”规定将怎样为许可定目标及绑定。当萨莉试图保存她的即时消息发送会话时(例如,通过选择“另存为”),该插件选择加密密钥(例如,随机地)并且封装(加密)会话的文本。依照公司策略,然后DRM插件产生其目标在于并且被绑定到特别工程队组节点的许可对象。
把包含受保护IM副本(transcript)的文件与所述许可绑定以便访问副本内容。和在先前的例子中一样,许可包含用于管理支配对内容以及所加密的内容密钥拷贝进行访问的规则。萨莉可以使用标准的‘拖放’过程来把此绑定的文件转送到电子邮件、USB软件狗、盘片等,并且把它发送给其他人。如果接收方设备可以生成到特别工程组节点的有效链路,那么允许并且可以访问内容。
假定萨莉把文件给了约翰,约翰也是特别工程队的成员。如果约翰具有最近刷新的链路对象,所述链路对象把他标识为特别工程队的成员,那么他能够访问所述文件。按照公司策略,此链路对象包含会导致它在三天后期满的截止日期。因此,即便约翰保持断开连接,只要该链路保持有效他仍然有权访问。
如果在以后的某一时间约翰离开特别工程队而从事另一分配的工作,并且在他的袋子中发现来自萨莉的USB软件狗并且试图使用他的台式计算机打开文件,那么用于把他的用户节点关联到特别工程队的链路对象将已经期满。由于他不再是团队的一部分,所以他设备上的DRM插件不再可以获取新的、刷新的链路。由于“特别工程队”组节点不再可通过他的设备到达,所以不允许访问。
假定自他改变了工作以来他的膝上计算机一直没有被连接到网络,他还试图利用该设备打开所述文件。由于最大分配的时间已经过去,所以该链路也不再有效。在一些实施例中,每当他试图访问所述文件时,可以产生报告并对其排队以发送到中央储存库。
中央储存库经由电子邮件接收多次试图访问文件未成功的报告并且标记管理器。管理器提醒约翰不再允许他访问机密材料并且请求毁掉所有文件(即便系统表明该访问尚未被准许也是如此)。
作为又一例子,假定政府机构或外部审计员想要调查或审计特别工程队对机密信息的处理。为了支持调查,公司想要表明审计记录以供访问与特别工程相关的敏感信息。
为此,公司首先扫描用于与特别工程相关的任何消息的所有明文消息存档。使他们欣慰的是,他们发现在坚持公司策略的情况下,在没有适当DRM保护的情况下,没有雇员发送论述特别工程的消息(例如向系统之外发送消息)。
然后公司使用DRM访问记录来生成详细描述向谁以及何时给予对受保护信息的访问权的审计跟踪细节。
按照公司规程,当建立特别工程队组时,默认时它还包括首席服从官(Chief Compliance Officer CCO)。用于首席服从官的链路对象被创建并保存到存档服务器,所述存档服务器允许他或她如果将来需要的话回顾所有消息的内容。
在此例子中,为特别工程队所定义的策略表明该团队所产生的所有许可必须包括用于报告任何试图对所述文件进行访问的要求,包括日期和时间、用户节点以及访问是否被准许。这些报告被保存在中央储存库上的访问日志中。
CCO检查在已经出现可疑的任何泄漏或舞弊的日期之前与特别工程队相关联的所有访问的访问日志。CCO还搜索电子邮件、IM和网络备份存档以查找在该日期或之前的所有消息通信业务和系统文件。由于每个文件具有附加的许可(具有内容密钥),并且CCO具有必要的链路对象来满足所述许可的要求,所以允许他或她访问在所关注时间之前所访问的每一个消息的内容。
使访问日志和未加密的消息内容完全可用于代理机构/审计员作为调查的一部分。
在一些实施例中,特别工程队的策略还可以包括用于为与特别工程相关的所有许可设置截止日期的要求。例如,如果只是法定要求公司保持此天然记录达1年,那么它们可以在策略中表明许可在发出日之后一年期满。在该情况下,公司可以只是按照法律的要求来保持记录。在该时间之后,即便CCO也无访问权。
在上面论述中,偶尔会引用“定目标”和“绑定”。在优选实施例中,定目标和绑定表示两种不同的、却紧密相关的过程。在优选实施例中,“绑定”主要是密码过程,涉及保护用于加密内容的密钥。当许可被‘绑定’到节点(例如“特别工程队”节点)时,例如它可以意指利用与该节点相关联的公钥来加密内容密钥。从而,只有有权访问节点私钥的设备具有必要的密钥来解密该内容(并且在优选实施例中,获得访问节点私钥权利的唯一方式是解密到该节点的链路链);然而,简单地具有正确私钥只表明所述设备如果被允许这样做的话具有解密该内容的能力。
在优选实施例中,由许可内的控制程序来确定是否允许设备访问内容,并且特别地是,确定怎样来给它定目标。“定目标”指的是在控制程序中增加用于指定特定节点(或多个节点)“是可到达的”以便使用内容的要求。在上面所示出的例子中,控制程序典型情况下指定特定的节点“特别工程队”可由消费设备到达。
在一些情况下,可能希望使许可目标为一个以上节点,诸如在公司的新产品开发团队(“公司”),其与多个供应商合作来投标用于新绝密产品的组件。假定在工程早期阶段期间,供应商A和供应商B(竞争者)都具有到“SecretProjectX”的链路。供应商A想要与SecretProjectX的所有成员共享其思想,但是不希望他们把它无意间泄漏给供应商B。供应商A可以为这些许可定目标以致(“SecretProjectX是可到达的”)并且(“供应商A是可到达的”或者“公司是可到达的”)。如果公司无意间把此信息共享给秘密工程X中的每个人(包括供应商B),那么不允许在供应商B的那些人查看它,限制对公司的任何非公开的风险并且消除供应商A丢失其商业秘密的可能。
1.14.例子保健记录 图23图示了可以怎样应用这里所描述的系统和方法来管理保健记录。假定医疗记录具有不同的机密级别,而且希望对系统中不同的实体(例如,病人、医生、保险公司等)准许不同的访问权利。例如,可能希望只允许某些记录被病人查看,只允许某些记录被病人的医生查看,允许某些记录可被病人查看但是只可由病人的医生编辑,允许某些记录可被所有医生查看,允许某些记录被所有保险公司查看,允许某些记录只可被病人的保险公司查看等。
如图23所示,可以使用像诸如在此的其它地方所描述的那些节点和链路式的DRM对象来建模此保健生态系统2300。例如,可以把节点分配给病人2302、病人的医生2304、病人的保险公司2306、病人的设备(2308,2310)、病人的一个特定医生2312、医生的计算设备2314、2316、所有医生组2318、某个专业的医生组2320、医疗机构2322、保险公司2324、由保险公司所使用的计算设备2326、所有保险公司组2328等。
假定病人的医生使用他或她的PC来创建关于病人的医疗记录。例如,医疗记录可以包括具有用于他或她的附注、诊断、处方指令、所述病人的指令等的多个字段的文档模板。所述模板还可以允许医生选择用于管理支配文档和/或其个人字段的安全策略。例如,医生的应用可以给出一组标准的安全策略选择,并且当获得医生的选择时,可以根据那些选择来自动地产生许可并且与医疗记录受保护的(例如,加密的)内容相关联。
为了此例子的目的,假定许可准许查看对病人、对治疗所述病人的所有保健提供者以及对向所述病人提供保险的所有保险公司的访问。进一步假定,为了图示说明,所述许可只向医疗机构x的心脏病专家准许编辑权利。
封装应用接受医生的策略规范输入(其可以简单地包括标准模板上的鼠标点击)并且产生许可,所述许可包括诸如下面所示出的控制程序 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随后拜访另一保健提供者,并且授权保健提供者作为他认可的保健提供者之一(例如通过签名授权表单),该保健提供者会获得到病人y认可的保健提供者节点的链路,所述保健提供者可能会把它存储在他的计算机系统上。如果该保健提供者然后获得由医生x所创建的医疗记录,那么他能够获得对该医疗记录的查看访问权,这是由于病人y认可的保健提供者节点可从新的保健提供者计算机系统到达。如果另一方面未经认可的保健提供者获得(加密的)医疗记录的拷贝,那么他可能不能访问它,这是因为没有任何一个所要求的节点(即,病人y的节点、所有病人y认可的保健提供者的节点以及所有病人y认可的保险公司的节点)可从其计算系统到达。
然而注意,上面所示出的示例性控制程序包括重载特征,所述重载特征例如在紧急情况下可以被调用,例如如果保健提供者需要访问受保护的医疗记录,但是不能满足控制程序的条件(例如,因为试图紧急访问医疗记录的保健提供者先前尚未被注册为病人Y的保健提供者)。然而还要注意,紧急访问异常的调用会导致关于调用和/或其它环境的信息被自动记录,并且在此例子中还导致发送通知(例如,向病人优选的保健提供者——即,由病人明确授权的实体—和/或病人自己)。这种义务与紧急异常的关联可以阻止对异常的滥用,这是因为可能会存在滥用的记录。
应当理解,已经提供此示例性程序以便于解释这里所描述的系统和方法的某些实施例。例如,系统是否包括对紧急异常的支持一般取决于系统设计者的要求和愿望。从而例如一些实施例可以不支持紧急异常,其它实施例可以支持紧急异常,但是把可以调用这种异常的实体类限制为‘所有医生’类(例如,通过要求EmergencyException标志被设置为“真”并且所有医生节点都是可到达的),并且其它实施例仍然可以支持紧急异常,但是不把强制性义务与之相关联(由于不能符合所述义务在优选实施例中可能会使内容不可访问),作为替代依赖于用于实施的非技术性的、法律或制度手段(例如,通过信任保健提供者不会滥用调用异常的能力,和/或依赖工业证明和法律体系来防止滥用)。
可以对上面所提供的例子进行的又一变化可能要求更有力的证明,即医生或具体姓名的医生实际上是访问医疗记录的人,而不是坐在医生用来访问记录的计算机(并且从而潜在地包含为满足可达性分析所必须的链路的计算机)边上的其他人。可以依照任何适当的方式来强制实施这种更有力的认证形式。例如,通过使用口令、软件狗、生物测定标识机制等来保护用于访问医疗记录的医生的计算机和/或软件,可以在应用或系统级整个地或部分地强制实施这点。作为选择或另外,与某些医疗记录相关联的控制程序本身可以包括要求这种更有力标识的义务或条件,诸如检查软件狗的存在,要求主机去获得口令等。
1.15.例子预订 图24是在电子预订服务的情境中可以怎样使用这里所给出的系统和方法的图解。例如假定用户(爱丽丝)想要从因特网服务供应商(XYZ ISP)获得对爵士音乐的预订。因特网服务供应商可以提供各种不同的预订选项,包括免费的试订,但是只可以用来在期满之前播放预订内容五次(例如,通过播放一首歌曲五次,通过播放五首不同的歌曲各一次等)。试订还使内容只可用于略微变差的形式(例如,下降的保真度或分辨率)。爱丽丝使用她的个人计算机来访问服务供应商的因特网网点,并且选择试订。然后服务供应商发出链路对象2400和代理2401并且把它们发送到爱丽丝的个人计算机2406。代理2401可操作来初始化爱丽丝安全状态数据库中的状态,所述状态将用来跟踪爱丽丝已经使用试用内容的次数。链路2400是从爱丽丝的帐户节点(Alice@XYZ_ISP)2402到预订节点2404并且包括控制程序,当爱丽丝请求播放内容时,所述控制程序检查由代理2401所设置的状态变量的当前值以便看看是否允许额外的播放。
当爱丽丝把内容下载到她的PC并且试图播放它时,她的PC上的DRM引擎评估与所述内容相关联的许可,其表明为播放所述内容,预订节点2404必须是可到达的。爱丽丝先前已经向她的ISP注册了她的PC,此时她接收了从她的PC节点2406到她的帐户节点2402的链路2405。从而DRM引擎拥有用于把PC节点2406连接到预订节点2404的链路对象2405、2400;然而在准许爱丽丝播放内容的请求之前,DRM引擎首先通过执行所述链路包含的任何控制程序来确定所述链路是否有效。当执行链路2400中的控制程序时,DRM引擎检查状态数据库条目以便确定是否已经进行了5次播放,并且如果尚未到达5次,那么准许她播放所述内容的请求,并且还向主机应用发出义务。所述义务要求主机在再现之前使内容降级。主机应用确定它能够满足此义务,并且继续再现内容。为了使爱丽丝能够在相对于她五次免费试用播放来计数该内容之前预览内容,控制程序还可以包括回调,所述回调例如在已经准许用于播放内容的请求之后检查20秒以便看看所述内容是否仍然在播放。如果所述内容仍然被播放,那么减少播放计数,否则不减少。从而,爱丽丝可以从由预定服务所提供的任何内容项中选择,并且在她试订期满之前播放它们中的五个。
一旦爱丽丝试订期满,爱丽丝就决定购买完全的按月预订,这使她能够播放与她希望按月付费一样多的内容项。爱丽丝使用她的PC来对预订签名,并且接收从她的帐户节点2402到预订节点2404的链路2410。所述链路包括用于表明所述链路只有效一个月的控制程序(例如,所述控制程序检查状态数据库中的条目以便看看自从发出链路以来是否已经过去一个月)。此链路2410被连同代理程序一起发送到爱丽丝的PC,所述代理程序可操作来初始化PC的DRM引擎的状态数据库中的适当条目,所述条目表明发出链路的日期。当爱丽丝从预订服务下载内容并且试图播放它时,她PC的DRM引擎确定到预订节点的路径由链路2405、2410组成。DRM引擎执行在链路2405、2410中所包含的任何控制程序来确定链路是否有效。如果自从发出链路2410以来还没有过去一个月,那么链路2410中的控制程序返回用于表明链路2410仍然有效的结果以及爱丽丝播放所述内容的请求。如果爱丽丝试图播放她先前在她免费试用期间所获得的内容,那么她PC上的DRM引擎将执行相同的分析并且准许她的请求。由于与在试用期间所获得的内容相关联的许可表明如果安全数据库中的TrialState变量未被设置,所以唯一条件在于预订节点必须是可到达的,现在爱丽丝可以再次访问该内容,这是因为所述预订节点此时可经由链路2410而不是不再有效的链路2400来从爱丽丝的PC再次到达。从而,爱丽丝不必获得内容项的第二拷贝来替换她在免费试用提供期间所获得的拷贝。类似地,如果爱丽丝从她的朋友鲍勃获得预订内容,所述鲍勃也是相同服务的订户,那么在此例子中爱丽丝也能够播放该内容,这是因为内容许可只是要求预订节点是可到达的,而并不要求它可经由鲍勃的PC或帐户到达。
应当理解,以上例子只是旨在图示可以由这里所描述的系统和方法启用的一些功能,并且并不旨在建议必须依照上述精确的方式来实现所述预定。例如在其它实施例中,与预订内容相关联的许可可以被绑定到用户节点而不是预订节点,从而防止两个订户共享内容,像在上述例子中鲍勃和爱丽丝那样。应当理解,可以对以上例子进行许多其它变化。
下表提供了用于上述例子中的代理、链路和许可控制程序的一些说明性伪码


再次参照图24,爱丽丝在她的移动服务供应商下还具有帐户2420,只要她保持连接到网络,所述移动服务供应商就保持有效。不要求爱丽丝对预订进行特别付款,以换取她获取发送链路;作为替代当她连接到网络时更新链路2424被自动地发送到她的电话。这些链路使她能够访问由移动服务供应商所提供的任何内容项或服务,所述内容项或服务具有只要求预订节点2422是可到达的许可。如果爱丽丝改变移动服务供应商,那么一旦她的链路2424期满,她就不能访问先前获取的内容。
图25示出了服务供应商可以怎样与家庭网络域2500相交互的例子。在此例子中,设备被注册到家庭网络域,所述家庭网络域强制实施允许多达5个设备在任一时刻属于该域的策略。尽管史密斯家庭的电缆服务供应商没有提供用于设置家庭网络域2500的域管理器软件,不过电缆服务供应商知道域管理器已经由所证实的家庭网络域管理器软件的提供者实现,从而信任域管理器软件来按照打算那样操作。如图25所示,史密斯家庭把爱丽丝的电话和PC、卡罗尔的PVR和乔的PSP连接到域2500,导致从这些设备中的每个向域节点2500发出链路。当例如在PVR接收新的内容时,诸如在‘551申请中所描述的那些发现服务使域中的其它设备能够自动地获得内容和任何必要的链路。从域节点2500向服务供应商帐户节点2502发出链路。一些电缆服务供应商的内容具有许可,所述许可的义务是必须禁止快进和回倒使得广告将被观看。卡罗尔的PVR和PC、爱丽丝的PC能够强制实施所述义务,从而可以播放内容。爱丽丝的移动电话不能强制实施所述义务并且从而拒绝对内容进行访问。
1.16.附加例子内容和权利共享 如先前例子所图示,这里所给出的系统和方法的实施例使得能够依照自然方式来共享电子内容。例如,这里所描述的系统和方法可以用来使消费者能够与他们的朋友和家庭成员共享娱乐内容,和/或在所有他们的家庭设备上欣赏它,同时防止过宽的、未经授权的分发。例如,可以使用自动化对等发现和通知服务,以致当一个设备获得内容或相关联权利时,其它设备可以自动地知道该内容,由此提供可以自动更新的虚拟分布式库。例如在一个实施例中,如果一个用户在一个位置在便携式设备上获得内容或权利,然后回家,那么用户的家庭设备可以自动地发现并利用那些权利。相反地,如果用户在他或她的家庭网络的设备上获得权利,那么他或她的便携式设备可以发现并带走该内容以便在其它地方使用。这里所描述的系统和方法的优选实施例可以用来创建服务和权利对象,所述服务和权利对象允许例如使用在‘551申请中所描述的服务发现和检查技术来使上述方案完全地自动化。例如,被注册到特定域的设备可以彼此提供服务(例如,权利和内容的共享),和/或可以调用远程服务以便于本地内容共享。所描述的系统和方法能够创建这样的DRM架构,所述DRM架构不集中在防止创建拷贝本身,而是被设计成用于利用网络技术协调地工作以便允许共享内容,同时防止消费者变为内容的非法分发者。
这里所描述的DRM系统和方法的优选实施例还能够在没有其它DRM系统的冗长类型的权利表达特征的情况下确定权利。作为替代,优选实施例使用可以上下文交互的一组精巧的(crafted)权利对象。这些对象描述了在诸如用户、设备、内容及其组之类的实体之间的关系和控制。例如,这种上下文交互可以允许设备确定可以播放给定内容,这是因为(a)内容从用户目前预订的合法内容服务获得,(b)所述用户是特定家庭组的一部分,并且(c)所述设备与此特定家庭组相关联。存在诸如在此例子中所描述的那些多种类型的关系,用户可以直观地理解所述关系,并且这里所描述的系统和方法的优选实施例能够创建自然理解这种关系的系统。在实体之间的关系可以随时间创建、销毁和改变,并且优选实施例提供了用于在动态联网环境中——消费者可以自然理解的环境——确定权利的自然方式。尽管如此,如果内容部署者想要使用更传统的权利表达方式,那么优选实施例也可以适应该方式。例如,可以使用工具来把传统的权利表达转换为诸如上述的那些对象组,和/或可以实现用于直接对这种权利表达操作的DRM引擎。作为选择,在一些实施例中,设备不必理解这种传统的权利表达,并且不受它们的局限性的约束。
这里所描述系统和方法的优选实施例还具有媒体服务的十分一般的概念。广播服务和因特网下载或预订服务是媒体服务的例子。与这些服务相关联的限制可以使内容难于共享。利用这里所描述的系统和方法的优选实施例,内容可以在广播、宽带和移动服务上获得,并且在包括便携式设备的家里的一组网络设备上共享。作为选择或另外,可以由单个设备经由无线连接依照对等方式来提供服务。例如,具有新一代WiFi功能的手机可以向其它设备提供内容范畴服务。这种服务允许其它设备‘看看’什么内容可用来与所述设备共享。所述服务提供了能够用来确定权利以使得可以接受或容易地消除任何限制的信息。
这里所描述的系统和方法的优选实施例不限于一个服务或一个平台。如上所述,优选实施例能够与包括‘个人服务’的很多服务一起工作。随着家庭和个人网络变得更加普遍,这变得越来越重要。例如,数字照相机现在可与WiFi连接一起使用,使得经由网络共享照片非常方便。能够使照片共享自动化很好,但是照相机因为被四处携带而遇到许多不同的网络。自动化共享是便利的,但是个人照片当然是个人的。这里所描述的系统和方法的实施例使得在家庭内在家庭设备上共享照片很容易,而不与碰巧在网络上遇到所述照相机的任意设备共享。通常,随着更多设备变得可联网,管理在那些设备上的所有内容的权利变得越来越重要。尽管联网目的在于允许联网的设备上的信息被共享,不过网络会彼此重叠和合并。网络使内容能够容易地被共享,但是该内容不应当被任意地共享。从而,希望具有这样的DRM系统,其能够觉察到网络并且可以使用由内容、用户、网络和设备特征所提供的上下文来确定是否应当共享并且怎样来共享内容。这里所描述的系统和方法的优选实施例能够实现这种方法。
6.用于内容消费和封装的参考体系结构 下面描述了用于消费受DRM保护的内容的消费应用(例如,媒体播放器)和用于封装目标为消费应用的内容的封装应用(例如,位于服务器上的应用)的参考体系结构。
1.17.客户端体系结构 下面提供了DRM引擎的说明性实施例可以为用于消费内容的主机应用而执行的功能的例子。
1.17.1.主机应用到DRM引擎的接口 尽管在优选实施例中DRM引擎并不要求API,不过下面是在一个说明性实施例中由说明性DRM引擎(被称为‘章鱼’DRM引擎)向主机应用所提供的接口类型的高级描述 Octopus::CreateSession(hostContextObj ect)→Session—给定主机应用上下文,来创建会话。上下文对象由章鱼DRM引擎用来向应用进行回调。
Session::ProcessObj ect(drmObject)—此函数当主机应用遇到媒体文件中的某些类型的对象时应当被主机应用调用,所述媒体文件可以被标识为属于DRM子系统。这种对象包括内容控制程序、成员资格令牌等。那些对象的语法和语义对主机应用来说是不透明的。
Session::OpenContent(contentReference)→Content——主机应用当需要与多媒体内容文件相交互时调用此函数。DRM引擎返回内容对象,所述内容对象随后可以用来获取关于所述内容的DRM信息并且与之相交互。
Content::GetDrmInfo()—返回关于内容的DRM元数据,所述DRM元数据另外在所述文件的常规元数据中是不可得的。Content::CreateAction(actionInfo)→Action—主机应用当想要与内容对象相交互时调用此函数。actionInfo参数指定应用需要执行什么类型的动作(例如,播放)以及如果必要的话(任何相关联的参数)。所述函数返回动作对象,所述动作对象然后可以用来执行所述动作并且获取内容密钥。
Action::GetKeyInfo()—返回为解密子系统解密所述内容所必须的信息。
Action::Check()—检查DRM子系统是否授权执行此动作(即Action::Perform()是否会成功)。
Action::Perform()—执行所述动作,并且按照管理支配此动作的规则所指定来执行任何结果(具有它们的副作用)。
1.17.2.DRM引擎到主机服务的接口 下面是由DRM引擎的说明性实施例从主机应用的说明性实施例所需要的主机服务接口类型的例子。
HostContext::GetFileSystem(type)→FileSystem—返回DRM子系统具有独占访问权的虚拟FileSystem(文件系统)对象。此虚拟FileSystem用来存储DRM状态信息。此FileSystem内的数据应当只能由DRM子系统读取和写入。
HostContext::GetCurrentTime()—返回由主机系统维护的当前日期/时间。
HostContext::GetIdentity()—返回此主机的唯一ID。
HostContext::ProcessObject(dataObject)—向主机服务返回数据对象,所述数据对象可能已经被嵌入在DRM对象内,但是DRM子系统已经被标识为由主机(例如,证书)管理。
HostContext::VerifySignature(signatureInfo)—检查数据对象上的数字签名的有效性。在一个实施例中,signatureInfo对象包含等效于在XMLSig元项中所找到信息的信息。主机服务负责管理为验证所述签名所必需的密钥和密钥证书。
HostContext::CreateCipher(cipherType,keyInfo)→Cipher—创建DRM子系统可以用来加密并解密数据的密码对象。最小的一组密码类型将被定义,并且每种类型定义有用于描述由密码实现方式所要求的密钥信息的格式。
Cipher::Encrypt(data) Cipher::Decrypt(data) HostContext::CreateDigester(digesterType)→Digester—创建所述DRM子系统可以用来对一些数据计算安全散列的摘要对象。在一个实施例中,可以定义最小的一组摘要类型。
Digester::Update(data) Digester::GetDigest() 1.17.3.UML顺序图 图26图示了在先前部分中所阐明的说明性API的使用以及在示例性实施例中在主机应用和DRM客户端引擎之间进行的交互。
1.18.封装器参考体系结构 下面提供了封装引擎可以为用于封装的内容的主机应用所执行的功能的例子。在实践中,封装应用可以特别集中于封装,或者可以是在用户系统操作的通用应用的一部分,所述通用应用也访问受保护的内容(在本地或者例如在网络上的其它地方封装的)。
1.18.1.主机应用到封装引擎的接口 本部分提供了在主机应用和结合被称为“章鱼”的参考DRM引擎所使用的封装引擎之间的说明性API的高级描述。
Octopus::CreateSession(hostContextObject)→Session。给定主机应用上下文来创建会话。由此函数所返回的上下文对象由封装引擎用来向应用进行回调。
Session::CreateContent(contentReferences[])→Content。主机应用调用此函数以便创建将在随后的步骤中与许可对象相关联的内容对象。在contentReferences(内容引用)数组中具有一个以上内容引用意味着这些在一捆中被绑定在一起(例如,一个音频和一个视频曲目)而且所发出的许可应当目标在于这些引用,作为一个不可分的组。
Content::SetDrmInfo(drmInfo)。drmInfo参数指定将发出的许可的元数据。drmInfo充当用于把许可转换为用于虚拟机的字节码的指南。
Content::GetDRMObjects(format)→drmObjects。当主机应用准备获取封装器引擎所创建的drmObjects时,此函数被调用。格式参数表明这些对象所希望的格式(例如,XML或二进制原子)。Content::GetKeys()→keys[]。此函数当主机封装应用需要用于加密内容的密钥时被主机封装应用调用。在一个实施例中,每个内容引用存在一个密钥。
1.18.2.封装引擎到主机服务的接口 下面是在一个实施例中说明性封装引擎需要主机应用提供的接口类型的例子。
HostContext::GetFileSystem(type)→FileSystem。返回DRM子系统具有独占访问权的虚拟FileSystem对象。此虚拟FileSystem可以用来存储DRM状态信息。此FileSystem内的数据应当只能由DRM子系统读取和写入。
HostContext::GetCurrentTime()→Time。返回由主机系统维护的当前日期/时间。
HostContext::GetIdentity()→ID。返回此主机的唯一ID。
HostContext::PerformSignature(signatureInfo,data)。由封装引擎所创建的一些DRM对象必须被信任。由主机所提供的此服务用来为所指定的对象签名。
HostContext::CreateCipher(cipherType,keyInfo)→Cipher。创建封装引擎可以用来加密和解密数据的密码对象(能够加密和解密数据的对象)。在一个实施例中,密码对象用来加密在内容密钥对象中的内容密钥数据。
Cipher::Encrypt(data)。加密数据。
Cipher::Decrypt(data)。解密数据。
HostContext::CreateDigester(digesterType)→Digester。创建可以由封装引擎用来对一些数据计算散列的摘要对象。
Digester::Update(data)。把数据馈送到摘要对象。
Digester::GetDigest()。计算摘要。
HostContext::GenerateRandomNumber()。产生可以用于产生密钥的随机数。
图27是用于示出上面所阐明的说明性API的使用以及在一个说明性实施例中在主机应用和封装引擎之间进行的交互的例子的UML图。
7.对象 此部分提供了关于DRM对象的更多信息,所述DRM对象充当DRM引擎的说明性实现方式的构建块。首先,给出了由DRM引擎用于内容保护和管理支配的对象类型的相对高级的概观。接下来,它们表达的这些对象和信息的更详细描述连同在一个说明性实施例中所使用的一些示例性数据结构一起被提供了。
1.19.内容保护和管理支配DRM对象 如先前结合图6所描述,内容管理支配对象(有时与节点和链路对象一起被称作为‘DRM对象’)用来把使用规则和条件与受保护的内容相关联。这些对象一起形成了许可。
如图6所示,使用密钥来加密由内容对象614所表示的数据。解密所述内容所需要的该密钥由内容密钥对象602表示,并且在所述内容和用于加密该内容的密钥之间的绑定由保护器对象604来表示。用于管理支配对解密密钥的使用的规则由控制对象608来表示,并且在内容密钥602和控制对象608之间的绑定由控制器对象606来表示。在一个实施例中,受信系统只在由控制对象608中的字节代码所表达的规则的管理支配下利用内容解密密钥。图28A是诸如在图6中所示出的该许可的更详细图解,并且图示了在一个实施例中所使用的签名方案。
1.19.1.公用元项 在一个实施例中,对象共享通用的基本特性它们都可以具有ID、属性列表和扩展列表。
1.19.1.1.ID 由其它对象所引用的对象具有唯一的ID。在一个实施例中,ID简单地是URI,并且按照惯例,那些URI为URN。
1.19.1.2.属性 属性是有类型的值。属性可以是有名或无名的。有名属性的名称是简单的字符串或URI。属性值具有简单类型(字符串,整数或字节数组)或复合类型(列表和数组)。类型‘列表’的属性包含有名属性的无序列表。类型‘数组’的属性包含无名属性的有序数组。
对象的‘属性’字段是有名属性的无序集合(可能是空的)。
1.19.1.3.扩展 扩展是可以被添加到对象以便携带可选的或强制性的额外数据的元项。扩展是有类型的,并且也具有唯一的ID。扩展可以是内部或外部的。
1.19.1.3.1.内部扩展 内部扩展包含在它们扩展的对象中。它们具有‘关键’标志,用于表明是否要求所述扩展的特定扩展数据类型为使用对象的实现方式所知。在一个实施例中,如果实现方式遇到具有关键扩展的对象,其中所述关键扩展具有它并不理解的数据类型,那么所述实现方式必须拒绝整个对象。
在一个实施例中,内部扩展的ID需要是本地唯一的对象无法包含具有相同ID的两个扩展,但是两个不同的对象都可以包含具有与另一对象的扩展相同的ID的扩展。
对象的‘扩展’字段是有内部扩展的无序集合(可能是空的)。
1.19.1.3.2.外部扩展 外部扩展并不包含在它们扩展的对象中。它们独立于对象出现,并且具有‘主题’字段,所述‘主题’字段包含它们扩展的对象的ID。在一个实施例中,需要外部扩展的ID是全局唯一的。
1.19.2.内容 在一个实施例中,内容对象是‘外部’对象。其格式和存储不受DRM引擎的控制,但是受主机应用的内容管理子系统的控制(例如,所述内容可以是MP4电影文件、MP3音乐曲目等)。在一个实施例中,内容的格式需要向把ID与内容有效载荷数据相关联提供支持。依照格式相关的方式来加密内容有效载荷(一般利用对称密码,诸如AES)。
1.19.3.内容密钥 内容密钥对象表示唯一的加密密钥,并且把ID与之相关联。ID的目的在于使保护器对象和控制器对象能够引用内容密钥对象。在内容密钥对象中所封装的实际密钥数据自身被加密,使得它只可以由被授权来解密所述内容的接收者读取。内容密钥对象指定使用哪个密码系统来加密密钥数据。用于保护内容密钥数据的密码系统被称作密钥分发系统。可以使用不同的密钥分发系统。密钥分发系统的例子是上述Scuba密钥分发系统。
1.19.4.保护器 保护器对象包含可以找出使用哪个密钥来加密内容对象的数据的信息。它还包含关于使用哪个加密算法来加密该数据的信息。在一个实施例中,保护器对象包含作为内容对象引用的一个或多个ID以及正好包含表示用于加密数据的密钥的内容密钥对象引用的一个ID。如果保护器指向一个以上的内容对象,那么所有那些内容对象表示已经使用相同的加密算法和相同的密钥而加密的数据。在一个实施例中,除非所使用的密码系统允许一种对不同的数据项使用相同密钥的安全方式,否则并不建议保护器对象指向一个以上的内容对象。
1.19.5.控制 控制对象包含用于允许DRM引擎判定当对内容的某些动作被主机应用请求时所述动作是否应当被允许的信息。在一个实施例中,用于管理支配对内容密钥使用的规则在控制对象中被编码为供虚拟机执行的字节代码。控制对象还具有唯一的ID使得它可以由控制器对象引用。在一个实施例中,控制对象被签名,使得DRM引擎可以验证所述控制字节代码在用来判定之前是有效的并被信任。选择性地,还可以通过验证在控制器对象中所包括的安全散列来导出控制对象的有效性。
1.19.6.控制器 控制器对象包含用于允许DRM引擎找出哪个控制来管理支配对由内容密钥对象所表示的一个或多个密钥的使用的信息。控制器对象包含用于把它绑定到它引用的控制对象和内容密钥对象的信息。在一个实施例中,控制器对象被签名(例如,被具有用于允许它签名控制器对象的证书的封装应用签名),使得可以确立在内容密钥和管理支配它的控制对象之间的绑定的有效性以及在内容密钥ID和实际密钥数据之间的绑定的有效性。控制器对象的签名可以是公钥签名或对称密钥签名或两者的结合。当在控制器对象中包括由控制器对象所引用的控制对象摘要时,还可以在不必独立地验证控制对象的签名的情况下推导控制对象的有效性。
1.19.6.1.对称密钥签名 在一个实施例中,这是控制器对象的优选类型签名,并且通过计算控制器对象的消息认证代码(Message Authentication Code MAC)来实现,利用与由相应的内容密钥对象所表示的密钥相同的密钥来加密钥。在一个实施例中,用于此MAC的规范方法是利用与为在相同部署中所使用的PKI签名算法所选择的相同散列算法来使用HMAC。
1.19.6.2.公钥签名 当需要知道控制器对象的签名人身份时使用此类签名。此类签名利用公钥签名算法来实现,利用断言此对象有效性的委托人(principal)的私钥来签名。在一个实施例中,当使用此类签名时,对称密钥签名也存在,并且对控制器对象以及公钥签名进行签名,使得可以保证利用其私钥签名的委托人也知道在内容密钥对象中所携带的内容密钥的实际值。
1.20.身份和密钥管理DRM对象 如前所述,节点对象表示DRM简档中的实体,并且不使用隐式的或显式的语义来定义节点对象表示什么。系统的给定部署(DRM简档)定义了存在什么类型的委托人,并且不同的节点对象表示什么角色和身份。典型情况下使用节点对象的属性来表达该语义信息。
链路对象表示在节点之间的关系。选择性地,链路对象还可以包含一些密码数据,所述密码数据允许所述链路用于内容密钥推导。仅仅对于节点来说,在一个实施例中,不使用隐式的或显式的语义来定义链路关系意指什么。取决于链路的来自和去往节点在给定DRM简档中表示什么,链路关系的意义可以表达成员资格、所有权、关联性和/或许多其它类型的关系。在典型的DRM简档中,一些节点对象可以表示用户,其它节点可以表示设备,并且其它节点可以表示用户组或授权域(authorized domains AD)。在这种情境中,在设备和用户之间的链路可以表示所有权关系,并且在用户和用户组或授权域之间的链路可以表示成员资格关系。图28B图示了在一个示例性实施例中在节点和链路之间的结构和相互关系。
1.20.1.节点 节点对象表示系统中的实体。节点对象的属性定义了节点对象所表示的某些方面,诸如在DRM简档情境中由节点对象所表示的角色或身份。节点对象还可以具有用于把机密信息的目标定为子系统的机密非对称密钥对,所述子系统有权访问所述节点对象的机密部分(典型情况下,由节点所表示的实体或负责管理该节点的某个实体)。可以利用节点的机密公钥来加密目标在该节点的机密信息。节点对象还可以具有共享非对称密钥对,并且共享对称密钥当系统使用内容密钥推导系统来用于内容密钥分发时能够被结合链路对象使用,所述内容密钥推导系统诸如在此的其它地方所描述。在优选实施例中,只有需要被链路或控制对象引用或者接收密码目标的信息的实体需要具有相应的节点对象。
1.20.2.链路 链路对象是签名的声明,在其顶点为节点对象的图中存在有向边。对于一组给定节点和链路来说,我们认为如果在图中的节点X顶点和节点Y顶点之间存在有向路径,那么在节点X和节点Y之间存在路径。当在节点X和节点Y之间存在路径时,我们认为节点Y可从节点X到达。使用由链路对象所表示的声明来表达哪些节点可从其它节点到达。用于管理支配内容对象的控制可以在它们允许执行动作之前检查某些节点可从与用于执行所述动作的实体相关联的节点到达。例如,如果节点D表示想要对内容对象执行‘播放’动作的设备,那么用于管理支配所述内容对象的控制可以测试用于表示某一用户的某一节点U是否可从节点D到达。为了确定节点U是否是可到达的,DRM引擎可以检查是否存在可以在节点D和节点U之间建立路径的一组链路对象。
在一个实施例中,DRM引擎在它使用链路对象来判定在节点图中存在路径之前验证所述链路对象。取决于用于对链路对象进行签名的证书系统(例如,x509v3)的特定特征,链路对象可以被给予有限的使用期、被撤销等。在一个实施例中,用于管理支配哪些密钥可以对链路对象签名、可以创建哪些链路对象以及链路对象的使用期的策略并不直接由DRM引擎来处理。作为替代,那些策略平衡节点的属性信息。为了使强制实施某些策略的任务便于进行,在一个实施例中,提供了一种用于利用附加约束检查来扩展标准的证书格式的方式。这些扩展使得可以表达对用于为链路签名的密钥的证书的有效性约束,以致可以在链路被认为有效之前检查诸如所述链路连接什么类型节点的约束以及其它属性。
在一个实施例中,链路对象可以包含用来约束链路有效性的控制对象。另外,在一个实施例中,链路对象可以包含密码密钥推导数据,密码密钥推导数据用于向用户提供用于密钥分发的共享密钥。该密码数据除元数据之外包含“来自”节点的私有和/或对称共享密钥,其利用“去往”节点的共享公钥和/或共享对称密钥来加密。
1.21.数据结构 以下段落更详细地描述了上述对象的说明性对象模型,用于定义在一个说明性实施例中每种对象所具有的字段。使用相对简单的对象描述语法来描述数据结构。每种对象类型由可以扩展父的类来定义类(这是“是-(is-a)”关系)。类描述是采用简单的抽象类型‘string’(字符串)、‘int’(整数值)、‘byte’(8位值)和‘boolean’(真或假)的术语,但是对于那些数据类型或者包含那些类型的复合结构不定义任何特定编码。编码或表示对象的方式可以根据引擎的实现方式改变。在实践中,DRM引擎的使用的给定简档可以指定怎样表示字段(例如,使用XML模式)。
在一个说明性实施例中,使用以下符号

1.21.1.公用结构 在一个说明性实施例中,使用以下公用结构 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.属性 在一个实施例中,存在四种属性IntegerAttribute、StringAttribute、ByteArrayAttribute和ListAttribute,每种属性具有名字和类型。

1.21.1.2.扩展 在所讨论的说明性实施例中,存在两种类型的扩展在Octobject内携带的内部扩展和在Octobject外携带的外部扩展。

在一些实施例中,即便给定实现方式并不理解特定类型的ExtensionData,也能够验证对象的签名,这将是重要的。从而在一个实施例中,添加与dataDigest字段的间接级别。如果ExtensionData的规范要求所述数据是特定对象的上下文内签名的一部分,那么dataDigest字段将存在。然后,理解此ExtensionData并且因此能够计算其规范表示的实现方式可以验证所述摘要。如果在这种实施例中此ExtensionData的规范要求所述数据不是签名的一部分,那么dataDigest字段将不存在。
1.21.2.节点对象
1.21.3.链路对象
1.21.4.控制对象
1.21.5.内容密钥对象

在一个实施例中,每个密钥具有唯一的id、格式、使用(可以为空)和数据。‘使用’字段如果不为空的话,那么指定所述密钥可以用于做什么。对于正常内容密钥来说,此字段为空。在使用诸如上述的密钥分发方案的实施例中,此字段可以指定这是共享密钥还是机密密钥。‘格式’字段指定‘数据’字段的格式(诸如对于对称密钥来说为‘RAW’,或者对于RSA私钥来说为‘PKCS#8’等)。‘数据’字段包含依照‘格式’字段格式化的实际密钥数据。
对于作为密钥对一部分的密钥(诸如RSA密钥)来说,额外的字段‘pairId’给出了用于该对的唯一标识符,使得可以从其它数据结构引用该对。
在一个实施例中,密钥对象中的数据字段是实际密钥的明文值(即,它是将被散列的密钥的明文值),即便该对象的实际表示包含该密钥的加密拷贝也是如此。
1.21.6.控制器对象
8.虚拟机 这里所描述DRM引擎的优选实施例使用虚拟机(这里有时被称作为“控制虚拟机”、“控制VM”或简单地为“VM”)来执行用于管理支配对内容进行访问的控制程序。下面描述这种虚拟机的说明性实施例,可以对此说明性实施例进行各种修改和设计考虑。还描述了把虚拟机(被称为“Plankton(浮游生物)”虚拟机)的说明性实施例与DRM引擎(被称为“章鱼”)的说明性实施例相集成。然而应当理解,这里所描述的数字权利管理引擎、体系结构及其它系统和方法的实施例可以以任何适当的虚拟机的方式来使用,或者在一些实施例中,根本没有虚拟机,从而应当理解,下面所提供的关于虚拟机示例性实施例的细节只是为了说明而并非是限制。
在优选实施例中,控制VM是传统的虚拟机,被设计成用于易于使用具有很小代码脚印(footprint)的各种编程语言来实现。它是基于简单的、面向堆栈的指令集,其被设计成是最低限度的,而不会过度考虑执行速度或代码密度。在要求简洁代码的情况下,可以使用数据压缩技术来压缩虚拟机的字节代码。
在优选实施例中,控制虚拟机被设计成用于适于作为用于低或高级程序设计语言的目标,并且支持汇编语言,C和FORTH。另外应当理解,可以依照相对简单的方式创建用于诸如Java或客户语言之类的其它语言的编译器来把代码编译为由虚拟机所使用的格式(例如,字节代码)。在一个实施例中,控制虚拟机被设计成用于在主机环境内被主控,而不是在处理器或硅中直接运行。在优选实施例中,用于虚拟机的自然主机环境是DRM引擎,不过应当理解,这里所描述的虚拟机体系结构作为选择或另外可以在其它情境中使用。
图29图示了控制虚拟机2902的说明性实现方式的操作环境。如图29所示,在一个实施例中,虚拟机2902在其主机环境2904的情境下运行,当虚拟机执行程序2906时所述主机环境2904实现了所述虚拟机所需要的一些功能。典型情况下,控制VM在DRM引擎2908内运行,所述DRM引擎2908实现其主机环境。如图29所示,在优选的数据库中,虚拟机2902和DRM引擎2908有权访问安全数据库2910以便持久地存储状态信息。
1.22.体系结构 1.22.1.执行模型 在优选实施例中,VM通过执行在代码模块中用字节代码所存储的指令来运行程序。一些指令可以通过进行系统调用来调用在程序本身之外实现的功能。系统调用可以由VM本身来实现或被委托给主机环境来实现。
在一个实施例中,VM执行在代码模块中所存储的指令,所述指令作为被加载到存储器中的字节代码流。VM维持被称作程序计数器(Program Counter PC)的虚拟寄存器,当执行指令时使所述程序计数器增加。VM顺次地执行每个指令,直到遇到OP_STOP指令,在空调用栈的情况下遇到OP_RET指令,或者出现运行时异常。跳转被指定为相对跳转(被指定为从当前的PC值偏移的字节)或指定为绝对地址。
1.22.2.存储器模型 在一个实施例中,VM使用相对简单的存储器模型,其中存储器被分成数据存储器和代码存储器。例如,数据存储器可以被实现为起始于地址0的单个、平面、连续的存储空间,并且可以被实现为在主机应用或主机环境的堆存储器内分配的字节数组。在一个实施例中,试图访问在所分配空间之外的存储器导致运行时异常,所述运行时异常会导致程序执行终止。
在由虚拟机并发加载的几个代码模块之间潜在地共享数据存储器。数据存储器中的数据可以由存储器访问指令访问,所述存储器访问指令在一个实施例中可以为32比特或8比特访问。使用大端(big-endian)字节次序来执行32比特存储器访问。在优选实施例中,关于在虚拟机可见的存储器和主机管理的存储器(即,主机CPU虚拟或物理存储器)之间的对准并不做任何假定。
在一个实施例中,代码存储器是起始于地址0的单个、连续的存储空间,并且可以被实现为在主机应用或主机环境的堆存储器内分配的字节数组。
VM可以支持加载一个以上代码模块。如果VM加载几个代码模块,那么在一个实施例中,所有代码模块共享相同的数据存储器(不过优选地,每个模块的数据被加载在不同的地址),但是每个代码模块具有其自己的代码存储器,从而防止一个代码模块中的跳转指令导致跳转到另一代码模块中的代码。
1.22.3.数据堆栈 在一个实施例中,VM具有数据堆栈的概念,表示在数据存储器中所存储的32比特数据单元。VM维持被称作堆栈指针(Stack Pointer SP)的虚拟寄存器。在复位之后,SP指向数据存储器末尾,并且堆栈向下发展(当把数据压到数据堆栈上时,使SP寄存器减少)。堆栈上的32比特数据单元根据引用堆栈数据的指令而被解释为32比特地址或32比特整数。地址是无符号整数。在一个实施例中,数据堆栈上的所有其它32比特整数值除非另作说明否则被解释为带符号整数。
1.22.4.调用堆栈 在一个实施例中,VM管理用于进行子例程调用的调用堆栈。在一个实施例中,被压到此堆栈上的值无法被存储器访问指令直接读取或写入。当执行OP_JSR、OP_JSRR和OP_RET指令时,此堆栈由VM内部使用。对于给定的VM实现方式来说,此返回地址堆栈的大小可以被固定为最大,这只允许一定数目的嵌套调用。
1.22.5.伪寄存器 在一个实施例中,VM在数据存储器开始时保留小地址空间以便映射伪寄存器。在一个实施例中,这些伪寄存器的地址是固定的。例如,可以定义以下寄存器
1.22.6.存储器映象 下面在说明性实施例中示出了数据存储器和代码存储器的布局数据存储器
代码存储器

1.22.7.执行例程 在执行代码例程之前,在一个实施例中,虚拟机实现方式复位数据堆栈指针以便指向初始化数据堆栈的顶部。初始化的数据堆栈包含例程的输入数据,并且扩展到数据存储器的末尾。初始化的数据堆栈可以被用为向例程传递输入自变量的方式。当不存在初始化的数据堆栈时,数据堆栈指针指向数据存储器的末尾。在一个实施例中,初始调用堆栈是空的或者包含指向OP_STOP指令的单端返回地址,这在利用OP_RET指令完成例程的情况下,将强制执行例程以结束于OP_STOP指令。
当因为已经执行具有空调用堆栈的最终OP_RET指令或已经执行最终OP_STOP指令所以执行停止时,留在数据堆栈上的任何数据被认为是例程的输出。
1.22.8.运行时异常 在一个实施例中,任何以下条件被认为是造成执行立即停止的运行时异常 ●试图访问在当前数据存储器地址空间之外的数据存储器。
●试图把PC设置为或使所述PC到达在当前代码存储器的地址空间之外的代码地址。
●试图执行未定义的字节代码。
●试图执行具有等于0的栈顶操作数的OP_DIV指令。
●试图执行具有等于0的栈顶操作数的OP_MOD指令。
●调用堆栈的上溢或下溢。
1.23.指令集 在一个实施例中,控制VM使用相对简单的指令集。尽管是有限的,不过指令数目足以表达任意复杂的程序。指令及其操作数由字节代码流来表示。在一个实施例中,指令集是基于堆栈的,并且除OP_PUSH指令之外,没有一个指令具有直接操作数。从数据堆栈中读取操作数,并且把结果压到数据堆栈上。在一个实施例中,VM是32比特VM所有指令对用于表示存储器地址或带符号整数的32比特堆栈操作数进行操作。利用2的补码二进制编码来表示带符号整数。在以下表中示出了供控制VM使用的指令集的说明性实施例。在该表中,用于具有两个操作数的指令的堆栈操作数被列为“A,B”,其中在堆栈顶部的操作数被列在最后(即,“B”)。除非另作说明,否则在一个说明性实施例的下面描述中所使用的术语‘压入’指的是把32比特的值压入到数据堆栈的顶部上。




1.24.代码模块 在优选实施例中,依照与用于MPEG-4文件格式类似或完全相同的基于原子格式来存储代码模块,其中原子包含32比特大小(例如由依照大端字节次序的4字节表示),后面是4字节类型(例如,对应于字母表字母的ASCII值的字节),后面是有效载荷(例如,8字节)。
图30示出了说明性代码模块3000的格式。参照图30,pkCM原子3002是最高级的代码模块原子。它包含子原子的序列。在一个实施例中,pkCM原子3002包含一个pkDS原子3004、一个pkCS原子3006、一个pkEX原子3008以及可能还包含一个pkRQ原子3010。pkCM原子3002还可以包含任意数目的其它原子,在一个实施例中所述其它原子如果存在的话那么被忽略。在一个实施例中,子原子的次序未被指定,因此实现方式不应当假定特定次序。
1.24.1.pkDS原子 如图30所示,pkDS原子3004包含可以被加载到数据存储器中的数据段的存储器映像3005。如图31A所示,在一个实施例中,存储器映像3005由字节3112的序列来表示,由一个首部字节3114后面是零或更多数据字节3116组成。首部字节3114编码用于标识随后字节3116的格式的版本号。
在一个实施例中,只定义了一个版本号(即,DataSegmentFormatVersion=0),并且依照此格式,存储器映像的数据字节表示要被加载到存储器中的原始映像。虚拟机加载器只加载存储器映像3105的数据字节3116,不包括首部字节3114。在一个实施例中,虚拟机加载器可操作来拒绝加载采用任何其它格式的映像。
1.24.2.pkCS原子 如图30所示,pkCS原子3006包含可以被加载到代码存储器中的代码段的存储器映像3007。如图31B所示,在一个实施例中,存储器映像3007由字节3120的序列来表示,其由一个首部字节3122后面是零或更多数据字节3124组成。首部字节3122编码用于标识随后字节3124的格式的版本号。
在一个实施例中,只定义了一个版本号(即,CodeSegmentFormatVersion=0),并且如图31C所示,在此版本中,在首部字节3122之后的字节包含另一首部字节3130,所述另一首部字节3130包含用于标识随后字节3132的字节代码编码的版本号。在图31C所示出的例子中,首部字节3130标识ByteCodeVersion=0,用于指定数据字节3132包含原始字节序列,所述原始字节序列具有诸如在上述示例性指令集中所定义的那些字节代码值。在优选实施例中,虚拟机加载器只加载数据字节的字节代码部分3132,而不加载两个首部字节3122、3130。
1.24.3.pkEX原子 再次参照图30,pkEX原子3008包含一列输出入口。在图30所示出的例子中,pkEX原子3008的第一组四个字节3009依照等于随后入口的数目的大端字节次序来编码32比特无符号整数。如图31D所示,每个随后的输出入口3160包括名称,其被编码为包含名称大小S的一个字节3162,后面是包含该名称的ASCII字符的S字节3164,包括终结零3166,后面是依照大端字节次序的32比特无符号整数3168,用于表示命名入口点的字节偏移,其从在31CS原子中所存储的字节代码数据开始测量。图31E示出了用于在偏移64的入口点MAIN的输出表入口3170的例子,其中第一字节3172指示名称(即“MAIN”)的大小加上末尾的零一共是五个字节,并且其中最后四个字节3174表明字节偏移是64。
1.24.4.pkRQ原子 如图30所示,pkRQ原子3010包含为了执行代码模块中的代码,由虚拟机实现方式所需要满足的要求。在一个实施例中,此原子是可选的,并且如果不存在的话,那么虚拟机使用默认实现方式设置,诸如可以由实现方式简档来定义。
在一个实施例中,pkRQ原子由32比特无符号整数值的数组组成,每个字段一个值
1.24.5.模块加载器 虚拟机负责加载代码模块。当加载代码模块时,在pkDS原子中所编码的数据段存储器映像被加载到在数据存储器中的存储器地址。该地址由VM加载器选择,并且当代码执行时被存储在DS伪寄存器中。
在pkCS原子中所编码的代码段存储器映像被加载到代码存储器中的存储器地址。该地址由VM加载器选择,并且当代码执行时被存储在CS伪寄存器中。
当加载代码模块时,如果在输出表的入口中找到名称为“Global.OnLoad”的特定例程,那么执行此例程。此例程不获取堆栈上的自变量,并且当返回时返回整数状态,0表示成功,并且负错误代码表示错误条件。
当卸载代码模块时(或当去掉已经加载模块的虚拟机时),如果在输出表中找到名称为“Global.OnUnload”的特定例程,那么执行该例程。此例程不获取堆栈上的自变量,并且当返回时返回整数状态,0表示成功,并且负错误代码表示错误条件。
1.25.系统调用 虚拟机的程序可以调用在它们的代码模块的代码段之外实现的函数。这通过使用OP_CALL指令来完成,所述OP_CALL指令获取用于指定系统调用号的整数堆栈操作数来调用。根据系统调用,实现方式可以是在不同的代码模块(例如,实用函数库)中由VM依照VM本机实现格式来直接执行或者被委托给外部软件模块(诸如VM的主机环境)来执行的字节代码例程。
在一个实施例中,如果利用包含并不对应于任何系统调用的号的操作数来执行OP_CALL指令,那么VM就好像SYS_NOP系统调用被调用一样来工作。
1.25.1.系统调用号分配 在所讨论的说明性实施例中,系统调用号0到1023被保留给固定系统调用(这些系统调用在所有VM实现方式上具有相同的号)。系统调用号1024到16383可用于VM动态分配(例如,由System.FindSystemCallByName所返回的系统调用号可以由VM动态地分配,并且不必在所有VM实现方式上是相同的号)。
在一个示例性实施例中,指定以下固定的系统调用号

1.25.2.标准系统调用 在一个实施例中,支持可用于写入控制程序的几个标准系统调用。这些调用包括在上面表中所列出的固定号的系统调用,以及具有动态确定的号的系统调用(即通过调用System.FindSystemCallByName系统调用来获取它们的系统调用号,它们的名称作为自变量来传递)。
在一个实施例中,在可能返回负错误代码的此节中所指定的系统调用可以返回具有任何负值的错误代码。节8.4.4定义了特定的说明性值。在一个实施例中,如果返回未被预定义的负错误代码值,那么就像它们是通用的错误代码值FAILURE那样来解释。
System.NoOperation。此调用没有输入并且不返回输出,并且简单地返回而不作任何事情。它主要用于测试VM。
System.DebugPrint。此调用从堆栈顶部获取包含空结束字符串的存储单元地址作为其输入,并且不返回输出。对此函数的调用使文本字符串被打印到调试输出,其在调试方面可能是有用的。如果VM实现方式不包括用于输出调试文本的手段(诸如可能是在非开发环境中的情况),那么VM可以忽略调用并且就好像已经调用System.NoOperation那样来处理它。
System.FindSystemCallByName。给定系统调用的名称,此调用寻找它的编号。所述调用(从堆栈的顶部)把包含要查找的系统调用名称的空结束ASCII字符串的地址作为其输入,并且如果执行具有所指定名称的系统调用,那么(向所述堆栈的顶部)返回系统调用号,如果没有执行该系统调用,那么返回ERROR_NO_SUCH_ITEM,并且如果出现错误,那么返回负错误代码。
System.Host.GetLocalTime。此调用没有输入并且向堆栈的顶部返回主机的当前本地时间值或负错误代码,所述当前本地时间值在一个实施例中被表示为等于自从1970 1月1日00:00:00以来过去的分钟数的32比特带符号整数。
System.Host.GetLocalTimeOffset。这调用没有输入,并且向堆栈的顶部返回主机的当前时间偏移(从UTC时间开始),所述当前时间偏移在一个实施例中被表示为其数目等于在本地时间和UTC(即LocalTime-UTC)时间之间分钟差的32比特带符号整数。
System.Host.GetTrustedTime。此调用没有输入,并且向堆栈顶部返回TrustedTime(信任时间)和一个或多个标志值。在一个实施例中,信任时间是信任计时时钟的当前值(如果系统包括这种信任时钟),或者如果信任时间不可用那么返回负错误代码。在一个实施例中,信任时间值被表示为其数目等于自从1970年1月1日00:00:00UTC以来过去的分钟的32比特带符号整数,或者为负错误代码。在一个实施例中,所述标志是用于进一步定义信任时钟的当前状态的标志比特组。在一个实施例中,如果已经出现错误(例如,TrustedTime值为负错误代码),那么对该标志所返回的值为0。
在一个实施例中,定义以下标志
此系统调用与用于执行信任时钟的系统相关,所述信任时钟可以与信任时间源同步并且维持单调的时间计数器。并不保证信任时间值始终是准确的,但是在一个实施例中要求以下特性为真 ●信任时间值被表示为UTC时间值(信任时间并不处于本地时区中,这是因为通常无法安全地确定当前的位置)。
●信任时间永远不会回退。
●信任时钟不比实际时间走得更快。
因此,在此示例性实施例中,TrustedTime值在最后同步的时间值(与信任时间源同步)和当前实际时间值之间。如果系统能够确定自从最后与信任时间源同步以来其信任时钟已经连续地并且通常不中断地操作并更新,那么它可以确定TrustedTime值并不是估计值而是准确值,并且把TIME_IS_ESTIMATE标志设置为0。
在一个实施例中,如果信任时钟检测到已经出现硬件或软件故障条件,并且它甚至不能返回信任时间的估计值,那么返回错误代码,并且把所返回标志的值设置为0。
System.Host.GetObject此系统调用是用于允许程序访问由虚拟机的主机所提供的对象的通用接口。System.Host.GetObject调用获取以下输入(从堆栈顶部向下列出)Parent(亲代),Name(名称),ReturnBuffer(返回缓冲器)和ReturnBufferSize(返回缓冲器大小)。其中“Parent”是亲代容器(parent container)的32比特句柄;“Name”是包含通向所请求对象的路径的空结束字符串相对于所述亲代容器的地址;“ReturnBuffer”是存储器缓冲器中将要存储所述对象值的的地址;并且“ReturnBufferSize”是用于表明其中将存储对象值的存储器缓冲器的字节大小的32比特整数。
System.Host.GetObject调用生成以下输出(从堆栈顶部向下列出)TypeID(类型ID),Size(大小)。其中“TypeId”是对象类型id,或者如果调用失败,那么是负错误代码。如果所请求的对象并不存在,那么所返回的错误为ERROR_NO_SUCH_ITEM。如果向返回值所提供的缓冲器太小,那么所返回的错误为ERROR_INSUFFICIENT_SPACE。如果正访问的对象树的一部分是被访问控制的,并且调用程序没有访问该对象的权限,那么返回ERROR_PERMISSION_DENIED。可以返回其它错误代码。“Size”是32比特整数,用于表明在由调用方所提供缓冲器中所返回的数据字节大小或者如果调用方提供了太小的缓冲器,那么它表明所要求的大小。
在一个实施例中,存在四种类型的主机对象字符串,整数,字节数组和容器。

在一个实施例中,字节数组对象值是8比特字节数组,字符串对象值是依照UTF-8编码(incoded)的空结束字符串,并且整数对象值是32比特带符号整数值。容器是包含任何类型组合的任意数目对象序列的通用容器。在容器中所包含的对象被称作该容器的孩子。容器值是在给定VM实例内唯一的32比特的容器句柄。在一个实施例中,根容器‘/’具有固定句柄值0。
在一个实施例中,用于主机对象的名称空间(namespace)是分级的,其中通过向亲代容器的名称追加孩子的名称来构造容器的孩子对象的名称,名称之间由‘/’符号来分隔。字符串和整数对象没有孩子。例如,如果容器被命名为‘/Node/Attributes’(/节点/属性),并且具有名称为‘Type(类型)’的字符串孩子,那么‘/Node/Attributes/Type(/节点/属性/类型)’指的是孩子字符串。
名称空间的根为‘/’。所有绝对名称以‘/’开始。并非以‘/’开始的名称都为相对名称。相对名称是相对于亲代容器的。例如,相对于亲代‘/Node(节点)’的名称‘Attributes/Type(属性/类型)’是具有绝对名称‘/Node/Attributes/Type’的对象。
在一个实施例中,容器对象还可以具有通过使用虚拟名称来访问的真正和虚拟的孩子对象。虚拟名称是并未被附着到主机对象的名称,但是惯例是标识未命名的孩子对象、具有不同名称的孩子对象或者虚拟孩子对象(并非是容器的真正孩子但是当请求时动态创建的孩子对象)。
在一个实施例中,对于对象来说,以下虚拟名称被定义为虚拟孩子对象名称 对于容器来说,在一个实施例中,以下虚拟名称被定义为虚拟孩子对象名称
例子 以下表示出了主机对象体系的例子
在此例子中,调用System.Host.GetObject(parent=0,name=”Node”返回类型ID 0(即,容器)),并且使句柄值1被写入到由调用方所提供的缓冲器中。值的大小为4字节。
调用System.Host.GetObject(parent=0,name=”Node/Attributes/Domain”)返回类型ID 2(即,字符串),并且使字符串“TopLevel”被写入到由调用方所提供的缓冲器中。值的大小为9字节。
调用System.Host.GetObject(parent=1,name=”Attributes/@1”)返回类型ID1(即,整数),并且使整数78被写入到由被调用方所提供的缓冲器中。值的大小为4字节。
调用System.Host.GetObj ect(parent=0,name=”DoesNotExist”)返回错误代码ERROR_NO_SUCH_ITEM。
System.Host.SetObject。此系统调用是用于允许程序创建、写入并销毁由虚拟机的主机所提供对象的通用接口。对象名称和类型的描述与上述System.Host.GetObject调用的描述相同。并非所有主机对象支持被写入或销毁,并且并非所有容器支持创建孩子对象。当对不支持该操作的对象进行SetObject调用时,返回ERROR_PERMISSION_DENIED。
System.Host.SetObject系统调用获取从堆栈顶部向下列出的以下参数作为输入 堆栈顶部
Parent(亲代)亲代容器的32比特句柄。
Name(名称)包含通向对象的路径的空结束字符串相对于亲代容器的地址。
ObjectAddress(对象地址)存储器缓冲器中存储对象值的地址。如果地址为0,那么调用被解释为销毁对象的请求。在该地址的数据取决于对象的类型。
ObjectType(对象类型)对象的类型ID。
ObjectSize(对象大小)用于表明其中存储对象值的存储器缓冲器的字节大小的32比特整数。在所讨论的说明性实施例中,所述大小对于整数对象来说被设置为4,并且对于字符串对象来说被设置为存储器缓冲器的大小,包括空终结符。对于字节数组对象来说,大小为数组中字节的数目。
System.Host.SetObject系统调用向堆栈顶部返回ResultCode作为输出。如果调用成功,那么ResultCode为0,并且如果调用失败,那么ResultCode为负错误代码。如果调用是用于销毁对象的请求并且所请求的对象不存在,或者所述调用是用于创建或写入对象的请求并且所述对象的亲代不存在,那么所返回的错误代码为ERROR_NO_SUCH_ITEM。如果正访问的对象树的一部分是受访问控制的,并且调用程序没有访问对象的权限,那么返回ERROR_PERMISSION_DENIED。还可以返回其它错误代码。
当对象指的是容器并且ObjectAddress不是0时存在一个特定情况。在这种情况下,ObjectSize参数被设置为0并且ObjectAddress值被忽略。如果容器已经存在,那么不作任何事情,并且返回SUCCESSResultCode。如果容器不存在,并且容器的亲代是可写的,那么创建空容器。
Octopus.Links.IsNodeReachable。此系统调用由控制程序用来检查给定节点是否可从与主控虚拟机的此实例的实体相关联的节点到达。调用从堆栈顶部获取NodeId作为其输入,其中NodeId是包含要测试可到达性的目标节点的ID的空结束字符串。作为输出,该调用向堆栈顶部返回ResultCode和StatusBlockPointer。ResultCode是一个整数值,如果该节点是可到达的,那么所述整数值为0,或者如果所述节点是不可到达的,那么所述整数值为负错误代码。StatusBlockPointer是标准ExtendedStatusBlock的地址,或者如果没有返回状态块,那么为0。
System.Host.SpawnVm。此系统调用由控制程序用来请求创建虚拟机的新实例并且加载新的代码模块。在一个实施例中,新创建的虚拟机的主机暴露与被暴露于调用方相同的主机对象,除主机对象“/Octopus/Runtime/Parent/Id”被设置为调用方的身份之外。在一个实施例中,此主机对象是容器。此容器的孩子是类型字符串的对象,均具有用于表示名称的值。在一个实施例中,那些名称的语义和具体细节由虚拟机主机的规范指定。
在一个实施例中,当运行用于调用方的代码的虚拟机终止时,尚未通过调用System.Host.ReleaseVm显式发布的任何产生的虚拟机由系统来自动发布,就好像已经调用System.Host.ReleaseVm一样。
System.Host.SpawnVm调用从堆栈顶部获取ModuleId(模块ID)作为其输入。ModuleId标识要被加载到新的虚拟机实例中的代码模块。在一个实施例中,虚拟机的主机的规范描述了用于定位对应于此模块ID的实际代码模块的机制。
System.Host.SpawnVm调用向堆栈顶部返回ResultCode和VmHandle。ResultCode是一个整数值,如果调用是成功的,那么所述整数值为0,并且如果所述调用失败,那么所述整数值为负错误代码。VmHandle是用于标识已经创建的虚拟机的实例的整数值。如果调用失败,那么此句柄被设置为0。在一个实施例中,只保证这句柄在其中做出此调用的虚拟机内是唯一的。
System.Host.CallVm。此系统调用由控制程序用来调用在代码模块中实现的例程,所述代码模块被加载到使用System.Host.SpawnVm系统调用创建的虚拟机实例中。此系统调用从堆栈顶部采取以下输入 堆栈顶部
VmHandle用于表示通过调用System.Host.SpawnVm而创建的虚拟机的句柄的整数值。
EntryPoint用于指定到调用的入口点名称的空结束字符串的地址。此名称需要匹配代码模块的输出表中的入口点之一,所述代码模块被加载到对应于VmHandle参数的虚拟机实例中。
ParameterBlockAddress包含要被传递到被调用方的数据的存储块的地址。如果没有向被调用方传递参数,那么此地址被设置为0。
ParameterBlockSize在地址ParameterBlockAddress的存储块的字节大小,或者如果ParameterBlockAddress为0,那么为0。
ReturnBufferAddress其中调用方可以从被调用方接收数据的存储器缓冲器的地址。如果调用方并不期望从被调用方返回任何数据,那么此地址被设置为0。
ReturnBufferSize在地址ReturnBufferAddress的存储器缓冲器的字节大小,或者如果ReturnBufferAddress为0,那么为0。
System.Host.CallVm调用向堆栈顶部返回以下输出 堆栈顶部
SystemResultCode整数值,如果调用成功,那么所述整数值为0,并且如果所述调用失败,那么所述整数值为负错误代码。此值由系统而不是由被调用方来确定。成功只是表明系统能够成功地找到要调用的例程,执行所述例程并且从所述例程获取返回值。在CalleeResultCode值中返回来自该例程本身的返回值。
CalleeResultCode由被调用方所返回的整数值。
ReturnBlockSize在由调用方所提供缓冲器中返回的数据字节大小,或者如果调用方提供了太小的缓冲器,那么它表明所要求的大小。如果被调用方没有返回数据,那么该值为0。
在所讨论的说明性实施例中,被调用例程符合以下接口惯例当调用所述例程时,堆栈顶部包含由调用方所提供的值ParameterBlockSize,后面是数据的ParameterBlockSize字节,所述值ParameterBlockSize表明参数块的大小。如果所述大小不是4的倍数,那么用零来填充堆栈上的数据以便确保堆栈指针保持为4的倍数。当返回时,被调用的例程在堆栈上提供了以下返回值 堆栈顶部
ReturnBlockAddress包含要被返回到调用方的数据的存储块的地址。如果没有返回数据,那么此地址被设置为0。
ReturnBlockSize在地址ParameterBlockAddress的存储块的字节大小,或者如果ReturnBlockAddress为0,那么为0。
System.Host.ReleaseVm。此系统调用由控制程序用来发布由对System.Host.SpawnVm的先前调用所产生的虚拟机。递归地发布由所发布的虚拟机产生的任何虚拟机等。System.Host.ReleaseVm调用从堆栈顶部获取VmHandle作为其输入,VmHandle表示通过调用System.Host.SpawnVm所创建的虚拟机的句柄。System.Host.ReleaseVm调用向堆栈顶部返回ResultCode作为输出。ResultCode是个整数值,如果调用是成功的,那么所述整数值为0,或者如果所述调用失败,那么所述整数值为负错误代码。
1.25.3.标准的数据结构 下面是由一些标准的系统调用所使用的标准数据结构。
1.25.3.1.标准参数 ParameterBlock Name参数的名称。
Value参数的值 ExtendedParameterBlock Flags布尔标志的向量。
Parameter包含名称和值的参数块。
NameBlock Size32比特无符号整数等于随后的“字符”字段的字节大小。如果此值为0,那么字符字段为空(即,后面什么都没有)。
Characters空结束UTF-8字符串。
ValueBlock Type32比特类型标识符。在一个实施例中,定义以下类型

Size32比特无符号整数等于随后的“数据”字段的字节大小。如果此值为0,那么数据字段为空(即,在ValueBlock中的大小字段后面什么都没有)。
Data用于表示值的8比特字节的数组。实际字节取决于由类型字段所指定的数据编码。
ValueListBlock ValueCount等于随后的ValueBlock结构数目的32比特无符号整数。如果此值为0,那么后面没有ValueBlocks。
Value0,Value1,...零或更多ValueBlock结构的序列。
1.25.3.2.标准的ExtendedStatus 标准的ExtendedStatusBlock是一般用于把扩展信息作为返回状态从调用传达到例程或系统调用的数据结构。它是可以在各种情境中使用的通用数据结构,对于其字段来说具有不同可能值的范围。在一个实施例中,如下定义ExtendedStatusBlock ExtendedStatusBlock GlobalFlags不管类别字段如何其语义都是相同的布尔标志。标志的位置和意义由使用标准ExtendedStatusBlock数据结构的简档来定义。
Category此状态所属的类别的唯一整数标识符。类别标识符值由使用标准ExtendedStatusBlock数据结构的简档来定义。
SubCategory用于进一步分类由此块所描述的状态类型的子类别的整数标识符(在所述类别内是唯一的)。
LocalFlags其语义局限于此状态块的类别和子类别局部的布尔标志。标志的位置和意义由用于定义并使用类别语义的简档来定义。
CacheDuration表明此状态可以被高速缓存(即保持有效)的持续时间。对于怎样来定义实际的持续时间值,参见下面CacheDurationBlock类型的定义。
Parameter零或更多ValueBlocks的列表。每个ValueBlock包含被编码为类型参数或ExtendedParameter值的参数。每个参数把名称绑定到类型值,并且用来编码灵活的变量数据,所述变量数据用于依照比只是类别、子类别、高速缓存持续时间和标志更详细的细节来描述状态块。
CacheDurationBlock Type用于值类型的整数标识符。在一个实施例中,定义以下类型 Value32比特整数,其意义取决于类型字段。
1.25.4.标准的结果代码 在各个API中使用标准的结果代码。可以定义其它结果代码以供在更特定的API中使用。

1.26.汇编器语法 此节描述了用于把程序编译为在此的其它地方所描述的字节码格式的示例性语法。应当理解,这只是一个可能语法的一个例子,并且可以使用任何适当的语法。如先前所表明,还应当理解,这里所给出的字节码格式也只是一个例子,并且这里所描述的系统和方法可以被以任何其它适当的字节代码格式或其它代码格式的方式使用。
汇编器读取包含代码、数据和处理指令的源文件,并且生成可以由控制虚拟机所加载的二进制代码模块。在一个说明性实施例中,汇编器逐行顺序地处理源文件。行可以是零或更多符号,后面是换行符。每行可以是以下之一空行(只是空白的)、段命令、数据命令、汇编器命令、代码指令、标记或输出命令。另外,每行可以以注解结束,其以‘;’符号开始并且继续直到该行的末尾。
从源文件所读取的数据和指令具有隐式的目的地段(即,其中当它们被VM加载时结束)。在解析过程期间的任何一点,汇编器具有“当前”段,其是用于数据和指令的隐式目的地段。可以使用段指令来改变当前段。
1.26.1.段命令 段命令改变解析器的当前段。在一个实施例中,所支持的段命令是.code和.data。.code段保持字节代码指令,并且.data段保持全局变量。
1.26.2.数据命令 数据命令指定将被加载到虚拟机的数据段中的数据(例如,整数和字符串)。在一个实施例中,所支持的数据命令是 ●.string“<some chars>”——指定一串符号。在一个实施例中,汇编器在字符串末尾添加值为0的八位字节。
●.byte<value>——指定8比特值。<value>可以被表示为十进制数或十六进制数(前缀为0x)。
●.long<value>——指定32比特值。<value>可以被表示为十进制数或十六进制数(前缀为0x)。
1.26.3.汇编器命令 在一个实施例中,所支持的汇编器命令是.equ<symbol>、<value>,用于把符号<symbol>设置为等于值<value>。符号一般被用为操作数或代码指令。
1.26.4.标签 标签是指向段内位置的符号。指向代码段中指令的标签一般用于跳转/分支指令。指向数据段中数据的标签一般用于参照变量。在一个实施例中,用于标签的语法是<LABEL> 注意,除可选注解之外,在“:”之后什么都没有。标签指向下一数据或指令的位置。在一个实施例中,可以具有指向相同地址的一个以上标签。
1.26.5.输出命令 输出命令用来在由汇编器所生成的代码模块的“输出”节中创建入口。输出节中的每个入口是(名称,地址)对。在所讨论的说明性实施例中,仅有代码段内的地址能够被在输出节中指定。
输出命令的语法是.export<label>,用于输出由<label>指向的地址,其名称为“<label>”。
1.26.6.代码指令 当编译前往代码段的数据时,汇编器读取用于直接或间接映射成字节代码的指令。在上面所示出的示例性指令集中,大部分虚拟机字节代码没有直接的操作数,并且在一行上以简单的助记符形式出现。为了使汇编器语法更加可读,一些指令接受伪操作数,所述伪操作数看起来好像它们是字节代码操作数,但是实际上并不是;在这种情况下,汇编器产生一个或多个字节代码指令以便产生就像所述指令的确具有直接操作数那样相同的效果。例如,分支指令使用伪操作数。
1.26.6.1.分支操作数 分支指令可以被逐字指定(没有任何操作数),或者被用被汇编器转换为相应的字节代码序列的可选操作数指定。可选操作数是整数常数或符号。当操作数是符号时,汇编器计算正确的整数相对偏移,使得分支结束于对应于所述符号的地址。
1.26.6.2.操作数入栈 在一个实施例中,PUSH指令始终获取一个操作数。该操作数可以是整数常数、符号或前缀“@”后面直接是标签名称之一。当该操作数是符号时,进栈的值是该符号的直接值,而不管所述符号是标签还是.equ符号(并不按照段偏移增加该值)。当该操作数是具有前缀“@”的标签名称时,进栈的值取决于标签指向什么。被压进堆栈的值是由标签所表示的绝对地址(即,被添加到段偏移的本地标签值)。
1.26.7.例子 ;常数 .equ SOMECONST,7 ;下面进入到数据段中 .data VAR1: .byte8 VAR2: .string“hello\0” VAR3: .long0xFFFCDA07 VAR4: .long0 ;下面进入到代码段中 .code FOO: PUSH1 ADD RET BAR: PUSH2 PUSH@FOO ;进栈标签FOO的地址 JSR ;跳转到标签FOO处的代码 PUSHSOMECONST ;进栈值7 PUSH@VAR1 ;进栈VAR1的地址 PUSH VAR1 ;进栈数据段内VAR1的偏移 PUSH@VAR3 ;进栈VAR3的地址 PEEK ;进栈VAR3的值 PUSH@VAR4 ;进栈VAR4的地址 POKE ;把堆栈顶部上的值存储到VAR4中 PUSH@VAR2 ;进栈字符串“hello”的地址 1.26.8.命令行语法 在一个实施例中,汇编器是可以利用以下语法调用的命令行工具“PktAssembler[options]<input_file_path><output_file_path>”,其中[options]可以是-cs int,-ds int,-xmlid或-h,其中“-cs int”是代码段地址值(默认=8),“-ds int”是数据段地址值(默认=4),“-xml id”用来输出控制对象作为具有所指定ID的XML文件,并且“-h”用来显示帮助信息。
9.控制 此节描述了控制对象的说明性实施例。控制对象可以用来表示用于通过准许或拒绝使用它们所控制的内容密钥对象来管理支配对内容进行访问的规则。它们还可以用来表示对它们被嵌入到的链路对象的有效性的约束。它们还可以被用为独立程序容器,代表诸如代理或委托之类的另一实体来运行所述独立程序容器。在一个实施例中,控制包含元数据和字节代码程序,用于执行特定的交互协议。控制协议的目的在于经由DRM引擎来指定在DRM引擎和控制程序之间或在主机应用和控制程序之间的交互。此节还描述了应用可以对内容执行的说明性动作,所述动作的参数应当被提供给控制程序,并且还描述所述控制程序怎样编码用于表明可以或不可以执行所请求动作的返回状态以及可以进一步描述所述返回状态的参数。
在此节中,使用以下缩写和字母缩略词( ●ESB扩展状态块 ●LSB最低有效位 ●字节8比特值或八位字节 ●字节代码用于编码可执行指令及其操作数的字节流 1.27.控制程序 在一个实施例中,控制对象包含控制程序。控制程序包括代码模块,所述代码模块包含可由虚拟机执行的字节代码,以及命名例程列表(例如,输出表中的入口)。
在一个实施例中,用于表示用来管理支配对内容项执行某个操作(诸如“播放”)的规则的例程集被称作‘动作控制’。用于表示对链路对象的有效性约束的例程集被称作“链路约束”。旨在代表远程实体执行的例程集(诸如在不同主机上运行的DRM引擎的情况下在协议会话期间)被称作“代理”。旨在代表另一控制执行的例程集(诸如当控制程序使用System.Host.CallVm系统调用时)被称作“委托”。
1.27.1.通向控制程序的接口 在一个实施例中,由在主机环境中运行的虚拟机来执行控制程序。可以依照任何适当的方式来执行主机环境;然而,为了便于解释以及为了图示,在下面论述中假定虚拟机主机环境的实现方式在逻辑上可以被分成两个部分主机应用和DRM引擎。然而应当理解,其它实施例可以具有不同的逻辑功能划分,其可以等价于上述逻辑结构。
如在图29中所示出,在优选实施例中,DRM引擎2908是在主机应用2900和控制程序2906之间的逻辑接口。主机应用2900向引擎2908做出逻辑请求,诸如为了某个目的(例如,播放或再现内容流)而请求访问内容密钥。在一个实施例中,引擎2908确保正确地实现下述交互协议,诸如通过确保关于控制程序的初始化、调用序列及其它交互细节的任何保证被满足来正确地实现。
当主机应用2900请求使用用于一组内容ID的内容密钥时,DRM引擎2908确定使用哪个控制对象。保护器对象允许引擎分析对于所请求的内容ID来说哪些内容密钥对象需要被访问。然后所述引擎寻找引用那些内容密钥对象的控制器对象。在一个实施例中,控制器对象可以引用一个以上内容密钥对象。这允许多个内容密钥对象由相同的控制对象来管理支配。当主机应用通过调用动作来请求访问内容密钥时,它可以请求作为一组的内容ID,在这个意义上对应于它们的内容密钥对象由相同的控制器对象来引用。在一个实施例中,不允许对访问由一个以上控制器对象引用的一组内容密钥的请求。
在一个实施例中,DRM引擎遵循用于把动作映射到例程名称的约定。例如在一个实施例中,对于下述每个例程来说,在代码模块的输出表入口中出现的名称是下面在节9.1.4-9.1.7中所示出的各自字符串。
1.27.1.1.控制加载 在一个实施例中,在引擎可以进行调用以便控制例程之前,它需要把控制的代码模块加载到虚拟机中。在一个实施例中,每个VM只加载一个代码模块。
1.27.1.2.原子性(Atomicity) 在一个实施例中,该引擎确保对控制程序内例程的调用相对于它使所述例程可用的资源来说是原子的,所述资源诸如对象(或“状态”)数据库。从而,在这种实施例中,所述引擎需要确保在执行它所调用的任何例程期间那些资源保持不被修改。这可以通过在例程调用期间有效地锁定那些资源或者通过防止多个VM并发地运行来完成。然而,所述引擎不必保证那些资源在连续的例程调用之间都不被修改。
1.27.2.控制协议 在一个实施例中,例程命名、输入/输出接口和用于代码模块中每个例程的数据结构一起构成控制协议。在控制对象的“协议”字段中表示由代码模块实现的协议。下述说明性控制协议被称作标准控制协议,并且其标识符(‘协议’字段值)是“http://www.octopus-drm.com/specs/scp-1_0”。
在一个实施例中,在DRM引擎加载代码模块并且调用控制程序中的例程之前,它需要保证与控制程序的交互要符合在协议字段中表示的特定协议id的规范。这包括关于需要实现的虚拟机特征的任何保证、关于可用于控制程序的地址空间大小的保证等。
对于诸如标准控制协议之类的控制协议来说,可以在不必创建新的协议规范的情况下随时间推移而演进。只要对协议所作出的改变符合规范的先前修订版,并且只要DRM引擎的现有实现方式以及符合该协议的现有控制程序继续依照所述规范来执行,那么所述改变就被认为是兼容的。这种改变例如可以包括新的动作类型。
1.27.3.字节代码类型 在上述涉及标准控制协议的说明性实施例中,字节代码模块的类型是“Plankton字节代码模块版本1.0”。在此示例性实施例中,控制对象的“类型”字段值是“http://www.octopus-drm.com/specs/pkcm-1_0”。
1.27.4.通用控制例程 通用例程是适用所述控制作为总体的例程,并且对于给定的动作或链路约束并不是专门的。在一个说明性实施例中使用以下通用控制例程 1.27.4.1.Control.Init 此例程是可选的(即,在所有控制中都不要求此例程)。如果使用此例程,那么在任何其它控制例程被调用之前,该引擎调用此例程一次。所述例程没有输入,并且向堆栈顶部返回ResultCode(结果代码)作为输出。ResultCode在成功时为0,或者在失败时为负错误代码。在一个实施例中,如果ResultCode不是0,那么该引擎中止当前的控制操作并且不对用于此控制的例程进行任何进一步的调用。
1.27.4.2.Control.Describe 此例程是可选的。通常,当应用请求由控制程序(即并非是针对具体动作)表示的规则的意义描述时调用该例程。所述例程没有输入,并且向堆栈顶部返回ResultCode和StatusBlockPointer(状态块指针)作为输出,其中ResultCode是整数值(如果例程成功完成那么为0,否则为负错误代码),并且其中StatusBlockPointer是标准ExtendedStatusBlock(扩展状态块)的地址。ExtendedStatusBlock包含这样的信息,应用可以解释该信息并使用它来向用户提供关于由控制程序所表示规则的意义的信息。
1.27.4.3.Control.Release 此例程是可选的。如果此例程存在,那么DRM引擎在它不再需要调用用于控制的任何其它例程之后调用所述例程一次。对于控制来说将不调用其它例程,除非启动了该控制的新使用(在这种情况下,Control.Init例程被再次调用)。所述例程没有输入,并且向堆栈顶部返回ResultCode作为输出。ResultCode在成功时为0,或者在失败时为负错误代码。
1.27.5.动作例程 每个可能的动作具有名称(例如,播放,转送,输出等)。在一个说明性实施例中,对于给定动作<Action>来说,以下例程名称被定义(其中“<Action>”标示动作的实际名称(例如,“播放”,“转送”,“输出”等)) 1.27.5.1.Control.Actions.<Action>.Init 此例程是可选的。如果此例程存在,那么在为此动作调用任何其它例程之前,引擎调用此例程一次。所述例程没有输入,并且向堆栈顶部返回ResultCode作为输出。ResultCode在成功时为0,或者在失败时为负错误代码。在一个实施例中,如果ResultCode不是0,那么该引擎中止当前动作并且不对用于此控制中此动作的例程做出任何进一步的调用。
1.27.5.2.Control.Actions.<Action>.Check 在所论述的说明性实施例中,此例程被要求,并且被调用来在实际上没有执行给定动作的情况下检查如果将为该动作而调用执行例程那么返回状态会是什么。对于此例程来说重要的是没有任何副作用。注意,如果执行例程也没有副作用,那么控制的入口表中的检查和执行入口可以指向相同的例程。此例程具有与下述执行例程相同的输入和输出。
1.27.5.3.Control.Actions.<Action>.Perform 在一个实施例中,此例程被要求,并且当应用即将执行动作时被调用。所述例程没有输入,并且向堆栈顶部返回ResultCode和StatusBlockPointer作为输出,其中ResultCode是整数值(如果例程成功完成那么为0,否则为负错误代码),并且其中StatusBlockPointer是标准ExtendedStatusBlock的地址。注意,在一个实施例中,成功ResultCode(即,0)并不意味着所述请求被准许了。它只意味着所述例程能够没有错误地运行。是ExtendedStatusBlock表明所述请求是被准许了还是拒绝了。然而,如果ResultCode表明失败的话,那么主机应用就好像所述请求被拒绝一样进行。例如在一个实施例中,StatusBlock的类别应当为ACTION_DENIED,或者所返回的ExtendedStatusBlock被决绝,因而主机应用中止该动作。
当执行动作时,只有执行例程需要被调用。所述引擎不必事先调用检查例程。执行例程的实现可以内部调用检查例程(如果它选择这样作的话),但是不应当假定所述系统将已经事先调用了所述检查例程。
1.27.5.4.Control.Actions.<Action>.Describe 此例程是可选的,并且当应用请求由控制程序为给定动作所表示的规则和条件的意义描述时被调用。所述例程没有输入,并且向堆栈顶部返回ResultCode和StatusBlockPointer作为输出,其中ResultCode是整数值(如果例程成功完成那么为0,否则为负错误代码),并且其中StatusBlockPointer是标准ExtendedStatusBlock的地址。
1.27.5.5.Control.Actions.<Action>.Release 此例程是可选的。如果此例程存在,那么在DRM引擎不再需要调用用于给定动作的任何其它例程之后所述例程被调用一次。对于给定动作来说不调用其它例程,除非启动所述动作的新使用(在这种情况下,Init例程被再次调用)。所述例程没有输入,并且向堆栈顶部返回ResultCode作为输出。ResultCode在成功时为0,并且在失败时为负错误代码。如果ResultCode不为0,那么所述引擎不对用于给定动作的例程进行任何进一步的调用。
1.27.6.链路约束例程 在一个实施例中,当链路对象具有嵌入的控制时,DRM引擎在该控制中调用链路约束例程以便验证所述链路对象的有效性。在一个说明性实施例中使用以下链路约束例程 1.27.6.1.Control.Link.Constraint.Init 此例程是可选的,并且如果它存在的话,那么在为给定链路约束调用任何其它例程之前此例程被调用恰好一次。所述例程没有输入,并且向堆栈顶部返回ResultCode作为输出。ResultCode在成功时为0并且在失败时为负错误代码。如果ResultCode不为0,那么该引擎认为对链路对象的有效性约束未被满足,并且避免对用于所述链路控制的例程进行进一步调用。
1.27.6.2.Control.Link.Constraint.Check 在所论述的说明性实施例中,此例程被要求,并且被调用来检查是否满足对给定链路的有效性约束。所述例程没有输入,并且向堆栈顶部返回ResultCode和StatusBlockPointer作为输出,其中ResultCode是整数值(如果例程成功完成那么为0,否则为负错误代码),并且其中StatusBlockPointer是标准ExtendedStatusBlock的地址。如果ResultCode不为0,那么引擎认为对链路对象的有效性约束未被满足,并且避免对用于所述链路控制的例程做出进一步调用。即便ResultCode为0(成功),这也不意味着所述约束已经满足;它只意味着所述例程能够没有错误地运行。是StatusBlock表明是否满足所述约束。
1.27.6.3.Control.Link.Constraint.Describe 此例程是可选的,并且当应用请求由控制程序为给定链路所表示的约束意义的描述时被调用。所述例程没有输入,并且向堆栈顶部返回ResultCode和StatusBlockPointer作为输出,其中ResultCode是整数值(如果例程成功完成那么为0,否则为负错误代码),并且其中StatusBlockPointer是标准ExtendedStatusBlock的地址。
1.27.6.4.Control.Link.Constraint.Release 此例程是可选的,并且如果它存在的话,那么在引擎不再需要为给定约束调用任何其它例程之后由所述引擎调用一次。所述例程没有输入,并且向堆栈顶部返回ResultCode作为输出。ResultCode在成功时为0并且在失败时为负错误代码。在所论述的实施例中,在调用此例程之后,除非开始新的循环(在这种情况下,再次调用Init例程),否则可以不为给定约束调用任何其它例程。类似地,如果ResultCode不是0,那么引擎不对用于所述给定链路约束的例程进行进一步的调用。
1.27.7.代理例程 在一个实施例中,代理是被设计成用于代表实体运行的控制对象。一般在两个端点之间的服务交互的情境下使用代理,其中一个端点需要在第二端点的情境内执行某个虚拟机代码,并且可能获得该执行的结果。在一个实施例中,控制可以包含多个代理,并且每个代理可以包含能被执行的任意数目的例程;然而在实践中代理一般具有单个例程。
在一个说明性实施例中,为代理定义以下入口点,其中<Agent>是指代代理的实际名称的名称字符串。
1.27.7.1.Control.Agents.<Agent>.Init 此例程是可选的,并且如果它存在的话,那么在为给定代理调用任何其它例程之前所述引擎调用此例程一次。所述例程没有输入,并且向堆栈顶部返回ResultCode作为输出。ResultCode在成功时为0并且在失败时为负错误代码。
1.27.7.2.Control.Agents.<Agent>.Run 在所讨论的说明性实施例中,此例程被要求并且是代理的主例程。所述例程没有输入,并且向堆栈顶部返回ResultCode、ReturnBlockAddress(返回块地址)和ReturnBlockSize(返回块大小)作为输出。ResultCode是整数值(如果例程成功完成那么为0,否则为负错误代码),ReturnBlockAddress是包含代理代码被预期返回给调用方的数据的存储器块的地址,(如果例程不必返回任何东西,那么该地址为0),并且ReturnBlockSize是在ReturnBlockAddress的存储块器块的字节大小。在一个实施例中,如果ReturnBlockAddress是0,那么ReturnBlockSize值也是0。
1.27.7.3.Control.Agents.<Agent>.Describe 此例程是可选的,并且当应用请求给定代理的描述时被调用。所述例程没有输入,并且向堆栈顶部返回ResultCode和StatusBlockPointer作为输出,其中ResultCode是整数值(如果例程成功完成那么为0,否则为负错误代码),并且其中StatusBlockPointer是标准ExtendedStatusBlock的地址。
1.27.7.4.Control.Agents.<Agent>.Release 此例程是可选的,并且如果它存在的话,那么在引擎不再需要为此代理调用任何其它例程之后,所述引擎调用此例程一次。对于此代理来说不调用其它例程,除非开始新的循环(在这种情况下,Init例程被再次调用)。所述例程没有输入,并且向堆栈顶部返回ResultCode作为输出。ResultCode在成功时为0并且在失败时为负错误代码。
1.28.扩展的状态块 以下示例性定义适用于由上述几个例程的说明性实施例所返回的ExtendedStatusBlock(扩展状态块)数据结构。结合描述虚拟机来描述ExtendedStatusBlock数据结构的例子。
在一个实施例中,不存在全局ExtendedStatusBlock标志。在此实施例中,控制程序把ExtendedStatuBlock的GlobalFlag(全局标志)字段设置为0。
1.28.1.类别 依照一个实施例以下段落定义了用于ExtendedStatusBlocks的类别字段的值。在一个实施例中,这些类别都没有子类别,从而ExtendedStatusBlocks的子类别字段的值被设置为0。
在一个实施例中,定义以下类别代码 1.28.1.1.动作检查和执行例程

在一个实施例中,在由动作例程所返回的ExtendedStatusBlock参数的情境中,约束意指为了让例程的结果返回具有类别ACTION_GRANTED的ExtendedStatusBlock而需要满足的准则或者要求为真的条件。
在一个实施例中,通用于上述两个类别的LocalFlags(局部标志)字段的值包括
在上面所示出的表中,所涉及的参数列表是ExtendedStatusBlock数据结构的“参数”字段。
1.28.1.2.描述例程类别代码 在一个实施例中,对于描述例程来说没有定义类别代码。在一个实施例中,与为动作例程所定义的局部标志相同的局部标志适用于描述例程,并且描述例程应当在它们返回的ExtendedStatusBlock中包括名称为如下面所指定的‘描述’的参数。在一个实施例中,描述例程在它们返回的ExtendedStatusBlock中不包含任何义务或回调参数;然而描述例程应当在它们返回的ExtendedStatusBlock中包含用于描述适用于相应动作或链路约束的一些或所有约束的参数。
1.28.1.3.链路约束例程类别代码
在一个实施例中,与为动作例程所定义的局部标志相同的局部标志适用于这些类别中的每个。
在一个实施例中,在由链路约束例程所返回的ExtendedStatusBlock参数的情境中,约束意指为了让例程的结果返回具有类别LINK_VALID的ExtendedStatusBlock而要求满足的准则或要求为真的条件。
1.28.2.高速缓存持续时间 ExtendedStatusBlock的CacheDuration(高速缓存持续时间)字段是在ExtendedStatusBlock中所编码信息的有效时段的指示。当ExtendedStatusBlock具有非零的有效时段时,这意味着ExtendedStatusBlock可以被存储在高速缓存器中,而且在该时段期间,对利用相同参数调用的确切相同的例程的调用会返回相同的ExtendedStatusBlock,因此高速缓存的值可以被返回到主机应用而不是调用例程。
1.28.3.参数 一些参数用来传达关于返回状态以及用于模板处理的变量绑定的详细信息,(参见节9.4)。
在一个实施例中,除义务和回调之外,这里所描述的所有约束严格地用于帮助主机应用分类和显示的目的,而并非用于强制实施使用规则。强制实施所述规则是控制程序的职责。
在一个实施例中,在下面节中所定义的参数被编码为ParameterBlock(如果没有参数标志适用的话),或者被编码为ExtendedParameterBlock(如果一个或多个标志适用的话)。下面将描述代表性的标志 1.28.3.1.描述 参数名Description(描述) 参数类型ValueList(值列表) 描述描述参数的列表。列表中的每个值是类型参数或扩展参数。在一个实施例中,定义以下参数默认、短和长。它们中的每个如果存在的话.那么具有控制资源之一的ID值。该资源应当包含文本有效载荷或模板有效载荷。如果资源是模板,那么它被处理以便获得结果的文本描述(整个控制程序或特定动作的描述)。使用其中出现‘描述’参数的列表中的其它参数作为变量绑定来处理模板。
在一个实施例中,如果还包括‘默认’描述,那么可以只包括‘短’和‘长’描述。


1.28.3.2.约束 在一个实施例中,在包含类似类型的约束的列表中把约束参数编组。在一个实施例中,为一些类型定义标准的约束。在一个实施例中,如果约束参数的名称在保证该名称唯一性的名称空间中为URN,那么控制可以返回未包括在标准约束组内的约束参数。这可以包括销售商专用的约束或在其它规范中所定义的约束。
1.28.3.2.1.通用约束 参数名GenericConstraints(通用约束) 参数类型ValueList(值列表) 描述可以适用的通用约束的列表。列表中的每个值属于类型参数或扩展参数。
在一个实施例中,通用约束是不属于在此节中所定义的任何其它约束类型的约束。在一个实施例中,没有定义通用约束参数。
1.28.3.2.2.时间约束 参数名TemporalConstraints(时间约束) 参数类型ValueList(值列表) 描述可以适用的时间约束的列表。列表中的每个值是类型参数或扩展参数。时间约束是与时间、日期、持续时间等相关的约束。在一个实施例中,定义以下时间约束参数

1.28.3.2.3.空间约束 参数名SpatialConstraints(空间约束) 参数类型ValueList(值列表) 描述可以适用的空间约束的列表。在一个实施例中,列表中的每个值属于类型参数或扩展参数。空间约束是与物理位置相关的约束。在一个实施例中,没有定义标准的空间约束。
1.28.3.2.4.组约束 参数名GroupConstraints(组约束) 参数类型ValueList(值列表) 描述可以适用的组约束的列表。列表中的每个值是类型参数或扩展参数。组约束是与组、组成员资格、身份组等相关的约束。在一个实施例中,定义以下参数
1.28.3.2.5.设备约束 参数名DeviceConstraints(设备约束) 参数类型ValueList(值列表) 描述可以适用的设备约束的列表。列表中的每个值属于类型参数或扩展参数。设备约束是与设备的特性相关的约束,所述特性诸如特征、属性、名称、标识符等。在一个实施例中,定义以下参数

1.28.3.2.6.计数器约束 参数名CounterConstraints(计数器约束) 参数类型ValueList(值列表) 描述可以适用的计数约束的列表。列表中的每个值属于类型参数或扩展参数。计数约束是与计数值相关的约束,诸如播放计数、累积计数等。在一个实施例中,没有定义标准的计数约束。
1.28.3.3.参数标志 在一个实施例中,以下标志当被编码为ExtendedStatusBlock时可以用于在节9.2.3中所描述的所有参数 1.29.义务和回调 在一个实施例中,某些动作当被准许时要求来自主机应用的进一步参与。义务表示当使用主机应用请求的内容密钥时或在此之后需要由所述主机应用执行的操作。回调表示对一个或多个控制程序例程的调用,所述控制程序例程当使用所请求的内容密钥时或在此之后需要被主机应用执行。
在一个实施例中,如果应用遇到它不支持或者不理解的任何关键的义务或回调(例如因为所述义务类型可能在执行应用之后才定义),那么它必须拒绝继续执行为其返回此义务或回调参数的动作。在一个实施例中,通过为用于描述关键的义务或回调的参数设置CRITICAL参数来表明所述关键的义务或回调。
如果控制具有副作用(诸如减小播放计数),那么它应当使用OnAccept回调来要求主机应用调用某一例程(如果它能够理解并符合所有关键的义务和回调的话)。所述副作用应当发生在回调例程中。在一个示例性实施例中,实现方式被要求来理解并实现OnAccept回调,这是因为它可以用于防止副作用(例如对状态数据库的更新)提前出现(例如在主机应用确定它不能符合给定的关键义务或回调并且需要终止动作执行之前),从而提供事务原子性的量度。
1.29.1.参数 以下参数定义了可以在ExtendedStatusBlock数据结构中返回的几种类型的义务和回调。
1.29.1.1.义务 参数名Obligations 参数类型ValueList 描述义务参数的列表。列表中的每个值属于类型参数或扩展参数。在一个实施例中,定义以下义务参数

1.29.1.2.回调 参数名Callbacks(回调) 参数类型ValueList 描述回调参数的列表。列表中的每个值属于类型参数或扩展参数。在一个实施例中,定义以下回调参数


在一个实施例中,在上表中所提及的‘回调’类型是具有三个ValueBlock(值块)元项的ValueListBlock(值列表块)

1.29.1.3.参数标志 在一个实施例中,使用与在先前节中所定义的相同的参数标志。在一个实施例中,要求调用方实现的回调和义务被标记为CRITICAL,以避免向主机应用给予忽略这些参数的选择。
1.29.2.事件 在一个实施例中,由名称来指定事件。取决于事件类型,可以定义用于进一步指定所述事件的一组标志。在一个实施例中,如果没有为具体事件定义标志,那么标志字段值被设置为0。一些事件还可以指定当出现所述事件时向回调例程提供一些信息。在一个实施例中,如果并不从所述主机应用要求任何特殊信息,那么所述主机应用必须利用空ArgumentsBlock(自变量块)来调用(参见下面节3.3中回调例程接口的描述)。
在一个实施例中,如果主机应用不理解或不支持在被标记为CRITICAL的回调参数中的事件名称,那么所述主机应用必须把此参数认为是不理解的CRITICAL参数(并且不能执行对其请求权限的动作)。
在一个实施例中,定义以下事件名

1.29.3.回调例程 在一个实施例中,回调例程获取相同的输入 Input堆栈顶部
Cookie在回调参数中所指定的Cookie字段的值。
ArgumentsBlockSize在此参数下在堆栈上所传递的数据字节数目。当调用例程时,所述堆栈包含由调用方所提供的值ArgumentsBlockSize(自变量块大小),后面是数据字节ArgumentsBlockSize,所述ArgumentsBlockSize表明在顶部的自变量块大小。在一个实施例中,如果所述大小不是4的倍数,那么堆栈上的数据用0值字节来填充以便确保堆栈指针保持为4的倍数。
1.29.3.1.继续回调 在一个实施例中,具有类型CONTINUE(继续)(类型ID=0)的回调具有以下输出 Output堆栈顶部
ResultCode整数值。如果例程能够执行那么结果值为0,或者如果出现错误那么结果值为负错误代码。
Description如果ResultCode表明回调例程能够运行(即所述值为0),那么主机应用可以继续当前操作。如果ResultCode表明出现错误,那么主机应用中止当前操作并且取消所有待决的回调和义务。
1.29.3.2.RESET(复位)回调 当控制例程已经在从例程所返回的ESB中指定了一个或多个类型为RESET的回调时,当满足用于该回调的条件时主机应用会调用任何指定的回调例程。在一个实施例中,一旦满足任何回调的条件,主机应用就需要 ●取消所有其它待决的回调 ●取消所有当前义务 ●向该回调提供所要求的参数(如果存在任何的话) ●调用所指定的回调例程。
来自例程的返回状态向主机应用表明它是否可以继续执行当前操作。在一个实施例中,如果权限被拒绝或者例程没能成功地执行,那么主机应用必须中止当前操作的执行。类似地,如果权限被准许,那么主机应用必须遵守可能在ESB中返回的任何义务或回调,就像它已经调用原始的Control.Actions.<Action>.Perform routine一样。先前的义务或回调规范不再有效。
在一个实施例中,被指定为用于此类回调的回调入口点的所有例程具有以下输出 Output堆栈顶部 ResultCode整数值。如果例程能够执行那么结果值为0,或者如果出现错误那么结果值为负错误代码。
StatusBlockPointer标准的扩展状态块的地址。
描述此例程的返回语义等价于对Control.Actions.<Action>.Perform例程所描述的语义。
1.30.元数据资源 在一个实施例中,控制对象可以包含元数据资源,其可以从在ExtendedStatusBlock数据结构中所返回的参数来引用。资源可以是简单的文本、文本模板或其它数据类型。每个资源由资源ID标识,并且可以包含一个或多个文本串或编码数据,不同语言的每种版本一个。不要求为所有语言都提供资源。由主机应用选择哪种语言版本是最适于其需要。


资源通过作为扩展包括在控制对象中而伴随控制程序。资源Id映射到控制对象的内部扩展的Id,所述控制对象的内部扩展包含具有目前运行的例程的代码模块。
为了计算资源对象的规范字节序列,在一个实施例中数据结构描述如下
1.30.1.简单文本 简单文本被指定为MIME类型‘文本’ 1.30.2.文本模板 除标准的文本资源之外,在一个实施例中,定义了文本模板类型。用于此文本模板类型的MIME类型是‘text/vnd.intertrust.octopus-text-template’。
在一个实施例中,文本模板包含依照UTF-8编码的文本符号以及命名占位符(placeholder),所述占位符将由从在参数列表中所返回的参数所获得的文本值来代替,诸如ExtendedStatusBlock的。用于占位符的语法是‘\PLACEHOLDER\’,其中PLACEHOLDER指定参数块和可选格式化提示的名称。在一个实施例中,模板处理器必须利用该参数块的值字段的格式化表示来替换整个令牌‘\PLACEHOLDER\’,并且下面在节4.2.1指定了对值数据的格式化。
在一个实施例中,如果符号‘\’出现在占位符之外的文本中,那么它必须被编码为‘\\’,并且在文本中所有出现的‘\\’会被模板处理器恢复为‘\’。
用于占位符的语法为FORMAT|NAME,其中NAME是参数块的名称,并且FORMAT是用于把参数数据转换为文本的格式化提示。如果用于参数值数据类型的默认格式化规则就足够了,那么可以省略格式化提示,并且占位符简单地为NAME。
1.30.2.1.格式化 1.30.2.1.1.默认格式化 在一个实施例中,用于不同数值类型的默认格式化规则为 1.30.2.1.2.显式格式化 显式格式名称可以被用为占位符标签的FORMAT部分。如果遇到未知的FORMAT名称,那么模板处理引擎使用默认格式化规则。
1.31.上下文对象 在一个实施例中,当执行控制例程时,它有权通过使用System.Host.GetObject系统调用来访问多个上下文对象。
1.31.1.通用上下文 在一个实施例中,给出以下上下文情境以用于运行控制。

1.31.2.运行时上下文 在一个实施例中,对于在VM中运行的所有控制给出以下上下文情境,其中已经使用System.Host.SpawnVm系统调用创建了所述VM。在一个实施例中,此上下文情境必须是不存在的或者是用于控制的空容器,所述控制在不是使用System.Host.SpawnVm创建的VM中运行。

1.31.3.控制上下文 在一个实施例中,每当运行控制的例程时给出以下上下文情境
1.31.4.控制器上下文 在一个实施例中,每当控制的例程正在运行并且由控制器对象指向所述控制时(例如,当访问内容密钥对象以便消费受保护的内容时),给出以下上下文情境。

在其中允许主机应用只编组由单个控制器对象所控制的内容密钥的实施例中,对于给定动作,只存在一个适用的控制器对象。
1.31.5.动作上下文 在一个实施例中,每当为了控制动作目的调用控制时给出以下下上下文情境。

1.31.6.链路上下文 在一个实施例中,每当为了限制链路对象的有效性而调用控制时(例如被嵌入到链路对象中的控制对象),给出以下上下文情境
1.31.7.代理上下文 在一个实施例中,每当运行控制的代理例程时给出以下下上下文情境
参数和会话容器通常用于允许这样的协议,所述协议要求一个实体发送并运行另一实体上的代理以便指定哪些输入参数传递到所述代理,以及在某些条件下主机需要设置哪些会话上下文对象。某些会话上下文对象的存在或不存在可以使代理代码能够判定它是否作为它被设计成所支持的协议的一部分运行,或者它是否在上下文之外运行,在这种情况下它可以拒绝运行。例如,其目的在于在它运行的主机上创建状态对象的代理可以拒绝运行,除非它在特定的协议交互期间被执行。
1.32.动作 在一个实施例中,每个动作具有了名字和参数列表。在一个实施例中,需要一些参数—应用当执行此动作时必须提供它们—并且一些是可选的—应用可以提供它们或者可以省略它们。
在一个实施例中,定义以下标准动作 1.32.1.播放 描述多媒体内容的正常实时播放。
1.32.2.转送 描述转送到兼容的目标系统。
当必须使内容可用于具有相同DRM技术的系统时,使用转送到兼容的目标系统,以致所述目标系统可以使用与包含此控制相同的许可,但是在源、信宿(sink)或它们二者上可能需要改变状态信息。从其进行转送的系统被称为源。向其进行转送的目标系统被称为信宿。
此动作旨在结合服务协议来使用,所述服务协议使代理能够被从源转送到信宿以便在源和信宿持久状态(例如,这里所描述的状态数据库中的对象)中进行必要的更新。在一个实施例中,为了该目的,控制使用RunAgentOnPeer义务。下面结合论述状态数据库来提供关于此服务协议的说明性实施例的附加信息。
参数

1.32.3.输出 描述到外部目标系统的输出。
输出到外部目标系统是当必须把内容输出到其中无法使用原始的内容许可的系统时所使用的动作。这可以是具有不同DRM技术的系统、没有DRM技术的系统或具有相同的技术但是处于要求不同于原始许可的许可的情况下的系统。从中进行转送的系统被称为源。向其进行转送的目标系统被称为信宿。
在一个实施例中,在用于此动作的描述、检查和执行方法的扩展状态结果中,应当设置以下参数

参数
特定任务系统可以要求其它输入参数。
1.32.3.1.标准的目标系统 1.32.3.1.1.音频CD或DVD 在一个实施例中,当目标系统是其上写有未压缩PCM音频的未加密介质(诸如可写音频CD或DVD)时,使用标准的TargetSystem ID‘CleartextPcmAudio’。对于此目标系统来说,ExportInfo参数是用于表示版权标志的单整数参数。用整数值的最低有效位来表明此标志。

10.状态数据库 下面将描述安全对象存储装置,其可以由DRM引擎的优选实施例用来提供安全状态存储机制。这种机构对于使控制程序能够在从调用到调用保持不变的受保护的状态数据库中进行读取和写入来说是有用的。这种状态数据库可以用来存储状态对象,诸如播放计数、首次使用日期、累积的再现时间等。在优选实施例中,在非易失性存储器中实现安全数据库,所述非易失性存储器诸如便携式设备上的闪速存储器或PC上的硬盘驱动器的加密区域。然而应当理解,可以在任何适当的介质上实现安全数据库。
如在此节中所使用的术语“对象”通常指的是在安全对象存储装置内所包含的数据对象,而不是在此的其它地方所论述的对象(例如控制、控制器、链路等);如果必须区分这两种类别的对象,那么术语“DRM对象”将用来指的是在此的其它地方所描述的对象(即,控制、控制器、保护器、内容密钥、链路、节点等),而术语“状态对象”用来指的是在状态数据库内所存储的对象。在下面论述中,有时参考被称作“Seashell(海贝)”的状态数据库的说明性实现方式,其结合在此的其它地方所描述的章鱼DRM引擎实施例来使用。然而应当理解;这里所描述的系统和方法的实施例可以在没有此说明性实现方式的一些或所有特征的情况下实施。
1.33.数据库对象 对象存储装置(例如数据库)包含数据对象。在一个实施例中,对象被布置在逻辑分层体系中,其中容器对象是它们所包含的孩子对象的亲代。在一个实施例中,存在四种类型的对象字符串,整数,字节数组和容器。每个对象具有相关联的元数据和类型。取决于其类型,对象还可以具有值。
在一个实施例中,可以使用System.Host.GetObject和System.Host.SetObject系统调用从虚拟机程序中访问状态对象,并且如下面所更详细地描述,可以使用虚拟名称来访问对象元数据。在一个实施例中,一些元数据字段可以由数据库的客户端改变(即,它们是可读写(RW)访问的),而其它元数据字段是只读的(RO)。
在一个实施例中,定义了在以下表中所示出的元数据字段

在一个实施例中,定义了在以下表中所示出的元数据标志
如先前所表明,在一个实施例中存在四种类型的状态对象字符串、整数、字节数组和容器。在此实施例中,字符串对象值是UTF-8编码的字符串,整数对象值是32比特整数值,并且字节数组对象值是字节数组。在此实施例中,容器对象包含零或更多个对象。容器对象被认为是它所包含对象的亲代。所包含的对象被认为是所述容器的孩子。构成对象亲代、亲代的亲代等链的所有容器对象被称作对象的祖先。如果对象具有另一对象作为它的祖先,那么该对象被称作祖先对象的后裔。
1.34.对象生存期 在一个实施例中,状态数据库中对象的生存期遵循多个规则。对象可以被显式地销毁或隐式地销毁。对象还可能由于数据库无用单元的收集而被销毁。不管怎样销毁对象,在一个实施例中应用以下规则 ●用于该对象的亲代容器的ModificationDate被设置为当前本地时间。
●如果对象是容器,那么当所述对象被销毁时其所有孩子被销毁。
1.34.1.显式对象销毁 当数据库的客户端请求移除对象时(参见对象访问来更详细地了解这可以怎样使用Host.SetObject系统调用来进行),发生显式对象销毁。
1.34.2.隐式对象销毁 当对象由于其祖先中的一个对象被销毁而被销毁时发生隐式的对象销毁。
1.34.3.无用单元收集 在一个实施例中,状态数据库销毁已经期满的任何对象。当在实现数据库的系统上的本地时间迟于对象元数据的ExpirationDate字段时,所述对象被认为是已经期满。实现方式可以定期地扫描数据库来寻找期满的对象并销毁它们,或者它可以等待直到对象被访问以检查其期满日期。在一个实施例中,实现方式不能向客户端返回期满的对象。在一个实施例中,当容器对象被销毁时(例如,因为它已经期满),其孩子对象也被销毁(递归地,它们所有的后裔也被销毁),即便它们尚未期满也是如此。
1.35.对象访问 在一个实施例中,可以经由以下一对系统调用来从虚拟机程序中访问状态数据库中的对象用于读取对象值的System.Host.GetObject和用于创建、销毁或设置对象值的System.Host.SetObject。
在一个实施例中,为了作为主机对象树被可见,状态数据库被“安装”在主机对象树中某个名称之下。这样,数据库作为主机对象的更通用树中的子树是可见的。为了实现这点,在一个实施例中,状态数据库包含始终存在的顶层级的、内置的根容器对象。此根容器实质上是数据库的名称。数据库中的所有其它对象是根容器的后裔。多个状态数据库可以被安装在主机对象树中的不同位置(对于将被安装在相同主机容器下的两个数据库来说,它们需要具有不同的名称来用于它们的根容器)。例如,如果其根容器名称为Database1的状态数据库包含名称为Child1的单整数孩子对象,那么该数据库可以被安装在主机对象容器“/SeaShell”下,在这种情况下,Child1对象会做为“/SeaShell/Database1/Child1”而可见。在一个实施例中,按照访问策略来管理支配对状态数据库中对象的访问。
1.35.1.读取对象 可以通过使用系统调用System.Host.GetObject来读取对象值。在状态数据库的一个实施例中,可以存在于数据库中的四个对象类型(整数,字符串,字节数组和容器)直接映射到它们虚拟机中的对应物上。可以采用正常方式来访问对象值,并且可以实现标准的虚拟名称。
1.35.2.创建对象 对于已经不存在的对象名称可以调用System.Host.SetObject来创建对象。依照系统调用规范来进行对象创建。在一个实施例中,当创建对象时,状态数据库进行以下操作 ●把对象元数据的“所有者”字段设置为亲代容器对象的元数据的“所有者”字段的值。
●把元数据的CreationDate字段设置为当前的本地时间。
●把元数据的ModificationDate字段设置为当前的本地时间。
●把元数据的ExpirationDate字段设置为0(没有期满)。
●把元数据的标志字段设置为0。
●把亲代容器的ModificationDate设置为当前的本地时间。
当在比现有容器分层体系更深的路径下创建对象时,在一个实施例中,状态数据库隐式地创建容器对象,所述容器对象需要存在以便创建通向被创建对象的路径。在一个实施例中,隐式的容器对象创建遵循与显式创建相同的规则。例如,如果存在没有孩子的容器“A”,那么在创建“A/B/C/SomeObject”之前用于设置“A/B/C/SomeObject”的请求会隐式地创建容器“A/B”和“A/B/C”。
1.35.3.写入对象 对于已经存在的对象名称可以通过调用System.Host.SetObject来改变对象值。如果所指定的ObjectType不匹配现有对象的类型ID,那么返回ERROR_INVALID_PARAMETER。在一个实施例中,如果类型ID为OBJECT_TYPE_CONTAINER,那么不需要指定值(ObjectAddress必须是非零的,但是其值会被忽略)。当设置现有对象时,状态数据库把对象的ModificationDate设置为当前的本地时间。
1.35.4.销毁对象 对已经存在的对象,可以通过利用ObjectAddress值0来调用System.Host.SetObject来显式地销毁对象。当对象被销毁时,状态数据库优选 ●把亲代容器的ModificationDate设置为当前的本地时间。
●如果所销毁的对象是容器,那么销毁所有其孩子对象。
1.35.5.对象元数据 在一个实施例中,通过利用虚拟名称使用System.Host.GetObject和System.Host.SetObject系统调用来访问状态数据库对象的元数据。下表列出了在状态数据库的一个实施例中可用于对象的标准和扩展虚拟名称,并且列出了它们怎样映射到元数据字段。

在一个实施例中,如果一个或多个未定义的标志被设置为1,那么实现方式必须拒绝设置标志元数据字段的请求。在这种情况下,对System.Host.SetObj ect的返回值为ERROR_INVALID_PARAMETER。在一个实施例中,当读取标志元数据字段时,客户端必须忽略未被预定义的任何标志,并且当设置对象的标志字段时,客户端必须首先读取其现有值并且保留未被预定义的任何标志的值(例如,依照系统规范)。
1.36.对象所有权和访问控制 在一个实施例中,每当进行读取、写入、创建或销毁对象的请求时,状态数据库实现方式首先检查调用方是否有权限来执行所述请求。用于管理支配对对象进行访问的策略是基于委托人身份和委托的原理。为了要实现的该策略,实现方式操作时所处于的信任模型需要支持认证的控制程序的概念。这一般通过具有虚拟机代码模块并且具有用于使委托人名称与签名密钥相关联的名称证书来完成,所述虚拟机代码模块包含利用PKI密钥对的私钥来(直接或经由安全引用间接地)数字签名的程序;然而应当理解,用于确定控制程序身份的不同方式是可以的,可以使用其中的任何合适的一个。
在一个实施例中,用于状态数据库中对象的访问策略由几个简单规则组成 ●如果调用方身份与对象的所有者相同或者如果在对象的标志元数据字段中设置有PUBLIC_READ标志,那么准许对对象值的读取访问。
●如果调用方有权对对象的亲代容器进行读取访问,那么准许对对象值进行读取访问。
●如果调用方的身份与对象的所有者相同,那么准许对对象值进行写入访问。
●如果调用方有权对对象的亲代容器进行写入访问,那么准许对对象值进行写入访问。
●如果调用方有权对对象的亲代容器进行写入访问,那么准许创建或销毁对对象的访问。
●(使用虚拟名称)对对象的元数据进行读取和写入访问遵循与对对象值进行读取和写入访问相同的策略,只是另外限制不能写入只读字段。
在一个实施例中,当访问策略拒绝客户端请求时,对该请求的系统调用的返回值是ERROR_PERMISSION_DENIED。
优选,当创建数据库时,状态数据库的根容器是固定的。当创建对象时,其所有者元数据字段的值被设置为与其亲代容器所有者元数据字段的值相同的值。对象的所有权可以改变。为了改变对象的所有权,可以通过调用该对象的‘@Owner’虚拟名称的Sytem.Host.SetObject系统调用来设置所有者元数据字段的值(如果在访问控制规则下允许的话)。
在控制程序不可以访问那些对象(所述对象并不由与控制程序正在其身份下运行的委托人是相同的委托人所拥有)的实施例中,控制程序需要把对“外部”对象的访问委托给从下述代码模块所加载的程序,所述代码模块具有在“外部”对象的所有者身份下运行的能力。为此,控制程序可以在控制虚拟机中使用System.Host.SpawnVm、System.Host.CallVm和System.Host.ReleaseVm系统调用。
1.37.许可转送协议 把状态信息存储在诸如上述的数据库中使权利能够在设备之间移动或者从域中输出(例如,通过把状态信息转送到另一设备)。以下章节描述了协议的实施例,借此可以把数据库的状态从源转送到信宿。注意,尽管此过程被认为是许可转送协议,转送的是状态数据库的状态,这与纯粹的实际许可(例如控制对象等)的转送不同。所述协议被认为是许可转送协议,这是因为在一个实施例中,所述转送通过在控制程序中执行转送动作发起的,并且因为转送所述状态信息使信宿能够成功地执行与内容相关的许可。
图32示出了由三个消息3202、3204、3206组成的许可转送3200的例子。在图32所示出的例子中,由信宿3210通过向源3212发送请求3202来启动该协议。在一个实施例中,请求3202保持要转送的内容的ID。源3212向信宿3210发送响应3204,包含(i)将在信宿3210的状态数据库中设置状态的代理,以及(ii)目标为信宿3210的内容密钥对象。如图32所示,信宿3210向源3212发送用于表示代理已经运行的确认3206。当接收到内容密钥和/或内容时,信宿然后可以依照其相关联的控制来使用所述内容(例如,通过扬声器播放它,在视频屏幕上显示它和/或依照其它方式再现它)。
虽然在一些实施例中可以使用在图32中所示出的方法,但是一些潜在的问题包括 没有办法主动告诉源再现已经结束了。在一个实施例中,在图32中所示出的协议支持两个模式,其中这是一个问题(i)再现(没有停止再现),和(ii)签出(没有签入(checkin))。由于此问题,可能导致控制发出方发出关于所转送的状态的超时。然而,这可能使消费者感觉很糟,例如当用户想要在一个设备上再现内容但是判定她实际上想要在另一个设备上再现此内容利用当前的设计,很可能在她能够在另一个设备上再现内容之前必须等待在第一设备上再现整个内容。如果所述内容相对较长(例如电影),那么这可能会令人不快。
可能很难分析与请求中的内容ID相关联的许可。在一个实施例中,所述请求只包含内容ID,并且源从其许可数据库中获取与所述内容ID相关联的许可。然而,此过程可能易于出错,这是由于许可可以被存储在可拆卸介质上,并且在约定协议时,如果所述介质已经被拆卸,那么特定的许可可能就是不可用的。此外,即便该许可是可用的,那么在许可存储装置中查找所述许可也可能是麻烦的。还因为可能存在与一组内容ID相关联的多个许可,所以可能难于确定所分析的许可是否与在请求中所想要的许可相同。
控制程序没有办法主动请求邻近度检查(proximity check)。在一个实施例中,该组系统调用/回调/义务不支持控制用来请求邻近度检查对等体的方式。作为替代,控制可以只读取主机对象Octopus/Action/Parameters/Sink/Proximity/LastProbe的值,该值由应用在转送期间利用它从先前的邻近度检查协议执行中所获得的值来填充。在如果不需要这种邻近度检查那么可能希望避免邻近度检查的情况下(例如,如果已知信宿在某一域内),这可能是一个问题。
对于该协议来说只存在三个回合。在图32所示出的实施例中,所述协议被限制为三个回合。这可能是一个严重的限制,这是由于所述协议不能处理OnAgentCompletion回调返回具有另一RunAgentOnPeer义务的扩展状态块的情况。此外,在完成协议之后,信宿实际上不知道所述协议是否已经成功。另外,邻近度检查需要发生在发送响应之前(参见先前问题),但是在源和信宿处于相同域的情况下不必如此。另外,在图32所示出的协议中,源在不知道内容密钥将是否被使用的情况下向信宿给出此内容密钥。
在ESB中没有办法暗示需要许可转送。在图32所示出的实施例中,当DRM客户端评估许可(例如Control.Actions.Play.Check)时,为了获得能够成功评估所述控制的状态,控制写入方没有容易的方式来暗示需要许可转送。
源无法发起转送。在图32所示出的协议中,许可转送由信宿发起。可能希望源也能够发起转送。
改进的实施例 下述实施例可以解决或改良上述一些或全部问题。
释放问题的解决方案。在一个实施例中,引入新的释放操作。当在请求中指定此操作时,转送模式ID被设置为释放。按照顺序,为了让客户端在再现/签出和释放操作之间相关,把可选元项SessionId(会话ID)添加到请求(参见下面章节)。在一个实施例中,当此元项存在时,它被反映在SessionId下的转送动作上下文情境的主机对象树中。
信宿知道如果它将在拆卸消息(参见下文)中获得的扩展状态块包含参数,那么它必须在释放请求中发送此SessionId 参数名SessionId 参数类型字符串 此参数的标志被设置为CRITICAL。
许可解析问题的解决方案(重制(refactoring)请求)。在一个实施例中,所述解决方案包括使信宿设备把许可捆束(一个或者多个)放入请求中使得实质上保证所述信宿和源执行相同的许可。在图32所示出的实施例中,用于请求的XML模式如下
在ContentIdList(内容ID列表)包含标识内容的内容ID的列表的情况下(每个曲目/流一个),操作包含许可转送操作类型,并且捆束包含请求者的个性节点和相关联的签名。
为了避免上述许可解析问题,例如可以通过如下修正模式来把许可捆束包括在请求中

在此模式中,ContentIdList(内容ID列表)元项由许可元项来代替。此元项携带一组LicensePart元项。LicensePart元项携带oct:Bundle元项,所述oct:Bundle元项包含许可对象以及用于表明所述许可对象被应用于此特定ContentId(内容ID)的可选ContentId属性。没有ContentId属性的LicensePart元项意味着在基础捆束中所包含的对象被应用于所有内容ID(通常为控制器和控制对象)。
在一个实施例中,SessionId可选元项不能存在,除非如果所述操作为urn:marlin:core:1-2:service:license-transfer:release,在这种情况下如果在相应的再现或签出动作的扩展状态块中接收了SessionId参数那么它可以存在(参见上面)。
在一个实施例中,如果信宿知道它已经能够解密内容密钥,那么NeedsContentKeys(需要内容密钥)可选元项应当以假值存在。此元项不存在意味着在协议成功的情况下源必须重新加密信宿的内容密钥。
在一个实施例中,当接收这种请求时,如下处理许可元项 (1)收集在LicensePart元项中所找到的所有ContentId属性。
(2)处理在LicensePart元项中所找到的所有捆束属性。
(3)打开上面所收集的该组内容ID。
(4)对相关对象验证适当签名。
(5)对所处理的控制对象选择性地调用Control.Actions.Transfer.Check方法。
(6)对所处理的控制对象调用Control.Actions.Transfer.Perform。
允许控制程序主动请求信宿的邻近度检查。为了允许控制程序这样作,可以定义一对新的义务/回调。特别地是,控制可以把“ProximityCheckSink(邻近度检查信宿)”义务放入其扩展状态块中。这向应用表明必须检查与信宿的邻近度。当完成邻近度检查时,应用会使用“OnSinkProximityChecked”回调来回调所述控制。
在一个实施例中,定义了只在许可转送的上下文情境内适用的ProximityCheck(邻近度检查)义务。在此实施例中,每个扩展状态块需要零或一个这种义务,并且如果存在的话,那么还需要存在OnSinkProximityChecked回调。

OnS inkProximityChecked回调
在协议中允许多个往返行程。图33概述了会允许多个往返行程的协议的修改形式。在图33所示出的实施例中,设置消息3302例如可以与上面结合许可解析问题/解决方案描述的改进的许可转送请求消息相同。
如图33所示,在设置3302之后,应用运行如上所述的控制并且获取扩展状态块(ESB)。此ESB可以包含RunAgentOnPeer义务/OnAgentCompletion回调。在一个实施例中,RunAgentOnPeer义务包含源3312应用需要用来构建RunAgent消息3304的所有参数。注意,在一个实施例中,如果应用在OnAgentCompletion回调的扩展状态块中遇到另一RunAgentOnPeer/OnAgentCompletion回调/义务对(在一个或多个RunAgent/AgentResult消息交换之后),那么还将发送RunAgent消息3304。
在一个实施例中,如果ESB没有包含RunAgentOnPeer义务/OnAgentCompletion回调,那么这意味着需要发送拆卸消息(参见下文)。注意,此ESB可以包含ProximityCheck义务/OnSinkProximityChecked回调,在这种情况下将执行邻近度检查协议并且在发送拆卸消息之前从OnSinkProximityChecked回调的ESB中读取结果。
在一个实施例中,除并不携带ContentKeyList(内容密钥列表)之外,RunAgent消息3304的有效载荷与先前设计的响应消息完全相同。
如图33所示,在信宿3310已经运行由源在RunAgent消息3304中发送的代理之后,所述信宿3310向源3312发送AgentResult(代理结果)消息3306。在一个实施例中,消息有效载荷与结合图32所描述的确认消息相同。
如图33所示,当OnAgentCompletion的扩展状态块没有携带任何RunAgentOnPeer/OnAgentCompletion回调/义务对时(这意味着协议已经结束),由源应用3312发送拆卸消息3308。在一个实施例中,拆卸消息3308携带两个信息(i)协议结果的描述,使得信宿3310知道所述协议已经成功还是没有成功,它为什么失败的指示(参见下文来获得更多细节),和(ii)在协议成功的情况下,所更新的内容密钥对象(先前消息中响应的ContentKeyList(内容对象列表)),设置消息的NeedsContentKey元项被设置为真还是不存在。
在一个实施例中,协议结果的描述实际上是最后调用没有携带与代理相关的义务/回调对的控制的扩展状态块(ESB)。
在失败的情况下,ESB的参数可以指向资源。在一个实施例中,这些资源位于在设置消息中所发送的控制的ResourceList(资源列表)扩展中。
在成功的情况下,在一个实施例中,高速缓存持续时间表明在没有再次请求控制的情况下可以使用内容密钥多少时间。
下面示出了这种ESB XML表示的例子,并且其可以被添加到虚拟机模式
下面是依照上述改进的许可转送机制的一个实施例的再现使用情况的例子。在此例子中,广播输入功能导入具有以下许可的内容 -播放如果本地状态存在,那么OK -转送 -如果信宿处于域X中或者如果信宿在邻近,那么再现OK。一次只可以再现一个并行流。
假定核心DRMClient1请求再现内容流的权限。包含以下参数的设置请求被从信宿(核心DRMClient1)发送到源(BC导入功能) -许可与信宿想要再现的内容相关联的许可 -操作=urn:marlin:core:1-0:service:license-transfer:render -捆束=信宿的个性节点 当接收请求时,源应用填充相关的主机对象并且调用Control.Actions.Transfer.Perform方法。下面示出了用于管理支配再现转送的方法的说明性伪码 /*管理支配方法的伪码 再现转送*/ ESB* TransferRenderPerform(HostObjectTree* t){ //检查锁定 if(t->GetObject(“SeaShell/.../lock”)!=NULL){ return new ESB(ACTION_DENIED); }else{//时间限制锁定,在失败的情况下我们解锁t->SetObject(“SeaShell/.../lock”,1);t->SetObject(“SeaShell/.../lock@ExpirationTime, Time.GetCurrent()+180);//返回包含RunAgentOnPeer的ESB//义务和OnAgentCompleted回调 return new ESB(ACTION_GRANTED, new Obligation(RUN_AGENT_ON_PEER,CheckDomainAgent), new Callback(ON_AGENT_COMPLETED, RenderAgentCompleted)); } } 假定再现未被锁定,那么执行RunAgentOnPeer义务。利用包含CheckDomainAgent方法的控制来发送RunAgent消息。当接收此消息时,信宿将填充相关的主机对象并且调用CheckDomainAgent方法。下面示出了CheckDomainAgent的说明性伪码 /*CheckDomainAgent的伪码*/ AgentResult* CheckDomainAgent(HostObjectTree* t){ //检查域节点是否是可到达的 if(IsNodeReachable(“urn:marlin:...:domain2042x”)){ returnnew AgentResult(SUCCESS); }else{ returnnew AgentResult(FAILURE); } 为了此说明目的,假定信宿的确在该域中。然后,信宿发送包含此代理结果的AgentResult消息。当接收AgentResult时,源将调用回调方法。下面示出了RenderAgentCompleted的说明性伪码 /*RenderAgentCompleted的伪码*/ ESB* RenderAgentCompleted(HostObjectTree* t, AgentResult* ar) { if(ar->IsSuccess()){//给出没有义务/回调的ESB //和高速缓存持续时间 return new ESB(ACTION_GRANTED,new CacheDuration(0)); }else{//试图进行邻近度检查return new ESB(ACTION_GRANTED,new Obligation(CHECK_PROXIMITY,t->GetObject(“.../Sink/Id”),new Callback(ON_SINK_PROXIMITY_CHECKED, ProximityCheckCompleted)); } } 我们已经假定代理成功地检查了信宿上的域成员资格。发送拆卸消息,所述拆卸消息具有(i)(使用在设置请求中向信宿节点提供的密钥)为信宿重新加密的内容密钥,和(ii)携带上面所指定的高速缓存持续时间的ESB(在这种情况下为0,意味着所述信宿下次想要访问内容时必须重新请求)。当信宿接收此消息时,它知道被允许再现内容并且具有所需要的内容密钥。
现在假定用户想要在他的其它设备DRMClient2上再现内容。问题在于所述内容在该源上被锁定了180分钟。幸运地是,当用户在DRMClient1上按下STOP时,DRMClient1利用操作—释放—来发起新的许可转送协议。当接收请求时,源应用将填充相关的主机对象并且调用Control.Actions.Transfer.Perform方法。下面示出了用于管理支配转送释放的方法的说明性伪码 /*管理支配方法的伪码 转送释放*/ ESB* TransferReleasePerform(HostObj ectTree* t){ //检查锁定 if(t->GetObject(“SeaShell/.../lock”)!=NULL){ t->SetObject(“SeaShell/.../lock,NULL);//删除 return new ESB(ACTION_GRANTED); }else{ return new ESB(ACTION_DENIED); } } 由于在ESB中没有找到义务/回调,所以这意味着利用此ESB向回发送拆卸消息。
从而此再现使用情况举例说明了在某些实施例中,再现操作的请求DRMClient不需要本地重新评估控制,状态不必从源转送到信宿,控制可以主动请求邻近度检查,并且当再现器利用内容时可以释放所述内容。
11.证书 在一个实施例中,证书用来在根据利用那些密钥创建的数字签名进行判定之前检查与密码密钥相关联的凭证。
在一些实施例中,DRM引擎被设计成用于与标准的证书技术兼容,并且可以平衡在这种证书的元项中所找到的信息,诸如有效时段、名称等。除那些基本约束之外,在一些实施例中,可以定义关于所证实的密钥能够用于和不能用于作什么的附加约束。这可以通过例如使用可用为证书的标准编码一部分的密钥使用扩展来实现。在这种扩展中所编码的信息使DRM引擎能够检查已经签名特定对象的密钥是否被授权以用于该目的。例如,某个密钥可能具有这样的证书,只有链路是从特定属性的节点到具有另一特定属性的节点而不是其它链路,所述证书才允许所述密钥对链路对象进行签名。由于用于表达证书的通用技术的语义通常不能够表达这种约束,这是因为没办法表达与诸如链路和节点之类DRM引擎专用的元项相关的条件,所以在一个实施例中这种DRM引擎专用的约束被作为基本证书的密钥使用扩展来传达,其由已经被配置为使用所述DRM引擎的应用来处理。
在一个实施例中,密钥使用扩展中的约束由使用类别和VM约束程序来表达。使用类别指定了向密钥授权签名什么类型的对象。约束程序可以根据上下文情境来表达动态条件。在一个实施例中,被请求验证这种证书有效性的任何验证器被要求要理解DRM引擎语义,并且把对密钥使用扩展表示的评估委托给DRM引擎,所述DRM引擎使用虚拟机的实例来执行该程序。如果该程序执行的结果成功,那么该证书被认为是有效的。
在一个实施例中,约束程序的任务是返回布尔值。“真”意味着满足约束条件,并且“假”意味着不满足约束条件。在一个实施例中,控制程序有权访问一些上下文信息,所述上下文信息可以用来作出决定,诸如经由虚拟机的主机对象接口可用于程序的信息。可被用为上下文的信息取决于当DRM引擎请求验证证书时试图做出什么类型的决定。例如,在使用链路对象中的信息之前,在一个实施例中DRM引擎需要验证用于签名所述对象的密钥的证书允许该密钥用于该目的。当执行约束程序时,利用关于链路属性以及由所述链路所引用的节点属性的信息来填充虚拟机的环境。
在一个实施例中,被嵌入到密钥使用扩展中的约束程序被编码为虚拟机代码模块,虚拟机代码模块用于输出名称为“Octopus.Certificate.<Category>.Check”的至少一个入口点,其中“类别”名称用于表明需要检查哪种类别的证书。在调用入口点之前,用于验证程序的参数被压入堆栈。传递到堆栈上参数的数目和类型通常取决于所评估的证书扩展的类别。
12.数字签名 在优选实施例中,对由DRM引擎所使用的一些或全部对象进行签名。下面描述了在一个实施例中怎样使用XML数字签名规范(http://www.w3.org/TR/xmldsig-core)(“XMLDSig”)来对对象进行数字签名。另外,还描述了与XML专用规范(http://www.w3.org/TR/xml-exc-c14n/)(“c14n-ex”)兼容的XML的规范方法,其输出可以由非XML名称空间察觉(non-XML-namespace-aware)的解析器来处理。附录D提供了关于示例性对象串行化的更多信息,包括用于依照与编码无关的方式来为对象计算规范字节序列的说明性方式。
如图28、34和35所示,在优选实施例中对DRM许可中的某些元项进行签名。诸如在图28、34和35中所示出的那些技术在防止或阻止篡改或替换许可组件上是很有用的。如图34所示,在优选实施例中,控制器对象3402分别包括内容密钥对象3404和控制对象3406的密码摘要或散列(或其它适当的绑定)3405、3407。控制器3402本身被利用MAC(或优选为利用内容密钥的HMAC)和公钥签名(一般为内容或许可提供者的公钥签名)3412而签名。在优选实施例中,控制器的公钥签名3412本身是使用内容密钥来利用HMAC 3410而被签名的。应当理解,在其它实施例中,取决于所想要的安全等级和/或其它系统需求,可以使用其它签名方案。例如,不同的签名方案可以用于控制器和/或控制的签名,诸如PKI、标准MAC等。作为另一例子,可以为控制和控制器这二者计算独立的MAC签名,而不是在控制器中包括所述控制的摘要并计算所述控制器的单个MAC签名。在又一例子中,可以利用MAC和公钥签名来签名控制器。作为选择或另外,可以使用与上述那些不同的密钥来产生各个签名。从而虽然图28、34和35依照一些实施例图示了几种有益的签名技术,然而应当理解,这些技术是说明性并且不是限制性的。图35图示了其中控制器引用多个内容密钥的实施例。如图35所示,在一个实施例中,每个内容密钥用来产生控制器的HMAC和PKI签名。
在一个实施例中,除移除名称空间前缀(使用默认的名称空间机制来表明名称空间)以及不支持外部实体只支持字符实体之外,用于XML规范的数据模式、处理、输入参数和输出数据与专用规范XML(c14n-ex)相同。第一限制意味着属性及其元项需要处于相同的名称空间中。
图42示出了在一个实施例中在c14n-ex和说明性XML规范化之间的关系,其中<xml>是任何有效的XML,并且其中只有在<xml>没有外部实体并且没有名称空间前缀时<xml>’=<xml>”。
下面提供了简化签名方案的简单例子然而,在优选实施例中,使用标准的XML规范。

在此节中所论述的签名元项属于XMLDSig名称空间(xmlns=http://www.w3.org/2000/09/xmldsig#)并且在XMLDSig规范中所定义的XML模式中定义。在一个实施例中,DRM对象的XML表示的容器元项是<Bundle(捆束)>元项。
在一个实施例中,需要签名以下对象 ■节点 ■链路 ■控制器 ■控制(可选) ■扩展(取决于它们所携带的数据) 在一个实施例中,签名需要被分离并且<Signature>元项需要存在于<Bundle>对象中,所述<Bundle>对象包含需要被签名的对象的XML表示。
在一个实施例中,<Signature(签名)>块包含 ■<SignedInfo>元项 ■<S ignatureValue>元项 ■<KeyInfo>元项 在一个实施例中,<SignedInfo>嵌入以下元项<CanonicalizationMethod>—在一个实施例中,<CanonicalizationMethod>元项是空的并且其算法属性具有以下值http://www.w3.org/2001/10/xml-exc-c14n# <SignatureMethod>—在一个实施例中,<SignatureMethod>元项是空的并且其算法属性可以具有以下值 ■http://www.w3.org/2000/09/xmldsig#hmac-sha1(HMAC签名) ■http://www.w3.org/2000/09/xmldsig#rsa-sha1(公钥签名) <Reference>—在一个实施例中,如果一个以上对象需要由相同的密钥来签名(例如,对于控制和控制器对象,这可能就是这种情况),那么在<SignedInfo>块内就可以存在一个或多个<Reference(引用)>元项。
在一个实施例中,当对对象签名时,<Reference>元项的‘URI’属性值为引用对象的ID。当对本地XML元项签名时(例如在用于控制器对象的公共签名方法的多个签名情况中),URI值为所引用的元项的‘Id’属性的值。
在一个实施例中,当引用指向对象时,在所述引用中所作的摘要不是对象的XML表示而是其规范的字节序列。借助于<Tranforms(变换)>块在XMLDSig中表明此对象变换。因此在一个实施例中,<Reference>元项嵌入此块

附录D提供了附加信息。在一个实施例中,对于对象引用来说不允许其它<Tranform>。
在一个实施例中,<DigestMethod>元项是空的并且其算法属性具有以下值http://www.w3.org/2000/09/xmldsig#sha1 <DigestValue(摘要值)>元项包含摘要的base64编码值。
<SignatureValue(签名值)>——在一个实施例中,签名值是利用在<KeyInfo>元项中所描述的密钥来base64编码的规范化(ex-c14n)<SignedInfo>元项的签名值。
<KeyInfo> ■用于控制器对象签名的HMAC-SHA1情况 在一个实施例中,在这种情况下<KeyInfo>只有一个孩子<KeyName>,用于表明已经为HMAC签名使用的密钥ID。
例子
■RSA-SHA1情况 在一个实施例中,在这种情况下,在X.509v3证书中携带用于验证签名的公钥并且所述公钥可以由其它证书附带,所述其它证书对完成通向CA根的证书路径来说是可能是必要的。
这些证书被依照base64编码并携带在<X509Certificate>元项中。这些<X509Certificate>元项被嵌入到<KeyInfo>元项的<X509Data>元项孩子中,并且依照顺序次序出现,从签名密钥的证书开始。通常省略根的证书。
例子(为了简洁起见,尚未再生整个示例性证书的值;已经被删除的材料由省略符号来表明) <KeyInfo> <X509Data> <!—签名的公钥的证书--> <X509Certificate>MIICh...</X509Certificate> <!—到信任根的中间证书--> <X509Certificate>MIICo...</X509Certificate> </X509Data> </KeyInfo> 在一个实施例中,控制器对象对于在它们的受控目标列表中所引用的每个内容密钥来说需要具有至少一个HMAC签名。用于那些签名中每个的密钥是在所引用的内容密钥对象中所包含的内容密钥值。
控制器还可以具有RSA签名。在一个实施例中,如果这种签名存在,那么此签名还作为<Reference>在用于所述对象的每个HMAC签名中出现。为了实现这点,在一个实施例中,用于RSA签名的<Signature>元项必须在封入的XML文档内具有唯一的‘Id’属性,其在每个HMAC签名的<Reference>元项之一中被用为‘URI’属性。在一个实施例中,验证器必须拒绝未被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.邻近度检查协议 在一些实施例中,可能希望根据请求实体的物理邻近度来限制对内容、服务和/或其它系统资源的访问(例如,帮助强制实施用于表明受保护的内容无法被拷贝到用户家庭网络、办公室建筑物等之外的规则)。下面将描述邻近度检查协议的实施例,所述实施例在不过于妨碍执行邻近度检查本身的情况下提供安全性。邻近度检查协议有助于在各式各样的宽的上下文情境中应用,如上所指出其中之一是在数字权利管理控制的上下文情境中;然而应当理解,下述邻近度检查系统和方法并不限制应用于数字权利管理上下文情境。例如而并非限制,这里所给出的邻近度检查技术还可以在网络服务组织系统上下文情境中使用,诸如在‘551申请描述的上下文情境中和/或任何其它适当的上下文情境中。
在一个实施例中,通过测量第一计算节点从第二计算节点接收对所述第一计算节点请求的响应所花费的时间量来执行邻近度检查。如果所述时间量小于预定义阈值(通常表明第二计算节点在第一计算节点的某一物理距离内),那么邻近度检查被认为是成功的。
应当理解,由于存在各种可以用来发送请求和/或响应的不同网络连接的缘故,所以给定时间量可以对应于可能的距离范围。在一些实施例中,此变化被简单地忽略,并且如果请求/响应交换的往返时间小于预定义的阈值(例如,8毫秒或任何其它适当的时间量),而不管例如是否正在使用快速网络连接,这可能意味着请求和响应节点实际上彼此相对较远,那么邻近度检查被认为是成功的。在其它实施例中,可以确定所使用的网络连接类型,并且不同的往返时间要求可以被应用于每个不同的网络连接。
在优选实施例中,邻近度检查允许锚(例如,客户端)检查目标(例如,服务)的邻近度。在一个实施例中,协议是不对称的,这是由于锚产生了秘密种子,所述种子被使用并且是利用安全计时器的唯一一个。此外,目标不必信任所述锚。邻近度检查的优选实施例还是密码高效的在一个实施例中只利用两个公钥操作。
从种子S产生对Q的组R 在一个实施例中,依照以下公式从种子S获得组RRi=H2Q-i(S)。其中H(M)是对消息M的散列函数H的摘要值,并且对于n>=1并且H0(M)=M来说,Hn(M)=H(Hn-1(M))。应当理解,这只是用于产生共享秘密的一个说明性技术,并且在不脱离其原理的情况下在其它实施例中可以使用其它技术。
在一个实施例中,用于散列函数H的算法是SHA1(例如参见FIPSPUB 180-1。安全散列标准。美国标准和技术的商业/国家协会部(U.S.Department of Commerce/National Institute of Standards andTechnology)),不过应当理解,在其它实施例中,可以使用其它散列、消息摘要或函数。
在一个实施例中,按如下执行邻近度检查,其中“A”是锚(例如,客户端)并且“B”是目标(例如,服务) (a)如上所示,A产生Q对随机数的组R{R0,R1},{R2,R3}...{R2Q-2,R2Q-1}。
(b)A向B发送E(PubB,{Q,S}),其中E(Y,X)标示了利用密钥Y加密X,并且PubB标示了B在公钥/私钥对中的公钥。
(c)如上所示,B解密{Q,S}并且预先计算R。
(d)B向A发送确认以便表明它准备继续。
(e)A把循环计数器k设置为零。
(f)A测量T0=当前时间。
(g)A向B发送{k,R2*k}。
(h)如果R2*k值是正确的,那么B用R2*k+1作出响应。
(i)A测量D=新的当前时间-T0。
(j)对于R2*k+1来说,如果B利用正确值向A作出响应,并且D小于预定义的阈值,那么邻近度检查被认为是成功的。
如果k+1<Q,那么A可以通过增加k并且转到步骤(f)来重新尝试新的测量。如果需要执行Q次以上的测量,那么A可以以新的组R从步骤(a)开始。例如在一些实施例中,可以重复地(或预定义次数地)执行邻近度检查,直到在预定义的阈值内接收正确的响应(或者如果在大于质询/响应序列的预定义百分比的预定义阈值内接收了正确的响应),这是因为即便两个计算节点彼此在所要求的邻近度内,异常缓慢的网络连接、大通信量、噪声等也可能导致B的响应延迟。
图36图示了上述协议的实施例,其中锚(A)确定目标(B)是否在可接受的锚(A)的邻近度内。例如如图36所示,A可以包括计算节点3602,所述计算节点3602包含受保护的内容(例如,音乐、视频、文本、软件等)和/或远程计算节点(B)3606访问受保护的内容所需要的内容访问材料(例如,链路、密钥等),所述受保护的内容存储在计算节点B 3606或可由其访问。与内容或内容访问材料相关联的控制可以表明它只可以与节点A3602某一邻近度内的设备共享(例如,把内容分发近似地限制在家庭网络)。作为选择或另外,可以在计算节点A3602的系统级强制实施这种策略(所述计算节点A 3602例如可以包括家庭或企业网的域管理器)。即,邻近度检查不必是由虚拟机所执行的控制程序中的条件;作为替代它可以只是计算节点A 3602在向计算节点B 3606发送内容或内容访问材料之前作为操作策略所要求的一些东西。为了强制实施这种控制和/或策略,每当请求向计算节点B 3606分发受保护的内容或内容访问材料时,在计算节点A 3602上运行的软件和/或硬件可以执行上述邻近度检查协议。作为选择或另外,可以以预定义间隔执行邻近度检查(例如,一天一次)以便确定节点B是否在所要求的邻近度内,以及所述邻近度检查是否成功,对于预定义周期来说节点B 3606可以被视为在所要求的邻近度内(例如,直到执行下一次检查,直到预定义的时间量过去等)。
如图36所示,一旦A和B完成任何初始设置步骤(例如,上面的步骤(a)到(e))3604、3608,A和B就从事安全、计时的质询-响应交换(例如,上面的步骤(f)到(i))3610,所述交换使A能够确定B是否在可接受的邻近度内。
如图36所示,在一个实施例中A 3602向B 3606发送设置请求3604,所述设置请求3604包括E(PubB,{Q,S})——即,对Q的数目,以及利用B的公开加密密钥(例如,由B在服务组织上下文情境内使用的密钥)加密的秘密对种子S。在一个实施例中,{Q,S}是依照网络字节次序的Q(1字节)和S(16字节)的字节流拼接。在一个实施例中,使用RSA公钥加密(例如在B.Kaliski、J.Staddon,PKCS#1的RSA Cryptography Specifications Version 2.0中所描述,IETFRFC2437,1998年10月)来执行加密。在优选实施例中,PubB将事先已经由A通过审查访问了,并且其证书将已经被验证。尽管在图36中示出了从B 3606到A 3602的设置响应3608,不过在其它实施例中,不使用设置响应3608。如先前所表明,在接收设置请求3604之后,B3606优选预先计算组R,以便对来自A 3602的随后质询进行快速响应。
如图36所示,A 36-2向B发送质询请求3612,所述质询请求3612包括[k,R2*k]——即,索引k和根据种子所计算的相应秘密。在一个实施例中,[k,R2*k]是用base64编码的、依照网络字节次序的k(1字节)和R2*k(20字节)的字节流拼接以供传输。如图36所示,在一个实施例中,B 3606可操作来向A 3602发送质询响应3614,所述质询响应3614由R2*k+1组成——即,来自质询请求3612的相应秘密。在一个实施例中,R2*k+1是用base64编码的、依照网络字节次序的R2*k+1(20字节)的字节流以供传输。
图37示出了可以怎样使用上述邻近度检查协议的实施例来控制对受保护内容访问的例子。参照图37,假定电缆或卫星内容供应者具有用于允许用户个人录像机(PVR)3702的预定义邻近度3708内的所有设备经由所述PVR访问内容的策略。从而例如在PVR 3702上运行的域管理器软件可以对用于请求经由PVR 3702对内容进行访问的设备3704和3706执行邻近度检查。在图37中所示出的例子中,设备3706不在由服务供应者策略所定义的邻近度3708内,并且会被PVR 3702拒绝访问。相比之下,设备3704在所述邻近度内,并且会被提供有访问(例如,通过连同从设备3704到PVR 3702的期满链路一起接收内容)。作为选择或另外,所述链路可以包含控制程序,所述控制程序本身可操作来利用PVR 3702发起邻近度检查,并且如果设备3704移出PVR3702的预定义邻近度3708之外,那么拒绝设备3704进一步对内容进行访问。
安全性考虑 在优选实施例中,应当注意坚持以下一些或全部 ●对于任何组R来说,并不利用相同的值k来重复包括步骤(f)到(i)的循环。
●如果任何一方接收了意料之外的消息,那么中止协议,所述意料之外包括 ○如果在步骤(g)中对于R2*k来说B接收了不正确的值 ○如果在步骤(a)中Q不在所指定的距离内 ○如果在循环中重复k ○如果k超过Q 作为选择或另外如果在步骤(h)A接收了不正确的值R2*k+1,那么中止协议。在其它实施例中,可以容许某些来自B的不正确响应。
应当理解,Q的最优值和预定义的时间阈值一般取决于手边的应用的唯一环境(例如,网络速度、确保相对紧密邻近度的重要性等)。因此,实现方式优选应当在配置这些值中提供灵活性。在一个实施例中,假定实现方式对于Q来说支持最小值64并且对于阈值来说支持值8ms(其中以今天的某个网络速度,8ms可对应于几英里的邻近度)。
协议安全策略 在优选实施例中,对于交换请求和响应来说不需要附加的安全性。由于所交换消息的大小(例如,20字节)以及它们有效随机性的原因(通过使用SHA1散列算法或其它方法),即便攻击者设法拦截所述请求,那么所述攻击者要确定正确的响应在密码上也是不可行的。
应当理解,上述实施例是说明性的,并且在不脱离这里所给出发明原理的情况下可以进行许多修改。例如,虽然上面描述了递归散列的秘密种子,不过任何适当的共享秘密可以用于质询/响应。在一个实施例中,共享秘密可以只是包括从A到B发送的加密的数目/消息,并且质询/响应可以只是包括数目/消息的A和B交换部分(例如,A向B发送消息的第一字符,并且B向A发送所述消息的第二字符等)。尽管这种技术可能缺乏结合图36所描述的实施例的安全性(由于消息中的字符会比20字节散列更易于猜测),不过在一些实施例中,这种安全等级可能是足够的(特别是例如在网络延迟可变性使邻近度检查机制相当粗略地控制实际邻近度的情况下),并且在其它实施例中,可以通过多次执行邻近度检查来增强安全性,其中尽管任何特定的数字或比特可能相对易于猜测,不过攻击者能够正确猜测给定数字或比特序列的可能性随着序列长度增加而迅速减小。在这种实施例中,只有当B能够提供预定义数目以上个连续的正确响应(或正确响应的预定义百分比以上)时,邻近度检查才可以被认为是成功的。
为了说明和解释,下面提供了邻近度检查协议的补充说明性例子。在此例子中,第一设备SRC经由通信信道(例如计算机网络)与第二设备SNK通信。我们想要能够安全地确定SRC和SNK是否彼此在邻近度(按照SNK对来自SRC的通信请求作出响应所花费的时间来测量)以内。从SRC向SNK发送质询或探测消息,并且SNK利用响应消息来应答。在发出质询和接收响应之间的时段被称作往返时间或RTT。为了避免在SNK计算并送回对质询的响应所花费的时间中引入不必要的开销,通常希望实际上尽可能少量地进行质询/响应通信。特别地是,一般希望避免要求SRC或SNK在发出质询和接收响应之间进行密码运算。
为了确保只有SNK能够对来自SRC的质询生成有效响应(例如,为了避免中间人的攻击,其中第三方可以拦截来自SRC的质询并且向回发送响应,就好像SNK已经响应一样),所述协议还可以按如下继续 (1)SRC创建秘密。此秘密由一对或多对随机或伪随机数组成。
(2)SRC向SNK发送秘密。协议的此部分不是对时间敏感的。所述秘密由SRC和SNK来保持机密。还依照确保只有SNK知道所述秘密的方式来发送所述秘密。这一般涉及经由在SRC和SNK之间的安全认证信道来发送秘密(例如,SRC可以利用它知道只有SNK具有相应私钥的公钥来加密秘密数据)。秘密数据不必是上述的随机或伪随机数对。即便在使用这种对的实施例中,在此步骤中所发送的秘密数据只需要是使SNK足以计算或推算数目对值的信息。例如,秘密数据可以是随机种子数目,据此可以使用种子伪随机数发生器来产生一对或多对伪随机数。
(3)一旦SRC知道SNK准备接收质询(例如,SNK可以在接收和处理秘密数据之后发送READY消息),SRC就创建质询消息。为了创建质询消息。例如在优选实施例中,SRC选择随机数对之一。如果使用一对以上,那么质询消息数据包含用于表明选择哪对以及在该对中两个数目之一的信息。
(4)SRC测量当前时间值T0。在此之后,SRC立即向SNK发送质询消息(不需要加密或数字签名)并且等待响应。作为选择,SRC可以在发送质询消息之前(不过优选在已经执行任何伴随的密码运算(例如,加密、签名等)之后)立即测量当前时间T0。
(5)SNK接收质询,据此它可以标识它先前已经接收的对之一。SNK检查质询中的随机数是所述对的一部分,并且构造响应消息,所述响应消息包含了该对的另一随机数的值。
(6)SNK向SRC发送响应消息(不需要加密或数字签名)。
(7)SRC接收响应消息,并且测量当前时间T1的值。往返时间RTT等于T1-T0。
(8)SRC验证在响应中所接收的数目等于为质询所选择的对中的另一值。如果所述数目匹配,那么质询响应成功,并且SRC可以确信SNK在由往返时间所表明的邻近度内。如果所述数目不匹配,那么SRC可以中止协议,或者如果共享一个以上的对,并且存在尚未使用的至少一对,那么返回到步骤(3)并且使用不同的对。
应当理解,在不脱离其原理的情况下可以对上述说明性邻近度检查协议进行许多改变。例如而并非限制,可以使用不同的密码算法,可以使用不同的共享秘密等。
14.安全性 在实际应用这里所描述的系统和方法中,可以以各种不同的级别并且使用各种不同的技术来提供安全性。这里的论述主要集中于DRM引擎和相关主机应用的设计和操作以用于有效地调整可能复杂的业务关系。当DRM引擎和主机应用按照预计的那样操作时,通过强制实施与内容相关联的许可条款来保护所述内容免受未经授权的访问或其它使用。
保护DRM引擎和/或所述DRM引擎运行的环境(例如,应用和其与之交互的硬件)免受恶意篡改或修改可以使用任何适当的安全性技术组合来进行。例如,可以使用诸如加密、数字签名、数字证书、消息认证代码等密码机制,例如在此的其它地方所描述,以保护DRM引擎、主机应用和/或其它系统软件或硬件免受篡改和/或其它攻击,也可以是结构和/或策略上的安全措施,诸如软件模糊化、自检、定制、水印、反调试和/或其它机制。例如可以在美国专利号6,668,325 B1的Obfuscation Techniques for Enhancing Software Security中以及在共同受让的美国专利申请号11/102,306,作为US-2005-0183072-A1公开;美国专利申请号09/629,807;美国专利申请号10/172,682,作为US-2003-0023856-A1公开;美国专利申请号11/338,187,作为US-2006-0123249-A1公开;以及美国专利号7,124,170B1的SecureProcessing Unit Systems and Methods中找到这种技术的代表性例子,这里在此通过全部引用加以结合以供参考。作为选择或另外,可以使用物理安全技术(例如,使用相对难于访问的存储器、安全处理器、安全存储器管理单元、硬件保护的操作系统模式等)来进一步增强安全性。这种安全性技术为本领域普通技术人员之一所知,并且应当理解,根据所想要的保护级别和/或手头特定应用的细节可以使用一些或所有这些技术的任何适当的组合,或者不使用这些技术。从而应当理解,虽然这里结合某些实施例描述了某些安全机制(例如,密钥推导技术、数字签名技术、加密技术等),但是在所有实施例中并不要求使用这些技术。
可以借助系统的规定设计和操作以及其中参与者的法律和社会规章来提供又一形式的安全性。例如,为了获得个性节点、密钥材料、受保护内容等,可以要求设备或实体在契约上同意遵循系统规范和要求,可以需要服从证明(certification)过程等,其中在所述证明过程期间可以验证实体与系统要求的顺应性。例如,可以要求设备或应用依照与环境中的其它实现方式兼容的方式来实现DRM引擎,和/或要求所述设备或应用提供某种类型或级别的抗窜改或其它安全性。可以发出用于证明设备或其它实体与这种要求顺应性的数字证书,并且可以在允许所述设备或实体参与系统之前或作为允许继续访问的条件来验证这些证书。
下面提供了关于安全性技术的另外的非限制性信息,其可以结合所发明的工作主体使用。
系统安全性 在一些实施例中,系统设计员可以选择使用更新、拒绝和/或补救技术的组合来管理风险并缓和威胁,所述威胁可能起因于对设备、应用和服务的攻击和危害。下面给出了可以用来缓和威胁的各种技术机制的例子。
可以使用更新机制来服务至少两个不同目的。首先,它们可以用来向信任的系统实体传达最新信息,所述系统实体允许它们拒绝访问或服务于不信任的系统实体。第二,更新机制使不信任的实体能够通过更新任何有危害的组件来返回到信任状态。拒绝对策可以进一步被表征为表现为以下一个或多个行为 ●撤销或废除凭证(一般通过把一些实体放入黑名单) ●通过应用密码或策略强制机制来排除或拒绝访问 ●根据被绑定到凭证的身份或其它属性来回避或拒绝访问或服务 ●根据时间事件来截止或废除凭证或特权。
例如,可以使用拒绝机制来对诸如设备克隆、假冒攻击、协议失败、策略实施失败、应用安全性失败和失效或可疑信息之类的威胁进行计数。
下表提供了潜在威胁、它们造成的一些风险和用于补救所述威胁并且更新系统安全的机制的例子。
撤销 撤销可以被视为依赖把实体列入黑名单的补救机制。典型情况下,所撤消的是诸如公钥证书之类的凭证。当撤消凭证时,需要更新黑名单并且使用更新机制来传达所述更新使得依赖方可以从中获益。
从而在向设备、用户和/或其它实体给予用于消费内容或服务所必须的信息之前,例如可以要求它们给出身份证书、其它凭证和各种安全数据。类似地,为了使客户端信任服务,所述服务可能需要向所述客户端提供其凭证。
实体可以有效地使为访问服务所必须的信息无效的方式的例子包括 ●证书撤销列表(CRL) ●凭证和数据有效性服务,诸如在线证书状态协议(OnlineCertificate Status Protocol OCSP)应答者 ●用于自毁凭证和数据的命令 证书撤销列表(CRL) 撤销列表可以由不同的实体用来撤消身份证书、许可、链路及其它安全声明。此机制对于补救源于服务受到危害的情况来说是最有效的。可以使用多种技术来分发CRL。例如,一些系统可以使用间接CRL,使得存在用于管理整个生态系统(escosystem)的单个CRL。另外,实体可以通告(或公开)它们拥有的CRL和/或预订更新服务。可以依照病毒引起的方式来对等地分发CRL,和/或便携式设备当被束缚时可以接收公开的CRL。在‘551申请中所描述的服务组织技术也可以用于此目的。
有效性服务 可以使用有效性服务来提供关于凭证及其它安全相关数据状态的最新信息。有效性服务可以执行代表依赖方来执行活动的证实操作,或者它们可以用来代表依赖方管理安全信息。活动有效性服务的例子是可以检查凭证或属性有效性的服务。用于管理安全信息的有效性服务的例子是传播CRL或安全策略更新或提供安全时间服务的那些服务。使用有效性服务可以帮助确保依赖方具有用于通知管理决定的当前数据。
典型情况下,并非所有系统实体需要关于凭证和安全数据有效性的最新信息。例如,每当使用许可或获得新的许可时,并非所有消费者设备将使用在线证书状态协议(Online Certificate Status ProtocolOCSP)服务来证实许可服务器的证书链。然而,许可服务器可以一定频率地使用OCSP服务来检查订户凭证的有效性。策略(其可以被容易地更新)可以确定必须何时使用服务以及使用什么服务。通过提供动态地更新策略的机会,许可服务器可以适于操作上的改变。从而,安全策略可以根据经验、技术进展和市场因素来发展。
安全对象的有向自毁 当实体的安全处理的完整性并非是不可信的时,由实体自毁凭证和数据是适当的。当此选项是可用的时,它常常是最直接的、迅速的和高效的撤销方法。在几乎不怀疑完整性被破坏时它是特别有用的,并且双向通信支持用于允许销毁以及销毁已经完成的验证的具体方向的协议。
存在常常对已经销毁或禁止来说是有用的多个安全对象。例如,当设备离开域或者内容许可超时时,相关联的对象包含密钥并且可以用来访问要被销毁的内容是有用的。在此的其它地方更详细描述的代理控制程序对于自毁机制的实现来说是很合适的。代理可以被设计来销毁安全存储装置(例如,状态数据库)中的状态以便影响域成员资格中的变化或者移除不再可用的密钥(例如,由于成员资格或策略的改变)。
排除 排除是用于阻挡危险分子(或危险分子组)参与将来消费商品及服务的补救机制。由于排除所强加的严重结果,所以它一般只是被用为当环境批准时的最后手段。排除依赖于用于把危险分子有效地列入黑名单由此禁止它们消费媒体和媒体相关服务的机制。黑名单的传播依赖于用于启用此补救的更新机制。然而,排除不必提供用于把危险分子恢复为信任状态的更新机制。
密钥排除 密钥排除是用于采用在任何给定时间可以判定在逻辑上把一些接收器子集从解密将来内容的能力中排除在外的方式来向一组接收器广播密钥信息。这通过使用高效技术构造广播密钥块(Broadcast KeyBlock BKB)来激活,所述广播密钥块包括为巨大的接收器组的每个成员解密内容所必须的信息。BKB采用可以被容易更新的方式来构造,把该组的一个或多个成员从解密所述内容的能力中排除。换句话说,BKB的设计允许权威机构利用新的BKB来更新系统,使得内容供应者可以特别地排除目标设备组利用所述BKB,即便她/他可能有权访问它也是如此。
此机制对克隆攻击来说是特别有效的,其中盗版者对合法设备进行反向工程,提取其密钥,继而把那些密钥的拷贝散布到克隆设备。克隆除了不一定遵循管理模型之外,表面像原始那样做动作。一旦发现受到危害,就可以部署更新的BKB,所述BKB排除受到危害的设备以及其所有的克隆。然而,密钥排除承担一些存储、传输和计算开销,在一些情况中这使与其它方法相比没那么高效。当没有广播内容时或当存在暗道时特别如此。
回避(shunning) 回避是与排除行为非常类似的补救机制,但是没有那么严重的影响。实质上,它是用于由于运行时策略判定而拒绝服务的手段。代替通过有向自毁或经由密钥排除访问拒绝来禁止设备能力的更苛刻的方法,回避通过使服务供应者拒绝向其提供服务来提供更简单的禁止设备的方法。在当前趋向于通过使用外部提供的服务来扩展设备的价值的情况下,回避变为更加有效的安全机制。
设备回避由策略来驱动并且可以用来排斥没有生成策略所要求的所有适当凭证的实体(例如,客户端、服务器和特定任务播放器)。策略例如可以要求实体证明它已经执行了最新的安全更新。因此回避可以是撤销的结果或无法采取某个特定动作。可以使用审查服务和诸如在‘551申请中所描述的那些服务依照对等方式来使回避便于进行。数据证明服务(例如,有效性服务的实例)还可以在策略强制实施时执行回避。在系统实体已经被回避之后,可以向它通知没能符合服务策略的具体凭证或对象。这可以触发所回避的实体通过适当的服务接口来更新对象。
期满 期满是依赖于一些时间事件来使凭证或对象无效的补救机制。期满在允许对媒体或媒体服务进行临时访问时是有效的;一旦这些已经期满,那么管理模型确保不再允许访问。有效的使用期满可以要求更新机制,借此可以刷新凭证或对象以便能够继续访问媒体或媒体服务。
凭证的期满 证实的密钥可以具有被分配来用于保护依赖方的各种期满属性。凭证的期满可以用来确保其证书已经期满的实体被拒绝服务并且结合密钥翻滚(rollover)和密钥更新过程来使用。当预计实体频繁地连接到广域网时,最佳实施方式指示定期地更新凭证及其它安全数据。另一最佳实施方式在于保持这些对象的有效时段尽量合理地短。在有效性检查策略中诸如重叠有效时段和宽限时段之类的各种技术可以用来确保在转变期间的平滑操作。短的有效时段还有助于减小CRL的大小。
链路的期满 如前所述,可以向链路对象分配有效时段。当期满时,链路被认为是无效的并且DRM引擎在构成它的图时不考虑该链路。此机制可以用来允许对商品及服务进行临时访问。链路可以被更新,使得只要策略允许就可以准许对媒体继续访问。因为在一个实施例中链路是相对轻便的自保护对象,所以它们可以经由对等协议被容易地分发。
可更新机制应用和策略可更新性 高效的可更新性一般需要对协议失败迅速展开补救,所述协议失败常常是在安全应用中(包括在DRM系统中)所常见的主要安全问题。然后可以使用软件更新来更新企业逻辑和安全协议。当应用被设计成用于把安全策略和信任策略与应用逻辑相分离时,可以使用独立的机制来更新策略;这是不那么有风险的方法。实际上,可以使用对等公开机制来迅速地更新策略。否则,可以使用应用部署者的软件更新方法更新安全和信任策略。
为权利作业使用权利工具 通常当可能时希望使用相对轻便的工具。使用具有有限有效时段的凭证和检查有效日期的策略可以帮助把实体的整个群体保持为可管理的大小并且不必太过迅速地发展CRL。避免实体而不是把它从对密钥的访问中排除可以扩展BKB的使用期;此外,它还有允许细粒度策略的优点,所述策略可以是临时的并且随环境而改变。可以使用不同的CRL而不是BKB,其中所述CRL跟踪不同任务播放器感兴趣的特定类型的凭证,所述BKB可以被部署在它们最有效的地方(诸如处理克隆接收者)。当可以预期在线有效性服务对时间和精力投资能提供合理回报时,策略可以引导使用那些服务,其中未用过的凭证是非常重要的,并且其中较慢的撤销机制是不够的。当节点可能具有完整性并且可以被预计为做正确的事时,并且当需要撤消许可或安全对象(诸如用于预订的链路或域链路)时,那么合理的方法一般是告诉节点销毁所述对象。在这种情况下,不必公开宣布许可是无效的并且不必部署BKB或为域重新设定密钥。由本地策略或权威命令驱动的自毁是用于撤销的最有效的方法之一。
应当理解,虽然已经描述了各种撤销、更新、补救及其它技术和实施方式,然而应当理解,不同的情况要求不同的工具,而且可以使用这些技术中的任何适当组合或不使用这些技术来实施这里所描述系统和方法的优选实施例。
网络服务安全 以下论述举例说明了一些可能与以下实施例有关的安全性考虑和技术,在所述实施例中结合诸如在‘551申请中所描述的那些联网的服务组织系统和方法使用上述DRM引擎和应用。
用于使用诸如这里所公开的那些DRM引擎和体系结构的DRM系统的实际实现方式常常执行联网事务来访问内容和DRM对象。在这样的上下文情境中,在‘551申请中所描述的系统和方法尤其可以用来使消息层安全标准化,包括实体认证和授权属性(角色)的格式。
为了论述,在DRM系统中出现的事务可以根据所访问、获取或操纵的信息类型被分成至少两个一般类别 内容访问事务涉及直接访问或操纵受DRM系统保护的媒体或企业内容或其它敏感信息。内容访问事务的例子包括再现受保护的视频剪辑,把受保护音频曲目的拷贝烧录到紧凑盘上,把被保护文件移动到便携式设备,电子邮件发送机密文档等。内容访问事务一般涉及直接访问内容保护密钥并且在用户指导下在消费点执行。
对象事务是其中用户或系统获取由DRM系统所定义的对象或与之相交互的事务,所述对象采用某种方式来管理对受保护内容的访问。这种对象包括DRM许可、成员资格令牌、撤销列表等。通常在为执行内容访问事务所必须的所有担保都是可用的之前,要求一个或多个对象事务。对象事务一般其特征在于使用某种类型的通信网络来在消费点汇编DRM对象。
这两种类型的事务定义了通常与大部分DRM系统有关的两个管理点。图38示出了一对典型的交互,其中具有DRM功能的客户端3800从适当的DRM许可服务3804中请求DRM许可3802。在图38所示出的例子中,DRM许可3802从DRM许可服务3804被发送到客户端3800,在那里它被评估以便提供对内容3806的访问。
DRM系统一般要求依照防止对内容未经授权的访问以及创建保护所述内容的对象的方式来执行内容访问和对象事务。然而,用于两种类型事务的安全问题自然是不同的。例如 内容访问事务可以要求认证人类委托人,检查安全再现计数,评估DRM许可以便导出内容保护密钥等。对合法执行内容访问事务的主要威胁是破坏了用于保护对象和其中数据的抗篡改界限。
对象事务通常涉及在要求DRM对象的实体和可以提供它的实体之间的通信信道。因而,对象事务面临基于通信的威胁,诸如中间人攻击、重播攻击、拒绝服务攻击和其中未经授权的实体获取它们不应当合法拥有的DRM对象的攻击。
通常,对象事务涉及两个相交互实体的认证,在它们之间传递的消息的保护以及所述事务的授权。这种事务的主要目的在于从合法源中采集完整保护的DRM对象使得可以执行内容访问事务。从内容访问事务的视角看,用于获得合法DRM对象的机制以及在获得它们过程中所使用的担保信息在本质上是无关的;这些机制可以(并且优选应当)对于内容访问本身来说是不可见的。此问题的自然分离在优选实施例中导致了分层通信模型,分层通信模型用于把信任通信框架与在其之上所构建的应用区分开来。
在图38中所示出的简化的许可获取和消费例子模糊了通常在实际应用中是重要的一些细节。例如,没有示出DRM许可服务怎样验证请求DRM许可的实体实际上是合法的DRM客户端而不是恶意的实体,所述恶意的实体试图获得未经授权的许可或通过消耗网络带宽和处理能力来拒绝对合法客户端服务。也没有示出当敏感信息通过连接客户端和服务的通信信道移动时怎样保护所述敏感信息的机密性和完整性。
在图39中示出了此示例性事务的更详细的视图。参照图39,从应用层内容再现客户端3800和DRM许可服务器3804的观点来,虚线表示逻辑事务。下面的堆栈3900表示用于确保在两个端点之间的受信任和受保护递送的处理层。
在图39中,再现客户端3800从DRM许可服务器3804请求许可3802。图中的虚线表明信息原始的源和最终消费者是内容再现客户端3800和DRM许可服务器3804。然而,在实践中消息有效载荷实际上可以由在应用层逻辑和连接两个端点的不安全通信信道3902之间插入的几个处理层来处理。
用于把应用层组件与不安全的通信信道相分离的处理层一块被认为是安全堆栈。安全堆栈可以被认为是用于确保在信任端点之间对消息进行完整性保护、机密递送的安全消息发送架构。分层堆栈模型提供了以下优点,诸如 (1)应用层逻辑的设计者不必花费精力来开发用于连接端点的基础安全通信机制。信任的消息发送基础结构是共用的设计模式,其一旦被设计就可以部署在许多不同的情形下,而不管它们所支持的应用层逻辑如何。
(2)消息发送架构本身可以保持不知道它正传达消息的精确语义,并且把它的精力集中在防止与通信相关的攻击和对消息发送端点可靠性的攻击。
在一个实施例中,安全堆栈由几个不同的处理层组成,如下所述。在一个实施例中,在‘551申请中所描述的服务组织系统和方法可以用来提供安全堆栈的一些或全部操作。
认证 在一个实施例中,可以认证消息发送端点。认证是给定端点用来向另一个端点证明由为此目的所信任的权威机构已经向该端点给予有效名称的过程。命名权威机构应当被事务中的依赖端点所信任;一般由用于部署信任技术的组织来承担建立这种权威机构。
用于表明有效名占有情况的通用机制使用公钥密码和数字签名。使用此方法,向实体提供三个信息 (1)用于向实体提供标识符的可区别名称; (2)由公钥和秘密私钥组成的非对称密钥对;和 (3)用于断言私钥的持有者具有给定的可识别名称的数字签名证书。
所述证书把可区别名称和私钥绑定在一起。使用私钥来签名信息的实体被信任为具有给定可区别名称。可以只使用公钥来验证签名。例如,认证可以是基于X.509v3标准的。
由于在一个实施例中,可以证明拥有所证实私钥的实体被信任为具有在证书中所表明的可区别名称,所以保护用于签名信息的私钥变为重要的考虑事项。实际上,使用私有签名密钥的能力定义了由可区别名称所标识的实体界限。在应用层,发送方和接收方必须知道消息来源于信任的对方。因而在一个实施例中,重要的是应用层逻辑本身是被认证的实体的一部分。为此,在一个实施例中安全堆栈和依赖于它的应用层优选被封闭在信任界限内,以致在信任界限内所包含的子系统被认为共享对实体的私有消息签名密钥的访问。
授权 上述认证机制向分布式消息发送端点证明它们的通信方的身份是值得信任的。在许多应用中,此信息太过粗略—做出关于某些事务的策略判定,可能需要关于端点能力和特性的更详细的信息。例如在图38的上下文情境中,内容再现客户端可能不仅需要知道它正与被认证的端点通信,而且需要知道它是否与已经被认为有能力提供有效DRM许可对象的服务通信。
安全堆栈的实施例经由授权机制提供了用于声明、传达和应用策略的机制,所述策略是基于关于被认证的实体的更细粒度的属性的。使用此机制,已经拥有认证凭证的实体被分配有角色声明,所述角色声明用于使一组命名的能力与所述实体的可区别名称相关联。例如,可以为DRM客户端和DRM许可服务器定义角色名称。
命名的角色旨在传达由实体所保持的特定能力。在实践中,可以通过声明在实体的可区别名称和角色名称之间的关联来把角色附着到实体。就像用于使密钥与可区别名称相关联的认证证书一样,在一个实施例中用于授权的角色声明由可以不同于名称发行者的信任角色权威机构来签名。在实体内,角色声明连同认证凭证一起被验证,作为用于准许对消息发送端点的应用层进行访问的条件。
实体可以保持所构建的应用要求的那么多的角色属性。图40中的例子示出了具有多种角色的实体用于表明作为DRM客户端起作用的能力的一个角色和两个服务角色。例如,一个实体同时可以是DRM客户端、DRM对象供应者和安全数据供应者。在一个实施例中,SAML1.1用于关于实体属性的声明。
消息安全性 安全堆栈的底层是消息安全层,用于向消息提供完整性、机密性和新鲜(freshness)保护,并且缓和对通信信道的攻击的风险,诸如重播攻击。在消息安全层中 ●使用实体的私有消息签名密钥来签名在应用层处理之间的消息,提供了完整性保护以及对中间人攻击的抵抗。
●使用由目的地实体所保持的公钥来加密消息。这保证无意的接收者无法读取在运输中拦截的消息。
●把特殊时间和时间戳添加到消息,提供了对重播攻击的免疫性并且便于证明在消息发送端点之间的实况性。
●使用服务器时间戳来更新DRM引擎的信任时间 在一个说明性实施例中,提供了对AES对称加密、RSA公钥密码、SHA-256签名摘要和用于在消息中发信号表示其它算法的机制的支持。
15.引导协议 在一些实施例中,使用引导(bootsrap)协议来向诸如设备和软件客户端之类的实体递送初始机密的配置数据。例如,当实体想要加入更大网络或系统并且使用密码协议与其它实体通信时,它可能需要利用包括一组(共享、秘密和公共)密钥而被配置。当利用个性化数据来预先配置实体是不可能的或不切实际的时,它需要使用密码协议来“引导”本身。
下述示例性协议使用共享秘密作为用于利用一组密钥和其它配置数据来引导实体的基础。在下面章节里,使用以下符号 ■E(K,D)是利用密钥K来加密某个数据D。
■D(K,D)是利用密钥K来解密某个加密的数据D。
■S(K,D)是利用密钥K来签名某个数据D。这可以是公钥签名或MAC。
■H(D)是数据D的消息摘要。
■V(K,D)是利用密钥K来验证某个数据D上的签名。它可以是公钥签名或MAC的验证。
■CertChain(k)是与公钥K相关联的证书链。K值被包括在链中的第一证书中。
■CertVerify(RootCert,CertChain)是验证证书链CertChain(包括在链的第一证书中找到的公钥)在根证书RootCert下是有效的 ■A|B|C|...是通过拼接单个字节序列A、B、C、...所获得的字节序列 ■CN(A)是A的规范的字节序列 ■CN(A,B,C,...)是复合字段A,B,C...的规范字节序列 1.38.初始状态 1.38.1.客户端 在一个实施例中,客户端具有以下引导令牌组(在制造时间预先加载和/或被加载到固件/软件中) ■一个或多个只读证书,其是引导过程的信任根BootRootCertificate ■一个或多个秘密引导认证密钥BAK(共享) ■可选的秘密引导种子产生密钥(对每个客户端来说是唯一的)BSGK。如果客户端具有良好的随机数据源,那么不需要此种子。
■一些信息ClientInformation,客户端需要向引导服务给予该信息以便获取其机密密钥(例如,ClientInformation可以包括设备的序列号、制造商名称等)。此信息由一列属性组成。每个属性是(名称,值)对。
客户端可以利用多个BootRootCertificate证书和BAK认证密钥来配置,以便能够利用可以要求不同信任域的不同引导服务器参与引导协议。
1.38.2.服务器 在一个实施例中,服务器具有以下令牌 ■至少一个客户端引导认证密钥BAK(共享秘密) ■用于签名的公钥/私钥对(Es,Ds) ■证书链ServerCertificateChain=CertChain(Es),其在根证书之一(BootRootCertificate)下是有效的 ■用于加密的公钥/私钥对(Ee,De) 1.39.协议描述 下面在图41中示出了并且描述了引导协议的说明性实施例。在该过程期间(例如当验证签名或证书链时)的失败会导致错误并且停止协议进展。
BootstrapRequestMessage(引导请求消息) 客户端向服务器发送请求,用于表明它想要发起引导会话并且提供一些初始参数(例如,协议版本、简档等),以及会话ID(用于防止重播攻击)和它可以参与到其中的信任域列表。下表示出了BootStrapRequestMessage的说明性格式
协议和版本消息属性指定了客户端使用哪个协议规范,并且简档字段标识了一组预定义的密码协议和用于交换消息和数据的编码格式。
客户端选择SessionId(会话ID),所述SessionId应当对该客户端来说是唯一的并且不被重新使用。例如,该客户端的唯一ID和增加的计数器值可以被用为产生唯一会话ID的方式。
在一个实施例中,客户端还发送它已经被配置的所有信任域的列表。
在一个实施例中,服务器接收BootstrapRequestMessage并且执行以下步骤 ■检查它支持由客户端所请求的指定协议、版本和简档。
■产生特殊时间(Nonce)(有力的随机数)。
■选择性地产生Cookie以便携带诸如时间戳、会话令牌之类的信息或遍及会话期间保持不变的任何其它服务器端信息。cookie值只对服务器有意义,并且被客户端认为是不透明的数据块。
■从BootstrapRequestMessage提取SessionId值。
■产生质询(Challenge):Challenge=[Nonce,Ee,Cookie,SessionId]。
■计算S(Ds,Challenge)以便利用Ds来签名所述质询。
■构造ChallengeRequestMessage并且作为响应把它发送回到客户端。
ChallengeRequestMessage(质询请求消息) 下表示出了用于ChallengeRequestMessage的说明性格式

在一个实施例中,在接收ChallengeRequestMessage之后,客户端执行以下步骤 ■验证证书链ServerCertificateChain在根证书BootRootCertificate下有效CertVerif(BootRootCertificate,ServerCertificateChain)。
■从S erverCertificateChain提取公钥Es。
■验证质询的签名V(Es,Challenge)。
■当发送了BootRequestMessage时检查SessionId匹配为所述会话选择的一个ID。
■构造ChallengeRequestMessage并且把它发送到服务器。
ChallengeResponseMessage 为了产生ChallengeResponseMessage,客户端执行以下步骤 ■使用两个以下方法之一来产生会话密钥SK ○直接使用安全随机密钥发生器 ○间接地使用Nonce和BSGK计算HSK=H(BSGK|Nonce),并且设置SK=HSK的最初N个字节 ■产生包含[Challenge,ClientInformation,SessionKey]的ChallengeRepsonse对象。这里,质询是来自先前接收的ChallengeRequestMessage的一个,ServerEncryptionKey被省略了。
■计算S(BAK,ChallengeResponse)以便利用BAK来签名响应。
■利用SK加密所签名的ChallengeReponse:E(SK,[ChallengeResponse,S(BAK,ChallengeResponse)] ■利用服务器的公钥Ee来加密SessionKey 构造ChallengeRequestMessage并且把它发送到服务器


服务器接收BootstrapChallengeResponse并且执行以下步骤 ○使用其私钥De来解密会话密钥SK:D(De,SessionKey) ○利用来自先前步骤的会话密钥SK解密ChallengeResponse:D(SK,Challenge) ○验证质询的签名V(BAK,ChallengeResponse)。
○检查会话密钥SK匹配用于解密的密钥 ○如果需要那么检查Cookie和Nonce值(例如时间戳) ○当发送了BootRequestMessage时检查SessionId匹配为所述会话选择的一个ID。
○构造BootstrapResponseMessage并且把它发送到服务器。
BootstrapResponseMessage 为了产生BootstrapResponseMessage,服务器执行以下步骤 ○解析在ChallengeResponseMessage中所接收的ClientInformation并且查找或产生客户端配置数据,其中为了此引导请求需要发送所述客户端配置数据(对于表示客户端的节点,这可以包括机密密钥(Ec/Dc))。服务器一般使用Nonce和Cookie值来帮助获取客户端的正确信息。
○利用SessionId和配置数据来创建BootstrapResponse ○计算S(Ds,BootstrapResponse)以便利用Ds来签名数据 ○利用会话密钥SK加密所签名的BootstrapResponse:E(SK,[BootstrapResponse,S(Ds,BootstrapResponse)]
1.40.信任域 在一个实施例中,每个信任域包括根证书权威机构和对该域来说唯一的名称。当客户端发送BootstrapRequest时,它标识它愿意接受的所有信任域(即,哪些证书它认为是有效的)。服务器从由客户端所发送的列表中选择信任域,如果它支持的话。
1.41.签名 在一个实施例中,每当在消息有效载荷中使用签名时,对在消息的签名部分中所包含的数据字段的规范字节序列计算签名。根据字段值而不是根据字段值的编码来计算规范的字节序列。每个简档优选定义了用于为每种消息类型计算字段的规范字节序列的算法。
1.42.简档 引导协议的简档是对各个密码和串行格式的一组选择。每个简档优选具有唯一的名称,并且包括选择 ●公钥加密算法 ●公钥签名算法 ●密秘密钥加密算法 ●秘密密钥签名算法 ●公钥编码 ●摘要算法 ●规范的对象串行化 ●证书格式 ●最小特殊时间大小 ●消息编组 附录A 下面是具有多个联锁签名的控制器对象的例子。
注意在此例子中,内容密钥未被加密。
<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引擎的系统的一个实施例中对象的XML编码。对于特定应用来说,可以通过导入下面示出的XML模式(“章鱼XML模式”)并且添加应用专用的元项(例如,用于撤销的扩展)来创建应用专用的XML模式。在一个实施例中,用XML编码对象需要能够相对于应用专用的XML模式来证实。下面可以找到对这些XML编码的附加可能的约束。
在此附录B所举例说明的例子中,用于所有DRM对象的基础XML模式类型为OctopusObjectType。这意味着所有对象支持属性和扩展。从此基础类型来导出每个章鱼对象元项的类型。这些类型可以集合诸如ContentKeyType(内容密钥类型)的SecretKey(秘密密钥)元项之类的其它元项。
在此示例性实施例中,按照扩展来描述Scuba密钥分发系统密钥于是ScubaKeys元项是扩展元项的孩子。同样适用于具有Torpedo(鱼雷)扩展的撤销密钥。
如在此的其它地方所描述,存在各种章鱼对象(例如,内容密钥、保护器、控制器、控制、节点和链路)。可以使用<Bundle>元项把这些对象连同扩展一起捆绑。在一个实施例中,如果在<Bundle>内签名对象或扩展,那么<Bundle>包含如在此的其它地方所描述的<Signature>元项。
章鱼XML模式(Octopus.xsd)








说明性的应用专用模式

B.1.附加约束 B.1.1.节点 在一个实施例中,定义以下类型的节点 ·章鱼个性节点,它们是给定DRM引擎的根节点(例如,设备节点或PC软件节点)。
·其它类型的节点,诸如用户节点或用户组的节点,诸如预订节点或成员资格节点。
在一个实施例中,节点包含密钥(例如,在诸如ScubaKeys之类的扩展中)并且必须能够分离所述节点的公共信息(例如,id、属性和公钥)及其私有扩展(例如其携带有秘密密钥和私钥)。此外,每个部分(公共和私有)存在一个签名,使得具有其签名的公共节点可以被原样导出(例如作为对许可服务的请求的参数)。
在一个实施例中,在ExternalExtension中携带私有扩展并进行签名。公共节点及其私有扩展可以被封装在相同的<bundle>元项中或者可以独立地到达。下面在附录B的附件A中给出了所签名的章鱼个性节点的例子。
B.1.1.1属性 在一个实施例中,节点对象的每个XML编码携带具有以下<Attribute>的<AttributeList> 对于章鱼个性来说 <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> 对于其它类型的节点来说 <AttributeList xmlns="http://intertrust.com/Octopus/1.0"> <Attribute name="urn:x-marlin.intertrust.com:type">...</Attribute> </AttributeList> B.1.1.2扩展 如附录B的附件A所示,在一个实施例中,章鱼个性节点携带用于ScubaKeys(共享和机密密钥)和Torpedo(广播秘密密钥)的扩展。其它类型的节点只携带Scuba共享密钥。
所有公钥被携带在<ExtensionList>的<Extension>元项中的<Node>元项内。其它密钥被携带在<Node>元项之外的独立<Extension>元项中。
在一个实施例中,在<Node>中签名<ScubaKeys>扩展。在此实施例中,在<Node>内携带<ScubaKeys>的内部<Extension>(公钥)需要包括<ds:DigestMethod>元项以及<ds:DigestValue>元项。在外部<Extension>中携带的私钥需要被签名并且这通过签名整个扩展来进行。同样,<Torpedo>扩展也被签名。
B.1.2链路 在一个实施例中,<Link>元项的<LinkTo>和<LinkFrom>元项只包含<Id>元项并且不包含<Digest>元项。<Control>元项是可选的。附录B的附件C包含所签名的链路对象的例子。
B.1.1.1属性 在一个实施例中,链路没有强制属性。这意味着<AttributeList>不被要求并且将被适应的实现方式忽略。
B.1.1.2扩展 在此附录B所示出的示例性实施例中,链路具有在<Link>内所携带的<ScubaKeys>内部扩展,从而<ExtensionList>元项是强制性的。另外,链路中的<ScubaKeys>扩展未被签名,从而在<Extension>元项内没有携带<ds:DigestMethod>和<ds:DigestValue>元项。此<ScubaKeys>扩展包含利用“来自节点”的公共或秘密Scuba共享密钥加密的“去往节点”的公共/秘密Scuba共享密钥(在<PrivateKey>和<SecretKey>元项中)的版本。使用XML加密语法来发信号表示此加密。在此附录B所图示的实施例中,<KeyData>元项、<PrivateKey>和<SecretKey>元项的孩子的“编码”属性被设置为“xmlenc”。此<KeyData>元项的孩子是<xenc:EncryptedData>元项。在<KeyInfo>/<KeyName>元项中通告加密密钥的名称。
在一个实施例中,如果加密密钥是公钥,那么 ■<KeyName>元项是密钥所属对的名称。
■如果加密数据(例如,私钥)太大而不能直接利用公钥加密,那么产生中间的128位秘密密钥。然后例如使用aes-128-cbc利用此中间密钥来加密数据,并且(使用<EncryptedKey>元项)利用公钥来加密中间密钥。
于是XML组块看起来好像

B.1.3许可对象 此附录B的附件C提供了所签名许可的例子(在已经出现第一撤销之前,下面参见内容密钥节)。
B.1.3.1保护器 在此附录B所示出的示例性实施例中,<ContentKeyReference>元项和<ContentReference>元项(例如在<ProtectedTargets>元项内)只包含<Id>元项并且不包含<Digest>元项。在此说明性实施例中,保护器对象不包含强制的属性或扩展;<AttributeList>和<ExtensionList>元项是可选的并且被忽略。
B.1.3.2内容密钥 在此附录B所示出的示例性实施例中,内容密钥对象包含非强制的属性或扩展。因此,<AttributeList>和<ExtensionList>元项是可选的并且将被忽略。
在一个实施例中,<ContentKey>元项包含<SecretKey>元项,用于表示用来解密内容的实际密钥。加密与<SecretKey>相关联的<KeyData>。在一个实施例中,<KeyData>的“编码”属性被设置为 “xmlenc”是强制性的。
在一个实施例中,内容密钥对象存在两种不同的情况(1)在设备或PC应用的首次撤销之前在这种情况下,由<SecretKey>元项所表示的内容密钥Kc只被实体的Scuba密钥(公共的或秘密的)加密,其中把内容绑定到所述实体(例如用户)。(2)在首次撤销之后,其中依照Mangrove广播加密方案来加密内容密钥。然后利用内容被绑定到的实体的Scuba密钥(公共的或秘密的)加密。在这种情况下,我们具有超级加密。
在此的其它地方描述了用于在超级加密的情况下加密<EncryptedData>元项的说明性方法。下面解释了怎样将其应用于情况b。
在一个实施例中,用于利用Mangrove广播加密方案来加密内容密钥Kc的xmlenc语法是

■(*)是用于标识Mangrove广播加密方案的URL,在一个实施例中所述Mangrove广播加密方案还是在应用专用的xml模式调用“kformat.xsd”中<Torpedo>扩展的<BroadcastKeyMethod>算法。
■(**)是Mangrove密钥树的名称。在一个实施例中,此值必须与在kformat.xsd中所定义的<BroadcastKey>元项的源属性相同。
■(***)是用于表示依照Mangrove广播密钥算法加密内容密钥Kc的ASN.1序列的base64编码值
在一个实施例中,利用许可被绑定到的实体的scuba共享密钥(公共的或秘密的)来加密上面所提及的<EncryptedData>的字节序列。如果使用公钥,如果<EncryptedData>的字节序列对于RSA1024公钥来说太大,那么与如在下面所描述应用相同的约定(例如,参见利用公钥加密)并且需要中间密钥。可以在此附录B的附件D中找到这种内容密钥对象的XML编码的例子。
B.1.3.3控制器 在一个实施例中,控制器对象包含非强制的属性或扩展。因此,<AttributeList>和<ExtensionList>元项是可选的并且将被适应的实现方式忽略。
在一个实施例中,<DigestMethod>元项的算法属性值始终为httD://www.w3.org/2000/09/xmldsig#sha 1。
在一个实施例中,<ControlReference>必须具有<Digest>元项。<DigestValue>元项必须包含引用控制的摘要的base64编码。
在一个实施例中,如果控制器上的签名是PKI签名(rsa-shal),那么(<ControlledTargets>元项内的)<ContentKeyRefence>元项需要包括<Digest>元项并且<DigestValue>元项必须包含被嵌入到内容密钥对象中的明文内容密钥的摘要。
B.1.3.4控制 在一个实施例中,控制对象包含非强制的属性或扩展。因此,<AttributeList>和<ExtensionList>元项是可选的并且将被适应的实现方式忽略。
在一个实施例中,<ControlProgram>元项的类型属性被设置为“plankton”,并且<CodeModule>元项的byteCodeType属性被设置为“Plankton-1-0”。
附录B——附件A所签名章鱼个性节点的例子




附录B——附件B所签名章鱼链路的例子



附录B——附件C所签名章鱼许可的例子(在没有撤销的情况下)



附录B——附件D在撤销情况下内容密钥的例子

15.附录C 此附录C示出了供上述引导协议使用的简单简档的例子。还提供了简单的规范串行、示例性XML编组以及用于章鱼引导SOAP网络服务的示例性WSDL。
简单简档 在一个实施例中,使用由以下内容组成的简单简档 简单的规范串行1.0 在一个实施例中,在上述简单简档中使用的简单的规范字节序列包括从消息中对象的字段值来构造字节序列。每个消息和每个对象由一个或多个字段组成。每个字段是简单字段或复合字段。
简单字段可以是以下四种类型之一整数、字符串、字节序列或字段数组。复合字段由一个或多个子字段组成,每个子字段是简单的或复合的。
在一个实施例中,用于构造每个字段类型的规范字节序列的规则如下 复合字段 规范的字节序列是每个子字段的规范字节序列的拼接(可选字段不被跳过,但是依照可选字段的规则来串行化)。
字段数组 被依照大端次序编码为4字节序列的字段计数,后面是每个字段的规范字节序列。如果字段计数为0,那么在4字节字段计数后面什么都没有(在这种情况下,所有4个字节都具有值0)。
整数 32比特带符号的值,依照大端次序被编码为4字节的序列。
字符串 字符串由UTF-8编码的8比特字节序列来表示。所编码的字节序列的字节计数被依照大端次序编码为4字节序列。字节计数后面是UTF-8编码的字符串的字节序列。
字节序列 字节计数被依照大端次序编码为4字节序列(如果字节序列为空,或者已经省略相应的字段,那么字节计数为0,并且在4字节的字节计数之后没有字节值)。每个字节被按原样编码。
简单的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...<!—终端实体证书--></Certificate> MIID...<!—中间人证书--><Certificate> MIIE...<!--中间人证书--> </Certificate> <Certificate> MIID...<!—字节链到信任锚的证书--> </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> 用于引导SOAP网络服务的WSDL <?xml version="1.0"encoding="UTF-8"?> <!--此wsdl文件描述无状态多回合的引导协议的接口 该协议这样工作 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"> <!—导入--> <irmport namespace="http://www.intertrust.com/Octopus/Bootstrap/1.0" schemaLocation="./SimpleBootProtocol.xsd"/> <!—元项--> <element name="requestdata"> <complexType><!—这是多回合无状态协议(归因于点心文件) 客户端能够发送BootstrapRequestMessage或者 ChallengeReponseMessage--><choice> <element ref="ob:BootstrapRequestMessage"/> <element ref="ob:ChallengeResponseMessage"/> </choice> </complexType> </element> <element name="responsedata"> <complexType><!--这是多回合无状态协议(归因于点心文件) 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> <!—服务声明--> <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 下面给出了用于计算对象的规范字节序列(CBS)的编码中性方式,并且在优选实施例中用于计算用来对对象进行数字签名的摘要。此字节序列与表示或发送对象的方式无关,从而使相同的摘要和签名值能够遍及系统使用,在所述系统中使用多种编码格式(例如,XML、ANS1)、编程语言等。
规范的字节序列算法 规范的字节序列算法包括根据字段值来构造字节序列。每个字段具有简单类型或复合类型的值。一些字段可以被指定为可选的(所述字段可以存在或被省略)。
在一个实施例中,简单类型是整数、字符串、字节和布尔。
复合类型由一个或多个子字段组成;每个子字段具有简单或复合类型的值。复合类型是异构的或同构的,这意味着存在一个或多个不同类型(即,异构)的一个或多个子字段值(简单或复合),或者存在全部相同类型(同构)的一个或多个子字段值(简单或复合)。
通过当字段始终存在时向字段值应用编码规则或者当所述字段被指定为可选时应用可选字段的编码规则来获得字段的规范字节序列。在下面的编码规则描述中,术语字节意指8比特值(八位字节) 1.1.可选字段 如果可选字段存在,那么其值被串行化为字节值1后面是字段值的规范字节序列。如果它被省略,那么其值被串行化为字节值0。
1.2.异构的复合 规范的字节序列是每个子字段值的规范字节序列的拼接(可选字段值不被跳过,但是依照可选字段值的规则来串行化)。
1.3.同构的复合 规范的字节序列是子字段计数,被依照大端次序编码为4字节的序列,后面是每个子字段值的规范字节序列的拼接。如果子字段计数为0,那么在4字节字段计数后面什么都没有(在这种情况下,所有4个字节都具有值0)。
1.4.整数 32比特整数的值,依照大端次序被编码为4字节的序列。
1.5.字符串 字符串由UTF-8编码的字节序列(不是空结束的)表示。字符串的规范字节序列包括(1)字符串的字节计数,被依照大端次序编码为4字节的序列,后面是(2)字符串的字节序列。
1.6.字节 8比特值 1.7.布尔 8比特值对于假来说为0,并且对于真来说为1 2.章鱼对象的应用 在一个实施例中,章鱼对象的规范字节序列是其每个字段的规范字节序列依照它们在对象模型中所定义的次序的拼接。
对于异构的复合类型来说,字段的次序是在类型定义中所指定的次序。对于同构的复合类型来说,在下面段中指定了元项的次序。
○属性 对象的“属性”字段被当做类型“列表”的未命名属性(它是命名属性的未分类容器)。在类型“列表”的属性值中所包含的命名属性按照它们的“名称”字段来依照词典方式分类。在类型“数组”的值属性中所包含的未命名属性未被分类(它们依照它们的数组次序来串行化)。
○扩展 对象的内部扩展按照它们的‘id’字段依照词典方式分类。在一个实施例中,对于内部扩展来说,在计算规范的字节序列中不使用‘extensionData’字段。对于这种扩展来说,如果为了签名目的需要把它们包括在摘要计算中,那么它们包含用于表示在‘extensionData’中携带的实际数据摘要的‘摘要’字段。对于每种类型的扩展数据来说,给出用于允许计算其规范字节序列的定义。
○控制器 内容密钥引用按照它们的‘id’字段依照词典方式分类。
3.ScubaKeys ‘publicKeys’、‘privateKeys’和‘secretKeys’字段中的密钥按照它们的‘id’字段依照词典方式分类。
4.例子
类B的实例的规范字节序列,其中a[]={7,8,9},s=“Abc”,x={5,4},s2=””,并且optional_x不存在被串行化为 其中Cano(X)为 17.附录E 下面提供了控制程序的例子。在此例子中,许可表明如果可以在状态数据库(在此示例性实施例中被称为“Seashell”数据库)中找到成员资格状态(在注册期间准备)或许可状态(在许可转送期间准备),那么可以准许播放动作。所述许可还允许对等体请求许可转送。如果两个对等体处于给定的邻近度内,那么准许此转送。许可包含用于在对等体上设置许可状态的代理。
在下面的代码文件中,“MovableDomainBoundLicense.asm”是主控制,“LicenseUtils/*”是所述许可的帮助程序,“GenericUtils/*”是用于执行诸如计算字符串长度、比较字符串、操纵堆栈等功能的通用帮助程序,并且“ExtendedStatusBlockParameters/*”包含扩充状态块参数的XML描述和相应的表示作为根据XML所编译的字节系列。
E.1MovableDomainBound.asm ;********************************************************** ; 文件名称MovableDomainBoundLicense.asm ; 描述可移动许可的例子 ;**********************************************************; ;========================= ;常数 ;========================= .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" ;========================= ;数据 ;========================= .data GetTrustedTimeFunctionName .string"System.Host.GetTrustedTime" GetTrustedTimeFunctionNumber .long 0 ActionGrantedNoObligationXStatus.long0x00000000;全局标志.long0x00000000;类别=ACTION_GRANTED.long0x00000000;子类别.long0x00000000;局部标志.long0x00000000;高速缓存持续时间类型.long0x00000000;高速缓存持续时间值.long0x00000000;值列表大小=0 ActionDeniedXStatus:.long0x00000000;全局标志.long0x00000001;类别=ACTION_DENIED.long0x00000000;子类别.long0x00000000;局部标志 .long0x00000000;高速缓存持续时间类型 .long0x00000000;高速缓存持续时间值 .long0x00000000;值列表大小=0 TransferGrantedProximityNotChecked: .long0x00000000;全局标志 .long0x00000000;类别=ACTION_GRANTED .long0x00000000;子类别 .long0x00000003;局部标志义务和回调通知 .long0x00000000;高速缓存持续时间类型 .long0x00000000;高速缓存持续时间值 .include"TransferXStatusProximityCheckFailed.asm" TransferGrantedProximityChecked: .long0x00000000;全局标志 .long0x00000000;类别=ACTION_GRANTED .long0x00000000;子类别 .long0x00000003;局部标志义务和回调通知 .long0x00000000;高速缓存持续时间类型 .long0x00000000;高速缓存持续时间值 .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 ;调试 .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 ;调试 PUSH@Controller.Timestamp.Query.Debug PUSH DEBUG_PRINT_SYSCALL CALL .endif ;获取控制器对象中的时间戳属性 PUSH4 ;返回缓冲器大小(4字节)PUSH @ControllerTimestampAttributeValue ;返回缓冲器(类型是长整型) 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: ;查询状态路径 JSR MembershipStatePath.Query BRN Action_Denied JSR LicenseStatePath.Query BRN Action_Denied .ifdef DEBUG;调试PUSH@Control.Actions.Play.Perform.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif ;如果成员资格状态的时间戳为> ;控制器的时间戳 JSR MembershipStateValue.Query BRN Action_Denied JSR Controller.Timestamp.Query BRN Action_Denied PUSH@MembershipStateValue PEEK PUSH@ControllerTimestampAttributeValue PEEK SUB BRPAction_Granted;在这种情况下;我们不必检查许可状态 ;我们只是检查状态存在 JSR LicenseStateValue.Query BRNAction_Denied Action_Granted: .ifdef DEBUG;调试PUSH@Action_Granted.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif PUSH@ActionGrantedNoObligationXStatus PUSH SUCCESS STOP Action_Denied: .ifdef DEBUG;调试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: ;查询状态路径 JSR MembershipStatePath.Query BRN Action_Denied JSR LicenseStatePath.Query BRN Action_Denied .ifdef DEBUG;调试PUSH@Control.Actions.Transfer.Perform.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif ;获取已经检查邻近度的最近时间 PUSH 4;返回缓冲器大小 PUSH@SinkProximityLastProbeResult ;返回缓冲器 PUSH@SinkProximityLastProbePath ;名称 PUSH 0;亲代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;如果对象是不可见的,那么尚未检查邻近度。
;所产生的代理(检查行23上的TransferXStatusProximityCheckFailed.xml文件)。然后代理在设置状态之前确信所述代理是域的一部分。
BRN Transfer_OK_Proximity_Not_Checked ;检查在最近10分钟已经检查邻近度 DROP;我们知道类型id为长整型 DROP;我们知道大小为4 PUSH@GetTrustedTimeFunctionNumber PEEK CALL SWAP DROP;我们只需要该值 PUSH@SinkProximityLastProbeResult PEEK SUB PUSH 10SWAPSUB;检查邻近度的上次时间是大于10’以前同样;就好像根本尚未检查邻近度一样(参见上面)BRN Transfer_OK_Proximity_Not_Checked;已经成功地检查邻近度 .ifdef DEBUG;调试PUSH@Transfer_OK_Proximity_Checked.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif PUSH@TransferGrantedProximityChecked PUSH SUCCESS STOP Transfer_OK_Proximity_Not_Checked: .ifdef DEBUG ;调试 PUSH@Transfer_OK_Proximity_Not_Checked.Debug PUSH DEBUG_PRINT_SYSCALL CALL .endif ;返回RunAgentOnPeer义务(用于表明尚未检查邻近度)和OnAgentCompletion回调 PUSH@TransferGrantedProximityNotChecked PUSH SUCCESS STOP ; ;Control.Agents.SetStateContent0023.Run ; Control.Agents.SetStateContent0023.Run: ;查询状态路径 JSR MembershipStatePath.Query BRN Agent_Run_Failed JSR LicenseStatePath.Query BRN Agent_Run_Failed .ifdef DEBUG;调试PUSH@Control.Agents.SetStateContent0023.Run.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif ;如果对等体处于域中,那么我们不必作任何事情 JSR Membership.Check BRZ Agent_Success ;检查环境被设置 PUSH 32;返回缓冲器大小 PUSH@AgentContextValue ;返回缓冲器 PUSH@AgentContextPath ;名称 PUSH 0;亲代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;检查结果 BRN Agent_Run_Failed DROP;我们知道类型id为字符串 DROP;我们不关心大小 PUSH@AgentContextValue PUSH@AgentContextDesiredValue JSR streq;确信我们处于良好的环境中 BRNAgent_Run_Failed ;检查源是否已经成功地邻近度检查了信宿 PUSH 4 ;返回缓冲器大小 PUSH@AgentProximityCheckedValue ;返回缓冲器 PUSH@AgentProximityCheckedPath ;名称 PUSH 0;亲代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL ;检查结果 BRNAgent_Run_Failed;此当接收代理时此参数应当始终被应用设置 DROP;我们知道类型id为长 DROP;我们知道大小为4 PUSH@AgentProximityCheckedValue PEEK NOT BRZ Agent_Set_State Agent_Run_Failed: .ifdef DEBUG;调试PUSH@Agent_Failure.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endifPUSH 0;返回块大小PUSH 0;返回块地址 PUSH FAILURE;结果代码 STOP Agent_Set_State: ;设置状态 JSR LicenseState.Set BRNAgent_Run_Failed Agent_Success: .ifdef DEBUG;调试PUSH@Agent_Success.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif;成功PUSH 0;返回块大小PUSH 0;返回块地址PUSH SUCCESS;结果代码STOP ; ;(类型RESET的)Control.Agents.SetStateContent0023.OnAgentCompletion回调 ; Control.Agents.SetStateContent0023.OnAgentCompletion: .ifdef DEBUG;调试PUSH@Control.Agents.SetStateContent0023.OnAgentCompletion.DebugPUSH DEBUG_PRINT_SYSCALLCALL .endif ;检查代理结果代码为OK ;堆栈为 ;...AgentResultCode CompletionStatusCode ArgumentsBlockSize Cookie DROP ;我们不需要cookie DROP;我们不需要自变量块大小 BRNAction_Denied;如果代理不能运行,那么失败 BRN Action_Denied;如果代理不能在对等体上设置状态那么同样失败 ;成功 PUSH@ActionGrantedNoObligationXStatus PUSH SUCCESS STOP Agent_Completion_Failed: PUSH FAILURE STOP ;========================= ;导出 ;========================= .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 ;描述许可状态的实用程序 ;**********************************************************; ;========================= ;数据 ;========================= .data LicenseStatePathControlAttribute: .string"Octopus/Control/Attributes/LicenseStatePath" LicenseStatePath: .zeros 256 LicenseStateValue: .long 0 ;调试 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: ;调试 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: ;调试 PUSH@LicenseStateValue.Query.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH 4;返回缓冲器大小(4字节) PUSH@LicenseStateValue;返回缓冲器(类型为长整型) PUSH@LicenseStatePath;名称 PUSH 0;亲代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALL CALL RET ; ;LicenseState.Erase ; LicenseState.Erase: ;调试 PUSH@LicenseState.Erase.Debug PUSH DEBUG_PRINT_SYSCALL CALL ;擦除局部状态 PUSH 0;对象大小(容器) PUSH 0;对象类型(容器) PUSH 0;删除容器PUSH@LicenseStatePath;名称 PUSH 0;亲代=根容器PUSH SYSTEM_HOST_SET_OBJECT_SYSCALL CALL RET ; ;LicenseState.Set ; LicenseState.Set: ;调试 PUSH@LicenseState.Set.Debug PUSH DEBUG_PRINT_SYSCALL CALL ;设置状态 PUSH 0;对象大小(容器) PUSH 0;对象类型(容器) PUSH CONTAINER_IGNORED_ADDRESS PUSH@LicenseStatePath;名称 PUSH 0;亲代=根容器 PUSH SYSTEM_HOST_SET_OBJECT_SYSCALL CALL RET E.2.2 MembershipUtils.asm ;********************************************************** ;文件名称MembershipUtils.asm ;描述用于广播成员资格的实用程序 ; ;**********************************************************; ;========================= ;数据 ;========================= .data MembershipStatePathControlAttribute .string"Octopus/Control/Attributes/MembershipStatePath" MembershipStatePath .zeros256 MembershipStateValue: .long0 ;调试 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 ;调试 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: ;调试 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字节) PUSH@MembershipStateValue ;返回缓冲器(类型是长整型) PUSH@MembershipStatePath ;名称 PUSH 0;亲代=根容器 PUSH SYSTEM_HOST_GET_OBJECT_SYSCALLCALL PUSH@MembershipGetObjOutput.Debug PUSH DEBUG_PRINT_SYSCALL CALL ;打印结果-首先把整型转换成字符串 DUP PUSH@intStrOutput ADD SWAP JSR printInt ;调用打印结果 PUSH@intStrOutput PUSH DEBUG_PRINT_SYSCALL CALL PUSH@NewlineString PUSH DEBUG_PRINT_SYSCALL CALL RET ; ;Membership.Check ; Membership.Check: ;调试 PUSH@Membership.Check.Debug PUSH DEBUG_PRINT_SYSCALL CALL ;查询成员资格路径 JSR MembershipStateValue.Query ;看看我们是否成功 BRN Membership_Check_Failed ;检查时间<在成员资格状态中所获取的时间 PUSH@MembershipStateValue;时间戳 PEEK PUSH@GetTrustedTimeFunctionNumber PEEK CALL SWAP DROP;我们只需要该值(而不是评估值) SUB BRN Membership_Expired ;成功 ;调试 PUSH@Membership_Check_Success.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH SUCCESS RET Membership_Expired: ;调试 PUSH@Membership_Expired.Debug PUSH DEBUG_PRINT_SYSCALL CALL BRA Membership_Check_Failed Membership_Check_Failed: ;调试 PUSH@Membership_Check_Failure.Debug PUSH DEBUG_PRINT_SYSCALL CALL PUSH FAILURE RET E.3 GlobalUtils E.3.1 IntUtils.asm ;********************************************************** ;文件名称IntUtils.asm ;描述用于比较2个整数的实用程序 ;********************************************************** ;========================= ;包括 ;========================= .include"StackUtils.asm" ;========================= ;代码 ;========================= .code ; ;min ; ;在2个整数之间计算最小值 ; ;输入...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个整数之间计算最大值 ; ;输入...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 ;描述把整数(有符号或无符号)转换为字符串 ;********************************************************** ;;注意要求已经包括“StackUtils.asm” ;数据段 .data ;代码段 .code ;把整数转换为字符串表示 ;参数dest,int printInt: ;复制dest参数 SWAP DUP PUSH 2 JSR pick ;STACK:origval,startstring,startstring,unsignedval ;现在我们最后以整数的额外拷贝结束 ;我们使用这来稍后测试原始的签名 printIntLoop: ;获取单个数字 DUP PUSH 10 MOD ;转换成ascii PUSH 48;′0′的ASCII ADD ;获取输出缓冲器的地址 PUSH 2 JSR pick POKEB;打印到缓冲器 ;向前移动我们的缓冲器指针 SWAP PUSH 1 ADD SWAP ;除以10并且看看我们在哪 PUSH 10 DIV DUP BRP printIntLoop DROP;去除顶部的0 ;STACK=orignum,startofstring,endofstring ;如果原始数字为负,那么加入负号 ;以空终止 DUP PUSH 0 SWAP POKEB ;把字符串末尾向上移动1,因此不翻转终结符 PUSH 1 SUB ;我们完成只需要反向字符串 fliploop: ;获取第二字节 DUP PEEKB ;获取第一字节 PUSH 2 JSR pick PEEKB ;把第一字节放到最后地方 PUSH 2 JSR pick POKEB ;把最后字节放到第一地方 PUSH 2 JSR pick POKEB ;把末尾指针向上移动一 PUSH 1 SUB ;把开始指针向下移动一 SWAP PUSH 1 ADD SWAP ;看看是否已经满足指针 ;首先必须复制值 DUP PUSH 2 JSRpick SUB BRPfliploop ;除去堆栈上的一些残余 DROP DROP DROP RET E.3.3 StackUtils.asm ;********************************************************** ;文件名称StackUtils.asm ;描述根据FORTH产生的堆栈实用程序函数 ; ;********************************************************** .ifndef_STACK_UTILS_ .define_STACK_UTILS_ ;========================= ;代码 ;========================= .code ; ;结束 ; ;拷贝堆栈上的第二项 ; ;输入...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的标准库 .equHEAP_ADDR,16 ;数据段 ;代码段 .code strlen: DUP loop: DUP PEEKB BRZ done PUSH 1 ADD BRAloop done: SWAP SUB RET .exportstrlen E.3.5 StrCmp.asm ;********************************************************** ;文件名称StrCmp.asm ;描述用于两个字符串等同的streq测试 ;********************************************************** .ifndef_STR_CMP_ .define_STR_CMP_ ;========================= ;包括 ;========================= .include"StackUtils.asm" ;========================= ;代码 ;========================= .code ; ;streq ; ;用于两个字符串等同性的测试 ; ;输入...@str1@str2 ;输出...res(如果字符串相同,那么res=0,否则为-1) ; streq: ;获取两个字符串之间的偏移 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 ;现在比较两个字符 JSR over SUB;...偏移@str1 char1 char1-char2 ;如果char1!=char2,则失败 NOT BRZstreqfailure ;如果char1为0(char1==char2==0),那么已经结束了 BRZ streqsuccess ;...偏移@str1 ;增加@str1指针并且循环 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> -<!--实例ID--><ValueBlock type="Integer">240343</ValueBlock> -<!--上下文ID--> <ValueBlocktype="String">MoveStateContent0023</ValueBlock> -<!--附加参数-->

<ValueBlock type="ValueList">

<ValueListBlock>

<ValueBlocktype="Parameter"> -<!--随着TransferXStatusProximityCheckFailed.xml变化的仅有的事务 -->

<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>-<!--代理实例ID--> <ValueBlock type="String">240343</ValueBlock>-<!—回调例程-->

<ValueBlock type="ValueList">

<ValueListBlock> -<!--复位--> <ValueBlock type="Integer">0</ValueBlock>-<!--名称--> <ValueBlock type="String">Control.Agents.SetStateContent0023.OnAgentCompletion</ValueBlock> -<!--点心文件--><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> -<!--实例ID--> <ValueBlock type="Integer">240343</ValueBlock> -<!--上下文ID--> <ValueBlock type="String">MoveStateContent0023</ValueBlock> -<!--附加参数--> -<ValueBlock type="ValueList"> -<ValueListBlock>-<ValueBlock type="Parameter"> -<!—随TransferXStatusProximityCheckSucceed.xml改变的仅有的事务-->-<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>-<!--代理实例ID--><ValueBlock type="String">240343</ValueBlock> -<!—回调例程--> -<ValueBlock type="ValueList"> -<ValueListBlock>-<!--复位--><ValueBlock type="Integer">0</ValueBlock>-<!--名称--> <ValueBlock type="String">Control.Agents.SetStateContent0023.OnAgentCompletion</ValueBlock>-<!--点心文件--> <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 尽管为了理解清楚已经相当详细地描述了上述发明,然而在所附权利要求的范围内显然可以进行某些改变和修改。应当注意,存在用于实现这里所描述过程和设备的许多候选方式。据此,本实施例被认为是说明性的而不是限制性的,并且所发明的工作主体不限于这里所给出的细节,而是可以在所附权利要求的范围和等效方式内进行修改。
权利要求
1.一种用于授权对在主机计算机系统上的电子内容进行访问的方法,所述方法包括
从所述主机计算机系统的用户接收访问所述电子内容的请求;
获取与所述电子内容相关联的许可,所述许可包括控制对象、控制器对象、保护器对象和内容密钥对象;
从所述控制对象获取第一控制程序;并且
使用在所述主机计算机系统上运行的数字权利管理引擎来执行所述第一控制程序以确定所述请求是否可以被准许,其中执行所述控制程序包括评估一个或多个链路对象,其中每个链路对象表示两个实体之间的关系,其中所述一个或多个链路对象中的至少一个包括第二控制程序,并且其中评估所述一个或多个链路对象包括
使用所述数字权利管理引擎来执行所述第二控制程序以确定所述链路是否有效,所述执行包括确定是否满足由所述控制程序所表达的一个或多个条件。
2.如权利要求1所述的方法,其中所述控制器对象可操作来把所述控制对象与所述内容密钥对象安全地绑定。
3.如权利要求1所述的方法,其中所述保护器对象可操作来把所述内容密钥对象与所述电子内容安全地绑定。
4.如权利要求1所述的方法,其中所述一个或多个条件中的至少一个包括当前时间应该在预定义时间之前的要求。
5.如权利要求1所述的方法,其中所述一个或多个条件中的至少一个包括当前时间应该在一定的时间之后的要求。
6.如权利要求1所述的方法,其中所述一个或多个条件中的至少一个包括所述第二控制程序事先不应该执行超过预定义数目的次数的要求。
7.如权利要求1所述的方法,其中所述一个或多个条件中的至少一个包括在存储器中所存储的计数器不应超过预定义值的要求。
8.如权利要求1所述的方法,其中所述一个或多个条件中的至少一个包括事先不应发生预定义事件的要求。
9.如权利要求1所述的方法,其中所述一个或多个条件中的至少一个包括所述主机计算机系统必须具有一个或多个预定义特征的要求。
10.如权利要求1所述的方法,其中所述一个或多个条件中的至少一个包括在所述主机计算机系统上运行的再现所述电子内容的软件应该不能向预定义接口输出所述电子内容的要求。
11.一种用于授权对电子内容执行给定动作的方法,所述方法包括
使用在第一数字权利管理引擎上运行的虚拟机来执行第一控制程序,所述第一控制程序可操作来确定是否能够对所述电子内容执行给定动作,其中所述第一控制程序可操作来评估要使对给定动作的执行被授权而必须满足的第一组一个或多个条件,并且其中所述第一组一个或多个条件中的至少一个包括一个或多个链路对象应可以用于数字权利管理引擎的要求,所述链路对象在逻辑上把表示第一实体的第一节点链接到表示第二实体的第二节点;
获取所述一个或多个链路对象,每个所述链路对象表示两个实体之间的关系,并且所述链路对象中的至少一个包括第二控制程序,其中所述第二控制程序可操作来评估要使至少一个链路对象被认为有效而必须满足的第二组一个或多个条件;并且
使用所述数字权利管理引擎来执行所述第二控制程序。
12.如权利要求11所述的方法,其中所述第一组一个或多个条件包括基于时间的条件。
13.如权利要求11所述的方法,其中所述第二组一个或多个条件包括基于时间的条件。
14.如权利要求11所述的方法,其中所述第一组条件或第二组条件中的至少一个包括在存储器中所存储的计数器不应超过预定义值的要求。
15.一种用于管理对电子内容的访问或使用的方法,所述方法包括
获取与所述电子内容相关联的控制程序,所述控制程序包括指令,所述指令当由数字权利管理引擎执行时可操作来评估第一条件并且当确定已经满足所述第一条件时允许对所述电子内容的第一使用;
在所述数字权利管理引擎的控制下把状态信息存储到数据库中,所述状态信息与所述电子内容的第一使用相关;
第二次执行所述控制程序以确定是否授权对所述电子内容的第二使用,评估所述第一条件和第二条件,所述第二条件的评估至少部分地依赖于所述状态信息;
当确定已经满足所述第二条件时,更新所述状态信息并且把所更新的状态信息存储在所述数据库中。
16.如权利要求15所述的方法,其中在数据库中所存储的状态信息包括对已经访问过所述电子内容的次数的计数。
17.如权利要求15所述的方法,其中在数据库中所存储的状态信息包括使用所述电子内容的持续时间的量度。
18.如权利要求15所述的方法,其中从链路对象获得所述控制程序,所述链路对象形成从第一节点到第二节点的授权图的一部分。
19.如权利要求18所述的方法,其中所述第一条件包括所述链路对象应该有效的要求。
20.如权利要求18所述的方法,其中所述第一节点表示计算设备并且所述第二节点表示所述计算设备的用户。
21.如权利要求18所述的方法,其中所述第一节点表示计算设备并且所述第二节点表示预订服务。
22.如权利要求18所述的方法,其中所述第一节点表示计算设备并且所述第二节点表示家庭网络域。
23.一种用于管理对电子内容的访问或使用的系统,所述系统包括
用于获取与所述电子内容相关联的控制程序的装置,所述控制程序包括指令,所述指令当由数字权利管理引擎执行时可操作来评估第一条件并且当确定已经满足所述第一条件时允许对所述电子内容的第一使用;
用于在所述数字权利管理引擎的控制下把状态信息存储到数据库中的装置,所述状态信息与所述电子内容的第一使用相关;
用于第二次执行所述控制程序以确定是否授权对所述电子内容的第二使用,评估所述第一条件和第二条件的装置,所述第二条件的评估至少部分地依赖于所述状态信息;和
用于当确定已经满足所述第二条件时更新所述状态信息并且把所更新的状态信息存储在所述数据库中的装置。
24.如权利要求23所述的系统,其中在数据库中所存储的状态信息包括对已经访问过所述电子内容的次数的计数。
25.如权利要求23所述的系统,其中在数据库中所存储的状态信息包括使用所述电子内容的持续时间的量度。
26.如权利要求25所述的系统,其中从链路对象获得所述控制程序,所述链路对象形成从第一节点到第二节点的授权图的一部分。
27.如权利要求26所述的系统,其中所述第一条件包括所述链路对象应该有效的要求。
28.如权利要求26所述的系统,其中所述第一节点表示计算设备并且所述第二节点表示所述计算设备的用户。
29.如权利要求26所述的系统,其中所述第一节点表示计算设备并且所述第二节点表示预订服务。
30.如权利要求26所述的系统,其中所述第一节点表示计算设备并且所述第二节点表示家庭网络域。
31.一种用于保护数字权利管理许可的方法,所述数字权利管理许可包括(a)第一对象,所述第一对象包括控制程序,所述控制程序包括一个或多个指令,所述一个或多个指令可操作来测试与对电子内容的指定使用相关联的一个或多个条件;(b)第二对象,包括第一密码密钥,所述第一密码密钥被至少部分地加密,所述第一密码密钥可操作来解密所述电子内容;(c)第三对象,包括对所述第一对象的引用和对所述第二对象的引用;和(d)第四对象,包括对所述第二对象的引用和对所述电子内容的引用,所述方法包括
使用所述第一密码密钥来数字地签名所述第三对象。
32.如权利要求31所述的方法,进一步包括
计算所述第一对象的消息认证代码,所述消息认证代码利用所述第一密码密钥。
33.如权利要求32所述的方法,进一步包括
计算所述消息认证代码的公钥签名。
34.如权利要求33所述的方法,进一步包括
在所述第二对象中包括所述消息认证代码和公钥签名。
35.如权利要求31所述的方法,其中所述第一对象包括控制对象。
36.如权利要求31所述的方法,其中所述第二对象包括内容密钥对象。
37.如权利要求31所述的方法,其中所述第三对象包括控制器对象。
38.如权利要求31所述的方法,其中所述第四对象包括保护器对象。
39.一种用于验证数字权利管理许可的完整性的方法,所述数字权利管理许可包括(a)第一对象,所述第一对象包括控制程序,所述控制程序包括一个或多个指令,所述一个或多个指令可操作来测试与对电子内容的指定使用相关联的一个或多个条件;(b)第二对象,包括第一密码密钥,所述第一密码密钥被至少部分地加密,所述第一密码密钥可操作来解密所述电子内容;(c)第三对象,包括对所述第一对象的引用和对所述第二对象的引用;和(d)第四对象,包括对所述第二对象的引用和对所述电子内容的引用,所述方法包括
使用所述第一密码密钥来验证所述第三对象的数字签名。
40.如权利要求39所述的方法,进一步包括
使用所述第一密码密钥来计算消息认证代码并且把所述消息认证代码与在所述第三对象中所包含的值相比较。
41.如权利要求40所述的方法,进一步包括
使用公钥/私钥对中的私钥来验证所述消息认证代码的签名。
42.如权利要求39所述的方法,其中所述第一对象包括控制对象。
43.如权利要求39所述的方法,其中所述第二对象包括内容密钥对象。
44.如权利要求39所述的方法,其中所述第三对象包括控制器对象。
45.如权利要求39所述的方法,其中所述第四对象包括保护器对象。
46.一种用于验证数字权利管理许可的完整性的系统,所述数字权利管理许可包括(a)第一对象,所述第一对象包括控制程序,所述控制程序包括一个或多个指令,所述一个或多个指令可操作来测试与对电子内容的指定使用相关联的一个或多个条件;(b)第二对象,包括第一密码密钥,所述第一密码密钥被至少部分地加密,所述第一密码密钥可操作来解密所述电子内容;(c)第三对象,包括对所述第一对象的引用和对所述第二对象的引用;和(d)第四对象,包括对所述第二对象的引用和对所述电子内容的引用,所述系统包括
用于使用所述第一密码密钥来验证所述第三对象的数字签名的装置。
47.一种用于确定第一实体是否处在第二实体的预定义邻近度之内的方法,所述方法包括
在所述第一实体产生一组随机数对;
从所述第一实体向所述第二实体发送加密的信息,所述第二实体能够从所述加密的信息导出该组随机数对
在所述第二实体解密所述加密的信息;
在所述第二实体导出该组随机数对;
从所述第二实体向所述第一实体发送确认;
在所述第一实体测量第一时间值;
从所述第一实体向所述第二实体发送该组随机数对的第一数;
在所述第二实体验证所述第一数来自该组随机数对;
从所述第二实体向所述第一实体发送该组随机数对的相应随机数;并且
在所述第一实体接收所述相应随机数;并且
在所述第一实体测量第二时间值。
48.如权利要求47所述的方法,进一步包括
计算在所述第一时间值和所述第二时间值之间的差异,并且
把所述差异与阈值相比较。
49.如权利要求48所述的方法,进一步包括
如果所述差异大于所述阈值,那么拒绝所述第二实体访问计算资源。
50.如权利要求48所述的方法,进一步包括
如果所述差异小于所述阈值,那么准许所述第二实体访问计算资源。
51.一种用于确定第一实体与第二实体的邻近度的方法,所述方法包括
从所述第一实体向所述第二实体发送第一秘密;
从所述第二实体接收确认;
在所述第一实体测量第一时间值;
从所述第一实体向所述第二实体发送所述第一秘密的一部分;
从所述第二实体接收所述第一秘密的相应部分;
在所述第一实体测量第二时间值;并且
计算在所述第一时间值和第二时间值之间的差异。
52.如权利要求51所述的方法,进一步包括
把所述差异与阈值相比较。
53.如权利要求52所述的方法,进一步包括
如果所述差异大于所述阈值,那么拒绝所述第二实体访问计算资源。
54.如权利要求52所述的方法,进一步包括
如果所述差异小于所述阈值,那么准许所述第二实体访问计算资源。
55.一种用于在包括具有虚拟机的数字权利管理引擎的数字权利管理系统中授权对电子内容的访问或其它使用的方法
接收访问或其它方式使用所述电子内容的请求;
识别与所述电子内容相关联的许可,所述许可包括控制程序和内容密钥;
使用所述虚拟机来执行所述控制程序;
获得来自所述虚拟机的输出,所述输出表明只要满足义务,对所述电子内容所请求的访问或其它使用就被授权;
确定主机应用能够满足所述义务;并且
在履行所述义务时,允许对所述电子内容所请求的访问或其它使用进行,包括使用内容密钥来解密所述电子内容。
56.如权利要求55所述的方法,其中所述义务包括以降低的质量格式来再现所述电子内容。
57.如权利要求55所述的方法,其中所述义务包括记录关于对所述电子内容的访问或其它使用的审计信息,并且向远程站点报告所述审计信息。
58.如权利要求55所述的方法,其中所述义务包括应该禁止所述数字权利管理系统运行在的主机环境的指定功能的要求。
59.如权利要求58所述的方法,其中所述电子内容包括广告,并且其中所述指定功能包括在再现所述电子内容期间快进或回退的能力。
60.如权利要求58所述的方法,其中所述指定功能包括向一定的技术输出所述电子内容的能力。
61.一种用于在包括具有虚拟机的数字权利管理引擎的主机系统中授权对电子内容的访问或其它使用的方法
接收访问或其它方式使用所述电子内容的请求;
识别与所述电子内容相关联的许可,所述许可包括控制程序和内容密钥;
使用所述虚拟机来执行所述控制程序;
只要满足义务,就确定对所述电子内容所请求的访问或其它使用能够被授权;
确定所述主机系统不能满足所述义务;并且
拒绝对所述电子内容所请求的访问或其它使用进行。
62.一种用于管理对电子内容的访问或使用的方法,所述方法包括
获取与所述电子内容相关联的控制程序,所述控制程序包括指令,所述指令当由数字权利管理引擎执行时可操作来评估第一条件并且当确定已经满足所述第一条件时允许对所述电子内容的第一使用;
从远程系统接收代理程序,所述代理程序包括指令,所述指令当由数字权利管理引擎执行时可操作来把状态信息存储在由所述数字权利管理引擎所管理的数据库中;并且
执行所述控制程序,包括确定是否已经满足第一条件,所述确定至少部分地基于所述状态信息。
63.如权利要求62所述的方法,其中在数据库中所存储的状态信息包括可以对所述电子内容进行第一使用的次数计数的初始值。
64.如权利要求62所述的方法,进一步包括
允许对所述电子内容的第一使用;并且
减少所述计数的当前值。
65.如权利要求62所述的方法,其中从链路对象获得所述控制程序,所述链路对象形成从第一节点到第二节点的授权图的一部分。
66.如权利要求65所述的方法,其中所述第一条件包括所述链路对象应该有效的要求。
67.如权利要求65所述的方法,其中所述第一节点表示计算设备并且所述第二节点表示所述计算设备的用户。
68.如权利要求65所述的方法,其中所述第一节点表示计算设备并且所述第二节点表示预订服务。
69.如权利要求68所述的方法,其中从所述预订服务的操作者接收所述代理程序。
70.如权利要求65所述的方法,其中所述第一节点表示计算设备并且所述第二节点表示家庭网络域。
71.一种用于管理对电子内容的访问或使用的系统,所述系统包括
用于获取与所述电子内容相关联的控制程序的装置,所述控制程序包括指令,所述指令当由数字权利管理引擎执行时可操作来评估第一条件并且当确定已经满足所述第一条件时允许对所述电子内容段的第一使用;
用于从远程系统接收代理程序的装置,所述代理程序包括指令,所述指令当由数字权利管理引擎执行时可操作来把状态信息存储在由所述数字权利管理引擎所管理的数据库中;和
用于执行所述控制程序的装置,包括确定是否已经满足第一条件,所述确定至少部分地基于所述状态信息。
72.如权利要求71所述的系统,其中在数据库中所存储的状态信息包括可以对所述电子内容进行第一使用的次数计数的初始值。
73.如权利要求71所述的系统,进一步包括
用于允许对所述电子内容段进行第一使用的装置;和
用于减少所述计数的当前值的装置。
74.如权利要求71所述的系统,其中从链路对象获得所述控制程序,所述链路对象形成从第一节点到第二节点的授权图的一部分。
75.如权利要求74所述的系统,其中所述第一条件包括所述链路对象应该有效的要求。
76.如权利要求74所述的系统,其中所述第一节点表示计算设备并且所述第二节点表示所述计算设备的用户。
77.如权利要求74所述的系统,其中所述第一节点表示计算设备并且所述第二节点表示预订服务。
78.如权利要求77所述的系统,其中从所述预订服务的操作者接收所述代理程序。
79.如权利要求74所述的系统,其中所述第一节点表示计算设备并且所述第二节点表示家庭网络域。
80.一种用于管理企业文档的方法,所述方法包括
使用第一软件应用来创作电子文档;
使用数字权利管理插件来加密所述文档并且把许可与之相关联,所述许可包括控制程序,为了获得对所述文档的访问权,所述控制程序需要占有一组一个或多个链路对象,所述链路对象在逻辑上把与第一设备相关联的节点连接到与第一用户组相关联的节点,所述许可进一步包括可操作来解密所述文档的第一密钥的加密版本;
向远程计算机系统发送所述文档;
确定所述远程计算机系统占有一组一个或多个链路对象,所述链路对象在逻辑上把所述远程计算机系统连接到与所述用户组相关联的节点,其中所述一个或多个链路之一包括可操作来解密所述第一密钥的第二密钥的加密版本;
当完成确定步骤时,使用与所述远程计算机系统相关联的密钥来解密所述第二密钥;
使用所述第二密钥来解密所述第一密钥;并且
使用所述第一密钥来解密所述文档。
81.如权利要求80所述的方法,其中使用数字权利管理插件的步骤进一步包括
从一组一个或多个模板中选择第一模板,所述一个或多个模板表达能够强加于对电子文档的访问的策略条件;其中所述数字权利管理插件可操作来把由所述模板所表达的策略条件转换为可由数字权利管理插件执行的控制程序。
82.如权利要求81所述的方法,其中所述数字权利管理插件进一步可操作来创建把所述控制程序与所述第一密钥安全地绑定的控制器对象。
83.如权利要求82所述的方法,其中所述控制器对象包括内容密钥对象的散列和控制对象的散列,其中所述内容密钥对象包括所述第一密钥的加密版本,并且所述控制对象包括所述控制程序。
84.如权利要求83所述的方法,其中使用所述第一密钥利用HMAC来签名所述控制器对象。
85.如权利要求84所述的方法,其中利用电子文档的作者的公钥签名来签名所述控制器对象。
86.如权利要求85所述的方法,其中使用所述第一密钥利用HMAC来签名所述公钥签名。
全文摘要
描述了用于执行数字权利管理的系统和方法。在一个实施例中,提供了一种数字权利管理引擎,用于评估与受保护的内容相关联的许可以确定对所述内容所请求的访问或其它使用是否被授权。在一些实施例中,许可包含可由数字权利管理引擎执行的控制程序。
文档编号G06F21/00GK101490686SQ200680047769
公开日2009年7月22日 申请日期2006年10月18日 优先权日2005年10月18日
发明者G·博康-吉博, J·G·博夫, M·G·梅嫩特, W·B·布拉德利 申请人:英特托拉斯技术公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1