L'API KeyMint (anciennement Keymaster) utilise largement les balises d'autorisation, qui sont des paires nom-valeur. Chaque balise possible comporte:
- Nom d'une énumération avec la valeur associée
- Un type associé (par exemple, entier, octets, date, énumération), qui indique si plusieurs valeurs sont autorisées
Par exemple, la balise Tag::BLOCK_MODE
a une valeur d'énumération de base de 4
et un repère de type TagType::ENUM_REP
qui indique que la valeur associée est une énumération répétable (dans ce cas, BlockMode
).
Les balises ont une double fonction dans l'API:
- En tant que paramètres d'une opération effectuée sur l'API, par exemple, le
Tag::MAC_LENGTH
d'une opération de signature HMAC indique la longueur HMAC demandée. - En tant que caractéristiques de clé, les valeurs qui sont définitivement liées à une clé particulière (c'est-à-dire incluses dans le blob de clé), par exemple,
Tag::EC_CURVE
indique la courbe elliptique à laquelle une clé est destinée. Chaque caractéristique clé est associée à un niveau de sécurité qui indique quelle partie du système contrôle l'attribut:- Une caractéristique clé avec le niveau de sécurité
TRUSTED_ENVIRONMENT
ouSTRONGBOX
est appliquée dans le matériel sécurisé. - Une caractéristique clé avec le niveau de sécurité
SOFTWARE
ouKEYSTORE
n'est appliquée que par le service systèmekeystore2
(et une telle caractéristique n'est donc pas résiliente à la compromission du système d'exploitation).
- Une caractéristique clé avec le niveau de sécurité
De nombreuses balises jouent à la fois le rôle de caractéristiques et de paramètres clés:
- Les caractéristiques de clé indiquent l'ensemble des paramètres autorisés pour une clé, par exemple:
- Le
Tag::PURPOSE
d'une clé ECDSA peut inclure à la foisSIGN
etAGREE_KEY
. - Le
Tag::BLOCK_MODE
d'une clé AES peut inclure les modes ECB, CBC et CTR.
- Le
- Une requête
begin()
inclut ensuite une valeur de paramètre spécifique pour l'opération, par exemple:begin()
possède un paramètre d'objectif explicite qui doit correspondre à l'une des valeursTag::PURPOSE
des caractéristiques clés.begin()
pour une opération AES doit inclure une seule valeur pourTag::BLOCK_MODE
dans le champparams
, qui doit correspondre à l'une des valeurs des caractéristiques de clé.
Cette double fonction est particulièrement pertinente pour la collecte des balises transmises en tant que keyParams
lors d'une opération de génération ou d'importation de clés.
- Certaines des balises servent de paramètres pour l'opération de génération de clés elle-même. Par exemple, la balise
Tag::CERTIFICATE_SUBJECT
n'affecte que le processus de génération de clés (asymétrique) en contrôlant un champ du certificat X.509 renvoyé. - Les autres balises sont liées à la clé nouvellement générée en tant que caractéristiques de clé et sont encapsulées dans le keyblob renvoyé afin qu'elles soient associées de manière permanente à la clé.
Vous trouverez des informations détaillées sur les valeurs de balise dans les spécifications d'interface HAL suivantes:
- KeyMint : toutes les balises sont définies dans
Tag.aidl
sur la branche de version Android appropriée. - Keymaster : les balises sont définies dans
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
pour chaquekeymaster-version
, par exemple3.0/types.hal
pour Keymaster 3 et4.0/types.hal
pour Keymaster 4. Pour Keymaster 2 et versions antérieures, les balises sont définies dansplatform/hardware/libhardware/include/hardware/keymaster_defs.h
.