Характеристики
Услуга быстрого сопряжения
Поставщик услуг 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 | Флаги
| варьируется | Обязательный |
| 2 - 7 | uint48 | Или:
| варьируется | Обязательный |
| 8 - 13 | uint48 | Адрес проживания ищущего в BR/EDR | варьируется | Присутствует только в том случае, если установлен бит 1 или 3 флага. |
| n - 15 | Случайное значение (соль) | варьируется | Обязательный |
Таблица 1.2.1: Исходный запрос (тип 0x00). Расшифрован из зашифрованного запроса в таблице 1.1 .
| Октет | Тип данных | Описание | Ценить | Обязательный? |
|---|---|---|---|---|
| 0 | uint8 | Тип сообщения | 0x10 = Запрос действия | Обязательный |
| 1 | uint8 | Флаги
| варьируется | Обязательный |
| 2 - 7 | uint48 | Или:
| варьируется | Обязательный |
| 8 | uint8 | Группа сообщений | варьируется | Обязательно, если установлен бит 0 флагов. |
| 9 | uint8 | Код сообщения | варьируется | Обязательно, если установлен бит 0 флагов. |
| 10 | uint8 | Зависит от флагов:
| варьируется | Обязательно, если установлен бит флага 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 | Тип сообщения | Один из:
|
| 1 - 3 | unit32 | 6-значный пароль | варьируется |
| 4 - 15 | Случайное значение (соль) | варьируется |
Таблица 2.2: Исходный блок пароля. Расшифрованная версия таблицы 2.1 .
Характеристика: Ключ учетной записи
После сопряжения устройство Fast Pair Seeker запишет ключ учетной записи поставщику Fast Pair.
| Октет | Тип данных | Описание | Ценить |
|---|---|---|---|
| 0 - 15 | uint128 | Ключ учетной записи (зашифрованный) | варьируется |
После получения запроса на запись поставщик Fast Pair должен выполнить следующие действия:
- Расшифруйте ключ учетной записи, используя общий секрет, сгенерированный на шаге 4 данной процедуры .
- Для поставщиков услуг, требующих поручительства (распространенное явление):
- Перед расшифровкой убедитесь, что общий секретный ключ был использован для расшифровки запроса пароля из шага 12. Если этот шаг не был пройден с использованием данного секретного ключа, проигнорируйте эту запись и завершите работу.
- На данном этапе общий секретный ключ ( K в процедуре) больше не будет использоваться для этой пары. Любые запросы, поступающие в зашифрованном виде с этим ключом без перезапуска процедуры, должны быть отклонены.
- Для поставщиков услуг, требующих поручительства (распространенное явление):
- Убедитесь, что расшифрованное значение начинается с
0x04или0xFF. Если это не так, проигнорируйте эту запись и завершите работу.- Если значение равно
0x04:- Проверьте, достаточно ли места в сохраненном списке ключей учетных записей для нового значения.
- В противном случае удалите из списка наименее часто используемое значение.
- Добавьте новое значение в список.
- Если значение равно
0xFF:- Рассматривайте это как временную сессию сопряжения и не выполняйте никаких операций.
- Это может произойти при использовании механизма ретроактивной записи ключей учетных записей .
- Не сохраняйте ключ и не используйте его в списке ключей учетной записи , для шифрования или вычислений MAC-адреса .
- Разъединение соединения запускается событием, специфичным для данной функции, или тайм-аутом. Для функции LE Audio Sharing настоятельно рекомендуется разъединять соединение BLE и ключ связи через 10 минут после временного разрыва сеанса.
- Если значение равно
Ключи учетных записей из списка используются при сопряжении на основе ключей .
Характеристика: Версия прошивки
Эта характеристика позволяет устройству Seeker считывать версию прошивки поставщика по мере необходимости. Оно всегда должно возвращать следующие данные:
| Октет | Тип данных | Описание | Ценить |
|---|---|---|---|
| 0 - var | utf8s | Код версии прошивки | варьируется |
Даже если у поставщика услуг установлено более одной прошивки (например, 3 прошивки для левого наушника, правого наушника и чехла), она должна быть заключена в одну строку UTF-8. Поставщик услуг также может возвращать конкретные строки для особых случаев:
status-updating : если провайдер в данный момент обновляет прошивку до новой версии. В качестве альтернативы провайдер может вернуть версию подготовленной прошивки.
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 :
|
Таблица 3.2: Исходные данные. Расшифрованы из зашифрованных данных в таблице 3.1 .
При запросе уведомления (например, запросе персонализированного имени через бит 2 в таблице 1.2.1 ) поставщик Fast Pair должен выполнить следующие действия:
- Сгенерировать криптографически случайные 8 байтов для одноразового числа (Nonce).
Зашифруйте данные с помощью 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-байтовые нули), параметр shared_secret берется на шаге 4 процедуры .
- opad — это 64-байтовый внешний заполнитель, состоящий из повторяющихся байтов со значением
0x5C. - В iPad используется 64-байтовый внутренний заполнитель, состоящий из повторяющихся байтов со значением
0x36.
Возьмите первые 8 байтов из HMAC-SHA256 в качестве префикса пакета данных .
После получения запроса на запись поставщик Fast Pair должен выполнить следующие действия:
- Проверьте целостность данных, сравнив первые 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 генерируется или определяется в процессе рукопожатия, например:
- В первом варианте именования используется ключ ECDH, и он больше не будет использоваться для этой пары. Любые запросы, поступающие в зашифрованном виде с этим ключом без перезапуска процедуры, должны быть отклонены.
- В алгоритме именования 2 используется ключ учетной записи.
Выполните операцию concat(clearBlock[0], clearBlock[1],...) для создания исходных данных.