Khorina · 1月22日

汽车信息安全 -- SHE 密钥更新流程

在之前文章汽车信息安全--SHE 中的密钥管理中,我们提到了关于 SHE 密钥更新的流程。

不过最近在做实际实现和规范的追溯关系时,发现了实际与理想还是存在不小差距,所以还是将流程再梳理梳理。

1.总体流程

在《AUTOSAR_FO_TR_SecureHardwareExtensions》第 4.9 章节提到了关于密钥更新协议,图太大且细节多,还是从总体来看,如下:

image.png

每一步流程就不赘述了,前篇文章有,我们看主要里面具体实现细节。

首先回顾一下背景,SHE 规范中对于密钥槽位设计是相对固定的,

Image

其中,MASTER_ECU_KEY 主要在更新密钥时作为授权密钥来辅助更新 SHE 中其他槽位中的密钥(如 KEY_1\2 等等),因此这个密钥一般都是由 ECU 的 Owner(OEM 或者 Tier 1)来管理和固化。

在第一步中我们看到 Generator 会使用数据库中的 Kauth、Knew、CID、UID、FID 用于生成 M1~M5。

其中:

  • Kauth:即授权密钥,一般就是 Master key;
  • Knew:要更新的密钥值;
  • CID:密钥更新的计数值,每成功升级一次需要递增;
  • FID:功能 ID,目前看多数是要符合 HIS SHE 和 GM-SHE+的规格;
  • UID:特定的 ID,其实最容易出问题的就是这个 UID;按理说芯片出厂后会固化一个 UID 但是像 TC3x 这种 UID 都是 16Bytes 且 Host 可见,无法满足 SHE 的规格,

所以在实际开发过程中,大家对于这个 ID 的讨论会更加多一点,例如如果是软件模拟 SHE 的设计,那就不一定是芯片厂固化的 UID 了,UID 可能就是 ECU 的 ID,,有可能是产品批次号+ECU 硬件版号,也有可能是供应商本身自己设置的 ID,也有可能开发图省事不使能通配符直接使用默认值 00(当然这是风险),五花八门。

2.生成 M1~M5

上述信息用于生成 M1~M5(Message 1~5),这几个消息的格式总结如下:

Image

M1 就是简单的消息拼接,会用到 UID,SHE ID 是指要更新的密钥槽 ID、AuthID 就是授权 Key 的密钥槽 ID;

M2 稍微复杂一点,首先拼接 256bits 数据,使用 CID、FID 和 KEY(实际应该是 Key 的值,不知道为啥叫 KEYid),中间填充补 0。

其中要关注 FID,SHE 的标准中对 NVM Key 定义了 5 种功能属性,如下:

  • WRITE_PROTECTION:写保护,一旦置 1,该密钥无法改变,且不可逆;
  • BOOT_PROTECTION:启动保护,一旦置 1,如果安全启动发现 MAC 值不匹配,则有该属性的 KEY 都将失效,无法使用;
  • DEBUG_PROTECTION:一旦置 1,再次复位如果调试器连接 MCU,则有该属性的 KEY 都失效;
  • WILDCARD:通配符保护,一旦置 1,就必须使用真实的芯片 UID 来更新密钥;否则就可以使用特定值进行更新
  • KEY_USAGE:一旦置 1,该密钥只能作为 MAC 的生成或校验;否则用于加解密;
  • CMAC_USAGE:该 Flag 来源 GM-SHE+,有效前提是 KEY_USAGE 置 1;一旦该 Flag 置 1,有该属性的密钥只能用于 MAC 校验,不能用于生成 MAC。

因此,可以看到,当 KEY_USAGE 置 1 时,FID 总长度为 6bits;反之为 5bits,相应填充就要做增减;

数据拼接好后,使用 AES-Miyaguchi-Preneel 压缩算法生成第一个 K1,然后对上述数据进行 CBC 加密,IV 为 0,得到 M2。注意,K1= KDF(Kauth | KEY_UPDATE_ENC_C),在标准中 KDF 定义如下:

Image

这里出现了第一个 SHE 规范定义的常数,KEY_UPDATE_ENC_C,其他参数如下:

Image

M3 相对容易,首先使用 KDF(Kauth | KEY_UPDATE_MAC_C)计算出第二个密钥 k2,使用 k2 对(M1 | M2)进行 CMAC 计算;

M4 和 M5 主要用于验证,首先回顾下 M4 的结构,M4 = M1 | M4*:

Image

其中,M4 *的计算会用到 K3,计算公式为 KDF(Knew | KEY_UPDATE_ENC_C),然后使用 K3 对上述黄框内数据进行 ECB 加密;

M5 则是使用 K4 对 M4 进行 CMAC 计算,K4 = KDF(Knew | KEY_UPDATE_ENC_C)。

3. 代码示例

现在,M1~M5 均计算成功了,那每个数据该怎么使用呢?我们来看这个流程:

Image

在 CP AUTOSAR 中,会使用 Crypto_KeyElementSet 进行密钥设置,特别的,在说到 SHE-key 更新时,要求密钥值本身格式按照 M1| M2|M3 拼接:

Image

通过 Crypto_KeyElementSet 将 M1M2M3 传入后,首先根据要更新的 Key 是否受 WriteProtection,

如没有保护,则继续进行 SheKeyUpdate,检查 M1 中的 SHE ID 和 Auth ID 是否在 SHE 规范定义的密钥槽 ID,特别是 secret key 和 master key;

一切准备就绪后,开始验证 M3、提取 Key、并生成 M4 和 M5,伪代码如下:


/* Step1:Verify M3 */
if( E_OK == UpdateSheKey_VerifyM3())
{
    /* Step2: Check UID */
    if( E_OK == UpdateSheKey_CheckUID())
    {
          /* Step3: Get New Key, include gen k1, decrypt M2, check cid */
          ret = UpdateSheKey_GetNewKey(); 

          if (E_OK == ret )
          {
            /* Step4: Store CID\FID */
            UpdateSheKey_SetFid();
            UpdateSheKey_SetCid();
            /* Step5: Generate M4M5 */
            UpdateSheKey_GenM4M5();
          }  
    }
}

ECU 将生成好的 M4、M5 返回给 Tester,Tester 将其和本地保存的 M4M5 进行比较,一致则作为密钥更新成功的证据(即 Proof),并上报服务器,OEM 记录 CID+1,作为下次更新的 CID。

END

作者:快乐的肌肉
文章来源:汽车MCU软件设计

推荐阅读

更多物联网安全,PSA 等技术干货请关注平台安全架构(PSA)专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入PSA 技术交流群,请备注研究方向。
推荐阅读
关注数
4573
内容数
207
Arm发布的PSA旨在为物联网安全提供一套全面的安全指导方针,使从芯片制造商到设备开发商等价值链中的每位成员都能成功实现安全运行。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息