תגי הרשאה

ב-API של KeyMint (לשעבר Keymaster) נעשה שימוש נרחב בתגי הרשאה, שהם צמדים של שם וערך. לכל תג אפשרי יש:

  • שם של enum עם ערך משויך
  • סוג משויך (לדוגמה, מספר שלם, בייטים, תאריך, enum), שכולל ציון אם מותר להזין כמה ערכים

לדוגמה, לתג עם השם Tag::BLOCK_MODE יש ערך בסיסי של enum‏ 4 וסמן מסוג TagType::ENUM_REP שמציין שהערך המשויך הוא enum שניתן לחזור עליו (במקרה הזה, BlockMode).

לתגים יש שתי פונקציות ב-API:

  • כפרמטרים לפעולה שמתבצעת ב-API, לדוגמה, Tag::MAC_LENGTH בפעולת חתימה של HMAC מציין את האורך המבוקש של HMAC.
  • מאפיינים מרכזיים, ערכים שקשורים באופן קבוע למפתח מסוים (כלומר, כלולים ב-blob של המפתח). לדוגמה, Tag::EC_CURVE מציין לאיזו עקומה אליפטית המפתח שייך. כל מאפיין מפתח משויך לרמת אבטחה שמציינת איזה חלק במערכת אוכף את המאפיין:
    • מאפיין מפתח עם רמת אבטחה TRUSTED_ENVIRONMENT או STRONGBOX נאכף בחומרה המאובטחת.
    • מאפיין מפתח עם רמת אבטחה SOFTWARE או KEYSTORE נאכף רק על ידי שירות המערכת keystore2 (ולכן מאפיין כזה לא עמיד בפני פגיעה במערכת ההפעלה).

הרבה תגים פועלים גם כמאפיינים מרכזיים וגם כפרמטרים:

  • המאפיינים המרכזיים מציינים את קבוצת הפרמטרים המותרים למפתח, לדוגמה:
    • ה-Tag::PURPOSE של מפתח ECDSA יכול לכלול גם את SIGN וגם את AGREE_KEY.
    • ה-Tag::BLOCK_MODE של מפתח AES עשוי לכלול מצבי ECB,‏ CBC ו-CTR.
  • בקשת begin() כוללת ערך פרמטר ספציפי לפעולה, לדוגמה:
    • begin() כולל פרמטר ייעודי שצריך להתאים לאחד מהערכים של מאפייני המפתח Tag::PURPOSE.
    • begin() עבור פעולת AES צריך לכלול ערך יחיד של Tag::BLOCK_MODE בשדה params, שחייב להיות זהה לאחד מהערכים במאפייני המפתח.

הפונקציה הכפולה הזו רלוונטית במיוחד לאיסוף תגים שמועברים כ-keyParams בפעולת יצירה או ייבוא של מפתח.

  • חלק מהתגים משמשים כפרמטרים לפעולת יצירת המפתח עצמה. לדוגמה, התג Tag::CERTIFICATE_SUBJECT משפיע רק על תהליך יצירת המפתח (האסימטרי), על ידי שליטה בשדה באישור X.509 שמוחזר.
  • תגים אחרים קשורים למפתח שנוצר לאחרונה כמאפייני מפתח, והם מוצפנים ב-keyblob שמוחזר כדי שהם ישויכו למפתח באופן קבוע.

מידע מפורט על ערכי התגים זמין במפרטים הבאים של ממשק HAL: