1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* 32-bit compatibility syscall for 64-bit systems
4 * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
8 #include <linux/syscalls.h>
9 #include <linux/keyctl.h>
10 #include <linux/compat.h>
11 #include <linux/slab.h>
15 * Instantiate a key with the specified compatibility multipart payload and
16 * link the key into the destination keyring if one is given.
18 * The caller must have the appropriate instantiation permit set for this to
19 * work (see keyctl_assume_authority). No other permissions are required.
21 * If successful, 0 will be returned.
23 static long compat_keyctl_instantiate_key_iov(
25 const struct compat_iovec __user
*_payload_iov
,
29 struct iovec iovstack
[UIO_FASTIOV
], *iov
= iovstack
;
36 ret
= compat_import_iovec(WRITE
, _payload_iov
, ioc
,
37 ARRAY_SIZE(iovstack
), &iov
,
42 ret
= keyctl_instantiate_key_common(id
, &from
, ringid
);
48 * The key control system call, 32-bit compatibility version for 64-bit archs
50 COMPAT_SYSCALL_DEFINE5(keyctl
, u32
, option
,
51 u32
, arg2
, u32
, arg3
, u32
, arg4
, u32
, arg5
)
54 case KEYCTL_GET_KEYRING_ID
:
55 return keyctl_get_keyring_ID(arg2
, arg3
);
57 case KEYCTL_JOIN_SESSION_KEYRING
:
58 return keyctl_join_session_keyring(compat_ptr(arg2
));
61 return keyctl_update_key(arg2
, compat_ptr(arg3
), arg4
);
64 return keyctl_revoke_key(arg2
);
67 return keyctl_describe_key(arg2
, compat_ptr(arg3
), arg4
);
70 return keyctl_keyring_clear(arg2
);
73 return keyctl_keyring_link(arg2
, arg3
);
76 return keyctl_keyring_unlink(arg2
, arg3
);
79 return keyctl_keyring_search(arg2
, compat_ptr(arg3
),
80 compat_ptr(arg4
), arg5
);
83 return keyctl_read_key(arg2
, compat_ptr(arg3
), arg4
);
86 return keyctl_chown_key(arg2
, arg3
, arg4
);
89 return keyctl_setperm_key(arg2
, arg3
);
91 case KEYCTL_INSTANTIATE
:
92 return keyctl_instantiate_key(arg2
, compat_ptr(arg3
), arg4
,
96 return keyctl_negate_key(arg2
, arg3
, arg4
);
98 case KEYCTL_SET_REQKEY_KEYRING
:
99 return keyctl_set_reqkey_keyring(arg2
);
101 case KEYCTL_SET_TIMEOUT
:
102 return keyctl_set_timeout(arg2
, arg3
);
104 case KEYCTL_ASSUME_AUTHORITY
:
105 return keyctl_assume_authority(arg2
);
107 case KEYCTL_GET_SECURITY
:
108 return keyctl_get_security(arg2
, compat_ptr(arg3
), arg4
);
110 case KEYCTL_SESSION_TO_PARENT
:
111 return keyctl_session_to_parent();
114 return keyctl_reject_key(arg2
, arg3
, arg4
, arg5
);
116 case KEYCTL_INSTANTIATE_IOV
:
117 return compat_keyctl_instantiate_key_iov(
118 arg2
, compat_ptr(arg3
), arg4
, arg5
);
120 case KEYCTL_INVALIDATE
:
121 return keyctl_invalidate_key(arg2
);
123 case KEYCTL_GET_PERSISTENT
:
124 return keyctl_get_persistent(arg2
, arg3
);
126 case KEYCTL_DH_COMPUTE
:
127 return compat_keyctl_dh_compute(compat_ptr(arg2
),
129 arg4
, compat_ptr(arg5
));
131 case KEYCTL_RESTRICT_KEYRING
:
132 return keyctl_restrict_keyring(arg2
, compat_ptr(arg3
),
135 case KEYCTL_PKEY_QUERY
:
138 return keyctl_pkey_query(arg2
,
142 case KEYCTL_PKEY_ENCRYPT
:
143 case KEYCTL_PKEY_DECRYPT
:
144 case KEYCTL_PKEY_SIGN
:
145 return keyctl_pkey_e_d_s(option
,
146 compat_ptr(arg2
), compat_ptr(arg3
),
147 compat_ptr(arg4
), compat_ptr(arg5
));
149 case KEYCTL_PKEY_VERIFY
:
150 return keyctl_pkey_verify(compat_ptr(arg2
), compat_ptr(arg3
),
151 compat_ptr(arg4
), compat_ptr(arg5
));
154 return keyctl_keyring_move(arg2
, arg3
, arg4
, arg5
);
156 case KEYCTL_CAPABILITIES
:
157 return keyctl_capabilities(compat_ptr(arg2
), arg3
);
159 case KEYCTL_WATCH_KEY
:
160 return keyctl_watch_key(arg2
, arg3
, arg4
);