查看: 1428|回复: 1

[分享] LPC55Sxx 避免将PRINCE加密子区域设置为非连续

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19947
最后登录
2024-4-19
发表于 2020-3-17 22:14:49 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2020-3-17 22:16 编辑

LPC55Sxx: 避免将PRINCE加密子区域设置为非连续

TIC



我们在使用LPC55Sxx芯片的PRINCE功能时,经常需要通过设置SR_ENABLE寄存器来使能PRINCE的子区域(sub-region)加密特性。有些客户对非连续的加密子区域(如下图所示)进行部分擦除操作后,无法再对其他加密子区域正常擦除和读写。本文将对这一现象进行讨论。
图一.jpg

图一


1.测试及现象
根据LPC55Sxx用户手册可知,PRINCE的每个区域(Region)都有一个对应SR_ENABLE寄存器,可以通过配置相应的SR_ENABLE寄存器,来实现对该区域内非连续子区域的加密特性的设置,如下图所示。将寄存器的某一位置1,这一位对应的子区域就被配置为加密区域。例如当SR_ENABLE0=0X00000005时, PRINCE 区域0内的1号子区域和3号子区域被配置为加密区,这两个子区域的数据处于被加密状态,从该子区域读取数据时,PRINCE将对其自动解密。

SR_ENABLE.jpg


下面使用LPC55S16-EVK和KEIL对非连续子区域的擦除和读写进行了测试:

步骤一:PRINCE初始化(使能PRINCE区域0和两个非连续的子区域;生成Key,IV码;使能加密功能)
//设置SR_ENABLE寄存器,SR_ENABLE=0X28000000,使能子区域(0x30000-0x32000,0x34000-0x36000)加密特性。
status=PRINCE_SetRegionSREnable(PRINCE(prince_region_t)region0,0X28000000);
//选择PRINCE加密区域region0
PRINCE_SetRegionBaseAddress(PRINCE_Type*base,prince_region_tregion0,uint32_t 0X0)
//生成PRINCE region0加密区域的key
Status=FFR_KeystoreGetKC(&flashInstance,&keyCode[0],kFFR_KeyTypePrinceRegion0);
status=PUF_GetHwKey(PUF,keyCode,sizeof(keyCode),kPUF_KeySlot2, rand());
//生成PRINCE region0加密区域的IV_code
status=PRINCE_GenNewIV(kPRINCE_Region0,&prince_iv_code[0],true,&flashInstance)
//将生成的IV加载到PRINCE
status=PRINCE_LoadIV(kPRINCE_Region0,&prince_iv_code[0])
//使能PRINCE加密功能
PRINCE_EncryptEnable(PRINCE)

步骤二:选择两块非连续的子区域(0x30000-0x32000,0x34000-0x36000)。先对其中一块子区域0x30000-0x32000进行擦除然后向该区域写入数据。输出结果: 擦除和写操作全部成功正确,见图二。
//擦除0x30000-0x32000地址区域
status=PRINCE_FlashEraseWithChecker(&flashInstance,0x30000,0x2000,kFLASH_ApiEraseKey);
//0x30000-0x32000地址区域执行写操作
status=PRINCE_FlashProgramWithChecker(&flashInstance,0x30000,(uint8_t*)prince_iv_code,0x2000);
步骤三:再对另一块子区域0x34000-0x36000擦除然后写入数据,擦除和写入操作失败,输出结果如图二所示。
//擦除0x34000-0x36000地址区域
status=PRINCE_FlashEraseWithChecker(&flashInstance,0x34000,0x2000,kFLASH_ApiEraseKey);
//0x34000-0x36000地址区域执行写操作
status=PRINCE_FlashProgramWithChecker(&flashInstance,0x34000,(uint8_t *)prince_iv_code,0x2000);
图二.jpg
图二

2. 错误原因分析
根据用户手册相关相关章节(49.16.1 Functional details 部分),每个加密区域( Region )都有对应的key和IV码,Key和IV码共同起作用实现了PRINCE的加解密功能。
以PRINCE的region 1为例,每次对该区域的子区域进行擦写操作时都要生成相应的key1和IV1。在执行非连续的子区域进行操作时,如果对其中一块子区域进行擦除操作,操作完成后会更新IV code,这样在对另一块子区域进行读写操作时原有IV和更新后的IV不匹配导致无法正确加解密。

3. 使用建议
    使用PRINCE功能,用SR_ENABLE寄存器设置加密区域时,建议设置加密子区域为连续的。在对加密子区域执行擦除时,要对所有使能的连续加密区域进行统一擦除操作,避免对其中部分加密子区域单独操作。一个子区域的大小为8K,故我们要保证写入的数据与加密区域8K对齐。



回复

使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-9 17:01
  • 签到天数: 1478 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92609
    最后登录
    2024-4-9
    发表于 2020-3-19 16:31:41 | 显示全部楼层
    感谢分享~~~ 1.png 2.png 3.png 4.png 8.png 7.png 6.png 5.png 9.png 10.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 15:55 , Processed in 0.115098 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表