v1.3
מפרט האביזרים של רשת מרכז המכשירים שלי (FHN) מגדיר גישה מוצפנת מקצה לקצה למעקב אחרי מכשירי Bluetooth עם צריכת אנרגיה נמוכה (BLE) שמשדרים אותות. בדף הזה מתואר FHN כהרחבה של מפרט ההתאמה המהירה. ספקי שירות צריכים להפעיל את התוסף הזה אם יש להם מכשירים שתואמים ל-FHN והם מוכנים להפעיל מעקב מיקום במכשירים האלה.
מפרט GATT
צריך להוסיף מאפיין גנרי נוסף (GATT) לשירות Fast Pair עם הסמנטיקה הבאה:
מאפיין שירות ההתאמה המהירה | מוצפנת | הרשאות | מזהה ייחודי אוניברסלי (UUID) |
---|---|---|---|
פעולות של משואות | לא | קריאה, כתיבה ושליחת הודעות | FE2C1238-8366-4814-8EB0-01DE32100BEA |
טבלה 1: מאפייני שירות ההתאמה המהירה עבור FHN.
אימות
הפעולות שנדרשות על ידי התוסף הזה מתבצעות כפעולת כתיבה, שמוגנת על ידי מנגנון של אתגר ותגובה. לפני ביצוע פעולה כלשהי, המכשיר המבקש אמור לבצע פעולת קריאה מהמאפיין בטבלה 1, וכתוצאה מכך מתקבל מאגר בפורמט הבא:
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | מספר הגרסה הראשית של הפרוטוקול | 0x01 |
1 - 8 | מערך בייטים | ערך חד-פעמי אקראי (nonce) | משתנה |
כל פעולת קריאה צריכה להניב ערך nonce שונה, וערך nonce יחיד צריך להיות תקף רק לפעולה אחת. גם אם הפעולה נכשלה, צריך לבטל את ה-nonce.
לאחר מכן, המבקש מחשב מפתח אימות חד-פעמי לשימוש בבקשת כתיבה עתידית. מפתח האימות מחושב כמו שמתואר בטבלאות 2 עד 5. בהתאם לפעולה המבוקשת, המבקש מוכיח שהוא מכיר אחד או יותר מהמפתחות הבאים:
מפתח חשבון: מפתח החשבון של התאמה מהירה, באורך 16 בייט, כפי שמוגדר במפרט של התאמה מהירה.
מפתח חשבון הבעלים: הספק בוחר אחד ממפתחות החשבון הקיימים כמפתח חשבון הבעלים בפעם הראשונה שמשתמש ב-Seeker ניגש למאפיין Beacon Actions. אי אפשר לשנות את המפתח של חשבון הבעלים שנבחר עד שמבצעים איפוס להגדרות היצרן של הספק. הספק לא יכול להסיר את המפתח של חשבון הבעלים כשנגמרים לו המשבצות למפתחות של חשבונות בחינם.
ספקים שכבר תומכים ב-FHN כשמבצעים התאמה בפעם הראשונה (או תומכים ב-FHN כשמבצעים התאמה אחרי איפוס להגדרות היצרן) בוחרים את מפתח החשבון הראשון, כי זה מפתח החשבון היחיד שקיים כשהמערכת קוראת את מצב ההקצאה במהלך ההתאמה.
ספקים שמקבלים תמיכה ב-FHN אחרי שהם כבר משויכים (לדוגמה, באמצעות עדכון קושחה) יכולים לבחור כל מפתח חשבון קיים. סביר לבחור את מפתח החשבון הראשון שמשמש לקריאת מצב ההקצאה ממאפיין פעולות ה-Beacon אחרי עדכון הקושחה, בהנחה שהמשתמש שביצע את העדכון הוא הבעלים הנוכחי של הספק.
מפתח זהות זמני (EIK): מפתח באורך 32 בייט שנבחר באופן אקראי על ידי המכשיר המחפש במהלך תהליך ההקצאה של FHN. המפתח הזה משמש ליצירת מפתחות קריפטוגרפיים שמשמשים להצפנה מקצה לקצה של דוחות מיקום. ה-Seeker אף פעם לא חושף את המידע הזה לשרת העורפי.
מפתח שחזור: מוגדר כ-
SHA256(ephemeral identity key || 0x01)
, עם חיתוך ל-8 הבייטים הראשונים. המפתח מאוחסן בקצה העורפי, והמבקש יכול להשתמש בו כדי לשחזר את מפתח ה-EIK, בתנאי שהמשתמש מביע הסכמה בלחיצה על לחצן במכשיר.מפתח הטבעת: מוגדר כ-
SHA256(ephemeral identity key || 0x02)
, נחתך ל-8 הבייטים הראשונים. המפתח מאוחסן בשרת העורפי, והמחפש יכול להשתמש בו רק כדי להתקשר למכשיר.מפתח לא רצוי להגנה מפני מעקב: מוגדר כ-
SHA256(ephemeral identity key || 0x03)
, עם קיטוע ל-8 הבייטים הראשונים. המפתח מאוחסן בקצה העורפי, והמבקש יכול להשתמש בו רק כדי להפעיל מצב הגנה לא רצוי מפני מעקב.
תפעול
הפורמט של הנתונים שנכתבים למאפיין מפורט בטבלאות 2 עד 5. בהמשך הקטע הזה נפרט יותר על כל אחת מהפעולות.
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | מזהה נתונים |
|
1 | uint8 | אורך הנתונים | משתנה |
2 - 9 | מערך בייטים | מפתח אימות חד-פעמי | 8 הבייטים הראשונים של
HMAC-SHA256(account key, protocol major version number || the last nonce
read from the characteristic || data ID || data length || additional data) |
10 - var | מערך בייטים | נתונים נוספים |
|
טבלה 2: בקשה להקצאת משואות.
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | מזהה נתונים | 0x04: קריאת מפתח זהות זמני בהסכמת המשתמש |
1 | uint8 | אורך הנתונים | 0x08 |
2 - 9 | מערך בייטים | מפתח אימות חד-פעמי | 8 הבייטים הראשונים של
HMAC-SHA256(recovery key, protocol major version number || the last nonce
read from the characteristic || data ID || data length) |
טבלה 3: בקשה לשחזור מפתח הקצאת הרשאות של משואות.
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | מזהה נתונים |
|
1 | uint8 | אורך הנתונים | משתנה |
2 - 9 | מערך בייטים | מפתח אימות חד-פעמי | 8 הבייטים הראשונים של
HMAC-SHA256(ring key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data) |
10 - var | מערך בייטים | נתונים נוספים |
|
טבלה 4: בקשה לשיחה נכנסת.
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | מזהה נתונים |
|
1 | uint8 | אורך הנתונים | משתנה |
2 - 9 | מערך בייטים | מפתח אימות חד-פעמי | 8 הבייטים הראשונים של
HMAC-SHA256(unwanted tracking protection key, protocol major version number
|| the last nonce read from the characteristic || data ID || data length ||
additional data) |
10 - var | מערך בייטים | נתונים נוספים |
|
טבלה 5: בקשה להגנה מפני מעקב לא רצוי.
פעולות כתיבה מוצלחות מפעילות התראות כמו שמופיע בטבלה 6.
התראות עם מזהה נתונים שאינו 0x05: שינוי מצב הצלצול צריכות להישלח לפני השלמת עסקת הכתיבה שמפעילה את ההתראה, כלומר לפני שליחת PDU של תגובה לבקשת הכתיבה.
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | מזהה נתונים |
|
1 | uint8 | אורך הנתונים | משתנה |
2 - 9 | מערך בייטים | אימות | פירוט לכל פעולה |
10 - var | מערך בייטים | נתונים נוספים |
|
טבלה 6: תגובה של שירות Beacon.
בטבלה 7 מפורטים קודי השגיאה האפשריים של GATT שמוחזרים מהפעולות.
קוד | תיאור | הערות |
---|---|---|
0x80 | לא מאומת | הערך שמוחזר בתגובה לבקשת כתיבה כשהאימות נכשל (כולל המקרה שבו נעשה שימוש בערך nonce ישן). |
0x81 | ערך לא חוקי | הערך הזה מוחזר אם צוין ערך לא תקין או אם מספר הבייטים של הנתונים שהתקבלו לא צפוי. |
0x82 | לא התקבלה הסכמה מהמשתמש | התשובה מוחזרת בתגובה לבקשת כתיבה עם מזהה נתונים 0x04: קריאת מפתח זהות זמני בהסכמת המשתמש כשהמכשיר לא נמצא במצב התאמה. |
טבלה 7: קודי שגיאה של GATT.
קריאת הפרמטר של ה-beacon
המשתמש יכול לשלוח שאילתה לספק כדי לקבל את הפרמטרים של המשואה. לשם כך, הוא צריך לבצע פעולת כתיבה למאפיין שכוללת בקשה מטבלה 2 עם מזהה נתונים 0x00. הספק מאמת שמפתח האימות החד-פעמי שסופק תואם לאחד ממפתחות החשבון ששמורים במכשיר.
אם האימות נכשל, הספק מחזיר שגיאה של אימות לא מוצלח.
אם הפעולה בוצעה בהצלחה, הספק שולח הודעה עם תגובה מטבלה 6 עם מזהה נתונים 0x00. הספק יוצר את פלח הנתונים באופן הבא:
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | הספק מכויל | ההספק המכויל כפי שהתקבל במרחק 0 מ' (ערך בטווח [-100, 20]). מיוצג כמספר שלם עם סימן, ברזולוציה של 1 dBm. |
1 - 4 | uint32 | ערך השעון | הערך הנוכחי של השעון בשניות (big endian). |
5 | uint8 | בחירת עקומה | העקום האליפטי שמשמש להצפנה:
|
6 | uint8 | רכיבים | מספר הרכיבים שיכולים להוציא שיחה:
|
7 | uint8 | יכולות שקשורות לצלצול | האפשרויות הנתמכות הן:
|
8-15 | מערך בייטים | מרווח | ריפוד אפסים להצפנת AES. |
הנתונים צריכים להיות מוצפנים ב-AES-ECB-128 עם מפתח החשבון שמשמש לאימות הבקשה.
פלח האימות מוגדר כ-8 הבייטים הראשונים של HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data after
encryption || 0x01)
.
קריאת מצב ההקצאה של המשואה
המשתמש יכול לשלוח שאילתה לספק כדי לברר את מצב ההקצאה של משואת ה-Bluetooth. לשם כך, הוא צריך לבצע פעולת כתיבה למאפיין שכוללת בקשה מטבלה 2 עם מזהה נתונים 0x01. הספק מאמת שמפתח האימות החד-פעמי שסופק תואם לאחד ממפתחות החשבון שמאוחסנים במכשיר.
אם האימות נכשל, הספק מחזיר שגיאה של אימות לא מוצלח.
אם הפעולה בוצעה בהצלחה, הספק שולח הודעה עם תגובה מטבלה 6 עם מזהה נתונים 0x01. הספק יוצר את פלח הנתונים באופן הבא:
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | מצב הקצאת הרשאות | מסיכת ביטים עם הערכים הבאים:
|
1 - 20 או 32 | מערך בייטים | מזהה זמני נוכחי | 20 או 32 בייט (בהתאם לשיטת ההצפנה שבה נעשה שימוש) שמציינים את המזהה הארעי הנוכחי שמשודר על ידי משואת ה-Bluetooth, אם מוגדר מזהה כזה למכשיר. |
פלח האימות מוגדר כ-8 הבייטים הראשונים של HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data || 0x01)
.
הגדרת מפתח זהות זמני
כדי להקצות ספק שלא הוקצה כמשדר FHN, או לשנות את מפתח הזהות הארעי של ספק שכבר הוקצה, המכשיר המחפש מבצע פעולת כתיבה למאפיין שכוללת בקשה מטבלה 2 עם מזהה נתונים 0x02. הספק מוודא ש:
- מפתח האימות החד-פעמי שסופק תואם למפתח של חשבון הבעלים.
- אם סופק גיבוב של מפתח זהות זמני, הגיבוב של מפתח הזהות הזמני תואם למפתח הזהות הזמני הנוכחי.
- אם לא סופק גיבוב של מפתח זהות זמני, צריך לוודא שהספק לא הוקצה כבר כאות FHN.
אם האימות נכשל, הספק מחזיר שגיאה של אימות לא מוצלח.
אם הפעולה בוצעה ללא שגיאות, מפתח הזהות הארעי ישוחזר באמצעות פענוח AES-ECB-128 שלו באמצעות מפתח החשבון התואם. המפתח צריך להישמר במכשיר, ומאותו רגע הספק צריך להתחיל לפרסם פריימים של FHN. מפתח הזהות הזמני החדש נכנס לתוקף מיד אחרי שחיבור ה-BLE מסתיים. הספק שולח הודעה עם תגובה מטבלה 6 עם מזהה הנתונים 0x02.
פלח האימות מוגדר כ-8 הבייטים הראשונים של HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || 0x01)
.
ניקוי מפתח הזהות הזמני
כדי לבטל את ההקצאה של חלק המשואה של הספק, המאתר מבצע פעולת כתיבה למאפיין, שכוללת בקשה מטבלה 2 עם מזהה נתונים 0x03. הספק מוודא ש:
- מפתח האימות החד-פעמי שסופק תואם למפתח של חשבון הבעלים.
- המפתח המוצפן של הזהות הזמנית זהה למפתח הנוכחי של הזהות הזמנית.
אם הספק לא הוקצה כאות FHN או שהאימות נכשל, הוא מחזיר שגיאה לא מאומתת.
אם הפעולה מצליחה, הספק שוכח את המפתח ומפסיק לפרסם מסגרות FHN.
הספק שולח הודעה עם תגובה מטבלה 6 עם מזהה הנתונים 0x03.
פלח האימות מוגדר כ-8 הבייטים הראשונים של HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || 0x01)
.
קריאת מפתח הזהות הזמני בהסכמת המשתמש
האפשרות הזו זמינה רק לשחזור מפתח שאבד, כי המפתח מאוחסן באופן מקומי רק על ידי Seeker. לכן, האפשרות הזו זמינה רק כשהמכשיר במצב התאמה או למשך זמן מוגבל אחרי שלחצו על לחצן פיזי במכשיר (שמהווה הסכמת משתמש).
הכלי Seeker צריך לאחסן את מפתח השחזור בקצה העורפי כדי לשחזר את מפתח הטקסט הגלוי, אבל הוא לא מאחסן את מפתח ההצפנה עצמו.
כדי לקרוא את מפתח ה-EIK, המבקש מבצע פעולת כתיבה למאפיין, שכוללת בקשה מטבלה 3 עם מזהה נתונים 0x04. הספק מאמת את הדברים הבאים:
- מפתח השחזור המגובב תואם למפתח השחזור הצפוי.
- המכשיר במצב שחזור של מפתח הצפנה.
אם האימות נכשל, הספק מחזיר שגיאה של אימות לא מוצלח.
אם המכשיר לא במצב התאמה, הספק מחזיר שגיאה מסוג No User Consent (אין הסכמת משתמש).
אם הפעולה בוצעה בהצלחה, הספק שולח הודעה עם תגובה מטבלה 6 עם מזהה הנתונים 0x04.
פלח האימות מוגדר כ-8 הבייטים הראשונים של HMAC-SHA256(recovery key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data || 0x01)
.
הפעלת צלצול
המשתמש יכול לבקש מהספק להשמיע צליל על ידי ביצוע פעולת כתיבה למאפיין, שכוללת בקשה מטבלה 4 עם מזהה נתונים 0x05. הספק יוצר את פלח הנתונים באופן הבא:
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | הפעלת צלצול | מסיכת ביטים עם הערכים הבאים:
|
1 - 2 | uint16 | חסימה זמנית | הזמן הקצוב לתפוגה בדצי-שניות. הערך לא יכול להיות אפס ולא יכול להיות גדול מהערך ששווה ל-10 דקות. הספק משתמש בערך הזה כדי לקבוע כמה זמן הטלפון יצלצל לפני שהוא יושתק. אם רכיב כלשהו במכשיר כבר מצלצל, הגדרת הזמן הקצוב לתפוגה מבטלת את ההגדרה הקיימת. אם ring operation מוגדר כ-0x00, המערכת מתעלמת מהזמן הקצוב לתפוגה. |
3 | uint8 | עוצמת הקול |
|
כשמקבלים את הבקשה, הספק מאמת את הפרטים הבאים:
- מפתח האימות החד-פעמי שסופק תואם למפתח של הטבעת.
- המצב המבוקש תואם לרכיבים שיכולים להשמיע צלצול.
אם הספק לא הוקצה כאות FHN או שהאימות נכשל, הוא מחזיר שגיאה לא מאומתת. עם זאת, אם לספק יש הגנה לא רצויה מפני מעקב פעילה, ובבקשה להפעלת ההגנה הלא רצויה מפני מעקב הופעל הדגל skip ringing authentication, הספק צריך לדלג על הבדיקה הזו. עדיין מצפים שהנתונים לאימות יסופקו על ידי המבקש, אבל אפשר להגדיר אותם לערך שרירותי.
כשמתחילה או מסתיימת שיחה, נשלחת התראה כמו שמופיע בטבלה 6 עם מזהה נתונים 0x05. התוכן של ההתראה מוגדר באופן הבא:
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | מצב 'צלצול' |
|
1 | uint8 | רכיבים שקשורים לצלצול | מסיכת ביטים של הרכיבים שמצלצלים באופן פעיל, כפי שהוגדר בבקשה. |
2 - 3 | uint16 | חסימה זמנית | הזמן שנותר לצלצול בעשיריות השנייה. אם המכשיר הפסיק לצלצל, צריך להחזיר את הערך 0x0000. |
פלח האימות מוגדר כ-8 הבייטים הראשונים של HMAC-SHA256(ring key, protocol major version number || the nonce used to
initiate the ringing command || data ID || data length || additional data ||
0x01)
.
אם המכשיר כבר במצב הצלצול המבוקש כשמתקבלת בקשה לצלצל או להפסיק את הצלצול, הספק צריך לשלוח התראה עם מצב הצלצול או עם 0x00: התחיל או 0x04: הפסיק (בקשת GATT), בהתאמה. הבקשה הזו מבטלת את הפרמטרים של המצב הקיים, כדי שאפשר יהיה להאריך את משך הצלצול.
אם לספק יש לחצן פיזי (או שהחיישן למגע מופעל), הלחיצה על הלחצן הזה צריכה להפסיק את הפונקציה של הצלצול בזמן שהצלצול פעיל.
קבלת מצב הצלצול של המשואה
כדי לקבל את מצב הצלצול של המשואה, המכשיר המחפש מבצע פעולת כתיבה למאפיין, שכוללת בקשה מטבלה 4 עם מזהה נתונים 0x06. הספק מוודא שמפתח האימות החד-פעמי שסופק תואם למפתח הטבעת.
אם הספק לא הוגדר כמשדר FHN או אם האימות נכשל, הספק מחזיר שגיאה לא מאומתת.
אם הפעולה מצליחה, הספק שולח הודעה עם תגובה מטבלה 6 עם מזהה הנתונים 0x06. הספק יוצר את פלח הנתונים באופן הבא:
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | רכיבים שקשורים לצלצול | הרכיבים שמתקשרים באופן פעיל, כפי שמוגדר בבקשת השיחה. |
1 - 2 | uint16 | חסימה זמנית | הזמן שנותר לצלצול בעשיריות השנייה. הערה: אם המכשיר לא מצלצל, צריך להחזיר 0x0000. |
פלח האימות מוגדר כ-8 הבייטים הראשונים של HMAC-SHA256 (ring key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || additional data || 0x01)
.
מצב הגנה מפני מעקב לא רצוי
מצב ההגנה מפני מעקב לא רצוי נועד לאפשר לכל לקוח לזהות מכשירים פוגעניים ללא תקשורת עם השרת. כברירת מחדל, הספק צריך לבצע רוטציה של כל המזהים, כפי שמתואר בקטע רוטציה של מזהים. שירות "מרכז המכשירים שלי" יכול להעביר בקשה להפעלה של מצב הגנה מפני מעקב לא רצוי דרך רשת "מרכז המכשירים שלי". כך השירות גורם לספק להשתמש באופן זמני בכתובת MAC קבועה, ומאפשר ללקוחות לזהות את המכשיר ולהזהיר את המשתמש מפני מעקב לא רצוי.
כדי להפעיל או להשבית את מצב ההגנה מפני מעקב לא רצוי של המשואה, המכשיר שמחפש את המשואה מבצע פעולת כתיבה למאפיין, שכוללת בקשה מטבלה 5 עם מזהה נתונים 0x07 או 0x08 בהתאמה.
כשמפעילים מצב הגנה מפני מעקב לא רצוי
הספק יוצר את פלח הנתונים באופן הבא:
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | דגלי בקרה |
ההגדרות האלה תקפות רק עד להשבתת מצב ההגנה מפני מעקב לא רצוי. |
הספק מוודא שמפתח האימות החד-פעמי שסופק תואם למפתח ההגנה מפני מעקב לא רצוי. אם הספק לא הוקצה כאות FHN או שהאימות נכשל, תוחזר שגיאה לא מאומתת.
כשמצב ההגנה הלא רצוי מפני מעקב מופעל, אות ה-Beacon אמור להפחית את התדירות של סיבוב הכתובת הפרטית של MAC לפעם אחת ב-24 שעות. המזהה הזמני שמוצג במודעה צריך להמשיך להתחלף כרגיל. סוג המסגרת צריך להיות 0x41. הסטטוס משתקף גם בקטע hashed flags.
כשמשביתים מצב לא רצוי של אמצעים לחסימת מעקב
הספק מוודא ש:
- מפתח האימות החד-פעמי שסופק תואם למפתח ההגנה מפני מעקב לא רצוי.
- המפתח המוצפן של הזהות הזמנית זהה למפתח הנוכחי של הזהות הזמנית.
אם הספק לא הוקצה כמגדלור FHN או שהאימות נכשל, הספק מחזיר שגיאה לא מאומתת.
כשמשביתים את מצב ההגנה הלא רצוי מפני מעקב, ה-beacon אמור להתחיל לסובב את כתובת ה-MAC בקצב רגיל שוב, בסינכרון עם סיבוב המזהה הארעי. סוג המסגרת צריך להיות 0x40. המצב משתקף גם בקטע hashed flags.
אם הפעולה בוצעה בהצלחה, הספק שולח הודעה עם תשובה מטבלה 6 עם מזהה נתונים 0x07 או 0x08.
פלח האימות מוגדר כ-8 הבייטים הראשונים של HMAC-SHA256(unwanted tracking protection key, protocol major version number ||
the last nonce read from the characteristic || data ID || data length ||
0x01)
.
פריימים עם פרסומות
אחרי ההקצאה, הספק אמור לפרסם פריימים של FHN לפחות פעם אחת בכל 2 שניות. אם ספקי השירות מפרסמים מסגרות של התאמה מהירה, הם צריכים לשלב את מסגרות ה-FHN בתוך הפרסומים הרגילים של התאמה מהירה. לדוגמה, כל שתי שניות, הספק צריך לפרסם שבע מודעות Fast Pair ומודעה אחת של FHN.
עוצמת השידור של Bluetooth שמוגדרת לפרסום של FHN צריכה להיות לפחות 0 dBm.
המסגרת של FHN נושאת מפתח ציבורי שמשמש להצפנת דוחות מיקום על ידי כל לקוח תומך שמשתתף ברשת המיקור המונים. יש שני סוגים של מפתחות עקומות אליפטיות: מפתח של 160 ביט שמתאים למסגרות BLE 4 מדור קודם, או מפתח של 256 ביט שנדרש ל-BLE 5 עם יכולות פרסום מורחבות. ההטמעה של הספק קובעת באיזו עקומה נעשה שימוש.
מסגרת FHN בנויה באופן הבא.
Octet | ערך | תיאור |
---|---|---|
0 | 0x02 | אורך |
1 | 0x01 | הערך של סוג הנתונים של הדגלים |
2 | 0x06 | נתוני דגלים |
3 | 0x18 או 0x19 | אורך |
4 | 0x16 | הערך של סוג הנתונים של נתוני השירות |
5 | 0xAA | מזהה UUID של שירות 16 ביט |
6 | 0xFE | ... |
7 | 0x40 או 0x41 | סוג מסגרת FHN עם אינדיקציה לא רצויה של מצב הגנה מפני מעקב |
8..27 | מזהה זמני באורך 20 בייט | |
28 | תכונות מגובבות (hashed) |
טבלה 8: מסגרת FHN שתומכת בעקומה של 160 ביט.
בטבלה 9 מוצגים ההיסטים בבייטים והערכים של עקומה של 256 ביט.
Octet | ערך | תיאור |
---|---|---|
0 | 0x02 | אורך |
1 | 0x01 | הערך של סוג הנתונים של הדגלים |
2 | 0x06 | נתוני דגלים |
3 | 0x24 או 0x25 | אורך |
4 | 0x16 | הערך של סוג הנתונים של נתוני השירות |
5 | 0xAA | מזהה UUID של שירות 16 ביט |
6 | 0xFE | ... |
7 | 0x40 או 0x41 | סוג מסגרת FHN עם אינדיקציה לא רצויה של מצב הגנה מפני מעקב |
8..39 | מזהה זמני באורך 32 בייט | |
40 | תכונות מגובבות (hashed) |
טבלה 9: מסגרת FHN שתומכת בעקומה של 256 ביט.
חישוב של מזהה זמני (EID)
ערך אקראי נוצר על ידי הצפנה ב-AES-ECB-256 של מבנה הנתונים הבא באמצעות מפתח הזהות האפמרי:
Octet | שדה | תיאור |
---|---|---|
0 - 10 | מרווח | ערך = 0xFF |
11 | K | מעריך של תקופת הרוטציה |
12-15 | TS[0]...TS[3] | מונה הזמן של משואת ה-Beacon, בפורמט big-endian של 32 ביט. הביטים הנמוכים ביותר של K הוסרו. |
16-26 | מרווח | ערך = 0x00 |
27 | K | מעריך של תקופת הרוטציה |
28-31 | TS[0]...TS[3] | מונה הזמן של משואת ה-Beacon, בפורמט big-endian של 32 ביט. הביטים הנמוכים ביותר של K הוסרו. |
טבלה 10: בנייה של מספר פסאודו-אקראי.
התוצאה של החישוב הזה היא מספר בן 256 ביטים, שמסומן כ-r'
.
בשאר החישוב, נעשה שימוש ב-SECP160R1
או ב-SECP256R1
לפעולות קריפטוגרפיות של עקומות אליפטיות. הגדרות העקומות מופיעות בקטע
SEC 2: Recommended Elliptic Curve Domain Parameters, שבו מוגדרים Fp
, n
ו-G
שמוזכרים בהמשך.
הפונקציה r'
מוקרנת עכשיו לשדה הסופי Fp
על ידי חישוב r = r' mod n
.
לבסוף, מחשבים את R = r * G
, שהיא נקודה על העקומה שמייצגת את המפתח הציבורי שנמצא בשימוש. האות של המשואה משדר את Rx
, שהוא קואורדינטת x
של R
, בתור המזהה הזמני שלה.
סימונים מגובבים
החישוב של השדה hashed flags (דגלים עם גיבוב) מתבצע באופן הבא (הביטים ממוספרים מהמשמעותי ביותר לפחות משמעותי):
- ביטים 0-4: שמורים (מוגדרים לאפסים).
- ביטים 5-6 מציינים את רמת הטעינה של הסוללה במכשיר באופן הבא:
- 00: רמת הטעינה של הסוללה לא נתמכת
- 01: רמת טעינה רגילה
- 10: רמת הטעינה של הסוללה נמוכה
- 11: רמת הסוללה נמוכה מאוד (צריך להחליף את הסוללה בקרוב)
- הביט 7 מוגדר ל-1 אם המשואה נמצאת במצב של הגנה מפני מעקב לא רצוי, ול-0 בכל מקרה אחר.
כדי ליצור את הערך הסופי של הבייט הזה, מבצעים עליו XOR עם הבייט הכי פחות משמעותי של SHA256(r)
.
שימו לב ש-r צריך להיות מותאם לגודל העקומה. אם הייצוג קצר מ-160 או מ-256 ביטים, צריך להוסיף אפסים כביטים החשובים ביותר. אם הייצוג ארוך מ-160 או מ-256 ביטים, צריך לקטום את הביטים החשובים ביותר.
אם משדר ה-Beacon לא תומך בהצגת רמת הסוללה, והוא לא במצב הגנה מפני מעקב לא רצוי, מותר להשמיט את הבייט הזה לגמרי מהפרסום.
הצפנה באמצעות EID
כדי להצפין הודעה m
, משתמש שקורא את Rx
מהמשואה יבצע את הפעולות הבאות:
- בוחרים מספר אקראי
s
ב-Fp
, כמו שמוגדר בקטע חישוב מזהה ה-EID. - Compute
S = s * G
. - מחשבים את
R = (Rx, Ry)
על ידי הצבה במשוואת העקומה ובחירה של ערך שרירותי שלRy
מתוך התוצאות האפשריות. - מחשבים את מפתח ה-AES באורך 256 ביט
k = HKDF-SHA256((s * R)x)
, כאשר(s * R)x
הוא קואורדינטתx
של תוצאת הכפל של העקומה. לא צוין מלח. -
URx
ו-LRx
הם 80 הביטים העליונים והתחתונים שלRx
, בהתאמה, בפורמט big-endian. באופן דומה, מגדירים אתUSx
ואתLSx
עבורS
. - Compute
nonce = LRx || LSx
. - Compute
(m’, tag) = AES-EAX-256-ENC(k, nonce, m)
. - שליחה של
(URx, Sx, m’, tag)
לבעלים, יכול להיות דרך שירות מרוחק לא מהימן.
פענוח של ערכים שהוצפנו באמצעות EID
הלקוח של הבעלים, שמחזיק ב-EIK ובמעריך של תקופת הרוטציה, מפענח את ההודעה באופן הבא:
- בהינתן
URx
, מקבלים את ערך מונה הזמן של ה-beacon שעליו מבוססURx
. אפשר לעשות את זה באמצעות חישוב ערכיRx
של הבעלים עבור מונה הזמן של אותות ה-Beacon, לזמן קצר בעבר ולזמן קצר בעתיד. - בהינתן ערך מונה הזמן של ה-beacon שעליו מבוסס
URx
, מחשבים את הערך הצפוי שלr
כפי שמוגדר בקטע חישוב מזהה ה-EID. - מחשבים את
R = r * G
ומוודאים שהוא תואם לערך שלURx
שסופק על ידי המאתר. - מחשבים את
S = (Sx, Sy)
על ידי הצבה במשוואת העקומה ובחירה של ערך שרירותי שלSy
מתוך התוצאות האפשריות. - מחשבים את
k = HKDF-SHA256((r * S)x)
כאשר(r * S)x
הוא קואורדינטתx
של תוצאת הכפל של העקומה. - Compute
nonce = LRx || LSx
. - Compute
m = AES-EAX-256-DEC(k, nonce, m’, tag)
.
רוטציה של מזהים
צריך להשתמש בכתובת BLE שניתנת לפתרון (RPA) או בכתובת BLE שלא ניתן לפתרון (NRPA) כדי לפרסם מסגרות FHN. נדרש RPA למכשירי LE Audio (LEA) ומומלץ למכשירים אחרים, למעט תגי מיקום שלא נעשה בהם שימוש בקישור.
הפרסום של התאמה מהירה, הפרסום של FHN והכתובות התואמות של BLE צריכים להתחלף בו-זמנית. הסבב צריך להתבצע בממוצע כל 1,024 שניות. הנקודה המדויקת שבה ה-beacon מתחיל לפרסם את המזהה החדש חייבת להיות אקראית בתוך החלון.
הגישה המומלצת להגדרת זמן החלפה אקראי היא להגדיר אותו לזמן ההחלפה הצפוי הבא (אם לא הוחל אקראיות) בתוספת גורם זמן אקראי חיובי בטווח של 1 עד 204 שניות.
כשהמכשיר נמצא במצב הגנה מפני מעקב לא רצוי, כתובת ה-BLE של פרסום ה-FHN צריכה להיות קבועה, אבל כתובת ה-RPA של פרסום ה-FP שלא ניתן לגילוי (כמו Fast Pair) צריכה להמשיך להשתנות. מותר להשתמש בכתובות שונות לפרוטוקולים השונים.
שחזור אחרי הפסקת חשמל
הפתרון של המזהה האפמרי קשור באופן הדוק לערך השעון שלו בזמן הפרסום, ולכן חשוב שהספק יוכל לשחזר את ערך השעון שלו אם יש הפסקת חשמל. מומלץ שספק השירות יכתוב את ערך השעון הנוכחי שלו לזיכרון לא נדיף לפחות פעם ביום, ובזמן האתחול, ספק השירות יבדוק את הזיכרון הלא נדיף כדי לראות אם יש ערך שאפשר לאתחל ממנו. מערכות לפתרון בעיות של מזהה חולף יטמיעו פתרון בעיות בחלון זמן שיאפשר גם סחיפה סבירה של השעון וגם שחזור של נתונים שאבדו בגלל הפסקת חשמל.
הספקים עדיין צריכים לעשות כל מאמץ כדי לצמצם את הסטיות בשעון, כי חלון הזמן לפתרון הבעיה מוגבל. צריך להטמיע לפחות שיטה נוספת לסנכרון השעון (פריימים של Fast Pair שלא ניתן לגלות או הטמעה של זרם הודעות).
הנחיות להטמעה של התאמה מהירה
בקטע הזה מוסבר על היבטים מיוחדים של ההטמעה של התכונה 'התאמה מהירה' אצל ספקים שתומכים ב-FHN.
הנחיות ספציפיות לתג איתור
- אם הספק בוצע צימוד, אבל FHN לא הוקצה תוך 5 דקות (או אם הוחל עדכון OTA בזמן שהמכשיר מצומד אבל לא הוקצה FHN), הספק צריך לחזור לתצורת היצרן שלו ולנקות את מפתחות החשבון המאוחסנים.
- אחרי שהספק משויך, כתובת ה-MAC שלו לא אמורה להשתנות עד שמקצים FHN או עד שעוברות 5 דקות.
- אם מנקים את מפתח הזהות הזמני מהמכשיר, המכשיר צריך לבצע איפוס להגדרות המקוריות ולנקות גם את מפתחות החשבון המאוחסנים.
- הספק צריך לדחות ניסיונות התאמה רגילים של Bluetooth ולאשר רק התאמה מהירה.
- הספק צריך לכלול מנגנון שמאפשר למשתמשים להפסיק זמנית את הצגת המודעות בלי לאפס את המכשיר להגדרות המקוריות (לדוגמה, לחיצה על שילוב של לחצנים).
- אחרי הפסקת חשמל, המכשיר צריך לפרסם פריימים של התאמה מהירה שלא ניתן לגלות עד להפעלה הבאה של קריאת פרמטרים של משואות. כך המכשיר המחפש יכול לזהות את המכשיר ולסנכרן את השעון גם אם חל שינוי משמעותי בשעון.
- כשמפרסמים מסגרות של התאמה מהירה שלא ניתן לגלות, לא צריך להפעיל את ההצגה של רמזים בממשק המשתמש.
- אסור לפרסם מסגרות של התאמה מהירה שניתן לגלות בזמן שהספק מוקצה ל-FHN.
- הספק לא צריך לחשוף פרטים מזהים באופן לא מאומת (לדוגמה, שמות או מזהים).
הנחיות ספציפיות למכשירי Bluetooth Classic
בקטע הזה מוסבר על היבטים מיוחדים של מכשירי Bluetooth קלאסיים שתומכים ב-FHN.
הקצאת מכשירים שכבר בוצעה בהם התאמה באמצעות FHN
הספק לא תמיד מוגדר ל-FHN כשמבצעים התאמה ל-Seeker, אלא זמן מה אחרי כן. במקרה כזה, יכול להיות שלספק אין כתובת MAC עדכנית של BLE שנדרשת ליצירת חיבור GATT. הספק צריך לתמוך לפחות באחת מהדרכים הבאות שבהן המשתמש יכול לקבל את כתובת ה-BLE שלו בזמן שהוא כבר משויך:
- הספק יכול לפרסם מעת לעת את נתוני החשבון של Fast Pair
שמאפשרים למכשיר המחפש למצוא את כתובת ה-BLE שלו באמצעות סריקת BLE.
הגישה הזו מתאימה לספקים שלא מטמיעים את זרם ההודעות. - הספק יכול לספק את הנתונים האלה באמצעות זרם ההודעות של התכונה 'התאמה מהירה' דרך Bluetooth קלאסי.
הגישה הזו מתאימה לספקים שלא מפרסמים מסגרות של התאמה מהירה בזמן שהם מחוברים למכשיר המחפש באמצעות Bluetooth.
תמיכה בשתי הגישות מגדילה את הסיכוי שהמשתמש יוכל להקצות את המכשיר ל-FHN.
זרם הודעות של התאמה מהירה
הספק יכול להטמיע הודעות של התאמה מהירה ולהשתמש בהן כדי להודיע למכשיר המחפש על פרטי המכשיר. הטמעה של זרם ההודעות מאפשרת להשתמש בתכונות מסוימות, כפי שמתואר בקטע הזה.
הספק צריך לשלוח הודעות עם פרטי המכשיר פעם אחת בכל פעם שנוצר ערוץ RFCOMM של זרם ההודעות.
גרסת הקושחה (קוד מידע על המכשיר 0x09) ויכולת המעקב
כשעדכון קושחה מוסיף תמיכה ב-FHN לספק, Seeker מחובר יכול להודיע על כך למשתמש ולהציע להקצות אותו. אחרת, המשתמש צריך לעבור לרשימת מכשירי ה-Bluetooth באופן ידני כדי להתחיל את הקצאת ה-FHN.
כדי לאפשר זאת, הספק צריך להשתמש במאפיין Firmware version (גרסת קושחה) (קוד 0x09) כדי לדווח על ערך מחרוזת שמייצג את גרסת הקושחה. בנוסף, הספק צריך לתמוך בפרוטוקול שמאפשר למחפש לדעת על שינויים ביכולות בעקבות עדכוני קושחה.
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | אירוע פרטי מכשיר | 0x03 |
1 | uint8 | גרסת הקושחה | 0x09 |
2 - 3 | uint16 | אורך הנתונים הנוספים | משתנה |
var | מערך בייטים | מחרוזת גרסה | משתנה |
טבלה 11: אירוע פרטי מכשיר: גרסת קושחה מעודכנת.
כשספק מקבל בקשה לעדכון יכולת (0x0601), אם הוא הפעיל תמיכה במעקב אחר FHN, הוא צריך להגיב כמו שמוצג בטבלה 12.
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | אירוע סנכרון של יכולת המכשיר | 0x06 |
1 | uint8 | מעקב אחר FHN | 0x03 |
2 - 3 | uint16 | אורך הנתונים הנוספים | 0x0007 |
4 | uint8 | מצב ההקצאה של FHN | 0x00 אם לא הוקצה; 0x01 אם הוקצה על ידי חשבון כלשהו |
5 - 10 | מערך בייטים | כתובת ה-MAC הנוכחית של המכשיר ב-BLE | משתנה |
טבלה 12: אירוע סנכרון של יכולת המכשיר: נוספה יכולת מעקב.
מזהה זמני נוכחי (קוד מידע על המכשיר 0x0B)
הספק יכול להשתמש במזהה הארעי הנוכחי (קוד 0x0B) כדי לדווח על ערך השעון ועל ה-EID הנוכחי כשהספק מוקצה ל-FHN, כדי לסנכרן את המבקש במקרה של סחיפת שעון (לדוגמה, בגלל סוללה ריקה). אחרת, ה-Seeker יוזם חיבור יקר יותר ופחות אמין למטרה הזו.
Octet | סוג הנתונים | תיאור | ערך |
---|---|---|---|
0 | uint8 | אירוע פרטי מכשיר | 0x03 |
1 | uint8 | מזהה זמני נוכחי | 0x0B |
2 - 3 | uint16 | אורך הנתונים הנוספים | 0x0018 או 0x0024 |
4 - 7 | מערך בייטים | ערך השעון | דוגמה: 0x13F9EA80 |
8 עד 19 או 31 | מערך בייטים | מזהה ה-EID הנוכחי | דוגמה: 0x1122334455667788990011223344556677889900 |
טבלה 13: אירוע של פרטי מכשיר: סנכרון השעון.
איפוס להגדרות המקוריות
במכשירים שתומכים באיפוס להגדרות המקוריות: אם מתבצע איפוס להגדרות המקוריות, הספק חייב להפסיק את השידור של אותות ה-Bluetooth ולמחוק את מפתח הזהות הזמני ואת כל מפתחות החשבון שמאוחסנים, כולל מפתח החשבון של הבעלים.
אחרי איפוס להגדרות המקוריות (ידני או באמצעות תוכנה), הספק לא צריך להתחיל לפרסם את התכונה 'התאמה מהירה' באופן מיידי, כדי למנוע את תהליך ההתאמה מיד אחרי שהמשתמש מוחק את המכשיר.
מניעת מעקב לא רצוי
מכשירים מאושרים של FHN צריכים גם לעמוד בדרישות בגרסת ההטמעה של המפרט חוצה הפלטפורמות בנושא איתור של מכשירי מעקב לא רצויים למיקום (DULT).
הנחיות רלוונטיות שספציפיות ל-FHN כדי לעמוד בדרישות המפרט של DULT:
- כל מכשיר שתואם ל-FHN צריך להיות רשום ב-Nearby Device Console, והיכולת Find Hub צריכה להיות מופעלת בו.
- המכשיר צריך להטמיע את השירות ואת המאפיין Accessory Non-Owner שמוגדרים בגרסת ההטמעה של מפרט DULT, כולל הפעולות Accessory Information וNon-owner controls.
- במהלך תקופת התאימות לאחור, כפי שמוגדר במפרט DULT, לא חלים שינויים במסגרת המודעה כפי שמוגדר במסמך הזה.
- המונח 'מצב הגנה לא רצוי מפני מעקב' שמוגדר במסמך הזה מקביל למונח 'מצב מופרד' שמוגדר במפרט DULT.
- הנחיות להטמעת קודי האופרציה Accessory Information:
- הפונקציה Get_Product_Data צריכה להחזיר את מזהה המודל שסופק על ידי המסוף, עם ריפוד באפסים כדי להתאים לדרישה של 8 בייט. לדוגמה, מזהה המודל 0xFFFFFF מוחזר כ-0x0000000000FFFFFF.
- הערכים של Get_Manufacturer_Name ו-Get_Model_Name צריכים להיות זהים לערכים שמופיעים במסוף.
- הפונקציה Get_Accessory_Category יכולה להחזיר את הערך הכללי Location Tracker (מכשיר למעקב אחר מיקום) אם אין קטגוריה אחרת שמתאימה יותר לסוג המכשיר.
- השיטה Get_Accessory_Capabilities צריכה לציין את התמיכה בהתקשרות וגם בחיפוש מזהה BLE.
- הפונקציה Get_Network_ID צריכה להחזיר את המזהה של Google (0x02).
- הנחיות להטמעה של אופקוד Get_Identifier:
- הפעולה אמורה להחזיר תגובה תקינה רק למשך 5 דקות אחרי שהמשתמש הפעיל את מצב הזיהוי, שדורש שילוב של לחיצות על לחצנים. צריך להיות אות ויזואלי או אודיו שמציין למשתמש שהספק נכנס למצב הזה. הוראות ההפעלה של המצב הזה צריכות להישלח ל-Google כדרישה לקבלת אישור, ולפחות 10 ימים לפני כל עדכון או שינוי בהוראות.
- התשובה מורכבת כך: 10 הבייטים הראשונים של המזהה הזמני הנוכחי, ואחריהם 8 הבייטים הראשונים של
HMAC-SHA256(recovery key, the truncated current ephemeral identifier)
.
- הנחיות להטמעת מזהה באמצעות NFC:
- כתובת ה-URL היא
find-my.googleapis.com/lookup
. - כערך של הפרמטר
e
, משתמשים באותה תשובה שנוצרה עבור Get_Identifier, עם קידוד הקסדצימלי. - כערך של הפרמטר
pid
, משתמשים באותה תגובה שנוצרה עבור Get_Product_Data, בקידוד הקסדצימלי.
- כתובת ה-URL היא
- המכשיר חייב לכלול אמצעי להשמעת צליל ולתמוך בפונקציית התקשרות. בהתאם למפרט DULT, יוצר הצליל חייב להפיק צליל בעוצמה של לפחות 60 פון בשיא, כפי שמוגדר בתקן ISO 532-1:2017.
- הנחיות להטמעה של אופקוד Sound_Start:
- הפקודה צריכה להפעיל צלצול בכל הרכיבים הזמינים.
- מומלץ להשתמש בנפח המקסימלי הנתמך.
- משך הצלצול המומלץ הוא 12 שניות.
- תגי מיקום צריכים לכלול מנגנון שמאפשר למשתמשים להפסיק זמנית את הפרסום בלי לאפס את המכשיר להגדרות המקוריות (לדוגמה, לחיצה על שילוב של לחצנים).
- ההוראות להשבתה צריכות להיות מתועדות בכתובת URL שזמינה לציבור, וצריך לספק אותן ל-Google כדרישה לקבלת אישור, ולפחות 10 ימים לפני כל עדכון או שינוי בהוראות.
- כתובת ה-URL צריכה לתמוך בלוקליזציה. בהתאם ללקוח, השפה תסופק כפרמטר של שאילתה ("hl=en") או באמצעות כותרת ה-HTTP "accept-language".
הנחיות לגבי פרוטוקולים שאפשר לעבור ביניהם
- צריך להשתמש רק בפרוטוקול אחד בכל פעם. מוודאים שאפשר להפעיל במכשיר רק רשת אחת בכל פעם. הדרישה הזו נועדה לוודא שלא מתבצע ערבוב של נתוני משתמש רגישים בין פרוטוקולים שונים.
- מומלץ לשלב במכשיר תהליך עבודה של איפוס קשיח, שיאפשר למשתמש להגדיר מחדש את המכשיר עם רשת אחרת.
- תהליך העדכון של מכשיר לרשת צריך להיות ידידותי למשתמשים ושוויוני בין הרשתות. המשתמש צריך להיות מסוגל לבחור באיזו רשת הוא רוצה להשתמש בלי להעדיף אחת מהרשתות. הצוות של Google צריך לאשר את התהליך הזה.
עדכוני קושחה
השותף צריך לנהל את התהליך של עדכוני OTA ואת ההפצה שלהם באמצעות תהליך העבודה שלו באפליקציה לנייד או באפליקציית האינטרנט.
התכונה 'התאמה מהירה' תומכת בהצגת התראות למשתמשים, כדי ליידע אותם על עדכוני OTA זמינים. כדי להשתמש במנגנון הזה:
- צריך לעדכן את גרסת הקושחה האחרונה במסוף המכשירים הסמוכים.
- צריך להגדיר אפליקציה נלווית במסוף 'מכשירים בקרבת מקום'. המכשיר צריך לתמוך בכוונה לעדכן קושחה.
- הספק צריך להטמיע את מאפיין ה-GATT של גרסת הקושחה.
כדי למנוע מעקב, צריך להגביל את הגישה למאפיין Firmware revision. הכלי Seeker יקרא קודם את מצב ההקצאה ויספק מפתח אימות, כפי שמוגדר במפרט הזה, ורק לאחר מכן יקרא את עדכון הקושחה. הפעולה הזו תתבצע באותו חיבור. אם מנסים לקרוא את גרסת הקושחה, והספק לא מקושר או שלא הושלמה בהצלחה פעולה מאומתת באותו חיבור, הספק צריך להחזיר שגיאה לא מאומתת.
תאימות
צריך להפעיל את שירותי המיקום ואת ה-Bluetooth כדי להשתמש ברשת 'מרכז המכשירים שלי'. נדרש שירות סלולרי או חיבור לאינטרנט. האפליקציה פועלת ב-Android 9 ואילך ובמדינות מסוימות, למשתמשים שעומדים בדרישות הגיל.
יומן שינויים
גרסת FHN | תאריך | תגובה |
---|---|---|
v1 | גרסה ראשונית של מפרט FHN לגישה מוקדמת. | |
v1.1 | פברואר 2023 |
|
v1.2 | אפריל 2023 |
|
v1.3 | דצמבר 2023 |
|