Vérifier des paires de clés intégrées au matériel avec l'attestation de clé

L'attestation de clé vous permet de vous assurer que les clés que vous utilisez dans votre application sont stockées dans le keystore intégré au matériel d'un appareil. Les sections suivantes décrivent comment valider les propriétés des clés intégrées au matériel et interpréter les données d'extension des certificats d'attestation.

Remarque : Avant de valider les propriétés des clés intégrées au matériel d'un appareil dans un environnement de production, assurez-vous que l'appareil prend en charge l'attestation de clé au niveau du matériel. Pour ce faire, vérifiez que la chaîne de certificats d'attestation contient un certificat racine signé avec la clé racine d'attestation Google et que l'élément attestationSecurityLevel, qui figure dans la structure de données de description de la clé, est défini sur le niveau de sécurité TrustedEnvironment.

En outre, il est important de vérifier les signatures de la chaîne de certificats et de vous assurer qu'aucune des clés de la chaîne n'a été révoquée en consultant la liste des états de révocation des certificats. Si toutes les attestations ne sont pas valides et que la racine n'est pas la clé racine Google, ne faites pas entièrement confiance à l'attestation. Notez toutefois que les appareils contenant des certificats révoqués restent au moins aussi fiables que les appareils qui ne prennent en charge que l'attestation logicielle. Une attestation entièrement valide constitue un indicateur positif. Si vous n'en avez pas, cela constitue un indicateur neutre, et non négatif.

Récupérer et valider une paire de clés intégrée au matériel

Lors de l'attestation de clé, vous spécifiez l'alias d'une paire de clés et récupérez sa chaîne de certificats, que vous pouvez utiliser pour valider les propriétés de cette paire.

Si l'appareil prend en charge l'attestation de clé au niveau du matériel, le certificat racine de cette chaîne est signé à l'aide d'une clé racine d'attestation provisionnée de manière sécurisée sur le keystore intégré au matériel de l'appareil.

Remarque : Sur les appareils équipés d'une attestation de clé au niveau du matériel, d'Android 7.0 (niveau d'API 24) ou version ultérieure et des services Google Play, le certificat racine est signé avec la clé racine d'attestation Google. Vérifiez que ce certificat racine figure parmi ceux énumérés dans la section sur les certificats racine.

Pour implémenter l'attestation de clé, procédez comme suit :

  1. Utilisez la méthode getCertificateChain() d'un objet KeyStore pour obtenir une référence à la chaîne de certificats X.509 associés au keystore intégré au matériel.
  2. Envoyez les certificats à un serveur distinct de confiance pour la validation.

    Attention : N'effectuez pas le processus de validation suivant sur le même appareil que le keystore. Si le système Android de cet appareil est compromis, le processus de validation peut faire confiance à un élément non fiable.

  3. Obtenez une référence à la bibliothèque d'analyse et de validation de la chaîne de certificats X.509 la plus adaptée à votre ensemble d'outils. Vérifiez que le certificat public racine est fiable et que chaque certificat signe le certificat suivant de la chaîne.

  4. Vérifiez l'état de révocation de chaque certificat pour vous assurer qu'aucun des certificats n'a été révoqué.

  5. Si vous le souhaitez, inspectez l'extension de certificat d'informations de provisionnement qui n'est présente que dans les chaînes de certificats les plus récentes.

    Obtenez une référence à la bibliothèque d'analyseur CBOR la plus adaptée à votre ensemble d'outils. Recherchez le certificat le plus proche de la racine qui contient l'extension de certificat d'informations de provisionnement. Utilisez l'analyseur pour extraire de ce certificat les données de l'extension de certificat d'informations de provisionnement.

    Pour en savoir plus, consultez la section sur le schéma de données des extensions d'informations de provisionnement.

  6. Obtenez une référence à la bibliothèque d'analyseur ASN.1 la plus adaptée à votre ensemble d'outils. Recherchez le certificat le plus proche de la racine qui contient l'extension de certificat d'attestation de clé. Si l'extension de certificat d'informations de provisionnement était présente, l'extension de certificat d'attestation de clé doit figurer dans le certificat suivant. Utilisez l'analyseur pour extraire de ce certificat les données de l'extension de certificat d'attestation de clé.

    Attention : Ne partez pas du principe que l'extension de certificat d'attestation de clé se trouve dans le certificat d'entité finale de la chaîne. Seule la première occurrence de l'extension de la chaîne peut être fiable. Toutes les autres instances de l'extension n'ont pas été émises par le matériel sécurisé. Elles pourraient avoir été émises par un pirate informatique qui étend la chaîne en tentant de créer de fausses attestations pour des clés qui ne sont pas fiables.

    L'exemple d'attestation de clé utilise l'analyseur ASN.1 de Bouncy Castle pour extraire les données d'extension d'un certificat d'attestation. Vous pouvez utiliser cet exemple comme référence pour créer votre propre analyseur.

    Pour en savoir plus, consultez la section sur le schéma de données de l'extension d'attestation de clé.

  7. Vérifiez la cohérence des données d'extension que vous avez récupérées aux étapes précédentes et comparez-les à l'ensemble des valeurs que la clé intégrée au matériel devrait contenir.

Certificats racines

La fiabilité de l'attestation dépend du certificat racine de la chaîne. Les appareils Android ayant réussi les tests requis pour disposer de la suite d'applications Google, y compris Google Play, et lancés avec Android 7.0 (niveau d'API 24) ou version ultérieure doivent utiliser des clés d'attestation signées par le certificat racine d'attestation du matériel Google. Notez que l'attestation n'était pas requise avant Android 8.0 (niveau d'API 26). La clé publique racine est la suivante :

  -----BEGIN PUBLIC KEY-----
  MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xU
  FmOr75gvMsd/dTEDDJdSSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5j
  lRfdnJLmN0pTy/4lj4/7tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y
  //0rb+T+W8a9nsNL/ggjnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73X
  pXyTqRxB/M0n1n/W9nGqC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYI
  mQQcHtGl/m00QLVWutHQoVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB
  +TxywElgS70vE0XmLD+OJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7q
  uvmag8jfPioyKvxnK/EgsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgp
  Zrt3i5MIlCaY504LzSRiigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7
  gLiMm0jhO2B6tUXHI/+MRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82
  ixPvZtXQpUpuL12ab+9EaDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+
  NpUFgNPN9PvQi8WEg5UmAGMCAwEAAQ==
  -----END PUBLIC KEY-----
Certificats racine précédemment émis
    -----BEGIN CERTIFICATE-----
    MIIFYDCCA0igAwIBAgIJAOj6GWMU0voYMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
    BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTYwNTI2MTYyODUyWhcNMjYwNTI0MTYy
    ODUyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
    AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
    Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
    tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
    nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
    C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
    oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
    JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
    sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
    igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
    RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
    aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
    AGMCAwEAAaOBpjCBozAdBgNVHQ4EFgQUNmHhAHyIBQlRi0RsR/8aTMnqTxIwHwYD
    VR0jBBgwFoAUNmHhAHyIBQlRi0RsR/8aTMnqTxIwDwYDVR0TAQH/BAUwAwEB/zAO
    BgNVHQ8BAf8EBAMCAYYwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cHM6Ly9hbmRyb2lk
    Lmdvb2dsZWFwaXMuY29tL2F0dGVzdGF0aW9uL2NybC8wDQYJKoZIhvcNAQELBQAD
    ggIBACDIw41L3KlXG0aMiS//cqrG+EShHUGo8HNsw30W1kJtjn6UBwRM6jnmiwfB
    Pb8VA91chb2vssAtX2zbTvqBJ9+LBPGCdw/E53Rbf86qhxKaiAHOjpvAy5Y3m00m
    qC0w/Zwvju1twb4vhLaJ5NkUJYsUS7rmJKHHBnETLi8GFqiEsqTWpG/6ibYCv7rY
    DBJDcR9W62BW9jfIoBQcxUCUJouMPH25lLNcDc1ssqvC2v7iUgI9LeoM1sNovqPm
    QUiG9rHli1vXxzCyaMTjwftkJLkf6724DFhuKug2jITV0QkXvaJWF4nUaHOTNA4u
    JU9WDvZLI1j83A+/xnAJUucIv/zGJ1AMH2boHqF8CY16LpsYgBt6tKxxWH00XcyD
    CdW2KlBCeqbQPcsFmWyWugxdcekhYsAWyoSf818NUsZdBWBaR/OukXrNLfkQ79Iy
    ZohZbvabO/X+MVT3rriAoKc8oE2Uws6DF+60PV7/WIPjNvXySdqspImSN78mflxD
    qwLqRBYkA3I75qppLGG9rp7UCdRjxMl8ZDBld+7yvHVgt1cVzJx9xnyGCC23Uaic
    MDSXYrB4I4WHXPGjxhZuCuPBLTdOLU8YRvMYdEvYebWHMpvwGCF6bAx3JBpIeOQ1
    wDB5y0USicV3YgYGmi+NZfhA4URSh77Yd6uuJOJENRaNVTzk
    -----END CERTIFICATE-----
  
    -----BEGIN CERTIFICATE-----
    MIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
    BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz
    NzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
    AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
    Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
    tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
    nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
    C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
    oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
    JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
    sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
    igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
    RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
    aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
    AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
    IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
    VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu
    XKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U
    h6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno
    L/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok
    QBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA
    D32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI
    mMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW
    Fua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91
    oeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o
    jm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB
    ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH
    ex0SdDrx+tWUDqG8At2JHA==
    -----END CERTIFICATE-----
  
    -----BEGIN CERTIFICATE-----
    MIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
    BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx
    MDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
    AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
    Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
    tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
    nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
    C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
    oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
    JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
    sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
    igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
    RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
    aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
    AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
    IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
    VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG
    zWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan
    63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T
    QH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ
    erGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL
    Zez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a
    0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH
    7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b
    HQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w
    lZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2
    Ob3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7
    mD/vFDkzF+wm7cyWpQpCVQ==
    -----END CERTIFICATE-----
  
    -----BEGIN CERTIFICATE-----
    MIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
    BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw
    NzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
    AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
    Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
    tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
    nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
    C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
    oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
    JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
    sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
    igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
    RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
    aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
    AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
    IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
    VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7
    174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC
    W/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G
    tkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx
    oSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG
    1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF
    mr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz
    lHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw
    n6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu
    zbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo
    vaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn
    w1IdYIg2Wxg7yHcQZemFQg==
    -----END CERTIFICATE-----
  

Si le certificat racine de la chaîne d'attestation que vous recevez contient cette clé publique et qu'aucun des certificats de la chaîne n'a été révoqué, alors vous savez que :

  1. Votre clé se trouve dans du matériel qui, selon Google, est sécurisé.
  2. Il possède les propriétés décrites dans le certificat d'attestation.

Si la chaîne d'attestation comporte une autre clé publique racine, alors Google ne revendique pas la sécurité du matériel. Cela ne signifie pas que la sécurité de votre clé est compromise, mais que l'attestation ne prouve pas qu'elle se trouve dans du matériel sécurisé. Ajustez vos hypothèses de sécurité en conséquence.

Si le certificat racine ne contient pas la clé publique sur cette page, deux raisons sont probables :

  • L'appareil a probablement été lancé avec une version d'Android antérieure à 7.0 et ne prend donc pas en charge l'attestation du matériel. Dans ce cas, Android dispose d'une implémentation logicielle d'attestation qui produit le même type de certificat d'attestation, mais qui est signée avec une clé codée en dur dans le code source Android. Comme cette clé de signature n'est pas secrète, il est possible que l'attestation ait été créée par un pirate informatique qui prétend fournir du matériel sécurisé.
  • L'autre raison probable est que l'appareil n'est pas un appareil Google Play. Dans ce cas, le fabricant de l'appareil est libre de créer sa propre racine et de formuler les revendications qu'il souhaite sur la signification de l'attestation. Consultez la documentation du fabricant de l'appareil. Notez qu'au moment où nous écrivons ces lignes, Google n'a connaissance d'aucun fabricant d'appareils ayant utilisé cette méthode.

Liste des états de révocation des certificats

Les clés d'attestation peuvent être révoquées pour plusieurs raisons, par exemple en cas de mauvaise gestion ou de suspicion d'extraction par un pirate informatique. Par conséquent, il est essentiel que l'état de chaque certificat d'une chaîne d'attestation soit validé par rapport à la liste officielle des états de révocation des certificats (LRC). Cette liste est gérée par Google et publiée à l'adresse suivante : https://android.googleapis.com/attestation/status. L'en-tête Cache-Control de la réponse HTTP détermine la fréquence de recherche des mises à jour afin qu'une requête réseau ne soit pas requise pour chaque certificat en cours de validation. Cette URL renvoie un fichier JSON contenant l'état de révocation des certificats dont l'état n'est pas valide. Le format du fichier JSON respecte la définition de schéma JSON suivante (brouillon 07) :

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "entries": {
      "description" : "Each entry represents the status of an attestation key. The dictionary-key is the certificate serial number in lowercase hex.",
      "type": "object",
      "propertyNames": {
        "pattern": "^[a-f1-9][a-f0-9]*$"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "status": {
            "description": "[REQUIRED] Current status of the key.",
            "type": "string",
            "enum": ["REVOKED", "SUSPENDED"]
          },
          "expires": {
            "description": "[OPTIONAL] UTC date when certificate expires in ISO8601 format (YYYY-MM-DD). Can be used to clear expired certificates from the status list.",
            "type": "string",
            "format": "date"
          },
          "reason": {
            "description": "[OPTIONAL] Reason for the current status.",
            "type": "string",
            "enum": ["UNSPECIFIED", "KEY_COMPROMISE", "CA_COMPROMISE", "SUPERSEDED", "SOFTWARE_FLAW"]
          },
          "comment": {
            "description": "[OPTIONAL] Free form comment about the key status.",
            "type": "string",
            "maxLength": 140
          }
        },
        "required": ["status"],
        "additionalProperties": false
      }
    }
  },
  "required": ["entries"],
  "additionalProperties": false
}

Exemple de LRC :

{
  "entries": {
    "2c8cdddfd5e03bfc": {
      "status": "REVOKED",
      "expires": "2020-11-13",
      "reason": "KEY_COMPROMISE",
      "comment": "Key stored on unsecure system"
    },
    "c8966fcb2fbb0d7a": {
      "status": "SUSPENDED",
      "reason": "SOFTWARE_FLAW",
      "comment": "Bug in keystore causes this key malfunction b/555555"
    }
  }
}

Anciennes LRC

Les URL de LRC intégrées aux anciens certificats d'attestation continuent de fonctionner. Les nouveaux certificats d'attestation ne contiennent plus d'extension d'URL de LRC. L'état des anciens certificats est également inclus dans la liste des états des attestations. Les développeurs peuvent ainsi passer de manière sécurisée à la liste d'états des attestations pour les nouveaux et les anciens certificats. L'exemple d'attestation de clé contient un modèle illustrant comment valider correctement les clés d'attestation Android.

Schéma de données des extensions d'attestation de clé

L'extension d'attestation de clé porte l'OID 1.3.6.1.4.1.11129.2.1.17. L'extension stocke les informations selon un schéma ASN.1. Pour afficher le schéma correspondant à la version d'attestation que vous utilisez, sélectionnez l'onglet approprié dans la liste des schémas suivante :

Version 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  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,
    teeEnforced  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,
    teeEnforced  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,
    applicationId  [601] EXPLICIT OCTET_STRING 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,
    teeEnforced  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,
    applicationId  [601] EXPLICIT OCTET_STRING 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,
    teeEnforced  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,
    applicationId  [601] EXPLICIT OCTET_STRING 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,
    teeEnforced  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,
    applicationId  [601] EXPLICIT OCTET_STRING 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),
}

La liste suivante présente une description de chaque élément du schéma :

KeyDescription

Cette séquence de valeurs présente des informations générales sur la paire de clés validée via une attestation de clé et permet d'accéder facilement à des détails supplémentaires.

attestationVersion
Version de la fonctionnalité d'attestation de clé.
ValeurVersion
1Keymaster version 2.0
2Keymaster version 3.0
3Keymaster version 4.0
4Keymaster version 4.1
100KeyMint version 1.0
200KeyMint version 2.0
attestationSecurityLevel

Niveau de sécurité de l'attestation.

Avertissement : Bien qu'il soit possible d'attester des clés stockées dans le système Android, c'est-à-dire si la valeur de attestationSecurityLevel est définie sur Logiciel, vous ne pouvez pas vous fier à ces attestations si le système Android est compromis.

keymasterVersion/keyMintVersion
Version de la couche d'abstraction matérielle (HAL) Keymaster ou KeyMint.
ValeurVersion
0Keymaster version 0.2 ou 0.3
1Keymaster version 1.0
2Keymaster version 2.0
3Keymaster version 3.0
4Keymaster version 4.0
41Keymaster version 4.1
100KeyMint version 1.0
200KeyMint version 2.0
keymasterSecurityLevel/keyMintSecurityLevel
Niveau de sécurité de l'implémentation de Keymaster/KeyMint.
attestationChallenge
contient le défi fourni au moment de la création de la clé. Vérifiez si cette valeur correspond à celle fournie par votre serveur, telle qu'elle est stockée dans la balise d'autorisation Tag::ATTESTATION_CHALLENGE. Sinon, votre service risque d'être vulnérable à la relecture d'anciens certificats d'attestation.
uniqueId
Cette valeur identifie l'appareil, mais seulement pendant une période limitée. Elle est calculée et n'est utilisée que par les applications système. Dans toutes les autres applications, uniqueId est vide.
softwareEnforced
Facultatif. Liste d'autorisations Keymaster/KeyMint appliquée par le système Android, et non par l'environnement d'exécution sécurisé (TEE) de l'appareil.
teeEnforced
Facultatif. Liste d'autorisations Keymaster/KeyMint appliquée par le TEE de l'appareil.

SecurityLevel

Cette structure de données indique dans quelle mesure une fonctionnalité logicielle, telle qu'une paire de clés, est protégée selon son emplacement dans l'appareil.

Comme la structure de données est une énumération, elle prend exactement en charge l'une des valeurs suivantes :

Logiciel
La logique de création et de gestion de la fonctionnalité est mise en œuvre dans le système Android. Pour les besoins de la création et du stockage des paires de clés, cet emplacement est moins sécurisé que le TEE, mais il l'est plus que l'espace de traitement de votre application.
TrustedEnvironment
La logique de création et de gestion de la fonctionnalité est mise en œuvre dans du matériel sécurisé, tel qu'un TEE. Pour les besoins de création et de stockage des paires de clés, cet emplacement est plus sécurisé, car le matériel sécurisé est très résistant aux menaces à distance.
StrongBox
La logique de création et de gestion de la fonctionnalité est mise en œuvre dans un module matériel de sécurité dédié. Pour les besoins de création et de stockage des paires de clés, cet emplacement est plus sécurisé, car il résiste très bien aux attaques à distance et aux attaques matérielles contre le module.

AuthorizationList

Cette structure de données contient les propriétés de la paire de clés, telles que définies dans la couche d'abstraction matérielle (HAL) Keymaster ou KeyMint. Vous comparez ces valeurs à l'état actuel de l'appareil ou à un ensemble de valeurs attendues pour vérifier qu'une paire de clés valide peut toujours être utilisée dans votre application.

Chaque nom de champ correspond à une balise d'autorisation Keymaster/KeyMint portant un nom similaire. Par exemple, le champ keySize d'une liste d'autorisations correspond à la balise d'autorisation Tag::KEY_SIZE.

Chaque champ de la liste suivante est facultatif :

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

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

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

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

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

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

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

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

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

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

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

earlyBootOnly

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

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

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

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

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

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

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

trustedUserPresenceRequired

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

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

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

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

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

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

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

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

unlockedDeviceRequired

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

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

allApplications

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

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

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

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

rollbackResistant

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

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

rootOfTrust

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

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

osVersion

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

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

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

osPatchLevel

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

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

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

attestationApplicationId

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

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

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

attestationIdBrand

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

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

attestationIdDevice

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

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

attestationIdProduct

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

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

attestationIdSerial

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

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

attestationIdImei

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

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

attestationIdMeid

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

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

attestationIdManufacturer

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

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

attestationIdModel

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

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

vendorPatchLevel

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

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

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

bootPatchLevel

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

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

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

deviceUniqueAttestation

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

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

RootOfTrust

Cet ensemble de valeurs définit les informations clés sur l'état de l'appareil.

Chaque champ de la liste suivante est obligatoire :

verifiedBootKey

Un hachage sécurisé de la clé qui valide l'image système. Il est recommandé d'utiliser l'algorithme SHA-256 pour ce hachage.

deviceLocked
Vrai si le bootloader de l'appareil est verrouillé, ce qui active la vérification du démarrage validé et empêche le flash d'une image d'appareil non signée sur l'appareil. Pour en savoir plus sur cette fonctionnalité, consultez la documentation Valider le démarrage.
verifiedBootState
État de démarrage de l'appareil, selon la fonctionnalité de démarrage validé.
verifiedBootHash

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

Condensé de toutes les données protégées par le démarrage validé. Pour les appareils qui utilisent la mise en œuvre du démarrage validé Android, cette valeur contient le condensé de la structure VBMeta, ou structure de métadonnées du démarrage validé.

Pour en savoir plus sur le calcul de cette valeur, consultez le condensé des VBMeta.

VerifiedBootState

Cette structure de données fournit l'état de démarrage actuel de l'appareil, qui représente le niveau de protection accordé à l'utilisateur et aux applications une fois le démarrage terminé. Pour en savoir plus sur cette fonctionnalité, consultez la section État de démarrage dans la documentation Valider le démarrage.

Cette structure de données est une énumération. Elle prend donc exactement en charge l'une des valeurs suivantes :

Validé

Indique une chaîne de confiance complète, y compris le bootloader, la partition de démarrage et toutes les partitions validées.

Lorsque l'appareil est dans cet état de démarrage, verifiedBootKey correspond au hachage du certificat intégré à l'appareil, que le fabricant de l'appareil ajoute à la mémoire ROM de l'appareil en usine.

SelfSigned

Indique que le certificat intégré à l'appareil a validé la partition de démarrage de l'appareil et que la signature est valide.

Lorsque l'appareil est dans cet état de démarrage, verifiedBootKey est le hachage d'un certificat installé par l'utilisateur, qui signe une partition de démarrage que l'utilisateur ajoute à l'appareil à la place de la partition de démarrage d'origine fournie par le fabricant.

Non validé
Indique que l'utilisateur peut modifier l'appareil librement. Il appartient donc à l'utilisateur de vérifier l'intégrité de l'appareil.
Échec
Indique que la validation de l'appareil a échoué. Le certificat d'attestation ne doit jamais utiliser cette valeur pour VerifiedBootState.

AttestationApplicationId

Cette structure de données 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. L'ID peut comprendre plusieurs packages si et seulement si plusieurs packages partagent le même UID. La chaîne d'octets est elle-même formatée 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]), ...}

Schéma de données des extensions 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. Cette extension suit un schéma CDDL.

  {
        1 : int,   ; certificates issued
  }

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.