ویژگی‌ها

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

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

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

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

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

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

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

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

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

مشخصه: رمز عبور

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

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

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

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

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

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

پس از جفت‌سازی، جستجوگر Fast Pair یک Account Key برای ارائه‌دهنده Fast Pair می‌نویسد.

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

پس از دریافت درخواست نوشتن، ارائه دهنده Fast Pair موارد زیر را انجام خواهد داد:

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

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

مشخصه: نسخه سیستم عامل

این ویژگی به جستجوگر اجازه می‌دهد تا در صورت نیاز، نسخه سیستم عامل ارائه دهنده را بخواند. این ویژگی همیشه باید داده‌های زیر را برگرداند:

هشت‌تایی نوع داده توضیحات ارزش
0 - متغیر utf8s کد اصلاحیه میان‌افزار متغیر است

حتی اگر بیش از یک میان‌افزار (مثلاً ۳ میان‌افزار برای گوشی سمت چپ، گوشی سمت راست و کیس) روی Provider وجود داشته باشد، باید در یک رشته utf8 کپسوله شود. Provider همچنین می‌تواند رشته‌های خاص را برای موارد خاص برگرداند:

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

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

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

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

  1. ۸ بایت تصادفی رمزنگاری‌شده برای نانس تولید کنید.
  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 یک لایه‌گذاری بیرونی ۶۴ بایتی است که از بایت‌های تکراری با مقدار 0x5C تشکیل شده است.
    3. آی‌پد دارای ۶۴ بایت فضای داخلی است که از بایت‌های تکراری با مقدار 0x36 تشکیل شده است.
  5. ۸ بایت اول از HMAC-SHA256 را به عنوان پیشوند بسته داده در نظر بگیرید.

پس از دریافت درخواست نوشتن، ارائه دهنده Fast Pair موارد زیر را انجام خواهد داد:

  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 از طریق handshake تولید یا شناسایی می‌شود، مثلاً
      1. در نامگذاری جریان ۱ ، این کلید از ECDH است و دیگر برای این جفت‌سازی استفاده نخواهد شد. هر درخواستی که با این کلید رمزگذاری شده و بدون شروع مجدد روال ارسال شود، باید رد شود.
      2. در نامگذاری جریان ۲ ، این کلید حساب است.
  3. برای ایجاد داده‌های خام، تابع concat(clearBlock[0], clearBlock[1],...) را اجرا کنید.