מאפיינים
שירות התאמה מהירה
לספק ההתאמה המהירה צריך להיות שירות 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: המפתח ששותף מראש הוא אחד ממפתחות החשבון.
- בדרך כלל, הספק לא נמצא במצב התאמה. (אבל זו לא דרישה – הספק צריך לתמוך בשימוש במפתח חשבון גם במצב התאמה).
- כל אחד מהצדדים (המחפש והספק) מאמת שהצד השני מחזיק במפתח החשבון.
שני המקרים דומים מאוד, למעט המפתח המשותף מראש שבו נעשה שימוש, ולכן הם משולבים בהליך.
פורמט נתונים
בהליך מוסבר איך משתמשים בכל פורמט.
| אוקטט | סוג הנתונים | תיאור | ערך | חובה? |
|---|---|---|---|---|
| 0 עד 15 | uint128 |
בקשה מוצפנת | משתנה | חובה |
| 16 - 79 | מפתח ציבורי | משתנה | אופציונלי |
טבלה 1.1: בקשה מוצפנת, שנכתבה למאפיין על ידי המבקש.
| אוקטט | סוג הנתונים | תיאור | ערך | חובה? |
|---|---|---|---|---|
| 0 | uint8 |
סוג ההודעה | 0x00 = בקשת התאמה מבוססת-מפתח |
חובה |
| 1 | uint8 |
סימונים
|
משתנה | חובה |
| 2 - 7 | uint48 |
אחת משתי האפשרויות:
|
משתנה | חובה |
| 8 - 13 | uint48 |
כתובת ה-BR/EDR של המחפש | משתנה | מוצג רק אם סיביות הדגלים 1 או 3 מוגדרות |
| 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.
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
סוג ההודעה | 0x01 = תגובת התאמה מבוססת-מפתח |
| 1 - 6 | uint48 |
הכתובת הציבורית (BR/EDR) של הספק | משתנה |
| 7 - 15 | ערך אקראי (salt) | משתנה |
טבלה 1.3: תגובה גולמית. מוצפנת כדי ליצור את התשובה המוצפנת ב טבלה 1.4.
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 עד 15 | uint128 |
תשובה מוצפנת | משתנה |
טבלה 1.4: תגובה מוצפנת, שנשלחת מהספק למחפש באמצעות notify.
מאפיין: מפתח גישה
המאפיין הזה משמש במהלך ההתאמה מבוססת המפתח
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 - 15 | uint128 |
בלוק מוצפן של מפתח גישה | משתנה |
טבלה 2.1: בלוק של מפתח גישה מוצפן. למידע על השימוש, ראו את תהליך ההתאמה מבוססת המפתח.
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 | uint8 |
סוג ההודעה | אחת מהאפשרויות הבאות:
|
| 1 - 3 | unit32 |
מפתח גישה בן 6 ספרות | משתנה |
| 4 עד 15 | ערך אקראי (salt) | משתנה |
טבלה 2.2: בלוק גולמי של מפתח גישה. גרסה מפוענחת של טבלה 2.1.
מאפיין: מפתח חשבון
אחרי ההתאמה, המכשיר שמחפש התאמה מהירה יכתוב מפתח חשבון לספק ההתאמה המהירה.
| Octet | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 עד 15 | uint128 |
מפתח החשבון (מוצפן) | משתנה |
כשספק התאמה מהירה מקבל בקשת כתיבה, הוא מבצע את הפעולות הבאות:
- מפענחים את מפתח החשבון באמצעות הסוד המשותף שנוצר בשלב 4 בתהליך.
- לספקים שדורשים שילוב (נפוץ):
- לפני שמפענחים, מוודאים שהסוד המשותף שימש לפענוח בקשת מפתח הגישה משלב 12. אם השלב הזה לא עבר באמצעות הסוד הזה, צריך להתעלם מהכתיבה הזו ולצאת.
- בשלב הזה, הסוד לשימוש עם טוקן צרכן (K בתהליך) לא ישמש שוב להתאמה הזו. צריך לדחות את כל הבקשות שמוצפנות באמצעות המפתח הזה בלי להפעיל מחדש את התהליך.
- לספקים שדורשים שילוב (נפוץ):
- מוודאים שהערך המפוענח מתחיל ב-
0x04או ב-0xFF. אם לא, צריך להתעלם מהכתיבה הזו ולצאת.- אם הערך הוא
0x04:- בודקים אם יש מקום לערך החדש ברשימת מפתחות החשבון שנשמרה.
- אם לא, מחקו מהרשימה את הערך שהשתמשתם בו הכי פחות לאחרונה.
- מוסיפים את הערך החדש לרשימה.
- אם הערך הוא
0xFF:- להתייחס לזה כסשן התאמה זמני ולא לבצע שום פעולה.
- זה יכול לקרות בתהליך כתיבה רטרואקטיבית של מפתח החשבון.
- אל תאחסנו את המפתח ואל תשתמשו בו ברשימת מפתחות החשבון, בהצפנה או בחישובי MAC.
- הסרת הקישור מופעלת על ידי אירוע ספציפי לתכונה או על ידי זמן קצוב לתפוגה. בשיתוף אודיו ב-LE, מומלץ מאוד להסיר את הקישור ל-BLE ואת מפתח הקישור 10 דקות אחרי שהסשן הזמני מתנתק.
- אם הערך הוא
מפתחות החשבון שברשימה משמשים במהלך התאמה מבוססת-מפתח.
מאפיין: גרסת הקושחה
המאפיין הזה מאפשר ל-Seeker לקרוא את עדכון הקושחה של ה-Provider לפי הצורך. הוא תמיד צריך להחזיר את הנתונים הבאים:
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 - var | utf8s |
קוד גרסת הקושחה | משתנה |
הוא צריך להיות מוקף במחרוזת utf8 אחת, גם אם יש יותר מקושחה אחת (למשל, 3 קושחות לאוזניה השמאלית, לאוזניה הימנית ולנרתיק) אצל הספק. הספק יכול גם להחזיר את המחרוזות הספציפיות למקרים מיוחדים:
status-updating: אם הספק מעדכן כרגע לקושחה חדשה. לחלופין, הספק יכול להחזיר את הגרסה של הקושחה שהועלתה.
status-abnormal: אם הספק נמצא במצב לא תקין. לדוגמה, אם הוא לא פועל כי עדכון הקושחה נכשל. הערך הזה יגרום לכך שהכלי Seeker יציג הודעה למשתמשים כדי ליידע אותם שהם צריכים לעדכן אותו עכשיו.
הספק צריך להגביל את הגישה למאפיין Firmware Revision כדי למנוע מעקב אחרי המכשיר. הגבלות מומלצות:
- למכשירים מקושרים צריכה להיות גישה בכל שלב
- לכל מכשיר צריכה להיות גישה כשהספק גלוי
אם הספק תומך ב-Find Hub, נדרשת הטמעה נוספת. פרטים נוספים זמינים במאמר בנושא עדכוני קושחה של Find Hub.
מאפיין: נתונים נוספים
השירות הזה צריך לכלול את המאפיין הבא.
| מאפיין של שירות ההתאמה המהירה | מוצפן | הרשאות | מזהה ייחודי אוניברסלי (UUID) |
|---|---|---|---|
| נתונים | לא | כתיבה ושליחת הודעות | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| מאפיין ישן של שירות ההתאמה המהירה (מיועד להוצאה משימוש ב-1.1.2021) | מוצפן | הרשאות | מזהה ייחודי אוניברסלי (UUID) |
|---|---|---|---|
| נתונים | לא | כתיבה ושליחת הודעות | 0x1237 |
לפני שכותבים למאפיין הזה או שולחים אליו התראה, צריך לבצע לחיצת יד דרך המאפיין FE2C1234-8366-4814-8EB0-01DE32100BEA כדי לקבל סוד משותף. ההצפנה של הנתונים שמועברים דרך המאפיין הזה תתבצע באמצעות AES-CTR, והאלגוריתם שלו מוגדר בהמשך. המצב הזה מאובטח יותר בנתונים שגדולים מבלוק אחד של 16 בייטים. האימות יתבצע באמצעות HMAC-SHA256 כדי לוודא את תקינות הנתונים, כפי שמוגדר בהמשך.
| אוקטט | תיאור | ערך |
|---|---|---|
| 0 - 7 | 8 הבייטים הראשונים של HMAC-SHA256. | משתנה |
| 8 עד 15 | מספר חד-פעמי, שמשמש להצפנת AES-CTR. | משתנה |
| 16 - var | נתונים מוצפנים. | משתנה |
טבלה 3.1: חבילת נתונים, שנשלחת על ידי הספק למחפש באמצעות הודעה או שנשלחת על ידי המחפש לספק באמצעות כתיבה.
| אוקטט | סוג הנתונים | תיאור | ערך |
|---|---|---|---|
| 0 - var | byte array |
נתונים | varies, צריך לפענח אותו בהתאם למזהה הנתונים של טבלה 1.2.2:
|
טבלה 3.2: נתונים גולמיים. פוענחו מהנתונים המוצפנים ב טבלה 3.1.
כשמתקבלת בקשה לשליחת התראה (למשל, בקשה לשם בהתאמה אישית באמצעות ביט 2 בטבלה 1.2.1), ספק התאמה מהירה צריך לבצע את הפעולות הבאות:
- יוצרים 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 .
כשמתקבלת בקשת כתיבה, ספק ההתאמה המהירה צריך לבצע את הפעולות הבאות:
- מאמתים את תקינות הנתונים על ידי בדיקת 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, ולא ייעשה בו שימוש שוב בהתאמה הזו. כל בקשה שמוצפנת באמצעות המפתח הזה בלי להפעיל מחדש את התהליך צריכה להידחות.
- בתהליך מתן השמות השני, זהו מפתח החשבון.
מבצעים concat(clearBlock[0], clearBlock[1],...) כדי ליצור את הנתונים הגולמיים.