مشخصات

سرویس جفت سریع

ارائه دهنده جفت سریع باید خدمات 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 پرچم ها
  • بیت 0 (MSB): منسوخ شده و توسط جستجوگر نادیده گرفته شده است.
  • بیت 1: 1 اگر جستجوگر درخواست کند که ارائه‌دهنده پیوند را آغاز کند، و این درخواست حاوی آدرس BR/EDR جستجوگر است. 0 در غیر این صورت.
  • بیت 2: 1 اگر جستجوگر درخواست کند که ارائه دهنده نام موجود را مطلع کند. 0 در غیر این صورت.
  • بیت 3: 1 اگر این برای نوشتن عطف به ماسبق کلید حساب است. 0 در غیر این صورت.
  • بیت های 4 تا 7 برای استفاده در آینده رزرو شده اند و نادیده گرفته می شوند.
متفاوت است اجباری
2 - 7 uint48 یا:
  • آدرس BLE فعلی ارائه دهنده
  • آدرس عمومی ارائه دهنده
متفاوت است اجباری
8 - 13 uint48 آدرس BR/EDR جستجوگر متفاوت است تنها در صورتی ارائه شود که Flags Bit 1 یا 3 تنظیم شده باشد
n - 15 مقدار تصادفی (نمک) متفاوت است اجباری

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

اکتت نوع داده شرح ارزش اجباری؟
0 uint8 نوع پیام 0x10 = درخواست اقدام اجباری
1 uint8 پرچم ها
  • بیت 0 (MSB): 1 اگر یک اقدام دستگاه باشد، 0 در غیر این صورت.
  • بیت 1: 1 اگر با مشخصه داده های اضافی دنبال شود، 0 در غیر این صورت.
  • بیت 2 - 7 برای استفاده در آینده رزرو شده است و باید نادیده گرفته شود.
متفاوت است اجباری
2 - 7 uint48 یا:
  • آدرس BLE فعلی ارائه دهنده
  • آدرس عمومی ارائه دهنده
متفاوت است اجباری
8 uint8 گروه پیام متفاوت است اگر Flags Bit 0 تنظیم شده باشد اجباری است
9 uint8 کد پیام متفاوت است اگر Flags Bit 0 تنظیم شده باشد اجباری است
10 uint8 به پرچم ها بستگی دارد:
  • بیت 0 تنظیم شده است: طول داده اضافی، کمتر از 6
  • بیت 1 تنظیم شده است: شناسه داده
متفاوت است اگر 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 نوع پیام یکی از:
  • 0x02 = رمز عبور جستجوگر
  • 0x03 = رمز عبور ارائه دهنده
1 - 3 unit32 رمز عبور 6 رقمی متفاوت است
4 - 15 مقدار تصادفی (نمک) متفاوت است

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

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

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

اکتت نوع داده شرح ارزش
0 - 15 uint128 کلید حساب (رمزگذاری شده) متفاوت است

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

  1. رمزگشایی کلید حساب با استفاده از راز مشترک ایجاد شده از مرحله 4 در روش .
    • برای ارائه دهندگانی که نیاز به پیوند دارند (متداول):
      • قبل از رمزگشایی، بررسی کنید که راز مشترک برای رمزگشایی درخواست کلید عبور از مرحله 12 استفاده شده است. اگر این مرحله با استفاده از این رمز عبور نکرده است، این رایت را نادیده بگیرید و از آن خارج شوید.
    • در این مرحله، راز مشترک ( K در رویه) دوباره برای این جفت‌سازی استفاده نخواهد شد. هر درخواستی که با این کلید رمزگذاری شده و بدون راه اندازی مجدد رویه وارد می شود، باید رد شود.
  2. بررسی کنید که مقدار رمزگشایی شده با 0x04 شروع شود. اگر اینطور نیست، این رایت را نادیده بگیرید و آن را ترک کنید.
  3. بررسی کنید که آیا لیست کلید حساب موجود برای مقدار جدید فضایی دارد یا خیر.
  4. اگر نه، کمترین مقدار اخیر استفاده شده را از لیست حذف کنید.
  5. مقدار جدید را به لیست اضافه کنید.

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

ویژگی: ویرایش سیستم عامل

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

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

حتی اگر بیش از یک سیستم عامل (به عنوان مثال 3 سیستم عامل برای جوانه چپ، جوانه سمت راست و کیس) در ارائه دهنده وجود داشته باشد، باید به یک رشته utf8 محصور شود. ارائه دهنده همچنین می تواند رشته های خاص را برای موارد خاص برگرداند:

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

  2. 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 رمزگشایی کنید:
  • 0x01 (نام شخصی): utf8s

جدول 3.2: داده های خام. رمزگشایی از داده های رمزگذاری شده در جدول 3.1 .

هنگامی که یک اعلان درخواست می شود (مثلاً درخواست نام شخصی شده از طریق بیت 2 در جدول 1.2.1 )، ارائه دهنده جفت سریع باید موارد زیر را انجام دهد:

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

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

    جایی که

    1. کلید AES راز مشترک مرحله 4 در این روش است.
    2. clearBlock[i] یک بلوک 16 بایتی است که از داده [i * 16] شروع می شود. آخرین بلوک می تواند کمتر از 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 بایت صفر) تولید می شود، shared_secret از مرحله 4 در روند است.
    2. opad یک لایه بیرونی 64 بایتی است که از بایت های مکرر با ارزش 0x5C تشکیل شده است.
    3. iPad یک لایه داخلی 64 بایتی است که از بایت های مکرر با ارزش 0x36 تشکیل شده است.
  5. 8 بایت اول را از HMAC-SHA256 به عنوان پیشوند بسته داده بردارید.

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

  1. یکپارچگی داده ها را با بررسی 8 بایت اول HMAC-SHA256 بررسی کنید.
  2. رمزگشایی داده های رمزگذاری شده با استفاده از AES-CTR، جایی که هر بلوک با استفاده از آن تولید می شود

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

    جایی که

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