Mã xác thực gói tin
Luồng thông báo được dùng để định cấu hình tính năng Chuyển đổi âm thanh. Hãy xem bài viết Thông báo chuyển đổi âm thanh. Đối với các cấu hình quan trọng này, Nhà cung cấp cần đảm bảo rằng thông báo được gửi bởi GMSCore (mô-đun Ghép nối nhanh) chứ không phải bất kỳ ứng dụng nào khác trên Thiết bị tìm kiếm.
Tạo MAC (mã xác thực gói tin)
Thiết bị tìm kiếm FP thêm mã xác thực gói tin cho các thông báo cấu hình thiết bị bằng HMAC-SHA256. MAC của thông báo bao gồm 8 byte đầu tiên của:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
trong đó
- K được tạo bằng cách nối(khoá tài khoản, 48 byte ZERO).
- message là dữ liệu bổ sung của Luồng thông báo.
- nonce được tạo bằng cách nối(session_nonce, message_nonce); session nonce và message nonce được xác định trong phần sau.
- opad là 64 byte phần đệm bên ngoài, bao gồm các byte lặp lại có giá trị
0x5C. - ipad là 64 byte phần đệm bên trong, bao gồm các byte lặp lại có giá trị
0x36.
Session nonce và message nonce
Để ngăn chặn cuộc tấn công phát lại, Nhà cung cấp cần đảm bảo rằng nonce không được lặp lại. Vì việc duy trì đồng bộ hoá đồng hồ hoặc bộ đếm trên cả Nhà cung cấp và Thiết bị tìm kiếm không đơn giản, nên Nhà cung cấp sẽ tạo session nonce (cho mỗi kết nối), được chia sẻ với tất cả thông báo trong quá trình kết nối, trong khi Thiết bị tìm kiếm tạo message nonce (cho mỗi thông báo), được tạo ngẫu nhiên cho từng thông báo. Nonce để tạo MAC của mỗi thông báo là sự kết hợp của session nonce và message nonce, tức là nối(session_nonce, message_nonce).
Chúng tôi thêm session nonce vào nhóm sự kiện Thông tin thiết bị:
| Tên nhóm thông báo | Giá trị |
|---|---|
| Sự kiện thông tin thiết bị | 0x03 |
| Tên mã thông báo | Giá trị |
|---|---|
| Session nonce | 0x0A |
Session nonce phải được tạo và gửi đến Thiết bị tìm kiếm khi Luồng thông báo kết nối:
| Octet | Loại dữ liệu | Mô tả | Giá trị |
|---|---|---|---|
| 0 | uint8 | Sự kiện thông tin thiết bị | 0x03 |
| 1 | uint8 | Session nonce | 0x0A |
| 2 - 3 | uint16 | Độ dài dữ liệu bổ sung | 0x0008 |
| 4 - 11 | session nonce | khác nhau |
Để gửi thông báo khi cần có MAC, Thiết bị tìm kiếm sẽ gửi message nonce và MAC cùng với thông báo.
| Octet | Loại dữ liệu | Mô tả | Giá trị |
|---|---|---|---|
| 0 | uint8 | Nhóm thông báo | khác nhau |
| 1 | uint8 | Mã thông báo | khác nhau |
| 2 - 3 | uint16 | Độ dài dữ liệu bổ sung(độ dài dữ liệu bổ sung + 16) | khác nhau |
| 4 - n | Dữ liệu bổ sung | khác nhau | |
| n + 1 - n + 8 | Message nonce | khác nhau | |
| n + 9 - n + 16 | Mã xác thực gói tin | khác nhau |
Xác minh MAC (mã xác thực gói tin)
Sau khi nhận được thông báo có mã xác thực gói tin, Nhà cung cấp sẽ xác minh thông báo đó bằng cách sử dụng cùng một hàm với hàm tạo. Tức là MAC nhận được phải bằng 8 byte đầu tiên của
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
trong đó:
- K được tạo bằng
concat(account key, 48-byte ZEROs), và Nhà cung cấp sẽ duyệt qua tất cả các khoá tài khoản đã lưu trữ để xác minh MAC. - message là dữ liệu bổ sung (không bao gồm message nonce và MAC) của Luồng thông báo.
Nếu MAC chính xác, thì Nhà cung cấp sẽ làm theo hướng dẫn của thông báo. Nếu không, Nhà cung cấp sẽ gửi NAK kèm theo lý do lỗi, 0x3 – không được phép do mã xác thực gói tin không chính xác.