বৈশিষ্ট্য
ফাস্ট পেয়ার সার্ভিস
ফাস্ট পেয়ার প্রোভাইডারের নিম্নলিখিত 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 |
বৈশিষ্ট্য: মডেল আইডি
এই বৈশিষ্ট্যটি সিকারকে, ডিভাইসটি ডিসকভারেবল মোডে বিজ্ঞাপন দেওয়ার সময় ছাড়াও, প্রয়োজন অনুযায়ী মডেল আইডি পড়ার সুযোগ দেয়। এটির সর্বদা নিম্নলিখিত ডেটা ফেরত দেওয়া উচিত:
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ - ২ | uint24 | মডেল আইডি | বিভিন্ন |
বৈশিষ্ট্য: কী-ভিত্তিক জোড় বাঁধা
এই বৈশিষ্ট্যটি কী-ভিত্তিক পেয়ারিং পদ্ধতি নিয়ন্ত্রণ করে। এই পদ্ধতিতে, সিকার এবং প্রোভাইডার উভয়ের কাছেই একটি পূর্ব-শেয়ার করা কী আছে কিনা তা যাচাই করার মাধ্যমে একটি নির্দিষ্ট স্তরের বিশ্বাসযোগ্যতা স্থাপন করা হয়। প্রতিটি ক্ষেত্রে কী-টি ভিন্ন হয়:
কেস ১: প্রি-শেয়ার্ড কী-টি অ্যান্টি-স্পুফিং পাবলিক/প্রাইভেট কী পেয়ার এবং সিকারের নিজস্ব পাবলিক/প্রাইভেট কী পেয়ারের উপর ভিত্তি করে তৈরি, যা প্রতিটি পেয়ারিং প্রচেষ্টার জন্য পরিবর্তিত হবে।
- প্রোভাইডারটি পেয়ারিং মোডে আছে।
- অনুসন্ধানকারী যাচাই করে যে প্রদানকারীর কাছে অ্যান্টি-স্পুফিং প্রাইভেট কী-টি রয়েছে।
উল্লেখ্য যে, পেয়ারিং মোডে থাকা অবস্থায়, প্রোভাইডারটি অবশ্যই স্বাভাবিক উপায়েও পেয়ার করতে পারে, যেমন—এমন কোনো ডিভাইসের সাথে পেয়ার করার জন্য যা ফাস্ট পেয়ারের কী-ভিত্তিক পেয়ারিং সমর্থন করে না।
ক্ষেত্র ২: প্রি-শেয়ার্ড কী হলো অ্যাকাউন্ট কীগুলোর মধ্যে একটি।
- প্রোভাইডার সাধারণত পেয়ারিং মোডে থাকে না। (কিন্তু এটি কোনো আবশ্যিক শর্ত নয়—পেয়ারিং মোডে থাকা অবস্থাতেও প্রোভাইডারের অ্যাকাউন্ট কী ব্যবহার করার সুবিধা থাকা উচিত।)
- অনুসন্ধানকারী এবং প্রদানকারী প্রত্যেকেই যাচাই করে দেখেন যে অপরজনের কাছে অ্যাকাউন্ট কী-টি রয়েছে।
যেহেতু উভয় ক্ষেত্রই ব্যবহৃত প্রি-শেয়ার্ড কী ছাড়া অত্যন্ত সাদৃশ্যপূর্ণ, তাই কার্যপ্রণালীতে সেগুলোকে একত্রিত করা হয়।
ডেটা ফরম্যাট
প্রতিটি ফরম্যাট কীভাবে ব্যবহার করা হয়, তার কার্যপ্রণালী দেখুন।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য | বাধ্যতামূলক? |
|---|---|---|---|---|
| ০ - ১৫ | uint128 | এনক্রিপ্টেড অনুরোধ | বিভিন্ন | বাধ্যতামূলক |
| ১৬ - ৭৯ | পাবলিক কী | বিভিন্ন | ঐচ্ছিক |
সারণি ১.১: এনক্রিপ্টেড অনুরোধ, যা অনুসন্ধানকারী দ্বারা বৈশিষ্ট্যটিতে লেখা হয়েছে।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য | বাধ্যতামূলক? |
|---|---|---|---|---|
| ০ | uint8 | বার্তার ধরণ | 0x00 = কী-ভিত্তিক পেয়ারিং অনুরোধ | বাধ্যতামূলক |
| ১ | uint8 | পতাকা
| বিভিন্ন | বাধ্যতামূলক |
| ২ - ৭ | uint48 | হয়:
| বিভিন্ন | বাধ্যতামূলক |
| ৮ - ১৩ | uint48 | অনুসন্ধানকারীর বিআর/ইডিআর ঠিকানা | বিভিন্ন | শুধুমাত্র ফ্ল্যাগ বিট ১ বা ৩ সেট করা থাকলেই উপস্থিত থাকবে। |
| এন - ১৫ | এলোমেলো মান (লবণ) | বিভিন্ন | বাধ্যতামূলক |
সারণি ১.২.১: মূল অনুরোধ (টাইপ 0x00)। সারণি ১.১- এ থাকা এনক্রিপ্টেড অনুরোধ থেকে ডিক্রিপ্ট করা হয়েছে।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য | বাধ্যতামূলক? |
|---|---|---|---|---|
| ০ | uint8 | বার্তার ধরণ | 0x10 = পদক্ষেপের অনুরোধ | বাধ্যতামূলক |
| ১ | uint8 | পতাকা
| বিভিন্ন | বাধ্যতামূলক |
| ২ - ৭ | uint48 | হয়:
| বিভিন্ন | বাধ্যতামূলক |
| ৮ | uint8 | বার্তা গ্রুপ | বিভিন্ন | ফ্ল্যাগস বিট ০ সেট করা থাকলে বাধ্যতামূলক। |
| ৯ | uint8 | বার্তা কোড | বিভিন্ন | ফ্ল্যাগস বিট ০ সেট করা থাকলে বাধ্যতামূলক। |
| ১০ | uint8 | পতাকার উপর নির্ভর করে:
| বিভিন্ন | ফ্ল্যাগ বিট ০ বা ১ সেট করা থাকলে বাধ্যতামূলক। |
| ১১ - এন | অতিরিক্ত তথ্য | বিভিন্ন | ঐচ্ছিক | |
| এন - ১৫ | এলোমেলো মান (লবণ) | বিভিন্ন | বাধ্যতামূলক |
সারণি ১.২.২: মূল অনুরোধ (টাইপ 0x10)। সারণি ১.১- এ থাকা এনক্রিপ্টেড অনুরোধ থেকে ডিক্রিপ্ট করা হয়েছে।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ | uint8 | বার্তার ধরণ | 0x01 = কী-ভিত্তিক পেয়ারিং প্রতিক্রিয়া |
| ১ - ৬ | uint48 | প্রদানকারীর সর্বজনীন (BR/EDR) ঠিকানা | বিভিন্ন |
| ৭ - ১৫ | এলোমেলো মান (লবণ) | বিভিন্ন |
সারণি ১.৩: মূল প্রতিক্রিয়া। সারণি ১.৪- এ এনক্রিপ্টেড প্রতিক্রিয়া তৈরি করার জন্য এটিকে এনক্রিপ্ট করা হয়েছে।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ -১৫ | uint128 | এনক্রিপ্টেড প্রতিক্রিয়া | বিভিন্ন |
সারণি ১.৪: প্রোভাইডার কর্তৃক নোটিফাই-এর মাধ্যমে সিকারের কাছে প্রেরিত এনক্রিপ্টেড রেসপন্স।
বৈশিষ্ট্য: পাসকি
এই বৈশিষ্ট্যটি কী-ভিত্তিক পেয়ারিং প্রক্রিয়ার সময় ব্যবহৃত হয়।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ - ১৫ | uint128 | এনক্রিপ্টেড পাসকি ব্লক | বিভিন্ন |
সারণি ২.১: এনক্রিপ্টেড পাসকি ব্লক। ব্যবহারের জন্য কী-ভিত্তিক পেয়ারিং পদ্ধতি দেখুন।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ | uint8 | বার্তার ধরণ | এর মধ্যে একটি:
|
| ১ - ৩ | unit32 | ৬-সংখ্যার পাসকি | বিভিন্ন |
| ৪ - ১৫ | এলোমেলো মান (লবণ) | বিভিন্ন |
সারণি ২.২: মূল পাসকি ব্লক। সারণি ২.১- এর ডিক্রিপ্ট করা সংস্করণ।
বৈশিষ্ট্য: অ্যাকাউন্ট কী
পেয়ারিং সম্পন্ন হওয়ার পর, ফাস্ট পেয়ার সিকার ফাস্ট পেয়ার প্রোভাইডারের কাছে একটি অ্যাকাউন্ট কী লিখে রাখবে।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ - ১৫ | uint128 | অ্যাকাউন্ট কী (এনক্রিপ্টেড) | বিভিন্ন |
একটি রাইট রিকোয়েস্ট পেলে, ফাস্ট পেয়ার প্রোভাইডার নিম্নলিখিত কাজগুলো করবে:
- কার্যপ্রণালীর ধাপ ৪ থেকে তৈরি হওয়া শেয়ার্ড সিক্রেট ব্যবহার করে অ্যাকাউন্ট কী-টি ডিক্রিপ্ট করুন।
- যেসব প্রদানকারীর বন্ডের প্রয়োজন হয় (সাধারণ):
- ডিক্রিপ্ট করার আগে, যাচাই করুন যে ধাপ ১২-এর পাসকি অনুরোধটি ডিক্রিপ্ট করতে শেয়ার্ড সিক্রেটটি ব্যবহার করা হয়েছিল। যদি এই সিক্রেটটি ব্যবহার করে এই ধাপটি সম্পন্ন না হয়, তবে এই রাইটটি উপেক্ষা করুন এবং প্রস্থান করুন।
- এই পর্যায়ে, শেয়ার্ড সিক্রেট (প্রসিডিওরটিতে K ) এই পেয়ারিংয়ের জন্য আর ব্যবহার করা হবে না। প্রসিডিউরটি পুনরায় চালু না করে এই কী দিয়ে এনক্রিপ্ট করা যেকোনো অনুরোধ প্রত্যাখ্যান করা উচিত।
- যেসব প্রদানকারীর বন্ডের প্রয়োজন হয় (সাধারণ):
- যাচাই করুন যে ডিক্রিপ্ট করা মানটি
0x04বা0xFFদিয়ে শুরু হয় কিনা। যদি তা না হয়, এই রাইটটি উপেক্ষা করুন এবং প্রস্থান করুন।- যদি মান
0x04হয় :- সংরক্ষিত অ্যাকাউন্ট কী তালিকায় নতুন মানটির জন্য জায়গা আছে কিনা তা যাচাই করুন।
- অন্যথায়, তালিকা থেকে সবচেয়ে কম ব্যবহৃত মানটি মুছে দিন।
- তালিকায় নতুন মানটি যোগ করুন।
- যদি মান
0xFFহয় :- এটিকে একটি অস্থায়ী পেয়ারিং সেশন হিসেবে বিবেচনা করুন এবং কোনো অপারেশন সম্পাদন করবেন না।
- রেট্রোঅ্যাক্টিভভাবে অ্যাকাউন্ট কী লেখার ফ্লো-এর ক্ষেত্রে এটি ঘটতে পারে।
- কী-টি সংরক্ষণ করবেন না এবং এটি অ্যাকাউন্ট কী তালিকা , এনক্রিপশন বা MAC গণনার কাজে ব্যবহার করবেন না।
- একটি ফিচার-নির্দিষ্ট ইভেন্ট বা টাইমআউটের কারণে বন্ড অপসারণ সক্রিয় হয়। LE অডিও শেয়ারিং-এর ক্ষেত্রে, অস্থায়ী সেশনটি সংযোগ বিচ্ছিন্ন হওয়ার ১০ মিনিট পর BLE বন্ড এবং লিঙ্ক কী অপসারণ করার জন্য দৃঢ়ভাবে সুপারিশ করা হয়।
- যদি মান
তালিকায় থাকা অ্যাকাউন্ট কীগুলো কী-ভিত্তিক পেয়ারিং -এর সময় ব্যবহৃত হয়।
বৈশিষ্ট্য: ফার্মওয়্যার সংস্করণ
এই বৈশিষ্ট্যটি সিকারকে প্রয়োজন অনুযায়ী প্রোভাইডারের ফার্মওয়্যার সংস্করণ পড়ার সুযোগ দেয়। এটির সর্বদা নিম্নলিখিত ডেটা ফেরত দেওয়া উচিত:
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ - ভ্যার | utf8s | ফার্মওয়্যার সংস্করণ কোড | বিভিন্ন |
প্রোভাইডারে একাধিক ফার্মওয়্যার থাকলেও (যেমন বাম বাড, ডান বাড এবং কেসের জন্য ৩টি ফার্মওয়্যার) এটিকে একটিমাত্র utf8 স্ট্রিং-এর মধ্যে আবদ্ধ করা উচিত। প্রোভাইডারটি বিশেষ ক্ষেত্রগুলির জন্য নির্দিষ্ট স্ট্রিংগুলিও ফেরত দিতে পারে:
অবস্থা-আপডেট হচ্ছে : যদি প্রোভাইডার বর্তমানে একটি নতুন ফার্মওয়্যারে আপডেট করে থাকে। বিকল্পভাবে, প্রোভাইডার স্টেজড ফার্মওয়্যারের সংস্করণটি ফেরত দিতে পারে।
status-abnormal : যদি প্রোভাইডারটি কোনো অস্বাভাবিক অবস্থায় থাকে। উদাহরণস্বরূপ, ফার্মওয়্যার আপডেট ব্যর্থ হওয়ার কারণে এটি বিকল হয়ে গেছে। এই মানটির কারণে সিকার একটি বার্তা প্রদর্শন করবে, যা ব্যবহারকারীকে জানিয়ে দেবে যে এটিকে এখনই আপডেট করতে হবে।
ডিভাইস ট্র্যাকিং প্রতিরোধ করার জন্য প্রোভাইডারের উচিত ফার্মওয়্যার রিভিশন ক্যারেক্টারিস্টিকে অ্যাক্সেস সীমিত করা। প্রস্তাবিত সীমাবদ্ধতা:
- সংযুক্ত ডিভাইসগুলোর যেকোনো সময় অ্যাক্সেস থাকা উচিত।
- প্রোভাইডারকে খুঁজে পাওয়া গেলে যেকোনো ডিভাইসের অ্যাক্সেস থাকা উচিত।
বৈশিষ্ট্য: অতিরিক্ত তথ্য
এই পরিষেবাটির নিম্নলিখিত বৈশিষ্ট্য থাকবে।
| ফাস্ট পেয়ার সার্ভিসের বৈশিষ্ট্য | এনক্রিপ্টেড | অনুমতি | UUID |
|---|---|---|---|
| ডেটা | না | লিখে জানান | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| পুরাতন ফাস্ট পেয়ার সার্ভিস বৈশিষ্ট্য (২০২১/১/১ তারিখে বাতিল করার লক্ষ্যমাত্রা) | এনক্রিপ্টেড | অনুমতি | UUID |
|---|---|---|---|
| ডেটা | না | লিখে জানান | 0x1237 |
এই ক্যারেক্টারিস্টিকে লেখার বা অবহিত করার আগে, একটি শেয়ার্ড সিক্রেট পাওয়ার জন্য ক্যারেক্টারিস্টিক FE2C1234-8366-4814-8EB0-01DE32100BEA এর মাধ্যমে একটি হ্যান্ডশেক অবশ্যই করতে হবে। এই ক্যারেক্টারিস্টিকের মধ্য দিয়ে প্রবাহিত ডেটা এনক্রিপ্ট করার জন্য AES-CTR ব্যবহার করা হবে, যার অ্যালগরিদম নিচে সংজ্ঞায়িত করা হয়েছে। একটি একক ১৬-বাইট ব্লকের চেয়ে বড় ডেটার ক্ষেত্রে এই মোডটি অধিক সুরক্ষিত। ডেটার অখণ্ডতা নিশ্চিত করার জন্য HMAC-SHA256 ব্যবহার করা হবে, যা নিচে সংজ্ঞায়িত করা হয়েছে।
| অক্টেট | বর্ণনা | মূল্য |
|---|---|---|
| ০ - ৭ | HMAC-SHA256-এর প্রথম ৮ বাইট। | বিভিন্ন |
| ৮ - ১৫ | ননস, যা AES-CTR এনক্রিপশনে ব্যবহৃত হয়। | বিভিন্ন |
| ১৬ - ভ্যার | এনক্রিপ্টেড ডেটা। | বিভিন্ন |
সারণি ৩.১: ডেটা প্যাকেট, যা প্রোভাইডার কর্তৃক নোটিফাই-এর মাধ্যমে সিকারের কাছে অথবা সিকার কর্তৃক রাইট-এর মাধ্যমে প্রোভাইডারের কাছে পাঠানো হয়।
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ - ভ্যার | byte array | ডেটা | পরিবর্তিত হয় , সারণি ১.২.২- এর ডেটা আইডি অনুযায়ী এটিকে ডিকোড করুন:
|
সারণি ৩.২: মূল ডেটা। সারণি ৩.১- এর এনক্রিপ্টেড ডেটা থেকে ডিক্রিপ্ট করা হয়েছে।
যখন কোনো নোটিফাই করার অনুরোধ করা হয় (যেমন, সারণি ১.২.১- এর বিট ২-এর মাধ্যমে ব্যক্তিগতকৃত নামের অনুরোধ), তখন ফাস্ট পেয়ার প্রোভাইডার নিম্নলিখিত কাজগুলো করবে:
- ননস (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-বাইট ZEROs)` এর মাধ্যমে, যেখানে `shared_secret`টি প্রসিডিউরের ধাপ ৪ থেকে নেওয়া হয়।
- opad হলো ৬৪ বাইটের একটি বাইরের প্যাডিং, যা
0x5Cমানের পুনরাবৃত্ত বাইট দ্বারা গঠিত। - আইপ্যাডের ৬৪ বাইটের অভ্যন্তরীণ প্যাডিং রয়েছে, যা
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],...) অপারেশনটি সম্পাদন করুন।