L'archivio chiavi fornisce una posizione più sicura per creare, archiviare e utilizzare crittografie in modo controllato. Quando è disponibile l'archiviazione delle chiavi con supporto hardware utilizzato, il materiale della chiave è più sicuro contro l'estrazione dal dispositivo e Keymaster applica restrizioni difficili da sovvertire.
Questo è vero solo, tuttavia, se le chiavi dell'archivio chiavi sono note di archiviazione con supporto hardware. In Keymaster 1, non c'era modo per le app o server remoti per verificare in modo affidabile se questo è il caso. Il daemon dell'archivio chiavi aveva caricato il keymaster HAL disponibile e credeva a ciò che diceva l'HAL con per quanto riguarda il supporto hardware delle chiavi.
Per risolvere il problema, Keymaster ha introdotto l'attestazione della chiave in Android 7.0 (Keymaster 2) e nell'ID in Android 8.0 (Keymaster 3).
L'attestazione chiave ha lo scopo di fornire un modo determinare se una coppia di chiavi asimmetrica è supportata da hardware, quali proprietà della chiave e quali vincoli vengono applicati al suo utilizzo.
L'attestazione dell'ID consente al dispositivo di fornire prova dei suoi identificatori hardware, come il numero di serie o il codice IMEI.
Attestazione chiave
Per supportare l'attestazione chiave, Android 7.0 ha introdotto un insieme di tag, tipi e all'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;
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 principale dei dispositivi.keyToAttest
è il blob chiave restituito dagenerateKey
per il quale verrà creata l'attestazione.attestParams
è un elenco di tutti i parametri necessari l'attestazione. Sono inclusiTag::ATTESTATION_CHALLENGE
e forseTag::RESET_SINCE_ID_ROTATION
, oltre aTag::APPLICATION_ID
eTag::APPLICATION_DATA
. La gli ultimi due sono necessari per decriptare il blob della chiave se sono stati specificati durante la generazione delle chiavi.certChain
è il parametro di output, che restituisce un array di certificati. La voce 0 è il certificato di attestazione, ovvero certifica la chiave dakeyToAttest
e contiene dell'attestazione.
Il metodo attestKey
è considerato un'operazione di chiave pubblica sul
chiave attestata, perché può essere chiamata in qualsiasi momento e non deve soddisfare
vincoli di autorizzazione. Ad esempio, se la chiave attestata richiede un utente
dell'autenticazione per l'uso, un'attestazione può essere generata senza che
autenticazione.
Certificato di attestazione
Il certificato di attestazione è un certificato X.509 standard, con un'intestazione facoltativa di attestazione contenente una descrizione della chiave attestata. La sia firmato con una chiave di attestazione certificata. Chiave di attestazione potrebbe utilizzare un algoritmo diverso rispetto alla chiave attestata.
Il certificato di attestazione contiene i campi della tabella seguente e non può contenere eventuali campi aggiuntivi. Alcuni campi specificano un valore fisso. CTS convalidano che il contenuto del certificato sia esattamente come definito.
Certificato SEQUENCE
Nome campo (vedi RFC 5280) | Valore |
---|---|
Certificato TB | SEQUENZA certificato TBS |
algoritmo della firma | Identificatore dell'algoritmo utilizzato per firmare la chiave: ECDSA per chiavi EC, RSA per chiavi RSA. |
signatureValue | BIT STRING, firma calcolata su tbsCertificate con codifica DER ASN.1. |
SEQUENCE certificato TBS
Nome campo (vedi RFC 5280) | Valore |
---|---|
version |
INTEGER 2 (significa certificato v3) |
serialNumber |
INTEGER 1 (valore fisso: uguale per tutti i certificati) |
signature |
Algoritmoidentificatore dell'algoritmo utilizzato per firmare la chiave: ECDSA per chiavi EC, RSA per le chiavi RSA. |
issuer |
Uguale al campo dell'oggetto della chiave di attestazione batch. |
validity |
SEQUENCE di due date, contenente i valori di
Tag::ACTIVE_DATETIME e
Tag::USAGE_EXPIRE_DATETIME.
Questi valori sono in millisecondi dal 1° gennaio 1970.
Consulta la pagina RFC 5280 per le
rappresentazioni della data nei certificati. Se Tag::ACTIVE_DATETIME non è presente, utilizza il valore di
Tag::CREATION_DATETIME . Se
Tag::USAGE_EXPIRE_DATETIME non è presente; utilizza la scadenza
data del certificato della chiave di attestazione batch. |
subject |
CN = "Chiave archivio chiavi Android" (valore fisso: uguale per tutti i certificati) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo contenente la chiave pubblica attestata. |
extensions/Key Usage |
Firma digitale: impostata se la chiave ha scopo KeyPurpose::SIGN o
KeyPurpose::VERIFY . Tutti gli altri bit non sono impostati. |
extensions/CRL Distribution Points |
Valore da definire |
extensions/"attestation" |
l'OID è 1.3.6.1.4.1.11129.2.1.17; i contenuti sono definiti Sezione Estensione attestazione riportata di seguito. Come tutte le altre estensioni di certificato X.509, i contenuti sono rappresentati come OCTET_STRING contenente una codifica DER dell'attestazione SEQUENCE. |
Estensione attestazione
L'estensione attestation
contiene una descrizione completa del keymaster
autorizzazioni associate alla chiave, in una struttura che corrisponde
agli elenchi di autorizzazioni usati in Android e nel keymaster HAL. Ogni tag in
un elenco di autorizzazioni è rappresentato da un ASN.1 SEQUENCE
voce, in modo esplicito
con il numero tag keymaster, ma con il descrittore del tipo (quattro alti
pezzi di ordine) mascherati.
Ad esempio, in Keymaster 3, Tag::PURPOSE
è definito in
type.hal come ENUM_REP | 1
. Per l'estensione attestazione,
il valore ENUM_REP
viene rimosso, lasciando il tag 1
.
(Per Keymaster 2 e versioni precedenti, KM_TAG_PURPOSE
è definito in
keymaster_defs.h.)
I valori sono tradotti in modo diretto in tipi ASN.1, secondo questa tabella:
Tipo di keymaster | Tipo ASN.1 |
---|---|
ENUM |
INTERO |
ENUM_REP |
SET DI INTERI |
UINT |
INTERO |
UINT_REP |
SET DI INTERI |
ULONG |
INTERO |
ULONG_REP |
SET DI INTERI |
DATE |
INTEGER (millisecondi dal 1° gennaio 1970 00:00:00 GMT) |
BOOL |
NULL (in keymaster, il tag presente significa vero, assente significa falso. la stessa semantica si applica alla codifica ASN.1). |
BIGNUM |
Non è attualmente in uso, quindi non è definita nessuna mappatura |
BYTES |
OCTET_STRING |
Schema
I contenuti dell'estensione di attestazione sono descritti dal seguente schema ASN.1.
KeyDescription ::= SEQUENCE { attestationVersion INTEGER, # KM2 value is 1. KM3 value is 2. KM4 value is 3. attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, teeEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL. digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, # KM4 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, # KM4 trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, # KM4 unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, # KM4 allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, # KM2 and KM3 only. rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, # KM3 attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, # KM3 attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, # KM3 attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, # KM3 attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, # KM3 attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, # KM3 attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, # KM3 attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, # KM3 attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, # KM3 vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, # KM4 bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, # KM4 } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, # KM4 } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
Campi KeyDescription
keymasterVersion
e attestationChallenge
vengono identificati
in base alla posizione, anziché al tag, quindi i tag nel formato codificato specificano solo
tipo di campo. I campi rimanenti sono implicitamente contrassegnati come specificato nel
.
Nome campo | Tipo | Valore |
---|---|---|
attestationVersion |
INTERO | Versione dello schema di attestazione: 1, 2 o 3. |
attestationSecurity |
Livello di sicurezza | Il livello di sicurezza di questa attestazione. È possibile ottenere software le attestazioni di chiavi basate su hardware. Tali attestazioni non possono essere ritenute attendibili se Il sistema Android è compromesso. |
keymasterVersion |
INTERO | Versione del dispositivo keymaster: 0, 1, 2, 3 o 4. |
keymasterSecurity |
Livello di sicurezza | Il livello di sicurezza dell'implementazione del keymaster. |
attestationChallenge |
OCTET_STRING | Valore Tag::ATTESTATION_CHALLENGE , specificato per la richiesta di attestazione. |
uniqueId |
OCTET_STRING | ID univoco facoltativo, presente se la chiave ha
Tag::INCLUDE_UNIQUE_ID |
softwareEnforced |
Elenco autorizzazioni | Autorizzazioni keymaster facoltative che non vengono applicate dal TEE, se qualsiasi. |
teeEnforced |
Elenco autorizzazioni | Autorizzazioni Keymaster facoltative applicate dal TEE, se presente. |
Campi AuthorizationList
AuthorizationList
campi sono tutti facoltativi e sono stati identificati
in base al valore del tag keymaster, con il tipo di bit nascosto.
Viene utilizzata la codifica esplicita, in modo che i campi contengano anche un tag che indica
e il relativo tipo di ASN.1, per facilitarne l'analisi.
Per informazioni dettagliate sui valori di ciascun campo, consulta types.hal
per Keymaster 3 e
keymaster_defs.h
per Keymaster 2 e versioni precedenti. Nomi tag keymaster
sono stati trasformati in nomi di campo omettendo KM_TAG
Prefisso e modifica
resto della cassa a cammello, quindi Tag::KEY_SIZE
è diventato
keySize
.
Campi RootOfTrust
I campi RootOfTrust
sono identificati in termini di posizione.
Nome campo | Tipo | Valore |
---|---|---|
verifiedBootKey |
OCTET_STRING | Un hash sicuro della chiave utilizzata per verificare l'immagine di sistema. SHA-256 consigliato. |
deviceLocked |
BOOLEAN | True se il bootloader è bloccato, il che significa che solo le immagini firmate possono far lampeggiare e che il controllo dell'avvio verificato sia completato. |
verifiedBootState |
Stato dell'avvio verificato | Stato di avvio verificato. |
verifiedBootHash |
OCTET_STRING | Un digest di tutti i dati protetti da Avvio verificato. Per i dispositivi che utilizzano l'implementazione Avvio verificato di Android, questo valore contiene il digest dello struct VBMeta, ovvero l'Avvio verificato della struttura dei metadati. Per saperne di più su come calcolare questo valore, consulta La sintesi VBMeta |
Valori VerifiedBootState
I valori di verifiedBootState
hanno i seguenti significati:
Valore | Significato |
---|---|
Verified |
Indica una catena di attendibilità completa che si estende dal bootloader allo stato verificato
tra cui il bootloader, la partizione di avvio e tutte le partizioni
partizioni di Compute Engine. In questo stato, il valore verifiedBootKey è l'hash dell'oggetto incorporato
che indica il certificato immutabile integrato nella ROM.Questo stato corrisponde allo stato di avvio verde come documentato in documentazione del flusso di avvio verificato. |
SelfSigned |
Indica che la partizione di avvio è stata verificata utilizzando
e la firma sia valida. Il bootloader mostra un avviso e
l'impronta della chiave pubblica prima di consentire la continuazione del processo di avvio.
In questo stato, il valore verifiedBootKey è l'hash dell'autofirma
certificato.Questo stato corrisponde allo stato di avvio giallo come documentato in documentazione del flusso di avvio verificato. |
Unverified |
Indica che un dispositivo può essere modificato liberamente. L'integrità del dispositivo è lasciata a
all'utente di verificare la fuori banda. Il bootloader mostra un avviso all'utente
prima di consentire la continuazione del processo di avvio. In questo stato, il valore di verifiedBootKey è vuoto.Questo stato corrisponde allo stato di avvio arancione come documentato nella documentazione del flusso di avvio verificato. |
Failed |
Indica che la verifica del dispositivo non è riuscita. Nessun certificato di attestazione
contiene effettivamente questo valore, perché in questo stato il bootloader si arresta. È
inclusi qui per completezza. Questo stato corrisponde allo stato di avvio in rosso come documentato in documentazione del flusso di avvio verificato. |
Valori SecurityLevel
I valori di securityLevel
hanno i seguenti significati:
Valore | Significato |
---|---|
Software |
Il codice che crea o gestisce l'elemento pertinente (attestazione o chiave) è implementato nel sistema Android e potrebbe essere alterato se tale sistema viene compromessi. |
TrustedEnvironment |
Il codice che crea o gestisce l'elemento pertinente (attestazione o ) sia implementato in un ambiente di esecuzione affidabile (Trusted Execution Environment, TEE). Potrebbe essere alterato se il TEE è compromesso, ma il TEE è altamente resistente ai compromissioni e moderatamente resistente alla compromissione tramite attacco hardware diretto. |
StrongBox |
Il codice che crea o gestisce l'elemento pertinente (attestazione o chiave) è implementato in un modulo di sicurezza hardware dedicato. Potrebbe essere alterato se il modulo di sicurezza hardware viene compromesso, ma è molto resistente alla compromissione da remoto e altamente resistente alla compromissione tramite un attacco hardware. |
ID univoco
L'ID univoco è un valore a 128 bit che identifica il dispositivo, ma solo per un 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 valore diTag::CREATION_DATETIME
per 2592000000, eliminando qualsiasi resto.T
modifiche ogni 30 giorni (2592000000 = 30 * 24 * 60 * 60 * 1000).C
è il valore diTag::APPLICATION_ID
R
è 1 seTag::RESET_SINCE_ID_ROTATION
è nel parametro attest_params alla chiamata attest_key oppure 0 se non è presente.HBK
è un secret univoco associato all'hardware noto al Trusted ambiente di esecuzione e mai rivelato da questo. Il secret contiene almeno è di 128 bit di entropia ed è univoca per ogni dispositivo (probabilistico l'univocità è accettabile date i 128 bit di entropia). HBK deve essere derivati dal materiale delle chiavi fuse tramite HMAC o AES_CMAC.
Troncare l'output HMAC_SHA256 a 128 bit.
Chiavi di attestazione e certificati
Due chiavi, una RSA, una ECDSA e le corrispondenti catene di certificati, sono in modo sicuro nel dispositivo.
Android 12 introduce il Remote Key Provisioning, mentre Android 13 richiede dei dispositivi implementarla. Remote Key Provisioning fornisce ai dispositivi sul campo certificati di attestazione ECDSA P256 per applicazione. Questi certificati sono più breve rispetto ai certificati forniti dal produttore.
Più IMEI
Android 14 aggiunge il supporto per più IMEI nel Record di attestazione della chiave Android. Gli OEM possono implementare questa funzionalità aggiungendo un tag KeyMint per un secondo IMEI. Sta diventando sempre più comune che i dispositivi dispongano di più segnali radio cellulari e gli OEM ora supportano i dispositivi con due IMEI.
Gli OEM devono avere un codice IMEI secondario, se presente sui loro dispositivi, per di cui è stato eseguito il provisioning alle implementazioni KeyMint in modo che possano lo attesta nello stesso modo in cui attesta il primo IMEI
Attestazione ID
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 prova dell'hardware come il numero di serie o il codice IMEI. Sebbene sia una funzionalità facoltativa, vivamente consigliato che tutte le implementazioni di Keymaster 3 lo forniscano perché la capacità di dimostrare l'identità del dispositivo consente casi d'uso come il vero la configurazione remota zero-touch per maggiore sicurezza (perché il lato remoto può assicurarsi di parlare con il dispositivo giusto, non di effettuare lo spoofing dell'identità).
L'attestazione dell'ID funziona creando copie degli identificatori hardware del dispositivo a cui solo il Trusted Execution Environment (TEE) può accedere prima del dispositivo lascia la fabbrica di produzione. Un utente può sbloccare il bootloader del dispositivo e modificare software di sistema e gli identificatori segnalati dai framework Android. La le copie degli identificatori conservati dal TEE non possono essere manipolate in questo modo, garantendo che l'attestazione dell'ID dispositivo attesti esclusivamente lo stato identificatori hardware originali che contrastano i tentativi di spoofing.
La piattaforma API principale per l'attestazione degli ID si basa sulla chiave esistente meccanismo di attestazione introdotto con Keymaster 2. Quando si richiede un di attestazione di una chiave conservata dal keymaster, il chiamante potrebbe richiedere che gli identificatori hardware del dispositivo siano inclusi nell'attestazione metadati del certificato. Se la chiave si trova nel TEE, il certificato fino a una radice di attendibilità nota. Il destinatario di questo certificato può verificare che il certificato e i suoi contenuti, compreso l'hardware identificatori, sono stati scritti dal TEE. Quando ti viene chiesto di includere l'hardware identificatori nel certificato di attestazione, il TEE attesta solo archiviati nello spazio di archiviazione, come popolato nello stabilimento.
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 in lo spazio di archiviazione prima che il dispositivo lasci la fabbrica.
- Il metodo
destroyAttestationIds()
può eliminare definitivamente di questa copia dei dati derivanti da identificatori. Per distruzione permanente si intende i dati vengono rimossi completamente, pertanto né un ripristino dei dati di fabbrica eseguita sul dispositivo, puoi ripristinarlo. In particolare importante per i dispositivi in cui un utente ha sbloccato il bootloader e modificato il software di sistema e ha modificato gli identificatori restituiti da Android i modelli di machine learning. - Le strutture RMA devono poter generare nuove copie dei dati derivati da identificatori hardware. In questo modo, Il dispositivo che supera l'RMA può eseguire nuovamente l'attestazione dell'ID. La usati dai servizi RMA devono essere protetti affinché gli utenti non possano di richiamarli autonomamente, in quanto ciò gli consentirebbe di ottenere attestazioni di ID falsificati.
- Nessun codice, a parte l'app attendibile Keymaster nel TEE, è in grado di leggere i dati derivati dall'identificatore e conservati nello spazio di archiviazione.
- Lo spazio di archiviazione è a prova di manomissione: se i contenuti dello spazio di archiviazione sono stati modificato, il TEE lo considera come se le copie dei contenuti avessero è stata eliminata e rifiuta tutti i tentativi di attestazione dell'ID. Questo è implementato firmando o eseguendo il MAC dello spazio di archiviazione come descritto qui sotto.
- Lo spazio di archiviazione non contiene gli identificatori originali. Poiché l'attestazione dell'ID comporta una sfida, il chiamante fornisce sempre gli identificatori delle risorse. Il TEE deve solo verificare che corrispondano ai valori che in origine. Archiviazione di hash sicuri dei valori originali anziché dei consentono questa verifica.
Edilizia
Per creare un'implementazione con le proprietà elencate sopra, archivia Valori derivati dall'ID nella seguente costruzione S. Non archiviare altre copie di i valori ID, ad eccezione delle normali posizioni all'interno del sistema, dove un proprietario possono 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 (valore consigliato SHA-256)HBK
è una chiave associata all'hardware che non viene utilizzata per altri scopiID1...IDn
sono i valori ID originali; associazione di un a un certo indice dipende dall'implementazione, dispositivi diversi avranno numeri diversi di identificatori||
rappresenta la concatenazione
Poiché gli output HMAC hanno dimensioni fisse, non vengono visualizzate intestazioni o altre strutture necessari per poter trovare i singoli hash ID, o HMAC di D. Inoltre, verificare 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 singolo ID sia stato modificato/corrotto. Inoltre, le implementazioni devono usare confronti a tempo costante per tutti i singoli ID e la convalida di S. Il tempo di confronto deve essere costante indipendentemente da il numero di documenti di identità forniti e la corretta corrispondenza di qualsiasi parte del test.
Identificatori hardware
L'attestazione dell'ID supporta i seguenti identificatori hardware:
- Nome del brand, come restituito da
Build.BRAND
in Android - Nome del dispositivo, come 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, come 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 dispositivi con Android dispongono delle prime sei, che sono necessarie per questo la tua funzionalità. Se il dispositivo dispone di radio cellulari integrati, Deve inoltre supportare l'attestazione dei codici IMEI e/o MEID dei segnali radio.
L'attestazione dell'ID viene richiesta eseguendo un'attestazione della chiave e includendo identificatori dei dispositivi da attestare nella richiesta. Gli identificatori sono codificati come segue:
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 identificatori numerici. Ogni identificatore da attestare è espresso come Stringa con codifica UTF-8.
Se il dispositivo non supporta l'attestazione dell'ID (o
Hai già chiamato destroyAttestationIds()
e il dispositivo non può
attestare più a lungo i suoi ID), qualsiasi richiesta di attestazione chiave che includa uno o più di
questi tag non funzionano con ErrorCode::CANNOT_ATTEST_IDS
.
Se il dispositivo supporta l'attestazione dell'ID e uno o più tag sopra riportati hanno
stato incluso in una richiesta di attestazione della chiave, il TEE verifica l'identificatore
fornita con ciascuno dei tag corrisponde alla sua copia degli identificatori hardware. Se
uno o più identificatori non corrispondono, l'intera attestazione ha esito negativo con
ErrorCode::CANNOT_ATTEST_IDS
. È valido che lo stesso tag
vengono fornite più volte. Può essere utile, ad esempio, per l'attestazione dei codici IMEI:
Un dispositivo potrebbe avere più segnali radio con più codici IMEI. Una richiesta di attestazione è
valido se il valore fornito con ogni ATTESTATION_ID_IMEI
corrisponde
uno dei segnali radio del dispositivo. Lo stesso vale per tutti gli altri tag.
Se l'attestazione ha esito positivo, gli ID attestati vengono aggiunti alla richiesta estensione attestazione (OID 1.3.6.1.4.1.11129.2.1.17) del certificato di attestazione rilasciato, utilizzando lo schema sopra. Modifiche rispetto a Keymaster 2 schema di attestazione sono in grassetto con i commenti.
API Java
Questa sezione è solo informativa. Gli implementatori Keymaster non sono neppure implementare o utilizzare l'API Java. Viene fornita per aiutare gli utenti che implementano l'implementazione a comprendere il modo in cui la funzionalità viene utilizzata dalle applicazioni. I componenti di sistema potrebbero utilizzarla in modo diverso ed è per questo che è fondamentale che questa sezione non venga trattata come normativa.