一种设备标识组合引擎的实现方法及装置转让专利

申请号 : CN201811180538.X

文献号 : CN109492352B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 蔡恒殷鑫

申请人 : 华为技术有限公司

摘要 :

本申请公开了一种设备标识组合引擎的实现方法及装置,涉及信息技术领域,能够解决芯片的可信启动过程中UDS容易泄露和访问该UDS的纯软件代码复杂化的问题。该DICE包括唯一设备秘密UDS的硬连接输入接口、选择器、单向函数计算器、第一可读写寄存器以及第二可读写寄存器。第一可读写寄存器,用于存储单向函数计算器的一路输入参数;单向函数计算器,用于根据该输入参数和UDS的硬连接输入接口通过选择器输入的芯片对应的UDS计算得到输出参数;第二可读写寄存器,用于保存单向函数计算器的输出参数;选择器,用于在向函数计算器获取输出参数之后,断开与UDS的硬连接输入接口的连接。本申请实施例用于设备可信启动的证书链生成过程。

权利要求 :

1.一种芯片,其特征在于,所述芯片包括核、闪存以及设备标识组合引擎DICE,所述闪存内存储有至少一级非固化软件代码,所述DICE包括唯一设备秘密UDS的硬连接输入接口、选择器、单向函数计算器、第一可读写寄存器以及第二可读写寄存器,其中:所述第一可读写寄存器,用于存储供所述单向函数计算器访问的一路输入参数,所述输入参数用于指示待执行的下一级非固化软件代码的摘要;

单向函数计算器,用于在所述核执行第一级非固化软件代码之前,根据所述第一可读写寄存器存储的所述输入参数和所述UDS的硬连接输入接口通过所述选择器输入的所述芯片对应的UDS获取输出参数;

所述第二可读写寄存器,用于保存所述单向函数计算器输出的所述输出参数;

所述选择器,用于在所述单向函数计算器获取所述输出参数之后,断开与所述UDS的硬连接输入接口的连接。

2.根据权利要求1所述的芯片,其特征在于,所述选择器的输出端与所述单向函数计算器的第一输入端连接,所述第一可读写寄存器的输出端与所述单向函数计算器的第二输入端连接,所述第二可读写寄存器的输入端与所述单向函数计算器的第一输出端连接;在所述选择器断开与所述UDS的硬连接输入接口的连接之前,所述选择器的第一输入端与所述UDS的硬连接输入接口连接;

所述选择器用于断开与所述UDS的硬连接输入接口的连接包括:所述选择器用于断开所述选择器的第一输入端与所述UDS的硬连接输入接口的连接;

所述选择器还用于在断开所述选择器的第一输入端与所述UDS的硬连接输入接口的连接之后,将所述选择器的第二输入端与所述第二可读写寄存器的输出端连接。

3.根据权利要求2所述的芯片,其特征在于,还包括锁存器,所述锁存器的输入端与所述单向函数计算器的第二输出端连接,所述锁存器的输出端与所述选择器的第三输入端连接;

所述锁存器,用于接收所述单向函数计算器发送的触发信号,所述触发信号用于指示所述选择器断开与所述UDS的硬连接输入接口的连接;将所述触发信号发送至所述选择器;

所述选择器,用于根据所述锁存器发送的所述触发信号确定所述单向函数计算器已获取所述输出参数,触发所述选择器断开所述选择器的所述第一输入端与所述UDS的硬连接输入接口的连接。

4.根据权利要求1-3任一项所述的芯片,其特征在于,所述单向函数计算器还用于:在所述核执行任一级非固化软件代码时,根据所述第一可读写寄存器存储的所述任一级非固化软件代码的下一级非固化软件代码的摘要和所述第二可读写寄存器前一次存储的所述输出参数获取当前计算的所述输出参数。

5.根据权利要求1-3任一项所述的芯片,其特征在于,所述非固化软件代码的代码内容可变;

所述摘要为对所述任一级非固化软件代码进行度量得到的数据。

6.一种服务器,其特征在于,所述服务器包括如权利要求1-5任一项所述的芯片。

7.一种设备标识组合引擎DICE的实现方法,其特征在于,应用于芯片,所述芯片包括核、闪存以及设备标识组合引擎DICE,所述闪存内存储有至少一级非固化软件代码,所述DICE包括唯一设备秘密UDS的硬连接输入接口、选择器、单向函数计算器、第一可读写寄存器以及第二可读写寄存器,所述方法包括:所述芯片控制所述单向函数计算器根据所述芯片对应的UDS与所述第一可读写寄存器内存储的所述输入参数获取所述单向函数计算器的输出参数,所述UDS是通过所述UDS的硬连接输入接口通过所述选择器输入至所述单向函数计算器的,所述输入参数用于指示待执行的下一级非固化软件代码的摘要,所述输出参数存储于所述第二可读写寄存器;

在所述芯片获取到所述单向函数计算器的所述输出参数之后,所述芯片控制所述选择器断开与所述UDS的硬连接输入接口的连接。

8.根据权利要求7所述的方法,其特征在于,所述选择器的输出端与所述单向函数计算器的第一输入端连接,所述第一可读写寄存器的输出端与所述单向函数计算器的第二输入端连接,所述第二可读写寄存器的输入端与所述单向函数计算器的第一输出端连接;在所述选择器断开与所述UDS的硬连接输入接口的连接之前,所述选择器的第一输入端与所述UDS的硬连接输入接口连接;

所述芯片控制所述选择器断开与所述UDS的硬连接输入接口的连接包括:

所述芯片控制所述选择器断开所述选择器的第一输入端与所述UDS的硬连接输入接口的连接;

所述方法还包括:

在所述选择器的第一输入端断开与所述UDS的硬连接输入接口的连接之后,所述芯片控制所述选择器的第二输入端与所述第二可读写寄存器的输出端连接。

9.根据权利要求7或8所述的方法,其特征在于,所述芯片还包括锁存器,所述锁存器的输入端与所述单向函数计算器的第二输出端连接,所述锁存器的输出端与所述选择器的第三输入端连接;

在所述芯片控制所述选择器断开所述选择器的第一输入端与所述UDS的硬连接输入接口的连接之前,所述方法还包括:所述芯片控制所述单向函数计算器通过所述锁存器向所述选择器发送触发信号,所述触发信号用于指示所述选择器断开与所述UDS的硬连接输入接口的连接。

10.根据权利要求7或8所述的方法,其特征在于,所述方法还包括:

在所述芯片执行所述芯片内存储的任一级非固化软件代码时,控制所述单向函数计算器根据所述第一可读写寄存器的所述输入参数与所述第二可读写寄存器前一次存储的输出参数获取当前计算的所述输出参数,将所述当前计算的所述输出参数存储在所述第二可读写寄存器中。

11.一种计算机存储介质,用于储存为上述芯片所用的计算机软件指令,所述计算机软件指令包含用于执行如权利要求7-10任一项所述的方法。

说明书 :

一种设备标识组合引擎的实现方法及装置

技术领域

[0001] 本申请涉及信息技术(Information Technology,IT)领域,尤其涉及一种设备标识组合引擎(Device Identifier Composition Engine,DICE)的实现方法及装置。

背景技术

[0002] 芯片已经渗透到人们生活中的方方面面,从日常生活到工业生产环境、数据中心,芯片都承接着隐私数据处理或是提供智能控制服务等业务。芯片上运行的固件的安全性直接决定了芯片系统的安全性,芯片固件的不安全隐患将直接带来用户数据的不安全,造成用户数字资产的损失或是直接带来经济损失。因此芯片固件的安全越发受到人们重视。
[0003] 芯片固件安全有两种基础措施:安全启动、可信启动。前者,确保芯片上运行的固件是满足安全校验的;后者,提供芯片上运行固件信息的可信证明。对于可信启动,芯片真实的记录了其运行的代码或是运行过的前级代码(引导代码)的版本信息,通常用记录哈希(hash)值的方式,同时提供可信的不可仿冒的证明。可信计算组织(Trusted Computing Group,TCG)组织发布了DICE规范,探索基于DICE的系统和组件的新安全和隐私技术,目标是开发新的方法,以最小的芯片要求来提高安全性和隐私性。即使简单的芯片功能与软件技术相结合,也可以建立强大的密码设备身份,证明软件和安全策略,并协助安全地部署和验证软件更新。该DICE技术为可信计算的技术,使芯片+固件具备设备组合身份,即芯片身份+固件身份,通过设备组合身份能够证明设备的真实性和设备上运行固件的真实性。DICE技术可采用纯软件代码实现或纯软件代码加通用硬件加速引擎实现,例如该纯软件代码可以通过芯片的身份即芯片的唯一设备秘密(Unique Device Secret,UDS)与该芯片中的固件身份,即固件hash值组合成设备组合身份来证明芯片的真实性和芯片上运行的固件的真实性。但是,UDS能够被纯软件代码访问时,该纯软件代码的漏洞将危害UDS的泄露,虽然该纯软件代码能够限制后续代码对UDS的访问,但是需要该纯软件代码设置读锁定寄存器以及清理UDS使用之后的内存残留,使得该纯软件代码复杂化。

发明内容

[0004] 本申请实施例提供一种DICE的实现方法及装置,能够解决芯片的可信启动过程中UDS容易泄露和访问该UDS的纯软件代码复杂化的问题。
[0005] 第一方面,提供一种芯片,芯片包括核(core)、闪存以及DICE,核例如是中央处理器(central processing unit,CPU)的核,即,算术逻辑运算单元(arithmetic logic unit,ALU),该核用于运行该芯片的存储器中存储的指令以及处理该芯片的软件中的数据等;闪存内存储有至少一级非固化软件代码,非固化软件代码的代码内容可变;DICE包括唯一设备秘密UDS的硬连接输入接口、选择器、单向函数计算器、第一可读写寄存器以及第二可读写寄存器,其中:第一可读写寄存器,用于存储供单向函数计算器访问的一路输入参数,该输入参数可以为参数内容本身,或为参数的指示信息,该指示信息用于指示该参数所存储的位置和大小,输入参数包括待执行的下一级非固化软件代码的摘要;摘要为对任一级非固化软件代码进行度量得到的结果。单向函数计算器,用于在核执行第一级非固化软件代码之前,根据第一可读写寄存器存储的输入参数和UDS的硬连接输入接口通过选择器输入的芯片对应的UDS获取输出参数;第二可读写寄存器,用于保存单向函数计算器的输出参数;选择器,用于在单向函数计算器获取输出参数之后,断开与UDS的硬连接输入接口的连接,这样一来,可使得UDS不能被访问,实现了硬件锁定对UDS的访问,限制UDS只能被访问一次。由于本申请可以实现对UDS的硬件锁定,不需要软件代码参与对UDS的锁定,那么本申请相对于现有技术来说,对于软件代码的设计,不需要该软件代码设置相应的读锁定寄存器,也不需要在UDS使用完后运行该软件代码进行相应的内存残留清理动作,这种采用本申请设计的DICE硬件能够简化该软件代码的开发,降低该软件代码的复杂度。
[0006] 在一种可能的设计中,选择器的输出端与单向函数计算器的第一输入端连接,第一可读写寄存器的输出端与单向函数计算器的第二输入端连接,第二可读写寄存器的输入端与单向函数计算器的第一输出端连接;在选择器断开与UDS的硬连接输入接口的连接之前,选择器的第一输入端与UDS的硬连接输入接口连接;选择器用于断开与UDS的硬连接输入接口的连接包括:选择器用于断开选择器的第一输入端与UDS的硬连接输入接口的连接;选择器还用于在断开选择器的第一输入端与UDS的硬连接输入接口的连接之后,将选择器的第二输入端与第二可读写寄存器的输出端连接。于是,在选择器的第一输入端断开与UDS的硬连接输入接口的连接后,便不能通过UDS的硬连接输入接口输入UDS,可使得UDS通过UDS的硬连接输入接口只能向单向函数计算器输入一次,即UDS只能被访问一次,可避免UDS泄露。
[0007] 在一种可能的设计中,该芯片还包括锁存器,锁存器的输入端与单向函数计算器的第二输出端连接,锁存器的输出端与选择器的第三输入端连接;锁存器,用于接收单向函数计算器发送的触发信号,触发信号用于指示选择器断开与UDS的硬连接输入接口的连接;将触发信号发送至选择器;选择器,用于根据锁存器发送的触发信号确定单向函数计算器已获取输出参数,触发选择器的第一输入端断开与UDS的硬连接输入接口的连接。由于锁存器可发出指示选择器的状态发生一直锁定的触发信号,那么当选择器接收到锁存器发送的触发信号时,选择器的第一输入端与UDS的硬连接输入接口一直保持断开状态,直至芯片下一次复位运行时再重新连接上,这样在芯片复位运行期间,UDS在被访问一次后,其它软件便不能再访问到该UDS,避免了UDS的泄露。
[0008] 在一种可能的设计中,单向函数计算器还用于:在核执行任一级非固化软件代码时,根据第一可读写寄存器存储的任一级非固化软件代码的下一级非固化软件代码的摘要和第二可读写寄存器前一次存储的输出参数获取当前计算的输出参数。也就是说,该DICE的单向函数计算器生成的计算结果可通过第二可读写寄存器供下一级非固化软件代码访问,不需要代码层级之间通过其他存储介质,例如不需要通过芯片的Flash传递该计算结果,即计算结果直接以专用寄存器传递,这样各代码层级的开发也可得到简化。
[0009] 在一种可能的设计中,第二可读写寄存器还用于:在每次对输出参数进行保存时,将单向函数计算器当前获取的输出参数替换前一次获取的输出参数。这样一来,在执行下一级代码进行单向函数计算时,上一级代码进行单向函数计算后保存在第二可读写寄存器中的输出参数会被下一级代码进行单向函数计算新生成的输出参数覆盖,使得上一次保存的输出参数被自动清除,将新生成的输出参数存放在第二可读写寄存器中,这样可使得每一级代码只需要通过第二可读写寄存器传递输出参数给下一级代码,每一级代码的代码开发得到简化。
[0010] 在一种可能的设计中,该芯片还包括:UDS的硬连接输入寄存器、复位接口、计算启动驱动接口、计算完成驱动接口、时钟信号接口以及锁定状态接口;其中,UDS的硬连接输入寄存器,用于存储UDS,并通过UDS的硬连接输入接口向单向函数计算器输入UDS;复位接口,用于向单向函数计算器输入指示单向函数计算器复位运行的指令;计算启动驱动接口,用于向单向函数计算器输入上升沿指令,以触发单向函数计算器进行计算;计算完成驱动接口,用于在单向函数计算器计算完成时置位,以指示单向函数计算器计算完成;锁定状态接口,用于输出第一指示,第一指示用于指示选择器的输入端已切换完成;时钟信号接口,用于向单向函数计算器输入时钟信号。当软件调用该DICE进行单向函数计算时,该软件可通过计算启动驱动接口触发DICE进行一次DICE计算,通过计算完成驱动接口发送的指示获知一次计算完成,通过锁定状态接口发送的指示获知选择器的输入端切换完成,这样一来,该软件代码可及时获知DICE的执行动作。
[0011] 在一种可能的设计中,锁存器的输入端与单向函数计算器的第二输出端连接;锁存器的第一输出端与选择器的第三输入端连接;锁存器的第二输出端与锁定状态接口连接;单向函数计算器的第二输出端与锁存器的输入端连接;单向函数计算器的第三输出端与计算完成驱动接口连接;单向函数计算器的第三输入端与时钟信号接口连接;单向函数计算器的第四输入端与复位接口连接;单向函数计算器的第五输入端与计算启动驱动接口连接。由于锁存器与单向函数计算器和选择器都连接,当单向函数计算器使用UDS获取输出参数时,锁存器可根据单向函数计算器的指示触发选择器与UDS的硬件输入接口断开连接,限制对UDS的访问,避免UDS的泄露。
[0012] 第二方面,提供一种服务器,服务器包括如第一方面或第一方面的任一种可能的设计中所设计的芯片。
[0013] 第三方面,提供一种DICE的实现方法,应用于芯片,芯片包括核、闪存以及设备标识组合引擎DICE,闪存内存储有至少一级非固化软件代码,DICE包括唯一设备秘密UDS的硬连接输入接口、选择器、单向函数计算器、第一可读写寄存器以及第二可读写寄存器,该方法包括:芯片控制单向函数计算器根据芯片对应的UDS与第一可读写寄存器内存储的输入参数获取单向函数计算器的输出参数,该输入参数可以为参数内容本身,或为参数的指示信息,该指示信息用于指示该参数所存储的位置和大小,UDS是通过UDS的硬连接输入接口通过选择器输入单向函数计算器的,输入参数用于指示待执行的下一级非固化软件代码的摘要,输出参数存储于第二可读写寄存器;在该芯片获取到单向函数计算器的输出参数之后,该芯片控制选择器断开与UDS的硬连接输入接口的连接。虽然该方法步骤以芯片为执行主体进行说明,但是具体执行过程可以由该芯片中的具体组件来执行,因此,可选的,所述方法中,所述单向函数计算器根据芯片对应的UDS与第一可读写寄存器内存储的输入参数获取单向函数计算器的输出参数;在单向函数计算器获取该输出参数之后,单向函数计算器通过选择器触发选择器断开与UDS的硬连接输入接口的连接。这样,当UDS的硬连接输入接口断开与选择器的连接时,便不能通过该UDS的硬连接输入接口与选择器向单向函数计算器输入UDS,UDS只能被访问一次,避免了UDS的泄露,相较于现有技术,不需要软件代码参与对UDS设置读锁定寄存器以及清理UDS使用之后的内存残留,使得该软件代码的开发得到简化。
[0014] 在一种可能的设计中,选择器的输出端与单向函数计算器的第一输入端连接,第一可读写寄存器的输出端与单向函数计算器的第二输入端连接,第二可读写寄存器的输入端与单向函数计算器的第一输出端连接;在选择器断开与UDS的硬连接输入接口的连接之前,选择器的第一输入端与UDS的硬连接输入接口连接。芯片控制选择器断开与UDS的硬连接输入接口的连接包括:芯片控制选择器断开选择器的第一输入端与UDS的硬连接输入接口的连接。可选的,芯片控制选择器断开与UDS的硬连接输入接口的连接可以通过选择器断开选择器的第一输入端与UDS的硬连接输入接口的连接来实现。该方法还包括:在选择器的第一输入端断开与UDS的硬连接输入接口的连接之后,芯片控制选择器的第二输入端与第二可读写寄存器的输出端连接。可选的,所述芯片控制选择器的第二输入端与第二可读写寄存器的输出端连接”可通过选择器将选择器的第二输入端与第二可读写寄存器的输出端连接的来实现。这样一来,在实现UDS的硬件锁定的同时,可使得各代码层级通过可读写寄存器传递单向函数计算器的输出参数,各代码层级的代码开发得到简化。
[0015] 在一种可能的设计中,芯片还包括锁存器,锁存器的输入端与单向函数计算器的第二输出端连接,锁存器的输出端与选择器的第三输入端连接;在控制选择器断开选择器的第一输入端与UDS的硬连接输入接口的连接之前,该方法还包括:芯片控制单向函数计算器通过锁存器向选择器发送触发信号,触发信号用于指示选择器断开与UDS的硬连接输入接口的连接。可选的,所述芯片控制单向函数计算器通过锁存器向选择器发送触发信号”可通过单向函数计算器通过锁存器向选择器发送触发信号来实现。这样一旦单向函数访问该UDS并参与计算完成后,就可限制其余代码对UDS的访问,使得锁存器锁定选择器一直保持与UDS的硬连接输入接口的断开状态,直至芯片下一次复位运行时再连接上。
[0016] 在一种可能的设计中,该方法还包括:在芯片执行芯片内存储的任一级非固化软件代码时,控制单向函数计算器根据第一可读写寄存器的输入参数与第二可读写寄存器前一次存储的输出参数获取当前计算的输出参数,并将当前计算的输出参数替换第二可读写寄存器前一次存储的输出参数保存在第二可读写寄存器中。可选的,所述方法中,在执行芯片内存储的任一级非固化软件代码时,单向函数计算器根据第一可读写寄存器的输入参数与第二可读写寄存器前一次存储的输出参数获取当前计算的输出参数,第二可读写寄存器将当前计算的输出参数替换第二可读写寄存器前一次存储的输出参数保存在第二可读写寄存器中。也就是说,该DICE的单向函数计算器生成的计算结果可通过第二可读写寄存器供软件访问,不需要代码层级之间通过其他存储介质,例如不需要通过Flash传递该计算结果,即计算结果直接以专用寄存器传递,这样各代码层级的开发也可得到简化。另外,在执行下一级代码进行单向函数计算时,上一级代码进行单向函数计算后保存在第二可读写寄存器中的输出参数会被下一级代码进行单向函数计算新生成的输出参数覆盖,使得上一次保存的输出参数被自动清除,将新生成的输出参数存放在第二可读写寄存器中,这样可使得每一级代码只需要通过第二可读写寄存器传递输出参数给下一级代码,每一级代码的代码开发进一步得到简化。
[0017] 第四方面,本申请实施例提供了一种计算机存储介质,用于储存为上述芯片或上述服务器所用的计算机软件指令,其包含用于执行上述第三方面所设计的程序。
[0018] 第五方面,本申请实施例提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第三方面所述的方法。
[0019] 通过上述各方面的阐述,可知,本申请可不需要软件代码的参与就可实现对UDS访问的限制,使得UDS只能被访问一次,有效防止UDS的泄露,同时降低了该软件代码的复杂度。

附图说明

[0020] 图1为一种BMC芯片进行DICE计算的示意图;
[0021] 图2为一种基于DICE的可信启动过程的示意图;
[0022] 图3为一种基于DICE的证书链生成过程的示意图;
[0023] 图4为本申请实施例提供的一种服务器中BMC芯片与服务器主板上其他部件的连接关系示意图;
[0024] 图5为本申请实施例提供的一种BMC芯片的硬件结构的示意图;
[0025] 图6为本申请实施例提供的一种BMC芯片的软件结构的示意图;
[0026] 图7A为本申请实施例提供的一种DICE硬件的结构示意图;
[0027] 图7B为本申请实施例提供的一种DICE硬件的结构示意图;
[0028] 图7为本申请实施例提供的一种DICE硬件的结构示意图;
[0029] 图8为本申请实施例提供的一种BootROM代码的运行过程的示意图;
[0030] 图9为本申请实施例提供的一种BMC芯片对应的第一级非固化软件代码的执行流程示意图;
[0031] 图10为本申请实施例提供的一种服务器的结构示意图;
[0032] 图11为本申请实施例提供的一种终端设备的结构示意图;
[0033] 图12为本申请实施例提供的一种网络设备的结构示意图。

具体实施方式

[0034] 为了便于理解,示例地给出了部分与本申请相关概念的说明以供参考。如下所示:
[0035] 唯一设备秘密(Unique Device Secret,UDS):设备的一个秘密信息,为一段随机数,一旦初始化后,设备生命周期内不可更改;唯一设备秘密(必须)具有访问权限控制,仅支持DICE引擎访问,可升级代码不能读取到唯一设备秘密的值。UDS通常为安全芯片内的一次性可编程(One Time Programable,OTP)区存放的掉电非易失的随机数,UDS的随机性和长度影响DICE架构的安全性。
[0036] 设备组合身份(Compound Device Identifier,CDI)(K1):DICE将第一级可变代码的摘要和UDS做单向运算,可生成CDI,CDI通过指定存储位置传递给第一级可变代码,以执行第一级可变代码。
[0037] DICE:遵循TCG组织发布的DICE规范,实现CDI计算的软硬件引擎。
[0038] 度量(measurement):指对代码或是数据做杂凑运算或是类似秘钥算法的计算。其中杂凑运算可以是把任意长的输入消息串变化成固定长的输出串的一种函数,例如可以为哈希(hash)运算。
[0039] 摘要(digest):摘要是指一个度量的结果。在本申请实施例中,举例来说,可以借助通用计算硬件加速引擎或BootROM代码对第一段/第一级非固化软件代码进行度量,得到第一级可变/非固化的代码的摘要。
[0040] 重放攻击(replay attacks):又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗主机系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的攻击者进行。
[0041] 第一级非固化软件代码(Layer1 firmware,Layer1 FW):即安全芯片中的核(core)在安全芯片上电后开始执行的第一级非固化软件代码,该代码的内容能够被改写。这里的core为具有CPU功能的核。示例性的,根据代码命名习惯不同,可以将第一级非固化软件代码定义为Layer0 Firmware,即Layer0 FW,也可以将第一级非固化软件代码定义为Layer1Firmware,即Layer1 FW,本实施例仅以将第一级非固化软件代码定义为Layer1 FW为例进行说明。
[0042] 单向函数(One-way function):是一种具有下述特点的单向函数:对于函数的每一个输入,函数值都容易计算,但是给出一个随机输出的函数值,算出原始输入却比较困难。
[0043] 固件(firmware):可以有不同的定义,在计算机领域内的合理解释都适用于本申请。例如,可以有如下解释。以下解释仅为举例说明,而不应被认为是对本申请的技术方案的限定。固件可以被解释为:预安装到硬件产品内部的只读记忆体里面,与硬件产品捆绑匹配的程序。例如,计算机的基本输入输出系统(basic input output system,BIOS)即属于固件的一种。固件还可以被解释为:运行在“非控制处理器”中的程序,上述“非控制处理器”指不直接运行操作系统的处理器,例如外设中的处理器,上述“非控制处理器”也可以指被用于裸金属(bare metal)虚拟机系统的处理器中的一些核。固件应该也可以包涵一些不支持动态安装应用的操作系统和应用的可执行文件。本申请实施例中,固件可以为安全芯片中存储器保存的各级非固化软件代码,存储在安全芯片内Flash中。
[0044] 在本申请中,安全芯片指的是在启动时能够执行安全校验策略以验证外部固件的安全性的芯片,上述外部固件指的是存储在启动引擎之外的固件,该外部固件可以存储在芯片上的存储器中,也可以存储在芯片之外的存储器中。
[0045] 目前,可采用纯软件代码实现或纯软件代码加通用硬件加速引擎实现DICE计算,该纯软件代码为安全芯片上电后运行的首段代码,可以存储在只读存储器(Read-Only Memory,ROM)中,保证其不可改写。在运行完该首段代码之后,继而可运行第一级非固化软件代码。该首段代码可以为BootROM代码,BootROM代码实现DICE计算的流程与DICE标准流程一致:1)安全芯片复位后运行BootROM(L0)代码,执行对第一级非固化软件代码(L1)的度量,并获得第一级非固化软件代码的摘要,记为Hash(L1);2)BootROM代码将摘要和安全芯片内存中存储的UDS做单向计算(KDF运算),生成CDI,如图1所示在L1代码运行之前,先要通过公式K1=KDF(UDS,Hash(L1))计算得到CDI(K1);3)BootROM代码触发硬件机制限制对UDS的访问,相当于将访问UDS的通路断开,并且将内存中的任何UDS残留信息删除;4)BootROM代码将CDI传递给L1代码定义好的位置,并执行L1代码。而后执行L1代码,并通过K2=KDF(K1,Hash(L2))计算得到K2,将K2传递给L2代码定义好的位置,并执行L2代码。在该BootROM代码实现DICE计算的流程中,UDS能够被BootROM代码访问,但是BootROM代码的漏洞将危害UDS的泄露。况且,UDS对后续代码的访问限制需要软件参与实现,即需要BootROM代码设置相应的读锁定寄存器,且UDS使用完后需要BootROM代码做相应的内存残留清理动作,使得BootROM代码实现复杂化,容易有安全隐患。
[0046] 基于上述阐述的技术问题,本申请设计一种安全芯片,针对该安全芯片中的DICE硬件中的内部结构进行设计,采用硬连接输入UDS的方式使得UDS只能被DICE硬件访问,不需要软件从内存中读取UDS,访问完成后,DICE硬件自动锁定对UDS的访问。在一种可能的设计中,设计DICE的硬件结构时,可以将UDS采用UDS的硬连接输入接口通过选择器输入给使用UDS进行单向函数计算的计算模块,当UDS参与单向计算完成后,选择器便与UDS的硬连接输入接口断开,这里的选择器就相当于开关,当开关关闭时,UDS便不能被访问到,实现了硬件锁定对UDS的访问,限制UDS只能被访问一次。由于本申请可以实现对UDS的硬件锁定,不需要BootROM代码参与对UDS的锁定,即本申请相对于现有技术来说,对于BootROM代码的设计,不需要BootROM代码设置相应的读锁定寄存器,也不需要在UDS使用完后运行BootROM代码进行相应的内存残留清理动作,这种采用本申请设计的DICE硬件能够简化BootROM的代码开发,提高运算性能,降低软件设计风险。
[0047] 因此,本申请针对安全芯片中的DICE的内部结构以及BootROM代码进行设计,可应用于实现系统级芯片(System on Chip,SoC)上运行的固件的可信启动和计算CDI的过程中。
[0048] 可信启动用于真实不可仿冒的记录设备的启动信息,并且能够安全可信的提供真实启动信息的报告。在本申请实施例中,可信启动可以用于记录运行安全芯片内各级非固化软件代码时的启动信息,例如该启动信息可以包括各级非固化软件代码对应的Km,真实启动信息的报告可以包括运行各级非固化软件代码时生成的证书链。
[0049] 基于DICE的可信启动过程可以如图2所示。从BootROM代码运行开始,将下一级非固化软件代码和关键数据的摘要信息(图2中表示为Dm)与Km-1一起通过KDF函数组合到Km中,其中,Km表示第m层固件对应的K值,m为大于或等于0的正整数,UDS可表示为K0,计算方法为Km=KDF(Km-1,Dm)。这样在下一级非固化软件代码运行之前,下一级非固化软件代码的关键信息已经被记录在Km中了,而由于Km-1每次使用完后,在执行第m层代码前,会先删除Km-1的数据,每一级非固化软件代码都不能获知Km-1,所以不能获知正确的Km的值,因此无法仿冒Km的值,这样一旦某一级的代码被篡改,则Km的值将发生变化,后续的Km+1到Kn的值也都将发生变化。
[0050] 上述阐述的K值可以应用于基于DICE运行固件时生成证书链的过程中,该证书链则是为了证明设备上运行的固件安全可信。参考图3为基于DICE的证书链生成示意图。DICE架构中每一级代码都会生成下一级代码的固件证书,Layer1(L1)的证书由证书签发机构(Certification Authority,CA)签发,Layer m的证书由Layer(m-1)的代码用Layer(m-1)对应的私钥签发。而Layer m的公私钥都是由Layer m对应的Km派生出来的,其中Layer m的私钥为Km本身或是基于秘钥派生算法派生得到,比如采用哈希消息认证码(Hash-based Message Authentication Code,HMAC)算法,Layer m的公钥可通过对私钥调用椭圆曲线加密(Elliptic Curves Cryptography,ECC)算法计算得到。因此,当Layer(m-1)固件未被篡改,Layer m固件被篡改时,通过Layer m固件获取的Layer m的hash值(Dm)将发生变化,通过计算Km=KDF(Km-1,Dm)获取的Km的值也发生变化,Layer(m-1)可通过Km派生出Layer m的公私钥对,并用Layer(m-1)的私钥对Layer m公钥证书做签名,该公钥证书同时包含有篡改后的Layer m的公钥和Layer m的hash值,即使通过Layer m的公钥和hash值成功校验了该公钥证书,但是由于Layer m无法知道Layer(m-1)的签名私钥,因此无法仿冒Layer(m-1)签发给Layer m的证书。因此,基于DICE的可信启动的证书链真实的记录了设备启动的信息。
[0051] 由于BootROM的代码是固化在安全芯片内部,且由于ROM的一次性可编程特性,BootROM的代码是不可篡改的,因此保证了启动根的可信。Layer1代码的篡改意味着K1的变化,而派生出的公钥证书是需要CA签发的,因此,只要管控好CA签发Layer1的证书的安全性,攻击者对任何一级代码的篡改都能够被可信启动的证书链记录。
[0052] 下面对可信启动的证书链的具体生成流程进行说明,流程如下:
[0053] 步骤1、BootROM通过HMAC(UDS,Hash(Layer1))计算生成K1,并将K1传递给Layer1 FW;这里的HMAC可以为Hash算法,该hash算法比如可以为安全哈希算法(Secure Hash Algorithm,SHA)-256或其他单向函数计算。
[0054] 步骤2、Layer1 FW获取K1后,利用K1通过秘钥派生算法派生出私钥,并调用ECC算法根据私钥生成公钥,清除K1的值,其中K1等同于CDI。
[0055] 步骤3、Layer1 FW生成Layer1的自签名证书,该自签名证书为Layer1 FW用Layer1的私钥签名生成的证书,并将证书传递给下一级代码。需要说明的是,在设备装备或安全部署阶段,设备使用者通过设备提供的软件通信接口读取该自签名证书,并将该自签名证书提交给CA重新做签名后存入BMC芯片可访问的存储介质中,该存储介质可以为存储BMC芯片对应的各级的非固化软件代码的FLASH,该FLASH可以在BMC芯片内,也可以在BMC芯片外。该自签名证书即设备和Layer1 FW的组合身份证书。
[0056] 步骤4、Layer1 FW计算HMAC(K1,Hash(Layer2)),生成K2。
[0057] 步骤5、Layer1 FW通过K2派生出Layer2的公私钥对,并用Layer1的私钥对Layer2公钥证书做签名;该公钥证书包含Layer2的公钥和Layer2的固件ID(FireWareID,FWID),FWID可以为Layer2的Hash值;公钥证书需要传递给下一级代码。如果基于DICE的可信启动的远程证明策略是基于最后一级非固化软件代码Layer n的证书证明该BMC芯片所在的设备可信,则可信启动过程中除最后一级非固化软件代码Layer n的证书以外各级代码对应的证书可以不保存/传递。
[0058] 步骤6、Layer1 FW删除Layer1生成的私钥,例如将该私钥从BMC芯片内的静态随机存储器(Static Random Access Memory,SRAM)中删除。
[0059] 步骤7、Layer1 FW将签名后Layer2公钥证书,即运行权限传递给下一级Layer2,以便加载运行Layer2的代码;
[0060] 步骤8、Layer2 FW重复步骤2以及步骤4-7,使得Layer2 FW将签名后Layer3的公钥证书传递给Layer3,这样就建立了Layer1、Layer2以及Layer3的证书链;
[0061] 步骤9、当继续对Layer3 FW及Layer3 FW后的代码级重复上述步骤2以及步骤4-7至Layer n FW时,Layer n FW获得Kn,通过它派生出自己的公私钥;其中Layer n的公钥证书已经由Layer n-1提供,这样就生成了Layer1至Layer n的证书链。
[0062] 设备生成证书链是为了证明设备上运行的固件安全可信,因此在设备应用的环境中需要一个挑战者角色的设备来向待证明的设备发起挑战,以证实/判断设备的证书链是否可信。该设备可以为BMC芯片所在的服务器,该挑战者可以为与被挑战的包括BMC芯片的服务器建立直接或间接的通信的另一设备,例如可以为包括BMC芯片的服务器之外的另一服务器,或者,该挑战者也可以是服务器内部区别于BMC芯片的其他组件。该挑战过程可以为:
[0063] 步骤11、设备部署阶段,挑战者本地存储每个设备的每一级代码的Hash值;
[0064] 步骤21、对于任一设备,挑战者向设备索取证书链,其中Layer0证书采用CA颁发的证书;证书链中包含各级代码的hash值。而后,以CA的公钥校验Layer0的证书,然后以Layer0证书中的公钥校验Layer1的证书,依次校验完整条证书链。如果有校验不成功,则说明证书链被篡改了,该设备的代码不可信;
[0065] 步骤31、如果证书链校验成功,则继续将证书链中的各级代码的hash值与挑战者本地存储的hash值做对比,有任一级代码的hash值与挑战者本地存储的hash值不同,说明对比结果错误,该设备的代码被篡改了,如果对比结果正确,则执行步骤41;
[0066] 步骤41、挑战者发出一个挑战随机数nonce给设备,设备如果能用该设备Layer n的私钥对nonce做签名,则证明设备向挑战者提供的证书链可信,可以避免设备的固件被篡改。这样即使攻击者截获了设备正确的证书链发给挑战者,也可以避免攻击者对设备造成重放攻击。这是由于只有固件未被篡改的设备保存有Layer n的证书签名私钥,该私钥不向外传输,因此攻击者不能截获该私钥,如果设备不能用该设备Layer n的私钥对nonce的签名,或者签名结果不能用先前证书链中的Layer n证书内的公钥解密,即使挑战者获取了该设备正确的证书链,该设备同样不可信。即只有固件未被篡改的设备能够以Layer n的私钥对nonce签名,才能证实设备是证书链的实际拥有者。
[0067] 其中,攻击者可理解为黑客,黑客试图通过直接或间接的方式远程修改被挑战的设备中存储的代码,向被挑战的设备植入恶意程序。重放攻击,即攻击者截获了设备上报的证书链,下次挑战者挑战的时候,攻击者直接将截获的正确的证书链发给挑战者,从而达成欺瞒设备的目的。
[0068] 在上述设备的证书链生成的过程中,前文已经阐述,该过程中证书链的生成需要UDS参与计算,但是UDS存在泄漏的风险,而且BootROM代码实现复杂,因此,本申请新设计一种安全芯片,该安全芯片可以有效避免UDS的泄露,简化BootROM代码的开发。本申请设计的安全芯片可以为服务器主板上管理芯片,该管理芯片可以为基板管理控制器(Baseboard Management Controller,BMC),也可以为其它的通用芯片,本申请不做限定。
[0069] 以BMC芯片为例,BMC芯片是服务器上的管理芯片,用于处理服务器设备的管理业务,例如可以监控服务器CPU的运行状态、设备温度、控制设备风扇,控制设备BIOS升级等功能。BMC芯片在服务器主板上与其他部件的连接关系可以如图4所示,包括多个CPU(CPUs)、双列直插式存储模块(Dual-Inline-Memory-Modules,DIMMs)、南桥芯片(Platform Controller Hub,PCH)、BMC、BIOS、BMC FLASH以及管理网口等。
[0070] 当服务器开机时,BMC芯片会先于CPU开始启动运行,而BMC芯片运行首先会从ROM(或称为BootROM)中存储的代码开始执行,而后调用本申请设计的DICE进行计算。对DICE进行计算保证了BMC芯片上运行的系统代码可信,恶意的代码篡改能够被基于DICE的可信启动的证书链记录下来。
[0071] 其中,BMC芯片的硬件结构可以如图5所示,图中示为芯片50,包括核(Core)51、ROM52、DICE 53、静态随机存储器(Static Random Access Memory,SRAM)55以及第四代双倍速率(double data rata,DDR)控制器56,该芯片50外部连接有闪存(Flash)54。其中,Core51例如是CPU的Core,即ALU,用于运行BMC芯片的存储器中的指令以及处理软件中的数据等;ROM52中存储有固化的代码,例如可以存有本申请设计的BootROM的代码;DICE 53可以利用本申请的DICE硬件结构实现CDI等参数的计算;闪存54可以用于存储core51开始执行的第一级非固化软件代码(L1代码)和第二级非固化软件代码(L2代码)等,可以集成于BMC芯片内,也可以独立于在BMC芯片外;SRAM55为代码运行的存储空间,用于存储可执行代码和临时变量等;DDR控制器56对接BMC外部供BMC芯片访问的内存颗粒或内存条(BMC芯片上运行的操作系统和应用程序在内存条上运行,该内存颗粒和内存条为只供BMC芯片访问的内存,与BMC芯片所在的服务器的内存不同)。
[0072] 对于图5所示的BMC,当BMC复位,从core51开始运行,core51首先执行ROM52中的代码(例如运行BootROM代码),core51根据ROM52中的代码的指示将闪存54中的L1代码加载到SRAM55中,并对L1代码进行哈希计算,计算得到的摘要连同UDS作为DICE53的输入,使得DICE53根据输入的摘要和UDS生成CDI,以便于当core51指示L1代码加载运行时,由L1代码使用该CDI。这时ROM52中的代码运行完成,而后Core51指示L1代码开始运行。
[0073] 如图6所示,BMC芯片的软件可以包括固化代码以及非固化代码,固化代码可以为BMC芯片的ROM中的代码,非固化代码包括Boot Loader的代码、BMC的操作系统(Operating System,OS)的代码以及应用(application)的代码。其中,BMC芯片中的OS与BMC所在的服务器的OS不同,BMC芯片中的OS为BMC芯片的软硬件资源的管理程序,OS可以存储于在BMC芯片内部的Flash中,也可以存储于BMC芯片外的Flash中。Boot Loader的代码和application的代码可以存储于BMC芯片内的Flash中。
[0074] ROM中的代码为BMC芯片复位运行时最先运行的代码;应用的代码可以为BMC芯片中的管理软件;OS用于管理和控制BMC芯片的硬件与软件资源的计算机程序;Boot Loader是在BMC芯片的core51运行操作系统之前的引导代码。通过这段引导代码,可以初始化BMC芯片的硬件部件,建立内存空间的映射图,从而将BMC芯片的软硬件环境置为一个合适的状态,以便为最终调用core51准备好正确的环境。BMC芯片中软件的执行顺序可以为:ROM中的代码-Boot Loader的代码-OS的代码-application的代码,该软件均由BMC中的core运行。
[0075] 在了解了BMC芯片的硬件结构和软件组成后,为了解决上述UDS容易泄露以及BootROM代码实现复杂的问题,本申请对BMC芯片的硬件结构中的DICE硬件进行设计,由于DICE硬件得到重新设计,BMC芯片的软件中的BootROM代码调用DICE硬件进行单向函数计算时的代码也得到重开发。
[0076] 在该DICE硬件中,如图7A所示,DICE硬件包括UDS的硬连接输入接口7A1、选择器7A2、单向函数计算器7A3、第一可读写寄存器7A4以及第二可读写寄存器7A5。
[0077] 其中,第一可读写寄存器7A4,用于存储供单向函数计算器7A3访问的一路输入参数,该输入参数为参数内容本身或参数的指示信息,指示信息用于指示参数所存储的位置和大小,输入参数用于指示待执行的下一级非固化软件代码的摘要。例如,在证书链生成过程中,首先要执行ROM52中的BootROM代码计算K1,K1的计算需要通过UDS和第一级非固化软件代码的摘要D1进行计算,第一可读写寄存器7A4中可以存储输入参数:第一级非固化软件代码的摘要D1。
[0078] 单向函数计算器7A3,用于在核执行第一级非固化软件代码之前,根据第一可读写寄存器7A4存储的输入参数和UDS的硬连接输入接口7A1通过选择器7A2输入的芯片对应的唯一设备秘密UDS获取输出参数。例如第一可读写寄存器7A4中存储的输入参数为D1,可通过公式K1=KDF(UDS,D1)获取输出参数K1。
[0079] 第二可读写寄存器7A5,用于保存单向函数计算器7A3的输出参数。例如将K1存储在第二可读写寄存器中。
[0080] 选择器7A2,用于在单向函数计算器7A3获取输出参数之后,断开与UDS的硬连接输入接口7A1的连接。具体可以为:BootROM代码调用DICE根据第一级非固化软件代码的摘要D1和通过UDS的硬连接输入接口7A1输入的UDS获取输出参数CDI后,选择器7A2断开与UDS的硬连接输入接口7A1的连接。即在UDS参与计算时,UDS被硬件限制只能被BootROM代码访问一次,避免UDS泄露。
[0081] 应用上述阐述的DICE硬件结构,BootROM代码调用DICE在BMC芯片中运行时的流程可以为:芯片控制单向函数计算器7A3根据UDS与第一可读写寄存器7A4内存储的输入参数获取所述单向函数计算器7A3的输出参数,UDS是通过UDS的硬连接输入接口7A1通过选择器7A2输入至单向函数计算器7A3的,输入参数用于指示待执行的下一级非固化软件代码的摘要,输出参数存储于第二可读写寄存器7A5;在芯片获取到单向函数计算器7A3的输出参数之后,芯片控制UDS选择器7A2断开与硬连接输入接口7A1的连接。
[0082] 也就是说,当BootROM代码访问完UDS后,UDS的硬件输入接口断开与选择器的连接,这样便不能通过选择器向单向函数计算器输入UDS,BootROM代码之后运行的代码就不能访问UDS,实现对UDS的硬件锁定,不需要BootROM代码参与对UDS的锁定,即对于BootROM代码的设计,不需要该BootROM代码代码设置相应的读锁定寄存器,也不需要在UDS使用完后运行该BootROM代码进行相应的内存残留清理动作,这种采用本申请设计的DICE硬件能够简化该软件代码的开发,降低该BootROM代码的复杂度。
[0083] 其中,上述BMC芯片中的选择器7A2、单向函数计算器7A3、第一可读写寄存器7A4以及二可读写寄存器7A5的连接关系可以为:选择器7A2的输出端7A21与单向函数计算器7A3的第一输入端7A31连接,第一可读写寄存器7A4的输出端7A41与单向函数计算器7A3的第二输入端7A32连接,第二可读写寄存器7A5的输入端7A51与单向函数计算器7A3的第一输出端7A33连接;在选择器7A2断开与UDS的硬连接输入接口7A1的连接之前,选择器7A2的第一输入端7A22与UDS的硬连接输入接口7A1连接。
[0084] 在此连接关系的基础上,选择器7A2用于断开与UDS的硬连接输入接口7A1的连接可以包括:选择器7A2用于断开选择器7A2的第一输入端7A22与UDS的硬连接输入接口7A1的连接;选择器7A2还用于在断开选择器7A2的第一输入端7A22与UDS的硬连接输入接口7A1的连接之后,将选择器7A2的第二输入端7A23与第二可读写寄存器7A5的输出端7A51连接。
[0085] 如图7B所示,上述BMC芯片还可以包括锁存器7B1,锁存器7B1的输入端7B11与单向函数计算器7A3的第二输出端7A34连接,锁存器7B1的输出端7B12与选择器7A2的第三输入端7A24连接;锁存器7B1,用于接收单向函数计算器7A3发送的触发信号,触发信号用于指示选择器7A2断开与UDS的硬连接输入接口7A1的连接;将触发信号发送至选择器;选择器7A2,用于根据锁存器7B1发送的触发信号确定单向函数计算器7A3已获取输出参数,触发选择器7A2的第一输入端7A22断开与UDS的硬连接输入接口7A1的连接。由于锁存器7B1可发出指示选择器7A2的状态发生一直锁定的触发信号,那么当选择器7A2接收到锁存器7B1发送的触发信号时,选择器7A2的第一输入端7A22与UDS的硬连接输入接口7A1一直保持断开状态,直至BMC芯片下一次复位运行时再重新连接上,这样在BMC芯片复位运行期间,UDS在被访问一次后,其它软件便不能再访问到该UDS,避免了UDS的泄露。
[0086] 上述单向函数计算器7A3还可以用于:在核执行任一级非固化软件代码时,根据第一可读写寄存器7A4存储的任一级非固化软件代码的下一级非固化软件代码的摘要和第二可读写寄存器7A5前一次存储的输出参数获取当前计算的输出参数。例如在执行第一级非固化软件代码时,第一级可读写寄存器7A4中存储有第二级非固化软件代码的摘要D2,第二可读写寄存器7A5中存储有BootROM代码执行时的输出结果K1,那么单向函数计算器7A3可通过D2和K1获取K2。也就是说,该DICE的单向函数计算器7A3获取的计算结果可通过第二可读写寄存器7A5供第二级非固化软件代码访问,不需要代码层级之间通过其他存储介质,例如不需要通过Flash传递该计算结果,即计算结果直接以专用寄存器传递,这样各代码层级的开发也可得到简化。
[0087] 上述第二可读写寄存器7A5还可以用于:在每次对输出参数进行保存时,将单向函数计算器7A3当前获取的输出参数替换前一次进行获取的输出参数。这样一来,在执行下一级非固化软件代码进行单向函数计算时,上一级非固化软件代码进行单向函数计算后保存在第二可读写寄存器7A5中的输出参数会被下一级非固化软件代码进行单向函数计算新生成的输出参数覆盖,例如执行第一级非固化软件代码时得到的K2可以覆盖执行首段代码,即执行BootROM代码时生成的K1,使得上一次保存的输出参数被自动清除,将新生成的输出参数存放在第二可读写寄存器7A5中,这样可使得每一级非固化软件代码只需要通过第二可读写寄存器7A5传递输出参数给下一级代码,每一级代码的代码开发得到简化。
[0088] 需要说明的是,该DICE硬件内可以包括UDS的硬连接输入寄存器,该UDS的硬连接输入寄存器中存储有UDS,UDS的硬连接输入寄存器通过UDS的硬连接输入接口7A1与选择器7A2的第一输入端7A22连接,以便通过选择器7A2将UDS输入给单向函数计算器7A3。也可以将UDS的硬连接输入寄存器设计在DICE硬件外部,在DICE硬件上设计有UDS的硬连接输入接口,UDS的硬连接输入寄存器通过该UDS的硬连接输入接口7A1与DICE硬件连接。
[0089] 如果UDS的硬连接输入寄存器设计在DICE硬件内,如图7所示为DICE硬件的一种可能的结构示意图,该DICE硬件的结构可包括第一可读写寄存器71、第二可读写寄存器72、UDS的硬连接输入寄存器73、选择器74、锁存器75、单向函数计算器76、计算启动(calculatestart)驱动接口77、计算完成(calculatefinish)驱动接口78、复位(reset)接口79、时钟信号(clock)接口791以及锁定状态(lockstatus)接口792。
[0090] 其中,在DICE硬件复位后,单向函数计算器76完成第一次计算之前,UDS的硬连接输入寄存器73的输出端731与选择器74的第一输入端741连接,在单向函数计算器76完成第一次计算之后,UDS的硬连接输入寄存器73的输出端731与选择器74的第一输入端741断开连接,第二可读写寄存器72的输出端721与选择器74的第二输入端742连接;锁存器75的第一输出端751与选择器74的第三输入端743连接;选择器74的输出端744与单向函数计算器76的第一输入端761连接;第一可读写寄存器71的输入端711与单向函数计算器76的第二输入端762连接;单向函数计算器76的第一输出端763与第二可读写寄存器72的输入端722连接;单向函数计算器76的第二输出端764与锁存器75的输入端752连接;锁存器75的第二输出端753与锁定状态接口792连接;单向函数计算器76的第三输入端765与时钟信号接口791连接;单向函数计算器76的第四输入端766与复位接口79连接;单向函数计算器76的第五输入端767与计算启动驱动接口77连接;单向函数计算器76的第三输出端768与计算完成驱动接口78连接。选择器74的第一输入端741可以为上述提及到的UDS的硬连接输入接口。
[0091] 下面对DICE硬件各模块的功能进行介绍。
[0092] 第一可读写寄存器71(Reg_in):用于存储单向函数计算器76的一路输入参数;第一可读写寄存器71存储的输入参数可以表示该参数在内存中保存的位置和大小,使得单向函数计算器76根据该位置和大小从内存读取该输入参数进行计算,该内存可以为BMC芯片的SRAM或BMC芯片外的DDR内存条;也可以直接保存有该参数本身的参数内容,以便单向函数计算器直接从第一可读写寄存器71中读取该输入参数。该参数内容例如可以为层级代码的hash值。
[0093] 第二可读写寄存器72(Reg_out):保存有单向函数计算器76的输出参数,同时当DICE完成一轮计算后第二可读写寄存器72中的内容可以作为下一次单向函数计算器76计算的输入参数;
[0094] 计算启动驱动接口77:可以为1比特可读写寄存器,通过计算启动驱动接口77向DICE输入上升沿指令时,可触发DICE使能一次DICE计算;
[0095] 计算完成驱动接口78:可以为1比特可读写寄存器,用于在一次DICE计算完成时输出指令,指示当前计算完成;
[0096] 复位接口79:用于向DICE输入指示DICE复位运行的指令;
[0097] 时钟信号791接口:DICE内的各个模块运行所需要的时钟信号。
[0098] 锁定状态接口792:可以为1比特只读寄存器,指示当前选择器74的锁定状态,即选择器74与UDS的硬连接输入寄存器73连接还是与第二可读写寄存器72连接;
[0099] 单向函数计算器76:可以为hash或HMAC硬件模块,其输入为UDS和第一可读写寄存器71输入的第一级非固化软件代码的摘要,或为第m级非固化软件代码的摘要以及该单向函数计算器76上一次获取的存储在第二可读写寄存器72内的第m-1级非固化软件代码运行之前单向函数计算器76计算得到的关键信息Km-1,输出为第m级非固化软件代码的关键信息Km,。其中,由计算启动驱动接口77信号的上升沿触发单向函数计算器76进行一次计算,计算完成时单向函数计算器76通过计算完成驱动接口78输出完成信号;
[0100] UDS的硬连接输入寄存器(UDS eFuse)73:UDS的硬连接输入寄存器可通过选择器74向单向函数计算器76输入UDS;
[0101] 选择器74:可以是MUX2:1选择器,用于实现UDS和第二可读写寄存器72的输入选择,输入数据位为多比特双通道,输出为多比特单通道,即将双通道中的一路通道的输入参数传送到该选择器74的输出端,这一路通道的输入参数可以为UDS或第二可读写寄存器72中的参数。选择器74的输入选择由锁存器(lock)75控制;
[0102] 锁存器(lock)75:用于根据第一次计算完成信号calculatefinish对选择器74进行锁存,例如锁存器75将选择器74的选择位由0变为1,说明选择器74的输入选择由UDS的硬连接输入寄存器73切换为第二可读写寄存器72,并且只有在下一次该BMC芯片复位时才清零。
[0103] 需要说明的是,UDS的硬连接输入寄存器73可以在DICE硬件内部,也可以在DICE硬件外部,本申请不做限定。
[0104] 在上述DICE硬件设计的基础上,本申请对于DICE硬件的软件调用过程,即服务器启动后首先执行的BootROM代码的运行过程可以如图8所示。这里将能够运行该BootROM代码以及各级非固化软件代码的硬件可以称为BMC系统,BMC系统隶属于该服务器,BMC系统可以包括BMC芯片和BMC芯片的外围电路,该外围电路可以包括该BMC系统的电源和BMC芯片的内存颗粒或内存条等。以单向函数计算器76为HMAC计算为例,该BootROM代码在BMC系统中的执行过程可以描述为:
[0105] 801、BMC系统执行对第一级非固化软件代码的度量,获取第一级非固化软件代码的摘要。
[0106] 该步骤下,BMC系统可以通过调用hash算法计算BMC芯片的第一级非固化软件代码的hash值,生成第一级非固化软件代码的摘要D1(Digest1),具体可以采用专用的hash硬件引擎或软件算法实现。
[0107] 其中,BootROM代码在BMC系统中开始执行时,该BMC系统中BMC芯片的DICE硬件的选择器74的第一输入端741与DICE硬件的UDS的硬连接输入寄存器73的输出端731连接,选择器74的二输入端742与DICE硬件的第二可读写寄存器72的输出端721未连接。
[0108] 802、BMC系统将摘要写入DICE硬件的第一可读写寄存器71,并触发计算启动驱动接口77使能第一次DICE计算,将计算结果输出至第二可读写寄存器72。
[0109] BMC系统将D1写入DICE硬件的第一可读写寄存器71,向DICE硬件的计算启动驱动接口77输入上升沿指令,使DICE硬件中的单向函数计算器76执行第一次计算,即计算CDI(K1)。由于DICE硬件的选择器74的第一输入端741与UDS的硬连接输入寄存器73连接,那么单向函数计算器76计算时,单向函数计算器76可根据单向函数计算器76的第一输入端761输入的UDS和第一可读写寄存器71通过单向函数计算器76的第二输入端762输入的D1进行计算输出CDI,将CDI输出至DICE硬件中的第二可读写寄存器72。
[0110] 803、BMC系统等待计算完成驱动接口78置位,确定第一次计算完成。
[0111] 当单向函数计算器76第一次计算完成,BMC系统可通过单向函数计算器76的计算完成驱动接口78置位指示第一次计算完成,例如计算完成前,计算完成驱动接口78的1bit只读存储器存储的值为1,计算完成时,1bit只读存储器存储的值置位为0,指示单向函数计算器76第一次计算完成。
[0112] 804、BMC系统将选择器74的输入连接由UDS的硬连接输入寄存器73切换为与第二可读写寄存器72连接,切换完成时,将锁定状态接口792置位。
[0113] 当第一次计算完成时,BMC系统的DICE硬件中的单向函数计算器76可以向DICE硬件中锁存器75发送信号,以便锁存器75根据该信号指示选择器74进行硬件通道切换,锁存器75同时指示DICE硬件中的锁定状态接口792置位,以便BootROM代码根据锁定状态接口792置位确定选择器74完成硬件通道切换。选择器74进行硬件通道切换,可以是选择器74将其输入连接由UDS的硬连接输入寄存器73切换为与第二可读写寄存器72连接。当选择器74硬件通道切换完成时,跳转执行第一级非固化软件代码。
[0114] 上述方法实施例均以BMC系统为执行主体进行说明,可以理解的是,由于BMC系统中包含多个不同的组件,该方法具体实现时,是以BMC系统中具体的组件来执行的。例如上述步骤804中是通过BMC系统中的单向函数计算器76可以向DICE硬件中锁存器75发送信号,锁存器75根据该信号指示选择器74进行硬件通道切换,锁存器75同时指示DICE硬件中的锁定状态接口792置位,以便BootROM代码根据锁定状态接口792置位确定选择器74完成硬件通道切换。
[0115] 第一级非固化软件代码的执行流程可以如图9所示,包括:
[0116] 901、BMC系统对DICE硬件的第一可读写寄存器71写入常量A,并触发计算启动驱动接口77驱动单向函数计算器76进行第二次DICE计算,将第二次计算结果替换第二可读写寄存器72中存储的CDI。
[0117] 通常情况下BMC系统不直接使用CDI作为后续证书链的私钥,因此需要先对CDI进行计算。该步骤中第二次DICE计算即:HMAC(CDI,A),即DICE硬件的单向函数计算器76的输入为CDI和A,第二次计算结果表示为K1_E,K1_E输出至第二可读写寄存器72,替换第二可读写寄存器72上一次存储的CDI。
[0118] 902、BMC系统执行对第二级非固化软件代码的度量,获取第二级非固化软件代码的摘要。
[0119] 调用hash算法计算BMC芯片的第二级非固化软件代码的hash值,得到第二级非固化软件代码的摘要D2(Digest2)。
[0120] 903、BMC系统将第二级非固化软件代码的摘要写入DICE硬件的第一可读写寄存器71,触发计算启动驱动接口77驱动单向函数计算器76进行第三次DICE计算,将计算结果输出第二可读写寄存器72。
[0121] 该步骤中DICE硬件的单向函数计算器76进行第三次DICE计算时,单向函数计算器76的输入为D2和上一次第二可读写寄存器72的值K1_E,即先前计算结果K1_E默认作为HMAC的key输入,得到计算结果K2,K2覆盖第二可读写寄存器72上一次的存储内容K1_E,以供第二级非固化软件代码读取。
[0122] 若还存在第三级非固化软件代码,BMC系统执行第三级非固化软件代码继续生成K3,以此类推。
[0123] 通过上述对于基于DICE的可信启动生成证书链过程中对BootROM代码的流程以及对第一级非固化软件代码的执行流程的说明,将本申请与现有技术对比来说,现有技术在基于DICE的可信启动生成证书链过程中,BootROM代码需要访问UDS进行计算,计算完成后,UDS对后续代码的访问限制需要软件实现,即BootROM代码设置相应的读锁定寄存器,且UDS使用完后由BootROM代码将内存中的任何UDS残留信息删除,使得BootROM代码复杂化,BootROM代码的漏洞将危害UDS的泄露,容易有安全隐患。而利用本申请设计的DICE硬件以及BootROM代码,UDS的保护不需要BootROM代码参与,当使用DICE硬件引擎时,完成第一次计算(计算CDI)后,可以通过硬件锁定对UDS的访问,即通过将UDS的硬连接输入寄存器和第二可读写寄存器72作为选择器的输入选择,开始计算前,UDS的硬连接输入寄存器作为选择器的一路输入,当对UDS计算完成后,第二可读写寄存器72作为选择器的一路输入,UDS的硬连接输入寄存器与选择器断开连接,这样,可自动实现对UDS的隔离,硬件锁定对UDS的访问,即硬件限制单向函数计算器对UDS只能访问一次,不需要BootROM代码设置相应的读锁定寄存器,也不需要UDS使用完后运行BootROM代码进行相应的内存残留清理动作,这种采用本申请的设计的DICE硬件能够简化BootROM的代码开发,提高运算性能,降低软件设计风险。并且,UDS的硬连接输入寄存器直接作为单向函数计算器的输入时,UDS不可被软件代码(core)访问,不存在软件漏洞导致UDS泄露的场景。
[0124] 再有,现有DICE计算采用纯软件或纯软件加通用加速引擎计算,驱动代码复杂,驱动实现和软件调用过程容易有安全隐患。而通过本申请对DICE硬件的设计,DICE硬件生成的结果数据(CDI)通过可读写寄存器供软件访问,不需要代码层级之间通过其他存储介质,例如不需要通过RAM或Flash传递该结果数据,即结果数据直接以专用寄存器传递,各代码层级的开发也可得到简化。
[0125] 此外,现有技术中,CDI传递给第一级非固化软件代码后,作为类似UDS的应用,第一级非固化软件代码需要再次进行单向函数计算,即计算K2=KDF(CDI,Hash(L2),并且删除CDI的残留,例如对SRAM内CDI变量进行写0操作,清除SRAM内CDI的残留以及基于CDI计算的一些中间参数的值。而本申请中,第一级非固化软件代码只需再次触发本申请设计的DICE硬件引擎,第二可读写寄存器中的CDI会被新生成的计算结果K2覆盖,使得CDI被自动清除,将K2存放在第二可读写寄存器中传递给第二级非固化软件代码,这样第一级非固化软件代码的开发也可得到简化。
[0126] 图10示出了本申请提供的一种服务器的结构示意图。
[0127] 如图10所示,服务器10包括处理器101和基板管理控制器(baseboard management controller,BMC)102,其中,BMC102可以是芯片50,处理器101例如是CPU。
[0128] BMC102还可以与其它组件连接,例如,与第四代双倍速率(double data rata,DDR)存储器(简称为“DDR4”)、寄存器、BMC闪存、视频接口和物理层芯片(例如,网卡)连接。
[0129] DDR4用于为BMC102或处理器101提供运行程序或者代码的空间。
[0130] BMC闪存可以是存储BMC自身固件和相关数据的闪存。
[0131] 视频接口用于连接显示器等外部设备。物理层芯片连接网卡,用于为服务器10提供数据收发服务。
[0132] BMC102和处理器101都通过开关访问BIOS,运行BIOS闪存中存储的BIOS,并通过切换开关的方式与BMC102通信。
[0133] 上述服务器10的架构仅是举例说明,而不应被理解为对本申请提供的技术方案的应用限定,本申请提供的技术方案还可以应用于包含更多或者更少的组件的服务器中。
[0134] 例如,服务器10可以是云计算服务器,此时,服务器10可以包括多个计算单元,计算单元可以是CPU、也可以是图形处理器(graphics processing unit,GPU),还可以是现场可编程门阵列(Field-Programmable Gate Array,FPGA)、特殊应用集成电路(Application Specific Integrated Circuit,ASIC)、数字信号处理(Digital Signal Processing,DSP)、神经网络处理器(neural-network process unit,NPU)或者其它类型的计算单元。该多个计算单元可以组成同构计算(homogenous computing)资源池和/或异构计算(heterogeneous computing)资源池为用户提供服务。
[0135] 又例如,服务器10可以是存储服务器,此时,服务器10可以包括多个存储单元,存储单元可以是硬盘驱动器(hard disk drive,HDD)硬盘,也可以是固态硬盘(solid state disk,SSD),还可以是小型计算机系统接口(small computer system interface,SCSI)硬盘或者其它类型的非易失性存储介质。当服务器10包括多个硬盘时,该多个硬盘可以组成磁盘阵列(redundant arrays of independent drives,RAID),作为服务器10的存储资源池为用户提供服务。
[0136] 图11示出了本申请提供的一种终端设备的结构示意图。
[0137] 终端设备可被称为接入终端、用户设备(user equipment,UE)、用户单元、用户站、移动站、移动台、远方站、远程终端、移动设备、用户终端、终端、无线通信设备、用户代理或用户装置。接入终端可以是蜂窝电话、具有无线通信功能的手持设备、计算设备或连接到无线调制解调器的其它处理设备、车载设备、可穿戴设备以及第五代移动通信技术(5-Generation,5G)通信系统中的用户设备。上述各个电子设备仅是对终端设备的举例说明,终端设备还可以是其它电子设备,例如包含芯片50的汽车或无人机。
[0138] 如图11所示,当终端设备为手机时,手机11包括芯片50、闪存54、控制电路、天线以及输入输出装置。芯片50主要用于对通信协议以及通信数据进行处理,以及对整个终端设备进行控制,执行软件程序,处理软件程序的数据。闪存54主要用于存储软件程序和数据。芯片50和闪存54用于在手机11启动时为手机11提供安全启动保障。控制电路主要用于基带信号与射频信号的转换以及对射频信号的处理。控制电路和天线一起也可以叫做收发器,主要用于收发电磁波形式的射频信号。输入输出装置,例如触摸屏、显示屏或键盘,主要用于接收用户输入的数据以及对用户输出数据。
[0139] 当终端设备开机后,芯片50可以按照图8所示的流程执行启动步骤,运行OS,随后读取闪存54中的软件程序,解释并执行软件程序的指令,处理软件程序的数据。芯片50可以包括基带芯片,当需要通过无线发送数据时,芯片50的基带芯片对待发送的数据进行基带处理后,输出基带信号至射频电路,射频电路将基带信号进行射频处理后将射频信号通过天线以电磁波的形式向外发送。当有数据发送到终端设备时,射频电路通过天线接收到射频信号,将射频信号转换为基带信号,并将基带信号输出至处理器,处理器将基带信号转换为数据并对该数据进行处理。
[0140] 本领域技术人员可以理解,为了便于说明,图11仅示出了一个存储器(闪存54)和一个处理器(芯片50)。在实际的终端设备中,可以存在多个处理器和多个存储器。存储器也可以称为存储介质或者存储设备等,本申请对此不做限定。
[0141] 图12示出了本申请提供的一种网络设备的结构示意图。
[0142] 网络设备可以是码分多址(code division multiple access,CDMA)系统中的基站(base transceiver station,BTS),也可以是宽带码分多址(wideband code division multiple access,WCDMA)系统中的基站(node B,NB),还可以是长期演进(long term evolution,LTE)系统中的演进型基站(evolutional node B,eNB),还可以是5G通信系统中的基站(gNB),上述基站仅是举例说明,网络设备还可以为中继站、接入点、车载设备、可穿戴设备以及包含芯片50的汽车或无人机。
[0143] 如图12所示,当网络设备为基站时,基站12可包括一个或多个射频单元,如远端射频单元(remote radio unit,RRU)121和一个或多个基带单元(baseband unit,BBU)(也可称为数字单元(digital unit,DU))122。所述RRU121可以称为收发单元、收发机、收发电路、或者收发器等等,其可以包括至少一个天线1211和射频单元1212。RRU121主要用于射频信号的收发以及射频信号与基带信号的转换。BBU122主要用于进行基带处理,对基站12进行控制等。BBU122中的单板上集成有芯片50和闪存54,芯片50和闪存54用于在BBU122启动时为BBU122提供安全启动保障。RRU121与BBU122可以是物理上设置在一起的,也可以物理上分离设置的,即分布式基站。
[0144] BBU122为基站的控制中心,也可以称为处理单元,主要用于完成基带处理功能,如信道编码,复用,调制,扩频等等。
[0145] 在一个示例中,BBU122可以由一个或多个单板构成,多个单板可以共同支持单一接入指示的无线接入网(如LTE网),也可以分别支持不同接入制式的无线接入网(如LTE网,5G网或其它网)。BBU122还包括闪存54和芯片50,闪存54和芯片50可以服务于一个或多个单板。也就是说,可以每个单板上单独设置存储器和处理器。也可以是多个单板共用相同的存储器和处理器。
[0146] 本领域技术人员应该可以意识到,在上述一个或多个示例中,本申请所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。
[0147] 以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何在本申请揭露的技术范围内的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。