TA的加密与解密简介

  • TA的加密
  • TA的解密

TA的加密

TA在被编译的时候会在optee_os/ta/arch/arm/link.mk里进行一些操作,包括调用脚本对编译出的elf文件进行签名加密生成.ta。
而签名加密的核心在于调用optee_os/scripts/sign_encrypt.py脚本。采用RSA签名,AES加密。当CFG_ENCRYPT_TA变量为y时,TA加密功能被打开。

TA加密功能打开后,在optee开源代码中存放的加密密钥是默认的上图中的TA_ENC_KEY,这个密钥只是作为演示功能,用在自己的工程中替换为自己的密钥。在调用签名加密脚本时候,传入签名私钥,加密的密钥。


目前的从git下载的optee代码中没有打开TA加密功能,只有TA签名功能。如何增加TA的加密功能,以optee_examples工程下的hello_world TA为例。我将CFG_ENCRYPT_TA变量定义在makefile里。CFG_ENCRYPT_TA ?= y 编译时就会调用脚本对hello_world的TA进行了AES加密。加密后其镜像头部会增加ehdr的数据。存放在shdr_encrypte_ta类型的结构体里。

struct shdr_encrypte_ta {uint32_t enc_algo;uint32_t flags;uint16_t iv_size;uint16_t tag_size;
};

签名加密后的TA文件变成了 uuid.ta,比如hello_world编译签名加密后变成了8aaaf200-2450-11e4-abe2-0002a5d5c51b.ta,其通过sig_encrypto.py脚本添加的头部信息如上图。
shdr是与签名有关的信息。
magic:需要与optee-os里的匹配。
img_type:TA镜像类型,是否加密。
img_siez:TA镜像大小。
alg:签名算法,默认RSA。
hash_size::TA签名的摘要大小。此摘要是除去sig和hash后对整个ta文件的摘要
sig_size:TA签名的大小。签名是对前面摘要的签名。

bs_hdr是和TA相关的信息
uuid:此TA的uuid.
ta_version:TA的版本号

ehdr是和加密相关的信息
enc_alg:加密算法,默认是AES。
flag:加密的标识,代表密钥类型。
iv_size:加密iv值的大小。
tag_size:tag的大小。

TA的解密

加密功能使能的TA其头部shdr会存放签名相关的信息。shdr里的img_type变量存放TA镜像类别,是否加密。optee-os加载TA时会判断其是否加密,没有加密则只验签,加密则先验签和解密。

解密TA依赖于 tee_ta_decrypt_init函数。其调用tee_otp_get_ta_enc_key函数获取TA加密的密钥用于解密。此函数在optee里默认从固定的数组(也就是optee-os里保存的用于验签TA的公钥)里派生。用于自己的工程需要修改为自己获取密钥的方式。

那么默认的密钥是如何派生的呢?
通过huk_subkey_derive函数,将用于派生的数组传入函数,进行HAMC_SHA256计算,得到digest就是派生出的密钥,此密钥和link.mk里的一样,不一样则TA解密失败。此处可以替换为自己的密钥获取方式,但是需要和link.mk里的一致。

const uint8_t ta_pub_key_modulus[] = {0xa6, 0x5a, 0x18, 0xad, 0xc0, 0xb3, 0xce, 0xe3,
....
};

得到密钥后调用

res = crypto_authenc_init(*enc_ctx, TEE_MODE_DECRYPT, key, sizeof(key),SHDR_ENC_GET_IV(ehdr), ehdr->iv_size,ehdr->tag_size, 0, len);

传入密钥,初始化解密上下文。
在后面的TA已经加载完成后,ree_fs_ta_read时进行解密的工作。因为TA是分段加载的,所以解密也是分段的,需要多次解密。

static TEE_Result ree_fs_ta_read(struct user_ta_store_handle *h, void *data,size_t len)
{struct ree_fs_ta_handle *handle = (struct ree_fs_ta_handle *)h;/*获取TA镜像除去头之后的elf格式所在位置*/uint8_t *src = (uint8_t *)handle->nw_ta + handle->offs;size_t next_offs = 0;uint8_t *dst = src;TEE_Result res = TEE_SUCCESS;if (ADD_OVERFLOW(handle->offs, len, &next_offs) ||next_offs > handle->nw_ta_size)return TEE_ERROR_BAD_PARAMETERS;/*判断TA类型*/if (handle->shdr->img_type == SHDR_ENCRYPTED_TA) {if (data) {dst = data; /* Hash secure buffer *//*解密len长度的数据到安全内存中,加载多长的数据就解密多长的数据*/res = tee_ta_decrypt_update(handle->enc_ctx, dst, src,len);if (res != TEE_SUCCESS)return TEE_ERROR_SECURITY;} else {size_t num_bytes = 0;size_t b_size = MIN(1024U, len);uint8_t *b = malloc(b_size);if (!b)return TEE_ERROR_OUT_OF_MEMORY;dst = NULL;while (num_bytes < len) {size_t n = MIN(b_size, len - num_bytes);res = tee_ta_decrypt_update(handle->enc_ctx, b,src + num_bytes, n);if (res)break;num_bytes += n;res = crypto_hash_update(handle->hash_ctx, b,n);if (res)break;}free(b);if (res != TEE_SUCCESS)return TEE_ERROR_SECURITY;}} else if (data) { /*不是加密的TA则直接拷贝*/dst = data; /* Hash secure buffer (shm might be modified) */memcpy(dst, src, len);}if (dst) {/*更新hash_ctx,以便后面计算出TA的hash值使用*/res = crypto_hash_update(handle->hash_ctx, dst, len);if (res != TEE_SUCCESS)return TEE_ERROR_SECURITY;}/*将句柄的偏移更新*/handle->offs = next_offs;if (handle->offs == handle->nw_ta_size) {/*判断当前是否已经加载了所有的segment*/if (handle->shdr->img_type == SHDR_ENCRYPTED_TA) {/** Last read: time to finalize authenticated* decryption.*//*加载所有segment之后进行ctx final收尾工作*/res = tee_ta_decrypt_final(handle->enc_ctx,handle->ehdr, NULL, NULL, 0);if (res != TEE_SUCCESS)return TEE_ERROR_SECURITY;}/** Last read: time to check if our digest matches the expected* one (from the signed header)*/res = check_digest(handle);/*加载所有segment之后进行hash校验与shdr里的比较*/if (res != TEE_SUCCESS)return res;if (handle->bs_hdr)res = check_update_version(handle->bs_hdr);}return res;
}

镜像的解密是随着TA的elf文件的加载进行的,TA的elf是分段多次加载,先加载elf head,所以就先解密elf head,所以TA的elf每次加载都会触发解密操作。直到TA elf文件完全加载完成。

【OP-TEE】 TA的加密与解密简介相关推荐

  1. 【图像加密】基于matlab GUI Logistic混沌图像加密与解密【含Matlab源码 1216期】

    ⛄一.混沌图像加密与解密简介 混沌系统图像加密解密理论部分参考链接: 基于混沌系统的图像加密算法设计与应用 ⛄二.部分源代码 %加密程序 function b=jiami(a,s,h) [m1,n1] ...

  2. 密码史简介(对称加密以解密)

    介绍些从古至今使用的密码方法,以及破解方法.以下所述密码按照现代的标准来看都是不安全的密码,但是其思路沿用至今. Symmetric Ciphers 对称密码 以前使用的密码都可以称为对称密码,具体特 ...

  3. 加密与解密、OpenSSL(SSL/TLS)、OpenSSH(ssh)、dropbear

    下面介绍的是Linux的加密与解密.OpenSSL(SSL/TLS).OpenSSH(ssh).dropbear. 一.数据的加密与解密 1.进程间通信基础 (1).进程间通信方式 同一主机间进程间的 ...

  4. Windows中EFS加密及解密应用

    Windows中EFS加密及解密应用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&q ...

  5. 加密、解密以及Openssl建立私有CA

    一.openssl简介       OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法.常用 的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用.   SS ...

  6. C#实现AES加密和解密

    AES简介 AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范.它被预期能成为人们公认的加密包括金融.电信和政府数字信息的方法. ...

  7. 加密与解密的基本概念--GPG加密工具的使用

    加密与解密 信息传递中的风险:电脑黑客,流量失控,开发人员,高管习惯,商业间谍,合作伙伴,离职人员,出差人员等等方面. 什么是加密与解密 加密:发送方发送信息之前进行加密发送密文 解密:接收方接收密文 ...

  8. 非对称加密 公钥解密_了解非对称公钥加密

    非对称加密 公钥解密 Asymmetric cryptography, also called public key cryptography, is an essential element of ...

  9. Linux下使用GPG(GnuPG)加密及解密文件

    文章目录 Linux下使用GPG(GnuPG)加密及解密文件 1. 简介 2.环境及版本 3.GPG公钥生成 4.查看公钥 5.查看私钥 6.导出公钥 7.导出私钥 8.加密文件 本机加密 其他电脑加 ...

最新文章

  1. Linux 这些工具堪称神器!
  2. python计算向量夹角代码
  3. 「Swift」第三章String and Character
  4. 【物联网】QCA4010之SNTP协议
  5. swift编写命令行工具
  6. kali安装python3.7_Debian服务器之安装Python3.7
  7. 20 | 散列表(下):为什么散列表和链表经常会一起使用?
  8. 短网址生成+域名检测+短网址还原等四合一前端源码
  9. 同一列两行数据怎么合并成一行_经常加班怎么办?两分钟学会这4招,让同事刮目相看!...
  10. Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》
  11. 又一个时代结束了!Adobe宣布在2020年彻底停止Flash更新
  12. FM1288的AEC调试经历,持续更新
  13. cocos2d-x-3.0 window+eclipse Android Project 环境与开发新手教程
  14. 【Java必备技能四】如何使用泛型?
  15. 电工学复习【7】-- 集成运算放大器
  16. 软件构造过程与配置管理
  17. Amy Cuddy: Your body language shapes who you are
  18. 中介者模式-Mediator Pattern
  19. Vue 中英文 组件 样式 写法
  20. 计算机考试的知识要记忆背,2017计算机等级考试(NCRE)备考小技巧

热门文章

  1. 加州社区学院计算机专业,美国加州圣马特奥社区学院的基本介绍
  2. 过孔解析 分类 特征 作用
  3. 南农沈其荣团队Science子刊揭示番茄早期微生物组功能决定成年健康
  4. C语言练习之交换两个数组中的内容
  5. android 定位蓝牙,Android BLE定位应用(蓝牙搜索方法)
  6. amd 皓龙 服务器 芯片,全面解读 关于AMD皓龙6000平台的那些事
  7. Linux进程资源监控命令
  8. 计算机英语长句,英语长句分析经典100句.doc
  9. EaselJS简明教程1-绘图
  10. 计算机应用课堂教学结题汇报,课题结题验收总结报告.ppt