Keystore מספק מקום מאובטח יותר ליצירה, לאחסון ולשימוש במפתחות קריפטוגרפיים בצורה מבוקרת. כשזמין אחסון מפתחות שמגובה בחומרה ומשתמשים בו, חומר המפתח מאובטח יותר מפני חילוץ מהמכשיר, ו-KeyMint (לשעבר Keymaster) אוכף הגבלות שקשה לעקוף.
עם זאת, זה נכון רק אם ידוע שהמפתחות מ-Keystore נמצאים באחסון שמגובה בחומרה. ב-Keymaster 1, לא הייתה דרך לאפליקציות או לשרתים מרוחקים לאמת באופן מהימן אם זה המצב. הדמון של Keystore טען את שיטת הפשטת החומרה (HAL) הזמינה של Keymaster, והאמין לכל מה שנאמר ב-HAL לגבי גיבוי חומרה של מפתחות.
כדי לפתור את הבעיה הזו, אימות מפתח הושק ב-Android 7.0 (Keymaster 2), ואימות מזהה הושק ב-Android 8.0 (Keymaster 3).
אימות המפתח נועד לספק דרך לקבוע באופן חד משמעי אם זוג מפתחות אסימטרי מגובה בחומרה, מה המאפיינים של המפתח ואילו מגבלות חלות על השימוש בו.
אימות מזהה מאפשר למכשיר לספק הוכחה למזהי החומרה שלו, כמו מספר סידורי או IMEI.
אימות עם מפתח
כדי לתמוך באימות מפתח, ב-Android 7.0 הוצגו קבוצה של תגים, סוגים ושיטות ל-HAL.
תגים
Tag::ATTESTATION_CHALLENGETag::INCLUDE_UNIQUE_IDTag::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 4 Keymaster גרסה 4.1 100 גרסה 1.0 של KeyMint 200 גרסה 2.0 של KeyMint 300 גרסה 3.0 של KeyMint 400 גרסה 4.0 של KeyMint 500 KeyMint גרסה 5.0 -
attestationSecurityLevel -
רמת האבטחה של המיקום שבו המפתח המאומת מאוחסן.
-
keymasterVersion/keyMintVersion -
הגרסה של KeyMint או של Keymaster HAL
ההטמעה.
ערך הגרסה של KeyMint או Keymaster 2 גרסה 2.0 של Keymaster 3 גרסה 3.0 של Keymaster 4 גרסה 4.0 של Keymaster 41 Keymaster גרסה 4.1 100 גרסה 1.0 של KeyMint 200 גרסה 2.0 של KeyMint 300 גרסה 3.0 של KeyMint 400 גרסה 4.0 של KeyMint 500 KeyMint גרסה 5.0 -
keymasterSecurityLevel/keyMintSecurityLevel - רמת האבטחה של הטמעת KeyMint או Keymaster.
-
attestationChallenge - האתגר שסופק בזמן יצירת המפתח.
-
uniqueId - מזהה מכשיר שרגיש לפרטיות, שאפליקציות מערכת יכולות לבקש בזמן יצירת המפתח. אם לא מתבקש מזהה ייחודי, השדה הזה ריק. פרטים נוספים זמינים בקטע בנושא מזהה ייחודי.
-
softwareEnforced -
רשימת ההרשאות של KeyMint או Keymaster שנאכפת
על ידי מערכת Android. המידע הזה נאסף או נוצר על ידי קוד בפלטפורמה. אפשר לסמוך על המכשיר כל עוד פועלת בו מערכת הפעלה שתואמת למודל האבטחה של פלטפורמת Android (כלומר, תוכנת האתחול של המכשיר נעולה והמכשיר
verifiedBootStateהואVerified). -
hardwareEnforced
- רשימת ההרשאות של KeyMint או Keymaster שנאכפת על ידי סביבת המחשוב האמינה (TEE) או StrongBox של המכשיר. המידע הזה נאסף או נוצר על ידי קוד בחומרה מאובטחת ולא נשלט על ידי הפלטפורמה. לדוגמה, המידע יכול להגיע מתוכנת האתחול או דרך ערוץ תקשורת מאובטח שלא דורש אמון בפלטפורמה.
הערכים של 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.
-
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_EXPONENTauthorization שמשתמש בערך מזהה התג 200. -
mgfDigest -
המאפיין הזה מופיע רק בגרסה של אישור המפתח >= 100.
הערך הזה תואם לתג ההרשאהTag::RSA_OAEP_MGF_DIGESTKeyMint שמשתמש בערך מזהה התג 203. -
rollbackResistance -
המאפיין הזה מופיע רק בגרסה של אישור המפתח שהיא 3 ומעלה.
הערך הזה תואם לתג
Tag::ROLLBACK_RESISTANCEauthorization שמשתמש בערך מזהה התג 303. -
earlyBootOnly -
המאפיין הזה מופיע רק בגרסה של אישור המפתח >= 4.
הערך הזה תואם ל
Tag::EARLY_BOOT_ONLYתג ההרשאה, שמשתמש בערך מזהה התג 305. -
activeDateTime -
תואם לתג ההרשאה
Tag::ACTIVE_DATETIME, שמשתמש בערך מזהה התג 400. -
originationExpireDateTime -
תואם לתג
Tag::ORIGINATION_EXPIRE_DATETIMEauthorization שמשתמש בערך מזהה התג 401. -
usageExpireDateTime -
תואם לתג ההרשאה
Tag::USAGE_EXPIRE_DATETIME, שמשתמש בערך מזהה התג 402. -
usageCountLimit -
תואם לתג ההרשאה
Tag::USAGE_COUNT_LIMIT, שמשתמש בערך מזהה התג 405. -
userSecureId -
תואם לתג ההרשאה
Tag::USER_SECURE_ID, שמשתמש בערך מזהה התג 502. התג הזה אף פעם לא מופיע באישורים. -
noAuthRequired -
הערך הזה תואם לתג ההרשאה
Tag::NO_AUTH_REQUIRED, שמשתמש בערך מזהה התג 503. -
userAuthType -
תואם לתג ההרשאה
Tag::USER_AUTH_TYPE, שמשתמש בערך מזהה התג 504. -
authTimeout -
תואם לתג ההרשאה
Tag::AUTH_TIMEOUT, שמשתמש בערך מזהה התג 505. -
allowWhileOnBody -
הערך הזה תואם ל
Tag::ALLOW_WHILE_ON_BODYauthorization tag, which uses a tag ID value of 506.מאפשרת להשתמש במפתח אחרי שתקופת הזמן הקצוב לתפוגה של האימות שלו מסתיימת, אם המשתמש עדיין עונד את המכשיר על הגוף. שימו לב: חיישן מאובטח שמוצמד לגוף קובע אם המכשיר מחובר לגוף של המשתמש.
-
trustedUserPresenceReq -
המאפיין הזה מופיע רק בגרסה של אישור המפתח שהיא 3 ומעלה.
הערך הזה תואם לתג ההרשאה
Tag::TRUSTED_USER_PRESENCE_REQUIREDשמשתמש בערך מזהה התג 507.המדיניות קובעת שאפשר להשתמש במפתח הזה רק אם המשתמש סיפק הוכחה לנוכחות פיזית. הנה כמה דוגמאות:
- במקרה של מפתח StrongBox, מדובר בלחצן חומרה שמחובר ישירות לפין במכשיר StrongBox.
- במקרה של מפתח TEE, אימות באמצעות טביעת אצבע מספק הוכחה לנוכחות, כל עוד ל-TEE יש שליטה בלעדית בסורק והוא מבצע את תהליך ההתאמה של טביעת האצבע.
-
trustedConfirmationReq -
המאפיין הזה מופיע רק בגרסה של אישור המפתח (key attestation) שהיא 3 ומעלה.
הערך הזה תואם לתג ההרשאה
Tag::TRUSTED_CONFIRMATION_REQUIREDשמשתמש בערך מזהה התג 508.ההגדרה קובעת שאפשר להשתמש במפתח רק אם המשתמש מספק אישור לנתונים שייחתמו באמצעות אסימון אישור. מידע נוסף על קבלת אישור מהמשתמש זמין במאמר בנושא אישור מוגן ב-Android.
הערה: התג הזה רלוונטי רק למפתחות שמשתמשים בייעוד
SIGN. -
unlockedDeviceReq -
המאפיין הזה מופיע רק בגרסה של אישור המפתח שהיא 3 ומעלה.
הערך הזה תואם לתג ההרשאה
Tag::UNLOCKED_DEVICE_REQUIREDשמשתמש בערך מזהה התג 509. -
creationDateTime -
תואם לתג ההרשאה
Tag::CREATION_DATETIME, שמשתמש בערך מזהה התג 701. -
origin -
הערך הזה תואם ל
Tag::ORIGINתג ההרשאה, שמשתמש בערך מזהה התג 702. -
rootOfTrust -
הערך הזה תואם לתג ההרשאה
Tag::ROOT_OF_TRUST, שמשתמש בערך מזהה התג 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_IDauthorization, שמשתמש בערך מזהה התג 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_MANUFACTURERauthorization, שמשתמש בערך מזהה תג של 716. -
attestationIdModel -
הפרמטר הזה מופיע רק בגרסאות מרכזיות של אימות המכשיר >= 2.
הערך הזה תואם ל
Tag::ATTESTATION_ID_MODELתג ההרשאה, שמשתמש בערך מזהה תג 717. -
vendorPatchLevel -
הפרמטר הזה מופיע רק בגרסאות מרכזיות של אימות המכשיר (Attestation) >= 3.
הערך הזה תואם לתג ההרשאה
Tag::VENDOR_PATCHLEVELשמשתמש בערך מזהה התג 718.המדיניות הזו מציינת את רמת תיקוני האבטחה של תמונת הספק שצריך להתקין במכשיר כדי שאפשר יהיה להשתמש במפתח הזה. הערך הוא מספר שלם שנוצר על ידי לקיחת רמת תיקון האבטחה והסרת המקפים. לדוגמה, אם נוצר מפתח במכשיר Android עם תיקון האבטחה של הספק מ-2018-08-05, הערך יהיה 20180805.
-
bootPatchLevel -
הפרמטר הזה מופיע רק בגרסאות מרכזיות של אימות המכשיר (Attestation) >= 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 שמוגן על ידי חומרה, וממשיכה אל Bootloader וכל המחיצות שאומתו על ידי Verified Boot.
במצב הזה, השדה 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)
? 6 : bool, ; is lost device
}
המפה לא כוללת גרסאות, ויכול להיות שיוספו אליה שדות אופציונליים חדשים.
-
certs_issued -
מספר משוער של אישורים שהונפקו למכשיר ב-30 הימים האחרונים. אפשר להשתמש בערך הזה כסימן לניצול לרעה פוטנציאלי אם הערך גדול מהממוצע בכמה סדרי גודל.
-
validated_attested_entity -
מחרוזת שמציינת את המקור המאושר של המפתח המאומת, שאושר ישירות על ידי יצרן ערכת השבבים. לדוגמה,
STRONG_BOXאוTEE.
-
is_lost_device -
ערך בוליאני שמציין אם המכשיר דווח כמכשיר שאבד. אם המדיניות קיימת ומוגדרת כ-True, האישור הוקצה למכשיר שכרגע מסומן כמכשיר שאבד.
מפתחות אימות
שני מפתחות, אחד RSA ואחד ECDSA, ושרשראות האישורים התואמות, מוקצים למכשיר בצורה מאובטחת.
ב-Android 12 מוצגת הקצאת הרשאות למפתחות מרחוק. התכונה הזו מספקת למכשירים בשטח אישורי אימות ECDSA P-256 לכל אפליקציה, שתוקפם קצר יותר מאשר אישורים שסופקו במפעל.
מזהה ייחודי
המזהה הייחודי הוא ערך של 128 ביט שמזהה את המכשיר, אבל רק לתקופה מוגבלת. הערך מחושב באמצעות:
HMAC_SHA256(T || C || R, HBK)
כאשר:
-
Tהוא 'ערך מונה זמני', שמחושב על ידי חלוקת הערך שלTag::CREATION_DATETIMEב-2,592,000,000, והתעלמות מכל שארית. הערך של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הוא סוד ייחודי שקשור לחומרה, שסביבת המחשוב האמינה מכירה אותו ואף פעם לא חושפת אותו. הסוד מכיל לפחות 128 ביטים של אנטרופיה והוא ייחודי למכשיר הספציפי (ייחודיות הסתברותית מקובלת בהינתן 128 הביטים של האנטרופיה). מפתח ה-HBK צריך להיות נגזר מחומר מפתח מאוחד באמצעות HMAC או AES_CMAC.
חיתוך של פלט HMAC_SHA256 ל-128 ביט.
מספרי IMEI מרובים
ב-Android 14 נוספה תמיכה בכמה מספרי IMEI ברשומה של אימות המפתח ב-Android. יצרני ציוד מקורי (OEM) יכולים להטמיע את התכונה הזו על ידי הוספת תג 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. זמן ההשוואה חייב להיות קבוע, ללא קשר למספר המזהים שסופקו ולהתאמה הנכונה של כל חלק בניסוי.
מזהי חומרה
אימות הזהות תומך במזהי החומרה הבאים:
- שם המותג, כפי שמוחזר על ידי
Build.BRANDב-Android - שם המכשיר, כפי שמוחזר על ידי
Build.DEVICEב-Android - שם המוצר, כפי שמוחזר על ידי
Build.PRODUCTב-Android - שם היצרן, כפי שמוחזר על ידי
Build.MANUFACTURERב-Android - שם המודל, כפי שמוחזר על ידי
Build.MODELב-Android - מספר סידורי
- מספרי ה-IMEI של כל מכשירי הרדיו
- מספרי MEID של כל מכשירי הרדיו
כדי לתמוך באימות מזהה המכשיר, המכשיר מאמת את המזהים האלה. כל המכשירים עם Android כוללים את ששת השירותים הראשונים, והם נדרשים כדי שהתכונה הזו תפעל. אם למכשיר יש רדיו סלולרי משולב, הוא צריך לתמוך גם באימות של מספרי ה-IMEI ו/או ה-MEID של הרדיו.
כדי לבקש אימות זהות, צריך לבצע אימות מפתח ולכלול בבקשה את מזהי המכשיר שרוצים לאמת. המזהים מתויגים כך:
ATTESTATION_ID_BRANDATTESTATION_ID_DEVICEATTESTATION_ID_PRODUCTATTESTATION_ID_MANUFACTURERATTESTATION_ID_MODELATTESTATION_ID_SERIALATTESTATION_ID_IMEIATTESTATION_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 ולא משתמשים בו. המידע הזה מסופק כדי לעזור למפתחים להבין איך האפליקציות משתמשות בתכונה. יכול להיות שרכיבי המערכת ישתמשו בו באופן שונה, ולכן חשוב לא להתייחס לקטע הזה כאל קטע נורמטיבי.