विशेषताएं

Fast Pair Service

फ़ास्ट पेयर की सुविधा देने वाली कंपनी के पास, यह GATT सेवा होनी चाहिए.

सेवा यूयूआईडी
Fast Pair Service 0xFE2C

इस सेवा में ये सुविधाएं होनी चाहिए.

फ़ास्ट पेयर सेवा की सुविधा एन्क्रिप्ट किया गया अनुमतियां यूयूआईडी
मॉडल आईडी नहीं पढ़ें FE2C1233-8366-4814-8EB0-01DE32100BEA
कुंजी के आधार पर पेयर करना नहीं लिखें और सूचना भेजें FE2C1234-8366-4814-8EB0-01DE32100BEA
पासकी नहीं लिखें और सूचना भेजें FE2C1235-8366-4814-8EB0-01DE32100BEA
खाते की कुंजी नहीं लिखें FE2C1236-8366-4814-8EB0-01DE32100BEA

डिवाइस की जानकारी देने वाली सेवा

फ़ास्ट पेयर की सुविधा देने वाली कंपनी को डिवाइस की जानकारी देने वाली सेवा भी देनी चाहिए.

सेवा यूयूआईडी
डिवाइस की जानकारी देने वाली सेवा 0x180A

फ़ास्ट पेयर सीकर में इन विशेषताओं का इस्तेमाल किया जाता है.

नाम एन्क्रिप्ट किया गया अनुमतियां यूयूआईडी
फ़र्मवेयर का वर्शन नहीं पढ़ें 0x2A26

अहम जानकारी: मॉडल आईडी

इस सुविधा की मदद से, डिवाइस के डिस्कवर किए जा सकने वाले मोड में विज्ञापन दिखाने के अलावा, Seeker को ज़रूरत के हिसाब से मॉडल आईडी पढ़ने की अनुमति मिलती है. इसे हमेशा यह डेटा दिखाना चाहिए:

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 से 2 uint24 मॉडल आईडी बदलता रहता है

खासियत: कुंजी के आधार पर पेयर करना

इस विशेषता से, कुंजी के आधार पर पेयर करने की प्रक्रिया को कंट्रोल किया जाता है. इस प्रोसेस में, यह पुष्टि करके भरोसे का एक लेवल तय किया जाता है कि Seeker और Provider, दोनों के पास पहले से शेयर की गई कुंजी है. हर मामले में कुंजी अलग होती है:

  • पहला मामला: पहले से शेयर किया गया पासकोड, एंटी-स्पूफ़िंग वाले सार्वजनिक/निजी पासकोड के जोड़े पर आधारित होता है. साथ ही, यह सीक करने वाले व्यक्ति के सार्वजनिक/निजी पासकोड के जोड़े पर भी आधारित होता है. यह पासकोड, पेयर करने की हर कोशिश के लिए बदल जाएगा.

    • Provider को दूसरे डिवाइस से जोड़ने वाला मोड चालू है.
    • सीकर पुष्टि करता है कि प्रोवाइडर के पास एंटी-स्पूफ़िंग प्राइवेट कुंजी है.

    ध्यान दें कि पेयरिंग मोड में होने पर, सेवा देने वाली कंपनी सामान्य तरीके से भी पेयर कर सकती है. उदाहरण के लिए, किसी ऐसे डिवाइस से पेयर करने के लिए जो Fast Pair की कुंजी पर आधारित पेयरिंग की सुविधा के साथ काम नहीं करता है.

  • दूसरा मामला: पहले से शेयर की गई कुंजी, खाते की कुंजियों में से एक है.

    • आम तौर पर, सेवा देने वाली कंपनी का डिवाइस दूसरे डिवाइस से जोड़ने वाले मोड में नहीं होता. (हालांकि, ऐसा करना ज़रूरी नहीं है. सेवा देने वाली कंपनी को, दूसरे डिवाइस से जोड़ने वाले मोड में भी खाता कुंजी का इस्तेमाल करने की सुविधा देनी चाहिए.)
    • सीकर और प्रोवाइडर, दोनों यह पुष्टि करते हैं कि दूसरे के पास खाते की कुंजी है.

दोनों मामलों में, पहले से शेयर की गई कुंजी के इस्तेमाल के अलावा, बाकी सभी चीज़ें एक जैसी हैं. इसलिए, इन्हें प्रक्रिया में शामिल किया गया है.

डेटा फ़ॉर्मैट

हर फ़ॉर्मैट को इस्तेमाल करने का तरीका देखें.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू क्या यह ज़रूरी है?
0 - 15 uint128 एन्क्रिप्ट (सुरक्षित) किया गया अनुरोध बदलता रहता है ज़रूरी है
16 - 79 सार्वजनिक कुंजी बदलता रहता है वैकल्पिक

टेबल 1.1: एन्क्रिप्ट किया गया अनुरोध, जिसे Seeker ने विशेषता के लिए लिखा है.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू क्या यह ज़रूरी है?
0 uint8 मैसेज का टाइप 0x00 = कुंजी के आधार पर डिवाइस को फ़ोन से जोड़ने का अनुरोध ज़रूरी है
1 uint8 फ़्लैग
  • बिट 0 (MSB): यह अब काम नहीं करता और Seeker इसे अनदेखा कर देता है.
  • बिट 1: अगर सीक करने वाला व्यक्ति, प्रोवाइडर से बॉन्डिंग शुरू करने का अनुरोध करता है और इस अनुरोध में सीक करने वाले व्यक्ति का बीआर/ईडीआर पता शामिल है, तो बिट 1 की वैल्यू 1 होगी. अन्यथा, 0.
  • दूसरा बिट: अगर Seeker, Provider से मौजूदा नाम की सूचना देने का अनुरोध करता है, तो इसकी वैल्यू 1 होती है. अन्यथा, 0.
  • तीसरा बिट: अगर यह खाते की कुंजी को पिछली तारीख से लिखने के लिए है, तो 1. अन्यथा, 0.
  • बिट 4 से 7 को आने वाले समय में इस्तेमाल करने के लिए रिज़र्व किया गया है. इन्हें अनदेखा किया जाना चाहिए.
अलग-अलग होती है ज़रूरी है
2 - 7 uint48 इनमें से कोई एक:
  • सेवा देने वाली कंपनी का मौजूदा बीएलई पता
  • सेवा देने वाली कंपनी का सार्वजनिक पता
अलग-अलग होती है ज़रूरी है
8 - 13 uint48 नौकरी ढूंढने वाले व्यक्ति का बीआर/ईडीआर पता अलग-अलग होती है यह सिर्फ़ तब मौजूद होता है, जब फ़्लैग बिट 1 या 3 सेट किया गया हो
n - 15 रैंडम वैल्यू (सॉल्ट) अलग-अलग होती है ज़रूरी है

टेबल 1.2.1: रॉ अनुरोध (टाइप 0x00). टेबल 1.1 में एन्क्रिप्ट (सुरक्षित) किए गए अनुरोध से डिक्रिप्ट किया गया.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू क्या यह ज़रूरी है?
0 uint8 मैसेज का टाइप 0x10 = कार्रवाई का अनुरोध ज़रूरी है
1 uint8 फ़्लैग
  • बिट 0 (एमएसबी): अगर यह डिवाइस ऐक्शन है, तो वैल्यू 1 होगी. ऐसा न होने पर, वैल्यू 0 होगी.
  • बिट 1: अगर इसके बाद अतिरिक्त डेटा की विशेषता दी जाएगी, तो वैल्यू 1 होगी. ऐसा न होने पर, वैल्यू 0 होगी.
  • बिट 2 से 7 को आने वाले समय में इस्तेमाल करने के लिए रिज़र्व किया गया है. इन्हें अनदेखा किया जाएगा.
अलग-अलग होती है ज़रूरी है
2 - 7 uint48 इनमें से कोई एक:
  • सेवा देने वाली कंपनी का मौजूदा बीएलई पता
  • सेवा देने वाली कंपनी का सार्वजनिक पता
अलग-अलग होती है ज़रूरी है
8 uint8 ग्रुप चैट शुरू करें अलग-अलग होती है अगर फ़्लैग बिट 0 सेट है, तो यह फ़ील्ड भरना ज़रूरी है
9 uint8 मैसेज में भेजा गया कोड अलग-अलग होती है अगर फ़्लैग बिट 0 सेट है, तो यह फ़ील्ड भरना ज़रूरी है
10 uint8 फ़्लैग पर निर्भर करता है:
  • बिट 0 सेट है: अतिरिक्त डेटा की लंबाई 6 से कम है
  • बिट 1 सेट है: डेटा आईडी
अलग-अलग होती है अगर फ़्लैग बिट 0 या 1 सेट है, तो यह एट्रिब्यूट देना ज़रूरी है
11 - n अतिरिक्त डेटा अलग-अलग होती है वैकल्पिक
n - 15 रैंडम वैल्यू (सॉल्ट) अलग-अलग होती है ज़रूरी है

टेबल 1.2.2: रॉ अनुरोध (टाइप 0x10). टेबल 1.1 में एन्क्रिप्ट (सुरक्षित) किए गए अनुरोध से डिक्रिप्ट किया गया.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 uint8 मैसेज का टाइप 0x01 = कुंजी के आधार पर डिवाइसों को जोड़ने का जवाब
1 - 6 uint48 सेवा देने वाली कंपनी का सार्वजनिक (बीआर/ईडीआर) पता अलग-अलग होती है
7 - 15 रैंडम वैल्यू (सॉल्ट) अलग-अलग होती है

टेबल 1.3: रॉ रिस्पॉन्स. टेबल 1.4 में एन्क्रिप्ट किया गया जवाब जनरेट करने के लिए एन्क्रिप्ट किया गया है.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 -15 uint128 एन्क्रिप्ट (सुरक्षित) किया गया जवाब अलग-अलग होती है

टेबल 1.4: एन्क्रिप्ट किया गया जवाब, जिसे सेवा देने वाली कंपनी, सेवा लेने वाली कंपनी को सूचना के ज़रिए भेजती है.

खासियत: पासकी

इस विशेषता का इस्तेमाल, की-आधारित पेयरिंग की प्रक्रिया के दौरान किया जाता है.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 - 15 uint128 एन्क्रिप्ट किया गया पासकी ब्लॉक अलग-अलग होती है

टेबल 2.1: एन्क्रिप्ट (सुरक्षित) किया गया पासकी ब्लॉक. इस्तेमाल करने के लिए,कुंजी के आधार पर डिवाइस जोड़ने की प्रक्रिया देखें.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 uint8 मैसेज का टाइप इनमें से कोई एक:
  • 0x02 = Seeker's Passkey
  • 0x03 = सेवा देने वाली कंपनी की पासकी
1 - 3 unit32 छह अंकों वाली पासकी अलग-अलग होती है
4 से 15 रैंडम वैल्यू (सॉल्ट) अलग-अलग होती है

टेबल 2.2: रॉ पासकी ब्लॉक. टेबल 2.1 का डिक्रिप्ट किया गया वर्शन.

खासियत: खाता कुंजी

पेयर करने के बाद, Fast Pair Seeker, Fast Pair Provider को खाता कुंजी लिखेगा.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 - 15 uint128 खाते की कुंजी (एन्क्रिप्ट की गई) अलग-अलग होती है

लिखने का अनुरोध मिलने पर, फ़ास्ट पेयर Provider ये काम करेगा:

  1. प्रक्रिया के चौथे चरण में जनरेट किए गए सीक्रेट पासवर्ड का इस्तेमाल करके, खाते की कुंजी को डिक्रिप्ट करें.
    • सेवा देने वाली उन कंपनियों के लिए बॉन्डिंग ज़रूरी है जो आम तौर पर ये काम करती हैं:
      • डिक्रिप्ट करने से पहले, पुष्टि करें कि शेयर किए गए सीक्रेट का इस्तेमाल, चरण 12 में पासकी के अनुरोध को डिक्रिप्ट करने के लिए किया गया था. अगर इस सीक्रेट का इस्तेमाल करके यह चरण पूरा नहीं हुआ है, तो इस राइट को अनदेखा करें और बंद करें.
    • इस समय, शेयर किए गए सीक्रेट (प्रक्रिया में K) का इस्तेमाल इस पेयरिंग के लिए दोबारा नहीं किया जाएगा. इस कुंजी का इस्तेमाल करके एन्क्रिप्ट (सुरक्षित) किए गए किसी भी अनुरोध को अस्वीकार कर दिया जाना चाहिए. इसके लिए, प्रक्रिया को फिर से शुरू करने की ज़रूरत नहीं है.
  2. पुष्टि करें कि डिक्रिप्ट की गई वैल्यू, 0x04 या 0xFF से शुरू होती हो. अगर ऐसा नहीं होता है, तो इस राइट ऑपरेशन को अनदेखा करें और बंद करें.
    • अगर वैल्यू 0x04 है, तो:
      • देखें कि सेव की गई खाता कुंजी की सूची में नई वैल्यू के लिए जगह है या नहीं.
      • अगर ऐसा नहीं है, तो सूची से सबसे पुरानी वैल्यू मिटाएं.
      • सूची में नई वैल्यू जोड़ें.
    • अगर वैल्यू 0xFF है, तो:
      • इसे कुछ समय के लिए डिवाइसों को जोड़ने का सेशन माना जाए और कोई कार्रवाई न की जाए.
      • खाते की कुंजी को पिछली तारीख से लिखने की प्रोसेस के दौरान ऐसा हो सकता है.
      • कुंजी को सेव न करें. साथ ही, इसका इस्तेमाल खाते की कुंजी की सूची, एन्क्रिप्शन या MAC के आकलन में न करें.
      • बॉन्ड हटाने की सुविधा, किसी खास सुविधा से जुड़े इवेंट या टाइम आउट होने पर ट्रिगर होती है. LE ऑडियो शेयरिंग के लिए, हमारा सुझाव है कि अस्थायी सेशन के डिसकनेक्ट होने के 10 मिनट बाद, बीएलई बॉन्ड और लिंक कुंजी हटा दें.

सूची में मौजूद खाता कुंजियों का इस्तेमाल, कुंजी के आधार पर पेयरिंग के दौरान किया जाता है.

विशेषता: फ़र्मवेयर का वर्शन

इस विशेषता की मदद से, Seeker को ज़रूरत के हिसाब से Provider के फ़र्मवेयर के वर्शन को पढ़ने की अनुमति मिलती है. इसे हमेशा यह डेटा दिखाना चाहिए:

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 - var utf8s फ़र्मवेयर का वर्शन कोड अलग-अलग होती है

इसे एक ही utf8 स्ट्रिंग में शामिल किया जाना चाहिए. भले ही, प्रोवाइडर के पास एक से ज़्यादा फ़र्मवेयर हों. उदाहरण के लिए, बाएं ईयरबड, दाएं ईयरबड, और केस के लिए तीन फ़र्मवेयर. खास मामलों के लिए, प्रोवाइडर इन स्ट्रिंग को भी वापस भेज सकता है:

  1. status-updating: अगर फ़िलहाल, प्रोवाइडर नए फ़र्मवेयर पर अपडेट कर रहा है. इसके अलावा, प्रोवाइडर, स्टेज किए गए फ़र्मवेयर का वर्शन दिखा सकता है.

  2. status-abnormal: अगर प्रोवाइडर की स्थिति सामान्य नहीं है. उदाहरण के लिए, फ़र्मवेयर अपडेट नहीं होने की वजह से यह ठीक से काम नहीं कर रहा है. इस वैल्यू की वजह से, Seeker एक मैसेज दिखाएगा. इससे उपयोगकर्ता को पता चलेगा कि अब इसे अपडेट करना होगा.

डिवाइस की ट्रैकिंग को रोकने के लिए, सेवा देने वाली कंपनी को फ़र्मवेयर के वर्शन की जानकारी देने वाली सुविधा का ऐक्सेस सीमित करना चाहिए. सुझाई गई पाबंदियां:

  • कनेक्ट किए गए डिवाइसों के पास, किसी भी समय ऐक्सेस होना चाहिए
  • Provider के खोजे जाने पर, किसी भी डिवाइस के पास ऐक्सेस होना चाहिए

खासियत: अतिरिक्त डेटा

इस सेवा में ये सुविधाएं होनी चाहिए.

फ़ास्ट पेयर सेवा की सुविधा एन्क्रिप्ट किया गया अनुमतियां यूयूआईडी
डेटा नहीं लिखें और सूचना भेजें FE2C1237-8366-4814-8EB0-01DE32100BEA
फ़ास्ट पेयर की पुरानी सेवा की विशेषता (1/1/2021 को बंद कर दी जाएगी) एन्क्रिप्ट किया गया अनुमतियां यूयूआईडी
डेटा नहीं लिखें और सूचना भेजें 0x1237

इस विशेषता के बारे में लिखने या सूचना देने से पहले, विशेषता FE2C1234-8366-4814-8EB0-01DE32100BEA के ज़रिए हैंडशेक होना चाहिए, ताकि एक शेयर किया गया सीक्रेट हो. इस विशेषता से होकर गुज़रने वाले डेटा को एन्क्रिप्ट (सुरक्षित) करने के लिए, AES-CTR का इस्तेमाल किया जाएगा. इसके एल्गोरिदम के बारे में यहां बताया गया है. यह मोड, 16 बाइट के एक ब्लॉक से ज़्यादा डेटा के लिए ज़्यादा सुरक्षित है. डेटा की पुष्टि करने के लिए, HMAC-SHA256 का इस्तेमाल किया जाएगा. इसके बारे में यहां भी बताया गया है.

ऑक्टेट ब्यौरा वैल्यू
0 से 7 HMAC-SHA256 के पहले 8 बाइट. अलग-अलग होती है
8 से 15 यह नॉनस, AES-CTR एन्क्रिप्शन के लिए इस्तेमाल किया जाता है. अलग-अलग होती है
16 - var एन्क्रिप्ट (सुरक्षित) किया गया डेटा. अलग-अलग होती है

टेबल 3.1: डेटा पैकेट, जिसे डेटा मुहैया कराने वाली कंपनी, डेटा का अनुरोध करने वाली कंपनी को सूचना के ज़रिए भेजती है या डेटा का अनुरोध करने वाली कंपनी, डेटा मुहैया कराने वाली कंपनी को लिखती है.

ऑक्टेट डेटा टाइप ब्यौरा वैल्यू
0 - var byte array डेटा अलग-अलग है. इसे टेबल 1.2.2 के डेटा आईडी के हिसाब से डिकोड करें:
  • 0x01(personalized name): utf8s

टेबल 3.2: रॉ डेटा. टेबल 3.1 में मौजूद एन्क्रिप्ट (सुरक्षित) किए गए डेटा से डिक्रिप्ट किया गया है.

जब सूचना देने का अनुरोध किया जाता है (जैसे, टेबल 1.2.1 में बिट 2 के ज़रिए नाम को पसंद के मुताबिक बनाने का अनुरोध), तो फ़ास्ट पेयर Provider को ये काम करने होंगे:

  1. Nonce के लिए, क्रिप्टोग्राफ़िक तौर पर रैंडम आठ बाइट जनरेट करें.
  2. एईएस-सीटीआर का इस्तेमाल करके डेटा को एन्क्रिप्ट (सुरक्षित) करें. इसमें हर 16-बाइट ब्लॉक को जनरेट करने के लिए

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

    कहां

    1. AES कुंजी, प्रक्रिया के चौथे चरण में शेयर किया गया सीक्रेट है.
    2. clearBlock[i], 16 बाइट का एक ब्लॉक है, जो data[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, प्रक्रिया के चौथे चरण में मिलता है.
    2. opad, 64 बाइट की आउटर पैडिंग होती है. इसमें 0x5C वैल्यू वाले दोहराए गए बाइट शामिल होते हैं.
    3. ipad में 64 बाइट की इनर पैडिंग है. इसमें 0x36 वैल्यू वाले डुप्लीकेट बाइट शामिल हैं.
  5. डेटा पैकेट के प्रीफ़िक्स के तौर पर, HMAC-SHA256 से पहले 8 बाइट लें.

लिखने का अनुरोध मिलने पर, फ़ास्ट पेयर Provider ये काम करेगा:

  1. HMAC-SHA256 के पहले आठ बाइट की जांच करके, डेटा की अखंडता की पुष्टि करें.
  2. एईएस-सीटीआर का इस्तेमाल करके, एन्क्रिप्ट किए गए डेटा को डिक्रिप्ट करें. इसमें हर ब्लॉक को जनरेट करने के लिए

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

    कहां

    1. encryptedBlock[i], 16 बाइट का ब्लॉक है. यह encrypted_data[i * 16] से शुरू होता है. आखिरी ब्लॉक 16 बाइट से कम हो सकता है.
    2. एईएस कुंजी, हैंडशेक से जनरेट होती है या इसकी पहचान की जाती है. उदाहरण के लिए,
      1. नाम देने की प्रोसेस 1 में, यह ECDH से मिलता है. इसका इस्तेमाल इस पेयरिंग के लिए दोबारा नहीं किया जाएगा. इस कुंजी के साथ एन्क्रिप्ट (सुरक्षित) किए गए किसी भी अनुरोध को अस्वीकार कर दिया जाना चाहिए. इसके लिए, प्रक्रिया को फिर से शुरू करने की ज़रूरत नहीं है.
      2. नाम रखने के फ़्लो 2 में, यह खाते की कुंजी होती है.
  3. कच्चा डेटा बनाने के लिए, concat(clearBlock[0], clearBlock[1],...) फ़ंक्शन का इस्तेमाल करें.