Atestacja klucza i tożsamości

Keystore to bezpieczniejsze miejsce do tworzenia, przechowywania i używania kluczy kryptograficznych w kontrolowany sposób. Gdy dostępne jest sprzętowe przechowywanie kluczy i jest ono używane, materiał klucza jest lepiej chroniony przed wydobyciem z urządzenia, a KeyMint (wcześniej Keymaster) wymusza ograniczenia, które trudno obejść.

Jest to jednak prawdą tylko wtedy, gdy klucze Keystore są przechowywane w pamięci zabezpieczonej sprzętowo. W Keymaster 1 aplikacje ani serwery zdalne nie miały możliwości wiarygodnego sprawdzenia, czy tak jest. Demon magazynu kluczy wczytał dostępną warstwę abstrakcji sprzętowej (HAL) Keymastera i uznał za prawdziwe wszystko, co ta warstwa mówiła o sprzętowym przechowywaniu kluczy.

Aby temu zapobiec, w Androidzie 7.0 (Keymaster 2) wprowadzono atestowanie klucza, a w Androidzie 8.0 (Keymaster 3) – atestowanie identyfikatora.

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

Atestowanie identyfikatora umożliwia urządzeniu dostarczanie dowodu na jego identyfikatory sprzętowe, takie jak numer seryjny lub IMEI.

Atestacja klucza

Aby obsługiwać atestowanie kluczy, w Androidzie 7.0 wprowadzono zestaw tagów, typów i metod w HAL.

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 obiekt klucza zwrócony przez generateKey, dla którego tworzone jest zaświadczenie.
  • attestParams to lista parametrów niezbędnych do atestowania. Obejmuje to Tag::ATTESTATION_CHALLENGE i prawdopodobnie Tag::RESET_SINCE_ID_ROTATION, a także Tag::APPLICATION_IDTag::APPLICATION_DATA. Dwa ostatnie są niezbędne do odszyfrowania obiektu klucza, jeśli zostały określone podczas generowania klucza.
  • certChain to parametr wyjściowy, który zwraca tablicę certyfikatów. Wpis 0 to certyfikat atestu, co oznacza, że certyfikuje on klucz z keyToAttest i zawiera rozszerzenie atestu.

Metoda attestKey jest uznawana za operację na kluczu poświadczonym z użyciem klucza publicznego, ponieważ można ją wywołać w dowolnym momencie i nie musi spełniać ograniczeń autoryzacji. Jeśli na przykład klucz atestowany wymaga uwierzytelnienia użytkownika, atest można wygenerować bez uwierzytelnienia użytkownika.

Certyfikat atestu

Certyfikat atestu to standardowy certyfikat X.509 z opcjonalnym rozszerzeniem atestu, które zawiera opis atestowanego klucza. Certyfikat jest podpisany certyfikowanym kluczem atestacyjnym. Klucz atestu może używać innego algorytmu niż klucz, który jest atestowany.

Certyfikat atestu zawiera pola z tabeli poniżej i nie może zawierać żadnych dodatkowych pól. Niektóre pola mają stałą wartość. Testy CTS sprawdzają, czy zawartość certyfikatu jest zgodna z definicją.

SEKWENCJA certyfikatu

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

TBSCertificate SEQUENCE

Nazwa pola (patrz RFC 5280) Wartość
version INTEGER 2 (oznacza certyfikat w wersji 3)
serialNumber INTEGER 1 (wartość stała: taka sama na wszystkich certyfikatach)
signature Identyfikator algorytmu użytego do podpisania klucza: ECDSA w przypadku kluczy EC, RSA w przypadku kluczy RSA.
issuer Taki sam jak pole podmiotu klucza atestu zbiorczego.
validity SEKWENCJA dwóch dat zawierająca wartości Tag::ACTIVE_DATETIMETag::USAGE_EXPIRE_DATETIME. Wartości te są podawane w milisekundach od 1 stycznia 1970 r. Prawidłowe formaty dat w certyfikatach znajdziesz w dokumencie RFC 5280.
Jeśli element Tag::ACTIVE_DATETIME nie występuje, użyj wartości elementu Tag::CREATION_DATETIME. Jeśli nie ma elementu Tag::USAGE_EXPIRE_DATETIME, użyj daty wygaśnięcia certyfikatu klucza atestu partii.
subject CN = „Android Keystore Key” (wartość stała: taka sama we wszystkich certyfikatach)
subjectPublicKeyInfo SubjectPublicKeyInfo zawierający poświadczony klucz publiczny.
extensions/Key Usage digitalSignature: ustawione, jeśli klucz ma zastosowanie KeyPurpose::SIGN lub KeyPurpose::VERIFY. Wszystkie pozostałe bity są wyłączone.
extensions/CRL Distribution Points Wartość – TBD
extensions/"attestation" Identyfikator OID to 1.3.6.1.4.1.11129.2.1.17, a treść jest zdefiniowana w sekcji Rozszerzenie atestu poniżej. Podobnie jak w przypadku wszystkich rozszerzeń certyfikatu X.509, treść jest reprezentowana jako OCTET_STRING zawierający kodowanie DER sekwencji atestu.

Rozszerzenie atestu

Rozszerzenie attestation ma identyfikator obiektu 1.3.6.1.4.1.11129.2.1.17. Zawiera informacje o atestowanej parze kluczy i 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 ten sposób:

Typ KeyMint lub Keymaster 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ść „prawda”, a jego brak – „fałsz”.
BIGNUM Żaden tag nie ma tego typu, więc nie zdefiniowano mapowania.
BYTES OCTET_STRING

Schemat

Treść rozszerzenia atestu jest opisana przez ten schemat ASN.1:

Wersja 400

KeyDescription ::= SEQUENCE {
    attestationVersion  400,
    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,
    moduleHash  [724] 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 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 KeyMint lub Keymaster
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
400KeyMint w wersji 4.0
attestationSecurityLevel

Poziom bezpieczeństwa lokalizacji, w której jest przechowywany atestowany klucz.

keymasterVersion/keyMintVersion
Wersja implementacji HAL KeyMint lub Keymaster.
WartośćWersja KeyMint lub Keymaster
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
400KeyMint w wersji 4.0
keymasterSecurityLevel/keyMintSecurityLevel
Poziom bezpieczeństwa implementacji KeyMint lub Keymastera.
attestationChallenge
Wyzwanie podane w momencie generowania klucza.
uniqueId
Identyfikator urządzenia chroniący prywatność, o który aplikacje systemowe mogą prosić w momencie generowania klucza. Jeśli unikalny identyfikator nie jest wymagany, to pole jest puste. Więcej informacji znajdziesz w sekcji Unikalny identyfikator.
softwareEnforced
Lista autoryzacji KeyMint lub Keymastera, która jest egzekwowana przez system Android. Te informacje są zbierane lub generowane przez kod na platformie. Można mu zaufać, o ile urządzenie korzysta z systemu operacyjnego zgodnego z modelem bezpieczeństwa platformy Android (tzn. program rozruchowy urządzenia jest zablokowany, a verifiedBootState jest Verified).
hardwareEnforced
Lista autoryzacji KeyMint lub Keymastera, która jest egzekwowana przez zaufane środowisko wykonawcze (TEE) urządzenia lub StrongBox. Te informacje są zbierane lub generowane przez kod w 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 atest) jest odporny na ataki.

Wartość Znaczenie
Software Bezpieczeństwo jest zapewnione, o ile system Android na urządzeniu jest zgodny z modelem zabezpieczeń platformy Android (tzn. program rozruchowy urządzenia jest zablokowany, a verifiedBootState jest Verified).
TrustedEnvironment Bezpieczne, o ile środowisko TEE nie zostanie naruszone. Wymagania dotyczące izolacji środowisk TEE są zdefiniowane w sekcjach 9.11 [C-1-1]–[C-1-4] dokumentu definicji zgodności systemu Android. Środowiska TEE są wysoce odporne na zdalne naruszenie bezpieczeństwa i umiarkowanie odporne na naruszenie bezpieczeństwa w wyniku bezpośredniego ataku na sprzęt.
StrongBox Bezpieczne, o ile StrongBox nie zostanie przejęty. StrongBox jest zaimplementowany w bezpiecznym elemencie podobnym do sprzętowego modułu zabezpieczeń. Wymagania dotyczące implementacji StrongBox są zdefiniowane w sekcji 9.11.2 dokumentu definicji zgodności systemu Android. StrongBox jest wysoce odporny na zdalne naruszenia bezpieczeństwa i naruszenia bezpieczeństwa w wyniku bezpośredniego ataku na sprzęt (np. fizycznej manipulacji i ataków z wykorzystaniem kanałów bocznych).

Pola AuthorizationList

Każde pole odpowiada tagowi autoryzacji Keymaster/KeyMint ze specyfikacji interfejsu AIDL. Specyfikacja jest źródłem informacji o tagach autoryzacji: ich znaczeniu, formacie zawartości, tym, czy mają się pojawiać w polach softwareEnforced lub hardwareEnforced w obiekcie KeyDescription, czy wykluczają się wzajemnie z innymi tagami itp. Wszystkie pola AuthorizationList są opcjonalne.

Każde pole ma EXPLICITtag specyficzny dla kontekstu, który jest równy numerowi tagu KeyMint lub Keymaster, co umożliwia bardziej zwięzłą reprezentację danych w AuthorizationList. Parser ASN.1 musi zatem znać oczekiwany typ danych dla każdego tagu specyficznego dla kontekstu. Na przykład Tag::USER_AUTH_TYPE jest zdefiniowane jako ENUM | 504. W schemacie rozszerzenia atestu pole purposeAuthorizationList jest określone jako userAuthType [504] EXPLICIT INTEGER OPTIONAL. Jego kodowanie ASN.1 będzie więc zawierać tag specyficzny dla kontekstu 504 zamiast tagu klasy UNIVERSAL dla typu ASN.1 INTEGER, czyli 10.

W atestach generowanych przez KeyMint 4 znajdują się te pola:
purpose
Odpowiada tagowi 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 atestu AuthorizationList wartość algorytmu wynosi zawsze RSA lub EC.

keySize
Odpowiada tagowi autoryzacji Tag::KEY_SIZE, który używa wartości identyfikatora tagu 3.
blockMode
Odpowiada tagowi autoryzacji Tag::BLOCK_MODE, który używa wartości identyfikatora tagu 4.
digest
Odpowiada tagowi autoryzacji Tag::DIGEST, który używa wartości identyfikatora tagu 5.
padding
Odpowiada tagowi autoryzacji Tag::PADDING, który używa wartości identyfikatora tagu 6.
callerNonce
Odpowiada tagowi autoryzacji Tag::CALLER_NONCE, który używa wartości identyfikatora tagu 7.
minMacLength
Odpowiada tagowi autoryzacji Tag::MIN_MAC_LENGTH, który używa wartości identyfikatora tagu 8.
ecCurve

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

Zestaw parametrów używanych do generowania pary kluczy krzywej eliptycznej (EC), która używa algorytmu ECDSA do podpisywania i weryfikacji w magazynie kluczy systemu Android.

rsaPublicExponent
Odpowiada tagowi Tag::RSA_PUBLIC_EXPONENT authorization, który używa wartości identyfikatora tagu 200.
mgfDigest

Występuje tylko w przypadku wersji atestu klucza >= 100.

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

Występuje tylko w przypadku wersji atestu klucza ≥ 3.

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

earlyBootOnly

Występuje tylko w przypadku wersji atestu klucza ≥ 4.

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

activeDateTime
Odpowiada tagowi autoryzacji Tag::ACTIVE_DATETIME, który używa wartości identyfikatora tagu 400.
originationExpireDateTime
Odpowiada tagowi Tag::ORIGINATION_EXPIRE_DATETIME authorization, który używa wartości identyfikatora tagu 401.
usageExpireDateTime
Odpowiada tagowi autoryzacji Tag::USAGE_EXPIRE_DATETIME, który używa identyfikatora tagu o wartości 402.
usageCountLimit
Odpowiada Tag::USAGE_COUNT_LIMIT tagowi autoryzacji, który używa wartości identyfikatora tagu 405.
userSecureId
Odpowiada tagowi autoryzacji Tag::USER_SECURE_ID, który używa wartości identyfikatora tagu 502.
noAuthRequired

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

userAuthType
Odpowiada tagowi autoryzacji Tag::USER_AUTH_TYPE, który używa wartości identyfikatora tagu 504.
authTimeout
Odpowiada tagowi 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życie klucza po upływie okresu oczekiwania na uwierzytelnienie, jeśli użytkownik nadal ma urządzenie przy sobie. Pamiętaj, że bezpieczny czujnik na ciele określa, czy urządzenie jest noszone na ciele użytkownika.

trustedUserPresenceReq

Występuje tylko w przypadku wersji atestu klucza ≥ 3.

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

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

  • W przypadku klucza StrongBox jest to przycisk sprzętowy połączony na stałe z pinem na urządzeniu StrongBox.
  • W przypadku klucza TEE uwierzytelnianie odciskiem palca zapewnia dowód obecności, o ile środowisko TEE ma wyłączną kontrolę nad skanerem i przeprowadza proces dopasowywania odcisku palca.
trustedConfirmationReq

Występuje tylko w przypadku wersji atestu klucza ≥ 3.

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

Określa, że klucza można używać tylko wtedy, gdy użytkownik potwierdzi dane do podpisania za pomocą tokena zatwierdzenia. Więcej informacji o tym, jak uzyskać potwierdzenie od użytkownika, znajdziesz w artykule Android Protected Confirmation.

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

unlockedDeviceReq

Występuje tylko w przypadku wersji atestu klucza ≥ 3.

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

creationDateTime
Odpowiada tagowi autoryzacji Tag::CREATION_DATETIME, który używa wartości identyfikatora tagu 701.
origin

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

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 Keymasterem, podana jako 6-cyfrowa liczba całkowita. Na przykład wersja 8.1.0 jest reprezentowana jako 080100.

Tę wartość zawiera w liście autoryzacji 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żywaną poprawką zabezpieczeń w Keymasterze, podane jako 6-cyfrowa liczba całkowita. Na przykład poprawka z sierpnia 2018 r. jest oznaczona jako 201808.

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

attestationApplicationId

Występuje tylko w wersjach atestu klucza ≥ 2.

Odpowiada tagowi Tag::ATTESTATION_APPLICATION_ID authorization, 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 atestu klucza ≥ 2.

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

attestationIdDevice

Występuje tylko w wersjach atestu klucza ≥ 2.

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

attestationIdProduct

Występuje tylko w wersjach atestu klucza ≥ 2.

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

attestationIdSerial

Występuje tylko w wersjach atestu klucza ≥ 2.

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

attestationIdImei

Występuje tylko w wersjach atestu klucza ≥ 2.

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

attestationIdMeid

Występuje tylko w wersjach atestu klucza ≥ 2.

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

attestationIdManufacturer

Występuje tylko w wersjach atestu klucza ≥ 2.

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

attestationIdModel

Występuje tylko w wersjach atestu klucza ≥ 2.

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

vendorPatchLevel

Występuje tylko w wersjach atestu klucza >= 3.

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

Określa poziom aktualizacji zabezpieczeń obrazu dostawcy, który musi być zainstalowany na urządzeniu, aby można było używać tego klucza. Wartość jest podana w formacie RRRRMMDD i oznacza datę wydania poprawki zabezpieczeń dostawcy. Jeśli na przykład klucz został wygenerowany na urządzeniu z Androidem, na którym zainstalowano pakiet poprawek zabezpieczeń dostawcy z 1 sierpnia 2018 r., ta wartość będzie wynosić 20180801.

bootPatchLevel

Występuje tylko w wersjach atestu klucza >= 3.

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

Określa poziom aktualizacji zabezpieczeń obrazu jądra, który musi być zainstalowany na urządzeniu, aby można było używać tego klucza. Wartość jest podana w formacie RRRRMMDD i reprezentuje datę poprawki zabezpieczeń systemu. Jeśli na przykład klucz został wygenerowany na urządzeniu z Androidem, na którym zainstalowano pakiet poprawek zabezpieczeń z 5 sierpnia 2018 r., wartość ta będzie wynosić 20180805.

deviceUniqueAttestation

Występuje tylko w wersjach atestu klucza >= 4.

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

attestationIdSecondImei

Występuje tylko w wersjach atestu klucza >= 300.

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

moduleHash

Występuje tylko w wersjach atestu klucza >= 400.

Odpowiada Tag::MODULE_HASHtagowi autoryzacji, który używa wartości identyfikatora tagu 724.

Pola RootOfTrust

verifiedBootKey
Bezpieczny skrót klucza publicznego używanego do weryfikacji integralności i autentyczności całego kodu wykonywanego podczas uruchamiania urządzenia w ramach weryfikacji podczas uruchamiania. Zalecamy 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
Skrót wszystkich danych chronionych przez weryfikację podczas uruchamiania. W przypadku urządzeń, które korzystają z referencyjnej implementacji zweryfikowanego rozruchu Androida, to pole zawiera skrót VBMeta.

Wartości VerifiedBootState

Wartość Odpowiedni stan uruchamiania Znaczenie
Verified GREEN Pełny łańcuch zaufania rozciąga się od chronionego sprzętowo głównego źródła zaufania do programu rozruchowego i wszystkich partycji zweryfikowanych przez zweryfikowany rozruch. W tym stanie pole verifiedBootKey zawiera hash wbudowanego głównego źródła zaufania, czyli certyfikatu wbudowanego w pamięć ROM urządzenia przez producenta w fabryce.
SelfSigned YELLOW Takie samo jak Verified, z tym że weryfikacja została przeprowadzona przy użyciu głównego źródła zaufania skonfigurowanego przez użytkownika zamiast głównego źródła zaufania wbudowanego przez producenta w fabryce. W tym stanie pole verifiedBootKey zawiera hash klucza publicznego skonfigurowanego przez użytkownika.
Unverified ORANGE Program rozruchowy urządzenia jest odblokowany, więc nie można ustanowić łańcucha zaufania. Urządzenie można dowolnie modyfikować, więc użytkownik musi zweryfikować jego integralność poza pasmem. W tym stanie pole verifiedBootKey zawiera 32 bajty zer.
Failed RED Urządzenie nie przeszło weryfikacji. W tym stanie nie ma gwarancji co do zawartości pozostałych pól RootOfTrust.

AttestationApplicationId

To pole odzwierciedla przekonanie platformy Android co do tego, które aplikacje mogą używać materiału klucza tajnego w ramach atestu. Może zawierać wiele pakietów tylko wtedy, gdy mają one ten sam identyfikator UID. Pole AttestationApplicationIdAuthorizationList jest typu 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ć kilka ł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 podpisywania aplikacji, a nie jej podpisy. Nazwa pochodzi od klasy Signature zwracanej przez wywołanie funkcji getPackageInfo(). Poniższy fragment kodu pokazuje przykładowy zbiór:

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

Rozszerzenie informacji o obsłudze administracyjnej

Rozszerzenie informacji o obsłudze administracyjnej ma identyfikator obiektu 1.3.6.1.4.1.11129.2.1.30. Rozszerzenie zawiera informacje o urządzeniu znane serwerowi obsługi administracyjnej.

Schemat

Rozszerzenie jest zgodne z tym schematem CDDL:

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

Mapa nie ma wersji i można do niej dodawać nowe pola opcjonalne.

certs_issued

Przybliżona liczba certyfikatów wydanych na urządzenie w ciągu ostatnich 30 dni. Jeśli wartość jest o kilka rzędów wielkości większa od średniej, może to być sygnał potencjalnego nadużycia.

validated_attested_entity

Zweryfikowany zaświadczony podmiot to ciąg znaków opisujący typ urządzenia, który został potwierdzony przez serwer udostępniania jako zaświadczony. Na przykład STRONG_BOX lub TEE.

Klucze atestacji

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

W Androidzie 12 wprowadzono zdalne udostępnianie kluczy, a Android 13 wymaga, aby urządzenia implementowały tę funkcję. Zdalne udostępnianie kluczy zapewnia urządzeniom w terenie certyfikaty atestu ECDSA P256 dla poszczególnych aplikacji. Te certyfikaty mają krótszy okres ważności niż certyfikaty udostępniane fabrycznie.

Unikalny identyfikator

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

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

Gdzie:

  • T to „wartość licznika czasowego” obliczana przez podzielenie wartości Tag::CREATION_DATETIME przez 2592000000 i odrzucenie 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 parametrze attest_params wywołania attest_key występuje Tag::RESET_SINCE_ID_ROTATION, lub 0, jeśli tag nie występuje.
  • HBK to unikalny, powiązany ze sprzętem klucz tajny znany zaufanemu środowisku wykonawczemu, który nigdy nie jest przez nie ujawniany. Klucz tajny zawiera co najmniej 128 bitów entropii i jest unikalny dla poszczególnych urządzeń (dopuszczalna jest unikalność probabilistyczna przy 128 bitach entropii). Klucz HBK powinien być wyprowadzony z połączonego materiału klucza za pomocą funkcji HMAC lub AES_CMAC.

Skróć dane wyjściowe HMAC_SHA256 do 128 bitów.

Wiele numerów IMEI

Android 14 dodaje obsługę wielu numerów IMEI w rekordzie atestu klucza Androida. Producenci OEM mogą wdrożyć tę funkcję, dodając tag KeyMint dla drugiego numeru IMEI. Coraz częściej urządzenia mają wiele modułów radiowych sieci komórkowej, a producenci OEM mogą teraz obsługiwać urządzenia z dwoma numerami IMEI.

Producenci OEM muszą udostępniać dodatkowy numer IMEI(jeśli jest obecny na urządzeniach) w implementacjach KeyMint, aby mogły one potwierdzać jego autentyczność w taki sam sposób jak w przypadku pierwszego numeru IMEI.

Potwierdzenie tożsamości

Android 8.0 obejmuje opcjonalną obsługę atestowania identyfikatora na urządzeniach z Keymasterem 3. Atestowanie identyfikatora umożliwia urządzeniu dostarczanie dowodu na identyfikatory sprzętowe, takie jak numer seryjny lub IMEI. Chociaż jest to funkcja opcjonalna, zalecamy, aby wszystkie implementacje Keymastera 3 ją obsługiwały. Możliwość potwierdzenia tożsamości urządzenia umożliwia bezpieczniejsze korzystanie z takich funkcji jak prawdziwa zdalna konfiguracja bezdotykowa (ponieważ zdalna strona może mieć pewność, że komunikuje się z właściwym urządzeniem, a nie z urządzeniem podszywającym się pod jego tożsamość).

Atestowanie tożsamości polega na tworzeniu kopii identyfikatorów sprzętowych urządzenia, do których dostęp ma tylko środowisko TEE, zanim urządzenie opuści fabrykę. Użytkownik może odblokować program rozruchowy urządzenia i zmienić oprogramowanie systemowe oraz identyfikatory zgłaszane przez platformy Androida. Kopie identyfikatorów przechowywane w TEE nie mogą być w ten sposób manipulowane, co zapewnia, że atest identyfikatora urządzenia potwierdza tylko oryginalne identyfikatory sprzętowe urządzenia, a tym samym udaremnia próby podszywania się.

Główny interfejs API do potwierdzania tożsamości jest oparty na dotychczasowym mechanizmie potwierdzania kluczy wprowadzonym w Keymasterze 2. Podczas wysyłania prośby o certyfikat atestu dla klucza przechowywanego przez Keymastera osoba wysyłająca prośbę może zażądać, aby identyfikatory sprzętowe urządzenia zostały uwzględnione w metadanych certyfikatu atestu. Jeśli klucz jest przechowywany w TEE, łańcuch certyfikatów prowadzi do znanego głównego źródła zaufania. Odbiorca takiego certyfikatu może sprawdzić, czy certyfikat i jego zawartość, w tym identyfikatory sprzętu, zostały zapisane przez środowisko TEE. Gdy pojawi się prośba o uwzględnienie identyfikatorów sprzętu w certyfikacie atestu, środowisko TEE potwierdza tylko identyfikatory przechowywane w jego pamięci, które zostały w niej umieszczone w fabryce.

Właściwości pamięci

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

  • Wartości pochodzące z oryginalnych identyfikatorów urządzenia są kopiowane do pamięci, zanim urządzenie opuści fabrykę.
  • Metoda destroyAttestationIds() może trwale zniszczyć tę kopię danych pochodzących z identyfikatora. Trwałe zniszczenie oznacza, że dane są całkowicie usuwane, więc nie można ich przywrócić za pomocą przywracania do ustawień fabrycznych ani żadnej innej procedury wykonywanej na urządzeniu. Jest to szczególnie ważne w przypadku urządzeń, na których użytkownik odblokował program rozruchowy i zmienił oprogramowanie systemowe oraz zmodyfikował identyfikatory zwracane przez platformy Androida.
  • Centra RMA powinny mieć możliwość generowania nowych kopii danych pochodzących z identyfikatora sprzętu. Dzięki temu urządzenie, które przechodzi proces RMA, może ponownie przeprowadzić atestowanie identyfikatora. Mechanizm używany przez centra RMA musi być chroniony, aby użytkownicy nie mogli go sami wywoływać, ponieważ umożliwiłoby im to uzyskanie atestów sfałszowanych identyfikatorów.
  • Żaden kod poza zaufaną aplikacją Keymaster w TEE nie może odczytywać danych pochodnych identyfikatora przechowywanych w pamięci.
  • Pamięć jest zabezpieczona przed manipulacją: jeśli zawartość pamięci zostanie zmodyfikowana, TEE potraktuje ją tak, jakby kopie treści zostały zniszczone, i odrzuci wszystkie próby potwierdzenia tożsamości. Jest to realizowane przez podpisanie lub zastosowanie kodu MAC do pamięci masowej w sposób opisany poniżej.
  • Pamięć nie zawiera oryginalnych identyfikatorów. Ponieważ atestowanie tożsamości wymaga testu zabezpieczającego, osoba wywołująca zawsze podaje identyfikatory, które mają zostać potwierdzone. Środowisko TEE musi tylko sprawdzić, czy są one zgodne z wartościami, które pierwotnie zawierały. Umożliwia to przechowywanie bezpiecznych skrótów oryginalnych wartości zamiast wartości.

Budownictwo

Aby utworzyć implementację z właściwościami wymienionymi powyżej, zapisz wartości pochodzące z identyfikatora w tej konstrukcji S. Nie przechowuj innych kopii wartości identyfikatorów z wyjątkiem normalnych miejsc w systemie, które właściciel urządzenia może zmodyfikować 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 jest SHA-256).
  • HBK to klucz powiązany ze sprzętem, który nie jest używany do żadnych innych celów.
  • ID1...IDn to pierwotne wartości identyfikatorów; powiązanie określonej wartości z określonym indeksem zależy od implementacji, ponieważ różne urządzenia mają różną liczbę identyfikatorów.
  • || oznacza łączenie

Ponieważ dane wyjściowe HMAC mają stały rozmiar, nie są wymagane żadne nagłówki ani inne struktury, aby można było znaleźć poszczególne skróty identyfikatorów lub HMAC identyfikatora D. Oprócz sprawdzania podanych wartości w celu przeprowadzenia atestu implementacje muszą 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 identyfikatory indywidualne nie zostały zmodyfikowane ani uszkodzone. Ponadto implementacje muszą używać porównań w stałym czasie w przypadku wszystkich poszczególnych elementów identyfikatora i weryfikacji 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ętu

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

  1. Nazwa marki zwrócona przez interfejs Build.BRAND na Androidzie.
  2. Nazwa urządzenia zwrócona przez Build.DEVICE na Androidzie
  3. Nazwa produktu zwrócona przez Build.PRODUCT na Androidzie
  4. Nazwa producenta zwrócona przez Build.MANUFACTURER na Androidzie.
  5. Nazwa modelu zwrócona przez Build.MODEL na Androidzie
  6. Numer seryjny
  7. numery IMEI wszystkich modułów radiowych;
  8. MEID wszystkich urządzeń radiowych

Aby obsługiwać potwierdzanie identyfikatora urządzenia, urządzenie potwierdza te identyfikatory. Wszystkie urządzenia z Androidem mają pierwsze 6 funkcji, które są niezbędne do działania tej funkcji. Jeśli urządzenie ma wbudowane nadajniki komórkowe, musi też obsługiwać atestowanie numerów IMEI lub MEID tych nadajników.

Potwierdzenie tożsamości jest wymagane przez wykonanie potwierdzenia klucza i uwzględnienie w żądaniu identyfikatorów urządzenia, które mają zostać potwierdzone. 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 też identyfikatorów numerycznych. Każdy identyfikator do potwierdzenia jest wyrażony jako ciąg znaków zakodowany w UTF-8.

Jeśli urządzenie nie obsługuje potwierdzania identyfikatora (lub destroyAttestationIds() zostało wcześniej wywołane, a urządzenie nie może już potwierdzać swoich identyfikatorów), każda prośba o potwierdzenie klucza, która zawiera co najmniej 1 z tych tagów, kończy się niepowodzeniem z kodem ErrorCode::CANNOT_ATTEST_IDS.

Jeśli urządzenie obsługuje potwierdzanie identyfikatora i w żądaniu potwierdzenia klucza został uwzględniony co najmniej jeden z powyższych tagów, środowisko TEE weryfikuje, czy identyfikator podany z każdym z tagów jest zgodny z kopią identyfikatorów sprzętowych. Jeśli co najmniej 1 identyfikator nie pasuje, całe zaświadczenie kończy się niepowodzeniem i wyświetla się komunikat ErrorCode::CANNOT_ATTEST_IDS. Ten sam tag może być podany wiele razy. Może to być przydatne na przykład podczas potwierdzania numerów IMEI: urządzenie może mieć wiele modułów radiowych z wieloma numerami IMEI. Żądanie atestu jest prawidłowe, jeśli wartość podana w każdym polu ATTESTATION_ID_IMEI pasuje do jednego z radioodbiorników urządzenia. To samo dotyczy wszystkich pozostałych tagów.

Jeśli atestowanie zakończy się powodzeniem, atestowane identyfikatory zostaną dodane do rozszerzenia atestu (OID 1.3.6.1.4.1.11129.2.1.17) wydanego certyfikatu atestu zgodnie z powyższym schematem. Zmiany w schemacie atestowania Keymaster 2 są wytłuszczone i zawierają komentarze.

Java API

Ta sekcja ma charakter wyłącznie informacyjny. Twórcy Keymastera nie implementują ani nie używają interfejsu Java API. Jest to podane, aby pomóc osobom wdrażającym zrozumieć, w jaki sposób aplikacje korzystają z tej funkcji. Komponenty systemu mogą używać go w inny sposób, dlatego ważne jest, aby nie traktować tej sekcji jako normatywnej.