ATF(Arm Trusted Firmware)/TF-A Chapter 04 Authentication Framework
4.1. 代码分析
首先,重新分析之前忽略掉的 TRUSTED_BOARD_BOOT =1 的情况,bl1_platform_setup->arm_bl1_platform_setup->arm_load_tb_fw_config.
看138行,load_auth_image会调用load_auth_image_internal:
此时会执行236行宏控制的代码。243行,首先找到这个id的父id,递归调用认证镜像(我们也会注意到,如果支持TBBR,头文件中定义的stack大小也会相应的变大)。
237行,
当TRUSTED_BOARD_BOOT =1的前提下,并且定了DYN_DISABLE_AUTH,arm提供的这个方案是认证可以动态的打开和关闭,这在开发的时候是很有帮助的。先不定义DYN_DISABLE_AUTH,方便分析。
回到load_auth_image_internal,load前会获取这个image_id的parent_id,此时image_id=TB_FW_CONFIG_ID,
auth_mod_get_parent_id内部:
通过cot_desc_ptr这个全局变量,获取id的auth_img_desc_t类型的指针地址
cot_desc_ptr。通过查找代码,我们会发现在driver/tbbr/tbbr_cot.c中:
宏定义在include/driver/auth/auth_mod.h
Cot_desc是固定的,也在driver/tbbr/tbbr_cot.c中.
结构体变量类型:
看TB_FW_CONFIF的parent id:
证书级别:
通过密钥级别,递归到TRUSTED_BOOT_FW_CERT_ID已经没有父id了,auth_mod_get_parent_id返回非0,此时parent_id=TRUSTED_BOOT_FW_CERT_ID.在load_image后,继续load_auth_image_internal的260行.
auth_mod_verify_img(drivers/auth/auth_mod.c ,343行)是验签接口。
357行,首先检查镜像完整性。
img_parser_check_integrity是Image Parser Module (IPM)模块的接口之一,主要功能
- 检查通过IO framework加载的镜像完整性
- 根据由CoT描述符中的内容获取认证参数。
因为镜像可能有不同的格式(例如,认证镜像可以是x509v3证书,签名的ELF文件或平台特定的格式)。 IPM允许为CoT中的每种镜像格式分别注册一个镜像解析库Image Parser Library(IPL)。 实现具体的解析方法。 IPM从CoT获取镜像格式并调用正确的IPL来检查完整性并提取认证参数。
在代码中:
img_parser_check_integrity(Driver/auth/img_parser_mod.c, 66行)函数的84行
Parser_lib_indices是什么时候被赋值的?
bl1_main->auth_mod_init->img_parser_init:
第17,18行:
在bl1.ld.s中:
IPL必须实现如下接口:
并使用宏注册IPL函数:
我们看drivers/auth/mbedtls_x509_parser.c:
在include/driver/auth/img_parser_mod.h中:
函数的具体介绍在“auth-framework 1.2.1. Describing the image parsing methods”有详细介绍。
注意:要想支持trust boot,即TRUSTED_BOARD_BOOT = 1和GENERATE_COT = 1则必须指定mbedtls库。需要先编译这个库。具体内容在后面的章节中分析。
img_parser_check_integrity完成后,获取认证方法,认证方法在定义cot时,已经写好了。
看TRUSTED_BOOT_FW_CERT_ID的auth_method,在auth_img_desc_s的auth_method_desc_t中:
有两种认证方法:AUTH_METHOD_SIG和AUTH_METHOD_NV_CTR,第一个方法很好理解,
关于auth_img_desc_s,有以下几种认证方法:
认证相关的接口,由 Authentication Module (AM)提供:
认证流程:
- 由IPM的get_auth_param()函数,从镜像中提取认证参数。
- 在调用Cryptographic Module (CM)和 TF-A Platform Port (PP)的验证函数时,对参数进行预处理。
- 从父镜像中提取验证参数用来验证子镜像
第二个:
是最新增加的认证方法,防止rollback攻击。所以,对于可更新的固件来说,需要进行两次认证。这个方法在后面有分析。
auth_mod_verify_img执行时,会按顺序循环调用所有有效的认证方法,首先是AUTH_METHOD_SIG的auth_signature函数,传入的参数是auth_method->param.sig = .img_auth_methods.param.sig,变量使用宏定义,例如pk结构体:
结构体的第二个参数,前面说了,是用来在x509中定位扩展域的OID指针,告诉认证代码,要提取的hash或者公钥数据的指针,0表示不使用这个字段。
auth_signature的第二个参数img_desc=auth_img_desc_t类型的TRUSTED_BOOT_FW_CERT_ID,第三四个参数分别是base addr和length。
154,158,164行,最终会调用SoC厂商自己实现的注册在IPL接口中的get_auth_param函数指针指向的函数。
171行,获取parent的参数,对当前的image验签。由于没有parent,所以执行174行的plat_get_rotpk_info,否则会先获取parent的参数。plat_get_rotpk_info在porting guide中:
ROPTK必须是ASN.1格式的DER编码,有两种形式,一是返回ROTPK本身,另一个是返回他的hash。通过int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
unsigned int *flags) 的flag参数区分
如果返回的是hash,则必须先使用ROTPK对image验签,在比较ROTPK的hash
如果flag是ROTPK_NOT_DEPLOVED,则跳过ROTPK hash比较。
在回到171行,除了跟证书之外,会执行auth_get_param获取pk_ptr,并且此时flag=0,直接对当前的image验签。
继续分析第二个验签方法AUTH_METHOD_NV_CTR:auth_mod_verify_img中,337行:
看下注释怎么说的(drivers/auth/auth_mod.c):
硬件上,SoC有一个non-volatile计数器,值只能增加。
证书中,所有证书都包含一个计数器值。
证书的值不应低于non-volatile计数器的值。 如果证书的值较大,则必须将non-volatile计数器的值更新为新值。
返回到auth_mod_verify_img,两个认证完成后,还需要更新认证数据。
auth_mod_verify_img(Drivers/auth/auth_mod.c ,390行,)把需要的类型拷贝到ptr指向的地址中:
看下TRUSTED_BOOT_FW_CERT_ID需要的认证数据有哪些类型:
最后,置标志位:
递归返回后,所有的加载并认证镜像的工作完成。
4.2 模块划分
本章结束。
ATF(Arm Trusted Firmware)/TF-A Chapter 04 Authentication Framework相关推荐
- ATF(Arm Trusted Firmware)/TF-A Chapter 02 BL1-ROMCode
第二章目录: Chapter 02.TF-A(Arm Trusted Firmware, ATF ) BL1-ROMCode(本文) Chapter 02.TF-A(Arm Trusted Firmw ...
- ATF(Arm Trusted Firmware)/TF-A Chapter 01. 介绍
1.TF-A 介绍 TF-A是一套通用的软件架构+特定于平台的实现代码. TF-A满足大多数SoC厂商的CPU设计:单核启动,多核启动,自定义reset vector,可裁剪的启动阶段,bootrom ...
- [ATF] ARM Trusted firmware 构建选项
TF-A 构建系统支持以下构建选项.除非另有说明,这些选项应在构建命令行中指定,并且不会在任何组件生成文件中修改.请注意,构建系统不会跟踪构建选项的依赖性.因此,如果任何构建选项从先前的构建中发生更改 ...
- QEMU模拟器启arm64 ATF(arm trust firmware) BL1, uboot方法
目的: 使用QEMU(3.0版本以上)模拟一个arm64 virt平台,在virt平台上配置两个cfi flash. Flash0当作BootRom使用,"烧录"ATF(arm t ...
- [ATF][Power]ARMv8 arm trust firmware
ARM 全Trustzone解决方案,软件架构有ARM TBBR规范,在构建运行TEE环境时,ATF与TrustOS构成基本TEE执行环境. 本文主要介绍arm trust firmware组件. # ...
- [ATF]-ARM级别/异常/状态切回时候的寄存器保存与恢复
文章目录 1.save/restore函数的定义 (1).el1_sysregs_context_save //保存系统寄存器 (2).el1_sysregs_context_restore //恢复 ...
- SSH Chapter 04 Hibernate 入门
SSH Chapter 04 Hibernate入门 笔记 Hibernate 知识体系图: 本章目标: 理解类和表的映射关系 掌握单表的增删改 掌握按主键查询 理解持久化对象的状态及其转换 技术内容 ...
- [bbk3100]第7集 - Chapter 04 - 介绍RAC中CVU工具的使用
阿斯顿发水电费 转载于:https://www.cnblogs.com/arcer/archive/2013/06/14/3135747.html
- ATF官方文档翻译(二):Authentication Framework Chain of Trust(身份验证框架和信任链)(3)
接上文 4.应用实例 本节详细介绍了使用身份验证框架的可信引导实现.本示例对应于TBBR客户端文档中指定的应用功能模式(AFM).建议阅读本指南和源代码. 4.1 .The TBBR CoT (CoT ...
最新文章
- 办公室“暧昧”的几种结局。
- Spring 组cxf宣布webservice
- 源码包编译安装python_Python3.7源码包编译安装-Go语言中文社区
- 怎么去掉网页上复制到word的文章中各种符号例如向下箭头(↓)?
- php是根据html中的值查询数据条件_FleaPHP框架数据库查询条件($conditions)写法总结...
- Mysql语句整理大全
- SQLite: 注意日期查询中的“前空格”问题将引发错误查询!
- 计算机科学导论第五版第二章答案,计算机科学导论第2章-答案
- 夜神模拟器怎么安装使用教程!
- 脸上经常长青春痘痘的青年应该多吃的食物
- mui实现分享功能_Hbuilder 云端打包app微信分享功能源码示例
- squid高性能代理缓存服务器
- ps提示没有足够的ram
- nodejs+koa2实现微信小程序签名和请求支付(二)
- servlet的认识和了解(3)
- java千克和磅之间的转换,进行打印
- 懂商业的技术合伙人(13):谈谈我对商业的4点理解,创业公司做好核心业务是关键
- Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]解决方法
- ICIP2020:VVC解码端基于GPU的运动补偿优化
- Window环境下卸载Python3.6