Keystore offre un luogo più sicuro per creare, archiviare e utilizzare le chiavi crittografiche in modo controllato. Quando è disponibile e utilizzato l'archivio chiavi supportato dall'hardware, il materiale della chiave è più sicuro contro l'estrazione dal dispositivo e KeyMint (in precedenza Keymaster) applica restrizioni difficili da aggirare.
Tuttavia, questo è vero solo se le chiavi del keystore sono note per essere in spazio di archiviazione supportato dall'hardware. In Keymaster 1, non era possibile per le app o i server remoti verificare in modo affidabile se questo era il caso. Il daemon del keystore ha caricato l'Hardware Abstraction Layer (HAL) di Keymaster disponibile e ha creduto a tutto ciò che diceva l'HAL in merito al supporto hardware delle chiavi.
Per risolvere questo problema, in Android 7.0 (Keymaster 2) è stata introdotta l'attestazione della chiave e in Android 8.0 (Keymaster 3) è stata introdotta l'attestazione dell'ID.
L'attestazione della chiave ha lo scopo di fornire un modo per determinare con certezza se una coppia di chiavi asimmetriche è supportata dall'hardware, quali sono le proprietà della chiave e quali vincoli vengono applicati al suo utilizzo.
L'attestazione dell'ID consente al dispositivo di fornire la prova dei suoi identificatori hardware, come il numero di serie o l'IMEI.
Attestazione chiave
Per supportare l'attestazione della chiave, Android 7.0 ha introdotto un insieme di tag, tipi e metodi per l'HAL.
Tag
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Tipo
Keymaster 2 e versioni precedenti
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
Metodo AttestKey
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 e versioni precedenti
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
è la struttura del dispositivo Keymaster.keyToAttest
è il blob della chiave restituito dagenerateKey
per il quale viene creata l'attestazione.attestParams
è un elenco di tutti i parametri necessari per l'attestazione. Sono inclusiTag::ATTESTATION_CHALLENGE
e forseTag::RESET_SINCE_ID_ROTATION
, nonchéTag::APPLICATION_ID
eTag::APPLICATION_DATA
. Gli ultimi due sono necessari per decriptare il blob della chiave se sono stati specificati durante la generazione della chiave.certChain
è il parametro di output, che restituisce un array di certificati. La voce 0 è il certificato di attestazione, il che significa che certifica la chiave dikeyToAttest
e contiene l'estensione di attestazione.
Il metodo attestKey
è considerato un'operazione con chiave pubblica sulla chiave attestata, perché può essere chiamato in qualsiasi momento e non deve soddisfare vincoli di autorizzazione. Ad esempio, se la chiave attestata richiede l'autenticazione
dell'utente per l'utilizzo, è possibile generare un'attestazione senza
l'autenticazione dell'utente.
Certificato di attestazione
Il certificato di attestazione è un certificato X.509 standard, con un'estensione di attestazione facoltativa che contiene una descrizione della chiave attestata. Il certificato è firmato con una chiave di attestazione certificata. La chiave di attestazione potrebbe utilizzare un algoritmo diverso da quello della chiave da attestare.
Il certificato di attestazione contiene i campi riportati nella tabella seguente e non può contenere campi aggiuntivi. Alcuni campi specificano un valore fisso. I test CTS verificano che i contenuti del certificato siano esattamente quelli definiti.
SEQUENCE del certificato
Nome campo (vedi RFC 5280) | Valore |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | AlgorithmIdentifier dell'algoritmo utilizzato per firmare la chiave: ECDSA per le chiavi EC, RSA per le chiavi RSA. |
signatureValue | BIT STRING, firma calcolata su tbsCertificate con codifica ASN.1 DER. |
TBSCertificate SEQUENCE
Nome campo (vedi RFC 5280) | Valore |
---|---|
version |
INTEGER 2 (indica il certificato v3) |
serialNumber |
INTEGER 1 (valore fisso: lo stesso per tutte le certificazioni) |
signature |
AlgorithmIdentifier dell'algoritmo utilizzato per firmare la chiave: ECDSA per le chiavi EC, RSA per le chiavi RSA. |
issuer |
Uguale al campo oggetto della chiave di attestazione batch. |
validity |
SEQUENZA di due date, contenente i valori di
Tag::ACTIVE_DATETIME e Tag::USAGE_EXPIRE_DATETIME .
Questi valori sono espressi in millisecondi a partire dal 1° gennaio 1970.
Consulta RFC 5280 per le rappresentazioni corrette delle date nei certificati.Se Tag::ACTIVE_DATETIME non è presente, utilizza il valore di
Tag::CREATION_DATETIME . Se
Tag::USAGE_EXPIRE_DATETIME non è presente, utilizza la data di scadenza
del certificato della chiave di attestazione batch. |
subject |
CN = "Android Keystore Key" (valore fisso: lo stesso su tutti i certificati) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo contenente la chiave pubblica attestata. |
extensions/Key Usage |
digitalSignature: impostare se la chiave ha lo scopo KeyPurpose::SIGN o
KeyPurpose::VERIFY . Tutti gli altri bit non impostati. |
extensions/CRL Distribution Points |
Valore TBD |
extensions/"attestation" |
L'OID è 1.3.6.1.4.1.11129.2.1.17; il contenuto è definito nella sezione Estensione Attestazione di seguito. Come per tutte le estensioni dei certificati X.509, il contenuto è rappresentato come OCTET_STRING contenente una codifica DER della sequenza di attestazione. |
Estensione dell'attestazione
L'estensione attestation
ha l'OID
1.3.6.1.4.1.11129.2.1.17
. Contiene
informazioni sulla coppia di chiavi sottoposta ad attestazione e sullo stato del dispositivo al
momento della generazione delle chiavi.
I tipi di tag Keymaster/KeyMint definiti nella specifica dell'interfaccia AIDL vengono convertiti in tipi ASN.1 nel seguente modo:
Tipo KeyMint o Keymaster | Tipo ASN.1 | Note |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
Millisecondi a partire dal 1° gennaio 1970 00:00:00 GMT. |
BOOL |
NULL |
La presenza del tag significa true, l'assenza significa false. |
BIGNUM |
Nessun tag ha questo tipo, quindi non è definita alcuna mappatura. | |
BYTES |
OCTET_STRING |
Schema
I contenuti dell'estensione di attestazione sono descritti dal seguente schema ASN.1:
Versione 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), }
Versione 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), }
Versione 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), }
Versione 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), }
Versione 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), }
Versione 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), }
Versione 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), }
Versione 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), }
Campi KeyDescription
-
attestationVersion
-
La versione dello schema ASN.1.
Valore Versione KeyMint o Keymaster 1 Keymaster versione 2.0 2 Versione Keymaster 3.0 3 Versione Keymaster 4.0 4 Versione Keymaster 4.1 100 KeyMint versione 1.0 200 KeyMint versione 2.0 300 KeyMint versione 3.0 400 KeyMint versione 4.0 -
attestationSecurityLevel
-
Il livello di sicurezza della posizione in cui è memorizzata la chiave attestata.
-
keymasterVersion
/keyMintVersion
-
La versione dell'implementazione HAL KeyMint o Keymaster.
Valore Versione KeyMint o Keymaster 2 Keymaster versione 2.0 3 Versione Keymaster 3.0 4 Versione Keymaster 4.0 41 Versione Keymaster 4.1 100 KeyMint versione 1.0 200 KeyMint versione 2.0 300 KeyMint versione 3.0 400 KeyMint versione 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Il livello di sicurezza dell'implementazione di KeyMint o Keymaster.
-
attestationChallenge
- La sfida fornita al momento della generazione della chiave.
-
uniqueId
- Un identificatore del dispositivo sensibile alla privacy che le app di sistema possono richiedere al momento della generazione della chiave. Se l'ID univoco non è richiesto, questo campo è vuoto. Per maggiori dettagli, consulta la sezione ID univoco.
-
softwareEnforced
-
L'elenco di autorizzazioni KeyMint o Keymaster applicato dal sistema Android. Queste informazioni vengono raccolte o generate dal codice nella
piattaforma. Può essere considerato attendibile se il dispositivo esegue un
sistema operativo conforme al
modello di sicurezza della piattaforma Android
(ovvero il bootloader del dispositivo è bloccato e il
verifiedBootState
èVerified
). -
hardwareEnforced
- L'elenco di autorizzazioni KeyMint o Keymaster applicato dal Trusted Execution Environment (TEE) del dispositivo o da StrongBox. Queste informazioni vengono raccolte o generate dal codice nell'hardware sicuro e non sono controllate dalla piattaforma. Ad esempio, le informazioni possono provenire dal bootloader o tramite un canale di comunicazione sicuro che non implica l'attendibilità della piattaforma.
Valori di SecurityLevel
Il valore SecurityLevel
indica la misura in cui un
elemento correlato a Keystore (ad esempio coppia di chiavi e attestazione) è resiliente
agli attacchi.
Valore | Significato |
---|---|
Software |
Sicuro, a condizione che il sistema Android del dispositivo sia conforme al
modello di sicurezza della piattaforma Android
(ovvero, il bootloader del dispositivo è bloccato e il
verifiedBootState è
Verified ). |
TrustedEnvironment |
Sicuro finché il TEE non è compromesso. I requisiti di isolamento per i TEE sono definiti nelle sezioni da 9.11 [C-1-1] a [C-1-4] del Compatibility Definition Document di Android. Gli TEE sono altamente resistenti alla compromissione remota e moderatamente resistenti alla compromissione tramite attacco hardware diretto. |
StrongBox |
Sicuro finché StrongBox non è compromesso. StrongBox è implementato in un elemento sicuro simile a un modulo di sicurezza hardware. I requisiti di implementazione per StrongBox sono definiti nella sezione 9.11.2 del Compatibility Definition Document di Android. StrongBox è altamente resistente alla compromissione remota e alla compromissione tramite attacco hardware diretto (ad esempio, manomissione fisica e attacchi side-channel). |
Campi AuthorizationList
Ogni campo corrisponde a un tag di autorizzazione Keymaster/KeyMint della
specifica dell'interfaccia AIDL.
La specifica è la fonte di verità sui tag di autorizzazione: il loro
significato, il formato dei loro contenuti, se devono essere visualizzati nei
campi softwareEnforced
o hardwareEnforced
dell'oggetto
KeyDescription
, se sono reciprocamente esclusivi con
altri tag e così via. Tutti i campi AuthorizationList
sono facoltativi.
Ogni campo ha un tag specifico per il contesto EXPLICIT
uguale al numero del tag KeyMint o Keymaster, che consente una rappresentazione più compatta dei dati in AuthorizationList
. Il parser ASN.1 deve quindi conoscere
il tipo di dati previsto per ogni tag specifico del contesto. Ad esempio,
Tag::USER_AUTH_TYPE
è definito come ENUM | 504
. Nello schema dell'estensione di attestazione, il campo purpose
in AuthorizationList
è specificato come userAuthType [504] EXPLICIT INTEGER OPTIONAL
. La codifica ASN.1
conterrà quindi il tag specifico per il contesto 504
anziché il
tag di classe UNIVERSAL
per il tipo ASN.1 INTEGER
, ovvero
10
.
-
purpose
-
Corrisponde al tag di autorizzazione
Tag::PURPOSE
, che utilizza un valore ID tag pari a 1. -
algorithm
-
Corrisponde al tag di autorizzazione
Tag::ALGORITHM
, che utilizza un valore ID tag pari a 2.In un oggetto di attestazione
AuthorizationList
, il valore dell'algoritmo è sempreRSA
oEC
. -
keySize
-
Corrisponde al tag di autorizzazione
Tag::KEY_SIZE
, che utilizza un valore ID tag pari a 3. -
blockMode
-
Corrisponde al tag di autorizzazione
Tag::BLOCK_MODE
, che utilizza un valore ID tag pari a 4. -
digest
-
Corrisponde al tag di autorizzazione
Tag::DIGEST
, che utilizza un valore ID tag pari a 5. -
padding
-
Corrisponde al tag di autorizzazione
Tag::PADDING
, che utilizza un valore ID tag pari a 6. -
callerNonce
-
Corrisponde al tag di autorizzazione
Tag::CALLER_NONCE
, che utilizza un valore ID tag pari a 7. -
minMacLength
-
Corrisponde al tag di autorizzazione
Tag::MIN_MAC_LENGTH
, che utilizza un valore ID tag pari a 8. -
ecCurve
-
Corrisponde al tag di autorizzazione
Tag::EC_CURVE
, che utilizza un valore ID tag pari a 10.Il set di parametri utilizzato per generare una coppia di chiavi con curva ellittica (EC), che utilizza ECDSA per la firma e la verifica, all'interno del keystore del sistema Android.
-
rsaPublicExponent
-
Corrisponde al tag di autorizzazione
Tag::RSA_PUBLIC_EXPONENT
, che utilizza un valore ID tag pari a 200. -
mgfDigest
-
Presente solo nella versione dell'attestazione della chiave >= 100.
Corrisponde al tag di autorizzazione KeyMintTag::RSA_OAEP_MGF_DIGEST
, che utilizza un valore ID tag pari a 203. -
rollbackResistance
-
Presente solo nella versione dell'attestazione della chiave >= 3.
Corrisponde al tag di autorizzazione
Tag::ROLLBACK_RESISTANCE
, che utilizza un valore ID tag pari a 303. -
earlyBootOnly
-
Presente solo nella versione dell'attestazione della chiave >= 4.
Corrisponde al tag di autorizzazione
Tag::EARLY_BOOT_ONLY
, che utilizza un valore ID tag pari a 305. -
activeDateTime
-
Corrisponde al tag di autorizzazione
Tag::ACTIVE_DATETIME
, che utilizza un valore ID tag pari a 400. -
originationExpireDateTime
-
Corrisponde al tag di autorizzazione
Tag::ORIGINATION_EXPIRE_DATETIME
, che utilizza un valore ID tag pari a 401. -
usageExpireDateTime
-
Corrisponde al tag di autorizzazione
Tag::USAGE_EXPIRE_DATETIME
, che utilizza un valore ID tag pari a 402. -
usageCountLimit
-
Corrisponde al tag di autorizzazione
Tag::USAGE_COUNT_LIMIT
, che utilizza un valore ID tag pari a 405. -
userSecureId
-
Corrisponde al tag di autorizzazione
Tag::USER_SECURE_ID
, che utilizza un valore ID tag pari a 502. -
noAuthRequired
-
Corrisponde al tag di autorizzazione
Tag::NO_AUTH_REQUIRED
, che utilizza un valore ID tag pari a 503. -
userAuthType
-
Corrisponde al tag di autorizzazione
Tag::USER_AUTH_TYPE
, che utilizza un valore ID tag pari a 504. -
authTimeout
-
Corrisponde al tag di autorizzazione
Tag::AUTH_TIMEOUT
, che utilizza un valore ID tag pari a 505. -
allowWhileOnBody
-
Corrisponde al tag di autorizzazione
Tag::ALLOW_WHILE_ON_BODY
, che utilizza un valore ID tag pari a 506.Consente di utilizzare la chiave dopo il periodo di timeout dell'autenticazione se l'utente indossa ancora il dispositivo. Tieni presente che un sensore sicuro a contatto con il corpo determina se il dispositivo è indossato dall'utente.
-
trustedUserPresenceReq
-
Presente solo nella versione dell'attestazione della chiave >= 3.
Corrisponde al tag di autorizzazione
Tag::TRUSTED_USER_PRESENCE_REQUIRED
che utilizza un valore ID tag pari a 507.Specifica che questa chiave è utilizzabile solo se l'utente ha fornito una prova di presenza fisica. Ecco alcuni esempi:
- Per una chiave StrongBox, un pulsante hardware collegato a un pin sul dispositivo StrongBox.
- Per una chiave TEE, l'autenticazione tramite impronta fornisce una prova di presenza a condizione che il TEE abbia il controllo esclusivo dello scanner ed esegua la procedura di corrispondenza dell'impronta.
-
trustedConfirmationReq
-
Presente solo nella versione dell'attestazione della chiave >= 3.
Corrisponde al tag di autorizzazione
Tag::TRUSTED_CONFIRMATION_REQUIRED
, che utilizza un valore ID tag pari a 508.Specifica che la chiave è utilizzabile solo se l'utente fornisce la conferma dei dati da firmare utilizzando un token di approvazione. Per saperne di più su come ottenere la conferma dell'utente, consulta Android Protected Confirmation.
Nota:questo tag è applicabile solo alle chiavi che utilizzano lo scopo
SIGN
. -
unlockedDeviceReq
-
Presente solo nella versione dell'attestazione della chiave >= 3.
Corrisponde al tag di autorizzazione
Tag::UNLOCKED_DEVICE_REQUIRED
, che utilizza un valore ID tag pari a 509. -
creationDateTime
-
Corrisponde al tag di autorizzazione
Tag::CREATION_DATETIME
, che utilizza un valore ID tag pari a 701. -
origin
-
Corrisponde al tag di autorizzazione
Tag::ORIGIN
, che utilizza un valore ID tag pari a 702. -
rootOfTrust
-
Corrisponde al tag di autorizzazione
Tag::ROOT_OF_TRUST
, che utilizza un valore ID tag pari a 704.Per maggiori dettagli, consulta la sezione che descrive la struttura dei dati RootOfTrust.
-
osVersion
-
Corrisponde al tag di autorizzazione
Tag::OS_VERSION
, che utilizza un valore ID tag pari a 705.La versione del sistema operativo Android associata a Keymaster, specificata come numero intero di sei cifre. Ad esempio, la versione 8.1.0 è rappresentata come 080100.
Solo Keymaster versione 1.0 o successive include questo valore nell'elenco di autorizzazione.
-
osPatchLevel
-
Corrisponde al tag di autorizzazione
Tag::PATCHLEVEL
, che utilizza un valore ID tag pari a 706.Il mese e l'anno associati alla patch di sicurezza in uso in Keymaster, specificati come numero intero a sei cifre. Ad esempio, la patch di agosto 2018 è rappresentata come 201808.
Solo Keymaster versione 1.0 o successive include questo valore nell'elenco di autorizzazione.
-
attestationApplicationId
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_APPLICATION_ID
, che utilizza un valore ID tag pari a 709.Per maggiori dettagli, consulta la sezione che descrive la struttura dei dati AttestationApplicationId.
-
attestationIdBrand
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_BRAND
, che utilizza un valore ID tag pari a 710. -
attestationIdDevice
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_DEVICE
, che utilizza un valore ID tag pari a 711. -
attestationIdProduct
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_PRODUCT
, che utilizza un valore ID tag pari a 712. -
attestationIdSerial
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_SERIAL
, che utilizza un valore ID tag pari a 713. -
attestationIdImei
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_IMEI
, che utilizza un valore ID tag pari a 714. -
attestationIdMeid
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_MEID
, che utilizza un valore ID tag pari a 715. -
attestationIdManufacturer
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_MANUFACTURER
, che utilizza un valore ID tag pari a 716. -
attestationIdModel
-
Presente solo nelle versioni dell'attestazione della chiave >= 2.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_MODEL
, che utilizza un valore ID tag pari a 717. -
vendorPatchLevel
-
Presente solo nelle versioni dell'attestazione della chiave >= 3.
Corrisponde al tag di autorizzazione
Tag::VENDOR_PATCHLEVEL
, che utilizza un valore ID tag pari a 718.Specifica il livello patch di sicurezza dell'immagine del fornitore che deve essere installato sul dispositivo per poter utilizzare questa chiave. Il valore viene visualizzato nel formato AAAAMMGG, che rappresenta la data della patch di sicurezza del fornitore. Ad esempio, se una chiave è stata generata su un dispositivo Android con la patch di sicurezza del fornitore installata il 1° agosto 2018, questo valore sarà 20180801.
-
bootPatchLevel
-
Presente solo nelle versioni dell'attestazione della chiave >= 3.
Corrisponde al tag di autorizzazione
Tag::BOOT_PATCHLEVEL
, che utilizza un valore ID tag pari a 719.Specifica il livello patch di sicurezza dell'immagine del kernel che deve essere installato sul dispositivo per poter utilizzare questa chiave. Il valore viene visualizzato nel formato AAAAMMGG, che rappresenta la data della patch di sicurezza del sistema. Ad esempio, se una chiave è stata generata su un dispositivo Android con la patch di sicurezza del sistema del 5 agosto 2018 installata, questo valore sarà 20180805.
-
deviceUniqueAttestation
-
Presente solo nelle versioni dell'attestazione della chiave >= 4.
Corrisponde al tag di autorizzazione
Tag::DEVICE_UNIQUE_ATTESTATION
, che utilizza un valore ID tag pari a 720. -
attestationIdSecondImei
-
Presente solo nelle versioni dell'attestazione della chiave >= 300.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_SECOND_IMEI
, che utilizza un valore ID tag pari a 723. -
moduleHash
-
Presente solo nelle versioni dell'attestazione della chiave >= 400.
Corrisponde al tag di autorizzazione
Tag::MODULE_HASH
, che utilizza un valore ID tag pari a 724.
Campi RootOfTrust
-
verifiedBootKey
- Un hash sicuro della chiave pubblica utilizzata per verificare l'integrità e l'autenticità di tutto il codice eseguito durante l'avvio del dispositivo nell'ambito dell'avvio verificato. È consigliabile utilizzare SHA-256.
-
deviceLocked
-
Indica se il bootloader del dispositivo è bloccato.
true
significa che il dispositivo ha avviato un'immagine firmata che è stata verificata correttamente da Avvio verificato. -
verifiedBootState
- Lo stato di Avvio verificato del dispositivo.
-
verifiedBootHash
- Un riepilogo di tutti i dati protetti da Avvio verificato. Per i dispositivi che utilizzano l'implementazione di riferimento di Android Verified Boot, questo campo contiene il digest VBMeta.
Valori VerifiedBootState
Valore | Stato di avvio corrispondente | Significato |
---|---|---|
Verified |
GREEN |
Una catena di attendibilità completa si estende da una radice di attendibilità protetta dall'hardware al bootloader e a tutte le partizioni verificate dall'Avvio verificato.
In questo stato, il campo verifiedBootKey contiene l'hash della
radice di attendibilità incorporata, ovvero il certificato incorporato nella ROM del dispositivo dal produttore
del dispositivo in fabbrica. |
SelfSigned |
YELLOW |
Uguale a Verified , tranne per il fatto che la verifica è stata eseguita
utilizzando una
radice di attendibilità configurata dall'utente
anziché la radice di attendibilità incorporata dal produttore in fabbrica.
In questo stato, il campo verifiedBootKey contiene l'hash della
chiave pubblica configurata dall'utente. |
Unverified |
ORANGE |
Il bootloader del dispositivo è sbloccato, quindi non è possibile stabilire una catena di attendibilità. Il dispositivo può essere modificato liberamente, pertanto l'integrità del dispositivo
deve essere verificata dall'utente fuori banda. In questo stato, il
campo verifiedBootKey contiene 32 byte di zeri. |
Failed |
RED |
Il dispositivo non ha superato la verifica. In questo stato, non ci sono garanzie
sui contenuti degli altri campi RootOfTrust . |
AttestationApplicationId
Questo campo riflette la convinzione della piattaforma Android in merito alle app
che possono utilizzare il materiale della chiave segreta in attestazione. Può contenere più pacchetti se e solo se più pacchetti condividono lo stesso UID. Il campo AttestationApplicationId
in
AuthorizationList
è di tipo OCTET_STRING
ed è
formattato in base al seguente schema ASN.1:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
-
Un insieme di oggetti
AttestationPackageInfo
, ognuno dei quali fornisce il nome e il numero di versione di un pacchetto. signature_digests
-
Un insieme di hash SHA-256 dei certificati di firma dell'app. Un'app può avere più catene di certificati della chiave di firma. Per ciascuno, il certificato "foglia" viene digerito e inserito nel campo
signature_digests
. Il nome del campo è fuorviante, poiché i dati riepilogati sono i certificati di firma dell'app, non le firme dell'app, perché prende il nome dalla classeSignature
restituita da una chiamata agetPackageInfo()
. Il seguente snippet di codice mostra un insieme di esempio:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Estensione delle informazioni di provisioning
L'estensione delle informazioni di provisioning ha l'OID
1.3.6.1.4.1.11129.2.1.30
. L'estensione fornisce informazioni
note sul dispositivo dal server di provisioning.
Schema
L'estensione segue lo schema CDDL:
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
La mappa non è versionata e potrebbero essere aggiunti nuovi campi facoltativi.
-
certs_issued
-
Un numero approssimativo di certificati emessi per il dispositivo negli ultimi 30 giorni. Questo valore può essere utilizzato come indicatore di potenziali abusi se è maggiore della media di alcuni ordini di grandezza.
-
validated_attested_entity
-
L'entità attestata convalidata è una stringa che descrive il tipo di dispositivo che è stato confermato dal server di provisioning come attestato. Ad esempio,
STRONG_BOX
oTEE
.
Chiavi di attestazione
Due chiavi, una RSA e una ECDSA, e le relative catene di certificati vengono fornite in modo sicuro al dispositivo.
Android 12 introduce il provisioning delle chiavi da remoto e Android 13 richiede che i dispositivi lo implementino. Il provisioning delle chiavi da remoto fornisce ai dispositivi sul campo certificati di attestazione ECDSA P256 per app. Questi certificati hanno una durata inferiore rispetto a quelli forniti in fabbrica.
ID univoco
L'ID univoco è un valore a 128 bit che identifica il dispositivo, ma solo per un periodo di tempo limitato. Il valore viene calcolato con:
HMAC_SHA256(T || C || R, HBK)
Dove:
T
è il "valore del contatore temporale", calcolato dividendo il valore diTag::CREATION_DATETIME
per 2592000000, eliminando eventuali resti.T
cambia ogni 30 giorni (2592000000 = 30 * 24 * 60 * 60 * 1000).C
è il valore diTag::APPLICATION_ID
R
è 1 seTag::RESET_SINCE_ID_ROTATION
è presente nel parametro attest_params della chiamata attest_key oppure 0 se il tag non è presente.HBK
è un segreto univoco associato all'hardware noto al Trusted Execution Environment e mai rivelato. Il segreto contiene almeno 128 bit di entropia ed è univoco per il singolo dispositivo (l'unicità probabilistica è accettabile dati i 128 bit di entropia). La chiave HBK deve essere derivata dal materiale della chiave fuso tramite HMAC o AES_CMAC.
Tronca l'output HMAC_SHA256 a 128 bit.
Più IMEI
Android 14 aggiunge il supporto per più IMEI nel record di Android Key Attestation. Gli OEM possono implementare questa funzionalità aggiungendo un tag KeyMint per un secondo IMEI. Sta diventando sempre più comune che i dispositivi abbiano più radio cellulari e gli OEM ora possono supportare dispositivi con due IMEI.
Se presente sui dispositivi, l'IMEI secondario deve essere provisionato per le implementazioni KeyMint in modo che queste possano attestarlo nello stesso modo in cui attestano il primo IMEI.
Attestazione dell'identità
Android 8.0 include il supporto facoltativo per l'attestazione dell'ID per i dispositivi con Keymaster 3. L'attestazione dell'ID consente al dispositivo di fornire la prova dei suoi identificatori hardware, come il numero di serie o l'IMEI. Sebbene sia una funzionalità facoltativa, è altamente consigliato che tutte le implementazioni di Keymaster 3 la supportino perché la possibilità di dimostrare l'identità del dispositivo consente di utilizzare casi d'uso come la vera configurazione remota zero-touch in modo più sicuro (perché la parte remota può essere certa di comunicare con il dispositivo giusto, non con un dispositivo che falsifica la sua identità).
L'attestazione dell'ID funziona creando copie degli identificatori hardware del dispositivo a cui può accedere solo il TEE prima che il dispositivo lasci la fabbrica. Un utente può sbloccare il bootloader del dispositivo e modificare il software di sistema e gli identificatori segnalati dai framework Android. Le copie degli identificatori detenuti dal TEE non possono essere manipolate in questo modo, garantendo che l'attestazione dell'ID dispositivo attesti solo gli identificatori hardware originali del dispositivo, sventando così i tentativi di spoofing.
L'API principale per l'attestazione dell'ID si basa sul meccanismo di attestazione della chiave esistente introdotto con Keymaster 2. Quando viene richiesto un certificato di attestazione per una chiave detenuta da Keymaster, il chiamante può richiedere che gli identificatori hardware del dispositivo vengano inclusi nei metadati del certificato di attestazione. Se la chiave è memorizzata nel TEE, le catene di certificati rimandano a una radice di attendibilità nota. Il destinatario di un certificato di questo tipo può verificare che il certificato e i relativi contenuti, inclusi gli identificatori hardware, siano stati scritti dal TEE. Quando viene chiesto di includere gli identificatori hardware nel certificato di attestazione, il TEE attesta solo gli identificatori memorizzati nel suo spazio di archiviazione, come compilati in fabbrica.
Proprietà di archiviazione
Lo spazio di archiviazione che contiene gli identificatori del dispositivo deve avere le seguenti proprietà:
- I valori derivati dagli identificatori originali del dispositivo vengono copiati nello spazio di archiviazione prima che il dispositivo esca dalla fabbrica.
- Il metodo
destroyAttestationIds()
può eliminare definitivamente questa copia dei dati derivati dall'identificatore. La distruzione permanente significa che i dati vengono rimossi completamente, in modo che né un ripristino dei dati di fabbrica né qualsiasi altra procedura eseguita sul dispositivo possa ripristinarli. Ciò è particolarmente importante per i dispositivi in cui un utente ha sbloccato il bootloader e modificato il software di sistema e gli identificatori restituiti dai framework Android. - I centri RMA devono essere in grado di generare nuove copie dei dati derivati dall'identificatore hardware. In questo modo, un dispositivo che passa attraverso la RMA può eseguire nuovamente l'attestazione dell'ID. Il meccanismo utilizzato dalle strutture RMA deve essere protetto in modo che gli utenti non possano invocarlo autonomamente, in quanto ciò consentirebbe loro di ottenere attestazioni di ID falsificati.
- Nessun codice diverso dall'app Keymaster attendibile nel TEE è in grado di leggere i dati derivati dall'identificatore conservati nello spazio di archiviazione.
- Lo spazio di archiviazione è a prova di manomissione: se i contenuti dello spazio di archiviazione sono stati modificati, il TEE li tratta come se le copie dei contenuti fossero state distrutte e rifiuta tutti i tentativi di attestazione dell'ID. Questa operazione viene eseguita firmando o MACing l'archiviazione come descritto di seguito.
- Lo spazio di archiviazione non contiene gli identificatori originali. Poiché l'attestazione dell'identità comporta una verifica, il chiamante fornisce sempre gli identificatori da attestare. Il TEE deve solo verificare che corrispondano ai valori originali. L'archiviazione di hash sicuri dei valori originali anziché dei valori consente questa verifica.
Lavori in corso
Per creare un'implementazione con le proprietà elencate sopra, memorizza i valori derivati dall'ID nella seguente costruzione S. Non memorizzare altre copie dei valori ID, ad eccezione delle posizioni normali nel sistema, che un proprietario del dispositivo può modificare tramite rooting:
S = D || HMAC(HBK, D)
dove:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
è la costruzione HMAC con un hash sicuro appropriato (consigliato SHA-256)HBK
è una chiave associata all'hardware e non utilizzata per altri scopiID1...IDn
sono i valori ID originali; l'associazione di un valore specifico a un indice specifico dipende dall'implementazione, in quanto dispositivi diversi hanno un numero diverso di identificatori||
rappresenta la concatenazione
Poiché gli output HMAC hanno dimensioni fisse, non sono necessari intestazioni o altre strutture per trovare gli hash ID individuali o l'HMAC di D. Oltre a controllare i valori forniti per eseguire l'attestazione, le implementazioni devono convalidare S estraendo D da S, calcolando HMAC(HBK, D) e confrontandolo con il valore in S per verificare che nessun ID individuale sia stato modificato/danneggiato. Inoltre, le implementazioni devono utilizzare confronti a tempo costante per tutti gli elementi dell'ID individuale e la convalida di S. Il tempo di confronto deve essere costante indipendentemente dal numero di ID forniti e dalla corrispondenza corretta di qualsiasi parte del test.
Identificatori hardware
L'attestazione dell'ID supporta i seguenti identificatori hardware:
- Nome del brand, restituito da
Build.BRAND
in Android - Nome del dispositivo, restituito da
Build.DEVICE
in Android - Nome del prodotto, restituito da
Build.PRODUCT
in Android - Nome del produttore, restituito da
Build.MANUFACTURER
in Android - Nome del modello, restituito da
Build.MODEL
in Android - Numero di serie
- IMEI di tutte le radio
- MEID di tutte le radio
Per supportare l'attestazione dell'ID dispositivo, un dispositivo attesta questi identificatori. Tutti i dispositivi con Android hanno i primi sei e sono necessari per il funzionamento di questa funzionalità. Se il dispositivo dispone di radio cellulari integrate, deve supportare anche l'attestazione per gli IMEI e/o i MEID delle radio.
L'attestazione dell'ID viene richiesta eseguendo un'attestazione della chiave e includendo gli identificatori del dispositivo da attestare nella richiesta. Gli identificatori sono taggati come:
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'identificatore da attestare è una stringa di byte codificata in UTF-8. Questo formato si applica anche agli identificatori numerici. Ogni identificatore da attestare è espresso come stringa codificata in UTF-8.
Se il dispositivo non supporta l'attestazione dell'ID (o
destroyAttestationIds()
è stato chiamato in precedenza e il dispositivo non può
più attestare i propri ID), qualsiasi richiesta di attestazione della chiave che includa uno o più di
questi tag non va a buon fine e restituisce ErrorCode::CANNOT_ATTEST_IDS
.
Se il dispositivo supporta l'attestazione dell'ID e uno o più dei tag precedenti sono stati inclusi in una richiesta di attestazione della chiave, il TEE verifica che l'identificatore fornito con ciascuno dei tag corrisponda alla sua copia degli identificatori hardware. Se
uno o più identificatori non corrispondono, l'intera attestazione non riesce e viene visualizzato
ErrorCode::CANNOT_ATTEST_IDS
. È valido fornire lo stesso tag
più volte. Ciò può essere utile, ad esempio, per l'attestazione degli IMEI:
Un dispositivo può avere più radio con più IMEI. Una richiesta di attestazione è
valida se il valore fornito con ogni ATTESTATION_ID_IMEI
corrisponde
a una delle radio del dispositivo. Lo stesso vale per tutti gli altri tag.
Se l'attestazione va a buon fine, gli ID attestati vengono aggiunti all'estensione di attestazione (OID 1.3.6.1.4.1.11129.2.1.17) del certificato di attestazione emesso, utilizzando lo schema riportato sopra. Le modifiche allo schema di attestazione Keymaster 2 sono in grassetto, con commenti.
API Java
Questa sezione è solo informativa. Gli implementatori di Keymaster non implementano né utilizzano l'API Java. Queste informazioni vengono fornite per aiutare gli implementatori a capire come viene utilizzata la funzionalità dalle app. I componenti di sistema potrebbero utilizzarlo in modo diverso, motivo per cui è fondamentale che questa sezione non venga trattata come normativa.