组件框架图

image.png

TEE组件化主要包含三个模块,分别为:

  • TEE Kernel
  • Trusted Application (TA)
  • Client Application (CA)

其中, Kernel模块负责TEE OS的客户端的命令解析和参数处理,以及对内部支持的TA的管理,比如查询、安全服务调用等。通过Internal API实现对Trusted Application的接口调用处理, Interface API是内部调用Trusted Application的调用接口,实现TA的具体功能。而Client API提供了如何调用TA的相关安全服务,向用户提供了安全服务的调用接口,其运行在REE环境里。

TA服务调用入口

  • Service Node

    TEE_SRV_DATA_START(
        ta_createentrypoint,
        ta_destroyentrypoint,
        ta_opensessionentrypoint,
        ta_closesessionentrypoint,
        ta_invokecommandentrypoint)
        TEE_SRV_UUID_PROPERTY("gpd.ta.appID", XOR_TA_UUID)
    TEE_SRV_DATA_END
    

每一个TA都有自己的UUID,为了方便管理TA,我们将TA作为系统结点串联起来,在使用的时候,根据Client API的输入UUID,在TA链表里查找对应的UUID,从而获取TA的操作句柄。

  • UUID

    UUID格式是标准的数据类型。

#define TA_UUID  
{0x5445455f, 0x4944, 0x325f, {0x53, 0x52, 0x56, 0x5f, 0x55, 0x55, 0x19, 0x33 } }
  • Entrypoint API

Entrypoint API是利用TA的操作句柄调用其安全服务的入口,由以下五个接口组成:

  1. ta_createentrypoint
  2. ta_destroyentrypoint
  3. ta_opensessionentrypoint
  4. ta_closesessionentrypoint
  5. ta_invokecommandentrypoint

CA客户端接口

TA的客户端接口用于调用运行在TEE里的TA服务,主要包括以下五个接口:

  1. teec_initializecontext
  2. teec_finalizecontext
  3. teec_opensession
  4. teec_closesession
  5. teec_invokecommand

TA客户端的接口实现和TA服务接口一一对应。

应用客户端接口

设备接口

  • 设备信息获取

    int32_t csi_tee_dev_info_get(const uint8_t *name_encrypted,
                                 uint32_t name_encrypted_len,
                                 const uint8_t *product_key_encrypted,
                                 uint32_t product_key_encrypted_len,
                                 const uint8_t *name, uint32_t *name_len,
                                 const uint8_t *product_key, uint32_t *product_key_len)
    参数
        name_encrypted- 设备名字加密数据指针
        name_encrypted_len- 设备名字加密数据长度
        product_key_encrypted- 产品密钥加密数据指针
        product_key_encrypted_len- 产品密钥加密数据长度
        name- 设备名字指针
        name_len- 设备名字长度
        product_key - 产品密钥指针
        product_key_len - 产品密钥长度
    返回值
        0 - 成功
        !0 - 失败
    
  • 系统频率

    int32_t csi_tee_set_sys_freq(uint32_t clk_src, uint32_t clk_val);
    参数
        clk_src- 时钟源类型
        clk_val- 时钟值
    返回值
        0 - 成功
        !0 - 失败
    
  • 寄存器

    int32_t csi_tee_read_reg(uint32_t addr, uint32_t *val)
    参数
        addr- 寄存器地址
        cval- 寄存器值指针
    返回值
        0 - 成功
        !0 - 失败
    
    int32_t csi_tee_write_reg(uint32_t addr, uint32_t val);
    
    参数
        addr- 寄存器地址
        val- 设置数据
    返回值
        0 - 成功
        !0 - 失败
    
  • 获取设备ID

    int32_t csi_tee_get_cid(uint8_t *out, uint32_t *out_len)
    参数
        out- CID输出数据
        out_len-  CID输出数据长度
    返回值
        0 - 成功
        !0 - 失败
    

低功耗接口

  • 进入低功耗模式

    int32_t csi_tee_enter_lpm(uint32_t gate, uint32_t irqid, tee_lpm_mode_e mode)
    参数
        gate- PMU gate寄存器地址
        irqid- 中断号ID(reserved)
        mode - 低功耗模式类型
    返回值
        0 - 成功
        !0 - 失败
    
    枚举类型
          typedef enum {
    
                TEE_LPM_MODE_WAIT = 0,   ///< lpm wait
    
                TEE_LPM_MODE_DOZE = 1,   ///< lpm doze
    
                TEE_LPM_MODE_STOP = 2,   ///< lpm stop
    
                TEE_LPM_MODE_STANDBY = 3, ///< lpm standby
    
                TEE_LPM_MODE_CLOCK = 4,  ///< lpm clock gate
    
                TEE_LPM_MODE_MAX,
    
        } tee_lpm_mode_e;
    

字符编码接口

  • Base64编解码接口

    int32_t csi_tee_base64(const uint8_t *in,
                           uint32_t in_len,
                           uint8_t *out,
                           uint32_t *out_len,
                           uint32_t is_encode,
                           uint32_t wsafe);
    参数
        in - 消息数据指针
        in_len - 消息数据长度
        out - 编码数据存放指针
        out_len- 编码数据长度
        is_encode - 编码解码标志位
        wsafe - websafe取代特性
    返回值
        0 - 成功
        !0 - 失败
    
  • Base64编码接口

    int32_t csi_tee_base64_encode(const uint8_t *in,
                                  uint32_t in_len,
                                  uint8_t *out,
                                  uint32_t *out_len)
    
    参数
        in - 消息数据指针
        in_len - 消息数据长度
        out - 编码数据存放指针
        out_len- 编码数据长度
    返回值
        0 - 成功
        !0 - 失败
    
  • Base64解码接口

    int32_t csi_tee_base64_decode(const uint8_t *in,
                                  uint32_t in_len,
                                  uint8_t *out,
                                  uint32_t *out_len)
    
    参数
        in - 消息数据指针
        in_len - 消息数据长度
        out - 解码数据存放指针
        out_len- 解码数据长度
    返回值
        0 - 成功
        !0 - 失败
    

消息认证码接口

  • HMAC

    int32_t csi_tee_hmac(const uint8_t *in,
                         uint32_t  in_len,
                         const uint8_t *key,
                         uint32_t key_len,
                         uint8_t *out,
                         tee_hmac_type_e type,
                         tee_hash_op_e hash_op,
                         uint32_t *ctx);
    
    参数
        in - 消息数据指针
        in_len - 消息数据长度
        key - 密钥指针
        key_len - 密钥长度
        out - 认证码存放指针
        type- 认证码类型
        hash_op- 哈希类型
        ctx - 哈希上下文
    返回值
        0 - 成功
        !0 - 失败
    枚举类型
          typedef enum {
    
               TEE_SHA1 = 0,   ///< SHA1
    
               TEE_SHA256 = 1, ///< SHA256
    
               TEE_SHA224 = 2, ///< SHA224
    
               TEE_SHA384 = 3, ///< SHA384
    
               TEE_SHA512 = 4, ///< SHA512
    
               TEE_SHA_MAX,    ///< invaild sha type
    
           } tee_sha_type_t;
    
          /****** TEE HMAC type *****/
    
         typedef enum {
               TEE_HMAC_SHA1 = 1,    ///< HMAC with SHA1
          } tee_hmac_type_e;
    
    int32_t csi_tee_hmac_digest(const uint8_t *in,
                                uint32_t  in_len,
                                const uint8_t *key,
                                uint32_t key_len,
                                uint8_t *out,
                                tee_hmac_type_e type)
    
    参数
        in - 消息数据指针
        in_len - 消息数据长度
        key - 密钥指针
        key_len - 密钥长度
        out - 认证码存放指针
        type- 认证码类型
    返回值
        0 - 成功
        !0 - 失败
    

随机数接口

  • 随机数生成种子

    int32_t csi_tee_rand_generate(uint8_t *out, uint32_t out_len);
    
    参数
        out - 随机数存放指针
        out_len- 随机数长度
    返回值
        0 - 成功
        !0 - 失败
    
  • 随机数生成

    int32_t csi_tee_rand_generate(uint8_t *out, uint32_t out_len);
    
    参数
        out - 随机数存放指针
        out_len- 随机数长度
    返回值
        0 - 成功
        !0 - 失败
    

哈希接口

  • 哈希基本操作

    int32_t csi_tee_sha(const uint8_t *in,
                        uint32_t in_len,
                        uint8_t *out,
                        tee_sha_type_t type,
                        tee_hash_op_e hash_op,
                        void *ctx)
    
    参数
        in - 哈希数据指针
        in_len - 哈希数据长度
        out - 哈希密钥指针
        type - 哈希类型
        hash_op- 哈希操作类型
        ctx - 哈希上下文
    返回值
        0 - 成功
        !0 - 失败
    枚举定义
    typedef enum {
                     TEE_SHA1 = 0,   ///< SHA1
    
                     TEE_SHA256 = 1, ///< SHA256
    
                     TEE_SHA224 = 2, ///< SHA224
    
                     TEE_SHA384 = 3, ///< SHA384
    
                     TEE_SHA512 = 4, ///< SHA512
    
                     TEE_SHA_MAX,    ///< invaild sha type
    
                 } tee_sha_type_t;
    
    typedef enum {
                     TEE_HASH_OP_NONE = 0,     ///< No operation
    
                     TEE_HASH_OP_START = 1,    ///< HASH init
    
                     TEE_HASH_OP_UPDATA = 2,   ///< HASH update
    
                     TEE_HASH_OP_FINISH = 3,   ///< HASH finish
    
                     TEE_HASH_OP_MAX,          ///< invailed operation
    
                 } tee_hash_op_e;
    
  • 消息哈希

    int32_t csi_tee_sha_digest(tee_sha_type_t type, void *ctx);
    
    参数
        hash_op- 哈希操作类型
    
  • 消息哈希Start接口

    int32_t csi_tee_sha_start(tee_sha_type_t type, void *ctx);
    
    参数
        in - 哈希数据指针
        in_len - 哈希数据长度
        out - 哈希密钥指针
        type - 哈希类型
    返回值
        0 - 成功
        !0 - 失败
    
  • 消息哈希update接口

    int32_t csi_tee_sha_update(const uint8_t *in, uint32_t in_len, uint8_t *ctx);
    
    参数
        in - 哈希数据指针
        in_len - 哈希数据长度
        ctx  - 哈希上下文
    返回值
        0 - 成功
        !0 - 失败
    
  • 消息哈希finish接口

    int32_t csi_tee_sha_finish(uint8_t *out, void *ctx);
    
    参数
        out - 哈希密钥指针
        ctx - 哈希上下文
    返回值
        0 - 成功
        !0 - 失败
    

AES接口

  • AES加密

    int32_t csi_tee_aes_encrypt(const uint8_t *in,
                                uint32_t in_len,
                                const uint8_t *key,
                                uint32_t key_len, 
                                uint8_t iv[16],
                                uint8_t *out,
                                tee_aes_mode_e mode)
    
    参数
        in - 加密数据指针
        in_len - 加密数据长度
        key - 加密密钥指针
        key_len - 加密密钥长度
        iv - IV指针
        out - 加密数据指针
        mode - AES操作模式
    返回值
        0 - 成功
        !0 - 失败
    枚举定义
    typedef enum {
                 TEE_AES_MODE_ECB = 0,    ///< TEE AES ECB mode
                 TEE_AES_MODE_CBC = 1,    ///< TEE AES CBC mode
                 TEE_AES_MODE_MAX,        ///< invaild mode
    } tee_aes_mode_e;
    
  • AES 解密

    int32_t csi_tee_aes_decrypt(const uint8_t *in,
                                uint32_t in_len,
                                const uint8_t *key,
                                uint32_t key_len, 
                                uint8_t iv[16],
                                uint8_t *out,
                                tee_aes_mode_e mode)
    
    参数
        in - 解密数据指针
        in_len - 解密数据长度
        key - 解密密钥指针
        key_len - 解密密钥长度
        iv - IV指针out - 解密数据指针
        out - 解密数据指针
        mode - AES操作模式
    返回值
        0 - 成功
        !0 - 失败
    枚举定义
    typedef enum {
                 TEE_AES_MODE_ECB = 0,    ///< TEE AES ECB mode
                 TEE_AES_MODE_CBC = 1,    ///< TEE AES CBC mode
                 TEE_AES_MODE_MAX,        ///< invaild mode
    } tee_aes_mode_e;
    
  • AES-ECB 加密

    int32_t csi_tee_aes_encrypt_ecb(const uint8_t *in,
                                    uint32_t in_len,
                                    const uint8_t *key,
                                    uint32_t key_len,
                                    uint8_t *out)
    
    参数
        in - 加密数据指针
        in_len - 加密数据长度
        key - 加密密钥指针
        key_len - 加密密钥长度
    
  • AES-ECB 解密

    int32_t csi_tee_aes_decrypt_ecb(const uint8_t *in,
                                    uint32_t in_len,
                                    const uint8_t *key,
                                    uint32_t key_len,
                                    uint8_t *out)
    
    参数
        in - 解密数据指针
        in_len - 解密数据长度
        key - 解密密钥指针
        key_len - 解密密钥长度
        out - 解密数据指针
    返回值
        0 - 成功
        !0 - 失败
    
  • AES-CBC 加密

    int32_t csi_tee_aes_encrypt_cbc(const uint8_t *in,
                                    uint32_t in_len,
                                    const uint8_t *key,
                                    uint32_t key_len,
                                    uint8_t *iv,
                                    uint8_t *out)
    
    参数
        in - 加密数据指针
        in_len - 加密数据长度
        key - 加密密钥指针
        key_len - 加密密钥长度
        iv - iv数据指针
        out - 加密数据指针
    返回值
        0 - 成功
        !0 - 失败
    
  • AES-CBC 解密

    int32_t csi_tee_aes_decrypt_cbc(const uint8_t *in,
                                    uint32_t in_len,
                                    const uint8_t *key,
                                    uint32_t key_len,
                                    uint8_t *iv,
                                    uint8_t *out)
    
    参数
        in - 解密数据指针
        in_len - 解密数据长度
        key - 解密密钥指针
        key_len - 解密密钥长度
        iv - iv数据指针
        out - 解密数据指针
    返回值
        0 - 成功
        !0 - 失败
    

RSA接口

  • 签名

    int32_t csi_tee_rsa_sign(const uint8_t *in,
                             uint32_t in_len,
                             const uint8_t *key,
                             uint32_t key_len,
                             uint8_t *sign,
                             uint32_t *sign_len,
                             tee_rsa_sign_type_e type);
    
    参数
        in - 消息指针
        in_len - 消息长度
        key - 私钥指针
        key_len - 私钥长度
        sign - 签名数据指针
        sign_len - 签名数据长度
        type - 签名类型
    返回值
        0 - 成功
        !0 - 失败
    枚举类型
          typedef enum {
                TEE_RSA_MD5    = 0,     ///< MD5
                TEE_RSA_SHA1   = 1,     ///< SHA1
                TEE_RSA_SHA256 = 3,     ///< SHA256
                TEE_RSA_SIGN_TYPE_MAX,  ///< invailed type
          } tee_rsa_sign_type_e;
    
  • 认证

    int32_t csi_tee_rsa_verify(const uint8_t *in,
                               uint32_t in_len,
                               const uint8_t *key,
                               uint32_t key_len,
                               uint8_t *sign,
                               uint32_t sign_len,
                               tee_rsa_sign_type_e type);
    
    参数
        in - 消息指针
        in_len - 消息长度
        key - 公钥指针
        key_len - 公钥长度
        sign - 签名数据指针
        sign_len - 签名数据长度
        type - 签名类型
    返回值
        0 - 成功
        !0 - 失败
    枚举类型
          typedef enum {
                TEE_RSA_MD5    = 0,     ///< MD5
                TEE_RSA_SHA1   = 1,     ///< SHA1
                TEE_RSA_SHA256 = 3,     ///< SHA256
                TEE_RSA_SIGN_TYPE_MAX,  ///< invailed type
          } tee_rsa_sign_type_e;
    
  • 加密

    int32_t csi_tee_rsa_encrypt(const uint8_t *in,
                                uint32_t in_len,
                                const uint8_t *key,
                                uint32_t key_len,
                                uint8_t *out,
                                uint32_t *out_len,
                                tee_rsa_padding_mode_e padding);
    
    参数
        in - 消息指针
        in_len - 消息长度
        key - 公钥指针
        key_len - 公钥长度
        out- 加密数据指针
        out_len - 加密数据长度
        padding- 加密类型
    返回值
        0 - 成功
        !0 - 失败
    枚举类型
          typedef enum {
               TEE_RSA_PKCS1_PADDING = 0x01,     ///< RSA PKCS padding mode
               TEE_RSA_NO_PADDING    = 0x02,     ///< RSA no padding mode
         } tee_rsa_padding_mode_e;
    
  • 解密

    int32_t csi_tee_rsa_decrypt(const uint8_t *in,
                                uint32_t in_len,
                                const uint8_t *key,
                                uint32_t key_len,
                                uint8_t *out,
                                uint32_t *out_len,
                                tee_rsa_padding_mode_e padding);
    
    参数
        in - 消息指针
        in_len - 消息长度
        key - 私钥指针
        key_len - 私钥长度
        out- 加密数据指针
        out_len - 加密数据长度
        padding- 加密类型
    返回值
        0 - 成功
        !0 - 失败
    枚举类型
          typedef enum {
               TEE_RSA_PKCS1_PADDING = 0x01,     ///< RSA PKCS padding mode
               TEE_RSA_NO_PADDING    = 0x02,     ///< RSA no padding mode
         } tee_rsa_padding_mode_e;
    

results matching ""

    No results matching ""