বৈশিষ্ট্য

দ্রুত জোড়া পরিষেবা

ফাস্ট পেয়ার প্রদানকারীর নিম্নলিখিত GATT পরিষেবা থাকতে হবে।

সেবা UUID
দ্রুত জোড়া পরিষেবা 0xFE2C

এই পরিষেবার নিম্নলিখিত বৈশিষ্ট্য থাকতে হবে।

দ্রুত জোড়া পরিষেবা বৈশিষ্ট্য এনক্রিপ্ট করা হয়েছে অনুমতি 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: প্রি-শেয়ারড কীটি অ্যান্টি-স্পুফিং পাবলিক/প্রাইভেট কী জুটির উপর ভিত্তি করে এবং সিকারের নিজস্ব পাবলিক/প্রাইভেট কী জোড়ার উপর ভিত্তি করে যা প্রতিটি জোড়া করার প্রচেষ্টার জন্য পরিবর্তিত হবে।

    • প্রদানকারী পেয়ারিং মোডে আছে।
    • অনুসন্ধানকারী যাচাই করে যে প্রদানকারীর কাছে অ্যান্টি-স্পুফিং প্রাইভেট কী রয়েছে।

    মনে রাখবেন যে পেয়ারিং মোডে থাকাকালীন, প্রদানকারী অবশ্যই স্বাভাবিক উপায়ে পেয়ার করতে পারে, উদাহরণস্বরূপ, একটি ডিভাইসের সাথে পেয়ার করতে যা ফাস্ট পেয়ারের কী-ভিত্তিক পেয়ারিং সমর্থন করে না।

  • কেস 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 প্রার্থীর বিআর/ইডিআর ঠিকানা পরিবর্তিত হয় ফ্ল্যাগ বিট 1 বা 3 সেট করা থাকলেই উপস্থাপন করুন
n - 15 এলোমেলো মান (লবণ) পরিবর্তিত হয় বাধ্যতামূলক

সারণি 1.2.1: কাঁচা অনুরোধ (টাইপ 0x00)। সারণি 1.1 -এ এনক্রিপ্ট করা অনুরোধ থেকে ডিক্রিপ্ট করা হয়েছে।

অক্টেট ডেটা টাইপ বর্ণনা মান বাধ্যতামূলক?
0 uint8 বার্তার ধরন 0x10 = অ্যাকশন অনুরোধ বাধ্যতামূলক
1 uint8 পতাকা পরিবর্তিত হয় বাধ্যতামূলক
2 - 7 uint48 হয়:
  • প্রদানকারীর বর্তমান BLE ঠিকানা
  • প্রদানকারীর সর্বজনীন ঠিকানা
পরিবর্তিত হয় বাধ্যতামূলক
8 uint8 বার্তা গ্রুপ পরিবর্তিত হয় ফ্ল্যাগ বিট 0 সেট করা থাকলে বাধ্যতামূলক৷
9 uint8 বার্তা কোড পরিবর্তিত হয় ফ্ল্যাগ বিট 0 সেট করা থাকলে বাধ্যতামূলক৷
10 uint8 পতাকার উপর নির্ভর করে:
  • বিট 0 সেট করা হয়েছে: অতিরিক্ত ডেটা দৈর্ঘ্য, 6-এর কম
  • বিট 1 সেট করা হয়েছে: ডেটা আইডি
পরিবর্তিত হয় বাধ্যতামূলক যদি পতাকা বিট 0 বা 1 সেট করা থাকে
11 - এন অতিরিক্ত ডেটা পরিবর্তিত হয় ঐচ্ছিক
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. স্থিতি-অস্বাভাবিক : যদি প্রদানকারী অস্বাভাবিক অবস্থায় থাকে। উদাহরণস্বরূপ, ফার্মওয়্যার আপডেট ব্যর্থ হওয়ায় এটি ত্রুটিপূর্ণ হয়েছে। এই মানটি ব্যবহারকারীকে এটিকে আপডেট করতে হবে তা জানানোর জন্য অনুসন্ধানকারীকে একটি বার্তা দেখাবে।

ডিভাইস ট্র্যাকিং প্রতিরোধ করার জন্য প্রদানকারীর ফার্মওয়্যার রিভিশন বৈশিষ্ট্যের অ্যাক্সেস সীমিত করা উচিত। প্রস্তাবিত সীমাবদ্ধতা:

  • বন্ডেড ডিভাইসের যে কোনো সময় অ্যাক্সেস থাকা উচিত
  • সরবরাহকারী আবিষ্কারযোগ্য হলে যেকোনো ডিভাইসের অ্যাক্সেস থাকা উচিত

বৈশিষ্ট্য: অতিরিক্ত ডেটা

এই পরিষেবার নিম্নলিখিত বৈশিষ্ট্য থাকতে হবে।

দ্রুত জোড়া পরিষেবা বৈশিষ্ট্য এনক্রিপ্ট করা হয়েছে অনুমতি UUID
ডেটা না লিখুন এবং অবহিত করুন FE2C1237-8366-4814-8EB0-01DE32100BEA
ওল্ড ফাস্ট পেয়ার সার্ভিসের বৈশিষ্ট্য (2021/1/1 তারিখে অবনমনের লক্ষ্য) এনক্রিপ্ট করা হয়েছে অনুমতি UUID
ডেটা না লিখুন এবং অবহিত করুন 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(ব্যক্তিগত নাম): utf8s

সারণি 3.2: কাঁচা তথ্য। সারণি 3.1 -এ এনক্রিপ্ট করা ডেটা থেকে ডিক্রিপ্ট করা হয়েছে।

যখন একটি বিজ্ঞপ্তির জন্য অনুরোধ করা হয় (যেমন সারণি 1.2.1 এ বিট 2 এর মাধ্যমে ব্যক্তিগতকৃত নামের অনুরোধ করুন), দ্রুত জোড়া প্রদানকারী নিম্নলিখিতগুলি করবে:

  1. Nonce-এর জন্য ক্রিপ্টোগ্রাফিকভাবে র্যান্ডম 8 বাইট তৈরি করুন।
  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. এনক্রিপ্ট করা ডেটা তৈরি করতে কনক্যাট (এনক্রিপ্টেডব্লক[0], এনক্রিপ্টেডব্লক[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 হল পদ্ধতির ধাপ 4 থেকে।
    2. opad হল 64 বাইট বাইরের প্যাডিং, 0x5C মূল্যের পুনরাবৃত্তি বাইট নিয়ে গঠিত।
    3. ipad হল 64 বাইট অভ্যন্তরীণ প্যাডিং, 0x36 মূল্যের পুনরাবৃত্তি বাইট সমন্বিত।
  5. ডেটা প্যাকেটের উপসর্গ হিসাবে HMAC-SHA256 থেকে প্রথম 8 বাইট নিন।

একটি লিখিত অনুরোধ পাওয়ার পরে, দ্রুত জোড়া প্রদানকারী নিম্নলিখিতগুলি করবে:

  1. HMAC-SHA256 এর প্রথম 8 বাইট চেক করে ডেটার অখণ্ডতা যাচাই করুন।
  2. AES-CTR ব্যবহার করে এনক্রিপ্ট করা ডেটা ডিক্রিপ্ট করুন, যেখানে প্রতিটি ব্লক ব্যবহার করে তৈরি করা হয়

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

    যেখানে

    1. encryptedBlock[i] হল একটি 16-বাইট ব্লক এনক্রিপ্টেড_ডাটা[i*16] থেকে শুরু হয়। শেষ ব্লকটি 16 বাইটের কম হতে পারে।
    2. AES কী হ্যান্ডশেক থেকে তৈরি বা চিহ্নিত করা হয়, যেমন
      1. নামকরণ ফ্লো 1- এ, এটি ECDH থেকে এসেছে, এবং এটি এই জোড়ার জন্য আর ব্যবহার করা হবে না। পদ্ধতিটি পুনরায় চালু না করে এই কী দিয়ে এনক্রিপ্ট করা যেকোনো অনুরোধ প্রত্যাখ্যান করা উচিত।
      2. নামকরণ ফ্লো 2 এ, এটি অ্যাকাউন্ট কী।
  3. কাঁচা ডেটা তৈরি করতে কনক্যাট (ক্লিয়ারব্লক[0], ক্লিয়ারব্লক[1],...) সম্পাদন করুন।