1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * linux/net/sunrpc/auth_null.c
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * AUTH_NULL authentication. Really :-)
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <linux/types.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/sunrpc/clnt.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
15*4882a593Smuzhiyun # define RPCDBG_FACILITY RPCDBG_AUTH
16*4882a593Smuzhiyun #endif
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun static struct rpc_auth null_auth;
19*4882a593Smuzhiyun static struct rpc_cred null_cred;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun static struct rpc_auth *
nul_create(const struct rpc_auth_create_args * args,struct rpc_clnt * clnt)22*4882a593Smuzhiyun nul_create(const struct rpc_auth_create_args *args, struct rpc_clnt *clnt)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun refcount_inc(&null_auth.au_count);
25*4882a593Smuzhiyun return &null_auth;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun static void
nul_destroy(struct rpc_auth * auth)29*4882a593Smuzhiyun nul_destroy(struct rpc_auth *auth)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun * Lookup NULL creds for current process
35*4882a593Smuzhiyun */
36*4882a593Smuzhiyun static struct rpc_cred *
nul_lookup_cred(struct rpc_auth * auth,struct auth_cred * acred,int flags)37*4882a593Smuzhiyun nul_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun return get_rpccred(&null_cred);
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun /*
43*4882a593Smuzhiyun * Destroy cred handle.
44*4882a593Smuzhiyun */
45*4882a593Smuzhiyun static void
nul_destroy_cred(struct rpc_cred * cred)46*4882a593Smuzhiyun nul_destroy_cred(struct rpc_cred *cred)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun /*
51*4882a593Smuzhiyun * Match cred handle against current process
52*4882a593Smuzhiyun */
53*4882a593Smuzhiyun static int
nul_match(struct auth_cred * acred,struct rpc_cred * cred,int taskflags)54*4882a593Smuzhiyun nul_match(struct auth_cred *acred, struct rpc_cred *cred, int taskflags)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun return 1;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun /*
60*4882a593Smuzhiyun * Marshal credential.
61*4882a593Smuzhiyun */
62*4882a593Smuzhiyun static int
nul_marshal(struct rpc_task * task,struct xdr_stream * xdr)63*4882a593Smuzhiyun nul_marshal(struct rpc_task *task, struct xdr_stream *xdr)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun __be32 *p;
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun p = xdr_reserve_space(xdr, 4 * sizeof(*p));
68*4882a593Smuzhiyun if (!p)
69*4882a593Smuzhiyun return -EMSGSIZE;
70*4882a593Smuzhiyun /* Credential */
71*4882a593Smuzhiyun *p++ = rpc_auth_null;
72*4882a593Smuzhiyun *p++ = xdr_zero;
73*4882a593Smuzhiyun /* Verifier */
74*4882a593Smuzhiyun *p++ = rpc_auth_null;
75*4882a593Smuzhiyun *p = xdr_zero;
76*4882a593Smuzhiyun return 0;
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun /*
80*4882a593Smuzhiyun * Refresh credential. This is a no-op for AUTH_NULL
81*4882a593Smuzhiyun */
82*4882a593Smuzhiyun static int
nul_refresh(struct rpc_task * task)83*4882a593Smuzhiyun nul_refresh(struct rpc_task *task)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_rqstp->rq_cred->cr_flags);
86*4882a593Smuzhiyun return 0;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun static int
nul_validate(struct rpc_task * task,struct xdr_stream * xdr)90*4882a593Smuzhiyun nul_validate(struct rpc_task *task, struct xdr_stream *xdr)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun __be32 *p;
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun p = xdr_inline_decode(xdr, 2 * sizeof(*p));
95*4882a593Smuzhiyun if (!p)
96*4882a593Smuzhiyun return -EIO;
97*4882a593Smuzhiyun if (*p++ != rpc_auth_null)
98*4882a593Smuzhiyun return -EIO;
99*4882a593Smuzhiyun if (*p != xdr_zero)
100*4882a593Smuzhiyun return -EIO;
101*4882a593Smuzhiyun return 0;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun const struct rpc_authops authnull_ops = {
105*4882a593Smuzhiyun .owner = THIS_MODULE,
106*4882a593Smuzhiyun .au_flavor = RPC_AUTH_NULL,
107*4882a593Smuzhiyun .au_name = "NULL",
108*4882a593Smuzhiyun .create = nul_create,
109*4882a593Smuzhiyun .destroy = nul_destroy,
110*4882a593Smuzhiyun .lookup_cred = nul_lookup_cred,
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun static
114*4882a593Smuzhiyun struct rpc_auth null_auth = {
115*4882a593Smuzhiyun .au_cslack = NUL_CALLSLACK,
116*4882a593Smuzhiyun .au_rslack = NUL_REPLYSLACK,
117*4882a593Smuzhiyun .au_verfsize = NUL_REPLYSLACK,
118*4882a593Smuzhiyun .au_ralign = NUL_REPLYSLACK,
119*4882a593Smuzhiyun .au_ops = &authnull_ops,
120*4882a593Smuzhiyun .au_flavor = RPC_AUTH_NULL,
121*4882a593Smuzhiyun .au_count = REFCOUNT_INIT(1),
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun static
125*4882a593Smuzhiyun const struct rpc_credops null_credops = {
126*4882a593Smuzhiyun .cr_name = "AUTH_NULL",
127*4882a593Smuzhiyun .crdestroy = nul_destroy_cred,
128*4882a593Smuzhiyun .crmatch = nul_match,
129*4882a593Smuzhiyun .crmarshal = nul_marshal,
130*4882a593Smuzhiyun .crwrap_req = rpcauth_wrap_req_encode,
131*4882a593Smuzhiyun .crrefresh = nul_refresh,
132*4882a593Smuzhiyun .crvalidate = nul_validate,
133*4882a593Smuzhiyun .crunwrap_resp = rpcauth_unwrap_resp_decode,
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun static
137*4882a593Smuzhiyun struct rpc_cred null_cred = {
138*4882a593Smuzhiyun .cr_lru = LIST_HEAD_INIT(null_cred.cr_lru),
139*4882a593Smuzhiyun .cr_auth = &null_auth,
140*4882a593Smuzhiyun .cr_ops = &null_credops,
141*4882a593Smuzhiyun .cr_count = REFCOUNT_INIT(2),
142*4882a593Smuzhiyun .cr_flags = 1UL << RPCAUTH_CRED_UPTODATE,
143*4882a593Smuzhiyun };
144