Đặ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ờ
|
khác nhau | Bắt buộc |
2–7 | uint48 |
Hoặc:
|
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:
|
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ờ:
|
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ố:
|
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:
- 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.
- Đối với các Trì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 còn lại có chỗ trống cho giá trị.
- Nếu không, hãy xoá giá trị ít đượ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 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:
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.
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:
|
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:
- 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 trong bước 4 trong quy trình.
- 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.
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ởi concat(shared_secret, các số không 48 byte), hàm shared_secret là 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 dài 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 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:
- 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 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.
- Khoá AES được tạo hoặc xác định bằng quá trình bắt tay, ví dụ:
- 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.
- trong quy trình đặt tên 2, đây là khoá tài khoản.
Thực hiện concat(clearBlock[0], clearBlock[1],...) để tạo dữ liệu thô.