1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /* 32-bit compatibility syscall for 64-bit systems
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved.
5*4882a593Smuzhiyun * Written by David Howells (dhowells@redhat.com)
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/syscalls.h>
9*4882a593Smuzhiyun #include <linux/keyctl.h>
10*4882a593Smuzhiyun #include <linux/compat.h>
11*4882a593Smuzhiyun #include <linux/slab.h>
12*4882a593Smuzhiyun #include "internal.h"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun * The key control system call, 32-bit compatibility version for 64-bit archs
16*4882a593Smuzhiyun */
COMPAT_SYSCALL_DEFINE5(keyctl,u32,option,u32,arg2,u32,arg3,u32,arg4,u32,arg5)17*4882a593Smuzhiyun COMPAT_SYSCALL_DEFINE5(keyctl, u32, option,
18*4882a593Smuzhiyun u32, arg2, u32, arg3, u32, arg4, u32, arg5)
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun switch (option) {
21*4882a593Smuzhiyun case KEYCTL_GET_KEYRING_ID:
22*4882a593Smuzhiyun return keyctl_get_keyring_ID(arg2, arg3);
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun case KEYCTL_JOIN_SESSION_KEYRING:
25*4882a593Smuzhiyun return keyctl_join_session_keyring(compat_ptr(arg2));
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun case KEYCTL_UPDATE:
28*4882a593Smuzhiyun return keyctl_update_key(arg2, compat_ptr(arg3), arg4);
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun case KEYCTL_REVOKE:
31*4882a593Smuzhiyun return keyctl_revoke_key(arg2);
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun case KEYCTL_DESCRIBE:
34*4882a593Smuzhiyun return keyctl_describe_key(arg2, compat_ptr(arg3), arg4);
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun case KEYCTL_CLEAR:
37*4882a593Smuzhiyun return keyctl_keyring_clear(arg2);
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun case KEYCTL_LINK:
40*4882a593Smuzhiyun return keyctl_keyring_link(arg2, arg3);
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun case KEYCTL_UNLINK:
43*4882a593Smuzhiyun return keyctl_keyring_unlink(arg2, arg3);
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun case KEYCTL_SEARCH:
46*4882a593Smuzhiyun return keyctl_keyring_search(arg2, compat_ptr(arg3),
47*4882a593Smuzhiyun compat_ptr(arg4), arg5);
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun case KEYCTL_READ:
50*4882a593Smuzhiyun return keyctl_read_key(arg2, compat_ptr(arg3), arg4);
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun case KEYCTL_CHOWN:
53*4882a593Smuzhiyun return keyctl_chown_key(arg2, arg3, arg4);
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun case KEYCTL_SETPERM:
56*4882a593Smuzhiyun return keyctl_setperm_key(arg2, arg3);
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun case KEYCTL_INSTANTIATE:
59*4882a593Smuzhiyun return keyctl_instantiate_key(arg2, compat_ptr(arg3), arg4,
60*4882a593Smuzhiyun arg5);
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun case KEYCTL_NEGATE:
63*4882a593Smuzhiyun return keyctl_negate_key(arg2, arg3, arg4);
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun case KEYCTL_SET_REQKEY_KEYRING:
66*4882a593Smuzhiyun return keyctl_set_reqkey_keyring(arg2);
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun case KEYCTL_SET_TIMEOUT:
69*4882a593Smuzhiyun return keyctl_set_timeout(arg2, arg3);
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun case KEYCTL_ASSUME_AUTHORITY:
72*4882a593Smuzhiyun return keyctl_assume_authority(arg2);
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun case KEYCTL_GET_SECURITY:
75*4882a593Smuzhiyun return keyctl_get_security(arg2, compat_ptr(arg3), arg4);
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun case KEYCTL_SESSION_TO_PARENT:
78*4882a593Smuzhiyun return keyctl_session_to_parent();
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun case KEYCTL_REJECT:
81*4882a593Smuzhiyun return keyctl_reject_key(arg2, arg3, arg4, arg5);
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun case KEYCTL_INSTANTIATE_IOV:
84*4882a593Smuzhiyun return keyctl_instantiate_key_iov(arg2, compat_ptr(arg3), arg4,
85*4882a593Smuzhiyun arg5);
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun case KEYCTL_INVALIDATE:
88*4882a593Smuzhiyun return keyctl_invalidate_key(arg2);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun case KEYCTL_GET_PERSISTENT:
91*4882a593Smuzhiyun return keyctl_get_persistent(arg2, arg3);
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun case KEYCTL_DH_COMPUTE:
94*4882a593Smuzhiyun return compat_keyctl_dh_compute(compat_ptr(arg2),
95*4882a593Smuzhiyun compat_ptr(arg3),
96*4882a593Smuzhiyun arg4, compat_ptr(arg5));
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun case KEYCTL_RESTRICT_KEYRING:
99*4882a593Smuzhiyun return keyctl_restrict_keyring(arg2, compat_ptr(arg3),
100*4882a593Smuzhiyun compat_ptr(arg4));
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun case KEYCTL_PKEY_QUERY:
103*4882a593Smuzhiyun if (arg3 != 0)
104*4882a593Smuzhiyun return -EINVAL;
105*4882a593Smuzhiyun return keyctl_pkey_query(arg2,
106*4882a593Smuzhiyun compat_ptr(arg4),
107*4882a593Smuzhiyun compat_ptr(arg5));
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun case KEYCTL_PKEY_ENCRYPT:
110*4882a593Smuzhiyun case KEYCTL_PKEY_DECRYPT:
111*4882a593Smuzhiyun case KEYCTL_PKEY_SIGN:
112*4882a593Smuzhiyun return keyctl_pkey_e_d_s(option,
113*4882a593Smuzhiyun compat_ptr(arg2), compat_ptr(arg3),
114*4882a593Smuzhiyun compat_ptr(arg4), compat_ptr(arg5));
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun case KEYCTL_PKEY_VERIFY:
117*4882a593Smuzhiyun return keyctl_pkey_verify(compat_ptr(arg2), compat_ptr(arg3),
118*4882a593Smuzhiyun compat_ptr(arg4), compat_ptr(arg5));
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun case KEYCTL_MOVE:
121*4882a593Smuzhiyun return keyctl_keyring_move(arg2, arg3, arg4, arg5);
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun case KEYCTL_CAPABILITIES:
124*4882a593Smuzhiyun return keyctl_capabilities(compat_ptr(arg2), arg3);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun case KEYCTL_WATCH_KEY:
127*4882a593Smuzhiyun return keyctl_watch_key(arg2, arg3, arg4);
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun default:
130*4882a593Smuzhiyun return -EOPNOTSUPP;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun }
133