ویژگیها
سرویس جفتسازی سریع
ارائه دهنده Fast Pair باید خدمات GATT زیر را ارائه دهد.
| خدمات | شناسه کاربری |
|---|---|
| سرویس جفتسازی سریع | 0xFE2C |
این سرویس باید ویژگیهای زیر را داشته باشد.
| ویژگی سرویس جفتسازی سریع | رمزگذاری شده | مجوزها | شناسه کاربری |
|---|---|---|---|
| شناسه مدل | خیر | بخوانید | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| جفتسازی مبتنی بر کلید | خیر | بنویسید و اطلاع دهید | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| رمز عبور | خیر | بنویسید و اطلاع دهید | FE2C1235-8366-4814-8EB0-01DE32100BEA |
| کلید حساب | خیر | بنویس | FE2C1236-8366-4814-8EB0-01DE32100BEA |
سرویس اطلاعات دستگاه
ارائه دهنده Fast Pair همچنین باید از سرویس اطلاعات دستگاه (Device Information Service) پشتیبانی کند.
| خدمات | شناسه کاربری |
|---|---|
| سرویس اطلاعات دستگاه | 0x180A |
جستجوگر جفت سریع از ویژگیهای زیر استفاده میکند.
| نام | رمزگذاری شده | مجوزها | شناسه کاربری |
|---|---|---|---|
| نسخهٔ میانافزار | خیر | بخوانید | 0x2A26 |
مشخصه: شناسه مدل
این ویژگی به جستجوگر اجازه میدهد تا در صورت نیاز، شناسه مدل را بخواند، خارج از زمانی که دستگاه در حالت قابل کشف تبلیغ میکند. این تابع همیشه باید دادههای زیر را برگرداند:
| هشتتایی | نوع داده | توضیحات | ارزش |
|---|---|---|---|
| ۰ - ۲ | uint24 | شناسه مدل | متغیر است |
مشخصه: جفتسازی مبتنی بر کلید
این ویژگی، رویه جفتسازی مبتنی بر کلید را کنترل میکند. در این رویه، با تأیید اینکه جستجوگر و ارائهدهنده هر دو دارای یک کلید از پیش مشترک هستند، سطح خاصی از اعتماد ایجاد میشود. کلید در هر مورد متفاوت است:
مورد ۱: کلید از پیش به اشتراک گذاشته شده بر اساس جفت کلید عمومی/خصوصی ضد جعل و جفت کلید عمومی/خصوصی خود جستجوگر است که برای هر تلاش برای جفت شدن تغییر خواهد کرد.
- ارائه دهنده در حالت جفت سازی است.
- جستجوگر تأیید میکند که ارائهدهنده، کلید خصوصی ضد جعل را در اختیار دارد.
توجه داشته باشید که در حالت جفتسازی، ارائهدهنده ممکن است به روش معمول جفتسازی را نیز انجام دهد، به عنوان مثال، برای جفتسازی با دستگاهی که از جفتسازی مبتنی بر کلید Fast Pair پشتیبانی نمیکند.
مورد ۲: کلید پیشاشتراکگذاریشده یکی از کلیدهای حساب است.
- ارائه دهنده معمولاً در حالت جفتسازی نیست. (اما این یک الزام نیست - ارائه دهنده باید حتی در حالت جفتسازی نیز از استفاده از کلید حساب پشتیبانی کند.)
- جوینده و ارائه دهنده هر کدام تأیید میکنند که دیگری کلید حساب را در اختیار دارد.
از آنجایی که هر دو مورد بسیار مشابه هستند، به جز اینکه در کدام مورد از کلید پیشاشتراکگذاری شده استفاده میشود، در روال با هم ترکیب میشوند.
قالب داده
برای نحوه استفاده از هر قالب، به روش مراجعه کنید.
| هشتتایی | نوع داده | توضیحات | ارزش | اجباری؟ |
|---|---|---|---|---|
| ۰ - ۱۵ | uint128 | درخواست رمزگذاری شده | متغیر است | اجباری |
| ۱۶ - ۷۹ | کلید عمومی | متغیر است | اختیاری |
جدول ۱.۱: درخواست رمزگذاریشده، که توسط جستجوگر برای مشخصه نوشته شده است.
| هشتتایی | نوع داده | توضیحات | ارزش | اجباری؟ |
|---|---|---|---|---|
| 0 | uint8 | نوع پیام | 0x00 = درخواست جفتسازی مبتنی بر کلید | اجباری |
| ۱ | uint8 | پرچمها
| متغیر است | اجباری |
| ۲ - ۷ | uint48 | یا:
| متغیر است | اجباری |
| ۸ - ۱۳ | uint48 | آدرس BR/EDR سالک | متغیر است | فقط در صورتی ارائه میشود که بیت ۱ یا ۳ پرچمها تنظیم شده باشد |
| ن - ۱۵ | مقدار تصادفی (نمک) | متغیر است | اجباری |
جدول ۱.۲.۱: درخواست خام (نوع 0x00). رمزگشایی شده از درخواست رمزگذاری شده در جدول ۱.۱ .
| هشتتایی | نوع داده | توضیحات | ارزش | اجباری؟ |
|---|---|---|---|---|
| 0 | uint8 | نوع پیام | 0x10 = درخواست اقدام | اجباری |
| ۱ | uint8 | پرچمها
| متغیر است | اجباری |
| ۲ - ۷ | uint48 | یا:
| متغیر است | اجباری |
| ۸ | uint8 | گروه پیام | متغیر است | اجباری است اگر بیت پرچمها ۰ تنظیم شده باشد |
| ۹ | uint8 | کد پیام | متغیر است | اجباری است اگر بیت پرچمها ۰ تنظیم شده باشد |
| ۱۰ | uint8 | بستگی به پرچمها دارد:
| متغیر است | اجباری است اگر بیت پرچمها ۰ یا ۱ تنظیم شده باشد |
| ۱۱ - ن | دادههای اضافی | متغیر است | اختیاری | |
| ن - ۱۵ | مقدار تصادفی (نمک) | متغیر است | اجباری |
جدول ۱.۲.۲: درخواست خام (نوع 0x10). رمزگشایی شده از درخواست رمزگذاری شده در جدول ۱.۱ .
| هشتتایی | نوع داده | توضیحات | ارزش |
|---|---|---|---|
| 0 | uint8 | نوع پیام | 0x01 = پاسخ جفتسازی مبتنی بر کلید |
| ۱ - ۶ | uint48 | آدرس عمومی (BR/EDR) ارائه دهنده | متغیر است |
| ۷ - ۱۵ | مقدار تصادفی (نمک) | متغیر است |
جدول ۱.۳: پاسخ خام. برای تولید پاسخ رمزگذاری شده در جدول ۱.۴ رمزگذاری شده است.
| هشتتایی | نوع داده | توضیحات | ارزش |
|---|---|---|---|
| ۰ -۱۵ | uint128 | پاسخ رمزگذاری شده | متغیر است |
جدول ۱.۴: پاسخ رمزگذاریشده، ارسالشده توسط ارائهدهنده به جستجوگر از طریق یک اعلان.
مشخصه: رمز عبور
این ویژگی در طول فرآیند جفتسازی مبتنی بر کلید استفاده میشود.
| هشتتایی | نوع داده | توضیحات | ارزش |
|---|---|---|---|
| ۰ - ۱۵ | uint128 | بلوک رمز عبور رمزگذاری شده | متغیر است |
جدول ۲.۱: بلوک رمز عبور رمزگذاری شده. برای نحوه استفاده، به روش جفتسازی مبتنی بر کلید مراجعه کنید.
| هشتتایی | نوع داده | توضیحات | ارزش |
|---|---|---|---|
| 0 | uint8 | نوع پیام | یکی از:
|
| ۱ - ۳ | unit32 | رمز عبور ۶ رقمی | متغیر است |
| ۴ - ۱۵ | مقدار تصادفی (نمک) | متغیر است |
جدول ۲.۲: بلوک رمز عبور خام. نسخه رمزگشایی شده جدول ۲.۱ .
مشخصه: کلید حساب
پس از جفتسازی، جستجوگر Fast Pair یک Account Key برای ارائهدهنده Fast Pair مینویسد.
| هشتتایی | نوع داده | توضیحات | ارزش |
|---|---|---|---|
| ۰ - ۱۵ | uint128 | کلید حساب (رمزگذاری شده) | متغیر است |
پس از دریافت درخواست نوشتن، ارائه دهنده Fast Pair موارد زیر را انجام خواهد داد:
- کلید حساب را با استفاده از رمز مشترک تولید شده از مرحله ۴ رویه رمزگشایی کنید.
- برای ارائه دهندگان خدماتی که نیاز به ضمانت دارند (رایج):
- قبل از رمزگشایی، تأیید کنید که از رمز مشترک برای رمزگشایی درخواست کلید عبور از مرحله ۱۲ استفاده شده است. اگر این مرحله با استفاده از این رمز انجام نشده است، این نوشتن را نادیده بگیرید و خارج شوید.
- در این مرحله، رمز مشترک ( K در رویه) دیگر برای این جفتسازی استفاده نخواهد شد. هر درخواستی که با این کلید رمزگذاری شده و بدون راهاندازی مجدد رویه ارسال شود، باید رد شود.
- برای ارائه دهندگان خدماتی که نیاز به ضمانت دارند (رایج):
- تأیید کنید که مقدار رمزگشاییشده با
0x04یا0xFFشروع میشود. اگر اینطور نیست، این نوشتن را نادیده بگیرید و خارج شوید.- اگر مقدار
0x04باشد:- بررسی کنید که آیا لیست کلید حسابهای کاربریِ باقیمانده، جایی برای مقدار جدید دارد یا خیر.
- اگر اینطور نیست، آخرین مقداری که اخیراً استفاده شده را از لیست حذف کنید.
- مقدار جدید را به لیست اضافه کنید.
- اگر مقدار
0xFFباشد:- این را به عنوان یک جلسه جفتسازی موقت در نظر بگیرید و هیچ عملیاتی انجام ندهید.
- این میتواند با جریان کلید حساب نوشتن به صورت گذشتهنگر اتفاق بیفتد.
- کلید را ذخیره نکنید و از آن در لیست کلید حساب ، رمزگذاری یا محاسبات MAC استفاده نکنید.
- حذف پیوند توسط یک رویداد یا زمانبندی خاص مربوط به ویژگی انجام میشود. برای اشتراکگذاری صوتی LE، اکیداً توصیه میشود که پیوند و کلید پیوند BLE را 10 دقیقه پس از قطع شدن جلسه موقت حذف کنید.
- اگر مقدار
کلیدهای حساب موجود در لیست، در طول جفتسازی مبتنی بر کلید استفاده میشوند.
مشخصه: نسخه سیستم عامل
این ویژگی به جستجوگر اجازه میدهد تا در صورت نیاز، نسخه سیستم عامل ارائه دهنده را بخواند. این ویژگی همیشه باید دادههای زیر را برگرداند:
| هشتتایی | نوع داده | توضیحات | ارزش |
|---|---|---|---|
| 0 - متغیر | utf8s | کد اصلاحیه میانافزار | متغیر است |
حتی اگر بیش از یک میانافزار (مثلاً ۳ میانافزار برای گوشی سمت چپ، گوشی سمت راست و کیس) روی Provider وجود داشته باشد، باید در یک رشته utf8 کپسوله شود. Provider همچنین میتواند رشتههای خاص را برای موارد خاص برگرداند:
status-updating : اگر ارائهدهنده در حال حاضر در حال بهروزرسانی به یک میانافزار جدید است. از طرف دیگر، ارائهدهنده میتواند نسخه میانافزار مرحلهبندیشده را برگرداند.
status-abnormal : اگر Provider در وضعیت غیرعادی باشد. برای مثال، به دلیل عدم موفقیت در بهروزرسانی میانافزار، دچار نقص شده باشد. این مقدار باعث میشود Seeker پیامی را نشان دهد تا به کاربر اطلاع دهد که اکنون باید بهروزرسانی شود.
ارائه دهنده باید دسترسی به ویژگی Firmware Revision را محدود کند تا از ردیابی دستگاه جلوگیری شود. محدودیتهای پیشنهادی:
- دستگاههای متصل باید در هر زمانی به اطلاعات دسترسی داشته باشند.
- هر دستگاهی باید وقتی ارائه دهنده قابل کشف است، دسترسی داشته باشد
مشخصه: دادههای اضافی
این سرویس باید دارای ویژگی زیر باشد.
| ویژگی سرویس جفتسازی سریع | رمزگذاری شده | مجوزها | شناسه کاربری |
|---|---|---|---|
| دادهها | خیر | بنویسید و اطلاع دهید | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| ویژگی سرویس قدیمی جفتسازی سریع (هدف در تاریخ 2021/1/1 منسوخ خواهد شد) | رمزگذاری شده | مجوزها | شناسه کاربری |
|---|---|---|---|
| دادهها | خیر | بنویسید و اطلاع دهید | 0x1237 |
قبل از نوشتن یا اطلاعرسانی به این مشخصه، باید از طریق مشخصه FE2C1234-8366-4814-8EB0-01DE32100BEA یک handshake انجام شود تا یک راز مشترک وجود داشته باشد. از AES-CTR برای رمزگذاری دادههایی که از طریق این مشخصه جریان دارند استفاده خواهد شد که الگوریتم آن در زیر تعریف شده است. این حالت در مورد دادههایی که فراتر از یک بلوک 16 بایتی واحد هستند، امنتر است. از HMAC-SHA256 برای اطمینان از یکپارچگی دادهها استفاده خواهد شد که در زیر نیز تعریف شده است.
| هشتتایی | توضیحات | ارزش |
|---|---|---|
| ۰ - ۷ | ۸ بایت اول HMAC-SHA256. | متغیر است |
| ۸ - ۱۵ | نانس، که توسط رمزگذاری AES-CTR استفاده میشود. | متغیر است |
| ۱۶ - متغیر | دادههای رمزگذاری شده. | متغیر است |
جدول ۳.۱: بسته داده، ارسال شده توسط ارائه دهنده به جستجوگر از طریق اعلان یا ارسال شده توسط جستجوگر به ارائه دهنده از طریق نوشتن.
| هشتتایی | نوع داده | توضیحات | ارزش |
|---|---|---|---|
| 0 - متغیر | byte array | دادهها | متفاوت است ، آن را طبق شناسه داده جدول ۱.۲.۲ رمزگشایی کنید:
|
جدول ۳.۲: دادههای خام. رمزگشاییشده از دادههای رمزگذاریشده در جدول ۳.۱ .
وقتی درخواست اعلان میشود (مثلاً درخواست نام شخصیسازیشده از طریق بیت ۲ در جدول ۱.۲.۱ )، ارائهدهنده Fast Pair باید موارد زیر را انجام دهد:
- ۸ بایت تصادفی رمزنگاریشده برای نانس تولید کنید.
دادهها را با استفاده از AES-CTR رمزگذاری کنید، که در آن هر بلوک ۱۶ بایتی با استفاده از
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))کجا
- کلید AES، رمز مشترک مرحله ۴ در این رویه است.
- clearBlock[i] یک بلوک ۱۶ بایتی است که از data[i * 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 از مرحله ۴ در این رویه است.
- opad یک لایهگذاری بیرونی ۶۴ بایتی است که از بایتهای تکراری با مقدار
0x5Cتشکیل شده است. - آیپد دارای ۶۴ بایت فضای داخلی است که از بایتهای تکراری با مقدار
0x36تشکیل شده است.
۸ بایت اول از HMAC-SHA256 را به عنوان پیشوند بسته داده در نظر بگیرید.
پس از دریافت درخواست نوشتن، ارائه دهنده Fast Pair موارد زیر را انجام خواهد داد:
- با بررسی ۸ بایت اول HMAC-SHA256، صحت دادهها را تأیید کنید.
دادههای رمزگذاری شده را با استفاده از AES-CTR رمزگشایی کنید، که در آن هر بلوک با استفاده از
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))کجا
- encryptedBlock[i] یک بلوک ۱۶ بایتی است که از encrypted_data[i * 16] شروع میشود. آخرین بلوک میتواند کمتر از ۱۶ بایت باشد.
- کلید AES از طریق handshake تولید یا شناسایی میشود، مثلاً
- در نامگذاری جریان ۱ ، این کلید از ECDH است و دیگر برای این جفتسازی استفاده نخواهد شد. هر درخواستی که با این کلید رمزگذاری شده و بدون شروع مجدد روال ارسال شود، باید رد شود.
- در نامگذاری جریان ۲ ، این کلید حساب است.
برای ایجاد دادههای خام، تابع concat(clearBlock[0], clearBlock[1],...) را اجرا کنید.