热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ATF(ArmTrustedFirmware)/TFAChapter03ChainofTrust(CoT)

本章主要介绍ATF中出现的CoT证书链和相关概念。1.密钥和信任链概念参考和引用:TrustedBoardBootRequirements(TBBR)specif

本章主要介绍ATF中出现的CoT证书链和相关概念。

 


1. 密钥和信任链概念

参考和引用:

Trusted Board Boot Requirements (TBBR) specification, Arm DEN0006C-1

信任链(CoT)组件,在Arm开发平台上,这些组件是:


  1. 信任根公钥(ROTPK)的SHA-256。 它存储在受信的根密钥存储寄存器中。
  2. BL1镜像,假设它在ROM中,不能被篡改。

CoT中的其余组件是证书或Bootloader镜像。 证书遵循X.509 v3标准。 此标准允许向证书添加自定义扩展,这些扩展用于存储建立CoT的基本信息

在TBB CoT中,所有证书都是自签名的。 不需要证书颁发机构(CA),因为CoT不是通过验证证书颁发者的有效性而是通过证书扩展的内容来建立的。 要对证书进行签名,使用带有RSA加密签名方案的PKCS#1 SHA-256,RSA密钥长度为2048位。 TF-A的未来版本将支持其他加密算法。

证书分为“密钥(Key)”和“内容(content)”证书两种。 密钥证书用来验证用于签名内容证书的公钥。内容证书用来保存boot loader 镜像的hash。认证方式是通过计算BLx的hash与从内容证书中提取出来的hash值比较。Hash =SHA-256(BLx bin). 公钥和hash值会放在X.509 v3证书的 non-standard extension字段。

用于建立CoT的密钥是:


  1. Root of trust key

他的私钥用来给BL2的内容证书和密钥证书签名

他的公钥称为ROTPK.


  1. Trusted world key

私钥用来给secure world images (SCP_BL2, BL31 and BL32)的密钥证书签名

公钥保存在自签名的Trusted world key证书extension 域中


  1. Non-trusted world key

私钥来给non secure world images (BL33)的密钥证书签名

公钥保存在Trusted world key证书的extension 域中


  1. BL3-X keys

对于SCP_BL2, BL31, BL32 and BL33, 私钥用来给BL3-X的内容证书签名

公钥保存在对应的密钥证书的extension 域.

CoT包括以下镜像:


  1. BL1
  2. BL2
  3. SCP_BL2 (optional)
  4. BL31
  5. BL33
  6. BL32 (optional)

 

以下证书用来认证镜像:


  1. BL2 内容证书

一个ROT key私钥的自签名证书。内容包括BL2的hash


  1. Trusted key certificate

一个ROT key私钥的自签名证书。内容包括trusted world key的公钥和non-trusted world key的公钥


  1. SCP_BL2 key certificate

一个 trusted world key自签名证书。内容包括SCP_BL2 key的公钥.


  1. SCP_BL2 content certificate

一个SCP_BL2 key自签名证书。内容包括SCP_BL2 的hash.


  1. BL31 key certificate

一个 trusted world key自签名证书。内容包括BL31 key的公钥.


  1. BL31 content certificate

一个BL31 key自签名证书。内容包括BL31 的hash


  1. BL32 key certificate

一个 trusted world key自签名证书。内容包括 BL32 key的公钥.


  1. BL32 content certificate

一个BL32 key自签名证书。内容包括BL32 的hash


  1. BL33 key certificate

一个non-trusted world key自签名证书。内容包括BL33 key的公钥.


  1. BL33 content certificate

一个BL33 key自签名证书。内容包括BL33 的hash

SCP_BL2 ,BL32 证书是可选的, 如果SCP_BL2 or BL32 存在,则为必选。


2. X509 v3 & PKCS1

PKCS1作为签名算法,ARM目前支持的算法为:SHA256+RSA2048,这是一种相对简单且古老的签名算法,PKCS#1签名算法有两种签名方案:

RSASSA-PSS和RSASSA-PKCS1-v1_5。

而X509证书,作为证书内容(签名信息+公钥+签名)的内容的封装,同样有两种格式:

PEM(.pem)和DER(.cer,.crt),分别为可读的base64编码的文本文件和DER编码的二进制文件。

ARM明确指出了使用DER编码。

X509证书内容的编码是ASN.1。

关于X509和PKCS#1,有时间我会详细说明pkcs体系和在嵌入式安全领域的应用。


3. Trusted Board Boot 流程

CoT按照下面的步骤验证。如果任何步骤失败,系统会panic。

1.  BL1加载并验证BL2内容证书。从验证的证书中读取颁发者公钥。计算该密钥的散列并将其与从受信任的根密钥存储寄存器读取的ROTPK的散列进行比较。如果它们匹配,则从证书中读取BL2哈希。

BL2内容证书 = Sign(ROT key PrK, ROT key PK+ ext::BL2 hash)

注:ROT key PK = ROTPK

注意:比较操作是特定于平台的,目前在Arm开发平台上未实现。在其他平台上,是SoC厂商自行实现的。

多说一句,比较操作作为认证过程的核心,也是有讲究的,需要考虑对各种攻击的保护,比如glitch攻击,穷举攻击等,通常的做法,是进行二次比较,并在两次比较之间插入随机的delay以防止对比较结果(即 返回值x0,r0)的攻击。第一次比较采用相等比较,而第二次,采用不等比较:

if(!memcmp(calc_hash,file,len) ){//对第一次比较的代码执行时间点很容易预测,所以放弃保护delay(r1);//r1 为真随机数if(memcmp(calc_hash,file,len)){//相比于第一次,对第二次比较的代码执行时间点则不容易预测return -EAUTH;}
}else{delay(r2);//r1 为真随机数return -EAUTH;
}
return 0;//认证成功

 

到第三步,BL1获取了经过验签的ROTPK和BL2 hash。

2. BL1加载BL2镜像。计算其哈希值并与从证书中读取的哈希值进行比较。如果所有比较都成功,则控制转移到BL2镜像。这一步,经过验签的BL2执行成功

3. BL2加载并验证 trusted key 证书。从验证的证书中(BL2内容证书)读取颁发者公钥(ROTPK)。计算该密钥的hash并将其与从受信任的根密钥存储寄存器读取的ROTPK的散列进行比较。如果比较成功,BL2将从已验签的证书中读取并保存trusted world PK+ non-trusted world PK。

trusted world key证书 = Sign(ROT key PrK, ROT key PK+ext::trusted world PK+ non-trusted world PK)

SCP_BL2,BL31和BL32都会执行步骤4,5。如果这些镜像不存在,则跳过可选SCP_BL2和BL32镜像的步骤,只看BL31

4. BL2加载并验证BL3x密钥证书。使用 trusted world public key验证证书签名。如果签名验证成功,BL2将从证书中读取并保存BL3x公钥。

BL31 key certificate = Sign(trusted world PrK, trusted world PK, ext::BL31 PK)

5. BL2加载并验证BL3x内容证书。 使用BL3x公钥验证签名。 如果签名验证成功,BL2将从证书中读取并保存BL3x镜像Hash。

BL31 content certificate = Sign(BL31 PrK, BL31 PK ,ext::hash(BL31))

接下来的两个步骤仅针对BL33执行。

6. BL2加载并验签BL33 密钥证书。如果验签成功,BL2从BL33 密钥证书中读取并保存BL33公钥

BL33 key certificate = Sign(non-trusted world PrK, non-trusted world PK, ext::BL33 PK)

7. BL2加载并验签BL33内容证书,如果验签成功,BL2从BL33 内容证书中读取并保存BL33的hash

BL33 content certificate = Sign(BL33 PrK, BL33 PK ,ext::hash(BL33))

下一步骤针对所有的BL image

8.BL2计算镜像hash,与从内容证书中获取的hash进行比较。如果hash相同则镜像认证成功

9.结束

ARM提供了一个证书生成工具,添加到BL镜像和FIP镜像中,ARM要求使用IO storage framework读取这些证书,并使用 Authentication module 进行认证。

 

本章结束


推荐阅读
  • 深入解析 OpenSSL 生成 SM2 证书:非对称加密技术与数字证书、数字签名的关联分析
    本文深入探讨了 OpenSSL 在生成 SM2 证书过程中的技术细节,重点分析了非对称加密技术在数字证书和数字签名中的应用。非对称加密通过使用公钥和私钥对数据进行加解密,确保了信息传输的安全性。公钥可以公开分发,用于加密数据或验证签名,而私钥则需严格保密,用于解密数据或生成签名。文章详细介绍了 OpenSSL 如何利用这些原理生成 SM2 证书,并讨论了其在实际应用中的安全性和有效性。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 不使用node的自带的模块,如何将下列代码装换? ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 深入解析JWT的实现与应用
    本文深入探讨了JSON Web Token (JWT) 的实现机制及其应用场景。JWT 是一种基于 RFC 7519 标准的开放性认证协议,用于在各方之间安全地传输信息。文章详细分析了 JWT 的结构、生成和验证过程,并讨论了其在现代 Web 应用中的实际应用案例,为开发者提供了全面的理解和实践指导。 ... [详细]
  • 加密你的php源代码,加密你的php源代码错误
    本文目录一览:1、PHP-php源代码加密是怎么做到的 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
author-avatar
水皱皱_446
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有