تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
رمز مصادقة الرسالة
تُستخدم بث الرسائل لضبط تبديل الصوت، ويمكنك الاطّلاع على
رسائل تبديل الصوت: بالنسبة إلى هذه الإعدادات المهمة، يحتاج موفّر الخدمة
للتأكُّد من إرسال الرسالة من خلال وحدة "الإقران السريع" (GMSCore) وليس من خلال
تطبيق آخر على Seeker.
إنشاء رمز مصادقة الرسائل (MAC)
يضيف FP Seeker رمز مصادقة الرسائل إلى رسائل إعداد الجهاز
باستخدام HMAC-SHA256. يتكون عنوان MAC للرسالة من أول 8 بايت من:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
أين
- يتم إنشاء K بواسطة concat(account key, 48-byte ZEROs).
- message هي البيانات الإضافية لمصدر الرسائل.
- يتم إنشاء nonce بواسطة concat(session_nonce, message_nonce); جلسة
يتم تعريف nonce وmessage nonce في القسم التالي.
- opad هي 64 بايت من المساحة المتروكة الخارجية، وهي تتكون من وحدات بايت متكررة يتم تقديرها
0x5C
- ipad عبارة عن 64 بايت من المساحة المتروكة الداخلية، وهي تتكون من وحدات بايت متكررة يتم تقديرها
0x36
نسبة عدم تسجيل الجلسة والرسالة
لمنع هجوم إعادة التشغيل، يحتاج موفّر الخدمة إلى التأكد من عدم حدوث
متكررة. نظرًا للحفاظ على مزامنة الساعة أو العدّاد في كلٍ من موفّر الخدمة
وكانت أداة البحث سهلة الاستخدام، ينشئ الموفر الجلسة بدون
(لكل اتصال)، التي تتم مشاركتها مع جميع الرسائل أثناء الاتصال،
بينما يقوم الباحث بإنشاء الرسالة nonce (لكل رسالة)، والتي يتم إجراؤها بشكل عشوائي
يتم إنشاؤه لكل رسالة. الجزء الخاص بإنشاء عنوان MAC لكل رسالة هو
الجمع بين رقم الجلسة وعدم الاتصال، أي
concat(session_nonce, message_nonce).
أضفنا جلسة تلقائية إلى مجموعة حدث "معلومات الجهاز":
اسم مجموعة الرسائل |
القيمة |
حدث معلومات الجهاز |
0x03 |
اسم رمز الرسالة |
القيمة |
عدد مرات الجلسة |
0×0 أمبير |
يجب إنشاء رقم جلسة المراجعة وإرساله إلى الباحث عند إدخال بروتوكول RFCOMM.
الربط:
ثُمانِي واحد |
نوع البيانات |
الوصف |
القيمة |
0 |
uint8 |
حدث معلومات الجهاز |
0x03 |
1 |
uint8 |
عدد مرات الجلسة |
0×0 أمبير |
2 - 3 |
uint16 |
طول البيانات الإضافية |
0×0008 |
من 4 إلى 11 |
|
رقم الجلسة |
تختلف |
لإرسال رسالة عندما يكون عنوان MAC مطلوبًا، سيرسل الباحث رسالة بدون
وعنوان MAC مع الرسالة.
ثُمانِي واحد |
نوع البيانات |
الوصف |
القيمة |
0 |
uint8 |
مجموعة الرسائل |
تختلف |
1 |
uint8 |
رمز الرسالة |
تختلف |
2 - 3 |
uint16 |
طول البيانات الإضافية(طول البيانات الإضافية + 16) |
تختلف |
4 - n |
|
البيانات الإضافية |
تختلف |
n + 1 - n + 8 |
|
رسالة رقم |
تختلف |
n + 9 - n + 16 |
|
رمز مصادقة الرسائل |
تختلف |
التحقق من رمز MAC (رمز مصادقة الرسائل)
عند استلام رسالة تحتوي على رمز مصادقة الرسالة، موفّر الخدمة
التحقق منه باستخدام نفس الدالة مثل دالة الإنشاء. أي،
يجب أن يكون عنوان MAC الذي تم استلامه مساوية لأول 8 بايت من
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
حيث:
- تم إنشاء K بواسطة
concat(account key, 48-byte ZEROs)
، وموفّر الخدمة
يجتاز جميع مفاتيح الحساب المخزنة للتحقق من عنوان MAC.
- message هي البيانات الإضافية (باستثناء رقم الرسالة وعنوان MAC) الخاص
ساحة مشاركات الرسائل.
إذا كان عنوان MAC صحيحًا، فسيتبع الموفر تعليمات
. وبخلاف ذلك، سيرسل الموفر NAK مع سبب الخطأ، 0x3 -
غير مسموح به بسبب وجود رمز غير صحيح لمصادقة الرسالة.
إنّ محتوى هذه الصفحة مرخّص بموجب ترخيص Creative Commons Attribution 4.0 ما لم يُنصّ على خلاف ذلك، ونماذج الرموز مرخّصة بموجب ترخيص Apache 2.0. للاطّلاع على التفاصيل، يُرجى مراجعة سياسات موقع Google Developers. إنّ Java هي علامة تجارية مسجَّلة لشركة Oracle و/أو شركائها التابعين.
تاريخ التعديل الأخير: 2025-08-13 (حسب التوقيت العالمي المتفَّق عليه)
[null,null,["تاريخ التعديل الأخير: 2025-08-13 (حسب التوقيت العالمي المتفَّق عليه)"],[[["\u003cp\u003eMessage Authentication Codes (MACs) are used to verify that Fast Pair configuration messages originate from Google Mobile Services (GMSCore) and not other apps.\u003c/p\u003e\n"],["\u003cp\u003eMACs are generated using HMAC-SHA256, incorporating session and message nonces to prevent replay attacks.\u003c/p\u003e\n"],["\u003cp\u003eProviders initiate a session nonce upon RFCOMM connection and seekers generate a unique message nonce for each message.\u003c/p\u003e\n"],["\u003cp\u003eTo verify a message, providers compute the MAC using the received data and compare it with the received MAC, using stored account keys for verification.\u003c/p\u003e\n"],["\u003cp\u003eIf MAC verification fails, the provider sends a NAK message indicating an incorrect authentication code.\u003c/p\u003e\n"]]],["Message Authentication Code (MAC) ensures messages originate from GMSCore. The Seeker generates a MAC using HMAC-SHA256, derived from a key (K), nonce, and message data. The nonce combines a per-connection session nonce (Provider-generated) and a per-message nonce (Seeker-generated). The Seeker transmits the message nonce and MAC with each message. The Provider verifies the MAC using the same function and stored keys, acting on the message only if the MAC is correct. If not, a NAK is sent.\n"],null,["Message Authentication Code\n---------------------------\n\n[Message streams](/nearby/fast-pair/specifications/extensions/messagestream#MessageStream \"message stream\") are used to configure Audio switch, see\n[Audio switch messages](/nearby/fast-pair/specifications/extensions/sass#MacOfSassMessages \"MAC of Audio switch Messages\"). For these important configurations, the Provider needs\nto ensure that the message is sent by GMSCore (Fast Pair module) and not any\nother app on the Seeker.\n| **Note:** Google recommends implementing the [Cryptographic Test Cases](/nearby/fast-pair/specifications/appendix/cryptotestcases \"Link to the Cryptographic Test Cases.\") to ease verification of these requirements.\n\n### Generate MAC (message authentication code)\n\nFP Seeker adds a message authentication code for device configuration messages\nusing HMAC-SHA256. The MAC of the message consists of the first 8 bytes of: \n\n sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))\n\nwhere\n\n1. *K* is generated by concat(account key, 48-byte ZEROs).\n2. *message* is the additional data of Message stream.\n3. *nonce* is generated by concat(session_nonce, message_nonce); session nonce and message nonce are defined in the following section.\n4. *opad* is 64 bytes of outer padding, consisting of repeated bytes valued `0x5C`.\n5. *ipad* is 64 bytes of inner padding, consisting of repeated bytes valued `0x36`.\n\n### Session nonce and message nonce\n\nTo prevent a replay attack, the Provider needs to ensure that a nonce is not\nrepeated. Since maintaining clock or counter synchronization on both Provider\nand Seeker is not straightforward, the Provider generates the session nonce\n(per connection), which is shared with all messages during the connection,\nwhile the Seeker generates the message nonce (per message), which is randomly\ngenerated for each message. The nonce for generating the MAC of each message is\nthe combination of session nonce and message nonce, i.e.\nconcat(session_nonce, message_nonce).\n\nWe add a session nonce to the Device information event group:\n\n| Message Group Name | Value |\n|--------------------------|-------|\n| Device information event | 0x03 |\n\n| Message Code Name | Value |\n|-------------------|-------|\n| Session nonce | 0x0A |\n\nThe session nonce should be generated and sent to the Seeker when RFCOMM\nconnects:\n\n| Octet | Data Type | Description | Value |\n|--------|-----------|--------------------------|----------|\n| 0 | uint8 | Device information event | 0x03 |\n| 1 | uint8 | Session nonce | 0x0A |\n| 2 - 3 | uint16 | Additional data length | 0x0008 |\n| 4 - 11 | | session nonce | *varies* |\n\nTo send a message when a MAC is required, the Seeker will send a message nonce\nand the MAC together with the message.\n\n| Octet | Data Type | Description | Value |\n|----------------|-----------|---------------------------------------------------------|----------|\n| 0 | uint8 | Message group | *varies* |\n| 1 | uint8 | Message code | *varies* |\n| 2 - 3 | uint16 | Additional data length(the additional data length + 16) | *varies* |\n| 4 - n | | Additional data | *varies* |\n| n + 1 - n + 8 | | Message nonce | *varies* |\n| n + 9 - n + 16 | | Message authentication code | *varies* |\n\n### Verify MAC (message authentication code)\n\nUpon receiving a message with the message authentication code, the Provider\nshall verify it by using the same function as the generating function. That is,\nthe received MAC should be equal to the first 8 bytes of \n\n sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))\n\nwhere:\n\n1. *K* is generated by `concat(account key, 48-byte ZEROs)`, and the Provider shall traverse all stored account keys to verify the MAC.\n2. *message* is the additional data (excluding message nonce and MAC) of the Message stream.\n\nIf the MAC is correct, then the Provider shall follow the instruction of the\nmessage. Otherwise, the Provider shall send a NAK with the error reason, 0x3 -\nnot allowed due to incorrect message authentication code."]]