【OP-TEE】 TA的签名与验签 基于optee 3.11

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;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ACIPHER代码在OP-TEE examples中是一个对称加密算法的例子,它展示了如何使用OP-TEE来实现加密和解密数据。 ACIPHER实现了AES加密算法,并在TA(Trusted Application)中运行,以保证加密数据的安全性。代码中包含了加密和解密数据的函数,以及如何与OP-TEE安全模块进行通信的详细说明。通过阅读ACIPHER代码,您可以了解如何在OP-TEE环境中实现对称加密算法,以及如何使用TA来保护敏感数据的安全。 ### 回答2: 在OP-TEE examples中,acipher代码是指实现了在安全环境中进行加密和解密操作的示例代码。 首先,acipher代码涉及到的主要功能是使用Open Portable TEEOP-TEE)提供的加密功能来保护敏感数据。它提供了一种安全的方式来执行加密和解密操作,以免被恶意软件或攻击者窃取或篡改。具体而言,acipher代码为应用程序提供了一种方式来调用OP-TEE中的加密APIs,以进行对称密码和非对称密码的加密和解密操作。 其次,acipher代码中包含了一些示例函数,这些函数展示了如何使用OP-TEE的加密功能。例如,可以使用acipher_init()函数来初始化加密库,acipher_aes_encrypt()函数来执行AES加密操作,acipher_rsa_encrypt()函数来执行RSA加密操作,acipher_aes_decrypt()函数来执行AES解密操作等等。这些函数使用OP-TEE提供的API,将敏感数据以安全的方式进行加密和解密。 最后,acipher代码还提供了示例数据和详细的代码注释,以帮助开发人员理解和使用加密功能。开发人员可以根据自己的需求自定义这些代码,以满足特定的加密需求。同时,acipher代码还提供了错误处理机制,以确保加密操作的安全性和稳定性。 总之,在OP-TEE examples中,acipher代码所展示的是如何在安全环境中使用OP-TEE提供的加密功能来保护敏感数据。通过理解和使用这些示例代码,开发人员可以更好地应用加密算法,提高数据的安全性和完整性。 ### 回答3: acipher是OP-TEE examples中的一个代码示例,用于演示在安全环境中执行加密操作的方法。在理解acipher代码之前,首先需要了解OP-TEE的基本概念。 OP-TEEOpen Portable Trusted Execution Environment)是一个开放的可移植的可信执行环境,它提供了一个安全的执行环境,可以独立于操作系统运行。acipher代码则是OP-TEE examples中的一个示例,用于展示如何在OP-TEE环境中使用加密算法。 acipher代码的主要功能是执行一些常见的加密操作,如对称加密、非对称加密、哈希等。它通过调用OP-TEE提供的安全接口函数,来完成这些加密操作。 在acipher代码中,首先会初始化OP-TEE环境,并创建一个与之关联的会话。然后,根据用户的选择,选择执行不同的加密操作。例如,可以选择对一段明文进行对称加密,使用AES算法和密钥进行加密,并将密文存储在OP-TEE安全缓冲区中。还可以选择执行非对称加密,使用RSA算法进行公钥加密或私钥解密。 代码还提供了其他一些功能,如生成随机数、计算哈希值等。通过这些功能,acipher代码可以满足一些基本的加密需求。 总的来说,acipher代码主要是为了向开发者展示如何在OP-TEE环境中使用加密算法。通过对代码的理解和学习,开发者可以了解到如何在安全环境中执行加密操作,并将其应用到实际场景中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值