Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /* 32-bit compatibility syscall for 64-bit systems
0003  *
0004  * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved.
0005  * Written by David Howells (dhowells@redhat.com)
0006  */
0007 
0008 #include <linux/syscalls.h>
0009 #include <linux/keyctl.h>
0010 #include <linux/compat.h>
0011 #include <linux/slab.h>
0012 #include "internal.h"
0013 
0014 /*
0015  * The key control system call, 32-bit compatibility version for 64-bit archs
0016  */
0017 COMPAT_SYSCALL_DEFINE5(keyctl, u32, option,
0018                u32, arg2, u32, arg3, u32, arg4, u32, arg5)
0019 {
0020     switch (option) {
0021     case KEYCTL_GET_KEYRING_ID:
0022         return keyctl_get_keyring_ID(arg2, arg3);
0023 
0024     case KEYCTL_JOIN_SESSION_KEYRING:
0025         return keyctl_join_session_keyring(compat_ptr(arg2));
0026 
0027     case KEYCTL_UPDATE:
0028         return keyctl_update_key(arg2, compat_ptr(arg3), arg4);
0029 
0030     case KEYCTL_REVOKE:
0031         return keyctl_revoke_key(arg2);
0032 
0033     case KEYCTL_DESCRIBE:
0034         return keyctl_describe_key(arg2, compat_ptr(arg3), arg4);
0035 
0036     case KEYCTL_CLEAR:
0037         return keyctl_keyring_clear(arg2);
0038 
0039     case KEYCTL_LINK:
0040         return keyctl_keyring_link(arg2, arg3);
0041 
0042     case KEYCTL_UNLINK:
0043         return keyctl_keyring_unlink(arg2, arg3);
0044 
0045     case KEYCTL_SEARCH:
0046         return keyctl_keyring_search(arg2, compat_ptr(arg3),
0047                          compat_ptr(arg4), arg5);
0048 
0049     case KEYCTL_READ:
0050         return keyctl_read_key(arg2, compat_ptr(arg3), arg4);
0051 
0052     case KEYCTL_CHOWN:
0053         return keyctl_chown_key(arg2, arg3, arg4);
0054 
0055     case KEYCTL_SETPERM:
0056         return keyctl_setperm_key(arg2, arg3);
0057 
0058     case KEYCTL_INSTANTIATE:
0059         return keyctl_instantiate_key(arg2, compat_ptr(arg3), arg4,
0060                           arg5);
0061 
0062     case KEYCTL_NEGATE:
0063         return keyctl_negate_key(arg2, arg3, arg4);
0064 
0065     case KEYCTL_SET_REQKEY_KEYRING:
0066         return keyctl_set_reqkey_keyring(arg2);
0067 
0068     case KEYCTL_SET_TIMEOUT:
0069         return keyctl_set_timeout(arg2, arg3);
0070 
0071     case KEYCTL_ASSUME_AUTHORITY:
0072         return keyctl_assume_authority(arg2);
0073 
0074     case KEYCTL_GET_SECURITY:
0075         return keyctl_get_security(arg2, compat_ptr(arg3), arg4);
0076 
0077     case KEYCTL_SESSION_TO_PARENT:
0078         return keyctl_session_to_parent();
0079 
0080     case KEYCTL_REJECT:
0081         return keyctl_reject_key(arg2, arg3, arg4, arg5);
0082 
0083     case KEYCTL_INSTANTIATE_IOV:
0084         return keyctl_instantiate_key_iov(arg2, compat_ptr(arg3), arg4,
0085                           arg5);
0086 
0087     case KEYCTL_INVALIDATE:
0088         return keyctl_invalidate_key(arg2);
0089 
0090     case KEYCTL_GET_PERSISTENT:
0091         return keyctl_get_persistent(arg2, arg3);
0092 
0093     case KEYCTL_DH_COMPUTE:
0094         return compat_keyctl_dh_compute(compat_ptr(arg2),
0095                         compat_ptr(arg3),
0096                         arg4, compat_ptr(arg5));
0097 
0098     case KEYCTL_RESTRICT_KEYRING:
0099         return keyctl_restrict_keyring(arg2, compat_ptr(arg3),
0100                            compat_ptr(arg4));
0101 
0102     case KEYCTL_PKEY_QUERY:
0103         if (arg3 != 0)
0104             return -EINVAL;
0105         return keyctl_pkey_query(arg2,
0106                      compat_ptr(arg4),
0107                      compat_ptr(arg5));
0108 
0109     case KEYCTL_PKEY_ENCRYPT:
0110     case KEYCTL_PKEY_DECRYPT:
0111     case KEYCTL_PKEY_SIGN:
0112         return keyctl_pkey_e_d_s(option,
0113                      compat_ptr(arg2), compat_ptr(arg3),
0114                      compat_ptr(arg4), compat_ptr(arg5));
0115 
0116     case KEYCTL_PKEY_VERIFY:
0117         return keyctl_pkey_verify(compat_ptr(arg2), compat_ptr(arg3),
0118                       compat_ptr(arg4), compat_ptr(arg5));
0119 
0120     case KEYCTL_MOVE:
0121         return keyctl_keyring_move(arg2, arg3, arg4, arg5);
0122 
0123     case KEYCTL_CAPABILITIES:
0124         return keyctl_capabilities(compat_ptr(arg2), arg3);
0125 
0126     case KEYCTL_WATCH_KEY:
0127         return keyctl_watch_key(arg2, arg3, arg4);
0128 
0129     default:
0130         return -EOPNOTSUPP;
0131     }
0132 }