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 valore associato
- Un tipo associato (ad esempio, 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 enum di base 4 e un indicatore 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_LENGTHin 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
il
Tag::EC_CURVEindica la curva ellittica per cui è una chiave. Ogni caratteristica chiave è associata a un livello di sicurezza che indica quale parte del sistema applica l'attributo:- Una caratteristica chiave con livello di sicurezza
TRUSTED_ENVIRONMENToSTRONGBOXviene applicata nell'hardware sicuro. - Una caratteristica chiave con livello di sicurezza
SOFTWAREoKEYSTOREviene applicata solo dal servizio di sistemakeystore2(e quindi una caratteristica di questo tipo non è resiliente alla compromissione del sistema operativo).
- Una caratteristica chiave con livello di sicurezza
Molti tag fungono sia da caratteristiche chiave che da parametri:
- Le caratteristiche chiave indicano l'insieme dei parametri consentiti per una chiave,
ad esempio:
- Il
Tag::PURPOSEdi una chiave ECDSA potrebbe includere siaSIGNcheAGREE_KEY. - Il
Tag::BLOCK_MODEper 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 di scopo esplicito che deve corrispondere a uno dei valoriTag::PURPOSEdelle caratteristiche chiave.begin()per un'operazione AES deve includere un singolo valore perTag::BLOCK_MODEnel campoparams, che deve corrispondere a uno dei valori delle caratteristiche chiave.
Questa doppia funzione è particolarmente rilevante per la raccolta di 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_SUBJECTinfluisce solo sul processo di generazione delle chiavi (asimmetriche), controllando un campo nel certificato X.509 restituito. - Altri tag sono associati alla chiave appena generata come caratteristiche 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.aidlnel ramo di rilascio Android pertinente. - Keymaster: i tag sono definiti
in
platform/hardware/interfaces/keymaster/keymaster-version/types.halper ognikeymaster-versionrispettiva, ad esempio3.0/types.halper Keymaster 3 e4.0/types.halper Keymaster 4. Per Keymaster 2 e versioni precedenti, i tag sono definiti inplatform/hardware/libhardware/include/hardware/keymaster_defs.h.