当前位置: 首页 > news >正文

在IAR Embedded Workbench for Arm中实现NXP S32K3安全调试

随着汽车电子系统变得越来越智能,对功能安全(Safety)的要求越来越高,同时信息安全(Security)也越来越被关注,安全调试(Secure  Debug)机制已成为一个重要的信息安全特性。NXP推出的S32K3系列MCU配备了多层次的生命周期管理和硬件安全引擎(Hardware Security Engine,HSE),以确保在产品开发与部署中的信息安全。

本文主要介绍如何在IAR Embedded Workbench for Arm中实现NXP S32K3的安全调试。

NXP S32K3生命周期与调试权限

NXP S32K3的生命周期(Lifecycle,简称LC)是芯片内用于表示设备状态的重要机制,其状态变化遵循单向流程,不可逆转。生命周期的不同阶段(如: CUST_DEL、OEM_PROD、IN_FIELD等)决定了开发者是否可以访问特定的调试功能和HSE接口。调试功能通常在开发阶段可用,而在量产阶段需限制,以防止未经授权的访问。在生命周期进入CUST_DEL后面的阶段(如:OEM_PROD、IN_FIELD、PRE_FA),可以配置为Trusted,即开发者通过安全身份认证机制,才可以访问调试端口,进行软件调试。

安全调试身份认证机制

当MCU调试端口被设置为受保护状态后,若调试器未能通过身份认证,将无法建立调试会话。NXP提供了两种主要的身份认证方式:

  1. 静态认证(Static Authentication):
    调试器在每次复位后需提供相同的预设密钥(Application Debug Key/Password, ADKP)以解锁调试接口。
  2. 动态认证(Dynamic Authentication):
    调试器在每次复位后,需基于芯片生成的挑战数据进行加密计算,并返回相应响应数据以完成身份认证。

这两种模式均需通过HSE接口在CUST_DEL阶段配置,配置方式依赖于HSE的set attribute服务接口(HSE_DEBUG_AUTH_MODE_ATR_ID)。

另外,在每种身份认证方式下,都有两种情况,一种是密钥与MCU UID无关(w/o UID diversified), 另一种则是密钥与MCU UID相关(w UID diversified)。

加锁调试端口

加锁调试端口具体流程请咨询NXP。

  1. 128 位ADKP是一个非常重要的 OTP HSE 系统属性,与安全调试、生命周期和 IVT 身份验证等功能密切相关。通过配置ADKP可以实现加锁调试端口,加锁方式如下:可以直接编写程序烧录ADKP,或者通过HSE进行配置。
  2. 生命周期需要配置到CUST_DEL之后的生命周期(OEM_PROD、IN_FIELD等),调试端口可基于ADKP的配置进行保护。生命周期配置到进入下一阶段之前,确保ADKP已配置。

安全调试辅助工具 SDAF

NXP提供了对应的安全调试辅助工具(Secure Debug Assist Firmware, SDAF),支持用户在IAR Embedded Workbench for Arm中实现静态和动态身份认证。该工具可用于密钥派生、加密封装、UID管理等关键操作。

SDAF支持如下功能:

  • 利用芯片UID派生ADKP密钥
  • 封装ADKP(支持RSA-2048加密)
  • 将封装密钥注册至本地数据库

SDAF工具与IAR调试脚本配合使用,以实现身份认证流程。SDAF工具可以在NXP S32DS的安装目录中找到,更多关于SDAF工具的信息请咨询NXP。

安全调试(静态认证)操作流程

    开发环境: IAR Embedded Workbench for Arm v9.60.4 + I-jet 硬件调试器

    1. 准备工作:
      a)    调试端口已加锁的NXP S32K3 MCU
      b)    获取UID:在调试选项界面配置--macro_param vlk_path="C:/NXP/S32DS.3.5/S32DS/tools/S32Debugger/Debugger/Server/CCS/bin"即配置SDAF工具的路径,然后直接启动调试,身份认证失败后会退出调试,但在Debug log中有打印UID信息。  (只有With UID Diversified情况下,需要进行这步操作) 

    c)    获取ADKP。ADKP为认证密钥,一般由安全人员保管。本示例的ADKP为0x00112233445566778899AABBCCDDEEFF

    2.使用SDAF工具(需要使用admin权限操作SDAF工具),通过volkano_utils.exe的derive_adkp命令,用芯片 UID 来派生 ADKP。(只有With UID Diversified情况下,需要进行这步操作)

    3.在Debugger选项中,按下图格式输入密钥,本示例中:
    a)    Without UID Diversified模式: 密钥为0x00112233445566778899AABBCCDDEEFF
    b)    With UID Diversified模式: 密钥为上一步所生成的派生后的ADKP,本例为 0xB61A47A672A895E0F384EA32EBD99626

    4.启动调试后,在连接内核时,会调用调试脚本的函数_ExecDeviceCoreConnect() -> _authentication() ->_key(),将密钥写入相应的寄存器。

    5.密钥写入后, _authentication()函数检查是否JTAG调试已开放,如已开放,则继续调试,否则退出调试。

    总结

    本文主要以静态认证为例介绍了如何在IAR Embedded Workbench for Arm中实现NXP S32K3的安全调试。NXP S32K3的动态认证安全调试也已经在IAR Embedded Workbench for Arm中实现。

    http://www.dtcms.com/a/330910.html

    相关文章:

  1. python sqlite3模块
  2. iOS App TF上架全流程实战 高效内测分发与IPA包管理
  3. 【KALI】第一篇 安装Kali Linux虚拟机之详细操作步骤讲解
  4. Elasticsearch RBAC 配置:打造多租户环境的安全访问控制
  5. 一篇文章读懂.Net的依赖注入
  6. 应用银行卡识别技术,构建更安全、便捷的数字身份认证与支付生态
  7. LeetCode hot 100 day1
  8. springboot+vue实现通过poi完成excel
  9. 云计算-多服务集群部署实战指南:从JumpServer到Kafka、ZooKeeper 集群部署实操流程
  10. MySQL流程处理函数
  11. 计算机视觉Open-CV
  12. Swift 实战:用链表和哈希表写出高性能的贪吃蛇引擎(LeetCode 353)
  13. 力扣-1143.最长公共子序列
  14. 【LeetCode 热题 100】295. 数据流的中位数——最大堆和最小堆
  15. 前端开发如何优化 SEO:常见问题及解决方案全解析​
  16. JMeter性能测试详细版(适合0基础小白学习--非常详细)
  17. 简单好用的桌面时钟—— Digital Clock 4
  18. 飞算JavaAI开发全流程解析:从自然语言到可运行工程的智能进化
  19. [Android] 二十四节气日历v1.0.3 - 弘扬传统文化,精致设计,无广告纯净体验!
  20. 考研408《计算机组成原理》复习笔记,第五章(3)——CPU的【数据通路】
  21. 双机热备实验
  22. Linux编程1:进程和线程
  23. DTW算法判断两条曲线的相似度,Python代码
  24. [激光原理与应用-272]:理论 - 波动光学 - 单纯的白色其实并不单纯
  25. 迅为RK3562开发板获取Android13源码
  26. 3D商品展示:技术狂欢下的普及困局
  27. 【新启航】起落架大型结构件深孔检测探究 - 激光频率梳 3D 轮廓检测
  28. Uniapp 自定义头部导航栏
  29. 表达式树实战:Unity动态逻辑编程
  30. 考研408《计算机组成原理》复习笔记,第三章(6)——Cache(超级重点!!!)