Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : /* 3 : : * linux/include/linux/sunrpc/auth.h 4 : : * 5 : : * Declarations for the RPC client authentication machinery. 6 : : * 7 : : * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de> 8 : : */ 9 : : 10 : : #ifndef _LINUX_SUNRPC_AUTH_H 11 : : #define _LINUX_SUNRPC_AUTH_H 12 : : 13 : : #include <linux/sunrpc/sched.h> 14 : : #include <linux/sunrpc/msg_prot.h> 15 : : #include <linux/sunrpc/xdr.h> 16 : : 17 : : #include <linux/atomic.h> 18 : : #include <linux/rcupdate.h> 19 : : #include <linux/uidgid.h> 20 : : #include <linux/utsname.h> 21 : : 22 : : /* 23 : : * Maximum size of AUTH_NONE authentication information, in XDR words. 24 : : */ 25 : : #define NUL_CALLSLACK (4) 26 : : #define NUL_REPLYSLACK (2) 27 : : 28 : : /* 29 : : * Size of the nodename buffer. RFC1831 specifies a hard limit of 255 bytes, 30 : : * but Linux hostnames are actually limited to __NEW_UTS_LEN bytes. 31 : : */ 32 : : #define UNX_MAXNODENAME __NEW_UTS_LEN 33 : : #define UNX_CALLSLACK (21 + XDR_QUADLEN(UNX_MAXNODENAME)) 34 : : #define UNX_NGROUPS 16 35 : : 36 : : struct rpcsec_gss_info; 37 : : 38 : : struct auth_cred { 39 : : const struct cred *cred; 40 : : const char *principal; /* If present, this is a machine credential */ 41 : : }; 42 : : 43 : : /* 44 : : * Client user credentials 45 : : */ 46 : : struct rpc_auth; 47 : : struct rpc_credops; 48 : : struct rpc_cred { 49 : : struct hlist_node cr_hash; /* hash chain */ 50 : : struct list_head cr_lru; /* lru garbage collection */ 51 : : struct rcu_head cr_rcu; 52 : : struct rpc_auth * cr_auth; 53 : : const struct rpc_credops *cr_ops; 54 : : unsigned long cr_expire; /* when to gc */ 55 : : unsigned long cr_flags; /* various flags */ 56 : : refcount_t cr_count; /* ref count */ 57 : : const struct cred *cr_cred; 58 : : 59 : : /* per-flavor data */ 60 : : }; 61 : : #define RPCAUTH_CRED_NEW 0 62 : : #define RPCAUTH_CRED_UPTODATE 1 63 : : #define RPCAUTH_CRED_HASHED 2 64 : : #define RPCAUTH_CRED_NEGATIVE 3 65 : : 66 : : const struct cred *rpc_machine_cred(void); 67 : : 68 : : /* 69 : : * Client authentication handle 70 : : */ 71 : : struct rpc_cred_cache; 72 : : struct rpc_authops; 73 : : struct rpc_auth { 74 : : unsigned int au_cslack; /* call cred size estimate */ 75 : : unsigned int au_rslack; /* reply cred size estimate */ 76 : : unsigned int au_verfsize; /* size of reply verifier */ 77 : : unsigned int au_ralign; /* words before UL header */ 78 : : 79 : : unsigned int au_flags; 80 : : const struct rpc_authops *au_ops; 81 : : rpc_authflavor_t au_flavor; /* pseudoflavor (note may 82 : : * differ from the flavor in 83 : : * au_ops->au_flavor in gss 84 : : * case) */ 85 : : refcount_t au_count; /* Reference counter */ 86 : : 87 : : struct rpc_cred_cache * au_credcache; 88 : : /* per-flavor data */ 89 : : }; 90 : : 91 : : /* rpc_auth au_flags */ 92 : : #define RPCAUTH_AUTH_DATATOUCH 0x00000002 93 : : 94 : : struct rpc_auth_create_args { 95 : : rpc_authflavor_t pseudoflavor; 96 : : const char *target_name; 97 : : }; 98 : : 99 : : /* Flags for rpcauth_lookupcred() */ 100 : : #define RPCAUTH_LOOKUP_NEW 0x01 /* Accept an uninitialised cred */ 101 : : 102 : : /* 103 : : * Client authentication ops 104 : : */ 105 : : struct rpc_authops { 106 : : struct module *owner; 107 : : rpc_authflavor_t au_flavor; /* flavor (RPC_AUTH_*) */ 108 : : char * au_name; 109 : : struct rpc_auth * (*create)(const struct rpc_auth_create_args *, 110 : : struct rpc_clnt *); 111 : : void (*destroy)(struct rpc_auth *); 112 : : 113 : : int (*hash_cred)(struct auth_cred *, unsigned int); 114 : : struct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int); 115 : : struct rpc_cred * (*crcreate)(struct rpc_auth*, struct auth_cred *, int, gfp_t); 116 : : rpc_authflavor_t (*info2flavor)(struct rpcsec_gss_info *); 117 : : int (*flavor2info)(rpc_authflavor_t, 118 : : struct rpcsec_gss_info *); 119 : : int (*key_timeout)(struct rpc_auth *, 120 : : struct rpc_cred *); 121 : : }; 122 : : 123 : : struct rpc_credops { 124 : : const char * cr_name; /* Name of the auth flavour */ 125 : : int (*cr_init)(struct rpc_auth *, struct rpc_cred *); 126 : : void (*crdestroy)(struct rpc_cred *); 127 : : 128 : : int (*crmatch)(struct auth_cred *, struct rpc_cred *, int); 129 : : int (*crmarshal)(struct rpc_task *task, 130 : : struct xdr_stream *xdr); 131 : : int (*crrefresh)(struct rpc_task *); 132 : : int (*crvalidate)(struct rpc_task *task, 133 : : struct xdr_stream *xdr); 134 : : int (*crwrap_req)(struct rpc_task *task, 135 : : struct xdr_stream *xdr); 136 : : int (*crunwrap_resp)(struct rpc_task *task, 137 : : struct xdr_stream *xdr); 138 : : int (*crkey_timeout)(struct rpc_cred *); 139 : : char * (*crstringify_acceptor)(struct rpc_cred *); 140 : : bool (*crneed_reencode)(struct rpc_task *); 141 : : }; 142 : : 143 : : extern const struct rpc_authops authunix_ops; 144 : : extern const struct rpc_authops authnull_ops; 145 : : 146 : : int __init rpc_init_authunix(void); 147 : : int __init rpcauth_init_module(void); 148 : : void rpcauth_remove_module(void); 149 : : void rpc_destroy_authunix(void); 150 : : 151 : : int rpcauth_register(const struct rpc_authops *); 152 : : int rpcauth_unregister(const struct rpc_authops *); 153 : : struct rpc_auth * rpcauth_create(const struct rpc_auth_create_args *, 154 : : struct rpc_clnt *); 155 : : void rpcauth_release(struct rpc_auth *); 156 : : rpc_authflavor_t rpcauth_get_pseudoflavor(rpc_authflavor_t, 157 : : struct rpcsec_gss_info *); 158 : : int rpcauth_get_gssinfo(rpc_authflavor_t, 159 : : struct rpcsec_gss_info *); 160 : : struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int, gfp_t); 161 : : void rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *); 162 : : struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *, int); 163 : : void put_rpccred(struct rpc_cred *); 164 : : int rpcauth_marshcred(struct rpc_task *task, 165 : : struct xdr_stream *xdr); 166 : : int rpcauth_checkverf(struct rpc_task *task, 167 : : struct xdr_stream *xdr); 168 : : int rpcauth_wrap_req_encode(struct rpc_task *task, 169 : : struct xdr_stream *xdr); 170 : : int rpcauth_wrap_req(struct rpc_task *task, 171 : : struct xdr_stream *xdr); 172 : : int rpcauth_unwrap_resp_decode(struct rpc_task *task, 173 : : struct xdr_stream *xdr); 174 : : int rpcauth_unwrap_resp(struct rpc_task *task, 175 : : struct xdr_stream *xdr); 176 : : bool rpcauth_xmit_need_reencode(struct rpc_task *task); 177 : : int rpcauth_refreshcred(struct rpc_task *); 178 : : void rpcauth_invalcred(struct rpc_task *); 179 : : int rpcauth_uptodatecred(struct rpc_task *); 180 : : int rpcauth_init_credcache(struct rpc_auth *); 181 : : void rpcauth_destroy_credcache(struct rpc_auth *); 182 : : void rpcauth_clear_credcache(struct rpc_cred_cache *); 183 : : char * rpcauth_stringify_acceptor(struct rpc_cred *); 184 : : 185 : : static inline 186 : 0 : struct rpc_cred *get_rpccred(struct rpc_cred *cred) 187 : : { 188 [ # # # # : 0 : if (cred != NULL && refcount_inc_not_zero(&cred->cr_count)) # # ] 189 : 0 : return cred; 190 : : return NULL; 191 : : } 192 : : 193 : : #endif /* _LINUX_SUNRPC_AUTH_H */