Характеристики
Служба быстрого сопряжения
Поставщик быстрого соединения должен иметь следующую услугу GATT.
Услуга | UUID |
---|---|
Служба быстрого сопряжения | 0xFE2C |
Эта услуга должна иметь следующие характеристики.
Характеристики службы быстрого сопряжения | Зашифрованный | Разрешения | UUID |
---|---|---|---|
Идентификатор модели | Нет | Читать | FE2C1233-8366-4814-8EB0-01DE32100BEA |
Сопряжение на основе ключей | Нет | Напишите и сообщите | FE2C1234-8366-4814-8EB0-01DE32100BEA |
Ключ доступа | Нет | Напишите и сообщите | FE2C1235-8366-4814-8EB0-01DE32100BEA |
Ключ учетной записи | Нет | Писать | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Информационная служба устройства
Поставщик быстрого соединения также должен поддерживать службу информации об устройствах.
Услуга | 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. |
н - 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 - н | Дополнительные данные | варьируется | Необязательный | |
н - 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 .
Характеристика: Ключ учетной записи
После сопряжения искатель быстрого сопряжения запишет ключ учетной записи поставщику быстрого сопряжения.
Октет | Тип данных | Описание | Ценить |
---|---|---|---|
0–15 | uint128 | Ключ учетной записи (зашифрованный) | варьируется |
После получения запроса на запись поставщик быстрого соединения должен сделать следующее:
- Расшифруйте ключ учетной записи, используя общий секрет, созданный на шаге 4 процедуры .
- Для провайдеров, которым требуется соединение (обычное):
- Перед расшифровкой убедитесь, что общий секрет использовался для расшифровки запроса ключа доступа, полученного на шаге 12. Если этот шаг не был пройден с использованием этого секрета, проигнорируйте эту запись и выйдите.
- На этом этапе общий секрет ( K в процедуре) больше не будет использоваться для этого соединения. Любые запросы, которые поступают зашифрованными с помощью этого ключа без перезапуска процедуры, должны быть отклонены.
- Для провайдеров, которым требуется соединение (обычное):
- Убедитесь, что расшифрованное значение начинается с
0x04
. Если это не так, проигнорируйте эту запись и выйдите. - Проверьте, есть ли в сохраненном списке ключей учетной записи место для нового значения.
- Если нет, удалите из списка последнее использованное значение.
- Добавьте новое значение в список.
Ключи учетной записи в списке используются во время сопряжения на основе ключей .
Характеристика: Версия прошивки
Эта характеристика позволяет Искателю считывать версию прошивки Провайдера по мере необходимости. Он всегда должен возвращать следующие данные:
Октет | Тип данных | Описание | Ценить |
---|---|---|---|
0 - вар | utf8s | Код версии прошивки | варьируется |
Его следует инкапсулировать в одну строку utf8, даже если у поставщика имеется более одной прошивки (например, 3 прошивки для левого наушника, правого наушника и корпуса). Поставщик также может возвращать определенные строки для особых случаев:
status-updating : если провайдер в данный момент обновляется до новой прошивки. Альтернативно, Поставщик может вернуть версию установленной прошивки.
status-abnormal : если Провайдер находится в ненормальном состоянии. Например, он неисправен из-за сбоя обновления прошивки. Это значение приведет к тому, что Seeker покажет сообщение, сообщающее пользователю, что его необходимо обновить сейчас.
Поставщик должен ограничить доступ к характеристике версии прошивки, чтобы предотвратить отслеживание устройства. Предлагаемые ограничения:
- подключенные устройства должны иметь доступ в любое время
- любое устройство должно иметь доступ, когда поставщик доступен для обнаружения
Характеристика: Дополнительные данные
Эта услуга должна иметь следующую характеристику.
Характеристики службы быстрого сопряжения | Зашифрованный | Разрешения | 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. | варьируется |
8–15 | Nonce, используемый шифрованием AES-CTR. | варьируется |
16 - вар | Зашифрованные данные. | варьируется |
Таблица 3.1: Пакет данных, отправленный Поставщиком Искателю через уведомление или отправленный Искателем Поставщику посредством записи.
Октет | Тип данных | Описание | Ценить |
---|---|---|---|
0 - вар | byte array | Данные | варьируется , декодируйте его в соответствии с идентификатором данных таблицы 1.2.2 :
|
Таблица 3.2: Исходные данные. Расшифровано из зашифрованных данных в таблице 3.1 .
Когда запрашивается уведомление (например, запросить персонализированное имя через бит 2 в таблице 1.2.1 ), поставщик быстрого соединения должен сделать следующее:
- Сгенерируйте криптографически случайные 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-байтовые НУЛИ), общий_секрет берется из шага 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],...) для создания необработанных данных.