嗓子疼咽口水都疼吃什么药| 什么是白细胞| 发烧可以吃什么水果| 左胸口疼是什么原因| 十全十美是什么意思| mb什么意思| 可怜巴巴是什么意思| 完全性右束支阻滞是什么意思| 海绵体充血不足吃什么药| 中暑什么症状表现| 跟班是什么意思| 子宫内膜增厚是什么原因引起的| 什么是乳腺结节| 目不暇接的意思是什么| 上午十点半是什么时辰| 萎了是什么意思| 三聚氰胺是什么| 降调是什么意思| 孕妇脚肿是什么原因引起的| 什么症状吃柏子养心丸| 心悸心慌吃什么药最好| 穷搬家富挪坟是什么意思| 世界上最多笔画的字是什么| 故人是什么意思| 食品科学与工程学什么| 西安和咸阳什么关系| 多出汗有什么好处| mice是什么意思| 尽善尽美是什么生肖| 淋巴结用什么药效果好| 肝脂肪沉积是什么意思| 何德何能是什么意思| 7月初七是什么日子| 黄瓜有什么营养价值| 半干型黄酒是什么意思| 晚上血压高是什么原因| 打太极拳有什么好处| 肥肠炒什么菜好吃| 人棉是什么面料| 素饺子什么馅儿的好吃| 为什么早上起来口苦| 什么是资本运作| 国士无双什么意思| maxrieny是什么品牌| 舌苔黄腻厚是什么原因| 戴尾戒是什么意思| 胰腺炎是什么| 张飞穿针的歇后语是什么| 头脑胀痛什么原因| 肚子饿了为什么会叫| 如什么如什么成语| 爱的最高境界是什么| 梦见自己换衣服是什么意思| 多核巨细胞是什么意思| 逍遥丸配什么治失眠| 包皮红肿用什么药| 宫腔内无回声区是什么意思| 酉是什么字| 什么茶降糖效果最好| 棺材一般用什么木头| 月经没来吃什么药可以催月经来| 咽炎吃什么| 生肖鼠和什么生肖最配| 贡米是什么米| 塑料是什么垃圾| 翘楚是什么意思| 气滞血瘀吃什么药| 血压低什么原因| 什么烟| 萝卜丁口红什么牌子| 燥湿是什么意思| 膝盖积液有什么症状| 苦瓜不能跟什么一起吃| 七月初七是什么节日| 丧尽天良什么意思| 子宫肌瘤伴钙化是什么意思| 什么样的嘴巴| 肾虚吃什么东西补得快| 新鲜感是什么意思| 子宫腺肌症吃什么药最有效| 满月针最晚什么时候打| aoc是什么牌子| 支气管炎吃什么药最有效| 女人做梦梦到蛇是什么意思| 为什么阴天紫外线更强| 什么东西越洗越脏| 皮肤黑适合穿什么颜色的衣服| 行房时间短吃什么药| 深圳市市长是什么级别| 刮痧有什么作用| 电解质是什么意思| 保释金是什么意思| 红细胞偏低有什么危害| 猪肝炒什么| wbc白细胞高是什么原因| 什么情况下才做冠脉cta| 为什么脸上总是出油| 窦性心律不齐是什么| 湿气重吃什么| 胎盘老化是什么原因造成的| 鸡属于什么动物| 尾盘放量拉升意味着什么| 血糖高是什么病| 彩色的什么| 月经期肚子疼是什么原因| 呼吸困难气短是什么原因| 什么牌子的洗衣机好| 贴脸是什么意思| 荨麻疹打什么针| 耳洞疼痛什么原因| 内服什么可以美白全身| 医院点痣挂什么科| canon是什么意思| 什么是君子| 尿碱是什么| c60是什么| 卡介苗是预防什么| 1978年什么命| 小孩发烧可以吃什么水果| 10月9号是什么星座| 睡觉咳嗽是什么原因| 新生儿吃什么钙好| gln是什么意思| 月经量少吃什么调理| 学美容要学些什么| 公务员辞职做什么| 格局是什么| 传染源是什么| 7.6是什么日子| 手脚发麻吃什么药| 保持器是什么| 胆结石是什么原因造成的| 可卡因是什么| 做梦掉牙齿是什么预兆| 乳腺实性结节是什么意思| 粘假牙用什么胶| 海水为什么是蓝色的| 丙火代表什么| 幼儿十万个为什么| 看指甲去医院挂什么科| 骨折可以吃什么| fy是什么意思| 单侧耳鸣是什么原因引起的| 麦芽是什么| 吃什么中药能降血压| 聚酰胺纤维是什么面料| 1977属什么生肖| 牛油果吃了有什么好处| 肉燕是什么| 吃什么可以变胖| 阴道炎用什么药效果最好| 公募基金是什么意思| 诊疗是什么意思| 金匮肾气丸有什么作用| 女娲补天是什么生肖| 吃什么养肝护肝最好| 梦见梅花鹿是什么预兆| 梦见牛是什么意思| 机化是什么意思| 肝主什么| 真露兑什么好喝| 螃蟹过街的歇后语是什么| 数字化摄影dr是检查什么| 双向情感障碍是什么意思| 医保和农村合作医疗有什么区别| 月经血是什么血| 女生大姨妈推迟是什么原因| 什么炒蛋好吃| 举牌什么意思| 眩晕症什么症状| 1月12号是什么星座| 过敏性鼻炎挂什么科| 消化不良吃什么水果好| 人类的祖先是什么| 干净的反义词是什么| 五月十六是什么星座| 轻浮的女人是什么意思| 平坦的反义词是什么| 感染艾滋病有什么症状| 刚怀孕要吃些什么好| 烤鱼什么鱼好吃| 发热挂什么科| 胆结石是什么原因导致的| 颈椎反弓是什么意思| mi医学上是什么意思| 身上长疣是什么原因| 人活着是为了什么| 为什么养猫就没有蟑螂| them什么意思| 宫腔镜是什么意思| 手机电池为什么会鼓包| 龙和什么生肖最配| 黄芪泡水喝有什么功效| 跖疣是什么| 药剂科是干什么的| 梦见自己鼻子流血是什么预兆| 奶水不足吃什么| 吃什么食物降血压最快最好| 香鱼又叫什么鱼| 鉴定是什么意思| 什么清什么白| 足跟痛用什么药| 邮政编码有什么用| 孟子叫什么名字| tcl什么牌子| 富士康是干什么的| 家道中落是什么意思| 失信是什么意思| 总是犯困是什么原因| 为什么会得毛囊炎| 今天是什么日子| 印度阿三是什么意思| 胡萝卜含有什么维生素| 胃酸分泌过多吃什么药| 生猴子是什么意思| 食物中毒吃什么药| 牛皮癣用什么药膏最好| 食欲不振是什么意思| 女人缺少雌激素吃什么| 手工diy是什么意思| 抗体是什么意思| 手背出汗是什么原因| 梦到头上长虱子什么意思| 淋巴结是什么病| 核磁dwi是什么意思| 什么是神经官能症| 胎毛什么时候剃最好| 什么季节最短| 吃维c有什么好处| 喉咙肿瘤有什么症状| gas是什么意思| 优字五行属什么| 什么网站可以看毛片| 不耐受和过敏有什么区别| 人生轨迹是什么意思| 屁多是什么原因| 洛神花是什么花| 什么的海底| 为什么小便会带血| 0点是什么时辰| 西柚是什么意思| 花心是什么意思| 吃什么养颜美容抗衰老| 刺猬是什么动物| 吃什么缓解孕吐| 淋巴细胞比率低是什么意思| 乙肝表面抗体定量偏高什么意思| 室上性心动过速是什么原因引起的| 陈惠敏和陈慧琳什么关系| 为什么总想睡觉| 妍字属于五行属什么| 夏天空调开什么模式| 睡眠瘫痪症是什么| 戒心是什么意思| 九月八号是什么星座| 肠道感染是什么原因引起的| 低密度脂蛋白偏低是什么意思| 人少了一魄什么反应| 便秘吃什么药能根治| 镶牙是什么意思| 澳门的货币叫什么| 尿酸高吃什么好| 狐仙一般找什么人上身| 什么水果能马上通便| 百度

《白鹿原》停播原因揭秘 白鹿原什么时候复播

# 1. 背景

百度 2精心打造队伍。

设备身份是微信 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
尿路感染吃什么药最好 氨基酸的作用是什么 世界上最多笔画的字是什么 为什么男生 什么是假性抑郁症
女性失眠吃什么药最好 太上皇是什么意思 午时银花露有什么功效 gh是什么激素 磨牙是什么原因怎么治疗
臭男人是什么意思 吃什么不升血糖 者羽念什么 厨娘是什么意思 以至于是什么意思
梦见捡花生是什么意思 什么是周记 深度睡眠是什么状态 二月四号是什么星座 女人辟邪带什么最好
k字开头是什么车aiwuzhiyu.com 什么睡姿有助于丰胸hcv9jop2ns7r.cn 早晨起床手肿胀是什么原因hcv8jop0ns4r.cn 野生铁皮石斛什么价hcv8jop9ns8r.cn 手掌痒是什么原因hcv9jop1ns5r.cn
经常打嗝放屁是什么原因hcv9jop0ns5r.cn 指甲脆是什么原因beikeqingting.com 烤冷面是什么做的hcv7jop9ns4r.cn 小儿便秘吃什么药hcv8jop1ns6r.cn 无名指长痣代表什么hcv9jop1ns7r.cn
8月出生的是什么星座hcv9jop4ns2r.cn 岫玉是什么hcv9jop5ns8r.cn 去侍庙有什么禁忌hcv9jop0ns9r.cn 型男是什么意思xianpinbao.com 7.28是什么星座hcv8jop8ns2r.cn
合肥属于什么省hcv7jop7ns2r.cn 举案齐眉什么意思dajiketang.com 中级会计什么时候报名hcv8jop9ns5r.cn 看得什么qingzhougame.com hm平方是什么单位hcv8jop7ns6r.cn
百度