বৈশিষ্ট্য
দ্রুত পেয়ার পরিষেবা
দ্রুত পেয়ার প্রদানকারীর নিম্নলিখিত GATT পরিষেবা থাকতে হবে।
| পরিষেবা | UUID |
|---|---|
| দ্রুত পেয়ার পরিষেবা | 0xFE2C |
এই পরিষেবার নিম্নলিখিত বৈশিষ্ট্য থাকবে।
| Fast Pair পরিষেবার বৈশিষ্ট্য | এনক্রিপটেড | অনুমতি | 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 |
বৈশিষ্ট্য: মডেল আইডি
এই বৈশিষ্ট্যটি ডিভাইসের খোঁজার মতো মোডে বিজ্ঞাপন দেওয়ার সময় ছাড়াও, প্রয়োজনমতো মডেল আইডি পড়তে Seeker-কে অনুমতি দেয়। এটি সবসময় নিম্নলিখিত ডেটা ফেরত দেবে:
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু |
|---|---|---|---|
| ০ - ২ | uint24 |
মডেল আইডি | আলাদা আলাদা হয় |
বৈশিষ্ট্য: কী-ভিত্তিক পেয়ারিং
এই বৈশিষ্ট্যটি কী-ভিত্তিক পেয়ারিং পদ্ধতি নিয়ন্ত্রণ করে। এই পদ্ধতিতে, প্রি-শেয়ার করা কী যে Seeker ও Provider উভয়ের কাছেই আছে তা যাচাই করে, একটি নির্দিষ্ট লেভেলের বিশ্বাস স্থাপন করা হয়। প্রতিটি ক্ষেত্রে কী আলাদা:
কেস ১: আগে শেয়ার করা কীটি অ্যান্টি-স্পুফিং পাবলিক/প্রাইভেট কী পেয়ার এবং সিকারের নিজস্ব পাবলিক/প্রাইভেট কী পেয়ারের উপর ভিত্তি করে তৈরি হয়, যা প্রতিটি পেয়ারিংয়ের চেষ্টার জন্য পরিবর্তিত হবে।
- প্রোভাইডার পেয়ারিং মোডে আছে।
- প্রদানকারীর কাছে অ্যান্টি-স্পুফিং ব্যক্তিগত কী আছে কিনা তা অনুসন্ধানকারী যাচাই করে।
মনে রাখবেন যে পেয়ারিং মোডে থাকাকালীন, পরিষেবা প্রদানকারী স্বাভাবিক পদ্ধতিতেও পেয়ার করতে পারে, যেমন, Fast Pair-এর কী-ভিত্তিক পেয়ারিং কাজ করে না এমন ডিভাইসের সাথে পেয়ার করা।
কেস ২: আগে থেকে শেয়ার করা 'কী' হল অ্যাকাউন্ট কীগুলির মধ্যে একটি।
- প্রোভাইডার সাধারণত পেয়ারিং মোডে থাকে না। (তবে এটি প্রয়োজনীয় নয়—এমনকি পেয়ারিং মোডে থাকলেও, প্রোভাইডারকে অ্যাকাউন্ট কী ব্যবহার করার সুবিধা দিতে হবে।)
- সিকার ও প্রোভাইডার, দুজনেই যাচাই করে যে অন্যজনের কাছে অ্যাকাউন্ট কী আছে।
যেহেতু দুটি ক্ষেত্রেই, আগে থেকে শেয়ার করা হয়েছে এমন কী ব্যবহার করা ছাড়া, বাকি সব কিছু একই, তাই এগুলি প্রসিডিওর-এ একত্রিত করা হয়েছে।
ডেটা ফর্ম্যাট
প্রতিটি ফর্ম্যাট কীভাবে ব্যবহার করা হয় তা জানতে পদ্ধতি দেখুন।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু | বাধ্যতামূলক? |
|---|---|---|---|---|
| ০ - ১৫ | uint128 |
এনক্রিপ্ট করা অনুরোধ | আলাদা আলাদা হয় | বাধ্যতামূলক |
| ১৬ - ৭৯ | সর্বজনীন কী | আলাদা আলাদা হয় | ঐচ্ছিক |
সারণী ১.১: এনক্রিপ্ট করা অনুরোধ, যা সিকারের মাধ্যমে বৈশিষ্ট্যে লেখা হয়েছে।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু | বাধ্যতামূলক? |
|---|---|---|---|---|
| 0 | uint8 |
মেসেজের ধরন | 0x00 = কী-ভিত্তিক পেয়ারিং অনুরোধ |
বাধ্যতামূলক |
| 1 | uint8 |
ফ্ল্যাগ
|
পরিবর্তন হয় | বাধ্যতামূলক |
| ২ - ৭ | uint48 |
দু'টির মধ্যে কোনও একটি:
|
পরিবর্তন হয় | বাধ্যতামূলক |
| ৮ - ১৩ বছর | uint48 |
Seeker-এর BR/EDR অ্যাড্রেস | পরিবর্তন হয় | Flags বিট ১ বা ৩ সেট করা থাকলে তবেই উপস্থিত থাকে |
| n - ১৫ | র্যান্ডম ভ্যালু (সল্ট) | পরিবর্তন হয় | বাধ্যতামূলক |
সারণী ১.২.১: র-অনুরোধ (টাইপ 0x00)। সারণি ১.১-এ এনক্রিপ্ট করা অনুরোধ থেকে ডিক্রিপ্ট করা হয়েছে।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু | বাধ্যতামূলক? |
|---|---|---|---|---|
| 0 | uint8 |
মেসেজের ধরন | 0x10 = অ্যাকশন অনুরোধ |
বাধ্যতামূলক |
| 1 | uint8 |
ফ্ল্যাগ
|
পরিবর্তন হয় | বাধ্যতামূলক |
| ২ - ৭ | uint48 |
দু'টির মধ্যে কোনও একটি:
|
পরিবর্তন হয় | বাধ্যতামূলক |
| 8 | uint8 |
মেসেজ গ্রুপ | পরিবর্তন হয় | ফ্ল্যাগ বিট ০ সেট করা থাকলে বাধ্যতামূলক |
| 9 | uint8 |
মেসেজ কোড | পরিবর্তন হয় | Flags Bit 0 সেট করা থাকলে এটি বাধ্যতামূলক |
| 10 | uint8 |
ফ্ল্যাগের উপর নির্ভর করে:
|
আলাদা আলাদা হয় | Flags Bit 0 বা 1 সেট করা থাকলে এটি বাধ্যতামূলক |
| ১১ - n | অতিরিক্ত ডেটা | পরিবর্তন হয় | ঐচ্ছিক | |
| n - ১৫ | র্যান্ডম ভ্যালু (সল্ট) | পরিবর্তন হয় | বাধ্যতামূলক |
সারণী ১.২.২: র-অনুরোধ (টাইপ 0x10)। এনক্রিপ্টেড অনুরোধ থেকে ডিক্রিপ্ট করা হয়েছে টেবিল ১.১-এ।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু |
|---|---|---|---|
| 0 | uint8 |
মেসেজের ধরন | 0x01 = কী-ভিত্তিক পেয়ারিং রেসপন্স |
| ১ - ৬ | uint48 |
প্রোভাইডারের সর্বজনীন (BR/EDR) ঠিকানা | আলাদা আলাদা হয় |
| ৭ - ১৫ | র্যান্ডম ভ্যালু (সল্ট) | আলাদা আলাদা হয় |
সারণী ১.৩: র-উত্তর। এনক্রিপ্ট করা উত্তর তৈরি করতে এনক্রিপ্ট করা হয়েছে সারণী ১.৪-এ।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু |
|---|---|---|---|
| ০ -১৫ | uint128 |
এনক্রিপ্ট করা উত্তর | আলাদা আলাদা হয় |
সারণী ১.৪: এনক্রিপ্ট করা উত্তর, যা প্রদানকারী বিজ্ঞপ্তি পাঠানোর মাধ্যমে প্রার্থীকে পাঠায়।
বৈশিষ্ট্য: পাসকী
এই বৈশিষ্ট্যটি কী-ভিত্তিক পেয়ারিং পদ্ধতির সময় ব্যবহার করা হয়।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু |
|---|---|---|---|
| ০ - ১৫ | uint128 |
এনক্রিপ্ট করা পাসকী ব্লক | পরিবর্তন হয় |
সারণী ২.১: এনক্রিপ্ট করা পাসকী ব্লক। ব্যবহারের জন্য কী-ভিত্তিক পেয়ারিং পদ্ধতি দেখুন।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু |
|---|---|---|---|
| 0 | uint8 |
মেসেজের ধরন | এর মধ্যে একটি:
|
| ১ - ৩ | unit32 |
৬ সংখ্যার পাসকী | আলাদা আলাদা হয় |
| ৪ - ১৫ | র্যান্ডম ভ্যালু (সল্ট) | আলাদা আলাদা হয় |
সারণী ২.২: র পাসকী ব্লক। সারণী ২.১-এর ডিক্রিপ্ট করা ভার্সন।
বৈশিষ্ট্য: অ্যাকাউন্ট কী
পেয়ার করার পরে, 'দ্রুত পেয়ার' সিকার, 'দ্রুত পেয়ার' প্রোভাইডারে একটি অ্যাকাউন্ট কী লিখবে।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু |
|---|---|---|---|
| ০ - ১৫ | uint128 |
অ্যাকাউন্ট কী (এনক্রিপ্ট করা) | পরিবর্তন হয় |
'রাইট' অনুরোধ পেলে, 'দ্রুত পেয়ার' প্রদানকারীকে নিম্নলিখিত কাজগুলি করতে হবে:
- পদ্ধতি-এর ৪ নম্বর ধাপে তৈরি করা শেয়ার্ড সিক্রেট ব্যবহার করে অ্যাকাউন্ট 'কী' ডিক্রিপ্ট করুন।
- যেসব প্রদানকারীর ক্ষেত্রে বন্ডিং প্রয়োজন (সাধারণ):
- ডিক্রিপ্ট করার আগে, যাচাই করুন যে ১২ নম্বর ধাপে পাসকী অনুরোধ ডিক্রিপ্ট করার জন্য শেয়ার করা সিক্রেট ব্যবহার করা হয়েছে। এই সিক্রেট ব্যবহার করে এই ধাপটি পাস না করে থাকলে, এই লেখাটি উপেক্ষা করুন এবং বেরিয়ে আসুন।
- এই পর্যায়ে, এই পেয়ারিংয়ের জন্য শেয়ার করা সিক্রেট (প্রসিডিউরে K) আর ব্যবহার করা হবে না। এই 'কী' দিয়ে এনক্রিপ্ট করা কোনও অনুরোধ এলে, প্রসেস রিস্টার্ট না করে তা বাতিল করে দিতে হবে।
- যেসব প্রদানকারীর ক্ষেত্রে বন্ডিং প্রয়োজন (সাধারণ):
- ডিক্রিপ্ট করা ভ্যালু
0x04বা0xFFদিয়ে শুরু হচ্ছে কিনা তা যাচাই করুন। যদি না হয়, এই লেখাটি উপেক্ষা করুন এবং বেরিয়ে আসুন।- ভ্যালু
0x04হলে:- নতুন ভ্যালুর জন্য সেভ করা অ্যাকাউন্ট কী তালিকায় জায়গা আছে কিনা তা চেক করুন।
- যদি না হয়, তাহলে তালিকা থেকে সবচেয়ে কম সম্প্রতি ব্যবহৃত ভ্যালু মুছে দিন।
- তালিকায় নতুন ভ্যালু যোগ করুন।
- ভ্যালু
0xFFহলে:- এটি একটি অস্থায়ী পেয়ারিং সেশন হিসেবে বিবেচনা করুন এবং কোনও অপারেশন পারফর্ম করবেন না।
- অ্যাকাউন্ট কী রেট্রোঅ্যাক্টিভভাবে লেখা ফ্লোতে এটি হতে পারে।
- 'কী' স্টোর করবেন না এবং অ্যাকাউন্ট 'কী' তালিকা, এনক্রিপশন বা MAC গণনার ক্ষেত্রে এটি ব্যবহার করবেন না।
- ফিচার-নির্দিষ্ট ইভেন্ট বা টাইমআউটের মাধ্যমে বন্ড সরিয়ে দেওয়ার প্রসেস ট্রিগার করা হয়। LE অডিও শেয়ারিংয়ের জন্য, অস্থায়ী সেশন ডিসকানেক্ট হওয়ার ১০ মিনিট পরে BLE বন্ড ও লিঙ্ক কী সরিয়ে দেওয়ার জন্য বিশেষভাবে সাজেস্ট করা হয়।
- ভ্যালু
কী-ভিত্তিক পেয়ারিং-এর সময় তালিকায় থাকা অ্যাকাউন্ট কী ব্যবহার করা হয়।
বৈশিষ্ট্য: ফার্মওয়্যার রিভিশন
এই বৈশিষ্ট্যটি সিকারকে প্রয়োজন অনুযায়ী প্রোভাইডারের ফার্মওয়্যার রিভিশন পড়ার অনুমতি দেয়। এটি সবসময় নিম্নলিখিত ডেটা রিটার্ন করবে:
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু |
|---|---|---|---|
| 0 - var | utf8s |
ফার্মওয়্যার রিভিশন কোড | পরিবর্তন হয় |
প্রোভাইডারে একাধিক ফার্মওয়্যার (যেমন, বাম দিকের বাড, ডানদিকের বাড এবং কেসের জন্য ৩টি ফার্মওয়্যার) থাকলেও, এটিকে একটি utf8 স্ট্রিংয়ে এনক্যাপসুলেট করতে হবে। এছাড়াও, বিশেষ ক্ষেত্রে প্রোভাইডার নির্দিষ্ট স্ট্রিং ফিরিয়ে দিতে পারে:
status-updating: যদি প্রোভাইডার বর্তমানে নতুন ফার্মওয়্যারে আপডেট করে। অন্যথায়, প্রোভাইডার স্টেজ করা ফার্মওয়্যারের ভার্সন ফিরিয়ে দিতে পারে।
status-abnormal: পরিষেবা প্রদানকারী যদি অস্বাভাবিক অবস্থায় থাকে। যেমন, ফার্মওয়্যার আপডেট করা না গেলে এটি ঠিকমতো কাজ করে না। এই ভ্যালুর কারণে Seeker একটি মেসেজ দেখাবে যাতে ব্যবহারকারী জানতে পারেন যে এটি এখনই আপডেট করতে হবে।
ডিভাইস ট্র্যাকিং প্রতিরোধ করতে, প্রদানকারীর ফার্মওয়্যার রিভিশন বৈশিষ্ট্যে অ্যাক্সেস সীমিত করা উচিত। সাজেস্ট করা বিধিনিষেধ:
- বন্ড করা ডিভাইস যেকোনও সময় অ্যাক্সেস করতে পারবে
- প্রোভাইডার খুঁজে নেওয়ার যোগ্য হলে যেকোনও ডিভাইসের অ্যাক্সেস থাকতে হবে
প্রোভাইডার Find Hub-এ কাজ করলে, অতিরিক্ত প্রয়োগের প্রয়োজন হয়। বিস্তারিত জানতে, Find Hub ফার্মওয়্যার আপডেট দেখুন।
বৈশিষ্ট্য: অতিরিক্ত ডেটা
এই পরিষেবার নিম্নলিখিত বৈশিষ্ট্য থাকতে হবে।
| Fast Pair পরিষেবার বৈশিষ্ট্য | এনক্রিপটেড | অনুমতি | UUID |
|---|---|---|---|
| ডেটা | না | লিখুন ও বিজ্ঞপ্তি পাঠান | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| পুরানো দ্রুত পেয়ার পরিষেবার বৈশিষ্ট্য (২০২১/১/১ তারিখে বন্ধ করার লক্ষ্য) | এনক্রিপটেড | অনুমতি | UUID |
|---|---|---|---|
| ডেটা | না | লিখে, বিজ্ঞপ্তি পাঠান | 0x1237 |
এই বৈশিষ্ট্যে লেখার বা বিজ্ঞপ্তি পাঠানোর আগে, শেয়ার্ড সিক্রেট পেতে
বৈশিষ্ট্য FE2C1234-8366-4814-8EB0-01DE32100BEA-এর মাধ্যমে হ্যান্ডশেক
করতে হবে। এই বৈশিষ্ট্যের মাধ্যমে প্রবাহিত ডেটা এনক্রিপ্ট করতে AES-CTR ব্যবহার করা হবে, যার অ্যালগরিদম নিচে সংজ্ঞায়িত করা হয়েছে। এই মোডটি ১৬-বাইট ব্লকের বাইরে
বিস্তৃত ডেটা জুড়ে আরও সুরক্ষিত। ডেটা ইনটিগ্রিটি নিশ্চিত করতে HMAC-SHA256
ব্যবহার করা হবে, যা নিচেও সংজ্ঞায়িত করা হয়েছে।
| অক্টেট | বিবরণ | ভ্যালু |
|---|---|---|
| ০ - ৭ | HMAC-SHA256-এর প্রথম ৮ বাইট। | আলাদা আলাদা হয় |
| ৮ - ১৫ | AES-CTR এনক্রিপশন দ্বারা ব্যবহৃত ননস। | আলাদা আলাদা হয় |
| ১৬ - var | এনক্রিপটেড ডেটা। | আলাদা আলাদা হয় |
সারণী ৩.১: ডেটা প্যাকেট, যা পরিষেবা প্রদানকারী, বিজ্ঞপ্তি পাঠানোর মাধ্যমে, পরিষেবা গ্রহণকারীকে পাঠায় অথবা পরিষেবা গ্রহণকারী, লেখার মাধ্যমে, পরিষেবা প্রদানকারীকে পাঠায়।
| অক্টেট | ডেটার ধরন | বিবরণ | ভ্যালু |
|---|---|---|---|
| 0 - var | byte array |
ডেটা | পরিবর্তন হয়, সারণী ১.২.২-এর ডেটা আইডি অনুযায়ী এটি ডিকোড করুন:
|
সারণী ৩.২: মূল ডেটা। এনক্রিপটেড ডেটা থেকে ডিক্রিপ্ট করা হয়েছে টেবিল ৩.১-এ।
কোনও বিজ্ঞপ্তি পাঠানোর অনুরোধ করা হলে (যেমন, Bit 2-এর মাধ্যমে ব্যক্তিগত নাম জানানোর অনুরোধ সারণী ১.২.১), 'দ্রুত পেয়ার' প্রদানকারীকে নিম্নলিখিত কাজগুলি করতে হবে:
- Nonce-এর জন্য ক্রিপ্টোগ্রাফিক্যালি র্যান্ডম ৮ বাইট জেনারেট করুন।
AES-CTR ব্যবহার করে ডেটা এনক্রিপ্ট করুন, যেখানে প্রতিটি ১৬-বাইট ব্লক তৈরি করা হয়
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))কোথায়
- AES কী হল পদ্ধতি-এর ৪ নম্বর ধাপ থেকে শেয়ার করা সিক্রেট।
- clearBlock[i] হল ১৬-বাইটের ব্লক যা data[i * 16] থেকে শুরু হয়। শেষ ব্লকটি ১৬ বাইটের কম হতে পারে।
এনক্রিপ্টেড ডেটা তৈরি করতে concat(encryptedBlock[0], encryptedBlock[1],...) পারফর্ম করুন।
এগুলি ব্যবহার করে HMAC-SHA256 তৈরি করুন:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))কোথায়
- K, concat(shared_secret, 48-byte ZEROs) দ্বারা জেনারেট করা হয়, shared_secret, পদ্ধতি-এর ৪ নম্বর ধাপ থেকে পাওয়া যায়।
- opad হল ৬৪ বাইটের আউটার প্যাডিং, যার মধ্যে রিপিট করা বাইটের ভ্যালু
0x5Cথাকে। - ipad হল ৬৪ বাইট ইন্টার্নাল প্যাডিং, যার মধ্যে
0x36ভ্যালু সহ রিপিট করা বাইট থাকে।
ডেটা প্যাকেট-এর প্রিফিক্স হিসেবে HMAC-SHA256 থেকে প্রথম ৮ বাইট নিন।
'রাইট' অনুরোধ পেলে, 'দ্রুত পেয়ার' প্রদানকারীকে নিম্নলিখিত কাজগুলি করতে হবে:
- HMAC-SHA256-এর প্রথম ৮ বাইট চেক করে ডেটার ইন্টিগ্রিটি যাচাই করুন।
AES-CTR ব্যবহার করে এনক্রিপ্ট করা ডেটা ডিক্রিপ্ট করুন, যেখানে প্রতিটি ব্লক তৈরি করা হয়
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))কোথায়
- encryptedBlock[i] হল ১৬-বাইট ব্লক যা encrypted_data[i * 16] থেকে শুরু হয়। শেষ ব্লকটি ১৬ বাইটের কম হতে পারে।
- হ্যান্ডশেক থেকে AES কী তৈরি বা শনাক্ত করা হয়, যেমন
- নেমিং ফ্লো ১-এ, এটি ECDH থেকে নেওয়া হয়েছে এবং এই পেয়ারিংয়ের জন্য এটি আর ব্যবহার করা হবে না। প্রসেস রিস্টার্ট না করে এই 'কী' দিয়ে এনক্রিপ্ট করা কোনও অনুরোধ এলে তা বাতিল করতে হবে।
- নেমিং ফ্লো ২-এ, এটি অ্যাকাউন্ট কী।
র-ডেটা তৈরি করতে concat(clearBlock[0], clearBlock[1],...) পারফর্ম করুন।