162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 32-bit compatibility syscall for 64-bit systems 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved. 562306a36Sopenharmony_ci * Written by David Howells (dhowells@redhat.com) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/syscalls.h> 962306a36Sopenharmony_ci#include <linux/keyctl.h> 1062306a36Sopenharmony_ci#include <linux/compat.h> 1162306a36Sopenharmony_ci#include <linux/slab.h> 1262306a36Sopenharmony_ci#include "internal.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * The key control system call, 32-bit compatibility version for 64-bit archs 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ciCOMPAT_SYSCALL_DEFINE5(keyctl, u32, option, 1862306a36Sopenharmony_ci u32, arg2, u32, arg3, u32, arg4, u32, arg5) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci switch (option) { 2162306a36Sopenharmony_ci case KEYCTL_GET_KEYRING_ID: 2262306a36Sopenharmony_ci return keyctl_get_keyring_ID(arg2, arg3); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci case KEYCTL_JOIN_SESSION_KEYRING: 2562306a36Sopenharmony_ci return keyctl_join_session_keyring(compat_ptr(arg2)); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci case KEYCTL_UPDATE: 2862306a36Sopenharmony_ci return keyctl_update_key(arg2, compat_ptr(arg3), arg4); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci case KEYCTL_REVOKE: 3162306a36Sopenharmony_ci return keyctl_revoke_key(arg2); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci case KEYCTL_DESCRIBE: 3462306a36Sopenharmony_ci return keyctl_describe_key(arg2, compat_ptr(arg3), arg4); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci case KEYCTL_CLEAR: 3762306a36Sopenharmony_ci return keyctl_keyring_clear(arg2); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci case KEYCTL_LINK: 4062306a36Sopenharmony_ci return keyctl_keyring_link(arg2, arg3); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci case KEYCTL_UNLINK: 4362306a36Sopenharmony_ci return keyctl_keyring_unlink(arg2, arg3); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci case KEYCTL_SEARCH: 4662306a36Sopenharmony_ci return keyctl_keyring_search(arg2, compat_ptr(arg3), 4762306a36Sopenharmony_ci compat_ptr(arg4), arg5); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci case KEYCTL_READ: 5062306a36Sopenharmony_ci return keyctl_read_key(arg2, compat_ptr(arg3), arg4); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci case KEYCTL_CHOWN: 5362306a36Sopenharmony_ci return keyctl_chown_key(arg2, arg3, arg4); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci case KEYCTL_SETPERM: 5662306a36Sopenharmony_ci return keyctl_setperm_key(arg2, arg3); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci case KEYCTL_INSTANTIATE: 5962306a36Sopenharmony_ci return keyctl_instantiate_key(arg2, compat_ptr(arg3), arg4, 6062306a36Sopenharmony_ci arg5); 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci case KEYCTL_NEGATE: 6362306a36Sopenharmony_ci return keyctl_negate_key(arg2, arg3, arg4); 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci case KEYCTL_SET_REQKEY_KEYRING: 6662306a36Sopenharmony_ci return keyctl_set_reqkey_keyring(arg2); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci case KEYCTL_SET_TIMEOUT: 6962306a36Sopenharmony_ci return keyctl_set_timeout(arg2, arg3); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci case KEYCTL_ASSUME_AUTHORITY: 7262306a36Sopenharmony_ci return keyctl_assume_authority(arg2); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci case KEYCTL_GET_SECURITY: 7562306a36Sopenharmony_ci return keyctl_get_security(arg2, compat_ptr(arg3), arg4); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci case KEYCTL_SESSION_TO_PARENT: 7862306a36Sopenharmony_ci return keyctl_session_to_parent(); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci case KEYCTL_REJECT: 8162306a36Sopenharmony_ci return keyctl_reject_key(arg2, arg3, arg4, arg5); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci case KEYCTL_INSTANTIATE_IOV: 8462306a36Sopenharmony_ci return keyctl_instantiate_key_iov(arg2, compat_ptr(arg3), arg4, 8562306a36Sopenharmony_ci arg5); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci case KEYCTL_INVALIDATE: 8862306a36Sopenharmony_ci return keyctl_invalidate_key(arg2); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci case KEYCTL_GET_PERSISTENT: 9162306a36Sopenharmony_ci return keyctl_get_persistent(arg2, arg3); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci case KEYCTL_DH_COMPUTE: 9462306a36Sopenharmony_ci return compat_keyctl_dh_compute(compat_ptr(arg2), 9562306a36Sopenharmony_ci compat_ptr(arg3), 9662306a36Sopenharmony_ci arg4, compat_ptr(arg5)); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci case KEYCTL_RESTRICT_KEYRING: 9962306a36Sopenharmony_ci return keyctl_restrict_keyring(arg2, compat_ptr(arg3), 10062306a36Sopenharmony_ci compat_ptr(arg4)); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci case KEYCTL_PKEY_QUERY: 10362306a36Sopenharmony_ci if (arg3 != 0) 10462306a36Sopenharmony_ci return -EINVAL; 10562306a36Sopenharmony_ci return keyctl_pkey_query(arg2, 10662306a36Sopenharmony_ci compat_ptr(arg4), 10762306a36Sopenharmony_ci compat_ptr(arg5)); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci case KEYCTL_PKEY_ENCRYPT: 11062306a36Sopenharmony_ci case KEYCTL_PKEY_DECRYPT: 11162306a36Sopenharmony_ci case KEYCTL_PKEY_SIGN: 11262306a36Sopenharmony_ci return keyctl_pkey_e_d_s(option, 11362306a36Sopenharmony_ci compat_ptr(arg2), compat_ptr(arg3), 11462306a36Sopenharmony_ci compat_ptr(arg4), compat_ptr(arg5)); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci case KEYCTL_PKEY_VERIFY: 11762306a36Sopenharmony_ci return keyctl_pkey_verify(compat_ptr(arg2), compat_ptr(arg3), 11862306a36Sopenharmony_ci compat_ptr(arg4), compat_ptr(arg5)); 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci case KEYCTL_MOVE: 12162306a36Sopenharmony_ci return keyctl_keyring_move(arg2, arg3, arg4, arg5); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci case KEYCTL_CAPABILITIES: 12462306a36Sopenharmony_ci return keyctl_capabilities(compat_ptr(arg2), arg3); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci case KEYCTL_WATCH_KEY: 12762306a36Sopenharmony_ci return keyctl_watch_key(arg2, arg3, arg4); 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci default: 13062306a36Sopenharmony_ci return -EOPNOTSUPP; 13162306a36Sopenharmony_ci } 13262306a36Sopenharmony_ci} 133