蓝牙持久性数据架构

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

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

JSON 架构

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

基本类型

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

地址

表示蓝牙设备地址

值类型 说明
type 字符串 publicrandom
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"
        ]
    }
}