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és soutenu par du matériel est disponible et utilisé, le matériel de clé est plus sécurisé contre l'extraction de l'appareil, et KeyMint (anciennement Keymaster) applique des restrictions difficiles à contourner.
Toutefois, cela n'est vrai que si les clés Keystore sont connues pour être dans un stockage matériel. Dans Keymaster 1, il n'existait aucun moyen pour les applications ou les serveurs distants de vérifier de manière fiable si tel était le cas. Le démon du keystore a chargé la couche d'abstraction matérielle (HAL) Keymaster disponible et a cru tout ce que la HAL a dit concernant le support matériel des clés.
Pour y remédier, l'attestation de clé a été introduite dans Android 7.0 (Keymaster 2) et l'attestation d'identité 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 soutenue par le matériel, quelles sont les propriétés de la clé et quelles contraintes sont appliquées à son utilisation.
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.
Attestation des clés
Pour prendre en charge l'attestation de clé, Android 7.0 a introduit un ensemble de tags, de types et de méthodes dans la HAL.
Tags
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Type
Keymaster 2 ou version antérieure
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
est 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é 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 répondre à des 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 valident que le contenu du certificat est exactement tel qu'il est défini.
SEQUENCE du certificat
Nom du champ (voir RFC 5280) | Valeur |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | AlgorithmIdentifier de l'algorithme utilisé pour signer la clé : ECDSA pour les clés EC, RSA pour les clés RSA. |
signatureValue | BIT STRING, signature calculée sur tbsCertificate encodé ASN.1 DER. |
SEQUENCE TBSCertificate
Nom du champ (voir RFC 5280) | Valeur |
---|---|
version |
INTEGER 2 (signifie 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 "Objet" de la clé d'attestation par lot. |
validity |
SEQUENCE de deux dates, contenant les valeurs Tag::ACTIVE_DATETIME et Tag::USAGE_EXPIRE_DATETIME .
Ces valeurs sont exprimées en millisecondes depuis le 1er janvier 1970.
Consultez la RFC 5280 pour connaître les représentations de date correctes dans les certificats.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 la 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éfinir |
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 encodage 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 sur l'état de l'appareil au moment de la génération des clés.
Les types de tags Keymaster/KeyMint définis dans les spécifications de l'interface AIDL sont traduits en types ASN.1 comme suit :
Type KeyMint ou Keymaster | 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'un tag signifie "true", son absence signifie "false". |
BIGNUM |
Aucune balise n'est associée à ce type. Par conséquent, aucun mappage n'est 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 400
KeyDescription ::= SEQUENCE { attestationVersion 400, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, moduleHash [724] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
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
-
Version du schéma ASN.1.
Valeur Version de KeyMint ou Keymaster 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 400 KeyMint version 4.0 -
attestationSecurityLevel
-
Le niveau de sécurité de l'emplacement où la clé attestée est stockée.
-
keymasterVersion
/keyMintVersion
-
Version de l'implémentation HAL KeyMint ou Keymaster.
Valeur Version de KeyMint ou Keymaster 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 400 KeyMint version 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Niveau de sécurité de l'implémentation de KeyMint ou Keymaster.
-
attestationChallenge
- Défi fourni au moment de la génération de la clé.
-
uniqueId
- Identifiant d'appareil respectueux de la confidentialité que les applications système peuvent demander lors de la génération de clés. 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 KeyMint ou Keymaster appliquée par le système Android. Ces informations sont collectées ou générées par le code de la plate-forme. Il peut être considéré comme 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
verifiedBootState
estVerified
). -
hardwareEnforced
- La liste d'autorisations KeyMint ou Keymaster 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 n'implique 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 verifiedBootState est Verified ). |
TrustedEnvironment |
Sécurisé tant que l'environnement d'exécution sécurisé n'est pas compromis. Les exigences d'isolation pour les 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 modérément résistants aux compromissions par attaque matérielle directe. |
StrongBox |
Sécurisé tant que StrongBox n'est pas piraté. StrongBox est implémenté dans un élément sécurisé semblable à un module de sécurité matériel. Les exigences d'implémentation pour StrongBox sont définies dans la section 9.11.2 du document de définition de compatibilité Android. StrongBox est très résistant aux compromissions à distance et aux compromissions par attaque matérielle directe (par exemple, les falsifications physiques 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é concernant les tags d'autorisation : leur signification, le format de leur contenu, s'ils sont censés apparaître dans les champs softwareEnforced
ou hardwareEnforced
de l'objet KeyDescription
, s'ils sont mutuellement exclusifs avec d'autres tags, etc. Tous les champs AuthorizationList
sont facultatifs.
Chaque champ comporte une balise EXPLICIT
spécifique au contexte, égale au numéro de balise KeyMint ou Keymaster, ce qui permet une représentation plus compacte des données dans AuthorizationList
. L'analyseur ASN.1 doit donc connaître le type de données attendu pour chaque tag spécifique au contexte. Par exemple, Tag::USER_AUTH_TYPE
est défini comme ENUM | 504
. Dans le schéma d'extension d'attestation, le champ purpose
de AuthorizationList
est spécifié comme 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. -
blockMode
-
Correspond à la balise d'autorisation
Tag::BLOCK_MODE
, qui utilise une valeur d'ID de balise de 4. -
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. -
callerNonce
-
Correspond à la balise d'autorisation
Tag::CALLER_NONCE
, qui utilise une valeur d'ID de balise de 7. -
minMacLength
-
Correspond à la balise d'autorisation
Tag::MIN_MAC_LENGTH
, qui utilise une valeur d'ID de balise de 8. -
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
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. -
userSecureId
- Correspond à la balise d'autorisation
Tag::USER_SECURE_ID
, qui utilise une valeur d'ID de balise de 502. -
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.
-
trustedUserPresenceReq
-
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.
-
trustedConfirmationReq
-
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
. -
unlockedDeviceReq
-
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. -
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. -
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
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 d'autorisation
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 d'autorisation
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 d'autorisation
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 d'autorisation
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. -
moduleHash
-
Présent uniquement dans les versions d'attestation de clé 400 ou supérieures.
Correspond à la balise d'autorisation
Tag::MODULE_HASH
, qui utilise une valeur d'ID de balise de 724.
Champs RootOfTrust
-
verifiedBootKey
- Hachage sécurisé de la clé publique utilisée pour vérifier l'intégrité et l'authenticité de tout le code qui s'exécute au démarrage de l'appareil dans le cadre du démarrage validé. Nous vous recommandons d'utiliser 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 avec succès par le démarrage validé. -
verifiedBootState
- L'état de démarrage validé de l'appareil.
-
verifiedBootHash
- Condensé 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 Android Verified Boot, ce champ contient le condensé VBMeta.
Valeurs VerifiedBootState
Valeur | État de démarrage correspondant | Signification |
---|---|---|
Verified |
GREEN |
Une chaîne de confiance complète s'étend d'une racine de confiance protégée par le 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 validation 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 en usine.
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é. Il est donc impossible d'établir une chaîne de confiance. L'appareil peut être modifié librement. L'utilisateur doit donc vérifier l'intégrité de l'appareil hors 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, il n'y a aucune garantie 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]), ...}
Extension d'informations de provisionnement
L'extension d'informations de provisionnement porte l'OID 1.3.6.1.4.1.11129.2.1.30
. L'extension fournit des informations connues sur l'appareil par le serveur de provisionnement.
Schéma
L'extension suit le schéma CDDL suivant :
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
La carte n'a pas de version, et de nouveaux champs facultatifs peuvent être ajoutés.
-
certs_issued
-
Nombre approximatif de certificats émis pour l'appareil au cours des 30 derniers jours. Cette valeur peut être utilisée comme signal d'utilisation abusive potentielle si elle est supérieure à la moyenne de certains ordres de grandeur.
-
validated_attested_entity
-
L'entité attestée validée est une chaîne qui décrit le type d'appareil dont l'attestation a été confirmée par le serveur de provisionnement. Exemples :
STRONG_BOX
ouTEE
.
Clés d'attestation
Deux clés (une RSA et une ECDSA) et les chaînes de certificats correspondantes sont provisionnées de manière sécurisée dans 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.
ID 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 comme suit :
HMAC_SHA256(T || C || R, HBK)
Où :
T
est la "valeur du compteur temporel", calculée en divisant la valeur deTag::CREATION_DATETIME
par 2592000000, en supprimant tout reste.T
change tous les 30 jours (2592000000 = 30 * 24 * 60 * 60 * 1000).C
correspond à 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 le tag n'est pas présent.HBK
est un secret unique lié au matériel, connu de l'environnement d'exécution sécurisé et 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 compte tenu des 128 bits d'entropie). La clé HBK doit être dérivée du matériel de clé fusionné via HMAC ou AES_CMAC.
Tronquez la sortie HMAC_SHA256 à 128 bits.
Plusieurs codes IMEI
Android 14 permet d'utiliser plusieurs IMEI dans l'enregistrement Android Key Attestation. Les OEM peuvent implémenter cette fonctionnalité en ajoutant un tag KeyMint pour un deuxième IMEI. Il est de plus en plus courant que les appareils disposent de plusieurs radios cellulaires. Les OEM peuvent désormais prendre en charge les appareils dotés de deux codes IMEI.
Les OEM sont tenus de fournir un code IMEI secondaire, s'il est présent sur leurs appareils, à la ou aux implémentations KeyMint afin que celles-ci puissent l'attester de la même manière que le premier code IMEI.
Attestation d'identité
Android 8.0 inclut une compatibilité facultative avec 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 fortement recommandé que toutes les implémentations Keymaster 3 la prennent en charge, car la possibilité de prouver l'identité de l'appareil permet de sécuriser davantage les cas d'utilisation tels que la véritable configuration à distance sans intervention (car la partie distante peut être certaine de communiquer avec le bon appareil, et non avec 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é 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 ainsi que les identifiants signalés par les frameworks Android. Les copies des identifiants détenues par le TEE ne peuvent pas être manipulées de cette manière, ce qui garantit que l'attestation de l'ID de l'appareil n'atteste que des identifiants matériels d'origine de l'appareil, ce qui déjoue 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. Lorsqu'il demande 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, la chaîne de certificats renvoie à 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 demandé d'inclure des identifiants matériels dans le certificat d'attestation, l'environnement d'exécution sécurisé (TEE) n'atteste que des identifiants stockés, tels qu'ils ont été renseignés en usine.
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 le 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 le rétablissement de la configuration d'usine, ni aucune autre procédure effectuée sur l'appareil ne peuvent les restaurer. Cela est particulièrement important pour les appareils dont le bootloader a été déverrouillé, et dont le logiciel système et les identifiants renvoyés par les frameworks Android ont été modifiés. - 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 l'ARM peut à nouveau effectuer l'attestation d'identité. Le mécanisme utilisé par les centres ARM doit être protégé afin que les utilisateurs ne puissent pas l'invoquer eux-mêmes, car cela leur permettrait d'obtenir des attestations d'ID usurpés.
- Aucun code autre que l'application Keymaster de confiance dans l'environnement d'exécution sécurisé (TEE) n'est en mesure de lire les données dérivées de l'identifiant conservées dans le stockage.
- Le stockage est inviolable : si le contenu du stockage a été modifié, le TEE le traite comme si les copies du contenu avaient été détruites 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. Le TEE n'a besoin que de vérifier que ces valeurs correspondent à celles qu'il avait à l'origine. Pour ce faire, nous stockons des hachages sécurisés des valeurs d'origine plutôt que les valeurs elles-mêmes.
Construction
Pour créer une implémentation qui possède 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, à l'exception des emplacements normaux du système, qu'un propriétaire d'appareil peut modifier en rootant l'appareil :
S = D || HMAC(HBK, D)
où :
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
est 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
sont les valeurs d'ID d'origine. L'association d'une valeur particulière à un index particulier dépend de l'implémentation, car différents appareils ont un nombre différent d'identifiants.||
représente la concaténation
Étant donné que les sorties HMAC sont de taille fixe, aucun en-tête ni autre structure n'est requis pour pouvoir trouver les 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é ni 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. Le temps de comparaison doit être constant, quel que soit le nombre d'ID fournis et la correspondance correcte de n'importe quelle partie du test.
Identifiants matériels
L'attestation d'identité est compatible avec les identifiants matériels suivants :
- Nom de la marque, tel qu'il est renvoyé par
Build.BRAND
dans Android - Nom de l'appareil, tel qu'il est renvoyé par
Build.DEVICE
dans Android - Nom du produit, tel qu'il est renvoyé par
Build.PRODUCT
dans 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 fonctionnant sous Android disposent des six premiers, qui sont nécessaires au fonctionnement de cette fonctionnalité. Si l'appareil dispose de radios cellulaires intégrées, il doit également être compatible avec l'attestation pour les codes IMEI et/ou MEID des radios.
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 sont tagués comme suit :
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 forme de chaîne encodée en UTF-8.
Si l'appareil n'est pas compatible avec l'attestation d'identité (ou si destroyAttestationIds()
a été appelé précédemment et que l'appareil ne peut plus attester ses identifiants), toute demande d'attestation de clé incluant un ou plusieurs de ces tags échoue avec ErrorCode::CANNOT_ATTEST_IDS
.
Si l'appareil est compatible avec l'attestation d'identité et qu'un ou plusieurs des tags ci-dessus ont été inclus dans une demande d'attestation de clé, l'environnement d'exécution sécurisé vérifie que l'identifiant fourni avec chacun des tags 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
. Il est possible de fournir la même balise plusieurs fois. Cela peut être utile, par exemple, lors de l'attestation des codes IMEI : un appareil peut disposer de plusieurs radios avec plusieurs codes IMEI. Une demande 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 réussit, les ID attestés sont ajoutés à l'extension d'attestation (OID 1.3.6.1.4.1.11129.2.1.17) du certificat d'attestation émis, à l'aide du schéma ci-dessus. Les modifications apportées au schéma d'attestation Keymaster 2 sont mises en gras, avec des commentaires.
API Java
Cette section est fournie à titre informatif uniquement. Les implémenteurs Keymaster n'implémentent ni n'utilisent l'API Java. Ces informations sont fournies pour aider les développeurs à comprendre comment les applications utilisent la fonctionnalité. Les composants système peuvent l'utiliser différemment. C'est pourquoi il est essentiel que cette section ne soit pas traitée comme normative.