Сервис быстрого подключения
Поставщик быстрого подключения должен реализовать сервис быстрого подключения (UUID 0xFE2C), который содержит следующие характеристики.
| Название | Зашифровано | Разрешения | UUID | Обязательно? |
|---|---|---|---|---|
| Идентификатор модели | Нет | Чтение | FE2C1233-8366-4814-8EB0-01DE32100BEA |
Обязательно |
| Подключение на основе ключа | Нет | Написать и уведомить | FE2C1234-8366-4814-8EB0-01DE32100BEA |
Обязательно |
| Ключ доступа | Нет | Написать и уведомить | FE2C1235-8366-4814-8EB0-01DE32100BEA |
Обязательно |
| Ключ аккаунта | Нет | Запись | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Обязательно |
| Дополнительные данные | Нет | Написать и уведомить | FE2C1237-8366-4814-8EB0-01DE32100BEA |
*C1 |
| Мультиплексор протоколов потока сообщений | Да | Чтение | FE2C1239-8366-4814-8EB0-01DE32100BEA |
*C2 |
| Дополнительный ключ доступа | Нет | Чтение, запись и уведомления | FE2C123A-8366-4814-8EB0-01DE32100BEA |
*C3 |
| Действие на устройстве FP | Нет | Написать и уведомить | FE2C123B-8366-4814-8EB0-01DE32100BEA |
*C4 |
Обязательно при определенных условиях
- C1: если поставщик поддерживает функцию присвоения названий и не реализует характеристику Действие устройства для быстрого подключения.
- C2: если Поставщик поддерживает поток сообщений L2CAP.
- C3: если у Поставщика есть внутренний канал связи между компонентами
- C4: если Поставщику необходимо обменяться дополнительной информацией в процессе подключения, например Поставщику без внутреннего канала связи между компонентами.
Характеристика: идентификатор модели
Эта характеристика позволяет Искателю считывать идентификатор модели по мере необходимости, когда устройство не находится в режиме обнаружения. Он всегда должен возвращать следующие данные:
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0–2 | uint24 |
Идентификатор модели | изменяется |
Характеристика: Key-based Pairing (Подключение на основе ключа)
Эта характеристика управляет процедурой подключения на основе ключа. В этой процедуре определенный уровень доверия устанавливается путем проверки того, что Искатель и Поставщик владеют общим ключом. Ключ в каждом случае разный:
Вариант 1. Общий ключ основан на паре открытого и закрытого ключей для защиты от спуфинга и собственной паре открытого и закрытого ключей Искателя, которая будет меняться при каждой попытке подключения.
- Поставщик находится в режиме подключения.
- Искатель проверяет, есть ли у Поставщика закрытый ключ для защиты от спуфинга.
Обратите внимание, что в режиме подключения поставщик может также подключаться обычным способом, например к устройству, которое не поддерживает быстрое подключение на основе ключей.
Вариант 2. Общий ключ – это один из ключей аккаунта.
- Поставщик обычно не находится в режиме подключения. (Но это не является обязательным требованием. Поставщик должен поддерживать использование ключа аккаунта даже в режиме подключения.)
- Искатель и Поставщик проверяют, что у каждого из них есть ключ аккаунта.
Поскольку оба случая очень похожи, за исключением того, какой общий ключ используется, они объединены в процедуру.
Формат данных
Подробнее о том, как использовать каждый формат…
| Октет | Тип данных | Описание | Значение | Обязательно? |
|---|---|---|---|---|
| 0–15 | uint128 |
Зашифрованный запрос | изменяется | Обязательно |
| 16–79 | Открытый ключ | изменяется | Необязательно |
Таблица 1.1. Зашифрованный запрос, записанный в характеристику Искателем.
| Октет | Тип данных | Описание | Значение | Обязательно? |
|---|---|---|---|---|
| 0 | uint8 |
Тип сообщения | 0x00 – запрос на подключение на основе ключа; |
Обязательно |
| 1 | uint8 |
Flags
|
varies | Обязательно |
| 2–7 | uint48 |
Выполните одно из следующих действий:
|
varies | Обязательно |
| 8–13 | uint48 |
Адрес BR/EDR Искателя | varies | Присутствует, только если установлен бит 1 или 3 флага. |
| n – 15 | Случайное значение (соль) | varies | Обязательно |
Таблица 1.2.1. Необработанный запрос (тип 0x00). расшифрованного из зашифрованного запроса в таблице 1.1.
| Октет | Тип данных | Описание | Значение | Обязательно? |
|---|---|---|---|---|
| 0 | uint8 |
Тип сообщения | 0x10 = запрос действия |
Обязательно |
| 1 | uint8 |
Flags
|
varies | Обязательно |
| 2–7 | uint48 |
Выполните одно из следующих действий:
|
varies | Обязательно |
| 8 | uint8 |
Групповой чат | varies | Обязательно, если установлен бит 0 флагов. |
| 9 | uint8 |
Код сообщения | varies | Обязательно, если установлен бит 0 флагов. |
| 10 | uint8 |
Зависит от флагов:
|
varies | Обязательно, если установлен бит 0 или 1 флагов. |
| 11 – n | Дополнительные данные | varies | Необязательно | |
| n – 15 | Случайное значение (соль) | varies | Обязательно |
Таблица 1.2.2. Необработанный запрос (тип 0x10). расшифрованного из зашифрованного запроса в таблице 1.1.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Тип сообщения | 0x01 – ответ на запрос о подключении на основе ключа. |
| 1–6 | uint48 |
Общедоступный адрес поставщика (BR/EDR) | varies |
| 7–15 | Случайное значение (соль) | varies |
Таблица 1.3. Необработанный ответ (тип 0x01). Зашифровано для получения зашифрованного ответа в таблице 1.4.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Тип сообщения | 0x02 = Key-based Pairing Extended Response |
| 1 | uint8 |
Flags
|
varies |
| 2 | uint8 |
Количество адресов поставщика. Допустимые значения: 1 и 2. |
varies |
| 3–8 или 3–14 |
|
varies | |
| 9–15 или 15 | Случайное значение (соль) | varies |
Таблица 1.3.2. Необработанный ответ (тип 0x02). Зашифровано для получения зашифрованного ответа в таблице 1.4.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0–15 | uint128 |
Зашифрованный ответ | varies |
Таблица 1.4. Зашифрованный ответ, отправленный Поставщиком Искателю через уведомление.
Характеристика: ключ доступа
Эта характеристика используется во время процедуры установления связи на основе ключа.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0–15 | uint128 |
Зашифрованный блок ключа доступа | varies |
Таблица 2.1. Блок зашифрованного ключа доступа. Подробную информацию вы найдете в разделе "Процедура подключения на основе ключа".
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Тип сообщения | Один из вариантов:
|
| 1–3 | unit32 |
6-значный ключ доступа | varies |
| 4–15 | Случайное значение (соль) | varies |
Таблица 2.2. Необработанный блок ключа доступа. Расшифрованная версия таблицы 2.1.
Характеристика: ключ аккаунта
После подключения с помощью быстрого подключения искатель быстрого подключения запишет ключ аккаунта на поставщике быстрого подключения.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0–15 | uint128 |
Ключ аккаунта (зашифрованный) | varies |
При получении запроса на запись поставщик быстрого подключения должен выполнить следующие действия:
- Расшифруйте ключ аккаунта с помощью общего секрета, созданного на шаге 4 процедуры.
- Для поставщиков, которым требуется страхование ответственности (распространенный случай):
- Перед расшифровкой убедитесь, что общий секретный ключ использовался для расшифровки запроса ключа доступа из шага 12. Если этот шаг не пройден с использованием этого секрета, игнорируйте эту запись и выйдите.
- На этом этапе общий секретный ключ (K в процедуре) больше не будет использоваться для этого подключения. Все запросы, зашифрованные этим ключом, должны отклоняться без перезапуска процедуры.
- Для поставщиков, которым требуется страхование ответственности (распространенный случай):
- Убедитесь, что расшифрованное значение начинается с
0x04или0xFF. Если нет, игнорируйте эту запись и выйдите.- Если значение равно
0x04:- Проверьте, есть ли в сохраненном списке ключей аккаунта место для нового значения.
- Если нет, удалите из списка значение, которое использовалось раньше всех.
- Добавьте в список новое значение.
- Если значение равно
0xFF:- Рассматривайте это как временный сеанс подключения и не выполняйте никаких действий.
- Это может произойти при ретроактивной записи ключа аккаунта.
- Не сохраняйте ключ и не используйте его в списке ключей аккаунта, шифровании или вычислениях MAC.
- Удаление связи запускается событием, связанным с функцией, или по истечении времени ожидания. Для передачи аудио по LE Audio настоятельно рекомендуется удалять привязку BLE и ключ связи через 10 минут после временного отключения сеанса.
- Если значение равно
Ключи аккаунта из списка используются при подключении на основе ключей.
Характеристика: дополнительные данные
Этот сервис должен иметь следующие характеристики.
| Характеристика сервиса быстрого подключения | Зашифровано | Разрешения | UUID |
|---|---|---|---|
| Данные | Нет | Написать и уведомить | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| Старая характеристика сервиса быстрого подключения (планируется прекратить поддержку 1 января 2021 г.) | Зашифровано | Разрешения | UUID |
|---|---|---|---|
| Данные | Нет | Написать и уведомить | 0x1237 |
Перед записью или уведомлением об этой характеристике необходимо выполнить рукопожатие через характеристику FE2C1234-8366-4814-8EB0-01DE32100BEA, чтобы получить общий секретный ключ. Для шифрования данных, передаваемых через эту характеристику, будет использоваться алгоритм AES-CTR, описанный ниже. Этот режим обеспечивает более высокий уровень безопасности для данных, которые не помещаются в один 16-байтовый блок. Для обеспечения целостности данных будет использоваться HMAC-SHA256, который также описан ниже.
| Октет | Описание | Значение |
|---|---|---|
| 0–7 | Первые 8 байт HMAC-SHA256. | varies |
| 8–15 | Nonce, используемый при шифровании AES-CTR. | varies |
| 16 – var | Зашифрованные данные. | varies |
Таблица 3.1. Пакет данных, отправленный Поставщиком Искателю через уведомление или Искателем Поставщику через запись.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 – var | byte array |
Данные | varies, декодируйте его в соответствии с идентификатором данных из таблицы 1.2.2:
|
Таблица 3.2. Первичные данные. Расшифровано из зашифрованных данных в таблице 3.1.
Если запрашивается уведомление (например, запрашивается персонализированное имя через бит 2 в таблице 1.2.1), поставщик быстрого подключения должен выполнить следующие действия:
- Сгенерируйте криптографически случайные 8 байт для одноразового кода.
Зашифруйте данные с помощью алгоритма AES-CTR, в котором каждый 16-байтовый блок генерируется с использованием
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))где
- Ключ AES – это общий секретный ключ, полученный на шаге 4 процедуры.
- clearBlock[i] – это 16-байтовый блок, начинающийся с data[i * 16]. Последний блок может быть меньше 16 байтов.
Выполните операцию concat(encryptedBlock[0], encryptedBlock[1],...), чтобы создать зашифрованные данные.
Сгенерируйте HMAC-SHA256 с помощью
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))где
- K генерируется с помощью concat(shared_secret, 48-byte ZEROs), где shared_secret – это общий секретный ключ, полученный на шаге 4 процедуры.
- opad – внешнее дополнение размером 64 байта, состоящее из повторяющихся байтов со значением
0x5C. - ipad – это внутреннее дополнение размером 64 байта, состоящее из повторяющихся байтов со значением
0x36.
Возьмите первые 8 байт из HMAC-SHA256 в качестве префикса пакета данных.
При получении запроса на запись поставщик быстрого подключения должен выполнить следующие действия:
- Проверьте целостность данных, посмотрев первые 8 байтов HMAC-SHA256.
Расшифруйте зашифрованные данные с помощью алгоритма AES-CTR, в котором каждый блок генерируется с использованием
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))где
- encryptedBlock[i] – это 16-байтовый блок, начинающийся с encrypted_data[i * 16]. Последний блок может быть меньше 16 байтов.
- Ключ AES генерируется или определяется на основе рукопожатия, например:
- в процессе присвоения имени 1, оно получено от ECDH и не будет использоваться снова для этого сопряжения. Любые запросы, зашифрованные этим ключом, должны отклоняться без перезапуска процедуры.
- а в варианте 2 – ключ аккаунта.
Выполните concat(clearBlock[0], clearBlock[1],...), чтобы создать первичные данные.
Характеристика: PSM потока сообщений
Подробнее об устройствах BLE и мультиплексоре протоколов и сервисов для потока сообщений…
Характеристика: дополнительный ключ доступа
См. раздел Устройство BLE: дополнительный ключ доступа.
Характеристика: действие с устройством FP
| Характеристика сервиса быстрого подключения | Зашифровано | Разрешения | UUID |
|---|---|---|---|
| Действие на устройстве FP | Нет | Написать и уведомить | FE2C123B-8366-4814-8EB0-01DE32100BEA |
| Октет | Описание | Значение |
|---|---|---|
| 0–7 | Первые 8 байт HMAC-SHA256. | varies |
| 8–15 | Nonce, используемый при шифровании AES-CTR. | varies |
| 16 – var | Зашифрованные данные. | varies |
Таблица 4.1. Пакет данных, отправляемый поставщиком искателю в качестве уведомления или искателем поставщику в качестве записи.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 – var | byte array |
Запрос действия | Один из следующих вариантов:
|
Таблица 4.2. Первичные данные. Расшифровывается из зашифрованных данных в таблице 4.1, отправленных Искателем Поставщику в виде записи.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 – var | byte array |
Ответ на действие | Один из следующих вариантов:
|
Таблица 4.3. Первичные данные. Расшифровывается из зашифрованных данных в таблице 4.1, отправленной Поставщиком Искателю в качестве уведомления.
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Идентификатор действия | 0x01 |
| 1 – var | utf8s |
Персонализированное имя | изменяется |
Таблица 4.3.1. Формат персонализированного имени
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Идентификатор действия | 0x02 |
| 1 | uint8 |
Тип участника скоординированного набора для быстрого подключения |
|
| 2 | uint8 |
Количество в наборе | количество компонентов |
| 3 | uint8 |
Задать тип ключа для идентификации | 0x01 (обычный текст SIRK) |
| 4–19 | uint128 |
Задать значение ключа для идентификации | 16-байтовые данные, см. Coordinated Set Identification Service |
Таблица 4.3.2. Формат информации о скоординированном наборе
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 | uint8 |
Идентификатор действия | 0x03 |
| 1–2 | uint16 |
Функции устройств |
|
Таблица 4.3.3. Формат функций устройств
Операции быстрого подключения
Для этой характеристики определены две основные операции:
- Чтение данных при быстром подключении. Чтение данных с устройства-поставщика.
- Искатель: включение уведомлений GATT
- Поставщик: уведомление GATT зарегистрировано
- Устройство, выполняющее поиск: запрос на запись GATT, первичные данные содержат только
Action ID - Поставщик: ответ на запись GATT
- Поставщик: GATT Notify, первичные данные содержат
- Идентификатор действия
- Данные для идентификатора действия
- Искатель: получено уведомление GATT
- Запись данных при быстром подключении. Запись данных на устройство поставщика.
- Искатель: запрос на запись GATT, первичные данные содержат
- Идентификатор действия
- Данные для идентификатора действия
- Поставщик: ответ GATT Write
- Искатель: запрос на запись GATT, первичные данные содержат
Идентификатор поддерживаемого действия чтения для быстрого подключения
- 0x01 (персонализированное название)
- 0x02 (информация о скоординированном наборе)
- 0x03 (функции устройства)
Идентификатор поддерживаемого действия для записи в рамках быстрого подключения
- 0x01 (персонализированное название)
- Для любых других команд, в которых за идентификатором действия в запросе на запись следуют данные, Поставщик должен отправить уведомление GATT, содержащее код 0x81 (недопустимый запрос), как описано в таблице 4.3.
Если Поставщик не распознает идентификатор действия, он отправляет уведомление GATT с кодом Unsupported Request (0x80), как описано в таблице 4.3.
Алгоритм шифрования
При получении запроса на уведомление поставщик быстрого подключения должен выполнить следующие действия:
- Сгенерируйте криптографически случайные 8 байт для одноразового кода.
Зашифруйте данные с помощью алгоритма AES-CTR, в котором каждый 16-байтовый блок генерируется с использованием
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))где
- Ключ AES – это общий секретный ключ, полученный на шаге 4 процедуры.
clearBlock[i]– это 16-байтовый блок, начинающийся сdata[i * 16]. Последний блок может быть меньше 16 байтов.
Выполните
concat(encryptedBlock[0], encryptedBlock[1],...), чтобы создать зашифрованные данные.Сгенерируйте HMAC-SHA256 с помощью
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))где
- K генерируется с помощью concat(shared_secret, 48-byte ZEROs), где shared_secret – это общий секретный ключ, полученный на шаге 4 процедуры.
- opad – внешнее дополнение размером 64 байта, состоящее из повторяющихся байтов со значением
0x5C. - ipad – это внутреннее дополнение размером 64 байта, состоящее из повторяющихся байтов со значением
0x36.
Возьмите первые 8 байт из HMAC-SHA256 в качестве префикса пакета данных.
При получении запроса на запись поставщик быстрого подключения должен выполнить следующие действия:
- Проверьте целостность данных, посмотрев первые 8 байтов HMAC-SHA256.
Расшифруйте зашифрованные данные с помощью алгоритма AES-CTR, в котором каждый блок генерируется с использованием
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))где
encryptedBlock[i]– это 16-байтовый блок, начинающийся сencrypted_data[i * 16]. Последний блок может быть меньше 16 байтов.- Ключ AES генерируется или определяется на основе рукопожатия, например:
- в процессе присвоения имени 1, оно получено от ECDH и не будет использоваться снова для этого сопряжения. Любые запросы, зашифрованные этим ключом, должны отклоняться без перезапуска процедуры.
- а в варианте 2 – ключ аккаунта.
Выполните
concat(clearBlock[0], clearBlock[1],...), чтобы создать первичные данные.
Сервис информации об устройстве
Поставщик быстрого подключения также должен поддерживать сервис информации об устройстве (UUID 0x180A). Устройство, запрашивающее быстрое подключение, использует следующие характеристики.
| Название | Зашифровано | Разрешения | UUID |
|---|---|---|---|
| Версия встроенного ПО | Нет | Чтение | 0x2A26 |
Характеристика: версия встроенного ПО
Эта характеристика позволяет Искателю при необходимости считывать версию встроенного ПО Поставщика. Он должен возвращать следующие данные:
| Октет | Тип данных | Описание | Значение |
|---|---|---|---|
| 0 – var | utf8s |
Код версии встроенного ПО | varies |
Она должна быть инкапсулирована в одну строку UTF-8, даже если у Поставщика несколько встроенных ПО (например, три встроенных ПО для левого наушника, правого наушника и чехла). Поставщик также может возвращать определенные строки для особых случаев:
status-updating – поставщик обновляет встроенное ПО. В качестве альтернативы Поставщик может вернуть версию подготовленного встроенного ПО.
status-abnormal – если поставщик находится в аномальном состоянии. Например, он неисправен, потому что не удалось обновить встроенное ПО. В этом случае Seeker покажет сообщение о том, что его нужно обновить.
Поставщик должен ограничить доступ к характеристике версии встроенного ПО, чтобы предотвратить отслеживание устройств. Рекомендуемые ограничения:
- У связанных устройств должен быть доступ в любое время.
- любое устройство должно иметь доступ, когда поставщик обнаруживается
Если поставщик поддерживает Find Hub, требуется дополнительная реализация. Подробнее об обновлениях встроенного ПО Портала поиска…