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é pargenerateKey
pour lequel l'attestation est créée.attestParams
est une liste de tous les paramètres nécessaires à l'attestation. Cela inclutTag::ATTESTATION_CHALLENGE
et éventuellementTag::RESET_SINCE_ID_ROTATION
, ainsi queTag::APPLICATION_ID
etTag::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 dekeyToAttest
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.
Valeur Version de Keymaster/KeyMint 1 Keymaster version 2.0 2 Keymaster version 3.0 3 Keymaster version 4.0 4 Keymaster version 4.1 100 KeyMint version 1.0 200 KeyMint version 2.0 300 KeyMint 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.
Valeur Version de Keymaster/KeyMint 2 Keymaster version 2.0 3 Keymaster version 3.0 4 Keymaster version 4.0 41 Keymaster version 4.1 100 KeyMint version 1.0 200 KeyMint version 2.0 300 KeyMint 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
estVerified
). -
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 toujoursRSA
ouEC
. -
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 KeyMintTag::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 classeSignature
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 deTag::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 deTag::APPLICATION_ID
.R
est défini sur 1 siTag::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:
- Nom de la marque, tel que renvoyé par
Build.BRAND
sur Android - Nom de l'appareil, tel que renvoyé par
Build.DEVICE
sous Android - Nom du produit, tel que renvoyé par
Build.PRODUCT
sous Android - Nom du fabricant, tel que renvoyé par
Build.MANUFACTURER
dans Android - Nom du modèle, tel que renvoyé par
Build.MODEL
dans Android - Numéro de série
- IMEI de toutes les radios
- 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.