无线电爱好网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

【Semidriver E3】BPT & 安全啟動 & Secure Dubug

2023-12-25 09:21| 发布者: 闪电| 查看: 1| 评论: 0

摘要: 1. 概述(1)Boot Package 格式Boot Package 中包含用戶程序, 由以下兩部分組成:① BPT(Boot Package Table)• 位於 Boot Package 最前端,包括 Boot Package 的簽名信息,各個鏡像在 Image 組合中的相對位置,鏡 ...

1. 概述

(1)Boot Package 格式

 Boot Package 中包含用戶程序, 由以下兩部分組成:

①  BPT(Boot Package Table)

• 位於 Boot Package 最前端,包括 Boot Package 的簽名信息,各個鏡像在 Image 組合中的相對位置,鏡像 load 地址,entry 地址,hash 校驗信息,PSN 信息;

• ROM 讀取上述信息對各個 core 鏡像進行驗證後啟動;
 
• BPT 占用 4096 個 Byte(0x1000)



② 程序鏡像組合

• 包含多個 core 的用戶程序鏡像組合,即 SF core 程序鏡像、SP core 程序鏡像、SX core 程序鏡像、SF core Bootloader 程序鏡像,以及 SCB 系統控制塊 (System Configuration Block) 的組合;



• 啟動設備中的存儲方式

在啟動設備中,最多允許存在 3 個 Boot Package:Normal Boot Package,Backup Boot Package,Third Try Boot Package,互為冗餘。上電後 ROM 選擇 PSN(Package Serial Number) 較大並且能夠校驗通過的 package 啟動。注意,並不是所有的啟動設備都支持 3 個 Boot Package,具體情況見下表:

啟動設備Normal Boot Package
存儲地址
Backup Boot Package
存儲地址
Third Try Boot Package
存儲地址
NOR/Hyper Fla
sh
由SFS指定由SFS指定由SFS指定
eMMCBOOT1分區 offset=0BOOT2分區 offset=0User Areas分區 offset=20kB
SD cardoffset=20kB--
USB/UART無存儲--

 

(2)安全啟動

上電後固化在晶片中的 ROM 程序會根據 boot pin 的設置從 XSPI/eMMC/SD/UART/USB 等介質中獲取下級啟動鏡像。啟動鏡像的格式必須滿足前述 Boot Package 格式。
ROM 程序驗證 BPT 以及每個 core 鏡像的流程如下:

①. 計算 BPT 中公鑰的 hash(SHA256)並與 ROTPK1 中保存的 hash 對比,如果兩者不一致,則啟動失敗

②. 使用 BPT 中的公鑰驗證 BPT 中的簽名,如果簽名驗證失敗,則啟動失敗

③. 計算每個 core 鏡像 hash,與保存在 BPT 中的 hash 對比,如果不一致則啟動失敗

④. 上述都成功,則啟動 BPT 中所指定的core鏡像 

(3)BootROM 控制⽅式

       使⽤ Semidrive 提供的⼯具(atb_signer)對 image 進⾏簽名時,設置 
Debug 控制字並填寫芯⽚ DeviceID(DID)。當 BootROM 啟動成功時,依據控制字打開 Debug。 

(4)Flsah layout



       上圖為 HyperFlash 和 NorFlash 的典型的 Flash storage layout,其中 HyperFlash 的 sector size(sector 指 Flash 最小擦除單位)為 256kByte(典型值),NorFlash 的 sector size 為 4kByte(典型值)。為使擦寫方便,對 flash 空間時做如下分配:

  • 將 SFS 存放在第 1 個 Sector 的起始地址 0x0 至 0x7F 中占用 128Byte;
  • 將 RFD 存儲在第 1 個 Sector,其具體的起始地址為 0xF0-0x1FF,占用 272個Byte,RFD 是用於加密啟動的信息,可以查看芯馳的資料或者後續博文;
  • 將第 2 個 Sector 預留為 XSPI training 數據區域;
  • 以第 3 個 sector 為起始,存放 Primary GPT 分區表預留區域(非必須,僅預留,提示GPT 分區表並非必須,如果不使用分區表,該區域可以不預留。),GPT 分區表 Primary 部分占用 17KB 空間,在 HyperFlash 上占用 1 個 sector,在 NorFlash 上占用 5 個 sector 存儲。此外,根據 GPT 分區表的格式,也需要在 Flash 尾部需預留空間 17KB 存儲 Secondary 分區表。
  • Normal Boot Package、Backup Boot Package、Third Try Boot Package 由 SFS (打包可以指定用戶程序地址)中的地址指定,如果按照上圖中預留分區表的 Layout 則中 3 個 Boot Package 的存儲地址為:
HyperFlash存儲地址NorFlash存儲地址NorFlash
Normal Boot Package0xC0000(SFS指定)0x7000(SFS指定)
Backup Boot Package0x4C0000(SFS指定)0x407000(SFS指定)
Third Try Boot Package0x8C0000(SFS指定)0x807000(SFS指定)

 

2. 環境準備
需準備如下軟硬體:

• Lauterbach Trace32 調試器 for arm

• E3 參考板(其上的 E3 芯⽚位於開發模式)。

• 芯馳 SDToolBox,各個⼯具的使⽤⼿冊集成在⼯具包中,雙擊⼯具包中的 Help 圖標可以查看相關應⽤的使⽤說明,fuse 相關操作在⼿冊第七章:SDFuseTool 使⽤說明。

• atb_signer:safety/securityimage 簽名⼯具。

簽名命令(注意 未簽名的 bin 文件命名和拷貝到相同路徑下,以及用戶私鑰的路徑,此簽名未涉及到 uuid & ctl ,詳細看下文介紹 
sign_tool_e3\atb_signer_win\atb_signer.exe sign --v 2 --sec_ver 0x1234 --dgst sha256 --rcp key=sign_tool_e3\atb_signer\keys\TestRSA2048_ossl.pem --iib core=0 type=0x0 image=E3_ref_gateway_E3430.bin to=0x006A0000  entry=0x006A0000 --psn 0x04 --of E3_ref_gateway_E3430.signed

key=sign_tool_e3\atb_signer\keys\TestRSA2048_ossl.pem

• ⼀個⽤⼾私鑰(例如⼀個 rsa2048 的私鑰,可使⽤ Openssl ⽣成)。




• ⼀個 8 字節的數做為芯⽚的 DID (在簽名⼯具中叫 UUID,在芯⽚ fuse 中叫 DID) : 0x12345678abcdef88 (由客⼾⾃⾏燒寫)



• ⼀個 8 字節的數做為芯⽚的 UID : 0x12345678abcdef88 (芯⽚出⼚應該已經燒寫完成,這裡這是舉個例子)


 
• ⼀個 8 字節的數做為芯⽚的 debugkey : 0x746573746b657930 (ascii:’testkey0’) (由客⼾⾃⾏燒寫)




3. 安全啟動

完成以上的準備條件後,啟用這一步驟,實現 BootROM 對 image 進行驗簽,也就是 BootROM 安全啟動。

(1) 燒寫 eFuse ,使能 PROD



(2) 對 image 進行打包(詳細看 https://www.wpgdadatong.com.cn/blog/detail/72667)

打包用戶的 image 可以通過以上博文的鏈接進行替換 gpio 的例程進行打包,也可以使用之前的打包的 PAC 作為 USB 下載的底包,在下載時替換 boot0~boot2 為用戶簽過名的 bin 文件即可。

例如下圖:將用戶簽過名的 bin 替換下載底包的 boot0~boot1 即可(這裡打包只設置了兩個 boot)



4. Secure Dubug

原理:
Debugger 發出請求--->芯⽚回復出 UID--->⽤⼾根據 UID 找到對應的 key 並將 key ⽤ Debugger 回復給芯
⽚--->芯⽚匹配 key 成功後開啟 debug 接⼝。

(1)第一種情況,只使能 efuse PROD

經過上述步驟芯⽚已⽆法連接調試器,以 E3_ref_gateway_E3640、⾮ xip 為例,下⾯構建包含 DID 和Debug 控制碼的 image 來使 ROM 開啟 Debug 接⼝ 。

① 直接打包用戶程序到 USB 下載底包

此時需要調試,在打包時需要加入 uuid & ctl (efuse 燒寫了 DID 需要在打包加入 uuid, 保持一致);



② 簽名用戶 bin 文件替換 USB 底包 boot0~boot2

修改簽名工具所用的命令(添加 uuid & ctl ctl=ffffffffffffffff uuid=7856341288efcdab):

sign_tool_e3\atb_signer_win\atb_signer.exe sign --v 2 --sec_ver 0x1234 --dgst sha256 --rcp key=sign_tool_e3\atb_signer\keys\TestRSA2048_ossl.pem --iib core=0 type=0x0 image=E3_ref_gateway_E3430.bin to=0x006A0000  entry=0x006A0000 ctl=ffffffffffffffff uuid=7856341288efcdab --psn 0x04 --of E3_ref_gateway_E3430.signed



③ 根據以上步驟可以實現調試功能

(2)第二種情況,在第一種基礎的基礎上,efuse 使能 SDBG_MODE

使能 SDBG_MODE 後,勞德巴赫無法直接 attach 上去,需要更改 secure debug attach 腳本,
在此之前確認好,secure debug 秘鑰已經燒錄在 efuse 上,簽名也按照上面操作步驟實現了,接下來需要用以下腳本實現 attach:

; ------------------------------------------------------------------------------
; @Title: Example for manual JTAG access, Debugger in DOWN Mode
; @Description:
;This script reads out the IDCODE of an ARM7 core when the debugger is in
;DOWN mode.
;Detailed knowledge about JTAG is required to use manual JTAG control signals!
;Tested on an ARM7 target board.
; @Keywords: idcode
; @Author: PEG
; @Props: Template
; @Copyright: (C) 1989-2014 Lauterbach GmbH, licensed for use with TRACE32(R) on
; ------------------------------------------------------------------------------
; $Id: example1.cmm 6982 2023-02-22 11:10:17Z kjmal $
; @Copyright: Semidrive semiconductor
; @Title: Semidrive Secure Debug (Challenge & Response) logic.
; The debugger is in DOWN mode, the JTAG driver is tristated.
area
SYStem.CPU CortexR5
SYStem.CONFIG.apbaccessport 0
SYStem.CONFIG.apbap1.base 0x2000
SYStem.CONFIG.debugaccessport 0
SYStem.CONFIG.debugap1.base 0x2000
SYStem.CONFIG.COREDEBUG.Base 0xF2081000
;taishan
;SYStem.CONFIG.COREDEBUG.Base 0xF0a01000
;taishanl
;SYStem.CONFIG.COREDEBUG.Base 0xF0a01000
;taishanll
SYStem.Option.TRST OFF
SYStem.JtagClock 1MHz
JTAG.PIN ENable
; enable JTAG output driver
JTAG.SHIFTTMS 1 1 1 1 1
; soft reset of the JTAG interface, goto Test-Logic Reset state
JTAG.SHIFTTMS 0 1 1 0 0
; goto Shift-IR state
JTAG.SHIFTREG 1 1 1 1
; shift in UID instruction
JTAG.SHIFTTMS 1 1 0 0
; goto Shift-DR state
JTAG.SHIFTREG %long 0x0 0x0
; shift in 64bit dummy code. shift out our uid
PRINT JTAG.SHIFT()
; print the UID
JTAG.SHIFTTMS 1 1 0 0
; goto Shift-DR state
JTAG.SHIFTREG %long 0x74657374 0x6b657930
; shift in the corresponding key .shift out our uid
PRINT JTAG.SHIFT()
JTAG.SHIFTTMS 1 1 1 1 1
; goto Test-Logic Reset state
JTAG.SHIFTTMS 0 1 0 0
; goto Shift-DR state
JTAG.SHIFTREG %long 0x0
; shift our IDCODE
PRINT JTAG.SHIFT()
JTAG.PIN Disable
; Disable JTAG output driver
SYStem.Mode Attach
;attach
ENDDO



Secure Debug 需要在 JTAG  模式下進行調試,先使用 e3_attach.cmm attach 之後,再使用上面的 secure debug  腳本進行安全調試。



注意:
JTAG 引腳在 EB 裡面不要配置,配置後連接不上,無法調試。

5. 參考資料

芯馳官網技術參考資料

6. 後續博文系列

(1)【Semidriver E3】efuse 數據生成

(2)【Semidriver E3】efuse 數據燒寫

等等


路过

雷人

握手

鲜花

鸡蛋

QQ|关于本站|小黑屋|Archiver|手机版|无线电爱好网 ( 粤ICP备15040352号 ) 无线电爱好技术交流5 无线电爱好技术交流1无线电爱好技术交流9开关电源讨论群LED照明应用、电源无线电爱好技术交流4无线电爱好技术交流8无线电爱好技术交流10无线电爱好技术交流11

粤公网安备 44030702001224号

GMT+8, 2023-12-25 09:21 , Processed in 0.093601 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

返回顶部