Đặ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ờ
|
không cố định | Bắt buộc |
2 – 7 | uint48 |
Hoặc:
|
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:
|
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ờ:
|
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:
|
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:
- 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.
- Đối với Nhà cung cấp yêu cầu liên kết (phổ biến):
- 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. - 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.
- Nếu không, hãy xoá giá trị được sử dụng gần đây nhất khỏi danh sách.
- 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:
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.
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:
|
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:
- Tạo 8 byte ngẫu nhiên theo 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 ở bước 4 trong 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ể dưới 16 byte.
Hãy thực hiện concat(encryptedBlock[0], encryptedBlock[1],...) để tạo Dữ liệu đã mã hóa.
Tạo HMAC-SHA256 bằng
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
trong đó
- K được tạo bởi concat(shared_secret, ZEROs 48 byte), shared_secret từ bước 4 trong quy trình.
- opad là khoảng đệm ngoài 64 byte, bao gồm các byte lặp lại có giá trị
0x5C
. - 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
.
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:
- 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 qua cơ chế bắt tay, ví dụ:
- 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.
- trong quy trình đặt tên 2, đó là khoá tài khoản.
Thực hiện concat(clearBlock[0], clearBlock[1],...) để tạo dữ liệu thô.