אות פרסום של ספק
פרסום: כשהמכשיר גלוי
כשהמכשיר של הספק ניתן לגילוי באמצעות BR/EDR (כלומר, במצב התאמה), הוא צריך לפרסם את נתוני מזהה הדגם של ההתאמה המהירה באמצעות BLE, וכתובת ה-BLE לא תשתנה.
מרווח הפרסום: כשהמכשיר גלוי
המרווח בין הפרסומים לא יכול להיות גדול מ-100 אלפיות השנייה (10Hz). קצב מהיר מאפשר למכשיר המחפש למצוא במהירות את המכשיר הספק, גם כשהוא סורק במצב חיסכון בסוללה.
מטען ייעודי (payload) של פרסום: נתוני מזהה המודל של ההתאמה המהירה
הפרסום יכיל את סוג הנתונים Service Data, שם, § 1.11. ה-UUID צריך להיות ה-UUID של שירות ההתאמה המהירה 0xFE2C. נתוני השירות יכללו את הפרטים הבאים:
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0-2 | uint24 |
מזהה מודל של 24 ביט | משתנה |
מטען ייעודי (payload) של פרסום שיתוף אודיו ב-LE: נתוני מזהה מודל של התאמה מהירה ומפת יכולות של התאמה מהירה
נתוני השירות צריכים לכלול את הפרטים הבאים:
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
גרסה ודגלים 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
אורך וסוג השדה 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | מזהה דגם | משתנה | |
| s + 1 | uint8 |
אורך וסוג השדה 0bLLLLTTTT
|
0bLLLL1000
|
| s + 2 | uint8 |
מפת היכולות של FP | משתנה |
מפת היכולות של FP
מפת היכולות של FP היא מפת סיביות (bitmap) שמייצגת את תכונות ה-FP שנתמכות על ידי הספק. הבייט הראשון של מפת הסיביות מוגדר כך:
| מפת סיביות (bitmap) | תיאור |
|---|---|
| 0bRRRRRRSO | R – ביט שמור, המכשיר המחפש יתעלם ממנו בינתיים וצריך להגדיר אותו כ-0. S – תמיכה בשיתוף אודיו של FP LE Audio (צריך להגדיר כ-1 אם התכונה מופעלת, אחרת כ-0). O – ביט Out of Box (OOB), צריך להגדיר כ-1 אם המכשיר חדש מהמפעל. |
אם הספק תומך במפרט של שיתוף אודיו ב-FP LE Audio (כלומר, תומך בהתאמה זמנית, במטען ייעודי (payload) של פרסום שיתוף אודיו ב-LE Audio ובגרסה 2 של בקרת מכשיר שמיעה), צריך להגדיר את ביט התמיכה בשיתוף אודיו ב-FP LE Audio ל-1. אחרת, צריך להגדיר אותו ל-0.
אם הספק לא הותאם לאף מכשיר שמחפש התאמה מהירה והוא חדש מהמפעל (כלומר, אין מפתחות חשבון של התאמה מהירה בספק), מגדירים את הביט OOB ל-1. אחרת, מגדירים אותו ל-0.
מטען ייעודי (payload) של פרסום מידע על קבוצה מתואמת: נתוני מזהה מודל של התאמה מהירה ומידע על קבוצה מתואמת של התאמה מהירה
נתוני השירות צריכים לכלול את הפרטים הבאים:
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
גרסה ודגלים 0bVVVVFFFF
|
0x00 |
| 1 | uint8 |
אורך וסוג השדה 0bLLLLTTTT
|
0bLLLL0111
|
| 2 – s | מזהה דגם | משתנה | |
| s + 1 | uint8 |
אורך וסוג השדה 0bLLLLTTTT
|
0b01101011
|
| s + 2 - s + 7 | uint48 |
נתונים של קבוצת פריטים מתואמת של FP | נתונים של 6 בייטים, ראו מידע על קבוצה מתואמת של FP |
מידע על קבוצת האתרים המתואמת של FP
המידע על קבוצת המכשירים המתואמת של הצד הראשון משמש כדי לזהות אם המכשיר שבו מוצגת המודעה נמצא באותה קבוצה מתואמת או לא.
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
גודל הסט התואם | משתנה |
| 1 | uint8 |
סוג החבר בקבוצה המתואמת של ההתאמה המהירה | יכול להיות אחד מהערכים הבאים:
|
| 2 - 5 | uint32 |
הגדרת גיבוב מפתח לפתרון זהויות | משתנה |
האלגוריתם ליצירת ערך גיבוב (hash) של מפתח זיהוי מוגדר הוא
משתמשים ב-SHA256 כדי לגבב את ערך ה-SIRK
SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25eמחלצים את ארבעת הבייטים הראשונים כערך הגיבוב (hash)
Hash Value of Set Identity Resolving Key = 0x2646036b
מידע נוסף על Set Identity Resolving Key זמין במאמר שירות זיהוי קבוצות מתואמות.
פרסום: כשהמכשיר לא גלוי
כשהמכשיר של הספק לא ניתן לגילוי (כלומר, לא במצב התאמה), הוא צריך לפרסם את נתוני החשבון של ההתאמה המהירה, לפי ההנחיות הבאות.
פרסום נתוני החשבון מאפשר למכשירים שמחפשים בקרבת מקום לזהות מתי ספק שייך לחשבון שלהם ולהתחיל התאמה בלי לאלץ את הספק לחזור למצב התאמה קודם, וזו סיבה נפוצה לתלונות של משתמשים. מכשירים מחפשים יאפשרו למשתמשים להתעלם מהשידור הזה אם הם לא רוצים להתאים עם הספק או אם השידור לא רלוונטי (לדוגמה, אם הם כבר ביצעו התאמה). המחפשים גם יסננו באופן אוטומטי שידורים שהם בבירור לא תקינים, למשל כשהנתונים בחשבון לא מוגדרים נכון.
מרווח הפרסום: כשהמכשיר לא גלוי
מרווח הזמן בין הפרסומים צריך להיות 250 אלפיות השנייה (4Hz) לכל היותר.
מטען ייעודי (payload) של פרסום: נתוני החשבון של ההתאמה המהירה
הפרסום יכיל את סוג הנתונים Service Data, שם, § 1.11. ה-UUID צריך להיות ה-UUID של שירות ההתאמה המהירה 0xFE2C. נתוני השירות יכללו את הפרטים הבאים:
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
גרסה ודגלים 0bVVVVFFFF
|
0x00(שמור לשימוש בעתיד) |
| 1 – משתנה | נתוני מפתח החשבון | משתנה |
נתוני מפתח החשבון מכילים:
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
אורך וסוג השדה 0bLLLLTTTT
|
0bLLLL0000
|
| 1 – s | מסנן מפתחות חשבון | משתנה | |
| s + 1 | uint8 |
אורך וסוג השדה 0bLLLLTTTT
|
0b00100001
|
| s + 2 - s + 3 | uint16 |
Salt | משתנה |
מסנן מפתחות חשבון
מסנן מפתח החשבון שפורסם מאפשר למכשיר המחפש לבדוק במהירות אם למכשיר הספק יש מפתח חשבון מסוים (עם סבירות נמוכה לתוצאה חיובית מוטעית, בממוצע הרבה פחות מ-0.5%), לפני אינטראקציות נוספות. כדי להפחית עוד יותר את שיעור התוצאות החיוביות השגויות, המכשיר המחפש עשוי להתחבר באופן אוטומטי ולנסות להתחיל את התהליך כשהוא מזהה מסנן שמשודר עם סוג 0, כלומר מציג אינדיקציה בממשק המשתמש, שעשוי להכיל את אחד ממפתחות החשבון שלו. במצבים מסוימים, יכול להיות שהספק ירצה שהמכשיר המחפש יזהה אותו, אבל הוא לא יהיה מוכן להתאמה. לדוגמה, כשהאוזניות מוחזרות לנרתיק, אנחנו רוצים להפסיק להציג את ההתראה הבאה על ההתאמה, כי האוזניות עלולות לדחות את ההתאמה הזו.
מסנן מפתחות החשבון הוא מסנן בלום באורך משתנה, שנוצר באופן הבא:
- נניח ש-n הוא מספר מפתחות החשבון (n >= 1) ברשימת מפתחות החשבון שנשמרה.
- נניח ש-s, גודל המסנן בבייטים, הוא (1.2*n + 3) אחרי חיתוך. לדוגמה, אם מפתח אחד נשמר, s = 4 בייטים.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - מאתחלים את המסנן F כמערך של בייטים בגודל s, שכל אחד מהם מוגדר ל-0.
uint8_t F[s] = {0}; לכל מפתח חשבון K ברשימת מפתחות החשבון שנשמרה:
א. V הוא concat(K, Salt).// In the sample code, the size of salt is 2 bytes. #define SALT_SIZE 2 uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE]; for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++) { // concat (K, Salt) fastpair_get_account_key_by_index(keyIndex, V); uint8_t randomSalt = (uint8_t)rand(); V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt; ... }ב. מגבבים את V באמצעות SHA256, ומקבלים ערך של 32 בייטים H = {H0, …, H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);ג. מחלקים את H ל-8 מספרים שלמים לא חתומים של 4 בייטים ב-big-endian, X = {X0, …, X7}, כאשר X0 = 0xH0H1H2H3.
uint32_t X[8]; for (index = 0; index < 8; index++) { X[index] = (((uint32_t)(H[index * 4])) << 24) | (((uint32_t)(H[index * 4 + 1])) << 16) | (((uint32_t)(H[index * 4 + 2])) << 8) | (((uint32_t)(H[index * 4 + 3])) << 0); }ד. לכל Xi:
i. נניח ש-M הוא Xi מודולו מספר הביטים במסנן, (s * 8).
2. מקבלים את הבייט ב-F באינדקס (M / 8), מעוגל כלפי מטה.
3. בתוך הבייט, מגדירים את הביט באינדקס (M % 8) ל-1.
4. במילים אחרות:// M = Xi % (s * 8) // F[M/8] = F[M/8] | (1 << (M % 8)) for (index = 0; index < 8; index++) { uint32_t M = X[index] % (s * 8); F[M / 8] = F[M / 8] | (1 << (M % 8)); }
כוללים את המסנן F בתור השדה Account Key Filter (מסנן מפתח חשבון) בנתוני הפרסום. שימו לב שאין "סדר בתים" לערך הזה, כי אין בית משמעותי יותר או פחות – אל תשנו את סדר הבתים.
שדה מלח
ה-salt הוא ערך אקראי שמתווסף למפתחות החשבון כשיוצרים את מסנן בלום. כדי למנוע מעקב אחרי רוטציית הכתובות, צריך ליצור מחדש את הערך האקראי הזה בכל פעם שמעדכנים את ה-RPA של הספק.
כדי ליצור את מסנן מפתחות החשבון באמצעות ה-salt:
- יוצרים ערך S אקראי של 2 בייטים. שימו לב שאין "סדר בתים" לערך הזה, כי אין בית משמעותי יותר או פחות – אל תשנו את סדר הבתים.
- משתמשים ב-S של 2 בייטים בתור ה-Salt.
- בנתוני החשבון של ההתאמה המהירה שפורסמו, כוללים את המסנן שנוצר בשדה Account Key Filter (מסנן מפתח החשבון), ואת S בשדה Salt (הוספת נתונים אקראיים).