这几天研究了下密码学,准备试试板子上的硬件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:"的字符串,如下图所示
代码工程如下:
工程文件