蓝牙持久性数据架构

Fuchsia 蓝牙子系统保留任何已成功建立的对等设备的绑定信息 进行连接。绑定信息 包括密钥配对(例如加密密钥)以及用于 建立连接

永久性绑定存储由 bt-gap 组件。该数据使用 stash 库。持久化数据有两种:主机数据和 绑定数据。

JSON 架构

核心蓝牙系统以 JSON 格式存储其持久化数据。本部分介绍了 用于对数据进行序列化的格式。

基本类型

本部分介绍了其他架构重复使用的类型的架构。所有架构都是 以 JSON 对象的形式表示。

地址

表示蓝牙设备地址

键 值类型 说明
type 字符串 public 或 random
value 数字数组(8 位) 6 个八位字节的设备地址(采用小端字节序)

以下示例表示一个值为 FF:FF:00:00:00:01 的随机地址:

{
   "type": "random"
   "value": [1, 0, 0, 0, 255, 255]
}

安全属性

据此交换配对密钥的蓝牙连接的安全属性。对于 例如,由对等方通过使用 系统会将未通过身份验证的临时密钥视为“未通过身份验证”。

键 值类型 说明
已经过身份验证 布尔值 true(如果已启用 MITM 保护)
secureConnections 布尔值 如果密钥是使用安全连接配对交换的,则为 true
encryptionKeySize 数字(8 位) 广告交易平台使用的加密密钥的大小

示例:

{
    "authenticated": false,
    "secureConnections": true,
    "encryptionKeySize": 16
}

键

128 位数字,表示与配对相关的密钥。使用此架构的常用键 是本地设备的身份解析密钥 (IRK)。

当 Key 单独使用时,它表示本地生成的密钥,存储用于将来分发。

键 值类型 说明
value 数字数组(8 位) 采用小端字节序的 16 个八位字节的键

对等密钥

128 位密钥,表示来自对等端的与配对相关的密钥。使用此密钥的常用键 schema 是对等方的身份解析密钥 (IRK)。

每个密钥都有一个 128 位值(例如密钥)和安全属性。 表示分配密钥时连接的安全性。

键 值类型 说明
安全 安全属性 分发期间的链路安全性
value 数字数组(8 位) 采用小端字节序的底层 16 个八位字节键

以下示例表示一个受 MITM 保护且值为 0x100f0e0d0c0b0a090807060504030201 的密钥:

{
    "security": {
        "authenticated": true,
        "secureConnections": false,
        "encryptionKeySize": 16
    },
    "value": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
}

长期密钥

用于建立加密连接的 128 位密钥。此架构用于表示 能源长期密钥 (LTK)。

长期密钥对等密钥的安全属性不仅代表 用于分发和生成密钥的连接,而且还会确保密钥本身的安全性。

键 值类型 说明
键 对等密钥 加密密钥。
Ediv 数字(16 位) 加密的多元化器
rand 数字(64 位) 随机值

示例:

{
    "key": {
        "security": {
            "authenticated": true,
            "secureConnections": false,
            "encryptionKeySize": 16
        },
        "value": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
    },
    "ediv": 48879,
    "rand": 9223372036854775807
}

主机数据

Fuchsia 蓝牙系统与一个或多个蓝牙控制器兼容。系统 实例化蓝牙主机子系统 (bt-host) 。Fuchsia 会存储正在使用的 bt 主机的一些元数据。

键 值类型 说明
Irk(可选) 键 分发给 bt-host 的所有对等体的身份解析密钥

示例:

{
    "irk": {
        "value": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
    }
}

绑定数据

使用标准蓝牙配对与 Fuchsia 系统关联的每个对等设备 这一过程被认为与 Fuchsia 系统有键性。Fuchsia 会保留每个 绑定对等体在未来连接中重新建立加密链接,无需重复 安全和配对程序。Fuchsia 还保留了额外的元数据,以加快 建立连接的流程。

我们为 LE 和 BR/EDR 传输定义了单独的 JSON 对象架构。Fuchsia 系统 保留 LE 数据和/或 BR/EDR 数据,具体取决于对特定传输(例如 双模式对等设备可能会导致两种传输的绑定数据)。

LE 连接参数

键 值类型 说明
connectionInterval 数字(16 位) 控制器时间片中的连接时间间隔
connectionLatency 数字(16 位) 控制器时间片的连接延迟时间
supervisionTimeout 数字(16 位) 控制器时间片中的监督超时

LE 键结数据

键 值类型 说明
connectionParameters(可选) LE 连接参数 对等方的首选连接参数
PeerLtk(可选) 长期键 对等方分发的长期密钥
localLtk(可选) 长期键 在本地生成并分发给对等方的长期密钥
Irk(可选) 对等密钥 对等方的身份解析密钥

巴西/EDR 债券数据

键 值类型 说明
rolePreference(可选) 字符串 "leader" 或 "follower"
linkKey(可选) 对等密钥 链路加密密钥
services 字符串数组 已缓存的已发现服务 UUID

绑定数据架构

键 值类型 说明
标识符 编号 64 位不透明对等 ID
地址 地址 对等方的身份地址
hostAddress 地址 对等端绑定的本地 bt 主机的身份地址
名称(可选) 字符串 完整的或简称“本地名称”对等节点。
le(可选) LE 键结数据 低能耗传输的绑定数据
bredr(可选) BR/EDR 债券数据 BR/EDR 传输的绑定数据

示例:

{
    "identifier": 1,
    "address: {
        "type": "random",
        "value": [202, 202, 254, 202, 239, 190]
    },
    "hostAddress": {
        "type": "public",
        "value": [1, 2, 3, 4, 5, 6]
    },
    "name": "My Device",
    "le": {
        "peerLtk": {
            "key": {
                "security": {
                    "authenticated": true,
                    "secureConnections": false,
                    "encryptionKeySize": 16
                },
                "value": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
            },
            "ediv": 0,
            "rand": 0,
        },
    },
    "bredr": {
        "rolePreference": "follower",
        "linkKey": {
            "security": {
                "authenticated": true,
                "secureConnections": true,
                "encryptionKeySize": 16
            },
            "value": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
        },
        "services": [
           "0000110a-0000-1000-8000-00805f9b34fb",
           "0000110b-0000-1000-8000-00805f9b34fb"
        ]
    }
}