工具/软件:TI C/C++编译器
尊敬的先生:
我们正在开发基于 28376S 的产品 、并希望保护存储器不受混响的影响(例如使用 JTAG 连接)
我已经按照 blinky_on_dCSM 示例进行操作 、并将其作为项目的一部分进行了植入
我使用以下命令创建了 asm 文件
…
cdecls "security.h"
.sect "Dcsm_otp_z1_linkpointer"
long Z1_link_pointer
长整型0xFFFFFFFF
long Z1_link_pointer
长整型0xFFFFFFFF
long Z1_link_pointer
长整型0xFFFFFFFF
.sect "Dcsm_otp_z1_pswdlock "
长整型0xFFFFFF77
长整型0xFFFFFFFF
.sect "Dcsm_otp_Z1_crclock"
;.long 0xFFFFFFFF
;.long 0xFFFFFFFF
.sect "Dcsm_otp_z1_bootctrl"
;.long 0xFFFFFFFF
;.long 0xFFFFFFFF
.sect "Dcsm_zsel_Z1"
长整型0xFFFFFFFF
长整型0xFFFFFFFF
long 0xDFFFFFFF;Z1-GRABRAM、CLA - Zone1、LSx 和 Dx 是安全的
long 0xD5555555;Z1-GRABECT,全部分配给 ZONE1
long password_KEY0;Z1-CSMPSWD0 (128位密码的 lsw)
long password_key1;Z1-CSMPSWD1
long password_key2;Z1-CSMPSWD2
.llong password_key3;Z1-CSMPSWD3 (128位密码的 MSW)
其中 password_KEY0.... password_key3 (是我定义的密钥)
Z1_LINK_POINTER 被定义为 0x1FFFFFFF 、例如区域选择块将位于0x78020
命令中添加了一个新的链接器
第0页:
…
DCSM_OTP_Z1_LINKPOINTER:origin = 0x78000,length = 0x00000C
/* Z1 OTP。 PSWDLOCK/保留*/
DCSM_OTP_Z1_PSWDLOCK:origin = 0x78010,length = 0x000004
/* Z1 OTP。 CRCLOCK/保留*/
DCSM_OTP_Z1_CRCLOCK:origin = 0x78014,length = 0x000004
/* Z1 OTP。 被保留/ BOOTCTRL */
DCSM_OTP_Z1_BOOTCTRL:origin = 0x7801C,length = 0x000004
/* DCSM Z1区域选择内容(!!可移动!!) *
/* Z1 OTP。 Z1密码位置/闪存和 RAM 分区*/
DCSM_ZSEL_Z1_P0:origin = 0x78020,length = 0x000010
/* Z2 OTP。 LinkPointers */
DCSM_OTP_Z2_LINKPOINTER:origin = 0x78200,length = 0x00000C
/* Z2 OTP。 GPREG1/GPREG2 *
DCSM_OTP_Z2_GPREG:origin = 0x7820C,length = 0x000004
/* Z2 OTP。 PSWDLOCK/保留*/
DCSM_OTP_Z2_PSWDLOCK:origin = 0x78210,length = 0x000004
/* Z2 OTP。 CRCLOCK/保留*/
DCSM_OTP_Z2_CRCLOCK:origin = 0x78214、length = 0x000004
/* Z2 OTP。 GPREG3/BOOTCTRL *
DCSM_OTP_Z2_BOOTCTRL:origin = 0x7821C,length = 0x000004
/* DCSM Z1区域选择内容(!!可移动!!) *
/* Z2 OTP。 Z2密码位置/闪存和 RAM 分区*/
DCSM_ZSEL_Z2_P0:origin = 0x78220,length = 0x000010
.
部分
{
/*OTP*/
DCSM_OTP_Z1_linkpointer :>DCSM_OTP_Z1_LINKPOINTER PAGE = 0
DCSM_OTP_Z1_pswdlock:>DCSM_OTP_Z1_PSWDLOCK PAGE = 0
DCSM_OTP_Z1_CLOCK:> DCSM_OTP_Z1_CRCLOCK PAGE = 0,TYPE = DSECT
DCSM_OTP_Z1_BOOTctrl:>DCSM_OTP_Z1_BOOTCTRL PAGE = 0,TYPE = DSECT
dcsm_zsel_z1:>dcsm_ZSEL_Z1_P0 page = 0//
DCSM_OTP_Z2_linkpointer:>DCSM_OTP_Z2_LINKPOINTER page = 0,type = DSECT
DCSM_OTP_Z2_pswdlock:>DCSM_OTP_Z2_PSWDLOCK PAGE = 0,TYPE = DSECT
DCSM_OTP_Z2_crclock:> DCSM_OTP_Z2_CRCLOCK page = 0,type = DSECT
DCSM_OTP_Z2_bootctrl:>DCSM_OTP_Z2_BOOTCTRL PAGE = 0,TYPE = DSECT
dcsm_zsel_z2:>dcsm_ZSEL_Z2_P0 page = 0,type = DSECT
}
软件与之结合
a.自定义引导加载程序 -在复位后运行,如果编程闪存 并重新存储闪存,则取消 DCSM 的安全保护
B.主要应用
对于不安全的过程(例如、4个虚拟读取、他们写入4个密钥)
空 UnsecureMemory()
{
volatile int tmp;
int i;
unsigned long LinkPointer;
无符号长整型*Zone1SelBlockPtr;
int bitpos = 28;
int ZeroFound = 0;
// volatile long * csm =(volatile long int *) 0x5F010;//csm 寄存器文件
volatile long * CSMPWL =(volatile long int *) 0x78080;//CSM 密码位置(假设
LinkPointer = DcsmZ1Regs.Z1_LINKPOINTER.ALL;
/*通过在 Z1LINKPOINTER*/中找到'0' MSB 来查找区域选择块
while ((ZeroFound = 0)&&(bitpos >-1))
{
if ((LinkPointer & 0x8000000)=0)
{
ZeroFound = 1;
ZONE1SelBlockPtr =(无符号长整型*)(0x78000 +((bitpos + 3)* 16));
}
其他
{
位 pos--;
LinkPointer = LinkPointer << 1;
}
}
如果(ZeroFound =0)
{
ZONE1SelBlockPtr =(无符号长整型*) 0x78020;
}
/*密码由前导码偏移(例如,区域选择块偏移0x8)*/
CSMPWL=Zone1 SelBlockPtR+4;
对于(I = 0;I < 4;I++)
tmp =* CSMPWL++;
DcsmZ1Regs.Z1_CSMKEY0 = PASSWORD_KEY0;
DcsmZ1Regs.Z1_CSMKEY1 = password_key1;
DcsmZ1Regs.Z1_CSMKEY2 = PASSWORD_key2;
DcsmZ1Regs.Z1_CSMKEY3 = password_key3;
}
对于安全(Z1_CR 中的强制位)
空 SecureMemory()
{
EALLOW;
DcsmZ1Regs.Z1_CR.bit.FORCESEC = 1;
EDIS;
}
出于测试目的,我从 应用程序中调用了 UnsecureMemory(),然后连接 JTAG 并观察 Z1_CR
它都是0,我本来想看到1时不安全 ,但事实并非如此,就好像函数不是以 PMF 为前缀,请告知