Dịch vụ Ghép nối nhanh

Nhà cung cấp dịch vụ Ghép nối nhanh phải triển khai Dịch vụ ghép nối nhanh (UUID 0xFE2C), trong đó có các đặc điểm sau.

Tên Đã mã hóa Quyền mã nhận dạng duy nhất (UUID) Bắt buộc?
Mã mẫu Không Đọc FE2C1233-8366-4814-8EB0-01DE32100BEA Bắt buộc
Ghép nối dựa trên khoá Không Viết và thông báo FE2C1234-8366-4814-8EB0-01DE32100BEA Bắt buộc
Khoá truy cập Không Viết và thông báo FE2C1235-8366-4814-8EB0-01DE32100BEA Bắt buộc
Khoá tài khoản Không Viết FE2C1236-8366-4814-8EB0-01DE32100BEA Bắt buộc
Dữ liệu bổ sung Không Viết và thông báo FE2C1237-8366-4814-8EB0-01DE32100BEA *C1
PSM luồng tin nhắn Có Đọc FE2C1239-8366-4814-8EB0-01DE32100BEA *C2
Khoá truy cập bổ sung Không Đọc, ghi và thông báo FE2C123A-8366-4814-8EB0-01DE32100BEA *C3
Hành động trên thiết bị FP Không Viết và thông báo FE2C123B-8366-4814-8EB0-01DE32100BEA *C4

Bắt buộc có điều kiện

Đặc điểm: Mã mẫu

Đặc điểm này cho phép Thiết bị tìm kiếm đọc mã nhận dạng mẫu khi cần, ngoài trường hợp thiết bị đang quảng cáo ở chế độ có thể phát hiện. Hàm này phải luôn trả về dữ liệu sau:

Octet Loại dữ liệu Mô tả Giá trị
0 – 2 uint24 Mã kiểu máy thay đổi

Đặc điểm: Ghép nối dựa trên khoá

Đặc điểm này kiểm soát quy trình Ghép nối dựa trên khoá. Trong quy trình này, một mức độ tin cậy nhất định được thiết lập bằng cách xác minh rằng cả Bên tìm kiếm và Bên cung cấp đều sở hữu khoá được chia sẻ trước. Khoá sẽ khác nhau trong mỗi trường hợp:

  • Trường hợp 1: Khoá được chia sẻ trước dựa trên cặp khoá công khai/riêng tư chống giả mạo và cặp khoá công khai/riêng tư của chính Thiết bị tìm kiếm. Cặp khoá này sẽ thay đổi theo mỗi lần ghép nối.

    • Nhà cung cấp đang ở chế độ ghép nối.
    • Thiết bị tìm kiếm xác minh rằng Nhà cung cấp đang sở hữu khoá riêng tư chống giả mạo.

    Lưu ý rằng khi ở chế độ ghép nối, Nhà cung cấp cũng có thể ghép nối theo cách thông thường, chẳng hạn như ghép nối với một thiết bị không hỗ trợ tính năng Ghép nối dựa trên khoá của Ghép nối nhanh.

  • Trường hợp 2: Khoá được chia sẻ trước là một trong các khoá tài khoản.

    • Nhà cung cấp thường không ở chế độ ghép nối. (Nhưng đây không phải là yêu cầu bắt buộc. Nhà cung cấp phải hỗ trợ việc sử dụng khoá tài khoản ngay cả khi ở chế độ ghép nối.)
    • Thiết bị tìm kiếm và Thiết bị cung cấp đều xác minh rằng thiết bị kia đang sở hữu khoá tài khoản.

Vì cả hai trường hợp đều rất giống nhau, ngoại trừ khoá được chia sẻ trước, nên chúng được kết hợp trong quy trình.

Định dạng dữ liệu

Hãy xem quy trình để biết cách sử dụng từng định dạng.

Octet Loại dữ liệu Mô tả Giá trị Bắt buộc?
0 – 15 uint128 Yêu cầu được mã hoá thay đổi Bắt buộc
16 – 79 Khóa công cộng thay đổi Không bắt buộc

Bảng 1.1: Yêu cầu đã mã hoá, được Thiết bị tìm nạp ghi vào đặc điểm.

Octet Loại dữ liệu Mô tả Giá trị Bắt buộc?
0 uint8 Loại thông báo 0x00 = Yêu cầu ghép nối dựa trên khoá Bắt buộc
1 uint8 Cờ
  • Bit 0 (MSB): không dùng nữa và bị Seeker bỏ qua.
  • Bit 1: 1 nếu Thiết bị tìm kiếm yêu cầu Nhà cung cấp bắt đầu liên kết và yêu cầu này chứa địa chỉ BR/EDR của Thiết bị tìm kiếm. Nếu không thì trả về 0.
  • Bit 2: 1 nếu Thiết bị tìm kiếm yêu cầu Nhà cung cấp thông báo tên hiện có. Nếu không thì trả về 0.
  • Bit 3: 1 nếu đây là Ghi khoá tài khoản có hiệu lực trở về trước. Nếu không thì trả về 0.
  • Bit 4: 1 nếu Thiết bị tìm kiếm hỗ trợ Thiết bị BLE. Nếu không thì trả về 0.
  • Bit 5: 1 nếu Thiết bị tìm kiếm hỗ trợ Âm thanh năng lượng thấp. Nếu không thì trả về 0.
  • Bit 6 – 7 được dành riêng để sử dụng trong tương lai và sẽ bị bỏ qua.
thay đổi Bắt buộc
2 – 7 uint48 Hoặc:
  • Địa chỉ BLE hiện tại của Nhà cung cấp
  • Địa chỉ danh tính của nhà cung cấp
thay đổi Bắt buộc
8 – 13 uint48 Địa chỉ BR/EDR của Thiết bị tìm kiếm thay đổi Chỉ xuất hiện nếu bạn đặt Bit cờ 1 hoặc 3
n – 15 Giá trị ngẫu nhiên (salt) thay đổi Bắt buộc

Bảng 1.2.1: Yêu cầu thô (loại 0x00). Được giải mã từ Yêu cầu đã mã hoá trong Bảng 1.1.

Octet Loại dữ liệu Mô tả Giá trị Bắt buộc?
0 uint8 Loại thông báo 0x10 = Yêu cầu hành động Bắt buộc
1 uint8 Cờ thay đổi Bắt buộc
2 – 7 uint48 Hoặc:
  • Địa chỉ BLE hiện tại của Nhà cung cấp
  • Địa chỉ danh tính của nhà cung cấp
thay đổi Bắt buộc
8 uint8 Nhắn tin cho nhóm thay đổi Bắt buộc nếu Bit cờ 0 được đặt
9 uint8 Mã tin nhắn thay đổi Bắt buộc nếu Bit cờ 0 được đặt
10 uint8 Phụ thuộc vào cờ:
  • Bit 0 được đặt: Độ dài dữ liệu bổ sung, nhỏ hơn 6
  • Bit 1 được đặt: Mã nhận dạng dữ liệu
thay đổi Bắt buộc nếu bạn đặt Bit cờ 0 hoặc 1
11 – n Dữ liệu khác thay đổi Không bắt buộc
n – 15 Giá trị ngẫu nhiên (salt) thay đổi Bắt buộc

Bảng 1.2.2: Yêu cầu thô (loại 0x10). Được giải mã từ Yêu cầu đã mã hoá trong Bảng 1.1.

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Loại thông báo 0x01 = Phản hồi ghép nối dựa trên khoá
1 – 6 uint48 Địa chỉ công khai (BR/EDR) của Nhà cung cấp thay đổi
7 – 15 Giá trị ngẫu nhiên (salt) thay đổi

Bảng 1.3: Phản hồi thô (loại 0x01). Được mã hoá để tạo ra Phản hồi đã mã hoá trong Bảng 1.4.

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Loại thông báo 0x02 = Key-based Pairing Extended Response
1 uint8 Cờ
  • Bit 0 (MSB): 1 nếu Nhà cung cấp chỉ là thiết bị LE, nếu không thì là 0. Nếu bit 0 được đặt thành 1, thì Thiết bị tìm kiếm sẽ giả định rằng Bit 1 được đặt thành 1.
  • Bit 1: 1 nếu Nhà cung cấp ưu tiên liên kết LE, 0 nếu không.
  • Bit 2: 1 nếu loại địa chỉ của địa chỉ thứ hai là Ngẫu nhiên, 0 nếu là Công khai.
  • Bit 3 – 7 được dành riêng để sử dụng trong tương lai và sẽ bị bỏ qua.
thay đổi
2 uint8 Số địa chỉ của Nhà cung cấp
Giá trị hợp lệ là 1 và 2.
thay đổi

3 – 8 hoặc 3 – 14 tuổi
  • Địa chỉ đầu tiên phải là địa chỉ nhận dạng của thiết bị chính và có thể liên kết nếu ưu tiên liên kết BR/EDR
  • Địa chỉ thứ hai phải là địa chỉ có thể liên kết của thiết bị phụ nếu có thiết bị phụ
thay đổi
9 – 15 hoặc 15 Giá trị ngẫu nhiên (salt) thay đổi

Bảng 1.3.2: Phản hồi thô (loại 0x02). Được mã hoá để tạo ra Phản hồi đã mã hoá trong Bảng 1.4.

Octet Loại dữ liệu Mô tả Giá trị
0 – 15 uint128 Phản hồi được mã hoá thay đổi

Bảng 1.4: Phản hồi đã mã hoá, do Nhà cung cấp gửi đến Thiết bị tìm kiếm thông qua một thông báo.

Đặc điểm: Khoá truy cập

Đặc điểm này được dùng trong quy trình Ghép nối dựa trên khoá.

Octet Loại dữ liệu Mô tả Giá trị
0 – 15 uint128 Khối khoá truy cập đã mã hoá thay đổi

Bảng 2.1: Khối khoá truy cập đã mã hoá. Hãy xem Quy trình ghép nối dựa trên khoá để biết cách sử dụng.

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Loại thông báo Một trong các lựa chọn sau:
  • 0x02 = Khoá truy cập của người tìm kiếm
  • 0x03 = Khoá truy cập của nhà cung cấp
1 - 3 unit32 Khoá truy cập gồm 6 chữ số thay đổi
4 – 15 Giá trị ngẫu nhiên (salt) thay đổi

Bảng 2.2: Khối khoá truy cập thô. Bảng 2.1 là phiên bản đã giải mã của .

Đặc điểm: Khoá tài khoản

Sau khi ghép nối, Thiết bị tìm kiếm Ghép nối nhanh sẽ ghi Khoá tài khoản vào Nhà cung cấp Ghép nối nhanh.

Octet Loại dữ liệu Mô tả Giá trị
0 – 15 uint128 Khoá tài khoản (đã mã hoá) thay đổi

Khi nhận được yêu cầu ghi, Nhà cung cấp tính năng Ghép nối nhanh sẽ làm như sau:

  1. Giải mã khoá tài khoản bằng khoá bí mật dùng chung được tạo từ bước 4 trong quy trình.
    • Đối với Nhà cung cấp yêu cầu bảo lãnh (phổ biến):
      • Trước khi giải mã, hãy xác minh rằng khoá bí mật dùng chung đã được dùng để giải mã yêu cầu về khoá truy cập ở bước 12. Nếu bước này không được thông qua bằng cách sử dụng khoá bí mật này, hãy bỏ qua thao tác ghi này và thoát.
    • Tại thời điểm này, khoá bí mật dùng chung (K trong quy trình) sẽ không được sử dụng lại cho hoạt động ghép nối này. Mọi yêu cầu được mã hoá bằng khoá này mà không khởi động lại quy trình đều sẽ bị từ chối.
  2. Xác minh rằng giá trị đã giải mã bắt đầu bằng 0x04 hoặc 0xFF. Nếu không, hãy bỏ qua thao tác ghi này và thoát.
    • Nếu giá trị là 0x04:
      • Kiểm tra xem danh sách Khoá tài khoản được lưu trữ có còn chỗ cho giá trị mới hay không.
      • Nếu không, hãy xoá giá trị được sử dụng gần đây nhất khỏi danh sách.
      • Thêm giá trị mới vào danh sách.
    • Nếu giá trị là 0xFF:
      • Hãy coi đây là một phiên ghép nối tạm thời và không thực hiện thao tác nào.
      • Điều này có thể xảy ra với quy trình Ghi khoá tài khoản có hiệu lực trở về trước.
      • Không lưu trữ khoá và không sử dụng khoá trong danh sách Khoá tài khoản, mã hoá hoặc tính toán MAC.
      • Việc xoá liên kết được kích hoạt bởi một sự kiện hoặc thời gian chờ cụ thể của tính năng. Đối với tính năng Chia sẻ âm thanh LE, bạn nên xoá khoá liên kết và liên kết BLE sau 10 phút kể từ khi phiên tạm thời ngắt kết nối.

Khoá tài khoản trong danh sách được dùng trong quá trình Ghép nối dựa trên khoá.

Đặc điểm: Dữ liệu bổ sung

Dịch vụ này phải có đặc điểm sau.

Đặc điểm của Dịch vụ ghép nối nhanh Đã mã hóa Quyền mã nhận dạng duy nhất (UUID)
Dữ liệu Không Viết và thông báo FE2C1237-8366-4814-8EB0-01DE32100BEA
Đặc điểm cũ của Dịch vụ ghép nối nhanh (dự kiến ngừng hoạt động vào ngày 1/1/2021) Đã mã hóa Quyền mã nhận dạng duy nhất (UUID)
Dữ liệu Không Viết và thông báo 0x1237

Trước khi ghi hoặc thông báo cho đặc điểm này, phải có một bắt tay thông qua đặc điểm FE2C1234-8366-4814-8EB0-01DE32100BEA để có một bí mật chung. AES-CTR sẽ được dùng để mã hoá dữ liệu truyền qua đặc điểm này, thuật toán của đặc điểm này được xác định bên dưới. Chế độ này bảo mật hơn đối với dữ liệu vượt quá một khối 16 byte. HMAC-SHA256 sẽ được dùng để đảm bảo tính toàn vẹn của dữ liệu, cũng được xác định bên dưới.

Octet Mô tả Giá trị
0 - 7 8 byte đầu tiên của HMAC-SHA256. thay đổi
8 – 15 Nonce, được dùng trong phương thức mã hoá AES-CTR. thay đổi
16 – var Dữ liệu đã mã hoá. thay đổi

Bảng 3.1: Gói dữ liệu, do Nhà cung cấp gửi đến Bên tìm kiếm thông qua một thông báo hoặc do Bên tìm kiếm gửi đến Nhà cung cấp thông qua một lệnh ghi.

Octet Loại dữ liệu Mô tả Giá trị
0 – var byte array Dữ liệu thay đổi, hãy giải mã theo Mã dữ liệu của Bảng 1.2.2:
  • 0x01(tên được cá nhân hoá): utf8s

Bảng 3.2: Dữ liệu thô. Được giải mã từ dữ liệu đã mã hoá trong Bảng 3.1.

Khi có yêu cầu thông báo (ví dụ: yêu cầu tên được cá nhân hoá thông qua Bit 2 trong Bảng 1.2.1), Nhà cung cấp tính năng Ghép nối nhanh sẽ làm như sau:

  1. Tạo 8 byte ngẫu nhiên được mã hoá cho Nonce.
  2. Mã hoá dữ liệu bằng AES-CTR, trong đó mỗi khối 16 byte được tạo bằng cách sử dụng

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    trong đó

    1. Khoá AES là khoá bí mật dùng chung từ bước 4 trong quy trình.
    2. clearBlock[i] là một khối 16 byte bắt đầu từ data[i * 16]. Khối cuối cùng có thể nhỏ hơn 16 byte.
  3. Thực hiện concat(encryptedBlock[0], encryptedBlock[1],...) để tạo Dữ liệu đã mã hoá.

  4. Tạo HMAC-SHA256 bằng

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    trong đó

    1. K được tạo bằng cách nối (khoá_bí_mật_dùng_chung, 48 byte ZERO), khoá_bí_mật_dùng_chung là từ bước 4 trong quy trình.
    2. opad là khoảng đệm ngoài 64 byte, bao gồm các byte lặp lại có giá trị 0x5C.
    3. ipad là khoảng đệm bên trong 64 byte, bao gồm các byte lặp lại có giá trị 0x36.
  5. Lấy 8 byte đầu tiên từ HMAC-SHA256 làm tiền tố của Gói dữ liệu.

Khi nhận được yêu cầu ghi, Nhà cung cấp tính năng Ghép nối nhanh sẽ làm như sau:

  1. Xác minh tính toàn vẹn của dữ liệu bằng cách kiểm tra 8 byte đầu tiên của HMAC-SHA256.
  2. Giải mã Dữ liệu đã mã hoá bằng AES-CTR, trong đó mỗi khối được tạo bằng

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    trong đó

    1. encryptedBlock[i] là một khối 16 byte bắt đầu từ encrypted_data[i * 16]. Khối cuối cùng có thể nhỏ hơn 16 byte.
    2. Khoá AES được tạo hoặc xác định từ quá trình bắt tay, ví dụ:
      1. trong quy trình đặt tên 1, khoá này là từ ECDH và sẽ không được dùng lại cho hoạt động ghép nối này. Mọi yêu cầu được mã hoá bằng khoá này mà không khởi động lại quy trình đều sẽ bị từ chối.
      2. trong quy trình đặt tên 2, đó là khoá tài khoản.
  3. Thực hiện concat(clearBlock[0], clearBlock[1],...) để tạo dữ liệu thô.

Đặc điểm: PSM của luồng tin nhắn

Xem Thiết bị BLE: PSM luồng tin nhắn

Đặc điểm: Khoá truy cập bổ sung

Xem Thiết bị BLE: Khoá truy cập bổ sung

Đặc điểm: Hành động trên thiết bị FP

Đặc điểm của Dịch vụ ghép nối nhanh Đã mã hóa Quyền mã nhận dạng duy nhất (UUID)
Hành động trên thiết bị FP Không Viết và thông báo FE2C123B-8366-4814-8EB0-01DE32100BEA

Octet Mô tả Giá trị
0 - 7 8 byte đầu tiên của HMAC-SHA256. thay đổi
8 – 15 Nonce, được dùng trong phương thức mã hoá AES-CTR. thay đổi
16 – var Dữ liệu đã mã hoá. thay đổi

Bảng 4.1: Gói dữ liệu, do Nhà cung cấp gửi đến Bên tìm kiếm dưới dạng thông báo hoặc do Bên tìm kiếm gửi đến Nhà cung cấp dưới dạng lệnh ghi.

Octet Loại dữ liệu Mô tả Giá trị
0 – var byte array Yêu cầu hành động Một trong các lựa chọn sau:
  • Đọc tên được cá nhân hoá, 0x01
  • Viết tên được cá nhân hoá, xem Bảng 4.3.1
  • Đọc thông tin về bộ thiết bị phối hợp, 0x02
  • Đọc tính năng của thiết bị, 0x03

Bảng 4.2: Dữ liệu thô. Được giải mã từ dữ liệu đã mã hoá trong Bảng 4.1 do Bên tìm kiếm gửi đến Bên cung cấp dưới dạng một thao tác ghi.

Octet Loại dữ liệu Mô tả Giá trị
0 – var byte array Phản hồi hành động Một trong các lựa chọn sau:
  • Tên được cá nhân hoá, xem Bảng 4.3.1
  • Thông tin về bộ phối hợp, xem Bảng 4.3.2
  • Tính năng của thiết bị, xem Bảng 4.3.3
  • Mã lỗi
    • 0x80 (Yêu cầu không được hỗ trợ)
    • 0x81 (Yêu cầu không hợp lệ)

Bảng 4.3: Dữ liệu thô. Được giải mã từ dữ liệu đã mã hoá trong Bảng 4.1 do Nhà cung cấp gửi đến Thiết bị tìm nạp dưới dạng thông báo.

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 ID hành động 0x01
1 – var utf8s Tên được cá nhân hoá thay đổi

Bảng 4.3.1: Định dạng tên được cá nhân hoá

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 ID hành động 0x02
1 uint8 Loại thành viên của bộ thiết bị phối hợp Ghép nối nhanh
  • 0x00: thành phần bên trái
  • 0x01: thành phần bên phải
2 uint8 Số lượng trong một bộ phối hợp số lượng thành phần
3 uint8 Đặt loại khoá phân giải danh tính 0x01 (SIRK văn bản thuần tuý)
4 – 19 uint128 Đặt giá trị khoá phân giải danh tính Dữ liệu 16 byte, xem Dịch vụ nhận dạng bộ phối hợp

Bảng 4.3.2: Định dạng thông tin của nhóm phối hợp

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 ID hành động 0x03
1 – 2 uint16 Tính năng của thiết bị
  • Bit 0 – 15: dành riêng, phải được đặt thành 0

Bảng 4.3.3: Định dạng tính năng của thiết bị

Hoạt động của tính năng Ghép nối nhanh

Hai thao tác chính được xác định cho đặc điểm này

  • Đọc Ghép nối nhanh: đọc dữ liệu từ Nhà cung cấp
    1. Thiết bị tìm kiếm: Bật thông báo GATT
    2. Nhà cung cấp: Đã đăng ký thông báo GATT
    3. Thiết bị tìm kiếm: Yêu cầu ghi GATT, dữ liệu thô chỉ chứa Action ID
    4. Nhà cung cấp: Phản hồi ghi GATT
    5. Nhà cung cấp: Thông báo GATT, dữ liệu thô chứa
      • ID hành động
      • Dữ liệu cho mã hành động
    6. Thiết bị tìm kiếm: Đã nhận được thông báo GATT
  • Ghi dữ liệu Ghép nối nhanh: ghi dữ liệu vào Nhà cung cấp
    1. Thiết bị tìm kiếm: Yêu cầu ghi GATT, dữ liệu thô chứa
      • ID hành động
      • Dữ liệu cho mã hành động
    2. Nhà cung cấp: Phản hồi ghi GATT

Mã hành động được hỗ trợ đọc của tính năng Ghép nối nhanh

  • 0x01 (Tên được cá nhân hoá)
  • 0x02 (Thông tin về bộ tai nghe phối hợp)
  • 0x03 (Tính năng của thiết bị)

Mã hành động được hỗ trợ ghi trong tính năng Ghép nối nhanh

Nếu Nhà cung cấp không hiểu Mã hành động, thì Nhà cung cấp sẽ phản hồi bằng một thông báo GATT chứa Yêu cầu không được hỗ trợ (0x80) như mô tả trong Bảng 4.3.

Thuật toán mã hoá

Khi có yêu cầu thông báo, Nhà cung cấp tính năng Ghép nối nhanh sẽ làm như sau:

  1. Tạo 8 byte ngẫu nhiên được mã hoá cho Nonce.
  2. Mã hoá dữ liệu bằng AES-CTR, trong đó mỗi khối 16 byte được tạo bằng cách sử dụng

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    trong đó

    1. Khoá AES là khoá bí mật dùng chung từ bước 4 trong quy trình.
    2. clearBlock[i] là một khối 16 byte bắt đầu từ data[i * 16]. Khối cuối cùng có thể nhỏ hơn 16 byte.
  3. Thực hiện concat(encryptedBlock[0], encryptedBlock[1],...) để tạo Dữ liệu đã mã hoá.

  4. Tạo HMAC-SHA256 bằng

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    trong đó

    1. K được tạo bằng cách nối (khoá_bí_mật_dùng_chung, 48 byte ZERO), khoá_bí_mật_dùng_chung là từ bước 4 trong quy trình.
    2. opad là khoảng đệm ngoài 64 byte, bao gồm các byte lặp lại có giá trị 0x5C.
    3. ipad là khoảng đệm bên trong 64 byte, bao gồm các byte lặp lại có giá trị 0x36.
  5. Lấy 8 byte đầu tiên từ HMAC-SHA256 làm tiền tố của Gói dữ liệu.

Khi nhận được yêu cầu ghi, Nhà cung cấp tính năng Ghép nối nhanh sẽ làm như sau:

  1. Xác minh tính toàn vẹn của dữ liệu bằng cách kiểm tra 8 byte đầu tiên của HMAC-SHA256.
  2. Giải mã Dữ liệu đã mã hoá bằng AES-CTR, trong đó mỗi khối được tạo bằng

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    trong đó

    1. encryptedBlock[i] là một khối 16 byte bắt đầu từ encrypted_data[i * 16]. Khối cuối cùng có thể nhỏ hơn 16 byte.
    2. Khoá AES được tạo hoặc xác định từ quá trình bắt tay, ví dụ:
      1. trong quy trình đặt tên 1, khoá này là từ ECDH và sẽ không được dùng lại cho hoạt động ghép nối này. Mọi yêu cầu được mã hoá bằng khoá này mà không khởi động lại quy trình đều sẽ bị từ chối.
      2. trong quy trình đặt tên 2, đó là khoá tài khoản.
  3. Thực hiện concat(clearBlock[0], clearBlock[1],...) để tạo dữ liệu thô.

Dịch vụ thông tin thiết bị

Nhà cung cấp dịch vụ Ghép nối nhanh cũng phải hỗ trợ Dịch vụ thông tin thiết bị (UUID 0x180A). Thiết bị tìm kiếm Ghép nối nhanh sử dụng các đặc điểm sau.

Tên Đã mã hóa Quyền mã nhận dạng duy nhất (UUID)
Bản sửa đổi chương trình cơ sở Không Đọc 0x2A26

Đặc điểm: Bản sửa đổi chương trình cơ sở

Đặc điểm này cho phép Thiết bị tìm kiếm đọc bản sửa đổi chương trình cơ sở của Nhà cung cấp khi cần. Hàm này phải luôn trả về dữ liệu sau:

Octet Loại dữ liệu Mô tả Giá trị
0 – var utf8s Mã bản sửa đổi chương trình cơ sở thay đổi

Thông tin này phải được đóng gói thành một chuỗi utf8 duy nhất ngay cả khi có nhiều chương trình cơ sở (ví dụ: 3 chương trình cơ sở cho tai nghe bên trái, tai nghe bên phải và hộp sạc) trên Nhà cung cấp. Nhà cung cấp cũng có thể trả về các chuỗi cụ thể cho các trường hợp đặc biệt:

  1. status-updating: nếu Nhà cung cấp đang cập nhật lên chương trình cơ sở mới. Ngoài ra, Nhà cung cấp có thể trả về phiên bản của chương trình cơ sở theo giai đoạn.

  2. status-abnormal: nếu Nhà cung cấp ở trạng thái bất thường. Ví dụ: thiết bị gặp sự cố do không cập nhật được chương trình cơ sở. Giá trị này sẽ khiến Seeker hiển thị thông báo cho người dùng biết rằng họ phải cập nhật ngay.

Nhà cung cấp nên giới hạn quyền truy cập vào đặc điểm Bản sửa đổi chương trình cơ sở để ngăn chặn việc theo dõi thiết bị. Các quy định hạn chế được đề xuất:

  • thiết bị được liên kết phải có quyền truy cập bất cứ lúc nào
  • bất kỳ thiết bị nào cũng có thể truy cập khi Nhà cung cấp có thể phát hiện được

Nếu Nhà cung cấp hỗ trợ Trung tâm tìm thiết bị, thì bạn cần triển khai thêm. Hãy tham khảo bài viết Bản cập nhật chương trình cơ sở cho Trung tâm tìm thiết bị để biết thông tin chi tiết.