خصوصیات

سرویس جفت‌سازی سریع

«ارائه‌دهنده جفت‌سازی سریع» باید سرویس 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 پرچم‌ها
  • بیت ۰ (MSB): منسوخ شده و توسط Seeker نادیده گرفته می‌شود.
  • بیت ۱: ۱ اگر «جستجوگر» درخواست کند که «ارائه‌دهنده» باید پیونددهی را شروع کند و این درخواست حاوی نشانی BR/EDR «جستجوگر» باشد. درغیراین‌صورت ۰ را برونداد می‌کند.
  • بیت ۲: اگر «جستجوگر» درخواست کند که «ارائه‌دهنده» نام موجود را اعلام کند، ۱. درغیراین‌صورت ۰ را برونداد می‌کند.
  • بیت ۳: ۱ اگر این برای نوشتن کلید حساب بااثر گذشته باشد. درغیراین‌صورت ۰ را برونداد می‌کند.
  • بیت‌های ۴ تا ۷ برای استفاده در آینده رزرو شده‌اند و باید نادیده گرفته شوند.
متفاوت است اجباری
۲ تا ۷ uint48 یکی از این موارد:
  • نشانی BLE کنونی ارائه‌دهنده
  • نشانی عمومی ارائه‌دهنده
متفاوت است اجباری
۸ تا ۱۳ uint48 نشانی BR/EDR جستجوگر متفاوت است فقط درصورتی وجود دارد که بیت ۱ یا ۳ پرچم‌ها تنظیم شده باشد
n - 15 مقدار تصادفی (نمک) متفاوت است اجباری

جدول ۱.۲.۱: درخواست خام (نوع 0x00). رمزگشایی‌شده از «درخواست» رمزگذاری‌شده در جدول ۱.۱.

هشت‌تایی نوع داده شرح مقدار اجباری؟
0 uint8 نوع پیام 0x10 = درخواست اقدام اجباری
1 uint8 پرچم‌ها
  • بیت ۰ (MSB): ۱ اگر کنش دستگاه باشد، درغیراین‌صورت ۰.
  • بیت ۱: اگر مشخصه داده‌های اضافی در ادامه می‌آید، ۱ و درغیراین‌صورت ۰.
  • بیت‌های ۲ تا ۷ برای استفاده در آینده رزرو شده‌اند و باید نادیده گرفته شوند.
متفاوت است اجباری
۲ تا ۷ uint48 یکی از این موارد:
  • نشانی BLE کنونی ارائه‌دهنده
  • نشانی عمومی ارائه‌دهنده
متفاوت است اجباری
8 uint8 گروه پیام متفاوت است اگر «پرچم بیت ۰» تنظیم شده باشد، الزامی است
9 uint8 کد پیام متفاوت است اگر «بیت پرچم ۰» تنظیم شده باشد، اجباری است
10 uint8 به پرچم‌ها بستگی دارد:
  • بیت ۰ تنظیم شده است: طول داده‌های اضافی، کمتر از ۶
  • بیت ۱ تنظیم شده است: شناسه داده
متفاوت است اگر بیت پرچم ۰ یا ۱ تنظیم شده باشد، اجباری است
‫۱۱ - n داده‌های تکمیلی متفاوت است اختیاری
n - 15 مقدار تصادفی (نمک) متفاوت است اجباری

جدول ۱.۲.۲: درخواست خام (نوع 0x10). رمزگشایی‌شده از «درخواست» رمزگذاری‌شده در جدول ۱.۱.

هشت‌تایی نوع داده شرح مقدار
0 uint8 نوع پیام 0x01 = پاسخ جفت‌سازی مبتنی بر کلید
‫۱ تا ۶ بار uint48 نشانی عمومی (BR/EDR) ارائه‌دهنده متفاوت است
۷ - ۱۵ مقدار تصادفی (نمک) متفاوت است

جدول ۱.۳: پاسخ خام. رمزگذاری‌شده برای تولید «پاسخ رمزگذاری‌شده» در جدول ۱.۴.

هشت‌تایی نوع داده شرح مقدار
۰ تا ۱۵ uint128 پاسخ رمزگذاری‌شده متفاوت است

جدول ۱.۴: «پاسخ رمزگذاری‌شده»، که «ارائه‌دهنده» ازطریق notify به «جستجوگر» ارسال می‌کند.

ویژگی: گذرکلید

این مشخصه درطول رویه جفت‌سازی مبتنی بر کلید استفاده می‌شود.

هشت‌تایی نوع داده شرح مقدار
۰ تا ۱۵ uint128 بلوک گذرکلید رمزگذاری‌شده متفاوت است

جدول ۲.۱: بلوک گذرکلید رمزگذاری‌شده. برای نحوه استفاده، به روش «جفت‌سازی مبتنی بر کلید» مراجعه کنید.

هشت‌تایی نوع داده شرح مقدار
0 uint8 نوع پیام یکی از این موارد:
  • ‫0x02 = گذرکلید جوینده
  • ‫0x03 = گذرکلید ارائه‌دهنده
۱ تا ۳ بار unit32 گذرکلید ۶ رقمی متفاوت است
‫۴ تا ۱۵ مقدار تصادفی (نمک) متفاوت است

جدول ۲.۲: بلوک گذرواژه خام. نسخه رمزگشایی‌شده جدول ۲.۱.

مشخصه: کلید حساب

پس‌از جفت‌سازی، «جوینده جفت‌سازی سریع» یک «کلید حساب» در «ارائه‌دهنده جفت‌سازی سریع» می‌نویسد.

هشت‌تایی نوع داده شرح مقدار
۰ تا ۱۵ uint128 کلید حساب (رمزگذاری‌شده) متفاوت است

پس‌از دریافت درخواست نوشتن، «ارائه‌دهنده جفت‌سازی سریع» باید اقدامات زیر را انجام دهد:

  1. کلید حساب را بااستفاده از رمز مشترک تولیدشده در مرحله ۴ در روال رمزگشایی کنید.
    • برای ارائه‌دهندگانی که به ضمانت‌نامه نیاز دارند (رایج):
      • قبل‌از رمزگشایی، تأیید کنید که از رمز مشترک برای رمزگشایی درخواست گذرکلید از مرحله ۱۲ استفاده شده است. اگر این مرحله بااستفاده از این رمز عبور انجام نشده است، این نوشتن را نادیده بگیرید و خارج شوید.
    • در این مرحله، از رمز مشترک (K در این روش) دیگر برای این مرتبط‌سازی استفاده نخواهد شد. هر درخواستی که با این کلید رمزگذاری شده باشد بدون اینکه فرایند از ابتدا شروع شود باید رد شود.
  2. تأیید کنید که مقدار رمزگشایی‌شده با 0x04 یا 0xFF شروع می‌شود. اگر این‌طور نیست، این نوشتن را نادیده بگیرید و خارج شوید.
    • اگر مقدار 0x04 است:
      • بررسی کنید که آیا فهرست کلید حساب ذخیره‌شده برای مقدار جدید فضا دارد یا نه.
      • اگر نه، مقداری را که اخیراً کمتر از همه استفاده شده است از فهرست حذف کنید.
      • مقدار جدید را به فهرست اضافه کنید.
    • اگر مقدار 0xFF است:
      • این را به‌عنوان جلسه جفت‌سازی موقت درنظر بگیر و هیچ عملیاتی انجام نده.
      • این اتفاق می‌تواند در جریان نوشتن کلید حساب به‌صورت عطف‌به‌ماسبق رخ دهد.
      • کلید را ذخیره نکنید و از آن در فهرست کلید حساب، رمزگذاری، یا محاسبات MAC استفاده نکنید.
      • حذف پیوند با رویداد یا زمان‌بندی ویژه ویژگی فعال می‌شود. برای «اشتراک صوتی» LE، اکیداً توصیه می‌شود که پیوند BLE و کلید پیوند را ۱۰ دقیقه پس‌از قطع شدن جلسه موقت بردارید.

از «کلیدهای حساب» در فهرست درطول جفت‌سازی مبتنی بر کلید استفاده می‌شود.

مشخصه: نسخه اصلاح‌شده سفت‌افزار

این مشخصه به «جوینده» اجازه می‌دهد تا درصورت نیاز، نسخه سفت‌افزار «ارائه‌دهنده» را بخواند. همیشه باید داده‌های زیر را برگرداند:

هشت‌تایی نوع داده شرح مقدار
0 - var utf8s کد بازبینی سفت‌افزار متفاوت است

حتی اگر بیش‌از یک میان‌افزار (برای نمونه، ۳ میان‌افزار برای گوشی سمت چپ، گوشی سمت راست، و قاب) در «ارائه‌دهنده» وجود داشته باشد، باید در یک رشته utf8 کپسوله شود. «ارائه‌دهنده» همچنین می‌تواند رشته‌های خاص را برای موارد ویژه برگرداند:

  1. status-updating: اگر «ارائه‌دهنده» درحال‌حاضر درحال به‌روزرسانی به سفت‌افزار جدید باشد. یا اینکه «ارائه‌دهنده» می‌تواند نسخه سفت‌افزار مرحله‌بندی‌شده را برگرداند.

  2. 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 داده متغیر است، آن را طبق «شناسه داده» جدول ۱.۲.۲ رمزگشایی کنید:
  • ‫0x01(personalized name): utf8s

جدول ۳.۲: داده‌های خام. از داده‌های رمزگذاری‌شده در جدول ۳.۱ رمزگشایی شده است.

وقتی اعلانی درخواست می‌شود (مثلاً درخواست نام شخصی‌سازی‌شده ازطریق بیت ۲ در جدول ۱.۲.۱)، «ارائه‌دهنده جفت‌سازی سریع» باید کارهای زیر را انجام دهد:

  1. تولید ۸ بایت تصادفی رمزنگاری‌شده برای Nonce.
  2. داده‌ها را بااستفاده از AES-CTR رمزگذاری کنید، که در آن هر بلوک ۱۶ بایتی بااستفاده از

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    کجا

    1. کلید AES رمز مشترک از مرحله ۴ در روال است.
    2. clearBlock[i] ‎ یک بلوک ۱۶ بایتی است که از data[i * 16]‎ شروع می‌شود. آخرین بلوک می‌تواند کمتر از ۱۶ بایت باشد.
  3. برای ایجاد «داده‌های رمزگذاری‌شده»، concat(encryptedBlock[0], encryptedBlock[1],...) را اجرا کنید.

  4. تولید HMAC-SHA256 توسط

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    کجا

    1. K با concat(shared_secret, 48-byte ZEROs) تولید می‌شود، shared_secret از مرحله ۴ در روال است.
    2. opad عبارت است از ۶۴ بایت حاشیه بیرونی که از بایت‌های تکراری با مقدار <0x0A>0x5C تشکیل شده است.
    3. ‫ipad دارای ۶۴ بایت حاشیه داخلی است که از بایت‌های تکراری با مقدار 0x36 تشکیل شده است.
  5. ‫۸ بایت اول را از HMAC-SHA256 به‌عنوان پیشوند بسته داده درنظر بگیرید.

پس‌از دریافت درخواست نوشتن، «ارائه‌دهنده جفت‌سازی سریع» باید کارهای زیر را انجام دهد:

  1. با بررسی ۸ بایت اول HMAC-SHA256، تمامیت داده‌ها را تأیید کنید.
  2. رمزگشایی «داده‌های» رمزگذاری‌شده بااستفاده از AES-CTR، که در آن هر بلوک بااستفاده از

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    کجا

    1. ‫encryptedBlock[i] یک بلوک ۱۶ بایتی است که از encrypted_data[i * 16] شروع می‌شود. بلوک آخر می‌تواند کمتر از ۱۶ بایت باشد.
    2. کلید AES از دست‌دهی تولید یا شناسایی می‌شود، مثلاً
      1. در جریان نام‌گذاری ۱، از ECDH است و دیگر برای این جفت‌سازی استفاده نخواهد شد. هر درخواستی که با این کلید رمزگذاری شده باشد و بدون بازراه‌اندازی فرایند ارسال شود باید رد شود.
      2. در جریان نام‌گذاری ۲، کلید حساب است.
  3. برای ایجاد داده‌های خام، concat(clearBlock[0], clearBlock[1],...)‎ را اجرا کنید.