Balises d'autorisation

L'API KeyMint (anciennement Keymaster) utilise de manière intensive les balises d'autorisation, qui sont des paires nom-valeur. Chaque tag possible comporte les éléments suivants :

  • Nom d'énumération avec valeur associée
  • Un type associé (par exemple, entier, octets, date, enum), qui indique si plusieurs valeurs sont autorisées

Par exemple, le tag dont le nom est Tag::BLOCK_MODE a une valeur d'énumération de base de 4 et un marqueur de type TagType::ENUM_REP qui indique que la valeur associée est une énumération répétable (dans ce cas, BlockMode).

Les tags 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 sur une opération de signature HMAC indique la longueur HMAC demandée.
  • En tant que caractéristiques clés, les valeurs sont liées de manière permanente à 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 associé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 un niveau de sécurité TRUSTED_ENVIRONMENT ou STRONGBOX est appliquée dans le matériel sécurisé.
    • Une caractéristique clé avec le niveau de sécurité SOFTWARE ou KEYSTORE n'est appliquée que par le service système keystore2 (et donc une telle caractéristique n'est pas résistante à la compromission de l'OS).

De nombreuses balises servent à la fois de caractéristiques clés et de paramètres :

  • Les caractéristiques clés indiquent l'ensemble des paramètres autorisés pour une clé. Par exemple :
    • Le Tag::PURPOSE d'une clé ECDSA peut inclure à la fois SIGN et AGREE_KEY.
    • Le Tag::BLOCK_MODE d'une clé AES peut inclure les modes ECB, CBC et CTR.
  • Une requête begin() inclut ensuite une valeur de paramètre spécifique pour l'opération, par exemple :
    • begin() comporte un paramètre d'objectif explicite qui doit correspondre à l'une des valeurs Tag::PURPOSE des caractéristiques clés.
    • begin() pour une opération AES doit inclure une seule valeur pour Tag::BLOCK_MODE dans le champ params, qui doit correspondre à l'une des valeurs des caractéristiques de la clé.

Cette double fonction est particulièrement pertinente pour la collecte des tags transmis sous forme de keyParams lors d'une opération de génération ou d'importation de clés.

  • Certaines balises servent de paramètres pour l'opération de génération de clé elle-même. Par exemple, la balise Tag::CERTIFICATE_SUBJECT n'affecte que le processus de génération de clés (asymétriques), en contrôlant un champ du certificat X.509 renvoyé.
  • D'autres tags sont liés à la clé nouvellement générée en tant que caractéristiques de la clé. Ils sont encapsulés dans le keyblob renvoyé afin d'être associés de manière permanente à la clé.

Vous trouverez des informations détaillées sur les valeurs des tags dans les spécifications d'interface HAL suivantes :