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

פרסום: כשניתן למצוא אותם

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

מרווח פרסום: כאשר ניתן לאתר אותו

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

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

המודעה תכלול את סוג נתוני השירות, שם, § 1.11. UUID יהיה ה-UUID של שירות ההתאמה המהירה של 0xFE2C. נתוני השירות צריכים מכילות:

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

פרסום: כשאינו גלוי

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

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

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

המרווח בין הפרסומות צריך להיות 250 אלפיות השנייה (4 הרץ).

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

המודעה תכלול את סוג נתוני השירות, Ibid., § 1.11. UUID יהיה ה-UUID של שירות ההתאמה המהירה של 0xFE2C. נתוני השירות צריכים מכילות:

אוקטט סוג הנתונים תיאור ערך
0 uint8 גרסה וסימונים
0bVVVVFFFF
  • גרסה = V
  • F = דגלים
0x00
(שמור לשימוש עתידי)
1 – משתנה נתונים של מפתח חשבון משתנה
או 0x00 אם רשימת המפתחות של החשבון ריקה

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

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

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

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

מסנן המפתחות של החשבון הוא באורך משתנה מסנן Bloom בנוי בתור ככה:

  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 כשרשור(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 לשמונה מספרים שלמים לא חתומים באורך 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:
    1. מגדירים את 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 בתור השדה 'מסנן מפתחות חשבון'. חשוב לשים לב שאין 'מודעות לשוליים'. לערך הזה, מכיוון שאין יותר או פחות בייטים משמעותיים — אל תשנו את סדר הבייטים.

שדה מלח

ה-salt הוא ערך אקראי שמצורף למפתחות של חשבונות כשמפתחים את פילטר של פריחה. צריך להפיק מחדש את ה-salt הזה בכל פעם שה-RPA מתעדכן הספק כדי להימנע ממעקב אחר סבב כתובות.

כדי ליצור את מסנן המפתחות של החשבון באמצעות ה-salt:

  1. יוצרים S אקראי בגודל 2 בייטים. חשוב לשים לב שאין 'מודעות לשוליים'. לזה מכיוון שאין יותר בייט או פחות חשיבות, אל תשנו את הבייט הזמנה.
  2. משתמשים ב-S בגודל 2 בייטים בתור ה-salt.
  3. בנתוני החשבון בהתאמה המהירה שפורסמו, יש לכלול את המסנן שנוצר במאפיין השדה 'מסנן מפתחות חשבון' ו-S בשדה salt.