0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/syscalls.h>
0009 #include <linux/keyctl.h>
0010 #include <linux/compat.h>
0011 #include <linux/slab.h>
0012 #include "internal.h"
0013
0014
0015
0016
0017 COMPAT_SYSCALL_DEFINE5(keyctl, u32, option,
0018 u32, arg2, u32, arg3, u32, arg4, u32, arg5)
0019 {
0020 switch (option) {
0021 case KEYCTL_GET_KEYRING_ID:
0022 return keyctl_get_keyring_ID(arg2, arg3);
0023
0024 case KEYCTL_JOIN_SESSION_KEYRING:
0025 return keyctl_join_session_keyring(compat_ptr(arg2));
0026
0027 case KEYCTL_UPDATE:
0028 return keyctl_update_key(arg2, compat_ptr(arg3), arg4);
0029
0030 case KEYCTL_REVOKE:
0031 return keyctl_revoke_key(arg2);
0032
0033 case KEYCTL_DESCRIBE:
0034 return keyctl_describe_key(arg2, compat_ptr(arg3), arg4);
0035
0036 case KEYCTL_CLEAR:
0037 return keyctl_keyring_clear(arg2);
0038
0039 case KEYCTL_LINK:
0040 return keyctl_keyring_link(arg2, arg3);
0041
0042 case KEYCTL_UNLINK:
0043 return keyctl_keyring_unlink(arg2, arg3);
0044
0045 case KEYCTL_SEARCH:
0046 return keyctl_keyring_search(arg2, compat_ptr(arg3),
0047 compat_ptr(arg4), arg5);
0048
0049 case KEYCTL_READ:
0050 return keyctl_read_key(arg2, compat_ptr(arg3), arg4);
0051
0052 case KEYCTL_CHOWN:
0053 return keyctl_chown_key(arg2, arg3, arg4);
0054
0055 case KEYCTL_SETPERM:
0056 return keyctl_setperm_key(arg2, arg3);
0057
0058 case KEYCTL_INSTANTIATE:
0059 return keyctl_instantiate_key(arg2, compat_ptr(arg3), arg4,
0060 arg5);
0061
0062 case KEYCTL_NEGATE:
0063 return keyctl_negate_key(arg2, arg3, arg4);
0064
0065 case KEYCTL_SET_REQKEY_KEYRING:
0066 return keyctl_set_reqkey_keyring(arg2);
0067
0068 case KEYCTL_SET_TIMEOUT:
0069 return keyctl_set_timeout(arg2, arg3);
0070
0071 case KEYCTL_ASSUME_AUTHORITY:
0072 return keyctl_assume_authority(arg2);
0073
0074 case KEYCTL_GET_SECURITY:
0075 return keyctl_get_security(arg2, compat_ptr(arg3), arg4);
0076
0077 case KEYCTL_SESSION_TO_PARENT:
0078 return keyctl_session_to_parent();
0079
0080 case KEYCTL_REJECT:
0081 return keyctl_reject_key(arg2, arg3, arg4, arg5);
0082
0083 case KEYCTL_INSTANTIATE_IOV:
0084 return keyctl_instantiate_key_iov(arg2, compat_ptr(arg3), arg4,
0085 arg5);
0086
0087 case KEYCTL_INVALIDATE:
0088 return keyctl_invalidate_key(arg2);
0089
0090 case KEYCTL_GET_PERSISTENT:
0091 return keyctl_get_persistent(arg2, arg3);
0092
0093 case KEYCTL_DH_COMPUTE:
0094 return compat_keyctl_dh_compute(compat_ptr(arg2),
0095 compat_ptr(arg3),
0096 arg4, compat_ptr(arg5));
0097
0098 case KEYCTL_RESTRICT_KEYRING:
0099 return keyctl_restrict_keyring(arg2, compat_ptr(arg3),
0100 compat_ptr(arg4));
0101
0102 case KEYCTL_PKEY_QUERY:
0103 if (arg3 != 0)
0104 return -EINVAL;
0105 return keyctl_pkey_query(arg2,
0106 compat_ptr(arg4),
0107 compat_ptr(arg5));
0108
0109 case KEYCTL_PKEY_ENCRYPT:
0110 case KEYCTL_PKEY_DECRYPT:
0111 case KEYCTL_PKEY_SIGN:
0112 return keyctl_pkey_e_d_s(option,
0113 compat_ptr(arg2), compat_ptr(arg3),
0114 compat_ptr(arg4), compat_ptr(arg5));
0115
0116 case KEYCTL_PKEY_VERIFY:
0117 return keyctl_pkey_verify(compat_ptr(arg2), compat_ptr(arg3),
0118 compat_ptr(arg4), compat_ptr(arg5));
0119
0120 case KEYCTL_MOVE:
0121 return keyctl_keyring_move(arg2, arg3, arg4, arg5);
0122
0123 case KEYCTL_CAPABILITIES:
0124 return keyctl_capabilities(compat_ptr(arg2), arg3);
0125
0126 case KEYCTL_WATCH_KEY:
0127 return keyctl_watch_key(arg2, arg3, arg4);
0128
0129 default:
0130 return -EOPNOTSUPP;
0131 }
0132 }