Đặ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 phải có cá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)
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 Ghi và thông báo FE2C1234-8366-4814-8EB0-01DE32100BEA
Khoá truy cập Không Ghi 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 sẽ 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

Ứng dụng 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)
Sửa đổi chương trình cơ sở Không Đã đọc 0x2A26

Đặc điểm: Mã mô hình

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

Bộ tám Loại dữ liệu Mô tả Giá trị
0 – 2 uint24 Mã kiểu máy khác nhau

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

Đặ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 Người tìm kiếm và Nhà cung cấp đều sở hữu khoá được chia sẻ trước. Khoá có sự khác biệt ở từng trường hợp:

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

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

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

  • Trường hợp 2: Khoá được 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 – Nhà cung cấp phải hỗ trợ bằng cách sử dụng một 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 bên kia sở hữu khoá tài khoản.

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

Định dạng dữ liệu

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

Bộ tám Loại dữ liệu Mô tả Giá trị Bắt buộc?
0 – 15 uint128 Yêu cầu đã mã hoá khác nhau Bắt buộc
16–79 Khóa công cộng khác nhau 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.

Bộ tám 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ị người tìm kiếm bỏ qua.
  • Bit 1: 1 nếu Bên 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 Bên tìm kiếm. 0.
  • Bit 2: 1 nếu Bên tìm kiếm yêu cầu Nhà cung cấp thông báo tên hiện có. 0.
  • Bit 3: 1 nếu đây là dùng để Ghi khoá tài khoản theo cách hồi tố. 0.
  • Các bit 4 – 7 được dành riêng để sử dụng trong tương lai và sẽ bị bỏ qua.
khác nhau 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ác nhau Bắt buộc
8–13 uint48 Địa chỉ BR/EDR của người tìm kiếm khác nhau Chỉ hiển thị nếu Cờ Bit 1 hoặc 3 được đặt
n – 15 Giá trị ngẫu nhiên (muối) khác nhau Bắt buộc

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

Bộ tám 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ờ khác nhau 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ác nhau Bắt buộc
8 uint8 Nhóm thư khác nhau Bắt buộc nếu đặt Cờ 0
9 uint8 Mã tin nhắn khác nhau Bắt buộc nếu đặt Cờ 0
10 uint8 Phụ thuộc vào Cờ:
  • Bit 0 được thiết lập: Độ dài dữ liệu bổ sung, nhỏ hơn 6
  • Bit 1 đã được đặt: Mã dữ liệu
khác nhau Bắt buộc nếu đặt Cờ 0 hoặc 1
11 – n Dữ liệu bổ sung khác nhau Không bắt buộc
n – 15 Giá trị ngẫu nhiên (muối) khác nhau Bắt buộc

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

Bộ tám 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ỉ (BR/EDR) công khai của nhà cung cấp khác nhau
7–15 Giá trị ngẫu nhiên (muối) khác nhau

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.

Bộ tám Loại dữ liệu Mô tả Giá trị
0 – 15 uint128 Phản hồi đã mã hoá khác nhau

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

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

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

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

Bảng 2.1: Khối khoá truy cập đã mã hoá. Xem Quy trình sử dụng Ghép nối dựa trên khoá.

Bộ tám Loại dữ liệu Mô tả Giá trị
0 uint8 Loại thông báo Một trong số:
  • 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ác nhau
4–15 Giá trị ngẫu nhiên (muối) khác nhau

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, Người tìm kiếm ghép nối nhanh sẽ ghi Khoá tài khoản cho ứng dụng Ghép nối nhanh Nhà cung cấp.

Bộ tám Loại dữ liệu Mô tả Giá trị
0 – 15 uint128 Khoá tài khoản (được mã hoá) khác nhau

Khi nhận được yêu cầu ghi, Trình cung cấp tính năng 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 mã bí mật dùng chung được tạo ở bước 4 trong quy trình.
    • Đối với các Trì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 từ bước 12. Nếu bước này không vượt qua được bằng cách sử dụng bí mật, hãy bỏ qua thao tác ghi này và thoát.
    • Tại thời điểm này, mã thông báo bí mật dùng chung (K trong quy trình) sẽ không được sử dụng cho sự ghép nối này một lần nữa. Mọi yêu cầu được mã hoá bằng khoá này mà không bắt đầu lại quy trình thì trang web 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 còn lại có chỗ trống cho giá trị.
  4. Nếu không, hãy xoá giá trị ít đượ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 này đượ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 điểm này cho phép người tìm kiếm đọc bản sửa đổi chương trình cơ sở của Cung cấp nếu cần. Phương thức này phải luôn trả về các dữ liệu sau:

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

Chuỗ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 hơn một chương trình cơ sở (ví dụ: 3 chương trình cơ sở cho tai nghe bên 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ể trong các trường hợp đặc biệt:

  1. cập nhật trạng thái: 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. trạng thái bất thường: nếu Nhà cung cấp có trạng thái bất thường. Ví dụ: đã gặp sự cố do cập nhật chương trình cơ sở không thành công. Giá trị này sẽ khiến Trình tìm kiếm sẽ hiện thông báo để người dùng biết phải cập nhật ngay.

Nhà cung cấp nên chỉ cho phép sử dụng đặc điểm Bản sửa đổi chương trình cơ sở ở những nơi ngăn thiết bị theo dõi. Các quy tắc hạn chế được đề xuất:

  • các thiết bị ngoại vi sẽ có quyền truy cập bất cứ lúc nào
  • mọi thiết bị sẽ 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 phải có đặc điểm sau đây.

Đặ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 Ghi và thông báo FE2C1237-8366-4814-8EB0-01DE32100BEA
Đặc tính cũ của Dịch vụ ghép nối nhanh (mục tiêu sẽ ngừng hoạt động từ ngày 1/1/2021) Đã mã hóa Quyền mã nhận dạng duy nhất (UUID)
Dữ liệu Không Ghi và thông báo 0x1237

Trước khi viết hoặc thông báo về đặc điểm này, phải có bắt tay qua đặc điểm FE2C1234-8366-4814-8EB0-01DE32100BEA để có một bí mật dùng chung. AES-CTR sẽ được dùng để mã hoá dữ liệu truyền qua đặc tính, thuật toán được xác định dưới đây. Chế độ này phù hợp hơn bảo mật trên dữ liệu vượt ra ngoài 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. Điều này cũng được xác định bên dưới.

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

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

Bộ tám Loại dữ liệu Mô tả Giá trị
0 – var byte array Dữ liệu thay đổi, hãy giải mã mã 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 có yêu cầu thông báo (ví dụ: yêu cầu cung cấp 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ẽ thực hiện những việc 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 trong bước 4 trong quy trình.
    2. clearBlock[i] là một khối 16 byte bắt đầu từ data[i * 16]. 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 cách

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

    trong đó

    1. K được tạo bởi concat(shared_secret, các số không 48 byte), hàm shared_secret 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 dài 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 lớp Dữ liệu gói tin.

Khi nhận được yêu cầu ghi, Trình cung cấp tính năng 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 có kích thước 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 bằng quá trình bắt tay, ví dụ:
      1. trong quy trình đặt tên 1, nó từ ECDH và sẽ không sẽ được sử dụng lại cho ghép nối này. Mọi yêu cầu được mã hoá bằng khoá này mà không cần bắt đầu lại quy trình bị từ chối.
      2. trong quy trình đặt tên 2, đây là khoá tài khoản.
  3. Thực hiện concat(clearBlock[0], clearBlock[1],...) để tạo dữ liệu thô.