OP-TEE服務(wù)項(xiàng)的啟動分為: service_init以及service_init_late ,需要被啟動的服務(wù)項(xiàng)通過使用這兩個宏,在編譯時(shí),相關(guān)服務(wù)的內(nèi)容將會被保存到initcall1和initcall2中。
1. service_init宏
在OP-TEE使用中使用service_init宏定義的服務(wù)項(xiàng)如下:
service_init(register_supplicant_user_ta);
service_init(verify_pseudo_tas_conformance);
service_init(tee_cryp_init);
service_init(tee_se_manager_init);
如果開發(fā)者有實(shí)際需求,可以將自己希望添加的服務(wù)項(xiàng)功能按照相同的方式添加到系統(tǒng)中。
在當(dāng)前的OP-TEE中默認(rèn)是啟動上述四個服務(wù),分別定義在以下文件:
register_supplicant_user_ta: core/arch/arm/kernel/ree_fs_ta.c
verify_pseudo_tas_conformance: core/arch/arm/kernel/pseudo_ta
tee_cryp_init: core/tee/tee_cryp_utl.c
tee_se_manager_init: core/tee/se/manager.c
register_supplicant_user_ta部分:
該操作主要是注冊O(shè)P-TEE加載REE側(cè)的TA鏡像時(shí)需要使用的操作接口 ,當(dāng)REE側(cè)執(zhí)行open session操作時(shí),TEE側(cè)會根據(jù)UUID的值在REE側(cè)的文件系統(tǒng)中查找該文件,然后通過RPC請求通知tee_supplicant從REE的文件系統(tǒng)中讀取與UUID對應(yīng)的TA鏡像文件的內(nèi)容并傳遞到TEE側(cè)。
verify_pseudo_tas_conformance部分:
該函數(shù)主要是用來校驗(yàn)OP-TEE中靜態(tài)TA的合法性,需要檢查OP-TEE OS中靜態(tài)TA的UUID、函數(shù)指針以及相關(guān)的flag。該段代碼如下:
static TEE_Result verify_pseudo_tas_conformance(void)
{
//獲取存放psedo TAs的head info的段起始地址
const struct pseudo_ta_head *start = &__start_ta_head_section;
//獲取存放psedo TAs的head info的段末尾地址
const struct pseudo_ta_head *end = &__stop_ta_head_section;
const struct pseudo_ta_head *pta; //定義一個指向TA head的變量指針
for (pta = start; pta < end; pta++) {
const struct pseudo_ta_head *pta2;
/* 檢查psedo TAs的head info中包含的UUID信息是否有相同的 */
for (pta2 = pta + 1; pta2 < end; pta2++)
if (! memcmp(&pta- >uuid, &pta2- >uuid, sizeof(TEE_UUID)))
goto err;
/* 檢查invoke函數(shù)指針是否為空和相關(guān)的flag是否合法 */
if (! pta- >name ||
(pta- >flags & PTA_MANDATORY_FLAGS) ! = PTA_MANDATORY_FLAGS ||
pta- >flags & ~PTA_ALLOWED_FLAGS ||
!pta- >invoke_command_entry_point)
goto err;
}
return TEE_SUCCESS;
err:
DMSG("pseudo TA error at %p", (void *)pta);
panic("pta");
}
OP-TEE OS鏡像文件中的__start_ta_head_section與__stop_ta_head_section之間保存的是OP-TEE所有靜態(tài)TA的內(nèi)容,其值的定義見core/arch/arm/kernel/kern.ld.S文件,分別表示ta_head_section段的起始地址和末端地址。
在編譯OP-TEE的靜態(tài)TA時(shí),使用pseudo_ta_register宏來告知編譯器將靜態(tài)TA的內(nèi)容保存到ta_head_section段中,該宏定義在core/arch/arm/include/kernel/pseudo_ta.h文件中,內(nèi)容如下:
#define pseudo_ta_register(...) static const struct pseudo_ta_head __head
__used __section("ta_head_section") = { __VA_ARGS__ }
共有六個靜態(tài)TA在OP-TEE編譯時(shí)會被打包進(jìn)OP-TEE的鏡像文件中,分別如下:
gprof: core/arch/arm/pta/gprof.c
interrupt_tests.ta: core/arch/arm/pta/Iiterrupt_tests.c
stats.ta: core/arch/arm/pta/stats.c
se_api_self_tests.ta: core/arch/arm/pta/se_api_self_tests.c
socket: core/arch/arm/tee/pta_socket.c
invoke_tests.pta: core/arch/arm/pta/pta_invoke_test.c
tee_cryp_init部分:
該部分主要完成OP-TEE提供的密碼學(xué)接口功能的初始化操作,調(diào)用crypto_ops結(jié)構(gòu)體中的init進(jìn)行初始化操作,該結(jié)構(gòu)體變量定義在core/lib/libtomcrypt/src/tee_ltc_provider.c文件中,變量中定義了各種算法的操作函數(shù)指針。
完成注冊后,TA就可以通過調(diào)用該變量中的對應(yīng)函數(shù)指針來實(shí)現(xiàn)OP-TEE中各種密碼學(xué)算法接口的調(diào)用。
tee_se_manager_init部分:
該部分主要完成對SE模塊的管理,為上層提供對SE模塊的操作接口。
2. service_init_late宏
service_init_late宏定義的內(nèi)容將會在編譯時(shí)被鏈接到OP-TEE鏡像文件的initcall2段中 , OP-TEE中使用該宏來定義OP-TEE中使用的密鑰管理操作 ,在core/tee/tee_fs_key_manager.c文件中,使用該宏來將tee_fs_key_manager函數(shù)保存到initcall2段中,
在OP-TEE啟動時(shí)被調(diào)用,用來生成或讀取OP-TEE在使用時(shí)會使用到的key,該函數(shù)內(nèi)容如下:
static TEE_Result tee_fs_init_key_manager(void)
{
int res = TEE_SUCCESS;
struct tee_hw_unique_key huk;
uint8_t chip_id[TEE_FS_KM_CHIP_ID_LENGTH];
uint8_t message[sizeof(chip_id) + sizeof(string_for_ssk_gen)];
/* 獲取機(jī)器唯一的key作為salt值 */
tee_otp_get_hw_unique_key(&huk);
/* 獲取chip ID值 */
tee_otp_get_die_id(chip_id, sizeof(chip_id));
/* 將unique key和chip id存放到message變量中 */
memcpy(message, chip_id, sizeof(chip_id));
memcpy(message + sizeof(chip_id), string_for_ssk_gen,
sizeof(string_for_ssk_gen));
/* 調(diào)用HMAC算法,以獲取到的message作為參數(shù)傳入來計(jì)算出一串字符串作為key存放到tee_
fs_ssk變量中的key成員中 */
res = do_hmac(tee_fs_ssk, key, sizeof(tee_fs_ssk.key),
huk.data, sizeof(huk.data),
message, sizeof(message));
if (res == TEE_SUCCESS)
tee_fs_ssk.is_init = 1;
return res;
}
這些key將會在使用安全存儲功能時(shí)用到,用于生成加密、解密安全文件的FEK,其中tee_otp_get_hw_unique_key函數(shù)可根據(jù)不同的平臺進(jìn)行修改 ,只要保證讀取到的值的唯一性且安全即可,當(dāng)前一般做法是讀取一次性編程區(qū)域(One Time Programmable, OTP)或efuse中的值,該值將在芯片生產(chǎn)或者工廠整機(jī)生產(chǎn)時(shí)燒錄到OTP中,當(dāng)然也有其他的實(shí)現(xiàn)方式。
-
編譯
+關(guān)注
關(guān)注
0文章
648瀏覽量
32774 -
宏定義
+關(guān)注
關(guān)注
0文章
50瀏覽量
8996
發(fā)布評論請先 登錄
相關(guān)推薦
評論