安全之安全(security2)博客目錄導讀
目錄
一、RSE 通信層
1.1 消息結構
1.2 源代碼文件
1.3 MHU 通信的 API
二、RSE 提供的運行時服務
2.1 運行時服務 API
2.2 軟件與 API 層次結構
三、基于 RSE 的 Measured Boot(度量啟動)
3.1 Measured Boot API
3.2 Measured Boot 元數據
3.3 Signer-ID API
3.4 構建時配置選項
3.5 Measured Boot 流程
3.6. 控制臺日志樣例
四、委托認證(Delegated Attestation)
4.1. 委托認證 API
4.2. 認證流程
4.3. 證明令牌示例
五、基于 RSE 的 DICE 保護環境(DPE)
5.1. DPE API
5.2. 構建時配置選項
5.3. 示例證書鏈
六、RSE OTP 資產管理
6.1. 非易失性計數器 API
6.2. 公鑰 API
6.3. 獲取熵的 API
該博客重點介紹了運行時安全引擎(Runtime Security Engine,簡稱 RSE)與應用處理器(Application Processor,簡稱 AP)之間的關系。
根據 ARM 的參考設計,RSE 是位于同一芯片(die)上的一個獨立核心,與 AP 和系統控制處理器(System Control Processor,簡稱 SCP)并列存在。RSE 為整個系統提供基本的安全保障和運行時服務,例如:可信啟動(trusted boot)、度量啟動(measured boot)、平臺認證(platform attestation)、密鑰管理與派生(key management and key derivation)等。
在系統上電時,RSE 首先從其私有的 ROM 代碼啟動。它會驗證并加載自身的鏡像文件以及 SCP 和 AP 的初始鏡像。當 AP 和 SCP 被解復位,且其初始代碼被加載后,它們將繼續各自的啟動流程,這一流程與沒有 RSE 的系統相同。關于 RSE 啟動流程的更多細節,請參見 RSE 文檔 。
RSE 固件的最后階段是一個常駐的運行時組件。類似于 AP 的 BL31,它是一個被動實體,沒有周期性任務,僅在收到其他子系統的外部請求時才進行響應。RSE 與其他子系統之間通過消息交換進行通信。RSE 在空閑狀態下等待傳入請求,處理請求后發送響應,然后再次進入空閑狀態。
一、RSE 通信層
RSE 與其他子系統之間的通信主要依賴于消息處理單元(Message Handling Unit,簡稱 MHU)模塊。
不過,也可以使用不同于 MHU 的郵箱(mailbox)來實現該通信協議,只需將編譯標志 PLAT_MHU=NO_MHU
設置為不使用 MHU,并實現 include/drivers/arm/rse_comms.h
文件中提供的 API。
RSE 與其他核心之間的 MHU 接口數量由實現定義(IMPDEF)。除 MHU 外,其他模塊也可以參與通信。RSE 能夠將 AP 的內存映射到自身的地址空間,因此無論是 RSE 核心自身,還是(如果存在的話)DMA 引擎,都可以在 RSE 與 AP 所屬內存之間傳輸數據。這種方式可以在較短時間內傳輸大量數據。
MHU 成對出現,包括一個發送端和一個接收端,它們相互連接。一個 MHU 接口包含兩個 MHU 對:在兩端各有一個發送端和一個接收端。一個接口支持雙向通信,一對用于從 AP 向 RSE 發送消息,另一對用于從 RSE 向 AP 發送消息。發送器和接收器通過通道連接,一個發送器與一個接收器之間有若干通道(例如:4–16 個通道,具體數量由實現定義)。
RSE 通信層提供兩種消息交換方式:
嵌入式消息(Embedded messaging):
完整消息(包括頭部和負載)通過 MHU 通道交換。一個通道只能傳輸一個字(word)。發送方將數據寫入自己一側的通道寄存器,接收方從對側通道讀取數據。有一個專用通道用于信號通知,它本身不傳輸任何有效負載,僅用于表示發送方已將數據寫入通道寄存器,接收方即可讀取;接收方也通過同一個通道返回信號表示數據已讀取。信號傳遞通過中斷(IRQ)完成。如果消息長度超過通道寄存器的容量,則消息需要分多輪傳輸。發送方和接收方都會為消息分配本地緩沖區,數據將在緩沖區與通道寄存器之間進行拷貝。
指針訪問消息(Pointer-access messaging):
消息頭與負載分離,并通過不同方式傳輸。頭部通過通道發送,類似于嵌入式消息,而負載部分則由 RSE 核心(或 DMA)在發送方和接收方之間拷貝。這種方式適用于長消息,因為相比嵌入式方式,事務處理時間更短。小型負載一般由 RSE 核心處理,因為設置 DMA 所需的 CPU 周期更多。負載可以被拷貝到內部緩沖區,或者被 RSE 直接讀寫,具體行為取決于 RSE 配置,以及分區是否支持內存映射的 iovec。因此,發送方必須同時處理這兩種情況,并在 RSE 處理請求期間防止訪問負載數據所在的內存區域。
RSE 通信層支持兩種消息方式并行使用。具體采用哪種方式,會根據消息大小在運行時決定。
【注意】RSE 通信層不支持并發執行。當前的使用場景僅要求在啟動階段進行消息交換。在啟動階段,僅有一個核心在運行,其余核心仍處于復位狀態。
1.1 消息結構
有關消息格式的說明,請參見《RSE 通信設計》文檔 。
1.2 源代碼文件
-
RSE 通信模塊:
drivers/arm/rse
-
MHU 驅動模塊:
drivers/arm/mhu
1.3 MHU 通信的 API
相關 API 定義在以下頭文件中:
-
include/drivers/arm/rse_comms.h
-
include/drivers/arm/mhu.h
二、RSE 提供的運行時服務
RSE 提供以下運行時服務:
-
度量啟動(Measured Boot):安全存儲在啟動過程中計算出的固件度量值及相關元數據(如鏡像描述、度量算法等)。有關此服務的更多信息,請參見《measured_boot_integration_guide》文檔 。
-
委托認證(Delegated Attestation):查詢平臺認證令牌,并派生出委托認證密鑰。相關細節可參考《delegated_attestation_integration_guide》文檔 。
-
OTP 資產管理(OTP Assets Management):AP 在可信啟動過程中使用的公鑰可以從 RSE 請求獲取。此外,AP 還可請求 RSE 增加一個非易失性計數器。詳情請參考《RSE Key Management》文檔 。
-
DICE 安全環境(DICE Protection Environment):安全存儲啟動過程中計算的固件度量值及元數據,還能以證書鏈的形式表示啟動度量結果,并支持外部查詢。詳見《DICE Protection Environment(DPE)》文檔 。
2.1 運行時服務 API
RSE 提供的運行時服務實現了與 PSA(Platform Security Architecture)對齊的 API。參數編碼遵循《Firmware Framework for M》文檔第 4.4 章中描述的 PSA 客戶端協議。
該實現限定為**靜態句柄(static handle)**的使用場景,因此僅實現了 psa_call
API。
2.2 軟件與 API 層次結構
三、基于 RSE 的 Measured Boot(度量啟動)
Measured Boot 是一種在啟動過程中對代碼和關鍵數據進行加密度量(即計算其哈希值)的機制。這些度量值必須以防篡改的方式進行存儲,以便設備在之后能向外部方證明其安全狀態。RSE 提供了一個運行時服務,用于存儲這些度量值及其相關元數據。
數據被存儲在 RSE 內部的 SRAM 中,僅能由 RSE 的安全運行時固件訪問。這些數據存儲在所謂的“度量槽(measurement slots)”中。每個平臺具有平臺自定義(IMPDEF)數量的度量槽。
度量存儲采用“擴展(extend)”語義。即度量值不會被直接存儲,而是參與生成當前度量槽的新值。其擴展邏輯如下(||
表示連接):
new_value_of_measurement_slot = Hash(old_value_of_measurement_slot || measurement)
支持的哈希算法包括:sha-256
、sha-512
3.1 Measured Boot API
定義在:
include/lib/psa/measured_boot.h
函數原型如下:
psa_status_t
rse_measured_boot_extend_measurement(uint8_t index,const uint8_t *signer_id,size_t signer_id_size,const uint8_t *version,size_t version_size,uint32_t measurement_algo,const uint8_t *sw_type,size_t sw_type_size,const uint8_t *measurement_value,size_t measurement_value_size,bool lock_measurement);
3.2 Measured Boot 元數據
可與度量值一同存儲的元數據包括:
-
Signer-id(簽名者ID):必選項。為固件鏡像簽名公鑰的哈希值。
-
Measurement algorithm(度量算法):可選項。用于計算度量值的哈希算法(例如:sha-256)。
-
Version info(版本信息):可選項,例如 "2.7"。
-
SW type(軟件類型):可選項,簡要文本描述(例如:BL1、BL2、BL31)。
注意:TF-A 當前尚未實現版本信息字段的支持。
調用者必須指定在哪個度量槽中擴展度量值及其元數據。一個槽位可以被多次擴展。所有度量槽在復位時清空,不能手動清空。在參考實現中,槽初始值為 0,第一次調用 extend
操作時使用默認值,后續操作繼續基于前值進行擴展。
當對同一個槽位多次擴展時,遵循以下規則:
-
Signer-id 必須與之前一致,否則返回
PSA_ERROR_NOT_PERMITTED
。 -
Measurement algorithm 也必須一致,否則也會返回相同錯誤碼。
-
出現錯誤時不會采取進一步操作(槽不會被鎖定)。如果后續調用中數據合法,則仍可繼續擴展該槽。
-
對于其他元數據處理:
-
SW type 會被清除。
-
Version info 也會被清除。
-
注意:在同一槽內擴展多個度量值會導致元數據信息丟失。由于 RSE 在存儲方面不受專用硬件限制,因此建議為每個度量值分配獨立槽位。但請注意,每個獨立的度量值都將被包含在平臺認證令牌中,因此度量項的數量會影響認證令牌的體積。
度量槽在 RSE、Root 和 Realm 世界之間的分配由平臺決定,且需在構建時配置。示例參考:
tf-a/plat/arm/board/tc/tc_bl1_measured_boot.c
此外,存儲元數據的內存也在 RSE 內部靜態分配。部分字段為靜態值(如算法),而如度量值等字段為動態值,由 Bootloader 在加載并度量固件時更新。
元數據結構定義如下:
struct rse_mboot_metadata {unsigned int id;uint8_t slot;uint8_t signer_id[SIGNER_ID_MAX_SIZE];size_t signer_id_size;uint8_t version[VERSION_MAX_SIZE];size_t version_size;uint8_t sw_type[SW_TYPE_MAX_SIZE];size_t sw_type_size;void *pk_oid;bool lock_measurement;
};
3.3 Signer-ID API
此函數使用指定度量算法對公鑰(即簽名者ID)進行哈希運算,并將結果存儲在 rse_mboot_metadata
結構中的 signer_id
字段中。調用該函數前,必須確保 signer_id
字段所指向的緩沖區被清零。
定義于:
include/drivers/measured_boot/rse/rse_measured_boot.h
函數原型如下:
int rse_mboot_set_signer_id(struct rse_mboot_metadata *metadata_ptr,const void *pk_oid,const void *pk_ptr,size_t pk_len)
-
第一個參數:指向
rse_mboot_metadata
結構的指針; -
第二個參數:公鑰的 key-OID 指針;
-
第三個參數:公鑰緩沖區指針;
-
第四個參數:公鑰緩沖區長度。
-
返回值:成功返回 0,失敗返回負整數錯誤碼。
3.4 構建時配置選項
-
MEASURED_BOOT
:啟用度量啟動功能; -
MBOOT_RSE_HASH_ALG
:指定用于度量鏡像的哈希算法。默認值為sha-256
。
3.5 Measured Boot 流程
3.6. 控制臺日志樣例
INFO: Measured boot extend measurement:
INFO: - slot : 6
INFO: - signer_id : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
INFO: : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
INFO: - version :
INFO: - version_size: 0
INFO: - sw_type : FW_CONFIG
INFO: - sw_type_size: 10
INFO: - algorithm : 2000009
INFO: - measurement : aa ea d3 a7 a8 e2 ab 7d 13 a6 cb 34 99 10 b9 a1
INFO: : 1b 9f a0 52 c5 a8 b1 d7 76 f2 c1 c1 ef ca 1a df
INFO: - locking : true
INFO: FCONF: Config file with image ID:31 loaded at address = 0x4001010
INFO: Loading image id=24 at address 0x4001300
INFO: Image id=24 loaded: 0x4001300 - 0x400153a
INFO: Measured boot extend measurement:
INFO: - slot : 7
INFO: - signer_id : b0 f3 82 09 12 97 d8 3a 37 7a 72 47 1b ec 32 73
INFO: : e9 92 32 e2 49 59 f6 5e 8b 4a 4a 46 d8 22 9a da
INFO: - version :
INFO: - version_size: 0
INFO: - sw_type : TB_FW_CONFIG
INFO: - sw_type_size: 13
INFO: - algorithm : 2000009
INFO: - measurement : 05 b9 dc 98 62 26 a7 1c 2d e5 bb af f0 90 52 28
INFO: : f2 24 15 8a 3a 56 60 95 d6 51 3a 7a 1a 50 9b b7
INFO: - locking : true
INFO: FCONF: Config file with image ID:24 loaded at address = 0x4001300
INFO: BL1: Loading BL2
INFO: Loading image id=1 at address 0x404d000
INFO: Image id=1 loaded: 0x404d000 - 0x406412a
INFO: Measured boot extend measurement:
INFO: - slot : 8
INFO: - signer_id : b0 f3 82 09 12 97 d8 3a 37 7a 72 47 1b ec 32 73
INFO: : e9 92 32 e2 49 59 f6 5e 8b 4a 4a 46 d8 22 9a da
INFO: - version :
INFO: - version_size: 0
INFO: - sw_type : BL_2
INFO: - sw_type_size: 5
INFO: - algorithm : 2000009
INFO: - measurement : 53 a1 51 75 25 90 fb a1 d9 b8 c8 34 32 3a 01 16
INFO: : c9 9e 74 91 7d 28 02 56 3f 5c 40 94 37 58 50 68
INFO: - locking : true
四、委托認證(Delegated Attestation)
委托認證服務 主要是為支持 ARM 機密計算架構(ARM CCA) 中的認證流程而開發的。關于該服務的詳細描述可參見《Delegated Attestation Service Integration Guide》文檔。
在 CCA 的使用場景中,Realm 管理監控器(RMM) 依賴 RSE 的委托認證服務 來獲取 Realm 認證密鑰 和 CCA 平臺認證令牌(Platform Token)。BL31 本身不使用該服務,只是代表 RMM 發起調用。MHU 接口(也即 RSE 的訪問)僅限 BL31 訪問。因此,RMM 無法直接訪問 RSE,所有請求都必須通過 BL31 進行中轉。BL31 中的 RMM 分發模塊(dispatcher module) 負責在 RMM 和 RSE 之間傳遞這些調用。
4.1. 委托認證 API
定義于:
include/lib/psa/delegated_attestation.h
API 原型如下:
psa_status_t
rse_delegated_attest_get_delegated_key(uint8_t ecc_curve,uint32_t key_bits,uint8_t *key_buf,size_t key_buf_size,size_t *key_size,uint32_t hash_algo);psa_status_t
rse_delegated_attest_get_token(const uint8_t *dak_pub_hash,size_t dak_pub_hash_size,uint8_t *token_buf,size_t token_buf_size,size_t *token_size);
功能:從 RSE 獲取 委托認證密鑰(Delegated Attestation Key, DAK)。
-
ecc_curve
:橢圓曲線類型 -
key_bits
:密鑰位數 -
key_buf
:用于存儲返回密鑰的緩沖區 -
key_buf_size
:緩沖區大小 -
key_size
:實際返回密鑰的大小 -
hash_algo
:使用的哈希算法
功能:從 RSE 獲取 平臺認證令牌(Platform Token)。
-
dak_pub_hash
:委托認證公鑰的哈希值 -
dak_pub_hash_size
:公鑰哈希值的長度 -
token_buf
:用于存儲返回令牌的緩沖區 -
token_buf_size
:緩沖區大小 -
token_size
:實際返回令牌的大小
4.2. 認證流程
4.3. 證明令牌示例
二進制格式:
INFO: DELEGATED ATTEST TEST START
INFO: Get delegated attestation key start
INFO: Get delegated attest key succeeds, len: 48
INFO: Delegated attest key:
INFO: 0d 2a 66 61 d4 89 17 e1 70 c6 73 56 df f4 11 fd
INFO: 7d 1f 3b 8a a3 30 3d 70 4c d9 06 c3 c7 ef 29 43
INFO: 0f ee b5 e7 56 e0 71 74 1b c4 39 39 fd 85 f6 7b
INFO: Get platform token start
INFO: Get platform token succeeds, len: 1086
INFO: Platform attestation token:
INFO: d2 84 44 a1 01 38 22 a0 59 05 81 a9 19 01 09 78
INFO: 23 74 61 67 3a 61 72 6d 2e 63 6f 6d 2c 32 30 32
INFO: 33 3a 63 63 61 5f 70 6c 61 74 66 6f 72 6d 23 31
INFO: 2e 30 2e 30 0a 58 20 0d 22 e0 8a 98 46 90 58 48
INFO: 63 18 28 34 89 bd b3 6f 09 db ef eb 18 64 df 43
INFO: 3f a6 e5 4e a2 d7 11 19 09 5c 58 20 7f 45 4c 46
INFO: 02 01 01 00 00 00 00 00 00 00 00 00 03 00 3e 00
INFO: 01 00 00 00 50 58 00 00 00 00 00 00 19 01 00 58
INFO: 21 01 07 06 05 04 03 02 01 00 0f 0e 0d 0c 0b 0a
INFO: 09 08 17 16 15 14 13 12 11 10 1f 1e 1d 1c 1b 1a
INFO: 19 18 19 09 61 44 cf cf cf cf 19 09 5b 19 30 03
INFO: 19 09 62 67 73 68 61 2d 32 35 36 19 09 60 78 3a
INFO: 68 74 74 70 73 3a 2f 2f 76 65 72 61 69 73 6f 6e
INFO: 2e 65 78 61 6d 70 6c 65 2f 2e 77 65 6c 6c 2d 6b
INFO: 6e 6f 77 6e 2f 76 65 72 61 69 73 6f 6e 2f 76 65
INFO: 72 69 66 69 63 61 74 69 6f 6e 19 09 5f 8d a4 01
INFO: 69 52 53 45 5f 42 4c 31 5f 32 05 58 20 53 78 79
INFO: 63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56 41 41 9c
INFO: 3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3 02 58 20
INFO: 9a 27 1f 2a 91 6b 0b 6e e6 ce cb 24 26 f0 b3 20
INFO: 6e f0 74 57 8b e5 5d 9b c9 4f 6f 3f e3 ab 86 aa
INFO: 06 67 73 68 61 2d 32 35 36 a4 01 67 52 53 45 5f
INFO: 42 4c 32 05 58 20 53 78 79 63 07 53 5d f3 ec 8d
INFO: 8b 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3 22 38
INFO: c0 fa 97 3f 7a a3 02 58 20 53 c2 34 e5 e8 47 2b
INFO: 6a c5 1c 1a e1 ca b3 fe 06 fa d0 53 be b8 eb fd
INFO: 89 77 b0 10 65 5b fd d3 c3 06 67 73 68 61 2d 32
INFO: 35 36 a4 01 65 52 53 45 5f 53 05 58 20 53 78 79
INFO: 63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56 41 41 9c
INFO: 3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3 02 58 20
INFO: 11 21 cf cc d5 91 3f 0a 63 fe c4 0a 6f fd 44 ea
INFO: 64 f9 dc 13 5c 66 63 4b a0 01 d1 0b cf 43 02 a2
INFO: 06 67 73 68 61 2d 32 35 36 a4 01 66 41 50 5f 42
INFO: 4c 31 05 58 20 53 78 79 63 07 53 5d f3 ec 8d 8b
INFO: 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3 22 38 c0
INFO: fa 97 3f 7a a3 02 58 20 15 71 b5 ec 78 bd 68 51
INFO: 2b f7 83 0b b6 a2 a4 4b 20 47 c7 df 57 bc e7 9e
INFO: b8 a1 c0 e5 be a0 a5 01 06 67 73 68 61 2d 32 35
INFO: 36 a4 01 66 41 50 5f 42 4c 32 05 58 20 53 78 79
INFO: 63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56 41 41 9c
INFO: 3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3 02 58 20
INFO: 10 15 9b af 26 2b 43 a9 2d 95 db 59 da e1 f7 2c
INFO: 64 51 27 30 16 61 e0 a3 ce 4e 38 b2 95 a9 7c 58
INFO: 06 67 73 68 61 2d 32 35 36 a4 01 67 53 43 50 5f
INFO: 42 4c 31 05 58 20 53 78 79 63 07 53 5d f3 ec 8d
INFO: 8b 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3 22 38
INFO: c0 fa 97 3f 7a a3 02 58 20 10 12 2e 85 6b 3f cd
INFO: 49 f0 63 63 63 17 47 61 49 cb 73 0a 1a a1 cf aa
INFO: d8 18 55 2b 72 f5 6d 6f 68 06 67 73 68 61 2d 32
INFO: 35 36 a4 01 67 53 43 50 5f 42 4c 32 05 58 20 f1
INFO: 4b 49 87 90 4b cb 58 14 e4 45 9a 05 7e d4 d2 0f
INFO: 58 a6 33 15 22 88 a7 61 21 4d cd 28 78 0b 56 02
INFO: 58 20 aa 67 a1 69 b0 bb a2 17 aa 0a a8 8a 65 34
INFO: 69 20 c8 4c 42 44 7c 36 ba 5f 7e a6 5f 42 2c 1f
INFO: e5 d8 06 67 73 68 61 2d 32 35 36 a4 01 67 41 50
INFO: 5f 42 4c 33 31 05 58 20 53 78 79 63 07 53 5d f3
INFO: ec 8d 8b 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3
INFO: 22 38 c0 fa 97 3f 7a a3 02 58 20 2e 6d 31 a5 98
INFO: 3a 91 25 1b fa e5 ae fa 1c 0a 19 d8 ba 3c f6 01
INFO: d0 e8 a7 06 b4 cf a9 66 1a 6b 8a 06 67 73 68 61
INFO: 2d 32 35 36 a4 01 63 52 4d 4d 05 58 20 53 78 79
INFO: 63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56 41 41 9c
INFO: 3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3 02 58 20
INFO: a1 fb 50 e6 c8 6f ae 16 79 ef 33 51 29 6f d6 71
INFO: 34 11 a0 8c f8 dd 17 90 a4 fd 05 fa e8 68 81 64
INFO: 06 67 73 68 61 2d 32 35 36 a4 01 69 48 57 5f 43
INFO: 4f 4e 46 49 47 05 58 20 53 78 79 63 07 53 5d f3
INFO: ec 8d 8b 15 a2 e2 dc 56 41 41 9c 3d 30 60 cf e3
INFO: 22 38 c0 fa 97 3f 7a a3 02 58 20 1a 25 24 02 97
INFO: 2f 60 57 fa 53 cc 17 2b 52 b9 ff ca 69 8e 18 31
INFO: 1f ac d0 f3 b0 6e ca ae f7 9e 17 06 67 73 68 61
INFO: 2d 32 35 36 a4 01 69 46 57 5f 43 4f 4e 46 49 47
INFO: 05 58 20 53 78 79 63 07 53 5d f3 ec 8d 8b 15 a2
INFO: e2 dc 56 41 41 9c 3d 30 60 cf e3 22 38 c0 fa 97
INFO: 3f 7a a3 02 58 20 9a 92 ad bc 0c ee 38 ef 65 8c
INFO: 71 ce 1b 1b f8 c6 56 68 f1 66 bf b2 13 64 4c 89
INFO: 5c cb 1a d0 7a 25 06 67 73 68 61 2d 32 35 36 a4
INFO: 01 6c 54 42 5f 46 57 5f 43 4f 4e 46 49 47 05 58
INFO: 20 53 78 79 63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc
INFO: 56 41 41 9c 3d 30 60 cf e3 22 38 c0 fa 97 3f 7a
INFO: a3 02 58 20 23 89 03 18 0c c1 04 ec 2c 5d 8b 3f
INFO: 20 c5 bc 61 b3 89 ec 0a 96 7d f8 cc 20 8c dc 7c
INFO: d4 54 17 4f 06 67 73 68 61 2d 32 35 36 a4 01 6d
INFO: 53 4f 43 5f 46 57 5f 43 4f 4e 46 49 47 05 58 20
INFO: 53 78 79 63 07 53 5d f3 ec 8d 8b 15 a2 e2 dc 56
INFO: 41 41 9c 3d 30 60 cf e3 22 38 c0 fa 97 3f 7a a3
INFO: 02 58 20 e6 c2 1e 8d 26 0f e7 18 82 de bd b3 39
INFO: d2 40 2a 2c a7 64 85 29 bc 23 03 f4 86 49 bc e0
INFO: 38 00 17 06 67 73 68 61 2d 32 35 36 58 60 31 d0
INFO: 4d 52 cc de 95 2c 1e 32 cb a1 81 88 5a 40 b8 cc
INFO: 38 e0 52 8c 1e 89 58 98 07 64 2a a5 e3 f2 bc 37
INFO: f9 53 74 50 6b ff 4d 2e 4b e7 06 3c 4d 72 41 92
INFO: 70 c7 22 e8 d4 d9 3e e8 b6 c9 fa ce 3b 43 c9 76
INFO: 1a 49 94 1a b6 f3 8f fd ff 49 6a d4 63 b4 cb fa
INFO: 11 d8 3e 23 e3 1f 7f 62 32 9d e3 0c 1c c8
INFO: DELEGATED ATTEST TEST END
JSON格式:
{"CCA_ATTESTATION_PROFILE": "tag:arm.com,2023:cca_platform#1.0.0","CCA_PLATFORM_CHALLENGE": "b'0D22E08A98469058486318283489BDB36F09DBEFEB1864DF433FA6E54EA2D711'","CCA_PLATFORM_IMPLEMENTATION_ID": "b'7F454C4602010100000000000000000003003E00010000005058000000000000'","CCA_PLATFORM_INSTANCE_ID": "b'0107060504030201000F0E0D0C0B0A090817161514131211101F1E1D1C1B1A1918'","CCA_PLATFORM_CONFIG": "b'CFCFCFCF'","CCA_PLATFORM_LIFECYCLE": "secured_3003","CCA_PLATFORM_HASH_ALGO_ID": "sha-256","CCA_PLATFORM_VERIFICATION_SERVICE": "https://veraison.example/.well-known/veraison/verification","CCA_PLATFORM_SW_COMPONENTS": [{"SW_COMPONENT_TYPE": "RSE_BL1_2","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'9A271F2A916B0B6EE6CECB2426F0B3206EF074578BE55D9BC94F6F3FE3AB86AA'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "RSE_BL2","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'53C234E5E8472B6AC51C1AE1CAB3FE06FAD053BEB8EBFD8977B010655BFDD3C3'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "RSE_S","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'1121CFCCD5913F0A63FEC40A6FFD44EA64F9DC135C66634BA001D10BCF4302A2'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "AP_BL1","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'1571B5EC78BD68512BF7830BB6A2A44B2047C7DF57BCE79EB8A1C0E5BEA0A501'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "AP_BL2","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'10159BAF262B43A92D95DB59DAE1F72C645127301661E0A3CE4E38B295A97C58'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "SCP_BL1","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'10122E856B3FCD49F063636317476149CB730A1AA1CFAAD818552B72F56D6F68'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "SCP_BL2","SIGNER_ID": "b'F14B4987904BCB5814E4459A057ED4D20F58A633152288A761214DCD28780B56'","MEASUREMENT_VALUE": "b'AA67A169B0BBA217AA0AA88A65346920C84C42447C36BA5F7EA65F422C1FE5D8'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "AP_BL31","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'2E6D31A5983A91251BFAE5AEFA1C0A19D8BA3CF601D0E8A706B4CFA9661A6B8A'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "RMM","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'A1FB50E6C86FAE1679EF3351296FD6713411A08CF8DD1790A4FD05FAE8688164'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "HW_CONFIG","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'1A252402972F6057FA53CC172B52B9FFCA698E18311FACD0F3B06ECAAEF79E17'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "FW_CONFIG","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'9A92ADBC0CEE38EF658C71CE1B1BF8C65668F166BFB213644C895CCB1AD07A25'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "TB_FW_CONFIG","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'238903180CC104EC2C5D8B3F20C5BC61B389EC0A967DF8CC208CDC7CD454174F'","CCA_SW_COMPONENT_HASH_ID": "sha-256"},{"SW_COMPONENT_TYPE": "SOC_FW_CONFIG","SIGNER_ID": "b'5378796307535DF3EC8D8B15A2E2DC5641419C3D3060CFE32238C0FA973F7AA3'","MEASUREMENT_VALUE": "b'E6C21E8D260FE71882DEBDB339D2402A2CA7648529BC2303F48649BCE0380017'","CCA_SW_COMPONENT_HASH_ID": "sha-256"}]
}
五、基于 RSE 的 DICE 保護環境(DPE)
DICE Protection Environment(DPE) 服務使得能夠在隔離的執行環境中執行 DICE 指令。
它向客戶端提供一個接口,以 CBOR 對象編碼的方式發送 DICE 指令,作用于不透明的上下文句柄。
DPE 服務在其內部上下文上執行 DICE 派生和認證,而不會將 DICE 機密(私鑰和 CDI)暴露在隔離環境之外。
5.1. DPE API
定義位置:
include/lib/psa/dice_protection_environment.h
API 原型如下:
dpe_error_t
dpe_derive_context(int context_handle,uint32_t cert_id,bool retain_parent_context,bool allow_new_context_to_derive,bool create_certificate,const DiceInputValues *dice_inputs,int32_t target_locality,bool return_certificate,bool allow_new_context_to_export,bool export_cdi,int *new_context_handle,int *new_parent_context_handle,uint8_t *new_certificate_buf,size_t new_certificate_buf_size,size_t *new_certificate_actual_size,uint8_t *exported_cdi_buf,size_t exported_cdi_buf_size,size_t *exported_cdi_actual_size);
5.2. 構建時配置選項
-
MEASURED_BOOT
:啟用可信啟動功能。 -
DICE_PROTECTION_ENVIRONMENT
:布爾值標志,用于在啟用 RSE 可信啟動時,指定是否使用 DPE 作為后端。默認值為 0。若設置為 1,則可信啟動過程中收集的度量值及其元數據將發送至 DPE 進行存儲和處理。 -
DPE_ALG_ID
:指定測量鏡像所使用的哈希算法,默認值為 sha-256。
5.3. 示例證書鏈
參見:
plat/arm/board/tc/tc_dpe.h
六、RSE OTP 資產管理
RSE 為 AP 提供對 OTP 中資產的訪問權限,包括用于鏡像簽名驗證的密鑰,以及用于回滾保護的非易失性計數器。
6.1. 非易失性計數器 API
AP 與 RSE 之間用于獲取和遞增非易失性計數器的接口如下:
定義位置:
include/lib/psa/rse_platform_api.h
psa_status_t rse_platform_nv_counter_increment(uint32_t counter_id)psa_status_t rse_platform_nv_counter_read(uint32_t counter_id,uint32_t size, uint8_t *val)
該服務允許讀取/遞增 ARM CCA 平臺上使用的以下三種非易失性計數器:
-
用于 CCA 固件(BL2、BL31、RMM)的計數器;
-
用于安全固件的計數器;
-
用于非安全固件的計數器。
6.2. 公鑰 API
AP 與 RSE 之間用于讀取 ROTPK(Root of Trust Public Key)的接口如下:
定義位置:
include/lib/psa/rse_platform_api.h
psa_status_t rse_platform_key_read(enum rse_key_id_builtin_t key,uint8_t *data, size_t data_size, size_t *data_length)
該服務允許讀取 ARM CCA 平臺上使用的以下三種 ROTPK:
-
用于 CCA 固件(BL2、BL31、RMM)的 ROTPK;
-
用于安全固件的 ROTPK;
-
用于非安全固件的 ROTPK。
6.3. 獲取熵的 API
AP 與 RSE 之間用于讀取熵值的接口如下:
定義位置:
include/lib/psa/rse_platform_api.h
psa_status_t rse_platform_get_entropy(uint8_t *data, size_t data_size)
該服務允許讀取由 RSE 生成的熵值。