0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OP-TEE服务项的启动

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-11-07 15:04 次阅读

OP-TEE服务项的启动分为: service_init以及service_init_late ,需要被启动的服务项通过使用这两个宏,在编译时,相关服务的内容将会被保存到initcall1和initcall2中。

1. service_init宏

在OP-TEE使用中使用service_init宏定义的服务项如下:

service_init(register_supplicant_user_ta);
        service_init(verify_pseudo_tas_conformance);
        service_init(tee_cryp_init);
        service_init(tee_se_manager_init);

如果开发者有实际需求,可以将自己希望添加的服务项功能按照相同的方式添加到系统中。

在当前的OP-TEE中默认是启动上述四个服务,分别定义在以下文件:

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部分:

该操作主要是注册OP-TEE加载REE侧的TA镜像时需要使用的操作接口 ,当REE侧执行open session操作时,TEE侧会根据UUID的值在REE侧的文件系统中查找该文件,然后通过RPC请求通知tee_supplicant从REE的文件系统中读取与UUID对应的TA镜像文件的内容并传递到TEE侧。

verify_pseudo_tas_conformance部分:

该函数主要是用来校验OP-TEE中静态TA的合法性,需要检查OP-TEE OS中静态TA的UUID、函数指针以及相关的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函数指针是否为空和相关的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所有静态TA的内容,其值的定义见core/arch/arm/kernel/kern.ld.S文件,分别表示ta_head_section段的起始地址和末端地址。

在编译OP-TEE的静态TA时,使用pseudo_ta_register宏来告知编译器将静态TA的内容保存到ta_head_section段中,该宏定义在core/arch/arm/include/kernel/pseudo_ta.h文件中,内容如下:

#define pseudo_ta_register(...) static const struct pseudo_ta_head __head 
                    __used __section("ta_head_section") = { __VA_ARGS__ }

共有六个静态TA在OP-TEE编译时会被打包进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提供的密码学接口功能的初始化操作,调用crypto_ops结构体中的init进行初始化操作,该结构体变量定义在core/lib/libtomcrypt/src/tee_ltc_provider.c文件中,变量中定义了各种算法的操作函数指针。

完成注册后,TA就可以通过调用该变量中的对应函数指针来实现OP-TEE中各种密码学算法接口的调用。

tee_se_manager_init部分:

该部分主要完成对SE模块的管理,为上层提供对SE模块的操作接口。

2. service_init_late宏

service_init_late宏定义的内容将会在编译时被链接到OP-TEE镜像文件的initcall2段中OP-TEE中使用该宏来定义OP-TEE中使用的密钥管理操作 ,在core/tee/tee_fs_key_manager.c文件中,使用该宏来将tee_fs_key_manager函数保存到initcall2段中,

在OP-TEE启动时被调用,用来生成或读取OP-TEE在使用时会使用到的key,该函数内容如下:

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)];
            /* 获取机器唯一的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));
            /*  调用HMAC算法,以获取到的message作为参数传入来计算出一串字符串作为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将会在使用安全存储功能时用到,用于生成加密、解密安全文件的FEK,其中tee_otp_get_hw_unique_key函数可根据不同的平台进行修改 ,只要保证读取到的值的唯一性且安全即可,当前一般做法是读取一次性编程区域(One Time Programmable, OTP)或efuse中的值,该值将在芯片生产或者工厂整机生产时烧录到OTP中,当然也有其他的实现方式。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译
    +关注

    关注

    0

    文章

    616

    浏览量

    32401
  • 宏定义
    +关注

    关注

    0

    文章

    48

    浏览量

    8928
收藏 人收藏

    评论

    相关推荐

    TEE解决了什么问题?

    一、引言近年来,可信执行的概念在物联网安全领域也逐渐流传。可信执行环境(TEE,Trusted Execution Environment)在智能手机中的应用非常广泛,如OP-TEE[1
    发表于 02-16 06:03

    请问Beal环境下编译OP-TEE后生成FIP需要哪些文件?

    stm32mp157d-***-bl32.dtb fip.bin但是当我使用 OP-TEE 时,我使用以下命令:fiptool 创建 --tos-fw tee
    发表于 12-05 07:06

    如何将大量电源管理和计时工作从ATF转移到OP-TEE上呢

    你好!据我了解,ST 正在将大量电源管理和计时工作从 ATF 转移到 OP-TEE。为了准备这次转变,我和我的合作开发人员已经开始尝试在 STM32MP157F-DK2 上构建和运行以下软件
    发表于 12-07 06:01

    如何在不使用op-tee的情况下进行编译?

    我按照本指南使用自定义 DTS 文件(按步骤操作)并出现以下错误,如何在不使用 op-tee 的情况下进行编译?ERROR: optee-os-stm32mp-3.12.0.r1-r0
    发表于 12-28 10:01

    请问HSE op-tee是什么关系?

    我有个问题。S32G同时支持HSE和op-tee。S32G的安全加解密和证书管理是通过HSE完成的吗?op-tee 和 HSE 只是其中之一吗?有没有相关的设计文档?谢谢
    发表于 04-06 06:26

    OP-TEE无法在锁定的i.MX6UL上初始化JR怎么解决?

    我们已经设置了一个带有 HABv4 引导链的 i.MX6UL 板。SPL --> U-boot --> OP-TEE --> LinuxOP-TEE 和 Linux 内核来自
    发表于 04-17 07:31

    物联网终端应用TEE的一些思考

    一、引言近年来,可信执行的概念在物联网安全领域也逐渐流传。可信执行环境(TEE,Trusted Execution Environment)在智能手机中的应用非常广泛,如OP-TEE
    发表于 12-17 18:21 12次下载
    物联网终端应用<b class='flag-5'>TEE</b>的一些思考

    OP-TEE中安全驱动的框架

    linux kernel与驱动的关系,那真的还是蛮简单好理解的。但是我不知道~嘤嘤嘤) 系统服务层并非必需的,主要是为方便管理和上层使用。例如OP-TEE提供了各种各样的密码学算法,每一种算法的实现可通过不同的硬件引擎来完成。 为统一管理,可将这些硬件引擎驱动提供的操
    的头像 发表于 10-30 16:04 337次阅读
    <b class='flag-5'>OP-TEE</b>中安全驱动的框架

    OP-TEE的内核初始化过程

    1 OP-TEE OS的入口函数 • OP-TEE镜像的入口函数是在编译OP-TEE OS时通过链接文件来确定的, • OP-TEE在编译时是按照optee_os/core/arch/
    的头像 发表于 11-02 17:57 479次阅读
    <b class='flag-5'>OP-TEE</b>的内核初始化过程

    reset_primary函数的执行流程

    从核 , 待所有CPU核都启动完成之后 ,OP-TEE会触发安全监控模式调用(smc), 通知系统OP-TEE启动已完成并将CPU的状态切换回到正常世界状态 ,该函数的执行流程如图所示
    的头像 发表于 11-02 18:06 293次阅读
    reset_primary函数的执行流程

    OP-TEE的内核初始化函数调用

    generic_boot_init_primary函数内容 generic_boot_init_primary函数是OP-TEE建立系统运行环境的入口函数,该函数会进行建立线程运行空间、初始化
    的头像 发表于 11-02 18:18 360次阅读
    <b class='flag-5'>OP-TEE</b>的内核初始化函数调用

    ARM64位与ARM32位OP-TEE启动过程的差异

    ARM32的OP-TEE与ARM64的OP-TEE启动过程大致相同。ARM64的OP-TEE的_start函数定义在generic_entry_a64.S文件中,而且该函数不像ARM3
    的头像 发表于 11-07 15:12 293次阅读

    ATF中bl32的启动方法

    ATF中bl32的启动 bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务,通过调用该服务项的初始化函数来完成OP-TE
    的头像 发表于 11-07 16:32 237次阅读
    ATF中bl32的<b class='flag-5'>启动</b>方法

    OP-TEE的安全存储的简介

    OP-TEE的安全存储的简介 OP-TEE的安全存储功能是OP-TEE为用户提供的安全存储机制。用户可使用安全存储功能来保存敏感数据、密钥等信息。 使用OP-TEE安全存储功能保存数据
    的头像 发表于 11-21 11:33 365次阅读
    <b class='flag-5'>OP-TEE</b>的安全存储的简介

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

    安全文件、dirf.db文件的数据格式和操作过程 OP-TEE的安全存储功能可满足用户保存敏感数据的需求,需要被保存的数据会被加 密保存到文件系统或RPMB分区中 。 当选择将数据保存到文件系统
    的头像 发表于 11-21 11:49 271次阅读
    <b class='flag-5'>OP-TEE</b>安全存储安全文件的格式