خصوصیات
سرویس جفت سریع
ارائه دهنده جفت سریع باید خدمات GATT زیر را داشته باشد.
خدمات | UUID |
---|---|
سرویس جفت سریع | 0xFE2C |
این سرویس باید دارای ویژگی های زیر باشد.
ویژگی Fast Pair Service | رمزگذاری شده است | مجوزها | 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 |
مشخصه: شناسه مدل
این ویژگی به جستجوگر اجازه میدهد تا شناسه مدل را در صورت نیاز، خارج از زمانی که دستگاه در حالت قابل کشف تبلیغ میکند، بخواند. همیشه باید داده های زیر را برگرداند:
اکتت | نوع داده | توضیحات | ارزش |
---|---|---|---|
0 - 2 | uint24 | شناسه مدل | متفاوت است |
مشخصه: جفت سازی مبتنی بر کلید
این مشخصه رویه جفت سازی مبتنی بر کلید را کنترل می کند. در این روش، سطح معینی از اعتماد با تأیید اینکه جستجوگر و ارائهدهنده هر دو دارای یک کلید از پیش مشترک هستند، ایجاد میشود. کلید در هر مورد متفاوت است:
مورد 1: کلید از پیش مشترک بر اساس جفت کلید عمومی/خصوصی ضد جعل و جفت کلید عمومی/خصوصی خود جستجوگر است که برای هر تلاش جفتسازی تغییر میکند.
- ارائه دهنده در حالت جفت شدن است.
- جستجوگر تأیید می کند که ارائه دهنده کلید خصوصی ضد جعل را در اختیار دارد.
توجه داشته باشید که در حالت جفتسازی، البته ممکن است ارائهدهنده به روش معمول جفت شود، به عنوان مثال، برای جفت شدن با دستگاهی که جفتسازی مبتنی بر کلید Fast Pair را پشتیبانی نمیکند.
مورد 2: کلید از پیش مشترک یکی از کلیدهای حساب است.
- ارائه دهنده معمولاً در حالت جفت شدن نیست. (اما این یک الزام نیست - ارائه دهنده باید از استفاده از کلید حساب حتی در حالت جفت شدن پشتیبانی کند.)
- جستجوگر و ارائهدهنده هر کدام تأیید میکنند که دیگری کلید حساب را در اختیار دارد.
از آنجایی که هر دو حالت بسیار شبیه به هم هستند، به جز مواردی که از کلید از پیش مشترک استفاده شده است، آنها در رویه ترکیب می شوند.
فرمت داده ها
نحوه استفاده از هر قالب را ببینید.
اکتت | نوع داده | توضیحات | ارزش | اجباری؟ |
---|---|---|---|---|
0 - 15 | uint128 | درخواست رمزگذاری شده | متفاوت است | اجباری |
16 - 79 | کلید عمومی | متفاوت است | اختیاری |
جدول 1.1: درخواست رمزگذاری شده، نوشته شده به ویژگی توسط جستجوگر.
اکتت | نوع داده | توضیحات | ارزش | اجباری؟ |
---|---|---|---|---|
0 | uint8 | نوع پیام | 0x00 = درخواست جفت شدن مبتنی بر کلید | اجباری |
1 | uint8 | پرچم ها
| متفاوت است | اجباری |
2 - 7 | uint48 | یا:
| متفاوت است | اجباری |
8 - 13 | uint48 | آدرس BR/EDR جستجوگر | متفاوت است | تنها در صورتی ارائه شود که Flags Bit 1 یا 3 تنظیم شده باشد |
n - 15 | مقدار تصادفی (نمک) | متفاوت است | اجباری |
جدول 1.2.1: درخواست خام (نوع 0x00). رمزگشایی شده از درخواست رمزگذاری شده در جدول 1.1 .
اکتت | نوع داده | توضیحات | ارزش | اجباری؟ |
---|---|---|---|---|
0 | uint8 | نوع پیام | 0x10 = درخواست اقدام | اجباری |
1 | uint8 | پرچم ها
| متفاوت است | اجباری |
2 - 7 | uint48 | یا:
| متفاوت است | اجباری |
8 | uint8 | گروه پیام | متفاوت است | اگر Flags Bit 0 تنظیم شده باشد اجباری است |
9 | uint8 | کد پیام | متفاوت است | اگر Flags Bit 0 تنظیم شده باشد اجباری است |
10 | uint8 | به پرچم ها بستگی دارد:
| متفاوت است | اگر Flags Bit 0 یا 1 تنظیم شده باشد اجباری است |
11 - n | داده های اضافی | متفاوت است | اختیاری | |
n - 15 | مقدار تصادفی (نمک) | متفاوت است | اجباری |
جدول 1.2.2: درخواست خام (نوع 0x10). رمزگشایی شده از درخواست رمزگذاری شده در جدول 1.1 .
اکتت | نوع داده | توضیحات | ارزش |
---|---|---|---|
0 | uint8 | نوع پیام | 0x01 = پاسخ جفت سازی مبتنی بر کلید |
1 - 6 | uint48 | آدرس عمومی ارائه دهنده (BR/EDR). | متفاوت است |
7 - 15 | مقدار تصادفی (نمک) | متفاوت است |
جدول 1.3: پاسخ خام. برای تولید پاسخ رمزگذاری شده در جدول 1.4 رمزگذاری شده است.
اکتت | نوع داده | توضیحات | ارزش |
---|---|---|---|
0 -15 | uint128 | پاسخ رمزگذاری شده | متفاوت است |
جدول 1.4: پاسخ رمزگذاری شده، ارسال شده توسط ارائه دهنده برای جستجوگر از طریق یک اعلان.
مشخصه: رمز عبور
این مشخصه در طول رویه جفت سازی مبتنی بر کلید استفاده می شود.
اکتت | نوع داده | توضیحات | ارزش |
---|---|---|---|
0 - 15 | uint128 | بلوک رمز عبور رمزگذاری شده | متفاوت است |
جدول 2.1: بلوک رمز عبور رمزگذاری شده. برای استفاده به روش جفتسازی مبتنی بر کلید مراجعه کنید.
اکتت | نوع داده | توضیحات | ارزش |
---|---|---|---|
0 | uint8 | نوع پیام | یکی از:
|
1 - 3 | unit32 | رمز عبور 6 رقمی | متفاوت است |
4 - 15 | مقدار تصادفی (نمک) | متفاوت است |
جدول 2.2: بلوک رمز عبور خام. نسخه رمزگشایی شده جدول 2.1 .
مشخصه: کلید حساب
پس از جفت شدن، جستجوگر جفت سریع یک کلید حساب برای ارائه دهنده جفت سریع می نویسد.
اکتت | نوع داده | توضیحات | ارزش |
---|---|---|---|
0 - 15 | uint128 | کلید حساب (رمزگذاری شده) | متفاوت است |
پس از دریافت درخواست نوشتن، ارائه دهنده جفت سریع باید موارد زیر را انجام دهد:
- رمزگشایی کلید حساب با استفاده از راز مشترک ایجاد شده از مرحله 4 در روش .
- برای ارائه دهندگانی که نیاز به پیوند دارند (متداول):
- قبل از رمزگشایی، بررسی کنید که راز مشترک برای رمزگشایی درخواست کلید عبور از مرحله 12 استفاده شده است. اگر این مرحله با استفاده از این رمز عبور نکرده است، این رایت را نادیده بگیرید و از آن خارج شوید.
- در این مرحله، راز مشترک ( K در رویه) دوباره برای این جفتسازی استفاده نخواهد شد. هر درخواستی که با این کلید رمزگذاری شده و بدون راه اندازی مجدد رویه وارد می شود، باید رد شود.
- برای ارائه دهندگانی که نیاز به پیوند دارند (متداول):
- بررسی کنید که مقدار رمزگشایی شده با
0x04
شروع شود. اگر اینطور نیست، این رایت را نادیده بگیرید و آن را ترک کنید. - بررسی کنید که آیا لیست کلید حساب موجود برای مقدار جدید فضایی دارد یا خیر.
- اگر نه، کمترین مقدار اخیر استفاده شده را از لیست حذف کنید.
- مقدار جدید را به لیست اضافه کنید.
کلیدهای حساب در فهرست در طول جفتسازی مبتنی بر کلید استفاده میشوند.
ویژگی: ویرایش سیستم عامل
این ویژگی به جستجوگر اجازه میدهد تا در صورت نیاز، ویرایش سیستمافزار ارائهدهنده را بخواند. همیشه باید داده های زیر را برگرداند:
اکتت | نوع داده | توضیحات | ارزش |
---|---|---|---|
0 - var | utf8s | کد ویرایش سیستم عامل | متفاوت است |
حتی اگر بیش از یک سیستم عامل (به عنوان مثال 3 سیستم عامل برای جوانه چپ، جوانه سمت راست و کیس) در ارائه دهنده وجود داشته باشد، باید به یک رشته utf8 محصور شود. ارائه دهنده همچنین می تواند رشته های خاص را برای موارد خاص برگرداند:
وضعیت به روز رسانی : اگر ارائه دهنده در حال حاضر به یک سیستم عامل جدید به روز می شود. از طرف دیگر، ارائه دهنده می تواند نسخه سیستم عامل مرحله بندی شده را برگرداند.
status-abnormal : اگر ارائه دهنده در وضعیت غیر طبیعی باشد. به عنوان مثال، به دلیل ناموفق بودن بهروزرسانی سیستمافزار، خراب شده است. این مقدار باعث می شود که جستجوگر پیامی را نشان دهد تا به کاربر اطلاع دهد که اکنون باید به روز شود.
برای جلوگیری از ردیابی دستگاه، ارائهدهنده باید دسترسی به ویژگی بازبینی سیستم عامل را محدود کند. محدودیت های پیشنهادی:
- دستگاه های متصل باید در هر زمان دسترسی داشته باشند
- هر دستگاهی باید زمانی که ارائه دهنده قابل کشف است دسترسی داشته باشد
مشخصه: داده های اضافی
این سرویس باید دارای ویژگی های زیر باشد.
ویژگی Fast Pair Service | رمزگذاری شده است | مجوزها | 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 | Nonce، توسط رمزگذاری AES-CTR استفاده می شود. | متفاوت است |
16 - var | داده های رمزگذاری شده | متفاوت است |
جدول 3.1: بسته داده، ارسال شده توسط ارائه دهنده برای جستجوگر از طریق یک اعلان یا ارسال توسط جستجوگر به ارائه دهنده از طریق نوشتن.
اکتت | نوع داده | توضیحات | ارزش |
---|---|---|---|
0 - var | byte array | داده ها | متفاوت است ، آن را با توجه به شناسه داده جدول 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 بایتی است که از داده [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 بایت صفر) تولید می شود، shared_secret از مرحله 4 در روند است.
- opad یک لایه بیرونی 64 بایتی است که از بایت های مکرر با ارزش
0x5C
تشکیل شده است. - iPad یک لایه داخلی 64 بایتی است که از بایت های مکرر با ارزش
0x36
تشکیل شده است.
8 بایت اول را از HMAC-SHA256 به عنوان پیشوند بسته داده بردارید.
پس از دریافت درخواست نوشتن، ارائه دهنده جفت سریع باید موارد زیر را انجام دهد:
- یکپارچگی داده ها را با بررسی 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]،...) را انجام دهید.