אות פרסום של ספק

פרסום: כשהמכשיר גלוי

כשהמכשיר של הספק ניתן לגילוי באמצעות BR/EDR (כלומר, במצב התאמה), הוא צריך לפרסם את נתוני מזהה הדגם של ההתאמה המהירה באמצעות BLE, וכתובת ה-BLE לא תשתנה.

מרווח הפרסום: כשהמכשיר גלוי

המרווח בין הפרסומים לא יכול להיות גדול מ-100 אלפיות השנייה (10Hz). קצב מהיר מאפשר למכשיר המחפש למצוא במהירות את המכשיר הספק, גם כשהוא סורק במצב חיסכון בסוללה.

מטען ייעודי (payload) של פרסום: נתוני מזהה המודל של ההתאמה המהירה

הפרסום יכיל את סוג הנתונים Service Data, שם, § 1.11. ה-UUID צריך להיות ה-UUID של שירות ההתאמה המהירה 0xFE2C. נתוני השירות יכללו את הפרטים הבאים:

אוקטט סוג הנתונים תיאור ערך
0-2 uint24 מזהה מודל של 24 ביט משתנה

מטען ייעודי (payload) של פרסום שיתוף אודיו ב-LE: נתוני מזהה מודל של התאמה מהירה ומפת יכולות של התאמה מהירה

נתוני השירות צריכים לכלול את הפרטים הבאים:

אוקטט סוג הנתונים תיאור ערך
0 uint8 גרסה ודגלים
0bVVVVFFFF
  • ‫V = גרסה
  • ‫F = סימונים
0x00
1 uint8 אורך וסוג השדה
0bLLLLTTTT
  • ‫L = אורך מזהה המודל בבייטים
  • ‫T = סוג
0bLLLL0111
  • length = 0bLLLL = משתנה
  • type = 0b0111, מזהה המודל
‫2 – s מזהה דגם משתנה
s + 1 uint8 אורך וסוג השדה
0bLLLLTTTT
  • ‫L = אורך בבייטים
  • ‫T = סוג
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
  • ‫V = גרסה
  • ‫F = סימונים
0x00
1 uint8 אורך וסוג השדה
0bLLLLTTTT
  • ‫L = אורך מזהה המודל בבייטים
  • ‫T = סוג
0bLLLL0111
  • length = 0bLLLL = משתנה
  • type = 0b0111, מזהה המודל
‫2 – s מזהה דגם משתנה
s + 1 uint8 אורך וסוג השדה
0bLLLLTTTT
  • ‫L = אורך הנתונים של קבוצת הקואורדינטות
  • ‫T = סוג
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 - s + 7 uint48 נתונים של קבוצת פריטים מתואמת של FP נתונים של 6 בייטים, ראו מידע על קבוצה מתואמת של FP
מידע על קבוצת האתרים המתואמת של FP

המידע על קבוצת המכשירים המתואמת של הצד הראשון משמש כדי לזהות אם המכשיר שבו מוצגת המודעה נמצא באותה קבוצה מתואמת או לא.

אוקטט סוג הנתונים תיאור ערך
0 uint8 גודל הסט התואם משתנה
1 uint8 סוג החבר בקבוצה המתואמת של ההתאמה המהירה יכול להיות אחד מהערכים הבאים:
  • ‫0x00 : רכיב שמאלי
  • ‫0x01 : רכיב ימני
2 - 5 uint32 הגדרת גיבוב מפתח לפתרון זהויות משתנה

האלגוריתם ליצירת ערך גיבוב (hash) של מפתח זיהוי מוגדר הוא

  • משתמשים ב-SHA256 כדי לגבב את ערך ה-SIRK

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(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
  • ‫V = גרסה
  • ‫F = סימונים
0x00
(שמור לשימוש בעתיד)
‫1 – משתנה נתוני מפתח החשבון משתנה

נתוני מפתח החשבון מכילים:

אוקטט סוג הנתונים תיאור ערך
0 uint8 אורך וסוג השדה
0bLLLLTTTT
  • ‫L = אורך המסנן של מפתח החשבון בבייטים
  • ‫T = סוג
0bLLLL0000
  • length = 0bLLLL = משתנה
  • type = 0b0000 (הצגת אינדיקציה בממשק המשתמש) או 0b0010 (הסתרת אינדיקציה בממשק המשתמש), מסנן מפתחות חשבון
‫1 – s מסנן מפתחות חשבון משתנה
s + 1 uint8 אורך וסוג השדה
0bLLLLTTTT
  • ‫L = אורך בבייטים
  • ‫T = סוג
0b00100001
  • length = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt משתנה

מסנן מפתחות חשבון

מסנן מפתח החשבון שפורסם מאפשר למכשיר המחפש לבדוק במהירות אם למכשיר הספק יש מפתח חשבון מסוים (עם סבירות נמוכה לתוצאה חיובית מוטעית, בממוצע הרבה פחות מ-0.5%), לפני אינטראקציות נוספות. כדי להפחית עוד יותר את שיעור התוצאות החיוביות השגויות, המכשיר המחפש עשוי להתחבר באופן אוטומטי ולנסות להתחיל את התהליך כשהוא מזהה מסנן שמשודר עם סוג 0, כלומר מציג אינדיקציה בממשק המשתמש, שעשוי להכיל את אחד ממפתחות החשבון שלו. במצבים מסוימים, יכול להיות שהספק ירצה שהמכשיר המחפש יזהה אותו, אבל הוא לא יהיה מוכן להתאמה. לדוגמה, כשהאוזניות מוחזרות לנרתיק, אנחנו רוצים להפסיק להציג את ההתראה הבאה על ההתאמה, כי האוזניות עלולות לדחות את ההתאמה הזו.

מסנן מפתחות החשבון הוא מסנן בלום באורך משתנה, שנוצר באופן הבא:

  1. נניח ש-n הוא מספר מפתחות החשבון (n >= 1) ברשימת מפתחות החשבון שנשמרה.
  2. נניח ש-s, גודל המסנן בבייטים, הוא (1.2*n + 3) אחרי חיתוך. לדוגמה, אם מפתח אחד נשמר, s = 4 בייטים.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. מאתחלים את המסנן F כמערך של בייטים בגודל s, שכל אחד מהם מוגדר ל-0.
    uint8_t F[s] = {0};
  4. לכל מפתח חשבון 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:

  1. יוצרים ערך S אקראי של 2 בייטים. שימו לב שאין "סדר בתים" לערך הזה, כי אין בית משמעותי יותר או פחות – אל תשנו את סדר הבתים.
  2. משתמשים ב-S של 2 בייטים בתור ה-Salt.
  3. בנתוני החשבון של ההתאמה המהירה שפורסמו, כוללים את המסנן שנוצר בשדה Account Key Filter (מסנן מפתח החשבון), ואת S בשדה Salt (הוספת נתונים אקראיים).