اثر انگشت HIDL

در دستگاه‌های دارای حسگر اثر انگشت، کاربران می‌توانند یک یا چند اثر انگشت را ثبت کنند و از آن اثر انگشت برای باز کردن قفل دستگاه و انجام کارهای دیگر استفاده کنند. اندروید از زبان تعریف رابط سخت‌افزار اثر انگشت (HIDL) برای اتصال به کتابخانه خاص فروشنده و سخت‌افزار اثر انگشت (مثلاً حسگر اثر انگشت) استفاده می‌کند.

برای پیاده سازی Fingerprint HIDL، باید IBiometricsFingerprint.hal در یک کتابخانه خاص فروشنده پیاده سازی کنید.

تطبیق اثر انگشت

سنسور اثر انگشت یک دستگاه معمولاً بیکار است. با این حال، در پاسخ به تماس برای authenticate یا enroll ، حسگر اثر انگشت به لمس گوش می‌دهد (ممکن است وقتی کاربر حسگر اثر انگشت را لمس می‌کند، صفحه نمایش بیدار شود). جریان سطح بالا تطبیق اثر انگشت شامل مراحل زیر است:

  1. کاربر انگشت خود را روی حسگر اثر انگشت قرار می دهد.
  2. کتابخانه خاص فروشنده تعیین می کند که آیا در مجموعه فعلی الگوهای اثر انگشت ثبت شده، مطابقت اثر انگشت وجود دارد یا خیر.
  3. نتایج مطابق به FingerprintService منتقل می شود.

این جریان فرض می‌کند که یک اثر انگشت قبلاً روی دستگاه ثبت شده است، یعنی کتابخانه خاص فروشنده یک الگو برای اثر انگشت ثبت کرده است. برای جزئیات بیشتر، احراز هویت را ببینید.

معماری

اثر انگشت HAL با اجزای زیر تعامل دارد.

  • BiometricManager به طور مستقیم با یک برنامه در فرآیند برنامه تعامل دارد. هر برنامه یک نمونه از IBiometricsFingerprint.hal دارد
  • FingerprintService در فرآیند سیستم عمل می کند که ارتباط با اثر انگشت HAL را مدیریت می کند.
  • Fingerprint HAL یک پیاده سازی C/C++ از رابط IBiometricsFingerprint HIDL است. این شامل کتابخانه خاص فروشنده است که با سخت افزار خاص دستگاه ارتباط برقرار می کند.
  • Keystore API و مؤلفه‌های Keymaster رمزنگاری سخت‌افزاری را برای ذخیره‌سازی کلید امن در یک محیط امن، مانند Trusted Execution Environment (TEE) فراهم می‌کنند.
جریان داده برای احراز هویت اثر انگشت
شکل 1. جریان داده در سطح بالا برای احراز هویت اثر انگشت

یک پیاده سازی HAL خاص فروشنده باید از پروتکل ارتباطی مورد نیاز یک TEE استفاده کند. تصاویر خام و ویژگی‌های اثر انگشت پردازش شده نباید در حافظه نامعتبر منتقل شوند. تمام این داده های بیومتریک باید در سخت افزار ایمن مانند TEE ذخیره شوند. ریشه یابی نباید بتواند داده های بیومتریک را به خطر بیندازد.

FingerprintService و fingerprintd از طریق Fingerprint HAL با کتابخانه خاص فروشنده تماس می گیرند تا اثر انگشت را ثبت کنند و سایر عملیات را انجام دهند.

تعامل با اثر انگشت
شکل 2. تعامل دیمون اثر انگشت با کتابخانه خاص فروشنده اثر انگشت

دستورالعمل های اجرایی

دستورالعمل‌های HAL اثر انگشت زیر طراحی شده‌اند تا اطمینان حاصل شود که داده‌های اثر انگشت درز نمی‌کند و زمانی که کاربر از دستگاه حذف می‌شود حذف می‌شود:

  • داده های اثر انگشت خام یا مشتقات (مثلاً الگوها) هرگز نباید از خارج از درایور حسگر یا TEE قابل دسترسی باشند. اگر سخت افزار از TEE پشتیبانی می کند، دسترسی سخت افزار باید به TEE محدود شود و توسط یک خط مشی SELinux محافظت شود. کانال رابط محیطی سریال (SPI) باید فقط برای TEE قابل دسترسی باشد و باید یک خط مشی صریح SELinux در همه فایل های دستگاه وجود داشته باشد.
  • دریافت اثر انگشت، ثبت نام و شناسایی باید در داخل TEE انجام شود.
  • فقط فرم رمزگذاری شده داده های اثر انگشت را می توان در سیستم فایل ذخیره کرد، حتی اگر خود سیستم فایل رمزگذاری شده باشد.
  • الگوهای اثر انگشت باید با یک کلید خصوصی و مخصوص دستگاه امضا شوند. برای استاندارد رمزگذاری پیشرفته (AES)، حداقل یک الگو باید با مسیر سیستم فایل مطلق، گروه و شناسه انگشت امضا شود به طوری که فایل‌های الگو در دستگاه دیگری یا برای هر کسی غیر از کاربری که آنها را در سیستم ثبت نام کرده است غیرقابل اجرا باشد. همان دستگاه به عنوان مثال، کپی کردن داده های اثر انگشت از یک کاربر دیگر در همان دستگاه یا از دستگاه دیگری نباید کار کند.
  • پیاده سازی ها باید یا از مسیر فایل-سیستم ارائه شده توسط تابع setActiveGroup() استفاده کنند یا راهی برای پاک کردن تمام داده های الگوی کاربر هنگام حذف کاربر ارائه دهند. اکیداً توصیه می شود که فایل های الگوی اثر انگشت به صورت رمزگذاری شده و در مسیر ارائه شده ذخیره شوند. اگر این به دلیل نیازهای ذخیره سازی TEE غیرممکن است، پیاده‌کننده باید قلاب‌هایی اضافه کند تا هنگام حذف کاربر از حذف داده‌ها اطمینان حاصل کند.

روش های اثر انگشت

رابط HIDL اثر انگشت شامل روش‌های اصلی زیر در IBiometricsFingerprint.hal است.

روش شرح
enroll() دستگاه حالت HAL را برای شروع جمع‌آوری و ذخیره‌سازی الگوی اثر انگشت تغییر می‌دهد. هنگامی که ثبت نام کامل شد، یا پس از یک بازه زمانی، دستگاه حالت HAL به حالت بیکار باز می گردد.
preEnroll() یک نشانه منحصر به فرد برای نشان دادن شروع ثبت نام اثر انگشت ایجاد می کند. برای اطمینان از احراز هویت قبلی، به عنوان مثال، با استفاده از رمز عبور، یک نشانه برای تابع enroll ارائه می دهد. برای جلوگیری از دستکاری، پس از تأیید اعتبار دستگاه، توکن بسته می شود. رمز باید در حین ثبت نام بررسی شود تا تأیید شود که هنوز معتبر است.
getAuthenticatorId() یک نشانه مرتبط با مجموعه اثر انگشت فعلی را برمی‌گرداند.
cancel() عملیات در انتظار ثبت نام یا احراز هویت را لغو می کند. ماشین حالت HAL به حالت بیکار باز می گردد.
enumerate() تماس همزمان برای شمارش تمام الگوهای اثر انگشت شناخته شده.
remove() یک الگوی اثر انگشت را حذف می کند.
setActiveGroup() یک عملیات HAL را به مجموعه‌ای از اثرانگشت که به یک گروه مشخص تعلق دارند، محدود می‌کند که توسط یک شناسه گروه (GID) شناسایی می‌شود.
authenticate() یک عملیات مربوط به اثر انگشت را تأیید می کند (که با شناسه عملیات شناسایی می شود).
setNotify() یک تابع کاربری را ثبت می کند که اعلان ها را از HAL دریافت می کند. اگر ماشین حالت HAL در حالت مشغول باشد، تا زمانی که HAL از حالت مشغول خارج شود، عملکرد مسدود می شود.
postEnroll() عملیات ثبت نام را به پایان می رساند و چالش ایجاد شده preEnroll() باطل می کند. این باید در پایان یک جلسه ثبت نام چند انگشتی فراخوانی شود تا نشان دهد که انگشت دیگری نمی تواند اضافه شود.

برای جزئیات بیشتر در این مورد، به نظرات در IBiometricsFingerprint.hal مراجعه کنید.