প্রদানকারীর বিজ্ঞাপন সংকেত
বিজ্ঞাপন: যখন আবিষ্কারযোগ্য
যখন প্রোভাইডার ডিভাইসটি BR/EDR ডিসকভারেবল (অর্থাৎ, পেয়ারিং মোডে) থাকে, তখন এটি BLE-এর মাধ্যমে ফাস্ট পেয়ার মডেল আইডি ডেটা অ্যাডভার্টাইজ করবে এবং BLE অ্যাড্রেসটি রোটেট করা হবে না।
বিজ্ঞাপনের ব্যবধান: যখন শনাক্তযোগ্য
বিজ্ঞাপনগুলির মধ্যে ব্যবধান ১০০ মিলিসেকেন্ড (১০ হার্টজ)-এর বেশি হওয়া উচিত নয়। দ্রুত গতি সিকারকে প্রোভাইডারকে দ্রুত খুঁজে পেতে সাহায্য করে, এমনকি লো-পাওয়ার মোডে স্ক্যান করার সময়েও।
বিজ্ঞাপনের পেলোড: ফাস্ট পেয়ার মডেল আইডি ডেটা
বিজ্ঞাপনটিতে সার্ভিস ডেটা ডেটা টাইপ অন্তর্ভুক্ত থাকবে, পূর্বোক্ত, § ১.১১। UUID-টি হবে ফাস্ট পেয়ার সার্ভিস UUID 0xFE2C । সার্ভিস ডেটাতে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকবে:
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০-২ | uint24 | ২৪-বিট মডেল আইডি | বিভিন্ন |
LE অডিও শেয়ারিং অ্যাডভার্টাইজিং পেলোড: ফাস্ট পেয়ার মডেল আইডি ডেটা এবং FP ক্যাপাবিলিটি ম্যাপ
পরিষেবা ডেটাতে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকবে:
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ | uint8 | সংস্করণ এবং পতাকা 0bVVVVFFFF
| 0x00 |
| ১ | uint8 | ক্ষেত্রের দৈর্ঘ্য এবং প্রকার 0bLLLLTTTT
| 0bLLLL0111
|
| ২ - এস | মডেল আইডি | বিভিন্ন | |
| s + 1 | uint8 | ক্ষেত্রের দৈর্ঘ্য এবং প্রকার 0bLLLLTTTT
| 0bLLLL1000
|
| s + 2 | uint8 | এফপি সক্ষমতা মানচিত্র | বিভিন্ন |
এফপি সক্ষমতা মানচিত্র
এফপি ক্যাপাবিলিটি ম্যাপ হলো একটি বিটম্যাপ যা উপস্থাপন করে যে প্রোভাইডারটি কোন কোন এফপি ফিচার সমর্থন করে। বিটম্যাপটির প্রথম বাইটটি নিম্নরূপে সংজ্ঞায়িত করা হয়:
| বিটম্যাপ | বর্ণনা |
|---|---|
| 0bRRRRRRSO | R - সংরক্ষিত বিট, আপাতত সিকার এটিকে উপেক্ষা করবে এবং এর মান ০ সেট করা হবে। S - FP LE অডিও শেয়ারিং সমর্থন (সক্ষম করা থাকলে ১, অন্যথায় ০ সেট করুন)। O - আউট অফ বক্স (OOB) বিট, ডিভাইসটি একেবারে নতুন হলে এর মান ১ সেট করা থাকে। |
যদি প্রোভাইডার FP LE Audio Sharing স্পেসিফিকেশন সমর্থন করে (অর্থাৎ এটি Temporary Pairing , LE Audio Sharing Advertising Payload , এবং Hearable control version 2 সমর্থন করে), তাহলে FP LE Audio Sharing সাপোর্ট বিটটির মান 1 সেট করুন; অন্যথায়, এর মান 0 সেট করুন।
যদি প্রোভাইডারটি কোনো FP Seeker-এর সাথে পেয়ার করা না থাকে এবং একদম নতুন হয় (অর্থাৎ প্রোভাইডারটিতে কোনো FP অ্যাকাউন্ট কী না থাকে), তাহলে OOB বিটটি 1-এ সেট করুন; অন্যথায়, এটিকে 0-এ সেট করুন।
বিজ্ঞাপন: যখন খুঁজে পাওয়া যায় না
যখন খুঁজে পাওয়া যাবে না (অর্থাৎ, পেয়ারিং মোডে থাকবে না), তখন প্রোভাইডার ডিভাইসটি নিম্নলিখিত নির্দেশিকা অনুসরণ করে ফাস্ট পেয়ার অ্যাকাউন্ট ডেটা প্রচার করবে।
অ্যাকাউন্টের ডেটা প্রচার করার ফলে কাছাকাছি থাকা সিকাররা বুঝতে পারে যে কোনো প্রোভাইডার তাদের অ্যাকাউন্টের অন্তর্গত এবং প্রথমে প্রোভাইডারকে জোর করে পেয়ারিং মোডে ফিরিয়ে না এনেই পেয়ারিং শুরু করতে পারে, যা ব্যবহারকারীদের অভিযোগের একটি সাধারণ কারণ। সিকাররা ব্যবহারকারীদের এই ব্রডকাস্টটি উপেক্ষা করার সুযোগ দেবে, যদি তারা প্রোভাইডারের সাথে পেয়ার করার জন্য অপেক্ষা না করে অথবা ব্রডকাস্টটি প্রাসঙ্গিক না হয় (উদাহরণস্বরূপ, যদি তারা ইতিমধ্যেই পেয়ার করে থাকে)। সিকাররা সুস্পষ্টভাবে ত্রুটিপূর্ণ ব্রডকাস্টগুলোও স্বয়ংক্রিয়ভাবে ফিল্টার করে দেবে, যেমন যখন অ্যাকাউন্টের ডেটা ভুলভাবে কনফিগার করা থাকে।
বিজ্ঞাপনের বিরতি: যখন খুঁজে পাওয়া যায় না
বিজ্ঞাপনগুলির মধ্যে ব্যবধান সর্বাধিক 250ms (4Hz) হওয়া উচিত।
বিজ্ঞাপনের পেলোড: ফাস্ট পেয়ার অ্যাকাউন্ট ডেটা
বিজ্ঞাপনটিতে সার্ভিস ডেটা ডেটা টাইপ অন্তর্ভুক্ত থাকবে, পূর্বোক্ত, অনুচ্ছেদ ১.১১। UUID-টি হবে ফাস্ট পেয়ার সার্ভিস UUID 0xFE2C । সার্ভিস ডেটাতে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকবে:
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ | uint8 | সংস্করণ এবং পতাকা 0bVVVVFFFF
| 0x00(ভবিষ্যৎ ব্যবহারের জন্য সংরক্ষিত) |
| ১ - বিভিন্ন | অ্যাকাউন্টের মূল তথ্য | বিভিন্ন |
অ্যাকাউন্ট কী ডেটাতে রয়েছে:
| অক্টেট | ডেটা টাইপ | বর্ণনা | মূল্য |
|---|---|---|---|
| ০ | uint8 | ক্ষেত্রের দৈর্ঘ্য এবং প্রকার 0bLLLLTTTT
| 0bLLLL0000
|
| ১ - এস | অ্যাকাউন্ট কী ফিল্টার | বিভিন্ন | |
| s + 1 | uint8 | ক্ষেত্রের দৈর্ঘ্য এবং প্রকার 0bLLLLTTTT
| 0b00100001
|
| s + 2 - s + 3 | uint16 | লবণ | বিভিন্ন |
অ্যাকাউন্ট কী ফিল্টার
বিজ্ঞাপিত অ্যাকাউন্ট কী ফিল্টারটি একজন সিকারকে পরবর্তী ইন্টারঅ্যাকশনের আগে দ্রুত যাচাই করার সুযোগ দেয় যে, কোনো প্রোভাইডারের কাছে একটি নির্দিষ্ট অ্যাকাউন্ট কী আছে কি না (ফলস-পজিটিভ হওয়ার সম্ভাবনা কম, গড়ে ০.৫%-এরও অনেক কম)। ফলস-পজিটিভের হার আরও কমানোর জন্য, সিকারটি যখন টাইপ ০ (অর্থাৎ, UI ইন্ডিকেশন দেখানো) সহ একটি ফিল্টার ব্রডকাস্ট হতে দেখে, যাতে সম্ভবত তার কোনো একটি অ্যাকাউন্ট কী রয়েছে, তখন এটি স্বয়ংক্রিয়ভাবে কানেক্ট হয়ে প্রক্রিয়াটি শুরু করার চেষ্টা করতে পারে। কিছু পরিস্থিতিতে, প্রোভাইডার পেয়ারিংয়ের জন্য প্রস্তুত না থাকা অবস্থাতেও সিকারের কাছে পরিচিত হতে চাইতে পারে। এর একটি উদাহরণ হলো, যখন ইয়ারবাডগুলো কেসে ফেরত রাখা হয়, তখন আমরা পরবর্তী পেয়ারিং নোটিফিকেশন দেখানো বন্ধ করতে চাই, কারণ সেই পেয়ারিংটি হেডসেট দ্বারা প্রত্যাখ্যাত হতে পারে।
অ্যাকাউন্ট কী ফিল্টার হলো একটি পরিবর্তনশীল-দৈর্ঘ্যের ব্লুম ফিল্টার যা নিম্নরূপে গঠিত:
- ধরা যাক , সংরক্ষিত অ্যাকাউন্ট কী তালিকায় অ্যাকাউন্ট কী-এর সংখ্যা n ( n >= 1)।
- ধরা যাক, ফিল্টারের আকার s , যা বাইটে পরিমাপ করা হয়, তা হলো (1.2* n + 3) থেকে ছেঁটে ফেলা মান। উদাহরণস্বরূপ, যদি ১টি কী সংরক্ষণ করা হয়, তাহলে s = ৪ বাইট হবে।
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3); - ফিল্টার F-কে s বাইটের একটি অ্যারে হিসাবে ইনিশিয়ালাইজ করুন, যার প্রতিটি বাইটের মান 0 সেট করা থাকবে।
uint8_t F[s] = {0}; সংরক্ষিত অ্যাকাউন্ট কী তালিকায় থাকা প্রতিটি অ্যাকাউন্ট কী K- এর জন্য:
ক. ধরা যাক V হলো concat( K , Salt )।// In the sample code, the size of salt is 2 bytes. #define SALT_SIZE 2 uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE]; for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++) { // concat (K, Salt) fastpair_get_account_key_by_index(keyIndex, V); uint8_t randomSalt = (uint8_t)rand(); V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt; ... }খ. SHA256 ব্যবহার করে V-কে হ্যাশ করুন, যার ফলে একটি ৩২-বাইটের মান H = {H 0 , …, H 31 } পাওয়া যাবে।
uint8_t H[32] = {0}; SHA256_hash_function(V, H);গ. H-কে বিগ - এন্ডিয়ান পদ্ধতিতে আটটি ৪-বাইটের আনসাইনড পূর্ণসংখ্যায় ভাগ করুন, X = { X₀ , …, X₇ }, যেখানে X₀ = 0xH₀H₁H₂H₃ ।
uint32_t X[8]; for (index = 0; index < 8; index++) { X[index] = (((uint32_t)(H[index * 4])) << 24) | (((uint32_t)(H[index * 4 + 1])) << 16) | (((uint32_t)(H[index * 4 + 2])) << 8) | (((uint32_t)(H[index * 4 + 3])) << 0); }d. প্রতিটি X i এর জন্য :
i. ধরা যাক, M হলো X i-এর মডিউলো ফিল্টারের বিট সংখ্যা ( s * 8)।
ii. F- এ ( M / 8) সূচকে থাকা বাইটটি নিন, যা নিম্নমুখী পূর্ণসংখ্যায় রূপান্তরিত হবে।
iii. বাইটের মধ্যে, ( M % 8) ইন্ডেক্সে থাকা বিটটিকে 1-এ সেট করুন।
iv. অন্য কথায়:// M = Xi % (s * 8) // F[M/8] = F[M/8] | (1 << (M % 8)) for (index = 0; index < 8; index++) { uint32_t M = X[index] % (s * 8); F[M / 8] = F[M / 8] | (1 << (M % 8)); }
অ্যাডভার্টাইজিং ডেটাতে, অ্যাকাউন্ট কী ফিল্টার ফিল্ড হিসেবে ফিল্টার F অন্তর্ভুক্ত করুন। মনে রাখবেন যে এই মানের কোনো "এন্ডিয়াননেস" নেই, কারণ এখানে কোনো বেশি বা কম গুরুত্বপূর্ণ বাইট নেই—বাইটের ক্রম পরিবর্তন করবেন না।
লবণ ক্ষেত্র
সল্ট হলো একটি র্যান্ডম ভ্যালু যা ব্লুম ফিল্টার তৈরি করার সময় অ্যাকাউন্ট কী-গুলোর সাথে যুক্ত করা হয়। অ্যাড্রেস রোটেশনের সময় ট্র্যাকিং এড়ানোর জন্য প্রোভাইডারের পক্ষ থেকে প্রতিবার RPA আপডেট করার সময় এই সল্টটি পুনরায় তৈরি করা উচিত।
সল্ট ব্যবহার করে অ্যাকাউন্ট কী ফিল্টার তৈরি করতে:
- একটি র্যান্ডম ২-বাইটের S তৈরি করুন। লক্ষ্য করুন যে এই মানটির কোনো "এন্ডিয়াননেস" নেই, কারণ এখানে কোনো অধিক বা স্বল্প গুরুত্বপূর্ণ বাইট নেই — বাইটের ক্রম পরিবর্তন করবেন না।
- সল্ট হিসেবে ২-বাইট S ব্যবহার করুন।
- বিজ্ঞাপিত ফাস্ট পেয়ার অ্যাকাউন্ট ডেটাতে, অ্যাকাউন্ট কী ফিল্টার ফিল্ডে জেনারেট করা ফিল্টারটি এবং সল্ট ফিল্ডে S অন্তর্ভুক্ত করুন।