diff options
Diffstat (limited to 'ext4_utils/key_control.cpp')
-rw-r--r-- | ext4_utils/key_control.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/ext4_utils/key_control.cpp b/ext4_utils/key_control.cpp new file mode 100644 index 00000000..3d775b7f --- /dev/null +++ b/ext4_utils/key_control.cpp @@ -0,0 +1,44 @@ +#include "key_control.h" + +#include <stdarg.h> +#include <unistd.h> +#include <sys/syscall.h> + +/* keyring keyctl commands */ +#define KEYCTL_SETPERM 5 /* set permissions for a key in a keyring */ +#define KEYCTL_UNLINK 9 /* unlink a key from a keyring */ +#define KEYCTL_SEARCH 10 /* search for a key in a keyring */ + +static long keyctl(int cmd, ...) +{ + va_list va; + unsigned long arg2, arg3, arg4, arg5; + + va_start(va, cmd); + arg2 = va_arg(va, unsigned long); + arg3 = va_arg(va, unsigned long); + arg4 = va_arg(va, unsigned long); + arg5 = va_arg(va, unsigned long); + va_end(va); + return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5); +} + +key_serial_t add_key(const char *type, + const char *description, + const void *payload, + size_t plen, + key_serial_t ringid) +{ + return syscall(__NR_add_key, type, description, payload, plen, ringid); +} + +long keyctl_setperm(key_serial_t id, int permissions) +{ + return keyctl(KEYCTL_SETPERM, id, permissions); +} + +long keyctl_search(key_serial_t ringid, const char *type, + const char *description, key_serial_t destringid) +{ + return keyctl(KEYCTL_SEARCH, ringid, type, description, destringid); +} |