This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320F28376S:DCSM 不安全

Guru**** 2387080 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/908457/compiler-tms320f28376s-dcsm-not-secure

器件型号:TMS320F28376S

工具/软件: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 为前缀,请告知

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [引用]出于测试目的,我从  应用程序中调用了 UnsecureMemory(),然后连接 JTAG  并观察 Z1_CR

    在执行 UnsecureMemory() 函数之后,应用程序的功能是什么。 您能否从应用程序本身检查 Z1_CR 值,如果设置了不安全位,则切换某些 GPIO? 由于所有闪存扇区都是安全的,并且如果在调用 UnsecureMemory() 函数之后应用程序继续从闪存运行,则 器件必须不受保护,因为您可以 连接到 CCS。

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vivik:  

    我在另一个帖子中找到了答案,似乎在取消安全保护之前,需要禁用闪存缓存

    /*禁用闪存卡-解锁需要*/
    Flash0CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 0;
    Flash0CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 0;

    然后是不安全的