קוד אימות הודעות
הודעות על שינוי מקור האודיו משמשות להגדרת שינוי מקור האודיו. במקרה של ההגדרות החשובות האלה, הספק צריך לוודא שההודעה נשלחת על ידי GMSCore (מודול Fast Pair) ולא על ידי אפליקציה אחרת במכשיר המחפש.
יצירת קוד אימות הודעות (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 הוא הנתון הנוסף של מקור הנתונים Message.
- הערך של nonce נוצר על ידי שרשור של session_nonce ו-message_nonce. הערכים האלה מוגדרים בקטע הבא.
- opad הוא ריפוד חיצוני של 64 בייטים, שמורכב מבייטים חוזרים עם הערך
0x5C. - ipad הוא ריפוד פנימי של 64 בייטים, שמורכב מבייטים חוזרים עם הערך
0x36.
ערך חד-פעמי של סשן וערך חד-פעמי של הודעה
כדי למנוע מתקפת שידור חוזר, הספק צריך לוודא שערך ה-nonce לא חוזר על עצמו. מכיוון ששמירה על סנכרון של השעון או של המונה אצל הספק והמשתמש היא לא פשוטה, הספק יוצר את ה-nonce של הסשן (לכל חיבור), שמשותף לכל ההודעות במהלך החיבור, ואילו המשתמש יוצר את ה-nonce של ההודעה (לכל הודעה), שנוצר באופן אקראי לכל הודעה. ה-nonce ליצירת ה-MAC של כל הודעה הוא השילוב של nonce של סשן ו-nonce של הודעה, כלומר concat(session_nonce, message_nonce).
אנחנו מוסיפים ערך חד-פעמי של סשן לקבוצת האירועים 'פרטי המכשיר':
| שם קבוצת ההודעות | ערך |
|---|---|
| אירוע פרטי מכשיר | 0x03 |
| שם הקוד של ההודעה | ערך |
|---|---|
| Session nonce | 0x0A |
ערך ה-nonce של הסשן צריך להיווצר ולהישלח אל Seeker כשמתבצע חיבור של Message Stream:
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 | אירוע פרטי מכשיר | 0x03 |
| 1 | uint8 | Session nonce | 0x0A |
| 2 - 3 | uint16 | אורך נתונים נוסף | 0x0008 |
| 4 - 11 | צופן חד-פעמי (nonce) של סשן | משתנה |
כדי לשלוח הודעה כשנדרש MAC, המבקש ישלח את ה-nonce של ההודעה ואת ה-MAC יחד עם ההודעה.
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 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)))))
where:
- K נוצר על ידי
concat(account key, 48-byte ZEROs), והספק צריך לעבור על כל מפתחות החשבון שמאוחסנים כדי לאמת את ה-MAC. - message הם הנתונים הנוספים (לא כולל nonce ו-MAC של ההודעה) של מקור הנתונים Message.
אם קוד ה-MAC נכון, הספק יפעל לפי ההוראות שבהודעה. אחרת, הספק ישלח NAK עם סיבת השגיאה, 0x3 – לא מורשה בגלל קוד אימות הודעה שגוי.