رمز مصادقة الرسائل
تُستخدَم مصادر الرسائل لضبط ميزة "تبديل الصوت"، يُرجى الاطّلاع على رسائل ميزة "تبديل الصوت". بالنسبة إلى عمليات الإعداد المهمة هذه، على مقدّم الخدمة التأكّد من أنّ الرسالة مرسَلة من GMSCore (وحدة الإقران السريع) وليس من أي تطبيق آخر على جهاز الباحث.
إنشاء رمز مصادقة الرسائل
يضيف جهاز الباحث في Fast Pair رمز مصادقة الرسائل لرسائل إعداد الجهاز باستخدام HMAC-SHA256. يتألّف رمز مصادقة الرسائل من أول 8 بايت من:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
أين
- K يتم إنشاؤه من خلال concat(مفتاح الحساب، أصفار بطول 48 بايت).
- message هي البيانات الإضافية لمصدر الرسائل.
- nonce يتم إنشاؤه من خلال concat(session_nonce, message_nonce)، ويتم تحديد session nonce وmessage nonce في القسم التالي.
- opad هي 64 بايت من الحشو الخارجي، تتألّف من بايت متكررة قيمتها
0x5C. - ipad هي 64 بايت من الحشو الداخلي، تتألّف من بايت متكررة قيمتها
0x36.
session nonce وmessage nonce
لمنع هجوم إعادة التشغيل، على مقدّم الخدمة التأكّد من عدم تكرار nonce. بما أنّ الحفاظ على مزامنة الساعة أو العداد على كلّ من مقدّم الخدمة وجهاز الباحث ليس أمرًا سهلاً، ينشئ مقدّم الخدمة session nonce (لكل اتصال)، ويتم مشاركته مع جميع الرسائل أثناء الاتصال، بينما ينشئ جهاز الباحث message nonce (لكل رسالة)، ويتم إنشاؤه عشوائيًا لكل رسالة. إنّ nonce لإنشاء رمز مصادقة الرسائل لكل رسالة هو مزيج من session nonce وmessage nonce، أي concat(session_nonce, message_nonce).
نضيف session nonce إلى مجموعة أحداث "معلومات الجهاز":
| اسم مجموعة الرسائل | القيمة |
|---|---|
| حدث معلومات الجهاز | 0x03 |
| اسم رمز الرسالة | القيمة |
|---|---|
| session nonce | 0x0A |
يجب إنشاء session nonce وإرساله إلى جهاز الباحث عند اتصال مصدر الرسائل:
| ثُمانِي واحد | نوع البيانات | الوصف | القيمة |
|---|---|---|---|
| 0 | uint8 | حدث معلومات الجهاز | 0x03 |
| 1 | uint8 | session nonce | 0x0A |
| 2 - 3 | uint16 | طول البيانات الإضافية | 0x0008 |
| 4 - 11 | session nonce | تختلف |
لإرسال رسالة عندما يكون رمز مصادقة الرسائل مطلوبًا، سيرسل جهاز الباحث message nonce ورمز مصادقة الرسائل مع الرسالة.
| ثُمانِي واحد | نوع البيانات | الوصف | القيمة |
|---|---|---|---|
| 0 | uint8 | مجموعة الرسائل | تختلف |
| 1 | uint8 | رمز الرسالة | تختلف |
| 2 - 3 | uint16 | طول البيانات الإضافية(طول البيانات الإضافية + 16) | تختلف |
| 4 - n | البيانات الإضافية | تختلف | |
| n + 1 - n + 8 | message nonce | تختلف | |
| n + 9 - n + 16 | رمز مصادقة الرسائل | تختلف |
التحقّق من رمز مصادقة الرسائل
عند تلقّي رسالة تحتوي على رمز مصادقة الرسائل، على مقدّم الخدمة التحقّق منه باستخدام الدالة نفسها التي استُخدِمت لإنشائه. أي يجب أن يكون رمز مصادقة الرسائل المستلَم مساويًا لأول 8 بايت من
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
أين:
- K يتم إنشاؤه من خلال
concat(account key, 48-byte ZEROs)، وعلى مقدّم الخدمة الانتقال إلى جميع مفاتيح الحساب المخزّنة للتحقّق من رمز مصادقة الرسائل. - message هي البيانات الإضافية (باستثناء message nonce ورمز مصادقة الرسائل) لـ مصدر الرسائل.
إذا كان رمز مصادقة الرسائل صحيحًا، على مقدّم الخدمة اتّباع تعليمات الرسالة. وإلا، على مقدّم الخدمة إرسال رسالة NAK تتضمّن سبب الخطأ، وهو 0x3 - غير مسموح به بسبب رمز مصادقة الرسائل غير الصحيح.