你好,
我现在在SDK5中查看App_easy_Timer API。这是一个非常伟大的工具 - 无需想到消息,刚刚通过一个要在计时器到期时调用的回调(在这里有任何JavaScript开发人员?)。
在我们的应用程序中,我们使用GapM_USE_ENC_BLOCK_CMD和GAPM_USER_ENC_BLOCK_IND直接加密一些用户数据。
可以为加密块实现类似的API。与定时器不同,两个加密请求无法并行运行。因此,应该有加密请求和回调的队列(带有PUSH,POP和PEEK)。
可以调用该函数:
app_easy_encrypt_block(const uint8_t *操作数_1,const uint8_t *操作数_2,void(* fn)(const uint8_t *))
它可以返回一个布尔或UINT8_T,在发生故障时包含错误(例如,如果队列已满)。
调用函数时,它应该创建操作数_1,操作数_2和fn的结构元素,并尝试将其推向队列。
如果队列在此推送之前右侧空,则意味着没有并行加密 - 该函数应该向刚插入的操作数_1和操作数_2发送新的Gapm_user_enc_block_cmd。
当GAPM_USER_ENC_BLOCK_IND到达时,我们应该从队列中弹出一个元素,并将其保存在临时变量中(断言应确保队列不为空)。
然后,如果队列仍然不为空,我们应该窥视其头部并发送新的GAPM_USER_ENC_BLOCK_CMD以继续加密进程。
最后,我们应该将FN回调称为保存的元素,并使用GapM_USER_ENC_BLOCK_IND中的结果字段。
让我知道你对它的看法,
oren zomer.
设备:
有关此功能有什么新闻吗?
我正在尝试了解SDK5的体系结构,并定影实现我的异步加密功能的正确方法。
我可以看到一些GAPM _.._ IND处理程序定义
app_gap_process_handlers []
在app_task.c中。你认为我应该在那里添加gapm_user_enc_block_ind处理程序吗?
我看到它的方式,处理程序应该在app_task.c中实现并使用execute_callback_param来调用
app_on_user_enc_block_ind.
应该添加到app_callbacks.
在app_callbacks.h和user_callback_config.h中,并参考user_app_on_user_enc_block_ind.
......我相信有很多努力将通用代码与应用程序特定的代码分开,因此喜欢我们的用户不必触摸Target_Apps目代之外的代码,但不幸的是仍然存在许多功能......
AES硬件根据我闪电速度快,所以应该不需要异步地进行。
使用下面的此代码进行AES-ECB加密。它确保它不会与堆栈中的挂起加密碰撞。
假设所有参数都是大endian(AES标准的方式)且未逆转。
void加密(const uint8_t键[16],const uint8_t plaintext [16],uint8_t ciphertext [16]){
volatile uint8_t * plaintext_ptr =(volatile uint8_t *)0x80000 + jump_table_struct [offset_em_enc_plain];
vieltText_ptr =(易失性uint8_t *)0x80000 + jump_struct_struct [offset_em_enc_cipher];
uint8_t saved_data [16];
if(llm_le_env.enc_pend){
而(getword32(ble_aescntl_reg)== 1){}
memcpy(saved_data,(void *)ciphertext_ptr,16);
}
uint32_t key32aligned [4];
Memcpy(key32aligned,key,16);
setword32(ble_aeskey31_0_reg,__reg(key32aligned [3]));
setword32(ble_aeskey63_32_reg,__rev(key32aligned [2]));
setword32(ble_aeskey95_64_reg,__rev(key32aligned [1]));
setword32(ble_aeskey127_96_reg,__rev(key32aligned [0]));
for(int i = 0; i <16; i ++){
plaintext_ptr [i] =明文[15 - i];
}
setword32(ble_aesptr_reg,(uint32_t)(plaintext_ptr - 0x80000));
setword32(ble_aescntl_reg,1);
而(getword32(ble_aescntl_reg)== 1){}
memcpy(密文,(void *)ciphertext_ptr,16);
if(llm_le_env.enc_pend){
memcpy((void *)ciphertext_ptr,saved_data,16);
}
}