מאפיינים
שירות ההתאמה המהירה
לספק התכונה 'התאמה מהירה' יהיה שירות GATT הבא.
| שירות | מזהה ייחודי אוניברסלי (UUID) |
|---|---|
| שירות ההתאמה המהירה | 0xFE2C |
לשירות הזה יהיו המאפיינים הבאים.
| מאפיין של שירות ההתאמה המהירה | מוצפן | הרשאות | מזהה ייחודי אוניברסלי (UUID) |
|---|---|---|---|
| מזהה דגם | לא | קריאה | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| התאמה מבוססת-מפתח | לא | כתיבה ושליחת הודעות | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| מפתח גישה | לא | כתיבה ושליחת הודעות | FE2C1235-8366-4814-8EB0-01DE32100BEA |
| מפתח החשבון | לא | כתיבה | FE2C1236-8366-4814-8EB0-01DE32100BEA |
שירות מידע על המכשיר
הספק של התכונה 'התאמה מהירה' צריך גם לתמוך בשירות מידע על המכשיר.
| שירות | מזהה ייחודי אוניברסלי (UUID) |
|---|---|
| שירות מידע על המכשיר | 0x180A |
התכונות הבאות משמשות לחיפוש התקנים באמצעות התאמה מהירה.
| שם | מוצפן | הרשאות | מזהה ייחודי אוניברסלי (UUID) |
|---|---|---|---|
| גרסת הקושחה | לא | קריאה | 0x2A26 |
מאפיין: מזהה המודל
המאפיין הזה מאפשר ל-Seeker לקרוא את מזהה המודל לפי הצורך, גם כשהמכשיר לא משדר במצב גלוי. הפונקציה צריכה תמיד להחזיר את הנתונים הבאים:
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 - 2 | uint24 |
מזהה דגם | משתנה |
מאפיין: התאמה מבוססת-מפתח
המאפיין הזה קובע את ההליך של התאמה מבוססת-מפתח. בתהליך הזה, רמת אמון מסוימת נקבעת על ידי אימות העובדה שגם המבקש וגם הספק מחזיקים במפתח ששותף מראש. המפתח שונה בכל מקרה:
תרחיש 1: המפתח המשותף מבוסס על זוג המפתחות הציבורי/הפרטי למניעת זיוף, ועל זוג המפתחות הציבורי/הפרטי של המכשיר המחפש, שמשתנה בכל ניסיון התאמה.
- הספק נמצא במצב התאמה.
- הבודק מוודא שהספק מחזיק במפתח הפרטי למניעת זיוף.
שימו לב: במצב התאמה, הספק יכול גם להתאים בדרך הרגילה, למשל להתאמה למכשיר שלא תומך בהתאמה מבוססת-מפתח של התאמה מהירה.
מקרה 2: המפתח ששותף מראש הוא אחד ממפתחות החשבון.
- בדרך כלל הספק לא נמצא במצב התאמה. (אבל זה לא חובה – הספק צריך לתמוך בשימוש במפתח חשבון גם במצב התאמה).
- הצד שמחפש והצד שמספק מאמתים כל אחד בנפרד שהצד השני מחזיק במפתח החשבון.
שני המקרים דומים מאוד, למעט המפתח המשותף מראש שבו נעשה שימוש, ולכן הם משולבים בהליך.
פורמט נתונים
בהליך מוסבר איך משתמשים בכל פורמט.
| Octet | סוג הנתונים | תיאור | ערך | חובה? |
|---|---|---|---|---|
| 0 - 15 | uint128 |
בקשה מוצפנת | משתנה | חובה |
| 16-79 | מפתח ציבורי | משתנה | אופציונלי |
טבלה 1.1: בקשה מוצפנת, שנכתבה למאפיין על ידי המבקש.
| Octet | סוג הנתונים | תיאור | ערך | חובה? |
|---|---|---|---|---|
| 0 | uint8 |
סוג ההודעה | 0x00 = בקשת התאמה מבוססת-מפתח |
חובה |
| 1 | uint8 |
סימונים
|
משתנה | חובה |
| 2 - 7 | uint48 |
אחת משתי האפשרויות:
|
משתנה | חובה |
| 8 - 13 | uint48 |
כתובת ה-BR/EDR של המחפש | משתנה | הערך הזה מופיע רק אם הביט 1 או 3 של Flags מוגדר |
| n – 15 | ערך אקראי (salt) | משתנה | חובה |
טבלה 1.2.1: בקשה גולמית (סוג 0x00). הפענוח של הבקשה המוצפנת ב טבלה 1.1.
| Octet | סוג הנתונים | תיאור | ערך | חובה? |
|---|---|---|---|---|
| 0 | uint8 |
סוג ההודעה | 0x10 = בקשה לפעולה |
חובה |
| 1 | uint8 |
סימונים
|
משתנה | חובה |
| 2 - 7 | uint48 |
אחת משתי האפשרויות:
|
משתנה | חובה |
| 8 | uint8 |
שליחת הודעה לקבוצה | משתנה | חובה אם הביט 0 של הסימונים מוגדר |
| 9 | uint8 |
קוד ההודעה | משתנה | חובה אם הביט 0 של הסימונים מוגדר |
| 10 | uint8 |
תלוי בסימונים:
|
משתנה | חובה אם ביט 0 או 1 של הסימונים מוגדרים |
| 11 – n | נתונים נוספים | משתנה | אופציונלי | |
| n – 15 | ערך אקראי (salt) | משתנה | חובה |
טבלה 1.2.2: בקשה גולמית (סוג 0x10). הפענוח של הבקשה המוצפנת ב טבלה 1.1.
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
סוג ההודעה | 0x01 = תגובה להתאמה מבוססת-מפתח |
| 1 - 6 | uint48 |
כתובת ציבורית של הספק (BR/EDR) | משתנה |
| 7-15 | ערך אקראי (salt) | משתנה |
טבלה 1.3: תשובה גולמית. מוצפן כדי ליצור את התשובה המוצפנת ב טבלה 1.4.
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 -15 | uint128 |
תשובה מוצפנת | משתנה |
טבלה 1.4: תגובה מוצפנת שנשלחת מהספק אל המבקש באמצעות הודעה.
מאפיין: מפתח גישה
המאפיין הזה משמש במהלך ההתאמה מבוססת המפתח
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 - 15 | uint128 |
בלוק מוצפן של מפתח גישה | משתנה |
טבלה 2.1: בלוק של מפתח גישה מוצפן. מידע על תהליך ההתאמה מבוסס המפתח לשימוש
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
סוג ההודעה | אחת מהאפשרויות הבאות:
|
| 1 - 3 | unit32 |
מפתח גישה בן 6 ספרות | משתנה |
| 4 עד 15 | ערך אקראי (salt) | משתנה |
טבלה 2.2: בלוק סיסמאות גולמיות. גרסה מפוענחת של טבלה 2.1.
מאפיין: מפתח החשבון
אחרי ההתאמה, התכונה 'התאמה מהירה' תכתוב מפתח חשבון לספק של התכונה 'התאמה מהירה'.
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 - 15 | uint128 |
מפתח החשבון (מוצפן) | משתנה |
כשספק Fast Pair מקבל בקשת כתיבה, הוא מבצע את הפעולות הבאות:
- מפענחים את מפתח החשבון באמצעות סוד לשימוש עם טוקן צרכן שנוצר בשלב 4 בתהליך.
- לספקים שדורשים שילוב (נפוץ):
- לפני שמפענחים, צריך לוודא שהסוד לשימוש עם טוקן צרכן שימש לפענוח בקשת מפתח הגישה משלב 12. אם השלב הזה לא עבר באמצעות הסוד הזה, צריך להתעלם מהכתיבה הזו ולצאת.
- בשלב הזה, הסוד המשותף (K בתהליך) לא ישמש יותר להתאמה הזו. צריך לדחות את כל הבקשות שמוצפנות באמצעות המפתח הזה בלי להפעיל מחדש את התהליך.
- לספקים שדורשים שילוב (נפוץ):
- מוודאים שהערך המפוענח מתחיל ב-
0x04או ב-0xFF. אם לא, צריך להתעלם מהפעולה הזו ולצאת.- אם הערך הוא
0x04:- בודקים אם יש מקום לערך החדש ברשימת מפתחות החשבון שנשמרה.
- אם לא, מוחקים מהרשימה את הערך שהשימוש בו היה הכי מזמן.
- מוסיפים את הערך החדש לרשימה.
- אם הערך הוא
0xFF:- התייחסו לזה כאל סשן זמני של התאמה ואל תבצעו שום פעולה.
- זה יכול לקרות בתהליך כתיבת מפתח חשבון רטרואקטיבית.
- אל תשמרו את המפתח ואל תשתמשו בו ברשימת מפתחות החשבון, בהצפנה או בחישובים של MAC.
- הסרת הקשר מופעלת על ידי אירוע או פסק זמן שספציפיים לתכונה. במקרה של שיתוף אודיו ב-LE, מומלץ מאוד להסיר את הקישוריות ב-BLE ואת מפתח הקישור 10 דקות אחרי הניתוק של הסשן הזמני.
- אם הערך הוא
מפתחות החשבון ברשימה משמשים במהלך שיוך מבוסס-מפתח.
מאפיין: גרסת קושחה
המאפיין הזה מאפשר ל-Seeker לקרוא את עדכון הקושחה של ה-Provider לפי הצורך. הפונקציה צריכה תמיד להחזיר את הנתונים הבאים:
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 – var | utf8s |
קוד גרסת הקושחה | משתנה |
היא צריכה להיות מוצגת כמחרוזת utf8 אחת, גם אם יש יותר מגרסת קושחה אחת (למשל, 3 גרסאות קושחה לאוזנייה השמאלית, לאוזנייה הימנית ולנרתיק) אצל הספק. הספק יכול גם להחזיר את המחרוזות הספציפיות למקרים מיוחדים:
status-updating: אם הספק מעדכן כרגע לקושחה חדשה. לחלופין, הספק יכול להחזיר את הגרסה של הקושחה שהועברה להמתנה.
status-abnormal: אם הספק נמצא במצב לא תקין. לדוגמה, יכול להיות שהמכשיר לא פועל כי עדכון הקושחה נכשל. הערך הזה יגרום לכך שהכלי Seeker יציג הודעה למשתמשים כדי ליידע אותם שהם צריכים לעדכן אותו עכשיו.
הספק צריך להגביל את הגישה למאפיין Firmware Revision כדי למנוע מעקב אחרי המכשיר. הגבלות מוצעות:
- למכשירים שמחוברים באמצעות Bluetooth צריכה להיות גישה בכל שלב
- לכל מכשיר צריכה להיות גישה כשהספק גלוי
מאפיין: נתונים נוספים
השירות הזה צריך לכלול את המאפיין הבא.
| מאפיין של שירות ההתאמה המהירה | מוצפן | הרשאות | מזהה ייחודי אוניברסלי (UUID) |
|---|---|---|---|
| נתונים | לא | כתיבה ושליחת הודעות | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| מאפיין ישן של שירות התאמה מהירה (הוצא משימוש ב-1/1/2021) | מוצפן | הרשאות | מזהה ייחודי אוניברסלי (UUID) |
|---|---|---|---|
| נתונים | לא | כתיבה ושליחת הודעות | 0x1237 |
לפני כתיבה או שליחת הודעה למאפיין הזה, צריך לבצע לחיצת יד דרך מאפיין FE2C1234-8366-4814-8EB0-01DE32100BEA כדי ליצור סוד לשימוש עם טוקן צרכן. הצפנה באמצעות AES-CTR תשמש להצפנת נתונים שזורמים דרך המאפיין הזה. האלגוריתם מוגדר בהמשך. המצב הזה מאובטח יותר כשמדובר בנתונים שגדולים מבלוק אחד של 16 בייט. האימות יתבצע באמצעות HMAC-SHA256 כדי לוודא את תקינות הנתונים, כפי שמוגדר בהמשך.
| Octet | תיאור | ערך |
|---|---|---|
| 0 - 7 | 8 הבייטים הראשונים של HMAC-SHA256. | משתנה |
| 8-15 | ערך חד-פעמי (Nonce), שמשמש להצפנת AES-CTR. | משתנה |
| 16 – var | נתונים מוצפנים. | משתנה |
טבלה 3.1: מנות נתונים שנשלחות מהספק אל המבקש באמצעות הודעה, או מהמבקש אל הספק באמצעות פעולת כתיבה.
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 – var | byte array |
נתונים | varies, צריך לפענח אותו בהתאם למזהה הנתונים של טבלה 1.2.2:
|
טבלה 3.2: נתונים גולמיים. הפענוח בוצע מנתונים מוצפנים ב טבלה 3.1.
כשמתקבלת בקשה לשליחת התראה (למשל, בקשה לשם מותאם אישית באמצעות Bit 2 בטבלה 1.2.1), ספק Fast Pair צריך לבצע את הפעולות הבאות:
- יוצרים 8 בייטים אקראיים מבחינה קריפטוגרפית בשביל Nonce.
הצפנת הנתונים באמצעות AES-CTR, כאשר כל בלוק של 16 בייט נוצר באמצעות
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))איפה
- מפתח ה-AES הוא הסוד המשותף משלב 4 בתהליך.
- clearBlock[i] הוא בלוק של 16 בייט שמתחיל מ-data[i * 16]. הבלוק האחרון יכול להיות קטן מ-16 בייט.
מבצעים concat(encryptedBlock[0], encryptedBlock[1],...) כדי ליצור את הנתונים המוצפנים.
יצירת HMAC-SHA256 על ידי
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))איפה
- K נוצר על ידי concat(shared_secret, 48-byte ZEROs), shared_secret הוא משלב 4 בהליך.
- opad הוא ריפוד חיצוני של 64 בייטים, שמורכב מבייטים חוזרים עם הערך
0x5C. - ipad הוא ריפוד פנימי של 64 בייטים, שמורכב מבייטים חוזרים עם הערך
0x36.
לוקחים את 8 הבייטים הראשונים מ-HMAC-SHA256 כקידומת של חבילת Data .
כשספק Fast Pair מקבל בקשת כתיבה, הוא מבצע את הפעולות הבאות:
- כדי לוודא את תקינות הנתונים, בודקים את 8 הבייטים הראשונים של HMAC-SHA256.
פענוח הנתונים המוצפנים באמצעות AES-CTR, כאשר כל בלוק נוצר באמצעות
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))איפה
- encryptedBlock[i] הוא בלוק של 16 בייט שמתחיל מ-encrypted_data[i * 16]. הבלוק האחרון יכול להיות קטן מ-16 בייט.
- מפתח AES נוצר או מזוהה מתוך הלחיצת יד, לדוגמה:
- בתהליך מתן השם 1, הוא מגיע מ-ECDH ולא ישמש שוב להתאמה הזו. צריך לדחות כל בקשה שמתקבלת מוצפנת עם המפתח הזה בלי להפעיל מחדש את התהליך.
- בתהליך מתן השמות 2, זהו מפתח החשבון.
מבצעים concat(clearBlock[0], clearBlock[1],...) כדי ליצור את הנתונים הגולמיים.