在使用PSoC6功能开发完成后,大家都会不禁想到安全性的问题,如何防止自己的固件被被人读出或者恶意篡改,这是发布产品之前都需要考虑的问题。
针对安全性,我们大概会想到几个大的方面去实现:
1. 禁掉debug口。防止别人通过debug口将程序读出或者写入,在芯片和外部直接的接口断掉
2. 安全启动,程序运行之前进行验证操作。只有验证通过的程序才可以运行在板子上,确保没有被篡改
3. 通信加密。比如通过串口或SPI口发送加密数据,只有用特定私钥加密过的指令才被接受执行
4. 芯片内部的区域保护。这是大部分用户忽略的一点,但这个措施在双核芯片上很常见。每个核有自己的一块可访问区域,也有共享区域,做到尽量互不干扰。一个核的奔溃不会波及到另外一个核的运行。
针对以上几个方面我们后续分几个系列讲解。这次主要讲解关于禁掉debug口。在讲如何禁掉debug口之前,我们需要了解一个概念:生命周期(Lifecycle)
对于PSoC6来说,一共有5个生命周期,分别为:
VIRGIN: 这是芯片在工厂时处于的阶段,在这个阶段,工厂会将trim value/boot code等写入芯片的SFlash中,并会产生一个hash value,之后会转入NORMAL阶段。
NORMAL: 当大家拿到芯片时,它就处于这个阶段。在这个阶段,用户可以通过debug口去访问芯片。现阶段很多用户程序发布后芯片依然处于这个阶段,如果对安全性要求比较高,可以将生命周期转入下个阶段SECURE。
SECURE: 在这个阶段,芯片从启动开始就开始一步步验证后续启动的程序和用到的公钥,确保每一步的安全性都有保障。
SECURE WITH DEBUG: 这个阶段是用来调试SECURE阶段的,它和SECURE的唯一区别是boot code是使用NAR(后续会讲到)配置debug口。
RMA: 这个阶段用于芯片出问题需要返厂做FA时使用,在这个阶段 debug 口会打开方便厂家访问memory查找问题,转到这个阶段的时候用户的一些重要及敏感信息会被删除,确保用户数据的安全性。
讲完生命周期我们看到用户拿到芯片后时处于NORMAL阶段的,如果安全性高那么可能用户会将其转到SECURE,下面介绍在这两个阶段如何通过配置禁掉debug口。
芯片在启动过程中,flash boot会根据芯片的生命周期的不同选择使用不同的配置去配置debug口。在NORMAL阶段使用NAR(Normal Access Restrictions)配置,在SECURE阶段使用SAR(Secure Access Restrictions)配置。
NAR与SAR结构是一样的,但是存储位置不一样。NAR存储在SFlash中,而SAR存储在efuse中。它们的结构如下图:
具体每位的含义大家可以参考:AN221111 中的附录C
那么在程序中应该如何写NAR和SAR呢?
写NAR方法:
只需要在自己的工程中加入以下代码:
CY_SECTION(".cy_sflash_nar") __USED uint16_t nar = 0x0007;
但是需要注意一点:debug口禁掉后如果芯片出现了问题,是无法返厂做FA的,所以做出禁掉debug口的决定一定要慎重。
写SAR的方法:
可以参考我们关于security的例程mtb-example-psoc6-security, 可以找到里面的cy_ps_efuse.h和cy_ps_efuse.c两个文件,修改结构体cy_efuse_data:
这个修改要生效需要在cy_ps_efuse.h中打开efuse: #define CY_EFUSE_AVAILABLE 1
且需要将生命周期转到SECURE
请注意,SECURE阶段请不要轻易转,后面一节我们会具体讲解如何转SECURE, 以及需要做哪些准备工作,有哪些注意事项。这里只是简单展示如何通过改efuse中的SAR。
本节先简单介绍到这里,希望大家看完能对PSoC6的生命周期有一个基本的概念,以及了解如何修改NAR和SAR。如果对这个主题感兴趣,可以访问 AN221111 和 mtb-example-psoc6-security 了解详细信息,也欢迎大家来infineon的communityhttps://community.infineon.com/来讨论交流。
|