Attestation de clé et d'ID

Le keystore offre un emplacement plus sécurisé pour créer, stocker et utiliser des clés cryptographiques de manière contrôlée. Lorsque le stockage de clé avec support matériel est disponible et utilisé, le matériel de clé est mieux protégé contre l'extraction depuis l'appareil, et Keymaster applique des restrictions difficiles à neutraliser.

Toutefois, cela n'est vrai que si les clés du keystore se trouvent dans un espace de stockage intégré au matériel. Dans Keymaster 1, les applications ou les serveurs distants ne pouvaient pas vérifier de manière fiable si tel était le cas. Le daemon de keystore chargeait le HAL de keymaster disponible et croyait tout ce que disait le HAL en ce qui concerne la sauvegarde matérielle des clés.

Pour y remédier, Keymaster a introduit l'attestation des clés dans Android 7.0 (Keymaster 2) et l'attestation d'ID dans Android 8.0 (Keymaster 3).

L'attestation de clé vise à fournir un moyen de déterminer de manière fiable si une paire de clés asymétriques est compatible avec le matériel, quelles sont les propriétés de la clé et quelles contraintes sont appliquées à son utilisation.

L'attestation d'ID permet à l'appareil de fournir une preuve de ses identifiants matériels, tels que son numéro de série ou son code IMEI.

Attestation des clés

Pour prendre en charge l'attestation de clé, Android 7.0 a introduit un ensemble de balises, de types et de méthodes dans le HAL.

Tags

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

Type

Keymaster 2 et versions antérieures

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

Méthode AttestKey

Keymaster 3

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

Keymaster 2 ou version antérieure

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 correspond à la structure de l'appareil Keymaster.
  • keyToAttest est le blob de clé renvoyé par generateKey pour lequel l'attestation est créée.
  • attestParams est une liste de tous les paramètres nécessaires à l'attestation. Cela inclut Tag::ATTESTATION_CHALLENGE et éventuellement Tag::RESET_SINCE_ID_ROTATION, ainsi que Tag::APPLICATION_ID et Tag::APPLICATION_DATA. Les deux derniers sont nécessaires pour déchiffrer le blob de clé s'ils ont été spécifiés lors de la génération de la clé.
  • certChain est le paramètre de sortie, qui renvoie un tableau de certificats. L'entrée 0 correspond au certificat d'attestation, ce qui signifie qu'il certifie la clé à partir de keyToAttest et contient l'extension d'attestation.

La méthode attestKey est considérée comme une opération de clé publique sur la clé attestée, car elle peut être appelée à tout moment et n'a pas besoin de respecter les contraintes d'autorisation. Par exemple, si la clé attestée nécessite l'authentification de l'utilisateur pour être utilisée, une attestation peut être générée sans authentification de l'utilisateur.

Certificat d'attestation

Le certificat d'attestation est un certificat X.509 standard, avec une extension d'attestation facultative qui contient une description de la clé attestée. Le certificat est signé avec une clé d'attestation certifiée. La clé d'attestation peut utiliser un algorithme différent de celui de la clé attestée.

Le certificat d'attestation contient les champs du tableau ci-dessous et ne peut pas contenir de champs supplémentaires. Certains champs spécifient une valeur fixe. Les tests CTS vérifient que le contenu du certificat est exactement tel que défini.

SEQUENCE du certificat

Nom du champ (voir la norme RFC 5280) Valeur
tbsCertificate SÉQUENCE TBSCertificate
signatureAlgorithm AlgorithmIdentifier de l'algorithme utilisé pour signer la clé:
ECDSA pour les clés EC, RSA pour les clés RSA.
signatureValue Chaîne de bits, signature calculée sur le tbsCertificate encodé DER ASN.1.

SEQUENCE TBSCertificate

Nom du champ (voir la RFC 5280) Valeur
version INTEGER 2 (correspond à un certificat v3)
serialNumber INTEGER 1 (valeur fixe: identique sur tous les certificats)
signature AlgorithmIdentifier de l'algorithme utilisé pour signer la clé: ECDSA pour les clés EC, RSA pour les clés RSA.
issuer Identique au champ d'objet de la clé d'attestation par lot.
validity SÉQUENCE de deux dates, contenant les valeurs de Tag::ACTIVE_DATETIME et de Tag::USAGE_EXPIRE_DATETIME. Ces valeurs sont exprimées en millisecondes depuis le 1er janvier 1970. Pour obtenir des représentations de date correctes dans les certificats, consultez la RFC 5280.
Si Tag::ACTIVE_DATETIME n'est pas présent, utilisez la valeur de Tag::CREATION_DATETIME. Si Tag::USAGE_EXPIRE_DATETIME n'est pas présent, utilisez la date d'expiration du certificat de clé d'attestation par lot.
subject CN = "Android Keystore Key" (valeur fixe: identique sur tous les certificats)
subjectPublicKeyInfo SubjectPublicKeyInfo contenant une clé publique attestée.
extensions/Key Usage digitalSignature: défini si la clé a pour objectif KeyPurpose::SIGN ou KeyPurpose::VERIFY. Tous les autres bits sont non définis.
extensions/CRL Distribution Points Valeur à déterminer
extensions/"attestation" L'OID est 1.3.6.1.4.1.11129.2.1.17. Le contenu est défini dans la section Extension d'attestation ci-dessous. Comme pour toutes les extensions de certificat X.509, le contenu est représenté sous la forme d'une OCTET_STRING contenant un codage DER de la SEQUENCE d'attestation.

Extension d'attestation

L'extension attestation porte l'OID 1.3.6.1.4.1.11129.2.1.17. Il contient des informations sur la paire de clés attestée et l'état de l'appareil au moment de la génération de la clé.

Les types de balises Keymaster/KeyMint définis dans la spécification de l'interface AIDL sont convertis en types ASN.1 comme suit:

Type Keymaster/KeyMint Type ASN.1 Notes
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Millisecondes écoulées depuis le 1er janvier 1970 à 00:00:00 GMT.
BOOL NULL La présence d'une balise signifie "true", son absence "false".
BIGNUM Aucun tag de ce type n'est défini. Aucun mappage n'est donc défini.
BYTES OCTET_STRING

Schéma

Le contenu de l'extension d'attestation est décrit par le schéma ASN.1 suivant:

Version 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),
}

Version 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),
}

Version 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),
}

Version 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),
}

Version 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),
}

Version 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),
}

Version 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),
}

Champs KeyDescription

attestationVersion
La version du schéma ASN.1.
ValeurVersion de Keymaster/KeyMint
1Keymaster version 2.0
2Keymaster version 3.0
3Keymaster version 4.0
4Keymaster version 4.1
100KeyMint version 1.0
200KeyMint version 2.0
300KeyMint version 3.0
attestationSecurityLevel

Niveau de sécurité de l'emplacement où la clé attestée est stockée.

keymasterVersion/keyMintVersion
La version de l'implémentation de la couche d'abstraction matérielle (HAL) Keymaster/KeyMint.
ValeurVersion de Keymaster/KeyMint
2Keymaster version 2.0
3Keymaster version 3.0
4Keymaster version 4.0
41Keymaster version 4.1
100KeyMint version 1.0
200KeyMint version 2.0
300KeyMint version 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Niveau de sécurité de l'implémentation de Keymaster/KeyMint.
attestationChallenge
Défi fourni au moment de la génération de la clé.
uniqueId
Identifiant d'appareil sensible à la confidentialité que les applications système peuvent demander au moment de la génération de la clé. Si l'ID unique n'est pas demandé, ce champ est vide. Pour en savoir plus, consultez la section ID unique.
softwareEnforced
Liste d'autorisations Keymaster/KeyMint appliquée par le système Android. Ces informations sont collectées ou générées par le code de la plate-forme et stockées dans la partition système de l'appareil. Il peut être fiable tant que l'appareil exécute un système d'exploitation conforme au modèle de sécurité de la plate-forme Android (c'est-à-dire que le bootloader de l'appareil est verrouillé et que le verifiedBootState est Verified).
hardwareEnforced
La liste d'autorisations Keymaster/KeyMint appliquée par l'environnement d'exécution sécurisé (TEE) ou StrongBox de l'appareil. Ces informations sont collectées ou générées par le code du matériel sécurisé et ne sont pas contrôlées par la plate-forme. Par exemple, les informations peuvent provenir du bootloader ou d'un canal de communication sécurisé qui ne nécessite pas de faire confiance à la plate-forme.

Valeurs SecurityLevel

La valeur SecurityLevel indique dans quelle mesure un élément lié au Keystore (par exemple, une paire de clés et une attestation) est résistant aux attaques.

Valeur Signification
Software Sécurisé tant que le système Android de l'appareil est conforme au modèle de sécurité de la plate-forme Android (c'est-à-dire que le bootloader de l'appareil est verrouillé et que le verifiedBootState est Verified).
TrustedEnvironment Sécurisé tant que l'environnement d'exécution sécurisé (TEE) n'est pas compromis. Les exigences d'isolation des TEE sont définies dans les sections 9.11 [C-1-1] à [C-1-4] du document de définition de compatibilité Android. Les TEE sont très résistants aux compromissions à distance et moyennement résistants aux attaques matérielles directes.
StrongBox Sécurisé tant que StrongBox n'est pas compromis. StrongBox est implémenté dans un élément sécurisé semblable à un module de sécurité matériel. Les exigences d'implémentation de StrongBox sont définies dans la section 9.11.2 du document de définition de la compatibilité Android. StrongBox est très résistant aux attaques à distance et aux attaques matérielles directes (par exemple, la falsification physique et les attaques par canal auxiliaire).

Champs AuthorizationList

Chaque champ correspond à une balise d'autorisation Keymaster/KeyMint de la spécification de l'interface AIDL. La spécification est la source de vérité sur les balises d'autorisation: leur signification, le format de leur contenu, s'ils doivent apparaître dans les champs softwareEnforced ou hardwareEnforced de l'objet KeyDescription, s'ils sont mutuellement exclusifs avec d'autres balises, etc. Tous les champs AuthorizationList sont facultatifs.

Chaque champ possède une balise EXPLICIT spécifique au contexte égale au numéro de balise Keymaster/KeyMint, ce qui permet une représentation plus compacte des données dans le AuthorizationList. L'analyseur ASN.1 doit donc connaître le type de données attendu pour chaque balise spécifique au contexte. Par exemple, Tag::USER_AUTH_TYPE est défini comme ENUM | 504. Dans le schéma de l'extension d'attestation, le champ purpose de AuthorizationList est spécifié en tant que userAuthType [504] EXPLICIT INTEGER OPTIONAL. Son encodage ASN.1 contiendra donc le tag spécifique au contexte 504 au lieu du tag de classe UNIVERSAL pour le type ASN.1 INTEGER, qui est 10.

purpose
Correspond à la balise d'autorisation Tag::PURPOSE, qui utilise une valeur d'ID de balise de 1.
algorithm

Correspond à la balise d'autorisation Tag::ALGORITHM, qui utilise une valeur d'ID de balise de 2.

Dans un objet AuthorizationList d'attestation, la valeur de l'algorithme est toujours RSA ou EC.

keySize
Correspond à la balise d'autorisation Tag::KEY_SIZE, qui utilise une valeur d'ID de balise de 3.
digest
Correspond à la balise d'autorisation Tag::DIGEST, qui utilise une valeur d'ID de balise de 5.
padding
Correspond à la balise d'autorisation Tag::PADDING, qui utilise une valeur d'ID de balise de 6.
ecCurve

Correspond à la balise d'autorisation Tag::EC_CURVE, qui utilise une valeur d'ID de balise de 10.

Ensemble de paramètres utilisé pour générer une paire de clés à courbe elliptique (EC) qui utilise l'ECDSA pour la signature et la validation, dans le keystore du système Android.

rsaPublicExponent
Correspond à la balise d'autorisation Tag::RSA_PUBLIC_EXPONENT, qui utilise une valeur d'ID de balise de 200.
mgfDigest

Présent uniquement dans la version d'attestation de clé 100 ou supérieure.

Correspond à la balise d'autorisation KeyMint Tag::RSA_OAEP_MGF_DIGEST, qui utilise une valeur d'ID de balise de 203.
rollbackResistance

Présent uniquement dans la version d'attestation de clé 3 ou supérieure.

Correspond à la balise d'autorisation Tag::ROLLBACK_RESISTANCE, qui utilise une valeur d'ID de balise de 303.

earlyBootOnly

Présent uniquement dans la version d'attestation de clé 4 ou supérieure.

Correspond à la balise d'autorisation Tag::EARLY_BOOT_ONLY, qui utilise une valeur d'ID de balise de 305.

activeDateTime
Correspond à la balise d'autorisation Tag::ACTIVE_DATETIME, qui utilise une valeur d'ID de balise de 400.
originationExpireDateTime
Correspond à la balise d'autorisation Keymaster Tag::ORIGINATION_EXPIRE_DATETIME, qui utilise une valeur d'ID de balise de 401.
usageExpireDateTime
Correspond à la balise d'autorisation Tag::USAGE_EXPIRE_DATETIME, qui utilise une valeur d'ID de balise de 402.
usageCountLimit
Correspond à la balise d'autorisation Tag::USAGE_COUNT_LIMIT, qui utilise une valeur d'ID de balise de 405.
noAuthRequired

Correspond à la balise d'autorisation Tag::NO_AUTH_REQUIRED, qui utilise une valeur d'ID de balise de 503.

userAuthType
Correspond à la balise d'autorisation Tag::USER_AUTH_TYPE, qui utilise une valeur d'ID de balise de 504.
authTimeout
Correspond à la balise d'autorisation Tag::AUTH_TIMEOUT, qui utilise une valeur d'ID de balise de 505
allowWhileOnBody

Correspond à la balise d'autorisation Tag::ALLOW_WHILE_ON_BODY, qui utilise une valeur d'ID de balise de 506.

Permet d'utiliser la clé après le délai d'expiration de l'authentification si l'utilisateur porte encore l'appareil sur le corps. Notez qu'un capteur sécurisé sur le corps détermine si son utilisateur porte l'appareil sur lui.

trustedUserPresenceRequired

Présent uniquement dans la version d'attestation de clé 3 ou supérieure.

Correspond à la balise d'autorisation Tag::TRUSTED_USER_PRESENCE_REQUIRED, qui utilise une valeur d'ID de balise de 507.

Indique que cette clé n'est utilisable que si l'utilisateur a fourni la preuve qu'il est présent physiquement. Quelques exemples :

  • Pour une clé StrongBox, un bouton physique câblé sur une broche de l'appareil StrongBox.
  • Pour une clé TEE, l'authentification par empreinte digitale fournit une preuve de présence, à condition que le TEE contrôle totalement le scanner et effectue le processus de mise en correspondance des empreintes digitales.
trustedConfirmationRequired

Présent uniquement dans la version d'attestation de clé 3 ou supérieure.

Correspond à la balise d'autorisation Tag::TRUSTED_CONFIRMATION_REQUIRED, qui utilise une valeur d'ID de balise de 508.

Indique que la clé n'est utilisable que si l'utilisateur confirme les données à signer à l'aide d'un jeton d'approbation. Pour savoir comment obtenir la confirmation de l'utilisateur, consultez la Confirmation de protection Android.

Remarque : Cette balise ne s'applique qu'aux clés qui utilisent la fonction SIGN.

unlockedDeviceRequired

Présent uniquement dans la version d'attestation de clé 3 ou supérieure.

Correspond à la balise d'autorisation Tag::UNLOCKED_DEVICE_REQUIRED, qui utilise une valeur d'ID de balise de 509.

allApplications

Correspond à la balise d'autorisation Tag::ALL_APPLICATIONS, qui utilise une valeur d'ID de balise de 600.

Indique si toutes les applications d'un appareil peuvent accéder à la paire de clés.

applicationId
Correspond à la balise d'autorisation Tag::APPLICATION_ID, qui utilise une valeur d'ID de balise de 601.
creationDateTime
Correspond à la balise d'autorisation Tag::CREATION_DATETIME, qui utilise une valeur d'ID de balise de 701.
origin

Correspond à la balise d'autorisation Tag::ORIGIN, qui utilise une valeur d'ID de balise de 702.

rollbackResistant

Présent uniquement dans les versions d'attestation de clé 1 ou 2.

Correspond à la balise d'autorisation Tag::ROLLBACK_RESISTANT, qui utilise une valeur d'ID de balise de 703.

rootOfTrust

Correspond à la balise d'autorisation Tag::ROOT_OF_TRUST, qui utilise une valeur d'ID de balise de 704.

Pour en savoir plus, consultez la section qui décrit la structure de données RootOfTrust.

osVersion

Correspond à la balise d'autorisation Tag::OS_VERSION, qui utilise une valeur d'ID de balise de 705.

Version du système d'exploitation Android associé au Keymaster, spécifiée sous la forme d'un entier à six chiffres. Par exemple, la version 8.1.0 est représentée par 080100.

Seule la version 1.0 ou ultérieure de Keymaster inclut cette valeur dans la liste d'autorisations.

osPatchLevel

Correspond à la balise d'autorisation Tag::PATCHLEVEL, qui utilise une valeur d'ID de balise de 706.

Mois et année associés au correctif de sécurité utilisé dans le Keymaster, spécifiés sous la forme d'un entier à six chiffres. Par exemple, le correctif d'août 2018 est représenté par 201808.

Seule la version 1.0 ou ultérieure de Keymaster inclut cette valeur dans la liste d'autorisations.

attestationApplicationId

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise d'autorisation Keymaster Tag::ATTESTATION_APPLICATION_ID, qui utilise une valeur d'ID de balise de 709.

Pour en savoir plus, consultez la section qui décrit la structure de données AttestationApplicationId.

attestationIdBrand

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise Keymaster Tag::ATTESTATION_ID_BRAND, qui utilise une valeur d'ID de balise de 710.

attestationIdDevice

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise Keymaster Tag::ATTESTATION_ID_DEVICE, qui utilise une valeur d'ID de balise de 711.

attestationIdProduct

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise Keymaster Tag::ATTESTATION_ID_PRODUCT, qui utilise une valeur d'ID de balise de 712.

attestationIdSerial

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise Keymaster Tag::ATTESTATION_ID_SERIAL, qui utilise une valeur d'ID de balise de 713.

attestationIdImei

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise d'autorisation Tag::ATTESTATION_ID_IMEI, qui utilise une valeur d'ID de balise de 714.

attestationIdMeid

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise d'autorisation Tag::ATTESTATION_ID_MEID, qui utilise une valeur d'ID de balise de 715.

attestationIdManufacturer

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise d'autorisation Tag::ATTESTATION_ID_MANUFACTURER, qui utilise une valeur d'ID de balise de 716.

attestationIdModel

Présent uniquement dans les versions d'attestation de clé 2 ou supérieures.

Correspond à la balise d'autorisation Tag::ATTESTATION_ID_MODEL, qui utilise une valeur d'ID de balise de 717.

vendorPatchLevel

Présent uniquement dans les versions d'attestation de clé 3 ou supérieures.

Correspond à la balise d'autorisation Tag::VENDOR_PATCHLEVEL, qui utilise une valeur d'ID de balise de 718.

Spécifie le niveau du correctif de sécurité de l'image du fournisseur à installer sur l'appareil pour que cette clé puisse être utilisée. La valeur apparaît au format AAAAMMJJ et représente la date du correctif de sécurité du fournisseur. Par exemple, si une clé a été générée sur un appareil Android sur lequel le correctif de sécurité du fournisseur est installé le 1er août 2018, cette valeur est 20180801.

bootPatchLevel

Présent uniquement dans les versions d'attestation de clé 3 ou supérieures.

Correspond à la balise d'autorisation Tag::BOOT_PATCHLEVEL, qui utilise une valeur d'ID de balise de 719.

Spécifie le niveau du correctif de sécurité de l'image du noyau à installer sur l'appareil pour que cette clé puisse être utilisée. La valeur apparaît au format AAAAMMJJ et représente la date du correctif de sécurité du système. Par exemple, si une clé a été générée sur un appareil Android sur lequel le correctif de sécurité du système est installé le 5 août 2018, cette valeur est 20180805.

deviceUniqueAttestation

Présent uniquement dans les versions d'attestation de clé 4 ou supérieures.

Correspond à la balise d'autorisation Tag::DEVICE_UNIQUE_ATTESTATION, qui utilise une valeur d'ID de balise de 720.

attestationIdSecondImei

Présent uniquement dans les versions d'attestation de clé 300 ou supérieures.

Correspond à la balise d'autorisation Tag::ATTESTATION_ID_SECOND_IMEI, qui utilise une valeur d'ID de balise de 723.

Champs RootOfTrust

verifiedBootKey
Hachage sécurisé de la clé publique utilisé pour vérifier l'intégrité et l'authenticité de tout code exécuté lors du démarrage de l'appareil dans le cadre du démarrage validé. Nous vous recommandons d'utiliser l'algorithme SHA-256.
deviceLocked
Indique si le bootloader de l'appareil est verrouillé. true signifie que l'appareil a démarré une image signée qui a été validée par le démarrage validé.
verifiedBootState
État du démarrage validé de l'appareil.
verifiedBootHash
Résumé de toutes les données protégées par le démarrage validé. Pour les appareils qui utilisent l'implémentation de référence du démarrage validé Android, ce champ contient le récapitulatif VBMeta.

Valeurs VerifiedBootState

Valeur État de démarrage correspondant Signification
Verified GREEN Une chaîne de confiance complète s'étend de la racine de confiance protégée au matériel au bootloader et à toutes les partitions validées par le démarrage validé. Dans cet état, le champ verifiedBootKey contient le hachage de la racine de confiance intégrée, qui est le certificat intégré à la mémoire ROM de l'appareil par le fabricant de l'appareil en usine.
SelfSigned YELLOW Identique à Verified, sauf que la vérification a été effectuée à l'aide d'une racine de confiance configurée par l'utilisateur au lieu de la racine de confiance intégrée par le fabricant dans la fabrique. Dans cet état, le champ verifiedBootKey contient le hachage de la clé publique configurée par l'utilisateur.
Unverified ORANGE Le bootloader de l'appareil est déverrouillé. Par conséquent, une chaîne de confiance ne peut pas être établie. L'appareil peut être modifié librement. L'intégrité de l'appareil doit donc être vérifiée par l'utilisateur en dehors de la bande. Dans cet état, le champ verifiedBootKey contient 32 octets de zéros.
Failed RED La validation de l'appareil a échoué. Dans cet état, aucune garantie n'est fournie concernant le contenu des autres champs RootOfTrust.

AttestationApplicationId

Ce champ reflète la conviction de la plate-forme Android quant aux applications autorisées à utiliser le matériel de clé secrète délivré par l'attestation. Il peut contenir plusieurs packages si et seulement si plusieurs packages partagent le même UID. Le champ AttestationApplicationId dans AuthorizationList est de type OCTET_STRING et est formaté selon le schéma ASN.1 suivant:

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

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
Un ensemble d'objets AttestationPackageInfo, chacun fournissant le nom et le numéro de version d'un package.
signature_digests

Ensemble de condensés SHA-256 des certificats de signature de l'application. Une application peut avoir plusieurs chaînes de certificats de clés de signature. Pour chacun, le certificat d'entité finale est condensé et placé dans le champ signature_digests. Le nom du champ est trompeur, puisque les données condensées sont les certificats de signature de l'application, et non les signatures d'application, car ils sont nommés d'après la classe Signature renvoyée par un appel à getPackageInfo(). L'extrait de code suivant présente un exemple d'ensemble :

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

Identifiant unique

L'ID unique est une valeur de 128 bits qui identifie l'appareil, mais seulement pendant une période limitée. La valeur est calculée avec:

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

Où :

  • T est la "valeur du compteur temporel", calculée en divisant la valeur de Tag::CREATION_DATETIME par 2 592 000 000, en supprimant tout reste. T change tous les 30 jours (2 592 000 000 = 30 * 24 * 60 * 60 * 1 000).
  • C est la valeur de Tag::APPLICATION_ID.
  • R est défini sur 1 si Tag::RESET_SINCE_ID_ROTATION est présent dans le paramètre attest_params de l'appel attest_key, ou sur 0 si la balise n'est pas présente.
  • HBK est un secret matériel unique connu de l'environnement d'exécution sécurisé et qui n'est jamais révélé par celui-ci. Le secret contient au moins 128 bits d'entropie et est propre à chaque appareil (l'unicité probabiliste est acceptable étant donné les 128 bits d'entropie). La HBK doit être dérivée du matériel de clé fusionné via HMAC ou AES_CMAC.

Tronquez la sortie HMAC_SHA256 à 128 bits.

Clés et certificats d'attestation

Deux clés, une RSA et une ECDSA, ainsi que les chaînes de certificats correspondantes, sont provisionnées de manière sécurisée sur l'appareil.

Android 12 introduit le provisionnement de clés à distance, et Android 13 exige que les appareils l'implémentent. Le provisionnement de clés à distance fournit aux appareils sur le terrain des certificats d'attestation ECDSA P256 par application. Ces certificats ont une durée de vie plus courte que les certificats provisionnés en usine.

Plusieurs codes IMEI

Android 14 prend en charge plusieurs IMEI dans l'enregistrement Android Key Attestation. Les OEM peuvent implémenter cette fonctionnalité en ajoutant une balise KeyMint pour un deuxième IMEI. Il est de plus en plus courant que les appareils disposent de plusieurs radios cellulaires, et les OEM peuvent désormais prendre en charge les appareils dotés de deux codes IMEI.

Les OEM doivent disposer d'un IMEI secondaire, le cas échéant, à provisionner dans les implémentations KeyMint afin que ces implémentations puissent l'attester de la même manière qu'elles attestent du premier IMEI.

Attestation d'identité

Android 8.0 inclut une prise en charge facultative de l'attestation d'identité pour les appareils équipés de Keymaster 3. L'attestation d'identité permet à l'appareil de fournir la preuve de ses identifiants matériels, tels que le numéro de série ou le code IMEI. Bien qu'il s'agisse d'une fonctionnalité facultative, il est vivement recommandé que toutes les implémentations de Keymaster 3 la prennent en charge, car la possibilité de prouver l'identité de l'appareil permet de renforcer la sécurité des cas d'utilisation tels que la véritable configuration à distance sans contact (car le côté distant peut être certain de communiquer avec le bon appareil, et non un appareil usurpant son identité).

L'attestation d'identité fonctionne en créant des copies des identifiants matériels de l'appareil auxquelles seul l'environnement d'exécution sécurisé (TEE) peut accéder avant que l'appareil ne quitte l'usine. Un utilisateur peut déverrouiller le bootloader de l'appareil et modifier le logiciel système et les identifiants signalés par les frameworks Android. Les copies des identifiants détenus par le TEE ne peuvent pas être manipulées de cette manière, garantissant ainsi que l'attestation d'ID d'appareil n'atteste que des identifiants matériels d'origine de l'appareil, ce qui empêche les tentatives de spoofing.

La surface d'API principale pour l'attestation d'identité s'appuie sur le mécanisme d'attestation de clé existant introduit avec Keymaster 2. Lorsque vous demandez un certificat d'attestation pour une clé détenue par keymaster, l'appelant peut demander que les identifiants matériels de l'appareil soient inclus dans les métadonnées du certificat d'attestation. Si la clé est conservée dans le TEE, le certificat est relié à une racine de confiance connue. Le destinataire d'un tel certificat peut vérifier que le certificat et son contenu, y compris les identifiants matériels, ont été écrits par le TEE. Lorsqu'il est invité à inclure des identifiants matériels dans le certificat d'attestation, le TEE n'atteste que des identifiants stockés dans son espace de stockage, tels qu'ils sont renseignés sur le site de fabrication.

Propriétés de stockage

L'espace de stockage qui contient les identifiants de l'appareil doit présenter les propriétés suivantes:

  • Les valeurs dérivées des identifiants d'origine de l'appareil sont copiées dans l'espace de stockage avant que l'appareil ne quitte l'usine.
  • La méthode destroyAttestationIds() peut détruire définitivement cette copie des données dérivées de l'identifiant. La destruction permanente signifie que les données sont complètement supprimées. Ni une réinitialisation d'usine ni aucune autre procédure effectuée sur l'appareil ne peut les restaurer. Cela est particulièrement important pour les appareils sur lesquels un utilisateur a déverrouillé le bootloader, modifié le logiciel système et modifié les identifiants renvoyés par les frameworks Android.
  • Les centres de réparation doivent pouvoir générer de nouvelles copies des données dérivées de l'identifiant matériel. Ainsi, un appareil qui passe par une ARM peut à nouveau effectuer une attestation d'identité. Le mécanisme utilisé par les centres de réparation doit être protégé pour que les utilisateurs ne puissent pas l'invoquer eux-mêmes, car cela leur permettrait d'obtenir des attestations d'ID falsifiés.
  • Aucun code autre que l'application approuvée Keymaster dans le TEE ne peut lire les données dérivées de l'identifiant stockées.
  • Le stockage est inviolable: si le contenu du stockage a été modifié, le TEE le traite comme s'il avait été détruit et refuse toutes les tentatives d'attestation d'identité. Pour ce faire, vous devez signer ou MACer le stockage comme décrit ci-dessous.
  • Le stockage ne contient pas les identifiants d'origine. Étant donné que l'attestation d'identité implique une question, l'appelant fournit toujours les identifiants à attester. Il suffit au TEE de vérifier que ces valeurs correspondent aux valeurs initiales. Le stockage de hachages sécurisés des valeurs d'origine plutôt que des valeurs permet cette vérification.

Construction

Pour créer une implémentation avec les propriétés listées ci-dessus, stockez les valeurs dérivées de l'ID dans la construction S suivante. Ne stockez pas d'autres copies des valeurs d'ID, sauf dans les emplacements normaux du système, que le propriétaire de l'appareil peut modifier en effectuant un root:

S = D || HMAC(HBK, D)

où :

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC correspond à la construction HMAC avec un hachage sécurisé approprié (SHA-256 recommandé).
  • HBK est une clé liée au matériel qui n'est utilisée à aucune autre fin.
  • ID1...IDn correspond aux valeurs d'ID d'origine. L'association d'une valeur particulière à un index particulier dépend de la mise en œuvre, car les différents appareils ont un nombre d'identifiants différent.
  • || représente la concaténation.

Comme les sorties HMAC ont une taille fixe, aucun en-tête ni aucune autre structure n'est nécessaire pour trouver des hachages d'ID individuels, ou le HMAC de D. En plus de vérifier les valeurs fournies pour effectuer l'attestation, les implémentations doivent valider S en extrayant D de S, en calculant HMAC(HBK, D) et en le comparant à la valeur dans S pour vérifier qu'aucun ID individuel n'a été modifié/corrompu. De plus, les implémentations doivent utiliser des comparaisons à temps constant pour tous les éléments d'ID individuels et la validation de S. La durée de la comparaison doit être constante, quel que soit le nombre d'ID fournis et la correspondance correcte de toute partie du test.

Identifiants matériels

L'attestation d'identité est compatible avec les identifiants matériels suivants:

  1. Nom de la marque, tel que renvoyé par Build.BRAND sur Android
  2. Nom de l'appareil, tel que renvoyé par Build.DEVICE sous Android
  3. Nom du produit, tel que renvoyé par Build.PRODUCT sous Android
  4. Nom du fabricant, tel que renvoyé par Build.MANUFACTURER dans Android
  5. Nom du modèle, tel que renvoyé par Build.MODEL dans Android
  6. Numéro de série
  7. IMEI de toutes les radios
  8. MEID de toutes les radios

Pour prendre en charge l'attestation de l'ID de l'appareil, un appareil atteste de ces identifiants. Tous les appareils équipés d'Android disposent des six premiers, qui sont nécessaires au fonctionnement de cette fonctionnalité. Si l'appareil dispose d'émetteurs-récepteurs radio cellulaires intégrés, il doit également prendre en charge l'attestation des IMEI et/ou des MEID des émetteurs-récepteurs.

L'attestation d'identité est demandée en effectuant une attestation de clé et en incluant les identifiants de l'appareil à attester dans la requête. Les identifiants portent le libellé suivant:

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

L'identifiant à attester est une chaîne d'octets encodée en UTF-8. Ce format s'applique également aux identifiants numériques. Chaque identifiant à attester est exprimé sous la forme d'une chaîne encodée UTF-8.

Si l'appareil n'est pas compatible avec l'attestation d'ID (ou si destroyAttestationIds() a été appelé précédemment et que l'appareil ne peut plus attester de ses ID), toute requête d'attestation de clé incluant une ou plusieurs de ces balises échoue avec ErrorCode::CANNOT_ATTEST_IDS.

Si l'appareil est compatible avec l'attestation d'ID et qu'une ou plusieurs des balises ci-dessus ont été incluses dans une requête d'attestation de clé, le TEE vérifie que l'identifiant fourni avec chacune des balises correspond à sa copie des identifiants matériels. Si un ou plusieurs identifiants ne correspondent pas, l'attestation entière échoue avec ErrorCode::CANNOT_ATTEST_IDS. Vous pouvez fournir un même tag plusieurs fois. Cela peut être utile, par exemple, lors de l'attestation des IMEI : un appareil peut comporter plusieurs radios avec plusieurs IMEI. Une requête d'attestation est valide si la valeur fournie avec chaque ATTESTATION_ID_IMEI correspond à l'une des radios de l'appareil. Il en va de même pour tous les autres tags.

Si l'attestation aboutit, les pièces d'identité attestées sont ajoutées à l'extension d'attestation (OID 1.3.6.1.4.1.11129.2.1.17) du certificat d'attestation délivré, à l'aide du schéma ci-dessus. Les modifications apportées au schéma d'attestation Keymaster 2 sont en gras, avec des commentaires.

API Java

Cette section est fournie à titre informatif uniquement. Les implémentateurs Keymaster n'implémentent ni n'utilisent l'API Java. Ces informations sont fournies pour aider les développeurs à comprendre comment la fonctionnalité est utilisée par les applications. Les composants système peuvent l'utiliser différemment, c'est pourquoi il est essentiel que cette section ne soit pas considérée comme normative.