Keymaster/ROT/MOTA功能的关联
来源:互联网 发布:js validate取消验证 编辑:程序博客网 时间:2024/05/24 01:58
Keymaster
实现由Android“keystore”守护进程提供的密钥管理API,它可以安全的生成和存储密钥,并运行用户使用这些密钥操作数据
目前KM在qualcomm上有三个版本,KM0.3、KM1.0以及KM2.0
由于2.0版本仅在高端平台,例如8994等使用,以下仅研究0.3和1.0的差异。
关于如何切换KM0.3和KM1.0,需要在
/device/qcom/$Project/BoardConfig.mk中对以下红开关进行操作
TARGET_HW_KEYMASTER_V03:该值为TRUE是,KM版本为0.3,否则为1.0
两版本间的差异:
KM0.3在msm8909平台一直使用于AndroidL之前的版本,而1.0则从android M开始使用,两者的差别在于,1.0v版本,会对secure boot功能,在LK阶段会去校验在TZ-RPMB中的一些参数、密钥、状态的完整性,如果发生了变动,则会认为这是一次非法的启动,secure boot失败。
ROT(root of trust)
ROT功能也是在android L后的版本开始释放,ROT对verifiy boot功能有关联
ROT的开关在于customize_disable_rot,该值为1的时候关闭rot,该值为0的时候打开
/* For M-OTA WITHOUT VerifiedBoot/Partitions changes, this value shall be defined to 1 otherwise 0. Bydefault this value is defined to 1 here in this case. And this can becustomized based on the needs. This value is not allowed to change dynamicallyduring runtime.*/
对于没有验证BOOT/分区更改的MOTA,该值为1,否则为0。在msm8909平台,android N上,该值默认会被设定为1(即关闭),客户可以根据具体情况来配置。但该值不能在运行时候发生动态变化。
在LK阶段会初始化TZ的TEE和绑定Rot,LK会发送rot command给TZ去结合KM以及ROT,验证HASH,用于boot分区签名的公钥,设备状态
所以TEE派生的KEY取决于上述因素,例如,如果设备状态发生了改变,TEE会尝试以不用的密钥去对数据解密,并且加密的数据不可再访问。
MOTA
首先确定,MOTA功能时基于VERFIYBOOT功能的基础上,要运行该功能的前提是,使能verify boot功能,也就是:VERIFIED_BOOT宏
对于MOTA的开关在于ENABLE_VBOOT_MOTA_SUPPORT,存放于lk下的project/$Project.mk中
#Enable OTA Support
ENABLE_VBOOT_MOTA_SUPPORT := 1
ifeq ($(ENABLE_VBOOT_MOTA_SUPPORT),1)
DEFINES += VBOOT_MOTA=1
ENABLE_SECAPP_LOADER := 1
ENABLE_RPMB_SUPPORT := 1
从以上配置可以看到,但该功能打开时候,会定义VBOOT_MOTA,而关闭时候,会定义ENABLE_RPMB_SUPPORT和ENABLE_SECAPP_LOADER
MOTA的功能主要在LK阶段配合进行verifyboot功能。下面继续分析,MOTA打开和关闭时,在LK阶段操作的差异:
185#if !VBOOT_MOTA
186static const char *verity_mode = "androidboot.veritymode=";
187static const char *verified_state=" androidboot.verifiedbootstate=";
188static const char *keymaster_v1= "androidboot.keymaster=1";
189//indexed based on enum values, green is0 by default
在MOTA关闭的情况下,会读取verify mode,state,keymaster三者的参数,利用来校验。
例如,在update cmdline阶段,会去读取state的值
342#if !VBOOT_MOTA
343 uint32_t boot_state = boot_verify_get_state();
344#endif
而这些值都存入了cmdline
375#if !VBOOT_MOTA
376 cmdline_len+= strlen(verified_state) + strlen(vbsn[boot_state].name);
377 cmdline_len+= strlen(verity_mode) + strlen(vbvm[device.verity_mode].name);
378 cmdline_len+= strlen(keymaster_v1);
379#endif
如果mode等情况不匹配,则会报错,并在lK阶段向LCD打印错误界面和信息:
818#if !VBOOT_MOTA
819 if(device.verity_mode == 0) {
820#if FBCON_DISPLAY_MSG
821#if ENABLE_VB_ATTEST
822 display_bootverify_menu(DISPLAY_MENU_EIO);
823#else
824 display_bootverify_menu(DISPLAY_MENU_LOGGING);
并在log中给出信息:
Your device has been unlocked and can't betrusted.\nWait for 5 seconds before proceeding
同时,在boot_linux_from_mmc的函数流程中,还会去向TZ发送命令,去结合ROT功能校验密钥,镜像
1596#if VERIFIED_BOOT
1597#if !VBOOT_MOTA
1598 //send root of trust
1599 if(!send_rot_command((uint32_t)device.is_unlocked))
1600 ASSERT(0);
1601#endif
1602#endif
同时,在read device info的时候,会对设备进行额外分类,如果没有定义MOTA
2398#if !VBOOT_MOTA
2399 info->is_unlock_critical= 0;
2400#endif
2401 }else {
2402 info->is_unlocked= 1;
2403#if !VBOOT_MOTA
2404 info->is_unlock_critical= 1;
2405#endif
2406 }
2407 info->is_tampered= 0;
普通的unlocked标志会被定义为unlock_critical。这两者的差距,如果是普通的unlock,只能刷入特定的分区,而critical会全部被锁定,不允许刷入任何分区
3440#if VERIFIED_BOOT
3441 if(!device.is_unlocked)
3442 {
3443 /*if device is locked:
3444 * common partition will not allow to be flashed
3445 * critical partition will allow to flash image.
3446 */
3447 if(!device.is_unlocked&& !critical_flash_allowed(arg)) {
3448 fastboot_fail("Partitionflashing is not allowed");
3449 return;
3450 }
3451#if !VBOOT_MOTA
3452 /*if device critical is locked:
3453 * common partition will allow to be flashed
3454 * critical partition will not allow to flash image.
3455 */
3456 if(!device.is_unlock_critical&& critical_flash_allowed(arg)) {
3457 fastboot_fail("Criticalpartition flashing is not allowed");
3458 return;
3459 }
3460#endif //VBOOT_MOTA
最后,如果关闭了mOTA,会增加一个reboot mode,如下
4508#if VERIFIED_BOOT
4509#if !VBOOT_MOTA
4510 else if(reboot_mode == DM_VERITY_ENFORCING) {
4511 device.verity_mode= 1;
4512 write_device_info(&device);
4513 }
个人怀疑,可能是在FDE时候,会重启进入到一个加密的界面进行加密,而如果没有该reboot,不会出现这样的logo,其实这是根据这种verify的mode去进行判断操作。
总结
由于MOTA和ROT都是在android L后发布,且需要Km1.0来支持,意味着,如果手机项目从android L升级上来,那么KM一定为0.3,且不支持ROT和MOTA。
从目前来看,MOTA在打开的情况下,手机的密钥等数据是存储到emmc里面,而MOTA关闭时,会打开enable_rpmb的宏,所以才会将数据存入TZ的RPMB(FDE的keys是存到SSD,没有存到RPMB)。
- Keymaster/ROT/MOTA功能的关联
- LoadRunner的关联功能
- keymaster.js的使用(前端键盘快捷键)
- android keymaster
- Gluster简单加密xlator rot-13模块的测试
- MTK MOTA升级步骤
- ROT-13
- ROT-13
- Android TZ Keymaster
- 国内省市关联选择功能的实现
- ARCGIS属性数据的连接功能和关联功能
- Extracting Qualcomm's KeyMaster Keys
- 树状图中事件关联的功能的实现
- lR关联功能总结
- lR关联功能总结
- lR关联功能总结
- Link Rot检测
- csu 1567: Reverse Rot
- 【干货收藏】数据库技术百问_数据库从起步到进阶必备
- GHO文件转iso文件能启动安装
- 定义View元素和他们的属性
- iOS应用层加密相关
- HDFS读写流程
- Keymaster/ROT/MOTA功能的关联
- 多表查询
- PHP正则
- UITextView的使用
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-J-Our Journey of Dalian Ends
- 【整理】uclibc,eglibc,glibc之间的区别和联系
- Ubuntu 16.04 下 Matlab 2013a 中文乱码问题解决
- ProgressBar(进度条)-常用属性讲解与基础实例
- pix2code:从UI截图直接生成代码的神经网络工具