SHE(Secure Hardware Extension) 是外接硬件,通过硬件加密来保护软件攻击。HIS 联合会在2009年发布了SHE的标准。SHE把密匙从MCU隔离出来并且提供认证,加密和解密等服务。SHE在算法层面支持AES 128,CMAC 和Miyaguchi-Preneel compression function。SHE也可以用来做MCU安全启动。
SHE是一个简单的标准。相比于HSM,SHE更容易整合而且使用相对简单的加密认证算法,但是价格会相对便宜。
NXP-CSE3 (Cryptographic Service Engine V3)
CSE模块是完全兼容SHE规范的,有以下features:
密钥的安全储存
AES-128 加密解密
AES-CMAC 认证
RNG
安全启动
系统总线主接口
支持50个用户密匙
低电模式(没用过)
命令结束后生成中断
调试模式下密匙使用控制
CSE用到了系统的一次性可编程存储器(efuse),有下面5个:
秘密密钥(secret key):用来CSE里的rng密钥和次要密匙生成,用户接触不到
初始身份验证密钥(Initial Authentication Key):
用户身份证明(UID):
Flash Key:用来加解密密匙镜像和固件,用来生成辅助认证密钥
安全计数器(Secure Counter):每次更新密匙镜像时+1,用来防止被回退到老的密匙镜像,因为老密匙镜像有被盗取的风险。一共有42组OTP,可用值为0-42
一共55把密匙:
secret key:efuse里面的 介绍过了
Master Ecu Key:用来更新除了Secret Key的其他Key
Boot Mac Key:Secure Boot时来验证软件
Boot Mac:Secure Boot时和计算出来的MAC值对比来判断Secure Boot是否成功
50把user key,用来做软件中加密加密和认证
密钥属性:
Write protection:如果置位密匙将无法通过指令清除
Boot protection:如果置位密匙在secure boot没通过的情况下将被锁定,secure boot实现的一部分,保证软件在被篡改的情况下相关服务将无法使用(0x27,0x29,SecOC等)
Debug protection:如果置位密匙在debugger自从上次重置后连接到MCU将被锁定
Key usage:加解密和认证模式切换
Wildcard protection:如果置位密匙将不会被其他UID更新,保证其MCU指令的独立性
Verify only:在Key uage = 1时 如果置位密匙将不能用来generate mac
BootROM第一个读取的时镜像向量表,CSE镜像地址应该填到CSEKeyAddr0里面,appImagePrimary填入需要验证的内存开始地址,cmac填入IVT正确的计算出来的mac值
/* IVT header configuration */
const ivt_image_t IVT_Image __attribute__((section(".ivt"))) =
{
.header = IVT_HEADER,
.reserved1 = {0xFF, 0xFF, 0xFF, 0xFF},
.selfTestDCDPrimary = NULL,
.selfTestDCDBackup = NULL,
.DCDPrimary = NULL,
.DCDBackup = NULL,
.CSEKeyAddr0 = CSE_KEY_IMAGE0_ADDR,
.CSEKeyAddr1 = CSE_KEY_IMAGE0_ADDR,
.appImagePrimary = APP_HEADER_START_ADDR,
.appImageBackup = NULL,
.bootConfigWord = IVT_BOOT_CONFIG_WORD,
.cmac = {0x7D, 0x2D, 0xFA, 0x37, 0xAE, 0x5C, 0xD7, 0x83, 0x15, 0x9E, 0x5C, 0xBA, 0xED, 0xDB, 0x7A, 0x31}
};
ramStart填入需要校验的app开始地址,length填入app校验长度(不过更改这两个值会导致boot起不来,不知道为什么,可能跟cmac值有关)。
/* App header configuration */
const app_image_t APP_Image __attribute__((section(".app_primary"))) =
{
.header = APP_HEADER,
.ramStart = __app_header_start,
.ramEntry = Reset_Handler,
.length = (uint32_t)__user_app_length,
.ivpr = __IVPR_VALUE
};
Secure boot mode 有一个2 bits 的 efuse,当值不为11时 bootrom会自己触发secure boot 命令,只要有效密匙镜像写入IVT表内就可以进行secure boot 并初始化完成
一般的实现流程:
OTP写入flash key
用Fimware镜像和默认的密匙镜像启动软件,这时secure boot mode应该为0,secure boot在初始化阶段都是被执行,debug看CSE寄存器显示安全启动失败,之后初始化rng,写入各种key和对应的key flag,mackey,还有mac,当写完之后publish key 到一个地址,然后通过外部flash写到CSE镜像地址上覆盖掉原来的默认值。写各种key应该只运行一次,之后会执行另一套代码,而且外部flash写入只需要一次。为了保持前后计算mac的值一致,可以用rom或者flash来做一个只执行一次的flag。最后再把secure counter efuse +1。但是把secure counter efuse从0写到1的时候,软件debug会出错误