本申请是基于并且申请专利的范围属于在先的由Paul England、Marcus Peinado和Bryan M.Willman于2002年4月17提出的、名为“Secure Store Processor”、申请号为No.60/373,505的美国申请,通过参考而引入该申请的整个内容。
这个专利文献所公开的一部分包含遵从版权保护的资料。当它出现在专利商标局专利文件或者记录中时,版权所有者不反对任何人复制该专利文献或者专利公开,然而在别的方面却无论如何都保留对该版权的所有权利。
具体实施方式
图1说明了一个示范性的访问控制模型100。委托人102能够请求访问一个受保护的资源。由防护装置104接收该请求,其中防护装置104是一个控制对资源106的访问的组件。防护装置104检查该请求,并且基于用于该资源的访问策略以及其它信息、诸如发布该请求的委托人102的身份,来判断是否准许该请求。为了便于说明,在图1中举例说明了单个委托人102、防护装置104、和资源106。然而,应当注意到,访问控制模型100能够包含多个委托人102、多个防护装置104、和/或多个资源106。
委托人102是指请求访问受保护数据的组件或者模块。这个请求可以是一条检索受保护数据的请求(例如,一条用于检索一个加密密钥的请求),或者一条使用受保护数据来执行操作的请求(例如,受保护数据能够是一个加密密钥,而该请求能够是一条使用该加密密钥来加密或者解密特定数据的请求)。委托人102可作为硬件、软件、固件中的一个组件或者模块,或者是硬件、软件和/或固件的组合。
防护装置104是指可控制对受保护数据的访问的组件或者模块。防护装置104使用与受保护数据有关的访问策略、以及其它信息(诸如请求访问受保护内容的委托人的身份),以确定是否允许委托人访问受保护的数据。如果防护装置104决定允许请求委托人访问受保护数据,则防护装置104以适当的方式对该请求做出响应(例如,如果该请求是一条对受保护数据的请求,则把受保护数据返回给委托人;或者,如果该请求是一条对将要使用受保护数据进行加密的特定数据的请求,则防护装置104使用受保护数据来加密该特定数据并且将密文返回(加密的数据)给委托人)。应当注意到,防护装置104可以基于请求的特性限制委托人。例如,防护装置104可以允许一特定委托人具有使用受保护数据签名的特定数据,但是可能不允许把受保护数据返回给特定委托人。
防护装置104还能够被表示为一个公开防护装置和/或一个服务防护装置。服务防护装置应委托人的请求用受保护数据(例如,加密密钥)执行某些操作(例如,加密、解密、数字签名等)而不必公开受保护的数据。另一方面,公开防护装置向授权的请求者揭示受保护数据。应当注意到,特定防护装置104能够是一个公开防护装置和一个服务防护装置。
资源106能够是将要限制对其访问的任何类型的数据。资源106的例子包含加密密钥、银行帐户号、信用卡号、诸如社会保险号、口令等的个人信息。资源106实际上还可以是在一个计算设备中的其他东西。例如,资源106也可以是物理存储器(例如,RAM或者ROM)、光或者磁盘或者盘驱动器、视频卡、声卡、智能卡等。通过另一个例子,资源106也可以是操作系统抽象概念,诸如处理过程、文件、线程、信号量等等。
在此处所公开的,主要是就在单个计算设备上的实现来描述访问控制模型100。然而,应当理解,模型的不同部分能够在不同的计算设备上实现。例如,委托人102可以在一个计算设备上,而防护装置104和资源106可以在另一个计算设备上。
一计算设备上的委托人和防护装置能够被分类成为任何数目n的分层ln。图2显示了一个使用四个不同分层的访问控制环境示例。在一个实现过程中,层l1是一个硬件或者安全核心层,层l2是一个基本输入/输出系统(BIOS)层,层l3是一个操作系统(OS)层,而层l4是一个应用层。
在图2的环境示例中,最低层(层l1)保护一个根资源。中间层(层l2和l3)中的程序起到可请求访问从下一个较低层起的委托人的作用,而同时起到可保护下一个较高层中的委托人的作用。中间层因此能够为在较高层中的委托人増加功能。
举例来说,假定程序120希望检索由防护装置126保护的根资源128。程序120起到一个从模块122请求访问根资源128的委托人的作用,其中模块122起到资源防护装置的作用。如果模块122具有资源128的拷贝(例如,先前从防护装置126中所获得的以响应先前的层l4中的程序120或者其它程序对该资源的请求,或者当模块122在计算设备中被初始化和加载时),则模块122检查程序120是否被允许检索该资源。如果程序120被允许检索资源,则模块122返回资源给程序120。
然而,如果模块122不具有资源128的拷贝,则模块122起到一个从模块124请求访问根资源的委托人的作用,其中模块124起到该资源防护装置的作用。如果模块124具有资源128的拷贝(例如,先前从防护装置126中所获得的以响应先前的层l3中的模块122或者其它模块对该资源的请求,或者当模块124在计算设备中被初始化和加载时),则模块124检查模块122是否被允许检索该资源。如果模块122被允许检索该资源,则模块124返回资源给模块122。如果程序120被允许检索资源,则模块122返回资源给程序120。
然而,如果模块122不具有资源128的拷贝,则模块122起到一个从防护装置126请求访问根资源的委托人的作用。防护装置126检查模块124是否被允许检索资源,并且如果模块124被允许检索资源则返回资源给模块124。如果模块122被允许检索资源,则模块124返回资源给模块122,并且如果程序120被允许检索资源,则模块122返回资源给程序120。
在此处的讨论中,对使用图1中的访问控制模型100以允许软件的验证操作进行了介绍。通常,在软件的验证操作中受保护的资源是加密密钥。然而,应当理解,软件的验证操作仅仅使用访问控制模型100这一个例子。
使用访问控制模型100的另一个例子是向一个计算机验证用户。大多数的现代计算机都具有一个访问控制系统。用户登录到计算机上,以便使计算机知晓该用户是谁。在登录之后,用户运行通常需要访问系统资源(例如读文件、写入到屏幕上的窗口等)的程序。典型地,咨询计算机中的访问控制系统(例如,“用户x能够在资源z上执行操作y吗?”)。如果答案为“否”,则程序不能访问资源。
使用访问控制模型100的另一个例子是向一个远程服务验证用户。诸如网站(例如,在线的经纪人或者银行)这样的远程服务被认为是可具有访问控制系统。资源是人们的银行帐户、他们的金钱和他们的股票。在用户登录到网站之后,访问控制系统将确定该用户是否被授权以执行由用户所请求的访问,诸如对资源“银行帐户数据”的“读取”访问(以检索最近的银行结单)、或者对资源“在银行账户12345中的$1000”的“转帐”访问。
使用访问控制模型100的还有另一个例子是限制对特定建筑物或者区域的物理访问。例如,当用户在上午到达工作地点时,用户显示他或者她的徽章并且在资源“前门”上请求“打开”操作。某些电子系统(防护装置)基于存储在徽章上的信息确定用户是否被允许进入该建筑物并且据此打开该门。
如果有可能使程序(从一个公开防护装置或者从一个服务防护装置)获得对至少一个加密资源的受保护的访问,则计算设备启用程序(软件)的验证操作。在某些实施例中,如下所述,允许验证和隔离的一个计算设备允许验证操作。
如果满足以下两点,则程序C能够被称为与另一个程序D隔离:(1)有能够由程序C而不是程序D访问的存储器;以及(2)程序D不能启动程序C的执行(除了可能在由程序C确定的一个入口点处之外)。通过一个程序的转移规则(可执行代码)和它的初始状态(入口点或者指令指针IP的初始值)来给定该程序。由于数据能够被保存在不能由程序D访问的存储器中,所以即使存在程序D的对抗行为,第一点也保证了程序C的程序代码和状态信息的完整性。这一点也允许程序C保护机密数据(例如,加密密钥)不被程序D观察到。第二点保证D不能通过对抗性地选择入口点来破坏C的行为。
另外,能够这样说,如果程序C能够标识程序D的转移规则(程序代码)和初始状态,则程序C能够验证程序D。就每一个小于i的层j来说,计算设备允许为任一程序C隔离除单个程序Ej之外的其它任何程序D,其中i是程序C的层。这保护程序不受除程序C请求通过其访问它的资源的防护装置中的序列E1、E2、...、Ei-1之外的任何程序的观察和干扰。此外,就任一层i来说,计算设备允许在层i中执行的程序验证在层i+1中的至少某些程序。这个要求允许一个程序起到一个用于来自下一层中委托人的请求的防护装置的作用。这两个观察得出一条归纳的结论:在任一层中的程序能够通过请求从它们的前一层访问资源、通过隔离保护它们的完整性和资源、和验证来自下一层中委托人的请求而起到资源防护装置的作用。
能够通过使用物理存储器保护来实现隔离。这种方法被称为“在空间中隔离”或者“空间隔离”。例如,在许多现代微处理器中找到的环形和虚拟存储器足以实现在空间中的隔离。在特权方式下运行的操作系统核心(层i)能够设置用于应用程序(层i+1)的页表,以便使任证用程序只能访问被操作系统核心选择以映射到应用程序的虚拟地址空间中的物理存储器的那些部分。此外,核心限制应用程序的特权以便使它们不能改变存储器映像,并且确保应用程序仅仅能够在一个良好定义的入口点处启动核心代码的执行(系统调用)。
在两层之间实现隔离的另一种方法是按时间分开它们的执行。这种方法被称为“在时间中隔离”或者“时间隔离”。在第一层i中的程序执行到完成时,使某些资源不可用,然后终止。随后,把控制传输到下一层i+1。
在随后的层(j=i+1)之间进行验征。程序C验证j的程序(转移规则)和配置初始状态。能够通过让程序C检查在层j中的程序来验证该程序。即,典型地,程序C读取包含用于层j的程序的存储器,并且计算在这个存储器区域上的加密摘要。应当注意到,此时目的仅仅是确定代码的身份,不计算由其它委托人提出有关该代码的结单。因此,此时证书是没有必要的。
程序C的第二个任务是标识程序D的初始状态。通常,在一个任意的执行阶段确定一个程序的初始状态是很难的。因此,程序C控制程序D的初始状态。实际上,这意味着如果程序C在σ处启动了程序D的执行则程序C只能确定程序D的初始状态σ。
总之,为了验证程序D,程序C检查它认为相关的存储器内容(程序,可能还有数据),并且计算加密摘要。在那之后,程序C转移执行到程序D的一个定义明确的入口点处。
在其中资源是加密密钥的情况下,验证操作允许每个操作系统和应用程序具有对一个或多个秘密的排它访问。上述讨论的隔离保护每个秘密不受到对抗性代码的攻击。上述讨论的程序验证允许程序被标识,以便使每个秘密仅仅向拥有它的程序公开。
通常,假定有来自一个程序(图1中的委托人102)的一条请求,防护装置104确定该程序的身份(即,防护装置104验证该程序)。如果程序不是所请求的秘密(资源106)的所有者,则防护装置104拒绝该请求。否则,防护装置104计算该秘密的某些函数(其可以是秘密本身),而且可能地话,还计算由该程序提供的信息,并且返回结果。做为选择,不是明确地接受或者拒绝请求,而是防护装置104可以服务于该请求,但是把调用者的身份绑定到结果中。这种替换方法是适当的,例如,如果由防护装置返回的结果不包含机密信息(例如,使用秘密以产生一个数字签名的请求)。此处使用了术语选通(gating)功能以指示这两种情况。
另外,不论是在哪种情况中,防护装置104验证调用者(委托人102)。验证委托人102在此也被称为函数ID(),其返回调用程序(调用防护装置104的选通功能的程序)的摘要。能够以多种传统方式中的任何一种产生摘要,诸如使用多种加密散列函数(也称为单向散列函数)、诸如SHA1(Secure Hash Algorithm 1,安全散列算法1)、MD5(Message Digest5,消息摘要5)、MD2(Message Digest2,消息摘要2)等中的任何一个或多个;使用键入的MAC(Message Authentication Code,消息验证码);等诸如此类。
在此描述的一类选通功能实现了密封存储。密封存储的目的是允许程序存储秘密,以便使只有一特定组的一个或多个程序(由存储该秘密的程序定义)能够检索该秘密。在一个实现中,只有最初保存(密封)该秘密的那个程序能够恢复(启封)该秘密。通常,这些秘密的使用斯限将超过该程序的单独执行时间。在一个程序的单次执行期间使用的秘密能够被保存(密封),或者隔离,并且随机数发生器也允许一个程序在单次执行期间保持秘密。密封存储还允许一个程序在在时间上可能不重叠的不同执行之上保持秘密。层li借助于下列接口(例如,使用“Seal”和“UnSeal”操作和/或PKSeal和PKUnseal操作)向下一层li+1暴露密封存储。
此处有关密封存储的讨论涉及被用来加密和解密数据的加密密钥。这些加密密钥是与保护资源访问的防护装置(例如,图1中的防护装置104)有关的密钥。
此处的讨论还涉及程序的标识符(例如,调用或者启用一个操作的程序的标识符、或者被允许访问一个资源的一个目标程序的标识符)。在此这些标识符通常被称为摘要。然而,应当理解,摘要仅仅是程序标识符的一个例子。能够使用是程序的度量或者其它表示、并且允许对该程序的任何改变的其它类型的标识符。如果对该程序进行了任何改变(例如,由一个对手改变一个或多个指令以试图恶意地访问和使用受保护的数据),则程序的标识符应当反映那个改变(例如,用于未改变的程序的标识符将不同于改变了的程序的标识符)。
Seal操作把将被密封的数据(例如,一个秘密)接收作为输入。Seal操作还选择性地把标识了何时和/或向谁可能揭示(启封)秘密的条件接收作为输入。在一个实现中,这个条件是被允许检索(启封)数据的一个目标程序的摘要。做为选择,将被允许检索(启封)数据的程序能够以其它方式被标识。例如,程序可以由验证一个或多个征书的一个公用密钥进行标识,其中每个证书与一个或多个程序有关。
做为选择,除了一个目标程序的标识符之外或者作为代替,可以使用其它条件。例如,该条件可以包含就何时能够揭示(启封)数据的特定时间限制,诸如在一周中的某天或某些天的特定时间,在这些时间期间能够揭示(启封)秘密。通过另一个例子,该条件可以包含为了使秘密被揭示(启封)而必须提供的一个口令或者其它数据的标识符--例如,秘密只能由已知该口令的程序启封。
通过还有的另一个例子,该条件能够是一个逻辑公式(例如,以一阶逻辑编写的任何语句、以判定逻辑编写的任何语句、等)。计算该逻辑公式(例如,由防护装置),并且只有当估算返回一个真的指示时才揭示(启封)秘密。
在还有的另一个例子中,该条件能够是以某种语言(例如,Java、C*、Javascript、VBScript等)的一个可执行程序(例如由防护装置)执行该程序,并且只有当程序返回“真”或者“满足”的某个指示时才揭示(启封)秘密。
在条件是目标程序的摘要、而不是被提供目标程序的摘要的情况下,Seal操作可以使用调用Seal操作的程序的摘要(由此隐含地输入目标程序的摘要)。另外,能够把多个目标程序的摘要输入到Seal操作,借此允许多个目标程序检索(启封)数据。
Seal操作加密它的输入(数据和允许检索(启封)数据的条件)连同调用者的标识符。Seal操作以加密形式返回输入数据(作为密文)。Seal操作还返回一个能够被用于验证密封数据完整性的值(例如,消息验证码(MAC)值)。这个返回的数据允许所存储的数据在随后的UnSeal操作中被引用,如以下更详细讨论的那样。
在表I中举例说明了用于Seal操作的伪代码。在表I的伪代码中,ID()是以上讨论的ID()函数,e是返回给调用者的值(例如,一个位串或者位序列),数据是将被密封的数据,而[t1,...,tm]是被允许检索(启封)数据(或者一个或多个其它条件)的一个或多个(m个)目标程序的摘要。
表I
d=ID()e=store(data,[t1,...,tm],d)returne |
图3是一个说明了一个用于实现Seal操作的示范性处理过程200的流程图。处理过程200由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,从调用者接收将被密封的秘密(动作202)。秘密被加密,以便使秘密只能由一特定目标程序检索(动作204),或者是如果满足了一个或多个特定条件才能检索秘密。然后把包含被功密的秘密的密文返回给调用者(动作206)。此外还可以把附加信息,诸如调用者的摘要和/或目标程序的摘要,返回给调用者(作为密文的一部分或者从密文分离)。
当调用程序的密封数据(例如加密密钥)现在希望检索时,UnSeal操作把由Seal操作返回的一个位串接收作为输入。UnSeal操作获得用于揭示数据的条件,并且检查那些条件是否被满足了。例如,如果条件包含被允许检索(启封)数据的一个或多个目标程序的摘要,则UnSeal操作获得那些摘要,并且检查调用程序是否是一个或多个目标程序其中之一。如果调用程序不是一个或多个目标程序其中之一,则UnSeal操作失败,并且所请求的数据不返回给调用者。然而,如果调用程序是一个或多个目标程序其中之一,则UnSeal操作成功,并且把所请求的数据返回给调用者。密封数据的程序的摘要也由UnSeal操作选择性地返回。
在表II中举例说明了用于UnSeal操作的伪代码。在表II的伪代码中,数据是正被请求的数据(和先前已经被密封的数据),[t1,...,tm]是被允许检索(启封)数据(或者一个或多个其它条件)的一个或多个(m个)目标程序的摘要,e是到UnSeal操作的输入(通常是先前Seal操作的输出),而d是密封数据的程序的摘要。
表II
(data,[t1,..,tm],d)=retrieve(e)ifID() is in[t1...,tm]then return(data,d)else fail |
图4是一个说明了一个用于实现UnSeal操作的示范性处理过程220的流程图。处理过程220由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,接收具有调用者希望检索的加密数据的密文(动作222)。就调用者是否被允许检索数据进行检查(动作224),并且基于调用者是否被允许检索数据而继续处理。如果调用者被允许检索数据,则(解密的)数据被返回给调用者(动作228)。如果调用者没有被允许检索数据,则处理失败(动作230),并且不把数据返回给调用者。
能够以不同的方式实现密封存储。在一个实现中,使用物理上受保护的非易失性存储器来实现密封存储。在这个实现中,计算设备把不同的防护装置与受保护的非易失性存储器的不同部分相关联,并且允许每个防护装置仅仅访问与那个防护装置有关的那些部分。在这个实现中,在Seal和UnSeal操作中引用的Store和Retriev操作被调用,以使计算设备分别在与防护装置有关的受保护的非易失性存储器中存储和检索数据。
举例来说,存储设备(诸如硬盘驱动器)能够实现防护装置。不是简单地向存储设备无条件地执行读和写命令,而是存储设备标识试图访问存储设备的委托人(例如,基于委托人的摘要),并且仅仅允许一个特定委托人访问该存储设备。做为选择,不同的委托人可以被限于仅仅访问存储设备的特定部分(例如,特定扇区或者地址区域)。
在另一个实现中,使用密码学实现密封存储。对使用密码学的密封存储的一个示范性实现的说明如下。
当使用密码学实现密封存储时,资源是密钥K而不是物理上受保护的存储器。Store操作没有在物理上存储它的输入。相反地,Store操作产生一个密码保护的输出c,其是以加密的和完整性受保护的形式的Store操作的输入。加密是向输入应用对称密码的结果。后面的性质是由于(在加密输入之前或之后)向输入应用消息验证码(MAC)而产生的。
在表III中举例说明了用于Store操作的伪代码。在表III的伪代码中,b是输入到Store操作的位串,c是由Store操作输出的位串,K1是密钥K的第一部分,而K2是密钥K的第二部分。密钥K是实现Seal和Store操作的防护装置的对称密钥。
表III
M=MACK1(6)c=(m,EncryptK2(b))returnc |
因此,如在表III中看到的那样,通过向输入到Store操作的位串应用MAC而产生一个值(m)。MAC被键入到密钥K的一部分(K1)。输入到Store操作的位串还使用密钥K的第二部分(K2)进行加密。通过向输入位串应用MAC和通过加密输入位串而产生的值然后被返回给Store操作的调用者。
密钥K被划分成为两个独立的密钥K1和K2,以免为MAC和密码使用相同的密钥。这个划分能够以多种方式中的任何一种来实现。划分可以使用密钥K的不同位,或者可以使用一个或多个相同的位。例如,假定密钥K是1024位,则低的512位可以被用作密钥K1,而高的512位可以被用作密钥K2,偶数位(位0、2、4、6、8、10、...、1022)可以被用作密钥K1,奇数位(位1、3、5、7、9、11、...、1023)可以被用作密钥K2,低的650位可以被用作密钥K1,而高的650位可以被用作密钥K2(导致某些位被用于K1和K2),等等诸如此类。做为选择,可以为MAC和密码使用相同的密钥K。
在表III中举例说明的伪代码通过在数据上计算MAC、加密数据、和输出MAC和密文来实现Store操作。做为选择,Store操作可以以不同的方式来实现。例如,Store操作可以首先加密数据,然后在密文上计算MAC,并且输出密文和MAC。通过另一个例子,Store操作可以在数据上计算MAC,然后加密数据和MAC,并且输出密文。
通过Store操作的密码实现的加密能够使用多种对称加密算法中的任何一种来实现。通常,对称加密算法使用相同的密钥用于加密和解密。这样的算法的示例包含三重DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、等等。
类似地,MAC能够是多个消息验证码中的任意一个,诸如在1996年、Lecture Notesin CS中,Advances in Cryptology-Cryto’96的1109号,由M.Bellare,R.Canetti,和H.Krawczyk所著的“Keying hash functions for message authentication”中描述的MAC。作为选择,能够通过用一个公用密钥数字签名代替MAC来保护完整性。
图5是一个说明了用于实现Store操作的示例处理过程250的流程图。处理过程250由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,接收要被存储的数据(动作252)。向该数据应用一个对称密码(动作254)以及向该数据应用一个消息验征码(MAC)(动作256)。在动作254中产生的加密数据和在动作256中产生的MAC值然后被返回到调用者(动作258)。
检索操作接收一个包含MAC值和密文的输入位串。解密该密文以产生明文并且为该明文产生一个MAC值。如果为该明文产生的MAC值和作为该输入位串一部分被接收的MAC值相同,则该明文被返回到调用者。然而,如果为该明文产生的MAC值和作为该输入位串一部分被接收的MAC值不同,则Retrieve操作失败而且该明文没有返回到调用者。可以理解:实现Retrieve操作以从输入位串获得MAC和明文的特定方式取决于实现Store操作的方式。
在表IV中举例说明了用于Retrieve操作的伪代码。在表IV的伪代码中,c是输入到Retrieve操作的位串,b是由Retrieve操作输出的位串,m是输入到Retrieve操作的位串的MAC值部分,d是输入到Retrieve操作的位串的密文部分,K1是密钥K的第一部分,而K2是密钥K的第二部分。K1和K2密钥是以上就Store操作讨论的密钥K的相同部分。
表IV
Let(m,d)=cb=DecryptK2(d))ifm=MACK1(b)then return belse fail |
因此,如在表IV中看到的那样,通过解密输入到Retrieve操作的位串而产生一个值(b)。然后为值(b)产生一MAC值。如果由Retrieve操作产生的MAC值与被接收作为输入到Retrieve操作的位串一部分的MAC值相同,则把值(b)返回给Retrieve操作的调用者,否则Retrieve操作失败。
表IV中的伪代码基于Store操作的实现,其中在Store操作中,在数据上计算MAC,加密数据,并且输出MAC连同密文(并且起到到Retrieve操作的输入位串的作用)。如果Store操作被实现为首先加密数据、然后在密文上计算MAC、并且输出密文和MAC,则Retrieve操作将被实现为计算密文的MAC并且把它与接收作为输入位串一部分的MAC值进行比较,然后解密密文,并且如果MAC值相匹配则返回解密的数据。如果Store操作被实现为在数据上计算MAC、然后加密数据和MAC,则Retrieve操作将被实现为解密输入位串,然后在输入位串中的数据上计算MAC,并且把计算的MAC和在解密串中的MAC值进行比较,并且如果MAC值相匹配则返回数据。
类似于以上有关Store操作的讨论,能够由Retrieve操作使用多种解密算法中的任何一种。然而,解密算法应当对应于加密算法,以便使被加密的数据能够被解密。类似地,多种消息验证码中的任何一种能够被用作MAC,但是使用的消息验证码应当与由Store操作使用的消息验证码相同。
图6是一个说明了一个用于实现Seal操作的示范性处理过程270的流程图。处理过程270由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,接收密文和MAC值(动作272)。密文被解密以产生明文数据(动作274)。向明文数据应用消息验证码(MAC)以产生一MAC值(动作276),并且就在动作276中产生的MAC值是否等于在动作272中接收的MAC值进行检查(动作278)。然后基于所产生的MAC值是否等于所接收的MAC值继续进行处理(动作280)。如果所产生的MAC值等于所接收的MAC值,则把明文数据返回给调用者(动作282)。然而,如果所产生的MAC值不等于所接收的MAC值,则处理过程失败(动作284),并且不把明文数据返回给调用者。
因此,密封存储的密码学方法实质上确保了:值c(Store操作的输出)的任何误用都能够被检测,而且值b(到Store操作的输入)在不访问密钥K2(由密码使用以加密值b的密钥)的情况下不能被检索。
另一类选通功能实现了远程验证。远程验证的目的是允许程序即使在缺少到验证人的坚固物理连接的情况下也能够被验证(例如,使用服务器或者智能卡)。在这种情况下,验征基于密码学。即,两个实体通过一种加密验证协议。这涉及具有对一个秘密访问的被验证了的配置,其中秘密取决于协议、典型地是一私有密钥或者一对称密钥。另外,计算设备能够把这些验证秘密的使用约束到请求它们的使用的配置身份(例如,处理器和/或软件)。因此,验证人能够确定计算设备的身份,以及在它上面执行的软件。
两个操作、Quote操作和PKUnseal操作是用于公用密钥签名和公用密钥解密的相应选通功能。实现这些选通功能的防护装置具有对一个签名密钥Ks和一个解密钥Kd的访问。签名密钥Ks和解密钥Kd也被称为公用/私有密钥对中的私有密钥。这个公用/私有密钥对是实现Quote和PKUnseal操作的防护装置的密钥对。
Quote操作在到Quote操作的输入和标识了何时和/或可以向谁揭示秘密的条件的组合(例如,连接)上返回一个公用密钥签名。类似于以上讨论的Seal和UnSeal操作,秘密的揭示能够被限制到多种条件中的任何一种。在一个实现中,条件是调用程序的标识符(例如摘要)。
在签名中固有的是应所标识调用程序的请求执行操作的断言。Quote操作连同Verify操作一起工作,其中Verify操作通常在不同于在其上执行Quote操作的设备的一个设备上执行(例如,在一远程服务器设备上、在一智能卡上等)。Verify操作执行公用密钥签名验证,并且检索和估算调用程序的标识符(和/或用于揭示秘密的其它条件)。
在表V中举例说明了用于Quote操作的伪代码。在表V的伪代码中,ID()是以上讨论的ID()函数,a是输入到Quote操作的数据,而Ks是签名密钥。
表V
d=ID()return sn=SignatureKs(d,a) |
因此,如在表V中看到的那样,Quote操作获得调用程序的摘要,并且接收一输入值a。Quote操作使用签名密钥Ks产生输入值a的一个数字签名(MSN)和调用程序的摘要。输入值a能够由调用程序产生,或者可以是从另一组件或设备(例如,从将执行Veiify操作的设备)接收的值。使用公用密钥密码学产生数字签名。
图7是一个说明了一个用于实现Quote操作的示范性处理过程300的流程图。处理过程300由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,从调用者接收输入数据(动作302)。获得调用者的标识符(用于检索输入数据的其它条件中的一个或多个)(动作304),并且生成在输入数据和调用者标识符(和/或一个或多个其它条件)的组合上的数字签名(动作306)。然后把所生成的数字签名返回给调用者(动作308)。
Verify操作执行公用密钥签名验证,并且检索和估算调用程序的标识符。Verify操作通常从一个不同于在其上执行Verify操作的设备的一个设备中接收由Quote操作生成的数字签名。Verify操作从所接收的数字签名中提取调用Quote操作的程序(,应用程序、操作系统、固件程序等)的摘要,并且计算那个摘要以确定如何进行。
在表VI中举例说明了用于Verify操作的伪代码。在表VI的伪代码中,d是调用Quote操作的程序的摘要,a是被输入到Quote操作的值,而Sn是由Verify操作接收作为输入的数字签名。
表VI
(d,a)=ExtractKv(Sn)Evaluate(d) |
因此,如在表VI中看到的那样,Verify操作接收一数字签名,并且使用验证密钥Kv(其是包含签名密钥Ks的公用/私有密钥对中的公用密钥)从签名中提取摘要d和值a。Verify程序因此能计算调用Quote操作的程序的摘要d。计算摘要d的方式能够改变。例如,计算可能涉及把摘要d与“批准的”或者“信赖的”应用程序列表进行比较。
图8是一个说明了一个用于实现Verify操作的示范性处理过程320的流程图。处理过程320由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,接收数字签名(动作322)。(使用Quote操作)摘引一个输入值的调用者的标识符(和/或用于检索输入值的一个或多个其它条件)以及输入值本身都是从数字签名中提取的(动作324)。然后计算调用者的标识符(和/或一个或多个其它所提取条件)以确定如何利用输入值继续进行(动作326)。
PKUnseal操作是公用密钥解密方案,其基于调用者的身份(例如,调用程序的摘要)或者一个或多个其它条件被选通。到PKUnseal操作的输入c的公用密钥解密结果被解释为一对(d,s),其中s是秘密,而d标识了可以向其揭示s的配置(例如,调用程序的摘要)。如果PKUnseal的调用者不是d,则PKUnseal操作失败。到PKUnseal操作的输入c由第二操作PKSeal生成,其中PKSeal操作能够在不同于在其上执行PKUnseal操作的设备的一个设备上执行(例如,在一个远程服务器设备上,在一个智能卡上等)。PKSeal操作执行一对(d,s)的公用密钥加密。PKUnseal和PKSeal操作也能够被用来实现密封存储。
在表VII中举例说明了用于PKUnseal操作的伪代码。在表VII的伪代码中,ID()是以上讨论的ID()函数,c是到PKUnseal操作的输入,[d1,...,dm]是能够向其揭示s的一个或多个调用程序的摘要(或者一个或多个其它条件),s是受保护的数据,而Kd是一个解密钥(与正实现PKUnseal操作的防护装置有关的公用/私有密钥对中的私有密钥)。
表VII
([d1,....dm],s)=DecryptKd(c)ifID()is in[d1,...,dm]then return selse fail |
因此,如在表VII中看到的那样,PKUnseal操作使用公用密钥解密和解密钥Kd来解密输入值a。被解密的输入值包含允许向其揭示受保护数据s的一个或多个调用程序的摘要[d1,...,dm](或者标识了何时和/或允许向谁揭示受保护数据s的一个或多个其它条件)。PKUnseal操作还生成调用程序的摘要。如果调用程序的摘要等于摘要[d1,...,dm]其中之一,则把受保护的数据s返回给调用程序。然而,如果调用程序的摘要不等于摘要[d1,...,dm]其中之一,则不把受保护的数据s返回给调用程序。
图9是一个说明了一个用于PKUnseal操作的示范性处理过程340的流程图。处理过程340由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,接收具有调用者希望检索的加密数据的密文(动作342)。就调用者是否被允许检索数据进行检查(动作344),并且基于调用者是否被允许检索数据而继续处理(动作346)。如果调用者被允许检索数据,则(使用公用密钥解密而解密的)数据被返回给调用者(动作348)。如果调用者没有被允许检索数据,则处理失败(动作350),并且不把数据返回给调用者。
PKSeal操作是公用密钥加密方案,其基于调用者的身份(例如,调用程序或者一个或多个其它程序的摘要)被选通。PKSeal操作执行一对(d,s)的公用密钥加密,其中s是秘密,而d标识了可以向其揭示s的一个或多个配置(例如,调用程序的摘要)。
在表VIII中举例说明了用于PKSeal操作的伪代码。在表VIII的伪代码中,c是PKSeal操作的输出,[d1,...,dm]是能够向其揭示s的一个或多个调用程序的摘要,s是受保护的数据,而Ke是加密钥。
表VIII
c=EncryptKe([d1,...,dm],s)returnc |
因此,如在表VIII中看到的那样,PKSeal操作把受保护数据s和能够向其揭示受保护数据s的一个或多个程序的摘要[d1,...,dm]接收作为输入。然后使用公用密钥密码学基于加密钥Ke加密对([d1,...,dm],s)加密钥Ke是能用来解密密文的防护装置的公用密钥。然后把由公用密钥加密产生的密文返回给调用程序。
图10是一个说明了一个用于实现PKSeal操作的示范性处理过程360的流程图。处理过程360由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,从调用者接收将被密封的秘密(动作362)。使用公用密钥加密把秘密加密,以便使秘密只能由一特定目标程序检索(动作364),或者是只有当满足了一个或多个特定条件时才能检索。然后把包含被加密的秘密的密文返回给调用者(动作366)。此外还可以把附加信息返回给调用者(作为密文的一部分或者从密文中分离),诸如调用者的摘要和/或目标程序的摘要。
意图使Quote和PKUnseal操作和公用密钥验证协议一起使用。通过分别把对公用密钥解密、公用密钥加密、签名、和签名验证的然后调用替换为对RKUnseal、PKSeal、Quote、Verify的一个调用,能够直接地采用大多数的公用密钥验证协议。
在某些情况中,能够获得一个随机数(例如,作为用于产生加密密钥的基础)是重要的。能够以各种不同的方式获得随机数。在一种实现中,随机数源是一个以计算设备的硬件实现的加密强随机数发生器。
上述Seal操作的一个替换是一个把该Seal操作和一个产生随机数操作相组合的GenSeal操作。该GenSeal操作把应当能够检索秘密的目标程序的摘要[t1,...,tm](及/或为了要被检索的秘密而必须被满足的其它条件)接收作为输入。GenSeal操作产生一个随机数并且密封该新产生的随机数以便它仅仅能够由具有目标摘要[t1,...,tm]之一(及/或满足的其它条件)的调用程序所检索。
在表IX中说明了用于GenSeal操作的伪代码。在表IX的伪代码中,ID()指上述的ID()函数,c指GenSeal操作的输出,s指新产生的随机数,[t1,...,tm]指应当被允许检索值s(其中的一个可以是调用GenSeal操作的程序)的一个或者多个目标程序或者可选地是一个或者多个条件,以及GenRandom()指一个产生随机数的函数。
表IX
d=ID()s=GenRandom()c=store(s,[t1,...tm],d)return c |
图11是一个说明了一个用于实现GenSeal操作的示范性处理过程380的流程图。处理过程380由图1中的防护装置104执行,并且可以以硬件、软件、固件、或者它们的组合来实现。
最初,从一个调用者接收输入(动作382),其标识了应当能够检索秘密的目标程序、或者为了使秘密被检索而将要满足的一个或多个其它条件。然后生成秘密(动作384),并且把秘密进行加密,以便使秘密只能由标识的目标程序检索(动作386),或者是只有当满足了一个或多个其它条件时才能够检索秘密。然后把包含被加密的秘密的密文返回给调用者(动作388)。此外还可以把附加信息返回给调用者(作为密文的一部分或者从密文中分离),诸如调用者的摘要和/或目标程序的摘要。
由公开的防护装置提供的服务能够被用于通用的密封服务。例如,回过头参见图1和2,基于在初始化时层n的身份(例如,在重启或者启动计算机之后,或者在开始执行一个程序时),层n-1向层n揭示单个密钥。层n高速缓存这个密钥,并且使用它以加密附加的秘密。在下次启动平台到相同配置中时,公开的防护装置提供相同的根密钥(例如,通过UnSeal或者PKUnseal),并且所有先前加密了的秘密能够由层n检索。
在某些实施例中,当下一层被初始化时(例如,在重启或者启动计算机之后,或者在开始执行一个程序时),较低层向下一层公开一个或多个秘密。继这个选通公开之后,不再使用较低层(直到下一次启动或者重启为止)。这个使用模型也被称为公开防护装置模型。通过使用公开防护装置模型,减少了对较低层的访问。
在此讨论的选通功能能够和使用时间隔离和空间隔离的服务防护装置和公开防护装置一起使用。以下讨论了四种用于已验证操作的服务模型实现:(1)服务防护装置-空间隔离;(2)公开防护装置-空间隔离;(3)公开防护装置-时间隔离;(4)服务防护装置-时间隔离。在这些服务模型的讨论中,假定较低级别的防护装置已经向在被考虑的层的防护装置公开了一个或多个密钥。获得这些密钥的方式取决于以下的防护装置以及该层的隔离模型。在同一个计算设备上的不同层能够使用这些服务模型中的不同模型。
(1)服务防护装置-空间隔离:防护装置在请求程序被初始化时测定并且保存该程序的身份。防护装置使用处理器服务(例如,CPU或者某些其它安全处理器或者协处理器)和一个暴露验证了的基本操作的系统调用接口来实现一个保护系统。
(2)公开防护装置-空间隔离:防护装置获得以加密块形式、有关初始化的服务请求。该块能够被保存在存储器中,或者是从外部存储设备中获得。防护装置测定它初始化的程序的身份,并且依据以上描述的选通功能向程序公开密钥。在放弃到下一层的控制之前,防护装置为它自己和它的秘密资源设立模式保护。
(3)公开防护装置-时间隔离:防护装置获得以加密块(位组)形式、有关初始化的服务请求。该块能够被保存在存储器中,或者是从外部存储设备中获得。防护装置测定它初始化的程序的身份,并且依据以上描述的选通功能向程序公开密钥。在传递控制到这些程序之前,防护装置删除用于实现选通功能的密钥(或者相反使其不可访问)。
(4)服务防护装置-时间隔离:在服务防护装置-时间隔离模型中,计算设备在横穿安全复位时安全地保持程序状态。这个模型类似于模型(1)(服务防护装置-空间隔离),然而,在传递控制到下一层之前,服务防护装置删除它的秘密(使它变得不起作用直到下一次重新启动为止)。下面通常将执行下一层,直到需要从防护装置请求服务为止。在那一点,它把请求的参数存储在存储器中的某处,在那儿它们将经受复位并且执行复位。当设备重新启动时,服务防护装置获得它的秘密,查看请求,(使用它的密钥)执行它,破坏密钥和任何有关信息,并且把计算的结果和控制传递到下一层(最初请求服务的那一层)。
在某些实施例中,如果一个计算设备支持空间隔离,则该安全内核应当暴露基本的Seal、Unseal、GetRandom(以获得一个随机数)、以及PKUnseal(或者Quote)(操作)。该安全内核能够实现一个公开防护装置或者一个服务防护装置。在另一方面,如果该平台支持时间隔离,则该安全内核应当提供一个公开防护装置,而且应当实现基本的Unseal、GenSeal、和PKUnseal(或者Quote)(操作)。
还应当注意到:Quote和PKUnseal功能能够建立在Seal和Unseal或者Unseal和GenSeal基本操作上。例如,制造商能够建立一个实现了Quote或者PKUnseal、并且起一个用于在在l1中实现的GenSeal和Unseal上的更高级软件(例如,操作系统)的宿主作用的l2程序。该制造商能够产生和封装由服务层所需要的密钥并且和设备或者CPU一起运送它们(或者让它们在线可用)。
在下面将进行一系列将允许平台支持验征操作的硬件实现的一个示例描述。和在该系统中的较高层类似,最低层(图2中的l1)的特征在于:(a)密钥资源,(b)具有对这些密钥访问的特权代码,以及(c)该层的控制初始化。
验证了的操作在程序和密钥之间提供了一个强绑定。在较高层处,在较低层中的防护装置保证这个绑定。在最低层处,没有在下面的软件防护装置能够守卫对平台秘密的访问。因此,使用了另一个机制来支持l1密钥到l1程序的关联。一种完成这个绑定的方法是让l1软件是在制造之后就不能改变的平台微码或者固件,并且让l1软件可无限制地访问l1密钥。这个平台微码或者固件然后能够被称为安全内核,而且该l1密钥被称为平台密钥。平台被设计为仅仅传递控制到一个预定的安全核心。硬件行为还能够被解释为一个简单的资源防护装置,其向预定义的安全核心公开平台密钥。
平台密钥和安全核心固件能够是处理器的部分,或者能够以计算设备中的一个或多个其它组件实现(例如,安全处理器或者协处理器,其还可以执行动密操作)。平台密钥和安全核心固件能够以单个组件实现,或者以计算设备中的多个组件实现。
利用验证了的操作,以一种控制的初始状态启动程序。在较高级别,在较低级别运行的软件能够被委托为在校正入口点处启动执行。然而,在l1,硬件执行这个功能。典型地,在上电或者随后的复位时,当前处理器通过下列的某些确定序列开始执行。例如,在最简单的情况下,处理器开始从一个体系结构上定义了的存储单元取出和执行代码。就l1来说,能够以一种受控制的初始状态由硬件启动程序,其中该硬件确保安全核心是在启动时执行的代码(作为确定序列的一部分)。
另外,应当没有其它的平台状态能够破坏安全核心的执行。复位和上电为处理器提供了坚固的和良好调试的状态清除。如在这个例子中使用的那样,用于启动或者调用安全核心的平台状态改变被称为安全复位。
此外,设备生产商应当准备由l1使用的平台密钥的生成或者安装、Seal和Unseal的实现。如果设备被认为是PKI(Public Key Infrastructure,公用密钥基础结构)的一部分,则生产商应当还为平台确认一个公用密钥。这能够是一个由l1直接使用的平台密钥,或者是由一较高层使用的密钥。
密钥生成和确认能够是CPU生产商或者其它方、诸如把CPU组装成为一个设备的OEM的职责。做为选择,该职责能够由多个这样的团体分担。
一旦安全核心正在执行,就能够使用以上描述的隔离机构以保护它自己不会在较高层进行代码执行。在空间中的隔离通常将涉及特权方式支持,而在时间中的隔离通常将涉及隐瞒上层的秘密。
在大多数的当前处理器上不需要额外的平台支持以支持空间隔离--已有的特权方式或者级别将足够了(只要允许访问平台密钥的硬件资源能够从较高层被保护起来)。
为了支持时间隔离,使用了硬件辅助设备以允许安全核心在传递控制到较高层之前隐藏平台密钥。在时间隔离模型中提供平台密钥安全的方法是使用一种被称为复位锁存器的有状态的保护电路。复位锁存器是一个硬件电路,它具有继复位或者上电之后打开的属性,但是任何软件随时都能够可编程地关闭锁存器。一旦关闭了,锁存器就保持关闭直到下一次复位或者上电为止。实现时间隔离的安全核心的平台应当在复位锁存器的状态上选通平台密钥访问,而且安全核心应当在传递控制到较高层之前关闭锁存器。如上所述,安全核心还应当采取额外的动作、诸如在传递控制之前清除存储器和寄存器,但是这些动作与在较高级别使用的那些动作相同。
如果平台使用空间隔离,则安全核心使用特权方式以从它驻留的程序(例如操作系统)中保护它自己和它的平台密钥。此外,安全核心为验证操作的调用建立一个系统调用接口。
如果平台使用空间隔离,则平台还应当包含经受安全复位以传递参数到服务例程的存储器。为了调用服务,操作系统在安全核心已知的一个存储单元中准备命令和参数块,并且执行安全复位。如果OS希望继服务调用之后继续执行(与简单的重新启动相反),则它和安全核心应当进行额外的测定以确保这能够被可靠地和安全地进行。
在此讨论的验证了的操作能够以各种设置用于安全性,诸如保护个人数据抵抗病毒、保护机密的服务器数据免受网络攻击、网络管理、拷贝保护、可信赖的分布计算等等。验证了的操作允许能够在同一个计算机上执行、而且不是一特定信托关系的不同程序保持它们的加密资源,不考虑其它软件的动作。
以下的一些讨论涉及SSP(Secure Service Processor,安全服务处理器)。在一个实施例中,SSP是向计算设备提供基本加密服务的处理器(用于在计算设备中使用)(例如,SSP支持在此描述的选通功能(例如图2中的层l1))。SSP能够使用加密钥,并且通常具有一个或多个对那个SSP来说是唯一的(或者希望是唯一的)的加密钥。SSP能够是设备的CPU或者一个或多个其它处理器的一部分。例如,SSP可以是在计算设备中的一个单独的芯片或者集成电路(IC)。
在一个不同的实施例中,SSP是一个适当隔离的软件程序,其向它的调用者公开了与先前实施例相同的功能。SSP实施例(直接或者间接地)访问加密钥。存在许多实现选项用于提供这样的访问。例如,SSP可以调用在较低层中的服务或者公开防护装置。或者SSP可以具有对包含所需加密钥的持久性存储器的某些部分(例如硬盘、闪速存储器、ROM等)的排它访问。
总之,SSP由它向较高层中的委托人公开的功能来定义。SSP是具有对加密钥的(直接或者间接)访问的防护装置(如上所述)。SSP使用这些密钥以向它的调用者提供加密服务。以下部分将描述SSP公开的示范性功能。
操作示例
以下是对密封存储器操作和远程验证操作的实现示例的讨论。这个部分举例说明了以上讨论的Seal UnSeaL、Quote、和PKUnseal操作的实现示例。
在这个部分中使用了下列定义:
名称 |
类型 |
描述 |
DIGEST |
BYTE[20] |
160位值。通常是SHA-1散列运算的输出。 |
SECRET |
BYTE[32] |
256位值。通常是将进行seal或者pkseal操作的秘密。 |
ordinal |
INTEGER |
每个输入和输出结构的ordinal分量标识了它所属的操作和它是否为输入或者输出结构。 |
KM |
256位密钥 |
用于HMAC操作的密钥。 |
Ks |
256位密钥 |
用于Seal和UnSeal的AES密钥。 |
KU |
2048位×3 |
用于PKUnseal的RSA密钥对 |
KQ |
2048位×3 |
用于Quote的RSA密钥对。 |
R |
128位 |
随机数 |
另外,在这个部分和以下的Bound Key Operations(边界密钥操作)部分中涉及访问策略。访问策略描述了特定操作何时是起作用的(即,它们何时工作)。计算设备的用户能够有选择地切断某些功能。例如,计算设备(例如实现Seal操作的SSP)包含一个被称作Feature Enable的寄存器。在寄存器中的这些位其中之一被称作MainEnable。如果用户设置MainEnable为假,则在这些部分中的所有功能都将不再起作用。每个功能包含的访问策略描述说明了该功能将在哪些FeatureEnable设置下面起作用。
Seal
Definifion(定义)
SSP_STATUS Seal(
[in] SECRET S,
[in] DIGEST Target[2],
[in]UINT32 MaxLen,
[out]UINT32* ActualLen,
[out]BYTE* SealedBlob
)
Parameters(参数)
Seal-Input∷= SEQUENCE{
ordinal INTEGER,
secret Secret
target DigestPair}
Seal-Output∷= SEQUENCE{
ordinal INTEGER,
status INTEGER,
sealed-blob OCTET STRING}
Return Values(返回值)
SSP_SUCCESS
Comments(注释)
Seal操作形成一个如果下列估算为真则只能由相应的Unseal操作解密的加密块(位组):
●编码是正确的?
●MAC是正确的?
●当前运行的SK/SL(Security Kernel(安全核心)或者Secure Loader(安全加载程序))是在Seal操作期间被命名为Target的那个?
Seal增加了内部的随机性,以便使Seal操作在相同输入上的输出产生不同的结果。这确保了Seal不能被用作一个硬件设备标识符。当执行密封以向启封程序(unsealer)提供完整性信息时,Seal还包含调用Seal操作的程序的标识符(例如,保存在SSP的PCR寄存器中的调用程序的摘要,在此也被称为PCR值)。
Access Policy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UseSymmKey=All|
Feature Enable.UseSymmKey=AuthSL
& SLKnown & AuthPCR[CurrentSL].UseSymmKey)
Actions(动作)
Seal操作实现下列动作:
1.生成一个128位的随机数R
2.使D0是PCR[0]的当前值,D1=PCR[1]
3.DIGEST M=HMAC[KM](R‖S‖target‖D0‖D1)
4.C=AES[Ks](R‖S‖Target‖D0‖D1‖M)
5.返回SSP_SUCCESS,且SealedBlob设置为C
Unseal
Definition(定义)
SSP_STATUS Unseat(
[in] BYTE* SealedBlob,
[in] UINT32 SealedBlobLen,
[out] SECRET S,
[out] DIGEST Source
)
Parameters(参数)
Unseal-Input∷=SEQUENCE{
ordinal INTEGER,
sealed-blob OCTET STRING}
Unseal-Output∷=SEQUENCE{
ordinal INTEGER,
status INTEGER,
secret Secret,
source Digest}
Return Values(返回值)
SSP_SUCCESS
SSP_UNSEAL_ERROR
Comments(注释)
Unseal操作在内部解密由Seal操作生成的一块,并且检查下列条件:
●编码是正确的?
●PCR的当前值是在Seal操作期间被命名为Target的那个?
如果所有的检查成功了,则返回秘密和密封程序的PCR;否则返回UNSEAL_ERR0R。
Access Policy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatuTeEnable.UseSymmKey==All|
Feature Enable.UseSymmKey=AuthSL
& SLKnown & AuthPCR[CurrentSL].UseSymmKey)
Actions(动作)
Unseal操作实现下列动作:
1.M=AES-1[Ks](SealedBlob).
2.把M解释为(BITS[128]R‖SECRET S1‖DIGEST Target0‖DIGEST Target1‖DIGEST Sealer0‖DIGEST Sealer1‖DIGEST N)。
3.DIGEST D=HMAC[KM](R‖S1‖Target0‖Target1‖Sealer0‖Sealer1)。
4.如果(Target0!=PCR[0]‖Target1!=PCR[1]),则返回SSP_UNSEAL_ERROR,且S、Source设置为0。
5.如果D!=N,则返回SSP_UNSEAL_ERROR,且S、Source设置为0。
6.否则,返回SSP_SUCCESS,且S设置为S1,Source设置为{Sealer0,Sealer1}。
Quote
Definition(定义)
SSP_STATUS Quote(
[in] BITSTRING d-ext,
[out] PKSignature SigBlob
)
Parameters(参数)
Quote-Input∷={
ordinal INTEGER,
d-ext Digest}
Quote-output∷-{
ordinal INTEGER,
status INTEGER,
sig-blob PKSignature}
Return Values(返回值)
SSP_SUCCESS
SSP_CRYPTO_ERROR
Comments(注释)
Quote操作指示SSP为从外部提供的D-EXT和内部PCR值的级联签名。
Access Policy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All|
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actiohs(动作)
Quote操作实现下列动作:
1.SSP在DER(Distinguished Encoding Rules,分布式编码规则)编码下形成一条包含用于消息类型QuoteMessage的标识符、D-EXT和PCR寄存器的内容的级联的消息M:
SEQUENCE{
message-type PKMessageType,
d-ext Digest,
pcr Digestpair
}
2.SSP然后依据在PKCS#1V2.1中规定的RSASSA-PSS-SIGN的缺省实现使用KQ、PRIV以生成一条在M上签名的消息。如果函数返回错误,则返回SSP_CRYPTO_ERROR,且SigBlob设置为0。
3.SSP返回SSP_SUCCESS和刚好用signatureAlgorithm=rSASSA-PSS-Default-Identifier在SigBlob计算的签名值。
PKUnseal
Definition(定义)
SSP_STATUS PK_Unseal(
[in] PKCiphertext SealedBlob,
[out] SECRET Secret
)
Parameters(参数)
PkUnseal-Input∷={
ordinal INTEGER,
pk-sealed-blob PKCiphertext}
PkUnseal-output∷={
ordinal INTEGER,
status INTEGER,
secret Secret}
Retum Values(返回值)
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
Comments(注释)
PKUnseal操作使用具有416位长度、而且具有特定格式的一加密块。解密该块,并且如果解密和译码成功,则把416位消息解释为一个秘密值和被允许接收解密值的PCR值的级联。
如果当前的PCR值等于在加密块中指定的那个,则揭示秘密;否则返回错误。
Access Policy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKe==All|
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actions(动作)
PKUnseal操作实现下列动作:
1.SSP测试在pk-sealed-blob中的Algorithmldentifier是否为sspV1BoundKey。
2.SSP依据在PKCS#1 V2.1中规定的RSAES-OAEP-DECRYPT的缺省实现内部地解密SealedBlob,以获得明文消息M。
3.如果译码操作的输出为“译码错误”,则返回SSP_BAD_DATA_ERROR,且Secret设置为0。
4.否则,在DER编码下恢复的消息M应当是下列格式:
SEQUENCE{
message-type PKMessageType,
secret Secret,
target Digest}
此外,Secret应该包含256位(=32个八位字节),而且target应该包含160位(=20个八位字节)。message type(消息类型)应当是sspV1PKSealedMessage。如果不满足这些条件,则返回SSP_BAD_DATA_ERROR,且Secret设置为0,否则:
1.如果target!=PCR,则返回SSP_BAD_DATA_ERROR,且Secret设置为0。
2.如果target=PCR则返回SSP_SUCCESS,且Secret设置为secret。
Bound Key Operations(边界密钥操作)
另外,一组边界密钥函数或操作允许加密钥在本地被创建和确认(例如,由SSP),而且还允许加密钥从可信赖的远程团体进行传递(例如,传递给SSP)。
边界密钥的功能其特征如下:
1.服务防护装置(例如SSP)在某一系统层直接访问边界密钥。每个边界密钥具有一个确定哪个防护装置可以访问边界密钥的相关条件。条件被隐含地表示。即,加密边界密钥,以便使只有一组或某一组防护装置具有解密它的密钥。
2.访问边界密钥的服务防护装置向在较高层的委托人公开需要使用边界密钥的功能(例如签名、MAC、加密、解密)。每个边界密钥可以具有一个相关的使用条件,而在这种情况下防护装置将服务于满足该相关条件的请求。
3.边界密钥被包含在加密保护的数据结构(在此也被称为边界密钥块)中。边界密钥块是自我保护的,并且能够被存储在信赖的环境之外。
边界密钥具有下列好处:
●每个委托人能够被允许具有它自己的边界密钥。此外,每个委托人能够被允许具有任意多的边界密钥。这考虑到了更加精细的策略设置,并且改善在某些应用程序中的保密性。因此,防护装置没有必要限于仅仅具有一个或者几个用来服务于来自所有委托人的请求的密钥。
●边界密钥在授权的服务防护装置之外是不公开的。因此,委托人的泄密(例如由于程序设计错误)不会导致任一边界密钥的泄密。在一个实施例中,服务防护装置(SSP)以硬件实现。在这种情况下,边界密钥不能由于恶意的或者不正确的软件被泄密。
边界密钥函数为加密密钥提供保护。边界密钥能够由远程团体生成,或者是它们能够在本地通过GenBoundKey命令创建。
在本地生成的边界密钥可以发出“quote(摘引)”证书,其能够被用来向远程团体提供公用密钥的类型证明、生成的密钥类型、在生成期间机器的状态、密钥被绑定的(可选)条件(例如摘要)。
边界密钥包含一个或多个下列要素:
●密钥使用(例如,BoundSign、BoundQuote、BoundPkUnseal、BoundPkDecrypt、BoundMAC、BoundEncrypt或者BoundDecrypt)。这个要素是可选的。如果被包含了,则这个要素限制边界密钥仅仅和所标识的函数类型一起使用。
●条件要素(如上所述),其指定在哪些条件下边界密钥能被使用(也称为边界密钥使用条件)。例如,条件可以被表示为程序的一个或多个摘要的形式。在这种情况下,边界密钥必须仅仅由指定了其摘要的程序使用或者以该程序的名义使用。如上所述,条件的其它例子包含时间限制、逻辑公式、和可执行程序。这个要素是可选的。如果该要素被省略了,则适用某些缺省的条件。例如,缺省条件不能限制对边界密钥的访问(空条件)。
●允许密钥被计算的加密密钥(边界密钥)或者某些数据。
●在其下面能够改变边界密钥使用条件的一个或多个条件(如上所述)。这种改变也被称为边界密钥迁移,而该条件也被称为迁移条件。这个要素是可选的。如果该要素被省略了,则适用某些缺省的条件。例如,缺席条件可以“总是假的”,以便使摘要(如果给出的话)不能被改变。
●在其下面能够改变能直接访问边界密钥的该组服务防护装置的一个或多个条件。这种改变也被称为边界密钥输出,该条件也破称为输出条件。这个要素是可选的。
边界密钥的密码保护
边界密钥具有与以上描述的密封存储和验证功能(Seal、UnSeal、PKUnseal)相同的加密要求。特别是,在本地生成的边界密钥能够由以上所述的Store和Retrieve功能的任何加密实现来保护。在每种情况下,边界密钥自身的机密性受到保护,而且整个数据结构的完整性受到保护,以便确保管理边界密钥使用的不同条件没有被破坏。如早先描述的那样,这能够由对称密码或者公用密钥加密算法和MACs或者数字签名的各种组合来实现。在一个实施例中,边界密钥数据结构是公用密钥加密的。
函数
在某些实施例中,边界密钥能够被用在一个或多个的下列函数中:
●BoundSign
●BoundQuote
●BoundPkDecrypt
●BoundPkUnseal
●BoundMAC
●BoundEncrypt
●BoundDecrypt
●GenBoundKey
●BoundKeyMigrate
●BoundKeyExport
在这些函数的每一个中,把边界密钥块(在数据结构中的位组)和将由包含在边界密钥块内的密钥在其上进行运算的数据作为参数提供给边界密钥函数。如果密钥使用要素被包含在边界密钥块中,则SSP确保边界密钥被用于正确的目的(例如,用类型“BoundQuoteKey”创建的密钥只能被用在BoundQuote操作中)。
在某些实现中,边界密钥是公用/私有密钥对中的私有密钥。在这种实现中,边界密钥块能够包含该私有密钥,或者某些允许该密钥被计算的数据。例如,一个私有密钥片段可以被包含在边界密钥块中,而且这个片段和相应着公用密钥一起能够被用来重构该公用/私有密钥对中的私有密钥。
BoundSign操作接收一个将使用边界密钥进行签名的数据输入,而且还接收一边界密钥块。SSP从边界密钥块中恢复私有签名密钥,然后使用所恢复的签名密钥生成一条在数据输入上数字签名的消息。SSP然后输出该数字签名的消息。如果边界密钥块被破坏了或者如果有边界密钥使用条件而没有满足时,则SSP不执行该操作。因此能使用所恢复的私有密钥而不是由SSP揭示的私有密钥对数据输入进行数字签名。
BoundQuote操作把将被签名的数据和边界密钥块接收作为输入。SSP从边界密钥块中恢复私有密钥,然后使用所恢复的签名密钥以在输入到该操作的数据和当前的PCR值(例如,调用BoundQuote操作的程序的标识符、诸如摘要)上生成一个签名,如在以上所述的Quote操作中那样。SSP然后输出该数字签名的消息。如果边界密钥块被破坏了或者如果有边界密钥使用条件而没有满足时,则SSP不执行该操作。在一个实现中,BoundQuote操作类似于BoundSign操作,但是在当前PCR值被用在BoundQuote操作中该方面有所不同。
BoundPkDecrypt操作把密文和边界密钥块接收作为输入。SSP从边界密钥块中恢复私有密钥,然后使用所恢复的私有边界密钥以解密输入密文。然后由BoundPkDecrypt操作输出解密的数据。如果边界密钥块被破坏了或者如果有边界密钥使用条件而没有满足时,则SSP不执行该操作。
BoundPkUnseal操作把密文和边界密钥块接收作为输入。SSP从边界密钥块中恢复私有密钥,然后使用该私有边界密钥以解密输入密文,如在以下描述的PKUnseal操作中那样。然后由BoundPkUnseal操作输出解密的数据。如果边界密钥块被破坏了或者如果有边界密钥使用条件而没有满足时,则SSP不执行该操作。
BoundMAC操作接收一个将使用边界密钥在其上计算MAC的数据输入,而且还接收一边界密钥块。如果边界密钥块被破坏了或者如果有边界密钥使用条件而没有满足时,则SSP不执行该操作。否则,SSP从边界密钥块中恢复边界密钥,然后使用所恢复的边界密钥在输入数据上生成一个消息验证码(MAC)。然后SSP输出所计算的MAC。因此,能够使用所恢复的边界密钥而不是由SSP揭示的边界密钥来计算用于输入数据的MAC。
BoundEncrypt操作接收一个将使用边界密钥对其进行加密的数据输入,而且还接收一边界密钥块。如果边界密钥块被破坏了或者如果有边界密钥使用条件而没有满足时,则SSP不执行该操作。否则,SSP从边界密钥块中恢复私有密钥,然后使用所恢复的边界密钥加密输入数据。SSP然后输出所计算的密文。因此,能够使用所恢复的边界密钥而不是由SSP揭示的边界密钥来加密输入数据。
BoundDecrypt操作接收一个将使用边界密钥对其进行解密的数据输入,而且还接收一边界密钥块。如果边界密钥块被破坏了或者如果有边界密钥使用条件而没有满足时,则SSP不执行该操作。否则,SSP从边界密钥块中恢复私有密钥,然后使用所恢复的边界密钥解密输入数据。SSP然后输出所计算的明文。因此,能够使用所恢复的边界密钥而不是由SSP揭示的边界密钥来解密输入数据。
GenBoundKey操作使SSP创建一新的边界密钥。新的边界密钥是一个加密密钥,而且生成包含最新生成的密钥的新的边界密钥块。应当理解,边界密钥块并不总是必须包含该整个密钥。例如,如果最新生成的密钥是一公用/私有密钥对,则在边界密钥块中包含私有密钥可能就足够了。
新的边界密钥块被绑定到一个或多个防护装置上--通常是正在执行操作的SSP(例如,类似于以上所述的Store函数,通过密码保护该新的边界密钥块,或者相反,保护该新的边界密钥块以便使它只能够由SSP检索)。GenBoundKey操作还可以具有确定新的边界密钥块的各个特征的参数,而且以某些完整性受保护的方式把描述了这些参数的数据附加到最新生成的私有密钥上(例如,使数据是新的边界密钥块的一部分)。如上所讨论的那样,这个数据的例子包含迁移条件、边界密钥使用条件等等。然后由GenBoundKey操作输出新的边界密钥块。
总之,边界密钥可以是任何类型的加密密钥,包含对称密钥或者公用—私有密钥对。准确的密钥类型取决于它将被使用的边界密钥操作。例如,将被用在BoundMAC中的边界密钥通常是对称密钥,而将被用在BoundSign中的边界密钥通常是公用/私有签名密钥对。密钥类型可以被指定为GenBoundKey的一个参数。
BoundKeyMigrate操作允许边界密钥的使用条件被改变。SSP验证该一个或多个迁移条件被满足了。多种条件中的任何一种可以和BoundKeyMigrate操作一起使用(例如,任何标识了何时和/或能够向谁转移数据的条件,类似于以上就Seal和UnSeal操作讨论的那些条件)。如果验证没有成功进行,则该操作失败。如果验证成功地进行了,则防护装置生成一个新的边界密钥块,其中边界密钥使用条件已经按照要求被改变了。
BoundKeyExport操作指示SSP改变能够直接访问边界密钥的该组防护装置(SSPs)。SSP验证该一个或多个条件被满足了。多种条件中的任何一种可以和BoundKeyExport操作一起使用(例如,任何标识了何时和/或能够向谁输出数据的条件,类似于以上就Seal和UnSeal操作讨论的那些条件)。如果验证没有成功进行,则该操作失败。如果验证成功地进行了,则SSP按照要求改变在边界密钥块上的密码保护。在一个实施例中,SSP用一个或多个新的密钥加密边界密钥数据结构。
边界密钥的(本地或者远程)创建者能够指定的一类条件的一个例子是:仅仅可以以其程序摘要具有特定值的委托人的名义使用边界密钥。在这种情况下,边界密钥操作在边界密钥块的内部检索之后检查请求委托人的摘要,并且如果摘要不是如在边界密钥块中指定的那样,则操作失败,不执行额外的计算。
通常借助于要求特定SSP的唯一密钥以继续进行的加密操作把边界密钥块约束或绑定到一特定的SSP。这种操作的例子是MAC、数字签名、加密、和加密以及完整性验证函数的组合。
边界密钥操作示例
在一个实现中,通过由授权实体发出的本地迁移证书或者输出证书来授权迁移。本地迁移证书是RSASSA-PSS-SIGN操作在下列数据结构上的缺省值:
Bound-migration-info∷=SEQUENCE{
source-bound-blob-digest Digest,
dest-PCR DigestPair
}
使用BoundKeyMigrate操作请求本地的SSP-migration(迁移)。为了授权本地迁移,SSP具有一个涉及这个边界密钥的Bound-migration-info结构,并且由授权的实体在这个结构上提供一个正确形成的证书。如果迁移授权是可接受的,则SSP为新的PCR重新绑定密钥,并且使所有的其它密钥属性保持不变(例如,如果密钥最初没有被绑定到一个PCR值,则它将不会是何时重新绑定)。source-bound-blob-digest是边界密钥的加密外部形式的摘要。
通过具有例如由授权实体签名的Bound-export-info结构的BoundKeyExport函数来实现远程迁移:
Bound-export-info∷=SEQUENCE{
source-bound-blob-digest Digest,
dest-pubkey RSAPublicKey,
dest-PCR DigestPair
}
当密钥被标记为可输出时,授权实体在密钥被重新绑定到的设备或者软件模块的完全控制中。
边界密钥操作使用PKCiphertext,其是用平台公用加密密钥加密的Bound-key-blob类型的序列,其中Bound-key-blob如下:
Bound-key-blob∷=SEQUENCE{
message-type PKMessageType,
key-type Bound-key-type,
bound-to-PCR BOOL,
bound-to DigestPair,
migrateable Bool,
migrate-auth Digest,
exportable Bool,
export-auth Digest,
pub-key-digest Digest,
bound-key PKCompressedPrivateKey}
其中:
Bound-key-type∷=INTEGER{
BoundSignKey,
BoundQuoteKey,
BoundDecryptKey,
BoundPkUnsealKey}
bound-to-PCR成员是一个指示为了使边界密钥被使用bound-to-Digest字段是否必须与当前PCR随匹配的标记。{migrateable,migrate-auth}指示密钥是否为可迁移的,而且如果是这样的话,在什么权限的控制下(如果migrateable为假,则migrate-auth值是不重要的)。{exportable,export-auth}指示密钥是否为可输出的,而且如果是这样的话,在什么权限的控制下(如果exportable为假,则export-auth值是不重要的)。Pub-key-digest是用以在PKCompressedPrivateKey和恢复私有密钥所必需的公用密钥之间提供坚固绑定的相应公用密钥的摘要。
在一个实现中,如果边界密钥是用GenBoundKey函数本地创建的,则SSP在一个详述了刚刚生成的密钥的公用属性、以及在边界密钥输出期间的系统配置的数据结构上创建一个签名。
Bound-key-pub-info∷=SEQUENCE{
message-type PKMessageType,
//sspV1BoundKeyGenMessage
sig-nonce Digest,
key-type Bound-key-type,
bound-to-PCR BOOL,
bound-to DigestPair,
migrateable Bool,
migrate-auth Digest,
exportable Bool,
export-auth Digest,
creator-PCR DigestPair,
bound-pub-key Digest}
在这个数据结构中,key-type、bound-to-PCR、bound-to、migrateable、migrate-auth、exportable、和export-auth是最新生成的密钥的边界密钥特性。Creator-PCR是在输出密钥时有效的PCR,而bound-pub-key是最新创建的公用密钥的摘要。sig-nonce是在请求生成边界密钥时传递的摘要大小的值。
BoundSign、BoundQuote、BoundPkDecrypt、BoundPkUnseal、GenBoundKey、BoundKeyMigrate、和BoundKeyExkport操作的示范性定义如下。
BoundSign
Definition(定义)
SSP_STATUS BoundSign(
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BITSTRING DataToBeSigned
[out]PKSignature sig-blob
)
Parameters(参数)
Boundsign-Input∷={
ordinal INTERGER,
bound-key BoundKeyBlob,
bound-pub-key RSAPublicKey,
data-to-be-signed OCTET STRING}
BoundSign-output∷={
ordinal INTEGER,
Status INTEGER,
Sig-blob PKSignature}
Return Values(返回值)
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
SSP_UNSEAL_ERROR
Comments(注释)
BoundSign操作采用包含BoundSignKey类型的BoundKeyBlob的sspV1BoundKey类型的PKciphertext和相应的公用密钥。如果这些条件中任何一个都不满足,或者如果序列未能译码,则操作失败,返回SSP_CRYPTO_ERROR。
如果Bound-to-PCR被设置了,则SSP检查当前PCR值是否如Bound-key-blob序列中指定的那样。如果不是这样,则SSP返回SSP_CRYPTO_ERROR。
最后,SSP用解密的私有密钥签名输入消息。
Access Policy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All|
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actions(动作)
BoundSign操作实现下列动作:
1.SSP测试在pk-sealed-blob中的Algorithmldentifier是否为sspV1BoundKey。
2.SSP依据在PKCS#1 V2.1中规定的RSAES-OAEP-DECRYPT的缺省实现内部地解密SealedBlob,以获得明文消息M。
3.如果译码操作的输出为“译码错误”,则返回SSP_CRYPTO_ERROR,且Secret设置为0。
4.否则,恢复的消息M应当是利用BoundSignKey类型的Bound-key-blob形式的DER编码。如果不是,则SSP应当发出SSP_CRYPTO_ERROR。
5.如果bound-to-PCR为真,则应当把bound-to与当前PCR值进行比较。如果值不相同,则SSP应当输出SSP_CRYPTO_ERROR。
6.SSP然后使用所提供的相关公用密钥恢复边界私有密钥。如果这失败了,则SSP返回SSP_CRYPTO_ERROR。如果它成功了,则SSP依据如PKCS#1 V2.1中规定的RSASSA-PSS-SIGN的缺省实现,使用所恢复的私有密钥bound-key以在输入言息DataToBeSigned上生成签名的消息。如果函数返回错误,则返回SSP_CRYPTO_ERROR,且SigBlob设置为0。
7.返回SSP_SUCCESS。
BoundQuote
Definition(定义)
SSP_STATUS BoundQuote(
[in] PKCiphertext BoundKeyBlob,
[in] DIGEST DataToBeSigned
[out] PKSignature sig-blob
)
Parameters(参数)
BoundQuote-Input∷={
ordinal INTEGER,
bound-key BoundKeyBlob,
bound-pub-key RSAPublicKey,
data-to-be-quoted Digest}
BoundQuote-output∷={
ordinal INTEGER,
status INTEGER,
sig-blob PKSignature}
Return Values(返回值)
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
SSP_UNSEAL_ERROR
Comments(注释)
BoundQuote操作采用包含BoundQuoteKey类型的BoundKeyBlob的sspVlBoundKey类型的PKciphertext。如果这些条件中任何一个都不满足,或者如果序列未能译码,则操作失败,返回SSP_CRYPTO_ERROR。
如果Bound-to-PCR被设置了,则SSP检查当前PCR值是否如Bound-key-blob序列中指定的那样。如果不是,则SSP返回SSP_CRYPTO_ERROR。
最后,SSP用解密的私有密钥摘引输入消息。
AccessPolicy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All|
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actions(动作)
BoundQuote操作实现下列动作:
1.SSP测试在pk-sealed-blob中的Algorithmldentifier是否为sspV1BoundKey。
2.SSP依据在PKCS#1 V2.1中规定的RSAES-OAEP-DECRYPT的缺省实现内部地解密SealedBlob,以获得明文消息M。
3.如果译码操作的输出为“译码错误”,则返回SSP_CRYPTO_ERROR,且Secret设置为0。
4.否则,恢复的消息M应当是利用BoundSignKey类型的Bound-key-blob形式的DER编码。如果不是,则SSP应当发出SSP_CRYPTO_ERROR。
5.如果bound-to-PCR为真,则应当把bound-to与当前PCR值进行比较。如果值不相同,则SSP应当输出SSP_CRYPTO_ERROR。
6.SSP然后使用所恢复的私有密钥片段和公用密钥以重构私有密钥。私有密钥能够被重构如下。总之,RSA密钥是由数字N=p*q(N是两个素数p和q的乘积)、和两个指数e(加密指数)和d(解密指数)构成。N和e形成公用密钥;d是私有密钥。总之,d与N一样长(例如2048位)。如果N的因式分解是已知的(即,如果p和q是已知的),则私有密钥d能够被很容易地确定下来。注意到,p和q仅仅是N的一半长。所以,不是d存储作为私有密钥,而是存储p。然后,给定公用密钥N、e和p,能够计算值q=N/p,任何给定p和q确定值d。
然后依据在以上定义的Quote操作中的说明,使用私有密钥以在输入消息DataToBeSigned和当前PCR值上生成一个签名。如果函数返回错误,则返回SSP_CRYPTO_ERROR,且SigBlob设置为0。
7.返回SSP_SUCCESS。
BnupdPkDecrvnt
Definition(定义)
SSP_STATUS BoundPkDecrypt(
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey BoundPubKey,
[in] PKCiphertext DataToBeDecrypted,
[out]Secret decryptedData
)
Parameters(参数)
BoundPkDecrypt-Input∷={
ordinal INTEGER,
bound-key BoundKeyBlob,
bound-pub-key RSAPublicKey,
pk-sealed-blob PKCiphertext}
BoundPkDecrypt-output∷={
ordinal INTEGER,
status INTEGER,
d-blob Secret}
Return Values(返回值)
SSP_SUCCESS
SSP_UNSEAL_ERROR
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
Comments(注释)
BoundPkDecrypt操作采用包含BoundDecryptKey类型的BoundKeyBlob的sspVlBoundKey类型的PKciphertext。如果这些条件中任何一个都不满足,或者如果序列未能译码,则操作失败,返回SSP_CRYPTO_ERROR。
如果Bound-to-PCR被设置了,则SSP检查当前PCR值是否如Bound-key-blob序列中指定的那样。如果不是这样,则SSP返回SSP_CRYPTO_ERROR。
最后,SSP用从bound-blob中解密的私有密钥解密输入消息。
Access Policy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All|
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actions(动作)
BoundPkDecrypt操作实现下列动作:
1.SSP测试在pk-sealed-blob中的Algorithmldentifier是否为sspV1BoundKey。
2.SSP依据在PKCS#1 V2.1中规定的RSAES-OAEP-DECRYPT的缺省实现内部地解密SealedBlob,以获得明文消息M。
3.如果译码操作的输出为“译码错误”,则返回SSP_CRYPTO_ERROR,且Secret设置为0。
4.否则,恢复的消息M应当是利用BoundSignKey类型的Bound-key-blob形式的DER编码。如果不是,则SSP应当发出SSP_CRYPTO_ERROR。
5.如果bound-to-PCR为真,则应当把bound-to与当前PCR值进行比较,如果值不相同,则SSP应当输出SSP_CRYPTO_ERROR。
6.SSP使用所提供的公用密钥恢复私有密钥。能够如以上在BoundQuote操作中讨论的那样恢复私有密钥。它然后通过使用在PKCS#1 V2.1中规定的RSAES-OAEP-DECRYPT的缺省实现,使用所恢复的私有边界密钥以解密pk-sealed-blob,以获得明文消息M。
7.SSP设置d-blob为M。
8.返回SSP_SUCCESS。
RoundPkU nseal
Definition(定义)
SSP_STATUS BoundPKUnseal(
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey BoundPubKey,
[in] PKCiphertext DataToBeUnsealed,
[out]Secret decryptedData
)
Parameters(参数)
BoundPKUnseal-Input∷={
ordinal INTEGER,
bound-key BoundKeyBlob,
bound-pub-key RSAPublicKey,
pk-sealed-blob PKCiphertext}
BoundPKUnseal-output∷={
ordinal INTEGER,
status INTEGER,
d-blob Secrgt}
Return Values(返回值)
SSP_SUCCESS
SSP_UNSEAL_ERROR
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
Comments(注释)
BoundPkUnseal操作采用包含BoundPKUnsealKey类型的BoundKeyBlob的sspVlBoundKey类型的PKciphertext。如果这些条件中任何一个都不满足,或者如果序列未能译码,则操作失败,返回SSP_CRYPTO_ERROR。
如果Bound-to-PCR被设置了,则SSP检查当前PCR值是否如Bound-key-blob序列中指定的那样。如果不是,则SSP返回SSP_CRYPTO_ERROR。
最后,SSP使用PK_Unseal以用从bound-blob中解密的私有密钥启封输入消息。
AccessPolicy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All|
FeatureEnabte.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actions(动作)
BoundPkUnseal操作必须实现下列步骤:
1.SSP测试在pk-sealed-blob中的Algorithmldentifier是否为sspV1BoundKey。
2.SSP依据在PKCS#1 V2.1中规定的RSAES-OAEP-DECRYPT的缺省实现内部地解密SealedBlob,以获得明文消息M。
3.如果译码操作的输出为“译码错误”,则返回SSP_CRYPTO_ERROR,且Secret设置为0。
4.否则,恢复的消息M应当是利用BoundSignKey类型的Bound-key-blob形式的DER编码。如果不是,则SSP应当发出SSP_CRYPTO_ERROR。
5.如果bound-to-PCR为真,则应当把bound-to与当前PCR值进行比较。如果值不相同,则SSP应当输出SSP_CRYPTO_ERROR。
6.SSP使用边界密钥块重新创建私有密钥。能够如以上在BoundQuote操作中讨论的那样恢复私有密钥。它然后通过使用在PK_Unseal命令中描述的步骤使用所恢复的私有边界密钥以启封pk-sealed-blob。
7.如果在启封的块中定义的PCR与当前PCR不匹配,则SSP返回SSP_CRYPTO_ERROR。
8.否则,SSP设置d-blob为M。
9.返回SSP_SUCCESS。
GenBoundKev
Definition(定义)
SSP_STATUS GenBoundKey(
[in] BoundKeyType KeyType,
[in] BOOL BoundToPcr,
[in] DIGEST BoundTo[2],
[in] BOOL migrateable,
[in] DIGEST migrationAuthority,
[in] BOOL exportable,
[in] DIGEST exportAuthority,
[in] DIGEST SigNonce,
[out] BoundKey bound-key,
[out] PKPublickey newPubKey,
[out] PKSignature boundKeyQuoteBlob
)
Parameters(参数)
GenBoundKey-Input∷={
ordinal INTEGER,
key-type Bound-key-type,
bound-to-pcr BOOL,
bound-to DigestPair,
migrateable BOOL,
exportable BOOL,
export-auth Digest,
sig-nonce Digest
}
GenBoundKey-output∷={
ordinal INTEGER,
status INTEGER,
bound-blob PKCiphertext,
bound-pub RSAPublicKey,
sig-blob PKSignature}
Return Values(返回值)
SSP_SUCCESS
SSP_ BAD_DATA_ERROR
Comments(注释)
GenBoundKey操作使SSP生成一个包含最新生成的私有密钥的新的bound-keyblob(边界密钥块)。用SSP自己的公用密钥对边界密钥块进行加密。
GenBoundKey还输出最新生成的密钥对中的公用密钥、指示SSP生成密钥的quote-signature(摘引签名)、它的特性、和在生成密钥时的PCR值。
GenBoundKey的调用者还指示将被创建的bound-key类型:它是否用于签名、摘引、用BoundPkUnseal启封、或者用BoundPkDecrypt解密。调用者还指定边界密钥是否应当被绑定到PCR上,而且如果是这样的话,还指定它要被绑定到的PCR值。
Access Policy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey=All|
FearureEnabIe.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actions(动作)
GenBoundKey操作实现下列动作:
1.SSP生成新的公用/私有RSA密钥对。当SSP空闲时,SSP能够有选择性地生成密钥对,并且在非易失性存储器中存储一个小的密钥高速缓存用于快速检索。
2.SSP内部地生成一个包含了最新生成的私有密钥和由调用者提供的边界密钥类型及其它参数的边界密钥结构。
3.SSP用平台公用加密密钥加密边界密钥块。
4.SSP生成包含最新创建的密钥的属性、在密钥生成和提供时的PCR值的bound-key-pub-info的签名块。
5.SSP输出加密的边界密钥块、最新生成的公用密钥、和摘引密钥块。
6.返回SSP_SUCCESS。
BoundKevMigrate
Definition(定义)
SSP_STATUS BoundKeyMigrate(
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BOUND_MIGRATION_INFO MigrationInfo,
[in] RSA_SIG SigOnMigrationInfo
)
Parameters(参数)
GenBoundKey-Input∷={
ordinal INTEGER,
migration-info Bound-migration-info,
migration-pubkey RSAPublicKey,
migration-auth PKSignature
}
GenBoundKey-output∷={
ordinal INTEGER,
status INTEGER,
re-bound-blob PKCiphertext,
}
RetumValues(返回值)
SSP_SUCCESS
SSP_BAD_DATA_ERROR
Comments(注释)
BoundKeyMigrate操作指示SSP以受控制的方式把密钥重新绑定到一个不同的PCR值上。本地或者远程的初始密钥创建者指定迁移授权实体。只有标记为migrateable的边界密钥才能够被迁移,而且如果SSP具有一个适当签名的Boundmigration-info结构,则只有这些密钥将被迁移。适当签名是指用其摘要被包含在边界密钥块之内的公用密钥进行签名。其它边界密钥属性没有改变。
AccessPolicy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey=All|
FeatureEnable.UsePrivKey=AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actions(动作)
BoundKeyMigrate操作实现下列动作:
1.SSP内部地解密bound-key(边界密钥)结构,并且把它解释为Bound-key-blob。如果译码失败了,则SSP返回SSP_CRYPTO_ERROR。
2.SSP验证Bound-export-info引用相同的密钥、签名是正确形成的、以及签名人的公用密钥的摘要如在Bound-key-blob的“migrateable”字段中指定的那样。
3.SSP检查密钥是migrateable(可迁移的)。如果不是,则SSP返回SSP_CRYPO_ERROR。
4.如果密钥被绑定到一个PCR上,则SSP检查当前PCR是在key-blob中定义的那个。
5.SSP用在Bound-migration-info的dest-PCR字段中定义的那个代替PCR值。
6.SSP重新加密bound-key-blob,并且输出重新加密的结构。
7.返回SSP_SUCCESS。
BoundKeyExport
Definition(定义)
SSP_STATUS BoundKeyExport(
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BOUND_EXPORT_INFO Exportlnfo,
[in] RSA_SIG SigOnExportlnfoInfo,
[out] PKCipherText ReBoundBlob
}
Parameters(参数)
BoundKeyExport-Input∷={
ordinal INTEGER,
bound-key PKCipherText,
bound-pub-hey RSAPublicKey,
export-info Bound-export-info
export-auth PKSignature,
}
GenBoundKey-output∷={
ordinal INTEGER,
status INTEGER,
re-bound-blob PKCiphertext,
}
Return Values(返回值)
SSP_SUCCESS
SSP_BAD_DATA_ERROR
Comments(注释)
BoundKeyExport操作指示SSP以受控制的方式在电源设备上以与边界密钥一致的格式把边界密钥的私有部分输出到一远程实体。本地或者远程的初始密钥创建者指定export-authorization(输出授权)实体。只有标记为exportable的边界密钥才能够被输出,而且如果SSP具有一个适当签名的Bound-export-info结构,则只有这些密钥将被输出。适当签名是指用其摘要被包含在初始的边界密钥块之内的公用密钥进行签名。BoundKeyExport允许适当授权的调用者指定公用密钥和密钥应当被重新绑定到的目标实体的PCR值。对外部实体是SSP没有特定要求,都是最新的边界块遵循bound-key约定以允许远程SSP直接使用输出的边界密钥。
Access Policy(访问策略)
Allowed=FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey=All|
FeatureEnable.UsePrivKey=AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
Actions(动作)
BoundKeyExport操作实现下列动作:
1.SSP内部地解密bound-key结构,并且把它解释为Bound-key-blob。如果译码失败了,则SSP返回SSP_CRYPTO_ERROR。
2.SSP验证Bound-export-info引用相同的密钥、签名是正确形成的、以及签名人的公用密钥的摘要如在Bound-key-blob的“export”字段中指定的那样。
3.SSP检查密钥是exportable(可输出的)。如果不是,则SSP返回SSP_CRYPO_ERROR。
4.如果密钥被绑定到一个PCR上,则SSP检查当前PCR是在key-blob中定义的那个。
5.SSP内部地生成一个包含了来自初始bound-key-blob结构的参数和在Bound-export-info中提供的新PCR值的新的bound-key-blob结构。所有其它参数保存相同。
6.SSP用在Bound-export-info中提供的公用加密密钥加密新的bound-key-blob。
7.输出最新的边界密钥。
8.返回SSP_SUCCESS。
General Computer Environment(通用计算机环境)
图12说明了一个通用计算机环境400,其能够被用于实现在此描述的技术。计算机环境400仅仅是计算环境的一个例子,而且不打算提出任何关于计算机和网络体系结构的使用范围或功能的极限。计算机环境400不应当被解释为具有与在示范性计算机环境400中举例说明的任何一个组件或其组合有关的任何相关性或者要求。
计算机环境400包含以计算机402形式的通用计算设备。例如,计算机402能够被用来实现图1中的委托人102和防护装置104、或者图2中的层。计算机402的部件能够包含,但不局限于,一个或者更多的处理器或者处理单元404(可选地包含一个或者更多的安全处理器或者协处理器(诸如SSP)及/或一个或者更多的加密处理器或者协处理器)、一个系统存储器406、以及把包含处理器404的各个系统部件连接到系统存储器406的系统总线408。
系统总线408代表几种类型总线结构中任意的一个或者多个,这些总线结构包含存储器总线或者存储器控制器、外围总线、加速图形端口、以及使用多种总线结构中任意一种的处理器或者局部总线。举例来说,这样的结构能够包含Industry StandardArchitecture(ISA)总线、Micro Channel Architecture(MCA)总线、Enhanced ISA(EISA)总线、以及也被称为Mezzanine总线的Peripheral Component Interconnects(PCI)总线
计算机402一般包含多个计算机可读介质。这样的介质能够是可由计算机402访问的任何可得到介质,并且包含易失生和非易失性介质、可移动和不可移动介质。
系统存储器406包含以易失性存储器形式、诸如随机访问存储器(RAM)410,及/或非易失性存储器形式、诸如只读存储器(ROM)412的计算机可读介质。一个基本输入输出系统(BIOS)414被存储在ROM412中,BIOS包含在启动期间帮助在计算机402内的各个单元之间传输信息的基本例程。RAM410一般包含由处理单元404立即访问及/或当前由其操作的数据及/或程序。
计算机402还可以包含其它可移动的/固定的、易失性/非易失性的计算机存储介质。举例来说,图12说明了一个用于从固定、非易失性磁介质(未显示)中读取和写入到其中的硬盘驱动器416、一个用于从一个可移动、非易失性磁盘420(例如,“软盘”)中读取和写入到其中的磁盘驱动器418、以及一个用于从一个诸如CD-ROM、DVD-ROM、或者其它光介质的可移动、非易失性光盘424中读取和/或写入到其中的光盘驱动器422。硬盘驱动器416、磁盘驱动器418、和光盘驱动器422每个都通过一个或多个数据介质接口426连接到系统总线408。做为选择,硬盘驱动器416、磁盘驱动器418、和光盘驱动器422能够通过一个或多个接口(未显示)连接到系统总线408。
这些磁盘驱动器以及它们的相关计算机可读介质为计算机402提供了计算机可读指令、数据结构、程序模块、及其它数据的的非易失性存储。虽然该示例说明了硬盘416、可移动磁盘420、以及可移动光盘424,将要理解:能够存储可由一台计算机访问的数据的其它类型的计算机可读介质,诸如磁带或者其它磁存储设备、快擦写存储卡、CD-ROM、数字通用磁盘(DVD)或者其他的光存储器、随机访问存储器(RAM)、只读存储器(ROM)、电可擦可编程只读存储器(EEPROM)、等等,也能够被用来实现该示范性的计算系统和环境。
能够把任意数目的程序模块存储在硬盘416、磁盘420、光盘424、ROM 412、和/或RAM 410上,该程序模块包含例如操作系统426、一个或多个应用程序428、其它程序机模块430、和程序数据432。这种操作系统426、一个或多个应用程序428、其它程序模块430、和程序数据432中的每一个(或者它们的某些组合)可以实现支持分布式文件系统的所有或者部分的常驻组件。
用户能够经由输入设备诸如键盘434和指示设备436(例如“鼠标”)输入命令和信息到计算机402中。其它输入设备438(未具体显示)可以包含麦克风、操纵杆、游戏垫、卫星反射器、串行端口、扫描仪、和/或类型设备。这些及其它输入设备经由与系统总线408相连的输入/输出接口440连接到处理单元404,但是也可以通过其它接口和总线结构、诸如并行端口、游戏端口、或者通用串行总线(USB)连接。
此外,一个监视器442或其它类型的显示设备能够经由一个接口、诸如视频适配器444连接到系统总线408。除了监控器442之外,其它输出外围设备能够包含诸如扬声器(未显示)和打印机446之类的、能够经由输入/输出接口440连接到计算机402的组件。
计算机402能够在使用到一个或多个远程计算机、诸如远程计算设备448的逻辑连接联网的环境下操作。举例来说,远程计算设备448能够是个人计算机、便携式计算机、服务器、路由器、网络计算机、监视设备或者其它公用网络节点等。远程计算设备448被举例说明为一个便携式计算机,它能够包含在此关于计算机402描述的许多或者所有元件和特征。
在计算机402和远程计算机448之间的逻辑连接被描述为局域网(LAN)450和普通广域网(WAN)452。这种联网环境在办公室、企业范围的计算机网络、企业内部局域网和Internet中是很平常的。
当在LAN联网环境中实现时,计算机402经由网络接口或者适配器454连接到局域网络450。当在WAN联网环境中实现时,计算机402通常包含调制解调器456或者其它用于在广域网上建立通讯的装置。调制解调器456能够经由输入/输出接口440或者其它适当机构连接到系统总线408,其中调制解调器456能够在计算机402的内部或外部。应当理解,举例说明的网络连接是示范性的,而且能够使用在计算机402和448之间建立通讯的其它装置。
在联网环境、诸如用计算环境400举例说明的环境中,关于计算机402描述的程序模块或者它的部分可以被保存在一个远程存储设备中。举例来说,远程应用程序458驻留在远程计算机448的一个存储设备上。为了举例说明起见,尽管应用程序及其它可执行程序组件诸如操作系统在此被举例说明为离散程序块,但是应当认识到,这种程序和组件在不同时间驻留在计算设备402的不同存储部件中,并且由计算机的数据处理器来执行。
在此在由一个或多个计算机或者其它设备执行的计算机可执行指令、诸如程序模块的总体环境中描述了各种模块和技术。通常,程序模块包含执行特定任务或者实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。典型地,可以依照要求在各个实施例中组合或者分配程序模块的功能。
这些模块和技术的实现可以被存储在某种形式的计算机可读介质上或者在其上进行传输。计算机可读介质能够是任何可用的、能够由计算机访问的介质。例如,而不是限制,计算机可读介质可以包含“计算机存储介质”和“通信介质”。
“计算机存储介质”包含以任何用于存储信息、诸如计算机可读指令、数据结构、程序模块或者其它数据的方法或者技术实现的易失性和非易失生的、可移动的和固定的介质。计算机存储介质包含但不局限于:RAM、ROM、EEPROM、闪速存储器或者其它存储器技术、CD-ROM、数字通用磁盘(DVD)或者其它光存储器、磁带盒、磁带、磁盘存储器或者其它磁存储设备、或者任何其它能够被用来存储所希望的信息并且能够由计算机访问的介质。
“通信介质”通常体现为在已调制数据信号、诸如载波或者其它传送机构中的计算机可读指令、数据结构、程序模块、或者其它数据。通信介质还包含任何言息传送介质。术语“已调制数据信号”是指使一个或多个它的特性以这样一种方式设置或改变以编码在信号中的信息的信号。例如,而不是限制,通信介质包含诸如有线网或者直接有线连接的有线媒介、和诸如声学、RF、红外、及其它无线媒介的无线媒介。以上任何一个的组合也被包含在计算机可读介质的范围之内。
尽管以上的描述使用了对结构特征和/或方法作用来说特定的语言,但是应当理解,在附加权利要求中定义的本发明不局限于描述的该特定特征或者作用相反地,该特定特征和作用被公开作为实现本发明的示范性形式。