Сервис быстрого подключения

Поставщик быстрого подключения должен реализовать сервис быстрого подключения (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

Обязательно при определенных условиях

Характеристика: идентификатор модели

Эта характеристика позволяет Искателю считывать идентификатор модели по мере необходимости, когда устройство не находится в режиме обнаружения. Он всегда должен возвращать следующие данные:

Октет Тип данных Описание Значение
0–2 uint24 Идентификатор модели изменяется

Характеристика: Key-based Pairing (Подключение на основе ключа)

Эта характеристика управляет процедурой подключения на основе ключа. В этой процедуре определенный уровень доверия устанавливается путем проверки того, что Искатель и Поставщик владеют общим ключом. Ключ в каждом случае разный:

  • Вариант 1. Общий ключ основан на паре открытого и закрытого ключей для защиты от спуфинга и собственной паре открытого и закрытого ключей Искателя, которая будет меняться при каждой попытке подключения.

    • Поставщик находится в режиме подключения.
    • Искатель проверяет, есть ли у Поставщика закрытый ключ для защиты от спуфинга.

    Обратите внимание, что в режиме подключения поставщик может также подключаться обычным способом, например к устройству, которое не поддерживает быстрое подключение на основе ключей.

  • Вариант 2. Общий ключ – это один из ключей аккаунта.

    • Поставщик обычно не находится в режиме подключения. (Но это не является обязательным требованием. Поставщик должен поддерживать использование ключа аккаунта даже в режиме подключения.)
    • Искатель и Поставщик проверяют, что у каждого из них есть ключ аккаунта.

Поскольку оба случая очень похожи, за исключением того, какой общий ключ используется, они объединены в процедуру.

Формат данных

Подробнее о том, как использовать каждый формат…

Октет Тип данных Описание Значение Обязательно?
0–15 uint128 Зашифрованный запрос изменяется Обязательно
16–79 Открытый ключ изменяется Необязательно

Таблица 1.1. Зашифрованный запрос, записанный в характеристику Искателем.

Октет Тип данных Описание Значение Обязательно?
0 uint8 Тип сообщения 0x00 – запрос на подключение на основе ключа; Обязательно
1 uint8 Flags
  • Бит 0 (MSB): устарел и игнорируется Seeker.
  • Бит 1: 1, если Искатель запрашивает, чтобы Поставщик инициировал связывание, и этот запрос содержит адрес BR/EDR Искателя. В противном случае возвращается значение 0.
  • Бит 2: 1, если Искатель запрашивает, чтобы Поставщик сообщил существующее название. В противном случае возвращается значение 0.
  • Бит 3: 1, если это ретроактивная запись ключа аккаунта. В противном случае возвращается значение 0.
  • Бит 4: 1, если Искатель поддерживает устройство BLE. В противном случае возвращается значение 0.
  • Бит 5: 1, если Искатель поддерживает LE Audio. В противном случае возвращается значение 0.
  • Биты 6–7 зарезервированы для использования в будущем и должны игнорироваться.
varies Обязательно
2–7 uint48 Выполните одно из следующих действий:
  • Текущий BLE-адрес поставщика
  • Адрес поставщика идентификационной информации
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 Выполните одно из следующих действий:
  • Текущий BLE-адрес поставщика
  • Адрес поставщика идентификационной информации
varies Обязательно
8 uint8 Групповой чат varies Обязательно, если установлен бит 0 флагов.
9 uint8 Код сообщения varies Обязательно, если установлен бит 0 флагов.
10 uint8 Зависит от флагов:
  • Бит 0 установлен: длина дополнительных данных меньше 6.
  • Бит 1: идентификатор данных.
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
  • Бит 0 (MSB): 1, если поставщик – устройство только с LE, в противном случае – 0. Если для бита 0 задано значение 1, Искатель будет считать, что для бита 1 задано значение 1.
  • Бит 1: 1, если поставщик предпочитает привязку LE, в противном случае – 0.
  • Бит 2: 1, если тип второго адреса – случайный, 0, если общедоступный.
  • Биты 3–7 зарезервированы для использования в будущем и должны игнорироваться.
varies
2 uint8 Количество адресов поставщика.
Допустимые значения: 1 и 2.
varies
3–8 или
3–14
  • Первый адрес должен быть идентификационным адресом основного устройства и поддерживать связывание, если предпочтительно связывание BR/EDR.
  • Второй адрес должен быть связываемым адресом дополнительного устройства, если оно доступно.
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 Тип сообщения Один из вариантов:
  • 0x02 = ключ доступа Искателя
  • 0x03 – ключ доступа поставщика.
1–3 unit32 6-значный ключ доступа varies
4–15 Случайное значение (соль) varies

Таблица 2.2. Необработанный блок ключа доступа. Расшифрованная версия таблицы 2.1.

Характеристика: ключ аккаунта

После подключения с помощью быстрого подключения искатель быстрого подключения запишет ключ аккаунта на поставщике быстрого подключения.

Октет Тип данных Описание Значение
0–15 uint128 Ключ аккаунта (зашифрованный) varies

При получении запроса на запись поставщик быстрого подключения должен выполнить следующие действия:

  1. Расшифруйте ключ аккаунта с помощью общего секрета, созданного на шаге 4 процедуры.
    • Для поставщиков, которым требуется страхование ответственности (распространенный случай):
      • Перед расшифровкой убедитесь, что общий секретный ключ использовался для расшифровки запроса ключа доступа из шага 12. Если этот шаг не пройден с использованием этого секрета, игнорируйте эту запись и выйдите.
    • На этом этапе общий секретный ключ (K в процедуре) больше не будет использоваться для этого подключения. Все запросы, зашифрованные этим ключом, должны отклоняться без перезапуска процедуры.
  2. Убедитесь, что расшифрованное значение начинается с 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:
  • 0x01 (персонализированное название): utf8s

Таблица 3.2. Первичные данные. Расшифровано из зашифрованных данных в таблице 3.1.

Если запрашивается уведомление (например, запрашивается персонализированное имя через бит 2 в таблице 1.2.1), поставщик быстрого подключения должен выполнить следующие действия:

  1. Сгенерируйте криптографически случайные 8 байт для одноразового кода.
  2. Зашифруйте данные с помощью алгоритма AES-CTR, в котором каждый 16-байтовый блок генерируется с использованием

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    где

    1. Ключ AES – это общий секретный ключ, полученный на шаге 4 процедуры.
    2. clearBlock[i] – это 16-байтовый блок, начинающийся с data[i * 16]. Последний блок может быть меньше 16 байтов.
  3. Выполните операцию concat(encryptedBlock[0], encryptedBlock[1],...), чтобы создать зашифрованные данные.

  4. Сгенерируйте HMAC-SHA256 с помощью

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    где

    1. K генерируется с помощью concat(shared_secret, 48-byte ZEROs), где shared_secret – это общий секретный ключ, полученный на шаге 4 процедуры.
    2. opad – внешнее дополнение размером 64 байта, состоящее из повторяющихся байтов со значением 0x5C.
    3. ipad – это внутреннее дополнение размером 64 байта, состоящее из повторяющихся байтов со значением 0x36.
  5. Возьмите первые 8 байт из HMAC-SHA256 в качестве префикса пакета данных.

При получении запроса на запись поставщик быстрого подключения должен выполнить следующие действия:

  1. Проверьте целостность данных, посмотрев первые 8 байтов HMAC-SHA256.
  2. Расшифруйте зашифрованные данные с помощью алгоритма AES-CTR, в котором каждый блок генерируется с использованием

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    где

    1. encryptedBlock[i] – это 16-байтовый блок, начинающийся с encrypted_data[i * 16]. Последний блок может быть меньше 16 байтов.
    2. Ключ AES генерируется или определяется на основе рукопожатия, например:
      1. в процессе присвоения имени 1, оно получено от ECDH и не будет использоваться снова для этого сопряжения. Любые запросы, зашифрованные этим ключом, должны отклоняться без перезапуска процедуры.
      2. а в варианте 2 – ключ аккаунта.
  3. Выполните 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 Запрос действия Один из следующих вариантов:
  • Чтение персонализированного названия, 0x01
  • Write Personalized Name, см. таблицу 4.3.1
  • Чтение информации о скоординированном наборе, 0x02
  • Чтение функций устройства, 0x03

Таблица 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 Тип участника скоординированного набора для быстрого подключения
  • 0x00: левый компонент
  • 0x01: правый компонент
2 uint8 Количество в наборе количество компонентов
3 uint8 Задать тип ключа для идентификации 0x01 (обычный текст SIRK)
4–19 uint128 Задать значение ключа для идентификации 16-байтовые данные, см. Coordinated Set Identification Service

Таблица 4.3.2. Формат информации о скоординированном наборе

Октет Тип данных Описание Значение
0 uint8 Идентификатор действия 0x03
1–2 uint16 Функции устройств
  • Биты 0–15: зарезервированы, должно быть установлено значение 0.

Таблица 4.3.3. Формат функций устройств

Операции быстрого подключения

Для этой характеристики определены две основные операции:

  • Чтение данных при быстром подключении. Чтение данных с устройства-поставщика.
    1. Искатель: включение уведомлений GATT
    2. Поставщик: уведомление GATT зарегистрировано
    3. Устройство, выполняющее поиск: запрос на запись GATT, первичные данные содержат только Action ID
    4. Поставщик: ответ на запись GATT
    5. Поставщик: GATT Notify, первичные данные содержат
      • Идентификатор действия
      • Данные для идентификатора действия
    6. Искатель: получено уведомление GATT
  • Запись данных при быстром подключении. Запись данных на устройство поставщика.
    1. Искатель: запрос на запись GATT, первичные данные содержат
      • Идентификатор действия
      • Данные для идентификатора действия
    2. Поставщик: ответ GATT Write

Идентификатор поддерживаемого действия чтения для быстрого подключения

  • 0x01 (персонализированное название)
  • 0x02 (информация о скоординированном наборе)
  • 0x03 (функции устройства)

Идентификатор поддерживаемого действия для записи в рамках быстрого подключения

Если Поставщик не распознает идентификатор действия, он отправляет уведомление GATT с кодом Unsupported Request (0x80), как описано в таблице 4.3.

Алгоритм шифрования

При получении запроса на уведомление поставщик быстрого подключения должен выполнить следующие действия:

  1. Сгенерируйте криптографически случайные 8 байт для одноразового кода.
  2. Зашифруйте данные с помощью алгоритма AES-CTR, в котором каждый 16-байтовый блок генерируется с использованием

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    где

    1. Ключ AES – это общий секретный ключ, полученный на шаге 4 процедуры.
    2. clearBlock[i] – это 16-байтовый блок, начинающийся с data[i * 16]. Последний блок может быть меньше 16 байтов.
  3. Выполните concat(encryptedBlock[0], encryptedBlock[1],...), чтобы создать зашифрованные данные.

  4. Сгенерируйте HMAC-SHA256 с помощью

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    где

    1. K генерируется с помощью concat(shared_secret, 48-byte ZEROs), где shared_secret – это общий секретный ключ, полученный на шаге 4 процедуры.
    2. opad – внешнее дополнение размером 64 байта, состоящее из повторяющихся байтов со значением 0x5C.
    3. ipad – это внутреннее дополнение размером 64 байта, состоящее из повторяющихся байтов со значением 0x36.
  5. Возьмите первые 8 байт из HMAC-SHA256 в качестве префикса пакета данных.

При получении запроса на запись поставщик быстрого подключения должен выполнить следующие действия:

  1. Проверьте целостность данных, посмотрев первые 8 байтов HMAC-SHA256.
  2. Расшифруйте зашифрованные данные с помощью алгоритма AES-CTR, в котором каждый блок генерируется с использованием

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    где

    1. encryptedBlock[i] – это 16-байтовый блок, начинающийся с encrypted_data[i * 16]. Последний блок может быть меньше 16 байтов.
    2. Ключ AES генерируется или определяется на основе рукопожатия, например:
      1. в процессе присвоения имени 1, оно получено от ECDH и не будет использоваться снова для этого сопряжения. Любые запросы, зашифрованные этим ключом, должны отклоняться без перезапуска процедуры.
      2. а в варианте 2 – ключ аккаунта.
  3. Выполните concat(clearBlock[0], clearBlock[1],...), чтобы создать первичные данные.

Сервис информации об устройстве

Поставщик быстрого подключения также должен поддерживать сервис информации об устройстве (UUID 0x180A). Устройство, запрашивающее быстрое подключение, использует следующие характеристики.

Название Зашифровано Разрешения UUID
Версия встроенного ПО Нет Чтение 0x2A26

Характеристика: версия встроенного ПО

Эта характеристика позволяет Искателю при необходимости считывать версию встроенного ПО Поставщика. Он должен возвращать следующие данные:

Октет Тип данных Описание Значение
0 – var utf8s Код версии встроенного ПО varies

Она должна быть инкапсулирована в одну строку UTF-8, даже если у Поставщика несколько встроенных ПО (например, три встроенных ПО для левого наушника, правого наушника и чехла). Поставщик также может возвращать определенные строки для особых случаев:

  1. status-updating – поставщик обновляет встроенное ПО. В качестве альтернативы Поставщик может вернуть версию подготовленного встроенного ПО.

  2. status-abnormal – если поставщик находится в аномальном состоянии. Например, он неисправен, потому что не удалось обновить встроенное ПО. В этом случае Seeker покажет сообщение о том, что его нужно обновить.

Поставщик должен ограничить доступ к характеристике версии встроенного ПО, чтобы предотвратить отслеживание устройств. Рекомендуемые ограничения:

  • У связанных устройств должен быть доступ в любое время.
  • любое устройство должно иметь доступ, когда поставщик обнаруживается

Если поставщик поддерживает Find Hub, требуется дополнительная реализация. Подробнее об обновлениях встроенного ПО Портала поиска…