蓝牙持久性数据架构

Fuchsia 蓝牙子系统会保留已使用标准蓝牙配对流程成功与 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 保护)
安全连接 布尔值 如果密钥是使用安全连接配对进行交换的,则为 true
加密密钥大小 数字(8 位) 用于交换的加密密钥的大小

示例:

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

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

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

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

对等密钥

128 位密钥,表示来自对等端的配对相关密钥。使用此架构的公共密钥是对等方的身份解析密钥 (IRK)。

每个密钥都有一个 128 位的值(如 Key)和安全属性,它们表示密钥分发时的连接安全性。

值类型 说明
security 安全属性 分发期间的链接安全
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)。

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

值类型 说明
对等密钥 加密密钥。
埃迪夫 数字(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-host 存储一些元数据。

值类型 说明
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 连接参数

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

LE 键数据

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

BR/EDR 债券数据

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

绑定数据架构

值类型 说明
标识符 编号 64 位不透明对等 ID
地址 地址 对等方的身份地址
主机地址 地址 对等端绑定的本地 bt-host 的身份地址
名称(可选) 字符串 对等方的完整或简称“本地名称”。
le(可选) LE 键数据 低能耗传输的绑定数据
bredr(可选) 巴西/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"
        ]
    }
}