da1468x.
11个月前
张贴了bobspam@free.fr50分 7回复你好
我使用AES CBC从DA14683传输数据,我想准备我的代码为安全模式。我确实从文档中理解,为了设置AES密钥,我需要:
—开启OTP读取功能
- 使用DMA通道7将键从OTP传输到AES键64寄存器
——禁用OTP
- 在我的数据上发射AES
我更喜欢了解我目前正在使用的HW_AES_HASH_STORE_KEYS函数的洞察力,以便准备AES协处理器。在将其传输到AES寄存器之前,它设置密钥扩展和准备密钥字节。
- 是否需要准备存储在OTP中的键?我只是需要将它们从OTP复制到AES寄存器吗?
- 是否需要在启动DMA通道7之前调用hw_aes_hash_store_keys()函数,因此它设置了密钥扩展?此功能的关键转移应失败;这是否可以在安全模式下以硬件故障结束?我需要重新实现该功能,以便只设置参数,准备键但没有有效地加载键?
换句话说,你能给我一些关于如何设置DA14683为安全模式准备的见解吗(请不要通过重定向我到教程来回答)?
先谢谢你
致以最亲切的问候
st
7个月前
嗨鲍勃,
hw_aes_hash_store_keys()将AES密钥存储在AES/HASH引擎内存中。此函数将用于AES加密/解密的密钥存储在AES/HASH引擎内存中。如果由引擎执行键扩展,那么aes_keys应该只包含基本键。否则,它应该包含所有展开的键。本教程在线
如果已启用安全特性,则应用程序无法读取存储的密钥。如果安全启动闪存被禁用,那么是的,这是可能的。
存储在OTP中的键只能由安全的DMA通道7.在键的生成之后,您应该将它们存储到OTP的安全区域。
有关安全启动的更多信息,请在线和数据表找到。
谢谢,PM_DIALOG.
7个月前
你好
谢谢你的回答。
- 我确实理解,OTP内存包含AES模块直接使用的键。如果加密算法需要密钥扩展,则所有键都必须存储在AES_keys中。
- 我确实理解,在安全模式下,CPU无法读取存储在OTP中的键。它们只能使用DMA转移。
实际的板支持包实现这个DMA传输吗?据我所知,没有。
- >我是否应该重新实现HW_AES_HASH_STORE_KEYS()以在安全模式下使用密钥扩展?我正在使用AES CBC,并使用OpenSSL解码传输数据。
- 您没有回答我关于Crypto_hmac_sha256()的问题。
- 从我的理解,我无法使用存储在OTP中的键以在安全模式下使用HMAC。这意味着HMAC功能无法从JTAG / MKIMAGE生产工具获取其键。
你能确认吗?
先谢谢你
致以最亲切的问候
st
7个月前
你好
我计划使用initial_flash / jtag / otp / suota_loader_secured软件集在系统中引入的对称密钥。
如果我替换了hw_aes_hash_store_keys()函数,让键被DMA通道7加载:
-我知道我需要手动设置“密钥扩展”设置,以相同的方式hw_aes_hash_store_keys
- 下一个陈述似乎与字节交换相关。如果我理解,它与小型联系转换有关。
您能否向MMA通道7确认设置以从OTP将密钥正确加载到AES协处理器中?是否有任何特定的字节顺序转换执行?如果是的话在哪种情况下?
先谢谢你
致以最亲切的问候
st
5个月前
你好
为了记录在案,我设法在安全模式下使用OTP中存储的对称密钥使用AES CBC加密
程序如下:
dma_setup secured_channel = {
.cannel_number = hw_dma_channel_7,
.bus_width = hw_dma_bw_word,
.irq_enable = HW_DMA_IRQ_STATE_ENABLED,
.irq_nr_of_trans = 0,
.dreq_mode = hw_dma_dreq_start,
。inc = hw_dma_ainc_true,
.b_inc = hw_dma_binc_true,
.circular = HW_DMA_MODE_NORMAL,
.dma_prio = hw_dma_prio_0,
.dma_idle = hw_dma_idle_interrupting_mode,
.dma_init = HW_DMA_INIT_AX_BX_AY_BY,
.dma_req_mux = hw_dma_trig_none,
.src_address = 0 x0,
.dest_address = 0x0,
.Length = 0x0,
.callback = key_secured_copy_cb,
.user_data = xxx,
};
静态int16_t key_secured_copy(const uint8_t * from,uint8_t *到,uint32_t大小)
{
//声明局部变量
int16_t错误= -1;
uint16_t local_size;
//检查参数完整性
断言(从! = NULL);
断言(到!= null);
断言(大小> 0);
如果((! = NULL) & & (! = NULL) & &(大小> 0)){
//关键字扩展需要由引擎执行
REG_SET_BIT (AES_HASH CRYPTO_CTRL_REG CRYPTO_AES_KEXP);
//准备dma数据
secured_channel.src_address =(uint32_t)from;
secured_channel.dest_address =(uint32_t);
secured_channel_len = 0;
if(secured_channel.bus_width == 0){
local_size = size;
} 别的 {
local_size = size / secured_channel.bus_width;
}
secured_channel。长度= local_size;
hw_otpc_init();
hw_otpc_set_speed (HW_OTPC_SYS_CLK_FREQ_16);
hw_otpc_manual_read_on (0);
hw_dma_channel_initialization(&(secured_channel));
hw_dma_channel_enable(secured_channel.channel_number,hw_dma_state_enabled);
os_event_wait(secured_channel_event,os_event_forever);
hw_dma_channel_stop(secured_channel.channel_number);
hw_otpc_manual_read_off();
hw_otpc_disable();
//设置错误返回参数
If (local_size == secured_channel_len) {
error = 0;
} 别的 {
错误= 1;
}
}
//警告错误
断言(错误= = 0);
返回错误;
}
函数调用是
key_secured_copy((uint8_t *) 0x07F8E8C0, (uint8_t *) & AES_HASH->CRYPTO_KEYS_START, 32);
请注意,对话框工具中显示的密钥secure_image_config.py似乎具有与系统有效使用的密钥不同的exidianess。
为了能够使用OpenSSL从DA14683传输的扰乱消息,我必须重写从小endian中显示的XML文件中显示的十六进制密钥(32位)。
(参见hw_aes代码中的字节交换。这个操作不能在安全模式下完成,因为CPU没有访问密钥)
希望它可以帮助。主题是封闭的。
致以最亲切的问候
st
5个月前
你好
对于记录,一个小型endian.bash脚本需要吨转换由secure_image_config.py生成的键的eDennsness,从而允许使用openssl到unspherid数据:
#!/ bin / bash
如果[$#--ne 1] ||[[!$ 1 =〜[0-9A-FA-F] {64}]]
然后
echo“用法:endian.bash 256_hex_key”
退出1.
fi
对于我在0 1 2 3 4 5 6 7
做
l = $(($ i * 4 + 1))
Echo $1 | fold -w 2 | tail -n +$l | head -n 4 | tac | tr -d "\n"
完成
回声
布尔
st
11个月前
问题n°2似乎与q n°1相当链接:Crypto_hmac_sha256()在安全模式中是什么?它看起来像这个函数只能实现CPU密钥传输,它根本不使用DMA。
辅助问题:您是否在生产中测试了安全模式和加密/ HMAC?
谢谢