Характеристики

Услуга быстрого сопряжения

Поставщик услуг Fast Pair должен предоставлять следующие услуги в соответствии с ГАТТ.

Услуга UUID
Услуга быстрого сопряжения 0xFE2C

Данная услуга должна обладать следующими характеристиками.

Характеристика услуги быстрого сопряжения Зашифровано Разрешения UUID
Идентификатор модели Нет Читать FE2C1233-8366-4814-8EB0-01DE32100BEA
Сопряжение на основе ключей Нет Напишите и уведомите FE2C1234-8366-4814-8EB0-01DE32100BEA
Ключ доступа Нет Напишите и уведомите FE2C1235-8366-4814-8EB0-01DE32100BEA
Ключ учетной записи Нет Писать FE2C1236-8366-4814-8EB0-01DE32100BEA

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

Поставщик Fast Pair также должен поддерживать службу информации об устройстве.

Услуга UUID
Служба информации об устройстве 0x180A

Система Fast Pair Seeker использует следующие характеристики.

Имя Зашифровано Разрешения UUID
Версия прошивки Нет Читать 0x2A26

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

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

Октет Тип данных Описание Ценить
0 - 2 uint24 Идентификатор модели варьируется

Характеристика: Сопряжение на основе ключей

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

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

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

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

  • Случай 2: Предварительно согласованный ключ является одним из ключей учетной записи .

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

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

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

См. порядок использования каждого формата.

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

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

Октет Тип данных Описание Ценить Обязательный?
0 uint8 Тип сообщения 0x00 = Запрос на сопряжение на основе ключа Обязательный
1 uint8 Флаги
  • Бит 0 (старший бит): устарел и игнорируется программой Seeker.
  • Бит 1: 1, если Заявитель запрашивает у Поставщика инициирование обеспечения, и этот запрос содержит адрес BR/EDR Заявителя. 0 в противном случае.
  • Бит 2: 1, если Запрашивающий запрашивает у Поставщика уведомление о существующем имени. 0 в противном случае.
  • Бит 3: 1, если это необходимо для ретроактивной записи ключа учетной записи . 0 в противном случае.
  • Биты 4–7 зарезервированы для будущего использования и будут игнорироваться.
варьируется Обязательный
2 - 7 uint48 Или:
  • Текущий BLE-адрес поставщика
  • публичный адрес поставщика услуг
варьируется Обязательный
8 - 13 uint48 Адрес проживания ищущего в BR/EDR варьируется Присутствует только в том случае, если установлен бит 1 или 3 флага.
n - 15 Случайное значение (соль) варьируется Обязательный

Таблица 1.2.1: Исходный запрос (тип 0x00). Расшифрован из зашифрованного запроса в таблице 1.1 .

Октет Тип данных Описание Ценить Обязательный?
0 uint8 Тип сообщения 0x10 = Запрос действия Обязательный
1 uint8 Флаги варьируется Обязательный
2 - 7 uint48 Или:
  • Текущий BLE-адрес поставщика
  • публичный адрес поставщика услуг
варьируется Обязательный
8 uint8 Группа сообщений варьируется Обязательно, если установлен бит 0 флагов.
9 uint8 Код сообщения варьируется Обязательно, если установлен бит 0 флагов.
10 uint8 Зависит от флагов:
  • Установлен бит 0: дополнительная длина данных, менее 6.
  • Бит 1 установлен: Идентификатор данных
варьируется Обязательно, если установлен бит флага 0 или 1.
11 - н Дополнительные данные варьируется Необязательный
n - 15 Случайное значение (соль) варьируется Обязательный

Таблица 1.2.2: Исходный запрос (тип 0x10). Расшифрован из зашифрованного запроса в таблице 1.1 .

Октет Тип данных Описание Ценить
0 uint8 Тип сообщения 0x01 = Ответ на сопряжение на основе ключа
1 - 6 uint48 Публичный адрес поставщика услуг (BR/EDR) варьируется
7 - 15 Случайное значение (соль) варьируется

Таблица 1.3: Исходный ответ. Зашифрован для получения зашифрованного ответа, представленного в таблице 1.4 .

Октет Тип данных Описание Ценить
0 -15 uint128 Зашифрованный ответ варьируется

Таблица 1.4: Зашифрованный ответ, отправленный Поставщиком Ищущему через уведомление.

Характеристика: Код доступа

Эта характеристика используется в процессе сопряжения на основе ключей .

Октет Тип данных Описание Ценить
0 - 15 uint128 Зашифрованный блок ключа доступа варьируется

Таблица 2.1: Зашифрованный блок пароля. См. процедуру сопряжения на основе ключей для получения информации об использовании.

Октет Тип данных Описание Ценить
0 uint8 Тип сообщения Один из:
  • 0x02 = Пароль искателя
  • 0x03 = Пароль поставщика
1 - 3 unit32 6-значный пароль варьируется
4 - 15 Случайное значение (соль) варьируется

Таблица 2.2: Исходный блок пароля. Расшифрованная версия таблицы 2.1 .

Характеристика: Ключ учетной записи

После сопряжения устройство Fast Pair Seeker запишет ключ учетной записи поставщику Fast Pair.

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

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

  1. Расшифруйте ключ учетной записи, используя общий секрет, сгенерированный на шаге 4 данной процедуры .
    • Для поставщиков услуг, требующих поручительства (распространенное явление):
      • Перед расшифровкой убедитесь, что общий секретный ключ был использован для расшифровки запроса пароля из шага 12. Если этот шаг не был пройден с использованием данного секретного ключа, проигнорируйте эту запись и завершите работу.
    • На данном этапе общий секретный ключ ( K в процедуре) больше не будет использоваться для этой пары. Любые запросы, поступающие в зашифрованном виде с этим ключом без перезапуска процедуры, должны быть отклонены.
  2. Убедитесь, что расшифрованное значение начинается с 0x04 или 0xFF . Если это не так, проигнорируйте эту запись и завершите работу.
    • Если значение равно 0x04 :
      • Проверьте, достаточно ли места в сохраненном списке ключей учетных записей для нового значения.
      • В противном случае удалите из списка наименее часто используемое значение.
      • Добавьте новое значение в список.
    • Если значение равно 0xFF :
      • Рассматривайте это как временную сессию сопряжения и не выполняйте никаких операций.
      • Это может произойти при использовании механизма ретроактивной записи ключей учетных записей .
      • Не сохраняйте ключ и не используйте его в списке ключей учетной записи , для шифрования или вычислений MAC-адреса .
      • Разъединение соединения запускается событием, специфичным для данной функции, или тайм-аутом. Для функции LE Audio Sharing настоятельно рекомендуется разъединять соединение BLE и ключ связи через 10 минут после временного разрыва сеанса.

Ключи учетных записей из списка используются при сопряжении на основе ключей .

Характеристика: Версия прошивки

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

Октет Тип данных Описание Ценить
0 - var utf8s Код версии прошивки варьируется

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

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

  2. status-abnormal : если провайдер находится в ненормальном состоянии. Например, он вышел из строя из-за неудачного обновления прошивки. Это значение заставит Seeker отобразить сообщение о необходимости обновления.

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

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

Характеристика: Дополнительные данные

Данная услуга должна обладать следующими характеристиками.

Характеристика услуги быстрого сопряжения Зашифровано Разрешения UUID
Данные Нет Напишите и уведомите FE2C1237-8366-4814-8EB0-01DE32100BEA
Старая характеристика сервиса Fast Pair (планируется прекратить поддержку с 1 января 2021 г.) Зашифровано Разрешения UUID
Данные Нет Напишите и уведомите 0x1237

Перед записью или отправкой уведомления по этому параметру необходимо выполнить процедуру установления соединения через параметр FE2C1234-8366-4814-8EB0-01DE32100BEA для получения общего секрета. Для шифрования данных, передаваемых через этот параметр, будет использоваться AES-CTR, алгоритм которого описан ниже. Этот режим обеспечивает более высокую безопасность для данных, выходящих за рамки одного 16-байтового блока. Для обеспечения целостности данных будет использоваться HMAC-SHA256, алгоритм которого также описан ниже.

Октет Описание Ценить
0 - 7 Первые 8 байтов HMAC-SHA256. варьируется
8 - 15 Nonce, используемый в алгоритмах шифрования AES-CTR. варьируется
16 - вар Зашифрованные данные. варьируется

Таблица 3.1: Пакет данных, отправленный Провайдером Ищущему пользователю посредством уведомления или отправленный Ищущим пользователем Провайдеру посредством записи.

Октет Тип данных Описание Ценить
0 - var byte array Данные Различается , расшифруйте его в соответствии с идентификатором данных из таблицы 1.2.2 :
  • 0x01 (персональное имя): utf8s

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

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

  1. Сгенерировать криптографически случайные 8 байтов для одноразового числа (Nonce).
  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-байтовые нули), параметр shared_secret берется на шаге 4 процедуры .
    2. opad — это 64-байтовый внешний заполнитель, состоящий из повторяющихся байтов со значением 0x5C .
    3. В iPad используется 64-байтовый внутренний заполнитель, состоящий из повторяющихся байтов со значением 0x36 .
  5. Возьмите первые 8 байтов из HMAC-SHA256 в качестве префикса пакета данных .

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

  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. В первом варианте именования используется ключ ECDH, и он больше не будет использоваться для этой пары. Любые запросы, поступающие в зашифрованном виде с этим ключом без перезапуска процедуры, должны быть отклонены.
      2. В алгоритме именования 2 используется ключ учетной записи.
  3. Выполните операцию concat(clearBlock[0], clearBlock[1],...) для создания исходных данных.