L'API KeyMint (in precedenza Keymaster) fa ampio uso di tag di autorizzazione, ovvero coppie nome-valore. Ogni tag possibile ha:
- Un nome di enum con valore associato
- Un tipo associato (ad es. intero, byte, data, enum), che include un'indicazione se sono consentiti più valori
Ad esempio, il tag con nome
Tag::BLOCK_MODE
ha un valore enumerato di base 4
e un indicatore di tipo
TagType::ENUM_REP
che indica che il valore associato è un enumerato ripetibile (in questo
caso, BlockMode
).
I tag svolgono una doppia funzione nell'API:
- Come parametri per un'operazione eseguita sull'API, ad esempio
Tag::MAC_LENGTH
in un'operazione di firma HMAC, indica la lunghezza dell'HMAC richiesta. - Come caratteristiche chiave, i valori permanentemente legati a una determinata chiave (ovvero inclusi nel blob della chiave), ad esempio
Tag::EC_CURVE
indica la curva ellittica a cui è destinata una chiave. A ogni caratteristica principale è associato un livello di sicurezza che indica la parte del sistema che controlla l'attributo:- Nell'hardware sicuro viene applicata una caratteristica chiave con livello di sicurezza
TRUSTED_ENVIRONMENT
oSTRONGBOX
. - Una caratteristica principale con livello di sicurezza
SOFTWARE
oKEYSTORE
viene applicata solo dal servizio di sistemakeystore2
(e quindi non è resiliente al compromesso del sistema operativo).
- Nell'hardware sicuro viene applicata una caratteristica chiave con livello di sicurezza
Molti tag fungono da caratteristiche chiave e da parametri:
- Le caratteristiche chiave indicano l'insieme di parametri consentiti per una chiave, ad esempio:
- Il
Tag::PURPOSE
di una chiave ECDSA potrebbe includere siaSIGN
siaAGREE_KEY
. - Il parametro
Tag::BLOCK_MODE
per una chiave AES potrebbe includere le modalità ECB, CBC e CTR.
- Il
- Una richiesta
begin()
include quindi un valore parametro specifico per l'operazione, ad esempio:begin()
ha un parametro scopo esplicito che deve corrispondere a uno dei valoriTag::PURPOSE
delle caratteristiche chiave.begin()
per un'operazione AES deve includere un singolo valore perTag::BLOCK_MODE
nel campoparams
, che deve corrispondere a uno dei valori nelle caratteristiche della chiave.
Questa doppia funzione è particolarmente pertinente per la raccolta dei tag passati come keyParams
in un'operazione di generazione o importazione della chiave.
- Alcuni dei tag fungono da parametri per l'operazione di generazione della chiave stessa. Ad esempio, il tag
Tag::CERTIFICATE_SUBJECT
influisce solo sul processo di generazione delle chiavi (asimmetriche), controllando un campo nel certificato X.509 restituito. - Gli altri tag sono associati alla chiave appena generata come caratteristiche della chiave e vengono incapsulati nel keyblob restituito in modo da essere associati definitivamente alla chiave.
Informazioni dettagliate sui valori dei tag sono disponibili nelle seguenti specifiche dell'interfaccia HAL:
- KeyMint: tutti i tag sono definiti in
Tag.aidl
nel ramo di release di Android pertinente. - Keymaster: i tag sono definiti in
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
per ogni rispettivokeymaster-version
, ad esempio3.0/types.hal
per Keymaster 3 e4.0/types.hal
per Keymaster 4. Per Keymaster 2 e versioni precedenti, i tag sono definiti inplatform/hardware/libhardware/include/hardware/keymaster_defs.h
.