打印

C2000的CSM加密问题请教

[复制链接]
9239|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
   最近看到C2000系列有一个CSM加密功能,看了下资料,好像是在烧录时先烧录程序,再把密码烧进去,然后别人就无法读取芯片的FLASH了,  如果自己想要重新编程烧录,就得先在软件里输入密码,unlock,才能重新烧录,我的理解正确吗?  然后有的是在程序里做了这个处理,这是如何做的呢?  请教各位

相关帖子

沙发
309579471|  楼主 | 2015-6-8 11:08 | 只看该作者
有使用过的,出来讨论下 :handshake

使用特权

评论回复
板凳
zhangmangui| | 2015-6-8 21:49 | 只看该作者
本帖最后由 zhangmangui 于 2015-6-8 22:00 编辑

TI C2000 DSP程序加密2种方法(显性和隐性)
显性和隐性不可同时使用
1.显性法

选中Tools-F28xx On-chip Flash Programmer进入Flash编程界面(如下图所示),如上图所示,或者点击此图标。
Flash编程界面
在“Code Security Password”区域设置好程序密码,然后按“Program Password”确定密码设置。在设置密码的时候,注意不要将Key0-Key8全设置为0,
如果全为0,则芯片将会永久“Lock”!如果采用这种显性方法设置密码,在生产产品的时候,你需要将密码告诉生产线上的Flash烧写人员,以至除了公司
核心的人员外,还会有更多的人知道你的程序密码,给保密性带来不利!
2.隐性法
为了避免上述情况的发生,让更少的人知道程序的密码,甚至只让一个人知道程序的密码,可以将密码嵌入到程序中,与其他程序一起编译好后,
生成.out文件,这个时候,你只需要将.out文件给FLASH烧写人员就可以,不需要再让FLASH烧写人员自己设置密码,我们把这种方法叫做隐性法,
在使用串口烧写FLASH的时候,也需要采用这种方法进行程序加密。
将下面的程序保存为.asm文件,添加到工程中,与其他文件一起编译。

.sect "csmpasswds"
.int 0xFFFF ;PWL0 (LSW of 128-bit password)
.int 0xFFFF ;PWL1
.int 0xFFFF ;PWL2
.int 0xFFFF ;PWL3
.int 0xFFFF ;PWL4
.int 0xFFFF ;PWL5
.int 0xFFFF ;PWL6
.int 0xFFFF ;PWL7 (MSW of 128-bit password

.sect "csm_rsvd"
.loop (3F7FF5h - 3F7F80h + 1)
.int 0x0000
.endloop

将下面的语句写入CMD中,

MEMORY
{

CSM_RSVD : origin = 0x3F7F80, length = 0x000076

CSM_PWL : origin = 0x3F7FF8, length = 0x000008

}
SECTIONS
{

csmpasswds : > CSM_PWL PAGE = 0

csm_rsvd : > CSM_RSVD PAGE = 0

}
按照上面的方法编译好后,你的程序已经加密好了,你只需要将生成的.out交给Flash烧写人员就可以了!

使用特权

评论回复
评论
TXB0922 2022-3-4 17:11 回复TA
那这个 .out是明文还是密文啊;如果是明文的话是不是也能看得出里面的密码 
地板
309579471|  楼主 | 2015-6-9 08:44 | 只看该作者
版主  你太流弊了。。。

使用特权

评论回复
5
309579471|  楼主 | 2015-6-9 08:48 | 只看该作者
zhangmangui 发表于 2015-6-8 21:49
TI C2000 DSP程序加密2种方法(显性和隐性)显性和隐性不可同时使用1.显性法

选中Tools-F28xx On-chip Flash ...

这里还有个问题,如果显性操作 可以在软件上解密,再重新烧录。但是如果是隐形操作,我需要重新烧录程序时该咋办?

使用特权

评论回复
6
xmuhwei| | 2015-6-9 09:35 | 只看该作者
309579471 发表于 2015-6-9 08:48
这里还有个问题,如果显性操作 可以在软件上解密,再重新烧录。但是如果是隐形操作,我需要重新烧录程序 ...

Uint16 CsmUnlock()
{
    volatile Uint16 temp;

    // Load the key registers with the current password. The 0xFFFF's are dummy
        // passwords.  User should replace them with the correct password for the DSP.

    EALLOW;
    CsmRegs.KEY0 = 0xFFFF;
    CsmRegs.KEY1 = 0xFFFF;
    CsmRegs.KEY2 = 0xFFFF;
    CsmRegs.KEY3 = 0xFFFF;
    CsmRegs.KEY4 = 0xFFFF;
    CsmRegs.KEY5 = 0xFFFF;
    CsmRegs.KEY6 = 0xFFFF;
    CsmRegs.KEY7 = 0xFFFF;
    EDIS;

    // Perform a dummy read of the password locations
    // if they match the key values, the CSM will unlock

    temp = CsmPwl.PSWD0;
    temp = CsmPwl.PSWD1;
    temp = CsmPwl.PSWD2;
    temp = CsmPwl.PSWD3;
    temp = CsmPwl.PSWD4;
    temp = CsmPwl.PSWD5;
    temp = CsmPwl.PSWD6;
    temp = CsmPwl.PSWD7;

    // If the CSM unlocked, return succes, otherwise return
    // failure.
    if (CsmRegs.CSMSCR.bit.SECURE == 0) return STATUS_SUCCESS;
    else return STATUS_FAIL;

}

使用特权

评论回复
7
zhangmangui| | 2015-6-9 22:23 | 只看该作者
309579471 发表于 2015-6-9 08:48
这里还有个问题,如果显性操作 可以在软件上解密,再重新烧录。但是如果是隐形操作,我需要重新烧录程序 ...

DSP2833x_CSMPasswords.asm中的密码用于实际加密;
F28xx On-Chip Programer中的密码用于解密(这里的密码只用于解密,不会修改Flash中的密码区)




补充一点,当DSP2833x_CSMPasswords.asm中没有加密时(如上面的例子,所有PWL0~7里的内容都为0xFFFF),可以在烧写完毕.out文件后,
在F28xx On-Chip Programer中填入你的密码,然后点击lock就加密了,相当于对密码区写入你上面.asm文件中的内容。

使用特权

评论回复
8
zhangmangui| | 2015-6-9 22:25 | 只看该作者
加密2种途径:

1. 密码伴随.out文件烧入;

2. 单独操作F28xx On-Chip Programer烧入密码。




解密2种途径:

1. 密码伴随.out文件烧入;

2. 单独操作F28xx On-Chip Programer解密。



使用特权

评论回复
9
firstblood| | 2015-6-11 21:00 | 只看该作者
这个用法一般都大同小异的,关键是需要记得你的密码的。

使用特权

评论回复
10
晴天001| | 2016-3-28 09:58 | 只看该作者
xmuhwei 发表于 2015-6-9 09:35
Uint16 CsmUnlock()
{
    volatile Uint16 temp;

请问下  CsmUnlock()  这个函数放到程序的什么地方呢,刚进入main时就执行该函数吗?
但是对于已加密的芯片,程序都烧不进去,不会执行该函数的
麻烦指教,谢谢

使用特权

评论回复
11
FireRiver9| | 2016-3-28 12:08 | 只看该作者
密码伴随.out文件烧入

使用特权

评论回复
12
晴天001| | 2016-3-28 12:46 | 只看该作者
本帖最后由 晴天001 于 2016-3-28 12:52 编辑
FireRiver9 发表于 2016-3-28 12:08
密码伴随.out文件烧入

烧入密码我没疑问,问题是第二次烧入时使用uniflash软件实现烧入,需要密码,我又不想把密码给烧录人员,怎么办?
前面的帖子提到使用CsmUnlock()  函数,我没理解怎么用这个函数
我用的芯片是c2000系列的

使用特权

评论回复
13
songwenshuai| | 2016-4-10 08:09 | 只看该作者
xmuhwei 发表于 2015-6-9 09:35
Uint16 CsmUnlock()
{
    volatile Uint16 temp;

版主你好!我在仿真时候不知道怎么锁住了没法进debug 错误提示是
C28xx: Flash Programmer: Device is locked or not connected. Operation cancelled.
C28xx: GEL: File: C:\Users\songwenshuai\workspace_v5_5\test\Debug\test.out: Load failed.

我的是CCS5.5,这时候我该怎么解锁?我没有改过密码,也没有点过锁定,为什么会被锁定?谢谢版主。还有这个函数用在什么地方?如果没法烧写文件,那该怎么解锁?我的芯片是2808

使用特权

评论回复
14
s2012fy| | 2016-11-2 18:53 | 只看该作者
zhangmangui 发表于 2015-6-9 22:23
DSP2833x_CSMPasswords.asm中的密码用于实际加密;
F28xx On-Chip Programer中的密码用于解密(这里的密 ...

你好,我想问的是如果我加密了怎样通过程序检测该程序是加密了的?

使用特权

评论回复
15
zhangmangui| | 2016-11-2 22:07 | 只看该作者
s2012fy 发表于 2016-11-2 18:53
你好,我想问的是如果我加密了怎样通过程序检测该程序是加密了的?

这个具体通过程序如何检测确实不知道  
我只知道CCS操作使用时

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
s2012fy + 1 赞一个!
16
s2012fy| | 2016-11-5 11:10 | 只看该作者
zhangmangui 发表于 2015-6-8 21:49
TI C2000 DSP程序加密2种方法(显性和隐性)显性和隐性不可同时使用1.显性法

选中Tools-F28xx On-chip Flash ...

隐性加密时能用程序里面的变量作为密码去加密?

使用特权

评论回复
17
zhangmangui| | 2016-11-5 22:29 | 只看该作者
s2012fy 发表于 2016-11-5 11:10
隐性加密时能用程序里面的变量作为密码去加密?

工厂烧写都是这样的   

使用特权

评论回复
18
s2012fy| | 2016-11-7 12:03 | 只看该作者
zhangmangui 发表于 2016-11-5 22:29
工厂烧写都是这样的

能说一下思路吗,我利用寄存器将密码怎么也写不进那块内存

使用特权

评论回复
19
zhangmangui| | 2016-11-7 23:26 | 只看该作者
s2012fy 发表于 2016-11-7 12:03
能说一下思路吗,我利用寄存器将密码怎么也写不进那块内存

使用XX_CSMPasswords.asm,并且CMD文件也要包含有PSD部分的定义
然后直接将密码写到工程中    生成.OUT
然后给别人.OUT  让烧写 也看不到密码
直接烧写进去就加密了

使用特权

评论回复
20
vibra2016| | 2016-11-8 21:31 | 只看该作者
关于加密的问题,我研究的还是比较少的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

98

帖子

1

粉丝