আঙুলের ছাপ HIDL

ফিঙ্গারপ্রিন্ট সেন্সরযুক্ত ডিভাইসগুলিতে, ব্যবহারকারীরা এক বা একাধিক আঙুলের ছাপ নথিভুক্ত করতে পারেন এবং সেই আঙুলের ছাপগুলি ব্যবহার করে ডিভাইসটি আনলক করতে ও অন্যান্য কাজ সম্পাদন করতে পারেন। অ্যান্ড্রয়েড একটি বিক্রেতা-নির্দিষ্ট লাইব্রেরি এবং ফিঙ্গারপ্রিন্ট হার্ডওয়্যারের (উদাহরণস্বরূপ, একটি ফিঙ্গারপ্রিন্ট সেন্সর) সাথে সংযোগ স্থাপনের জন্য ফিঙ্গারপ্রিন্ট হার্ডওয়্যার ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (HIDL) ব্যবহার করে।

ফিঙ্গারপ্রিন্ট HIDL প্রয়োগ করতে হলে, আপনাকে একটি ভেন্ডর-নির্দিষ্ট লাইব্রেরিতে IBiometricsFingerprint.hal ইমপ্লিমেন্ট করতে হবে।

আঙুলের ছাপ মেলানো

একটি ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর সাধারণত নিষ্ক্রিয় থাকে। তবে, authenticate বা enroll আহ্বানে সাড়া দিয়ে, ফিঙ্গারপ্রিন্ট সেন্সরটি স্পর্শের জন্য প্রস্তুত হয় (ব্যবহারকারী ফিঙ্গারপ্রিন্ট সেন্সর স্পর্শ করলে স্ক্রিনটিও চালু হতে পারে)। ফিঙ্গারপ্রিন্ট মেলানোর প্রধান কার্যপ্রবাহে নিম্নলিখিত ধাপগুলো অন্তর্ভুক্ত থাকে:

  1. ব্যবহারকারী ফিঙ্গারপ্রিন্ট সেন্সরে আঙুল রাখেন।
  2. বিক্রেতা-নির্দিষ্ট লাইব্রেরিটি নির্ধারণ করে যে, বর্তমানে নথিভুক্ত ফিঙ্গারপ্রিন্ট টেমপ্লেটগুলোর সেটে কোনো ফিঙ্গারপ্রিন্ট মিল আছে কি না।
  3. মিলে যাওয়া ফলাফলগুলো FingerprintService এ পাঠানো হয়।

এই কার্যপ্রণালীতে ধরে নেওয়া হয় যে, ডিভাইসটিতে ইতিমধ্যেই একটি ফিঙ্গারপ্রিন্ট নথিভুক্ত করা হয়েছে, অর্থাৎ, বিক্রেতা-নির্দিষ্ট লাইব্রেরিটি ফিঙ্গারপ্রিন্টটির জন্য একটি টেমপ্লেট নথিভুক্ত করেছে। আরও বিস্তারিত জানতে, প্রমাণীকরণ (Authentication) দেখুন।

স্থাপত্য

ফিঙ্গারপ্রিন্ট এইচএএল নিম্নলিখিত উপাদানগুলোর সাথে যোগাযোগ করে।

  • BiometricManager একটি অ্যাপ প্রসেসের মধ্যে থাকা কোনো অ্যাপের সাথে সরাসরি যোগাযোগ করে। প্রতিটি অ্যাপের IBiometricsFingerprint.hal এর একটি ইনস্ট্যান্স থাকে।
  • FingerprintService সিস্টেম প্রসেসে কাজ করে, যা ফিঙ্গারপ্রিন্ট HAL-এর সাথে যোগাযোগ পরিচালনা করে।
  • ফিঙ্গারপ্রিন্ট এইচএএল হলো আইবায়োমেট্রিক্সফিঙ্গারপ্রিন্ট এইচআইডিএল ইন্টারফেসের একটি সি/সি++ ইমপ্লিমেন্টেশন। এতে ভেন্ডর-নির্দিষ্ট লাইব্রেরিটি রয়েছে, যা ডিভাইস-নির্দিষ্ট হার্ডওয়্যারের সাথে যোগাযোগ করে।
  • Keystore API এবং KeyMint (পূর্বে Keymaster) উপাদানগুলো Trusted Execution Environment (TEE)-এর মতো একটি সুরক্ষিত পরিবেশে নিরাপদ কী সংরক্ষণের জন্য হার্ডওয়্যার-সমর্থিত ক্রিপ্টোগ্রাফি প্রদান করে।
আঙুলের ছাপ প্রমাণীকরণের জন্য ডেটা প্রবাহ
চিত্র ১. আঙুলের ছাপ শনাক্তকরণের জন্য উচ্চ-স্তরের ডেটা প্রবাহ

বিক্রেতা-নির্দিষ্ট HAL বাস্তবায়নে অবশ্যই TEE-এর জন্য প্রয়োজনীয় যোগাযোগ প্রোটোকল ব্যবহার করতে হবে। কাঁচা ছবি এবং প্রক্রিয়াজাত আঙুলের ছাপের বৈশিষ্ট্য কোনো অবিশ্বস্ত মেমরিতে পাঠানো যাবে না। এই ধরনের সমস্ত বায়োমেট্রিক ডেটা TEE-এর মতো সুরক্ষিত হার্ডওয়্যারে সংরক্ষণ করতে হবে। রুটিংয়ের মাধ্যমে বায়োমেট্রিক ডেটা যেন ক্ষতিগ্রস্ত না হয়, তা নিশ্চিত করতে হবে।

FingerprintService এবং fingerprintd আঙুলের ছাপ নথিভুক্ত করতে ও অন্যান্য কার্যক্রম সম্পাদন করতে Fingerprint HAL-এর মাধ্যমে বিক্রেতা-নির্দিষ্ট লাইব্রেরিতে কল করে।

ফিঙ্গারপ্রিন্টেড এর সাথে মিথস্ক্রিয়া
চিত্র ২. ফিঙ্গারপ্রিন্ট ডেমন এবং ফিঙ্গারপ্রিন্ট ভেন্ডর-স্পেসিফিক লাইব্রেরির মধ্যে মিথস্ক্রিয়া

বাস্তবায়ন নির্দেশিকা

নিম্নলিখিত ফিঙ্গারপ্রিন্ট HAL নির্দেশিকাগুলি এটি নিশ্চিত করার জন্য তৈরি করা হয়েছে যে ফিঙ্গারপ্রিন্ট ডেটা যেন ফাঁস না হয় এবং কোনো ব্যবহারকারীকে ডিভাইস থেকে সরিয়ে দিলে তা মুছে যায় :

  • সেন্সর ড্রাইভার বা TEE-এর বাইরে থেকে ফিঙ্গারপ্রিন্টের মূল ডেটা বা তার থেকে উদ্ভূত ডেটা (যেমন, টেমপ্লেট) কখনোই অ্যাক্সেসযোগ্য হওয়া উচিত নয়। যদি হার্ডওয়্যারটি একটি TEE সমর্থন করে, তবে হার্ডওয়্যার অ্যাক্সেস অবশ্যই TEE-এর মধ্যে সীমাবদ্ধ রাখতে হবে এবং একটি SELinux পলিসি দ্বারা সুরক্ষিত থাকতে হবে। সিরিয়াল পেরিফেরাল ইন্টারফেস (SPI) চ্যানেলটি শুধুমাত্র TEE-এর জন্য অ্যাক্সেসযোগ্য হতে হবে এবং ডিভাইসের সমস্ত ফাইলে একটি সুস্পষ্ট SELinux পলিসি থাকতে হবে।
  • আঙুলের ছাপ সংগ্রহ, তালিকাভুক্তি এবং শনাক্তকরণ অবশ্যই TEE-এর অভ্যন্তরে সম্পন্ন করতে হবে।
  • ফাইল সিস্টেমটি নিজে এনক্রিপ্টেড থাকলেও, শুধুমাত্র ফিঙ্গারপ্রিন্ট ডেটার এনক্রিপ্টেড রূপটিই ফাইল সিস্টেমে সংরক্ষণ করা যাবে।
  • ফিঙ্গারপ্রিন্ট টেমপ্লেট অবশ্যই একটি ব্যক্তিগত, ডিভাইস-নির্দিষ্ট কী দিয়ে স্বাক্ষরিত হতে হবে। অ্যাডভান্সড এনক্রিপশন স্ট্যান্ডার্ড (AES)-এর ক্ষেত্রে, ন্যূনতমপক্ষে একটি টেমপ্লেটকে অবশ্যই অ্যাবসোলিউট ফাইল-সিস্টেম পাথ, গ্রুপ এবং ফিঙ্গার আইডি দিয়ে স্বাক্ষরিত হতে হবে, যাতে টেমপ্লেট ফাইলগুলো অন্য কোনো ডিভাইসে বা একই ডিভাইসে নথিভুক্তকারী ব্যবহারকারী ছাড়া অন্য কারো জন্য অকার্যকর থাকে। উদাহরণস্বরূপ, একই ডিভাইসে থাকা ভিন্ন কোনো ব্যবহারকারীর বা অন্য কোনো ডিভাইস থেকে ফিঙ্গারপ্রিন্ট ডেটা কপি করা যেন কাজ না করে।
  • বাস্তবায়নে অবশ্যই setActiveGroup() ফাংশন দ্বারা প্রদত্ত ফাইল-সিস্টেম পাথ ব্যবহার করতে হবে, অথবা ব্যবহারকারীকে অপসারণ করার সময় সমস্ত ব্যবহারকারী টেমপ্লেট ডেটা মুছে ফেলার একটি উপায় প্রদান করতে হবে। ফিঙ্গারপ্রিন্ট টেমপ্লেট ফাইলগুলো এনক্রিপ্ট করে প্রদত্ত পাথে সংরক্ষণ করার জন্য দৃঢ়ভাবে সুপারিশ করা হচ্ছে। যদি TEE স্টোরেজের প্রয়োজনীয়তার কারণে এটি সম্ভব না হয়, তবে ব্যবহারকারীকে অপসারণ করার সময় ডেটা মুছে ফেলা নিশ্চিত করার জন্য বাস্তবায়নকারীকে হুক যোগ করতে হবে।

আঙুলের ছাপ পদ্ধতি

IBiometricsFingerprint.hal এ ফিঙ্গারপ্রিন্ট HIDL ইন্টারফেসে নিম্নলিখিত প্রধান মেথডগুলো রয়েছে।

পদ্ধতি বর্ণনা
enroll() ফিঙ্গারপ্রিন্ট টেমপ্লেট সংগ্রহ ও সংরক্ষণ শুরু করার জন্য HAL স্টেট মেশিনকে সুইচ করে। তালিকাভুক্তি সম্পূর্ণ হলে, অথবা একটি নির্দিষ্ট সময়সীমা পার হয়ে গেলে, HAL স্টেট মেশিন নিষ্ক্রিয় অবস্থায় ফিরে আসে।
preEnroll() ফিঙ্গারপ্রিন্ট এনরোলমেন্টের শুরু নির্দেশ করার জন্য একটি অনন্য টোকেন তৈরি করে। পূর্ববর্তী প্রমাণীকরণ, যেমন পাসওয়ার্ড ব্যবহার, নিশ্চিত করার জন্য enroll ফাংশনে একটি টোকেন সরবরাহ করা হয়। টেম্পারিং প্রতিরোধ করার জন্য, ডিভাইসের ক্রেডেনশিয়াল নিশ্চিত হওয়ার পর টোকেনটি র‍্যাপ করা হয়। এনরোলমেন্টের সময় টোকেনটি এখনও বৈধ আছে কিনা তা যাচাই করার জন্য অবশ্যই পরীক্ষা করতে হবে।
getAuthenticatorId() বর্তমান ফিঙ্গারপ্রিন্ট সেটের সাথে সংশ্লিষ্ট একটি টোকেন ফেরত দেয়।
cancel() অপেক্ষাধীন তালিকাভুক্তি বা প্রমাণীকরণ কার্যক্রম বাতিল করে। HAL স্টেট মেশিনটি নিষ্ক্রিয় অবস্থায় ফিরে আসে।
enumerate() সকল জ্ঞাত আঙুলের ছাপের টেমপ্লেট গণনা করার জন্য একযোগে আহ্বান।
remove() আঙুলের ছাপের টেমপ্লেট মুছে দেয়।
setActiveGroup() একটি গ্রুপ আইডেন্টিফায়ার (GID) দ্বারা চিহ্নিত, একটি নির্দিষ্ট গ্রুপের অন্তর্গত ফিঙ্গারপ্রিন্টের সেটের মধ্যে একটি HAL অপারেশনকে সীমাবদ্ধ করে।
authenticate() একটি ফিঙ্গারপ্রিন্ট-সম্পর্কিত অপারেশন (যা একটি অপারেশন আইডি দ্বারা চিহ্নিত) প্রমাণীকরণ করে।
setNotify() একটি ইউজার ফাংশন রেজিস্টার করে যা HAL থেকে নোটিফিকেশন গ্রহণ করে। যদি HAL স্টেট মেশিন ব্যস্ত অবস্থায় থাকে, তবে HAL ব্যস্ত অবস্থা থেকে বেরিয়ে না আসা পর্যন্ত ফাংশনটি ব্লক হয়ে থাকে।
postEnroll() এনরোল অপারেশনটি শেষ করে এবং preEnroll() দ্বারা তৈরি চ্যালেঞ্জটিকে বাতিল করে দেয়। একাধিক আঙুলের এনরোলমেন্ট সেশনের শেষে এটি অবশ্যই কল করতে হবে, যাতে বোঝানো যায় যে আর কোনো আঙুল যোগ করা যাবে না।

এই বিষয়ে আরও বিস্তারিত জানতে IBiometricsFingerprint.hal এর মন্তব্যগুলো দেখুন।