Đặ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 khoá | 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 |
Device Information Service
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) |
|---|---|
| Device Information Service | 0x180A |
Ghép nối nhanh Seeker 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: Mã mẫu
Đặc điểm này cho phép Seeker đọc mã nhận dạng mô hình khi cần, ngoài thời điểm thiết bị quảng cáo ở chế độ có thể phát hiện. Thao tác 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ả Người tìm kiếm và Nhà cung cấp đều có khoá được chia sẻ trước. Khoá sẽ khác nhau trong mỗi trường hợp:
Trường hợp 1: Khoá dùng chung 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 Seeker sẽ thay đổi cho mỗi lần thử ghép nối.
- Nhà cung cấp đang ở chế độ ghép nối.
- Người yêu cầu xác minh rằng Nhà cung cấp đang sở hữu khoá riêng tư chống giả mạo.
Xin lưu ý rằng khi ở chế độ ghép nối, tất nhiên, 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 công nghệ 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.)
- Seeker và Provider đều xác minh rằng bên kia đang sở hữu khoá tài khoản.
Vì cả hai trường hợp này đều cực kỳ giống nhau, ngoại trừ việc sử dụng khoá dùng chung trước, nên chúng được kết hợp trong quy trình.
Định dạng dữ liệu
Hãy xem thủ tục về 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á, do Người tìm kiếm 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ờ
|
tuỳ thuộc | Bắt buộc |
| 2 – 7 | uint48 |
Một trong hai điều kiện sau:
|
tuỳ thuộc | Bắt buộc |
| 8 – 13 | uint48 |
Địa chỉ BR/EDR của thiết bị tìm kiếm | tuỳ thuộc | Chỉ xuất hiện nếu bạn đặt Flags Bit 1 hoặc 3 |
| n – 15 | Giá trị ngẫu nhiên (salt) | tuỳ thuộc | 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ờ
|
tuỳ thuộc | Bắt buộc |
| 2 – 7 | uint48 |
Một trong hai điều kiện sau:
|
tuỳ thuộc | Bắt buộc |
| 8 | uint8 |
Nhắn tin cho nhóm | tuỳ thuộc | Bắt buộc nếu bạn đặt Cờ bit 0 |
| 9 | uint8 |
Mã thông báo | tuỳ thuộc | Bắt buộc nếu bạn đặt Cờ bit 0 |
| 10 | uint8 |
Tuỳ thuộc vào cờ:
|
tuỳ thuộc | Bắt buộc nếu bạn đặt Cờ bit 0 hoặc 1 |
| 11 – n | Dữ liệu khác | tuỳ thuộc | Không bắt buộc | |
| n – 15 | Giá trị ngẫu nhiên (salt) | tuỳ thuộc | 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 | tuỳ thuộc |
| 7 – 15 | Giá trị ngẫu nhiên (salt) | tuỳ thuộc |
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.
| Octet | Loại dữ liệu | Mô tả | Giá trị |
|---|---|---|---|
| 0 – 15 | uint128 |
Phản hồi được mã hoá | tuỳ thuộc |
Bảng 1.4: Phản hồi đã 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á.
| Octet | Loại dữ liệu | Mô tả | Giá trị |
|---|---|---|---|
| 0 – 15 | uint128 |
Khối khoá truy cập đã mã hoá | tuỳ thuộc |
Bảng 2.1: Khối khoá truy cập đã mã hoá. Xem quy trình Ghép nối dựa trên khoá để 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:
|
| 1 - 3 | unit32 |
Khoá truy cập gồm 6 chữ số | tuỳ thuộc |
| 4 – 15 | Giá trị ngẫu nhiên (salt) | tuỳ thuộc |
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, Fast Pair Seeker sẽ ghi Khoá tài khoản vào Fast Pair Provider.
| Octet | Loại dữ liệu | Mô tả | Giá trị |
|---|---|---|---|
| 0 – 15 | uint128 |
Khoá tài khoản (đã mã hoá) | tuỳ thuộc |
Khi nhận được yêu cầu ghi, Nhà cung cấp Ghép nối nhanh sẽ làm như sau:
- 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ững Nhà cung cấp yêu cầu liên kết (thường gặp):
- 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 chưa hoàn tất bằ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 dùng lại cho lần 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.
- Đối với những Nhà cung cấp yêu cầu liên kết (thường gặp):
- Xác minh rằng giá trị đã giải mã bắt đầu bằng
0x04hoặc0xFF. 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 duy trì có đủ dung lượng cho giá trị mới hay không.
- Nếu không, hãy xoá giá trị ít được dùng 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 theo cách hồi tố.
- Không lưu trữ khoá và không dùng khoá này trong Danh sách khoá tài khoản, quá trình mã hoá hoặc tính toán MAC.
- Việc xoá mối liên kết sẽ được kích hoạt bởi một sự kiện hoặc thời gian chờ dành riêng cho tính năng. Đối với tính năng Chia sẻ âm thanh LE, bạn nên xoá mối liên kết BLE và khoá liên kết 10 phút sau khi phiên tạm thời ngắt kết nối.
- Nếu giá trị là
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: Bản sửa đổi chương trình cơ sở
Đặc điểm này cho phép Seeker đọc bản sửa đổi chương trình cơ sở của Provider khi cần. Thao tác 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ã phiên bản chương trình cơ sở | tuỳ thuộc |
Bạn nên đó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:
status-updating: 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ở được dàn dựng.
status-abnormal: nếu Nhà cung cấp ở trạng thái bất thường. Ví dụ: thiết bị bị trục trặ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ị một 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 hạn chế quyền truy cập vào đặc điểm Phiên bản phần sụn để ngăn chặn việc theo dõi thiết bị. Các quy định hạn chế được đề xuất:
- các thiết bị đã liên kết phải có quyền truy cập bất cứ lúc nào
- mọi thiết bị đều có quyền truy cập khi Nhà cung cấp có thể phát hiện
Đặc điểm: Dữ liệu bổ sung
Dịch vụ này sẽ 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ủa Dịch vụ Ghép nối nhanh cũ (dự kiến sẽ 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 cái 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ủa đặc điểm này được xác định bên dưới. Chế độ này an toàn 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 dưới đây.
| Octet | Mô tả | Giá trị |
|---|---|---|
| 0 - 7 | 8 byte đầu tiên của HMAC-SHA256. | tuỳ thuộc |
| 8 – 15 | Số chỉ dùng một lần, được dùng để mã hoá AES-CTR. | tuỳ thuộc |
| 16 – var | Dữ liệu đã mã hoá. | tuỳ thuộc |
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 một thông báo hoặc do Người tìm kiếm gửi đến Nhà cung cấp thông qua một thao tác ghi.
| Octet | Loại dữ liệu | Mô tả | Giá trị |
|---|---|---|---|
| 0 – var | byte array |
Dữ liệu | varies, giải mã theo Mã nhận dạng dữ liệu của Bảng 1.2.2:
|
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 Ghép nối nhanh sẽ làm như sau:
- Tạo 8 byte ngẫu nhiên được mã hoá cho Số chỉ dùng một lần.
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 đó
- Khoá AES là khoá bí mật dùng chung trong bước 4 của quy trình.
- 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.
Thực hiện concat(encryptedBlock[0], encryptedBlock[1],...) để tạo Dữ liệu đã mã hoá.
Tạo HMAC-SHA256 bằng cách
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))trong đó
- K được tạo bằng cách concat(shared_secret, 48-byte ZEROs), shared_secret là từ bước 4 trong quy trình.
- opad là phần đệm bên ngoài 64 byte, bao gồm các byte lặp lại có giá trị
0x5C. - ipad là phần đệm bên trong 64 byte, bao gồm các byte lặp lại có giá trị 0x0A
0x36.
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 Ghép nối nhanh sẽ làm như sau:
- 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.
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 đó
- 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.
- Khoá AES được tạo hoặc xác định từ quá trình bắt tay, ví dụ:
- trong quy trình đặt tên 1, đó là từ ECDH và sẽ không được dùng lại cho lần 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.
- trong naming flow 2, đây là khoá tài khoản.
Thực hiện concat(clearBlock[0], clearBlock[1],...) để tạo dữ liệu thô.