自学内容网 自学内容网

android 蓝牙遥控器配对过程的一点理解


/*******************************************************************************
 *
 * 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;
}


原文地址:https://blog.csdn.net/dp__mcu/article/details/142385676

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!