xref: /openbmc/linux/security/keys/compat.c (revision 5d47b394)
12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2973c9f4fSDavid Howells /* 32-bit compatibility syscall for 64-bit systems
31da177e4SLinus Torvalds  *
43e30148cSDavid Howells  * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved.
51da177e4SLinus Torvalds  * Written by David Howells (dhowells@redhat.com)
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #include <linux/syscalls.h>
91da177e4SLinus Torvalds #include <linux/keyctl.h>
101da177e4SLinus Torvalds #include <linux/compat.h>
11ee009e4aSDavid Howells #include <linux/slab.h>
121da177e4SLinus Torvalds #include "internal.h"
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds /*
15973c9f4fSDavid Howells  * The key control system call, 32-bit compatibility version for 64-bit archs
161da177e4SLinus Torvalds  */
COMPAT_SYSCALL_DEFINE5(keyctl,u32,option,u32,arg2,u32,arg3,u32,arg4,u32,arg5)17875ec3daSHeiko Carstens COMPAT_SYSCALL_DEFINE5(keyctl, u32, option,
18875ec3daSHeiko Carstens 		       u32, arg2, u32, arg3, u32, arg4, u32, arg5)
191da177e4SLinus Torvalds {
201da177e4SLinus Torvalds 	switch (option) {
211da177e4SLinus Torvalds 	case KEYCTL_GET_KEYRING_ID:
221da177e4SLinus Torvalds 		return keyctl_get_keyring_ID(arg2, arg3);
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds 	case KEYCTL_JOIN_SESSION_KEYRING:
251da177e4SLinus Torvalds 		return keyctl_join_session_keyring(compat_ptr(arg2));
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds 	case KEYCTL_UPDATE:
281da177e4SLinus Torvalds 		return keyctl_update_key(arg2, compat_ptr(arg3), arg4);
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds 	case KEYCTL_REVOKE:
311da177e4SLinus Torvalds 		return keyctl_revoke_key(arg2);
321da177e4SLinus Torvalds 
331da177e4SLinus Torvalds 	case KEYCTL_DESCRIBE:
341da177e4SLinus Torvalds 		return keyctl_describe_key(arg2, compat_ptr(arg3), arg4);
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds 	case KEYCTL_CLEAR:
371da177e4SLinus Torvalds 		return keyctl_keyring_clear(arg2);
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds 	case KEYCTL_LINK:
401da177e4SLinus Torvalds 		return keyctl_keyring_link(arg2, arg3);
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds 	case KEYCTL_UNLINK:
431da177e4SLinus Torvalds 		return keyctl_keyring_unlink(arg2, arg3);
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds 	case KEYCTL_SEARCH:
461da177e4SLinus Torvalds 		return keyctl_keyring_search(arg2, compat_ptr(arg3),
471da177e4SLinus Torvalds 					     compat_ptr(arg4), arg5);
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds 	case KEYCTL_READ:
501da177e4SLinus Torvalds 		return keyctl_read_key(arg2, compat_ptr(arg3), arg4);
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds 	case KEYCTL_CHOWN:
531da177e4SLinus Torvalds 		return keyctl_chown_key(arg2, arg3, arg4);
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds 	case KEYCTL_SETPERM:
561da177e4SLinus Torvalds 		return keyctl_setperm_key(arg2, arg3);
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds 	case KEYCTL_INSTANTIATE:
591da177e4SLinus Torvalds 		return keyctl_instantiate_key(arg2, compat_ptr(arg3), arg4,
601da177e4SLinus Torvalds 					      arg5);
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds 	case KEYCTL_NEGATE:
631da177e4SLinus Torvalds 		return keyctl_negate_key(arg2, arg3, arg4);
641da177e4SLinus Torvalds 
653e30148cSDavid Howells 	case KEYCTL_SET_REQKEY_KEYRING:
663e30148cSDavid Howells 		return keyctl_set_reqkey_keyring(arg2);
673e30148cSDavid Howells 
68017679c4SDavid Howells 	case KEYCTL_SET_TIMEOUT:
69017679c4SDavid Howells 		return keyctl_set_timeout(arg2, arg3);
70017679c4SDavid Howells 
71b5f545c8SDavid Howells 	case KEYCTL_ASSUME_AUTHORITY:
72b5f545c8SDavid Howells 		return keyctl_assume_authority(arg2);
73b5f545c8SDavid Howells 
7470a5bb72SDavid Howells 	case KEYCTL_GET_SECURITY:
7570a5bb72SDavid Howells 		return keyctl_get_security(arg2, compat_ptr(arg3), arg4);
7670a5bb72SDavid Howells 
77ee18d64cSDavid Howells 	case KEYCTL_SESSION_TO_PARENT:
78ee18d64cSDavid Howells 		return keyctl_session_to_parent();
79ee18d64cSDavid Howells 
80fdd1b945SDavid Howells 	case KEYCTL_REJECT:
81fdd1b945SDavid Howells 		return keyctl_reject_key(arg2, arg3, arg4, arg5);
82fdd1b945SDavid Howells 
83ee009e4aSDavid Howells 	case KEYCTL_INSTANTIATE_IOV:
845d47b394SChristoph Hellwig 		return keyctl_instantiate_key_iov(arg2, compat_ptr(arg3), arg4,
855d47b394SChristoph Hellwig 						  arg5);
86ee009e4aSDavid Howells 
87fd75815fSDavid Howells 	case KEYCTL_INVALIDATE:
88fd75815fSDavid Howells 		return keyctl_invalidate_key(arg2);
89fd75815fSDavid Howells 
90f36f8c75SDavid Howells 	case KEYCTL_GET_PERSISTENT:
91f36f8c75SDavid Howells 		return keyctl_get_persistent(arg2, arg3);
92f36f8c75SDavid Howells 
93ddbb4114SMat Martineau 	case KEYCTL_DH_COMPUTE:
94f1c316a3SStephan Mueller 		return compat_keyctl_dh_compute(compat_ptr(arg2),
95f1c316a3SStephan Mueller 						compat_ptr(arg3),
964693fc73SStephan Mueller 						arg4, compat_ptr(arg5));
97ddbb4114SMat Martineau 
986563c91fSMat Martineau 	case KEYCTL_RESTRICT_KEYRING:
996563c91fSMat Martineau 		return keyctl_restrict_keyring(arg2, compat_ptr(arg3),
1006563c91fSMat Martineau 					       compat_ptr(arg4));
1016563c91fSMat Martineau 
10200d60fd3SDavid Howells 	case KEYCTL_PKEY_QUERY:
10300d60fd3SDavid Howells 		if (arg3 != 0)
10400d60fd3SDavid Howells 			return -EINVAL;
10500d60fd3SDavid Howells 		return keyctl_pkey_query(arg2,
10600d60fd3SDavid Howells 					 compat_ptr(arg4),
10700d60fd3SDavid Howells 					 compat_ptr(arg5));
10800d60fd3SDavid Howells 
10900d60fd3SDavid Howells 	case KEYCTL_PKEY_ENCRYPT:
11000d60fd3SDavid Howells 	case KEYCTL_PKEY_DECRYPT:
11100d60fd3SDavid Howells 	case KEYCTL_PKEY_SIGN:
11200d60fd3SDavid Howells 		return keyctl_pkey_e_d_s(option,
11300d60fd3SDavid Howells 					 compat_ptr(arg2), compat_ptr(arg3),
11400d60fd3SDavid Howells 					 compat_ptr(arg4), compat_ptr(arg5));
11500d60fd3SDavid Howells 
11600d60fd3SDavid Howells 	case KEYCTL_PKEY_VERIFY:
11700d60fd3SDavid Howells 		return keyctl_pkey_verify(compat_ptr(arg2), compat_ptr(arg3),
11800d60fd3SDavid Howells 					  compat_ptr(arg4), compat_ptr(arg5));
11900d60fd3SDavid Howells 
120ed0ac5c7SDavid Howells 	case KEYCTL_MOVE:
121ed0ac5c7SDavid Howells 		return keyctl_keyring_move(arg2, arg3, arg4, arg5);
122ed0ac5c7SDavid Howells 
12345e0f30cSDavid Howells 	case KEYCTL_CAPABILITIES:
12445e0f30cSDavid Howells 		return keyctl_capabilities(compat_ptr(arg2), arg3);
12545e0f30cSDavid Howells 
126f7e47677SDavid Howells 	case KEYCTL_WATCH_KEY:
127f7e47677SDavid Howells 		return keyctl_watch_key(arg2, arg3, arg4);
128f7e47677SDavid Howells 
1291da177e4SLinus Torvalds 	default:
1301da177e4SLinus Torvalds 		return -EOPNOTSUPP;
1311da177e4SLinus Torvalds 	}
132a8b17ed0SDavid Howells }
133