Il keystore fornisce un luogo più sicuro per creare, archiviare e utilizzare le chiavi di crittografia in modo controllato. Quando lo spazio di archiviazione delle chiavi con integrazione hardware è disponibile e viene utilizzato, il materiale della chiave è più protetto dall'estrazione dal dispositivo e Keymaster applica limitazioni difficili da aggirare.
Tuttavia, questo vale solo se è noto che le chiavi del keystore si trovano in un archiviazione basata su hardware. In Keymaster 1, non era possibile per le app o per i server remoti verificare in modo affidabile se era così. Il daemon del keystore caricava l'HAL Keymaster disponibile e dava credito a tutto ciò che diceva l'HAL in merito al backup hardware delle chiavi.
Per risolvere il problema, Keymaster ha introdotto l'attestazione delle chiavi in Android 7.0 (Keymaster 2) e l'attestazione dell'ID in Android 8.0 (Keymaster 3).
L'attestazione delle chiavi ha lo scopo di fornire un modo per determinare con certezza se una coppia di chiavi asimmetriche è basata su hardware, quali sono le proprietà della chiave e quali vincoli vengono applicati al suo utilizzo.
L'attestazione dell'identità consente al dispositivo di fornire la prova dei suoi identificatori hardware, come il numero di serie o l'IMEI.
Attestazione delle chiavi
Per supportare l'attestazione delle chiavi, Android 7.0 ha introdotto un insieme di tag, tipi e metodi nell'HAL.
Tag
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Digitare
Keymaster 2 e versioni precedenti
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
AttestKey
method
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 la certificazione. Sono inclusiTag::ATTESTATION_CHALLENGE
e possiblyTag::RESET_SINCE_ID_ROTATION
, nonchéTag::APPLICATION_ID
eTag::APPLICATION_DATA
. I due metodi successivi 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 i vincoli di autorizzazione. Ad esempio, se la chiave attestata richiede l'autenticazione dell'utente per essere utilizzata, è 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 rispetto alla chiave di cui viene attestata l'autenticità.
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 come definiti.
SEQUENCE del certificato
Nome del campo (consulta 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 | STRINGA DI BIT, firma calcolata su tbsCertificate con codifica DER ASN.1. |
SEQUENCE TBSCertificate
Nome del campo (consulta RFC 5280) | Valore |
---|---|
version |
INTEGER 2 (indica il certificato v3) |
serialNumber |
INTEGER 1 (valore fisso: uguale su tutti i certificati) |
signature |
AlgorithmIdentifier dell'algoritmo utilizzato per firmare la chiave: ECDSA per le chiavi EC, RSA per le chiavi RSA. |
issuer |
Uguale al campo dell'oggetto della chiave di attestazione batch. |
validity |
SEQUENZIA di due date contenenti i valori di
Tag::ACTIVE_DATETIME e
Tag::USAGE_EXPIRE_DATETIME.
Questi valori sono in millisecondi a partire dal 1° gennaio 1970.
Consulta il documento 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: uguale su tutti i certificati) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo contenente la chiave pubblica attestata. |
extensions/Key Usage |
digitalSignature: impostato 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; i contenuti sono definiti nella sezione Estensione di attestazione di seguito. Come per tutte le estensioni dei certificati X.509, i contenuti sono rappresentati come OCTET_STRING contenente una codifica DER della SEQUENCE di attestazione. |
Estensione di 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 tradotti in tipi ASN.1 come segue:
Tipo di Keymaster/KeyMint | 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 |
Milisecondi dal 1° gennaio 1970 00:00:00 GMT. |
BOOL |
NULL |
La presenza del tag indica true, l'assenza indica false. |
BIGNUM |
Nessun tag ha questo tipo, pertanto non è definita alcuna mappatura. | |
BYTES |
OCTET_STRING |
Schema
I contenuti dell'estensione di attestazione sono descritti dal seguente schema ASN.1:
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 Keymaster/KeyMint 1 Keymaster versione 2.0 2 Keymaster versione 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 -
attestationSecurityLevel
-
Il livello di sicurezza della posizione in cui è memorizzata la chiave attestata.
-
keymasterVersion
/keyMintVersion
-
La versione dell'implementazione dell'Hardware Abstraction Layer (HAL) Keymaster/KeyMint.
Valore Versione Keymaster/KeyMint 2 Keymaster versione 2.0 3 Keymaster versione 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 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Il livello di sicurezza dell'implementazione di Keymaster/KeyMint.
-
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, vedi la sezione ID univoco.
-
softwareEnforced
-
L'elenco di autorizzazioni Keymaster/KeyMint applicato dal sistema Android. Queste informazioni vengono raccolte o generate dal codice della piattaforma e archiviate nella partizione di sistema del dispositivo. 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
verifiedBootState
èVerified
). -
hardwareEnforced
- L'elenco di autorizzazioni di Keymaster/KeyMint applicato dal Trusted Execution Environment (TEE) o dalla StrongBox del dispositivo. Queste informazioni vengono raccolte o generate da 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 comporta la fiducia nella piattaforma.
Valori di SecurityLevel
Il valore SecurityLevel
indica il grado di resilienza agli attacchi di un elemento correlato al keystore (ad esempio la coppia di chiavi e l'attestazione).
Valore | Significato |
---|---|
Software |
Sicura se il sistema Android del dispositivo è conforme al
modello di sicurezza della piattaforma Android
(ovvero il bootloader del dispositivo è bloccato e il
verifiedBootState è
Verified ). |
TrustedEnvironment |
Sicura a condizione che l'ambiente di esecuzione affidabile (TEE) non sia compromesso. I requisiti di isolamento per i TEE sono definiti nelle sezioni 9.11 [C-1-1] a [C-1-4] del Compatibility Definition Document di Android. I TEE sono molto resistenti alla compromissione da remoto e moderatamente resistenti alla compromissione da attacco hardware diretto. |
StrongBox |
Sicura, a condizione che StrongBox non sia 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 è molto resistente alla compromissione da remoto e da attacco hardware diretto (ad esempio manomissione fisica e attacchi lato canale). |
Campi AuthorizationList
Ogni campo corrisponde a un tag di autorizzazione Keymaster/KeyMint della
specifica dell'interfaccia AIDL.
La specifica è la fonte attendibile dei tag di autorizzazione: il loro significato, il formato dei contenuti, se è previsto che vengano visualizzati nei campi softwareEnforced
o hardwareEnforced
dell'oggetto KeyDescription
, se sono mutuamente esclusivi con altri tag e così via. Tutti i campi AuthorizationList
sono facoltativi.
Ogni campo ha un tag EXPLICIT
specifico del contesto uguale al numero di tag Keymaster/KeyMint, che consente una rappresentazione più compatta dei dati in AuthorizationList
. L'analizzatore 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 sua codifica ASN.1 conterrà quindi il tag 504
specifico del contesto 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 di 1. -
algorithm
-
Corrisponde al
Tag::ALGORITHM
tag di autorizzazione, che utilizza un valore ID tag pari a 2.In un oggetto
AuthorizationList
di attestazione, il valore dell'algoritmo è sempreRSA
oEC
. -
keySize
-
Corrisponde al
tag di autorizzazione
Tag::KEY_SIZE
, che utilizza un valore ID tag di 3. -
digest
-
Corrisponde al tag di autorizzazione
Tag::DIGEST
, che utilizza un valore ID tag di 5. -
padding
-
Corrisponde al tag di autorizzazione
Tag::PADDING
, che utilizza un valore ID tag di 6. -
ecCurve
-
Corrisponde al
Tag::EC_CURVE
tag di autorizzazione, che utilizza un valore ID tag pari a 10.L'insieme di parametri utilizzati per generare una coppia di chiavi ellittiche (EC), che utilizza ECDSA per la firma e la verifica, all'interno del keystore di 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 alTag::RSA_OAEP_MGF_DIGEST
tag di autorizzazione KeyMint che utilizza un valore ID tag pari a 203. -
rollbackResistance
-
Presente solo nella versione dell'attestazione della chiave >= 3.
Corrisponde al
Tag::ROLLBACK_RESISTANCE
tag di autorizzazione, 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 Keymaster
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. -
noAuthRequired
-
Corrisponde al
Tag::NO_AUTH_REQUIRED
tag di autorizzazione, 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::ALLOW_WHILE_ON_BODY
tag di autorizzazione, 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 sul corpo sicuro determina se il dispositivo è indossato sul corpo dell'utente.
-
trustedUserPresenceRequired
-
Presente solo nella versione dell'attestazione della chiave >= 3.
Corrisponde al tag di
Tag::TRUSTED_USER_PRESENCE_REQUIRED
autorizzazione, che utilizza un valore ID tag pari a 507.Specifica che questa chiave è utilizzabile solo se l'utente ha fornito una prova della presenza fisica. Ecco alcuni esempi:
- Per una chiave StrongBox, un pulsante hardware collegato tramite cavo a un pin sul dispositivo StrongBox.
- Per una chiave TEE, l'autenticazione tramite impronta fornisce la prova della presenza a condizione che il TEE abbia il controllo esclusivo dello scanner ed esegua la procedura di corrispondenza delle impronte.
-
trustedConfirmationRequired
-
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 ulteriori informazioni su come ottenere la conferma dell'utente, consulta Conferma protetta Android.
Nota:questo tag è applicabile solo alle chiavi che utilizzano scopo
SIGN
. -
unlockedDeviceRequired
-
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. -
allApplications
-
Corrisponde al
Tag::ALL_APPLICATIONS
tag di autorizzazione, che utilizza un valore ID tag pari a 600.Indica se tutte le app su un dispositivo possono accedere alla coppia di chiavi.
-
applicationId
-
Corrisponde al tag di autorizzazione
Tag::APPLICATION_ID
, che utilizza un valore ID tag pari a 601. -
creationDateTime
-
Corrisponde al tag di autorizzazione
Tag::CREATION_DATETIME
, che utilizza un valore ID tag pari a 701. -
origin
-
Corrisponde al
Tag::ORIGIN
tag di autorizzazione, che utilizza un valore ID tag di 702. -
rollbackResistant
-
Presente solo nelle versioni 1 e 2 dell'attestazione della chiave.
Corrisponde al tag di autorizzazione
Tag::ROLLBACK_RESISTANT
, che utilizza un valore ID tag pari a 703. -
rootOfTrust
-
Corrisponde al
Tag::ROOT_OF_TRUST
tag di autorizzazione, che utilizza un valore ID tag pari a 704.Per maggiori dettagli, consulta la sezione che descrive la struttura di dati RootOfTrust.
-
osVersion
-
Corrisponde al
Tag::OS_VERSION
tag di autorizzazione, che utilizza un valore ID tag di 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::PATCHLEVEL
tag di autorizzazione, che utilizza un valore ID tag di 706.Il mese e l'anno associati alla patch di sicurezza in uso all'interno di Keymaster, specificati come numero intero di 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 delle chiavi >= 2.
Corrisponde al
Tag::ATTESTATION_APPLICATION_ID
tag di autorizzazione Keymaster, che utilizza un valore ID tag pari a 709.Per maggiori dettagli, consulta la sezione che descrive la struttura di dati AttestationApplicationId.
-
attestationIdBrand
-
Presente solo nelle versioni dell'attestazione delle chiavi >= 2.
Corrisponde al
Tag::ATTESTATION_ID_BRAND
tag Keymaster, che utilizza un valore ID tag di 710. -
attestationIdDevice
-
Presente solo nelle versioni dell'attestazione delle chiavi >= 2.
Corrisponde al
Tag::ATTESTATION_ID_DEVICE
tag Keymaster, che utilizza un valore ID tag di 711. -
attestationIdProduct
-
Presente solo nelle versioni dell'attestazione delle chiavi >= 2.
Corrisponde al
Tag::ATTESTATION_ID_PRODUCT
tag Keymaster, che utilizza un valore ID tag di 712. -
attestationIdSerial
-
Presente solo nelle versioni dell'attestazione delle chiavi >= 2.
Corrisponde al
Tag::ATTESTATION_ID_SERIAL
tag Keymaster, che utilizza un valore ID tag di 713. -
attestationIdImei
-
Presente solo nelle versioni dell'attestazione delle chiavi >= 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 delle chiavi >= 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 delle chiavi >= 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 delle chiavi >= 2.
Corrisponde al
Tag::ATTESTATION_ID_MODEL
tag di autorizzazione, che utilizza un valore ID tag pari a 717. -
vendorPatchLevel
-
Presente solo nelle versioni di attestazione delle chiavi >= 3.
Corrisponde al tag di autorizzazione
Tag::VENDOR_PATCHLEVEL
che utilizza un valore ID tag pari a 718.Specifica il livello della patch di sicurezza dell'immagine del fornitore che deve essere installato sul dispositivo per l'utilizzo di questa chiave. Il valore viene visualizzato nel formato AAAAMMGG e 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 di attestazione delle chiavi >= 3.
Corrisponde al tag di autorizzazione
Tag::BOOT_PATCHLEVEL
che utilizza un valore ID tag pari a 719.Specifica il livello della patch di sicurezza dell'immagine del kernel che deve essere installato sul dispositivo per l'utilizzo di questa chiave. Il valore viene visualizzato nel formato AAAAMMGG e rappresenta la data della patch di sicurezza di sistema. Ad esempio, se una chiave è stata generata su un dispositivo Android con la patch di sicurezza del sistema installata il 5 agosto 2018, questo valore sarà 20180805.
-
deviceUniqueAttestation
-
Presente solo nelle versioni di attestazione delle chiavi >= 4.
Corrisponde al tag di autorizzazione
Tag::DEVICE_UNIQUE_ATTESTATION
, che utilizza un valore ID tag pari a 720. -
attestationIdSecondImei
-
Presente solo nelle versioni di attestazione delle chiavi >= 300.
Corrisponde al tag di autorizzazione
Tag::ATTESTATION_ID_SECOND_IMEI
, che utilizza un valore ID tag pari a 723.
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
indica 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 digest 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 di 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
root of trust incorporata,
ovvero il certificato incorporato nella ROM del dispositivo dal produttore del dispositivo in fabbrica. |
SelfSigned |
YELLOW |
Come per Verified , tranne per il fatto che la verifica è stata eseguita
utilizzando un
root of trust configurato dall'utente
anziché il root of trust incorporato 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, pertanto non è possibile stabilire una catena di attendibilità. Il dispositivo può essere modificato liberamente, pertanto la sua integrità deve essere verificata dall'utente out-of-band. In questo stato, il
campo verifiedBootKey contiene 32 byte di zeri. |
Failed |
RED |
Il dispositivo non ha superato la verifica. In questo stato, non sono previste garanzie
sui contenuti degli altri campi RootOfTrust . |
AttestationApplicationId
Questo campo riflette la convinzione della piattaforma Android in merito alle app che sono autorizzate a utilizzare il materiale della chiave segreta nell'ambito dell'attestazione. Può contenere più pacchetti se e solo se condividono lo stesso UID. Il campo AttestationApplicationId
in
AuthorizationList
è di tipo OCTET_STRING
ed è formato in base allo schema ASN.1 riportato di seguito:
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 digest SHA-256 dei certificati di firma dell'app. Un'app può avere più catene di certificati delle chiavi di firma. Per ciascuno, il certificato "leaf" viene elaborato e inserito nel campo
signature_digests
. Il nome del campo è fuorviante, poiché i dati sottoposti a digestione sono i certificati di firma dell'app, non le firme dell'app, perché il nome è associato alla classeSignature
restituita da una chiamata agetPackageInfo()
. Il seguente snippet di codice mostra un insieme di esempio:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
ID univoco
L'ID univoco è un valore di 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, senza tenere conto del resto.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 o 0 se il tag non è presente.HBK
è un segreto hardware univoco noto al Trusted Execution Environment e mai rivelato da quest'ultimo. Il segreto contiene almeno 128 bit di entropia ed è univoco per il singolo dispositivo (è accettabile l'unicità probabilistica dati i 128 bit di entropia). La chiave HBK deve essere ricavata dal materiale della chiave fuso tramite HMAC o AES_CMAC.
Tronca l'output HMAC_SHA256 a 128 bit.
Chiavi e certificati di attestazione
Nel dispositivo viene eseguito il provisioning sicuro di due chiavi, una RSA e una ECDSA, e delle catene di certificati corrispondenti.
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 di cui è stato eseguito il provisioning in fabbrica.
Più IMEI
Android 14 aggiunge il supporto di più IMEI nel record Android Key Attestation. Gli OEM possono implementare questa funzionalità aggiungendo un tag KeyMint per un secondo IMEI. È sempre più comune che i dispositivi abbiano più radio cellulari e ora gli OEM possono supportare i dispositivi con due IMEI.
Gli OEM sono tenuti a disporre di un IMEI secondario, se presente sui loro dispositivi, da eseguire il provisioning per le implementazioni di KeyMint in modo che queste implementazioni possano attestarlo nello stesso modo in cui attestano il primo IMEI
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 seguente:
{ 1 : int, ; certificates issued }
La mappa non è sottoposta a controllo della versione e possono 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 è superiore alla media di alcuni ordini di grandezza.
Verifica dell'identità
Android 8.0 include il supporto facoltativo per l'attestazione dell'identità per i dispositivi con Keymaster 3. L'attestazione dell'identità consente al dispositivo di fornire la prova dei suoi identificativi hardware, come il numero di serie o l'IMEI. Sebbene sia una funzionalità facoltativa, è vivamente consigliato che tutte le implementazioni di Keymaster 3 forniscano il supporto per questa funzionalità perché la possibilità di dimostrare l'identità del dispositivo consente di rendere più sicuri casi d'uso come la configurazione remota zero-touch (in quanto il lato remoto può essere certo di comunicare con il dispositivo giusto, non con un dispositivo che ne finge l'identità).
L'attestazione dell'identità funziona creando copie degli identificatori hardware del dispositivo a cui solo il Trusted Execution Environment (TEE) può accedere prima che il dispositivo usciti dalla 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'interfaccia API principale per l'attestazione dell'identità si basa sul meccanismo di attestazione delle chiavi esistente introdotto con Keymaster 2. Quando richiede un certificato di attestazione per una chiave conservata da keymaster, il chiamante può richiedere l'inclusione degli identificatori hardware del dispositivo nei metadati del certificato di attestazione. Se la chiave è conservata nel TEE, il certificato si ricollega 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 gli viene chiesto di includere gli identificatori hardware nel certificato di attestazione, la TEE attesta solo gli identificatori memorizzati nella sua memoria, come compilati in fabbrica.
Proprietà di archiviazione
Lo spazio di archiviazione che contiene gli identificatori del dispositivo deve avere le seguenti proprietà:
- I valori ricavati dagli identificatori originali del dispositivo vengono copiati nella memoria prima che il dispositivo esca dalla fabbrica.
- Il metodo
destroyAttestationIds()
può distruggere definitivamente questa copia dei dati ricavati dall'identificatore. Per distruzione permanente si intende che i dati vengono rimossi completamente, pertanto né un ripristino dei dati di fabbrica né qualsiasi altra procedura eseguita sul dispositivo può ripristinarli. Questo è 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 ricavati dall'identificatore hardware. In questo modo, un dispositivo che passa attraverso l'RMA può eseguire di nuovo l'attestazione dell'identità. 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 attendibile Keymaster nel TEE è in grado di leggere i dati ricavati dall'identificatore memorizzati nello spazio di archiviazione.
- Lo spazio di archiviazione è protetto da manomissioni: 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'identità. Questo viene implementato tramite la firma o l'utilizzo di un MAC per lo spazio di archiviazione come descritto di seguito.
- Lo spazio di archiviazione non contiene gli identificatori originali. Poiché l'attestazione dell'identità richiede una verifica, è sempre il chiamante a fornire gli identificatori da verificare. Il TEE deve solo verificare che corrispondano ai valori che avevano inizialmente. Questa verifica è abilitata memorizzando hash sicuri dei valori originali anziché dei valori.
Edilizia
Per creare un'implementazione con le proprietà elencate sopra, memorizza i valori ricavati dall'ID nella seguente costruzione S. Non memorizzare altre copie dei valori ID, ad eccezione dei normali punti del sistema che un proprietario del dispositivo può modificare eseguendo il 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 legata all'hardware non utilizzata per altri scopiID1...IDn
sono i valori ID originali; l'associazione di un determinato valore a un determinato indice dipende dall'implementazione, poiché i diversi dispositivi hanno numeri diversi di identificatori||
rappresenta la concatenazione
Poiché le uscite HMAC sono di dimensioni fisse, non sono richieste intestazioni o altre strutture per poter trovare i singoli hash ID 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/corrotto. Inoltre, le implementazioni devono utilizzare confronti in tempo costante per tutti i singoli elementi ID 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'identità 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 è dotato 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 nella richiesta gli identificatori del dispositivo da attestare. Gli identificatori sono contrassegnati 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 autenticare è una stringa di byte codificata in UTF-8. Questo formato si applica anche agli identificatori numerici. Ogni identificatore da attestare è espresso come una stringa codificata UTF-8.
Se il dispositivo non supporta l'attestazione dell'ID (o se in precedenza è stata chiamata destroyAttestationIds()
e il dispositivo non può più attestare i propri ID), qualsiasi richiesta di attestazione della chiave che include uno o più di questi tag non va a buon fine con ErrorCode::CANNOT_ATTEST_IDS
.
Se il dispositivo supporta l'attestazione dell'identità e uno o più dei tag sopra indicati sono stati inclusi in una richiesta di attestazione della chiave, il TEE verifica che l'identificatore fornito con ciascun tag corrisponda alla sua copia degli identificatori hardware. Se uno o più identificatori non corrispondono, l'intera attestazione non va a buon fine con ErrorCode::CANNOT_ATTEST_IDS
. È valido fornire lo stesso tag più volte. Questo può essere utile, ad esempio, per attestare gli 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 di Keymaster 2 sono in grassetto, con commenti.
API Java
Questa sezione è solo informativa. Gli implementatori di Keymaster non implementano né utilizzano l'API Java. Questo documento è fornito per aiutare gli implementatori a comprendere come la funzionalità viene utilizzata dalle app. I componenti di sistema potrebbero utilizzarla diversamente, motivo per cui è fondamentale che questa sezione non venga considerata normativa.