Fingerprint HIDL

במכשירים עם חיישן טביעת אצבע, המשתמשים יכולים לרשום טביעת אצבע אחת או יותר ולהשתמש בהן כדי לפתוח את נעילת המכשיר וכדי לעשות דברים אחרים. מערכת Android משתמשת בשפת הגדרה לבניית ממשק חומרה לטביעות אצבעות (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 ו-KeyMint (לשעבר Keymaster) מספקים הצפנה שמגובה בחומרה לאחסון מאובטח של מפתחות בסביבה מאובטחת, כמו סביבת מחשוב אמינה (TEE).
זרימת הנתונים לאימות באמצעות טביעת אצבע
איור 1. תרשים זרימת נתונים ברמה גבוהה לאימות באמצעות טביעת אצבע

הטמעה של HAL ספציפי לספק צריכה להשתמש בפרוטוקול התקשורת שנדרש על ידי TEE. אסור להעביר תמונות גולמיות ותכונות מעובדות של טביעות אצבעות בזיכרון לא מהימן. כל הנתונים הביומטריים האלה צריכים להיות מאוחסנים בחומרה מאובטחת, כמו TEE. תהליך הרוט (Root) לא יכול לפגוע בנתונים ביומטריים.

FingerprintService ו-fingerprintd מבצעות שיחות דרך Fingerprint HAL לספרייה הספציפית לספק כדי לרשום טביעות אצבע ולבצע פעולות אחרות.

אינטראקציה עם fingerprintd
איור 2. אינטראקציה של דימון (daemon) של טביעות אצבע עם ספריית טביעות האצבע הספציפית לספק

הנחיות להטמעה

ההנחיות הבאות לגבי Fingerprint HAL נועדו להבטיח שנתוני טביעות האצבע לא ידלפו ויוסרו כשהמשתמש מוסר מהמכשיר:

  • אסור לאפשר גישה לנתוני טביעות אצבעות גולמיים או לנגזרות שלהם (לדוגמה, תבניות) מחוץ לדרייבר של החיישן או ל-TEE. אם החומרה תומכת ב-TEE, גישת החומרה אל TEE צריכה להיות מוגבלת ומוגנת על ידי מדיניות SELinux. הגישה לערוץ Serial Peripheral Interface‏ (SPI) צריכה להיות מוגבלת ל-TEE, וצריכה להיות מדיניות SELinux מפורשת בכל קובצי המכשיר.
  • תהליך ההקלטה, ההרשמה והזיהוי של טביעות האצבעות צריך להתרחש בתוך ה-TEE.
  • אפשר לאחסן במערכת הקבצים רק את ההצפנה של נתוני טביעות האצבעות, אפילו אם מערכת הקבצים עצמה מוצפנת.
  • צריך לחתום על תבניות טביעות אצבעות באמצעות מפתח פרטי שייחודי למכשיר. במקרה של Advanced Encryption Standard ‏ (AES)‏, צריך לחתום על תבנית לפחות באמצעות הנתיב המוחלט של מערכת הקבצים, הקבוצה ומזהה טביעת האצבע, כך שקבצים של תבניות לא יוכלו לפעול במכשיר אחר או בשביל מישהו אחר מלבד המשתמש שרשם אותם באותו מכשיר. לדוגמה, אסור שאפשר יהיה להעתיק נתוני טביעות אצבעות ממשתמש אחר באותו מכשיר, או ממכשיר אחר.
  • ההטמעות צריכות להשתמש בנתיב של מערכת הקבצים שסופק על ידי הפונקציה setActiveGroup() או לספק דרך למחיקה של כל נתוני התבניות של המשתמש כשהמשתמש מוסר. מומלץ מאוד לאחסן את קובצי התבניות של טביעות האצבע כמוצפנים, ולשמור אותם בנתיב שצוין. אם זה לא אפשרי בגלל דרישות האחסון של TEE, המטמיע חייב להוסיף הוקים (hooks) כדי להבטיח שהנתונים יוסרו כשהמשתמש יוסר.

שיטות לזיהוי טביעת אצבע

ממשק Fingerprint HIDL מכיל את ה-methods העיקריות הבאות ב-IBiometricsFingerprint.hal.

שיטה תיאור
enroll() הפעלת מכונת מצבים של HAL כדי להתחיל את האיסוף והאחסון של תבנית טביעת אצבע. כשההרשמה מסתיימת, או אחרי פסק זמן, מכונת המצבים של HAL חוזרת למצב סרק.
preEnroll() יוצרת טוקן ייחודי שמציין את ההתחלה של רישום טביעת אצבע. מספקת אסימון לפונקציה enroll כדי לוודא שהיה אימות קודם, למשל באמצעות סיסמה. כדי למנוע שיבוש, הטוקן מוצפן אחרי שפרטי הכניסה של המכשיר מאושרים. צריך לבדוק את הטוקן במהלך ההרשמה כדי לוודא שהוא עדיין בתוקף.
getAuthenticatorId() מחזירה טוקן שמשויך לקבוצת טביעות האצבע הנוכחית.
cancel() מבטלת פעולות ממתינות של הרשמה או אימות. מכונת המצבים של HAL חוזרת למצב סרק.
enumerate() קריאה סינכרונית לספירת כל תבניות טביעות האצבע הידועות.
remove() מוחקת תבנית טביעת אצבע.
setActiveGroup() מגבילה פעולת HAL לקבוצה של טביעות אצבע ששייכות לקבוצה מסוימת, שמזוהה על ידי מזהה קבוצה (GID).
authenticate() מאמתת פעולה שקשורה לטביעת אצבע (מזוהה באמצעות מזהה פעולה).
setNotify() רושמת פונקציית משתמש שמקבלת התראות מ-HAL. אם מכונת המצבים של HAL במצב עמוס, הפונקציה חסומה עד שממשק HAL יוצא מהמצב העמוס.
postEnroll() הפעולה הזו מסיימת את פעולת ההרשמה ומבטלת את התוקף של האתגר preEnroll() שנוצר. צריך להפעיל את הפונקציה הזו בסוף סשן של רישום טביעות אצבעות של כמה אצבעות, כדי לציין שאי אפשר להוסיף עוד אצבעות.

פרטים נוספים על ההגדרות האלה מופיעים בהערות בקובץ IBiometricsFingerprint.hal.