Tín hiệu quảng cáo của nhà cung cấp

Quảng cáo: Khi có thể phát hiện

Khi thiết bị của Nhà cung cấp có thể phát hiện được BR/EDR (tức là ở chế độ ghép nối), thiết bị đó sẽ quảng cáo Dữ liệu mã nhận dạng mẫu Ghép nối nhanh qua BLE và địa chỉ BLE sẽ không được xoay.

Khoảng thời gian quảng cáo: Khi có thể phát hiện

Khoảng thời gian giữa các quảng cáo không được lớn hơn 100 mili giây (10 Hz). Tốc độ nhanh cho phép Thiết bị tìm kiếm nhanh chóng tìm thấy Thiết bị cung cấp, ngay cả khi quét ở chế độ tiết kiệm pin.

Nội dung quảng cáo: Dữ liệu mã nhận dạng mẫu Ghép nối nhanh

Quảng cáo phải chứa loại dữ liệu Dữ liệu dịch vụ, ibid., § 1.11. UUID phải là UUID của Dịch vụ ghép nối nhanh 0xFE2C. Dữ liệu dịch vụ sẽ bao gồm những thông tin sau:

Octet Loại dữ liệu Mô tả Giá trị
0-2 uint24 Mã mẫu 24 bit thay đổi

Nội dung quảng cáo của tính năng Chia sẻ âm thanh qua Bluetooth năng lượng thấp: Dữ liệu mã nhận dạng mẫu tai nghe của tính năng Ghép nối nhanh và Bản đồ chức năng của tính năng Ghép nối nhanh

Dữ liệu dịch vụ phải chứa những thông tin sau:

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Phiên bản và cờ
0bVVVVFFFF
  • V = phiên bản
  • F = cờ
0x00
1 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài của mã nhận dạng mẫu tính bằng byte
  • T = loại
0bLLLL0111
  • length = 0bLLLL = thay đổi
  • type = 0b0111, Mã nhận dạng kiểu máy
2 – s Mã kiểu máy thay đổi
s + 1 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài tính bằng byte
  • T = loại
0bLLLL1000
  • length = 0bLLLL = thay đổi, hiện tại là 1
  • type = 0b1000, FP Capability Map (Bản đồ chức năng FP)
s + 2 uint8 Bản đồ chức năng của FP thay đổi
Bản đồ chức năng của FP

Bản đồ chức năng FP là một bitmap thể hiện các tính năng FP mà Nhà cung cấp hỗ trợ. Byte đầu tiên của bitmap được xác định như sau:

Bitmap Mô tả
0bRRRRRRSO R – Bit dự trữ, hiện sẽ bị thiết bị tìm kiếm bỏ qua và phải được đặt thành 0.
S – Hỗ trợ tính năng Chia sẻ âm thanh năng lượng thấp của Ghép nối nhanh (đặt thành 1 nếu bật, nếu không thì đặt thành 0).
O – Bit Out of Box (OOB), đặt thành 1 nếu thiết bị mới xuất xưởng.

Nếu Nhà cung cấp hỗ trợ quy cách Chia sẻ âm thanh năng lượng thấp của Ghép nối nhanh (nghĩa là hỗ trợ Ghép nối tạm thời, Tải trọng quảng cáo chia sẻ âm thanh năng lượng thấp và Phiên bản 2 của tính năng điều khiển thiết bị nghe), hãy đặt bit hỗ trợ Chia sẻ âm thanh năng lượng thấp của Ghép nối nhanh thành 1; nếu không, hãy đặt thành 0.

Nếu Nhà cung cấp chưa ghép nối với bất kỳ Thiết bị tìm kiếm FP nào và là thiết bị mới xuất xưởng (nghĩa là không có khoá tài khoản FP trên nhà cung cấp), hãy đặt bit OOB thành 1; nếu không, hãy đặt thành 0.

Nội dung quảng cáo thông tin về bộ thiết bị phối hợp: Dữ liệu mã nhận dạng mẫu của tính năng Ghép nối nhanh và thông tin về bộ thiết bị phối hợp của tính năng Ghép nối nhanh

Dữ liệu dịch vụ phải chứa những thông tin sau:

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Phiên bản và cờ
0bVVVVFFFF
  • V = phiên bản
  • F = cờ
0x00
1 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài của mã nhận dạng mẫu tính bằng byte
  • T = loại
0bLLLL0111
  • length = 0bLLLL = thay đổi
  • type = 0b0111, Mã nhận dạng kiểu máy
2 – s Mã kiểu máy thay đổi
s + 1 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài của dữ liệu tập hợp phối hợp
  • T = loại
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 – s + 7 uint48 Dữ liệu về bộ phối hợp FP Dữ liệu 6 byte, xem Thông tin về bộ phối hợp FP
Thông tin về nhóm phối hợp FP

Thông tin về Nhóm phối hợp của bên thứ nhất được dùng để xác định xem thiết bị quảng cáo có nằm trong cùng một Nhóm phối hợp hay không.

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Số lượng trong một bộ phối hợp thay đổi
1 uint8 Loại thành viên của bộ thiết bị phối hợp Ghép nối nhanh Có thể là một trong
  • 0x00 : thành phần bên trái
  • 0x01 : thành phần bên phải
2 – 5 uint32 Đặt hàm băm khoá phân giải danh tính thay đổi

Thuật toán để tạo giá trị băm của Khoá phân giải danh tính đã đặt là

  • Sử dụng SHA256 để băm giá trị SIRK

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • Trích xuất 4 byte đầu tiên làm giá trị băm

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

Đối với Khoá phân giải danh tính của nhóm, hãy xem phần Dịch vụ nhận dạng nhóm phối hợp để biết thêm thông tin.

Quảng cáo: Khi không thể khám phá

Khi không thể phát hiện (tức là không ở chế độ ghép nối), thiết bị của Nhà cung cấp sẽ quảng cáo Dữ liệu tài khoản Ghép nối nhanh theo các nguyên tắc sau.

Việc quảng cáo dữ liệu tài khoản cho phép Thiết bị tìm kiếm ở gần nhận ra khi nào một nhà cung cấp thuộc về tài khoản của họ và bắt đầu ghép nối mà không cần phải buộc nhà cung cấp quay lại chế độ ghép nối trước, đây là nguyên nhân phổ biến khiến người dùng khiếu nại. Thiết bị tìm kiếm sẽ cung cấp cơ hội để người dùng có thể bỏ qua thông báo này trong trường hợp họ không chờ ghép nối với nhà cung cấp hoặc thông báo không liên quan (ví dụ: nếu họ đã ghép nối). Người tìm kiếm cũng sẽ tự động lọc ra các thông báo rõ ràng là không hợp lệ, chẳng hạn như khi dữ liệu tài khoản bị định cấu hình sai.

Khoảng thời gian quảng cáo: Khi không thể phát hiện

Khoảng thời gian giữa các quảng cáo tối đa là 250 mili giây (4Hz).

Nội dung quảng cáo: Dữ liệu tài khoản Ghép nối nhanh

Quảng cáo phải chứa loại dữ liệu Dữ liệu dịch vụ, Sách đã dẫn, § 1.11. UUID phải là UUID của Dịch vụ ghép nối nhanh 0xFE2C. Dữ liệu dịch vụ sẽ bao gồm những thông tin sau:

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Phiên bản và cờ
0bVVVVFFFF
  • V = phiên bản
  • F = cờ
0x00
(để sử dụng trong tương lai)
1 – thay đổi Dữ liệu khoá tài khoản thay đổi

Dữ liệu khoá tài khoản bao gồm:

Octet Loại dữ liệu Mô tả Giá trị
0 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài của bộ lọc khoá tài khoản tính bằng byte
  • T = loại
0bLLLL0000
  • length = 0bLLLL = thay đổi
  • type = 0b0000 (hiện chỉ báo giao diện người dùng) hoặc 0b0010 (ẩn chỉ báo giao diện người dùng), Bộ lọc khoá tài khoản
1 – giây Bộ lọc khoá tài khoản thay đổi
s + 1 uint8 Độ dài và loại trường
0bLLLLTTTT
  • L = độ dài tính bằng byte
  • T = loại
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 – s + 3 uint16 Salt thay đổi

Bộ lọc khoá tài khoản

Bộ lọc khoá tài khoản được quảng cáo cho phép Thiết bị tìm kiếm nhanh chóng kiểm tra xem Nhà cung cấp có thể sở hữu một khoá tài khoản nhất định hay không (với xác suất dương tính giả thấp, trung bình ít hơn 0,5%) trước khi tương tác thêm. Thiết bị tìm kiếm có thể tự động kết nối và cố gắng bắt đầu quy trình khi thấy một bộ lọc đang được truyền phát với loại 0, tức là hiển thị chỉ báo giao diện người dùng, có khả năng chứa một trong các khoá tài khoản của thiết bị tìm kiếm, để giảm tỷ lệ dương tính giả hơn nữa. Trong một số trường hợp, Nhà cung cấp có thể muốn Thiết bị tìm kiếm nhận ra nhưng chưa sẵn sàng ghép nối. Ví dụ: khi tai nghe được đặt trở lại vào hộp, chúng ta muốn dừng hiển thị thông báo ghép nối tiếp theo vì tai nghe có thể từ chối việc ghép nối đó.

Bộ lọc khoá tài khoản là một bộ lọc Bloom có độ dài biến thiên được tạo như sau:

  1. Giả sử n là số lượng khoá tài khoản (n >= 1) trong Danh sách khoá tài khoản cố định.
  2. Giả sử s là kích thước của bộ lọc tính bằng byte, được cắt bớt (1, 2*n + 3). Ví dụ: nếu 1 khoá được duy trì, s = 4 byte.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Khởi chạy bộ lọc F dưới dạng một mảng gồm s byte, mỗi byte được đặt thành 0.
    uint8_t F[s] = {0};
  4. Đối với mỗi khoá tài khoản K trong Danh sách khoá tài khoản cố định:
    a. Đặt V là concat(K, Salt).

    // In the sample code, the size of salt is 2 bytes.
    #define SALT_SIZE 2
    
    uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE];
    for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++)
      {
         // concat (K, Salt)
          fastpair_get_account_key_by_index(keyIndex, V);
    
          uint8_t randomSalt = (uint8_t)rand();
          V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt;
          ... }
    

    b. Băm V bằng SHA256, thu được giá trị 32 byte H = {H0, …, H31}.

    uint8_t H[32] = {0};
    SHA256_hash_function(V, H);
    

    c. Chia H thành 8 số nguyên không dấu 4 byte theo thứ tự byte cuối lớn, X = {X0, …, X7}, trong đó X0 = 0xH0H1H2H3.

         uint32_t X[8];
         for (index = 0; index < 8; index++)
         {
            X[index] = (((uint32_t)(H[index * 4])) << 24) |
                        (((uint32_t)(H[index * 4 + 1])) << 16) |
                        (((uint32_t)(H[index * 4 + 2])) << 8) |
                        (((uint32_t)(H[index * 4 + 3])) << 0);
         }
    

    d. Đối với mỗi Xi:
    i. Giả sử M là Xi modulo số bit trong bộ lọc, (s * 8).
    ii. Lấy byte trong F tại chỉ mục (M / 8), làm tròn xuống.
    iii. Trong byte, hãy đặt bit tại chỉ mục (M % 8) thành 1.
    iv. Nói cách khác:

        // M = Xi % (s * 8)
        // F[M/8] = F[M/8] | (1 << (M % 8))
        for (index = 0; index < 8; index++)
        {
            uint32_t M    = X[index] % (s * 8);
            F[M / 8] = F[M / 8] | (1 << (M % 8));
        }
    

Thêm bộ lọc F làm trường Bộ lọc khoá tài khoản trong dữ liệu quảng cáo. Xin lưu ý rằng không có "endianness" (thứ tự byte) cho giá trị này, vì không có byte nào quan trọng hơn hoặc ít quan trọng hơn — đừng thay đổi thứ tự byte.

Ruộng muối

Salt là một giá trị ngẫu nhiên được thêm vào khoá tài khoản khi tạo bộ lọc Bloom. Giá trị salt này phải được tạo lại mỗi khi RPA được cập nhật cho Nhà cung cấp để tránh việc theo dõi trong quá trình xoay vòng địa chỉ.

Cách tạo Bộ lọc khoá tài khoản bằng muối:

  1. Tạo một S 2 byte ngẫu nhiên. Xin lưu ý rằng giá trị này không có "endianness" (thứ tự byte) vì không có byte nào quan trọng hơn hoặc ít quan trọng hơn — đừng thay đổi thứ tự byte.
  2. Sử dụng S 2 byte làm Salt.
  3. Trong Dữ liệu tài khoản Ghép nối nhanh được quảng cáo, hãy thêm bộ lọc đã tạo vào trường Bộ lọc khoá tài khoản và S vào trường Salt.