Đặc điểm

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

Nhà cung cấp dịch vụ ghép nối nhanh sẽ có dịch vụ GATT sau đây.

Dịch vụ mã nhận dạng duy nhất (UUID)
Dịch vụ ghép nối nhanh 0xFE2C

Dịch vụ này sẽ có các đặc điểm sau.

Đặc điểm của Dịch vụ ghép nối nhanh Đã mã hoá Quyền mã nhận dạng duy nhất (UUID)
Mã kiểu máy Không Đã đọc FE2C1233-8366-4814-8EB0-01DE32100BEA
Ghép nối dựa trên phím Không Viết và thông báo FE2C1234-8366-4814-8EB0-01DE32100BEA
Khoá truy cập Không Viết và thông báo FE2C1235-8366-4814-8EB0-01DE32100BEA
Khoá tài khoản Không Viết FE2C1236-8366-4814-8EB0-01DE32100BEA

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ị.

Dịch vụ mã nhận dạng duy nhất (UUID)
Dịch vụ thông tin thiết bị 0x180A

Trình tìm kiếm ghép nối nhanh sử dụng các đặc điểm sau.

Tên Đã mã hoá 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: Mã mô hình

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

Hình bát giác Loại dữ liệu Nội dung 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 tính 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 Trình tìm kiếm và Nhà cung cấp đều đang sở hữu khoá được chia sẻ trước. Khoá là khác nhau trong từng trường hợp:

  • Trường hợp 1: Khoá được chia sẻ trước sẽ 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 Trình tìm kiếm sẽ thay đổi sau mỗi lần ghép nối.

    • Nhà cung cấp đang ở chế độ ghép nối.
    • Trình 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 tính năng Ghép nối nhanh.

  • Trường hợp 2: Khoá chia sẻ trước là một trong những 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ợ sử dụng khoá tài khoản ngay cả khi ở chế độ ghép nối.)
    • Người tìm kiếm và Nhà cung cấp đều xác minh rằng đối tác đang sở hữu khoá tài khoản.

Vì cả hai trường hợp cực kỳ giống nhau, ngoại trừ khoá được chia sẻ trước được sử dụng, nên chúng sẽ được kết hợp trong quy trình.

Định dạng dữ liệu

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

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị Bắt buộc?
0 – 15 uint128 Yêu cầu đã 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á, do Người tìm kiếm ghi vào đặc điểm.

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị Bắt buộc?
0 uint8 Loại tin nhắn 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 Người tìm kiếm yêu cầu Nhà cung cấp thực hiện liên kết, và yêu cầu này có chứa địa chỉ BR/EDR của Người tìm kiếm. 0, nếu không thì.
  • Bit 2: 1 nếu Người tìm kiếm yêu cầu Nhà cung cấp phải thông báo cho tên hiện tại. 0, nếu không thì.
  • Bit 3: 1 nếu đây là trạng thái dành cho tính năng Ghi khoá tài khoản theo cách hồi tố. 0, nếu không thì.
  • Các bit từ 4 đến 7 được dành riêng để sử dụng về sau và sẽ được bỏ qua.
không cố định Bắt buộc
2 – 7 uint48 Hoặc:
  • Địa chỉ BLE hiện tại của nhà cung cấp
  • Địa chỉ công khai của nhà cung cấp
không cố định Bắt buộc
8–13 uint48 Địa chỉ của người tìm kiếm ở Brazil/EDR không cố định Chỉ trình bày nếu đặt Cờ Bit 1 hoặc 3
n – 15 Giá trị ngẫu nhiên (muối) không cố định 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.

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị Bắt buộc?
0 uint8 Loại tin nhắn 0x10 = Yêu cầu hành động Bắt buộc
1 uint8 Cờ không cố định Bắt buộc
2 – 7 uint48 Hoặc:
  • Địa chỉ BLE hiện tại của nhà cung cấp
  • Địa chỉ công khai của nhà cung cấp
không cố định Bắt buộc
8 uint8 Nhóm tin nhắn không cố định Bắt buộc nếu đặt Cờ Bit 0
9 uint8 Mã thông báo không cố định Bắt buộc nếu đặt Cờ Bit 0
10 uint8 Phụ thuộc vào cờ:
  • Đã đặt Bit 0: Độ dài dữ liệu bổ sung, nhỏ hơn 6
  • Bit 1 được đặt: Mã dữ liệu
không cố định Bắt buộc nếu đặt Cờ Bit 0 hoặc 1
11 – n Dữ liệu bổ sung không cố định Không bắt buộc
n – 15 Giá trị ngẫu nhiên (muối) không cố định 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.

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị
0 uint8 Loại tin nhắn 0x01 = Phản hồi ghép nối dựa trên khoá
1 – 6 uint48 Địa chỉ công khai của nhà cung cấp (BR/EDR) không cố định
7–15 Giá trị ngẫu nhiên (muối) không cố định

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

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị
0 – 15 uint128 Phản hồi đã mã hoá không cố định

Bảng 1.4: Phản hồi được mã hoá, do Nhà cung cấp gửi đến Người 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á.

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị
0 – 15 uint128 Khối khoá truy cập đã mã hoá không cố định

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á để sử dụng.

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị
0 uint8 Loại tin nhắn 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ố không cố định
4 – 15 Giá trị ngẫu nhiên (muối) không cố định

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

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

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

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị
0 – 15 uint128 Khoá tài khoản (được mã hoá) không cố định

Khi nhận được yêu cầu ghi, Trình cung cấp ghép nối nhanh sẽ thực hiện những việc sau:

  1. Giải mã khoá tài khoản bằng khoá bí mật dùng chung được tạo ở bước 4 trong quy trình.
    • Đối với Nhà cung cấp yêu cầu liên kết (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 khoá truy cập ở bước 12. Nếu bước này chưa được vượt qua bằng cách sử dụng bí mật này, hãy bỏ qua thao tác ghi và thoát này.
    • Tại thời điểm này, khoá bí mật dùng chung (K trong quy trình) sẽ không được dùng lại cho quá trình 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. Nếu không, hãy bỏ qua thao tác ghi và thoát này.
  3. Kiểm tra xem Danh sách khoá tài khoản đã tồn tại có còn chỗ cho giá trị mới hay không.
  4. Nếu không, hãy xoá giá trị được sử dụng gần đây nhất khỏi danh sách.
  5. Thêm giá trị mới vào danh sách.

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: Sửa đổi chương trình cơ sở

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

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị
0 – var utf8s Mã sửa đổi chương trình cơ sở không cố định

Gói 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 trái, tai nghe phải và hộp đựng) trên Nhà cung cấp. Trì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. cập nhật trạng thái: nếu Nhà cung cấp hiện đang cập nhật lên một 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. trạng thái bất thường: nếu Nhà cung cấp đang ở 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 Trình tìm kiếm hiển thị thông báo để người dùng biết là cập nhật ngay.

Nhà cung cấp nên hạn chế quyền truy cập vào tính năng Bản sửa đổi chương trình cơ sở để ngăn hoạt động theo dõi thiết bị. Hạn chế được đề xuất:

  • các thiết bị ngoại vi phải có quyền truy cập bất cứ lúc nào
  • mọi thiết bị đều phải có quyền truy cập khi Nhà cung cấp có thể phát hiện được

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

Dịch vụ này sẽ có đặc điểm như sau.

Đặc điểm của Dịch vụ ghép nối nhanh Đã mã hoá 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 (sẽ ngừng hoạt động từ ngày 1/1/2021) Đã mã hoá 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 viết hoặc thông báo cho đặc điểm này, phải có một cơ chế bắt tay thông qua đặc điểm FE2C1234-8366-4814-8EB0-01DE32100BEA để có một khoá bí mật dùng 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 định nghĩa ở bên dưới. Chế độ này an toàn hơn trên 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 định nghĩa ở bên dưới.

Hình bát giác Nội dung mô tả Giá trị
0 - 7 8 byte đầu tiên của HMAC-SHA256. không cố định
8–15 Số chỉ dùng một lần, được mã hoá AES-CTR sử dụng. không cố định
16 – var Dữ liệu đã mã hoá. không cố định

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

Hình bát giác Loại dữ liệu Nội dung mô tả Giá trị
0 – var byte array Dữ liệu khác nhau, hãy giải mã dữ liệu đó theo Mã dữ liệu trong 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 gửi thông báo (ví dụ: yêu cầu tên được cá nhân hoá qua Bit 2 trong Bảng 1.2.1), Trình cung cấp ghép nối nhanh sẽ làm như sau:

  1. Tạo 8 byte ngẫu nhiên theo mã hoá cho Số chỉ dùng một lần.
  2. Mã hoá dữ liệu bằng AES-CTR, trong đó mỗi khối 16 byte được tạo bằng

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

    trong đó

    1. Khoá AES là khoá bí mật dùng chung ở 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ể dưới 16 byte.
  3. Hãy thực hiện concat(encryptedBlock[0], encryptedBlock[1],...) để tạo Dữ liệu đã mã hóa.

  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ởi concat(shared_secret, ZEROs 48 byte), shared_secret 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 có kích thước 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, Trình cung cấp ghép nối nhanh sẽ thực hiện những việc 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 qua cơ chế bắt tay, ví dụ:
      1. trong quy trình đặt tên 1, giá trị này đến từ ECDH và sẽ không được dùng lại cho quá trình 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ô.