אימות מפתחות ומזהים

Keystore מספק מקום מאובטח יותר ליצירה, לאחסון ולשימוש במפתחות קריפטוגרפיים בצורה מבוקרת. כשקיים אחסון מפתחות שמגובה בחומרה ונעשה בו שימוש, חומר המפתח מאובטח יותר מפני חילוץ מהמכשיר, ו-KeyMint (לשעבר Keymaster) אוכף הגבלות שקשה לעקוף.

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

כדי לפתור את הבעיה הזו, אימות מפתח הושק ב-Android 7.0 (Keymaster 2), ואימות מזהה הושק ב-Android 8.0 (Keymaster 3).

מטרת אימות המפתח היא לספק דרך לקבוע באופן חד משמעי אם זוג מפתחות אסימטרי מגובה בחומרה, מה המאפיינים של המפתח ואילו מגבלות חלות על השימוש בו.

אימות מזהה מאפשר למכשיר לספק הוכחה למזהי החומרה שלו, כמו מספר סידורי או IMEI.

אימות עם מפתח

כדי לתמוך באימות מפתח, ב-Android 7.0 הוצגו קבוצה של תגים, סוגים ושיטות ל-HAL.

תגים

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

סוג

Keymaster 2 ומטה

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

AttestKey method

Keymaster 3

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

Keymaster 2 ומטה

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev הוא מבנה המכשיר של Keymaster.
  • keyToAttest הוא ה-blob של המפתח שמוחזר מ-generateKey שעבורו נוצר האישור.
  • attestParams היא רשימה של פרמטרים שנדרשים לאימות. למשל, Tag::ATTESTATION_CHALLENGE ואולי Tag::RESET_SINCE_ID_ROTATION, וגם Tag::APPLICATION_ID ו-Tag::APPLICATION_DATA. שני האחרונים נדרשים כדי לפענח את ה-blob של המפתח אם הם צוינו במהלך יצירת המפתח.
  • certChain הוא פרמטר הפלט שמחזיר מערך של אישורים. הערך 0 הוא אישור האימות, כלומר הוא מאשר את המפתח מ-keyToAttest ומכיל את תוסף האימות.

השיטה attestKey נחשבת לפעולה של מפתח ציבורי במפתח המאומת, כי אפשר לקרוא לה בכל שלב ואין צורך לעמוד במגבלות הרשאה. לדוגמה, אם המפתח המאומת צריך אימות משתמש כדי להשתמש בו, אפשר ליצור אימות בלי אימות משתמש.

אישור אימות

אישור האימות הוא אישור X.509 רגיל, עם תוסף אימות אופציונלי שמכיל תיאור של המפתח המאומת. האישור חתום באמצעות מפתח אימות מאושר. יכול להיות שמפתח האימות משתמש באלגוריתם שונה מזה של המפתח שמאומת.

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

רצף האישורים

שם השדה (ראו RFC 5280) ערך
tbsCertificate TBSCertificate SEQUENCE
signatureAlgorithm מזהה האלגוריתם שמשמש לחתימה על המפתח:
ECDSA למפתחות EC, ‏ RSA למפתחות RSA.
signatureValue מחרוזת ביטים, חתימה שחושבה על tbsCertificate בקידוד ASN.1 DER.

TBSCertificate SEQUENCE

שם השדה (ראו RFC 5280) ערך
version ‫INTEGER 2 (כלומר אישור v3)
serialNumber מספר שלם 1 (ערך קבוע: זהה בכל האישורים)
signature מזהה האלגוריתם שמשמש לחתימה על המפתח: ECDSA למפתחות EC,‏ RSA למפתחות RSA.
issuer זהה לשדה הנושא של מפתח האימות של הקבוצה.
validity רצף של שני תאריכים, שמכיל את הערכים של Tag::ACTIVE_DATETIME ושל Tag::USAGE_EXPIRE_DATETIME. הערכים האלה הם באלפיות שנייה מאז 1 בינואר 1970. ב-RFC 5280 מוסבר איך להציג תאריכים בצורה נכונה באישורים.
אם התג Tag::ACTIVE_DATETIME לא מופיע, המערכת תשתמש בערך של Tag::CREATION_DATETIME. אם הערך Tag::USAGE_EXPIRE_DATETIME לא מופיע, צריך להשתמש בתאריך התפוגה של אישור מפתח האימות של הקבוצה.
subject CN = "Android Keystore Key" (ערך קבוע: זהה בכל האישורים)
subjectPublicKeyInfo ‫SubjectPublicKeyInfo שמכיל מפתח ציבורי מאומת.
extensions/Key Usage ‫digitalSignature: מוגדר אם למפתח יש מטרה KeyPurpose::SIGN או KeyPurpose::VERIFY. כל שאר הביטים לא מוגדרים.
extensions/CRL Distribution Points הערך טרם נקבע
extensions/"attestation" ה-OID הוא 1.3.6.1.4.1.11129.2.1.17; התוכן מוגדר בקטע Attestation extension שבהמשך. כמו בכל התוספים של אישורי X.509, התוכן מיוצג כ-OCTET_STRING שמכיל קידוד DER של רצף האימות.

תוסף אימות (attestation)

לתוסף attestation יש OID‏ 1.3.6.1.4.1.11129.2.1.17. הוא מכיל מידע על זוג המפתחות שנבדק ועל מצב המכשיר בזמן יצירת המפתח.

סוגי התגים של Keymaster/KeyMint שמוגדרים במפרט של ממשק AIDL מתורגמים לסוגי ASN.1 באופן הבא:

סוג KeyMint או Keymaster סוג ASN.1 הערות
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER אלפיות השנייה מאז 1 בינואר 1970, בשעה 00:00:00 (שעון גריניץ').
BOOL NULL אם התג קיים, הערך הוא True, ואם הוא לא קיים, הערך הוא False.
BIGNUM אין תגים מהסוג הזה, ולכן לא מוגדר מיפוי.
BYTES OCTET_STRING

סכימה

התוכן של תוסף האישור מתואר בסכימת ה-ASN.1 הבאה. סכימת ASN.1 של AuthorizationList משמשת גם לייבוא מפתחות מוצפנים. כל השדות שלא יופיעו בתוסף האישור מצוינים ככאלה.

גרסה 500

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 500
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 500
    keyMintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    mlDsaVariant                [11] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash                 [724] EXPLICIT OCTET_STRING OPTIONAL,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

גרסה 400

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 400
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 400
    keyMintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash                 [724] EXPLICIT OCTET_STRING OPTIONAL,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

גרסה 300

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 300
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 300
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

גרסה 200

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 200
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 200
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

גרסה 100

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 100
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 100
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

גרסה 4

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 4
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 41
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

גרסה 3

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 3
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 4
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

גרסה 2

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 2
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 3
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    allApplications            [600] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant          [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey           OCTET_STRING,
    deviceLocked              BOOLEAN,
    verifiedBootState         VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified                  (0),
    SelfSigned                (1),
    Unverified                (2),
    Failed                    (3),
}

גרסה 1

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 1
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 2
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    allApplications            [600] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant          [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

שדות KeyDescription

attestationVersion
גרסת הסכימה של ASN.1.
ערךהגרסה של KeyMint או Keymaster
1גרסה 2.0 של Keymaster
2גרסה 3.0 של Keymaster
3גרסה 4.0 של Keymaster
4Keymaster גרסה 4.1
100גרסה 1.0 של KeyMint
200גרסה 2.0 של KeyMint
300KeyMint גרסה 3.0
400גרסה 4.0 של KeyMint
500KeyMint גרסה 5.0
attestationSecurityLevel

רמת האבטחה של המיקום שבו מאוחסן המפתח שאומת.

keymasterVersion / keyMintVersion
הגרסה של KeyMint או של Keymaster HAL ההטמעה.
ערךהגרסה של KeyMint או Keymaster
2גרסה 2.0 של Keymaster
3גרסה 3.0 של Keymaster
4גרסה 4.0 של Keymaster
41Keymaster גרסה 4.1
100גרסה 1.0 של KeyMint
200גרסה 2.0 של KeyMint
300KeyMint גרסה 3.0
400גרסה 4.0 של KeyMint
500KeyMint גרסה 5.0
keymasterSecurityLevel / keyMintSecurityLevel
רמת האבטחה של הטמעת KeyMint או Keymaster.
attestationChallenge
האתגר שסופק בזמן יצירת המפתח.
uniqueId
מזהה מכשיר שרגיש לפרטיות, שאפליקציות מערכת יכולות לבקש בזמן יצירת המפתח. אם לא מתבקש מזהה ייחודי, השדה הזה ריק. פרטים נוספים זמינים בקטע בנושא מזהה ייחודי.
softwareEnforced
רשימת ההרשאות של KeyMint או Keymaster שנאכפת על ידי מערכת Android. המידע הזה נאסף או נוצר על ידי קוד בפלטפורמה. אפשר לסמוך על המכשיר כל עוד פועלת בו מערכת הפעלה שתואמת למודל האבטחה של פלטפורמת Android (כלומר, תוכנת האתחול של המכשיר נעולה ו-verifiedBootState הוא Verified).
hardwareEnforced
רשימת ההרשאות של KeyMint או Keymaster שנאכפת על ידי סביבת המחשוב האמינה (TEE) או StrongBox של המכשיר. המידע הזה נאסף או נוצר על ידי קוד בחומרה מאובטחת ולא נשלט על ידי הפלטפורמה. לדוגמה, המידע יכול להגיע מ-bootloader או דרך ערוץ תקשורת מאובטח שלא מצריך אמון בפלטפורמה.

הערכים של SecurityLevel

הערך SecurityLevel מציין את מידת העמידות של רכיב שקשור למאגר מפתחות (לדוגמה, צמד מפתחות ואישור) בפני מתקפה.

ערך משמעות
Software האבטחה תהיה טובה כל עוד מערכת Android במכשיר תואמת למודל האבטחה של פלטפורמת Android (כלומר, תוכנת האתחול של המכשיר נעולה ו-verifiedBootState הוא Verified).
TrustedEnvironment האבטחה נשמרת כל עוד סביבת ה-TEE לא נפגעת. דרישות הבידוד של סביבות TEE מוגדרות בקטעים 9.11 [C-1-1] עד [C-1-4] במסמך הגדרת התאימות (CDD) של Android. סביבות TEE עמידות מאוד לפריצה מרחוק ועמידות במידה בינונית לפריצה באמצעות מתקפת חומרה ישירה.
StrongBox הנתונים מאובטחים כל עוד לא נפגעת האבטחה של StrongBox. ‫StrongBox מיושם ברכיב אבטחה שדומה למודול אבטחה בחומרה. דרישות ההטמעה של StrongBox מוגדרות בקטע 9.11.2 במסמך הגדרת התאימות (CDD) של Android. ‫StrongBox עמיד מאוד בפני פריצה מרחוק ופריצה באמצעות מתקפת חומרה ישירה (לדוגמה, שיבוש פיזי ומתקפות ערוץ צדדי).

שדות AuthorizationList

כל שדה תואם לתג הרשאה של Keymaster/KeyMint ממפרט ממשק AIDL. המפרט הוא מקור המידע לגבי תגי הרשאה: המשמעות שלהם, הפורמט של התוכן שלהם, אם הם אמורים להופיע בשדות softwareEnforced או hardwareEnforced באובייקט KeyDescription, אם הם לא יכולים להופיע יחד עם תגים אחרים וכו'. כל השדות של AuthorizationList הם אופציונליים.

לכל שדה יש תג EXPLICIT ספציפי להקשר ששווה למספר התג KeyMint או Keymaster, שמאפשר ייצוג קומפקטי יותר של הנתונים ב-AuthorizationList. לכן, מנתח ה-ASN.1 צריך לדעת את סוג הנתונים הצפוי לכל תג ספציפי להקשר. לדוגמה, Tag::USER_AUTH_TYPE מוגדר כ-ENUM | 504. בסכימת התוסף לאישור, השדה purpose ב-AuthorizationList מוגדר כ-userAuthType [504] EXPLICIT INTEGER OPTIONAL. לכן, הקידוד שלו ב-ASN.1 יכיל את התג הספציפי להקשר 504 במקום את תג המחלקה UNIVERSAL של סוג ASN.1‏ INTEGER, שהוא 10.

השדות הבאים מופיעים באישורים שנוצרו על ידי KeyMint 5:
purpose
הערך הזה תואם לתג ההרשאה Tag::PURPOSE, שמשתמש בערך מזהה התג 1.
algorithm

הערך הזה תואם לTag::ALGORITHM תג ההרשאה, שמשתמש בערך מזהה התג 2.

באובייקט AuthorizationList של אישור, ערך האלגוריתם הוא תמיד RSA,‏ EC או ML_DSA.

keySize
תואם לתג ההרשאה Tag::KEY_SIZE, שמשתמש בערך מזהה התג 3.
blockMode
תואם לתג ההרשאה Tag::BLOCK_MODE, שמשתמש בערך מזהה התג 4.
digest
תואם לתג ההרשאה Tag::DIGEST, שמשתמש בערך מזהה התג 5.
padding
תואם לתג ההרשאה Tag::PADDING, שמשתמש בערך מזהה התג 6.
callerNonce
תואם לתג ההרשאה Tag::CALLER_NONCE, שמשתמש בערך מזהה התג 7. התג הזה אף פעם לא מופיע באישורים.
minMacLength
תואם לתג ההרשאה Tag::MIN_MAC_LENGTH, שמשתמש בערך מזהה התג 8. התג הזה אף פעם לא מופיע באישורים.
ecCurve

הערך הזה תואם לTag::EC_CURVE תג ההרשאה, שמשתמש בערך מזהה התג 10.

קבוצת הפרמטרים שמשמשת ליצירת זוג מפתחות של עקומה אליפטית (EC), שמשתמשת ב-ECDSA לחתימה ולאימות, במאגר המפתחות של מערכת Android.

mlDsaVariant

המאפיין הזה מופיע רק בגרסה של אימות המפתח >= 500.

הערך הזה תואם לתג ההרשאה Tag::ML_DSA_VARIANT, שמשתמש בערך מזהה התג 11.

rsaPublicExponent
תואם לתג Tag::RSA_PUBLIC_EXPONENT authorization שמשתמש בערך מזהה התג 200.
mgfDigest

המאפיין הזה מופיע רק בגרסה של אישור המפתח >= 100.

הערך הזה תואם לתג ההרשאה Tag::RSA_OAEP_MGF_DIGEST KeyMint שמשתמש בערך מזהה התג 203.
rollbackResistance

המאפיין הזה קיים רק בגרסה 3 ומעלה של אימות מפתח.

הערך הזה תואם לתג Tag::ROLLBACK_RESISTANCE authorization שמשתמש בערך מזהה התג 303.

earlyBootOnly

המאפיין הזה מופיע רק בגרסה של אימות המפתח >= 4.

הערך הזה תואם לTag::EARLY_BOOT_ONLY תג ההרשאה, שמשתמש בערך מזהה התג 305.

activeDateTime
הערך הזה תואם לתג ההרשאה Tag::ACTIVE_DATETIME, שמשתמש בערך מזהה התג 400.
originationExpireDateTime
תואם לתג Tag::ORIGINATION_EXPIRE_DATETIME authorization שמשתמש בערך מזהה התג 401.
usageExpireDateTime
תואם לתג ההרשאה Tag::USAGE_EXPIRE_DATETIME, שמשתמש בערך מזהה התג 402.
usageCountLimit
תואם לתג ההרשאה Tag::USAGE_COUNT_LIMIT, שמשתמש בערך מזהה התג 405.
userSecureId
תואם לתג ההרשאה Tag::USER_SECURE_ID, שמשתמש בערך מזהה תג של 502. התג הזה אף פעם לא מופיע באישורים.
noAuthRequired

הערך הזה תואם לTag::NO_AUTH_REQUIRED authorization tag, שמשתמש בערך tag ID של 503.

userAuthType
תואם לתג ההרשאה Tag::USER_AUTH_TYPE, שמשתמש בערך מזהה התג 504.
authTimeout
תואם לתג ההרשאה Tag::AUTH_TIMEOUT, שמשתמש בערך מזהה התג 505.
allowWhileOnBody

הערך הזה תואם לTag::ALLOW_WHILE_ON_BODY authorization tag, which uses a tag ID value of 506.

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

trustedUserPresenceReq

המאפיין הזה מופיע רק בגרסה של אישור המפתח >= 3.

הערך הזה תואם לתג ההרשאה Tag::TRUSTED_USER_PRESENCE_REQUIRED שמשתמש בערך מזהה התג 507.

המדיניות קובעת שאפשר להשתמש במפתח הזה רק אם המשתמש סיפק הוכחה לנוכחות פיזית. הנה כמה דוגמאות:

  • במקרה של מפתח StrongBox, מדובר בכפתור חומרה שמחובר ישירות לפין במכשיר StrongBox.
  • במקרה של מפתח TEE, אימות באמצעות טביעת אצבע מספק הוכחה לנוכחות, כל עוד ל-TEE יש שליטה בלעדית בסורק והוא מבצע את תהליך ההתאמה של טביעת האצבע.
trustedConfirmationReq

המאפיין הזה מופיע רק בגרסה של אישור המפתח >= 3.

הערך הזה תואם לתג ההרשאה Tag::TRUSTED_CONFIRMATION_REQUIRED שמשתמש בערך מזהה התג 508.

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

הערה: התג הזה רלוונטי רק למפתחות שמשתמשים בSIGN purpose.

unlockedDeviceReq

המאפיין הזה מופיע רק בגרסה של אישור המפתח >= 3.

הערך הזה תואם לתג ההרשאה Tag::UNLOCKED_DEVICE_REQUIRED שמשתמש בערך מזהה התג 509.

creationDateTime
הערך הזה תואם לתג ההרשאה Tag::CREATION_DATETIME, שמשתמש בערך מזהה התג 701.
origin

הערך הזה תואם לTag::ORIGIN תג ההרשאה, שמשתמש בערך מזהה התג 702.

rootOfTrust

הערך הזה תואם לTag::ROOT_OF_TRUST authorization tag, שמשתמש בערך tag ID של 704.

פרטים נוספים זמינים בקטע שמתאר את מבנה הנתונים של RootOfTrust.

osVersion

הערך הזה תואם לTag::OS_VERSION תג ההרשאה, שמשתמש בערך מזהה התג 705.

הגרסה של מערכת ההפעלה Android שמשויכת ל-Keymaster, מצוינת כמספר שלם בן שש ספרות. לדוגמה, הגרסה 8.1.0 מיוצגת כ-080100.

רק ב-Keymaster בגרסה 1.0 ומעלה הערך הזה נכלל ברשימת ההרשאות.

osPatchLevel

הערך הזה תואם לTag::OS_PATCHLEVEL תג ההרשאה, שמשתמש בערך מזהה התג 706.

החודש והשנה שמשויכים לתיקון האבטחה שנעשה בו שימוש ב-KeyMint (לשעבר Keymaster), שצוינו כמספר שלם בן שש ספרות. לדוגמה, תיקון האבטחה של אוגוסט 2018 מיוצג כ-201808.

מומלץ להשתמש בשדה הזה במקום בשדה vendorPatchLevel או בשדה bootPatchLevel כדי לבדוק אם בוצע תיקון במכשיר לאחרונה.

רק ב-Keymaster בגרסה 1.0 ומעלה הערך הזה נכלל ברשימת ההרשאות.

attestationApplicationId

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לתג Tag::ATTESTATION_APPLICATION_ID authorization, שמשתמש בערך מזהה התג 709.

פרטים נוספים מופיעים בקטע שמתאר את מבנה הנתונים של AttestationApplicationId.

attestationIdBrand

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לתג ההרשאה Tag::ATTESTATION_ID_BRAND, שמשתמש בערך מזהה התג 710.

attestationIdDevice

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לתג ההרשאה Tag::ATTESTATION_ID_DEVICE, שמשתמש בערך מזהה התג 711.

attestationIdProduct

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לתג ההרשאה Tag::ATTESTATION_ID_PRODUCT, שמשתמש בערך מזהה התג 712.

attestationIdSerial

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לTag::ATTESTATION_ID_SERIAL תג ההרשאה, שמשתמש בערך מזהה התג 713.

attestationIdImei

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לTag::ATTESTATION_ID_IMEI תג ההרשאה, שמשתמש בערך מזהה התג 714.

attestationIdMeid

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לתג ההרשאה Tag::ATTESTATION_ID_MEID, שמשתמש בערך מזהה התג 715.

attestationIdManufacturer

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לתג Tag::ATTESTATION_ID_MANUFACTURER authorization שמשתמש בערך מזהה התג 716.

attestationIdModel

המאפיין הזה מופיע רק בגרסאות של אימות המפתח שהן ‎ >= 2.

הערך הזה תואם לTag::ATTESTATION_ID_MODEL תג ההרשאה, שמשתמש בערך מזהה התג 717.

vendorPatchLevel

המאפיין הזה קיים רק בגרסאות של אימות מפתח שגדולות או שוות ל-3.

הערך הזה תואם לתג Tag::VENDOR_PATCHLEVEL authorization, שמשתמש בערך מזהה התג 718.

המדיניות הזו מציינת את רמת תיקוני האבטחה של תמונת הספק שצריך להתקין במכשיר כדי שאפשר יהיה להשתמש במפתח הזה. הערך הוא המספר השלם שמתקבל מרמת תיקון האבטחה אחרי שמסירים את המקפים. לדוגמה, אם נוצר מפתח במכשיר Android עם תיקון האבטחה של הספק מ-2018-08-05, הערך יהיה 20180805.

bootPatchLevel

קיים רק בגרסאות מרכזיות של אימות >= 3.

הערך הזה תואם לתג ההרשאה Tag::BOOT_PATCHLEVEL שמשתמש בערך מזהה התג 719.

מציינת את רמת תיקוני האבטחה של תמונת הליבה שצריך להתקין במכשיר כדי שאפשר יהיה להשתמש במפתח הזה. הערך הוא המספר השלם שמתקבל מרמת תיקון האבטחה אחרי שמסירים את המקפים. לדוגמה, אם נוצר מפתח במכשיר Android עם תיקון האבטחה של ליבת המערכת מ-2018-08-05, הערך יהיה 20180805.

deviceUniqueAttestation

הפרמטר הזה מופיע רק בגרסאות של אימות מפתח שהן ‎4 ומעלה.

הערך הזה תואם לתג ההרשאה Tag::DEVICE_UNIQUE_ATTESTATION שמשתמש בערך מזהה התג 720.

attestationIdSecondImei

הפרמטר הזה מופיע רק בגרסאות של אימות מפתח >= 300.

הערך הזה תואם לTag::ATTESTATION_ID_SECOND_IMEI תג ההרשאה, שמשתמש בערך מזהה התג 723.

moduleHash

המאפיין הזה מופיע רק בגרסאות של אימות מפתחות שגדולות מ-400 או שוות להן.

הערך הזה תואם לTag::MODULE_HASH תג ההרשאה, שמשתמש בערך מזהה תג של 724.

שדות RootOfTrust

verifiedBootKey
גיבוב מאובטח של המפתח הציבורי שמשמש לאימות התקינות והאותנטיות של כל הקוד שמופעל במהלך אתחול המכשיר כחלק מההפעלה המאומתת. מומלץ להשתמש ב-SHA-256.
deviceLocked
האם תוכנת האתחול של המכשיר נעולה. ‫true מציין שהמכשיר הפעיל תמונה חתומה שאומתה בהצלחה על ידי הפעלה מאומתת.
verifiedBootState
מצב האתחול המאומת של המכשיר.
verifiedBootHash
תקציר של כל הנתונים שמוגנים על ידי Verified Boot. במכשירים שמשתמשים בהטמעה לדוגמה של אתחול מאומת של Android, השדה הזה מכיל את התקציר של VBMeta.

הערכים של VerifiedBootState

ערך מצב האתחול המתאים משמעות
Verified GREEN שרשרת מלאה של מהימנות מתחילה ב-Root of Trust שמוגן על ידי חומרה וממשיכה אל טוען האתחול וכל המחיצות שאומתו על ידי הפעלה מאומתת. במצב הזה, השדה verifiedBootKey מכיל את הגיבוב של הבסיס המוטמע של האמון, שהוא האישור שמוטמע ב-ROM של המכשיר על ידי יצרן המכשיר במפעל.
SelfSigned YELLOW בדומה ל-Verified, אבל האימות בוצע באמצעות Root of Trust (קיצור: RoT) שהוגדר על ידי המשתמש במקום Root of Trust (קיצור: RoT) שהיצרן הטמיע במפעל. במצב הזה, השדה verifiedBootKey מכיל את הגיבוב של המפתח הציבורי שהוגדר על ידי המשתמש.
Unverified ORANGE תוכנת האתחול של המכשיר לא נעולה, ולכן אי אפשר ליצור שרשרת אמון. אפשר לשנות את המכשיר באופן חופשי, ולכן המשתמש צריך לאמת את שלמות המכשיר מחוץ לפס. במצב הזה, השדה verifiedBootKey מכיל 32 בייטים של אפסים.
Failed RED אימות המכשיר נכשל. במצב הזה, אין ערובות לגבי התוכן של שדות RootOfTrust אחרים.

AttestationApplicationId

השדה הזה משקף את ההנחה של פלטפורמת Android לגבי האפליקציות שמורשות להשתמש בחומרי המפתח הסודיים במסגרת האימות. הוא יכול להכיל כמה חבילות אם ורק אם לכמה חבילות יש את אותו UID. השדה AttestationApplicationId ב-AuthorizationList הוא מסוג OCTET_STRING והוא בפורמט הבא בהתאם לסכימת ASN.1:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
קבוצה של אובייקטים מסוג AttestationPackageInfo, שכל אחד מהם מספק את השם ומספר הגרסה של חבילה.
signature_digests

קבוצה של תקצירי SHA-256 של אישורי החתימה של האפליקציה. לאפליקציה יכולים להיות כמה שרשראות של אישורי מפתחות חתימה. לכל אחד מהם, אישור ה'עלה' עובר עיכול ומוצב בשדה signature_digests. שם השדה מטעה, כי הנתונים המעובדים הם אישורי החתימה של האפליקציה, ולא החתימות של האפליקציה. הסיבה לכך היא שהשם של השדה הוא Signature, שהוא שם המחלקה שמוחזרת על ידי קריאה ל-getPackageInfo(). בקטע הקוד הבא מוצגת קבוצה לדוגמה:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

תוסף לציון פרטי הקצאת הרשאות

לתוסף של פרטי ההקצאה יש OID 1.3.6.1.4.1.11129.2.1.30. התוסף מספק מידע שהשרת להקצאת הרשאות יודע על המכשיר.

סכימה

ערך התוסף מורכב מנתוני ייצוג בינארי תמציתי של אובייקט (CBOR) שתואמים לסכימה של שפת הגדרת נתונים תמציתית (CDDL):

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

המפה לא כוללת גרסאות, ויכול להיות שיוספו אליה שדות אופציונליים חדשים.

certs_issued

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

validated_attested_entity

מחרוזת שמציינת את המקור המאושר של המפתח המאומת, שאושר ישירות על ידי יצרן ערכת השבבים. לדוגמה, STRONG_BOX או TEE.

מפתחות אימות

שני מפתחות, אחד RSA ואחד ECDSA, ושרשראות האישורים התואמות, מוקצים למכשיר בצורה מאובטחת.

ב-Android 12 הוצגה הקצאת מפתחות מרחוק, וב-Android 15 נדרש שכל המכשירים יטמיעו אותה. השירות Remote Key Provisioning (הקצאת מפתחות מרחוק) מספק למכשירים בשטח אישורי אימות ECDSA P256 לכל אפליקציה. תוקף האישורים האלה קצר יותר מתוקף האישורים שהוקצו במפעל.

מזהה ייחודי

המזהה הייחודי הוא ערך של 128 ביט שמזהה את המכשיר, אבל רק לתקופה מוגבלת. הערך מחושב באמצעות:

HMAC_SHA256(T || C || R, HBK)

כאשר:

  • T הוא 'ערך מונה זמני', שמחושב על ידי חלוקת הערך של Tag::CREATION_DATETIME ב-2592000000, והתעלמות מכל שארית. הערך של T משתנה כל 30 יום (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C הוא הערך של Tag::APPLICATION_ID
  • הערך של R הוא 1 אם Tag::RESET_SINCE_ID_ROTATION מופיע בפרמטר attest_params בקריאה ל-attest_key, או 0 אם התג לא מופיע.
  • HBK הוא סוד ייחודי שקשור לחומרה, שסביבת המחשוב האמינה (TEE) מכירה אותו ואף פעם לא חושפת אותו. הסוד מכיל לפחות 128 ביט של אנטרופיה והוא ייחודי למכשיר הספציפי (ייחודיות הסתברותית מקובלת בהינתן 128 ביט של אנטרופיה). מפתח ה-HBK צריך להיות נגזר מחומר מפתח מאוחד באמצעות HMAC או AES_CMAC.

חיתוך של פלט HMAC_SHA256 ל-128 ביטים.

מספרי IMEI מרובים

ב-Android 14 נוספה תמיכה בכמה מספרי IMEI ברשומה של אימות המפתח ב-Android. יצרני ציוד מקורי יכולים להטמיע את התכונה הזו על ידי הוספת תג KeyMint למספר IMEI שני. יותר ויותר מכשירים כוללים כמה רכיבי רדיו סלולריים, ויצרני ציוד מקורי יכולים לתמוך במכשירים עם שני מספרי IMEI.

יצרני ציוד מקורי(OEM) נדרשים להקצות מספר IMEI משני, אם הוא קיים במכשירים שלהם, להטמעות של KeyMint, כדי שההטמעות האלה יוכלו לאמת אותו באותו אופן שבו הן מאמתות את מספר ה-IMEI הראשון.

אימות תעודה מזהה

‫Android 8.0 כולל תמיכה אופציונלית באימות מזהה למכשירים עם Keymaster 3. אימות מזהה מאפשר למכשיר לספק הוכחה למזהי החומרה שלו, כמו מספר סידורי או IMEI. זו תכונה אופציונלית, אבל מומלץ מאוד שכל ההטמעות של Keymaster 3 יספקו תמיכה בה, כי היכולת להוכיח את זהות המכשיר מאפשרת להשתמש בתרחישים לדוגמה כמו הגדרה מרחוק אמיתית ללא מגע, בצורה מאובטחת יותר (כי הצד המרוחק יכול להיות בטוח שהוא מתקשר עם המכשיר הנכון, ולא עם מכשיר שמזייף את הזהות שלו).

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

ממשק ה-API הראשי לאימות מזהים מבוסס על מנגנון אימות המפתחות הקיים שהוצג ב-Keymaster 2. כששולחים בקשה לאישור אימות למפתח שנשמר על ידי Keymaster, המתקשר יכול לבקש שמזהי החומרה של המכשיר ייכללו במטא-נתונים של אישור האימות. אם המפתח מוחזק ב-TEE, שרשראות האישורים חוזרות לבסיס מהימנות ידוע. הנמען של אישור כזה יכול לאמת שהאישור והתוכן שלו, כולל מזהי החומרה, נכתבו על ידי TEE. כשמתבקשים לכלול מזהי חומרה באישור האימות, סביבת ה-TEE מאמתת רק את המזהים שמאוחסנים בה, כפי שהם מאוכלסים ברצפת הייצור.

מאפייני האחסון

האחסון שמכיל את המזהים של המכשיר צריך לכלול את המאפיינים הבאים:

  • הערכים שנגזרים מהמזהים המקוריים של המכשיר מועתקים לאחסון לפני שהמכשיר יוצא מהמפעל.
  • השיטה destroyAttestationIds() יכולה להשמיד באופן סופי את העותק הזה של הנתונים שנגזרים מהמזהה. השמדה קבועה פירושה שהנתונים מוסרים לחלוטין, כך שאי אפשר לשחזר אותם באמצעות איפוס להגדרות המקוריות או באמצעות הליך אחר שמתבצע במכשיר. זה חשוב במיוחד למכשירים שבהם משתמש פתח את נעילת טוען האתחול, שינה את תוכנת המערכת ושינה את המזהים שמוחזרים על ידי מסגרות Android.
  • במתקני RMA צריכה להיות אפשרות ליצור עותקים חדשים של הנתונים שנגזרים ממזהה החומרה. כך, מכשיר שעובר תהליך RMA יכול לבצע שוב אימות מזהה. צריך להגן על המנגנון שבו משתמשים במתקני RMA כדי שמשתמשים לא יוכלו להפעיל אותו בעצמם, כי זה יאפשר להם לקבל אישורים של מזהים מזויפים.
  • אף קוד אחר מלבד אפליקציית Keymaster המהימנה ב-TEE לא יכול לקרוא את הנתונים שנגזרים מהמזהה ונשמרים באחסון.
  • האחסון הוא כזה שקל לזהות בו שינויים: אם התוכן באחסון שונה, ה-TEE מתייחס לשינוי כאילו העותקים של התוכן הושמדו, והוא דוחה את כל הניסיונות לאימות המזהה. ההטמעה מתבצעת על ידי חתימה או MAC של האחסון כפי שמתואר בהמשך.
  • האחסון לא מכיל את המזהים המקוריים. מכיוון שאימות הזהות כולל אתגר, המתקשר תמיד מספק את המזהים שצריך לאמת. סביבת ה-TEE צריכה רק לוודא שהערכים האלה זהים לערכים שהיו לה במקור. האימות הזה מתאפשר בזכות אחסון של גיבובים מאובטחים של הערכים המקוריים, במקום הערכים עצמם.

בנייה

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

S = D || HMAC(HBK, D)

כאשר:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC הוא מבנה HMAC עם גיבוב מאובטח מתאים (מומלץ SHA-256)
  • HBK הוא מפתח שקשור לחומרה ולא משמש למטרה אחרת
  • ID1...IDn הם ערכי המזהים המקוריים; השיוך של ערך מסוים לאינדקס מסוים תלוי בהטמעה, כי למכשירים שונים יש מספרים שונים של מזהים
  • || מייצג שרשור

מכיוון שהפלט של HMAC הוא בגודל קבוע, לא נדרשים כותרות או מבנה אחר כדי למצוא גיבובים של מזהים ספציפיים או את ה-HMAC של D. בנוסף לבדיקת הערכים שסופקו כדי לבצע אימות, הטמעות צריכות לאמת את S על ידי חילוץ D מ-S, חישוב HMAC(HBK, D) והשוואה שלו לערך ב-S כדי לוודא שלא בוצעו שינויים במזהים פרטניים ולא חלו בהם שיבושים. בנוסף, ההטמעות צריכות להשתמש בהשוואות בזמן קבוע לכל רכיבי המזהה ולאימות של S. זמן ההשוואה חייב להיות קבוע, ללא קשר למספר המזהים שסופקו ולהתאמה הנכונה של כל חלק בניסוי.

מזהי חומרה

אימות הזהות תומך במזהי החומרה הבאים:

  1. שם המותג, כפי שמוחזר על ידי Build.BRAND ב-Android
  2. שם המכשיר, כפי שמוחזר על ידי Build.DEVICE ב-Android
  3. שם המוצר, כפי שמוחזר על ידי Build.PRODUCT ב-Android
  4. שם היצרן, כפי שמוחזר על ידי Build.MANUFACTURER ב-Android
  5. שם המודל, כפי שמוחזר על ידי Build.MODEL ב-Android
  6. מספר סידורי
  7. מספרי IMEI של כל מכשירי הרדיו
  8. מספרי MEID של כל מכשירי הרדיו

כדי לתמוך באימות מזהה המכשיר, המכשיר מאמת את המזהים האלה. כל המכשירים עם Android כוללים את ששת השירותים הראשונים, והם נדרשים כדי שהתכונה הזו תפעל. אם למכשיר יש רדיו סלולרי משולב, הוא צריך לתמוך גם באימות של מספרי ה-IMEI ו/או ה-MEID של הרדיו.

כדי לבקש אימות זהות, צריך לבצע אימות מפתח ולכלול בבקשה את מזהי המכשיר שרוצים לאמת. המזהים מתויגים כך:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

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

אם המכשיר לא תומך באימות מזהה (או destroyAttestationIds()היה קודם לכן והמכשיר כבר לא יכול לאמת את המזהים שלו), כל בקשה לאימות מפתח שכוללת תג אחד או יותר מהתגים האלה תיכשל עם ErrorCode::CANNOT_ATTEST_IDS.

אם המכשיר תומך באימות מזהה ואחת מהתגיות שלמעלה או יותר נכללות בבקשה לאימות מפתח, סביבת ה-TEE מאמתת שהמזהה שסופק עם כל אחת מהתגיות תואם לעותק שלה של מזהי החומרה. אם מזהה אחד או יותר לא תואמים, האימות כולו נכשל עם השגיאה ErrorCode::CANNOT_ATTEST_IDS. תקין לספק את אותו תג כמה פעמים. זה יכול להיות שימושי, למשל, כשמאמתים מספרי IMEI: למכשיר יכולים להיות כמה מכשירי רדיו עם כמה מספרי IMEI. בקשת אימות תקפה אם הערך שסופק עם כל ATTESTATION_ID_IMEI תואם לאחד ממכשירי הרדיו של המכשיר. אותו עיקרון חל על כל התגים האחרים.

אם האימות (attestation) מצליח, המזהים שאומתו מתווספים לתוסף האימות (OID 1.3.6.1.4.1.11129.2.1.17) של אישור האימות שהונפק, באמצעות הסכימה שלמעלה. השינויים מסכימת האימות של Keymaster 2 מסומנים בהדגשה, עם הערות.

Java API

הקטע הזה הוא למידע בלבד. מפתחי Keymaster לא מטמיעים את Java API ולא משתמשים בו. המידע הזה מסופק כדי לעזור למפתחים להבין איך האפליקציות משתמשות בתכונה. רכיבי מערכת עשויים להשתמש בו באופן שונה, ולכן חשוב לא להתייחס לקטע הזה כאל קטע נורמטיבי.