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