什么是polo衫| 生蚝和牡蛎有什么区别| 什么身什么骨| 淋巴结肿大是什么原因| 吃藕粉对身体有什么好处| 支气管病变什么意思| 乳腺发炎吃什么消炎药| 闭关什么意思| 血燥是什么意思| 岗位性质指的是什么| 什么叫八卦| 养老院靠什么挣钱| 男士带什么手串好| 花旗参有什么功效| 什么是性病| 乙肝有什么危害| 高铁为什么会晚点| 睡觉手麻木是什么原因| 类风湿性关节炎用什么药| 什么是人彘| 味极鲜是什么| 九月二十九号是什么星座| 彼此彼此什么意思| eob是什么意思| 失眠用什么药最好| 九月三日是什么纪念日| 物理压榨油是什么意思| 月经颜色发黑是什么原因| 古代男宠叫什么| 什么是溶血症| 路政是干什么的| 什么节气开始凉快| 老是掉发是什么原因| 石决明是什么| amh是什么| 吃什么补蛋白| 什么是违反禁令标志指示| 免疫力下降吃什么好| 超声介入是什么意思| 脸上过敏是什么症状| 什么是周期| 比丘什么意思| 凉面用的是什么面条| 1948属什么生肖| 家用制氧机什么牌子好| 二狗子是什么意思| 参见是什么意思| 硬汉是什么意思| 什么是有机食品| o型血rh阳性是什么意思| 造影手术是什么意思| sg比重是什么意思| twice是什么意思| 早起的鸟儿有虫吃是什么意思| 私通是什么意思| 女人为什么会叫床| 柬埔寨为什么叫柬埔寨| 积液是什么| 外阴白斑是什么原因| 孕晚期破水是什么症状| 1975年属兔的是什么命| 受虐倾向是什么| 什么叫同房| 子宫内膜增生有什么症状| 马拉色菌毛囊炎用什么药治疗最好| 口腔有异味是什么原因引起的| 梦见一条小蛇是什么意思| 富是什么生肖| abs材质是什么| stella是什么意思| 办理住院手续需要带什么证件| oc是什么意思| 伪善是什么意思| 无功无过是什么意思| 癣是什么| 不出汗是什么病| 眼睛红血丝多是什么原因| 骨骼肌率是什么意思| 什么东西越洗越脏答案| 痛风忌口不能吃什么东西| 一什么绿毯| 高锰酸钾在药店叫什么| 虚岁30岁属什么生肖| 为什么会血热| 怀孕吃什么水果比较好| 子宫肌瘤做什么检查能查出来| 手什么眼什么| 糖尿病人可以吃什么水果| 突然头晕恶心是什么原因| 吨位是什么意思| 蒲地蓝消炎片治什么病| 明天是什么日子| 奶盖是什么| 眼睛干涩模糊用什么药| 甲状腺是什么原因引起的| wink是什么意思| 胰腺在什么位置| 土字旁的字与什么有关| 什么的垂下| spoRT是什么| 夏天适合吃什么| Continental什么牌子| 颅压高有什么症状| 医技是什么专业| 射手座的幸运色是什么颜色| pms是什么意思| 表姐的女儿叫什么| 梦见钓鱼是什么意思周公解梦| 纵容是什么意思| 月亮是什么颜色| 沙示汽水有什么功效| 身主天相是什么意思| 什么叫幸福| 记忆力差是什么原因| 空囊是什么意思| 七年是什么婚| 为什么会下雨| 咽喉干燥是什么原因| 2月23日什么星座| 内胆是什么意思| cp是什么意思| 石头记为什么叫红楼梦| 添堵是什么意思| 香蕉对身体有什么好处| 洗牙有什么危害吗| 灰度是什么意思| 拉抽屉是什么现象| 什么叫轻度脂肪肝| 玻璃什么时候传入中国| editor是什么意思| 胸推什么意思| 肛门出血什么原因| 玫瑰糠疹吃什么药| 良字少一点是什么字| 八八年属什么生肖| 肌肉酸痛吃什么药| 男人为什么喜欢舔女人下面| 耳朵响吃什么药| 立字五行属什么| 人参长什么样子图片| 打牛是什么意思| 黄芪入什么经| 今天股票为什么大跌| 狗舔人是什么意思| 什么是礼仪| 焦虑症是什么意思| 10月29日是什么星座| as材质是什么材料| 摸头杀是什么意思| hcg翻倍慢是什么原因| 失眠为什么开奥氮平片| 什么的夏天| 4月18号是什么星座| 些几是什么意思| 毛片是什么意思| 感冒发烧吃点什么食物比较好| a1微球蛋白偏高说明什么意思| 立秋那天吃什么| 大腿青筋明显是什么原因| 什么是种草| 朱雀玄武是什么意思| 白酒泡什么补肾壮阳最好| 肌酐测定低是什么意思| 眼睛为什么会长麦粒肿| 因材施教什么意思| 六月十三日是什么日子| 男性支原体感染什么症状| 爬楼是什么意思| 胰腺做什么检查| 苯醚甲环唑防治什么病| 出院小结是什么| 全血低切相对指数偏高什么意思| 被蜱虫咬了挂什么科| 过期啤酒有什么用途| 会厌炎是什么病| 为什么无缘无故流鼻血| 梦见水里有蛇是什么意思| 吃什么不会长胖| 周瑜为什么打黄盖| 省长是什么级别干部| 湿气重的人适合吃什么| 戒腊什么意思| 牛乳是什么| 年上年下是什么意思| 肺活量是什么意思| 独美是什么意思| 水瓶座与什么星座最配| 什么是热病| 诱导是什么意思| 鸭肉不能和什么一起吃| 喝酒后头晕是什么原因| 相思什么意思| 内退是什么意思| 早上喝豆浆有什么好处| 林冲是什么生肖| 812是什么意思| 种草是什么意思| logo中文是什么意思| 人流挂什么科| 伤口增生是什么原因造成的| 玄关挂什么装饰画好| 发烧吃什么好| 心房纤颤是什么意思| 市公安局局长是什么级别| 鬼冢虎什么档次| 女司机为什么开不好车| sj是什么| 男人喝什么茶壮阳| 甲沟炎是什么症状| 球蛋白的功效与作用是什么| 为什么同房不怀孕原因| 8月7号是什么星座| 气管炎用什么药| 甘草片不能和什么药一起吃| 羊奶粉有什么好处| 鹿鞭是什么| 三颗星是什么军衔| 移情是什么意思| 四字五行属什么| 风油精有什么功效| 尿酸高不能吃什么食物| 笑点低是什么意思| 备孕叶酸什么时候吃最好| 3.7号是什么星座| 肉字是什么结构| 10月4日是什么星座| 路上遇到蛇是什么征兆| 强迫症是什么意思| 个子矮吃什么才能长高| 阴道杆菌是什么意思| 吃什么对肝好| 吃米饭配什么菜好吃| 风生水起是什么意思| 为什么狐臭女很漂亮| 肠胃炎吃什么药好得快| 屁股上长痘痘是什么原因| 双肺纹理增多增粗是什么意思| 人乳头瘤病毒51型阳性是什么意思| 为什么会得甲状腺| 视而不见的意思是什么| 什么是宫颈息肉| 鹅口疮用什么药效果好| 偷鸡不成蚀把米是什么生肖| 狗喜欢吃什么食物| gm眼镜是什么牌子| 中出是什么| 避免是什么意思| 鸽子炖什么补气血| 泡黄芪水喝有什么好处| 尿特别多是什么原因| 曹操姓什么| xo是什么意思| 膝盖痒是什么原因| 1987年什么命| 鹅吃什么草| 左眼皮老是跳是什么原因| ada医学上是什么意思| 四五天不排便是什么原因| reald厅什么意思| 看十全十美是什么生肖| 人乳头瘤病毒33型阳性是什么意思| 五毛是什么意思| 狗狗吐黄水是什么原因| 吃什么对肝脏有好处能养肝| 百度

蔗糖素是什么

# 1. 背景

百度 一名欧盟官员表示,莱特希泽提出美国盟友可以通过限制对美钢铝出口来换取关税豁免。

设备身份是微信 VOIP 业务能够正常运行的基础,开发者在接入 VOIP 业务时,会通过如下两个流程来进行身份的确定:

  1. 设备注册。通过 SN + modelId 两个维度来标定这台设备。
  2. 拿票据。在进行 VOIP 通话前,需要拿到这台设备所对应的票据。

对于没有 TEE 的机器,我们要求设备系统里能够操作 EMMC 存储的 RPMB 区域,并且需要将 RPMB 的归属权给到 VOIP 业务,VOIP 在设备注册时会将与设备对应的唯一密钥写入存储的 KEY 区域,用来做身份校验。

而对于有 TEE 的机器,我们信赖 TEE 的结果,但需要 TEE 里按照规范完成 TA 的开发。

# 2. TA 开发

不管是 optee,还是 trusty 或 qsee 等,TEE 的使用流程通常如下:

打开 TEE 环境 > 开启一个会话 > 发送命令 > 获取信息 > 结束会话 > 关闭 TEE 环境

这里我们需要定义如下标准:

  1. 会话名称。
  2. 命令的功能。
  3. 命令的交互数据定义。
  4. TA 里的运算逻辑

设备开发者需要根据规范进行如下开发:

  1. TA 开发,需要开发者或 tee 提供商按照规范开发 TA。
  2. HAL 开发,HAL 用于与 TA 的交互,微信的系统服务基于此 HAL。
  3. 服务集成,将微信发布的 rpmbd_tee 以系统服务方式运行起来。

TA 在逻辑上将存储分为两个区域。需要注意的是,这些数据最终应都存在于 EMMC 或 UFS 的 rpmb 分区,或其它 REE 访问不到的安全器件区域。

  1. 密钥区:32个字节。TA 代码逻辑里需要将此区域实现成只能写一次,类似于硬件上的 OTP (One Time Programmable) 区域。
  2. 数据区:单位为 Block,每个 Block 有 256 个字节,最小需要 32 个,开发者可根据实际情况来确定大小,若越界则返回相应错误码即可。Block 的地址从 0 开始。

# 2.1 会话名称

TA 的名称统一为 ta_devauth

# 2.2 命令定义

定义三个命令,分别是读数据、写数据、写密钥。

#define TA_DEVAUTH_CMD_READ   0x10
#define TA_DEVAUTH_CMD_WRITE  0x11
#define TA_DEVAUTH_CMD_PROKEY 0x12

详细说明:

命令 TA_DEVAUTH_CMD_READ 0x10
功能 读 1 个 Block 的数据
参数 输入:Block 地址
输入/输出:Block 数据 BUFFER,284字节,见 2.3 数据定义。
输出:签名 BUFFER,=32字节
返回 0:成功读取,并返回 284 字节数据和 32 字节签名
-1:参数错误。
-2:地址越界。
-3:密钥区还没被写。
-5:其它错误。
特别说明 若密钥区还没被写(例如裸数据全是0x00,或没有TEE文件系统里的文件?),这种情况认为是一台全新的未激活设备,需要读取错误返回 -3。
命令 TA_DEVAUTH_CMD_WRITE 0x11
功能 写 1 个 Block 的数据
参数 输入:Block 地址
输入:Block 数据 BUFFER,=284字节,见 2.3 数据定义。
输入:对应的签名 BUFFER,=32字节
返回 0:写入成功。
-1:参数错误。
-2:地址越界。
-3:密钥区还没被写。
-4:签名错误。
-5:其它错误。
特别说明 若密钥区还没被写(例如裸数据全是0x00,或没有TEE文件系统里的文件?),这种情况认为是一台全新的未激活设备,需要返回 -3。
此功能在写数据前,需要计算数据对应的签名,并且与参数传入的签名比对,若比对不成功返回 -4
命令 TA_DEVAUTH_CMD_PROKEY 0x12
功能 写密钥
参数 密钥 BUFFER,=32字节
返回 0:写入成功。
-1:参数错误。
-3:密钥区已有数据。
-5:其它错误。
特别说明 若密钥区已有数据(例如裸数据不为0x00,或有文件?),则需要返回 -3。

# 2.3 数据定义

与 TA 交互时传入传出 Buffer 的大小为 284 字节,它的定义如下:

struct ta_data {
    uint8_t  data[256];    // 此 256 字节是 TA 写入到1个Block的内容
    uint8_t  nonce[16];    // 一般为随机字节,传入与传出的一定要一致。
    uint32_t reserve1;
    uint16_t reserve2;
    uint16_t reserve3;
    uint16_t reserve4;
    uint16_t reserve5;
};

// sizeof(struct ta_data) = 284

签名 Buffer 大小为 32 字节


CA 与 TA 交互消息定义:
struct ta_message {
    uint32_t        cmd;        // 命令号
    uint32_t        block;      // 读写地址
    struct ta_data  data;       // 284 字节数据
    uint8_t         key[32];    // 32 字节 Key
    uint8_t         hmac[32];   // 32 字节 hmac
    int             ret;        // 返回值
};

CA 侧参考伪代码:

static int tee_send_cmd_req(struct ta_message* ta_msg) {
    int rc = 0;
    
    if (ca_handle == 0) {
        printf("not connected\n");
        return -EINVAL;
    }
    
    if (tee_send_msg(ca_handle, ta_msg) < 0) {
        return -1;
    }
    
    if (tee_resp_msg(ca_handle, ta_msg) < 0) {
        return -1;
    }
    
    return 0;
}

# 2.4 运算逻辑

数据签名的算法为 HMAC_SHA256。

读数据时,TA 的流程:

  1. 若密钥区没数据,返回 -3。
  2. 读地址参数对应 Block 的 256 字节数据。
  3. 将读到的 256 字节与输入参数里的 16 字节 noce 以及其它 reserve,一共有 284 个字节。
  4. 利用密钥区的 32 字节密钥,对 284 字节进行签名,并返回 284 字节以及签名。

写数据时,TA 的流程:

  1. 若密钥区没数据,返回 -3。
  2. 得到输入参数里的 284 字节,得到输入参数中的签名1。
  3. 利用密钥区的 32 字节密钥,对 284 字节进行签名,得到签名2。
  4. 比较签名1与签名2,如果相等则将 284 字节中的 256 字节写入对应的 Block,如果不等则返回错误 -4。

写密钥时,TA 的流程:

  1. 若密钥区已有数据,返回 -3。
  2. 将 32 字节的密钥写入密钥区。

一个签名的数据示例,开发者可以此为基准来验证自己的 hmac_sha256:

char *key = "AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH";
uint8_t buffer[284] = {0};

int main(int argc, char **argv) {
    uint8_t hmac[32] = {0};
    memset(buffer, 0x55, 284);

    hmac_sha256(key, 32,
      buffer, 284,
      hmac, sizeof(hmac)
    );

    for (int i=0; i < 32; i++) {
        printf("%02x ", hmac[i]);
    }
    return 0;
}
// 以上代码输出:
// 61 16 67 22 a0 93 66 74 bb 75 f8 87 0e 5e d4 59 2c d6 99 c0 14 a6 93 70 bd ff ea 3e 8e 84 52 4e 

hmac_sha256 为标准算法,一般 tee 里已有此类算法,如果没有,可参考开源实现

# 2.5 注意事项

  1. TEE 里的密钥区和数据区需保证具有 “永久存储” 特性,并且不应该被 REE 以任何方式直接访问,不会随用户的刷机、升级或其它常规行为而丢失。
  2. 密钥区域需要实现为 OTP 特性,即仅一次写入。
  3. 密钥区域无数据时,需要按规范返回错误码。
  4. 厂商需要将 CA 测试例程和代码给到微信,微信进行验收测试。

# 3. HAL 开发

按照 HAL 规范完成 HAL 的开发,HAL 里使用 CA 代码与 TA 进行交互,完成 TEE 的使用。

HAL 路径:android/hardware/interface/devauth

# 3.1 HAL 规范

types.hal

package android.hardware.devauth@1.0;

enum TA_CMD : uint32_t {
    TA_DEVAUTH_CMD_READ = 0x10,
    TA_DEVAUTH_CMD_WRITE = 0x11,
    TA_DEVAUTH_CMD_PROKEY = 0x12,
};

struct ta_data {
    uint8_t[256] data; // 此 256 字节是 TA 写入到1个Block的内容
    uint8_t[16]  nonce; // 一般为随机字节,传入与传出的一定要一致。
    uint32_t reserve1;
    uint16_t reserve2;
    uint16_t reserve3;
    uint16_t reserve4;
    uint16_t reserve5;
};

struct ta_message {
    uint32_t        cmd;        // 命令号
    uint32_t        block;      // 读写地址
    ta_data         data;       // 284 字节数据
    uint8_t[32]     key;        // 32 字节 Key
    HMacBuffer      hmac;       // 32 字节 hmac
    int8_t          ret;        // 返回值
};

typedef uint8_t[32] HMacBuffer;
typedef uint8_t[32] ProKeyBuffer;

typedef ta_data ta_data_t;
typedef ta_message ta_message_t;

IDevauth.hal

package android.hardware.devauth@1.0;

interface IDevauth {

    /**
     * 读 Block 数据
     *
     * @param addr:     Block 地址
     * @param data:     输入的 struct ta_data
     * @return retval:  返回值,返回值说明请见规范
     * @return data:    返回的 struct ta_data,284 字节。
     * @return hmac:    返回的签名, 32 字节。
     *
     */
    read_block(uint16_t addr, ta_data data) generates (int8_t retval, vec<uint8_t> data, vec<uint8_t> hmac); 

    /**
     * 写 Block 数据
     *
     * @param addr:     Block 地址
     * @param data:     输入输出数据,对应规范里的 struct ta_data,284 字节。
     * @param hmac:     HAL 写数据时用的签名, 32 字节
     *
     * @return retval:  返回值说明请见规范
     */
    write_block(uint16_t addr, ta_data data, HMacBuffer hmac) generates (int8_t retval); 

    /**
     * 写 Key
     *
     * @param key:      32 字节key
     *
     * @return retval:  返回值说明请见规范
     */
    program_key(ProKeyBuffer key) generates(int8_t retval);
};

# 3.2 开发参考

hardware/interfaces/devauth/1.0/ 下放置 IDevauth.haltypes.hal,内容如上。

然后使用如下方式来生成代码:

LOC=hardware/interfaces/devauth/1.0/default
PACKAGE=android.hardware.devauth@1.0
hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport ${PACKAGE}
hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport ${PACKAGE}
./hardware/interfaces/update-makefiles.sh

此时 hal 目录应该如下:

root~/android> tree hardware/interfaces/devauth/
hardware/interfaces/devauth/
└── 1.0
    ├── Android.bp
    ├── default
    │?? ├── Android.bp
    │?? ├── Devauth.cpp
    │?? └── Devauth.h
    ├── IDevauth.hal
    └── types.hal

2 directories, 6 files

再按照 HAL 接口定义,在相应的接口函数里完成 CA 代码的开发即可。

# 4. 验收

# 4.1 提交资料

  • ? 芯片平台,存储类型。例:MTK81xx、EMMC 64GB
  • ? REE 操作系统详细信息。例:Android 7 64位
  • ? TEE 系统详细信息。例:基于 optee 的自研 tee,提供商为 xxx
  • ? TEE 里数据存储位置。例:EMMC 里的 RPMB 分区
  • ? TEE 侧的 TA 代码。例:ta_devauth 模块代码
  • ? REE 侧的 CA 代码。例:测试用例代码包及相应 TEE 功能 so。
  • ? REE 侧的 HAL 代码。例:hardware/interface/devauth 下的代码。
  • ? 能 adb root 的样机。

# 4.2 测试用例

开发者完成 TEE 的 TA 开发后,应该进行测试用例开发,以验证 TA 的功能与逻辑。 前置条件:ta_deauth 所管理的区域无任何数据,再按顺序进行以下测试项。

  1. 读数据测试,预期返回 -3
  2. 写数据测试,预期返回 -3
  3. 写密钥测试,预期返回 0
  4. 写密钥测试,预期返回 -3
  5. 读数据测试,预期返回 0,且数据全是 0x00 且有签名。
  6. 用正确的 HMAC 写数据测试,预期返回 0
  7. 用错误的 HMAC 写数据测试,预期返回 -4
  8. 读数据测试,预期返回 0,并且返回正确的数据和签名。

可在官方测试用例代码的基础上,加上自己的 CA 实现,以快速验证 TA。

开发者完成 HAL 开发后,可用测试用例进行测试,

也可以直接下载已编译好的 tee_hal_test 进行测试,测试方法如下

  1. tee_hal_test a 进行一次全新的测试,需要一个 ta_devauth 所管理的区域无任何数据。
  2. tee_hal_test 不带任何参数,可在 1. 后运行。

# 4.3 集成

4.2 中的测试用例通过后,下载 rpmbd_tee 并集成到系统中以服务方式运行起来即可,参考:

service rpmbd_tee /system/bin/rpmbd_tee
  class main
  user root
  group root system
apl医学上是什么意思 去医院看肛门挂什么科 雪菜是什么菜 什么节日吃饺子 甲状腺属于什么科
大便干燥用什么药 调理脾胃吃什么好 脑瘫是什么原因引起的 喉咙疼挂什么科 胃病吃什么药最好
颌下淋巴结肿大挂什么科 小三什么意思 21三体高风险是什么意思 笑气是什么东西 女攻是什么意思
kb什么意思 右半边头痛是什么原因 右眼老跳是什么原因 是的是什么意思 一九七二年属什么生肖
雨水是什么季节hcv8jop6ns5r.cn 吃什么能增强免疫力和抵抗力cj623037.com 南昌有什么好吃的0297y7.com 抗生素是什么意思hanqikai.com 双肺纹理增多是什么意思hcv9jop6ns0r.cn
脖子下面是什么部位hcv9jop1ns3r.cn 河字五行属什么hcv9jop3ns7r.cn 氢化聚异丁烯是什么helloaicloud.com mir是什么检查hcv9jop2ns3r.cn 狗感冒吃什么药hcv8jop9ns4r.cn
天经地义的意思是什么hcv8jop4ns6r.cn 月经后一周又出血是什么原因hcv7jop5ns0r.cn 跳蚤最怕什么药hcv7jop5ns3r.cn 结核病是什么hcv8jop1ns7r.cn 丹参粉有什么作用和功效hcv8jop1ns2r.cn
抗性糊精是什么hcv9jop4ns3r.cn 豆浆配什么主食当早餐hcv7jop9ns4r.cn 淼念什么hcv9jop6ns0r.cn 桑葚泡水喝有什么好处hcv9jop3ns6r.cn dvf是什么档次的牌子hcv8jop3ns7r.cn
百度