В моем случае периферийное устройство BLE не имеет реальных возможностей ввода-вывода, но требуется защита MITM.
В качестве решения используется метод сопряжения Passkey Entry с 6-ди git выводом обмен через другой канал. Та же философия, что и для спаривания вне диапазона, но iOS не поддерживает OOB, поэтому следующим лучшим вариантом будет использовать Passkey Entry так же, как и OOB - отличие состоит в том, что 6-ди git пароль вместо 128-битного ключ (лучше, чем ничего).
Проблема состоит в том, что для этого случая, чтобы работать как положено, центральным и периферийным устройствам необходимо было бы установить ограничение ввода-вывода на KeyboardOnly
, что привело бы к спариванию PasskeyEntry: initiator and responder inputs
method.
Возможные комбинации, скопированные из Базовая спецификация BT [Vol 3] Часть H, Раздел 2.3.5.1, Таблица 2.8: Отображение возможностей ввода-вывода в метод генерации ключа :
/--------------------------------------------------------------------\
/-----------\ / Initiator (iOS/Android) \
/ Responder \ |-------------+--------------+---------------------+---------------------|
/ (Peripheral) \| DisplayOnly | DisplayYesNo | KeyboardOnly | KeyboardDisplay |
|-----------------|-------------+--------------+---------------------+---------------------+
| DisplayOnly | M1 | M3 |
+-----------------+ Just Works | Passkey Entry: |
| DisplayYesNo | | Responder displays, initiator inputs |
+-----------------+----------------------------+---------------------+---------------------+
| | | M4 | |
| KeyboardOnly | | Passkey Entry: | |
| | M2 | initiator and | M2 |
| | Passkey Entry: | responder inputs | Passkey Entry: |
+-----------------+ Initiator displays, +---------------------+ Initiator displays, |
| | responder inputs | M3 | responder inputs |
| KeyboardDisplay | | Passkey Entry: | |
| | | Responder displays, | |
| | | initiator inputs | |
+-----------------+----------------------------+---------------------+---------------------+
M1 : не подходит, поскольку не предлагает аутентификацию, защиту от прослушивания, защиту MITM.
M2 : невозможно, поскольку пароль который Инициатор отображает - это случайное число, сгенерированное в стеке iOS / Android и не может быть установлено вручную.
M3 : То же, что M2 , но в теории стек BT на периферии В конечном итоге al можно было бы пропатчить, чтобы сгенерировать «конкретное c random number».
M4 : единственный способ ввода пользовательского ключа доступа на обоих устройствах.
Android имеет BluetoothConfigManager :: setLeIoCapability метод для этой цели
import com.google.android.things.bluetooth.BluetoothConfigManager
val manager = BluetoothConfigManager.getInstance()
// Report that this device can accept keyboard user input only
manager.leIoCapability = BluetoothConfigManager.IO_CAPABILITY_IN
// TODO: Adapter needs to be restarted using BluetoothAdapter::disable() and enable()!
Возможно ли это сделать на iOS (Core Bluetooth)?
Спасибо за помощь, любые идеи!