Atestacja klucza i identyfikatora

Keystore to bezpieczniejsze miejsce do tworzenia, przechowywania i używania kluczy kryptograficznych w kontrolowany sposób. Gdy dostępne jest miejsce na klucze obsługiwane sprzętowo i jest ono używane, materiały klucza są lepiej chronione przed wydobyciem z urządzenia, a Keymaster nakłada ograniczenia, które trudno jest obejść.

Jest to jednak możliwe tylko wtedy, gdy wiadomo, że klucze magazynu kluczy są przechowywane w pamięci obsługiwanej przez sprzęt. W Keymaster 1 aplikacje ani serwery zdalne nie miały możliwości dokładnego sprawdzenia, czy tak jest. Demon klucza załadował dostępne interfejsy HAL klucza głównego i uwierzył w to, cokolwiek powiedział interfejs HAL na temat sprzętowego zabezpieczenia kluczy.

Aby rozwiązać ten problem, wprowadziliśmy weryfikację klucza w Androidzie 7.0 (Keymaster 2) oraz weryfikację tożsamości w Androidzie 8.0 (Keymaster 3).

Potwierdzenie klucza ma na celu zapewnienie możliwości dokładnego określenia, czy para kluczy asymetrycznych jest obsługiwana przez sprzęt, jakie są właściwości klucza i jakie ograniczenia dotyczą jego użycia.

Potwierdzenie tożsamości umożliwia urządzeniu przedstawienie dowodu tożsamości identyfikatorów sprzętowych, takich jak numer seryjny lub IMEI.

Atestacja klucza

Aby obsługiwać uwierzytelnianie klucza, w Androidzie 7.0 wprowadzono do HAL zestaw tagów, typów i metod.

Tagi

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

Typ

Keymaster 2 i starsze

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

AttestKey metoda

Keymaster 3

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

Keymaster 2 i starsze

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 to struktura urządzenia Keymaster.
  • keyToAttest to klucz blob zwracany przez generateKey, dla którego tworzone jest zaświadczenie.
  • attestParams to lista parametrów niezbędnych do uwierzytelnienia. Obejmuje to Tag::ATTESTATION_CHALLENGE i opcjonalnie Tag::RESET_SINCE_ID_ROTATION, a także Tag::APPLICATION_IDTag::APPLICATION_DATA. Te 2 ostatnie są potrzebne do odszyfrowania klucza blob, jeśli zostały określone podczas generowania klucza.
  • certChain to parametr wyjściowy, który zwraca tablicę certyfikatów. Wpis 0 to certyfikat atestacji, czyli certyfikat klucza z keyToAttest, który zawiera rozszerzenie atestacji.

Metoda attestKey jest uważana za operację klucza publicznego na zatwierdzonym kluczu, ponieważ można ją wywołać w dowolnym momencie i nie musi spełniać ograniczeń autoryzacji. Jeśli na przykład uwierzytelniony klucz wymaga uwierzytelnienia użytkownika, aby można było go użyć, uwierzytelnienie może zostać wygenerowane bez uwierzytelnienia użytkownika.

certyfikat atestacji,

Certyfikat poświadczenia to standardowy certyfikat X.509 z opcjonalnym rozszerzeniem poświadczenia, które zawiera opis poświadczonego klucza. Certyfikat jest podpisany za pomocą certyfikowanego klucza uwierzytelniania. Klucz weryfikacji może używać innego algorytmu niż klucz weryfikowany.

Certyfikat zawiera pola widoczne w tabeli poniżej i nie może zawierać żadnych dodatkowych pól. Niektóre pola określają stałą wartość pola. Testy CTS sprawdzają, czy treść certyfikatu jest dokładnie taka, jak określono.

KOLEJNOŚĆ certyfikatów

Nazwa pola (patrz RFC 5280) Wartość
tbsCertificate TBSCertificate SEQUENCE
signatureAlgorithm AlgorithmIdentyfikator algorytmu użytego do podpisania klucza:
ECDSA w przypadku kluczy EC, RSA w przypadku kluczy RSA.
signatureValue BIT STRING, podpis wygenerowany na podstawie certyfikatu tbsCertificate z kodowaniem DER ASN.1.

TBSCertificate SEQUENCE

Nazwa pola (patrz RFC 5280) Wartość
version INTEGER 2 (oznacza certyfikat w wersji 3)
serialNumber INTEGER 1 (wartość stała: taka sama w wszystkich certyfikatach)
signature AlgorithmIdentyfikator algorytmu używanego do podpisywania klucza: ECDSA w przypadku kluczy EC, RSA w przypadku kluczy RSA.
issuer Taki sam jak pole tematu klucza atesta personalizacji zbiorczej.
validity SEKWENCJA 2 danych, zawierająca wartości atrybutów Tag::ACTIVE_DATETIME i Tag::USAGE_EXPIRE_DATETIME. Wartości są podawane w milisekundach od 1 stycznia 1970 r. Informacje o poprawnym formatowaniu dat w certyfikatach znajdziesz w dokumentie RFC 5280.
Jeśli element Tag::ACTIVE_DATETIME nie jest obecny, użyj wartości elementu Tag::CREATION_DATETIME. Jeśli elementTag::USAGE_EXPIRE_DATETIME jest nieobecny, użyj daty wygaśnięcia certyfikatu klucza weryfikacji zbiorczej.
subject CN = „Android Keystore Key” (wartość stała: taka sama dla wszystkich certyfikatów)
subjectPublicKeyInfo SubjectPublicKeyInfo zawierający potwierdzony klucz publiczny.
extensions/Key Usage digitalSignature: ustawia, czy klucz ma cel KeyPurpose::SIGN czy KeyPurpose::VERIFY. Pozostałe bity są puste.
extensions/CRL Distribution Points Wartość – TBD
extensions/"attestation" OID to 1.3.6.1.4.1.11129.2.1.17; treść jest zdefiniowana w sekcji Rozszerzenie certyfikatu poniżej. Podobnie jak w przypadku wszystkich rozszerzeń certyfikatu X.509, zawartość jest reprezentowana jako ciąg znaków OCTET_STRING zawierający kodowanie DER sekwencji atesta.

Rozszerzenie atestacji

Rozszerzenie attestation ma identyfikator OID 1.3.6.1.4.1.11129.2.1.17. Zawiera informacje o weryfikowanej parze kluczy oraz o stanie urządzenia w momencie generowania klucza.

Typy tagów Keymaster/KeyMint zdefiniowane w specyfikacji interfejsu AIDL są tłumaczone na typy ASN.1 w następujący sposób:

Typ Keymaster/KeyMint Typ ASN.1 Uwagi
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Milisekundy od 1 stycznia 1970 r., 00:00:00 GMT.
BOOL NULL Obecność tagu oznacza wartość true, a brak – false.
BIGNUM Żaden tag nie ma tego typu, więc nie ma zdefiniowanego mapowania.
BYTES OCTET_STRING

Schemat

Treść rozszerzenia atesta jest opisana za pomocą tego schematu ASN.1:

Wersja 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

Wersja 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

Wersja 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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),
}

Wersja 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT 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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] 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),
}

Wersja 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] 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),
}

Wersja 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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),
}

Wersja 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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),
}

Pola KeyDescription

attestationVersion
Wersja schematu ASN.1.
WartośćWersja Keymaster/KeyMint
1Keymaster w wersji 2.0
2Keymaster w wersji 3.0
3Keymaster w wersji 4.0
4Keymaster w wersji 4.1
100KeyMint w wersji 1.0
200KeyMint w wersji 2.0
300KeyMint w wersji 3.0
attestationSecurityLevel

Poziom zabezpieczeń lokalizacji, w której przechowywany jest poświadczony klucz.

keymasterVersion/keyMintVersion
Wersja implementacji warstwy abstrakcji sprzętowej (HAL) Keymastera/KeyMinta.
WartośćWersja Keymaster/KeyMint
2Keymaster w wersji 2.0
3Keymaster w wersji 3.0
4Keymaster w wersji 4.0
41Keymaster w wersji 4.1
100KeyMint w wersji 1.0
200KeyMint w wersji 2.0
300KeyMint w wersji 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Poziom bezpieczeństwa wdrożenia Keymaster/KeyMint.
attestationChallenge
Wyzwanie podane w momencie generowania klucza.
uniqueId
Identyfikator urządzenia uwzględniający prywatność, którego aplikacje systemowe mogą używać w momencie generowania kluczy. Jeśli nie jest wymagany identyfikator, to pole jest puste. Szczegółowe informacje znajdziesz w sekcji Unikalny identyfikator.
softwareEnforced
Kluczmaster/KeyMint Lista autoryzacji, która jest egzekwowana przez system Android. Te informacje są zbierane lub generowane przez kod na platformie i przechowywane na partycji systemowej urządzenia. Urządzenie może być zaufane, o ile działa na nim system operacyjny zgodny z modelem zabezpieczeń platformy Android (czyli program rozruchowy urządzenia jest zablokowany, a verifiedBootState jestVerified).
hardwareEnforced
Lista autoryzowanych kluczy Keymaster/KeyMint, która jest egzekwowana przez zaufane środowisko wykonawcze (TEE) lub StrongBox urządzenia. Te informacje są zbierane lub generowane przez kod na bezpiecznym sprzęcie i nie są kontrolowane przez platformę. Informacje mogą na przykład pochodzić z programu rozruchowego lub z bezpiecznego kanału komunikacji, który nie wymaga zaufania do platformy.

Wartości SecurityLevel

Wartość SecurityLevel wskazuje, w jakim stopniu element związany z Keystore (np. para kluczy i poświadczenie) jest odporny na ataki.

Wartość Znaczenie
Software Bezpieczne, o ile system Androida na urządzeniu jest zgodny z modelem zabezpieczeń platformy Android (czyli program rozruchowy urządzenia jest zablokowany, a verifiedBootStateVerified).
TrustedEnvironment Bezpieczeństwo jest zapewnione, o ile zaufane środowisko wykonawcze (TEE) nie zostanie naruszone. Wymagania dotyczące izolacji TEE są zdefiniowane w sekcjach 9.11 [C-1-1] do [C-1-4] dokumentu definicji zgodności Androida. TEE są wysoce odporne na zdalne naruszenie zabezpieczeń i umiarkowanie odporne na naruszenie zabezpieczeń przez bezpośredni atak sprzętowy.
StrongBox Bezpieczne, o ile StrongBox nie zostanie naruszone. StrongBox jest implementowany w elementach zabezpieczeń podobnych do sprzętowego modułu zabezpieczeń. Wymagania dotyczące implementacji StrongBox są określone w sekcji 9.11.2 dokumentu definicji zgodności Androida. StrongBox jest bardzo odporny na zdalne naruszenie zabezpieczeń i bezpośrednie ataki sprzętowe (np. manipulację fizyczną i ataki kanału bocznego).

Pola AuthorizationList

Każde pole odpowiada tagowi autoryzacji Keymaster lub KeyMint z specyfikacji interfejsu AIDL. Specyfikacja jest źródłem informacji o tagach autoryzacji: ich znaczeniu, formacie zawartości, oczekiwanym miejscu wyświetlania w polach softwareEnforced lub hardwareEnforced obiektu KeyDescription, wzajemnym wykluczaniu się z innymi tagami itp. Wszystkie pola AuthorizationList są opcjonalne.

Każde pole ma tag EXPLICIT, który jest tagiem kontekstowym o wartości odpowiadającej numerowi tagu Keymaster/KeyMint. Umożliwia to bardziej zwartą reprezentację danych w AuthorizationList. Dlatego parsujący ASN.1 musi znać oczekiwany typ danych dla każdego tagu kontekstowego. Na przykład: Tag::USER_AUTH_TYPE jest zdefiniowana jako ENUM | 504. W schemacie rozszerzenia potwierdzenia pole purpose w AuthorizationList jest określone jako userAuthType [504] EXPLICIT INTEGER OPTIONAL. Jego kodowanie ASN.1 będzie więc zawierać tag kontekstowy 504 zamiast tagu klasy UNIVERSAL dla typu ASN.1 INTEGER, który jest 10.

purpose
Zgodnie z tagiem autoryzacji Tag::PURPOSE, który używa wartości identyfikatora tagu 1.
algorithm

Odpowiada tagowi autoryzacji Tag::ALGORITHM, który używa wartości identyfikatora tagu 2.

W obiekcie weryfikacji AuthorizationList wartość algorytmu jest zawsze RSA lub EC.

keySize
Zgodnie z tagiem autoryzacji Tag::KEY_SIZE, który używa wartości identyfikatora tagu 3.
digest
Zgodny z tagiem autoryzacji Tag::DIGEST, który używa wartości identyfikatora tagu 5.
padding
Zgodnie z  Tag::PADDINGtagiem autoryzacji, który używa wartości identyfikatora 6.
ecCurve

Odpowiada tagowi autoryzacji Tag::EC_CURVE, który używa wartości identyfikatora tagu 10.

Zbiór parametrów służących do generowania pary kluczy krzywej eliptycznej (EC), która używa ECDSA do podpisywania i weryfikacji w systemowym magazynie kluczy Androida.

rsaPublicExponent
Zgodnie z tagiem autoryzacji Tag::RSA_PUBLIC_EXPONENT, który używa wartości identyfikatora tagu 200.
mgfDigest

Występuje tylko w wersji atesta klucza >= 100.

Odpowiada tagowi autoryzacji Tag::RSA_OAEP_MGF_DIGEST KeyMint, który używa wartości identyfikatora tagu 203.
rollbackResistance

Dostępne tylko w wersji weryfikacji klucza co najmniej 3.

Odpowiada tagowi autoryzacji Tag::ROLLBACK_RESISTANCE, który używa wartości identyfikatora tagu 303.

earlyBootOnly

Dostępne tylko w wersji weryfikacji klucza >= 4.

Odpowiada tagowi autoryzacji Tag::EARLY_BOOT_ONLY, który używa wartości identyfikatora tagu 305.

activeDateTime
Zgodnie z  Tag::ACTIVE_DATETIMEtagiem autoryzacji, który używa wartości identyfikatora tagu 400.
originationExpireDateTime
Zgodnie z  Tag::ORIGINATION_EXPIRE_DATETIMEtagiem autoryzacji Keymaster, który używa wartości identyfikatora tagu 401.
usageExpireDateTime
Zgodnie z tagiem autoryzacji Tag::USAGE_EXPIRE_DATETIME, który używa wartości identyfikatora tagu 402.
usageCountLimit
Zgodny z tagiem autoryzacji Tag::USAGE_COUNT_LIMIT, który używa wartości identyfikatora tagu 405.
noAuthRequired

Odpowiada tagowi autoryzacji Tag::NO_AUTH_REQUIRED, który używa wartości identyfikatora tagu 503.

userAuthType
Zgodny z tagiem autoryzacji Tag::USER_AUTH_TYPE, który używa wartości identyfikatora tagu 504.
authTimeout
Zgodny z tagiem autoryzacji Tag::AUTH_TIMEOUT, który używa wartości identyfikatora tagu 505.
allowWhileOnBody

Odpowiada tagowi autoryzacji Tag::ALLOW_WHILE_ON_BODY, który używa wartości identyfikatora tagu 506.

Umożliwia używanie klucza po upływie czasu oczekiwania na uwierzytelnienie, jeśli użytkownik nadal nosi urządzenie na ciele. Pamiętaj, że czujnik na ciele użytkownika określa, czy urządzenie jest noszone na ciele użytkownika.

trustedUserPresenceRequired

Dostępne tylko w wersji weryfikacji klucza co najmniej 3.

Odpowiada tagowi autoryzacji Tag::TRUSTED_USER_PRESENCE_REQUIRED, który używa wartości identyfikatora tagu 507.

Określa, że klucz można używać tylko wtedy, gdy użytkownik przedstawił dowód swojej fizycznej obecności. Oto kilka przykładów:

  • W przypadku klucza StrongBox przycisk sprzętowy podłączony bezpośrednio do pinu na urządzeniu StrongBox.
  • W przypadku klucza TEE uwierzytelnianie odciskiem palca zapewnia dowód obecności, o ile TEE ma wyłączną kontrolę nad skanerem i wykonuje proces dopasowywania odcisków palców.
trustedConfirmationRequired

Dostępne tylko w wersji weryfikacji klucza co najmniej 3.

Odpowiada tagowi autoryzacji Tag::TRUSTED_CONFIRMATION_REQUIRED, który używa wartości identyfikatora tagu 508.

Określa, że klucz jest dostępny tylko wtedy, gdy użytkownik potwierdzi dane, które mają zostać podpisane za pomocą tokena zatwierdzenia. Więcej informacji o tym, jak uzyskać potwierdzenie od użytkownika, znajdziesz w artykule Potwierdzanie za pomocą Androida: informacje chronione.

Uwaga: ten tag dotyczy tylko kluczy, które używają celu SIGN.

unlockedDeviceRequired

Dostępne tylko w wersji weryfikacji klucza co najmniej 3.

Odpowiada tagowi autoryzacji Tag::UNLOCKED_DEVICE_REQUIRED, który używa wartości identyfikatora tagu 509.

allApplications

Odpowiada tagowi autoryzacji Tag::ALL_APPLICATIONS, który używa wartości identyfikatora tagu 600.

Wskazuje, czy wszystkie aplikacje na urządzeniu mają dostęp do pary kluczy.

applicationId
Zgodna z tagiem autoryzacji Tag::APPLICATION_ID, który używa wartości identyfikatora tagu 601.
creationDateTime
Zgodnie z  Tag::CREATION_DATETIMEtagiem autoryzacji, który używa wartości identyfikatora tagu 701.
origin

Odpowiada tagowi autoryzacji Tag::ORIGIN, który używa wartości identyfikatora 702.

rollbackResistant

Dostępne tylko w wersjach atestacji klucza 1 i 2.

Odpowiada tagowi autoryzacji Tag::ROLLBACK_RESISTANT, który używa wartości identyfikatora tagu 703.

rootOfTrust

Odpowiada tagowi autoryzacji Tag::ROOT_OF_TRUST, który używa wartości identyfikatora tagu 704.

Więcej informacji znajdziesz w sekcji opisującej strukturę danych RootOfTrust.

osVersion

Odpowiada tagowi autoryzacji Tag::OS_VERSION, który używa wartości identyfikatora tagu 705.

Wersja systemu operacyjnego Android powiązana z Keymaster, podana jako sześciocyfrowa liczba całkowita. Na przykład wersja 8.1.0 jest reprezentowana jako 080100.

Tę wartość na liście autoryzacji uwzględnia tylko Keymaster w wersji 1.0 lub nowszej.

osPatchLevel

Odpowiada tagowi autoryzacji Tag::PATCHLEVEL, który używa wartości identyfikatora tagu 706.

Miesiąc i rok powiązane z używanym w Keymasterze poprawką bezpieczeństwa, podany jako sześciocyfrowa liczba całkowita. Na przykład poprawka z sierpnia 2018 r. ma postać 201808.

Tę wartość na liście autoryzacji uwzględnia tylko Keymaster w wersji 1.0 lub nowszej.

attestationApplicationId

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi autoryzacji Keymaster Tag::ATTESTATION_APPLICATION_ID, który używa wartości identyfikatora tagu 709.

Więcej informacji znajdziesz w sekcji opisującej strukturę danych AttestationApplicationId.

attestationIdBrand

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi Keymaster ( Tag::ATTESTATION_ID_BRAND), który używa wartości identyfikatora 710.

attestationIdDevice

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi Keymaster Tag::ATTESTATION_ID_DEVICE, który używa wartości identyfikatora 711.

attestationIdProduct

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi Keymaster ( Tag::ATTESTATION_ID_PRODUCT), który używa wartości identyfikatora 712.

attestationIdSerial

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi Keymaster ( Tag::ATTESTATION_ID_SERIAL), który używa wartości identyfikatora 713.

attestationIdImei

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_IMEI, który używa wartości identyfikatora tagu 714.

attestationIdMeid

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_MEID, który używa wartości identyfikatora tagu 715.

attestationIdManufacturer

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_MANUFACTURER, który używa wartości identyfikatora tagu 716.

attestationIdModel

Występuje tylko w wersjach weryfikacji klucza ≥2.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_MODEL, który używa wartości identyfikatora tagu 717.

vendorPatchLevel

Dostępne tylko w wersjach weryfikacji klucza >= 3.

Odpowiada tagowi autoryzacji Tag::VENDOR_PATCHLEVEL, który używa wartości identyfikatora tagu 718.

Określa poziom zabezpieczeń obrazu dostawcy, który musi być zainstalowany na urządzeniu, aby można było używać tego klucza. Wartość jest wyświetlana w formie RRRRMMDD, co oznacza datę poprawki zabezpieczeń wprowadzonej przez dostawcę. Jeśli na przykład klucz został wygenerowany na urządzeniu z Androidem z zainstalowaną poprawką bezpieczeństwa od dostawcy z 1 sierpnia 2018 r., jego wartość będzie wynosić 20180801.

bootPatchLevel

Dostępne tylko w wersjach weryfikacji klucza >= 3.

Odpowiada tagowi autoryzacji Tag::BOOT_PATCHLEVEL, który używa wartości identyfikatora tagu 719.

Określa poziom zabezpieczeń obrazu jądra, który musi być zainstalowany na urządzeniu, aby można było używać tego klucza. Wartość jest wyświetlana w formacie RRRRMMDD, który oznacza datę poprawki zabezpieczeń systemu. Jeśli na przykład klucz został wygenerowany na urządzeniu z Androidem z zainstalowaną poprawką bezpieczeństwa z 5 sierpnia 2018 r., jego wartość będzie wynosić 20180805.

deviceUniqueAttestation

Dostępne tylko w wersjach weryfikacji klucza >= 4.

Odpowiada tagowi autoryzacji Tag::DEVICE_UNIQUE_ATTESTATION, który używa wartości identyfikatora tagu 720.

attestationIdSecondImei

Występuje tylko w wersjach klucza z atestatem większym niż 300.

Odpowiada tagowi autoryzacji Tag::ATTESTATION_ID_SECOND_IMEI, który używa wartości identyfikatora tagu 723.

Pola RootOfTrust

verifiedBootKey
Bezpieczny skrót klucza publicznego służący do weryfikacji integralności i autentyczności całego kodu, który jest wykonywany podczas uruchamiania urządzenia w ramach zaufanej kontroli startowej. Zalecamy użycie SHA-256.
deviceLocked
Czy program rozruchowy urządzenia jest zablokowany. true oznacza, że urządzenie uruchomiło podpisany obraz, który został zweryfikowany przez weryfikację podczas uruchamiania.
verifiedBootState
Stan weryfikacji podczas uruchamiania urządzenia.
verifiedBootHash
Podsumowanie wszystkich danych chronionych przez weryfikację podczas uruchamiania. W przypadku urządzeń korzystających z implementacji referencyjnej Android Verified Boot to pole zawiera skrót VBMeta.

Wartości VerifiedBootState

Wartość Odpowiadający stan uruchamiania Znaczenie
Verified GREEN Pełny łańcuch zaufania rozciąga się od chronionego sprzętowo korzenia zaufania do programu rozruchowego i wszystkich partycji zweryfikowanych przez zaufany rozruch. W tym stanie pole verifiedBootKey zawiera ciąg bajtów osadzonego zaufanego korzenia, czyli certyfikatu osadzonego w ROM urządzenia przez producenta urządzenia na etapie fabrycznym.
SelfSigned YELLOW To samo co Verified, z tym że weryfikacja została przeprowadzona za pomocą zaufania skojarzonego z rootem zaufania skonfigurowanym przez użytkownika zamiast za pomocą zaszytego fabrycznie zaufania skojarzonego z rootem zaufania. W tym stanie pole verifiedBootKey zawiera hasz klucza publicznego skonfigurowanego przez użytkownika.
Unverified ORANGE Program rozruchowy urządzenia jest odblokowany, więc nie można utworzyć łańcucha zaufania. Urządzenie może być dowolnie modyfikowane, dlatego integralność urządzenia musi być weryfikowana przez użytkownika poza pasmem. W tym stanie pole verifiedBootKey zawiera 32 bajty zerami.
Failed RED Urządzenie nie przeszło weryfikacji. W obecnej chwili nie ma gwarancji co do zawartości innych pól RootOfTrust.

AttestationApplicationId

To pole odzwierciedla opinię platformy Androida na temat tego, które aplikacje mogą używać tajnego klucza w ramach uwierzytelnienia. Może zawierać wiele pakietów, jeśli tylko mają one ten sam identyfikator UID. Pole AttestationApplicationIdAuthorizationList ma typ OCTET_STRING i jest sformatowane zgodnie z tym schematem 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
Zbiór obiektów AttestationPackageInfo, z których każdy zawiera nazwę i numer wersji pakietu.
signature_digests

Zestaw skrótów SHA-256 certyfikatów podpisywania aplikacji. Aplikacja może mieć wiele łańcuchów certyfikatów klucza podpisywania. W przypadku każdego z nich certyfikat „liścia” jest przetwarzany i umieszczany w polu signature_digests. Nazwa pola jest myląca, ponieważ przetworzone dane to certyfikaty podpisu aplikacji, a nie podpisy aplikacji, ponieważ nazwa pochodzi od klasy Signaturezwracanej przez wywołanie funkcji getPackageInfo(). Ten fragment kodu pokazuje przykładowy zestaw:

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

Unikalny identyfikator

Unikalny identyfikator to 128-bitowa wartość, która identyfikuje urządzenie, ale tylko przez ograniczony czas. Wartość jest obliczana na podstawie:

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

Gdzie:

  • T to „wartość licznika czasowego”, obliczona przez podzielenie wartości Tag::CREATION_DATETIME przez 2592000000, z pominięciem reszty. Wartość T zmienia się co 30 dni (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C to wartość Tag::APPLICATION_ID
  • R ma wartość 1, jeśli w parametry attest_params wywołania attest_key podany jest parametr Tag::RESET_SINCE_ID_ROTATION, lub 0, jeśli go nie ma.
  • HBK to unikalny, powiązany ze sprzętem sekret znany zaufanemu środowisku wykonawczemu, który nigdy nie jest przez nie ujawniany. Obiekt tajny zawiera co najmniej 128 bitów entropii i jest unikalny dla danego urządzenia (przy 128 bitach entropii dopuszczalna jest unikalność probabilistyczna). Klucz HBK powinien być wyprowadzony z połączonego klucza za pomocą funkcji HMAC lub AES_CMAC.

Obcinanie danych wyjściowych HMAC_SHA256 do 128 bitów.

Klucze i certyfikaty uwierzytelniania

Na urządzeniu są bezpiecznie udostępniane 2 klucze (jeden RSA i jeden ECDSA) oraz odpowiadające im łańcuchy certyfikatów.

Android 12 wprowadza zdalne udostępnianie kluczy, a Android 13 wymaga jego implementacji na urządzeniach. Zdalne udostępnianie kluczy zapewnia urządzeniom w polu certyfikaty weryfikacyjne ECDSA P256 dla każdej aplikacji. Ich ważność jest krótsza niż w przypadku certyfikatów udostępnionych fabrycznie.

Wiele numerów IMEI

Android 14 umożliwia obsługę wielu numerów IMEI w rekordzie atestacyjnym klucza Androida. Producenci OEM mogą wdrożyć tę funkcję, dodając tag KeyMint dla drugiego identyfikatora IMEI. Coraz częściej urządzenia mają kilka modułów radiowych sieci komórkowych, a producenci urządzeń OEM mogą teraz obsługiwać urządzenia z 2 numerami IMEI.

Producenci OEM muszą mieć drugi numer IMEI, jeśli jest obecny na ich urządzeniach, aby udostępnić go implementacjom KeyMint, aby te implementacje mogły go potwierdzić w taki sam sposób jak pierwszy numer IMEI.

Rozszerzenie informacji o obsłudze administracyjnej

Rozszerzenie informacji o obsługiwaniu administracyjnym ma identyfikator 1.3.6.1.4.1.11129.2.1.30. Rozszerzenie zawiera informacje o urządzeniu znane serwerowi do obsługi administracyjnej.

Schemat

Rozszerzenie jest zgodne z tym schematem CDDL:

  {
        1 : int,   ; certificates issued
  }

Mapa nie jest wersjonowana i można dodawać do niej nowe pola opcjonalne.

certs_issued

przybliżoną liczbę certyfikatów wydanych na urządzenie w ciągu ostatnich 30 dni. Ta wartość może być sygnałem potencjalnego nadużycia, jeśli jest większa od średniej o kilka rzędów wielkości.

Potwierdzenie tożsamości

Android 8.0 zawiera opcjonalną obsługę uwierzytelniania tożsamości na urządzeniach z Keymaster 3. Potwierdzenie tożsamości umożliwia urządzeniu przedstawienie dowodu tożsamości sprzętowej, takiego jak numer seryjny lub IMEI. Chociaż jest to funkcja opcjonalna, zalecamy, aby wszystkie implementacje Keymaster 3 ją obsługiwały, ponieważ możliwość potwierdzenia tożsamości urządzenia umożliwia stosowanie takich rozwiązań jak prawdziwa konfiguracja zdalna bezdotykowa z większym bezpieczeństwem (ponieważ strona zdalna może mieć pewność, że komunikuje się z odpowiednim urządzeniem, a nie z urządzeniem podszywającym się pod to urządzenie).

Poświadczenie tożsamości działa poprzez tworzenie kopii identyfikatorów sprzętowych urządzenia, do których dostęp ma tylko Trusted Execution Environment (TEE) przed opuszczeniem fabryki. Użytkownik może odblokować bootloader urządzenia i zmienić oprogramowanie systemowe oraz identyfikatory zgłaszane przez frameworki Androida. Kopie identyfikatorów przechowywanych przez TEE nie mogą być w ten sposób modyfikowane, co gwarantuje, że poświadczenie tożsamości identyfikatora urządzenia odnosi się tylko do oryginalnych identyfikatorów sprzętowych urządzenia, uniemożliwiając w ten sposób próby podszywania się pod inne urządzenia.

Główna interfejs API do weryfikacji tożsamości opiera się na istniejącym mechanizmie weryfikacji klucza wprowadzonym w Keymaster 2. Gdy żądanie certyfikatu atestatycznego dla klucza przechowywanego przez właściciela klucza, dzwoniący może poprosić o uwzględnienie identyfikatorów sprzętowych urządzenia w metadanych certyfikatu atestatycznego. Jeśli klucz jest przechowywany w TEE, certyfikat jest powiązany z znanym głównym urzędem zaufania. Odbiorca takiego certyfikatu może zweryfikować, czy certyfikat i jego zawartość, w tym identyfikatory sprzętowe, zostały zapisane przez TEE. Gdy poprosisz o uwzględnienie identyfikatorów sprzętowych w certyfikacie, TEE potwierdza tylko te identyfikatory, które są przechowywane w magazynie, zgodnie z danymi wypełnionymi na hali produkcyjnej.

Właściwości miejsca na dane

Pamięć, w której przechowywane są identyfikatory urządzenia, musi mieć te właściwości:

  • Wartości pochodzące z pierwotnych identyfikatorów urządzenia są kopiowane do pamięci przed opuszczeniem przez urządzenie fabryki.
  • Metoda destroyAttestationIds() może trwale usunąć tę kopię danych pochodzących z identyfikatora. Oznacza to, że dane zostaną całkowicie usunięte, więc nie można ich przywrócić ani przywracając urządzenie do ustawień fabrycznych, ani wykonując inną procedurę. Jest to szczególnie ważne w przypadku urządzeń, na których użytkownik odblokował bootloader, zmienił oprogramowanie systemowe i zmodyfikował identyfikatory zwracane przez frameworki Androida.
  • Obiekty RMA powinny mieć możliwość generowania nowych kopii danych pochodzących z identyfikatora sprzętu. Dzięki temu urządzenie, które przeszło przez RMA, może ponownie wykonać weryfikację tożsamości. Mechanizm używany przez usługi RMA musi być chroniony, aby użytkownicy nie mogli go sami wywoływać, ponieważ pozwoliłoby im to uzyskać potwierdzenia sfałszowanych identyfikatorów.
  • Żaden kod inny niż zaufana aplikacja Keymaster w TEE nie może odczytać danych pochodzących z identyfikatora przechowywanych w magazynie.
  • Pamięć jest zabezpieczona przed nieuprawnionym dostępem: jeśli zawartość pamięci została zmodyfikowana, TEE traktuje to tak, jakby kopie treści zostały zniszczone, i odrzuca wszystkie próby uwierzytelniania tożsamości. Można to zrobić, podpisując lub oznaczając MAC-iem miejsce na dane w sposób opisany poniżej.
  • W pamięci nie są przechowywane pierwotne identyfikatory. Ponieważ weryfikacja tożsamości wymaga odpowiedzi na wyzwanie, dzwoniący zawsze podaje identyfikatory, które mają zostać zweryfikowane. TEE musi tylko sprawdzić, czy te wartości są zgodne z wartościami pierwotnymi. Aby umożliwić tę weryfikację, przechowuj szyfrowane hasze pierwotnych wartości zamiast wartości.

Budownictwo

Aby utworzyć implementację z wymienionymi wyżej właściwościami, przechowuj wartości pochodzące z identyfikatora za pomocą tej konstrukcji S. Nie przechowuj innych kopii wartości identyfikatora, z wyjątkiem zwykłych miejsc w systemie, które właściciel urządzenia może zmienić przez zrootowanie:

S = D || HMAC(HBK, D)

gdzie:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC to konstrukcja HMAC z odpowiednim bezpiecznym haszem (zalecany SHA-256).
  • HBK to klucz powiązany z sprzętem, który nie jest używany do innych celów.
  • ID1...IDn to wartości oryginalnego identyfikatora; powiązanie konkretnej wartości z konkretnym indeksem zależy od implementacji, ponieważ różne urządzenia mają różną liczbę identyfikatorów.
  • || oznacza koniunkcję

Wyjścia kodu HMAC mają stały rozmiar, więc do znalezienia poszczególnych haszy identyfikatora lub kodu HMAC D nie są wymagane żadne nagłówki ani inna struktura. Oprócz sprawdzania podanych wartości w celu wykonania uwierzytelnienia implementacje muszą również zweryfikować S, wyodrębniając z niego D, obliczając HMAC(HBK, D) i porównując go z wartością w S, aby sprawdzić, czy żadne indywidualne identyfikatory nie zostały zmodyfikowane lub uszkodzone. Implementacje muszą też używać porównań o stałym czasie dla wszystkich elementów identyfikatora i sprawdzania S. Czas porównania musi być stały niezależnie od liczby podanych identyfikatorów i prawidłowego dopasowania dowolnej części testu.

Identyfikatory sprzętowe

Uwierzytelnianie tożsamości obsługuje te identyfikatory sprzętowe:

  1. Nazwa marki zwracana przez Build.BRAND na Androidzie
  2. Nazwa urządzenia zwracana przez Build.DEVICE w Androidzie
  3. Nazwa produktu zwracana przez Build.PRODUCT w Androidzie
  4. Nazwa producenta zwracana przez Build.MANUFACTURER w Androidzie
  5. Nazwa modelu zwracana przez funkcję Build.MODEL w Androidzie
  6. Numer seryjny
  7. Numery IMEI wszystkich urządzeń radiowych
  8. MEID wszystkich urządzeń radiowych

Aby obsługiwać uwierzytelnianie identyfikatora urządzenia, urządzenie potwierdza te identyfikatory. Wszystkie urządzenia z Androidem mają te 6 funkcji, które są niezbędne do działania tej funkcji. Jeśli urządzenie ma wbudowane moduły radiowe, musi również obsługiwać uwierzytelnianie numerów IMEI lub MEID tych modułów.

Uwierzytelnianie tożsamości jest żądane przez wykonanie uwierzytelniania klucza i uwzględnienie w żądaniu identyfikatorów urządzenia. Identyfikatory są oznaczone jako:

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

Identyfikator do potwierdzenia to ciąg bajtów zakodowany w UTF-8. Ten format dotyczy również identyfikatorów liczbowych. Każdy identyfikator do potwierdzenia jest wyrażony jako ciąg znaków zakodowany w formacie UTF-8.

Jeśli urządzenie nie obsługuje weryfikacji tożsamości (lub destroyAttestationIds() zostało wcześniej wywołane i urządzenie nie może już weryfikować swoich identyfikatorów), każde żądanie weryfikacji klucza, które zawiera co najmniej jeden z tych tagów, kończy się niepowodzeniem z wartością ErrorCode::CANNOT_ATTEST_IDS.

Jeśli urządzenie obsługuje uwierzytelnianie tożsamości, a w żądaniu uwierzytelnienia klucza podano co najmniej 1 z wymienionych powyżej tagów, TEE sprawdza, czy identyfikator podany w każdym z tych tagów jest zgodny z kopią identyfikatorów sprzętowych. Jeśli co najmniej 1 identyfikator nie pasuje, cała weryfikacja zakończy się niepowodzeniem z kodem błędu ErrorCode::CANNOT_ATTEST_IDS. Ten sam tag może być podany wielokrotnie. Może to być przydatne na przykład podczas weryfikowania numerów IMEI: Urządzenie może mieć kilka modułów radiowych z różnymi numerami IMEI. Prośba o potwierdzenie jest ważna, jeśli wartość podana w każdym ATTESTATION_ID_IMEI jest zgodna z jednym z interfejsów radiowych urządzenia. To samo dotyczy wszystkich innych tagów.

Jeśli weryfikacja zakończy się powodzeniem, uwierzytelnione identyfikatory zostaną dodane do rozszerzenia atesta (OID 1.3.6.1.4.1.11129.2.1.17) wydanego certyfikatu atesta, korzystając ze schematu podanego powyżej. Zmiany w schemacie atestacyjnym Keymaster 2 są pogrubione i opatrzone komentarzami.

Java API

Ta sekcja ma tylko charakter informacyjny. Implementatorzy Keymaster nie implementują ani nie używają interfejsu Java API. Informacje te mają pomóc implementatorom zrozumieć, jak aplikacje korzystają z tej funkcji. Składniki systemu mogą używać tego parametru w inny sposób, dlatego ważne jest, aby ta sekcja nie była traktowana jako normatywna.