Attestation de clé et d'ID

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

La méthode attestKey est considérée comme une opération de clé publique sur la clé attestée, car elle peut être appelée à tout moment et n'a pas besoin de 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.
ValeurVersion de KeyMint ou Keymaster
1Keymaster version 2.0
2Keymaster version 3.0
3Keymaster version 4.0
4Keymaster version 4.1
100KeyMint version 1.0
200KeyMint version 2.0
300KeyMint version 3.0
400KeyMint 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.
ValeurVersion de KeyMint ou Keymaster
2Keymaster version 2.0
3Keymaster version 3.0
4Keymaster version 4.0
41Keymaster version 4.1
100KeyMint version 1.0
200KeyMint version 2.0
300KeyMint version 3.0
400KeyMint 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 est Verified).
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.

Les champs suivants sont présents dans les attestations générées par KeyMint 4 :
purpose
Correspond à la balise d'autorisation Tag::PURPOSE, qui utilise une valeur d'ID de balise de 1.
algorithm

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

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

keySize
Correspond à la balise d'autorisation Tag::KEY_SIZE, qui utilise une valeur d'ID de balise de 3.
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 KeyMint Tag::RSA_OAEP_MGF_DIGEST, qui utilise une valeur d'ID de balise de 203.
rollbackResistance

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

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

earlyBootOnly

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

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

activeDateTime
Correspond à la balise d'autorisation Tag::ACTIVE_DATETIME, qui utilise une valeur d'ID de balise de 400.
originationExpireDateTime
Correspond à la balise d'autorisation 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 classe Signature renvoyée par un appel à getPackageInfo(). L'extrait de code suivant présente un exemple d'ensemble :

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

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 ou TEE.

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 de Tag::CREATION_DATETIME par 2592000000, en supprimant tout reste. T change tous les 30 jours (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C correspond à la valeur de Tag::APPLICATION_ID.
  • R est défini sur 1 si Tag::RESET_SINCE_ID_ROTATION est présent dans le paramètre attest_params de l'appel attest_key, ou sur 0 si 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 :

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

Pour prendre en charge l'attestation de l'ID de l'appareil, un appareil atteste de ces identifiants. Tous les appareils 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.