一、相关名词解释
1.公钥:通俗来说,公钥就是公开的密钥,是私钥拥有者公开的,公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据.
2.私钥:私有的钥匙,不会公开,私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。私钥加密算法非常快(与公钥算法相比),特别适用于对较大的数据流执行加密转换.
3.数字签名:简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换.本文中就是将发送的数据采用hash函数得到hash值,再用私钥对hash值加密得到数字签名
4.证书:字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份,数字证书包含了证书的版本信息;证书的序列号;证书所使用的签名算法;证书的发行机构名称;证书的有效期;证书所有人的名称;证书所有人的公开密钥;证书发行者对证书的签名
5.摘要(hash,哈希值):一种将任意长度的数据转换压缩成固定长度的函数,压缩之后得到的值叫做摘要.
(也叫杂凑值,哈希值,hash值,本文统一叫做hash值)
二、secure boot流程介绍
首先,我们要明白secure boot是什么?他的目的是什么?他的流程是什么?具体怎么实现的?
Secure boot指的是建立用于运行已验证应用程序的可信平台的启动序列。它从一个不可变的序列开始,使用密码验证验证代码的源,从而只执行授权的软件。启动序列将设备置于已知的安全状态,并检测软件的二进制操作和反射攻击。Secure boot的目的就是确保在系统平台上所执行的程序代码是厂商确认过的,避免有人恶意修改系统程序的恶意行为
Secure boot过程
(一)加密过程
1.首先要生成一对密钥对,即:public key和privete key
2.使用SHA256计算镜像的hash,并使用privete key对镜像的hash进行RSA2048签名
3.使用SHA256计算出public key的hash
4.将镜像+第2步中签名+public key进行打包形成新的镜像
5.第3步中的hash将会烧写到efuse中
(二)解密过程
1.首先从新的镜像中获取public key计算hash值
2.从efuse中读取public key的hash值进行对比,如果相同则继续,否则启动失败
3.从镜像中获取签名,然后使用RSA2048计算hash
4.使用SHA256计算镜像的hash值,与第三步计算出来的hash进行对比,相同则继续,否则启动失败
在此过程中,文件中包含了两个部分一是数据原文;二是利用私钥加密得到的签名;首先文件的接收者会利用你提供的公钥来解密文件后面的签名得到解密后的hash值,再拿原文件利用与加密时相同的算法来提取hash值,若两次的hash值相同呢,则证明文件就是你本人发的且文件的内容没有被篡改过;相反,若不一致呢,则表明在数据传输时出现问题,数据不可信.
在这里还有一个问题,如果你给的公钥已经被别人篡改为他提供的公钥的话,那么你发的任何数据都会被文件接收者视为无效的,所以如何才能保证公钥的安全可信呢??这就要用到数字证书了.
数字证书包含:
1、证书的版本信息;
2、证书的序列号,每个证书都有一个唯一的证书序列号;
3、证书所使用的签名算法;
4、证书的发行机构名称,命名规则一般采用X.500格式;
5、证书的有效期,通用的证书一般采用UTC时间格式;
6、证书所有人的名称,命名规则一般采用X.500格式;
7、证书所有人的公开密钥;
8、证书发行者对证书的签名。
数字证书在一个身份和该身份的持有者所拥有的公/私钥对之间建立了一种联系,由认证中心(CA)或者认证中心的下级认证中心颁发的。根证书是认证中心与用户建立信任关系的基础。在用户使用数字证书之前必须首先下载和安装。
认证中心是一家能向用户签发数字证书以确认用户身份的管理机构。为了防止数字凭证的伪造,认证中心的公共密钥必须是可靠的
三.具体步骤
一、生成keys
在MTK平台中,可以用MTK提供的tool可以自动生成keys,也可手动生成keys,下面具体来讲一下操作
手动方式:利用openssl生成private key和publickey,并用pem_to_der.py将pem的格式转换der的格式
pem_to_der.py的路径为:vender/mediatek/proprietary/scripts/sign-image_v2/cert_chain/der_extractor
生成private key:
openssl genrsa -out root_prvk.pem 2048
/*rsa是格式,2048是长度,目前在MTK都保持这样的格式*/
转换格式:
python pem_to_der.py root_prvk.pem root_prvk.der
生成public key:
opensslrsa -in root_prvk.pem -pubout > root_pubk.pem
转换格式:
python pem_to_der.py root_pubk.pem root_pubk.der
生成img key,用来签名和校验img
openssl genrsa -out image_prvk.pem 2048
自动方式:利用MTK提供的python工具来生成,并跟新相关file
-cd vendor/mediatek/proprietary/scripts/secureboot_autoconfig
-编辑以上目录下的configuration.xml
<codebase>换为当前codebase所放置的目录
<company>换为project所置于的目录(在device/的目录名称,如mediatek)
<project>换为project的名称
<scatter>FLASH采用NAND的project才需用到的,EMMC可忽略
<feature><hardware-secure-ctrl>内的attribute,ENABLE_SBC=”true”
<keyfile>下的<sbc_key>,<verified_key>,<**img_key>**若还未生成,可保留原来AUTO的预设值.若已经有生成,可设定为该pem档的位置
- sbc_key,verified_key皆为rsa-2048,img_key为rsa-1024
-执行tool.py
python tool.py
注:我这里用手动的方式来get_key,自动的方式就不演示了
二、产生oemkey.h和dakey.h
导