Provided by: manpages-fr-dev_4.26.0-1_all bug

NOM

       keyctl - Manipuler la gestion des clés du noyau

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

       Sinon, les utilitaires de gestion de clefs Linux (libkeyutils, -lkeyutils); consultez VERSIONS.

SYNOPSIS

       #include <linux/keyctl.h>     /* Définition des constantes KEY* */
       #include <sys/syscall.h>      /* Définition des constantes SYS_* */
       #include <unistd.h>

       long syscall(SYS_keyctl, int operation, unsigned long arg2,
                    unsigned long arg3, unsigned long arg4,
                    unsigned long arg5);

       Note : la glibc ne fournit pas d'enveloppe pour keyctl(), nécessitant l'utilisation de syscall(2).

DESCRIPTION

       keyctl() permet aux programmes de l'espace utilisateur de manipuler des clés.

       L'opération  qu'effectue  keyctl()  dépend de la valeur du paramètre operation. Chacune de ces opérations
       fait partie de l'enveloppe de la bibliothèque libkeyutils (fournie par le paquet keyutils)  en  tant  que
       fonctions individuelles (indiquées ci-dessous) pour permettre au compilateur de vérifier les types.

       Les valeurs autorisées pour operation sont :

       KEYCTL_GET_KEYRING_ID (depuis Linux 2.6.10)
              Associer l'identifiant d'une clé spéciale à celui d'une clé réelle pour ce processus.

              Cette  opération  recherche  la  clé  spéciale dont l'identifiant est fourni dans arg2 (transmis à
              key_serial_t). Si la clé spéciale est trouvée, l'identifiant de la clé réelle  correspondante  est
              renvoyé  en  tant  que  résultat de la fonction. Les valeurs suivantes peuvent être indiquées dans
              arg2 :

              KEY_SPEC_THREAD_KEYRING
                     Pour indiquer le trousseau spécifique au thread du thread appelant. Voir thread-keyring(7).

              KEY_SPEC_PROCESS_KEYRING
                     Pour indiquer le trousseau spécifique au processus de l'appelant. Voir process-keyring(7).

              KEY_SPEC_SESSION_KEYRING
                     Pour indiquer le trousseau spécifique à la session de l'appelant. Voir session-keyring(7).

              KEY_SPEC_USER_KEYRING
                     Pour indiquer le trousseau spécifique à l'UID de l'appelant. Voir user-keyring(7).

              KEY_SPEC_USER_SESSION_KEYRING
                     Pour  indiquer  le  trousseau  spécifique  à  la  session  de  l'UID  de  l'appelant.  Voir
                     user-session-keyring(7).

              KEY_SPEC_REQKEY_AUTH_KEY (depuis Linux 2.6.16)
                     Cela  indique  la  clé d'autorisation créée par request_key(2) et passée au processus qu'il
                     produit pour générer une clé. Cette clé n'est disponible que dans un programme à la manière
                     de request-key(8) où une clé d'autorisation a été passée  par  le  noyau  et  cesse  d’être
                     disponible lorsque la clé demandée a été instanciée ; voir request_key(2).

              KEY_SPEC_REQUESTOR_KEYRING (depuis Linux 2.6.29)
                     Cela  indique  l'identifiant  de la clé pour le trousseau de destination request_key(2). Ce
                     trousseau n'est disponible que dans un programme dans le style de request-key(8) où une clé
                     d'autorisation a été passée par le noyau et cesse d’être disponible une  fois  que  la  clé
                     demandée a été instanciée ; voir request_key(2).

              Si  la  clé indiquée dans arg2 n'existe pas, le comportement dépend de la valeur de arg3 (diffusée
              dans int). Si arg3 contient une valeur non nulle — et s'il est  utile  de  le  faire  (comme  pour
              rechercher  un utilisateur, une session utilisateur ou une clé de session) —, une nouvelle clé est
              créée et son identifiant de clé réelle est renvoyé en tant que résultat  de  la  fonction.  Sinon,
              l'opération échoue avec l'erreur ENOKEY.

              Si  un  identifiant  de  clé  valable  est  indiqué dans arg2 et si la clé existe, cette opération
              renvoie simplement l'identifiant de la clé. Si la clé n'existe pas, l'appel échoue  avec  l'erreur
              ENOKEY.

              L'appelant doit avoir le droit search sur un trousseau pour qu’il soit trouvable.

              Les paramètres arg4 et arg5 sont ignorés.

              Cette   opération   est   mise   à   disposition   par   libkeyutils   à  l'aide  de  la  fonction
              keyctl_get_keyring_ID(3).

       KEYCTL_JOIN_SESSION_KEYRING (depuis Linux 2.6.10)
              Remplacer le trousseau de la session à laquelle le processus est rattaché par un nouveau trousseau
              de session.

              Si arg2 vaut NULL, un trousseau anonyme dont la description est « _ses » est créé et le  processus
              est  inscrit  à  ce  trousseau  en tant que trousseau de sa session, remplaçant le trousseau de la
              session précédente.

              Sinon, arg2 (diffusé dans char *) est traité comme la description (le nom) d'un  trousseau  et  le
              comportement est ainsi :

              -  Si un trousseau ayant une description correspondante existe, le processus tentera de s'inscrire
                 à  ce  trousseau  en tant que trousseau de session si c'est possible ; sans quoi une erreur est
                 renvoyée. Pour s'inscrire au trousseau, l'appelant doit avoir le droit search sur le trousseau.

              -  Si un trousseau avec une description correspondante n'existe pas, un nouveau trousseau ayant la
                 description indiquée est créé et le processus est inscrit à ce trousseau en tant que  trousseau
                 de session.

              Les paramètres arg3, arg4 et arg5 sont ignorés.

              Cette    opération    est    mise    à    disposition    par    libkeyutils    par   la   fonction
              keyctl_join_session_keyring(3).

       KEYCTL_UPDATE (depuis Linux 2.6.10)
              Mettre à jour la charge utile des données d'une clé.

              Le paramètre arg2 (diffusé sur key_serial_t) indique l'identifiant de la clé à mettre à  jour.  Le
              paramètre  arg3  (diffusé  sur  void *)  pointe vers la nouvelle charge utile et arg4 (diffusé sur
              size_t) contient la taille de la nouvelle charge utile (en octets).

              L'appelant doit avoir les droits write sur la clé indiquée et le type de clé doit gérer les  mises
              à jour.

              Une  clé  instanciée  négativement  (voir  la  description  de KEYCTL_REJECT) peut être instanciée
              positivement avec cette opération.

              Le paramètre arg5 est ignoré.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_update(3).

       KEYCTL_REVOKE (depuis Linux 2.6.10)
              Révoquer la clé dont l'identifiant est fourni dans arg2 (diffusé sur  key_serial_t).  La  clé  est
              vouée  à  aller  à  la  poubelle  ; elle ne sera plus trouvable et ne sera plus disponible pour de
              futures opérations. Les futures tentatives d'utiliser la clé échoueront avec l'erreur EKEYREVOKED.

              L'appelant doit avoir les droits write ou setattr sur la clé.

              Les paramètres arg3, arg4 et arg5 sont ignorés.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_revoke(3).

       KEYCTL_CHOWN (depuis Linux 2.6.10)
              Changer le propriétaire (identifiant de l'utilisateur et du groupe) d'une clé.

              Le paramètre arg2 (diffusé sur key_serial_t) contient l'identifiant de la clé. Le  paramètre  arg3
              (diffusé  sur  uid_t)  contient  l'identifiant  du nouvel utilisateur (ou -1 s'il ne doit pas être
              modifié). Le paramètre arg4 (diffusé sur gid_t) contient l'identifiant du nouveau  groupe  (ou  -1
              s'il ne doit pas être modifié).

              La clé doit accorder le droit setattr à l'appelant.

              Pour  pouvoir  modifier  l'identifiant  utilisateur  ou  utiliser  un  identifiant  de groupe dont
              l'appelant  n'est  pas  membre,  l'appelant   doit   avoir   la   capacité   CAP_SYS_ADMIN   (voir
              capabilities(7)).

              Si  l'identifiant  utilisateur  doit  être  modifié,  le  nouvel  utilisateur  doit avoir un quota
              suffisant pour accepter la clé. La déduction du quota sera déplacée de l’ancien  utilisateur  vers
              le nouveau à condition que l’UID ait changé.

              Le paramètre arg5 est ignoré.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_chown(3).

       KEYCTL_SETPERM (depuis Linux 2.6.10)
              Passer  les  droits  de  la  clé dont l'identifiant est fourni dans le paramètre arg2 (diffusé sur
              key_serial_t) à ceux fournis dans le paramètre arg3 (diffusé sur key_perm_t).

              Si l'appelant n'a pas la capacité CAP_SYS_ADMIN, il ne peut modifier que les droits des clés qu'il
              possède. (Plus précisément, l’UID du système de fichiers de l’appelant doit correspondre  à  l’UID
              de la clé.)

              La clé doit accorder le droit setattr à l'appelant indépendamment de ses capacités.

              Les  droits dans arg3 indiquent les masques des opérations disponibles pour chacune des catégories
              suivantes d'utilisateur :

              possessor (depuis Linux 2.6.14)
                     Il s'agit des droits accordés à un processus possédant la clé (en tant qu'il est rattaché à
                     un des trousseaux du processus trouvables) ; voir keyrings(7).

              user   Il s'agit du droit accordé à un processus dont  l'identifiant  utilisateur  du  système  de
                     fichiers correspond à celui de la clé.

              group  Il s'agit du droit accordé au processus dont l'identifiant de groupe du système de fichiers
                     ou un de ses identifiants de groupes supplémentaires correspond à celui de la clé.

              other  Il  s'agit  du  droit  accordé aux autres processus qui ne rentrent pas dans les catégories
                     user et group.

              Les catégories user, group et other sont exclusives : si un processus  rentre  dans  la  catégorie
              user,  il ne recevra pas de droits dans la catégorie group ; s'il rentre dans la catégorie user ou
              group, il ne recevra aucun droit de la catégorie other.

              La catégorie possessor accorde des droits qui s'ajoutent à ceux accordés en vertu  des  catégories
              user, group ou other.

              Chaque  masque  de  droits  pèse  huit bits, dont seuls six sont actuellement utilisés. Les droits
              disponibles sont :

              view   Droit de lire les attributs d'une clé.

                     Ce droit est nécessaire pour l'opération KEYCTL_DESCRIBE.

                     Les bits de droit pour chaque catégorie sont KEY_POS_VIEW,  KEY_USR_VIEW,  KEY_GRP_VIEW  et
                     KEY_OTH_VIEW.

              read   Lire la charge utile d'une clé.

                     Ce droit est nécessaire pour l'opération KEYCTL_READ.

                     Les  bits  de  droit pour chaque catégorie sont KEY_POS_READ, KEY_USR_READ, KEY_GRP_READ et
                     KEY_OTH_READ.

              write  Mettre à jour ou instancier une clé. Pour un trousseau, attacher ou détacher des clés  d'un
                     trousseau.

                     Ce  droit  est  nécessaire  pour les opérations KEYCTL_UPDATE, KEYCTL_REVOKE, KEYCTL_CLEAR,
                     KEYCTL_LINK et KEYCTL_UNLINK.

                     Les bits des droits pour chaque catégorie sont KEY_POS_WRITE, KEY_USR_WRITE,  KEY_GRP_WRITE
                     et KEY_OTH_WRITE.

              search Rechercher  dans  les  trousseaux  et rendre les clés trouvables. Les recherches ne peuvent
                     parcourir des trousseaux imbriqués que si les droits search y sont positionnés.

                     Ce    droit    est    nécessaire     pour     les     opérations     KEYCTL_GET_KEYRING_ID,
                     KEYCTL_JOIN_SESSION_KEYRING, KEYCTL_SEARCH et KEYCTL_INVALIDATE.

                     Les bits de droit pour chaque catégorie sont KEY_POS_SEARCH, KEY_USR_SEARCH, KEY_GRP_SEARCH
                     et KEY_OTH_SEARCH.

              link   Rattacher une clé ou un trousseau.

                     Ce droit est nécessaire pour les opérations KEYCTL_LINK et KEYCTL_SESSION_TO_PARENT.

                     Les  bits  des droits pour cette catégorie sont KEY_POS_LINK, KEY_USR_LINK, KEY_GRP_LINK et
                     KEY_OTH_LINK.

              setattr (depuis Linux 2.6.15).
                     Modifier un identifiant d'utilisateur, de groupe ou le masque de droits d'une clé.

                     Ce droit est nécessaire pour les opérations KEYCTL_REVOKE, KEYCTL_CHOWN et KEYCTL_SETPERM.

                     Les  bits  de  droits  pour  chaque  catégorie   sont   KEY_POS_SETATTR,   KEY_USR_SETATTR,
                     KEY_GRP_SETATTR et KEY_OTH_SETATTR.

              Par commodité, les macros suivantes sont définies en tant que masques pour tous les bits de droits
              de chacune des catégories de l'utilisateur : KEY_POS_ALL, KEY_USR_ALL, KEY_GRP_ALL et KEY_OTH_ALL.

              Les paramètres arg4 et arg5 sont ignorés.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_setperm(3).

       KEYCTL_DESCRIBE (depuis Linux 2.6.10)
              Obtenir une chaîne décrivant les attributs d'une clé indiquée.

              L'identifiant  de  la clé à décrire est indiqué dans arg2 (diffusé sur key_serial_t). La chaîne de
              description est renvoyée dans le tampon vers lequel  pointe  arg3  (diffusé  sur  char *)  ;  arg4
              (diffusé sur size_t) indique la taille de ce tampon en octets.

              La clé doit accorder le droit view à l'appelant.

              La chaîne renvoyée se termine par NULL et contient les informations suivantes sur la clé :

                  type;uid;gid;perm;description

              Dans  ce  qui précède, type et description sont des chaînes, uid et gid sont des chaînes décimales
              et perm est un masque de droits hexadécimal. La chaîne de description est écrite  dans  le  format
              suivant :

                  %s;%d;%d;%08x;%s

              Note  :  l'objectif  est d'étendre la chaîne de description dans les futures versions du noyau. En
              particulier, le champ description ne contiendra pas de point-virgule ; elle doit être analysée  en
              partant  de  la  fin pour chercher le dernier point-virgule. Cela permettra, à l'avenir, d'insérer
              des champs délimités avec des points-virgules.

              Une tentative d'écrire dans le tampon n'a lieu que lorsque arg3 n'est pas NULL et quand la  taille
              du tampon indiquée est assez grande pour accepter la chaîne de description (y compris l'octet NULL
              final).  Afin  de  déterminer  si la taille du tampon était trop petite, vérifiez que la valeur de
              retour de l'opération est supérieure à arg4.

              Le paramètre arg5 est ignoré.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_describe(3).

       KEYCTL_CLEAR
              Vider le contenu (à savoir détacher les clés) d'un trousseau.

              L'identifiant de la clé (qui doit être de type  trousseau)  est  fourni  dans  arg2  (diffusé  sur
              key_serial_t).

              L'appelant doit avoir le droit write sur le trousseau.

              Les paramètres arg3, arg4 et arg5 sont ignorés.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_clear(3).

       KEYCTL_LINK (depuis Linux 2.6.10)
              Créer un lien d'un trousseau vers une clé.

              La  clé  à  rattacher est indiquée dans arg2 (diffusé sur key_serial_t) ; le trousseau est indiqué
              dans arg3 (diffusé sur key_serial_t).

              Si une clé du même type et ayant la même description se trouve déjà rattachée au  trousseau,  elle
              est éliminée du trousseau.

              Avant  de  créer  le  rattachement,  le  noyau vérifie la profondeur des trousseaux et renvoie les
              erreurs adéquates si le rattachement crée une boucle ou si la  profondeur  des  trousseaux  serait
              trop  importante (la limite de profondeur est définie par la constante KEYRING_SEARCH_MAX_DEPTH du
              noyau, fixée à 6, et elle est nécessaire pour empêcher les débordements de de  la  pile  du  noyau
              lors d'une recherche récursive de trousseaux).

              L'appelant doit avoir le droit link sur la clé à ajouter et celui write sur le trousseau.

              Les paramètres arg4 et arg5 sont ignorés.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_link(3).

       KEYCTL_UNLINK (depuis Linux 2.6.10)
              Supprimer une clé d'un trousseau.

              L'identifiant  de  la  clé  à  détacher  est  indiqué  dans  arg2  (diffusé  sur  key_serial_t)  ;
              l'identifiant du trousseau d'où la clé doit être détachée  est  indiqué  dans  arg3  (diffusé  sur
              key_serial_t).

              Si la clé n'est pas rattachée au trousseau, cela produit une erreur.

              L'appelant doit avoir le droit write sur le trousseau d'où doit être détachée la clé.

              Si le dernier rattachement d'une clé est supprimé, cette clé sera mise en destruction.

              Les paramètres arg4 et arg5 sont ignorés.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_unlink(3).

       KEYCTL_SEARCH (depuis Linux 2.6.10)
              Chercher  une clé dans l'arborescence d'un trousseau, renvoyer son identifiant et, éventuellement,
              la rattacher à un trousseau indiqué.

              L'arborescence où doit s'effectuer la recherche est indiquée en passant l'identifiant de la clé de
              tête à arg2 (diffusé sur key_serial_t). La recherche s'effectue en largeur et récursivement.

              Les paramètres arg3 et arg4 indiquent la clé à rechercher : arg3  (diffusé  en  tant  que  char *)
              contient  le  type  de  clé  (une  chaîne  de caractères se terminant par NULL et mesurant jusqu'à
              32 octets en comptant l'octet NULL final), et arg4  (diffusé  en  tant  que  char *)  contient  la
              description  de  la  clé  (une  chaîne  de  caractères  se  terminant par NULL et mesurant jusqu'à
              4096 octets en comptant l'octet NULL final).

              Le trousseau d'origine doit autoriser l'appelant à search. Pendant la recherche  récursive,  seuls
              les  trousseaux  accordant  le  droit  search  à  l'appelant seront explorés. Seules les clés pour
              lesquelles l'appelant a le droit search seront trouvées.

              Si la clé est trouvée, son identifiant est renvoyé en tant que résultat de la fonction.

              Si la clé est trouvée et si arg5 (diffusé sur key_serial_t) n'est pas zéro, la clé  est  rattachée
              au  trousseau  indiqué dont l'identifiant est indiqué dans arg5, avec les mêmes contraintes et les
              mêmes règles que KEYCTL_LINK. Si le trousseau cible  indiqué  dans  arg5  contient  déjà  une  clé
              rattachée  du  même type et à la même description, cet attachement sera remplacé par un autre avec
              la clé trouvée avec cette opération.

              Plutôt que des identifiants de trousseaux existants valables, les trousseaux d'origine  (arg2)  et
              cible  (arg5)  peuvent  être  un  des  identifiants  de  trousseau  de clés spéciales indiqué dans
              KEYCTL_GET_KEYRING_ID.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_search(3).

       KEYCTL_READ (depuis Linux 2.6.10)
              Lire les données de la charge utile (payload) d'une clé.

              L'identifiant de la clé dont la charge utile va être  lue  est  indiqué  dans  arg2  (diffusé  sur
              key_serial_t).  Il  peut  s'agir  de  l'identifiant  d'une  clé existante ou un identifiant de clé
              spéciale listé dans KEYCTL_GET_KEYRING_ID.

              La charge utile est mise dans le tampon vers lequel pointe arg3 (diffusé sur char *) ;  la  taille
              de ce tampon doit être indiquée dans arg4 (diffusé sur size_t).

              Les  données  renvoyées  seront  traitées  pour  être  présentées  en fonction du type de clé. Par
              exemple, un trousseau renverra un tableau d'entrées key_serial_t qui représentent les identifiants
              de toutes les clés qui y sont rattachées. Le type de clé user renverra ses données telles quelles.
              Si un type de clé n'implémente pas cette fonction, l'opération échoue avec l'erreur EOPNOTSUPP.

              Si arg3 n'est pas NULL, autant de données que possible de la charge utile seront copiées  dans  le
              tampon.  En  cas  de renvoi d'un succès, la valeur est toujours la taille totale des données de la
              charge utile. Pour savoir si le tampon était de taille  suffisante,  vérifiez  que  la  valeur  de
              retour est inférieure ou égale à celle fournie dans arg4.

              La  clé  doit accorder à l'appelant le droit read, ou bien lui accorder le droit search quand elle
              est recherchée depuis les trousseaux d'un processus (à savoir quand elle est détenue).

              Le paramètre arg5 est ignoré.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_read(3).

       KEYCTL_INSTANTIATE (depuis Linux 2.6.10)
              Instancier (positivement) une clé non instanciée avec une charge utile indiquée

              L'identifiant de la clé à instancier est fournie dans arg2 (diffusée sur key_serial_t).

              La charge utile de la clé est indiquée dans  le  tampon  vers  lequel  pointe  arg3  (diffusé  sur
              void *) ; la taille de ce tampon est indiquée dans arg4 (diffusée sur size_t).

              La  charge utile peut être un pointeur NULL et la taille du tampon peut être de 0 si cela est pris
              en charge par le type de clé (si c'est un trousseau, par exemple).

              L'opération peut échouer si les données de charge  utile  sont  dans  un  mauvais  format  ou  non
              valables pour toute autre raison.

              Si  arg5  (diffusé  sur key_serial_t) n'est pas zéro, la clé instanciée est rattachée au trousseau
              dont l'identifiant a été indiqué dans arg5, avec les mêmes contraintes et  les  mêmes  règles  que
              KEYCTL_LINK.

              L'appelant  doit avoir la clé d'autorisation adéquate, et une fois que la clé non instanciée a été
              instanciée, la clé d'autorisation est révoquée. Autrement dit, cette  opération  n'est  disponible
              qu'à  partir  d'un programme de style request-key(8). Voir request_key(2) pour une explication sur
              les clés non instanciées et l'instanciation de clés.

              Cette  opération  est  mise  à   disposition   par   libkeyutils   à   l'aide   de   la   fonction
              keyctl_instantiate(3).

       KEYCTL_NEGATE (depuis Linux 2.6.10)
              Instancier négativement une clé non instanciée.

              Cette opération est équivalente à l'appel :

                  keyctl(KEYCTL_REJECT, arg2, arg3, ENOKEY, arg4);

              Le paramètre arg5 est ignoré.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_negate(3).

       KEYCTL_SET_REQKEY_KEYRING (depuis Linux 2.6.10)
              Définir  le trousseau par défaut auquel les clés demandées implicitement seront rattachées pour ce
              thread et renvoyer la configuration précédente. Les requêtes de clé implicites sont celles que des
              composants du noyau effectuent en interne, comme par exemple lors de l'ouverture de  fichiers  sur
              des  systèmes de fichiers AFS ou NFS. Le fait de définir un trousseau par défaut produit également
              des effets lors d'une demande de clé depuis l'espace utilisateur ; voir  request_key(2)  pour  les
              détails.

              Le  paramètre  arg2  (diffusé  sur  int)  doit contenir une des valeurs suivantes pour indiquer le
              nouveau trousseau par défaut :

              KEY_REQKEY_DEFL_NO_CHANGE
                     Ne pas modifier le trousseau par défaut. Cela peut servir à  rechercher  le  trousseau  par
                     défaut actuel (sans le modifier).

              KEY_REQKEY_DEFL_DEFAULT
                     Cela sélectionne le comportement par défaut qui consiste à utiliser le trousseau spécifique
                     au  thread  s'il  y en a un, ou sinon celui spécifique au processus s'il y en a un, ou bien
                     celui spécifique à la session s'il y en a un, ou sinon celui de la  session  spécifique  de
                     l'identifiant utilisateur, ou celui spécifique à l'utilisateur.

              KEY_REQKEY_DEFL_THREAD_KEYRING
                     Utiliser  le  trousseau  spécifique  du  thread  (thread-keyring(7))  en  tant  que nouveau
                     trousseau par défaut.

              KEY_REQKEY_DEFL_PROCESS_KEYRING
                     Utiliser le trousseau spécifique au processus  (process-keyring(7))  en  tant  que  nouveau
                     trousseau par défaut.

              KEY_REQKEY_DEFL_SESSION_KEYRING
                     Utiliser  le  trousseau  spécifique  à  la session (session-keyring(7)) en tant que nouveau
                     trousseau par défaut.

              KEY_REQKEY_DEFL_USER_KEYRING
                     Utiliser le trousseau spécifique à l'identifiant utilisateur (user-keyring(7)) en tant  que
                     nouveau trousseau par défaut.

              KEY_REQKEY_DEFL_USER_SESSION_KEYRING
                     Utiliser   le   trousseau   de   la   session   spécifique   de  l'identifiant  utilisateur
                     (user-session-keyring(7)) en tant que nouveau trousseau par défaut.

              KEY_REQKEY_DEFL_REQUESTOR_KEYRING (depuis Linux 2.6.29)
                     Utiliser le trousseau du demandeur.

              Toutes les autres valeurs ne sont pas valables.

              Les paramètres arg3, arg4 et arg5 sont ignorés.

              Le paramètre que contrôle cette opération est récupéré par l'enfant de fork(2) et conservé  durant
              un execve(2).

              Cette   opération   est   mise   à   disposition   par   libkeyutils   à  l'aide  de  la  fonction
              keyctl_set_reqkey_keyring(3).

       KEYCTL_SET_TIMEOUT (depuis Linux 2.6.10)
              Définir un délai d'expiration sur une clé.

              L'identifiant de la clé est indiqué dans arg2 (diffusé sur key_serial_t). La valeur du  délai,  en
              seconde  à partir de l'heure actuelle, est indiquée dans arg3 (diffusé sur unsigned int). Le délai
              se mesure par rapport à l'horloge en temps réel.

              L'indication d'une valeur de délai de 0 vide les délais existants de la clé.

              Le fichier /proc/keys affiche le temps restant avant l'expiration de chaque clé (il s'agit  de  la
              seule méthode de recherche du temps de vie d'une clé).

              L'appelant   doit  avoir  le  droit  setattr  sur  la  clé  ou  détenir  un  jeton  d'autorisation
              d’instanciation pour cette clé (voir request_key(2)).

              La clé et les liens vis-à-vis d'elle seront automatiquement mis  à  la  poubelle  après  le  délai
              d'expiration. Les futurs essais d'y accéder échoueront avec l'erreur EKEYEXPIRED.

              Cette opération ne peut pas être utilisée pour poser des limites à des clés révoquées, expirées ou
              instanciées négativement.

              Les paramètres arg4 et arg5 sont ignorés.

              Cette   opération   est   mise   à   disposition   par   libkeyutils   à  l'aide  de  la  fonction
              keyctl_set_timeout(3).

       KEYCTL_ASSUME_AUTHORITY (depuis Linux 2.6.10)
              Assumer (ou se débarrasser) de l'autorité pour le thread appelant pour instancier une clé.

              Ce paramètre arg2 (diffusé sur key_serial_t) fait assumer l'autorité à un identifiant de clé autre
              que zéro, ou retire l'autorité grâce à la valeur 0.

              Si arg2 n'est pas zéro, il indique  un  identifiant  de  clé  non  instanciée  qui  devra  assumer
              l'autorité.   Cette   clé   peut   alors   être   instanciée   en   utilisant  KEYCTL_INSTANTIATE,
              KEYCTL_INSTANTIATE_IOV, KEYCTL_REJECT ou KEYCTL_NEGATE. Quand la clé a été instanciée,  le  thread
              se voit automatiquement retirer le pouvoir d'instancier la clé.

              Une  clé  ne  peut  assumer  une  autorité  que si le thread appelant a dans ses trousseaux la clé
              d'autorisation associée  à  la  clé  (autrement  dit,  l'opération  KEYCTL_ASSUME_AUTHORITY  n'est
              disponible  qu'à  partir  d'un  programme  du  style request-key(8) ; voir request_key(2) pour une
              explication sur la manière dont cette opération est utilisée).  L'appelant  doit  avoir  le  droit
              search sur la clé d'autorisation.

              Si  la  clé indiquée a une clé d'autorisation associée, l'identifiant de cette clé est renvoyé. La
              clé d'autorisation peut être lue (KEYCTL_READ) pour obtenir les informations d'appel transmises  à
              request_key(2).

              Si  l'identifiant fourni dans arg2 est 0, l'autorité actuellement assumée est retirée et la valeur
              0 est renvoyée.

              Le mécanisme KEYCTL_ASSUME_AUTHORITY  permet  à  un  programme  tel  que  requestkey(8)  d'assumer
              l'autorité  nécessaire  pour  instancier  une nouvelle clé non instanciée créée suite à un appel à
              request_key(2).   Pour    plus    d'informations,    voir    request_key(2)    et    le    fichier
              Documentation/security/keys-request-key.txt des sources du noyau.

              Les paramètres arg3, arg4 et arg5 sont ignorés.

              Cette   opération   est   mise   à   disposition   par   libkeyutils   à  l'aide  de  la  fonction
              keyctl_assume_authority(3).

       KEYCTL_GET_SECURITY (depuis Linux 2.6.26)
              Récupérer l'étiquette de sécurité LSM (Linux Security Module) de la clé indiquée.

              L'identifiant de la clé dont l'étiquette doit être récupérée est indiqué dans  arg2  (diffusé  sur
              key_serial_t).  L'étiquette de sécurité (qui se termine par un octet NULL) sera mis dans le tampon
              vers lequel pointe arg3 (diffusé sur char *) ; la taille du tampon doit  être  fournie  dans  arg4
              (diffusée sur size_t).

              Si arg3 est indiqué en tant que NULL ou si la taille du tampon indiquée dans arg4 est trop petite,
              toute  la  taille  de  la  chaîne  de  l'étiquette de sécurité (y compris l'octet NULL de fin) est
              renvoyée en tant que résultat de la fonction et rien n'est copié dans le tampon.

              L'appelant doit avoir le droit view sur la clé indiquée.

              La chaîne de l'étiquette de sécurité renvoyée sera affichée sous la bonne forme sur le LSM en mode
              force. Par exemple, avec SELinux, elle peut ressembler à :

                  unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

              Si aucun LSM n'est en mode force, une chaîne vide est placée dans le tampon.

              Le paramètre arg5 est ignoré.

              Cette  opération   est   mise   à   disposition   par   libkeyutils   à   l'aide   des   fonctions
              keyctl_get_security(3) et keyctl_get_security_alloc(3).

       KEYCTL_SESSION_TO_PARENT (depuis Linux 2.6.32)
              Remplacer  le trousseau de session auquel est enregistré le parent du processus appelant par celui
              du processus appelant.

              Le trousseau sera remplacé dans le processus parent sur les  prochains  points  de  transition  du
              parent entre l'espace noyau et l'espace utilisateur.

              Le  trousseau  doit  exister et accorder le droit link à l'appelant. Le processus parent doit être
              single-threaded et appartenir au même utilisateur/groupe effectif que ce processus, et il ne  doit
              pas  être  set-user-ID  ou  set-group-ID.  L'identifiant  utilisateur  du  trousseau de la session
              existante du processus parent (s'il en existe un) et celui du trousseau de session  de  l'appelant
              doivent correspondre à celui de l'identifiant utilisateur effectif de l'appelant.

              Le  fait  que  le processus parent soit touché par cette opération permet à un programme tel qu'un
              interpréteur de démarrer un  processus  enfant  qui  utilise  cette  opération  pour  modifier  le
              trousseau de session de l'interpréteur (c'est ce que fait la commande new_session de keyctl(1)).

              Les paramètres arg2, arg3, arg4 et arg5 sont ignorés.

              Cette   opération   est   mise   à   disposition   par   libkeyutils   à  l'aide  de  la  fonction
              keyctl_session_to_parent(3).

       KEYCTL_REJECT (depuis Linux 2.6.39)
              Marquer une clé comme étant instanciée négativement et positionner une durée d'expiration  sur  la
              clé. Cette opération ajoute un supplément à l'opération KEYCTL_NEGATE ci-dessus.

              L'identifiant   de   la  clé  à  instancier  négativement  est  indiqué  dans  arg2  (diffusé  sur
              key_serial_t). Le paramètre arg3 (diffusé sur unsigned int) indique la durée de vie de la  clé  en
              seconde.  Le  paramètre  arg4  (diffusé  sur  unsigned  int) indique l'erreur à renvoyer quand une
              recherche trouve cette clé ; généralement il s'agit de EKEYREJECTED, EKEYREVOKED ou EKEYEXPIRED.

              Si arg5 (diffusé sur key_serial_t) n'est pas nul, la clé instanciée négativement est rattachée  au
              trousseau dont l'identifiant est indiqué dans arg5, avec les mêmes contraintes et les mêmes règles
              que KEYCTL_LINK.

              L'appelant  doit  avoir  la  clé  d'autorisation  adéquate.  Autrement  dit, cette opération n'est
              disponible qu'à partir d'un programme dans le style request-key(8). Voir request_key(2).

              L'appelant doit avoir la clé d'autorisation adéquate, et une fois que la clé non instanciée a  été
              instanciée,  la  clé  d'autorisation est révoquée. Autrement dit, cette opération n'est disponible
              qu'à partir d'un programme de style request-key(8). Voir request_key(2) pour une  explication  sur
              les clés non instanciées et l'instanciation de clés.

              Cette opération est mise à disposition par libkeyutils à l'aide de la fonction keyctl_reject(3).

       KEYCTL_INSTANTIATE_IOV (depuis Linux 2.6.39)
              Instancier une clé non instanciée avec la charge utile indiquée à l'aide d'un vecteur de tampons.

              Cette  opération  est  la  même  que  KEYCTL_INSTANTIATE, mais les données de la charge utile sont
              indiquées sous forme d'un tableau de structures iovec (voir iovec(3type)).

              Le pointeur vers le vecteur de charge utile est indiqué dans  arg3  (diffusé  en  tant  que  const
              struct  iovec *).  Le  nombre  d'éléments  du  vecteur  est indiqué dans arg4 (diffusé en tant que
              unsigned int).

              arg2  (identifiant  de  clé)  et  arg5  (identifiant   de   trousseau)   sont   interprétés   avec
              KEYCTL_INSTANTIATE.

              Cette   opération   est   mise   à   disposition   par   libkeyutils   à  l'aide  de  la  fonction
              keyctl_instantiate_iov(3).

       KEYCTL_INVALIDATE (depuis Linux 3.5)
              Marquer une clé comme non valable.

              L'identifiant de la clé à rendre non valable est indiqué dans arg2 (diffusé sur key_serial_t).

              Pour rendre une clé non valable, l'appelant doit avoir le droit search sur la clé.

              Cette opération marque la clé comme non valable et programme sa mise immédiate à la corbeille.  Le
              ramasse-miettes,  supprime les clés non valables de tous les trousseaux et efface la clé quand son
              nombre de références atteint 0. Après cette opération, cette  clé  sera  ignorée  par  toutes  les
              recherches, même si elle n'est pas encore effacée.

              Les  clés  marquées  comme  non valables deviennent aussitôt invisibles pour les opérations de clé
              normales, bien qu'elle soient encore visibles dans /proc/keys (avec un drapeau « i »)  jusqu'à  ce
              qu'elles soient totalement supprimées.

              Les paramètres arg3, arg4 et arg5 sont ignorés.

              Cette   opération   est   mise   à   disposition   par   libkeyutils   à  l'aide  de  la  fonction
              keyctl_invalidate(3).

       KEYCTL_GET_PERSISTENT (depuis Linux 3.13)
              Récupérer le trousseau persistant (persistent-keyring(7)) d'un utilisateur indiqué et le rattacher
              au trousseau indiqué.

              L'identifiant utilisateur est indiqué dans arg2 (diffusé sur uid_t). Si la valeur -1 est indiquée,
              l'identifiant de l'utilisateur réel de l'appelant  est  utilisé.  L'identifiant  du  trousseau  de
              destination est indiqué dans arg3 (diffusé sur key_serial_t).

              L'appelant doit avoir la capacité CAP_SETUID dans son espace de noms utilisateur afin de récupérer
              le  trousseau  persistant  pour  un  identifiant utilisateur qui ne correspond pas à l'identifiant
              utilisateur réel ou effectif de l'appelant.

              Si  l'appel  réussit,  un  lien  vers  le  trousseau  persistant  est  ajouté  au  trousseau  dont
              l'identifiant a été indiqué dans arg3.

              L'appelant doit avoir le droit write sur le trousseau.

              Le trousseau persistant sera créé par le noyau s'il n'existe pas encore.

              Chaque  fois  que l'opération KEYCTL_GET_PERSISTENT est effectuée, le trousseau persistant aura un
              délai d'expiration réinitialisé à la valeur dans :

                  /proc/sys/kernel/keys/persistent_keyring_expiry

              Lorsque le délai est atteint, le trousseau persistant sera supprimé et  son  contenu  pourra  être
              collecté par le ramasse-miettes.

              Des trousseaux persistants ont été ajoutés dans Linux 3.13.

              Les paramètres arg4 et arg5 sont ignorés.

              Cette   opération   est   mise   à   disposition   par   libkeyutils   à  l'aide  de  la  fonction
              keyctl_get_persistent(3).

       KEYCTL_DH_COMPUTE (depuis Linux 4.7)
              Calculer la clé secrète Diffie-Hellman partagée ou la clé publique, en  appliquant  éventuellement
              une fonction de dérivation de clé (KDF) au résultat.

              Le paramètre arg2 est un pointeur vers un ensemble de paramètres contenant les numéros de série de
              trois  clés  « utilisateur » utilisés dans le calcul Diffie-Hellman, empaquetés dans une structure
              de la forme suivante :

                  struct keyctl_dh_params {
                      int32_t private; /* La clé privée locale */
                      int32_t prime; /* Le nombre premier, connue des deux côtés */
                      int32_t base;  /* L'entier de base : soit un générateur partagé,
                                        soit la clé publique distante */
                  };

              Chacune des trois clés indiquées dans cette structure doit accorder le droit  read  à  l'appelant.
              Les charges utiles de ces clés sont utilisées pour calculer le résultat Diffie-Hellman ainsi :

                  base ^ private mod prime

              Si  la  base  est le générateur partagé, le résultat est la clé publique locale. Si la base est la
              clé publique distante, le résultat est le code secret partagé.

              Le paramètre arg3 (diffusé sur char *) pointe vers un tampon où est mis le résultat du calcul.  La
              taille de ce tampon est indiquée dans arg4 (diffusé sur size_t).

              Le  tampon  doit  être assez grand pour accueillir les données de sortie, sans quoi une erreur est
              renvoyée. Si arg4 vaut zéro, le tampon n'est pas utilisé et l'opération renvoie la taille minimale
              requise du tampon (à savoir la longueur du nombre premier).

              Les calculs Diffie-Hellman peuvent être effectués  dans  l'espace  utilisateur  mais  exigent  une
              bibliothèque  multiprécision  d'entiers  (MPI).  Le  déplacement de l'implémentation dans le noyau
              donne accès à  l'implémentation  MPI  du  noyau  et  permet  d'accéder  à  la  sécurisation  et  à
              l'accélération matérielle.

              L'ajout  de  la  prise  en  charge  du  calcul DH à l'appel système keyctl() a été considéré comme
              convenable grâce à l'utilisation de l'algorithme DH pour faire dériver les clés partagées  ;  cela
              permet aussi au type de clé de déterminer l'implémentation DH adéquate (logicielle ou matérielle).

              Si  le  paramètre arg5 vaut NULL, le résultat DH lui-même est renvoyé. Sinon, (depuis Linux 4.12),
              il s'agit d'un pointeur vers une structure  qui  indique  les  paramètres  de  l'opération  KDF  à
              appliquer :

                  struct keyctl_kdf_params {
                      char *hashname;     /* Nom de l'algorithm de hachage */
                      char *otherinfo;    /* SP800-56A OtherInfo */
                      __u32 otherinfolen; /* Taille des données otherinfo */
                      __u32 __spare[8];   /* Réservé */
                  };

              Le  champ  hashname est une chaîne se terminant par NULL qui indique un nom de hachage (disponible
              dans l'API de chiffrement du noyau ; la liste des hachages  disponibles  est  plutôt  difficile  à
              examiner ; veuillez vous reporter à la documentation de la « Kernel Crypto API Architecture » pour
              des  informations  sur la manière dont les noms de hachage sont construits, et aux sources et à la
              configuration  de  votre  noyau   concernant   les   chiffrements   et   les   modèles   de   type
              CRYPTO_ALG_TYPE_SHASH disponibles) à appliquer au résultat DH dans l'opération KDF.

              Le  champ  otherinfo  consiste  dans des données OtherInfo comme décrit dans la section 5.8.1.2 de
              SP800-56A et il est spécifique à l'algorithme. Ces données sont concaténées avec  le  résultat  de
              l'opération  DH  et  elles  sont fournies comme entrée de l'opération KDF. Leur taille est fournie
              dans  le  champ  otherinfolen  et  limitée  à  la  constante  KEYCTL_KDF_MAX_OI_LEN  définie  dans
              security/keys/internal.h à la valeur 64.

              Le  champ __spare est actuellement inusité. Il était ignoré jusqu'à Linux 4.13 (mais il est encore
              visible par l'utilisateur puisqu'il est copié dans le noyau) et  il  devrait  contenir  des  zéros
              depuis Linux 4.13.

              L'implémentation KDF se conforme à SP800-56A et à SP800-108 (le compteur KDF).

              Cette  opération  est  mise  à disposition par libkeyutils (à partir de libkeyutils 1.5.10 jusqu'à
              aujourd'hui) à l'aide de la fonction keyctl_dh_compute(3) et de keyctl_dh_compute_alloc(3).

       KEYCTL_RESTRICT_KEYRING (depuis Linux 4.12)
              Appliquer une restriction de rattachement de clé à un trousseau dont l'identifiant est fourni dans
              arg2 (diffusé sur key_serial_t). L'appelant doit avoir le droit setattr sur la clé. Si  arg3  vaut
              NULL,  toute  tentative  d'ajout au trousseau est bloquée ; sinon il contient un pointeur vers une
              chaîne contenant le nom du type de clé et arg4 contient un pointeur vers une chaîne  contenant  la
              restriction  spécifique  au type de clé. À partir de Linux 4.12, seul le type « asymmetric » a des
              restrictions définies :

              builtin_trusted
                     N'autoriser  que  les  clés  signées  par  une   clé   rattachée   au   trousseau   interne
                     (« .builtin_trusted_keys »).

              builtin_and_secondary_trusted
                     N'autoriser  que  les  clés  signées  par  une  clé  rattachée  à  un  trousseau secondaire
                     (« .secondary_trusted_keys ») ou, par extension, à une clé du trousseau interne, puisque le
                     deuxième est lié au premier.

              key_or_keyring:key
              key_or_keyring:key:chain
                     Si key indique l'identifiant d'une clé de type « asymmetric », seules les clés signées  par
                     cette clé sont autorisées.

                     Si  key indique l'identifiant d'un trousseau, seules les clés signées par une clé rattachée
                     à ce trousseau sont autorisées.

                     Si « :chain » est indiqué,  les  clés  signées  par  une  clé  rattachée  au  trousseau  de
                     destination  (c'est-à-dire  le  trousseau  dont l'identifiant est indiqué dans le paramètre
                     arg2) sont aussi autorisées.

              Remarquez qu'une restriction ne peut être configurée qu'une fois pour le trousseau indiqué  ;  une
              fois qu'une restriction est positionnée, elle ne peut pas être contournée.

              Le paramètre arg5 est ignoré.

VALEUR RENVOYÉE

       Pour qu'un appel réussisse, le code de retour dépend de l'opération :

       KEYCTL_GET_KEYRING_ID
              L'identifiant du trousseau demandé.

       KEYCTL_JOIN_SESSION_KEYRING
              L'identifiant du trousseau de la session qu'on vient de rejoindre.

       KEYCTL_DESCRIBE
              La taille de la description (comprenant l'octet NULL de fin) indépendamment de la taille du tampon
              fournie.

       KEYCTL_SEARCH
              L'identifiant de la clé trouvée.

       KEYCTL_READ
              La quantité de données disponibles dans la clé, indépendamment de la taille du tampon fournie.

       KEYCTL_SET_REQKEY_KEYRING
              L'identifiant  du  trousseau par défaut précédent auquel ont été rattachées implicitement les clés
              sollicitées (un parmi KEY_REQKEY_DEFL_USER_*).

       KEYCTL_ASSUME_AUTHORITY
              0 si l'identifiant donné valait 0, ou l'identifiant de la clé d'autorisation  correspondant  à  la
              clé indiquée, si un identifiant de clé autre que zéro a été fourni.

       KEYCTL_GET_SECURITY
              La  taille  de  la  chaîne  de  l'étiquette  de  sécurité  LSM  (y  compris  l'octet NULL de fin),
              indépendamment de la taille du tampon fourni.

       KEYCTL_GET_PERSISTENT
              L'identifiant du trousseau persistant.

       KEYCTL_DH_COMPUTE
              Le nombre d'octets copiés dans le tampon ou, si arg4 vaut 0, la taille du tampon nécessaire.

       Toutes les autres opérations :
              Zéro.

       En cas d'erreur, la valeur de retour est -1 et errno est définie pour préciser l'erreur.

ERREURS

       EACCES L'opération demandée n'était pas autorisée.

       EAGAIN operation était KEYCTL_DH_COMPUTE et une erreur s'est produite lors de l'initialisation du  module
              de chiffrement.

       EDEADLK
              operation était KEYCTL_LINK et le rattachement demandé conduirait à une boucle.

       EDEADLK
              operation  était  KEYCTL_RESTRICT_KEYRING et la restriction de trousseau demandée aboutirait à une
              boucle.

       EDQUOT Le quota de clés de l'utilisateur appelant serait dépassé si la clé  était  créée  ou  ajoutée  au
              trousseau.

       EEXIST operation  était  KEYCTL_RESTRICT_KEYRING  et  le trousseau fourni dans le paramètre arg2 comporte
              déjà une restriction.

       EFAULT operation était KEYCTL_DH_COMPUTE et une des actions suivantes a échoué :

              -  copie  de  la  struct  keyctl_dh_params,  fournie  dans  le  paramètre  arg2,  depuis  l'espace
                 utilisateur ;

              -  copie  de  la  struct keyctl_kdf_params, fournie dans l'argument non NULL arg5, depuis l'espace
                 utilisateur (si le noyau gère l'opération KDF lors du résultat de l'opération DH) ;

              -  copie des données vers lesquelles pointe le champ hashname de  la  struct  keyctl_kdf_params  à
                 partir de l'espace utilisateur ;

              -  copie  des  données  vers  lesquelles  pointe le champ otherinfo de la struct keyctl_kdf_params
                 depuis l'espace utilisateur si le champ otherinfolen n'était pas zéro ;

              -  copie du résultat vers l'espace utilisateur.

       EINVAL operation était KEYCTL_SETPERM et un bit de droit non valable a été indiqué dans arg3.

       EINVAL operation était KEYCTL_SEARCH et la taille de la description  (comprenant  l'octet  NULL  de  fin)
              dépassait 4096 octets.

       EINVAL la  taille de la chaîne (y compris l'octet NULL final) indiquée dans arg3 (le type de clé) ou dans
              arg4 (la description de la clé) dépassait les limites (respectivement 32 et 4096 octets).

       EINVAL (avant Linux 4.12)
              operation était KEYCTL_DH_COMPUTE, le paramètre arg5 n'était pas NULL.

       EINVAL operation était KEYCTL_DH_COMPUTE et la taille de l’empreinte numérique de l'algorithme de hachage
              fourni est de zéro.

       EINVAL operation était KEYCTL_DH_COMPUTE et la  taille  du  tampon  fournie  n'est  pas  suffisante  pour
              contenir  le  résultat.  Mettez  0 en tant que taille de tampon pour obtenir la taille minimale du
              tampon.

       EINVAL operation était KEYCTL_DH_COMPUTE et le nom de hachage fourni dans le champ hashname de la  struct
              keyctl_kdf_params  vers laquelle pointe le paramètre arg5 est trop grand (la limite est spécifique
              à l'implémentation et varie entre les versions du noyau, mais elle est considérée comme suffisante
              pour tous les noms d'algorithmes valables).

       EINVAL operation était KEYCTL_DH_COMPUTE et le champ __spare de la struct keyctl_kdf_params fournie  dans
              le paramètre arg5 contient des valeurs autres que zéro.

       EKEYEXPIRED
              Une clé expirée a été trouvée ou spécifiée.

       EKEYREJECTED
              Une clé rejetée a été trouvée ou spécifiée.

       EKEYREVOKED
              Une clé révoquée a été trouvée ou spécifiée.

       ELOOP  operation  était  KEYCTL_LINK  et  le  rattachement demandé ferait dépasser la profondeur maximale
              d’imbrication des trousseaux.

       EMSGSIZE
              operation était KEYCTL_DH_COMPUTE et la longueur du tampon dépasse KEYCTL_KDF_MAX_OUTPUT_LEN  (qui
              est actuellement de 1024) ou le champ otherinfolen de la struct keyctl_kdf_parms fournie dans arg5
              dépasse KEYCTL_KDF_MAX_OI_LEN (qui est actuellement de 64).

       ENFILE (avant Linux 3.13)
              operation  était KEYCTL_LINK et le trousseau est complet (avant Linux 3.13, l'espace disponible de
              stockage de rattachements de trousseaux était limité à une seule page mémoire ; depuis Linux 3.13,
              il n'y a pas de limite fixée).

       ENOENT operation était KEYCTL_UNLINK et la clé à détacher n'est pas rattachée au trousseau.

       ENOENT operation était KEYCTL_DH_COMPUTE et l'algorithme de hachage indiqué dans le champ hashname de  la
              struct keyctl_kdf_params vers laquelle pointe le paramètre arg5 n'a pas été trouvé.

       ENOENT operation  était  KEYCTL_RESTRICT_KEYRING  et le type fourni dans le paramètre arg3 ne gère pas la
              définition de restrictions de rattachement de clés.

       ENOKEY Aucune clé correspondante n'a été trouvée, ou une clé non valable a été spécifiée.

       ENOKEY La valeur  KEYCTL_GET_KEYRING_ID  était  indiquée  dans  operation,  la  clé  indiquée  dans  arg2
              n'existait pas et arg3 valait zéro (ce qui veut dire ne pas créer de clé si elle n'existe pas).

       ENOMEM Une des routines de l'allocation mémoire du noyau a échoué lors de l'exécution de l'appel système.

       ENOTDIR
              Une  clé  de  type  trousseau  était attendue mais l'identifiant d'une clé de type différent a été
              fourni.

       EOPNOTSUPP
              operation était KEYCTL_READ et le type de clé ne gère pas la lecture (par  exemple,  le  type  est
              « login »).

       EOPNOTSUPP
              operation était KEYCTL_UPDATE et le type de clé ne gère pas les mises à jour.

       EOPNOTSUPP
              operation   était   KEYCTL_RESTRICT_KEYRING,   le   type  fourni  dans  le  paramètre  arg3  était
              « asymmetric », et la clé indiquée dans la spécification de la restriction fournie dans arg4 a  un
              autre type que « asymmetric » ou « keyring ».

       EPERM  operation  était  KEYCTL_GET_PERSISTENT,  arg2  indiquait  un identifiant utilisateur différent de
              celui de l'utilisateur réel ou effectif du thread appelant, et l'appelant n'avait pas la  capacité
              CAP_SETUID.

       EPERM  operation  était  KEYCTL_SESSION_TO_PARENT  et  :  soit  tous  les identifiants utilisateur (ou de
              groupe) du processus parent ne correspondent pas à celui effectif du  processus  appelant  ;  soit
              l'identifiant  utilisateur  du trousseau de session du parent, ou celui du trousseau de session de
              l'appelant, ne correspondait pas à l'identifiant de l'utilisateur effectif de l'appelant ; soit le
              processus parent se compose de plus d'un thread ; soit le  processus  parent  est  init(1)  ou  un
              thread du noyau.

       ETIMEDOUT
              operation  était  KEYCTL_DH_COMPUTE  et  l'initialisation  des modules de chiffrement a dépassé le
              délai.

VERSIONS

       Une enveloppe est fournie dans la bibliothèque libkeyutils. (Le paquet accompagnant  fournit  le  fichier
       d'en-tête  <keyutils.h>.)  Cependant,  plutôt  que d'utiliser cet appel système directement, vous voudrez
       probablement utiliser les fonctions de la bibliothèque mentionnées dans les descriptions  des  opérations
       individuelles ci-dessus.

STANDARDS

       Linux.

HISTORIQUE

       Linux 2.6.10.

EXEMPLES

       Le  programme  ci-dessous fournit un sous-ensemble de fonctions du programme request-key(8) fourni par le
       paquet keyutils. Pour information, le programme enregistre diverses informations dans un fichier journal.

       Comme indiqué dans request_key(2), le programme request-key(8) est appelé avec les paramètres de la ligne
       de commande qui décrivent une  clé  à  instancier.  Le  programme  exemple  récupère  et  enregistre  ces
       arguments. Le programme endosse l'autorité d'instancier la clé demandée, puis il instancie cette clé.

       La  session d'interpréteur suivante montre l'utilisation de ce programme. Dans la session, nous compilons
       le programme, puis nous l'utilisons pour remplacer temporairement le  programme  request-key(8)  standard
       (remarquez que la désactivation temporaire du programme standard request-key(8) peut ne pas être sure sur
       certains  systèmes).  Tant  que notre programme exemple est installé, nous utilisons le programme exemple
       présent dans request_key(2) pour demander une clé.

           $ cc -o key_instantiate key_instantiate.c -lkeyutils
           $ sudo mv /sbin/request-key /sbin/request-key.backup
           $ sudo cp key_instantiate /sbin/request-key
           $ ./t_request_key user mykey somepayloaddata
           L'identifiant de clé est 20d035bf
           $ sudo mv /sbin/request-key.backup /sbin/request-key

       En regardant le fichier journal créé par ce programme, on  peut  voir  les  paramètres  de  la  ligne  de
       commande fournis à notre programme exemple :

           $ cat /tmp/key_instantiate.log
           Time: Mon Nov  7 13:06:47 2016

           Command line arguments:
             argv[0]:            /sbin/request-key
             operation:          create
             key_to_instantiate: 20d035bf
             UID:                1000
             GID:                1000
             thread_keyring:     0
             process_keyring:    0
             session_keyring:    256e6a6

       Les dernières lignes de la sortie ci-dessus montrent que le programme exemple a pu récupérer :

       -  la description de la clé à instanciée, qui incluait le nom de la clé (mykey) ;

       -  la  charge utile de la clé d'autorisation, qui consistait dans des données (somepayloaddata) passées à
          request_key(2) ;

       -  le trousseau de destination indiqué dans l'appel à request_key(2) ;

       -  la description de la clé  d'autorisation  où  on  peut  voir  que  le  nom  de  la  clé  correspond  à
          l'identifiant de celle à instancier (20d035bf).

       Le   programme   exemple   dans  request_key(2)  indiquait  le  trousseau  de  destination  en  tant  que
       KEY_SPEC_SESSION_KEYRING. En examinant le contenu de /proc/keys, on peut voir que cela  a  été  transcrit
       dans  l'identifiant du trousseau de destination (0256e6a6) affiché dans le fichier journal ci-dessus ; on
       peut aussi voir la clé nouvellement créée dont le nom est mykey et l'identifiant est 20d035bf.

           $ cat /proc/keys | egrep 'mykey|256e6a6'
           0256e6a6 I--Q---  194 perm 3f030000  1000  1000 keyring  _ses: 3
           20d035bf I--Q---    1 perm 3f010000  1000  1000 user     mykey: 16

   Source du programme

       /* key_instantiate.c */

       #include <errno.h>
       #include <keyutils.h>
       #include <stdint.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <sys/types.h>
       #include <time.h>

       #ifndef KEY_SPEC_REQUESTOR_KEYRING
       #define KEY_SPEC_REQUESTOR_KEYRING      (-8)
       #endif

       int
       main(int argc, char *argv[])
       {
           int           akp_size;       /* Taille de auth_key_payload */
           int           auth_key;
           char          dbuf[256];
           char          auth_key_payload[256];
           char          *operation;
           FILE          *fp;
           gid_t         gid;
           uid_t         uid;
           time_t        t;
           key_serial_t  key_to_instantiate, dest_keyring;
           key_serial_t  thread_keyring, process_keyring, session_keyring;

           if (argc != 8) {
               fprintf(stderr, "Usage : %s op key uid gid thread_keyring "
                               "process_keyring session_keyring\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           fp = fopen("/tmp/key_instantiate.log", "w");
           if (fp == NULL)
               exit(EXIT_FAILURE);

           setbuf(fp, NULL);

           t = time(NULL);
           fprintf(fp, "Time: %s\n", ctime(&t));

           /*
            * Le noyau passe un ensemble fixe de paramètres au programme
            * qu'il exécute ; les récupérer.
            */
           operation = argv[1];
           key_to_instantiate = atoi(argv[2]);
           uid = atoi(argv[3]);
           gid = atoi(argv[4]);
           thread_keyring = atoi(argv[5]);
           process_keyring = atoi(argv[6]);
           session_keyring = atoi(argv[7]);

           fprintf(fp, "Paramètres de la ligne de commande :\n");
           fprintf(fp, "  argv[0]:            %s\n", argv[0]);
           fprintf(fp, "  operation:          %s\n", operation);
           fprintf(fp, "  key_to_instantiate: %jx\n",
                   (uintmax_t) key_to_instantiate);
           fprintf(fp, "  UID:                %jd\n", (intmax_t) uid);
           fprintf(fp, "  GID:                %jd\n", (intmax_t) gid);
           fprintf(fp, "  thread_keyring:     %jx\n",
                   (uintmax_t) thread_keyring);
           fprintf(fp, "  process_keyring:    %jx\n",
                   (uintmax_t) process_keyring);
           fprintf(fp, "  session_keyring:    %jx\n",
                   (uintmax_t) session_keyring);
           fprintf(fp, "\n");

           /*
            * Assumer l'autorité pour instancier la clé nommée dans argv[2].
            */
           if (keyctl(KEYCTL_ASSUME_AUTHORITY, key_to_instantiate) == -1) {
               fprintf(fp, "KEYCTL_ASSUME_AUTHORITY a échoué : %s\n",
                       strerror(errno));
               exit(EXIT_FAILURE);
           }

           /*
            * Récupérer la description de la clé à instancier.
            */
           if (keyctl(KEYCTL_DESCRIBE, key_to_instantiate,
                      dbuf, sizeof(dbuf)) == -1) {
               fprintf(fp, "KEYCTL_DESCRIBE a échoué : %s\n", strerror(errno));
               exit(EXIT_FAILURE);
           }

           fprintf(fp, "Description de clé :      %s\n", dbuf);

           /*
            * Récupérer la charge utile de la clé d'autorisation, qui est en fait
            * les données d'appel (callout) données à request_key().
            */
           akp_size = keyctl(KEYCTL_READ, KEY_SPEC_REQKEY_AUTH_KEY,
                             auth_key_payload, sizeof(auth_key_payload));
           if (akp_size == -1) {
               fprintf(fp, "KEYCTL_READ a échoué : %s\n", strerror(errno));
               exit(EXIT_FAILURE);
           }

           auth_key_payload[akp_size] = '\0';
           fprintf(fp, "Charge utile de la clé d'auth :     %s\n", auth_key_payload);

           /*
            * Par intérêt, récupérer l'identifiant de la clé d'autorisation et
            * l'afficher.
            */
           auth_key = keyctl(KEYCTL_GET_KEYRING_ID,
                             KEY_SPEC_REQKEY_AUTH_KEY);
           if (auth_key == -1) {
               fprintf(fp, "KEYCTL_GET_KEYRING_ID a échoué : %s\n",
                       strerror(errno));
               exit(EXIT_FAILURE);
           }

           fprintf(fp, "Identifiant de la clé d'auth :          %jx\n", (uintmax_t) auth_key);

           /*
            * Récupérer l'identifiant de clé pour le trousseau de destination
            * request_key(2).
            */
           dest_keyring = keyctl(KEYCTL_GET_KEYRING_ID,
                                 KEY_SPEC_REQUESTOR_KEYRING);
           if (dest_keyring == -1) {
               fprintf(fp, "KEYCTL_GET_KEYRING_ID a échoué : %s\n",
                       strerror(errno));
               exit(EXIT_FAILURE);
           }

           fprintf(fp, "Trousseau de destination :  %jx\n", (uintmax_t) dest_keyring);

           /*
            * Récupérer la description de la clé d'autorisation. Cela nous permet
            * de voir le type de clé, l'identifiant utilisateur et de groupe, les
            * droits et la description (nom) de la clé. Entre autres choses,
            * on verra que le nom de la clé est une chaîne hexadécimale représentant
            * l'identifiant de la clé à instancier.
            */
           if (keyctl(KEYCTL_DESCRIBE, KEY_SPEC_REQKEY_AUTH_KEY,
                      dbuf, sizeof(dbuf)) == -1)
           {
               fprintf(fp, "KEYCTL_DESCRIBE a échoué : %s\n", strerror(errno));
               exit(EXIT_FAILURE);
           }

           fprintf(fp, "Description de la clé d'auth : %s\n", dbuf);

           /*
            * Instancier la clé en utilisant les données de l'appel (callout)
            * fournies dans la charge utile de la clé d'autorisation.
            */
           if (keyctl(KEYCTL_INSTANTIATE, key_to_instantiate,
                      auth_key_payload, akp_size + 1, dest_keyring) == -1)
           {
               fprintf(fp, "KEYCTL_INSTANTIATE a échoué : %s\n",
                       strerror(errno));
               exit(EXIT_FAILURE);
           }

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       keyctl(1), add_key(2), request_key(2), keyctl(3), keyctl_assume_authority(3), keyctl_chown(3),
       keyctl_clear(3), keyctl_describe(3), keyctl_describe_alloc(3), keyctl_dh_compute(3),
       keyctl_dh_compute_alloc(3), keyctl_get_keyring_ID(3), keyctl_get_persistent(3), keyctl_get_security(3),
       keyctl_get_security_alloc(3), keyctl_instantiate(3), keyctl_instantiate_iov(3), keyctl_invalidate(3),
       keyctl_join_session_keyring(3), keyctl_link(3), keyctl_negate(3), keyctl_read(3), keyctl_read_alloc(3),
       keyctl_reject(3), keyctl_revoke(3), keyctl_search(3), keyctl_session_to_parent(3),
       keyctl_set_reqkey_keyring(3), keyctl_set_timeout(3), keyctl_setperm(3), keyctl_unlink(3),
       keyctl_update(3), recursive_key_scan(3), recursive_session_key_scan(3), capabilities(7), credentials(7),
       keyrings(7), keyutils(7), persistent-keyring(7), process-keyring(7), session-keyring(7),
       thread-keyring(7), user-keyring(7), user_namespaces(7), user-session-keyring(7), request-key(8)

       Les fichiers sources du noyau Documentation/security/keys/ (ou avant Linux 4.13, dans le fichier
       Documentation/security/keys.txt).

TRADUCTION

       La traduction française de cette page de manuel a été créée par Christophe Blaess
       <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud
       <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
       <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau
       <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François
       <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard
       <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot
       <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

       Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License
       version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à
       debian-l10n-french@lists.debian.org.

Pages du manuel de Linux 6.9.1                    15 juin 2024                                         keyctl(2)