0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OP-TEE服務(wù)項(xiàng)的啟動

麥辣雞腿堡 ? 來源:TrustZone ? 作者:TrustZone ? 2023-11-07 15:04 ? 次閱讀

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_headstart = &__start_ta_head_section;
            //獲取存放psedo TAs的head info的段末尾地址
            const struct pseudo_ta_headend = &__stop_ta_head_section;
            const struct pseudo_ta_headpta;    //定義一個指向TA head的變量指針
            for (pta = start; pta < end; pta++) {
                const struct pseudo_ta_headpta2;
            /* 檢查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)方式。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    648

    瀏覽量

    32774
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    8996
收藏 人收藏

    評論

    相關(guān)推薦

    TEE解決了什么問題?

    一、引言近年來,可信執(zhí)行的概念在物聯(lián)網(wǎng)安全領(lǐng)域也逐漸流傳??尚艌?zhí)行環(huán)境(TEE,Trusted Execution Environment)在智能手機(jī)中的應(yīng)用非常廣泛,如OP-TEE[1
    發(fā)表于 02-16 06:03

    請問Beal環(huán)境下編譯OP-TEE后生成FIP需要哪些文件?

    stm32mp157d-***-bl32.dtb fip.bin但是當(dāng)我使用 OP-TEE 時(shí),我使用以下命令:fiptool 創(chuàng)建 --tos-fw tee
    發(fā)表于 12-05 07:06

    如何將大量電源管理和計(jì)時(shí)工作從ATF轉(zhuǎn)移到OP-TEE上呢

    你好!據(jù)我了解,ST 正在將大量電源管理和計(jì)時(shí)工作從 ATF 轉(zhuǎn)移到 OP-TEE。為了準(zhǔn)備這次轉(zhuǎn)變,我和我的合作開發(fā)人員已經(jīng)開始嘗試在 STM32MP157F-DK2 上構(gòu)建和運(yùn)行以下軟件
    發(fā)表于 12-07 06:01

    如何在不使用op-tee的情況下進(jìn)行編譯?

    我按照本指南使用自定義 DTS 文件(按步驟操作)并出現(xiàn)以下錯誤,如何在不使用 op-tee 的情況下進(jìn)行編譯?ERROR: optee-os-stm32mp-3.12.0.r1-r0
    發(fā)表于 12-28 10:01

    請問HSE op-tee是什么關(guān)系?

    我有個問題。S32G同時(shí)支持HSE和op-tee。S32G的安全加解密和證書管理是通過HSE完成的嗎?op-tee 和 HSE 只是其中之一嗎?有沒有相關(guān)的設(shè)計(jì)文檔?謝謝
    發(fā)表于 04-06 06:26

    OP-TEE無法在鎖定的i.MX6UL上初始化JR怎么解決?

    我們已經(jīng)設(shè)置了一個帶有 HABv4 引導(dǎo)鏈的 i.MX6UL 板。SPL --> U-boot --> OP-TEE --> LinuxOP-TEE 和 Linux 內(nèi)核來自
    發(fā)表于 04-17 07:31

    用于1028A系列的Yocto Layerscape安全啟動是怎么操作的?

    我目前正在嘗試熟悉 Layerscape 處理器上的安全啟動實(shí)現(xiàn)。最近幾天我一直在閱讀文檔但我仍然不清楚一切是如何工作的。 據(jù)我了解,這些是啟動階段: BL1:BootROM 代碼 BL2:預(yù)引導(dǎo)加載程序 BL31:EL3 運(yùn)行時(shí)固件 BL32:
    發(fā)表于 05-31 08:19

    物聯(lián)網(wǎng)終端應(yīng)用TEE的一些思考

    一、引言近年來,可信執(zhí)行的概念在物聯(lián)網(wǎng)安全領(lǐng)域也逐漸流傳??尚艌?zhí)行環(huán)境(TEE,Trusted Execution Environment)在智能手機(jī)中的應(yīng)用非常廣泛,如OP-TEE[1
    發(fā)表于 12-17 18:21 ?12次下載
    物聯(lián)網(wǎng)終端應(yīng)用<b class='flag-5'>TEE</b>的一些思考

    OP-TEE中安全驅(qū)動的框架

    linux kernel與驅(qū)動的關(guān)系,那真的還是蠻簡單好理解的。但是我不知道~嚶嚶嚶) 系統(tǒng)服務(wù)層并非必需的,主要是為方便管理和上層使用。例如OP-TEE提供了各種各樣的密碼學(xué)算法,每一種算法的實(shí)現(xiàn)可通過不同的硬件引擎來完成。 為統(tǒng)一管理,可將這些硬件引擎驅(qū)動提供的操
    的頭像 發(fā)表于 10-30 16:04 ?776次閱讀
    <b class='flag-5'>OP-TEE</b>中安全驅(qū)動的框架

    OP-TEE的內(nèi)核初始化過程

    1 OP-TEE OS的入口函數(shù) ? OP-TEE鏡像的入口函數(shù)是在編譯OP-TEE OS時(shí)通過鏈接文件來確定的, ? OP-TEE在編譯時(shí)是按照optee_os/core/arch/
    的頭像 發(fā)表于 11-02 17:57 ?1279次閱讀
    <b class='flag-5'>OP-TEE</b>的內(nèi)核初始化過程

    OP-TEE的內(nèi)核初始化函數(shù)調(diào)用

    generic_boot_init_primary函數(shù)內(nèi)容 generic_boot_init_primary函數(shù)是OP-TEE建立系統(tǒng)運(yùn)行環(huán)境的入口函數(shù),該函數(shù)會進(jìn)行建立線程運(yùn)行空間、初始化
    的頭像 發(fā)表于 11-02 18:18 ?687次閱讀
    <b class='flag-5'>OP-TEE</b>的內(nèi)核初始化函數(shù)調(diào)用

    ARM64位與ARM32位OP-TEE啟動過程的差異

    ARM32的OP-TEE與ARM64的OP-TEE啟動過程大致相同。ARM64的OP-TEE的_start函數(shù)定義在generic_entry_a64.S文件中,而且該函數(shù)不像ARM3
    的頭像 發(fā)表于 11-07 15:12 ?700次閱讀

    ATF中bl32的啟動方法

    ATF中bl32的啟動 bl31中的runtime_svc_init函數(shù)會初始化OP-TEE對應(yīng)的服務(wù),通過調(diào)用該服務(wù)項(xiàng)的初始化函數(shù)來完成
    的頭像 發(fā)表于 11-07 16:32 ?581次閱讀
    ATF中bl32的<b class='flag-5'>啟動</b>方法

    OP-TEE的安全存儲的簡介

    OP-TEE的安全存儲的簡介 OP-TEE的安全存儲功能是OP-TEE為用戶提供的安全存儲機(jī)制。用戶可使用安全存儲功能來保存敏感數(shù)據(jù)、密鑰等信息。 使用OP-TEE安全存儲功能保存數(shù)據(jù)
    的頭像 發(fā)表于 11-21 11:33 ?957次閱讀
    <b class='flag-5'>OP-TEE</b>的安全存儲的簡介

    OP-TEE安全存儲安全文件的格式

    安全文件、dirf.db文件的數(shù)據(jù)格式和操作過程 OP-TEE的安全存儲功能可滿足用戶保存敏感數(shù)據(jù)的需求,需要被保存的數(shù)據(jù)會被加 密保存到文件系統(tǒng)或RPMB分區(qū)中 。 當(dāng)選擇將數(shù)據(jù)保存到文件系統(tǒng)中
    的頭像 發(fā)表于 11-21 11:49 ?692次閱讀
    <b class='flag-5'>OP-TEE</b>安全存儲安全文件的格式