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ị 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ể khám phá
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 Trình tìm kiếm nhanh chóng tìm thấy Nhà cung cấp, ngay cả khi quét ở chế độ tiết kiệm pin.
Trọng tải 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ụ, tương tự như vậy, § 1.11. UUID này sẽ là UUID Dịch vụ ghép nối nhanh của 0xFE2C
. 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-2 | uint24 |
Mã mẫu 24 bit | thay đổi |
Quảng cáo: Khi không thể tìm thấy
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 Người tìm kiếm ở gần nhận ra thời điểm 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). Trình tìm kiếm sẽ cho phép người dùng bỏ qua thông báo truyền tin này trong trường hợp họ không đợi ghép nối với nhà cung cấp hoặc thông báo truyền tin không liên quan (ví dụ: nếu họ đã ghép nối). Trình tìm kiếm cũng sẽ tự động lọc ra các chương trình phát sóng rõ ràng là không tốt, chẳng hạn như khi dữ liệu tài khoản được định cấu hình không chính xác.
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 (4 Hz).
Trọng tải 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ụ, Ibid., § 1.11. UUID này sẽ là UUID Dịch vụ ghép nối nhanh của 0xFE2C
. 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
|
0x00 (dành để sử dụng trong tương lai) |
1 – biến đổi | Dữ liệu khoá tài khoản | biến đổi |
Dữ liệu khoá tài khoản chứa:
Octet | Loại dữ liệu | Mô tả | Giá trị |
---|---|---|---|
0 | uint8 |
Độ dài và loại trường 0bLLLLTTTT
|
0bLLLL0000
|
1 – giây | Bộ lọc khoá tài khoản | thay đổi | |
s + 1 | uint8 |
Độ dài và loại trường 0bLLLLTTTT
|
0b00100001
|
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 Người 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% nhiều) trước khi tương tác thêm. Trình 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 tin với loại 0, tức là hiển thị chỉ báo giao diện người dùng, có thể chứa một trong các khoá tài khoản của bộ lọc đó, để giảm tỷ lệ dương tính giả hơn nữa. Trong một số trường hợp, Trình cung cấp có thể muốn Trình tìm kiếm nhận dạng mình trong khi chưa sẵn sàng ghép nối. Ví dụ: khi người dùng đặt lại tai nghe vào hộp, chúng ta muốn ngừng hiển thị thông báo ghép nối tiếp theo vì tai nghe có thể từ chối ghép nối đó.
Bộ lọc khoá tài khoản là một bộ lọc Bloom có độ dài biến đổi được tạo như sau:
- Giả sử n là số lượng khoá tài khoản (n >= 1) trong Danh sách khoá tài khoản ổn định.
- Giả sử s, kích thước của bộ lọc tính bằng byte, là (1,2*n + 3) bị cắt bớt. Ví dụ: nếu 1 khoá được duy trì, s = 4 byte.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- Khởi chạy bộ lọc F dưới dạng một mảng gồm các byte s, mỗi byte được đặt thành 0.
uint8_t F[s] = {0};
Đối với mỗi khoá tài khoản K trong Danh sách khoá tài khoản ổn định:
a. Gọi 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. Hàm băm V bằng SHA256, nhận đượ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ự big-endian, 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. Gọi M là Xi theo 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ó "thứ tự byte" nào 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
Giá trị băm 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. Bạn nên tạo lại muối này mỗi khi cập nhật RPA để Nhà cung cấp tránh theo dõi việc xoay vòng địa chỉ.
Cách tạo Bộ lọc khoá tài khoản bằng muối:
- Tạo một S 2 byte ngẫu nhiên. Xin lưu ý rằng không có "thứ tự byte" đối với 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.
- Sử dụng S 2 byte làm Salt.
- Trong Dữ liệu tài khoản Ghép nối nhanh được quảng cáo, hãy đưa bộ lọc đã tạo vào trường Bộ lọc khoá tài khoản và S vào trường Salt (Muối).