文章目录[隐藏]
本系列的其它几篇文章:
《英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM》
《英飞凌 AURIX 系列单片机的HSM详解(2)——与HSM相关的UCB和寄存器》
《英飞凌 AURIX 系列单片机的HSM详解(3)——开发方法》
《英飞凌 AURIX 系列单片机的HSM详解(4)——Tricore核与HSM核之间的通信方法》
1. 概述
我们前文讲到过,HSM模块是专门用于实现加解密算法的,对于一些常见算法有硬件加速器,计算起来比软件要快。TC3XX系列MCU的HSM硬件加速模块包括:TRNG、AES-128、HASH SHA-256、PKC(公钥加密算法),本文着重介绍前三个常用的硬件加速模块的使用方法。
2. TRGN
TRGN(True Random Number Generator)是真随机数生成器的缩写,这个模块比较简单,一个寄存器TRNG_CTRL控制硬件随机数生成器的开启和关闭,一个结果寄存器TRNG_DATA32可以用来在生成器开启后读取生成的32位随机数,还有一个状态寄存器TRNG_STAT指示随机数生成结果、是否出错等状态。
寄存器的定义以及地址如下:
/*------------- TRNG Module ----------------------------------------------*/
typedef struct
{
__I uint32_t TRNG_DATA32 ; // True RNG Data Register
uint32_t RESERVED0[2] ;
__IO uint16_t TRNG_STAT ; // TRNG status register
uint16_t RESERVED1 ;
__IO uint16_t TRNG_CTRL ; // TRNG control register
} HSM_TRNG_TypeDef;
#define HSM_TRNG_BASE (0xEC000200UL)
#define HSM_TRNG ((HSM_TRNG_TypeDef *) HSM_TRNG_BASE)
3. AES-128
AES加解密有两种方法:ECB和CBC,这里不着重介绍AES算法和这两种方法的区别,网上有很多资料,可以自行搜索。
AES的这两种方法都可以用硬件加速器来实现,AES模块中有4个输入寄存器:AESIN0-3,每个可以装载4字节数据,这四个寄存器可以用来向AES硬件模块装入密钥、待加解密的数据以及使用CBC方式时的初始向量。将数据装入4个输入寄存器后,可以通过控制寄存器AESCTRL来将数据装入相应的位置。
AES硬件模块可以同时记录8组密钥值和5组初始向量值,每次进行加解密的时候可以选择使用不同的密钥和初始向量。便于程序中同步运行多套AES加解密程序。
执行加解密的时候,可以通过AESCTRL寄存器来选择ECB加密、ECB解密、CBC加密和CBC解密。加解密完成后,会通过状态寄存器AESSTAT来进行指示,加解密结果存放在4个输出寄存器AESOUT0-3中。
AES硬件加速器的寄存器定义和地址如下:
/*------------- AES Module ----------------------------------------------*/
typedef struct
{
__IO uint32_t AESIN0 ; // AES INPUT register 0
__IO uint32_t AESIN1 ; // AES INPUT register 1
__IO uint32_t AESIN2 ; // AES INPUT register 2
__IO uint32_t AESIN3 ; // AES INPUT register 3
__IO uint32_t AESCTRL ; // AES Control Register
__I uint32_t AESSTAT ; // AES Status Register
uint32_t RESERVED0[2] ;
__I uint32_t AESOUT0 ; // AES OUTPUT register 0
__I uint32_t AESOUT1 ; // AES OUTPUT register 1
__I uint32_t AESOUT2 ; // AES OUTPUT register 2
__I uint32_t AESOUT3 ; // AES OUTPUT register 3
__I uint32_t AESOUTSAVE0 ; // AES OUTPUT save register 0
__I uint32_t AESOUTSAVE1 ; // AES OUTPUT save register 1
__I uint32_t AESOUTSAVE2 ; // AES OUTPUT save register 2
__I uint32_t AESOUTSAVE3 ; // AES OUTPUT save register 3
} HSM_AES_TypeDef;
#define HSM_AES_BASE (0xE8000000UL)
#define HSM_AES ((HSM_AES_TypeDef *) HSM_AES_BASE)
4. 摘要算法
摘要算法也叫哈希算法(HASH),是一种单向不可逆的加密算法,即密文不能解密为明文,常用于数字签名。常用的摘要算法有CRC、MD5、SHA1、SHA2等,TC3XX系列的HSM支持硬件MD5、SHA1、SHA2(256),其中SHA-256是目前最为安全的摘要算法,被越来越多地应用于汽车通信。
SHA-256输入数据的长度为64字节(512位)的整数倍,不足要补齐,输出的摘要结果为32字节(256位)。
在使用HSM的摘要算法硬件加速器时,先通过CFG寄存器选择使用哪一种算法,以及其他一些属性,如是否使用初始向量、输入输出数据大小端等。
然后向DATA寄存器中分批装入待加密数据,每批64字节,写进该寄存器的数据将会被装进硬件加速模块的输入数据FIFO。硬件加速器在装入数据的同时即开始计算摘要,每装完64字节应检查STAT寄存器中的DF_NF(Data FIFO Not Full),当其不为1时才可以继续装载下一批数据。
直到所有数据都装完后,等待硬件加速模块计算摘要完成(寄存器STAT中的BSY位不为1)后,就可以从寄存器VAL中读取计算结果了,每次读取4字节,寄存器STAT中CNT的值为剩余可读计算结果的数量(4字节为单位),每读取一次CNT的值减1,直到减为0后结果读取完成。
摘要算法的寄存器和地址定义如下:
typedef struct
{
__IO HSM_HASH_CFG_Type CFG ; // HASH Configuration Register
__I HSM_HASH_STAT_Type STAT ; // HASH Status Register
__IO uint32_t HASH_IVIN ; // Hash Initialization Value Register
__I HSM_HASH_VAL_Type VAL ; // Hash Output Value Register
__IO HSM_HASH_DATA_Type DATA ; // Hash Data Input Register
} HSM_HASH_TypeDef;
#define HSM_HASH_BASE (0xE8000400UL)
#define HSM_HASH ((HSM_HASH_TypeDef *) HSM_HASH_BASE)
版权声明:本文为CSDN博主「老孟_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42967006/article/details/121559161
暂无评论