L'API KeyMint (in precedenza Keymaster) utilizza ampiamente i tag di autorizzazione, che sono coppie nome-valore. Ogni tag possibile ha:
- Un nome enum con un valore associato
- Un tipo associato (ad esempio, numero intero, byte, data, enum), che include un'indicazione che specifica se sono consentiti più valori
Ad esempio, il tag con nome
Tag::BLOCK_MODE
ha un valore enum di base pari a 4
e un marcatore di tipo TagType::ENUM_REP
che indica che il valore associato è un enum 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 HMAC richiesta. - Come caratteristiche chiave, valori associati in modo permanente
a una determinata chiave (ovvero inclusi nel blob della chiave), ad esempio,
Tag::EC_CURVE
indica a quale curva ellittica è destinata una chiave. Ogni caratteristica chiave è associata a un livello di sicurezza che indica quale parte del sistema controlla l'attributo:- Una caratteristica fondamentale con livello di sicurezza
TRUSTED_ENVIRONMENT
oSTRONGBOX
viene applicata nell'hardware sicuro. - Una caratteristica chiave con livello di sicurezza
SOFTWARE
oKEYSTORE
viene applicata solo dal servizio di sistemakeystore2
(e quindi una caratteristica di questo tipo non è resiliente alla compromissione del sistema operativo).
- Una caratteristica fondamentale con livello di sicurezza
Molti tag fungono sia da caratteristiche chiave che 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
Tag::BLOCK_MODE
per una chiave AES può includere le modalità ECB, CBC e CTR.
- Il
- Una richiesta
begin()
include quindi un valore di parametro specifico per l'operazione, ad esempio:begin()
ha un parametro di scopo esplicito che deve corrispondere a uno dei valori delle caratteristiche chiaveTag::PURPOSE
.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 di chiavi.
- Alcuni tag fungono da parametri per l'operazione di generazione delle chiavi
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 sono incapsulati nel keyblob restituito in modo che siano associati in modo permanente 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 rilascio Android pertinente. - Keymaster: i tag sono definiti
in
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
per ognikeymaster-version
rispettiva, 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
.