Защита пользователя Bluetooth в середине в Windows

#c #c #winapi #bluetooth

#c #c #winapi #bluetooth

Вопрос:

Я играю с Windows API для встроенного программирования Bluetooth.

Я успешно подключаю свой ПК с Windows к своему устройству Android, но когда я изменяю параметр AUTHENTICATION_REQUIREMENTS в функции
BluetoothAuthenticateDeviceEx из AUTHENTICATION_REQUIREMENTS::MITMProtectionRequiredGeneralBonding
Для AUTHENTICATION_REQUIREMENTS::MITMProtectionRequired
мой код «не удается» выполнить сопряжение с моим устройством Android.

Под «сбоем» я подразумеваю, что все API-интерфейсы являются ERROR_SUCCESS кодом возврата, а в телефоне Android мой ПК с Windows отображается как «сопряженный», но на моем ПК с Windows устройство Android не было добавлено к устройствам Bluetooth. Более того, если я попытаюсь использовать свой телефон Android и подключиться к своему ПК с Windows, процесс сопряжения будет запущен снова (я предполагаю, что это так, поскольку ранее сопряжение не было завершено успешно).

Код Windows выглядит следующим образом:

 int Authenticate(BLUETOOTH_DEVICE_INFO device)
{
      HBLUETOOTH_AUTHENTICATION_REGISTRATION hAuthentication = nullptr;

      DWORD err = BluetoothRegisterForAuthenticationEx(amp;device, 
                                                       amp;hAuthentication,
                                                       amp;::AuthenticationCallbackStatic, 
                                                       nullptr);
      if (ERROR_SUCCESS != err) { return -1; }

      // Changing last parameter to MITMProtectionRequired will cause to pairing 
      // complete unsuccessfully
      err = BluetoothAuthenticateDeviceEx(nullptr, 
                                          nullptr, 
                                          amp;device, 
                                          nullptr,
                                          MITMProtectionRequiredGeneralBonding); 
      if (ERROR_SUCCESS != err) { return -1; }

      return 0;
}
  

Есть идеи, почему этот параметр вызывает сбой сопряжения?

Ответ №1:

Существует разница между «сопряжением» и «Связыванием». Сопряжение — это генерация общего секрета (ключа) между двумя устройствами, который может использоваться во время аутентификации текущего сеанса.

Если ключ сохранен, два устройства связаны.

MITMProtectionRequired в соответствии с MSDN — это «требование MITM для аутентификации», поэтому я понимаю, что это означает просто сопряжение, а не соединение. Вот как вы видите ERROR_SUCCESS, но ключ не сохраняется. Поэтому для последующих подключений требуется сопряжение.