Man page - keyctl(2)

Packages contains this manual

Available languages:

en fr ru

Manual

keyctl

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
VERSIONS
STANDARDS
HISTORIQUE
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

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 .