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