TA的签名

以optee-os 3.11版本为例。在optee_os目录下,存放着签名的私钥和签名脚本。
工程目录/optee_os/keys/default_ta.pem
工程目录/optee_os/scripts/sign_encrypt.py
编译TA时会先将TA编译为elf文件。此时执行签名脚本,对elf文件签名并生成.ta文件。
签名使用了default_ta.pem私钥,此私钥通过编译时makefile调用python脚本时传入。
此脚本还会放置头部数据,shdr,放在TA镜像的头部。这是与签名信息相关的数据,其为shdr类型的结构体。

头部放置了magic number,需要和optee-os代码里的magic number匹配。其他的就是签名相关的数据。
magic:需要与optee-os里定义的magic匹配。
img_type:TA镜像类型,是否加密。
img_siez:TA镜像大小。
alg:签名算法,默认RSA。
hash_size::TA签名的摘要大小。此摘要是除去sig和hash后对整个ta文件的摘要
sig_size:TA签名的大小。签名是对前面摘要的签名。

拿optee_example里的aes的TA举个例子:
编译出的elf头部如下:

签名后生成的ta文件

红色框里的就是头部shdr的信息,对应为
4字节的magic:0x4f545348;
4字节的img_tpye:0x01;
4字节的img_size:0x0139a8;
4字节的alg:0x70414930,对应optee定义的TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256宏;
2字节的hash_size:0x20;
2字节的sig_size:0x100。
在这之后的0x20字节的内容就是digest,在之后的0x100字节就是签名的内容。

此图片就是shdr的内存布局。

TA的验签

optee验签TA时使用的公钥哪儿来的?
编译时调用的pem_to_pub_c.py脚本,从makefile给出的密钥路径default_ta.pem中解析出rsa_pub公钥,生成ta_pub_key.c文件,放到了ta_pub_key.c文件的ta_pub_key_modulus数组中。所以ta_pub_key_modulus就是验签TA用到的公钥。

如何验签?
放置公钥的数组在optee-os加载TA时shdr_verify_signature函数会从此数组里获取公钥用于验签TA。验签时取出镜像头部的shdr,通过rpc调用到ree侧的tee_supplicant,此时会将TA的镜像加载到REE与TEE的共享内存中,因为共享内存是非安全的内存,所以此时不能加载全部TA,所以先加载shdr头部到安全内存中来,然后调用shdr_verify_signature读取公钥和shdr的签名信息验签。

/* 存放公钥的数组 */
const unit8_t ta_pub_key_modulus[];
/* Validate header signature */
res = shdr_verify_signature(shdr);

校验流程:
先比较magic

if (shdr->magic != SHDR_MAGIC)return TEE_ERROR_SECURITY;

判断alg是否是RSA

if (TEE_ALG_GET_MAIN_ALG(shdr->algo) != TEE_MAIN_ALGO_RSA)return TEE_ERROR_SECURITY;

从生成的ta_pub_key_modulus数组里取出公钥

res = crypto_bignum_bin2bn(ta_pub_key_modulus, ta_pub_key_modulus_size, key.n);

使用RSA算法验签

res = crypto_acipher_rsassa_verify(shdr->algo, &key, shdr->hash_size,SHDR_GET_HASH(shdr), shdr->hash_size,SHDR_GET_SIG(shdr), shdr->sig_size);

验签成功后会校验hash。TA是分段加载的,在加载TA的时候会调用ree_fs_ta_read。每加载一次就update一次hash_ctx,

/*更新hash_ctx,以便后面计算出TA的hash值使用*/
res = crypto_hash_update(handle->hash_ctx, dst, len);
/** Last read: time to check if our digest matches the expected* one (from the signed header)*/res = check_digest(handle);if (res != TEE_SUCCESS)return res;

加载完所有TA的段后校验hash,与shdr里的hash比较

static TEE_Result check_digest(struct ree_fs_ta_handle *h)
{void *digest = NULL;TEE_Result res;digest = malloc(h->shdr->hash_size);if (!digest)return TEE_ERROR_OUT_OF_MEMORY;/*加载完成后进行最后计算hash值*/res = crypto_hash_final(h->hash_ctx, digest, h->shdr->hash_size);if (res != TEE_SUCCESS) {res = TEE_ERROR_SECURITY;goto out;}/*与shdr头里存放的hash比较*/if (memcmp(digest, SHDR_GET_HASH(h->shdr), h->shdr->hash_size))res = TEE_ERROR_SECURITY;
out:free(digest);return res;
}

【OP-TEE】 TA的签名与验签 基于optee 3.11相关推荐

  1. [optee]-TA的签名和验签

    TA签名验签 1.TA的签名 2.TA的验签 ★★★ 友情链接 : 个人博客导读首页-点击此处 ★★★ 1.TA的签名 在optee或sdk的目录下,有一个default_ta.pem(RSA2048 ...

  2. OP-TEE之TA签名、验签及TA加载过程

    OP-TEE的TA签名.验签以及TA加载过程 文章目录 OP-TEE的TA签名.验签以及TA加载过程 一.TA的签名及验签 1.TA的签名 2.TA的public key处理 3.TA的验签 二.TA ...

  3. 数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)

    引言 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件.为现实网络安全化标准如今大部分的 B2B.B2C.P2P.O2O 等商业网站含有重要企业资料个人资料的信息资信网站 ...

  4. PHP SHA1withRSA加密生成签名及验签

    最近公司对接XX第三方支付平台的代付业务,由于对方公司只有JAVA的demo,所以只能根据文档自己整合PHP的签名加密,网上找过几个方法,踩到各种各样的坑,还好最后算是搞定了,话不多说,代码分享出来. ...

  5. ASP VBSCRIPT VBA RSA 公钥加密 私钥解密 私钥签名 公钥验签

    <% '@title: Class_Crypt_Rsa '@author: ekede.com '@date: 2020-10-28 '@description: RSA 公钥加密->私钥 ...

  6. asp版 vbscript RSA公钥加密 / 私钥解密 / 私钥签名 / 公钥验签(支持中文)分段加密解密

    最近有空在把自己的asp站点后端函数全部整理了下,在弄RSA的时候遇到了坑了,然后找到下面这位兄弟刚好发布的文章: https://blog.csdn.net/todaygods/article/de ...

  7. 支付宝支付API之签名与验签

    支付宝开发平台支付API文档: https://docs.open.alipay.com/291/106130 对接支付API出现问题的主要原因:数据被转义,所以在调试时先把数据可以写死 注意:在调试 ...

  8. 使用RSA、MD5对参数生成签名与验签

    在日常的工作中,我们对外提供的接口或调用三方的接口往往有一步生成签名或验签的步骤,这个步骤主要是验证调用方是 不是合法的以及内容是否被修改.比如:对于某些网上公开下载的软件,视频,尤其是镜像文件.如果 ...

  9. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

最新文章

  1. 单链表的插入和删除_从0开始的编程之梦——数据结构之单链表的基本运算
  2. thinkphp去掉index.php
  3. RedHat7.0更新yum源(踩过的坑)
  4. 2台电脑间快速复制大文件
  5. mysql中distinct关键字,MySQL关键字Distinct的详细介绍
  6. java右移位_java 、移位操作方法
  7. 疑似iPhone XI内部设计图曝光:这个造型爱不起来
  8. 从零开始学前端:作用域、执行顺序 --- 今天你学习了吗?(JS:Day9)
  9. 谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!
  10. 反射在微信公众平台开发的应用
  11. POJ 3988 Selecting courses
  12. 计算机打印状态错误,打印机状态错误【设置办法】
  13. Solana中的account
  14. linuxcentos6笔记
  15. 【Android开发】android最全的颜色对应的16进制代码(androidUI设计必备)
  16. 【渝粤题库】广东开放大学 工程经济 形成性考核
  17. 验证CUDA和CUDNN是否安装成功的方法
  18. java8/日期时间
  19. AGS的相关项目的问题和解决方案
  20. python学习笔记(BMR计算器)

热门文章

  1. 五行相生相克图表(echarts)
  2. Quick-Coco2d-x开发环境搭建
  3. Video2Cartoon一行代码把视频头像转换成卡通头像
  4. bootstrap布局报表
  5. 看伟大的领袖如何激励行动有感
  6. npm、nvm、npx、nrm的区别
  7. java 数组 指针_java指针数组的使用
  8. 文字生成绘画用什么软件好?
  9. php SESSION和COOKIE实用详解
  10. 段子引发的软件测试思考