嗨,团队,
我正在研究一个代码,其中设备是在扫描模式特定的持续时间,然后加密接收的数据,并发布加密的数据。我使用硬件加密的加密目的。我面临的问题是,当我的设备处于扫描模式时,加密无法完成。回调处理程序gapm_use_enc_block_ind_handler没有被调用。
谢谢,团队Wisilica
嗨Wisilica,DA14580不导出api来使用硬件加密块。你可能需要一个软件加密。
您使用了哪些API,并期望调用gapm_use_enc_block_ind_handler ?
你好,
硬件加密在设备退出扫描(观察者)模式后被调用时起作用。当设备处于广播模式时,它也能工作。以下是我们使用的代码片段:aes_encrypt_hw(uint8_t* data, uint8_t* key){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[我]= *(键+ (15));rev_data[我]= *(数据+ (15));}
memcpy (cmd - > operand_1 rev_key 16);memcpy (cmd - > operand_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 *参数,ke_task_id_t dest_id,Ke_task_id_t src_id),在app_gap_process_handlers中定义如下:
静态const struct ke_msg_handler app_gap_process_handlers[]={(ke_msg_func_t) gapm_device_ready_ind_handler}, {GAPM_DEVICE_READY_IND(ke_msg_func_t) gapm_cmp_evt_handler}, {GAPM_CMP_EVT(ke_msg_func_t) gapc_cmp_evt_handler}, {GAPC_CMP_EVT(ke_msg_func_t) gapc_connection_req_ind_handler}, {GAPC_CONNECTION_REQ_IND(ke_msg_func_t) gapc_disconnect_ind_handler}, {GAPC_DISCONNECT_IND(ke_msg_func_t) app_module_init_cmp_evt_handler}, {APP_MODULE_INIT_CMP_EVT(ke_msg_func_t) gapm_adv_report_ind_handler}, {GAPM_ADV_REPORT_IND(ke_msg_func_t) gapm_use_enc_block_ind_handler}, {GAPM_USE_ENC_BLOCK_IND#如果(BLE_APP_SEC)(ke_msg_func_t) gapc_security_ind_handler}, {GAPC_SECURITY_IND# endif};
我们可以使用DA14580芯片在所有情况下得到正确的加密结果,除了设备在SCAN模式下。
谢谢,Wisilica
嗨wisillica,
我试着你已经提到在扫描模式中,我调用加密函数,当一个广告信号发生和我总是可以得到赶上其他的回调函数,因此请尽量赶上GAPM_USE_ENC_BLOCK_IND函数而不是app_gap_process_handlers[]数组。
由于MT_dialog
你好,DA14580 datasheet中给出了该芯片支持硬件加密(截图随函附上)。所以,请建议在DA14580芯片上长期使用硬件AES加密是否可靠。
嗨wisilica,
是的,芯片有一个AES-128位加密处理器,我没有意识到任何问题,你在你的应用程序中遇到特殊的事情吗?这是关于扫描和加密指示,你试过我上面提到的吗?
是的,我试图在catch rest函数中包括加密的回调处理程序,正如您上面提到的,但由于硬件加密完成,我无法获得该函数的回调。在设备的扫描阶段调用硬件加密。
在SDK 5.0.4的模板中,我做了以下修改,以测试您提到的内容,我可以验证当从广告指示回调中发出命令时,加密消息总是返回一个指示。
空白encrypt_data(空白){uint8_t关键[16]={15日,14日,13日,12日,11日,10、9、8、7、6、5、4、3、2、1、0};uint8_t明文[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 - > operand_1 16);memcpy (cmd - > operand_2明文16);ke_msg_send (cmd);}
Void user_on_adv_report_ind(struct gapm_adv_report_ind const * param) (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 - > report.adv_addr.addr [3],param - > report.adv_addr.addr [2],param - > report.adv_addr.addr [1],param - > report.adv_addr.addr [0]);encrypt_data ();}
Void user_catch_rest_hndl(ke_msg_id_t const msgid,空白const *参数,ke_task_id_t const dest_id,ke_task_id_t const src_id){开关(是否){案例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 = (Struct 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 ?
你好,
硬件加密在设备退出扫描(观察者)模式后被调用时起作用。当设备处于广播模式时,它也能工作。
以下是我们使用的代码片段:
aes_encrypt_hw(uint8_t* data, uint8_t* key)
{
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[我]= *(键+ (15));
rev_data[我]= *(数据+ (15));
}
memcpy (cmd - > operand_1 rev_key 16);
memcpy (cmd - > operand_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 *参数,
ke_task_id_t dest_id,
Ke_task_id_t src_id),在app_gap_process_handlers中定义如下:
静态const struct ke_msg_handler app_gap_process_handlers[]=
{
(ke_msg_func_t) gapm_device_ready_ind_handler}, {GAPM_DEVICE_READY_IND
(ke_msg_func_t) gapm_cmp_evt_handler}, {GAPM_CMP_EVT
(ke_msg_func_t) gapc_cmp_evt_handler}, {GAPC_CMP_EVT
(ke_msg_func_t) gapc_connection_req_ind_handler}, {GAPC_CONNECTION_REQ_IND
(ke_msg_func_t) gapc_disconnect_ind_handler}, {GAPC_DISCONNECT_IND
(ke_msg_func_t) app_module_init_cmp_evt_handler}, {APP_MODULE_INIT_CMP_EVT
(ke_msg_func_t) gapm_adv_report_ind_handler}, {GAPM_ADV_REPORT_IND
(ke_msg_func_t) gapm_use_enc_block_ind_handler}, {GAPM_USE_ENC_BLOCK_IND
#如果(BLE_APP_SEC)
(ke_msg_func_t) gapc_security_ind_handler}, {GAPC_SECURITY_IND
# endif
};
我们可以使用DA14580芯片在所有情况下得到正确的加密结果,除了设备在SCAN模式下。
谢谢,
Wisilica
嗨wisillica,
我试着你已经提到在扫描模式中,我调用加密函数,当一个广告信号发生和我总是可以得到赶上其他的回调函数,因此请尽量赶上GAPM_USE_ENC_BLOCK_IND函数而不是app_gap_process_handlers[]数组。
由于MT_dialog
你好,
DA14580 datasheet中给出了该芯片支持硬件加密(截图随函附上)。所以,请建议在DA14580芯片上长期使用硬件AES加密是否可靠。
谢谢,
Wisilica
嗨wisilica,
是的,芯片有一个AES-128位加密处理器,我没有意识到任何问题,你在你的应用程序中遇到特殊的事情吗?这是关于扫描和加密指示,你试过我上面提到的吗?
由于MT_dialog
你好,
是的,我试图在catch rest函数中包括加密的回调处理程序,正如您上面提到的,但由于硬件加密完成,我无法获得该函数的回调。在设备的扫描阶段调用硬件加密。
谢谢,
Wisilica
嗨wisilica,
在SDK 5.0.4的模板中,我做了以下修改,以测试您提到的内容,我可以验证当从广告指示回调中发出命令时,加密消息总是返回一个指示。
空白encrypt_data(空白)
{
uint8_t关键[16]={15日,14日,13日,12日,11日,10、9、8、7、6、5、4、3、2、1、0};
uint8_t明文[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 - > operand_1 16);
memcpy (cmd - > operand_2明文16);
ke_msg_send (cmd);
}
Void user_on_adv_report_ind(struct gapm_adv_report_ind const * param) (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 - > report.adv_addr.addr [3],
param - > report.adv_addr.addr [2],
param - > report.adv_addr.addr [1],
param - > report.adv_addr.addr [0]);
encrypt_data ();
}
Void user_catch_rest_hndl(ke_msg_id_t const msgid,
空白const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
开关(是否)
{
案例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 = (Struct 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