Trustzone RSA加解密Demo解析
1 先了解一下背景
1.1 RSA加密原理
RSA密码算法由美国麻省理工学院(MIT)的Rivest, Shamir 和Adleman在1978年提出,被广泛接受并实现的通用公开密钥密码算法,目前已成为公钥密码的国际通用标准。关于RSA加密算法原理的知识,本文不再赘述,感兴趣的同学可以看一下这两篇博文:
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
1.2 RSA数字签名
1.2.1 RSA数字签名基本概念
RSA数字签名体制是基于RSA公钥密码算法的,由于RSA算法在实践中被验证了是安全的(到目前为止),这样,RSA数字签名体制在许多安全标准中得以较为广泛的应用。
RSA数字签名算法,包括签名算法和验证算法,它是基于RSA算法加密和解密算法来进行的数字签名,实际上把通过一个散列函数(本设计使用的是SHA256算法)来产生的消息摘要(MD)作为加密的对象,而不是对原文进行直接的加密。原文消息如果发生改变,消息摘要也将发生改变,进而,数字签名的值也将发生改变,也就是说有不同的消息将得到不同的数字签名。有效的数字签名使接收方可以得到正确验证消息:确实来自发送方,因为签名的私钥只有发送方自己才有,他人是无法做相同的数字签名的,如果第三方冒充发送方发出了一个消息,接收方在对数字签名进行验证时使用的是发送方公开的公钥,在第三方不知道发送方私钥的情况下,加密生成的数字签名和重新计算的数字签名必然是不同的,这样,数字签名的真实性就得到了有效的保证。
1.2.2 RSA数字签名算法的实现原理
RSA数字签名算法分为以下两个步骤:
1) 签名算法:
(1)生成消息摘要:消息在签名前首先通过SHA256算法计算相应的消息摘要。
(2)对消息摘要作RSA加密算法:采用发送方的私钥加密消息摘要,加密后的字符串序列即为要嵌入到原文中的数字签名序列值。
2) 验证签名算法:
(1)签名解密:签名值实际上是RSA加密后的消息摘要,用RSA解密算法、利用发送方的公钥对消息摘要进行解密。
(2)再进行消息摘要的计算和两个消息摘要的比较:接受方对原文利用SHA256算法重新计算一个消息摘要,得到验证者自己的消息摘要。验证者比较解密得到的消息摘要和自己的消息摘要,如果两者相同,那么验证成功,可以确定消息的完整性以及签名者的身份,否则,验证失败,确认签名是冒充的或是被篡改过的。
1.3 准备好环境
1) 基于鲲鹏芯片的TaiShan服务器;
2)openEuler操作系统;
3) 已加载安全OS和tzdriver,且已通过teecd开启安全模式;
2 CA与TA之间的通信过程
GP标准中对REE侧和TEE侧提供给CA和TA调用的接口都做出了明确的定义,包括接口函数的函数名、作用、参数说明、返回值等。在CA和TA开发过程中,需要遵循GP标准定义的接口,实现TA和CA之间通信和数据传递。
2.1 TA必备接口
每个TA都必须实现下面的五个接口函数,实现TA和CA之间通信和数据传递。
函数名称 |
函数介绍 |
TA_CreateEntryPoint |
安全服务的构造函数接口,该接口在客户端应用第一次打开会话并创建TA实例时得到调用。如果此函数执行失败,则该TA实例构建失败。 |
TA_DestroyEntryPoint |
安全服务的析构函数接口,该接口在客户端应用关闭会话并销毁TA实例时得到调用。 |
TA_OpenSessionEntryPoint |
当客户端应用打开会话时,安全OS会调用对应TA的此接口在安全世界创建一个会话。 |
TA_CloseSessionEntryPoint |
当客户端应用关闭会话时,安全OS会调用对应TA的此接口在安全世界关闭会话。 |
TA_InvokeCommand |
当客户端应用发送命令(TEEC_InvokeCommand)给安全OS时,安全OS会调用对应TA的此接口在安全世界执行相应操作,比如加解密,安全存储等。 |
2.2 CA必备接口
CA必备接口函数与TA接口函数的对应关系如下表所示:
非安全侧接口 |
安全侧TA接口 |
说明 |
TA_CreateEntryPoint TA_OpenSessionEntryPoint |
会话打开函数。当客户端应用执行TEEC_OpenSession时,安全OS会执行对应TA的TA_OpenSessionEntryPoint。 当TA实例未创建时,需要调用TA_CreateEntryPoint。 |
|
TEEC_InvokeTACommand |
TA_InvokeCommand |
执行cmd命令。 |
TA_CloseSessionEntryPoint TA_DestroyEntryPoint |
会话关闭函数。当客户端应用执行TEEC_CloseSession时,安全OS会执行对应TA的TA_CloseSessionEntryPoint。 如果客户端应用关闭的会话为此TA的最后一个会话,则安全OS核心框架会执行TA_DestroyEntryPoint函数销毁TA实例。 |
2.3 CA与TA通信
CA和TA接口函数的执行过程为:
1)打开会话:客户端应用调用TEEC_OpenSession接口后,安全OS核心框架会调用安全服务的TA_CreateEntryPoint接口和TA_OpenSessionEntryPoint接口;
2)执行命令:客户端应用执行TEEC_InvokeCommand后,安全OS核心框架会调用安全服务的TA_InvokeCommandEntryPoint接口,针对客户端应用发送的命令,安全服务进行处理并返回相应结果;
3)关闭会话:客户端应用执行TEEC_CloseSession后,安全OS核心框架先调用TA的TA_CloseSessionEntryPoint,之后调用安全服务的析构函数TA_DestroyEntryPoint。
整体过程如下图所示:
3 功能概览
这里CA侧传递密钥有两种形式,一种是首先将密钥作为文件存入TEE 环境中,然后把密钥文件路径作为参数传递以进行加解密操作;另外一种直接将密钥数据作为参数传递以进行加解密操作。
根据前文的描述,CA侧执行TEEC_InvokeCommand后,安全OS核心框架会调用TA的TA_InvokeCommandEntryPoint接口,针对CA发送的命令,TA进行处理并返回相应结果。
在Demo中,传递了如下的command,相应的动作如下表所示:
3.1 建立连接
预备动作,建立CA与TA之间的通信,通过调用TEEC_InitializeContext和TEEC_OpenSession,初始化TEE Context,建立CA与TA之间的会话;
3.2 加密和解密
第一步,CA发送CMD_GENERATE_RANDOM命令,TA响应,调用TEE_GenerateRandom函数产生随机数,用于后面秘钥生成:
第二步,CA发送CMD_GENERATE_KEYPAIR命令,TA使用前面随机数,通过TEE_GenerateKey函数产生公钥-私钥对:
第三步,CA发送CMD_SAVE_KEYPAIR命令,TA调用CmdRSASaveKeypair将生成的密钥数据存储到指定路径中:
第四步,CA发送CMD_READ_KEYPAIR命令,TA调用CmdRSAReadKeypair函数读取存储的秘钥文件,获得公共秘钥数据:
第五步,CA发送CMD_ENC_OAEP_MGF1_SHA512命令,TA调用用前面生成的公共秘钥数据,以TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA512模式去加密数据对要传输的数据进行加密:
第六步,CA发送CMD_DEC_OAEP_MGF1_SHA512命令,TA使用前面生成的私钥数据,对加密的数据进行解密,并将原始数据与解密数据进行对比:
3.3 签名和验签
第七步,数字签名,CA发送CMD_SIGN_PSS_MGF1_SHA256命令,TA主要实现以下功能:
(1)生成消息摘要:消息在签名前首先通过SHA256算法计算相应的消息摘要。
(2)对消息摘要作RSA加密算法:采用发送方的私钥加密消息摘要,加密后的字符串序列即为要嵌入到原文中的数字签名序列值。
第八步,验证数字签名,CA发送CMD_VERIFY_PSS_MGF1_SHA256命令,TA主要实现以下功能:
(1)签名解密:签名值实际上是RSA加密后的消息摘要,用RSA解密算法、利用发送方的公钥对消息摘要进行解密。
(2)再进行消息摘要的计算和两个消息摘要的比较:接受方对原文利用SHA256算法重新计算一个消息摘要,得到验证者自己的消息摘要。验证者比较解密得到的消息摘要和自己的消息摘要,如果两者相同,那么验证成功,可以确定消息的完整性以及签名者的身份,否则,验证失败,确认签名是冒充的或是被篡改过的。
3.4 断开连接
调用TEEC_CloseSession和TEEC_FinalizeContext函数关闭会话关闭CA与TA之间的会话和上下文。
收功。
- 点赞
- 收藏
- 关注作者
评论(0)