2 #include <linux/keyctl.h>
4 typedef int32_t key_serial_t;
6 #include "xlat/key_spec.h"
9 print_keyring_serial_number(key_serial_t id)
11 const char *str = xlookup(key_spec, id);
20 sys_add_key(struct tcb *tcp)
24 printstr(tcp, tcp->u_arg[0], -1);
27 printstr(tcp, tcp->u_arg[1], -1);
30 printstr(tcp, tcp->u_arg[2], tcp->u_arg[3]);
32 tprintf(", %lu, ", tcp->u_arg[3]);
33 /* keyring serial number */
34 print_keyring_serial_number(tcp->u_arg[4]);
40 sys_request_key(struct tcb *tcp)
44 printstr(tcp, tcp->u_arg[0], -1);
47 printstr(tcp, tcp->u_arg[1], -1);
50 printstr(tcp, tcp->u_arg[2], -1);
51 /* keyring serial number */
53 print_keyring_serial_number(tcp->u_arg[3]);
59 keyctl_get_keyring_id(struct tcb *tcp, key_serial_t id, int create)
63 print_keyring_serial_number(id);
64 tprintf(", %d", create);
70 keyctl_join_session_keyring(struct tcb *tcp, long addr)
74 printstr(tcp, addr, -1);
80 keyctl_update_key(struct tcb *tcp, key_serial_t id, long addr, long len)
84 print_keyring_serial_number(id);
86 printstr(tcp, addr, len);
87 tprintf(", %lu", len);
93 keyctl_handle_key(struct tcb *tcp, key_serial_t id)
97 print_keyring_serial_number(id);
103 keyctl_handle_key_key(struct tcb *tcp, key_serial_t id1, key_serial_t id2)
107 print_keyring_serial_number(id1);
109 print_keyring_serial_number(id2);
115 keyctl_read_key(struct tcb *tcp, key_serial_t id, long addr, long len)
119 print_keyring_serial_number(id);
122 if (addr && syserror(tcp))
123 tprintf("%#lx", addr);
125 long rval = tcp->u_rval > len ?
126 len : (tcp->u_rval ? -1 : 0);
127 printstr(tcp, addr, rval);
129 tprintf(", %lu", len);
135 keyctl_keyring_search(struct tcb *tcp, key_serial_t id1, long addr1,
136 long addr2, key_serial_t id2)
140 print_keyring_serial_number(id1);
142 printstr(tcp, addr1, -1);
144 printstr(tcp, addr2, -1);
146 print_keyring_serial_number(id2);
152 keyctl_chown_key(struct tcb *tcp, key_serial_t id, int user, int group)
156 print_keyring_serial_number(id);
157 tprintf(", %d, %d", user, group);
163 keyctl_instantiate_key(struct tcb *tcp, key_serial_t id1, long addr,
164 long len, key_serial_t id2)
168 print_keyring_serial_number(id1);
170 printstr(tcp, addr, len);
171 tprintf(", %lu, ", len);
172 print_keyring_serial_number(id2);
178 keyctl_instantiate_key_iov(struct tcb *tcp, key_serial_t id1,
179 long addr, long len, key_serial_t id2)
183 print_keyring_serial_number(id1);
185 tprint_iov(tcp, len, addr, 1);
186 tprintf(", %lu, ", len);
187 print_keyring_serial_number(id2);
193 keyctl_negate_key(struct tcb *tcp, key_serial_t id1, unsigned timeout,
198 print_keyring_serial_number(id1);
199 tprintf(", %u, ", timeout);
200 print_keyring_serial_number(id2);
206 keyctl_reject_key(struct tcb *tcp, key_serial_t id1, unsigned timeout,
207 unsigned error, key_serial_t id2)
211 print_keyring_serial_number(id1);
212 tprintf(", %u, %u, ", timeout, error);
213 print_keyring_serial_number(id2);
219 keyctl_set_timeout(struct tcb *tcp, key_serial_t id, unsigned timeout)
223 print_keyring_serial_number(id);
224 tprintf(", %u", timeout);
230 keyctl_get_persistent(struct tcb *tcp, int uid, key_serial_t id)
233 tprintf(", %d, ", uid);
234 print_keyring_serial_number(id);
239 #define KEY_POS_VIEW 0x01000000
240 #define KEY_POS_READ 0x02000000
241 #define KEY_POS_WRITE 0x04000000
242 #define KEY_POS_SEARCH 0x08000000
243 #define KEY_POS_LINK 0x10000000
244 #define KEY_POS_SETATTR 0x20000000
245 #define KEY_POS_ALL 0x3f000000
246 #define KEY_USR_VIEW 0x00010000
247 #define KEY_USR_READ 0x00020000
248 #define KEY_USR_WRITE 0x00040000
249 #define KEY_USR_SEARCH 0x00080000
250 #define KEY_USR_LINK 0x00100000
251 #define KEY_USR_SETATTR 0x00200000
252 #define KEY_USR_ALL 0x003f0000
253 #define KEY_GRP_VIEW 0x00000100
254 #define KEY_GRP_READ 0x00000200
255 #define KEY_GRP_WRITE 0x00000400
256 #define KEY_GRP_SEARCH 0x00000800
257 #define KEY_GRP_LINK 0x00001000
258 #define KEY_GRP_SETATTR 0x00002000
259 #define KEY_GRP_ALL 0x00003f00
260 #define KEY_OTH_VIEW 0x00000001
261 #define KEY_OTH_READ 0x00000002
262 #define KEY_OTH_WRITE 0x00000004
263 #define KEY_OTH_SEARCH 0x00000008
264 #define KEY_OTH_LINK 0x00000010
265 #define KEY_OTH_SETATTR 0x00000020
266 #define KEY_OTH_ALL 0x0000003f
268 #include "xlat/key_perms.h"
271 keyctl_setperm_key(struct tcb *tcp, key_serial_t id, uint32_t perm)
275 print_keyring_serial_number(id);
277 printflags(key_perms, perm, "KEY_???");
282 #include "xlat/key_reqkeys.h"
285 keyctl_set_reqkey_keyring(struct tcb *tcp, int reqkey)
289 printxval(key_reqkeys, reqkey, "KEY_REQKEY_DEFL_???");
294 #include "xlat/keyctl_commands.h"
297 sys_keyctl(struct tcb *tcp)
299 int cmd = tcp->u_arg[0];
302 printxval(keyctl_commands, cmd, "KEYCTL_???");
305 case KEYCTL_GET_KEYRING_ID:
306 return keyctl_get_keyring_id(tcp, tcp->u_arg[1], tcp->u_arg[2]);
308 case KEYCTL_JOIN_SESSION_KEYRING:
309 return keyctl_join_session_keyring(tcp, tcp->u_arg[1]);
312 return keyctl_update_key(tcp, tcp->u_arg[1],
313 tcp->u_arg[2], tcp->u_arg[3]);
317 case KEYCTL_INVALIDATE:
318 case KEYCTL_ASSUME_AUTHORITY:
319 return keyctl_handle_key(tcp, tcp->u_arg[1]);
323 return keyctl_handle_key_key(tcp, tcp->u_arg[1], tcp->u_arg[2]);
325 case KEYCTL_DESCRIBE:
327 case KEYCTL_GET_SECURITY:
328 return keyctl_read_key(tcp, tcp->u_arg[1],
329 tcp->u_arg[2], tcp->u_arg[3]);
332 return keyctl_keyring_search(tcp, tcp->u_arg[1], tcp->u_arg[2],
333 tcp->u_arg[3], tcp->u_arg[4]);
336 return keyctl_chown_key(tcp, tcp->u_arg[1],
337 tcp->u_arg[2], tcp->u_arg[3]);
340 return keyctl_setperm_key(tcp, tcp->u_arg[1], tcp->u_arg[2]);
342 case KEYCTL_INSTANTIATE:
343 return keyctl_instantiate_key(tcp, tcp->u_arg[1], tcp->u_arg[2],
344 tcp->u_arg[3], tcp->u_arg[4]);
347 return keyctl_negate_key(tcp, tcp->u_arg[1],
348 tcp->u_arg[2], tcp->u_arg[3]);
350 case KEYCTL_SET_REQKEY_KEYRING:
351 return keyctl_set_reqkey_keyring(tcp, tcp->u_arg[1]);
353 case KEYCTL_SET_TIMEOUT:
354 return keyctl_set_timeout(tcp, tcp->u_arg[1], tcp->u_arg[2]);
356 case KEYCTL_SESSION_TO_PARENT:
360 return keyctl_reject_key(tcp, tcp->u_arg[1], tcp->u_arg[2],
361 tcp->u_arg[3], tcp->u_arg[4]);
363 case KEYCTL_INSTANTIATE_IOV:
364 return keyctl_instantiate_key_iov(tcp, tcp->u_arg[1],
365 tcp->u_arg[2], tcp->u_arg[3],
368 case KEYCTL_GET_PERSISTENT:
369 return keyctl_get_persistent(tcp, tcp->u_arg[1], tcp->u_arg[2]);
373 tprintf(", %#lx, %#lx, %#lx, %#lx",
374 tcp->u_arg[1], tcp->u_arg[2],
375 tcp->u_arg[3], tcp->u_arg[4]);