嗨,团队,
我正在研究一个代码,其中设备是在扫描模式特定的持续时间,然后加密接收的数据,并发布加密的数据。我使用硬件加密的加密目的。我面临的问题是,当我的设备处于扫描模式时,加密无法完成。回调处理程序gapm_use_enc_block_ind_handler没有被调用。
谢谢 ,队怀士队
嗨Wisilica,DA14580不会导出API以使用硬件加密块。您可能需要软件加密。
您使用了哪个API和预期的GAPM_USE_ENC_BLOCK_IND_HANDLER?
你好,
在设备退出扫描(观察者)模式后调用时,硬件加密工作。当设备处于广播模式时,它还运行。这是我们使用的代码片段:void aes_encrypt_hw(uint8_t * data,uint8_t *键){struct gapm_use_enc_block_cmd *cmd = KE_MSG_ALLOC(gapm_use_enc_block_cmd, TASK_GAPM, TASK_APP, gapm_use_enc_block_cmd);
uint8_t rev_key [16];uint8_t rev_data [16];cmd->操作= gapm_use_enc_block;
(我= 0;< 16;+ + i){rev_key [i] = *(键+(15-i));rev_data[我]= *(数据+ (15));}
memcpy(cmd->操作数_1,rev_key,16);memcpy(cmd->操作数_2,rev_data,16);ke_msg_send(cmd);}一旦加密完成,我们就会回调到处理器,
Static int gapm_use_enc_block_ind_handler(ke_msg_id_t msgid,struct gapm_use_enc_block_ind * param,ke_task_id_t dest_id,ke_task_id_t src_id)在app_gap_process_handler中定义,如下所示:
静态const struct ke_msg_handler app_gap_process_handlers[]={{gapm_device_ready_ind,(ke_msg_func_t)gapm_device_ready_ind_handler},{gapm_cmp_evt,(ke_msg_func_t)gapm_cmp_evt_handler},{gapc_cmp_evt,(ke_msg_func_t)gapc_cmp_evt_handler},{gapc_connection_req_ind,(ke_msg_func_t)gapc_connection_req_ind_handler},{gapc_disconnect_ind,(ke_msg_func_t)gapc_disconnect_ind_handler},{app_module_init_cmp_evt,(ke_msg_func_t)app_module_init_cmp_evt_handler},(ke_msg_func_t) gapm_adv_report_ind_handler}, {GAPM_ADV_REPORT_IND{gapm_use_enc_block_ind,(ke_msg_func_t)gapm_use_enc_block_ind_handler},#if(ble_app_sec){gapc_security_ind,(ke_msg_func_t)gapc_security_ind_handler},#万一};
我们可以使用DA14580芯片在所有情况下得到正确的加密结果,除了设备在SCAN模式下。
谢谢,Wisilica.
嗨wisillica,
我试着你已经提到在扫描模式中,我调用加密函数,当一个广告信号发生和我总是可以得到赶上其他的回调函数,因此请尽量赶上GAPM_USE_ENC_BLOCK_IND函数而不是app_gap_process_handlers[]数组。
谢谢mt_dialog.
你好,在DA14580数据表中,芯片支持硬件加密(屏幕截图附带的屏幕截图)。因此,如果在DA14580芯片中使用硬件AES加密,请建议在长时间使用硬件AES加密。
嗨wisilica,
是的,芯片有一个AES-128位加密处理器,我没有意识到任何问题,你在你的应用程序中遇到特殊的事情吗?这是关于扫描和加密指示,你试过我上面提到的吗?
你好,
是的,我试图在catch rest函数中包括加密的回调处理程序,正如您上面提到的,但由于硬件加密完成,我无法获得该函数的回调。在设备的扫描阶段调用硬件加密。
从SDK 5.0.4的模板中,我执行了以下修改以测试您提到的内容,并且我可以验证加密消息始终返回从广告指示回调的命令时返回指示。
void encrypt_data(void){UINT8_T键[16] = {15,14,11,12,11,10,9,8,7,6,5,4,3,2,1,0};uint8_t plaintext [16] = {0xff,0xee,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00};struct gapm_use_enc_block_cmd *cmd = KE_MSG_ALLOC(gapm_use_enc_block_cmd, TASK_GAPM, TASK_APP, gapm_use_enc_block_cmd);cmd->操作= gapm_use_enc_block;memcpy(cmd->操作数_1,键,16);Memcpy(CMD-> Operand_2,明文,16);ke_msg_send(cmd);}
void user_on_adv_report_ind(struct gapm_adv_report_ind const * param){arch_set_pxact_gpio ();arch_printf("Connect with %02x %02x %02x %02x %02x %02x %02x \n\r",param - > report.adv_addr.addr [5],param - > report.adv_addr.addr [4],param-> eport.adddr.addr [3],param-> eport.adddr.addr [2],param - > report.adv_addr.addr [1],param-> report.adddr.addr [0]);encrypt_data ();}
void user_catch_rest_hndl(ke_msg_id_t const msgid,void const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id){开关(msgs){CASE GAPM_USE_ENC_BLOCK_IND:{uint8_t encryted_data [16];Memset(EncryTed_data,0,sizeof(encryted_data));struct gapm_use_enc_block_ind const * msg_param =(结构gapm_use_enc_block_ind const *)(param);memcpy(encryted_data,msg_param->结果,sizeof(encryted_data));arch_printf(“% 2 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 r \ n \”,EncryTed_data [0],EncryTed_data [1],encryted_data [2],encryted_data [3],EncryTed_data [4],EncryTed_data [5],encryted_data [6],EncryTed_data [7],Encryted_data [8],EncryTed_data [9],EncryTed_data [10],EncryTed_data [11],EncryTed_data [12],encryted_data [13],encryted_data [14],EncryTed_data [15]);}打破;
如果有打印bd地址和调用encrypt_data()函数的广告指示,并且加密指示没有发生,那么将很容易在终端日志上发现,这是我在我的设置中没有看到的。即使两个广告指示来在一个非常短的注意到消息将得到在队列和两个加密响应将被打印。所以你可以试试我所提到的。
嗨Wisilica,
DA14580不会导出API以使用硬件加密块。您可能需要软件加密。
您使用了哪个API和预期的GAPM_USE_ENC_BLOCK_IND_HANDLER?
你好,
在设备退出扫描(观察者)模式后调用时,硬件加密工作。当设备处于广播模式时,它还运行。
这是我们使用的代码片段:
void aes_encrypt_hw(uint8_t * data,uint8_t *键)
{
struct gapm_use_enc_block_cmd *cmd = KE_MSG_ALLOC(gapm_use_enc_block_cmd, TASK_GAPM, TASK_APP, gapm_use_enc_block_cmd);
uint8_t rev_key [16];
uint8_t rev_data [16];
cmd->操作= gapm_use_enc_block;
(我= 0;< 16;+ + i)
{
rev_key [i] = *(键+(15-i));
rev_data[我]= *(数据+ (15));
}
memcpy(cmd->操作数_1,rev_key,16);
memcpy(cmd->操作数_2,rev_data,16);
ke_msg_send(cmd);
}
一旦加密完成,我们就会回调到处理器,
Static int gapm_use_enc_block_ind_handler(ke_msg_id_t msgid,
struct gapm_use_enc_block_ind * param,
ke_task_id_t dest_id,
ke_task_id_t src_id)在app_gap_process_handler中定义,如下所示:
静态const struct ke_msg_handler app_gap_process_handlers[]=
{
{gapm_device_ready_ind,(ke_msg_func_t)gapm_device_ready_ind_handler},
{gapm_cmp_evt,(ke_msg_func_t)gapm_cmp_evt_handler},
{gapc_cmp_evt,(ke_msg_func_t)gapc_cmp_evt_handler},
{gapc_connection_req_ind,(ke_msg_func_t)gapc_connection_req_ind_handler},
{gapc_disconnect_ind,(ke_msg_func_t)gapc_disconnect_ind_handler},
{app_module_init_cmp_evt,(ke_msg_func_t)app_module_init_cmp_evt_handler},
(ke_msg_func_t) gapm_adv_report_ind_handler}, {GAPM_ADV_REPORT_IND
{gapm_use_enc_block_ind,(ke_msg_func_t)gapm_use_enc_block_ind_handler},
#if(ble_app_sec)
{gapc_security_ind,(ke_msg_func_t)gapc_security_ind_handler},
#万一
};
我们可以使用DA14580芯片在所有情况下得到正确的加密结果,除了设备在SCAN模式下。
谢谢,
Wisilica.
嗨wisillica,
我试着你已经提到在扫描模式中,我调用加密函数,当一个广告信号发生和我总是可以得到赶上其他的回调函数,因此请尽量赶上GAPM_USE_ENC_BLOCK_IND函数而不是app_gap_process_handlers[]数组。
谢谢mt_dialog.
你好,
在DA14580数据表中,芯片支持硬件加密(屏幕截图附带的屏幕截图)。因此,如果在DA14580芯片中使用硬件AES加密,请建议在长时间使用硬件AES加密。
谢谢,
Wisilica.
嗨wisilica,
是的,芯片有一个AES-128位加密处理器,我没有意识到任何问题,你在你的应用程序中遇到特殊的事情吗?这是关于扫描和加密指示,你试过我上面提到的吗?
谢谢mt_dialog.
你好,
是的,我试图在catch rest函数中包括加密的回调处理程序,正如您上面提到的,但由于硬件加密完成,我无法获得该函数的回调。在设备的扫描阶段调用硬件加密。
谢谢,
Wisilica.
嗨wisilica,
从SDK 5.0.4的模板中,我执行了以下修改以测试您提到的内容,并且我可以验证加密消息始终返回从广告指示回调的命令时返回指示。
void encrypt_data(void)
{
UINT8_T键[16] = {15,14,11,12,11,10,9,8,7,6,5,4,3,2,1,0};
uint8_t plaintext [16] = {0xff,0xee,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00};
struct gapm_use_enc_block_cmd *cmd = KE_MSG_ALLOC(gapm_use_enc_block_cmd, TASK_GAPM, TASK_APP, gapm_use_enc_block_cmd);
cmd->操作= gapm_use_enc_block;
memcpy(cmd->操作数_1,键,16);
Memcpy(CMD-> Operand_2,明文,16);
ke_msg_send(cmd);
}
void user_on_adv_report_ind(struct gapm_adv_report_ind const * param)
{
arch_set_pxact_gpio ();
arch_printf("Connect with %02x %02x %02x %02x %02x %02x %02x \n\r",
param - > report.adv_addr.addr [5],
param - > report.adv_addr.addr [4],
param-> eport.adddr.addr [3],
param-> eport.adddr.addr [2],
param - > report.adv_addr.addr [1],
param-> report.adddr.addr [0]);
encrypt_data ();
}
void user_catch_rest_hndl(ke_msg_id_t const msgid,
void const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
开关(msgs)
{
CASE GAPM_USE_ENC_BLOCK_IND:
{
uint8_t encryted_data [16];
Memset(EncryTed_data,0,sizeof(encryted_data));
struct gapm_use_enc_block_ind const * msg_param =(结构gapm_use_enc_block_ind const *)(param);
memcpy(encryted_data,msg_param->结果,sizeof(encryted_data));
arch_printf(“% 2 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 x % 02 r \ n \”,
EncryTed_data [0],
EncryTed_data [1],
encryted_data [2],
encryted_data [3],
EncryTed_data [4],
EncryTed_data [5],
encryted_data [6],
EncryTed_data [7],
Encryted_data [8],
EncryTed_data [9],
EncryTed_data [10],
EncryTed_data [11],
EncryTed_data [12],
encryted_data [13],
encryted_data [14],
EncryTed_data [15]
);
}打破;
如果有打印bd地址和调用encrypt_data()函数的广告指示,并且加密指示没有发生,那么将很容易在终端日志上发现,这是我在我的设置中没有看到的。即使两个广告指示来在一个非常短的注意到消息将得到在队列和两个加密响应将被打印。所以你可以试试我所提到的。
谢谢mt_dialog.