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)。

原创粉丝点击