/*******************************************************************************
*
* Function btm_ble_start_encrypt
*
* Description This function is called to start LE encryption.
*
*
* Returns BTM_SUCCESS if encryption was started successfully
*
******************************************************************************/
//debug_stamp
tBTM_STATUS btm_ble_start_encrypt(const RawAddress& bda, bool use_stk,
BT_OCTET16 stk) {
tBTM_CB* p_cb = &btm_cb;
tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda);
BT_OCTET8 dummy_rand = {0};
BTM_TRACE_ERROR("btm_ble_start_encrypt");
if (!p_rec) {
BTM_TRACE_ERROR("Link is not active, can not encrypt!");
return BTM_WRONG_MODE;
}
if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) {
BTM_TRACE_WARNING("Link Encryption is active, Busy!");
return BTM_BUSY;
}
p_cb->enc_handle = p_rec->ble_hci_handle;
if (use_stk) {
BTM_TRACE_ERROR("No key available to encrypt the link1");
btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk);
} else if (p_rec->ble.key_type & BTM_LE_KEY_PENC) {
BTM_TRACE_ERROR("No key available to encrypt the link2");
BTM_TRACE_ERROR( "p_rec->ble_hci_handle = %#x", p_rec->ble_hci_handle );
BTM_TRACE_ERROR( "p_rec->ble.keys.ediv = %#x", p_rec->ble.keys.ediv );
smp_debug_print_nbyte_big_endian(p_rec->ble.keys.rand, "Encrypted text1", 8);
smp_debug_print_nbyte_big_endian(p_rec->ble.keys.pltk, "Encrypted text12", 16);
//p_rec->ble.keys.pltk[0] = 0x55;
//p_rec->ble.keys.pltk[1] = 0xaa;
//有配对信息,直接从这个地方进行秘钥验证 发送随机数 div 加密数据给遥控器
//just work模式的解密秘钥是16个0x00.
//让遥控器aes128解密,解出来的数据与遥控器(peer)里面存储的数据进行比较,
//如果匹配就认为是合法的主机.
//配对key生成过程:
//主机发送随机数 和 用随机数加密的aes128 (key=16 bytes 0)给遥控器
//遥控器发送随机数 和 用随机数加密的aes128 (key=16 bytes 0)给主机
//相互解密后 确认随机数是否正确
//正确后 用主机的随机数前面8字节加遥控器的随机数的前面8字节组合进行aes128 (key=16 bytes 0)加密
//得出的值作为配对key? 这一步还没有完全看到相关代码 只是猜测,前面几步骤都经过代码验证了。
//得出的值作为配对key? 没有这么简单,这个值只是生成stk的前提 也就是 主机和遥控器相互证明了对方的合法性
//生成stk后,观察日志发现 :(这部分具体细节待明确???)
//LE_KEY_PENC 的内容是 遥控器算出来,并传送给主机的 主机保存至 /data/misc/bluedroid/bt_config.conf
//即此处用来验证配对的key
btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, p_rec->ble.keys.rand,
p_rec->ble.keys.ediv, p_rec->ble.keys.pltk);
} else {
BTM_TRACE_ERROR("No key available to encrypt the link3");
return BTM_NO_RESOURCES;
}
if (p_rec->sec_state == BTM_SEC_STATE_IDLE){
BTM_TRACE_ERROR("No key available to encrypt the link4");
p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
}
return BTM_CMD_STARTED;
}