Cette page fournit des informations pour aider les responsables de la mise en œuvre de Keymaster Couches d'abstraction matérielle (HAL) Il aborde chaque fonction de l'API, la version de Keymaster dans laquelle cette fonction est disponible, ainsi que décrit l'implémentation par défaut. Pour les tags, consultez la Page Keymaster Tags (Tags Keymaster).
Consignes générales de mise en œuvre
Les consignes suivantes s'appliquent à toutes les fonctions de l'API.
Paramètres du pointeur d'entrée
Version: 1, 2
Les paramètres de pointeur d'entrée qui ne sont pas utilisés pour un appel donné peuvent être
NULL
L'appelant n'est pas tenu de fournir des espaces réservés.
Par exemple, il est possible que certains types de clés et certains modes n'utilisent aucune valeur issue du
l'argument inParams
sur begin, afin que l'appelant puisse
définissez inParams
sur NULL
ou fournissez un paramètre vide.
défini. Les appelants peuvent également fournir des paramètres inutilisés, et les méthodes Keymaster doivent
ne génèrent pas d'erreurs.
Si un paramètre d'entrée requis est NULL, les méthodes Keymaster doivent renvoyer
ErrorCode::UNEXPECTED_NULL_POINTER
À partir de Keymaster 3, il n'existe aucun paramètre de pointeur. Tous les paramètres sont transmises par des références "value" ou "const".
Paramètres du pointeur de sortie
Version: 1, 2
Semblables aux paramètres de pointeur d'entrée, les paramètres de pointeur de sortie inutilisés
peut être NULL
. Si une méthode doit renvoyer des données dans une sortie
est NULL
, il doit renvoyer
ErrorCode::OUTPUT_PARAMETER_NULL
À partir de Keymaster 3, il n'existe aucun paramètre de pointeur. Tous les paramètres sont transmises par des références "value" ou "const".
Usage abusif de l'API
Version: 1, 2, 3
Il existe de nombreuses façons pour les appelants d'émettre des requêtes qui n'ont aucun sens ou sont stupides mais pas techniquement incorrects. Les implémentations Keymaster ne sont pas l'échec requis dans de tels cas ou émettre un diagnostic. L'utilisation de clés trop petites la spécification de paramètres d'entrée non pertinents, la réutilisation de vecteurs d'initialisation ou de nonces, la génération de clés sans but (et donc inutiles) et similaires ne doivent pas être diagnostiqué par les implémentations. L'omission des paramètres obligatoires, la spécification de des paramètres obligatoires non valides, et des erreurs similaires doivent être diagnostiquées.
Il incombe aux applications, au framework et au keystore Android de s'assurer que les appels aux modules Keymaster sont judicieux et utiles.
Fonctions
getHardwareFeatures
Version: 3
La nouvelle méthode getHardwareFeatures
expose aux clients
les caractéristiques importantes du matériel
sécurisé sous-jacent.
La méthode n'accepte aucun argument et renvoie quatre valeurs, toutes booléennes:
isSecure
esttrue
si les clés sont stockées dans du matériel sécurisé (TEE, etc.) et de ne jamais le laisser.supportsEllipticCurve
esttrue
si le le matériel est compatible avec la cryptographie sur les courbes elliptiques avec les courbes NIST (P-224, P-256, P-384 et P-521).- "
supportsSymmetricCryptography
" est "true
" si le matériel prend en charge la cryptographie symétrique, y compris AES et HMAC. supportsAttestation
esttrue
si le le matériel prend en charge la génération de certificats d'attestation de clé publique Keymaster, signé avec une clé injectée dans un environnement sécurisé.
Les seuls codes d'erreur que cette méthode peut renvoyer sont ErrorCode:OK
,
ErrorCode::KEYMASTER_NOT_CONFIGURED
ou l'un des codes d'erreur
indiquant un échec de communication
avec le matériel sécurisé.
getHardwareFeatures() generates(bool isSecure, bool supportsEllipticCurve, bool supportsSymmetricCryptography, bool supportsAttestation, bool supportsAllDigests, string keymasterName, string keymasterAuthorName);
configurer
Version: 2
Cette fonction a été introduite dans Keymaster 2 et est obsolète dans Keymaster 3, car ces informations sont disponibles dans les fichiers de propriétés système. Le fabricant les implémentations lisent ces fichiers au démarrage.
Configure keymaster. Cette méthode est appelée une fois après l'ouverture de l'appareil.
et avant de les utiliser. Il est utilisé pour fournir
KM_TAG_OS_VERSION et
KM_TAG_OS_PATCHLEVEL jusqu'à
keymaster. Tant que cette méthode n'est pas appelée, toutes les autres méthodes renvoient
KM_ERROR_KEYMASTER_NOT_CONFIGURED
Les valeurs fournies par ce
ne sont acceptées par keymaster qu'une seule fois par démarrage. Suivant
les appels renvoient KM_ERROR_OK
, mais ne font rien.
Si l'implémentation de keymaster se trouve dans du matériel sécurisé, et si la version du système d'exploitation et
les valeurs de niveau de correctif fournies ne correspondent pas aux valeurs fournies au
par le bootloader (ou si le bootloader
ne fournit pas de valeurs),
cette méthode renvoie KM_ERROR_INVALID_ARGUMENT
, et toutes les autres
méthodes continuent de renvoyer KM_ERROR_KEYMASTER_NOT_CONFIGURED
.
keymaster_error_t (*configure)(const struct keymaster2_device* dev, const keymaster_key_param_set_t* params);
addRngEntropy
Version: 1, 2, 3
Cette fonction a été introduite dans Keymaster 1 en tant que add_rng_entropy
.
et renommé dans Keymaster 3.
Ajoute l'entropie fournie par l'appelant au pool utilisé par l'implémentation de Keymaster 1. pour générer des nombres aléatoires, des clés, des vecteurs d'initialisation, etc.
Les implémentations Keymaster doivent combiner de manière sécurisée les ressources
dans leur pool, qui doivent également contenir
l’entropie générée en interne à partir
d’un générateur de nombres aléatoires matériel.
Le mélange doit être géré de sorte
qu’un attaquant ayant un contrôle total
des bits fournis par addRngEntropy
ou des bits générés par le matériel
mais pas les deux, n'a aucun avantage non négligeable pour prédire les bits
générées à partir du pool d'entropie.
Les implémentations Keymaster qui tentent d'estimer l'entropie dans leur
d'un pool interne partent du principe que les données
addRngEntropy
ne contient aucune entropie. Les implémentations de Keymaster peuvent
renvoie ErrorCode::INVALID_INPUT_LENGTH
s'ils reçoivent plus de 2
Kio de données dans un seul appel.
generateKey
Version: 1, 2, 3
Cette fonction a été introduite dans Keymaster 1 en tant que generate_key
.
et renommé dans Keymaster 3.
Génère une nouvelle clé cryptographique, en spécifiant les autorisations associées,
qui sont liés de façon permanente à la clé. Les implémentations de Keymaster permettent
impossible d'utiliser une clé incompatible avec les autorisations
spécifié au moment de la génération. En ce qui concerne les autorisations
que le matériel ne peut pas exiger, l'obligation de sécuriser le matériel est limitée
garantissant que les autorisations non applicables associées à la clé ne peuvent pas
de sorte que chaque appel à la fonction
getKeyCharacteristics
renvoie la valeur d'origine. De plus, les caractéristiques renvoyées par
generateKey
alloue correctement les autorisations entre les
les listes appliquées par matériel et par logiciel. Voir
getKeyCharacteristics pour en savoir plus.
Les paramètres fournis à generateKey
dépendent du type de clé
en cours de génération. Cette section récapitule les tags nécessaires et facultatifs pour
chaque type de clé. Tag::ALGORITHME
est toujours nécessaire pour spécifier le type.
Clés RSA
Les paramètres suivants sont nécessaires pour générer une clé RSA.
- Tag::KEY_SIZE
spécifie la taille du module public, en bits. En cas d'omission,
La méthode renvoie
ErrorCode::UNSUPPORTED_KEY_SIZE
. Les valeurs acceptées sont 1024, 2048, 3072 et 4096. Valeurs recommandées sont toutes des tailles de clé qui sont un multiple de 8. - Tag::RSA_PUBLIC_EXPONENT
spécifie la valeur d'exposant public RSA. En cas d'omission, la méthode
renvoie
ErrorCode::INVALID_ARGUMENT
. Les valeurs acceptées sont 3 et 65 537. Les valeurs recommandées sont toutes les valeurs premiers jusqu'à 2^64.
Les paramètres suivants ne sont pas nécessaires pour générer une clé RSA, mais
la création d'une clé RSA sans elle génère
une clé inutilisable. Toutefois,
La fonction generateKey
ne renvoie pas d'erreur si ces paramètres
sont omises.
- Tag::PURPOSE spécifie aux fins autorisées. Toutes les finalités doivent être prises en charge pour les clés RSA, toute combinaison.
- Tag::DIGEST spécifie
de condensé qui peuvent être utilisés avec la nouvelle clé. Implémentations
qui ne sont pas compatibles avec tous les algorithmes de condensé doivent accepter la génération de clés
qui incluent des condensés non compatibles. Les condensés non pris en charge doivent être
placée dans la catégorie "Application dans la liste des caractéristiques clés renvoyées.
En effet, la clé est utilisable avec ces autres condensés, mais le condensé
effectuées dans un logiciel. Le matériel est ensuite appelé pour effectuer l'opération
avec
Digest::NONE
. - Tag::PADDING spécifie
de remplissage qui peuvent
être utilisés avec la nouvelle clé. Implémentations
compatibles avec tous les algorithmes de condensé doivent placer
PaddingMode::RSA_PSS
etPaddingMode::RSA_OAEP
dans la liste appliquée par logiciel des principales caractéristiques, le cas échéant sont spécifiés.
Clés ECDSA
Seul le paramètre Tag::KEY_SIZE est pour générer une clé ECDSA. Il permet de sélectionner le groupe EC. Les valeurs acceptées sont 224, 256, 384 et 521, qui indiquent Courbes NIST p-224, p-256, p-384 et p521, respectivement.
Tag::DIGEST est également nécessaire pour une clé ECDSA utile, mais ce n'est pas obligatoire pour la génération.
Clés AES
Tag::KEY_SIZE uniquement
pour générer une clé AES. Si cette valeur est omise, la méthode renvoie
ErrorCode::UNSUPPORTED_KEY_SIZE
Les valeurs acceptées sont
128 et 256, avec prise en charge facultative des clés AES 192 bits.
Les paramètres suivants sont particulièrement pertinents pour les clés AES, mais pas nécessaire pour en générer un:
Tag::BLOCK_MODE
spécifie les modes de bloc avec lesquels la nouvelle clé peut être utilisée.Tag::PADDING
spécifie les modes de marge intérieure pouvant être utilisé. Cela ne s'applique qu'aux modes ECB et CBC.
Si le mode de blocage GCM est spécifié, indiquez le
Tag::MIN_MAC_LENGTH.
Si cette valeur est omise, la méthode renvoie ErrorCode::MISSING_MIN_MAC_LENGTH
.
La valeur de cette balise est un multiple de 8, et est compris entre 96 et 128.
Clés HMAC
Les paramètres suivants sont requis pour générer une clé HMAC:
- Tag::KEY_SIZE spécifie la taille de la clé en bits. Valeurs inférieures à 64 Les valeurs qui ne sont pas des multiples de 8 ne sont pas acceptées. Tout Les multiples de 8 (de 64 à 512) sont acceptés. Les valeurs supérieures peuvent être compatibles.
- Tag::MIN_MAC_LENGTH spécifie la longueur minimale MAC qui peuvent être générés ou vérifiés avec cette clé. Cette valeur est une multiple de 8 et d'au moins 64.
- Tag::DIGEST
spécifie l'algorithme de condensé de la clé. Exactement
un condensé est spécifié, sinon renvoie
ErrorCode::UNSUPPORTED_DIGEST
Si le condensé n'est pas compatible par le trustlet, renvoieErrorCode::UNSUPPORTED_DIGEST
Principales caractéristiques
Si l'argument des caractéristiques n'est pas NULL, generateKey
renvoie
les caractéristiques de la clé nouvellement générée divisées de façon appropriée
les listes appliquées par matériel et par logiciel. Voir
getKeyCharacteristics pour une description
des caractéristiques dans quelle liste. Les caractéristiques renvoyées
inclut tous les paramètres spécifiés pour la génération de clé, sauf
Tag::APPLICATION_ID et
Tag::APPLICATION_DATA.
Si ces tags étaient inclus dans les paramètres clés, ils sont supprimés
Les caractéristiques renvoyées, de sorte qu'il ne soit pas possible de trouver leurs valeurs
en examinant le blob de clé renvoyé. Cependant, ils sont liés de manière cryptographique
à l'objet blob de la clé, de sorte que si les valeurs correctes ne sont pas fournies lorsque la clé est
l'utilisation échoue. De même,
Tag::ROOT_OF_TRUST est
liée à la clé de manière cryptographique, mais ne peut pas être spécifiée
ou l'importation d'une clé et n'est jamais renvoyée.
En plus des tags fournis, le trustlet
ajoute Tag::ORIGIN,
avec la valeur KeyOrigin::GENERATED
,
et si la clé est
résistante aux rollbacks,
Résistance au rollback
La résistance au rollback signifie qu'une fois qu'une clé est supprimée deleteKey ou deleteAllKeys, elle est garantie par du matériel sécurisé. pour ne plus jamais être utilisables. En général, les implémentations qui ne résistent pas au rollback renvoyer le matériel de clé généré ou importé à l'appelant sous la forme d'un blob de clé, une sous forme chiffrée et authentifiée. Lorsque le keystore supprime le blob de clé, la clé est disparu, mais un attaquant qui a précédemment réussi à récupérer le matériel de clé peut potentiellement le restaurer sur l’appareil.
Une clé résiste au rollback si le matériel sécurisé garantit que la suppression vous ne pourrez pas les restaurer par la suite. Cela se fait généralement en stockant des clés supplémentaires des métadonnées dans un emplacement de confiance qui ne peut pas être manipulé par un attaquant. Activé les appareils mobiles, le mécanisme utilisé pour cela est généralement la mémoire protégée de relecture Blocs (RPMB). Comme vous pouvez créer un nombre de clés et le stockage fiable utilisé pour la résistance au rollback peut être limité de taille, cette méthode doit réussir même si la résistance au rollback ne peut pas être fournie pour la nouvelle clé. Dans ce cas, Tag::ROLLBACK_RESISTANT ne doivent pas être ajoutées aux caractéristiques clés.
getKeyCharacteristics
Version: 1, 2, 3
Cette fonction a été introduite dans Keymaster 1 en tant que
get_key_characteristics
et renommé dans Keymaster 3.
Renvoie les paramètres et les autorisations associés à la clé fournie. se divise en deux ensembles: les contraintes matérielles et les contraintes logicielles. La description s'applique également aux listes de caractéristiques de clé renvoyées par generateKey et importKey.
Si Tag::APPLICATION_ID
a été fourni lors de la génération de la clé
ou importation, la même valeur est fournie
cette méthode dans l'argument clientId
. Dans le cas contraire,
renvoie ErrorCode::INVALID_KEY_BLOB
. De même,
si Tag::APPLICATION_DATA
a été fourni lors de la génération
ou importation, la même valeur est fournie
cette méthode dans l'argument appData
.
Les caractéristiques renvoyées par cette méthode décrivent de manière exhaustive le type de la clé spécifiée.
Règle générale pour déterminer si un tag donné appartient au d'application forcée par logiciel ou par matériel est que, si la signification du tag est entièrement assurée par du matériel sécurisé, elle est appliquée au niveau du matériel. Sinon, il est par logiciel. Vous trouverez ci-dessous une liste de balises spécifiques peuvent ne pas être claires:
- Tag::ALGORITHME, Tag::KEY_SIZE, et Tag::RSA_PUBLIC_EXPONENT sont les propriétés intrinsèques de la clé. Pour toute clé sécurisée par le matériel, ces balises figureront dans la liste des applications appliquées par le matériel.
- Valeurs Tag::DIGEST pris en charge par le matériel sécurisé sont placés liste des appareils compatibles. Les récapitulatifs non compatibles figurent dans la liste des logiciels compatibles.
- Valeurs Tag::PADDING figurent généralement dans la liste des appareils compatibles, sauf s'il existe il se peut qu'un mode de remplissage spécifique doive être exécuté par un logiciel. Dans ce cas, elles sont ajoutées à la liste des applications appliquées par logiciel. Une telle possibilité survient pour les clés RSA qui autorisent le remplissage PSS ou OAEP avec des algorithmes de condensé qui ne sont pas prises en charge par le matériel sécurisé.
- Balise : USER_SECURE_ID et Tag::USER_AUTH_TYPE ne sont appliquées par le matériel que si l'authentification de l'utilisateur est assurée par le matériel. À le trustlet Keymaster et l'authentification adéquate le trustlet doivent tous deux être sécurisés et partager une clé HMAC secrète utilisée pour signer et valider les jetons d'authentification. Consultez le Authentification.
- Tag::ACTIVE_DATETIME, Balise : ORIGINATION_EXPIRE_DATETIME, et les balises Tag::USAGE_EXPIRE_DATETIME ont besoin d'accéder à une horloge murale vérifiable. Matériel le plus sécurisé n'a accès qu'aux informations temporelles fournies par le système d'exploitation non sécurisé, ce qui signifie que les tags sont appliqués par logiciel.
- Tag::ORIGIN est toujours dans la liste du matériel pour les clés liées au matériel. Sa présence dans ce est la façon dont les couches supérieures déterminent qu'une clé est intégrée au matériel.
cléimportation
Version: 1, 2, 3
Cette fonction a été introduite dans Keymaster 1 en tant que import_key
.
et renommé dans Keymaster 3.
Importe le matériel de clé dans le matériel Keymaster. Les paramètres de définition des clés
les caractéristiques de sortie sont traitées de la même manière que pour generateKey
,
à quelques exceptions près:
- Tag::KEY_SIZE et
Tag::RSA_PUBLIC_EXPONENT
(pour les clés RSA uniquement) ne sont pas nécessaires dans les paramètres d'entrée. Si aucune valeur n'est fournie,
le trustlet déduit les valeurs à partir du matériel de clé fourni et ajoute
les balises et les valeurs appropriées
aux caractéristiques clés. Si les paramètres sont
fourni, le trustlet les valide par rapport au matériel de clé. Dans
d'une non-concordance, la méthode renvoie
ErrorCode::IMPORT_PARAMETER_MISMATCH
. - La valeur Tag::ORIGIN renvoyée comporte le paramètre
la même valeur que
KeyOrigin::IMPORTED
.
Clé d'exportation
Version: 1, 2, 3
Cette fonction a été introduite dans Keymaster 1 en tant que export_key
.
et renommé dans Keymaster 3.
Exporte une clé publique à partir d'une paire de clés Keymaster RSA ou EC.
Si Tag::APPLICATION_ID
a été fourni lors de la génération de la clé ou
, la même valeur est fournie à cette méthode dans le
l'argument clientId
. Sinon, elle renvoie
ErrorCode::INVALID_KEY_BLOB
De même, si
Tag::APPLICATION_DATA
a été fournie lors de la génération ou de l'importation, la même valeur est fournie à
cette méthode dans l'argument appData
.
deleteKey
Version: 1, 2, 3
Cette fonction a été introduite dans Keymaster 1 en tant que delete_key
.
et renommé dans Keymaster 3.
Supprime la clé fournie. Cette méthode est facultative et n'est implémentés par des modules Keymaster qui offrent une résistance au rollback.
deleteAllKeys
Version: 1, 2, 3
Cette fonction a été introduite dans Keymaster 1 en tant que delete_all_keys
.
et renommé dans Keymaster 3.
Supprime toutes les clés. Cette méthode est facultative et n'est implémentée par des modules Keymaster qui offrent une résistance au rollback.
destroyAttestationIds
Version: 3
La méthode destroyAttestationIds()
permet de supprimer définitivement
désactiver le nouveau (facultatif, mais vivement recommandé)
Attestation d'identité
. Si le TEE n'a aucun moyen de s'assurer que l'attestation d'identité est
désactivée après l'appel de cette méthode, l'attestation d'ID ne doit pas être
n'est pas implémentée, auquel cas cette méthode n'a aucun effet et
renvoie ErrorCode::UNIMPLEMENTED
. Si l'attestation d'ID est
compatible, cette méthode doit être implémentée et doit désactiver définitivement
toutes les futures tentatives d'attestation d'ID. Cette méthode peut être appelée n'importe quel nombre
fois. Si l'attestation d'ID est déjà désactivée de manière permanente, la méthode
rien et renvoie ErrorCode::OK
.
Les seuls codes d'erreur que cette méthode peut renvoyer sont
ErrorCode::UNIMPLEMENTED
(si l'attestation d'ID n'est pas disponible) ;
ErrorCode:OK
, ErrorCode::KEYMASTER_NOT_CONFIGURED
ou
l'un des codes d'erreur indiquant un échec de communication avec le
matériel.
begin
Version: 1, 2, 3
Lance une opération de chiffrement à l'aide de la clé spécifiée, pour la valeur
avec les paramètres spécifiés (le cas échéant), et renvoie une
poignée d'opération utilisé avec update et finish pour terminer l'opération. Le handle d'opération est
également utilisé comme
le « défi » dans les opérations authentifiées.
est incluse dans le champ challenge
du
un jeton d'authentification unique.
Une implémentation Keymaster accepte au moins 16 instances simultanées
opérations. Keystore utilise jusqu'à 15 enregistrements, dont un que Vold peut utiliser comme mot de passe
le chiffrement. Lorsque 15 opérations keystore sont en cours (begin
a
ont été appelées, mais que finish
ou abort
n'ont pas encore été
et reçoit une requête pour commencer un 16, il appelle
abort
sur la dernière opération utilisée afin de réduire le nombre de
les opérations actives à 14 avant d'appeler begin
pour démarrer
opération récemment demandée.
Si Tag::APPLICATION_ID
ou Tag::APPLICATION_DATA ont été spécifiés.
lors de la génération ou de l'importation de clés, les appels à begin
incluent ces
balises avec les valeurs spécifiées à l'origine dans l'argument inParams
à cette méthode.
Application des autorisations
Au cours de cette méthode, les autorisations de clé suivantes sont appliquées par le
confiancelet si l’implémentation les a placés dans le
les caractéristiques et si l'opération
n'est pas une opération de clé publique. Clé publique
opérations, c'est-à-dire KeyPurpose::ENCRYPT
et KeyPurpose::VERIFY
,
avec des clés RSA ou EC, peuvent réussir même si l'autorisation
ne sont pas remplies.
- Tag::PURPOSE: objectif
spécifié dans l'appel
begin()
doit correspondre à l'un des objectifs dans les autorisations de clé, sauf si l'opération demandée est une clé publique opération. Si l'objectif spécifié ne correspond pas et que l'opération n'est pas opération de clé publique,begin
renvoieErrorCode::UNSUPPORTED_PURPOSE
Les opérations de clé publique sont de chiffrement asymétrique ou d’opérations de vérification. - Tag::ACTIVE_DATETIME
ne peut être appliquée que si une source de temps UTC fiable est disponible. Si le
la date et l'heure actuelles antérieures à la valeur de la balise, la méthode renvoie
ErrorCode::KEY_NOT_YET_VALID
- Balise : ORIGINATION_EXPIRE_DATETIME
ne peut être appliquée que si une source de temps UTC fiable est disponible. Si le
la date et l'heure actuelles sont postérieures à celles de la balise, et l'objectif est
KeyPurpose::ENCRYPT
ouKeyPurpose::SIGN
, la méthode renvoieErrorCode::KEY_EXPIRED
. - Balise : USAGE_EXPIRE_DATETIME
ne peut être appliquée que si une source de temps UTC fiable est disponible. Si le
la date et l'heure actuelles sont postérieures à celles de la balise, et l'objectif est
KeyPurpose::DECRYPT
ouKeyPurpose::VERIFY
, la méthode renvoieErrorCode::KEY_EXPIRED
. - Balise : MIN_SECONDS_BETWEEN_OPS
est comparée à un minuteur relatif de confiance indiquant la dernière utilisation
la clé. Si l'heure de la dernière utilisation et la valeur de la balise sont inférieures à l'heure actuelle,
La méthode renvoie
ErrorCode::KEY_RATE_LIMIT_EXCEEDED
. Consultez le description de la balise pour obtenir des informations importantes sur l'implémentation. - Tag::MAX_USES_PER_BOOT
est comparé à un compteur sécurisé qui suit les utilisations de la clé
depuis le démarrage. Si le nombre d'utilisations précédentes dépasse la valeur de la balise, la valeur
renvoie
ErrorCode::KEY_MAX_OPS_EXCEEDED
. - Balise : USER_SECURE_ID
n'est appliquée par cette méthode que si la clé possède également
Tag::AUTH_TIMEOUT.
Si la clé possède les deux, cette méthode doit recevoir un code
Tag::AUTH_TOKEN dans
inParams
Pour que le jeton d'authentification soit valide, tous les éléments suivants doit être vrai: <ph type="x-smartling-placeholder">- </ph>
- Le champ HMAC est validé correctement.
- Au moins l'un des éléments suivants Balise : USER_SECURE_ID de la clé correspond à au moins l'une des valeurs d'identifiant sécurisé à partir d'un jeton d'accès.
- La clé comporte un Balise : USER_AUTH_TYPE qui correspond au type d'authentification dans le jeton.
Si l'une de ces conditions n'est pas remplie, la méthode renvoie
ErrorCode::KEY_USER_NOT_AUTHENTICATED
- Tag::CALLER_NONCE
permet à l'appelant de spécifier un nonce ou un vecteur d'initialisation (IV). Si la clé
ne dispose pas de ce tag, mais l'appelant a fourni
Tag::NONCE à cette méthode,
ErrorCode::CALLER_NONCE_PROHIBITED
est renvoyé. - Tag::BOOTLOADER_ONLY
indique que seul le bootloader peut utiliser la clé. Si cette méthode est
appelé avec une clé uniquement du bootloader
après la fin de l’exécution du bootloader,
la fonction renvoie
ErrorCode::INVALID_KEY_BLOB
.
Clés RSA
Toutes les opérations de clé RSA spécifient exactement un mode de remplissage dans inParams
.
Si aucune valeur n'est spécifiée ou si elle est spécifiée plusieurs fois, la méthode renvoie
ErrorCode::UNSUPPORTED_PADDING_MODE
Les opérations de signature et de vérification RSA nécessitent un condensé, tout comme le chiffrement RSA.
et de déchiffrement avec le mode de remplissage OAEP. Dans ce cas, l'appelant
spécifie exactement un condensé dans inParams
. Si non spécifié ou spécifié
plusieurs fois, la méthode renvoie ErrorCode::UNSUPPORTED_DIGEST
.
Opérations de clé privée (KeyPurpose::DECYPT
et KeyPurpose::SIGN
)
ont besoin d'une autorisation de condensé et de remplissage, ce qui signifie que les autorisations
doivent contenir les valeurs spécifiées. Si ce n'est pas le cas, la méthode renvoie
ErrorCode::INCOMPATIBLE_DIGEST
ou ErrorCode::INCOMPATIBLE_PADDING
, selon le cas. Opérations de clé publique
(KeyPurpose::ENCRYPT
et KeyPurpose::VERIFY
) sont autorisés avec
le condensé ou le remplissage
non autorisé.
À l'exception de PaddingMode::NONE
, tous les modes de marge intérieure RSA sont
applicables uniquement à certaines fins. Plus précisément,
PaddingMode::RSA_PKCS1_1_5_SIGN
et PaddingMode::RSA_PSS
ne prennent en charge que la signature et la validation, tandis que PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT
et PaddingMode::RSA_OAEP
n'acceptent que le chiffrement et le déchiffrement.
La méthode renvoie ErrorCode::UNSUPPORTED_PADDING_MODE
si le
le mode spécifié n'est pas compatible avec l'objectif spécifié.
Il existe des interactions importantes entre les modes de remplissage et les condensés:
PaddingMode::NONE
indique qu'une valeur "brute" L'opération d'ARR est d'exécution. Lors de la signature ou de la validation,Digest::NONE
est spécifié pour le condensé. Aucun condensé n’est nécessaire pour un chiffrement sans remplissage ou le déchiffrement.- La marge intérieure de
PaddingMode::RSA_PKCS1_1_5_SIGN
nécessite un condensé. La le condensé peut êtreDigest::NONE
, auquel cas le Keymaster ne peuvent pas créer une structure de signature PKCS#1 v1.5 appropriée, car il ne peut pas ajouter la structure DigestInfo. À la place, l'implémentation construit0x00 || 0x01 || PS || 0x00 || M
, où M est le fourni et PS est la chaîne de remplissage. La taille de la clé RSA doit avoir au moins 11 octets de plus que le message, sinon la méthode renvoieErrorCode::INVALID_INPUT_LENGTH
- Le remplissage pour
PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT
ne nécessite pas de condensé. - La marge intérieure de
PaddingMode::RSA_PSS
nécessite un condensé, qui peut ne pas êtreDigest::NONE
SiDigest::NONE
est spécifié, le renvoieErrorCode::INCOMPATIBLE_DIGEST
. En outre, la taille de la clé RSA doit être supérieure d'au moins 2 + D octets à la sortie taille du condensé, où D est la taille du condensé, en octets. Sinon, La méthode renvoieErrorCode::INCOMPATIBLE_DIGEST
. La taille des valeurs de sel est le D. - La marge intérieure de
PaddingMode::RSA_OAEP
nécessite un condensé, qui peut ne pas êtreDigest::NONE
SiDigest::NONE
est spécifié, le renvoieErrorCode::INCOMPATIBLE_DIGEST
.
Clés EC
Les opérations de clé EC spécifient exactement un mode de remplissage dans inParams
.
Si aucune valeur n'est spécifiée ou si elle est spécifiée plusieurs fois, la méthode
renvoie ErrorCode::UNSUPPORTED_PADDING_MODE
.
Les opérations de clé privée (KeyPurpose::SIGN
) nécessitent une autorisation
de condensé et de remplissage, ce qui signifie que les autorisations par clé
doivent contenir les valeurs spécifiées. Sinon, renvoyez
ErrorCode::INCOMPATIBLE_DIGEST
Opérations de clé publique
(KeyPurpose::VERIFY
) sont autorisés avec un condensé ou un remplissage non autorisé.
Clés AES
Les opérations de clé AES spécifient exactement un mode de bloc et un mode de remplissage
dans inParams
. Si l'une des valeurs n'est pas spécifiée ou est spécifiée
plusieurs fois, renvoyez ErrorCode::UNSUPPORTED_BLOCK_MODE
ou
ErrorCode::UNSUPPORTED_PADDING_MODE
Les modes spécifiés doivent être
autorisée par la clé. Sinon, elle renvoie
ErrorCode::INCOMPATIBLE_BLOCK_MODE
ou
ErrorCode::INCOMPATIBLE_PADDING_MODE
Si le mode de blocage est BlockMode::GCM
, inParams
spécifie Tag::MAC_LENGTH
, et
la valeur spécifiée est un multiple de 8 qui n'est pas supérieur à 128
ou inférieure à la valeur de Tag::MIN_MAC_LENGTH
dans
des autorisations par clé. Pour les longueurs MAC supérieures à 128 ou les non-multiples de
8, renvoyer ErrorCode::UNSUPPORTED_MAC_LENGTH
. Pour des valeurs inférieures
que la longueur minimale de la clé, renvoyez ErrorCode::INVALID_MAC_LENGTH
.
Si le mode de blocage est BlockMode::GCM
ou BlockMode::CTR
,
le mode de marge intérieure spécifié doit être PaddingMode::NONE
.
Pour BlockMode::ECB
ou BlockMode::CBC
, le mode peut être
PaddingMode::NONE
ou PaddingMode::PKCS7
. Si le mode de marge intérieure
ne remplit pas ces conditions, renvoyez ErrorCode::INCOMPATIBLE_PADDING_MODE
.
Si le mode de blocage est BlockMode::CBC
, BlockMode::CTR
,
ou BlockMode::GCM
, un vecteur d'initialisation ou un nonce est nécessaire.
Dans la plupart des cas, les appelants ne doivent pas fournir de vecteur d'initialisation ou de nonce. Dans ce cas,
L'implémentation de Keymaster génère un vecteur d'initialisation ou un nonce aléatoire et le renvoie via
Tag::NONCE dans outParams
.
Les vecteurs d'initialisation CBC et CTR sont de 16 octets. Les nonces GCM font 12 octets. Si la clé
autorisations contiennent
Tag::CALLER_NONCE,
l'appelant peut alors fournir
un IV/nonce avec
Tag::NONCE
dans inParams
. Si un nonce est fourni lors
Tag::CALLER_NONCE
n'est pas autorisée, renvoyez ErrorCode::CALLER_NONCE_PROHIBITED
.
Si aucun nonce n'est fourni
Tag::CALLER_NONCE
est autorisé, générez un vecteur d'initialisation/nonce aléatoire.
Clés HMAC
Les opérations de clé HMAC spécifient Tag::MAC_LENGTH
dans inParams
.
La valeur indiquée doit être un multiple de 8 n'étant pas supérieur au
longueur du récapitulatif ou inférieure à la valeur de Tag::MIN_MAC_LENGTH
dans les autorisations de clé. Pour les longueurs MAC supérieures à la longueur du condensé, ou
non multiples de 8, renvoie ErrorCode::UNSUPPORTED_MAC_LENGTH
.
Pour les valeurs inférieures à la longueur minimale de la clé, renvoyez
ErrorCode::INVALID_MAC_LENGTH
mettre à jour
Version: 1, 2, 3
Fournit des données à traiter dans le cadre d'une opération en cours commençant par begin (début).
L'opération est spécifiée par le paramètre operationHandle
.
Pour offrir plus de flexibilité pour la gestion des tampons, les implémentations de cette méthode
ont la possibilité de consommer moins
de données que ce qui a été fourni. L'appelant est
qui est responsable de la boucle pour alimenter le reste des données dans les appels suivants. La
la quantité d'entrées consommées est renvoyée dans le paramètre inputConsumed
.
Les implémentations consomment toujours au moins un octet, sauf si le
l'opération ne peut plus en accepter ; si le nombre d'octets est supérieur à zéro et si
octets sont consommés, les appelants considèrent cela comme une erreur et abandonnent l'opération.
Les implémentations peuvent également choisir la quantité de données à renvoyer, en raison de la mise à jour. Cela ne s'applique qu'aux opérations de chiffrement et de déchiffrement, la signature et la validation ne renvoient aucune donnée jusqu'à la fin de l'opération finish. Renvoyez les données le plus tôt possible, plutôt que de les mettre en mémoire tampon.
Gestion des exceptions
Si cette méthode renvoie un code d'erreur autre que ErrorCode::OK
,
l'opération est annulée et le handle d'opération est invalidé. N'importe quelle valeur
l'utilisation future du handle, avec cette méthode,
finish ou abort
renvoie ErrorCode::INVALID_OPERATION_HANDLE
.
Application des autorisations
L'application des autorisations de clé s'effectue principalement au début. La seule exception concerne les cas où la clé comporte:
- Une ou plusieurs valeurs Tag::USER_SECURE_IDs, et
- Ne comporte pas de Tag::AUTH_TIMEOUT
Dans ce cas, la clé nécessite une autorisation par opération, et la mise à jour
reçoit un code Tag::AUTH_TOKEN
dans l'argument inParams
. HMAC vérifie que le jeton est valide et contient
un ID utilisateur sécurisé correspondant, fait correspondre le nom d'utilisateur
Tag::USER_AUTH_TYPE,
et contient le handle de l'opération en cours dans le
le défi. Si ces conditions ne sont pas remplies,
ErrorCode::KEY_USER_NOT_AUTHENTICATED
L'appelant fournit le jeton d'authentification à chaque appel à update. finish. L'implémentation n'a besoin de valider le jeton qu'une seule fois si elle le souhaite.
Clés RSA
Pour les opérations de signature et de validation avec Digest::NONE
,
cette méthode accepte que tout le bloc soit signé ou validé
mise à jour. Il est possible qu'elle n'utilise qu'une partie du bloc. Toutefois, si l'appelant
choisit de fournir les données dans plusieurs mises à jour, cette méthode l'accepte.
Si l'appelant fournit plus de données à signer que ce qui peut être utilisé (longueur de
dépasse la taille de la clé RSA), renvoyez ErrorCode::INVALID_INPUT_LENGTH
.
Clés ECDSA
Pour les opérations de signature et de validation avec Digest::NONE
,
cette méthode accepte que tout le bloc soit signé ou validé
mise à jour. Il est possible que cette méthode n'utilise qu'une partie du bloc.
Cependant, si l'appelant choisit de fournir les données dans plusieurs mises à jour, cette méthode l'accepte. Si l'appelant fournit plus de données à signer que celles qui peuvent être utilisées, les données sont tronquées sans notification. (Ceci diffère de la le traitement des données excédentaires fournies dans des opérations RSA similaires. Cela s'explique par est la compatibilité avec les anciens clients.)
Clés AES
Le mode AES GCM prend en charge
les « données d'authentification associées », fournies via la
Tag::ASSOCIATED_DATA
dans l'argument inParams
.
Les données associées peuvent être fournies dans des appels répétés (important si
les données sont trop volumineuses pour être envoyées dans un seul bloc), mais sont toujours antérieures
doivent être chiffrées
ou déchiffrées. Un appel de mise à jour peut recevoir à la fois les données associées
et les données à chiffrer/déchiffrer, mais les mises à jour ultérieures peuvent ne pas inclure
données. Si l'appelant fournit des données associées à un appel de mise à jour après un appel
qui inclut les données à chiffrer/déchiffrer, renvoyer ErrorCode::INVALID_TAG
.
Pour le chiffrement GCM, la balise est
ajoutée au texte chiffré par
finish. Lors du déchiffrement, le dernier
Tag::MAC_LENGTH
octets des données fournies au dernier
"update" est le tag. Puisqu'un appel donné de
update ne peut pas savoir s'il s'agit du dernier appel,
le système traite toutes les données, à l'exception de la longueur de la balise, et met en mémoire tampon les éventuelles données de balises.
pendant finish.
terminer
Version: 1, 2, 3
Terminer une opération en cours démarrée par begin toutes les données non traitées fournies par Google Cloud mise(s) à jour(s).
Cette méthode est la dernière appelée dans une opération. les données traitées sont renvoyées.
Qu'elle aboutisse ou qu'elle renvoie une erreur, cette méthode finalise
l'opération et invalide donc le handle d'opération fourni. N'importe quelle valeur
une utilisation ultérieure du handle, avec cette méthode ou update ou
abort, renvoie ErrorCode::INVALID_OPERATION_HANDLE
.
Les opérations de signature renvoient la signature en sortie. Opérations de validation
accepter la signature dans le paramètre signature
et ne renvoyer aucun résultat.
Application des autorisations
L'application des autorisations de clé s'effectue principalement commencer. La seule exception concerne les cas où la clé comporte:
- Une ou plusieurs Tag::USER_SECURE_IDs, et
- Ne possède pas de Tag::AUTH_TIMEOUT
Dans ce cas, la clé nécessite une autorisation par opération, et la mise à jour
reçoit un code Tag::AUTH_TOKEN
dans l'argument inParams
. HMAC vérifie que le jeton
est valide et contient un ID utilisateur sécurisé correspondant, correspond au
Tag::USER_AUTH_TYPE et
contient le handle de l'opération en cours dans
le défi. Si ces conditions ne sont pas remplies,
ErrorCode::KEY_USER_NOT_AUTHENTICATED
L'appelant fournit le jeton d'authentification à chaque appel vers update et finish. L'implémentation n'a besoin de valider le jeton qu'une seule fois si elle le souhaite.
Clés RSA
Voici quelques exigences supplémentaires, en fonction du mode de marge intérieure:
PaddingMode::NONE
Pour les opérations de signature et de chiffrement sans remplissage, si les données fournies sont plus courtes que la clé, les données sont complétées par zéro à gauche avant la signature/le chiffrement. Si les données ont la même longueur que la clé, mais numériquement plus grande, renvoyezErrorCode::INVALID_ARGUMENT
. Pour de vérification et de déchiffrement, les données doivent être comme clé. Sinon, renvoyezErrorCode::INVALID_INPUT_LENGTH.
PaddingMode::RSA_PSS
Pour les opérations de signature avec remplissage PSS, le salage PSS est la taille du condensat du message et généré de manière aléatoire. Condensé spécifié avec Tag::DIGEST. dansinputParams
, le begin est utilisé comme condensé PSS et l'algorithme de condensé MGF1.PaddingMode::RSA_OAEP
Le condensé spécifié avec Tag::DIGEST dansinputParams
au début est utilisé comme OAEP. l’algorithme de condensé, et SHA1 est utilisé comme algorithme de condensé MGF1.
Clés ECDSA
Si les données fournies pour la signature ou la validation sans remplissage sont trop longues, tronquez
Clés AES
Voici quelques conditions supplémentaires, en fonction du mode de blocage:
BlockMode::ECB
ouBlockMode::CBC
. Si la marge intérieure est dePaddingMode::NONE
et que la longueur des données n'est pas un multiple de la taille du bloc AES, renvoyezErrorCode::INVALID_INPUT_LENGTH
Si la marge intérieure estPaddingMode::PKCS7
: remplissez les données conformément à la spécification PKCS#7. Notez que PKCS#7 recommande d'ajouter un bloc de marge intérieure supplémentaire. si les données sont un multiple de la longueur du bloc.BlockMode::GCM
Pendant le chiffrement, après le traitement en texte brut, calculer la balise (Tag::MAC_LENGTH octets) et l’ajouter au texte chiffré renvoyé. Lors du déchiffrement, le traitement le dernier Tag::MAC_LENGTH octets comme tag. Si la validation du tag échoue, renvoyezErrorCode::VERIFICATION_FAILED
annuler
Version: 1, 2, 3
Annule l'opération en cours. Après l'appel pour annuler, renvoyez
ErrorCode::INVALID_OPERATION_HANDLE
pour
Toute utilisation ultérieure du handle d'opération fourni avec update
finish ou abort.
get_supported_algorithmes
Version: 1
Affiche la liste des algorithmes compatibles avec le matériel Keymaster. la mise en œuvre. Une implémentation logicielle renvoie une liste vide. un modèle hybride renvoie une liste contenant uniquement les algorithmes pris en charge par le matériel.
Les implémentations de Keymaster 1 sont compatibles avec RSA, EC, AES et HMAC.
get_supported_block_modes
Version: 1
Renvoie la liste des modes de bloc AES compatibles avec le matériel Keymaster pour un algorithme et un objectif donnés.
Pour RSA, EC et HMAC, qui ne sont pas des algorithmes de chiffrement par bloc, la méthode renvoie une
liste vide à des fins valides. Les finalités non valides devraient entraîner
renvoient ErrorCode::INVALID_PURPOSE
.
Les implémentations Keymaster 1 prennent en charge l'ECB, le CBC, le CTR et GCM pour AES le chiffrement et le déchiffrement.
get_supported_pickup_modes
Version: 1
Renvoie la liste des modes de marge intérieure compatibles avec le matériel Keymaster. pour un algorithme et un objectif donnés.
HMAC et EC n'ont pas de notion de remplissage, la méthode renvoie donc une liste vide
à toutes fins valables. Les finalités non valides devraient entraîner le renvoi de
ErrorCode::INVALID_PURPOSE
Pour RSA, les implémentations Keymaster 1 prennent en charge:
- Chiffrement, déchiffrement, signature et validation sans remplissage. Pour non rembourrées le chiffrement et la signature, si le message est plus court que le module public, les implémentations doivent la remplir avec des zéros. Pour les opérations de déchiffrement sans remplissage et la longueur de l'entrée doit correspondre à la taille du module public.
- Modes de chiffrement et de remplissage de signature PKCS#1 v1.5
- PSS avec une longueur de salage minimale de 20
- OAEP
Pour l'AES en modes ECB et CBC, les implémentations de Keymaster 1 n'acceptent aucun le remplissage et PKCS#7-rembourrage. Les modes CTR et GCM n'acceptent qu'aucune marge intérieure.
get_supported_digests
Version: 1
Renvoie la liste des modes de condensé compatibles avec le matériel Keymaster. pour un algorithme et un objectif donnés.
Comme aucun mode AES n'est compatible ou ne nécessite un condensé, la méthode renvoie une valeur à des fins valides.
Les implémentations de Keymaster 1 peuvent implémenter un sous-ensemble des condensés. Les implémentations fournissent SHA-256 et peuvent fournir MD5, SHA1, SHA-224, SHA-256, SHA384 et SHA512 (ensemble complet des condensés définis).
get_supported_import_formats
Version: 1
Renvoie la liste des formats d'importation compatibles avec le matériel Keymaster. la mise en œuvre d'un algorithme spécifié.
Les implémentations de Keymaster 1 prennent en charge le format PKCS#8 (sans mot de passe protection) pour importer des paires de clés RSA et EC, et prennent en charge l'importation au format RAW de matériel de clé AES et HMAC.
get_supported_export_formats
Version: 1
Renvoie la liste des formats d'exportation compatibles avec le matériel Keymaster. la mise en œuvre d'un algorithme spécifié.
Les implémentations de Keymaster1 prennent en charge le format X.509 pour l'exportation RSA et Clés publiques EC. L'exportation de clés privées ou de clés asymétriques n'est pas acceptée.
Fonctions historiques
Keymaster 0
Les fonctions suivantes appartiennent à la définition Keymaster 0 d'origine. Ils étaient présentes dans Keymaster 1 struct keymaster1_device_t. Toutefois, dans Keymaster, 1.0, ils n'étaient pas implémentés et leurs pointeurs de fonction étaient définis sur NULL.
generate_keypair
import_keypair
get_keypair_public
delete_keypair
delete_all
sign_data
Verify_data
Keymaster 1
Les fonctions suivantes appartiennent à la définition de Keymaster 1, mais elles étaient supprimées dans Keymaster 2, ainsi que les fonctions Keymaster 0 répertoriées ci-dessus.
get_supported_algorithms
get_supported_block_modes
get_supported_padding_modes
get_supported_digests
get_supported_import_formats
get_supported_export_formats
Keymaster 2
Les fonctions suivantes appartiennent à la définition de Keymaster 2, mais elles étaient supprimées dans Keymaster 3, ainsi que les fonctions Keymaster 1 répertoriées ci-dessus.
configure