[原创] [ ST NUCLEO-U575ZI-Q 测评] 7-TrustZone工程的实践

manhuami2007   2023-1-7 17:02 楼主

这几天研究了下密码学,准备试试板子上的硬件AES模块,这时候才发现硬件AES模块是在U585芯片上才有的。先弄一个假的加密算法吧。

这个项目是通过串口1接收字符串,串口1是在非安全区工作的。收到的数据调用安全区的加密函数,将其转换成密文,在通过串口1发送回去。

因此需要在NSC区实现2个功能:

1. 在非安全区创建一个缓存区,然后注册到安全区,供安全区将密文传递到非安全区。这就需要1个注册函数;

2. 还需要一个NSC的接口函数,供非安全区调用对收到的字符串进行加密。

注册缓存区的代码如下:

uint8_t *ptr_buf;
CMSE_NS_ENTRY void SECURE_RegisterCallback(SECURE_CallbackIDTypeDef CallbackId, void *func)
{
  if(func != NULL)
  {
    switch(CallbackId)
    {
	  case REGISTER_BUF_ID:
		ptr_buf = (uint8_t*)func;
        break;
      default:
        /* unknown */
        break;
    }
  }
}

供非安全区使用的加密函数如下:

CMSE_NS_ENTRY uint16_t encrypt_callback(uint8_t* plaintext,uint8_t len)
{
	memcpy(ptr_buf,"Encrypt:",8);
	memcpy(ptr_buf+8,plaintext,len);
	ptr_buf[len+8] = 0;

	return len+9;
}

因为这两个函数都是在NSC区的,所以函数前面都有前缀 CMSE_NS_ENTRY 。

在非安全区首先要注册缓存区,然后通过串口接收字符串,再调用加密的接口函数,获取密文,代码如下:

SECURE_RegisterCallback(REGISTER_BUF_ID,ciphertext_buf);
while (1){
  if(get_plaintext_text() != 0){
	HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
	uint16_t len = 0;
	len = encrypt_callback(plaintext_buf,recv_len);
	HAL_UART_Transmit(&huart1,ciphertext_buf,len,1000);
}

在编译代码的时候也要注意,需要先编译安全区的代码,因为非安全区的代码要调用安全区代码生成的一个库文件。如果先编译非安全区代码的话,会报错。

运行效果,当发送一个字符串后,会回复加了前缀"Encrypt:"的字符串,如下图所示

image.png  

代码工程如下:

 

    001.rar (2023-1-7 17:00 上传)

    16.31 MB, 下载次数: 0

    工程文件

回复评论 (2)

楼主的假加密算法也是很逼真

点赞  2023-1-8 09:14

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html

玩板看这里: https://bbs.eeworld.com.cn/elecplay.html EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
点赞  2023-1-12 09:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复