18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/* 32-bit compatibility syscall for 64-bit systems
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved.
58c2ecf20Sopenharmony_ci * Written by David Howells (dhowells@redhat.com)
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/syscalls.h>
98c2ecf20Sopenharmony_ci#include <linux/keyctl.h>
108c2ecf20Sopenharmony_ci#include <linux/compat.h>
118c2ecf20Sopenharmony_ci#include <linux/slab.h>
128c2ecf20Sopenharmony_ci#include "internal.h"
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci/*
158c2ecf20Sopenharmony_ci * The key control system call, 32-bit compatibility version for 64-bit archs
168c2ecf20Sopenharmony_ci */
178c2ecf20Sopenharmony_ciCOMPAT_SYSCALL_DEFINE5(keyctl, u32, option,
188c2ecf20Sopenharmony_ci		       u32, arg2, u32, arg3, u32, arg4, u32, arg5)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	switch (option) {
218c2ecf20Sopenharmony_ci	case KEYCTL_GET_KEYRING_ID:
228c2ecf20Sopenharmony_ci		return keyctl_get_keyring_ID(arg2, arg3);
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	case KEYCTL_JOIN_SESSION_KEYRING:
258c2ecf20Sopenharmony_ci		return keyctl_join_session_keyring(compat_ptr(arg2));
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	case KEYCTL_UPDATE:
288c2ecf20Sopenharmony_ci		return keyctl_update_key(arg2, compat_ptr(arg3), arg4);
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	case KEYCTL_REVOKE:
318c2ecf20Sopenharmony_ci		return keyctl_revoke_key(arg2);
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	case KEYCTL_DESCRIBE:
348c2ecf20Sopenharmony_ci		return keyctl_describe_key(arg2, compat_ptr(arg3), arg4);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	case KEYCTL_CLEAR:
378c2ecf20Sopenharmony_ci		return keyctl_keyring_clear(arg2);
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	case KEYCTL_LINK:
408c2ecf20Sopenharmony_ci		return keyctl_keyring_link(arg2, arg3);
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	case KEYCTL_UNLINK:
438c2ecf20Sopenharmony_ci		return keyctl_keyring_unlink(arg2, arg3);
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	case KEYCTL_SEARCH:
468c2ecf20Sopenharmony_ci		return keyctl_keyring_search(arg2, compat_ptr(arg3),
478c2ecf20Sopenharmony_ci					     compat_ptr(arg4), arg5);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	case KEYCTL_READ:
508c2ecf20Sopenharmony_ci		return keyctl_read_key(arg2, compat_ptr(arg3), arg4);
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	case KEYCTL_CHOWN:
538c2ecf20Sopenharmony_ci		return keyctl_chown_key(arg2, arg3, arg4);
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	case KEYCTL_SETPERM:
568c2ecf20Sopenharmony_ci		return keyctl_setperm_key(arg2, arg3);
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	case KEYCTL_INSTANTIATE:
598c2ecf20Sopenharmony_ci		return keyctl_instantiate_key(arg2, compat_ptr(arg3), arg4,
608c2ecf20Sopenharmony_ci					      arg5);
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	case KEYCTL_NEGATE:
638c2ecf20Sopenharmony_ci		return keyctl_negate_key(arg2, arg3, arg4);
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci	case KEYCTL_SET_REQKEY_KEYRING:
668c2ecf20Sopenharmony_ci		return keyctl_set_reqkey_keyring(arg2);
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	case KEYCTL_SET_TIMEOUT:
698c2ecf20Sopenharmony_ci		return keyctl_set_timeout(arg2, arg3);
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	case KEYCTL_ASSUME_AUTHORITY:
728c2ecf20Sopenharmony_ci		return keyctl_assume_authority(arg2);
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	case KEYCTL_GET_SECURITY:
758c2ecf20Sopenharmony_ci		return keyctl_get_security(arg2, compat_ptr(arg3), arg4);
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	case KEYCTL_SESSION_TO_PARENT:
788c2ecf20Sopenharmony_ci		return keyctl_session_to_parent();
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	case KEYCTL_REJECT:
818c2ecf20Sopenharmony_ci		return keyctl_reject_key(arg2, arg3, arg4, arg5);
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	case KEYCTL_INSTANTIATE_IOV:
848c2ecf20Sopenharmony_ci		return keyctl_instantiate_key_iov(arg2, compat_ptr(arg3), arg4,
858c2ecf20Sopenharmony_ci						  arg5);
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	case KEYCTL_INVALIDATE:
888c2ecf20Sopenharmony_ci		return keyctl_invalidate_key(arg2);
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	case KEYCTL_GET_PERSISTENT:
918c2ecf20Sopenharmony_ci		return keyctl_get_persistent(arg2, arg3);
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	case KEYCTL_DH_COMPUTE:
948c2ecf20Sopenharmony_ci		return compat_keyctl_dh_compute(compat_ptr(arg2),
958c2ecf20Sopenharmony_ci						compat_ptr(arg3),
968c2ecf20Sopenharmony_ci						arg4, compat_ptr(arg5));
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	case KEYCTL_RESTRICT_KEYRING:
998c2ecf20Sopenharmony_ci		return keyctl_restrict_keyring(arg2, compat_ptr(arg3),
1008c2ecf20Sopenharmony_ci					       compat_ptr(arg4));
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	case KEYCTL_PKEY_QUERY:
1038c2ecf20Sopenharmony_ci		if (arg3 != 0)
1048c2ecf20Sopenharmony_ci			return -EINVAL;
1058c2ecf20Sopenharmony_ci		return keyctl_pkey_query(arg2,
1068c2ecf20Sopenharmony_ci					 compat_ptr(arg4),
1078c2ecf20Sopenharmony_ci					 compat_ptr(arg5));
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	case KEYCTL_PKEY_ENCRYPT:
1108c2ecf20Sopenharmony_ci	case KEYCTL_PKEY_DECRYPT:
1118c2ecf20Sopenharmony_ci	case KEYCTL_PKEY_SIGN:
1128c2ecf20Sopenharmony_ci		return keyctl_pkey_e_d_s(option,
1138c2ecf20Sopenharmony_ci					 compat_ptr(arg2), compat_ptr(arg3),
1148c2ecf20Sopenharmony_ci					 compat_ptr(arg4), compat_ptr(arg5));
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	case KEYCTL_PKEY_VERIFY:
1178c2ecf20Sopenharmony_ci		return keyctl_pkey_verify(compat_ptr(arg2), compat_ptr(arg3),
1188c2ecf20Sopenharmony_ci					  compat_ptr(arg4), compat_ptr(arg5));
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci	case KEYCTL_MOVE:
1218c2ecf20Sopenharmony_ci		return keyctl_keyring_move(arg2, arg3, arg4, arg5);
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci	case KEYCTL_CAPABILITIES:
1248c2ecf20Sopenharmony_ci		return keyctl_capabilities(compat_ptr(arg2), arg3);
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci	case KEYCTL_WATCH_KEY:
1278c2ecf20Sopenharmony_ci		return keyctl_watch_key(arg2, arg3, arg4);
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci	default:
1308c2ecf20Sopenharmony_ci		return -EOPNOTSUPP;
1318c2ecf20Sopenharmony_ci	}
1328c2ecf20Sopenharmony_ci}
133