watch_queue: Add a key/keyring notification facility
Add a key/keyring change notification facility whereby notifications about changes in key and keyring content and attributes can be received. Firstly, an event queue needs to be created: pipe2(fds, O_NOTIFICATION_PIPE); ioctl(fds[1], IOC_WATCH_QUEUE_SET_SIZE, 256); then a notification can be set up to report notifications via that queue: struct watch_notification_filter filter = { .nr_filters = 1, .filters = { [0] = { .type = WATCH_TYPE_KEY_NOTIFY, .subtype_filter[0] = UINT_MAX, }, }, }; ioctl(fds[1], IOC_WATCH_QUEUE_SET_FILTER, &filter); keyctl_watch_key(KEY_SPEC_SESSION_KEYRING, fds[1], 0x01); After that, records will be placed into the queue when events occur in which keys are changed in some way. Records are of the following format: struct key_notification { struct watch_notification watch; __u32 key_id; __u32 aux; } *n; Where: n->watch.type will be WATCH_TYPE_KEY_NOTIFY. n->watch.subtype will indicate the type of event, such as NOTIFY_KEY_REVOKED. n->watch.info & WATCH_INFO_LENGTH will indicate the length of the record. n->watch.info & WATCH_INFO_ID will be the second argument to keyctl_watch_key(), shifted. n->key will be the ID of the affected key. n->aux will hold subtype-dependent information, such as the key being linked into the keyring specified by n->key in the case of NOTIFY_KEY_LINKED. Note that it is permissible for event records to be of variable length - or, at least, the length may be dependent on the subtype. Note also that the queue can be shared between multiple notifications of various types. Signed-off-by:David Howells <dhowells@redhat.com> Reviewed-by:
James Morris <jamorris@linux.microsoft.com>
Showing
- Documentation/security/keys/core.rst 57 additions, 0 deletionsDocumentation/security/keys/core.rst
- include/linux/key.h 3 additions, 0 deletionsinclude/linux/key.h
- include/uapi/linux/keyctl.h 2 additions, 0 deletionsinclude/uapi/linux/keyctl.h
- include/uapi/linux/watch_queue.h 27 additions, 1 deletioninclude/uapi/linux/watch_queue.h
- security/keys/Kconfig 9 additions, 0 deletionssecurity/keys/Kconfig
- security/keys/compat.c 3 additions, 0 deletionssecurity/keys/compat.c
- security/keys/gc.c 5 additions, 0 deletionssecurity/keys/gc.c
- security/keys/internal.h 29 additions, 1 deletionsecurity/keys/internal.h
- security/keys/key.c 24 additions, 14 deletionssecurity/keys/key.c
- security/keys/keyctl.c 96 additions, 3 deletionssecurity/keys/keyctl.c
- security/keys/keyring.c 13 additions, 7 deletionssecurity/keys/keyring.c
- security/keys/request_key.c 2 additions, 2 deletionssecurity/keys/request_key.c
Loading
Please register or sign in to comment