本帖最后由 小恩GG 于 2022-7-5 15:31 编辑
LPC55:禁用ISP和SWD实现代码保护
在LPC早期发布的一些产品中,如LPC11xx、LPC17xx、LPC18xx、LPC40xx、LPC43xx、LPC8xx等,使用 CRP 实现代码保护,CRP有三种不同的安全级别:CRP1、CRP2和CRP3,各自的安全级别大体如图1所示。 图1 LPC55系列 (LPC55(S)0x, 1x,2x,6x) 不再使用CRP机制进行安全保护,而是用Secure boot,配置PFR(Protected Flash Region)等方式实现。其中,所有带S (LPC55S) 的芯片支持Secure boot,如LPC55S28,LPC55S06等等。而非S系列产品,如LPC5506,LPC5528等等,只能通过配置FPR相关字段来实现代码保护。 在CRP的三个安全等级中,CRP2最为常用。在使用CRP2时,SWD的访问将被阻止,所以SWD没有办法对Flash进行读写或者擦除操作,ISP也无法对Flash内容进行读取。此外,未经授权的用户并不能通过擦除部分Flash方式修改现有代码,一旦设置为CRP2, 只有Mass Erase Flash后才能继续正常使用,这样便有效的阻止了他人读取和修改代码。 遗憾的是LPC55系列 (LPC55(S)0x, 1x,2x,6x) 没有和CRP2完全一样的功能机制,这也是很多初识LPC55的用户感到不适应的地方。不过,若想实现与CRP2相似的功能我们可以通过配置CMPA实现, 即禁用ISP和关闭SWD调试口。
1. 禁用ISP 客户制造编程区域 (CMPA) 属于PFR的一部分,通过配置BOOT_CFG来选择ISP模式的启用情况。表1为CMPA中9E40字地址开始的字段表,ISP控制域已用红色标识,表2为ISP域的模式选择,111为ISP禁用。若禁用ISP模式,设置BOOT_CFG=0b1110000。 表1 表2 2. 关闭SWD调试口
搭配使用 CC_SOCU_PIN 以及 CC_SOCU_DFLT 寄存器用于定义模块的SWD调试访问权限。其中,CC_SOCU_PIN寄存器将调试域细分,不同位代表不同的调试域,对该位置1表示可操作。CC_SOCU_DFLT 寄存器设置可操作调试域的最终访问级别,置1表示禁用。也就是说,将CC_SOCU_PIN及CC_SOCU_DFLT寄存器相对应的位同时置1,便能禁用该模块。如图2。 图2 两寄存器低8位的每一位都代表某一子域,将两寄存器的低8位全部置1,即可关闭全部子域的SWD访问权限。
3. 代码实现关闭/开启 ISP和SWD
以LPC5506为例,配置CMPA字段: 关闭ISP和SWD: 图3 除上图被标红的三处外,其余皆保持CMPA默认值。 - 设置BOOT_CFG为0x70,禁用通过ISP 引脚进入ISP 模式功能。 - 其余两处0xFF分别为寄存器CC_SOCU_PIN和CC_SOCU_DFLT所在地址,即将调试访问的子域全部关闭。
图4 除上图被标红的三处外,其余皆保持CMPA默认值。 - 设置BOOT_CFG为0x00,开启自动ISP模式。 - 其余两处0x00分别为寄存器CC_SOCU_PIN和CC_SOCU_DFLT所在地址,对调试访问的子域不做修改。
通过串口命令(1或0)开启或关闭SWD及ISP功能。 图5
例程见附件。该例程已在LPCXpresso55S06 开发板测试通过。
注意: CMPA的设置在Reset或重启生效,一旦在CMPA里关闭了ISP和SWD, 在断电前不要擦除或下载其他程序!否则开发板的ISP和SWD口将永远锁死无法使用。 NOTE: As system security requirements and the attack surface evolves, it is important for customers to understand the types of attacks (especially advanced physical attacks) which NXP does not claim to protect against, or strongly mitigate, so that appropriate mitigation can be taken by the customer at the system level if necessary.
|