全志SecureBoot无法正常启用
-
我使用R328平台刷写安全固件遇到了一些问题,大家能帮忙看看吗?
1.我用pack -s生成了 secure_v0.img 结尾的安全固件,然后用 PhoenixSuit 烧录成功了。
2.我配置dragonkey全局配置安全key,列表中的sn和mac删掉了,只添加rotpk配置,然后用dragonsn烧录了rotpk。然后我想验证板子是否已经工作在secureboot模式
1.我查看了板子引导日志,发现是SBOOT is starting,证明是SBOOT在引导
2.下面的UBOOT 日志有 secure enable bit: 1 字样,证明 efuse 中开启了secure enable bit。
3.我想验证rotpk是否已经烧录成功,但是不知道怎么做,我看uboot2014的key_burn中有个 efuse_read 命令可以读,但是uboot2018上并没有,我把这个命令代码复制到uboot2018的key_burn.c上然后重新编译uboot,pack -s,烧录,打断uboot引导,执行 efuse_read rotpk 命令,发现已经读出了我烧录的rotpk。
4.那么根据全志wifi中的描述,一旦secure enable bit=1,且rotpk烧录了有效值,芯片就应该使用 S-BROM 引导而不是 N-BROM 引导。但是我用 sunxi-fel read 0x0 0x10000 brom.bin 保存的brom发现仍然是 N-BROM,里面有 eGON字样,没有 TOC 字样。
5.另外我用 sunxi-fel 仍然可以下载未签名的代码到cpu上执行。这里测试我使用的是未签名的 fes1.fex上述验证步骤12345中的相关数据我已经打包上传到这里了
secureboot问题.zip那么我的问题是
1.芯片此时为什么没有使用S-BROM引导,是还需要做哪个步骤吗?
2.如果已经是S-BROM引导,是我dump BROM的那个方法错误吗?
3.如果已经是S-BROM引导,sunxi-fel 仍然能执行未授权代码,是正常的吗?向大家请教,谢谢了!
-
@xiaowenge 向小文哥求助!!
-
@mengxp 支持Trustzone的芯片,CPU有安全和非安全两种运行模式。非安全模式,CPU只能访问普通资源(比如DDR,外设资源); 安全模式下,CPU可访问受保护的资源(比如受保护的RAM/ROM等)。当芯片处于强制烧录状态时,CPU是处于非安全模式的,通过FEL也只能读到非安全BROM, 读不到安全的S-BROM是正常现象。
-
我用uboot读了下brom发现确实是SBROM,那我想可能知道了上述问题答案…
1.芯片此时确实是 S-BROM 引导的,打断uboot引导,md.b 0x0 0x10000 可以读到 S-BROM 代码(包含 TOC0.GLH)
2.此时进入 FEL 模式,是运行在 non-secure mode,sunxi-fel 读到的是 N-BROM 映射。
3.FEL 运行在non-secure mode,应该是无法触碰 secure peripheral,所以即使在secureboot模式下进入 fel 也是安全的。上述第三点我不太确认,想请求确认下
-
@weifooo 哦哦 感谢大神的回复,我明白了!
-
哦我还有个问题就是 F1C200s 支持secureboot/trustzone吗?
我看sdk的createkey脚本里有
PLATFORM_LIST="r18 c200s r30 r311 r328s2 r328s3 mr112"
看起来createkey支持 200s 平台的,但是执行时找不到dragon toc config失败了。。。是不是这个芯片IC设计上支持trustzone,但实际后续开发sdk的时候取消了这个支持?
-
@mengxp F1C200s是不支持Trustzone的。
-
@mengxp 在 全志SecureBoot无法正常启用 中说:
efuse_read
请教一下,我是这样在key_burn.c加的
#include <common.h> #include <command.h> #include <sys_config.h> #include <securestorage.h> #include <private_uboot.h> #include <smc.h> #include <efuse_map.h> #include <sunxi_board.h> int do_efuse_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *efuse_name; char buffer[32]; int ret; if(argc != 2) { printf("the efuse item name is empty\n"); return -1; } efuse_name = argv[1]; printf("try to read %s\n", efuse_name); memset(buffer, 0, 32); //change //printf("buffer addr=0x%x\n", (u32)buffer); printf("buffer addr=0x\n"); ret = arm_svc_efuse_read(efuse_name, buffer); if(ret) { printf("read efuse key [%s] failed\n", efuse_name); } else { printf("read efuse key [%s] successed\n", efuse_name); sunxi_dump(buffer, 32); } return 0; } U_BOOT_CMD( efuse_read, 3, 0, do_efuse_read, "read efuse key", "usage: efuse_read efusename" );
muboot 编译失败了。
./../tools/toolchain/riscv64-linux-x86_64-20200528/bin/riscv64-unknown-linux-gnu-ld.bfd: board/sunxi/built-in.o: in function `do_efuse_read': /home/user/tina-d1-h/lichee/brandy-2.0/u-boot-2018/board/sunxi/key_burn.c:96: undefined reference to `arm_svc_efuse_read' Makefile:1480: recipe for target 'u-boot' failed make: *** [u-boot] Error 1 muboot stop for build error in brandy, Please check!
-
@a1314258
同样的方法使用在r329的key_burn.c
编译成功了,无语
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号