一般来讲,移动设备主要用来实现以下安全特性:
1. 禁止烧写未经授权的官方固件;
2. 禁止运行非经授权的官方固件;
3. 禁止非法追踪和调试代码;
4. 对单个芯片设定IMEI、SIM保护和其他特性证书;
5. 禁止设备固件降级,禁止诸如A设备的固件烧写到B设备的交叉写入;
6. 运行时候,无法被观测的可信运行环境;
7. 安全测试和调试功能;
8. DRM。
一般安全启动都会实现了上述的1、2、3、4、5、7项安全特性。
在实现安全特性时候,不能把大量数据解压缩到RAM,不应产生大的延迟。所以,
一般来说,对image等文件进行保护时候,一般会首先用hash算法,把image文件生成固定bit的信息摘要,然后使用数字签名技术对摘要进行签名,从而防止大量数据加密耗费时间。此步骤需要在pc端提供工具,比如sign,用来生成公钥和私钥,使用生成的私钥文件进行签名,最终生成image+签名+证书的image文件。其中,证书包括客户的公钥信息以及是否开启debug功能的字段。
对于特定客户来说,客户使用sign工具生成公私密钥对后,试用版hash算法把公钥信息hash化,然后发送给芯片公司,芯片公司在芯片出厂时候,把公钥或者其hash信息写入efuse相应字段。
上述加密工作是在pc端编译生成image文件的时候完成,一般在Makefile中调用命令实现。
一般芯片内部含有rom,开机启动时候自动运行,主要是把二级boot-loader(本文档中用SPL image代替)加载到内部ram运行。
大数据的情况下,生成信息摘要的哈希算法耗费时间较多,所以应该选择安全性好,速度快,消耗内存少的hash算法,hash算法经过了MD5,SHA0, SHA1,SHA2等算法,目前已经进化到了BLAKE2 算法,此处使用Blake2 hash 算法。
数字签名算法,应该选择安全性能高,速度快,所需内存少的算法,目前数字签名算法正越来越多的按照RSA->DSA->ECDSA->ED25519的顺序演进,诸如苹果等公司,在保护手机的私人数据时候,同样采用了ED25519算法,ssh也开始转向安全性能更高的ED25519。基于此,数字签名算法选择了ED25519.
在生成image文件的时候,使用sign工具,会生成包含公钥和安全debug标志的证书,证书同样会使用私钥进行加密,然后把证书添加在SPL image后面。
Secure boot步骤如下:
1. Rom code读取SPL image;
2. Rom code读取Efuse secure bit,如果不采用secure boot,则直接运行读取的SPL image(注意:安全模式选择不能通过pin管脚,因为太容易被改写);
3. Rom code 读取附加在image后面的证书,然后通过证书的magic判断证书是否存在,如果不存在的话,直接返回错误,否则使用pub keyhash,和efuse中读取的hash值判断,如果不一致,返回错误,一致的话,使用证书中的pub key 验证证书是否位有效证书;
4. 如果证书无效,返回错误,否则使用证书中的pub key验证SPL image是否有效。如果有效,则运行。
secure boot流程如图所示: